ベーシックマスタレベル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をスキップする条件を入れていますが、これがキーを離したときのコードだったんですね。
キーを離したことが検出できずに苦労していたので、早く気づけばよかったです^^;;;
これならカウントアップでキーフラグをクリアする小細工は外せそうですね!
ありがとうございました