X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Fcz80%2Fcz80.c;h=61ca5f84d08ee4eafac2d8bcdaf62b4583f01ced;hb=9db6a54485501b56b0f2f5db4d093c38fe495bda;hp=d7bdba3bb61bdf16ba7a7ff37bb5289d3e69041a;hpb=10d84cb2757db05bf7d66ef33575c52ed4b22053;p=picodrive.git diff --git a/cpu/cz80/cz80.c b/cpu/cz80/cz80.c index d7bdba3..61ca5f8 100644 --- a/cpu/cz80/cz80.c +++ b/cpu/cz80/cz80.c @@ -14,8 +14,7 @@ #include "cz80.h" #if PICODRIVE_HACKS -#undef EMU_M68K -#include +#include #endif #ifndef ALIGN_DATA @@ -107,7 +106,7 @@ void Cz80_Init(cz80_struc *CPU) for (i = 0; i < CZ80_FETCH_BANK; i++) { - CPU->Fetch[i] = (UINT32)cz80_bad_address; + CPU->Fetch[i] = (FPTR)cz80_bad_address; #if CZ80_ENCRYPTED_ROM CPU->OPFetch[i] = 0; #endif @@ -211,7 +210,7 @@ void Cz80_Init(cz80_struc *CPU) void Cz80_Reset(cz80_struc *CPU) { - memset(CPU, 0, (INT32)&CPU->BasePC - (INT32)CPU); + memset(CPU, 0, (FPTR)&CPU->BasePC - (FPTR)CPU); Cz80_Set_Reg(CPU, CZ80_PC, 0); } @@ -219,7 +218,10 @@ void Cz80_Reset(cz80_struc *CPU) #if PICODRIVE_HACKS static inline unsigned char picodrive_read(unsigned short a) { - return (a < 0x4000) ? Pico.zram[a&0x1fff] : z80_read(a); + uptr v = z80_read_map[a >> Z80_MEM_SHIFT]; + if (map_flag_set(v)) + return ((z80_read_f *)(v << 1))(a); + return *(unsigned char *)((v << 1) + a); } #endif @@ -233,15 +235,16 @@ INT32 Cz80_Exec(cz80_struc *CPU, INT32 cycles) #include "cz80jmp.c" #endif - UINT32 PC; + FPTR PC; #if CZ80_ENCRYPTED_ROM - INT32 OPBase; + FPTR OPBase; #endif UINT32 Opcode; UINT32 adr = 0; UINT32 res; UINT32 val; int afterEI = 0; + union16 *data; PC = CPU->PC; #if CZ80_ENCRYPTED_ROM @@ -255,7 +258,8 @@ INT32 Cz80_Exec(cz80_struc *CPU, INT32 cycles) Cz80_Exec: if (CPU->ICount > 0) { - union16 *data = pzHL; +Cz80_Exec_nocheck: + data = pzHL; Opcode = READ_OP(); #if CZ80_EMULATE_R_EXACTLY zR++; @@ -270,6 +274,8 @@ Cz80_Check_Interrupt: if (CPU->IRQState != CLEAR_LINE) { CHECK_INT + CPU->ICount -= CPU->ExtraCycles; + CPU->ExtraCycles = 0; } goto Cz80_Exec; } @@ -310,9 +316,9 @@ void Cz80_Set_IRQ(cz80_struc *CPU, INT32 line, INT32 state) if (state != CLEAR_LINE) { - UINT32 PC = CPU->PC; + FPTR PC = CPU->PC; #if CZ80_ENCRYPTED_ROM - INT32 OPBase = CPU->OPBase; + FPTR OPBase = CPU->OPBase; #endif CPU->IRQLine = line; @@ -388,8 +394,8 @@ void Cz80_Set_Reg(cz80_struc *CPU, INT32 regnum, UINT32 val) case CZ80_R: zR = val; break; case CZ80_I: zI = val; break; case CZ80_IM: zIM = val; break; - case CZ80_IFF1: zIFF1 = val; break; - case CZ80_IFF2: zIFF2 = val; break; + case CZ80_IFF1: zIFF1 = val ? (1 << 2) : 0; break; + case CZ80_IFF2: zIFF2 = val ? (1 << 2) : 0; break; case CZ80_HALT: CPU->HaltState = val; break; case CZ80_IRQ: CPU->IRQState = val; break; default: break; @@ -401,7 +407,7 @@ void Cz80_Set_Reg(cz80_struc *CPU, INT32 regnum, UINT32 val) ƒtƒFƒbƒ`ƒAƒhƒŒƒXÝ’è --------------------------------------------------------*/ -void Cz80_Set_Fetch(cz80_struc *CPU, UINT32 low_adr, UINT32 high_adr, UINT32 fetch_adr) +void Cz80_Set_Fetch(cz80_struc *CPU, UINT32 low_adr, UINT32 high_adr, FPTR fetch_adr) { int i, j;