improve 64bit portability
[picodrive.git] / cpu / cz80 / cz80macro.h
1 /******************************************************************************\r
2 \r
3         cz80macro.h\r
4 \r
5         CZ80 \8ae\8eí\83}\83N\83\8d\r
6 \r
7 ******************************************************************************/\r
8 \r
9 #if CZ80_USE_JUMPTABLE\r
10 #define _SSOP(A,B)                      A##B\r
11 #define OP(A)                           _SSOP(OP,A)\r
12 #define OPCB(A)                         _SSOP(OPCB,A)\r
13 #define OPED(A)                         _SSOP(OPED,A)\r
14 #define OPXY(A)                         _SSOP(OPXY,A)\r
15 #define OPXYCB(A)                       _SSOP(OPXYCB,A)\r
16 #else\r
17 #define OP(A)                           case A\r
18 #define OPCB(A)                         case A\r
19 #define OPED(A)                         case A\r
20 #define OPXY(A)                         case A\r
21 #define OPXYCB(A)                       case A\r
22 #endif\r
23 \r
24 #define USE_CYCLES(A)           CPU->ICount -= (A);\r
25 #define ADD_CYCLES(A)           CPU->ICount += (A);\r
26 \r
27 #define RET(A)                          { USE_CYCLES(A) goto Cz80_Exec; }\r
28 \r
29 #if CZ80_ENCRYPTED_ROM\r
30 \r
31 #define SET_PC(A)                                                                                       \\r
32         CPU->BasePC = CPU->Fetch[(A) >> CZ80_FETCH_SFT];                \\r
33         OPBase = CPU->OPFetch[(A) >> CZ80_FETCH_SFT];                   \\r
34         PC = (A) + CPU->BasePC;\r
35 \r
36 #define GET_OP()                        (*(UINT8 *)(OPBase + PC))\r
37 \r
38 #else\r
39 \r
40 #define SET_PC(A)                                                                                       \\r
41         CPU->BasePC = CPU->Fetch[(A) >> CZ80_FETCH_SFT];                \\r
42         PC = (A) + CPU->BasePC;\r
43 \r
44 #define GET_OP()                        (*(UINT8 *)PC)\r
45 \r
46 #endif\r
47 \r
48 #define READ_OP()                       GET_OP(); PC++\r
49 \r
50 #define READ_ARG()                      (*(UINT8 *)PC++)\r
51 #if CZ80_LITTLE_ENDIAN\r
52 #define READ_ARG16()            (*(UINT8 *)PC | (*(UINT8 *)(PC + 1) << 8)); PC += 2\r
53 #else\r
54 #define READ_ARG16()            (*(UINT8 *)(PC + 1) | (*(UINT8 *)PC << 8)); PC += 2\r
55 #endif\r
56 \r
57 //#ifndef BUILD_CPS1PSP\r
58 //#define READ_MEM8(A)          memory_region_cpu2[(A)]\r
59 //#else\r
60 #if PICODRIVE_HACKS\r
61 #define READ_MEM8(A)            picodrive_read(A)\r
62 #else\r
63 #define READ_MEM8(A)            CPU->Read_Byte(A)\r
64 #endif\r
65 //#endif\r
66 #if CZ80_LITTLE_ENDIAN\r
67 #define READ_MEM16(A)           (READ_MEM8(A) | (READ_MEM8((A) + 1) << 8))\r
68 #else\r
69 #define READ_MEM16(A)           ((READ_MEM8(A) << 8) | READ_MEM8((A) + 1))\r
70 #endif\r
71 \r
72 #if PICODRIVE_HACKS\r
73 #define WRITE_MEM8(A, D) { \\r
74         unsigned short a = A; \\r
75         unsigned char d = D; \\r
76         uptr v = z80_write_map[a >> Z80_MEM_SHIFT]; \\r
77         if (map_flag_set(v)) \\r
78                 ((z80_write_f *)(v << 1))(a, d); \\r
79         else \\r
80                 *(unsigned char *)((v << 1) + a) = d; \\r
81 }\r
82 #else\r
83 #define WRITE_MEM8(A, D)        CPU->Write_Byte(A, D);\r
84 #endif\r
85 #if CZ80_LITTLE_ENDIAN\r
86 #define WRITE_MEM16(A, D)       { WRITE_MEM8(A, D); WRITE_MEM8((A) + 1, (D) >> 8); }\r
87 #else\r
88 #define WRITE_MEM16(A, D)       { WRITE_MEM8((A) + 1, D); WRITE_MEM8(A, (D) >> 8); }\r
89 #endif\r
90 \r
91 #define PUSH_16(A)                      { UINT32 sp; zSP -= 2; sp = zSP; WRITE_MEM16(sp, A); }\r
92 #define POP_16(A)                       { UINT32 sp; sp = zSP; A = READ_MEM16(sp); zSP = sp + 2; }\r
93 \r
94 #define IN(A)                           CPU->IN_Port(A)\r
95 #define OUT(A, D)                       CPU->OUT_Port(A, D)\r
96 \r
97 #define CHECK_INT                                                                                                       \\r
98         if (zIFF1)                                                                                                              \\r
99         {                                                                                                                               \\r
100                 UINT32 IntVect;                                                                                         \\r
101                                                                                                                                         \\r
102                 if (CPU->IRQState == HOLD_LINE)                                                         \\r
103                         CPU->IRQState = CLEAR_LINE;                                                             \\r
104                                                                                                                                         \\r
105                 CPU->HaltState = 0;                                                                                     \\r
106                 zIFF1 = zIFF2 = 0;                                                                                      \\r
107                 IntVect = CPU->Interrupt_Callback(CPU->IRQLine);                        \\r
108                                                                                                                                         \\r
109                 PUSH_16(zRealPC)                                                                                        \\r
110                                                                                                                                         \\r
111                 if (zIM == 2)                                                                                           \\r
112                 {                                                                                                                       \\r
113                         IntVect = (IntVect & 0xff) | (zI << 8);                                 \\r
114                         PC = READ_MEM16(IntVect);                                                               \\r
115                         CPU->ExtraCycles += 17;                                                                 \\r
116                 }                                                                                                                       \\r
117                 else if (zIM == 1)                                                                                      \\r
118                 {                                                                                                                       \\r
119                         PC = 0x38;                                                                                              \\r
120                         CPU->ExtraCycles += 13;                                                                 \\r
121                 }                                                                                                                       \\r
122                 else                                                                                                            \\r
123                 {                                                                                                                       \\r
124                         PC = IntVect & 0x38;                                                                    \\r
125                         CPU->ExtraCycles += 13;                                                                 \\r
126                 }                                                                                                                       \\r
127                                                                                                                                         \\r
128                 SET_PC(PC)                                                                                                      \\r
129         }\r