;＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
;＊　　　　　　　　　　　　　　　　　　　　　　　　＊
;＊　Ｈｉｇｈ−Ｃ用　ＲＳ−２３２Ｃ　ライブラリー  ＊
;＊　　　　　　　　　Programmed by 山崎憲明　　　　＊
;＊　　　　　　　　   　  NIFTY ID=QGB01416　　　　＊
;＊　　　　　　　     nanno-NET ID= YAMA 　　　　　＊
;＊　　　　　　　　　　　　　　　　　　　　　　　　＊
;＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	v0.01	Makeing by YAMA
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;セグメント宣言
;
rmdata	segment dword public 'DATA' use16
rmdata	ends
rmcode	segment word public use16
rmcode	ends
RSBcode	segment dword public 'CODE' use32
RSBcode	ends


rsb_para_s	struc		;9 artcles 17 bytes
	mode	db	?
	baud	db	?
	rbuf	dd	?
	stime	dw	?
	rtime	dw	?
	rinf	dd	?
	extn	db	?
	xon	db	?
	xoff	db	?
rsb_para_s	ends

;
;定数
;

TRUE	equ	1
FALSE	equ	0

	assume	cs:RSBcode,ds:rmdata

;
;リアルモードデータセグメント
;

rmdata	segment 
;
;
;

real_seg	dw	0	;データエリアのリアルモードセグメント値

rm_int_no	dw	0	;int no.
rm_ds		dw	0	;リアルモードds
rm_es		dw	0	;リアルモードes
rm_fs		dw	0	;リアルモードfs
rm_gs		dw	0	;リアルモードgs
rm_eax		dd	0	;リアルモードeax
rm_edx		dd	0	;リアルモードedx

;
;  データ領域
;
port		dd	(-1)
		public	port
rsb_ovr_flg	dd	0
		public	rsb_ovr_flg

rsb_para	rsb_para_s	<>		;パラメータエリア

buf_size	equ	1024*5			;受信バッファサイズ(5Kbyte)
rsb_buf		label	byte
		dw	buf_size
		dw	0			;文字カウント
		dw	0			;入力ポインタ
		dw	0			;出力ポインタ
		db	buf_size+16 dup(0)	;受信バッファ

		public	rsb_end_real	;リアルモードエンドアドレス
rsb_end_real	label	byte

rmdata	ends

;
;リアルモ−ドコ−ド
;

rmcode	segment 

revint	proc	far
	and	ah,10h
	jz	revit1
	mov	ah,08h
	mov	al,byte ptr cs:port
	mov	dl,02h
	int	9Bh
	mov	byte ptr cs:rsb_ovr_flg,1
revit1:	ret
revint	endp

rmcode	ends

;
;プロテクトモードｰコード
;

RSBcode	segment

;データセグメントのリアルモードセグメント値の算定

set_real_seg	proc	near

		mov	ax,ds		;リアルモード用セグメント算定
		mov	es,ax		;先頭アドレス
		xor	ebx,ebx		;
		lea	ecx,rsb_end_real;リアルモードコードセグメントサイズ
		mov	ax,250Fh	;プロテクト=>リアルアドレス変換
		int	21h
		;jc	err		;エラー処理
		;test	ecx,0FFFFh	;
		;jnz	err		;
		shr	ecx,16
		mov	real_seg,cx	;リアルモードセグメント値設定

		ret
set_real_seg	endp


;リアルモード割り込み発行(ポインター指定付)

int_9Bh_2	proc	near

		mov	rm_eax,eax
		mov	rm_edx,edx

		mov	cx,real_seg
		mov	rm_ds,cx	;ds設定
		mov	rm_es,cx	;es設定
		mov	rm_fs,cx	;fs設定
		mov	rm_gs,cx	;gs設定

		mov	byte ptr rm_int_no,9Bh	;int no.
		mov	edx,offset rm_int_no
		mov	ax,2511h
		int	21h
		mov	edx,rm_edx
		ret
int_9Bh_2	endp


;回線オープン
;int     RSB_open(int port);
;
	public	RSB_open
RSB_open	proc	near

		push	ebp		;High-C用ヘッダー
		mov	ebp,esp

		mov	eax,[ebp][8]	;引数 1( int port )
		mov	ah,01h		;open
		int	9Bh
		movzx	eax,ah

		pop	ebp		;High-C用後処理
		ret
RSB_open	endp

;回線クローズ
;int     RSB_close(int port);
;
	public	RSB_close
RSB_close	proc	near

		push	ebp		;High-C用ヘッダー
		mov	ebp,esp

		mov	eax,[ebp][8]	;引数 1( int port )
		mov	ah,02h		;close
		int	9Bh
		movzx	eax,ah

		pop	ebp		;High-C用後処理
		ret
RSB_close	endp

;通信パラメータ設定
;int	RSB_setpara(int port,char *para);
;
	public	RSB_setpara
RSB_setpara	proc	near

		push	ebp		;High-C用ヘッダー
		mov	ebp,esp
		push	es
		push	esi
		push	edi
		push	ebx
		push	ecx

		call	set_real_seg

		mov	esi,[ebp][12]	;引数 2( char *para )
		mov	edi,offset rsb_para
		mov	ecx,11h
		rep	movsb

		mov	esi,[ebp][12]	;引数 2( char *para )
		mov	edi,offset rsb_para
		mov	ax,real_seg		;受信バッファアドレスが
		mov	word ptr[edi].rbuf+2,ax	;独自バッファを指すように
		mov	eax,offset rsb_buf	;リアル、ネイティブ両ポインタ
		mov	[esi].rbuf,eax		;を修正
		mov	word ptr[edi].rbuf,ax	;

		mov	ax,buf_size
		mov	word ptr[rsb_buf],ax	; buff Size Init Apend by Ken

		mov	ax,real_seg
		shl	eax,16
		lea	ebx,revint
		add	eax,ebx			; real address calc
		mov	[esi].rinf,ebx		; protect buff
		mov	[edi].rinf,eax		; real buff

		mov	eax,[ebp][8]	;引数 1( int port )
		mov	ah,03h		;setpara
		mov	edi,offset rsb_para
		call	int_9Bh_2
		movzx	eax,ah

		pop	ecx
		pop	ebx		;High-C用後処理
		pop	edi
		pop	esi
		pop	es
		pop	ebp
		ret
RSB_setpara	endp

;通信パラメータ読み取り
;int	RSB_rdpara(int port,char *para);
;
	public	RSB_rdpara
RSB_rdpara	proc	near

		push	ebp		;High-C用ヘッダー
		mov	ebp,esp
		push	es
		push	esi
		push	edi
		push	ebx
		push	ecx

		call	set_real_seg

		mov	eax,[ebp][8]	;引数 1( int port )
		mov	ah,04h		;rdpara
		mov	edi,offset rsb_para
		call	int_9Bh_2

		mov	esi,offset rsb_para
		mov	edi,[ebp][12]	;引数 2( char *para )
		mov	ecx,11h
		rep	movsb

		movzx	eax,ah

		pop	ecx
		pop	ebx		;High-C用後処理
		pop	edi
		pop	esi
		pop	es
		pop	ebp
		ret
RSB_rdpara	endp


;受信データ数の読み取り
;int	RSB_read(int port, int *len);
;
	public	RSB_read
RSB_read	proc	near

		push	ebp		;High-C用ヘッダー
		mov	ebp,esp
		push	edi

		mov	eax,[ebp][8]	;引数 1( int port )
		mov	ah,05h		;read
		int	9Bh
		movzx	edx,dx
		mov	edi,[ebp][12]	;引数 2( int *len )
		mov	[edi],edx
		movzx	eax,ah

		pop	edi		;High-C用後処理
		pop	ebp
		ret
RSB_read	endp


;データの受信
;int	RSB_receive(int port,int *ch,int *st);
;注:<return>=エラーno.(ah)  ch=data(dl)  st=ステータス(h:dh,l:cl)
;
	public	RSB_receive
RSB_receive	proc	near

		push	ebp		;High-C用ヘッダー
		mov	ebp,esp
		push	es
		push	esi
		push	edi
		push	ebx
		push	ecx

		mov	eax,[ebp][8]	;引数 1( int port )
		mov	ah,06h		;receive
		int	9Bh
		mov	ch,dh
		movzx	ecx,cx
		movzx	edx,dl
		mov	edi,[ebp][12]	;引数 2( int *ch )
		mov	[edi],edx
		mov	edi,[ebp][16]	;引数 3( int *st )
		mov	[edi],ecx
		movzx	eax,ah

		pop	ecx
		pop	ebx		;High-C用後処理
		pop	edi
		pop	esi
		pop	es
		pop	ebp
		ret
RSB_receive	endp


;データの送信
;int	RSB_send(int port,int ch,int *st);
;注:<return>=エラーno.(ah)  st=ステータス(l:dh)
;

	public	RSB_send
RSB_send	proc	near

		push	ebp		;High-C用ヘッダー
		mov	ebp,esp
		push	es
		push	esi
		push	edi
		push	ebx
		push	ecx

		mov	eax,[ebp][8]	;引数 1( int port )
		mov	edx,[ebp][12]	;引数 2( int ch )
		mov	ah,07h		;send
		int	9Bh
		movzx	edx,dh
		mov	edi,[ebp][16]	;引数 3( int *st )
		mov	[edi],edx
		movzx	eax,ah

		pop	ecx
		pop	ebx		;High-C用後処理
		pop	edi
		pop	esi
		pop	es
		pop	ebp
		ret
RSB_send	endp

;拡張DTR信号の保持設定
;int	RSB_dtr(int port,int sw);
;

	public	RSB_dtr
RSB_dtr		proc	near

		push	ebp		;High-C用ヘッダー
		mov	ebp,esp

		mov	eax,[ebp][8]	;引数 1( int port )
		mov	edx,[ebp][12]	;引数 2( int sw )
		mov	ah,0Eh		;dtr
		int	9Bh
		movzx	eax,ah

		pop	ebp		;High-C用後処理
		ret
RSB_dtr		endp

;Break信号の送信
;int	RSB_break(int port,int sec);
;

	public	RSB_break
RSB_break	proc	near

		push	ebp		;High-C用ヘッダー
		mov	ebp,esp

		mov	eax,[ebp][8]	;引数 1( int port )
		mov	edx,[ebp][12]	;引数 2( int sec )
		mov	ah,0Bh		;break
		int	9Bh
		movzx	eax,ah

		pop	ebp		;High-C用後処理
		ret
RSB_break	endp

;シリアルポートの制御
;int	RSB_ctrl(int port,unsigned ctrl);
;

	public	RSB_ctrl
RSB_ctrl	proc	near
		push	ebp		;High-C用ヘッダー
		mov	ebp,esp

		mov	eax,[ebp][8]	;引数 1( int port )
		mov	edx,[ebp][12]	;引数 2( int ctrl )
		mov	ah,08h		;break
		int	9Bh
		movzx	eax,ah

		pop	ebp		;High-C用後処理
		ret
RSB_ctrl	endp


RSBcode	ends

	end
