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に色々問題がありそうです^^
未完成もいいところですが一通り動作できるコード一式をお送りしますので、よろしければエミュの評価用にお使いください