ベーシックマスタレベル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のキーボードドライバが少し良くなってきた記録・・・
View Comments
キーがすべて離されるとキーコード$FFで割り込みがかかるので、これを検出に使用してみてはいかがでしょうか。
情報ありがとうございます^^
キーコードのテストをしているときに$FFが入って邪魔だなぁと$FFをスキップする条件を入れていますが、これがキーを離したときのコードだったんですね。
キーを離したことが検出できずに苦労していたので、早く気づけばよかったです^^;;;
これならカウントアップでキーフラグをクリアする小細工は外せそうですね!
ありがとうございました