home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / ms_dos / rsbpat / rsbpat.asm next >
Assembly Source File  |  1990-06-14  |  10KB  |  381 lines

  1.     PAGE    110, 132
  2.     TITLE   ファイル名:RSBPAT.ASM    バージョン:V1.0 L01  編集日:90/02/21
  3. ;*----------------------------------------*
  4. ;* ファイル名:RSBPAT.ASM   V1.0 L01 90/02/21 *
  5. ;* 概  要:ポート番号, ボーレート変更     *
  6. ;*         (FMR-30/50/60/70/TOWNS対応)    *
  7. ;*----------------------------------------*
  8. ;--------------------------------- 変更履歴 ----------------------------------
  9. ; V1.0 L01 90/02/21 初版完成
  10. ;-----------------------------------------------------------------------------
  11.     .286
  12.     .MODEL    COMPACT
  13.     .CODE
  14. ;
  15.     ORG    100h                ;COMファイル
  16. ;
  17. ;-------------------------------------------
  18. ; 概  要:ここからプログラムは走り始めます
  19. ; 使い方:rsbpat -b0=1 -p0=3  ・・・設定
  20. ;         rsbpat -r           ・・・解除
  21. ;         rsbpat -h           ・・・ヘルプ
  22. ;-------------------------------------------
  23.     SUBTTL    PROC名:rsbpat        概   要:プログラム入口
  24.     PUBLIC    rsbpat
  25. rsbpat    PROC
  26.     jmp    paranl                ;パラメータ分析
  27. rsbpat    ENDP
  28. ;
  29. ;-------------------------------------------
  30. ; 概  要:BIOSトラップの本体です
  31. ;         機能コード80h, 81hを追加
  32. ;-------------------------------------------
  33.     SUBTTL    PROC名:rsbtrap       概   要:トラップ本体
  34.     PUBLIC    rsbtrap
  35. rsbtrap    PROC
  36.     cmp    ah,00h                ;機能コードはポートチェックか?
  37.     jne    trap1                ;No :次チェック
  38.     call    chkport                ;Yes:シリアルポートチェック
  39.     jmp    endtrap
  40. trap1:
  41.     cmp    ah,80h                ;機能コードは常駐チェックか?
  42.     jne    trap2                ;No :次チェック
  43.     call    chktrap                ;Yes:常駐チェックをする
  44.     jmp    endtrap
  45. trap2:
  46.     cmp    ah,81h                ;機能コードは常駐解除か?
  47.     jne    trap3                ;No :次チェック
  48.     call    rsttrap                ;Yes:常駐プログラムを解除する
  49.     jmp    endtrap
  50. trap3:
  51.     push    bx
  52.     cmp    al,04                ;ポート番号は正しいか?
  53.     ja    jmpbios                ;No :goto FBIOS
  54. ;
  55.     xor    bx,bx                ;
  56.         mov    bl,al                ;ポート番号入れ換え
  57.     mov    al,BYTE PTR cs:rsport[bx]    ;
  58. ;
  59.     cmp    ah,03                ;機能コードはパラメータ設定か?
  60.     jne    jmpbios                ;No :goto FBIOS
  61. ;
  62.     mov    bl,BYTE PTR [di+1]        ;
  63.     cmp    bl,06                ;ボーレート範囲は正しいか?
  64.     ja    jmpbios                ;No :goto FBIOS
  65.     mov    bl,BYTE PTR cs:rsbaud[bx]    ;ボーレート入れ換え
  66.     mov    BYTE PTR [di+1],bl        ;
  67. jmpbios:
  68.     pop    bx
  69.     jmp    DWORD PTR cs:rsbvect        ;FBIOS JUMP
  70. endtrap:
  71.     iret                    ;割り込み処理終了
  72. rsbtrap    ENDP
  73. ;
  74. ;-------------------------------------------
  75. ; 概  要:シリアルポートの検出疑似(00h)
  76. ; Call  :無し
  77. ; Return:無し
  78. ;-------------------------------------------
  79.     SUBTTL    PROC名:chkport       概   要:シリアルポートの検出
  80.     PUBLIC    chkport
  81. chkport    PROC
  82.     mov    al,00011111b            ;全ポート有効
  83.     xor    ah,ah                ;正常終了
  84.     ret
  85. chkport    ENDP
  86. ;
  87. ;-------------------------------------------
  88. ; 概  要:常駐状態をチェックする(80h)
  89. ; Call  :無し
  90. ; Return:無し
  91. ;-------------------------------------------
  92.     SUBTTL    PROC名:chktrap       概   要:常駐状態をチェックする
  93.     PUBLIC    chktrap
  94. chktrap    PROC
  95.     xor    ah,ah                ;正常終了
  96.     ret
  97. chktrap    ENDP
  98. ;
  99. ;-------------------------------------------
  100. ; 概  要:常駐プログラムを解除する(81h)
  101. ; Call  :無し
  102. ; Return:無し
  103. ;-------------------------------------------
  104.     SUBTTL    PROC名:rsttrap       概   要:常駐プログラム解除
  105.     PUBLIC    rsttrap
  106. rsttrap    PROC
  107.     push    ds
  108.     push    es
  109. ;
  110.     mov    dx,WORD PTR cs:rsbvect+0    ;
  111.     mov    ax,WORD PTR cs:rsbvect+2    ;
  112.     mov    ds,ax                ;割り込みベクタを
  113.     mov    al,9Bh                ;  本来の値に戻す
  114.     mov    ah,25h                ;
  115.     int    21h                ;
  116. ;
  117.     mov    es,WORD PTR cs:pspaddr        ;
  118.     mov    ah,49h                ;PSP領域解放
  119.     int    21h                ;
  120. ;
  121.     xor    ah,ah                ;正常終了
  122.     pop    es
  123.     pop    ds
  124.     ret
  125. rsttrap    ENDP
  126. ;
  127. ;
  128. ;
  129.     PUBLIC    rsport
  130.     PUBLIC    rsbaud
  131.     PUBLIC    rsbvect
  132.     PUBLIC    pspaddr
  133.     PUBLIC    enddata
  134. ;-------------------------------------------
  135. ; 概  要:常駐部のデータ定義
  136. ;
  137. ;-------------------------------------------
  138. rsport    DB    0, 1, 2, 3, 4            ;ポート番号テーブル
  139. rsbaud    DB    0, 1, 2, 3, 4, 5, 6        ;ボーレートテーブル
  140. rsbvect    DD    0                ;本来のベクタアドレス
  141. pspaddr    DW    0                ;PSPアドレス
  142. enddata    DB    0                ;常駐部終了
  143. ;
  144. ;-------------------------------------------
  145. ; 概  要:パラメータ分析処理
  146. ;
  147. ;-------------------------------------------
  148.     SUBTTL    PROC名:paranl        概   要:パラメータ分析
  149.     PUBLIC    paranl
  150. paranl     PROC
  151.     mov    ax,cs                ;セグメント設定
  152.     mov    ds,ax
  153. ;
  154.     mov    dx,OFFSET msgtitl        ;
  155.     mov    ah,09h                ;初期タイトル表示
  156.     int    21h                ;
  157. ;
  158.     mov    bx,80h                ;パラメータアドレス
  159.     xor    cx,cx
  160.     mov    cl,BYTE PTR [bx]        ;パラメータ長設定
  161.     cmp    cx,0                ;パラメータはあるか?
  162.     jne    parsrh                ;Yes:パラメータチェック
  163.     jmp    opthelp                ;No :ヘルプ表示
  164. parsrh:
  165.     dec    cx                ;パラメータは終了か?
  166.     jne    parchk                ;No :チェック開始
  167.     jmp    memkeep                ;Yes:メモリに常駐する
  168. parchk:
  169.     inc    bx                ;パラメータを更新する
  170.     mov    al,BYTE PTR [bx]        ;パラメータを読み込む
  171.     cmp    al,'-'                ;パラメータ開始か?
  172.     jne    parsrh                ;No :次パラメータリード
  173. ;
  174.     mov    al,BYTE PTR [bx+1]        ;オプションをチェックする
  175.     cmp    al,'r'                ;解除か?
  176.     jne    check1                ;No :次チェック
  177.     jmp    optrest                ;Yes:解除
  178. check1:
  179.     cmp    al,'h'                ;ヘルプか?
  180.     jne    check2                ;No :次チェック
  181.     jmp    opthelp                ;Yes:ヘルプ
  182. check2:
  183.     cmp    al,'b'                ;ボーレートか?
  184.     jne    check3                ;No :次チェック
  185.     call    optbaud                ;Yes:ボーレート変更
  186.     jmp    parsrh
  187. check3:
  188.     cmp    al,'p'                ;ポート番号か?
  189.     jne    check4                ;No :次チェック
  190.     call    optport                ;Yes:ポート番号変更
  191.     jmp    parsrh
  192. check4:
  193.     jmp    opthelp                ;ヘルプ表示
  194. paranl    ENDP
  195. ;
  196. ;-------------------------------------------
  197. ; 概  要:ボーレートの設定をする(-bA=B)
  198. ; Call  :BX=パラメータ先頭アドレス
  199. ; Return:無し
  200. ;-------------------------------------------
  201.     SUBTTL    PROC名:optbaud       概   要:ボーレート設定
  202.     PUBLIC    optbaud
  203. optbaud    PROC
  204.     push    ax
  205.     push    di
  206.     mov    al,BYTE PTR [bx+3]        ;
  207.     cmp    al,'='                ;=はあるか?
  208.     jne    endbaud                ;
  209. ;
  210.     xor    ax,ax
  211.     mov    al,BYTE PTR [bx+2]        ;
  212.     sub    al,'0'                ;物理ボーレート値
  213.     cmp    al,6                ;  範囲チェック
  214.     ja    endbaud                ;
  215.     mov    di,ax
  216.     mov    al,BYTE PTR [bx+4]        ;
  217.     sub    al,'0'                ;疑似ボーレート値
  218.     cmp    al,6                ;  範囲チェック
  219.     ja    endbaud                ;
  220. ;
  221.     mov    BYTE PTR cs:rsbaud[di],al    ;ボーレート値設定
  222. endbaud:
  223.     pop    di
  224.     pop    ax
  225.     ret
  226. optbaud    ENDP
  227. ;
  228. ;-------------------------------------------
  229. ; 概  要:ポート番号を設定する(-pA=B)
  230. ; Call  :BX=パラメータ先頭アドレス
  231. ; Return:無し
  232. ;-------------------------------------------
  233.     SUBTTL    PROC名:optport       概   要:ポート番号設定
  234.     PUBLIC    optport
  235. optport    PROC
  236.     push    ax
  237.     push    di
  238.     mov    al,BYTE PTR [bx+3]        ;
  239.     cmp    al,'='                ;=はあるか?
  240.     jne    endport                ;
  241. ;
  242.     xor    ax,ax
  243.     mov    al,BYTE PTR [bx+2]        ;
  244.     sub    al,'0'                ;物理ポート番号値
  245.     cmp    al,4                ;  範囲チェック
  246.     ja    endport                ;
  247.     mov    di,ax
  248.     mov    al,BYTE PTR [bx+4]        ;
  249.     sub    al,'0'                ;疑似ポート番号値
  250.     cmp    al,4                ;  範囲チェック
  251.     ja    endport                ;
  252. ;
  253.     mov    BYTE PTR cs:rsport[di],al    ;ポート番号値設定
  254. endport:
  255.     pop    di
  256.     pop    ax
  257.     ret
  258. optport    ENDP
  259. ;
  260. ;-------------------------------------------
  261. ; 概  要:ヘルプメッセージ表示(-h)
  262. ; Call  :無し
  263. ; Return:無し
  264. ;-------------------------------------------
  265.     SUBTTL    PROC名:opthelp       概   要:ヘルプ表示
  266.     PUBLIC    opthelp
  267. opthelp    PROC
  268.     mov    dx,OFFSET msghelp        ;ヘルプメッセージ
  269.     mov    ah,09h                ;画面表示
  270.     int    21h
  271. ;
  272.     mov    ah,4Ch                ;プロセス終了
  273.     int    21h
  274. opthelp    ENDP
  275. ;
  276. ;-------------------------------------------
  277. ; 概  要:常駐プログラムを解除する(-r)
  278. ; Call  :無し
  279. ; Return:無し
  280. ;-------------------------------------------
  281.     SUBTTL    PROC名:optrest       概   要:常駐解除
  282.     PUBLIC    optrest
  283. optrest    PROC
  284.     mov    ah,81h                ;常駐解除要求
  285.     int    9Bh
  286.     cmp    ah,0                ;常駐しているか?
  287.     jne    rsterr                ;No :非常駐
  288. ;
  289.     mov    dx,OFFSET msgrest        ;
  290.     mov    ah,09h                ;解除メッセージ表示
  291.     int    21h                ;
  292.     jmp    rstend
  293. rsterr:
  294.     mov    dx,OFFSET msgarrt        ;
  295.     mov    ah,09h                ;解除失敗メッセージ表示
  296.     int    21h                ;
  297. rstend:
  298.     mov    ah,4Ch                ;プロセス終了
  299.     int    21h
  300. optrest    ENDP
  301. ;
  302. ;-------------------------------------------
  303. ; 概  要:メモリに常駐し終了する
  304. ; Call  :無し
  305. ; Return:無し
  306. ;-------------------------------------------
  307.     SUBTTL    PROC名:memkeep       概   要:メモリ常駐
  308.     PUBLIC    memkeep
  309. memkeep    PROC
  310.     mov    ah,80h                ;
  311.     int    9Bh                ;常駐状態
  312.     cmp    ah,0                ;  チェック
  313.     jne    keep                ;
  314. ;
  315.     mov    dx,OFFSET msgarkp        ;既に常駐済です
  316.     mov    ah,09h                ;画面表示
  317.     int    21h
  318.     mov    ah,4Ch                ;プロセス終了
  319.     int    21h
  320. keep:
  321.     mov    al,9Bh                ;本来の割り込み
  322.     mov    ah,35h                ;  ベクタ取り出し
  323.     int    21h                ;
  324.     mov    WORD PTR cs:rsbvect+0,bx    ;Off
  325.     mov    WORD PTR cs:rsbvect+2,es    ;Seg
  326. ;
  327.     mov    al,9Bh                ;
  328.     mov    dx,offset rsbtrap        ;新割り込み
  329.     mov    ah,25h                ;  ベクタ設定
  330.     int    21h                ;
  331. ;
  332.     mov    dx,OFFSET msgkeep        ;
  333.     mov    ah,09h                ;常駐メッセージ表示
  334.     int    21h                ;
  335. ;
  336.     mov    ah,62h                ;
  337.     int    21h                ;PSPアドレスセーブ
  338.     mov    WORD PTR cs:pspaddr,bx        ;
  339. ;
  340.     mov    es,bx                ;
  341.     mov    ax,WORD PTR es:2Ch        ;
  342.     mov    es,ax                ;環境変数領域解放
  343.     mov    ah,49h                ;
  344.     int    21h                ;
  345. ;
  346.     mov    dx,OFFSET enddata        ;
  347.     shr    dx,4                ;常駐サイズを求める
  348.     add    dx,1h                ;(パラグラフ単位)
  349.     mov    al,0                ;
  350.     mov    ah,31h                ;常駐終了する
  351.     int    21h                ;
  352. memkeep    ENDP
  353. ;
  354. ;
  355. ;
  356.     PUBLIC    msgtitl
  357.     PUBLIC    msgarrt
  358.     PUBLIC    msgarkp
  359.     PUBLIC    msgrest
  360.     PUBLIC    msgkeep
  361.     PUBLIC    msghelp
  362. ;-------------------------------------------
  363. ; 概  要:起動部のデータ定義
  364. ;
  365. ;-------------------------------------------
  366. msgtitl    DB    "RSBios PATch utility V1.0 L01",0Dh,0Ah,'$'
  367. msgarrt    DB    "既に解除されています.",0Dh,0Ah,'$'
  368. msgarkp    DB    "既に常駐されています.",0Dh,0Ah,'$'
  369. msgrest    DB    "メモリを解放しました.",0Dh,0Ah,'$'
  370. msgkeep    DB    "メモリに常駐しました.",0Dh,0Ah,'$'
  371. msghelp    DB    "usage: rsbpat [ -opt1 -opt2 ・・・ -optn ]",0Dh,0Ah
  372.     DB    "-h   : このメッセージ表示",0Dh,0Ah
  373.     DB    "-r   : 常駐解除",0Dh,0Ah
  374.     DB    "-pA=B: ポート番号変更(A:物理ポート,B:疑似ポート)",0Dh,0Ah
  375.     DB    "       0:port0,1:port1,2:port2,3:port3,4:port4",0Dh,0Ah
  376.     DB    "-bC=D: ボーレート変更(C:物理レート,D:疑似レート)",0Dh,0Ah
  377.     DB    "       0:300,1:600,2:1200,3:2400,4:4800,5:9600,6:19200",0Dh,0Ah
  378.     DB    '$'
  379. ;
  380.     END    rsbpat
  381.