home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 3 / FreeSoftwareCollection3pd199x-jp.img / pao / ms_dos / etc / invpad.asm next >
Assembly Source File  |  1980-01-02  |  11KB  |  461 lines

  1. ;==============================================================================
  2. ;    << MASM V5.1 >>  for  FM TOWNS
  3. ;==============================================================================
  4.     page        60,132
  5.     name        invpad
  6.     title        PAD to KYB(invaders用) Program
  7. ;==============================================================================
  8. ;    invpad Program
  9. ;
  10. ;    キーマトリクス取得時、パッド操作により、次のキーをONの状態にして値を返す。
  11. ;    ← : 'Z'
  12. ;    → : 'C'
  13. ;    A/B : SPACE
  14. ;
  15. ;    パッドのRUNボタンを押すと、改行コードを入力文字列に追加する。
  16. ;
  17. ;    CREATE : 1990.05.11
  18. ;    FINISH : 1990.05.12  Version 0.50
  19. ;
  20. ;    < HISTORY >
  21. ;    1990.05.11 : CREATE
  22. ;    1990.05.15 : Version 0.51
  23. ;                 ジョイスティック対応(バグ修正) COM入力を見ないようにした。
  24. ;
  25. ;    All Rights Reserved, Copyright (C) Y.Hirata 1990.
  26. ;
  27. ;    Programed by Y.Hirata ( NIFTY-ID : NAB03321 )
  28. ;==============================================================================
  29. ;
  30. code        segment
  31.             assume    cs:code,ds:code,es:code,ss:code
  32. ;
  33. ;--------------------------------------------
  34.             org 000h
  35. SEGTOP        label    WORD
  36. ;--------------------------------------------
  37. ;
  38. ;--------------------------------------------
  39.             org 02ch
  40. ENVADRS        label    WORD
  41. ;--------------------------------------------
  42. ;
  43. ;--------------------------------------------
  44.             org    080h
  45. ARGUMENT    label    WORD
  46. ;--------------------------------------------
  47. ;
  48. ;--------------------------------------------
  49.             org    100h
  50. entry:        jmp    main
  51. ;--------------------------------------------
  52. ;
  53. COPYRIGHT    db            0Dh
  54.             db            '     ',0Dh,0Ah,07h
  55.             db            0Dh,0Ah,'        '
  56.             db            'INVADERS-PAD  V0.51   1990-05-15',0Dh,0Ah
  57.             db            0Dh,0Ah,'        '
  58.             db            'Copyright (C) Y.Hirata 1990.'
  59.             db            0Dh,0Ah,0Dh,0Ah,1Ah
  60. ;
  61. TITLE_name    db            'INVADERS-PAD'
  62. TITLE_len    EQU            $-TITLE_name
  63. ;
  64. TRUE        EQU            1
  65. FALSE        EQU            0
  66. ;
  67. KEY_REP_ST    EQU            20000                ; x 10us : 200ms キーリピート開始
  68. ;
  69. ;********************************************
  70. ;            キーアドレス
  71. ;********************************************
  72. ;
  73. Z_KEY        EQU            2Ah
  74. Z_ADR        EQU            5
  75. Z_POS        EQU            04h
  76. ;
  77. C_KEY        EQU            2Ch
  78. C_ADR        EQU            5
  79. C_POS        EQU            10h
  80. ;
  81. SPACE_KEY    EQU            35h
  82. SPACE_ADR    EQU            6
  83. SPACE_POS    EQU            20h
  84. ;
  85. RET_KEY        EQU            1Dh
  86. RET_ADR        EQU            3
  87. RET_POS        EQU            20h
  88. ;
  89. ;********************************************
  90. ;            パッド
  91. ;********************************************
  92. ;
  93. PAD_OUT_REG    EQU            04D6h                ; パッド制御
  94. PAD_STATUS    EQU            0Fh                    ; COM出力なし
  95. ;
  96. PAD_REG_IN1    EQU            04D0h                ; パッド1
  97. PAD_REG_IN2    EQU            04D2h                ; パッド2
  98. ;
  99. PAD_RIGHT    EQU            04h                    ;
  100. PAD_LEFT    EQU            08h                    ;
  101. PAD_RUN_BOT    EQU            03h                    ;
  102. PAD_A_BOT    EQU            20h                    ; ジョイスティック対応用に
  103. PAD_B_BOT    EQU            10h                    ; COMは無視する。
  104. ;
  105. ;********************************************
  106. ;            データ領域
  107. ;********************************************
  108. ;
  109. vct_90h        dd        far                        ; キーボードBIOS
  110. ;
  111. int90flg    db        FALSE                    ; 多重割り込み防止用
  112. keyinflg    db        FALSE                    ;
  113. ;
  114. key_tbl        db        16 dup(?)                ; キーマトリクス用
  115. key_add_str    dw        0Dh                        ; 入力文字列追加用(改行)
  116. ;
  117. ;
  118. ;********************************************
  119. ;            MACRO
  120. ;********************************************
  121. ;
  122. INT90H        macro                            ; キーボードBIOS
  123.             pushf                            ;
  124.             call    cs:[vct_90h]            ;
  125.             endm                            ;
  126. ;
  127. KYB_bufcls    macro                            ; キーボード・バッファクリア
  128.             mov        ah,06h                    ;
  129.             INT90H                            ;
  130.             endm                            ;
  131. ;
  132. KYB_matrix    macro                            ; キーボード・マトリクス取得
  133.             push    di                        ;
  134.             mov        di,offset key_tbl        ;
  135.             mov        ah,0Ah                    ;
  136.             INT90H                            ;
  137.             pop        di                        ;
  138.             endm                            ;
  139. ;
  140. KYB_addstr    macro                            ; 入力文字列の追加
  141.             push    di                        ;
  142.             push    cx                        ;
  143.             mov        cx,1                    ;
  144.             mov        di,offset key_add_str    ;
  145.             mov        ax,0B01h                ;
  146.             INT90H                            ;
  147.             pop        cx                        ;
  148.             pop        di                        ;
  149.             endm                            ;
  150. ;
  151. SOFTIME        macro    timecnt                    ; ソフトタイマ・10us単位で待つ
  152.             push    cx                        ;
  153.             mov        cx,timecnt                ;
  154.             int        0FDH                    ;
  155.             pop        cx                        ;
  156.             endm                            ;
  157. ;
  158. pgend        macro                            ; プログラム終了(4CH)
  159.             mov        ax,4C00h                ;
  160.             int        21h                        ; Program End !
  161.             endm                            ;
  162. ;
  163. outb        macro    port,val                ; ポート出力(BYTE)
  164.             push    dx                        ;
  165.             mov        dx,port                    ;
  166.             mov        al,val                    ;
  167.             out        dx,al                    ;
  168.             pop        dx                        ;
  169.             endm                            ;
  170. ;
  171. inb            macro    port                    ; ポート入力(BYTE)
  172.             push    dx                        ;
  173.             mov        dx,port                    ;
  174.             in        al,dx                    ;
  175.             pop        dx                        ;
  176.             endm                            ;
  177. ;
  178. ;
  179. ;********************************************
  180. ;            常駐処理部
  181. ;********************************************
  182. ;
  183. ;--------------------------------------------
  184. ;    キーボードBIOSの横取り処理
  185. ;--------------------------------------------
  186. INT90hook    proc    far                        ;
  187.             cmp        ah,0Ah                    ; マトリクス入力
  188.             je        i90_st                    ;
  189.             mov        cs:keyinflg,TRUE        ;
  190. i90_st:
  191.             push    ax                        ; +18
  192.             push    cx                        ; +16
  193.             push    dx                        ; +14
  194.             push    bx                        ; +12
  195.             push    sp                        ; +10
  196.             push    bp                        ; +8
  197.             push    si                        ; +6
  198.             push    di                        ; +4
  199.             push    ds                        ; +2
  200.             push    es                        ; +0
  201.             mov        bp,sp                    ;
  202.             mov        ax,cs                    ;
  203.             mov        es,ax                    ;
  204.             cli                                ;
  205.             cld                                ;
  206. ;
  207.             cmp        cs:int90flg,TRUE        ; 多重割り込み防止
  208.             jne        i90                        ;
  209.             jmp        i90end                    ;
  210. i90:        mov        cs:int90flg,TRUE        ;
  211. ;
  212.             cmp        cs:keyinflg,TRUE        ;
  213.             jne        i90_mx                    ;
  214.             jmp        i90_inkey                ;
  215. i90_mx:
  216.             push    di                        ;
  217.             push    ds                        ;
  218. ;
  219.             KYB_bufcls                        ;
  220.             push    ds                        ;
  221.             push    cs                        ;
  222.             pop        ds                        ; ds=cs
  223.             KYB_matrix                        ; キーマトリクス取得
  224.             pop        es                        ; es=ds
  225.             mov        cx,16                    ;
  226.             mov        si,offset key_tbl        ;
  227.         rep    movsb                            ; ds:si -> es:di
  228. ;
  229.             pop        ds                        ;
  230.             pop        di                        ;
  231. ;
  232.             inb        PAD_REG_IN1                ;
  233.             push    ax                        ; PAD STATUS
  234. ;
  235.             and        al,0Ch                    ;
  236.             cmp        al,PAD_LEFT                ; LEFT
  237.             jne        pad_r                    ;
  238.             jmp        left_on                    ;
  239. pad_r:        cmp        al,PAD_RIGHT            ; RIGHT
  240.             je        right_on                ;
  241.             jmp        pad_bot                    ;
  242. right_on:
  243.             mov        dh,BYTE ptr ds:[di+C_ADR]
  244.                                             ;
  245.             or        dh,C_POS                ;
  246.             mov        BYTE ptr ds:[di+C_ADR],dh
  247.                                             ;
  248.             jmp        pad_bot                    ;
  249. left_on:
  250.             mov        dh,BYTE ptr    ds:[di+Z_ADR]
  251.                                             ;
  252.             or        dh,Z_POS                ;
  253.             mov        BYTE ptr ds:[di+Z_ADR],dh
  254.                                             ;
  255. pad_bot:
  256.             pop        ax                        ; PAD STATUS
  257.             and        al,30h                    ;
  258. ;
  259.             cmp        al,PAD_A_BOT            ;
  260.             jne        pad_b                    ;
  261.             jmp        b_on                    ;
  262. pad_b:        cmp        al,PAD_B_BOT            ;
  263.             je        b_on                    ;
  264.             jmp        i90end                    ;
  265. b_on:
  266.             mov        dh,BYTE ptr ds:[di+SPACE_ADR]
  267.                                             ;
  268.             or        dh,SPACE_POS            ;
  269.             mov        BYTE ptr ds:[di+SPACE_ADR],dh
  270.                                             ;
  271.             jmp        i90end                    ;
  272. ;
  273. i90_inkey:
  274.             push    cs                        ;
  275.             pop        ds                        ; ds=cs
  276. ;
  277.             outb    PAD_OUT_REG,PAD_STATUS    ; COM出力なし
  278.             nop                                ;
  279.             inb        PAD_REG_IN1                ;
  280.             and        al,0Fh                    ;
  281.             cmp        al,PAD_RUN_BOT            ; RUN
  282.             je        run_on                    ;
  283.             jmp        i90end                    ;
  284. run_on:
  285.             mov        dh,BYTE ptr ds:[di+RET_ADR]
  286.                                             ;
  287.             or        dh,RET_POS                ;
  288.             mov        BYTE ptr ds:[di+RET_ADR],dh
  289.                                             ;
  290.             KYB_addstr                        ; 入力文字(改行)の追加
  291.             SOFTIME    KEY_REP_ST                ;
  292. ;
  293. i90end:
  294.             mov        sp,bp                    ; 割り込み時の状態に戻す。
  295.             pop        es                        ;
  296.             pop        ds                        ;
  297.             pop        di                        ;
  298.             pop        si                        ;
  299.             pop        bp                        ;
  300.             pop        bx                        ;
  301.             pop        bx                        ;
  302.             pop        dx                        ;
  303.             pop        cx                        ;
  304.             pop        ax                        ;
  305. ;
  306.             mov        cs:int90flg,FALSE        ;
  307.             cmp        cs:keyinflg,TRUE        ;
  308.             je        keyin_on                ;
  309.             iret                            ;
  310. keyin_on:
  311.             mov        cs:keyinflg,FALSE        ;
  312. ;
  313. i90_ret:    jmp        cs:[vct_90h]            ; 本来のベクタに処理を移す。
  314. ;            iret                            ;
  315. INT90hook    endp                            ;
  316. ;
  317. ;--------------------------------------------
  318. SEGEND        label    WORD
  319. ;--------------------------------------------
  320. ;
  321. ;********************************************
  322. ;            起動処理( メイン )
  323. ;********************************************
  324. main        proc    near                    ;
  325. ;
  326.             mov        cx,msg0_len                ; オープニングメッセージ(文字数)
  327.             mov        di,offset msg0            ; オープニングメッセージ(文字列)
  328.             mov        ah,1Eh                    ;
  329.             int        91h                        ; 文字列出力(オープニングメッセージ)
  330. ;
  331.             mov        si,offset ARGUMENT        ;
  332. optsw:                                        ; オプションスイッチ は '/','-'で始まる。
  333.             inc        si                        ;
  334.             cmp        BYTE ptr cs:[si],' '    ;
  335.             jz        optsw                    ;
  336.             cmp        BYTE ptr cs:[si],'/'    ;
  337.             jz        optsw_1                    ;
  338.             cmp        BYTE ptr cs:[si],'-'    ;
  339.             jz        optsw_1                    ;
  340.             cmp        BYTE ptr cs:[si],0Dh    ;
  341.             jnz        optsw                    ;
  342.             jmp        tsr_init                ;
  343. optsw_1:
  344.             cmp        BYTE ptr cs:[si+1],0Dh    ;
  345.             jz        tsr_init                ;
  346.             or        BYTE ptr cs:[si+1],20h    ; 大文字 -> 小文字
  347.             cmp        BYTE ptr cs:[si+1],'r'    ;
  348.             jnz        tsr_init                ; 常駐処理へ
  349. ;
  350.             mov        ax,3590h                ;
  351.             int        21h                        ; キーボードBIOS割込みベクタ取得
  352.             mov        cx,TITLE_len            ;
  353.             mov        si,offset TITLE_name    ;
  354.             mov        di,offset TITLE_name    ;
  355.             repz    cmpsb                    ; 常駐チェック
  356.             je        mem_clear                ; 常駐解除へ
  357.             jmp        mem_noclr                ; 終了
  358. ;
  359. ;
  360. ;    常駐解除処理
  361. ;
  362. mem_clear:
  363.             mov        cx,msg2_len                ; 開放メッセージ
  364.             mov        di,offset msg2            ;
  365.             mov        ah,1Eh                    ;
  366.             int        91h                        ;
  367. ;
  368.             lds        dx,DWORD ptr es:vct_90h    ;
  369.             mov        ax,2590h                ; キーボードBIOSを元のベクタに!
  370.             int        21h                        ;
  371. ;
  372.             push    es                        ;
  373.             mov        si,offset ENVADRS        ; 環境変数領域を開放
  374.             mov        ax,es:[si]                ;
  375.             mov        es,ax                    ;
  376.             mov        ah,49h                    ;
  377.             int        21h                        ;
  378.             pop        es                        ;
  379. ;
  380.             mov        ah,49h                    ; プログラムを開放
  381.             int        21h                        ;
  382. ;
  383.             pgend                            ;
  384. ;
  385. mem_noclr:
  386.             mov        cx,msg4_len                ; 非常駐メッセージ
  387.             mov        di,offset msg4            ;
  388.             mov        ah,1Eh                    ;
  389.             int        91h                        ;
  390.             pgend                            ;
  391. ;
  392. ;
  393. ;    常駐処理
  394. ;
  395. tsr_init:
  396.             mov        ax,3590h                ; * キーボードBIOS *
  397.             int        21h                        ;
  398.             mov        WORD ptr cs:vct_90h,bx    ;
  399.             mov        WORD ptr cs:vct_90h+2,es
  400.                                             ; 本来のINT90ベクタの取得・保存
  401. ;
  402.             mov        cx,TITLE_len            ;
  403.             mov        si,offset TITLE_name    ;
  404.             mov        di,offset TITLE_name    ;
  405.             repz    cmpsb                    ; 常駐チェック
  406.             jne        mem_setup                ; 常駐処理へ
  407. ;
  408.             mov        cx,msg3_len                ; 常駐済メッセージ
  409.             mov        di,offset msg3            ;
  410.             mov        ah,1Eh                    ;
  411.             int        91h                        ;
  412.             mov        cx,msghp_len            ; ヘルプメッセージ
  413.             mov        di,offset msghp            ;
  414.             mov        ah,1Eh                    ;
  415.             int        91h                        ;
  416.             pgend                            ;
  417. ;
  418. mem_setup:
  419.             mov        cx,msg1_len                ; 常駐メッセージ
  420.             mov        di,offset msg1            ;
  421.             mov        ah,1Eh                    ;
  422.             int        91h                        ;
  423.             mov        cx,msghp_len            ; ヘルプメッセージ
  424.             mov        di,offset msghp            ;
  425.             mov        ah,1Eh                    ;
  426.             int        91h                        ;
  427. ;
  428.             mov        dx,offset INT90hook        ; 常駐処理プロシジャを
  429.             mov        ax,2590h                ; ベクタセット
  430.             int        21h                        ; (キーボード割り込み)
  431. ;
  432.             mov        dx,offset SEGEND        ;
  433.             add        dx,15                    ;
  434.             mov        cl,4                    ;
  435.             shr        dx,cl                    ; パラグラフ単位
  436.             mov        ax,3100h                ;
  437.             int        21h                        ; 常駐終了
  438. ;
  439. main        endp
  440. ;
  441. msg0        db        'INVADERS-PAD  (C)パオパオ 1990.             '
  442.             db        '<< Copyright (C) Y.Hirata 1990. >>',0Dh,0Ah,0Dh,0Ah
  443.             db        'INVADERS-PAD Version 0.51   '
  444. msg0_len    equ        $-msg0
  445. msg1        db        '★ 常駐するよ~ん ★',0Dh,0Ah
  446. msg1_len    equ        $-msg1
  447. msg2        db        '☆ 解除したよ~ん ☆',0Dh,0Ah
  448. msg2_len    equ        $-msg2
  449. msg3        db        '常駐してるよ!',0Dh,0Ah,07h
  450. msg3_len    equ        $-msg3
  451. msg4        db        '常駐してないよ!',0Dh,0Ah,07h
  452. msg4_len    equ        $-msg4
  453. msghp        db        0Dh,0Ah
  454.             db        '使用方法 ★ オプションスイッチ /r で、常駐解除します。'
  455.             db        0Dh,0Ah
  456. msghp_len    equ        $-msghp
  457. ;
  458. code        ends
  459.             end        entry
  460.  
  461.