Last Updated on 2020年4月2日 by kabekin
皆さんから頂いた情報を整理するとカラーRAMの関係でレベル3では気軽にVRAMエリアを移動できないことが分かりました。
しかし、CRTCのパラメータを変更後の画面の乱れはBASICのワークエリアにパラメータをセットすることで正常になりました^^;;;
今後、何かの参考になるかもしれないので実験内容をメモしておきます^^
* 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 $04 $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はいいですね^^;;