home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 3 / FREEWARE.BIN / towns_os / rsbpat / rsbpat.asm next >
Assembly Source File  |  1980-01-02  |  10KB  |  383 lines

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