optimizations, fixes, hacks, psp, ...
[picodrive.git] / Pico / Memory.c
index ca92e81..1e6630d 100644 (file)
@@ -334,9 +334,12 @@ PICO_INTERNAL_ASM u32 PicoRead8(u32 a)
   log_io(a, 8, 0);\r
   if ((a&0xff4000)==0xa00000) { d=z80Read8(a); goto end; } // Z80 Ram\r
 \r
-  d=OtherRead16(a&~1, 8); if ((a&1)==0) d>>=8;\r
+  if ((a&0xe700e0)==0xc00000) // VDP\r
+       d=PicoVideoRead(a);\r
+  else d=OtherRead16(a&~1, 8);\r
+  if ((a&1)==0) d>>=8;\r
+\r
 \r
-end:\r
 #ifdef __debug_io\r
   dprintf("r8 : %06x,   %02x @%06x", a&0xffffff, (u8)d, SekPc);\r
 #endif\r
@@ -370,7 +373,9 @@ PICO_INTERNAL_ASM u32 PicoRead16(u32 a)
   if (a<Pico.romsize) { d = *(u16 *)(Pico.rom+a); goto end; } // Rom\r
   log_io(a, 16, 0);\r
 \r
-  d = OtherRead16(a, 16);\r
+  if ((a&0xe700e0)==0xc00000)\r
+       d = PicoVideoRead(a);\r
+  else d = OtherRead16(a, 16);\r
 \r
 end:\r
 #ifdef __debug_io\r
@@ -404,7 +409,9 @@ PICO_INTERNAL_ASM u32 PicoRead32(u32 a)
   if (a<Pico.romsize) { u16 *pm=(u16 *)(Pico.rom+a); d = (pm[0]<<16)|pm[1]; goto end; } // Rom\r
   log_io(a, 32, 0);\r
 \r
-  d = (OtherRead16(a, 32)<<16)|OtherRead16(a+2, 32);\r
+  if ((a&0xe700e0)==0xc00000)\r
+       d = (PicoVideoRead(a)<<16)|PicoVideoRead(a+2);\r
+  else d = (OtherRead16(a, 32)<<16)|OtherRead16(a+2, 32);\r
 \r
 end:\r
 #ifdef __debug_io\r
@@ -454,6 +461,7 @@ void PicoWrite16(u32 a,u16 d)
   log_io(a, 16, 1);\r
 \r
   a&=0xfffffe;\r
+  if ((a&0xe700e0)==0xc00000) { PicoVideoWrite(a,(u16)d); return; } // VDP\r
   OtherWrite16(a,d);\r
 }\r
 \r
@@ -476,6 +484,14 @@ static void PicoWrite32(u32 a,u32 d)
   log_io(a, 32, 1);\r
 \r
   a&=0xfffffe;\r
+  if ((a&0xe700e0)==0xc00000)\r
+  {\r
+    // VDP:\r
+    PicoVideoWrite(a,  (u16)(d>>16));\r
+    PicoVideoWrite(a+2,(u16)d);\r
+    return;\r
+  }\r
+\r
   OtherWrite16(a,  (u16)(d>>16));\r
   OtherWrite16(a+2,(u16)d);\r
 }\r
@@ -660,10 +676,6 @@ PICO_INTERNAL unsigned char z80_read(unsigned short a)
 {\r
   u8 ret = 0;\r
 \r
-#ifndef _USE_DRZ80\r
-  if (a<0x4000) return Pico.zram[a&0x1fff];\r
-#endif\r
-\r
   if ((a>>13)==2) // 0x4000-0x5fff (Charles MacDonald)\r
   {\r
     if (PicoOpt&1) ret = (u8) YM2612Read();\r
@@ -681,10 +693,8 @@ PICO_INTERNAL unsigned char z80_read(unsigned short a)
     return ret;\r
   }\r
 \r
-#ifdef _USE_DRZ80\r
-  // should not be needed || dprintf("z80_read RAM");\r
+  // should not be needed, cores should be able to access RAM themselves\r
   if (a<0x4000) return Pico.zram[a&0x1fff];\r
-#endif\r
 \r
   elprintf(EL_ANOMALY, "z80 invalid r8 [%06x] %02x", a, ret);\r
   return ret;\r
@@ -696,10 +706,6 @@ PICO_INTERNAL_ASM void z80_write(unsigned char data, unsigned short a)
 PICO_INTERNAL_ASM void z80_write(unsigned int a, unsigned char data)\r
 #endif\r
 {\r
-#ifndef _USE_DRZ80\r
-  if (a<0x4000) { Pico.zram[a&0x1fff]=data; return; }\r
-#endif\r
-\r
   if ((a>>13)==2) // 0x4000-0x5fff (Charles MacDonald)\r
   {\r
     if(PicoOpt&1) emustatus|=YM2612Write(a, data) & 1;\r
@@ -730,10 +736,8 @@ PICO_INTERNAL_ASM void z80_write(unsigned int a, unsigned char data)
     return;\r
   }\r
 \r
-#ifdef _USE_DRZ80\r
-  // should not be needed, drZ80 knows how to access RAM itself || dprintf("z80_write RAM @ %08x", lr);\r
+  // should not be needed\r
   if (a<0x4000) { Pico.zram[a&0x1fff]=data; return; }\r
-#endif\r
 \r
   elprintf(EL_ANOMALY, "z80 invalid w8 [%06x] %02x", a, data);\r
 }\r