VRAM, CRAM, SVRAM, VDPレジスタへのアクセス
VDPレジスタへのアクセス
レジスタに値を書き込むには
下記2bytesのフォーマットをコントロールポートに書き込みます。
Bit 7 6 5 4 3 2 1 0 (MSB) 1 0 0 R4 R3 R2 R1 R0 (LSB) D7 D6 D5 D4 D3 D2 D1 D0 Rx レジスタ番号 Dx レジスタに書き込むデータ
VRAM, CRAM, SVRAMへのアクセス
VRAM、SVRAM、CRAMを読み書きするには最初に
下記4bytesのフォーマットをコントロールポートに書き込みます。
Bit 7 6 5 4 3 2 1 0 (MSB) CD1 CD0 A13 A12 A11 A10 A09 A08 A07 A06 A05 A04 A03 A02 A01 A00 0 0 0 0 0 0 0 0 (LSB) CD5 CD4 CD3 CD2 0 0 A15 A14 CDx アクセスするRAMとアクセスモードの設定 0x00 = VRAM読み込み 0x01 = VRAM書き込み 0x03 = CRAM書き込み 0x04 = VSRAM読み込み 0x05 = VSRAM書き込み 0x08 = CRAM読み込み CD5とCD4はDMA転送の際に使いますのでそれ以外の時は常に0です。 CDxは各ビットが分散配置されているので、 間違えない様に注意して下さい。 Ax 0x0000〜0xFFFF = アクセス先アドレス VRAMは64KBytesなので0xFFFFまでが有効なアドレスですが、 CRAMやSVRAMはそれ未満です。
次に書き込みならデータポートに値を書き込み、
読み込みならデータポートを読み込みます。
以下はVRAMの指定アドレスに書き込む関数の例です。
/* VRAMに1ワード書き込む */ /* address = VRAMアドレス */ /* data = 書き込むデータ */ void writeVramByte(address, data) uint address; uint data; { register uint *ctrlPort; register uint *dataPort; ctrlPort = (uint *)0xC00004; dataPort = (uint *)0xC00000; *ctrlPort = 0x4000 + (address & 0x3FFF); *ctrlPort = address >> 14; *dataPort = data; }
/* VRAMに1ロングワード書き込む */ /* address = VRAMアドレス */ /* data = 書き込むデータ */ void writeVramDWord(address, data) uint address; ulong data; { register uint *ctrlPort; register ulong *dataPort; ctrlPort = (uint *)0xC00004; dataPort = (uint *)0xC00000; *ctrlPort = 0x4000 + (address & 0x3FFF); *ctrlPort = address >> 14; *dataPort = data; }
/* VRAMに指定長のワードを書き込む */ /* address = VRAMアドレス */ /* data = 書き込むデータ */ /* length = データサイズ */ void writeVramWords(address, data, length) uint address; uint *data; uint length; { register uint *ctrlPort; register uint *dataPort; register uint count; ctrlPort = (uint *)0xC00004; dataPort = (uint *)0xC00000; /* 自動加算値をセット */ *ctrlPort = REGISTER_WRITE(15) + 2; /* 転送 */ *ctrlPort = 0x4000 + (address & 0x3FFF); *ctrlPort = address >> 14; for(count = 0; count < length; count++) *dataPort = *data++; }