Categories: R10旧型PC

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

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

VRAMへのデータ書込みでROMのルーチンに頼らずCRT表示ができることが確認できたので
ROMルーチンに頼らないKB入力について調べてみました。

どうやらROM内にKBのスキャンコードとASCIIコードの変換テーブルがあり、そのテーブルで変換していることが分かったので、テーブル部分の一部を抜き出してKB入力を試してみました。

とりあえず、KBスキャンコードからASCIIコードに変換できることは確認できましたが、
CRT出力以上にKB入力は難しそうです・・・^^;;;

ACIAのデータ入力をキーボードからのデータ読込に差替えてみたところ、入力はできますがキースキャンが高速なのでちょっとキーを押しただけでも大量に取り込んでしまいます^^;;

IRQ割込みでキースキャンコードをASCIIコードに変換して変数に代入、読み出したら変数クリアで次のキーを入力可にしていますがスキャンが速い・・・

キーボードから読み込む処理はIRQ割込で、データの読込はConsoleドライバのINPUTサブルーチンとそれぞれ同期していないので何か同期する工夫が必要なのかもしれません。
ConsoleドライバのSTATサブルーチンで常時キー入力を監視しているのかと思っていましたが、トレースすると毎回STATに入っているわけでは無さそうで、キー入力監視につかえるのかどうかわかりませんでした・・・

こちらも、CRT出力同様ハードルが高そうです・・・
試したコードはこんな感じ。
IRQ割込みでキースキャンコードをASCIIコードに変換し変数にセット

Console I/OドライバのIHNDサブルーチン

#; -----[ INHDLR 割込み処理 ]
#; 引数なし 戻り値なし
IHND            EQU             *
#;                LDA             DATAREG         ;ACIAの空読みでIRQ解除
#;                LDA             KBREG           ;KBレジスタ空読み
                JSR             KBENC
                LDA             #$80
                STA             TIMEMASK        ;内部タイマ停止
                LDA             FDSTREG         ;空読みでNMI解除
                RTI

キースキャンエンコード処理

#; --- KB入力
#; IN=KB OUT AccA=ASCIIコード CCR=Z
KBENC           EQU             *
                LDB             $FFE0           ;KB-REG
                CMPB            #$FF
                BEQ             KBENC2          ;#$FFならRTS
                CMPB            #0
                BMI             KBENC3          ;b7オンならKEY入力ありでKBENC3へ
                CLRA
                STA             KBCHR           ;b7がオフならKBCHRをクリア
KBENC2          RTS
KBENC3          ANDB            #$7F
                LDX             #KBTBL
                LDA             B,X
                STA             KBCHR           ;ASCIIに変換してKBCHRへセット
                RTS
KBTBL           EQU             *
                FCB $20,$1E,$3F,$1D,$1F,$1C,$00,$00,$00,$00,$00,$00,$1B,$38,$39,$2A
                FCB $37,$34,$36,$38,$30,$5E,$2D,$33,$08,$35,$31,$32,$39,$37,$08,$5C
                FCB $55,$52,$59,$49,$50,$5B,$40,$30,$51,$54,$57,$45,$4F,$2E,$0C,$0D
                FCB $4A,$46,$48,$4B,$3B,$5D,$3A,$34,$41,$47,$53,$44,$4C,$35,$36,$2D
                FCB $4D,$56,$4E,$2C,$2F,$2F,$5F,$31,$5A,$42,$58,$43,$2E,$32,$33,$2B
                FCB $27,$24,$26,$28,$30,$5E,$3D,$23,$12,$25,$21,$22,$29,$37,$12,$5C
                FCB $55,$52,$59,$49,$50,$00,$40,$30,$51,$54,$57,$45,$4F,$2E,$0B,$0D
                FCB $4A,$46,$48,$4B,$2B,$5D,$2A,$34,$41,$47,$53,$44,$4C,$35,$36,$2D

(ASCIIコード代入用のKBCHR変数はNULLならデータなしと判断することにしています)
Console I/OドライバのINPUTサブルーチンでデータ入力(ACIAのデータ待ちをそのまま差替え)

#; -----[ INPUT 文字入力(エコーバックあり) ] ----------------------------------
#; 引数なし 戻り値 AccA=文字コード
INPUT           EQU             *
#;INPUT2          LDA             STSREG
#;                ANDA            #$01
#;                BEQ             INPUT2
#;                LDA             DATAREG         ;get data
#;                ANDA            #$7F
#;                BSR             OUTPUT
#;                RTS
INPUT2          LDA             KBCHR
                BEQ             INPUT2
                ANDA            #$7F
                CLRB
                STB             KBCHR           ;読み出したらKBCHRをクリア
                BSR             OUTPUT
INPUT3          RTS

SHIFTキーやGRAPHキーの処理を含め、完全なKB入力を作るのは相当難しそうです^^
こちらも夜な夜な調べていますが、今のところよくわかりません^^;;;
こう使ったらいい等、ご存じの方アドバイスを頂けると幸いです。
そんなレベル3のキーボード入力の記録・・・・

kabekin

View Comments

  • s1,l3のキー入力について 辻川淳氏
    i/o p259 landom box
    何月号かはわかりません。
    参考になれば幸いです。

  • sni3さん、かつみんさん
    情報ありがとうございます^^
    I/O誌の1986年12月号は持っていないので、該当の記事を探してみます
    すぐ眠くなりますが、ROMの逆アセンブルとトレースをもう少し頑張ってみます^^;;;