home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
whisper
/
source
/
rsblib.asm
< prev
next >
Wrap
Assembly Source File
|
1980-01-02
|
8KB
|
443 lines
;**************************
;* *
;* High-C用 RS-232C ライブラリー *
;* 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