MB-6892 マーク5の拡張RAMでFLEX9を試す その12 (CRT出力の2)

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出力ができるようになった記録^^

2件のコメント

  1. うーん、これはエミュのバグの可能性がありそうです。
    VRAMに書き込む直前でカラーレジスタを更新するとどうなるでしょうか。

    1. VRAMに書込む直前にブレークポイントで止めてカラーレジスタを更新してみましたが、
      正常に1文字毎に色が変わりました。
      エミュのバグではなく、私のポンコツBIOSに色々問題がありそうです^^
      未完成もいいところですが一通り動作できるコード一式をお送りしますので、よろしければエミュの評価用にお使いください

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください