#define UTYPES_DEFINED\r
#endif\r
\r
-extern unsigned int lastSSRamWrite; // used by serial SRAM code\r
+extern unsigned int lastSSRamWrite; // used by serial eeprom code\r
\r
#ifdef _ASM_MEMORY_C\r
u32 PicoRead8(u32 a);\r
#ifdef EMU_M68K\r
m68k_mem_setup();\r
#endif\r
+\r
+ z80_mem_setup();\r
}\r
\r
/* some nasty things below :( */\r
if (xcycles >= timer_b_next_oflow) \\r
ym2612.OPN.ST.status |= (ym2612.OPN.ST.mode >> 2) & 2\r
\r
-u32 ym2612_read_local_z80(void)\r
+static u32 MEMH_FUNC ym2612_read_local_z80(void)\r
{\r
int xcycles = z80_cyclesDone() << 8;\r
\r
// -----------------------------------------------------------------\r
// z80 memhandlers\r
\r
-PICO_INTERNAL unsigned char z80_read(unsigned short a)\r
+static unsigned char MEMH_FUNC z80_md_vdp_read(unsigned short a)\r
{\r
- u8 ret = 0;\r
+ // TODO?\r
+ elprintf(EL_ANOMALY, "z80 invalid r8 [%06x] %02x", a, 0xff);\r
+ return 0xff;\r
+}\r
\r
- if ((a>>13)==2) // 0x4000-0x5fff (Charles MacDonald)\r
- {\r
- return ym2612_read_local_z80();\r
- }\r
+static unsigned char MEMH_FUNC z80_md_bank_read(unsigned short a)\r
+{\r
+ extern unsigned int PicoReadM68k8(unsigned int a);\r
+ unsigned int addr68k;\r
+ unsigned char ret;\r
\r
- if (a>=0x8000)\r
- {\r
- extern u32 PicoReadM68k8(u32 a);\r
- u32 addr68k;\r
- addr68k=Pico.m.z80_bank68k<<15;\r
- addr68k+=a&0x7fff;\r
-\r
- if (addr68k < Pico.romsize) { ret = Pico.rom[addr68k^1]; goto bnkend; }\r
- elprintf(EL_ANOMALY, "z80->68k upper read [%06x] %02x", addr68k, ret);\r
- if (PicoAHW & PAHW_MCD)\r
- ret = PicoReadM68k8(addr68k);\r
- else ret = PicoRead8(addr68k);\r
-bnkend:\r
- elprintf(EL_Z80BNK, "z80->68k r8 [%06x] %02x", addr68k, ret);\r
- return ret;\r
+ addr68k = Pico.m.z80_bank68k<<15;\r
+ addr68k += a & 0x7fff;\r
+\r
+ if (addr68k < Pico.romsize) {\r
+ ret = Pico.rom[addr68k^1];\r
+ goto out;\r
}\r
\r
- // should not be needed, cores should be able to access RAM themselves\r
- if (a<0x4000) return Pico.zram[a&0x1fff];\r
+ elprintf(EL_ANOMALY, "z80->68k upper read [%06x] %02x", addr68k, ret);\r
+ if (PicoAHW & PAHW_MCD)\r
+ ret = PicoReadM68k8(addr68k);\r
+ else ret = PicoRead8(addr68k);\r
\r
- elprintf(EL_ANOMALY, "z80 invalid r8 [%06x] %02x", a, ret);\r
+out:\r
+ elprintf(EL_Z80BNK, "z80->68k r8 [%06x] %02x", addr68k, ret);\r
return ret;\r
}\r
\r
-#ifndef _USE_CZ80\r
-PICO_INTERNAL_ASM void z80_write(unsigned char data, unsigned short a)\r
-#else\r
-PICO_INTERNAL_ASM void z80_write(unsigned int a, unsigned char data)\r
-#endif\r
+static void MEMH_FUNC z80_md_ym2612_write(unsigned int a, unsigned char data)\r
{\r
- if ((a>>13)==2) // 0x4000-0x5fff (Charles MacDonald)\r
- {\r
- if(PicoOpt&POPT_EN_FM) emustatus|=ym2612_write_local(a, data, 1) & 1;\r
- return;\r
- }\r
+ if (PicoOpt & POPT_EN_FM)\r
+ emustatus |= ym2612_write_local(a, data, 1) & 1;\r
+}\r
\r
- if ((a&0xfff9)==0x7f11) // 7f11 7f13 7f15 7f17\r
+static void MEMH_FUNC z80_md_vdp_br_write(unsigned int a, unsigned char data)\r
+{\r
+ // TODO: allow full VDP access\r
+ if ((a&0xfff9) == 0x7f11) // 7f11 7f13 7f15 7f17\r
{\r
- if(PicoOpt&POPT_EN_PSG) SN76496Write(data);\r
+ if (PicoOpt & POPT_EN_PSG)\r
+ SN76496Write(data);\r
return;\r
}\r
\r
- if ((a>>8)==0x60)\r
+ if ((a>>8) == 0x60)\r
{\r
- Pico.m.z80_bank68k>>=1;\r
- Pico.m.z80_bank68k|=(data&1)<<8;\r
- Pico.m.z80_bank68k&=0x1ff; // 9 bits and filled in the new top one\r
+ Pico.m.z80_bank68k >>= 1;\r
+ Pico.m.z80_bank68k |= data << 8;\r
+ Pico.m.z80_bank68k &= 0x1ff; // 9 bits and filled in the new top one\r
return;\r
}\r
\r
- if (a>=0x8000)\r
- {\r
- extern void PicoWriteM68k8(u32 a,u8 d);\r
- u32 addr68k;\r
- addr68k=Pico.m.z80_bank68k<<15;\r
- addr68k+=a&0x7fff;\r
- elprintf(EL_Z80BNK, "z80->68k w8 [%06x] %02x", addr68k, data);\r
- if (PicoAHW & PAHW_MCD)\r
- PicoWriteM68k8(addr68k, data);\r
- else PicoWrite8(addr68k, data);\r
- return;\r
- }\r
+ elprintf(EL_ANOMALY, "z80 invalid w8 [%06x] %02x", a, data);\r
+}\r
\r
- // should not be needed\r
- if (a<0x4000) { Pico.zram[a&0x1fff]=data; return; }\r
+static void MEMH_FUNC z80_md_bank_write(unsigned int a, unsigned char data)\r
+{\r
+ extern void PicoWriteM68k8(unsigned int a, unsigned char d);\r
+ unsigned int addr68k;\r
\r
- elprintf(EL_ANOMALY, "z80 invalid w8 [%06x] %02x", a, data);\r
+ addr68k = Pico.m.z80_bank68k << 15;\r
+ addr68k += a & 0x7fff;\r
+\r
+ elprintf(EL_Z80BNK, "z80->68k w8 [%06x] %02x", addr68k, data);\r
+ if (PicoAHW & PAHW_MCD)\r
+ PicoWriteM68k8(addr68k, data);\r
+ else PicoWrite8(addr68k, data);\r
}\r
\r
-#ifndef _USE_CZ80\r
-PICO_INTERNAL unsigned short z80_read16(unsigned short a)\r
+// -----------------------------------------------------------------\r
+\r
+static unsigned char z80_md_in(unsigned short p)\r
{\r
- return (u16) ( (u16)z80_read(a) | ((u16)z80_read((u16)(a+1))<<8) );\r
+ elprintf(EL_ANOMALY, "Z80 port %04x read", p);\r
+ return 0xff;\r
}\r
\r
-PICO_INTERNAL void z80_write16(unsigned short data, unsigned short a)\r
+static void z80_md_out(unsigned short p, unsigned char d)\r
{\r
- z80_write((unsigned char) data,a);\r
- z80_write((unsigned char)(data>>8),(u16)(a+1));\r
+ elprintf(EL_ANOMALY, "Z80 port %04x write %02x", p, d);\r
}\r
+\r
+void z80_mem_setup(void)\r
+{\r
+ z80_map_set(z80_read_map, 0x0000, 0x1fff, Pico.zram, 0);\r
+ z80_map_set(z80_read_map, 0x2000, 0x3fff, Pico.zram, 0);\r
+ z80_map_set(z80_read_map, 0x4000, 0x5fff, ym2612_read_local_z80, 1);\r
+ z80_map_set(z80_read_map, 0x6000, 0x7fff, z80_md_vdp_read, 1);\r
+ z80_map_set(z80_read_map, 0x8000, 0xffff, z80_md_bank_read, 1);\r
+\r
+ z80_map_set(z80_write_map, 0x0000, 0x1fff, Pico.zram, 0);\r
+ z80_map_set(z80_write_map, 0x2000, 0x3fff, Pico.zram, 0);\r
+ z80_map_set(z80_write_map, 0x4000, 0x5fff, z80_md_ym2612_write, 1);\r
+ z80_map_set(z80_write_map, 0x6000, 0x7fff, z80_md_vdp_br_write, 1);\r
+ z80_map_set(z80_write_map, 0x8000, 0xffff, z80_md_bank_write, 1);\r
+\r
+#ifdef _USE_DRZ80\r
+ drZ80.z80_in = z80_md_in;\r
+ drZ80.z80_out = z80_md_out;\r
+#endif\r
+#ifdef _USE_CZ80\r
+ Cz80_Set_Fetch(&CZ80, 0x0000, 0x1fff, (UINT32)Pico.zram); // main RAM\r
+ Cz80_Set_Fetch(&CZ80, 0x2000, 0x3fff, (UINT32)Pico.zram); // mirror\r
+ Cz80_Set_INPort(&CZ80, z80_md_in);\r
+ Cz80_Set_OUTPort(&CZ80, z80_md_out);\r
#endif\r
+}\r
\r