Last Updated on 2022年3月26日 by kabekin
ベーシックマスタレベル3でFLEX9を動作させる作戦の続きです。
こちらの実験でVRAMに直接データを書込むことでCRT表示ができることを確認済みなので
画面クリアとスクロール、改行などを実装してBASICROMの処理不要でCRT出力を実装してみました
ANKの表示は思った通りの動きをしているのですが、この出力サブルーチンを使うとasmbの画面出力などでおかしくなります。
しかし、簡単なFLEXコマンドはKB入力の指示で動作するので、OSの基本的な動作はするようになったようです。
カーソルは処理が無いのでBASICが起動した最後の位置で放置されています・・・
KB入力とCRT出力を実装する前に入出力がACIAの時はasmbやdebug, COPYコマンド等も動作していたので、KB入力やCRT出力の作りが悪いだけのようです^^;;
かなりポンコツですが、一応レベル3でFLEX9が動作するようになったので、ここをスタート地点としてデバッグを開始できそうです^^
CRT出力で何か参考になる本があればいいのですが、見たことが無いので気分のままに必要な処理を書いてみただけになっています。
相変わらずポンコツで何も参考にもなりませんが、晒しておきます^^;;;
水平文字数や開始アドレス等にマジックナンバーが残っているのは実験用が直し切れていないだけだったりします。
(CRTCを使ったCRT出力処理の参考になる書籍でおすすめな本がありましたら教えて下さい)
#; CHROUT用変数
E230 ORG $E230
0400 VRAMTOP EQU $0400 ;VRAM TOP
FFD8 CREG EQU $FFD8 ;COLOR REG.
E230 28 MX FCB 40 ;MAX X
E231 19 MY FCB 25 ;MAX Y
E232 00 CXD FCB 0 ;CUR X DMY
E233 00 CX FCB 0 ;CUR X
E234 00 CY FCB 0 ;CUR Y
E235 04 CC FCB $04 ;COLOR
E236 0000 CADRS FDB $0000 ;文字アドレス
E238
E238
#; ----- CRT出力
E240 ORG $E240
E240 CRTCHR EQU *
E240 81 0D cmpa #$0D ;CR
E242 27 3E beq CRDET
E244 81 0A cmpa #$0A ;LF
E246 27 3F beq LFDET
E248 20 79 BRA ASCCHECK ;ASCII文字チェック
E24A
E24A F6 E233 CRTCHR1 LDB CX
E24D F1 E230 CMPB MX
E250 24 18 BHS CRTCHR3 ;行末(40/80)
E252
E252 F6 E235 CRTCHR2 LDB CC
E255 F7 FFD8 STB $FFD8 ;COLOR REG
E258 8D 49 BSR VRAMSEL
E25A 8D 53 BSR ADRCALC2
E25C FE E236 LDU CADRS
E25F A7 C0 STA ,U+
E261 FF E236 STU CADRS
E264 8D 43 BSR EXTRAMSEL
E266 7C E233 INC CX
E269 39 CHRRTS RTS
E26A
E26A 7F E233 CRTCHR3 CLR CX ;行末の処理
E26D 7C E234 INC CY
E270 F6 E234 LDB CY
E273 F1 E231 CMPB MY
E276 24 02 BHS CRTCHR4 ;最終行
E278 20 D8 BRA CRTCHR2 ;最終行以外
E27A
E27A 17 0058 CRTCHR4 LBSR SCRMOVE ;最終行(25行目)
E27D 17 0077 LBSR YLSTCLR
E280 20 D0 BRA CRTCHR2
E282
E282 7F E233 CRDET CLR CX ;CR
E285 20 E2 BRA CHRRTS
E287
E287 7C E234 LFDET INC CY ;LF
E28A F6 E234 ldb CY
E28D F1 E231 CMPB MY
E290 24 02 bhs LFDET2
E292 20 D5 BRA CHRRTS
E294 17 003E LFDET2 LBSR SCRMOVE ;最終行のLF
E297 17 005D LBSR YLSTCLR
E29A F6 E231 ldb MY
E29D 5A decb
E29E F7 E234 STB CY
E2A1 20 C6 BRA CHRRTS
E2A3
#; VRAM選択
E2A3 C6 7C VRAMSEL LDB #$7C
E2A5 F7 FFE8 STB $FFE8 ;VRAM SELECT
E2A8 39 RTS
E2A9
#; EXTRAM選択
E2A9 C6 78 EXTRAMSEL LDB #$78
E2AB F7 FFE8 STB $FFE8 ;EXTRAM SELECT
E2AE 39 RTS
E2AF
#;文字出力VRAMアドレス計算
E2AF ADRCALC2 EQU *
E2AF 34 06 PSHS D
E2B1 B6 E234 LDA CY
E2B4 F6 E230 LDB MX
E2B7 3D MUL
E2B8 C3 0400 ADDD #VRAMTOP
E2BB F3 E232 ADDD CXD ;ここは要改善
E2BE FD E236 STD CADRS
E2C1 35 86 PULS D,PC
E2C3
#;ASCIIコード文字範囲チェック
E2C3 81 20 ASCCHECK CMPA #$20
E2C5 25 A2 BLO CHRRTS
E2C7 81 7F CMPA #$7F
E2C9 22 9E BHI CHRRTS
E2CB 16 FF7C LBRA CRTCHR1
E2CE
#;HOMEセット
E2CE CHOME EQU *
E2CE 7F E233 CLR CX
E2D1 7F E234 CLR CY
E2D4 39 RTS
E2D5
#;Yの1行スクロール
E2D5 SCRMOVE EQU *
E2D5 34 36 PSHS D,X,Y
E2D7 17 FFC9 LBSR VRAMSEL ;VRAM SELECT
E2DA 8E 0428 LDX #$0428 ;転送元先頭(40字)
E2DD 108E 0400 LDY #$0400 ;転送先先頭(40字)
E2E1 8C 07E8 SCRMOVE2 CMPX #$07E8 ;最終アドレス+1
E2E4 27 0C BEQ SCRMOVE3
E2E6 F6 E235 LDB CC
E2E9 F7 FFD8 STB $FFD8 ;COLOR REG
E2EC A6 80 LDA ,X+
E2EE A7 A0 STA ,Y+
E2F0 20 EF BRA SCRMOVE2
E2F2 17 FFB4 SCRMOVE3 LBSR EXTRAMSEL ;EXTRAM SELECT
E2F5 35 B6 PULS D,X,Y,PC
E2F7
#;Yの最終行クリア
E2F7 YLSTCLR EQU *
E2F7 34 36 PSHS D,X,Y
E2F9 17 FFA7 LBSR VRAMSEL ;VRAM SELECT
E2FC 86 00 LDA #$00 ;SPC->NULL
E2FE 8E 07C0 LDX #$07C0 ;先頭アドレス(40字)
E301 8C 07E8 YLSTCLR2 CMPX #$07E8 ;最終アドレス+1
E304 27 0A BEQ YLSTCLR3
E306 F6 E235 LDB CC
E309 F7 FFD8 STB $FFD8 ;COLOR REG
E30C A7 80 STA ,X+
E30E 20 F1 BRA YLSTCLR2
E310 17 FF96 YLSTCLR3 LBSR EXTRAMSEL ;EXTRAM SELECT
E313 F6 E231 LDB MY
E316 5A DECB
E317 F7 E234 STB CY
E31A 35 B6 PULS D,X,Y,PC
E31C
#;画面クリア
E31C CRTCLR EQU *
E31C 34 36 PSHS D,X,Y
E31E 17 FF82 LBSR VRAMSEL ;VRAMSEL
E321 86 00 LDA #$00 ;SPC->NULL
E323 8E 0400 LDX #$0400 ;先頭アドレス(40字)
E326 8C 07E8 CRTCLR2 CMPX #$07E8 ;最終アドレス+1
E329 27 0A BEQ CRTCLR3
E32B F6 E235 LDB CC
E32E F7 FFD8 STB $FFD8 ;COLOR REG
E331 A7 80 STA ,X+
E333 20 F1 BRA CRTCLR2
E335 17 FF71 CRTCLR3 LBSR EXTRAMSEL ;EXTRAMSEL
E338 17 FF93 LBSR CHOME
E33B 35 B6 PULS D,X,Y,PC
LISTコマンドは調子よく文字化けもありませんが、
ASNコマンドは一部文字化けしたりします。
SYSTEM DRIVE IS #0 の 0部分がおかしかったり、FILESコマンドなども化けます
これだけならすぐに直せそうですが、問題が多いのでじっくり修正していきます^^;;;
Aレジスタに入った文字をVRAMアドレスに変換して表示しているだけの処理のつもりですが、まだまだダメな部分があるんですね。
本当はBASICROMの処理をうまくバンク切換して使うのが正しいやりかただと思うのですが、うまくいかないので拡張メモリのみで自前のKB,CRT,FDCのI/Oを載せて実装しました。
とりあえず動くようになりましたが、私には難しいです^^;;
最初はVRAM位置の問題を解決するためにはマーク5の64KB拡張RAMのみで動作させるしかないと思って挑戦しましたが、何だかこのやり方は間違っている気もしてきました・・・
やはりKB入力やCRT出力の基本モニタ部分は素人が作ったものではダメですね。
そんなCRT出力ができるようになった記録^^
うーん、これはエミュのバグの可能性がありそうです。
VRAMに書き込む直前でカラーレジスタを更新するとどうなるでしょうか。
VRAMに書込む直前にブレークポイントで止めてカラーレジスタを更新してみましたが、
正常に1文字毎に色が変わりました。
エミュのバグではなく、私のポンコツBIOSに色々問題がありそうです^^
未完成もいいところですが一通り動作できるコード一式をお送りしますので、よろしければエミュの評価用にお使いください