Categories: R10ブログ

MB-6892 マーク5の拡張RAMでFLEX9を試す その11 (KB入力の2)

ベーシックマスタレベル3でFLEX9を動作させる作戦の続きです。

キーボードレジスタから読み込んだキーコードをASCII文字コードに変換する部分は実装できたので、問題だったキー入力の連打対策を入れてみました。

割込みを使っても、キーボードレジスタからのデータのbit7を使ってもキーを離したことをうまく
検出できないのでカウンタで同じコードを数えてカウントアップさせる方法で実装してみました
(カウントアップで一度フラグをクリアしているので連続押下はオートリピートみたいな感じになりました^^)

なんとなくいまいちな感じですが、一応使えるようになったのでここから改良を加えて実用性を
上げていきたいと思います。

キーボードからのIRQ割込みで読込む方式です
割込みを使わずにキーボードレジスタをループで読み出す場合2段階に分けると「SHIFT」や「GRAPH」をフラグにセットできそうですが割込み割込みだとどうやってSHIFTやGRAPH中を検出するのかが難しそう・・・

              #; ----- KB入力
E140                               ORG             $E140
E140 00            KBCODE          FCB             $00             ;KEY-CODE OUT
E141 00            KBWORK          FCB             $00             ;KEY-CODE WORK
E142 00            KBCNT           FCB             $00             ;KEYON COUNT
E143 00            KBONFLG         FCB             $00             ;KEYON FLAG
E144 00            CHRCODE         FCB             $00             ;ASCII CODE OUT
E145
                   #; IN=KB OUT AccA=ASCIIコード
E150                               ORG             $E150
E150               KBIN            EQU             *
E150 B6   FFE0                     LDA             KBREG           ;KB-REG READ
E153 81   00                       CMPA            #$00
E155 27   44                       BEQ             KBFLGCLR        ;KBCODE=$00でKBONFLGクリア
E157 81   7F                       CMPA            #$7F
E159 27   45                       BEQ             KBFLGCHK        ;KBCODE=$7FでKBONFLGチェック
E15B
E15B 81   FF       KBIN1           CMPA            #$FF
E15D 27   29                       BEQ             KBINFIN         ;$FFは無効
E15F
E15F 81   80                       CMPA            #$80
E161 27   08                       BEQ             KBIN2           ;SPCは取込む
E163 81   9E                       CMPA            #$9E
E165 27   04                       BEQ             KBIN2           ;BSは取込む
E167 81   8D                       CMPA            #$8D            ;$8Dはテンキーの8(ESCが$8Cなのでどうする!?)
E169 25   1D                       BLO             KBINFIN         ;KBCODE>$90でKB押下げ検出(補助キー以外のキーのみ検出)
E16B
E16B C6   01       KBIN2           LDB             #$01
E16D F7   E143                     STB             KBONFLG         ;KBONFLGセット
E170
E170 B1   E141                     CMPA            KBWORK
E173 27   14                       BEQ             KBCNTINC        ;KEYCODE=KBWORKでカウンタインクリ
E175
E175 B7   E140                     STA             KBCODE
E178 B7   E141                     STA             KBWORK
E17B 7F   E142                     CLR             KBCNT
E17E
E17E 84   7F                       ANDA            #$7F
E180 8E   E1AF                     LDX             #KBTBL          ;ANK=KBTBL+$0, 仮名=KBTBL+$80, GRAPH=KBTBL+$109
E183 A6   86                       LDA             A,X
E185 B7   E144                     STA             CHRCODE
E188
E188 39            KBINFIN         RTS
E189
E189 7C   E142     KBCNTINC        INC             KBCNT           ;KB連続押下げカウント
E18C B6   E142                     LDA             KBCNT
E18F 81   20                       CMPA            #$20
E191 25   BD                       BLO             KBIN            ;カウントアップしてないKBINへ
E193 7F   E142                     CLR             KBCNT           ;カウントアップでワーククリアしてKBINへ
E196 7F   E141                     CLR             KBWORK
E199 20   B5                       BRA             KBIN
E19B
E19B 7F   E143     KBFLGCLR        CLR             KBONFLG
E19E 20   BB                       BRA             KBIN1
E1A0
E1A0 F6   E143     KBFLGCHK        LDB             KBONFLG
E1A3 C1   01                       CMPB            #$01
E1A5 27   B4                       BEQ             KBIN1           ;KBの押下げありはKBIN1へ
E1A7 7F   E141                     CLR             KBWORK          ;KBの押下げ無しはワーククリアしてKBIN1へ
E1AA 7F   E142                     CLR             KBCNT
E1AD 20   AC                       BRA             KBIN1
E1AF
E1AF               KBTBL           EQU             *
E1AF 20 1E 3F 1D                   FCB $20,$1E,$3F,$1D,$1F,$1C,$00,$00,$00,$00,$00,$00,$1B,$38,$39,$2A
E1B3 1F 1C 00 00
E1B7 00 00 00 00
E1BB 1B 38 39 2A
E1BF 37 34 36 38                   FCB $37,$34,$36,$38,$30,$5E,$2D,$33,$08,$35,$31,$32,$39,$37,$08,$5C
E1C3 30 5E 2D 33
E1C7 08 35 31 32
E1CB 39 37 08 5C
E1CF 55 52 59 49                   FCB $55,$52,$59,$49,$50,$5B,$40,$30,$51,$54,$57,$45,$4F,$2E,$0C,$0D
E1D3 50 5B 40 30
E1D7 51 54 57 45
E1DB 4F 2E 0C 0D
E1DF 4A 46 48 4B                   FCB $4A,$46,$48,$4B,$3B,$5D,$3A,$34,$41,$47,$53,$44,$4C,$35,$36,$2D
E1E3 3B 5D 3A 34
E1E7 41 47 53 44
E1EB 4C 35 36 2D
E1EF 4D 56 4E 2C                   FCB $4D,$56,$4E,$2C,$2F,$2F,$5F,$31,$5A,$42,$58,$43,$2E,$32,$33,$2B
E1F3 2F 2F 5F 31
E1F7 5A 42 58 43
E1FB 2E 32 33 2B
E1FF 27 24 26 28                   FCB $27,$24,$26,$28,$30,$5E,$3D,$23,$12,$25,$21,$22,$29,$37,$12,$5C
E203 30 5E 3D 23
E207 12 25 21 22
E20B 29 37 12 5C
E20F 55 52 59 49                   FCB $55,$52,$59,$49,$50,$00,$40,$30,$51,$54,$57,$45,$4F,$2E,$0B,$0D
E213 50 00 40 30
E217 51 54 57 45
E21B 4F 2E 0B 0D
E21F 4A 46 48 4B                   FCB $4A,$46,$48,$4B,$2B,$5D,$2A,$34,$41,$47,$53,$44,$4C,$35,$36,$2D
E223 2B 5D 2A 34
E227 41 47 53 44
E22B 4C 35 36 2D
E22F
E22F

 

INPUT部

                   #; -----[ INPUT 文字入力(エコーバックあり) ] ----------------------------------
                   #; 引数なし 戻り値 AccA=文字コード
D39A               INPUT           EQU             *
D39A B6   E144     INPUT2          LDA             KBCHR
D39D 27   FB                       BEQ             INPUT2
D39F 84   7F                       ANDA            #$7F
D3A1 5F                            CLRB
D3A2 F7   E144                     STB             KBCHR           ;読み出したらKBCHRをクリア
D3A5 8D   01                       BSR             OUTPUT
D3A7 39            INPUT3          RTS
D3A8

 

INHD部

                   #; -----[ INHDLR 割込み処理の位置 ]
                   #; 引数なし 戻り値なし
D380               IHND            EQU             *
D380 17   0DCD                     LBSR            KBIN            ;割込でKB入力
D383 86   80                       LDA             #$80
D385 B7   FFD4                     STA             TIMEMASK        ;内部タイマ停止
D388 B6   FF00                     LDA             FDSTREG         ;空読みでNMI解除
D38B 3B                            RTI

相変わらずこの使い方が正しいのか分かりませんが、一応使い物になっているのでメモしておきます。
CRT出力も使い物になりそうになってきたので、整理して投稿します^^
そんな、レベル3用FLEX9のキーボードドライバが少し良くなってきた記録・・・

kabekin

View Comments

  • キーがすべて離されるとキーコード$FFで割り込みがかかるので、これを検出に使用してみてはいかがでしょうか。

    • 情報ありがとうございます^^
      キーコードのテストをしているときに$FFが入って邪魔だなぁと$FFをスキップする条件を入れていますが、これがキーを離したときのコードだったんですね。
      キーを離したことが検出できずに苦労していたので、早く気づけばよかったです^^;;;
      これならカウントアップでキーフラグをクリアする小細工は外せそうですね!
      ありがとうございました