Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1814 | yogev_ezra | 1 | /*====================================================================/* |
2 | opcodes_dd_fd.c -> This file executes the DD/FD PREFIX opcodes. |
||
3 | |||
4 | The DD prefix "creates" some new instructions by changing HL to IX |
||
5 | on the opcode defined by the next byte on memory. |
||
6 | |||
7 | The FD prefix "creates" some new instructions by changing HL to IY |
||
8 | on the opcode defined by the next byte on memory. |
||
9 | |||
10 | Change the REGISTER variable to IX or HY before including this file. |
||
11 | Something like: |
||
12 | |||
13 | #define REGISTER regs->IX |
||
14 | #include "op_dd_fd.c" |
||
15 | #undef REGISTER |
||
16 | |||
17 | On this code, this REGISTER variable is used as REGISTER.W or |
||
18 | REGISTER.B.h and REGISTER.B.l ... |
||
19 | |||
20 | This program is free software; you can redistribute it and/or modify |
||
21 | it under the terms of the GNU General Public License as published by |
||
22 | the Free Software Foundation; either version 2 of the License, or |
||
23 | (at your option) any later version. |
||
24 | |||
25 | This program is distributed in the hope that it will be useful, |
||
26 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
27 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
28 | GNU General Public License for more details. |
||
29 | |||
30 | You should have received a copy of the GNU General Public License |
||
31 | along with this program; if not, write to the Free Software |
||
32 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
||
33 | |||
34 | Copyright (c) 2000 Santiago Romero Iglesias. |
||
35 | Email: sromero@escomposlinux.org |
||
36 | =====================================================================*/ |
||
37 | |||
38 | /* 8 clock cycles minimum = DD opcode = FD opcode = 4 + 4 */ |
||
39 | |||
40 | #define REG REGISTER.W |
||
41 | #define REGL REGISTER.B.l |
||
42 | #define REGH REGISTER.B.h |
||
43 | |||
44 | opcode = Z80ReadMem( r_PC ); |
||
45 | r_PC++; |
||
46 | |||
47 | switch(opcode) |
||
48 | { |
||
49 | case ADD_IXY_BC : ADD_WORD(REG, r_BC); AddCycles( 4+4+7 ); break; |
||
50 | case ADD_IXY_DE : ADD_WORD(REG, r_DE); AddCycles( 4+4+7 ); break; |
||
51 | case ADD_IXY_SP : ADD_WORD(REG, r_SP); AddCycles( 4+4+7 ); break; |
||
52 | case ADD_IXY_IXY : ADD_WORD(REG, REG); AddCycles( 4+4+7 ); break; |
||
53 | case DEC_IXY : REG--; AddCycles( 4+4+2 ); break; |
||
54 | case INC_IXY : REG++; AddCycles( 4+4 ); break; |
||
55 | |||
56 | case JP_IXY : r_PC = REG; AddCycles( 4+4 );break; |
||
57 | case LD_SP_IXY : r_SP = REG; AddCycles( 4+4+2 ); break; |
||
58 | |||
59 | case PUSH_IXY : PUSH_IXYr(); AddCycles( 4+4+3+3+1 ); break; |
||
60 | case POP_IXY : POP_IXYr(); AddCycles( 4+4+3+3 ); break; |
||
61 | |||
62 | case EX_IXY_xSP : r_meml = Z80ReadMem(r_SP); |
||
63 | r_memh = Z80ReadMem(r_SP+1); |
||
64 | Z80WriteMem( r_SP, REGL, regs ); |
||
65 | Z80WriteMem( r_SP+1, REGH, regs ); |
||
66 | REGL=r_meml; REGH=r_memh; |
||
67 | AddCycles( 4+4+3+3+3+3+3 ); break; |
||
68 | |||
69 | case LD_A_xIXY : r_A = Z80ReadMem( REG+ ((offset) Z80ReadMem(r_PC)) ); |
||
70 | r_PC++; AddCycles( 4+3+3+3+3+3 ); break; |
||
71 | case LD_B_xIXY : r_B = Z80ReadMem( REG+ ((offset) Z80ReadMem(r_PC)) ); |
||
72 | r_PC++; AddCycles( 4+3+3+3+3+3 ); break; |
||
73 | case LD_C_xIXY : r_C = Z80ReadMem( REG+ ((offset) Z80ReadMem(r_PC)) ); |
||
74 | r_PC++; AddCycles( 4+3+3+3+3+3 ); break; |
||
75 | case LD_D_xIXY : r_D = Z80ReadMem( REG+ ((offset) Z80ReadMem(r_PC)) ); |
||
76 | r_PC++; AddCycles( 4+3+3+3+3+3 ); break; |
||
77 | case LD_E_xIXY : r_E = Z80ReadMem( REG+ ((offset) Z80ReadMem(r_PC)) ); |
||
78 | r_PC++; AddCycles( 4+3+3+3+3+3 ); break; |
||
79 | |||
80 | case LD_xIXY_A : Z80WriteMem( REG+(offset)Z80ReadMem(r_PC), r_A, regs ); |
||
81 | r_PC++; AddCycles( 4+3+3+3+3+3 ); break; |
||
82 | case LD_xIXY_B : Z80WriteMem( REG+(offset)Z80ReadMem(r_PC), r_B, regs ); |
||
83 | r_PC++; AddCycles( 4+3+3+3+3+3 ); break; |
||
84 | case LD_xIXY_C : Z80WriteMem( REG+(offset)Z80ReadMem(r_PC), r_C, regs ); |
||
85 | r_PC++; AddCycles( 4+3+3+3+3+3 ); break; |
||
86 | case LD_xIXY_D : Z80WriteMem( REG+(offset)Z80ReadMem(r_PC), r_D, regs ); |
||
87 | r_PC++; AddCycles( 4+3+3+3+3+3 ); break; |
||
88 | case LD_xIXY_E : Z80WriteMem( REG+(offset)Z80ReadMem(r_PC), r_E, regs ); |
||
89 | r_PC++; AddCycles( 4+3+3+3+3+3 ); break; |
||
90 | |||
91 | case INC_xIXY : r_mem = REG+(offset)Z80ReadMem(r_PC); |
||
92 | r_PC++; |
||
93 | tmpreg.B.l = Z80ReadMem(r_mem); |
||
94 | INC(tmpreg.B.l); |
||
95 | Z80WriteMem(r_mem, tmpreg.B.l, regs ); |
||
96 | AddCycles( 4+3+3 + 3+3+3+ 3+1); break; |
||
97 | case DEC_xIXY : r_mem = REG+(offset)Z80ReadMem(r_PC); |
||
98 | r_PC++; |
||
99 | tmpreg.B.l = Z80ReadMem(r_mem); |
||
100 | DEC(tmpreg.B.l); |
||
101 | Z80WriteMem(r_mem, tmpreg.B.l, regs ); |
||
102 | AddCycles( 4+3+3 + 3+3+3+ 3+1); break; |
||
103 | |||
104 | case ADC_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC)); r_PC++; |
||
105 | ADC(r_meml); AddCycles( 4+3+3+3+3+3 ); break; |
||
106 | case SBC_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC)); |
||
107 | r_PC++; |
||
108 | SBC(r_meml); AddCycles( 4+3+3+3+3+3 ); break; |
||
109 | case ADD_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC)); |
||
110 | r_PC++; |
||
111 | ADD(r_meml); AddCycles( 4+3+3+3+3+3 ); break; |
||
112 | case SUB_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC)); |
||
113 | r_PC++; |
||
114 | SUB(r_meml); AddCycles( 4+3+3+3+3+3 ); break; |
||
115 | case AND_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC)); |
||
116 | r_PC++; |
||
117 | AND(r_meml); AddCycles( 4+3+3+3+3+3 ); break; |
||
118 | case OR_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC)); |
||
119 | r_PC++; |
||
120 | OR(r_meml); AddCycles( 4+3+3+3+3+3 ); break; |
||
121 | case XOR_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC)); |
||
122 | r_PC++; |
||
123 | XOR(r_meml); AddCycles( 4+3+3+3+3+3 ); break; |
||
124 | |||
125 | case CP_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC)); |
||
126 | r_PC++; |
||
127 | CP(r_meml); AddCycles( 4+3+3+3+3+3 ); break; |
||
128 | |||
129 | case LD_IXY_NN : REGL = Z80ReadMem(r_PC); r_PC++; |
||
130 | REGH = Z80ReadMem(r_PC); r_PC++; |
||
131 | AddCycles( 4+1+3+3+3 ); break; |
||
132 | |||
133 | case LD_xIXY_N : r_mem = REG + (offset) Z80ReadMem(r_PC); r_PC++; |
||
134 | Z80WriteMem( r_mem, Z80ReadMem(r_PC), regs ); r_PC++; |
||
135 | AddCycles( 4+3+3+3+3+3 ); break; |
||
136 | |||
137 | case LD_IXY_xNN : LOAD_rr_nn(REG); |
||
138 | AddCycles( 4+3+3+3+3+3+1 ); break; |
||
139 | |||
140 | case LD_xNN_IXY : STORE_nn_rr(REG); |
||
141 | AddCycles( 4+3+3+ 3+3+3+1 ); break; |
||
142 | |||
143 | |||
144 | /* some undocumented opcodes: may be wrong: */ |
||
145 | case LD_A_IXYh : r_A = REGH; AddCycles(4+4); break; |
||
146 | case LD_A_IXYl : r_A = REGL; AddCycles(4+4); break; |
||
147 | case LD_B_IXYh : r_B = REGH; AddCycles(4+4); break; |
||
148 | case LD_B_IXYl : r_B = REGL; AddCycles(4+4); break; |
||
149 | case LD_C_IXYh : r_C = REGH; AddCycles(4+4); break; |
||
150 | case LD_C_IXYl : r_C = REGL; AddCycles(4+4); break; |
||
151 | case LD_D_IXYh : r_D = REGH; AddCycles(4+4); break; |
||
152 | case LD_D_IXYl : r_D = REGL; AddCycles(4+4); break; |
||
153 | case LD_E_IXYh : r_E = REGH; AddCycles(4+4); break; |
||
154 | case LD_E_IXYl : r_E = REGL; AddCycles(4+4); break; |
||
155 | case LD_IXYh_A : REGH = r_A; AddCycles(4+4); break; |
||
156 | case LD_IXYh_B : REGH = r_B; AddCycles(4+4); break; |
||
157 | case LD_IXYh_C : REGH = r_C; AddCycles(4+4); break; |
||
158 | case LD_IXYh_D : REGH = r_D; AddCycles(4+4); break; |
||
159 | case LD_IXYh_E : REGH = r_E; AddCycles(4+4); break; |
||
160 | case LD_IXYh_IXYh : AddCycles(4+4); break; |
||
161 | case LD_IXYh_IXYl : REGH = REGL; AddCycles(4+4); break; |
||
162 | case LD_IXYl_A : REGL = r_A; AddCycles(4+4); break; |
||
163 | case LD_IXYl_B : REGL = r_B; AddCycles(4+4); break; |
||
164 | case LD_IXYl_C : REGL = r_C; AddCycles(4+4); break; |
||
165 | case LD_IXYl_D : REGL = r_D; AddCycles(4+4); break; |
||
166 | case LD_IXYl_E : REGL = r_E; AddCycles(4+4); break; |
||
167 | case LD_IXYl_IXYh : REGL = REGH; AddCycles(4+4); break; |
||
168 | case LD_IXYl_IXYl : AddCycles(4+4); break; |
||
169 | case LD_IXYh_N : REGH = Z80ReadMem(r_PC); r_PC++; |
||
170 | AddCycles(4+4+3); break; |
||
171 | case LD_IXYl_N : REGL = Z80ReadMem(r_PC); r_PC++; |
||
172 | AddCycles(4+4+3); break; |
||
173 | |||
174 | |||
175 | case ADD_IXYh : ADD(REGH); AddCycles(4+4); break; |
||
176 | case ADD_IXYl : ADD(REGL); AddCycles(4+4); break; |
||
177 | case ADC_IXYh : ADC(REGH); AddCycles(4+4); break; |
||
178 | case ADC_IXYl : ADC(REGL); AddCycles(4+4); break; |
||
179 | case SUB_IXYh : SUB(REGH); AddCycles(4+4); break; |
||
180 | case SUB_IXYl : SUB(REGL); AddCycles(4+4); break; |
||
181 | case SBC_IXYh : SBC(REGH); AddCycles(4+4); break; |
||
182 | case SBC_IXYl : SBC(REGL); AddCycles(4+4); break; |
||
183 | case AND_IXYh : AND(REGH); AddCycles(4+4); break; |
||
184 | case AND_IXYl : AND(REGL); AddCycles(4+4); break; |
||
185 | case XOR_IXYh : XOR(REGH); AddCycles(4+4); break; |
||
186 | case XOR_IXYl : XOR(REGL); AddCycles(4+4); break; |
||
187 | case OR_IXYh : OR(REGH); AddCycles(4+4); break; |
||
188 | case OR_IXYl : OR(REGL); AddCycles(4+4); break; |
||
189 | case CP_IXYh : CP(REGH); AddCycles(4+4); break; |
||
190 | case CP_IXYl : CP(REGL); AddCycles(4+4); break; |
||
191 | case INC_IXYh : INC(REGH); AddCycles(4+4); break; |
||
192 | case INC_IXYl : INC(REGL); AddCycles(4+4); break; |
||
193 | case DEC_IXYh : DEC(REGH); AddCycles(4+4); break; |
||
194 | case DEC_IXYl : DEC(REGL); AddCycles(4+4); break; |
||
195 | |||
196 | case LD_xIXY_H : r_meml =Z80ReadMem(r_PC); r_PC++; |
||
197 | Z80WriteMem( REG+(offset)(r_meml), r_H, regs ); |
||
198 | AddCycles( 4+3+3+3+3+3 ); break; |
||
199 | case LD_xIXY_L : r_meml =Z80ReadMem(r_PC); r_PC++; |
||
200 | Z80WriteMem( REG+(offset)(r_meml), r_L, regs ); |
||
201 | AddCycles( 4+3+3+3+3+3 ); break; |
||
202 | case LD_H_xIXY : r_meml =Z80ReadMem(r_PC); r_PC++; |
||
203 | r_H = Z80ReadMem( REG+(offset)(r_meml)); |
||
204 | AddCycles( 4+3+3+3+3+3 ); break; |
||
205 | case LD_L_xIXY : r_meml =Z80ReadMem(r_PC); r_PC++; |
||
206 | r_L = Z80ReadMem( REG+(offset)(r_meml)); |
||
207 | AddCycles( 4+3+3+3+3+3 ); break; |
||
208 | |||
209 | case PREFIX_CB: |
||
210 | #include "opddfdcb.c" |
||
211 | break; |
||
212 | |||
213 | /* |
||
214 | case PREFIX_DD: |
||
215 | case PREFIX_FD: AddCycles( 4 ); |
||
216 | r_PC--; // decode it the next time :) |
||
217 | break; |
||
218 | */ |
||
219 | |||
220 | default: AddCycles( 4 ); |
||
221 | r_PC--; /* decode it the next time :) */ |
||
222 | SubR(1); |
||
223 | |||
224 | // exit(1); |
||
225 | // if( regs->DecodingErrors ) |
||
226 | // { |
||
227 | // printf("z80 core: Unknown instruction: "); |
||
228 | // if ( regs->we_are_on_ddfd == WE_ARE_ON_DD ) |
||
229 | // printf("DD "); |
||
230 | // else |
||
231 | // printf("FD "); |
||
232 | // printf("%02Xh at PC=%04Xh.\n", Z80ReadMem(r_PC-1), r_PC-2 ); |
||
233 | // } |
||
234 | break; |
||
235 | } |
||
236 | |||
237 | #undef REG |
||
238 | #undef REGL |
||
239 | #undef REGH |