u32 SRAMRead(u32 a)\r
{\r
unsigned int sreg = Pico.m.sram_reg;\r
- if(!(sreg & 0x10) && (sreg & 1) && a > 0x200001) { // not yet detected SRAM\r
+ if (!(sreg & 0x10) && (sreg & 1) && a > 0x200001) { // not yet detected SRAM\r
elprintf(EL_SRAMIO, "normal sram detected.");\r
Pico.m.sram_reg|=0x10; // should be normal SRAM\r
}\r
- if(sreg & 4) // EEPROM read\r
+ if (sreg & 4) // EEPROM read\r
return SRAMReadEEPROM();\r
else // if(sreg & 1) // (sreg&5) is one of prerequisites\r
return *(u8 *)(SRam.data-SRam.start+a);\r
}\r
\r
+#ifndef _ASM_MEMORY_C\r
+static\r
+#endif\r
+u32 SRAMRead16(u32 a)\r
+{\r
+ u32 d;\r
+ if (Pico.m.sram_reg & 4) {\r
+ d = SRAMReadEEPROM();\r
+ d |= d << 8;\r
+ } else {\r
+ u8 *pm=(u8 *)(SRam.data-SRam.start+a);\r
+ d =*pm++ << 8;\r
+ d|=*pm++;\r
+ }\r
+ return d;\r
+}\r
+\r
static void SRAMWrite(u32 a, u32 d)\r
{\r
unsigned int sreg = Pico.m.sram_reg;\r
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
end:\r
#ifdef __debug_io\r
#ifndef EMU_CORE_DEBUG\r
// sram\r
if (a >= SRam.start && a <= SRam.end && (Pico.m.sram_reg&5)) {\r
- d = SRAMRead(a);\r
- d |= d<<8;\r
+ d = SRAMRead16(a);\r
elprintf(EL_SRAMIO, "sram r16 [%06x] %04x @ %06x", a, d, SekPc);\r
goto end;\r
}\r
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
\r
// sram\r
if(a >= SRam.start && a <= SRam.end && (Pico.m.sram_reg&5)) {\r
- d = (SRAMRead(a)<<16)|SRAMRead(a+2);\r
- d |= d<<8;\r
+ d = (SRAMRead16(a)<<16)|SRAMRead16(a+2);\r
elprintf(EL_SRAMIO, "sram r32 [%06x] %08x @ %06x", a, d, SekPc);\r
goto end;\r
}\r
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
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
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
{\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
\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
- ret = (u8) PicoRead8(addr68k);\r
+ if (PicoMCD & 1)\r
+ ret = PicoReadM68k8(addr68k);\r
+ else ret = PicoRead8(addr68k);\r
elprintf(EL_Z80BNK, "z80->68k r8 [%06x] %02x", addr68k, ret);\r
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
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
\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
- PicoWrite8(addr68k, data);\r
+ if (PicoMCD & 1)\r
+ PicoWriteM68k8(addr68k, data);\r
+ else PicoWrite8(addr68k, data);\r
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