SGDKを使ってMEGA DRIVEで、TMS9918を表示するプログラムを開発して行きます。
前回の"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; }