32x and sms savestates. Core-independent z80 state. SS bugfixing/refactoring.
[picodrive.git] / cpu / cz80 / cz80.c
index 18fd620..61ca5f8 100644 (file)
@@ -14,8 +14,7 @@
 #include "cz80.h"\r
 \r
 #if PICODRIVE_HACKS\r
-#undef EMU_M68K\r
-#include <Pico/PicoInt.h>\r
+#include <pico/memory.h>\r
 #endif\r
 \r
 #ifndef ALIGN_DATA\r
@@ -107,7 +106,7 @@ void Cz80_Init(cz80_struc *CPU)
 \r
        for (i = 0; i < CZ80_FETCH_BANK; i++)\r
        {\r
-               CPU->Fetch[i] = (UINT32)cz80_bad_address;\r
+               CPU->Fetch[i] = (FPTR)cz80_bad_address;\r
 #if CZ80_ENCRYPTED_ROM\r
                CPU->OPFetch[i] = 0;\r
 #endif\r
@@ -211,7 +210,7 @@ void Cz80_Init(cz80_struc *CPU)
 \r
 void Cz80_Reset(cz80_struc *CPU)\r
 {\r
-       memset(CPU, 0, (INT32)&CPU->BasePC - (INT32)CPU);\r
+       memset(CPU, 0, (FPTR)&CPU->BasePC - (FPTR)CPU);\r
        Cz80_Set_Reg(CPU, CZ80_PC, 0);\r
 }\r
 \r
@@ -219,7 +218,10 @@ void Cz80_Reset(cz80_struc *CPU)
 #if PICODRIVE_HACKS\r
 static inline unsigned char picodrive_read(unsigned short a)\r
 {\r
-       return (a < 0x4000) ? Pico.zram[a&0x1fff] : z80_read(a);\r
+       uptr v = z80_read_map[a >> Z80_MEM_SHIFT];\r
+       if (map_flag_set(v))\r
+               return ((z80_read_f *)(v << 1))(a);\r
+       return *(unsigned char *)((v << 1) + a);\r
 }\r
 #endif\r
 \r
@@ -233,15 +235,16 @@ INT32 Cz80_Exec(cz80_struc *CPU, INT32 cycles)
 #include "cz80jmp.c"\r
 #endif\r
 \r
-       UINT32 PC;\r
+       FPTR PC;\r
 #if CZ80_ENCRYPTED_ROM\r
-       INT32 OPBase;\r
+       FPTR OPBase;\r
 #endif\r
        UINT32 Opcode;\r
        UINT32 adr = 0;\r
        UINT32 res;\r
        UINT32 val;\r
        int afterEI = 0;\r
+       union16 *data;\r
 \r
        PC = CPU->PC;\r
 #if CZ80_ENCRYPTED_ROM\r
@@ -255,7 +258,8 @@ INT32 Cz80_Exec(cz80_struc *CPU, INT32 cycles)
 Cz80_Exec:\r
                if (CPU->ICount > 0)\r
                {\r
-                       union16 *data = pzHL;\r
+Cz80_Exec_nocheck:\r
+                       data = pzHL;\r
                        Opcode = READ_OP();\r
 #if CZ80_EMULATE_R_EXACTLY\r
                        zR++;\r
@@ -312,9 +316,9 @@ void Cz80_Set_IRQ(cz80_struc *CPU, INT32 line, INT32 state)
 \r
                if (state != CLEAR_LINE)\r
                {\r
-                       UINT32 PC = CPU->PC;\r
+                       FPTR PC = CPU->PC;\r
 #if CZ80_ENCRYPTED_ROM\r
-                       INT32 OPBase = CPU->OPBase;\r
+                       FPTR OPBase = CPU->OPBase;\r
 #endif\r
 \r
                        CPU->IRQLine = line;\r
@@ -390,8 +394,8 @@ void Cz80_Set_Reg(cz80_struc *CPU, INT32 regnum, UINT32 val)
        case CZ80_R:    zR = val; break;\r
        case CZ80_I:    zI = val; break;\r
        case CZ80_IM:   zIM = val; break;\r
-       case CZ80_IFF1: zIFF1 = val; break;\r
-       case CZ80_IFF2: zIFF2 = val; break;\r
+       case CZ80_IFF1: zIFF1 = val ? (1 << 2) : 0; break;\r
+       case CZ80_IFF2: zIFF2 = val ? (1 << 2) : 0; break;\r
        case CZ80_HALT: CPU->HaltState = val; break;\r
        case CZ80_IRQ:  CPU->IRQState = val; break;\r
        default: break;\r
@@ -403,7 +407,7 @@ void Cz80_Set_Reg(cz80_struc *CPU, INT32 regnum, UINT32 val)
        \83t\83F\83b\83`\83A\83h\83\8c\83X\90Ý\92è\r
 --------------------------------------------------------*/\r
 \r
-void Cz80_Set_Fetch(cz80_struc *CPU, UINT32 low_adr, UINT32 high_adr, UINT32 fetch_adr)\r
+void Cz80_Set_Fetch(cz80_struc *CPU, UINT32 low_adr, UINT32 high_adr, FPTR fetch_adr)\r
 {\r
        int i, j;\r
 \r