X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=Pico%2FMemory.c;h=2b869246ac574511b103f6bc158e3b6264c24e26;hb=03e4f2a349247334666c87abe3a908df72d23051;hp=7b30e4a366614bf58a2a4ebe48526ecf8907ab30;hpb=1dceadaee482ad3ca6f5ccbef57ea93893f45e82;p=picodrive.git diff --git a/Pico/Memory.c b/Pico/Memory.c index 7b30e4a..2b86924 100644 --- a/Pico/Memory.c +++ b/Pico/Memory.c @@ -32,8 +32,7 @@ void PicoWriteRomHW_in1 (u32 a,u32 d); #endif -#if defined(EMU_C68K) && defined(EMU_M68K) -// cyclone debug mode +#ifdef EMU_CORE_DEBUG u32 lastread_a, lastread_d[16]={0,}, lastwrite_cyc_d[16]={0,}, lastwrite_mus_d[16]={0,}; int lrp_cyc=0, lrp_mus=0, lwp_cyc=0, lwp_mus=0; extern unsigned int ppop; @@ -45,7 +44,7 @@ void log_io(unsigned int addr, int bits, int rw); #define log_io(...) #endif -#if defined(EMU_C68K) || defined(EMU_A68K) +#if defined(EMU_C68K) static __inline int PicoMemBase(u32 pc) { int membase=0; @@ -69,15 +68,11 @@ static __inline int PicoMemBase(u32 pc) #endif -#ifdef EMU_A68K -extern u8 *OP_ROM=NULL,*OP_RAM=NULL; -#endif - -static u32 CPU_CALL PicoCheckPc(u32 pc) +static u32 PicoCheckPc(u32 pc) { u32 ret=0; #if defined(EMU_C68K) - pc-=PicoCpu.membase; // Get real pc + pc-=PicoCpuCM68k.membase; // Get real pc // pc&=0xfffffe; pc&=~1; if ((pc<<8) == 0) @@ -86,15 +81,10 @@ static u32 CPU_CALL PicoCheckPc(u32 pc) return (int)Pico.rom + Pico.romsize; // common crash condition, can happen if acc timing is off } - PicoCpu.membase=PicoMemBase(pc&0x00ffffff); - PicoCpu.membase-=pc&0xff000000; + PicoCpuCM68k.membase=PicoMemBase(pc&0x00ffffff); + PicoCpuCM68k.membase-=pc&0xff000000; - ret = PicoCpu.membase+pc; -#elif defined(EMU_A68K) - OP_ROM=(u8 *)PicoMemBase(pc); - - // don't bother calling us back unless it's outside the 64k segment - M68000_regs.AsmBank=(pc>>16); + ret = PicoCpuCM68k.membase+pc; #endif return ret; } @@ -324,7 +314,7 @@ static void OtherWrite8End(u32 a,u32 d,int realsize) // Read Rom and read Ram #ifndef _ASM_MEMORY_C -PICO_INTERNAL_ASM u32 CPU_CALL PicoRead8(u32 a) +PICO_INTERNAL_ASM u32 PicoRead8(u32 a) { u32 d=0; @@ -332,7 +322,7 @@ PICO_INTERNAL_ASM u32 CPU_CALL PicoRead8(u32 a) a&=0xffffff; -#if !(defined(EMU_C68K) && defined(EMU_M68K)) +#ifndef EMU_CORE_DEBUG // sram if(a >= SRam.start && a <= SRam.end && (Pico.m.sram_reg&5)) { d = SRAMRead(a); @@ -351,7 +341,7 @@ end: #ifdef __debug_io dprintf("r8 : %06x, %02x @%06x", a&0xffffff, (u8)d, SekPc); #endif -#if defined(EMU_C68K) && defined(EMU_M68K) +#ifdef EMU_CORE_DEBUG if(a>=Pico.romsize/*&&(ppop&0x3f)!=0x3a&&(ppop&0x3f)!=0x3b*/) { lastread_a = a; lastread_d[lrp_cyc++&15] = (u8)d; @@ -360,7 +350,7 @@ end: return d; } -PICO_INTERNAL_ASM u32 CPU_CALL PicoRead16(u32 a) +PICO_INTERNAL_ASM u32 PicoRead16(u32 a) { u32 d=0; @@ -368,7 +358,7 @@ PICO_INTERNAL_ASM u32 CPU_CALL PicoRead16(u32 a) a&=0xfffffe; -#if !(defined(EMU_C68K) && defined(EMU_M68K)) +#ifndef EMU_CORE_DEBUG // sram if(a >= SRam.start && a <= SRam.end && (Pico.m.sram_reg&5)) { d = SRAMRead(a); @@ -387,7 +377,7 @@ end: #ifdef __debug_io dprintf("r16: %06x, %04x @%06x", a&0xffffff, d, SekPc); #endif -#if defined(EMU_C68K) && defined(EMU_M68K) +#ifdef EMU_CORE_DEBUG if(a>=Pico.romsize/*&&(ppop&0x3f)!=0x3a&&(ppop&0x3f)!=0x3b*/) { lastread_a = a; lastread_d[lrp_cyc++&15] = d; @@ -396,7 +386,7 @@ end: return d; } -PICO_INTERNAL_ASM u32 CPU_CALL PicoRead32(u32 a) +PICO_INTERNAL_ASM u32 PicoRead32(u32 a) { u32 d=0; @@ -421,7 +411,7 @@ end: #ifdef __debug_io dprintf("r32: %06x, %08x @%06x", a&0xffffff, d, SekPc); #endif -#if defined(EMU_C68K) && defined(EMU_M68K) +#ifdef EMU_CORE_DEBUG if(a>=Pico.romsize/*&&(ppop&0x3f)!=0x3a&&(ppop&0x3f)!=0x3b*/) { lastread_a = a; lastread_d[lrp_cyc++&15] = d; @@ -435,17 +425,14 @@ end: // Write Ram #ifndef _ASM_MEMORY_C -PICO_INTERNAL_ASM void CPU_CALL PicoWrite8(u32 a,u8 d) +PICO_INTERNAL_ASM void PicoWrite8(u32 a,u8 d) { #ifdef __debug_io dprintf("w8 : %06x, %02x @%06x", a&0xffffff, d, SekPc); #endif -#if defined(EMU_C68K) && defined(EMU_M68K) +#ifdef EMU_CORE_DEBUG lastwrite_cyc_d[lwp_cyc++&15] = d; #endif - //if ((a&0xe0ffff)==0xe0a9ba+0x69c) - //if(a==0x200000||a==0x200001) printf("w8 : %02x [%06x] @ %06x [%i]\n", d, a, SekPc, SekCyclesDoneT()); - // dprintf("w8 : %06x, %02x @%06x", a&0xffffff, d, SekPc); if ((a&0xe00000)==0xe00000) { *(u8 *)(Pico.ram+((a^1)&0xffff))=d; return; } // Ram log_io(a, 8, 1); @@ -455,12 +442,12 @@ PICO_INTERNAL_ASM void CPU_CALL PicoWrite8(u32 a,u8 d) } #endif -void CPU_CALL PicoWrite16(u32 a,u16 d) +void PicoWrite16(u32 a,u16 d) { #ifdef __debug_io dprintf("w16: %06x, %04x", a&0xffffff, d); #endif -#if defined(EMU_C68K) && defined(EMU_M68K) +#ifdef EMU_CORE_DEBUG lastwrite_cyc_d[lwp_cyc++&15] = d; #endif @@ -471,12 +458,12 @@ void CPU_CALL PicoWrite16(u32 a,u16 d) OtherWrite16(a,d); } -static void CPU_CALL PicoWrite32(u32 a,u32 d) +static void PicoWrite32(u32 a,u32 d) { #ifdef __debug_io dprintf("w32: %06x, %08x", a&0xffffff, d); #endif -#if defined(EMU_C68K) && defined(EMU_M68K) +#ifdef EMU_CORE_DEBUG lastwrite_cyc_d[lwp_cyc++&15] = d; #endif @@ -498,53 +485,40 @@ static void CPU_CALL PicoWrite32(u32 a,u32 d) // ----------------------------------------------------------------- PICO_INTERNAL void PicoMemSetup(void) { -#ifdef EMU_C68K // Setup memory callbacks: - PicoCpu.checkpc=PicoCheckPc; - PicoCpu.fetch8 =PicoCpu.read8 =PicoRead8; - PicoCpu.fetch16=PicoCpu.read16=PicoRead16; - PicoCpu.fetch32=PicoCpu.read32=PicoRead32; - PicoCpu.write8 =PicoWrite8; - PicoCpu.write16=PicoWrite16; - PicoCpu.write32=PicoWrite32; +#ifdef EMU_C68K + PicoCpuCM68k.checkpc=PicoCheckPc; + PicoCpuCM68k.fetch8 =PicoCpuCM68k.read8 =PicoRead8; + PicoCpuCM68k.fetch16=PicoCpuCM68k.read16=PicoRead16; + PicoCpuCM68k.fetch32=PicoCpuCM68k.read32=PicoRead32; + PicoCpuCM68k.write8 =PicoWrite8; + PicoCpuCM68k.write16=PicoWrite16; + PicoCpuCM68k.write32=PicoWrite32; +#endif +#ifdef EMU_F68K + PicoCpuFM68k.read_byte =PicoRead8; + PicoCpuFM68k.read_word =PicoRead16; + PicoCpuFM68k.read_long =PicoRead32; + PicoCpuFM68k.write_byte=PicoWrite8; + PicoCpuFM68k.write_word=PicoWrite16; + PicoCpuFM68k.write_long=PicoWrite32; + + // setup FAME fetchmap + { + int i; + // by default, point everything to fitst 64k of ROM + for (i = 0; i < M68K_FETCHBANK1; i++) + PicoCpuFM68k.Fetch[i] = (unsigned int)Pico.rom - (i<<(24-FAMEC_FETCHBITS)); + // now real ROM + for (i = 0; i < M68K_FETCHBANK1 && (i<<(24-FAMEC_FETCHBITS)) < Pico.romsize; i++) + PicoCpuFM68k.Fetch[i] = (unsigned int)Pico.rom; + // .. and RAM + for (i = M68K_FETCHBANK1*14/16; i < M68K_FETCHBANK1; i++) + PicoCpuFM68k.Fetch[i] = (unsigned int)Pico.ram - (i<<(24-FAMEC_FETCHBITS)); + } #endif } -#ifdef EMU_A68K -struct A68KInter -{ - u32 unknown; - u8 (__fastcall *Read8) (u32 a); - u16 (__fastcall *Read16)(u32 a); - u32 (__fastcall *Read32)(u32 a); - void (__fastcall *Write8) (u32 a,u8 d); - void (__fastcall *Write16) (u32 a,u16 d); - void (__fastcall *Write32) (u32 a,u32 d); - void (__fastcall *ChangePc)(u32 a); - u8 (__fastcall *PcRel8) (u32 a); - u16 (__fastcall *PcRel16)(u32 a); - u32 (__fastcall *PcRel32)(u32 a); - u16 (__fastcall *Dir16)(u32 a); - u32 (__fastcall *Dir32)(u32 a); -}; - -struct A68KInter a68k_memory_intf= -{ - 0, - PicoRead8, - PicoRead16, - PicoRead32, - PicoWrite8, - PicoWrite16, - PicoWrite32, - PicoCheckPc, - PicoRead8, - PicoRead16, - PicoRead32, - PicoRead16, // unused - PicoRead32, // unused -}; -#endif #ifdef EMU_M68K unsigned int m68k_read_pcrelative_CD8 (unsigned int a); @@ -556,7 +530,7 @@ static unsigned int m68k_read_8 (unsigned int a, int do_fake) { a&=0xffffff; if(PicoMCD&1) return m68k_read_pcrelative_CD8(a); if(a>13)==2) // 0x4000-0x5fff (Charles MacDonald) { - if(PicoOpt&1) ret = (u8) YM2612Read(); - goto end; + if (PicoOpt&1) ret = (u8) YM2612Read(); + return ret; } if (a>=0x8000) @@ -694,33 +672,31 @@ PICO_INTERNAL unsigned char z80_read(unsigned short a) ret = (u8) PicoRead8(addr68k); elprintf(EL_Z80BNK, "z80->68k r8 [%06x] %02x", addr68k, ret); - goto end; + return ret; } +#ifdef _USE_DRZ80 // should not be needed || dprintf("z80_read RAM"); - if (a<0x4000) { ret = (u8) Pico.zram[a&0x1fff]; goto end; } + if (a<0x4000) return Pico.zram[a&0x1fff]; +#endif elprintf(EL_ANOMALY, "z80 invalid r8 [%06x] %02x", a, ret); - -end: return ret; } -PICO_INTERNAL unsigned short z80_read16(unsigned short a) -{ - //dprintf("z80_read16"); - - return (u16) ( (u16)z80_read(a) | ((u16)z80_read((u16)(a+1))<<8) ); -} - +#ifndef _USE_CZ80 PICO_INTERNAL_ASM void z80_write(unsigned char data, unsigned short a) +#else +PICO_INTERNAL_ASM void z80_write(unsigned int a, unsigned char data) +#endif { - //if (a<0x4000) - // dprintf("z80 w8 : %06x, %02x @%04x", a, data, mz80GetRegisterValue(NULL, 0)); +#ifndef _USE_DRZ80 + if (a<0x4000) { Pico.zram[a&0x1fff]=data; return; } +#endif if ((a>>13)==2) // 0x4000-0x5fff (Charles MacDonald) { - if(PicoOpt&1) emustatus|=YM2612Write(a, data); + if(PicoOpt&1) emustatus|=YM2612Write(a, data) & 1; return; } @@ -748,17 +724,24 @@ PICO_INTERNAL_ASM void z80_write(unsigned char data, unsigned short a) return; } +#ifdef _USE_DRZ80 // should not be needed, drZ80 knows how to access RAM itself || dprintf("z80_write RAM @ %08x", lr); if (a<0x4000) { Pico.zram[a&0x1fff]=data; return; } +#endif elprintf(EL_ANOMALY, "z80 invalid w8 [%06x] %02x", a, data); } -PICO_INTERNAL void z80_write16(unsigned short data, unsigned short a) +#ifndef _USE_CZ80 +PICO_INTERNAL unsigned short z80_read16(unsigned short a) { - //dprintf("z80_write16"); + return (u16) ( (u16)z80_read(a) | ((u16)z80_read((u16)(a+1))<<8) ); +} +PICO_INTERNAL void z80_write16(unsigned short data, unsigned short a) +{ z80_write((unsigned char) data,a); z80_write((unsigned char)(data>>8),(u16)(a+1)); } +#endif