X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fcd%2FMemory.c;h=b404ae7eb370f2878dc50260808b4448f5390e5d;hb=9761a7d0d41ad429d53c64ff35fe061c38092dbf;hp=0be0a4211696215efbb698f61bdcdebf36276fec;hpb=81fda4e8d854c96e70dc2e6b7cd2f48a51f55d86;p=picodrive.git diff --git a/Pico/cd/Memory.c b/Pico/cd/Memory.c index 0be0a42..b404ae7 100644 --- a/Pico/cd/Memory.c +++ b/Pico/cd/Memory.c @@ -3,8 +3,6 @@ // (c) Copyright 2007, Grazvydas "notaz" Ignotas -//#define __debug_io - #include "../PicoInt.h" #include "../sound/ym2612.h" @@ -20,15 +18,15 @@ typedef unsigned int u32; #define UTYPES_DEFINED #endif -//#define __debug_io -//#define __debug_io2 - +#ifdef _MSC_VER +#define rdprintf +#define wrdprintf +#else //#define rdprintf dprintf #define rdprintf(...) //#define wrdprintf dprintf #define wrdprintf(...) -#define plprintf dprintf -//#define plprintf(...) +#endif #ifdef EMU_CORE_DEBUG extern u32 lastread_a, lastread_d[16], lastwrite_cyc_d[16]; @@ -71,7 +69,7 @@ static u32 m68k_reg_read16(u32 a) d = Read_CDC_Host(0); goto end; case 0xA: - dprintf("m68k FIXME: reserved read"); + elprintf(EL_UIO, "m68k FIXME: reserved read"); goto end; case 0xC: d = Pico_mcd->m.timer_stopwatch >> 16; @@ -85,11 +83,10 @@ static u32 m68k_reg_read16(u32 a) goto end; } - dprintf("m68k_regs FIXME invalid read @ %02x", a); + elprintf(EL_UIO, "m68k_regs FIXME invalid read @ %02x", a); end: - // dprintf("ret = %04x", d); return d; } #endif @@ -105,7 +102,7 @@ void m68k_reg_write8(u32 a, u32 d) switch (a) { case 0: d &= 1; - if ((d&1) && (Pico_mcd->s68k_regs[0x33]&(1<<2))) { dprintf("m68k: s68k irq 2"); SekInterruptS68k(2); } + if ((d&1) && (Pico_mcd->s68k_regs[0x33]&(1<<2))) { elprintf(EL_INTS, "m68k: s68k irq 2"); SekInterruptS68k(2); } return; case 1: d &= 3; @@ -149,7 +146,7 @@ void m68k_reg_write8(u32 a, u32 d) #ifdef USE_POLL_DETECT if ((s68k_poll_adclk&0xfe) == 2 && s68k_poll_cnt > POLL_LIMIT) { SekSetStopS68k(0); s68k_poll_adclk = 0; - plprintf("s68k poll release, a=%02x\n", a); + elprintf(EL_CDPOLL, "s68k poll release, a=%02x", a); } #endif return; @@ -169,7 +166,7 @@ void m68k_reg_write8(u32 a, u32 d) #ifdef USE_POLL_DETECT if ((s68k_poll_adclk&0xfe) == 0xe && s68k_poll_cnt > POLL_LIMIT) { SekSetStopS68k(0); s68k_poll_adclk = 0; - plprintf("s68k poll release, a=%02x\n", a); + elprintf(EL_CDPOLL, "s68k poll release, a=%02x", a); } #endif return; @@ -180,13 +177,13 @@ void m68k_reg_write8(u32 a, u32 d) #ifdef USE_POLL_DETECT if ((a&0xfe) == (s68k_poll_adclk&0xfe) && s68k_poll_cnt > POLL_LIMIT) { SekSetStopS68k(0); s68k_poll_adclk = 0; - plprintf("s68k poll release, a=%02x\n", a); + elprintf(EL_CDPOLL, "s68k poll release, a=%02x", a); } #endif return; } - dprintf("m68k FIXME: invalid write? [%02x] %02x", a, d); + elprintf(EL_UIO, "m68k FIXME: invalid write? [%02x] %02x", a, d); } #ifndef _ASM_CD_MEMORY_C @@ -195,6 +192,8 @@ static u32 s68k_poll_detect(u32 a, u32 d) { #ifdef USE_POLL_DETECT + // needed mostly for Cyclone, which doesn't always check it's cycle counter + if (SekIsStoppedS68k()) return d; // polling detection if (a == (s68k_poll_adclk&0xff)) { unsigned int clkdiff = SekCyclesDoneS68k() - (s68k_poll_adclk>>8); @@ -203,7 +202,7 @@ u32 s68k_poll_detect(u32 a, u32 d) //printf("-- diff: %u, cnt = %i\n", clkdiff, s68k_poll_cnt); if (s68k_poll_cnt > POLL_LIMIT) { SekSetStopS68k(1); - plprintf("s68k poll detected @ %06x, a=%02x\n", SekPcS68k, a); + elprintf(EL_CDPOLL, "s68k poll detected @ %06x, a=%02x", SekPcS68k, a); } s68k_poll_adclk = (SekCyclesDoneS68k() << 8) | a; return d; @@ -374,7 +373,7 @@ void s68k_reg_write8(u32 a, u32 d) if ((a&0x1f0) == 0x10 || (a >= 0x38 && a < 0x42)) { - dprintf("s68k FIXME: invalid write @ %02x?", a); + elprintf(EL_UIO, "s68k FIXME: invalid write @ %02x?", a); return; } @@ -382,11 +381,11 @@ void s68k_reg_write8(u32 a, u32 d) } -#ifndef _ASM_CD_MEMORY_C static u32 OtherRead16End(u32 a, int realsize) { u32 d=0; +#ifndef _ASM_CD_MEMORY_C if ((a&0xffffc0)==0xa12000) { d=m68k_reg_read16(a); goto end; @@ -409,16 +408,20 @@ static u32 OtherRead16End(u32 a, int realsize) d=Pico_mcd->m.bcram_reg; goto end; } +#endif - dprintf("m68k FIXME: unusual r%i: %06x @%06x", realsize&~1, (a&0xfffffe)+(realsize&1), SekPc); + elprintf(EL_UIO, "m68k FIXME: unusual r%i: %06x @%06x", realsize&~1, (a&0xfffffe)+(realsize&1), SekPc); +#ifndef _ASM_CD_MEMORY_C end: +#endif return d; } static void OtherWrite8End(u32 a, u32 d, int realsize) { +#ifndef _ASM_CD_MEMORY_C if ((a&0xffffc0)==0xa12000) { m68k_reg_write8(a, d); return; } if ((a&0xfe0000)==0x600000) { @@ -433,15 +436,17 @@ static void OtherWrite8End(u32 a, u32 d, int realsize) Pico_mcd->m.bcram_reg=d; return; } +#endif - dprintf("m68k FIXME: strange w%i: [%06x], %08x @%06x", realsize, a&0xffffff, d, SekPc); + elprintf(EL_UIO, "m68k FIXME: strange w%i: [%06x], %08x @%06x", realsize, a&0xffffff, d, SekPc); } +#ifndef _ASM_CD_MEMORY_C #define _CD_MEMORY_C #undef _ASM_MEMORY_C #include "../MemoryCmn.c" #include "cell_map.c" -#endif // !def _ASM_CD_MEMORY_C +#endif // ----------------------------------------------------------------- @@ -496,10 +501,8 @@ u32 PicoReadM68k8(u32 a) case 0xd0>>1: case 0xd2>>1: case 0xd4>>1: case 0xd6>>1: case 0xd8>>1: case 0xda>>1: case 0xdc>>1: case 0xde>>1: // VDP - if ((a&0xe700e0)==0xc00000) { - d=PicoVideoRead(a); - if ((a&1)==0) d>>=8; - } + if ((a&0xe700e0)==0xc00000) + d=PicoVideoRead8(a); break; case 0xe0>>1: case 0xe2>>1: case 0xe4>>1: case 0xe6>>1: case 0xe8>>1: case 0xea>>1: case 0xec>>1: case 0xee>>1: @@ -521,9 +524,7 @@ u32 PicoReadM68k8(u32 a) } -#ifdef __debug_io - dprintf("r8 : %06x, %02x @%06x", a&0xffffff, (u8)d, SekPc); -#endif + elprintf(EL_IO, "r8 : %06x, %02x @%06x", a&0xffffff, (u8)d, SekPc); #ifdef EMU_CORE_DEBUG if (a>=Pico.romsize) { lastread_a = a; @@ -608,9 +609,7 @@ static u32 PicoReadM68k16(u32 a) } -#ifdef __debug_io - dprintf("r16: %06x, %04x @%06x", a&0xffffff, d, SekPc); -#endif + elprintf(EL_IO, "r16: %06x, %04x @%06x", a&0xffffff, d, SekPc); #ifdef EMU_CORE_DEBUG if (a>=Pico.romsize) { lastread_a = a; @@ -704,9 +703,7 @@ static u32 PicoReadM68k32(u32 a) } -#ifdef __debug_io - dprintf("r32: %06x, %08x @%06x", a&0xffffff, d, SekPc); -#endif + elprintf(EL_IO, "r32: %06x, %08x @%06x", a&0xffffff, d, SekPc); #ifdef EMU_CORE_DEBUG if (a>=Pico.romsize) { lastread_a = a; @@ -725,9 +722,7 @@ void PicoWriteM68k8(u32 a,u8 d); #else void PicoWriteM68k8(u32 a,u8 d) { -#ifdef __debug_io - dprintf("w8 : %06x, %02x @%06x", a&0xffffff, d, SekPc); -#endif + elprintf(EL_IO, "w8 : %06x, %02x @%06x", a&0xffffff, d, SekPc); #ifdef EMU_CORE_DEBUG lastwrite_cyc_d[lwp_cyc++&15] = d; #endif @@ -778,9 +773,7 @@ void PicoWriteM68k16(u32 a,u16 d); #else static void PicoWriteM68k16(u32 a,u16 d) { -#ifdef __debug_io - dprintf("w16: %06x, %04x", a&0xffffff, d); -#endif + elprintf(EL_IO, "w16: %06x, %04x", a&0xffffff, d); #ifdef EMU_CORE_DEBUG lastwrite_cyc_d[lwp_cyc++&15] = d; #endif @@ -824,7 +817,7 @@ static void PicoWriteM68k16(u32 a,u16 d) #ifdef USE_POLL_DETECT if ((s68k_poll_adclk&0xfe) == 0xe && s68k_poll_cnt > POLL_LIMIT) { SekSetStopS68k(0); s68k_poll_adclk = 0; - plprintf("s68k poll release, a=%02x\n", a); + elprintf(EL_CDPOLL, "s68k poll release, a=%02x", a); } #endif return; @@ -850,9 +843,7 @@ void PicoWriteM68k32(u32 a,u32 d); #else static void PicoWriteM68k32(u32 a,u32 d) { -#ifdef __debug_io - dprintf("w32: %06x, %08x", a&0xffffff, d); -#endif + elprintf(EL_IO, "w32: %06x, %08x", a&0xffffff, d); #ifdef EMU_CORE_DEBUG lastwrite_cyc_d[lwp_cyc++&15] = d; #endif @@ -968,7 +959,6 @@ static u32 PicoReadS68k8(u32 a) d = Pico_mcd->word_ram1M[bank][((a>>1)^1)&0x1ffff]; if (a&1) d &= 0x0f; else d >>= 4; - dprintf("FIXME: decode"); } else { // allow access in any mode, like Gens does d = Pico_mcd->word_ram2M[(a^1)&0x3ffff]; @@ -991,7 +981,7 @@ static u32 PicoReadS68k8(u32 a) // PCM if ((a&0xff8000)==0xff0000) { - dprintf("s68k_pcm r8: [%06x] @%06x", a, SekPcS68k); + elprintf(EL_IO, "s68k_pcm r8: [%06x] @%06x", a, SekPcS68k); a &= 0x7fff; if (a >= 0x2000) d = Pico_mcd->pcm_ram_b[Pico_mcd->pcm.bank][(a>>1)&0xfff]; @@ -1000,7 +990,7 @@ static u32 PicoReadS68k8(u32 a) d = Pico_mcd->pcm.ch[a>>2].addr >> PCM_STEP_SHIFT; if (a & 2) d >>= 8; } - dprintf("ret = %02x", (u8)d); + elprintf(EL_IO, "ret = %02x", (u8)d); goto end; } @@ -1010,13 +1000,11 @@ static u32 PicoReadS68k8(u32 a) goto end; } - dprintf("s68k r8 : %06x, %02x @%06x", a&0xffffff, (u8)d, SekPcS68k); + elprintf(EL_UIO, "s68k r8 : %06x, %02x @%06x", a&0xffffff, (u8)d, SekPcS68k); end: -#ifdef __debug_io2 - dprintf("s68k r8 : %06x, %02x @%06x", a&0xffffff, (u8)d, SekPcS68k); -#endif + elprintf(EL_IO, "s68k r8 : %06x, %02x @%06x", a&0xffffff, (u8)d, SekPcS68k); #ifdef EMU_CORE_DEBUG lastread_a = ab; lastread_d[lrp_cyc++&15] = d; @@ -1064,7 +1052,6 @@ static u32 PicoReadS68k16(u32 a) int bank = (Pico_mcd->s68k_regs[3]&1)^1; d = Pico_mcd->word_ram1M[bank][((a>>1)^1)&0x1ffff]; d |= d << 4; d &= ~0xf0; - dprintf("FIXME: decode"); } else { // allow access in any mode, like Gens does d = *(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe)); @@ -1110,13 +1097,11 @@ static u32 PicoReadS68k16(u32 a) goto end; } - dprintf("s68k r16: %06x, %04x @%06x", a&0xffffff, d, SekPcS68k); + elprintf(EL_UIO, "s68k r16: %06x, %04x @%06x", a&0xffffff, d, SekPcS68k); end: -#ifdef __debug_io2 - dprintf("s68k r16: %06x, %04x @%06x", a&0xffffff, d, SekPcS68k); -#endif + elprintf(EL_IO, "s68k r16: %06x, %04x @%06x", a&0xffffff, d, SekPcS68k); #ifdef EMU_CORE_DEBUG lastread_a = ab; lastread_d[lrp_cyc++&15] = d; @@ -1176,11 +1161,12 @@ static u32 PicoReadS68k32(u32 a) // word RAM (1M area) if ((a&0xfe0000)==0x0c0000 && (Pico_mcd->s68k_regs[3]&4)) { // 0c0000-0dffff int bank; + u16 *pm; wrdprintf("s68k_wram1M r32: [%06x] @%06x", a, SekPcS68k); // if (!(Pico_mcd->s68k_regs[3]&4)) // dprintf("s68k_wram1M FIXME: wrong mode"); bank = (Pico_mcd->s68k_regs[3]&1)^1; - u16 *pm=(u16 *)(Pico_mcd->word_ram1M[bank]+(a&0x1fffe)); d = (pm[0]<<16)|pm[1]; + pm=(u16 *)(Pico_mcd->word_ram1M[bank]+(a&0x1fffe)); d = (pm[0]<<16)|pm[1]; wrdprintf("ret = %08x", d); goto end; } @@ -1220,13 +1206,11 @@ static u32 PicoReadS68k32(u32 a) goto end; } - dprintf("s68k r32: %06x, %08x @%06x", a&0xffffff, d, SekPcS68k); + elprintf(EL_UIO, "s68k r32: %06x, %08x @%06x", a&0xffffff, d, SekPcS68k); end: -#ifdef __debug_io2 - dprintf("s68k r32: %06x, %08x @%06x", a&0xffffff, d, SekPcS68k); -#endif + elprintf(EL_IO, "s68k r32: %06x, %08x @%06x", a&0xffffff, d, SekPcS68k); #ifdef EMU_CORE_DEBUG if (ab > 0x78) { // not vectors and stuff lastread_a = ab; @@ -1296,9 +1280,7 @@ void PicoWriteS68k8(u32 a,u8 d); #else static void PicoWriteS68k8(u32 a,u8 d) { -#ifdef __debug_io2 - dprintf("s68k w8 : %06x, %02x @%06x", a&0xffffff, d, SekPcS68k); -#endif + elprintf(EL_IO, "s68k w8 : %06x, %02x @%06x", a&0xffffff, d, SekPcS68k); a&=0xffffff; @@ -1366,7 +1348,7 @@ static void PicoWriteS68k8(u32 a,u8 d) return; } - dprintf("s68k w8 : %06x, %02x @%06x", a&0xffffff, d, SekPcS68k); + elprintf(EL_UIO, "s68k w8 : %06x, %02x @%06x", a&0xffffff, d, SekPcS68k); } #endif @@ -1376,9 +1358,7 @@ void PicoWriteS68k16(u32 a,u16 d); #else static void PicoWriteS68k16(u32 a,u16 d) { -#ifdef __debug_io2 - dprintf("s68k w16: %06x, %04x @%06x", a&0xffffff, d, SekPcS68k); -#endif + elprintf(EL_IO, "s68k w16: %06x, %04x @%06x", a&0xffffff, d, SekPcS68k); a&=0xfffffe; @@ -1456,7 +1436,7 @@ static void PicoWriteS68k16(u32 a,u16 d) return; } - dprintf("s68k w16: %06x, %04x @%06x", a&0xffffff, d, SekPcS68k); + elprintf(EL_UIO, "s68k w16: %06x, %04x @%06x", a&0xffffff, d, SekPcS68k); } #endif @@ -1466,9 +1446,7 @@ void PicoWriteS68k32(u32 a,u32 d); #else static void PicoWriteS68k32(u32 a,u32 d) { -#ifdef __debug_io2 - dprintf("s68k w32: %06x, %08x @%06x", a&0xffffff, d, SekPcS68k); -#endif + elprintf(EL_IO, "s68k w32: %06x, %08x @%06x", a&0xffffff, d, SekPcS68k); a&=0xfffffe; @@ -1558,7 +1536,7 @@ static void PicoWriteS68k32(u32 a,u32 d) return; } - dprintf("s68k w32: %06x, %08x @%06x", a&0xffffff, d, SekPcS68k); + elprintf(EL_UIO, "s68k w32: %06x, %08x @%06x", a&0xffffff, d, SekPcS68k); } #endif @@ -1586,7 +1564,7 @@ static __inline int PicoMemBaseM68k(u32 pc) } // Error - Program Counter is invalid - dprintf("m68k FIXME: unhandled jump to %06x", pc); + elprintf(EL_ANOMALY, "m68k FIXME: unhandled jump to %06x", pc); return (int)Pico_mcd->bios; } @@ -1617,7 +1595,7 @@ static __inline int PicoMemBaseS68k(u32 pc) } // Error - Program Counter is invalid - dprintf("s68k FIXME: unhandled jump to %06x", pc); + elprintf(EL_ANOMALY, "s68k FIXME: unhandled jump to %06x", pc); return (int)Pico_mcd->prg_ram; } @@ -1656,9 +1634,16 @@ void PicoMemResetCD(int r3) } #endif +#ifdef EMU_M68K +static void m68k_mem_setup_cd(void); +#endif + PICO_INTERNAL void PicoMemSetupCD(void) { - dprintf("PicoMemSetupCD()"); + // additional handlers for common code + PicoRead16Hook = OtherRead16End; + PicoWrite8Hook = OtherWrite8End; + #ifdef EMU_C68K // Setup m68k memory callbacks: PicoCpuCM68k.checkpc=PicoCheckPcM68k; @@ -1719,6 +1704,9 @@ PICO_INTERNAL void PicoMemSetupCD(void) // PicoMemResetCD() will setup word ram for both } #endif +#ifdef EMU_M68K + m68k_mem_setup_cd(); +#endif // m68k_poll_addr = m68k_poll_cnt = 0; s68k_poll_adclk = s68k_poll_cnt = 0; @@ -1726,27 +1714,27 @@ PICO_INTERNAL void PicoMemSetupCD(void) #ifdef EMU_M68K -unsigned char PicoReadCD8w (unsigned int a) { +static unsigned int PicoReadCD8w (unsigned int a) { return m68ki_cpu_p == &PicoCpuMS68k ? PicoReadS68k8(a) : PicoReadM68k8(a); } -unsigned short PicoReadCD16w(unsigned int a) { +static unsigned int PicoReadCD16w(unsigned int a) { return m68ki_cpu_p == &PicoCpuMS68k ? PicoReadS68k16(a) : PicoReadM68k16(a); } -unsigned int PicoReadCD32w(unsigned int a) { +static unsigned int PicoReadCD32w(unsigned int a) { return m68ki_cpu_p == &PicoCpuMS68k ? PicoReadS68k32(a) : PicoReadM68k32(a); } -void PicoWriteCD8w (unsigned int a, unsigned char d) { +static void PicoWriteCD8w (unsigned int a, unsigned char d) { if (m68ki_cpu_p == &PicoCpuMS68k) PicoWriteS68k8(a, d); else PicoWriteM68k8(a, d); } -void PicoWriteCD16w(unsigned int a, unsigned short d) { +static void PicoWriteCD16w(unsigned int a, unsigned short d) { if (m68ki_cpu_p == &PicoCpuMS68k) PicoWriteS68k16(a, d); else PicoWriteM68k16(a, d); } -void PicoWriteCD32w(unsigned int a, unsigned int d) { +static void PicoWriteCD32w(unsigned int a, unsigned int d) { if (m68ki_cpu_p == &PicoCpuMS68k) PicoWriteS68k32(a, d); else PicoWriteM68k32(a, d); } // these are allowed to access RAM -unsigned int m68k_read_pcrelative_CD8 (unsigned int a) +static unsigned int m68k_read_pcrelative_CD8 (unsigned int a) { a&=0xffffff; if(m68ki_cpu_p == &PicoCpuMS68k) { @@ -1757,7 +1745,7 @@ unsigned int m68k_read_pcrelative_CD8 (unsigned int a) int bank = (Pico_mcd->s68k_regs[3]&1)^1; return *(u8 *)(Pico_mcd->word_ram1M[bank]+((a^1)&0x1ffff)); } - dprintf("s68k_read_pcrelative_CD8 FIXME: can't handle %06x", a); + elprintf(EL_ANOMALY, "s68k_read_pcrelative_CD8 FIXME: can't handle %06x", a); } else { if((a&0xe00000)==0xe00000) return *(u8 *)(Pico.ram+((a^1)&0xffff)); // Ram if(a<0x20000) return *(u8 *)(Pico.rom+(a^1)); // Bios @@ -1769,11 +1757,11 @@ unsigned int m68k_read_pcrelative_CD8 (unsigned int a) return *(u8 *)(Pico_mcd->word_ram1M[bank]+((a^1)&0x1ffff)); } } - dprintf("m68k_read_pcrelative_CD8 FIXME: can't handle %06x", a); + elprintf(EL_ANOMALY, "m68k_read_pcrelative_CD8 FIXME: can't handle %06x", a); } return 0;//(u8) lastread_d; } -unsigned int m68k_read_pcrelative_CD16(unsigned int a) +static unsigned int m68k_read_pcrelative_CD16(unsigned int a) { a&=0xffffff; if(m68ki_cpu_p == &PicoCpuMS68k) { @@ -1784,7 +1772,7 @@ unsigned int m68k_read_pcrelative_CD16(unsigned int a) int bank = (Pico_mcd->s68k_regs[3]&1)^1; return *(u16 *)(Pico_mcd->word_ram1M[bank]+(a&0x1fffe)); } - dprintf("s68k_read_pcrelative_CD16 FIXME: can't handle %06x", a); + elprintf(EL_ANOMALY, "s68k_read_pcrelative_CD16 FIXME: can't handle %06x", a); } else { if((a&0xe00000)==0xe00000) return *(u16 *)(Pico.ram+(a&0xfffe)); // Ram if(a<0x20000) return *(u16 *)(Pico.rom+(a&~1)); // Bios @@ -1796,11 +1784,11 @@ unsigned int m68k_read_pcrelative_CD16(unsigned int a) return *(u16 *)(Pico_mcd->word_ram1M[bank]+(a&0x1fffe)); } } - dprintf("m68k_read_pcrelative_CD16 FIXME: can't handle %06x", a); + elprintf(EL_ANOMALY, "m68k_read_pcrelative_CD16 FIXME: can't handle %06x", a); } return 0; } -unsigned int m68k_read_pcrelative_CD32(unsigned int a) +static unsigned int m68k_read_pcrelative_CD32(unsigned int a) { u16 *pm; a&=0xffffff; @@ -1813,7 +1801,7 @@ unsigned int m68k_read_pcrelative_CD32(unsigned int a) pm=(u16 *)(Pico_mcd->word_ram1M[bank]+(a&0x1fffe)); return (pm[0]<<16)|pm[1]; } - dprintf("s68k_read_pcrelative_CD32 FIXME: can't handle %06x", a); + elprintf(EL_ANOMALY, "s68k_read_pcrelative_CD32 FIXME: can't handle %06x", a); } else { if((a&0xe00000)==0xe00000) { u16 *pm=(u16 *)(Pico.ram+(a&0xfffe)); return (pm[0]<<16)|pm[1]; } // Ram if(a<0x20000) { u16 *pm=(u16 *)(Pico.rom+(a&~1)); return (pm[0]<<16)|pm[1]; } @@ -1826,9 +1814,32 @@ unsigned int m68k_read_pcrelative_CD32(unsigned int a) return (pm[0]<<16)|pm[1]; } } - dprintf("m68k_read_pcrelative_CD32 FIXME: can't handle %06x", a); + elprintf(EL_ANOMALY, "m68k_read_pcrelative_CD32 FIXME: can't handle %06x", a); } return 0; } + +extern unsigned int (*pm68k_read_memory_8) (unsigned int address); +extern unsigned int (*pm68k_read_memory_16)(unsigned int address); +extern unsigned int (*pm68k_read_memory_32)(unsigned int address); +extern void (*pm68k_write_memory_8) (unsigned int address, unsigned char value); +extern void (*pm68k_write_memory_16)(unsigned int address, unsigned short value); +extern void (*pm68k_write_memory_32)(unsigned int address, unsigned int value); +extern unsigned int (*pm68k_read_memory_pcr_8) (unsigned int address); +extern unsigned int (*pm68k_read_memory_pcr_16)(unsigned int address); +extern unsigned int (*pm68k_read_memory_pcr_32)(unsigned int address); + +static void m68k_mem_setup_cd(void) +{ + pm68k_read_memory_8 = PicoReadCD8w; + pm68k_read_memory_16 = PicoReadCD16w; + pm68k_read_memory_32 = PicoReadCD32w; + pm68k_write_memory_8 = PicoWriteCD8w; + pm68k_write_memory_16 = PicoWriteCD16w; + pm68k_write_memory_32 = PicoWriteCD32w; + pm68k_read_memory_pcr_8 = m68k_read_pcrelative_CD8; + pm68k_read_memory_pcr_16 = m68k_read_pcrelative_CD16; + pm68k_read_memory_pcr_32 = m68k_read_pcrelative_CD32; +} #endif // EMU_M68K