home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
rsbpat
/
rsbpat.asm
next >
Wrap
Assembly Source File
|
1980-01-02
|
10KB
|
383 lines
PAGE 110, 132
TITLE ファイル名:RSBPAT.ASM バージョン:V1.0 L02 編集日:90/08/08
;*----------------------------------------*
;* ファイル名:RSBPAT.ASM V1.0 L02 90/08/08 *
;* 概 要:ポート番号, ボーレート変更 *
;* (FMR-30/50/60/70/TOWNS対応) *
;*----------------------------------------*
;--------------------------------- 変更履歴 ----------------------------------
; V1.0 L01 90/02/21 初版完成
; V1.0 L02 90/08/08 対応機種を追加(30HD/FD/BX)+ヘルプメッセージ修正
;-----------------------------------------------------------------------------
.286
.MODEL COMPACT
.CODE
;
ORG 100h ;COMファイル
;
;-------------------------------------------
; 概 要:ここからプログラムは走り始めます
; 使い方:rsbpat -b0=1 -p0=3 ・・・設定
; rsbpat -r ・・・解除
; rsbpat -h ・・・ヘルプ
;-------------------------------------------
SUBTTL PROC名:rsbpat 概 要:プログラム入口
PUBLIC rsbpat
rsbpat PROC
jmp paranl ;パラメータ分析
rsbpat ENDP
;
;-------------------------------------------
; 概 要:BIOSトラップの本体です
; 機能コード80h, 81hを追加
;-------------------------------------------
SUBTTL PROC名:rsbtrap 概 要:トラップ本体
PUBLIC rsbtrap
rsbtrap PROC
cmp ah,00h ;機能コードはポートチェックか?
jne trap1 ;No :次チェック
call chkport ;Yes:シリアルポートチェック
jmp endtrap
trap1:
cmp ah,80h ;機能コードは常駐チェックか?
jne trap2 ;No :次チェック
call chktrap ;Yes:常駐チェックをする
jmp endtrap
trap2:
cmp ah,81h ;機能コードは常駐解除か?
jne trap3 ;No :次チェック
call rsttrap ;Yes:常駐プログラムを解除する
jmp endtrap
trap3:
push bx
cmp al,04 ;ポート番号は正しいか?
ja jmpbios ;No :goto FBIOS
;
xor bx,bx ;
mov bl,al ;ポート番号入れ換え
mov al,BYTE PTR cs:rsport[bx] ;
;
cmp ah,03 ;機能コードはパラメータ設定か?
jne jmpbios ;No :goto FBIOS
;
mov bl,BYTE PTR [di+1] ;
cmp bl,06 ;ボーレート範囲は正しいか?
ja jmpbios ;No :goto FBIOS
mov bl,BYTE PTR cs:rsbaud[bx] ;ボーレート入れ換え
mov BYTE PTR [di+1],bl ;
jmpbios:
pop bx
jmp DWORD PTR cs:rsbvect ;FBIOS JUMP
endtrap:
iret ;割り込み処理終了
rsbtrap ENDP
;
;-------------------------------------------
; 概 要:シリアルポートの検出疑似(00h)
; Call :無し
; Return:無し
;-------------------------------------------
SUBTTL PROC名:chkport 概 要:シリアルポートの検出
PUBLIC chkport
chkport PROC
mov al,00011111b ;全ポート有効
xor ah,ah ;正常終了
ret
chkport ENDP
;
;-------------------------------------------
; 概 要:常駐状態をチェックする(80h)
; Call :無し
; Return:無し
;-------------------------------------------
SUBTTL PROC名:chktrap 概 要:常駐状態をチェックする
PUBLIC chktrap
chktrap PROC
xor ah,ah ;正常終了
ret
chktrap ENDP
;
;-------------------------------------------
; 概 要:常駐プログラムを解除する(81h)
; Call :無し
; Return:無し
;-------------------------------------------
SUBTTL PROC名:rsttrap 概 要:常駐プログラム解除
PUBLIC rsttrap
rsttrap PROC
push ds
push es
;
mov dx,WORD PTR cs:rsbvect+0 ;
mov ax,WORD PTR cs:rsbvect+2 ;
mov ds,ax ;割り込みベクタを
mov al,9Bh ; 本来の値に戻す
mov ah,25h ;
int 21h ;
;
mov es,WORD PTR cs:pspaddr ;
mov ah,49h ;PSP領域解放
int 21h ;
;
xor ah,ah ;正常終了
pop es
pop ds
ret
rsttrap ENDP
;
;
;
PUBLIC rsport
PUBLIC rsbaud
PUBLIC rsbvect
PUBLIC pspaddr
PUBLIC enddata
;-------------------------------------------
; 概 要:常駐部のデータ定義
;
;-------------------------------------------
rsport DB 0, 1, 2, 3, 4 ;ポート番号テーブル
rsbaud DB 0, 1, 2, 3, 4, 5, 6 ;ボーレートテーブル
rsbvect DD 0 ;本来のベクタアドレス
pspaddr DW 0 ;PSPアドレス
enddata DB 0 ;常駐部終了
;
;-------------------------------------------
; 概 要:パラメータ分析処理
;
;-------------------------------------------
SUBTTL PROC名:paranl 概 要:パラメータ分析
PUBLIC paranl
paranl PROC
mov ax,cs ;セグメント設定
mov ds,ax
;
mov dx,OFFSET msgtitl ;
mov ah,09h ;初期タイトル表示
int 21h ;
;
mov bx,80h ;パラメータアドレス
xor cx,cx
mov cl,BYTE PTR [bx] ;パラメータ長設定
cmp cx,0 ;パラメータはあるか?
jne parsrh ;Yes:パラメータチェック
jmp opthelp ;No :ヘルプ表示
parsrh:
dec cx ;パラメータは終了か?
jne parchk ;No :チェック開始
jmp memkeep ;Yes:メモリに常駐する
parchk:
inc bx ;パラメータを更新する
mov al,BYTE PTR [bx] ;パラメータを読み込む
cmp al,'-' ;パラメータ開始か?
jne parsrh ;No :次パラメータリード
;
mov al,BYTE PTR [bx+1] ;オプションをチェックする
cmp al,'r' ;解除か?
jne check1 ;No :次チェック
jmp optrest ;Yes:解除
check1:
cmp al,'h' ;ヘルプか?
jne check2 ;No :次チェック
jmp opthelp ;Yes:ヘルプ
check2:
cmp al,'b' ;ボーレートか?
jne check3 ;No :次チェック
call optbaud ;Yes:ボーレート変更
jmp parsrh
check3:
cmp al,'p' ;ポート番号か?
jne check4 ;No :次チェック
call optport ;Yes:ポート番号変更
jmp parsrh
check4:
jmp opthelp ;ヘルプ表示
paranl ENDP
;
;-------------------------------------------
; 概 要:ボーレートの設定をする(-bA=B)
; Call :BX=パラメータ先頭アドレス
; Return:無し
;-------------------------------------------
SUBTTL PROC名:optbaud 概 要:ボーレート設定
PUBLIC optbaud
optbaud PROC
push ax
push di
mov al,BYTE PTR [bx+3] ;
cmp al,'=' ;=はあるか?
jne endbaud ;
;
xor ax,ax
mov al,BYTE PTR [bx+2] ;
sub al,'0' ;論理ボーレート値
cmp al,6 ; 範囲チェック
ja endbaud ;
mov di,ax
mov al,BYTE PTR [bx+4] ;
sub al,'0' ;物理ボーレート値
cmp al,6 ; 範囲チェック
ja endbaud ;
;
mov BYTE PTR cs:rsbaud[di],al ;ボーレート値設定
endbaud:
pop di
pop ax
ret
optbaud ENDP
;
;-------------------------------------------
; 概 要:ポート番号を設定する(-pA=B)
; Call :BX=パラメータ先頭アドレス
; Return:無し
;-------------------------------------------
SUBTTL PROC名:optport 概 要:ポート番号設定
PUBLIC optport
optport PROC
push ax
push di
mov al,BYTE PTR [bx+3] ;
cmp al,'=' ;=はあるか?
jne endport ;
;
xor ax,ax
mov al,BYTE PTR [bx+2] ;
sub al,'0' ;論理ポート番号値
cmp al,4 ; 範囲チェック
ja endport ;
mov di,ax
mov al,BYTE PTR [bx+4] ;
sub al,'0' ;物理ポート番号値
cmp al,4 ; 範囲チェック
ja endport ;
;
mov BYTE PTR cs:rsport[di],al ;ポート番号値設定
endport:
pop di
pop ax
ret
optport ENDP
;
;-------------------------------------------
; 概 要:ヘルプメッセージ表示(-h)
; Call :無し
; Return:無し
;-------------------------------------------
SUBTTL PROC名:opthelp 概 要:ヘルプ表示
PUBLIC opthelp
opthelp PROC
mov dx,OFFSET msghelp ;ヘルプメッセージ
mov ah,09h ;画面表示
int 21h
;
mov ah,4Ch ;プロセス終了
int 21h
opthelp ENDP
;
;-------------------------------------------
; 概 要:常駐プログラムを解除する(-r)
; Call :無し
; Return:無し
;-------------------------------------------
SUBTTL PROC名:optrest 概 要:常駐解除
PUBLIC optrest
optrest PROC
mov ah,81h ;常駐解除要求
int 9Bh
cmp ah,0 ;常駐しているか?
jne rsterr ;No :非常駐
;
mov dx,OFFSET msgrest ;
mov ah,09h ;解除メッセージ表示
int 21h ;
jmp rstend
rsterr:
mov dx,OFFSET msgarrt ;
mov ah,09h ;解除失敗メッセージ表示
int 21h ;
rstend:
mov ah,4Ch ;プロセス終了
int 21h
optrest ENDP
;
;-------------------------------------------
; 概 要:メモリに常駐し終了する
; Call :無し
; Return:無し
;-------------------------------------------
SUBTTL PROC名:memkeep 概 要:メモリ常駐
PUBLIC memkeep
memkeep PROC
mov ah,80h ;
int 9Bh ;常駐状態
cmp ah,0 ; チェック
jne keep ;
;
mov dx,OFFSET msgarkp ;既に常駐済です
mov ah,09h ;画面表示
int 21h
mov ah,4Ch ;プロセス終了
int 21h
keep:
mov al,9Bh ;本来の割り込み
mov ah,35h ; ベクタ取り出し
int 21h ;
mov WORD PTR cs:rsbvect+0,bx ;Off
mov WORD PTR cs:rsbvect+2,es ;Seg
;
mov al,9Bh ;
mov dx,offset rsbtrap ;新割り込み
mov ah,25h ; ベクタ設定
int 21h ;
;
mov dx,OFFSET msgkeep ;
mov ah,09h ;常駐メッセージ表示
int 21h ;
;
mov ah,62h ;
int 21h ;PSPアドレスセーブ
mov WORD PTR cs:pspaddr,bx ;
;
mov es,bx ;
mov ax,WORD PTR es:2Ch ;
mov es,ax ;環境変数領域解放
mov ah,49h ;
int 21h ;
;
mov dx,OFFSET enddata ;
mov cl,4 ;常駐サイズを求める
shr dx,cl ;(パラグラフ単位)
add dx,1h ;
mov al,0 ;
mov ah,31h ;常駐終了する
int 21h ;
memkeep ENDP
;
;
;
PUBLIC msgtitl
PUBLIC msgarrt
PUBLIC msgarkp
PUBLIC msgrest
PUBLIC msgkeep
PUBLIC msghelp
;-------------------------------------------
; 概 要:起動部のデータ定義
;
;-------------------------------------------
msgtitl DB "RSBios PATch utility V1.0 L02",0Dh,0Ah,'$'
msgarrt DB "既に解除されています.",0Dh,0Ah,'$'
msgarkp DB "既に常駐されています.",0Dh,0Ah,'$'
msgrest DB "メモリを解放しました.",0Dh,0Ah,'$'
msgkeep DB "メモリに常駐しました.",0Dh,0Ah,'$'
msghelp DB "usage: rsbpat [ -opt1 -opt2 ・・・ -optn ]",0Dh,0Ah
DB "-h : このメッセージ表示",0Dh,0Ah
DB "-r : 常駐解除",0Dh,0Ah
DB "-pA=B: ポート番号変更(A:論理ポート,B:物理ポート)",0Dh,0Ah
DB " 0:port0,1:port1,2:port2,3:port3,4:port4",0Dh,0Ah
DB "-bC=D: ボーレート変更(C:論理レート,D:物理レート)",0Dh,0Ah
DB " 0:300,1:600,2:1200,3:2400,4:4800,5:9600,6:19200",0Dh,0Ah
DB '$'
;
END rsbpat