Future Driver

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++;
}


inserted by FC2 system