refactoring z80 if code for sms preparation
[picodrive.git] / pico / memory.c
index 074af24..e8b65e4 100644 (file)
@@ -19,7 +19,7 @@ typedef unsigned int   u32;
 #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
@@ -514,6 +514,7 @@ PICO_INTERNAL void PicoMemResetHooks(void)
   PicoWrite16Hook = OtherWrite16End;\r
 }\r
 \r
+static void z80_mem_setup(void);\r
 #ifdef EMU_M68K\r
 static void m68k_mem_setup(void);\r
 #endif\r
@@ -555,6 +556,8 @@ PICO_INTERNAL void PicoMemSetup(void)
 #ifdef EMU_M68K\r
   m68k_mem_setup();\r
 #endif\r
+\r
+  z80_mem_setup();\r
 }\r
 \r
 /* some nasty things below :( */\r
@@ -880,7 +883,7 @@ int ym2612_write_local(u32 a, u32 d, int is_from_z80)
   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
@@ -978,94 +981,114 @@ void ym2612_unpack_state(void)
 // -----------------------------------------------------------------\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
+static 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