Z80のメモリ
Z80のメモリマップ
Z80 | 68000 | Description |
0000h 〜 1FFFh | 0xA00000 〜 0xA01FFF | 8KBytes RAM |
7F11h | 0xC00011 | PSG音源ポート |
6000h | None | バンクレジスタ |
4000h | 0xA04000 | FM音源レジスタポート(プライマリ) |
4001h | 0xA04001 | FM音源データポート(プライマリ) |
4002h | 0xA04002 | FM音源レジスタポート(セカンダリ) |
4003h | 0xA04003 | FM音源データポート(セカンダリ) |
8000h 〜 FFFFh | 0x000000 〜 0x3FFFFF | 32KBytes ROMウィンドウ |
Z80のRAM
Z80のアドレス 0000h 〜 2000h までがRAMです。
特に制限はありませんが、
68000が自由に読み書き出来る都合上、
プログラムのバグで68000が間違ったアドレスを書き込むとRAMの内容があっさり破壊されるので注意です。
Z80のROM
Z80はカートリッジの全領域をアクセス出来ます。
但しカートリッジ容量が32MBitまであるのに対しZ80のメモリ空間は64KBytesなので、
32KBytes単位のバンク切り替えでアクセスします。
バンク切り替え
バンクを切り替えるにはバンクレジスタ(アドレス 6000h) にバンク番号を書き込みます。
バンクレジスタへの書き込み方法は特殊で、バンク番号を1回のバイトアクセスで指定する事が出来ません。
具体的には、バンク番号を下位bit15から上位bit23まで1bitづつ順に書き込んでいきます。
下記は68000から見た任意のカートリッジROMアドレス(24bit)
をバンクセレクトするサブルーチンの例です。
;************************************************** ;使い方 ;下記にアドレスを書き込んでからこのルーチンを呼ぶ事 ; ; ROM_HIGH = 68000アドレス上位 ; ROM_MID = 68000アドレス中位 ; ROM_LOW = 68000アドレス下位 ...このコードでは未使用 ; ;************************************************** BANK_SEL: PUSH AF PUSH HL LD HL, 6000h LD A, (ROM_MID) RLCA LD (HL), A ; bit 15 LD A, (ROM_HIGH) ; LD (HL), A ; bit 16 RRA LD (HL), A ; bit 17 RRA LD (HL), A ; bit 18 RRA LD (HL), A ; bit 19 RRA LD (HL), A ; bit 20 RRA LD (HL), A ; bit 21 XOR A LD (HL), A ; bit 22 LD (HL), A ; bit 23 POP HL POP AF RET
尚、68000からも0xA06000に対して上記シーケンスを行う事で、
Z80の代わりにバンクセレクトが可能です。