VDPレジスタの詳細
VDPレジスタの詳細
VDPの動作設定は全てVDPレジスタへの値書き込みで行います。
VDPレジスタは23本あり、全て8bitです。
VDPレジスタ 0x00
0x00 - Mode Set Register No. 1 bit 7 6 5 4 3 2 1 0 0 0 0 IE1 1 PS M3 DD IE1 1=水平割り込み有効,0=無効 PS 1=512色, 0=8色(CRAMのbit1, 5, 9 しか使わない) M3 1=HV Counter動作, 0=HV Counter停止 DD 1=表示無効 0=表示有効※Bit5を1にすると左8dot幅の領域がBG色のみになる。 (スプライトとBGが非表示になる)
VDPレジスタ 0x01
0x01 - Mode Set Register No. 2 bit 7 6 5 4 3 2 1 0 TMS9918 DISP IE0 M1 M2 SMS 0 0 TMS9918 1=TMS9918互換モード, 0=メガドライブモード DISP 1=表示有効, 0=表示無効(VRAMがフリーになる) IE0 1=垂直割り込み有効, 0=無効 M1 1=DMA有効、0=無効 M2 1=PAL(240lines), 0=NTSC(224Lines) SMS 1=SMS互換モード, 0=メガドライブモード※SMS互換モード時は拡大スプライト等があるが、メガドライブモードでは無効。
VDPレジスタ 0x02
0x02 - Pattern Name Table Address for Plane A bit 7 6 5 4 3 2 1 0 0 0 A15 A14 A13 0 0 0
Plane Aのパターンネームテーブルアドレスを指定します。
アドレスの上位3bitだけを指定するので8KBytes単位となります。
VDPレジスタ 0x03
0x03 - Pattern Name Table Address for Window bit 7 6 5 4 3 2 1 0 0 0 A15 A14 A13 A12 A11 0
VRAMに配置したWindowのパターンネームテーブルアドレスを指定します。
アドレスの上位5bitだけを指定するので2KBytes単位となります。
VDPレジスタ 0x04
0x04 - Pattern Name Table Address for Plane B bit 7 6 5 4 3 2 1 0 0 0 0 0 0 A15 A14 A13
VRAMに配置したPlane Bのパターンネームテーブルアドレスを指定します。
アドレスの上位3bitだけを指定するので8KBytes単位となります。
VDPレジスタ 0x05
0x05 - Sprite Attribute Table Base Address bit 7 6 5 4 3 2 1 0 0 A15 A14 A13 A12 A11 A10 A9
VRAMに配置したスプライトアトリビュートテーブルアドレスを指定します。
アドレスの上位7bitだけを指定するので512Bytes単位となります。
VDPレジスタ 0x07
0x07 - Backdrop Color bit 7 6 5 4 3 2 1 0 0 0 N5 N4 N3 N2 N1 N0
背景色を指定します。
CRAMに配置した色0〜63番のいずれかを指定します。
プレーンA, プレーンB, スプライトは割り当てたパレットの
0番目(0x00)の色が通過色になりますが、
それら全てが通過したpixelはここで指定した色番号で表示されます。
VDPレジスタ 0x0A
0x0A - H Interrupt Register bit 7 6 5 4 3 2 1 0
水平割り込みラインを設定します。 0x00なら全てのラインで水平割り込みが発生します。 実際に割り込み発生を有効にするには、IE1ビットをセットする必要があります。
VDPレジスタ 0x0B
0x0B - Mode Set Register No. 3 bit 7 6 5 4 3 2 1 0 0 0 0 0 IE2 VSCR HSCR LSCR IE2 1=THピン割り込み有効, 0=無効 VSCR 1=セル単位垂直スクロール有効, 0=無効 HSCR 1=セル単位水平スクロール有効, 0=無効 LSCR 1=ライン単位水平スクロール有効, 0=無効
VSCR, HSCR, LSCRの3bitで表される組み合わせパターンは下記の通りです。
HSCRとLSCRの両方のビットが1の場合、HSCRよりもLSCRが優先されます。
VSCR, HSCR, LSCR (3bit) | 垂直スクロール方式 | 水平スクロール方式 |
0x00 | 全画面単位 | 全画面単位 |
0x01 | 全画面単位 | ライン単位 |
0x02 | 全画面単位 | セル単位 |
0x03 | 全画面単位 | ライン単位 |
0x04 | セル単位 | 全画面単位 |
0x05 | セル単位 | ライン単位 |
0x06 | セル単位 | セル単位 |
0x07 | セル単位 | ライン単位 |
VDPレジスタ 0x0C
0x0C - Mode Set Register No. 4 bit 7 6 5 4 3 2 1 0 RS0 0 0 0 S/TE LSM1 LSM0 RS1 S/TE 1=Hilight/Shadow(半透明色)有効, 0=無効 RS0 1=水平解像度40セル(320pixel), 0=32セル(256pixel) RS1 1=水平解像度40セル(320pixel), 0=32セル(256pixel)
LSMxの組み合わせで垂直解像度とインターレース方式が下記の様に決まります。
LSM1 LSM0 0 0 ノンインターレース(224line) 0 1 インターレース(224lineを448lineに拡大) 1 0 ノンインターレース(224line) 1 1 インターレース (448line)
VDPレジスタ 0x0D
0x0D - H Scroll Data Table Base Address bit 7 6 5 4 3 2 1 0 0 0 A15 A14 A13 A12 A11 A10
VRAMに配置した水平スクロールデータテーブルアドレスを指定します。
アドレスの上位6bitだけを指定するので1KBytes単位となります。
VDPレジスタ 0x0F
0x0F - Auto Increment Data bit 7 6 5 4 3 2 1 0 I7 I6 I5 I4 I3 I2 I1 I0
データポート(0xC00000)にアクセスした後にアドレスを自動加算(Address++)
する事が可能です。
加算するサイズをバイト単位(0〜255bytes)で設定します。
自動加算しない場合は 0 を設定してください。
以下はこのレジスタで2bytesづつ自動加算する様設定されている前提で、
unsigned int型の配列colors[64]に格納されている色データをCRAMに転送する例です。
addressPort = (unsigned int *)0xC00004; *addressPort = 0xC0000000; for(n = 0; n < 64; n++){ /* 自動加算されるのでループ中はアドレス設定不要 */ *dataPort = colors[n]; }
VDPレジスタ 0x10
0x10 - Scroll Size bit 7 6 5 4 3 2 1 0 0 0 VSZ1 VSZ0 0 0 HSZ1 HSZ0 VSZx 垂直サイズ HSZx 水平サイズ
Plane A と Plane B のサイズを指定します。
両者のサイズを個別に設定する事は出来ません。
xSZ1 xSZ0 0 0 32 cells (256pixel) 0 1 64 cells (512pixel) 1 0 無効 1 1 128 cells (1024pixel)
この設定値により、
パターンネームテーブルに必要なVRAM容量が決まります。
32 x 32cells なら1枚のPlane当り32 * 32 * 2 = 2048bytes必要です。
もし水平320pixelの画面解像度を設定し、
水平256pixel(32cells)のスクロールサイズを設定した場合、
画面解像度に対して足りない水平64pixel分が常にラッピング表示されます。