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

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