drop legacy save support
[picodrive.git] / pico / memory.c
index 0907696..436f545 100644 (file)
@@ -331,22 +331,21 @@ NOINLINE void io_ports_write(u32 a, u32 d)
   Pico.ioports[a] = d;\r
 }\r
 \r
-// lame..\r
 static int z80_cycles_from_68k(void)\r
 {\r
-  return z80_cycle_aim\r
-    + cycles_68k_to_z80(SekCyclesDone() - last_z80_sync);\r
+  int m68k_cnt = SekCyclesDone() - timing.m68c_frame_start;\r
+  return cycles_68k_to_z80(m68k_cnt);\r
 }\r
 \r
 void NOINLINE ctl_write_z80busreq(u32 d)\r
 {\r
   d&=1; d^=1;\r
-  elprintf(EL_BUSREQ, "set_zrun: %i->%i [%i] @%06x", Pico.m.z80Run, d, SekCyclesDone(), SekPc);\r
+  elprintf(EL_BUSREQ, "set_zrun: %i->%i [%u] @%06x", Pico.m.z80Run, d, SekCyclesDone(), SekPc);\r
   if (d ^ Pico.m.z80Run)\r
   {\r
     if (d)\r
     {\r
-      z80_cycle_cnt = z80_cycles_from_68k();\r
+      timing.z80c_cnt = z80_cycles_from_68k() + 2;\r
     }\r
     else\r
     {\r
@@ -363,7 +362,7 @@ void NOINLINE ctl_write_z80busreq(u32 d)
 void NOINLINE ctl_write_z80reset(u32 d)\r
 {\r
   d&=1; d^=1;\r
-  elprintf(EL_BUSREQ, "set_zreset: %i->%i [%i] @%06x", Pico.m.z80_reset, d, SekCyclesDone(), SekPc);\r
+  elprintf(EL_BUSREQ, "set_zreset: %i->%i [%u] @%06x", Pico.m.z80_reset, d, SekCyclesDone(), SekPc);\r
   if (d ^ Pico.m.z80_reset)\r
   {\r
     if (d)\r
@@ -378,7 +377,7 @@ void NOINLINE ctl_write_z80reset(u32 d)
     }\r
     else\r
     {\r
-      z80_cycle_cnt = z80_cycles_from_68k();\r
+      timing.z80c_cnt = z80_cycles_from_68k() + 2;\r
       z80_reset();\r
     }\r
     Pico.m.z80_reset = d;\r
@@ -539,7 +538,6 @@ static void PicoWrite8_z80(u32 a, u32 d)
   }\r
 \r
   if ((a & 0x4000) == 0x0000) { // z80 RAM\r
-    SekCyclesBurnRun(2); // FIXME hack\r
     Pico.zram[a & 0x1fff] = (u8)d;\r
     return;\r
   }\r
@@ -594,7 +592,7 @@ u32 PicoRead8_io(u32 a)
 \r
     if ((a & 0xff01) == 0x1100) { // z80 busreq (verified)\r
       d |= (Pico.m.z80Run | Pico.m.z80_reset) & 1;\r
-      elprintf(EL_BUSREQ, "get_zrun: %02x [%i] @%06x", d, SekCyclesDone(), SekPc);\r
+      elprintf(EL_BUSREQ, "get_zrun: %02x [%u] @%06x", d, SekCyclesDone(), SekPc);\r
     }\r
     goto end;\r
   }\r
@@ -629,7 +627,7 @@ u32 PicoRead16_io(u32 a)
 \r
     if ((a & 0xff00) == 0x1100) { // z80 busreq\r
       d |= ((Pico.m.z80Run | Pico.m.z80_reset) & 1) << 8;\r
-      elprintf(EL_BUSREQ, "get_zrun: %04x [%i] @%06x", d, SekCyclesDone(), SekPc);\r
+      elprintf(EL_BUSREQ, "get_zrun: %04x [%u] @%06x", d, SekCyclesDone(), SekPc);\r
     }\r
     goto end;\r
   }\r
@@ -703,10 +701,21 @@ void PicoWrite16_io(u32 a, u32 d)
 \r
 // VDP area (0xc00000 - 0xdfffff)\r
 // TODO: verify if lower byte goes to PSG on word writes\r
-static u32 PicoRead8_vdp(u32 a)\r
+u32 PicoRead8_vdp(u32 a)\r
 {\r
-  if ((a & 0x00e0) == 0x0000)\r
-    return PicoVideoRead8(a);\r
+  if ((a & 0x00f0) == 0x0000) {\r
+    switch (a & 0x0d)\r
+    {\r
+      case 0x00: return PicoVideoRead8DataH();\r
+      case 0x01: return PicoVideoRead8DataL();\r
+      case 0x04: return PicoVideoRead8CtlH();\r
+      case 0x05: return PicoVideoRead8CtlL();\r
+      case 0x08:\r
+      case 0x0c: return PicoVideoRead8HV_H();\r
+      case 0x09:\r
+      case 0x0d: return PicoVideoRead8HV_L();\r
+    }\r
+  }\r
 \r
   elprintf(EL_UIO|EL_ANOMALY, "68k bad read [%06x] @%06x", a, SekPc);\r
   return 0;\r
@@ -886,10 +895,11 @@ static void m68k_mem_setup(void)
 static int get_scanline(int is_from_z80)\r
 {\r
   if (is_from_z80) {\r
-    int cycles = z80_cyclesDone();\r
-    while (cycles - z80_scanline_cycles >= 228)\r
-      z80_scanline++, z80_scanline_cycles += 228;\r
-    return z80_scanline;\r
+    int mclk_z80 = z80_cyclesDone() * 15;\r
+    int mclk_line = timing.z80_scanline * 488 * 7;\r
+    while (mclk_z80 - mclk_line >= 488 * 7)\r
+      timing.z80_scanline++, mclk_line += 488 * 7;\r
+    return timing.z80_scanline;\r
   }\r
 \r
   return Pico.m.scanline;\r
@@ -1184,8 +1194,21 @@ void PicoWrite16_32x(u32 a, u32 d) {}
 \r
 static unsigned char z80_md_vdp_read(unsigned short a)\r
 {\r
-  if ((a & 0x00e0) == 0x0000)\r
-    return PicoVideoRead8(a); // FIXME: depends on 68k cycles\r
+  z80_subCLeft(2);\r
+\r
+  if ((a & 0x00f0) == 0x0000) {\r
+    switch (a & 0x0d)\r
+    {\r
+      case 0x00: return PicoVideoRead8DataH();\r
+      case 0x01: return PicoVideoRead8DataL();\r
+      case 0x04: return PicoVideoRead8CtlH();\r
+      case 0x05: return PicoVideoRead8CtlL();\r
+      case 0x08:\r
+      case 0x0c: return get_scanline(1); // FIXME: make it proper\r
+      case 0x09:\r
+      case 0x0d: return Pico.m.rotate++;\r
+    }\r
+  }\r
 \r
   elprintf(EL_ANOMALY, "z80 invalid r8 [%06x] %02x", a, 0xff);\r
   return 0xff;\r
@@ -1196,8 +1219,10 @@ static unsigned char z80_md_bank_read(unsigned short a)
   unsigned int addr68k;\r
   unsigned char ret;\r
 \r
-  addr68k = Pico.m.z80_bank68k<<15;\r
-  addr68k += a & 0x7fff;\r
+  z80_subCLeft(3);\r
+\r
+  addr68k = Pico.m.z80_bank68k << 15;\r
+  addr68k |= a & 0x7fff;\r
 \r
   ret = m68k_read8(addr68k);\r
 \r