MEGA DRIVEでTMS9918を表示してみる その5

SGDKを使ってMEGA DRIVEで、TMS9918を表示するプログラムを開発して行きます。

f:id:tanam:20140829235707p:image:w360

前回の"Hello World"があまりに遅いので高速化しました。

ポイントは、00C0HにあるサブルーチンのRETをHALTにしておき、Z80が自分でHALTすることです。

LD IX,0003H
LD (IX+0),C
LD (IX+1),A
LD (IX+2),0FFH
HALT

68000はA00005Hを調べて、0xFFなら0x00Hにクリアして、サブルーチンのHALTをRETに書き換えます。Z80を再開して68000の描画ルーチンと同時に実行するので高速化されます。

またTMS9918のmode 2とspritesも実装しました。


(省略)

int main( )
{

(省略)

	haltZ80 = (u8 *)0xA11100;
	i = 0;
	j = 0;
	k = 0;
	p = (u8 *)0xA00003;
	q = (u8 *)0xA00004;
	r = (u8 *)0xA00005;
	s = (u8 *)0xA000CE;
	reset();
	initZ80(hello, 0x00D0);
	while(1)
	{
		*haltZ80 = 0x01;
		if (*r == 0xFF) {
			j = *p;
			k = *q;
			*r = 0x00;
			*s = 0xC9;
			*haltZ80 = 0x00;
			asm volatile ("nop");
			*haltZ80 = 0x01;
			*s = 0x76;
		}
		*haltZ80 = 0x00;
		if (j) {
			write_io8(j, k);
			j = 0;
			k = 0;
		}
		if (i++ > 261) {
			event_vline(192, 0);
			i=0;
			for (k=0; k<768; k++)
				VDP_loadTileData(screen[k] , k, 1, 0);
		}
	}

	return 0;
}