basic psp snd + cz80
[picodrive.git] / cpu / cz80 / cz80macro.h
diff --git a/cpu/cz80/cz80macro.h b/cpu/cz80/cz80macro.h
new file mode 100644 (file)
index 0000000..91b49ef
--- /dev/null
@@ -0,0 +1,113 @@
+/******************************************************************************\r
+\r
+       cz80macro.h\r
+\r
+       CZ80 \8ae\8eí\83}\83N\83\8d\r
+\r
+******************************************************************************/\r
+\r
+#if CZ80_USE_JUMPTABLE\r
+#define _SSOP(A,B)                     A##B\r
+#define OP(A)                          _SSOP(OP,A)\r
+#define OPCB(A)                                _SSOP(OPCB,A)\r
+#define OPED(A)                                _SSOP(OPED,A)\r
+#define OPXY(A)                                _SSOP(OPXY,A)\r
+#define OPXYCB(A)                      _SSOP(OPXYCB,A)\r
+#else\r
+#define OP(A)                          case A\r
+#define OPCB(A)                                case A\r
+#define OPED(A)                                case A\r
+#define OPXY(A)                                case A\r
+#define OPXYCB(A)                      case A\r
+#endif\r
+\r
+#define USE_CYCLES(A)          CPU->ICount -= (A);\r
+#define ADD_CYCLES(A)          CPU->ICount += (A);\r
+\r
+#define RET(A)                         { USE_CYCLES(A) goto Cz80_Exec; }\r
+\r
+#if CZ80_ENCRYPTED_ROM\r
+\r
+#define SET_PC(A)                                                                                      \\r
+       CPU->BasePC = CPU->Fetch[(A) >> CZ80_FETCH_SFT];                \\r
+       OPBase = CPU->OPFetch[(A) >> CZ80_FETCH_SFT];                   \\r
+       PC = (A) + CPU->BasePC;\r
+\r
+#define GET_OP()                       (*(UINT8 *)(OPBase + PC))\r
+\r
+#else\r
+\r
+#define SET_PC(A)                                                                                      \\r
+       CPU->BasePC = CPU->Fetch[(A) >> CZ80_FETCH_SFT];                \\r
+       PC = (A) + CPU->BasePC;\r
+\r
+#define GET_OP()                       (*(UINT8 *)PC)\r
+\r
+#endif\r
+\r
+#define READ_OP()                      GET_OP(); PC++\r
+\r
+#define READ_ARG()                     (*(UINT8 *)PC++)\r
+#if CZ80_LITTLE_ENDIAN\r
+#define READ_ARG16()           (*(UINT8 *)PC | (*(UINT8 *)(PC + 1) << 8)); PC += 2\r
+#else\r
+#define READ_ARG16()           (*(UINT8 *)(PC + 1) | (*(UINT8 *)PC << 8)); PC += 2\r
+#endif\r
+\r
+//#ifndef BUILD_CPS1PSP\r
+//#define READ_MEM8(A)         memory_region_cpu2[(A)]\r
+//#else\r
+#define READ_MEM8(A)           CPU->Read_Byte(A)\r
+//#endif\r
+#if CZ80_LITTLE_ENDIAN\r
+#define READ_MEM16(A)          (READ_MEM8(A) | (READ_MEM8((A) + 1) << 8))\r
+#else\r
+#define READ_MEM16(A)          ((READ_MEM8(A) << 8) | READ_MEM8((A) + 1))\r
+#endif\r
+\r
+#define WRITE_MEM8(A, D)       CPU->Write_Byte(A, D);\r
+#if CZ80_LITTLE_ENDIAN\r
+#define WRITE_MEM16(A, D)      { WRITE_MEM8(A, D); WRITE_MEM8((A) + 1, (D) >> 8); }\r
+#else\r
+#define WRITE_MEM16(A, D)      { WRITE_MEM8((A) + 1, D); WRITE_MEM8(A, (D) >> 8); }\r
+#endif\r
+\r
+#define PUSH_16(A)                     { UINT32 sp; zSP -= 2; sp = zSP; WRITE_MEM16(sp, A); }\r
+#define POP_16(A)                      { UINT32 sp; sp = zSP; A = READ_MEM16(sp); zSP = sp + 2; }\r
+\r
+#define IN(A)                          CPU->IN_Port(A)\r
+#define OUT(A, D)                      CPU->OUT_Port(A, D)\r
+\r
+#define CHECK_INT                                                                                                      \\r
+       if (zIFF1)                                                                                                              \\r
+       {                                                                                                                               \\r
+               UINT32 IntVect;                                                                                         \\r
+                                                                                                                                       \\r
+               if (CPU->IRQState == HOLD_LINE)                                                         \\r
+                       CPU->IRQState = CLEAR_LINE;                                                             \\r
+                                                                                                                                       \\r
+               CPU->HaltState = 0;                                                                                     \\r
+               zIFF1 = zIFF2 = 0;                                                                                      \\r
+               IntVect = CPU->Interrupt_Callback(CPU->IRQLine);                        \\r
+                                                                                                                                       \\r
+               PUSH_16(zRealPC)                                                                                        \\r
+                                                                                                                                       \\r
+               if (zIM == 2)                                                                                           \\r
+               {                                                                                                                       \\r
+                       IntVect = (IntVect & 0xff) | (zI << 8);                                 \\r
+                       PC = READ_MEM16(IntVect);                                                               \\r
+                       CPU->ExtraCycles += 17;                                                                 \\r
+               }                                                                                                                       \\r
+               else if (zIM == 1)                                                                                      \\r
+               {                                                                                                                       \\r
+                       PC = 0x38;                                                                                              \\r
+                       CPU->ExtraCycles += 13;                                                                 \\r
+               }                                                                                                                       \\r
+               else                                                                                                            \\r
+               {                                                                                                                       \\r
+                       PC = IntVect & 0x38;                                                                    \\r
+                       CPU->ExtraCycles += 13;                                                                 \\r
+               }                                                                                                                       \\r
+                                                                                                                                       \\r
+               SET_PC(PC)                                                                                                      \\r
+       }\r