slightly better z80 vdp reads
[picodrive.git] / pico / memory.c
index 0907696..34ef99d 100644 (file)
@@ -703,10 +703,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
@@ -1184,8 +1195,19 @@ 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
+  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