皆さんから頂いた情報を整理するとカラーRAMの関係でレベル3では気軽にVRAMエリアを移動できないことが
分かりました。
しかし、CRTCのパラメータを変更後の画面の乱れはBASICのワークエリアにパラメータをセットすることで
正常になりました^^;;;
今後、何かの参考になるかもしれないので実験内容をメモしておきます^^
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | * CRTC 初期化実験 HD46505SP * 参考:マイコンピュータ誌 No.8 CRTC(HD46505)とその使い方 * Lv.3 CRTCセットとワークエリアセット+パラメータテーブル手直し * Lv.4 R8パラメータ変更とカーソル再表示 IF 0 電源オン時のグラフィックモード(L3Emu) インタレース/ノンインタレースが画面で分かるようにするには[画面]-[描画モード]-[走査線]を選択 MODESW_OFF=40文字,ハイレゾ,インターレース = NEWON3 MODESW_ON =80文字,ハイレゾ,インターレース = NEWON7 ■スクリーンモード (L3) ┌─────┬──────────┬──────────┐ │ │ SCREEN0 │ SCREEN1 │ │ │ ノーマルモード│ ハイレゾモード │ │ │ 解像度 メモリ│ 解像度 メモリ │ ├─────┼──────────┼──────────┤ │WIDTH 40 │NEWON11 80*100 1KB │NEWON3 320*200 8KB │ │WIDTH 80 │NEWON15 160*100 2KB │NEWON7 640*200 16KB │ └─────┴──────────┴──────────┘ インタレースモード SCREEN,,0 ノンインタレースモード SCREEN,,1 ■I/Oアドレス $FFC6 CRTC アドレスレジスタ(W) $FFC7 CRTC データレジスタ(R/W) $FFD6 インターレースフラグ Bit3=1でインタレース,0でノンインタレース $FFD0 画面/ACIAモード CRTCにデータをストアする部分 $FB7B $FFDOにライトしている部分 $FB28 ■CRTC(HD46505SP)レジスタパラメータ(L3) ┌─────────┬─────────────┬─────────────┐ │水平文字数 │ 40文字 │ 80文字 │ │NEWON │ NEWON3 NEWON11 │ NEWON7 NEWON15 │ │ │ HIRESO NORMAL │ HIRESO NORMAL │ │解像度 │ 320*200 80*100 │ 640*200 160*100 │ │SCREEN,,1/,,0 │ノンインタ インタレース ノンインタ インタレース│ノンインタ インタレース ノンインタ インタレース│ │MODE-SEL FFD0 │ $00 $00 $40 $40 │ $80 $80 $C0 $C0 │ │MODE │ 0 │ 1 │ ├─────────┼─────────────┼─────────────┤ │R0 水平総文字数 │ $3F $3F │ $7F $7F │ │R1 水平表示文字数│ $28 $28 │ $50 $50 │ │R2 水平同期位置 │ $31 $31 │ $5F $5F │ │R3 同期パルス幅 │ $85 $85 │ $8A $8A │ │R4 垂直総文字数 │ $1F $1F │ $1F $1F │ │R5 トータルラスタアジャスト │ $06 $06 │ $06 $06 │ │R6 垂直表示文字数│ $19 $19 │ $19 $19 │ │R7 垂直同期位置 │ $1C $1C │ $1C $1C │ │R8 インタレース&スキュー │ $40 $43 $40 $43 │ $40 $43 $40 $43 │ │R8※インタレース&スキュー │ $80 $83 $80 $83 │ $80 $83 $80 $83 │ │R9 最大ラスタアドレス │ $07 $0E $07 $0E │ $07 $0E $07 $0E │ │R10 カーソルスタートラスタ │ $27 $2A $27 $2E │ $27 $2E $27 $2E │ │R11 カーソルエンドラスタ │ $07 $0F $07 $0F │ $07 $0F $07 $0F │ │R12 スタートアドレス(H) │ $04 $04 $04 $04 │ $04 $04 $04 $04 │ │R13 スタートアドレス(L) │ $00 $00 $00 $00 │ $00 $00 $00 $00 │ │R14 カーソル(H) │ $04 $04 $00 $04 │ $04 $05 $04 $04 │ │R15 カーソル(L) │ $00 $00 $00 $00 │ $00 $18 $00 $00 │ │R16 ライトペン(H) │ N/A N/A │ N/A N/A │ │R17 ライトペン(L) │ N/A N/A │ N/A N/A │ └─────────┴─────────────┴─────────────┘ 上記のノンインタレースはインタレース→ノンインタレースに変更したときの値 ノンインタレースからインタレースに変更したときもR8~R15までのみストアしていた→R0~R7は同様なのでINIT時のみストア? WIDTH80⇔WIDTH40の変更ではR0~R3とR12~R15がストアされた ■BASICワークエリア $00A2 = 文字数(40/80) $00A3,A4 = VRAM開始アドレス(CRTC R12,R13と同じ) $00A7 = スクリーンモード($00=40字NORMAL, $01=80字NORMAL, $02=40字HIRESO, $03=80字HIRESO これを踏まえて整理すると R4~R7は全モード共通 グラフィック解像度はMODE-SELの違いのみでCRTCパラメータの違いはない R10,R11,R14,R15はカーソル表示用←設定パラメータではない R12,R13はVRAMの先頭アドレス $FFD6のインタレースフラグや$FFD0の画面/ACIAモードのI/Oも設定が必要 CRTCのパラメータのみでなくBASICのワークエリアの変更も必要 ENDIF TTL CRTC INIT PROGRAM(L3) lNTLCE EQU $FFD6 ;インターレースフラグ Bit3=1でインタレース,0でノンインタレース MODESEL EQU $FFD0 ;画面/ACIAモード CRTCAR EQU $FFC6 ;CRTCアドレスレジスタ CRTCDR EQU $FFC7 ;CRTCデータレジスタ BASWK1 EQU $00A2 ;L3BASIC WORK 文字数 BASWK2 EQU $00A3 ;L3BASIC WORK VRAM先頭 BASWK3 EQU $00A7 ;スクリーンモード BASWK4 EQU $0115 ;カーソルモード ORG $0000 ;L3には$5000~ロード BRA START START EQU * *CRTCセット LDY #CRTCAR ;CRTCアドレスセット * LEAX TBL40F,PCR LEAX TBL80F,PCR BSR PARAMSET LEAX TBLCOM1,PCR BSR PARAMSET LEAX TBLNIL,PCR * LEAX TBLIL,PCR BSR PARAMSET * LEAX TBL40S,PCR LEAX TBL80S,PCR BSR PARAMSET * インタレース設定 LDA #$00 ;ノンインタレース * LDA #$08 ;インタレース STA lNTLCE * MODE-SELセット * LDA #$40 ;80文字 HIRESO LDA #$80 ;80文字 HIRESO STA MODESEL *BASICワークエリアセット * LDA #40 LDA #80 STA BASWK1 ;文字数 LDD #$0400 STD BASWK2 ;VRAM先頭 * LDA #2 LDA #3 STA BASWK3 ;スクリーンモード LDA #$FF STA BASWK4 ;カーソルモード RTS *CRTCにパラメータをセットSub. *X=PARAMテーブルのポインタ *Y=CRTCのアドレスL PARAMSET EQU * PSHS D,X,Y LDA ,X+ ;CRTC RegNo取得 LP1 LDB ,X+ ;CRTS PARAMを取得 CMPB #$FF BEQ FIN STA ,Y INCA STB 1,Y BRA LP1 FIN PULS D,X,Y,PC * CRTCパラメータテーブル(L3) TBL40F FCB $00,$3F,$28,$31,$85,$FF ;40文字モードパラメータ1(R0~R3) TBL80F FCB $00,$7F,$50,$5F,$8A,$FF ;80文字モードパラメータ1(R0~R3) TBLCOM1 FCB $04,$1F,$06,$19,$1C,$FF ;共通パラメータ1(R4~R7) TBL40S FCB $0A,$27,$07,$04,$00,$04,$00,$FF ;40文字モードパラメータ2(R10~R15) TBL80S FCB $0A,$2A,$0F,$04,$00,$04,$00,$FF ;80文字モードパラメータ2(R10~R15) TBLIL FCB $08,$83,$0E,$FF ;インタレースモード(R8~R9) TBLNIL FCB $08,$80,$07,$FF ;ノンインタレースモード(R8~R9) END |
BASICのROMを使わずにCRT出力の処理を実装しようと調べていたのですが、
CRTCのパラメータを直接変更後にBASICのワークエリアをセットしないといけないのが悩ましいところ・・・
とりあえず、CRTCパラメータの設定方法が分かったので勉強になりました^^
皆様情報ありがとうございます
しかし、レベル3でFLEX9やOS-9,CP/Mを使う場合のVRAMの扱いはどうやるんだろう・・・
謎が深まります^^;;;
そんな、レベル3 VRAM関連調査の記録・・・
残件
CRTCパラメータ設定時にR14,R15(カーソル) を$0400にしても、何も設定しなくてもカーソルが出なくなる
ふと思ったのですが・・・
CP/Mの場合はZ80のRAMは6809のと共有だとして(ホントはどうなっているんでしょうか?)
HW的にVRAMの領域がZ80アドレス空間の後ろになるように配置されているとか・・・
それともS1みたいにVRAMとかI/O領域は一切持たず、64KBすべてRAMとか??
どうですかね?
これからチャレンジしようとしているレベル3用のCP/M80はハドソンのHuEngineというZ80カード内に64KBのRAMを持っておりますのでS1-CP/M80と同じようにI/O領域を持たないものになっています。
この場合はTPAはZ80カード内の64KB RAMにロードするのでS1と同じような感じでVRAMは邪魔にならないと思われます。
しかしFLEX9を想定した場合、FM7と同じで$A000以降はRAMとROMでバンク切替できるのですが0~$7FFFのRAMは1本の連続したRAMでバンク切替や空間切替はできない認識です^^
マーク2でもバンク切替できるのは$A000以降なのでVRAMのある$0400~$4400の裏にはRAMが無いことから、どのようにしてFLEX9やOS-9を動かしていたのか謎です^^;;;
私のマーク5は64KB拡張RAMが付いているので、これなら頑張れば移植できるかもしれません(^^;;;
カーソル位置は、CRTCのR8に設定する値を$8xにすれば直るのではないかと思います。
R8のパラメータを変更することでカーソルのズレが解決できました!
カーソルの表示が出ないのはCRTCのパラメータ(カーソル位置)の問題ではなくワークエリアの$115に値を書くことで表示できました。
動作の確認が取れましたので上記の実験プログラムR8のパラメータを$8xに変更したものに修正致しています。
カーソルのズレていないレベル3はいいですね^^;;