diff options
Diffstat (limited to 'apps/plugins/rockboy/dynarec.c')
-rw-r--r-- | apps/plugins/rockboy/dynarec.c | 1946 |
1 files changed, 1439 insertions, 507 deletions
diff --git a/apps/plugins/rockboy/dynarec.c b/apps/plugins/rockboy/dynarec.c index 6d424a047f..6ab1ec79b4 100644 --- a/apps/plugins/rockboy/dynarec.c +++ b/apps/plugins/rockboy/dynarec.c | |||
@@ -1,5 +1,3 @@ | |||
1 | #ifdef DYNAREC | ||
2 | #include <system.h> | ||
3 | #include "rockmacros.h" | 1 | #include "rockmacros.h" |
4 | #include "defs.h" | 2 | #include "defs.h" |
5 | #include "regs.h" | 3 | #include "regs.h" |
@@ -58,10 +56,10 @@ int blockclen; | |||
58 | DYNA_MOVEM(3,0x3FE,1); | 56 | DYNA_MOVEM(3,0x3FE,1); |
59 | 57 | ||
60 | /* | 58 | /* |
61 | * SUBQ 2, %a0 // decrease gb sp | 59 | * SUBQ 2, %a0 decrease gb sp |
62 | * PEA #(n) // push n | 60 | * PEA #(n) push n |
63 | * PUSH %a0 // push gb sp | 61 | * PUSH %a0 push gb sp |
64 | * call_native writew(SP, (n) | 62 | * call_native writew(SP, (n)) |
65 | * ADDQ 8, %a7 | 63 | * ADDQ 8, %a7 |
66 | */ | 64 | */ |
67 | #define PUSH(n) \ | 65 | #define PUSH(n) \ |
@@ -72,7 +70,7 @@ int blockclen; | |||
72 | DYNA_ADDQ_l_i_to_r(0,7,1); | 70 | DYNA_ADDQ_l_i_to_r(0,7,1); |
73 | 71 | ||
74 | /* | 72 | /* |
75 | * PUSH %a0 // push gb sp | 73 | * PUSH %a0 push gb sp |
76 | * call_native readw(SP); | 74 | * call_native readw(SP); |
77 | * addq 4, a7 | 75 | * addq 4, a7 |
78 | * addq 2, a0 | 76 | * addq 2, a0 |
@@ -133,21 +131,24 @@ int blockclen; | |||
133 | DYNA_ANDI_l_i_to_r(0xFF,1); | 131 | DYNA_ANDI_l_i_to_r(0xFF,1); |
134 | 132 | ||
135 | 133 | ||
136 | void DYNA_MOVE_b_r_to_r(un8 src,un8 dest) { | 134 | void DYNA_MOVE_b_r_to_r(un8 src,un8 dest) |
135 | { | ||
137 | DWRITEW(0x1000|(src&0x7)|(dest&0x7)<<9); | 136 | DWRITEW(0x1000|(src&0x7)|(dest&0x7)<<9); |
138 | } | 137 | } |
139 | 138 | ||
140 | void DYNA_ASHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { | 139 | void DYNA_ASHIFT_l(un8 src, un8 dest, int left, int src_is_reg) |
140 | { | ||
141 | unsigned short opcode; | 141 | unsigned short opcode; |
142 | opcode=(0xE080)|((src&0x7)<<9)|(dest&0x7); | 142 | opcode=(0xE080)|((src&0x7)<<9)|(dest&0x7); |
143 | if(left) | 143 | if(left) |
144 | opcode|=0x100; | 144 | opcode|=0x100; |
145 | if(src_is_reg) | 145 | if(src_is_reg) |
146 | opcode|=0x20; | 146 | opcode|=0x20; |
147 | DWRITEW(opcode); | 147 | DWRITEW(opcode); |
148 | } | 148 | } |
149 | 149 | ||
150 | void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { | 150 | void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) |
151 | { | ||
151 | unsigned short opcode=0xE088|((src&0x7)<<9)|(dest&0x7); | 152 | unsigned short opcode=0xE088|((src&0x7)<<9)|(dest&0x7); |
152 | if(left) | 153 | if(left) |
153 | opcode|=0x100; | 154 | opcode|=0x100; |
@@ -156,63 +157,74 @@ void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { | |||
156 | DWRITEW(opcode); | 157 | DWRITEW(opcode); |
157 | } | 158 | } |
158 | 159 | ||
159 | void DYNA_MOVE_l_i_to_r(un32 imm, un8 dest) { | 160 | void DYNA_MOVE_l_i_to_r(un32 imm, un8 dest) |
161 | { | ||
160 | DWRITEW(0x203C|(dest&0x7)<<9); | 162 | DWRITEW(0x203C|(dest&0x7)<<9); |
161 | DWRITEL(imm); // endianness? | 163 | DWRITEL(imm); /* endianness? */ |
162 | } | 164 | } |
163 | 165 | ||
164 | void DYNA_MOVE_l_i_to_m(un32 imm, un8 dest_a) { | 166 | void DYNA_MOVE_l_i_to_m(un32 imm, un8 dest_a) |
167 | { | ||
165 | DWRITEW(0x20FC|((dest_a&0x7)<<9)); | 168 | DWRITEW(0x20FC|((dest_a&0x7)<<9)); |
166 | DWRITEL(imm); | 169 | DWRITEL(imm); |
167 | } | 170 | } |
168 | 171 | ||
169 | void DYNA_MOVE_l_r_to_m(un8 src,un8 dest_a) { | 172 | void DYNA_MOVE_l_r_to_m(un8 src,un8 dest_a) |
173 | { | ||
170 | DWRITEW(0x2080|(dest_a&0x7)<<9|(src&0x7)); | 174 | DWRITEW(0x2080|(dest_a&0x7)<<9|(src&0x7)); |
171 | } | 175 | } |
172 | 176 | ||
173 | void DYNA_MOVE_l_r_to_r(un8 src, un8 dest, int src_is_areg) { | 177 | void DYNA_MOVE_l_r_to_r(un8 src, un8 dest, int src_is_areg) |
178 | { | ||
174 | unsigned short opcode=0x2000|((dest&0x7)<<9)|(src&0x7); | 179 | unsigned short opcode=0x2000|((dest&0x7)<<9)|(src&0x7); |
175 | if(src_is_areg) | 180 | if(src_is_areg) |
176 | opcode|=0x8; | 181 | opcode|=0x8; |
177 | DWRITEW(opcode); | 182 | DWRITEW(opcode); |
178 | } | 183 | } |
179 | 184 | ||
180 | void DYNA_MOVE_w_r_to_r(un8 src, un8 dest, int src_is_areg) { | 185 | void DYNA_MOVE_w_r_to_r(un8 src, un8 dest, int src_is_areg) |
186 | { | ||
181 | unsigned short opcode=0x3000|((dest&0x7)<<9)|(src&0x7); | 187 | unsigned short opcode=0x3000|((dest&0x7)<<9)|(src&0x7); |
182 | if(src_is_areg) | 188 | if(src_is_areg) |
183 | opcode|=0x8; | 189 | opcode|=0x8; |
184 | DWRITEW(opcode); | 190 | DWRITEW(opcode); |
185 | } | 191 | } |
186 | 192 | ||
187 | void DYNA_MOVEQ_l_i_to_r(un8 imm, un8 dest) { | 193 | void DYNA_MOVEQ_l_i_to_r(un8 imm, un8 dest) |
194 | { | ||
188 | DWRITEW(0x7000|((dest&0x7)<<9)|imm); | 195 | DWRITEW(0x7000|((dest&0x7)<<9)|imm); |
189 | } | 196 | } |
190 | 197 | ||
191 | void DYNA_PEA_w_i(un16 imm) { | 198 | void DYNA_PEA_w_i(un16 imm) |
199 | { | ||
192 | DWRITEW(0x4878); | 200 | DWRITEW(0x4878); |
193 | DWRITEW(imm); | 201 | DWRITEW(imm); |
194 | } | 202 | } |
195 | 203 | ||
196 | void DYNA_PUSH_l_r(un8 reg,int src_is_areg) { | 204 | void DYNA_PUSH_l_r(un8 reg,int src_is_areg) |
205 | { | ||
197 | unsigned short value= 0x2F00|(reg&0x7); | 206 | unsigned short value= 0x2F00|(reg&0x7); |
198 | if(src_is_areg) | 207 | if(src_is_areg) |
199 | value|=0x8; | 208 | value|=0x8; |
200 | DWRITEW(value); | 209 | DWRITEW(value); |
201 | } | 210 | } |
202 | 211 | ||
203 | void DYNA_MOVEA_l_i_to_r(un32 imm, un8 dest) { | 212 | void DYNA_MOVEA_l_i_to_r(un32 imm, un8 dest) |
213 | { | ||
204 | DWRITEW(0x207C|(dest&0x7)<<9); | 214 | DWRITEW(0x207C|(dest&0x7)<<9); |
205 | DWRITEL(imm); | 215 | DWRITEL(imm); |
206 | } | 216 | } |
207 | 217 | ||
208 | void DYNA_MOVEA_w_r_to_r(un8 src, un8 dest, int src_is_areg) { | 218 | void DYNA_MOVEA_w_r_to_r(un8 src, un8 dest, int src_is_areg) |
219 | { | ||
209 | unsigned short value=0x3040|((dest&0x7)<<9)|(src&0x7); | 220 | unsigned short value=0x3040|((dest&0x7)<<9)|(src&0x7); |
210 | if(src_is_areg) | 221 | if(src_is_areg) |
211 | value|=0x8; | 222 | value|=0x8; |
212 | DWRITEW(value); | 223 | DWRITEW(value); |
213 | } | 224 | } |
214 | 225 | ||
215 | void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) { | 226 | void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) |
227 | { | ||
216 | unsigned short value=0x2040|((dest&0x7)<<9)|(src&0x7); | 228 | unsigned short value=0x2040|((dest&0x7)<<9)|(src&0x7); |
217 | if(src_is_areg) | 229 | if(src_is_areg) |
218 | value|=0x8; | 230 | value|=0x8; |
@@ -220,67 +232,80 @@ void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) { | |||
220 | } | 232 | } |
221 | 233 | ||
222 | 234 | ||
223 | void DYNA_RET() { | 235 | void DYNA_RET(void) |
236 | { | ||
224 | DWRITEW(0x4E75); | 237 | DWRITEW(0x4E75); |
225 | } | 238 | } |
226 | 239 | ||
227 | void DYNA_AND_l_i_to_r(un32 imm, un8 dest) { | 240 | void DYNA_AND_l_i_to_r(un32 imm, un8 dest) |
241 | { | ||
228 | DWRITEW(0x0280|(dest&0x7)); | 242 | DWRITEW(0x0280|(dest&0x7)); |
229 | DWRITEL(imm); | 243 | DWRITEL(imm); |
230 | } | 244 | } |
231 | 245 | ||
232 | void DYNA_AND_l_r_to_r(un8 src,un8 dest) { | 246 | void DYNA_AND_l_r_to_r(un8 src,un8 dest) |
247 | { | ||
233 | DWRITEW(0xC080|((dest&0x7)<<9)|(src&0x7)); | 248 | DWRITEW(0xC080|((dest&0x7)<<9)|(src&0x7)); |
234 | } | 249 | } |
235 | 250 | ||
236 | void DYNA_OR_l_r_to_r(un8 src,un8 dest) { | 251 | void DYNA_OR_l_r_to_r(un8 src,un8 dest) |
252 | { | ||
237 | DWRITEW(0x8080|((dest&0x7)<<9)|(src&0x7)); | 253 | DWRITEW(0x8080|((dest&0x7)<<9)|(src&0x7)); |
238 | } | 254 | } |
239 | 255 | ||
240 | void DYNA_OR_l_i_to_r(un32 imm,un8 dest) { | 256 | void DYNA_OR_l_i_to_r(un32 imm,un8 dest) |
257 | { | ||
241 | DWRITEW(0x0080|(dest&0x7)); | 258 | DWRITEW(0x0080|(dest&0x7)); |
242 | DWRITEL(imm); | 259 | DWRITEL(imm); |
243 | } | 260 | } |
244 | 261 | ||
245 | void DYNA_CLR_l_m(un32 addr) { | 262 | void DYNA_CLR_l_m(un32 addr) |
263 | { | ||
246 | DWRITEW(0x42B9); | 264 | DWRITEW(0x42B9); |
247 | DWRITEL(addr); | 265 | DWRITEL(addr); |
248 | } | 266 | } |
249 | 267 | ||
250 | void DYNA_CLR_l_r(un8 reg) { | 268 | void DYNA_CLR_l_r(un8 reg) |
269 | { | ||
251 | DWRITEW(0x4280|(reg&0x7)); | 270 | DWRITEW(0x4280|(reg&0x7)); |
252 | } | 271 | } |
253 | 272 | ||
254 | void DYNA_CLR_w_r(un8 reg) { | 273 | void DYNA_CLR_w_r(un8 reg) |
274 | { | ||
255 | DWRITEW(0x42C0|(reg&0x7)); | 275 | DWRITEW(0x42C0|(reg&0x7)); |
256 | } | 276 | } |
257 | 277 | ||
258 | 278 | ||
259 | void DYNA_CLR_b_r(un8 reg) { | 279 | void DYNA_CLR_b_r(un8 reg) |
280 | { | ||
260 | DWRITEW(0x4200|(reg&0x7)); | 281 | DWRITEW(0x4200|(reg&0x7)); |
261 | } | 282 | } |
262 | 283 | ||
263 | 284 | ||
264 | void DYNA_ADDQ_l_i_to_r(un8 imm, un8 reg, int dest_is_a) { | 285 | void DYNA_ADDQ_l_i_to_r(un8 imm, un8 reg, int dest_is_a) |
286 | { | ||
265 | unsigned short value=0x5080|(imm&0x7)<<9|(reg&0x7); | 287 | unsigned short value=0x5080|(imm&0x7)<<9|(reg&0x7); |
266 | if(dest_is_a) | 288 | if(dest_is_a) |
267 | value|=0x8; | 289 | value|=0x8; |
268 | DWRITEW(value); | 290 | DWRITEW(value); |
269 | } | 291 | } |
270 | 292 | ||
271 | void DYNA_ADD_l_r_to_r(un8 src, un8 dest, int src_is_areg) { | 293 | void DYNA_ADD_l_r_to_r(un8 src, un8 dest, int src_is_areg) |
294 | { | ||
272 | unsigned short value=0xD080|((dest&0x7)<<9)|(src&0x7); | 295 | unsigned short value=0xD080|((dest&0x7)<<9)|(src&0x7); |
273 | if(src_is_areg) | 296 | if(src_is_areg) |
274 | value|=0x8; | 297 | value|=0x8; |
275 | DWRITEW(value); | 298 | DWRITEW(value); |
276 | } | 299 | } |
277 | 300 | ||
278 | void DYNA_JSR(void *addr) { | 301 | void DYNA_JSR(void *addr) |
302 | { | ||
279 | DWRITEW(0x4EB9); | 303 | DWRITEW(0x4EB9); |
280 | DWRITEL(addr); | 304 | DWRITEL(addr); |
281 | } | 305 | } |
282 | 306 | ||
283 | void DYNA_MOVEM(un8 areg,un16 mask, int frommem) { | 307 | void DYNA_MOVEM(un8 areg,un16 mask, int frommem) |
308 | { | ||
284 | unsigned short value=0x48D0|(areg&0x7); | 309 | unsigned short value=0x48D0|(areg&0x7); |
285 | if(frommem) | 310 | if(frommem) |
286 | value|=0x400; | 311 | value|=0x400; |
@@ -288,27 +313,32 @@ void DYNA_MOVEM(un8 areg,un16 mask, int frommem) { | |||
288 | DWRITEW(mask); | 313 | DWRITEW(mask); |
289 | } | 314 | } |
290 | 315 | ||
291 | void DYNA_SUBQ_l_i_to_r(un8 imm, un8 reg, int addr_reg) { | 316 | void DYNA_SUBQ_l_i_to_r(un8 imm, un8 reg, int addr_reg) |
317 | { | ||
292 | unsigned short value=0x5180|(reg&0x7)|((imm&0x7)<<9); | 318 | unsigned short value=0x5180|(reg&0x7)|((imm&0x7)<<9); |
293 | if(addr_reg) | 319 | if(addr_reg) |
294 | value|=0x8; | 320 | value|=0x8; |
295 | DWRITEW(value); | 321 | DWRITEW(value); |
296 | } | 322 | } |
297 | 323 | ||
298 | void DYNA_SUB_l_r_to_r(un8 src, un8 dest, int is_areg) { | 324 | void DYNA_SUB_l_r_to_r(un8 src, un8 dest, int is_areg) |
325 | { | ||
299 | unsigned short value=0x9080|((dest&0x7)<<9)|(src&0x7); | 326 | unsigned short value=0x9080|((dest&0x7)<<9)|(src&0x7); |
300 | if(is_areg) | 327 | if(is_areg) |
301 | value|=0x8; | 328 | value|=0x8; |
302 | DWRITEW(value); | 329 | DWRITEW(value); |
303 | } | 330 | } |
304 | 331 | ||
305 | void DYNA_EXT_l(un8 reg) { | 332 | void DYNA_EXT_l(un8 reg) |
333 | { | ||
306 | DWRITEW(0x48C0|(reg&0x7)); | 334 | DWRITEW(0x48C0|(reg&0x7)); |
307 | } | 335 | } |
308 | 336 | ||
309 | void DYNA_BCC_c(un8 cond, int size,int i) { | 337 | void DYNA_BCC_c(un8 cond, int size,int i) |
338 | { | ||
310 | un32 displace=dynapointer-branchp[i]; | 339 | un32 displace=dynapointer-branchp[i]; |
311 | if(!branchp[i]) { | 340 | if(!branchp[i]) |
341 | { | ||
312 | die("Dynarec error! BCC trying to write branch without dummy"); | 342 | die("Dynarec error! BCC trying to write branch without dummy"); |
313 | return; | 343 | return; |
314 | } | 344 | } |
@@ -316,7 +346,8 @@ void DYNA_BCC_c(un8 cond, int size,int i) { | |||
316 | die("Dynarec error! BCC invalid displacement"); | 346 | die("Dynarec error! BCC invalid displacement"); |
317 | else if(displace>0&&displace<0x7F) | 347 | else if(displace>0&&displace<0x7F) |
318 | *( (unsigned short *) branchp[i])=0x6000|((cond&0xF)<<8)|(displace&0xFF); | 348 | *( (unsigned short *) branchp[i])=0x6000|((cond&0xF)<<8)|(displace&0xFF); |
319 | else if(displace>0x7F&&displace<0x7FFF) { | 349 | else if(displace>0x7F&&displace<0x7FFF) |
350 | { | ||
320 | *( (unsigned short *) branchp[i])=0x6000|((cond&0xF)<<8); | 351 | *( (unsigned short *) branchp[i])=0x6000|((cond&0xF)<<8); |
321 | branchp[i]+=2; | 352 | branchp[i]+=2; |
322 | *( (unsigned short *) branchp[i])=displace; | 353 | *( (unsigned short *) branchp[i])=displace; |
@@ -327,19 +358,22 @@ void DYNA_BCC_c(un8 cond, int size,int i) { | |||
327 | branchp[i]=0; | 358 | branchp[i]=0; |
328 | } | 359 | } |
329 | 360 | ||
330 | void DYNA_DUMMYBRANCH(int size,int i) { | 361 | void DYNA_DUMMYBRANCH(int size,int i) |
362 | { | ||
331 | branchp[i]=dynapointer; | 363 | branchp[i]=dynapointer; |
332 | dynapointer+=size; | 364 | dynapointer+=size; |
333 | } | 365 | } |
334 | 366 | ||
335 | void DYNA_TST_l_r(un8 reg,int is_areg) { | 367 | void DYNA_TST_l_r(un8 reg,int is_areg) |
368 | { | ||
336 | unsigned short opcode=0x4A80|(reg&0x7); | 369 | unsigned short opcode=0x4A80|(reg&0x7); |
337 | if(is_areg) | 370 | if(is_areg) |
338 | opcode|=0x8; | 371 | opcode|=0x8; |
339 | DWRITEW(opcode); | 372 | DWRITEW(opcode); |
340 | } | 373 | } |
341 | 374 | ||
342 | void DYNA_TST_b_r(un8 reg,int is_areg) { | 375 | void DYNA_TST_b_r(un8 reg,int is_areg) |
376 | { | ||
343 | unsigned short opcode=0x4A00|(reg&0x7); | 377 | unsigned short opcode=0x4A00|(reg&0x7); |
344 | if(is_areg) | 378 | if(is_areg) |
345 | opcode|=0x8; | 379 | opcode|=0x8; |
@@ -347,33 +381,40 @@ void DYNA_TST_b_r(un8 reg,int is_areg) { | |||
347 | } | 381 | } |
348 | 382 | ||
349 | 383 | ||
350 | void DYNA_BTST_l_r(un8 bit, un8 reg) { | 384 | void DYNA_BTST_l_r(un8 bit, un8 reg) |
385 | { | ||
351 | DWRITEW(0x0800|(reg&0x7)); | 386 | DWRITEW(0x0800|(reg&0x7)); |
352 | DWRITEW(bit); | 387 | DWRITEW(bit); |
353 | } | 388 | } |
354 | 389 | ||
355 | void DYNA_NEG_l(un8 reg) { | 390 | void DYNA_NEG_l(un8 reg) |
391 | { | ||
356 | DWRITEW(0x4480|(reg&0x7)); | 392 | DWRITEW(0x4480|(reg&0x7)); |
357 | } | 393 | } |
358 | 394 | ||
359 | void DYNA_XOR_l_r_to_r(un8 src, un8 dest) { | 395 | void DYNA_XOR_l_r_to_r(un8 src, un8 dest) |
396 | { | ||
360 | DWRITEW(0xB180|((dest&0x7)<<9)|(src&0x7)); | 397 | DWRITEW(0xB180|((dest&0x7)<<9)|(src&0x7)); |
361 | } | 398 | } |
362 | 399 | ||
363 | void DYNA_SET_b_r(un8 src, un8 cond) { | 400 | void DYNA_SET_b_r(un8 src, un8 cond) |
401 | { | ||
364 | DWRITEW(0x50C0|((cond)&0xF)<<8|(src&0x7)); | 402 | DWRITEW(0x50C0|((cond)&0xF)<<8|(src&0x7)); |
365 | } | 403 | } |
366 | 404 | ||
367 | void DYNA_INC_l_r(un8 dest,int is_areg) { | 405 | void DYNA_INC_l_r(un8 dest,int is_areg) |
406 | { | ||
368 | DYNA_ADDQ_l_i_to_r(1,dest,is_areg); | 407 | DYNA_ADDQ_l_i_to_r(1,dest,is_areg); |
369 | } | 408 | } |
370 | 409 | ||
371 | void DYNA_DEC_l_r(un8 dest,int is_areg) { | 410 | void DYNA_DEC_l_r(un8 dest,int is_areg) |
411 | { | ||
372 | DYNA_SUBQ_l_i_to_r(1,dest,is_areg); | 412 | DYNA_SUBQ_l_i_to_r(1,dest,is_areg); |
373 | } | 413 | } |
374 | 414 | ||
375 | 415 | ||
376 | void dynamic_recompile (struct dynarec_block *newblock) { | 416 | void dynamic_recompile (struct dynarec_block *newblock) |
417 | { | ||
377 | int done=0,writepc=1,fd; | 418 | int done=0,writepc=1,fd; |
378 | byte op; | 419 | byte op; |
379 | unsigned int oldpc=PC; | 420 | unsigned int oldpc=PC; |
@@ -385,581 +426,1472 @@ void dynamic_recompile (struct dynarec_block *newblock) { | |||
385 | #ifdef DYNA_DEBUG | 426 | #ifdef DYNA_DEBUG |
386 | snprintf(meow,499,"/dyna_0x%x_asm.rb",PC); | 427 | snprintf(meow,499,"/dyna_0x%x_asm.rb",PC); |
387 | fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); | 428 | fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); |
388 | if(fd<0) { | 429 | if(fd<0) |
389 | die("couldn't open dyna debug file"); | 430 | { |
431 | die("couldn't open dyna debug file"); | ||
390 | return; | 432 | return; |
391 | } | 433 | } |
392 | #endif | 434 | #endif |
393 | snprintf(meow,499,"Recompiling 0x%x",oldpc); | 435 | snprintf(meow,499,"Recompiling 0x%x",oldpc); |
394 | rb->splash(HZ*1,1,meow); | 436 | rb->splash(HZ*1,1,meow); |
395 | while(!done) { | 437 | while(!done) |
438 | { | ||
439 | #ifdef DYNA_DEBUG | ||
440 | fdprintf(fd,"0x%x: ",PC); | ||
441 | #endif | ||
442 | op=FETCH; | ||
443 | clen = cycles_table[op]; | ||
444 | tclen+=clen; | ||
445 | switch(op) { | ||
446 | case 0x00: /* NOP */ | ||
447 | break; | ||
448 | case 0x01: /* LD BC,imm */ | ||
449 | /* warning (do we have endianness right?) */ | ||
450 | #ifdef DYNA_DEBUG | ||
451 | fdprintf(fd,"LD BC,#0x%x\n",readw(xPC)); | ||
452 | #endif | ||
453 | temp=readw(xPC); | ||
454 | DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,2); | ||
455 | DYNA_MOVEQ_l_i_to_r(temp&0xFF,3); | ||
456 | PC+=2; | ||
457 | break; | ||
458 | case 0x02: /* LD (BC),A */ | ||
396 | #ifdef DYNA_DEBUG | 459 | #ifdef DYNA_DEBUG |
397 | fdprintf(fd,"0x%x: ",PC); | 460 | fdprintf(fd, "LD (BC),A\n"); |
398 | #endif | 461 | #endif |
399 | op=FETCH; | 462 | break; /* FIXME: Implement */ |
400 | clen = cycles_table[op]; | 463 | case 0x03: /* INC BC */ |
401 | tclen+=clen; | 464 | #ifdef DYNA_DEBUG |
402 | switch(op) { | 465 | fdprintf(fd, "INC BC\n"); |
403 | case 0x00: /* NOP */ | 466 | #endif |
404 | case 0x40: /* LD B,B */ | 467 | break; /* FIXME: Implement */ |
405 | case 0x49: /* LD C,C */ | 468 | case 0x04: /* INC B */ |
406 | case 0x52: /* LD D,D */ | 469 | #ifdef DYNA_DEBUG |
407 | case 0x5B: /* LD E,E */ | 470 | fdprintf(fd, "INC B\n"); |
408 | case 0x64: /* LD H,H */ | 471 | #endif |
409 | case 0x6D: /* LD L,L */ | 472 | DYNA_INC_l_r(2,0); /* Is this right? */ |
410 | case 0x7F: /* LD A,A */ | 473 | break; |
411 | break; | 474 | case 0x05: /* DEC B */ |
412 | 475 | #ifdef DYNA_DEBUG | |
413 | case 0x0B: /* DEC BC* | 476 | fdprintf(fd, "DEC B\n"); |
477 | #endif | ||
478 | DYNA_DEC_l_r(2,0); /* Is this right? */ | ||
479 | break; | ||
480 | case 0x06: /* LD B,imm */ | ||
481 | #ifdef DYNA_DEBUG | ||
482 | fdprintf(fd,"LD B,#0x%x\n",readb(xPC)); | ||
483 | #endif | ||
484 | DYNA_MOVEQ_l_i_to_r(FETCH,2); | ||
485 | break; | ||
486 | case 0x07: /* RLCA */ | ||
487 | #ifdef DYNA_DEBUG | ||
488 | fdprintf(fd, "RLCA\n"); | ||
489 | #endif | ||
490 | break; /* FIXME: Implement */ | ||
491 | case 0x08: /* LD imm,SP */ | ||
492 | #ifdef DYNA_DEBUG | ||
493 | fdprintf(fd, "LD imm,SP\n"); | ||
494 | #endif | ||
495 | break; /* FIXME: Implement */ | ||
496 | case 0x09: /* ADD HL,BC */ | ||
497 | #ifdef DYNA_DEBUG | ||
498 | fdprintf(fd, "ADD HL,BC\n"); | ||
499 | #endif | ||
500 | break; /* FIXME: Implement */ | ||
501 | case 0x0A: /* LD A,(BC) */ | ||
502 | #ifdef DYNA_DEBUG | ||
503 | fdprintf(fd, "LD A,(BC)\n"); | ||
504 | #endif | ||
505 | break; /* FIXME: Implement */ | ||
506 | case 0x0B: /* DEC BC */ | ||
507 | #ifdef DYNA_DEBUG | ||
508 | fdprintf(fd,"DEC BC\n"); | ||
509 | #endif | ||
510 | DYNA_TST_b_r(3,0); /* test C */ | ||
511 | DYNA_DUMMYBRANCH(2,0); | ||
512 | DYNA_DEC_l_r(2,0); /* dec B */ | ||
513 | DYNA_BCC_c(0x6,2,0); /* jump here if not zero */ | ||
514 | DYNA_DEC_l_r(3,0); /* dec C */ | ||
515 | break; | ||
516 | case 0x0C: /* INC C */ | ||
517 | #ifdef DYNA_DEBUG | ||
518 | fdprintf(fd, "INC C\n"); | ||
519 | #endif | ||
520 | DYNA_INC_l_r(3,0); /* Is this right? */ | ||
521 | break; | ||
522 | case 0x0D: /* DEC C */ | ||
523 | #ifdef DYNA_DEBUG | ||
524 | fdprintf(fd, "DEC C\n"); | ||
525 | #endif | ||
526 | DYNA_DEC_l_r(3,0); /* Is this right? */ | ||
527 | break; | ||
528 | case 0x0E: /* LD C,imm */ | ||
529 | #ifdef DYNA_DEBUG | ||
530 | fdprintf(fd,"LD C,#0x%x\n",readb(xPC)); | ||
531 | #endif | ||
532 | DYNA_MOVEQ_l_i_to_r(FETCH,3); | ||
533 | break; | ||
534 | case 0x0F: /* RRCA */ | ||
535 | #ifdef DYNA_DEBUG | ||
536 | fdprintf(fd, "RRCA\n"); | ||
537 | #endif | ||
538 | break; /* FIXME: Implement */ | ||
539 | case 0x10: /* STOP */ | ||
540 | #ifdef DYNA_DEBUG | ||
541 | fdprintf(fd, "STOP\n"); | ||
542 | #endif | ||
543 | break; /* FIXME: Implement */ | ||
544 | case 0x11: /* LD DE,imm */ | ||
545 | #ifdef DYNA_DEBUG | ||
546 | fdprintf(fd,"LD DE,#0x%x\n",readw(xPC)); | ||
547 | #endif | ||
548 | temp=readw(xPC); | ||
549 | DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,4); | ||
550 | DYNA_MOVEQ_l_i_to_r(temp&0xFF,5); | ||
551 | PC += 2; | ||
552 | break; | ||
553 | case 0x12: /* LD (DE),A */ | ||
554 | #ifdef DYNA_DEBUG | ||
555 | fdprintf(fd, "LD (DE),A\n"); | ||
556 | #endif | ||
557 | break; /* FIXME: Implement */ | ||
558 | case 0x13: /* INC DE */ | ||
559 | #ifdef DYNA_DEBUG | ||
560 | fdprintf(fd, "INC DE\n"); | ||
561 | #endif | ||
562 | break; /* FIXME: Implement */ | ||
563 | case 0x14: /* INC D */ | ||
564 | #ifdef DYNA_DEBUG | ||
565 | fdprintf(fd, "INC D\n"); | ||
566 | #endif | ||
567 | DYNA_INC_l_r(4,0); /* Is this right? */ | ||
568 | break; | ||
569 | case 0x15: /* DEC D */ | ||
570 | #ifdef DYNA_DEBUG | ||
571 | fdprintf(fd, "DEC D\n"); | ||
572 | #endif | ||
573 | DYNA_DEC_l_r(4,0); /* Is this right? */ | ||
574 | break; | ||
575 | case 0x16: /* LD D,imm */ | ||
576 | #ifdef DYNA_DEBUG | ||
577 | fdprintf(fd,"LD D,#0x%x\n",readb(xPC)); | ||
578 | #endif | ||
579 | DYNA_MOVEQ_l_i_to_r(FETCH,4); | ||
580 | break; | ||
581 | case 0x17: /* RLA */ | ||
582 | #ifdef DYNA_DEBUG | ||
583 | fdprintf(fd, "RLA\n"); | ||
584 | #endif | ||
585 | break; /* FIXME: Implement */ | ||
586 | case 0x18: /* JR */ | ||
587 | #ifdef DYNA_DEBUG | ||
588 | fdprintf(fd, "JR\n"); | ||
589 | #endif | ||
590 | break; /* FIXME: Implement */ | ||
591 | case 0x19: /* ADD HL,DE */ | ||
592 | #ifdef DYNA_DEBUG | ||
593 | fdprintf(fd, "ADD HL,DE\n"); | ||
594 | #endif | ||
595 | break; /* FIXME: Implement */ | ||
596 | case 0x1A: /* LD A,(DE) */ | ||
597 | #ifdef DYNA_DEBUG | ||
598 | fdprintf(fd, "LD A,(DE)\n"); | ||
599 | #endif | ||
600 | break; /* FIXME: Implement */ | ||
601 | case 0x1B: /* DEC DE */ | ||
602 | #ifdef DYNA_DEBUG | ||
603 | fdprintf(fd,"DEC DE\n"); | ||
604 | #endif | ||
605 | DYNA_TST_b_r(5,0); /* test E */ | ||
606 | DYNA_DUMMYBRANCH(4,0); | ||
607 | DYNA_DEC_l_r(4,0); /* dec D */ | ||
608 | DYNA_BCC_c(0x6,4,0); /* jump here if not zero */ | ||
609 | DYNA_DEC_l_r(5,0); /* dec E */ | ||
610 | break; | ||
611 | case 0x1C: /* INC E */ | ||
612 | #ifdef DYNA_DEBUG | ||
613 | fdprintf(fd, "INC E\n"); | ||
614 | #endif | ||
615 | DYNA_INC_l_r(5,0); /* Is this right? */ | ||
616 | break; | ||
617 | case 0x1D: /* DEC E */ | ||
618 | #ifdef DYNA_DEBUG | ||
619 | fdprintf(fd, "DEC E\n"); | ||
620 | #endif | ||
621 | DYNA_DEC_l_r(5,0); /* Is this right? */ | ||
622 | break; | ||
623 | case 0x1E: /* LD E,imm */ | ||
624 | #ifdef DYNA_DEBUG | ||
625 | fdprintf(fd,"LD E,#0x%x\n",readb(xPC)); | ||
626 | #endif | ||
627 | DYNA_MOVEQ_l_i_to_r(FETCH,5); | ||
628 | break; | ||
629 | case 0x1F: /* RRA */ | ||
630 | #ifdef DYNA_DEBUG | ||
631 | fdprintf(fd, "RRA\n"); | ||
632 | #endif | ||
633 | break; /* FIXME: Implement */ | ||
634 | case 0x20: /* JR NZ */ | ||
635 | #ifdef DYNA_DEBUG | ||
636 | fdprintf(fd,"JR NZ\n"); | ||
637 | #endif | ||
638 | DYNA_BTST_l_r(8,7); /* btst #8,d7 */ | ||
639 | DYNA_DUMMYBRANCH(2,0); | ||
640 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | ||
641 | DYNA_MOVE_l_i_to_m(tclen,3); | ||
642 | DYNA_MOVEA_l_i_to_r(PC+1+(signed char)readb(PC),1); | ||
643 | DYNA_RET(); | ||
644 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | ||
645 | tclen--; | ||
646 | PC++; | ||
647 | break; | ||
648 | case 0x21: /* LD HL,imm */ | ||
649 | #ifdef DYNA_DEBUG | ||
650 | fdprintf(fd,"LD HL,#0x%x\n",readw(xPC)); | ||
651 | #endif | ||
652 | DYNA_MOVE_l_i_to_r(readw(xPC),6); | ||
653 | PC += 2; | ||
654 | break; | ||
655 | case 0x22: /* LDI (HL), A */ | ||
656 | #ifdef DYNA_DEBUG | ||
657 | fdprintf(fd,"LDI (HL),A\n"); | ||
658 | #endif | ||
659 | /* DYNA_PUSH_l_r(1,0); | ||
660 | DYNA_PUSH_l_r(6,0); | ||
661 | CALL_NATIVE(&writeb); | ||
662 | DYNA_ADDQ_l_i_to_r(0,7,1); | ||
663 | DYNA_INC_l_r(6,0);*/ | ||
664 | break; | ||
665 | case 0x23: /* INC HL */ | ||
666 | #ifdef DYNA_DEBUG | ||
667 | fdprintf(fd, "INC HL\n"); | ||
668 | #endif | ||
669 | break; /* FIXME: Implement */ | ||
670 | case 0x24: /* INC H */ | ||
671 | #ifdef DYNA_DEBUG | ||
672 | fdprintf(fd, "INC H\n"); | ||
673 | #endif | ||
674 | break; /* FIXME: Implement */ | ||
675 | case 0x25: /* DEC H */ | ||
676 | #ifdef DYNA_DEBUG | ||
677 | fdprintf(fd, "DEC H\n"); | ||
678 | #endif | ||
679 | break; /* FIXME: Implement */ | ||
680 | case 0x26: /* LD H,imm */ | ||
681 | #ifdef DYNA_DEBUG | ||
682 | fdprintf(fd,"LD H,#0x%x\n",readb(xPC)); | ||
683 | #endif | ||
684 | DYNA_AND_l_i_to_r(0xFF,6); | ||
685 | DYNA_OR_l_i_to_r(FETCH<<8,6); | ||
686 | break; | ||
687 | case 0x27: /* DAA */ | ||
688 | #ifdef DYNA_DEBUG | ||
689 | fdprintf(fd, "DAA\n"); | ||
690 | #endif | ||
691 | break; /* FIXME: Implement */ | ||
692 | case 0x28: /* JR Z */ | ||
693 | #ifdef DYNA_DEBUG | ||
694 | fdprintf(fd, "JR Z\n"); | ||
695 | #endif | ||
696 | break; /* FIXME: Implement */ | ||
697 | case 0x29: /* ADD HL, HL */ | ||
414 | #ifdef DYNA_DEBUG | 698 | #ifdef DYNA_DEBUG |
415 | fdprintf(fd,"DEC BC\n"); | 699 | fdprintf(fd, "ADD HL,HL\n"); |
416 | #endif | 700 | #endif |
417 | DYNA_TST_b_r(3); // test C | 701 | break; /* FIXME: Implement */ |
418 | DYNA_DUMMYBRANCH(2,0); | 702 | case 0x2A: /* LD A,(HLI) */ |
419 | DYNA_DEC_l_r(2,0); // dec B | ||
420 | DYNA_BCC_c(0x6,2,0); //jump here if not zero | ||
421 | DYNA_DEC_l_r(3,0); // dec C | ||
422 | break; | ||
423 | case 0x41: /* LD B,C */ | ||
424 | #ifdef DYNA_DEBUG | 703 | #ifdef DYNA_DEBUG |
425 | fdprintf(fd,"LD B,C\n"); | 704 | fdprintf(fd, "LD A,(HLI)\n"); |
426 | #endif | 705 | #endif |
427 | DYNA_MOVE_b_r_to_r(3,2); | 706 | break; /* FIXME: Implement */ |
428 | break; | 707 | case 0x2B: /* DEC HL */ |
429 | case 0x42: /* LD B,D */ | ||
430 | #ifdef DYNA_DEBUG | 708 | #ifdef DYNA_DEBUG |
431 | fdprintf(fd,"LD B,D\n"); | 709 | fdprintf(fd, "DEC HL\n"); |
432 | #endif | 710 | #endif |
433 | DYNA_MOVE_b_r_to_r(4,2); | 711 | break; /* FIXME: Implement */ |
434 | break; | 712 | case 0x2C: /* INC L */ |
435 | case 0x43: /* LD B,E */ | 713 | #ifdef DYNA_DEBUG |
714 | fdprintf(fd, "INC L\n"); | ||
715 | #endif | ||
716 | break; /* FIXME: Implement */ | ||
717 | case 0x2D: /* DEC L */ | ||
718 | #ifdef DYNA_DEBUG | ||
719 | fdprintf(fd, "DEC L\n"); | ||
720 | #endif | ||
721 | break; /* FIXME: Implement */ | ||
722 | case 0x2E: /* LD L,imm */ | ||
436 | #ifdef DYNA_DEBUG | 723 | #ifdef DYNA_DEBUG |
437 | fdprintf(fd,"LD B,E\n"); | 724 | fdprintf(fd,"LD L,#0x%x\n",readb(xPC)); |
725 | #endif | ||
726 | DYNA_AND_l_i_to_r(0xFF00,6); | ||
727 | DYNA_OR_l_i_to_r(FETCH,6); | ||
728 | break; | ||
729 | case 0x2F: /* CPL */ | ||
730 | #ifdef DYNA_DEBUG | ||
731 | fdprintf(fd, "CPL\n"); | ||
732 | #endif | ||
733 | break; /* FIXME: Implement */ | ||
734 | case 0x30: /* JR NC */ | ||
735 | #ifdef DYNA_DEBUG | ||
736 | fdprintf(fd, "JR NC\n"); | ||
737 | #endif | ||
738 | break; /* FIXME: Implement */ | ||
739 | case 0x31: /* LD SP,imm */ | ||
740 | #ifdef DYNA_DEBUG | ||
741 | fdprintf(fd,"LD SP,#0x%x\n",readw(xPC)); | ||
742 | #endif | ||
743 | DYNA_MOVEA_l_i_to_r(readw(xPC),0); | ||
744 | PC += 2; | ||
745 | break; | ||
746 | case 0x32: /* LD (HLD),A */ | ||
747 | #ifdef DYNA_DEBUG | ||
748 | fdprintf(fd, "LD (HLD),A\n"); | ||
749 | #endif | ||
750 | break; /* FIXME: Implement */ | ||
751 | case 0x33: /* INC SP */ | ||
752 | #ifdef DYNA_DEBUG | ||
753 | fdprintf(fd, "INC SP\n"); | ||
438 | #endif | 754 | #endif |
439 | DYNA_MOVE_b_r_to_r(5,2); | 755 | break; /* FIXME: Implement */ |
440 | break; | 756 | case 0x34: /* INC (HL) */ |
441 | case 0x44: /* LD B,H */ | 757 | #ifdef DYNA_DEBUG |
758 | fdprintf(fd, "INC (HL)\n"); | ||
759 | #endif | ||
760 | break; /* FIXME: Implement */ | ||
761 | case 0x35: /* DEC (HL) */ | ||
762 | #ifdef DYNA_DEBUG | ||
763 | fdprintf(fd, "DEC (HL)\n"); | ||
764 | #endif | ||
765 | break; /* FIXME: Implement */ | ||
766 | case 0x36: /* LD (HD),imm */ | ||
767 | #ifdef DYNA_DEBUG | ||
768 | fdprintf(fd, "LD (HD),imm\n"); | ||
769 | #endif | ||
770 | break; /* FIXME: Implement */ | ||
771 | case 0x37: /* SCF */ | ||
772 | #ifdef DYNA_DEBUG | ||
773 | fdprintf(fd, "SCF\n"); | ||
774 | #endif | ||
775 | break; /* FIXME: Implement */ | ||
776 | case 0x38: /* JR C */ | ||
777 | #ifdef DYNA_DEBUG | ||
778 | fdprintf(fd, "JR C\n"); | ||
779 | #endif | ||
780 | break; /* FIXME: Implement */ | ||
781 | case 0x39: /* ADD HL,SP */ | ||
782 | #ifdef DYNA_DEBUG | ||
783 | fdprintf(fd, "ADD HL,SP\n"); | ||
784 | #endif | ||
785 | break; /* FIXME: Implement */ | ||
786 | case 0x3A: /* LD A,(HLD) */ | ||
787 | #ifdef DYNA_DEBUG | ||
788 | fdprintf(fd, "LD A,(HLD)\n"); | ||
789 | #endif | ||
790 | break; /* FIXME: Implement */ | ||
791 | case 0x3B: /* DEC SP */ | ||
792 | #ifdef DYNA_DEBUG | ||
793 | fdprintf(fd, "DEC SP\n"); | ||
794 | #endif | ||
795 | break; /* FIXME: Implement */ | ||
796 | case 0x3C: /* INC A */ | ||
797 | #ifdef DYNA_DEBUG | ||
798 | fdprintf(fd, "INC A"); | ||
799 | #endif | ||
800 | DYNA_INC_l_r(1,0); /* Is this right? */ | ||
801 | break; | ||
802 | case 0x3D: /* DEC A */ | ||
803 | #ifdef DYNA_DEBUG | ||
804 | fdprintf(fd, "DEC A"); | ||
805 | #endif | ||
806 | DYNA_DEC_l_r(1,0); /* Is this right? */ | ||
807 | break; | ||
808 | case 0x3E: /* LD A,imm */ | ||
442 | #ifdef DYNA_DEBUG | 809 | #ifdef DYNA_DEBUG |
443 | fdprintf(fd,"LD B,H\n"); | 810 | fdprintf(fd,"LD A,#0x%x\n",readb(xPC)); |
811 | #endif | ||
812 | DYNA_MOVEQ_l_i_to_r(FETCH,1); | ||
813 | break; | ||
814 | case 0x3F: /* CCF */ | ||
815 | #ifdef DYNA_DEBUG | ||
816 | fdprintf(fd, "CCF\n"); | ||
817 | #endif | ||
818 | break; /* FIXME: Implement */ | ||
819 | case 0x40: /* LD B,B */ | ||
820 | #ifdef DYNA_DEBUG | ||
821 | fdprintf(fd, "LD B,B\n"); | ||
822 | #endif | ||
823 | break; | ||
824 | case 0x41: /* LD B,C */ | ||
825 | #ifdef DYNA_DEBUG | ||
826 | fdprintf(fd,"LD B,C\n"); | ||
444 | #endif | 827 | #endif |
445 | GETUPPER(6,0); | 828 | DYNA_MOVE_b_r_to_r(3,2); |
446 | DYNA_MOVE_b_r_to_r(0,2); | 829 | break; |
447 | break; | 830 | case 0x42: /* LD B,D */ |
448 | case 0x45: /* LD B,L */ | 831 | #ifdef DYNA_DEBUG |
832 | fdprintf(fd,"LD B,D\n"); | ||
833 | #endif | ||
834 | DYNA_MOVE_b_r_to_r(4,2); | ||
835 | break; | ||
836 | case 0x43: /* LD B,E */ | ||
449 | #ifdef DYNA_DEBUG | 837 | #ifdef DYNA_DEBUG |
450 | fdprintf(fd,"LD B,L\n"); | 838 | fdprintf(fd,"LD B,E\n"); |
451 | #endif | 839 | #endif |
452 | DYNA_MOVE_b_r_to_r(6,2); | 840 | DYNA_MOVE_b_r_to_r(5,2); |
453 | break; | 841 | break; |
454 | case 0x47: /* LD B,A */ | 842 | case 0x44: /* LD B,H */ |
455 | #ifdef DYNA_DEBUG | 843 | #ifdef DYNA_DEBUG |
456 | fdprintf(fd,"LD B,A\n"); | 844 | fdprintf(fd,"LD B,H\n"); |
457 | #endif | 845 | #endif |
458 | DYNA_MOVE_b_r_to_r(1,2); | 846 | GETUPPER(6,0); |
459 | break; | 847 | DYNA_MOVE_b_r_to_r(0,2); |
460 | case 0x48: /* LD C,B */ | 848 | break; |
849 | case 0x45: /* LD B,L */ | ||
461 | #ifdef DYNA_DEBUG | 850 | #ifdef DYNA_DEBUG |
462 | fdprintf(fd,"LD C,B\n"); | 851 | fdprintf(fd,"LD B,L\n"); |
852 | #endif | ||
853 | DYNA_MOVE_b_r_to_r(6,2); | ||
854 | break; | ||
855 | case 0x46: /* LD B,(HL) */ | ||
856 | #ifdef DYNA_DEBUG | ||
857 | fdprintf(fd, "LD B,(HL)\n"); | ||
463 | #endif | 858 | #endif |
464 | DYNA_MOVE_b_r_to_r(2,3); | 859 | break; /* FIXME: Implement */ |
465 | break; | 860 | case 0x47: /* LD B,A */ |
466 | case 0x4A: /* LD C,D */ | ||
467 | #ifdef DYNA_DEBUG | 861 | #ifdef DYNA_DEBUG |
468 | fdprintf(fd,"LD C,D\n"); | 862 | fdprintf(fd,"LD B,A\n"); |
469 | #endif | 863 | #endif |
470 | DYNA_MOVE_b_r_to_r(4,3); | 864 | DYNA_MOVE_b_r_to_r(1,2); |
471 | break; | 865 | break; |
472 | case 0x4B: /* LD C,E */ | 866 | case 0x48: /* LD C,B */ |
473 | #ifdef DYNA_DEBUG | 867 | #ifdef DYNA_DEBUG |
474 | fdprintf(fd,"LD C,E\n"); | 868 | fdprintf(fd,"LD C,B\n"); |
475 | #endif | 869 | #endif |
476 | DYNA_MOVE_b_r_to_r(5,3); | 870 | DYNA_MOVE_b_r_to_r(2,3); |
477 | break; | 871 | break; |
478 | case 0x4C: /* LD C,H */ | 872 | case 0x49: /* LD C,C */ |
873 | break; | ||
874 | case 0x4A: /* LD C,D */ | ||
479 | #ifdef DYNA_DEBUG | 875 | #ifdef DYNA_DEBUG |
480 | fdprintf(fd,"LD C,H\n"); | 876 | fdprintf(fd,"LD C,D\n"); |
481 | #endif | 877 | #endif |
482 | GETUPPER(6,0); | 878 | DYNA_MOVE_b_r_to_r(4,3); |
483 | DYNA_MOVE_b_r_to_r(0,3); | 879 | break; |
484 | break; | 880 | case 0x4B: /* LD C,E */ |
485 | case 0x4D: /* LD C,L */ | ||
486 | #ifdef DYNA_DEBUG | 881 | #ifdef DYNA_DEBUG |
487 | fdprintf(fd,"LD C,L\n"); | 882 | fdprintf(fd,"LD C,E\n"); |
488 | #endif | 883 | #endif |
489 | DYNA_MOVE_b_r_to_r(6,3); | 884 | DYNA_MOVE_b_r_to_r(5,3); |
490 | break; | 885 | break; |
491 | case 0x4F: /* LD C,A */ | 886 | case 0x4C: /* LD C,H */ |
492 | #ifdef DYNA_DEBUG | 887 | #ifdef DYNA_DEBUG |
493 | fdprintf(fd,"LD C,A\n"); | 888 | fdprintf(fd,"LD C,H\n"); |
494 | #endif | 889 | #endif |
495 | DYNA_MOVE_b_r_to_r(1,3); | 890 | GETUPPER(6,0); |
496 | break; | 891 | DYNA_MOVE_b_r_to_r(0,3); |
497 | 892 | break; | |
498 | case 0x50: /* LD D,B */ | 893 | case 0x4D: /* LD C,L */ |
499 | #ifdef DYNA_DEBUG | 894 | #ifdef DYNA_DEBUG |
500 | fdprintf(fd,"LD D,B\n"); | 895 | fdprintf(fd,"LD C,L\n"); |
896 | #endif | ||
897 | DYNA_MOVE_b_r_to_r(6,3); | ||
898 | break; | ||
899 | case 0x4E: /* LD C,(HL) */ | ||
900 | #ifdef DYNA_DEBUG | ||
901 | fdprintf(fd, "LD C,(HL)\n"); | ||
501 | #endif | 902 | #endif |
502 | DYNA_MOVE_b_r_to_r(2,4); | 903 | break; /* FIXME: Implement */ |
503 | break; | 904 | case 0x4F: /* LD C,A */ |
504 | case 0x51: /* LD D,C */ | ||
505 | #ifdef DYNA_DEBUG | 905 | #ifdef DYNA_DEBUG |
506 | fdprintf(fd,"LD D,C\n"); | 906 | fdprintf(fd,"LD C,A\n"); |
507 | #endif | 907 | #endif |
508 | DYNA_MOVE_b_r_to_r(3,4); | 908 | DYNA_MOVE_b_r_to_r(1,3); |
509 | break; | 909 | break; |
510 | case 0x53: /* LD D,E */ | 910 | case 0x50: /* LD D,B */ |
511 | #ifdef DYNA_DEBUG | 911 | #ifdef DYNA_DEBUG |
512 | fdprintf(fd,"LD D,E\n"); | 912 | fdprintf(fd,"LD D,B\n"); |
513 | #endif | 913 | #endif |
514 | DYNA_MOVE_b_r_to_r(5,4); | 914 | DYNA_MOVE_b_r_to_r(2,4); |
515 | break; | 915 | break; |
516 | case 0x54: /* LD D,H */ | 916 | case 0x51: /* LD D,C */ |
517 | #ifdef DYNA_DEBUG | 917 | #ifdef DYNA_DEBUG |
518 | fdprintf(fd,"LD D,H\n"); | 918 | fdprintf(fd,"LD D,C\n"); |
519 | #endif | 919 | #endif |
520 | GETUPPER(6,0); | 920 | DYNA_MOVE_b_r_to_r(3,4); |
521 | DYNA_MOVE_b_r_to_r(0,4); | 921 | break; |
522 | break; | 922 | case 0x52: /* LD D,D */ |
523 | case 0x55: /* LD D,L */ | 923 | break; |
924 | case 0x53: /* LD D,E */ | ||
524 | #ifdef DYNA_DEBUG | 925 | #ifdef DYNA_DEBUG |
525 | fdprintf(fd,"LD D,L\n"); | 926 | fdprintf(fd,"LD D,E\n"); |
526 | #endif | 927 | #endif |
527 | DYNA_MOVE_b_r_to_r(6,4); | 928 | DYNA_MOVE_b_r_to_r(5,4); |
528 | break; | 929 | break; |
529 | case 0x57: /* LD D,A */ | 930 | case 0x54: /* LD D,H */ |
530 | #ifdef DYNA_DEBUG | 931 | #ifdef DYNA_DEBUG |
531 | fdprintf(fd,"LD D,A\n"); | 932 | fdprintf(fd,"LD D,H\n"); |
532 | #endif | 933 | #endif |
533 | DYNA_MOVE_b_r_to_r(1,4); | 934 | GETUPPER(6,0); |
534 | break; | 935 | DYNA_MOVE_b_r_to_r(0,4); |
535 | 936 | break; | |
536 | case 0x58: /* LD E,B */ | 937 | case 0x55: /* LD D,L */ |
537 | #ifdef DYNA_DEBUG | 938 | #ifdef DYNA_DEBUG |
538 | fdprintf(fd,"LD E,B\n"); | 939 | fdprintf(fd,"LD D,L\n"); |
539 | #endif | 940 | #endif |
540 | DYNA_MOVE_b_r_to_r(2,5); | 941 | DYNA_MOVE_b_r_to_r(6,4); |
541 | break; | 942 | break; |
542 | case 0x59: /* LD E,C */ | 943 | case 0x56: /* LD D,(HL) */ |
944 | #ifdef DYNA_DEBUG | ||
945 | fdprintf(fd, "LD D,(HL)\n"); | ||
946 | #endif | ||
947 | break; /* FIXME: Implement */ | ||
948 | case 0x57: /* LD D,A */ | ||
543 | #ifdef DYNA_DEBUG | 949 | #ifdef DYNA_DEBUG |
544 | fdprintf(fd,"LD E,C\n"); | 950 | fdprintf(fd,"LD D,A\n"); |
545 | #endif | 951 | #endif |
546 | DYNA_MOVE_b_r_to_r(3,5); | 952 | DYNA_MOVE_b_r_to_r(1,4); |
547 | break; | 953 | break; |
548 | case 0x5A: /* LD E,D */ | 954 | case 0x58: /* LD E,B */ |
549 | #ifdef DYNA_DEBUG | 955 | #ifdef DYNA_DEBUG |
550 | fdprintf(fd,"LD E,D\n"); | 956 | fdprintf(fd,"LD E,B\n"); |
551 | #endif | 957 | #endif |
552 | DYNA_MOVE_b_r_to_r(4,5); | 958 | DYNA_MOVE_b_r_to_r(2,5); |
553 | break; | 959 | break; |
554 | case 0x5C: /* LD E,H */ | 960 | case 0x59: /* LD E,C */ |
555 | #ifdef DYNA_DEBUG | 961 | #ifdef DYNA_DEBUG |
556 | fdprintf(fd,"LD E,H\n"); | 962 | fdprintf(fd,"LD E,C\n"); |
557 | #endif | 963 | #endif |
558 | GETUPPER(6,0); | 964 | DYNA_MOVE_b_r_to_r(3,5); |
559 | DYNA_MOVE_b_r_to_r(0,5); | 965 | break; |
560 | break; | 966 | case 0x5A: /* LD E,D */ |
561 | case 0x5D: /* LD E,L */ | ||
562 | #ifdef DYNA_DEBUG | 967 | #ifdef DYNA_DEBUG |
563 | fdprintf(fd,"LD E,L\n"); | 968 | fdprintf(fd,"LD E,D\n"); |
564 | #endif | 969 | #endif |
565 | DYNA_MOVE_b_r_to_r(6,5); | 970 | DYNA_MOVE_b_r_to_r(4,5); |
566 | break; | 971 | break; |
567 | case 0x5F: /* LD E,A */ | 972 | case 0x5B: /* LD E,E */ |
973 | break; | ||
974 | case 0x5C: /* LD E,H */ | ||
568 | #ifdef DYNA_DEBUG | 975 | #ifdef DYNA_DEBUG |
569 | fdprintf(fd,"LD E,A\n"); | 976 | fdprintf(fd,"LD E,H\n"); |
570 | #endif | 977 | #endif |
571 | DYNA_MOVE_b_r_to_r(1,5); | 978 | GETUPPER(6,0); |
572 | break; | 979 | DYNA_MOVE_b_r_to_r(0,5); |
573 | 980 | break; | |
574 | case 0x60: /* LD H,B */ | 981 | case 0x5D: /* LD E,L */ |
575 | #ifdef DYNA_DEBUG | 982 | #ifdef DYNA_DEBUG |
576 | fdprintf(fd,"LD H,B\n"); | 983 | fdprintf(fd,"LD E,L\n"); |
577 | #endif | 984 | #endif |
578 | DYNA_MOVE_b_r_to_r(2,0); | 985 | DYNA_MOVE_b_r_to_r(6,5); |
579 | PUTUPPER(0,6); | 986 | break; |
580 | break; | 987 | case 0x5E: /* LD E,(HL) */ |
581 | case 0x61: /* LD H,C */ | 988 | #ifdef DYNA_DEBUG |
989 | fdprintf(fd, "LD E,(HL)\n"); | ||
990 | #endif | ||
991 | break; /* FIXME: Implement */ | ||
992 | case 0x5F: /* LD E,A */ | ||
582 | #ifdef DYNA_DEBUG | 993 | #ifdef DYNA_DEBUG |
583 | fdprintf(fd,"LD H,C\n"); | 994 | fdprintf(fd,"LD E,A\n"); |
584 | #endif | 995 | #endif |
585 | DYNA_MOVE_b_r_to_r(3,0); | 996 | DYNA_MOVE_b_r_to_r(1,5); |
586 | PUTUPPER(0,6); | 997 | break; |
587 | break; | 998 | case 0x60: /* LD H,B */ |
588 | case 0x62: /* LD H,D */ | ||
589 | #ifdef DYNA_DEBUG | 999 | #ifdef DYNA_DEBUG |
590 | fdprintf(fd,"LD H,D\n"); | 1000 | fdprintf(fd,"LD H,B\n"); |
591 | #endif | 1001 | #endif |
592 | DYNA_MOVE_b_r_to_r(4,0); | 1002 | DYNA_MOVE_b_r_to_r(2,0); |
593 | PUTUPPER(0,6); | 1003 | PUTUPPER(0,6); |
594 | break; | 1004 | break; |
595 | case 0x63: /* LD H,E */ | 1005 | case 0x61: /* LD H,C */ |
596 | #ifdef DYNA_DEBUG | 1006 | #ifdef DYNA_DEBUG |
597 | fdprintf(fd,"LD H,E\n"); | 1007 | fdprintf(fd,"LD H,C\n"); |
598 | #endif | 1008 | #endif |
599 | DYNA_MOVE_b_r_to_r(5,0); | 1009 | DYNA_MOVE_b_r_to_r(3,0); |
600 | PUTUPPER(0,6); | 1010 | PUTUPPER(0,6); |
601 | break; | 1011 | break; |
602 | case 0x65: /* LD H,L */ | 1012 | case 0x62: /* LD H,D */ |
603 | #ifdef DYNA_DEBUG | 1013 | #ifdef DYNA_DEBUG |
604 | fdprintf(fd,"LD H,L\n"); | 1014 | fdprintf(fd,"LD H,D\n"); |
605 | #endif | 1015 | #endif |
606 | DYNA_MOVE_b_r_to_r(6,0); | 1016 | DYNA_MOVE_b_r_to_r(4,0); |
607 | PUTUPPER(0,6); | 1017 | PUTUPPER(0,6); |
608 | break; | 1018 | break; |
609 | case 0x67: /* LD H,A */ | 1019 | case 0x63: /* LD H,E */ |
610 | #ifdef DYNA_DEBUG | 1020 | #ifdef DYNA_DEBUG |
611 | fdprintf(fd,"LD H,A\n"); | 1021 | fdprintf(fd,"LD H,E\n"); |
612 | #endif | 1022 | #endif |
613 | DYNA_MOVE_b_r_to_r(1,0); | 1023 | DYNA_MOVE_b_r_to_r(5,0); |
614 | PUTUPPER(0,6); | 1024 | PUTUPPER(0,6); |
615 | break; | 1025 | break; |
616 | case 0x68: /* LD L,B */ | 1026 | case 0x64: /* LD H,H */ |
1027 | break; | ||
1028 | case 0x65: /* LD H,L */ | ||
617 | #ifdef DYNA_DEBUG | 1029 | #ifdef DYNA_DEBUG |
618 | fdprintf(fd,"LD L,B\n"); | 1030 | fdprintf(fd,"LD H,L\n"); |
1031 | #endif | ||
1032 | DYNA_MOVE_b_r_to_r(6,0); | ||
1033 | PUTUPPER(0,6); | ||
1034 | break; | ||
1035 | case 0x66: /* LD H,(HL) */ | ||
1036 | #ifdef DYNA_DEBUG | ||
1037 | fdprintf(fd, "LD H,(HL)\n"); | ||
619 | #endif | 1038 | #endif |
620 | DYNA_MOVE_b_r_to_r(2,6); | 1039 | break; /* FIXME: Implement */ |
621 | break; | 1040 | case 0x67: /* LD H,A */ |
622 | case 0x69: /* LD L,C */ | ||
623 | #ifdef DYNA_DEBUG | 1041 | #ifdef DYNA_DEBUG |
624 | fdprintf(fd,"LD L,C\n"); | 1042 | fdprintf(fd,"LD H,A\n"); |
1043 | #endif | ||
1044 | DYNA_MOVE_b_r_to_r(1,0); | ||
1045 | PUTUPPER(0,6); | ||
1046 | break; | ||
1047 | case 0x68: /* LD L,B */ | ||
1048 | #ifdef DYNA_DEBUG | ||
1049 | fdprintf(fd,"LD L,B\n"); | ||
625 | #endif | 1050 | #endif |
626 | DYNA_MOVE_b_r_to_r(3,6); | 1051 | DYNA_MOVE_b_r_to_r(2,6); |
627 | break; | 1052 | break; |
628 | case 0x6A: /* LD L,D */ | 1053 | case 0x69: /* LD L,C */ |
629 | #ifdef DYNA_DEBUG | 1054 | #ifdef DYNA_DEBUG |
630 | fdprintf(fd,"LD L,D\n"); | 1055 | fdprintf(fd,"LD L,C\n"); |
631 | #endif | 1056 | #endif |
632 | DYNA_MOVE_b_r_to_r(4,6); | 1057 | DYNA_MOVE_b_r_to_r(3,6); |
633 | break; | 1058 | break; |
634 | case 0x6B: /* LD L,E */ | 1059 | case 0x6A: /* LD L,D */ |
635 | #ifdef DYNA_DEBUG | 1060 | #ifdef DYNA_DEBUG |
636 | fdprintf(fd,"LD L,E\n"); | 1061 | fdprintf(fd,"LD L,D\n"); |
637 | #endif | 1062 | #endif |
638 | DYNA_MOVE_b_r_to_r(5,6); | 1063 | DYNA_MOVE_b_r_to_r(4,6); |
639 | break; | 1064 | break; |
640 | case 0x6C: /* LD L,H */ | 1065 | case 0x6B: /* LD L,E */ |
641 | #ifdef DYNA_DEBUG | 1066 | #ifdef DYNA_DEBUG |
642 | fdprintf(fd,"LD L,H\n"); | 1067 | fdprintf(fd,"LD L,E\n"); |
643 | #endif | 1068 | #endif |
644 | GETUPPER(6,0); | 1069 | DYNA_MOVE_b_r_to_r(5,6); |
645 | DYNA_MOVE_b_r_to_r(0,6); | 1070 | break; |
646 | break; | 1071 | case 0x6C: /* LD L,H */ |
647 | |||
648 | case 0x78: /* LD A,B */ | ||
649 | #ifdef DYNA_DEBUG | 1072 | #ifdef DYNA_DEBUG |
650 | fdprintf(fd,"LD A,B\n"); | 1073 | fdprintf(fd,"LD L,H\n"); |
1074 | #endif | ||
1075 | GETUPPER(6,0); | ||
1076 | DYNA_MOVE_b_r_to_r(0,6); | ||
1077 | break; | ||
1078 | case 0x6D: /* LD L,L */ | ||
1079 | break; | ||
1080 | case 0x6E: /* LD L,(HL) */ | ||
1081 | #ifdef DYNA_DEBUG | ||
1082 | fdprintf(fd, "LD L,(HL)\n"); | ||
1083 | #endif | ||
1084 | break; /* FIXME: Implement */ | ||
1085 | case 0x6F: /* LD L,A */ | ||
1086 | #ifdef DYNA_DEBUG | ||
1087 | fdprintf(fd, "LD L,A\n"); | ||
1088 | #endif | ||
1089 | break; /* FIXME: Implement */ | ||
1090 | case 0x70: /* LD (HL),B */ | ||
1091 | #ifdef DYNA_DEBUG | ||
1092 | fdprintf(fd, "LD (HL),B\n"); | ||
1093 | #endif | ||
1094 | break; /* FIXME: Implement */ | ||
1095 | case 0x71: /* LD (HL),C */ | ||
1096 | #ifdef DYNA_DEBUG | ||
1097 | fdprintf(fd, "LD (HL),C\n"); | ||
651 | #endif | 1098 | #endif |
652 | DYNA_MOVE_b_r_to_r(2,1); | 1099 | break; /* FIXME: Implement */ |
653 | break; | 1100 | case 0x72: /* LD (HL),D */ |
654 | case 0x79: /* LD A,C */ | 1101 | #ifdef DYNA_DEBUG |
1102 | fdprintf(fd, "LD (HL),D\n"); | ||
1103 | #endif | ||
1104 | break; /* FIXME: Implement */ | ||
1105 | case 0x73: /* LD (HL),E */ | ||
1106 | #ifdef DYNA_DEBUG | ||
1107 | fdprintf(fd, "LD (HL),E\n"); | ||
1108 | #endif | ||
1109 | break; /* FIXME: Implement */ | ||
1110 | case 0x74: /* LD (HL),H */ | ||
1111 | #ifdef DYNA_DEBUG | ||
1112 | fdprintf(fd, "LD (HL),H\n"); | ||
1113 | #endif | ||
1114 | break; /* FIXME: Implement */ | ||
1115 | case 0x75: /* LD (HL),L */ | ||
1116 | #ifdef DYNA_DEBUG | ||
1117 | fdprintf(fd, "LD (HL),L\n"); | ||
1118 | #endif | ||
1119 | break; /* FIXME: Implement */ | ||
1120 | case 0x76: /* HALT */ | ||
1121 | #ifdef DYNA_DEBUG | ||
1122 | fdprintf(fd, "HALT\n"); | ||
1123 | #endif | ||
1124 | break; /* FIXME: Implement */ | ||
1125 | case 0x77: /* LD (HL),A */ | ||
1126 | #ifdef DYNA_DEBUG | ||
1127 | fdprintf(fd, "LD (HL),A\n"); | ||
1128 | #endif | ||
1129 | break; /* FIXME: Implement */ | ||
1130 | case 0x78: /* LD A,B */ | ||
655 | #ifdef DYNA_DEBUG | 1131 | #ifdef DYNA_DEBUG |
656 | fdprintf(fd,"LD A,C\n"); | 1132 | fdprintf(fd,"LD A,B\n"); |
657 | #endif | 1133 | #endif |
658 | DYNA_MOVE_b_r_to_r(3,1); | 1134 | DYNA_MOVE_b_r_to_r(2,1); |
659 | break; | 1135 | break; |
660 | case 0x7A: /* LD A,D */ | 1136 | case 0x79: /* LD A,C */ |
661 | #ifdef DYNA_DEBUG | 1137 | #ifdef DYNA_DEBUG |
662 | fdprintf(fd,"LD A,D\n"); | 1138 | fdprintf(fd,"LD A,C\n"); |
663 | #endif | 1139 | #endif |
664 | DYNA_MOVE_b_r_to_r(4,1); | 1140 | DYNA_MOVE_b_r_to_r(3,1); |
665 | break; | 1141 | break; |
666 | case 0x7B: /* LD A,E */ | 1142 | case 0x7A: /* LD A,D */ |
667 | #ifdef DYNA_DEBUG | 1143 | #ifdef DYNA_DEBUG |
668 | fdprintf(fd,"LD A,E\n"); | 1144 | fdprintf(fd,"LD A,D\n"); |
669 | #endif | 1145 | #endif |
670 | DYNA_MOVE_b_r_to_r(5,1); | 1146 | DYNA_MOVE_b_r_to_r(4,1); |
671 | break; | 1147 | break; |
672 | case 0x7C: /* LD A,H */ | 1148 | case 0x7B: /* LD A,E */ |
673 | #ifdef DYNA_DEBUG | 1149 | #ifdef DYNA_DEBUG |
674 | fdprintf(fd,"LD A,H\n"); | 1150 | fdprintf(fd,"LD A,E\n"); |
675 | #endif | 1151 | #endif |
676 | GETUPPER(5,0); | 1152 | DYNA_MOVE_b_r_to_r(5,1); |
677 | DYNA_MOVE_b_r_to_r(0,1); | 1153 | break; |
678 | break; | 1154 | case 0x7C: /* LD A,H */ |
679 | case 0x7D: /* LD A,L */ | ||
680 | #ifdef DYNA_DEBUG | 1155 | #ifdef DYNA_DEBUG |
681 | fdprintf(fd,"LD A,L\n"); | 1156 | fdprintf(fd,"LD A,H\n"); |
682 | #endif | 1157 | #endif |
683 | DYNA_MOVE_b_r_to_r(5,1); | 1158 | GETUPPER(5,0); |
684 | break; | 1159 | DYNA_MOVE_b_r_to_r(0,1); |
685 | case 0x01: /* LD BC,imm */ | 1160 | break; |
686 | { /* warning (do we have endianness right?) */ | 1161 | case 0x7D: /* LD A,L */ |
687 | #ifdef DYNA_DEBUG | 1162 | #ifdef DYNA_DEBUG |
688 | fdprintf(fd,"LD BC,#0x%x\n",readw(xPC)); | 1163 | fdprintf(fd,"LD A,L\n"); |
689 | #endif | 1164 | #endif |
690 | temp=readw(xPC); | 1165 | DYNA_MOVE_b_r_to_r(5,1); |
691 | DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,2); | 1166 | break; |
692 | DYNA_MOVEQ_l_i_to_r(temp&0xFF,3); | 1167 | case 0x7E: /* LD A,HL */ |
693 | PC+=2; | ||
694 | } | ||
695 | break; | ||
696 | case 0x11: /* LD DE,imm */ | ||
697 | { | ||
698 | #ifdef DYNA_DEBUG | 1168 | #ifdef DYNA_DEBUG |
699 | fdprintf(fd,"LD DE,#0x%x\n",readw(xPC)); | 1169 | fdprintf(fd, "LD A,HL\n"); |
700 | #endif | 1170 | #endif |
701 | temp=readw(xPC); | 1171 | break; /* FIXME: Implement */ |
702 | DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,4); | 1172 | case 0x7F: /* LD A,A */ |
703 | DYNA_MOVEQ_l_i_to_r(temp&0xFF,5); | 1173 | break; |
704 | PC += 2; | 1174 | case 0x80: /* ADD A,B */ |
705 | } | ||
706 | break; | ||
707 | case 0x21: /* LD HL,imm */ | ||
708 | { | ||
709 | #ifdef DYNA_DEBUG | 1175 | #ifdef DYNA_DEBUG |
710 | fdprintf(fd,"LD HL,#0x%x\n",readw(xPC)); | 1176 | fdprintf(fd, "ADD A,B\n"); |
711 | #endif | 1177 | #endif |
712 | DYNA_MOVE_l_i_to_r(readw(xPC),6); | 1178 | break; /* FIXME: Implement */ |
713 | PC += 2; | 1179 | case 0x81: /* ADD A,C */ |
714 | } | ||
715 | break; | ||
716 | case 0x22: /* LDI (HL), A */ | ||
717 | #ifdef DYNA_DEBUG | 1180 | #ifdef DYNA_DEBUG |
718 | fdprintf(fd,"LDI (HL),A\n"); | 1181 | fdprintf(fd, "ADD A,C\n"); |
719 | #endif | 1182 | #endif |
720 | /* DYNA_PUSH_l_r(1,0); | 1183 | break; /* FIXME: Implement */ |
721 | DYNA_PUSH_l_r(6,0); | 1184 | case 0x82: /* ADD A,D */ |
722 | CALL_NATIVE(&writeb); | ||
723 | DYNA_ADDQ_l_i_to_r(0,7,1); | ||
724 | DYNA_INC_l_r(6,0);*/ | ||
725 | break; | ||
726 | case 0x31: /* LD SP,imm */ | ||
727 | #ifdef DYNA_DEBUG | 1185 | #ifdef DYNA_DEBUG |
728 | fdprintf(fd,"LD SP,#0x%x\n",readw(xPC)); | 1186 | fdprintf(fd, "ADD A,D\n"); |
729 | #endif | 1187 | #endif |
730 | DYNA_MOVEA_l_i_to_r(readw(xPC),0); | 1188 | break; /* FIXME: Implement */ |
731 | PC += 2; | 1189 | case 0x83: /* ADD A,E */ |
732 | break; | 1190 | #ifdef DYNA_DEBUG |
733 | 1191 | fdprintf(fd, "ADD A,E\n"); | |
734 | case 0x06: /* LD B,imm */ | 1192 | #endif |
1193 | break; /* FIXME: Implement */ | ||
1194 | case 0x84: /* ADD A,H */ | ||
1195 | #ifdef DYNA_DEBUG | ||
1196 | fdprintf(fd, "ADD A,H\n"); | ||
1197 | #endif | ||
1198 | break; /* FIXME: Implement */ | ||
1199 | case 0x85: /* ADD A,L */ | ||
1200 | #ifdef DYNA_DEBUG | ||
1201 | fdprintf(fd, "ADD A,L\n"); | ||
1202 | #endif | ||
1203 | break; /* FIXME: Implement */ | ||
1204 | case 0x86: /* ADD A,(HL) */ | ||
1205 | #ifdef DYNA_DEBUG | ||
1206 | fdprintf(fd, "ADD A,(HL)\n"); | ||
1207 | #endif | ||
1208 | break; /* FIXME: Implement */ | ||
1209 | case 0x87: /* ADD A,A */ | ||
1210 | #ifdef DYNA_DEBUG | ||
1211 | fdprintf(fd,"ADD A,A\n"); | ||
1212 | #endif | ||
1213 | /* code taken from gcc -O3 output by compiling; | ||
1214 | * c=(2*b)&0xFF; | ||
1215 | * a=(c) ? 0 : 0x80 | zero flag | ||
1216 | * (0x20 & (c) << 1) | halfcarry | ||
1217 | * ((2*b)&0x100)>>4; carry | ||
1218 | */ | ||
1219 | DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1, d0 */ | ||
1220 | DYNA_ADD_l_r_to_r(0,0,0); /* add.l d0, d0 */ | ||
1221 | DYNA_AND_l_i_to_r(510,0); /* and.l #510, d0 */ | ||
1222 | DYNA_MOVEA_l_r_to_r(0,3,0); /* movea.l d0,a3 */ | ||
1223 | DYNA_CLR_b_r(7); /* clr.b d7 */ | ||
1224 | DYNA_TST_b_r(0,0); /* tst.b d0 */ | ||
1225 | DYNA_DUMMYBRANCH(2,0); | ||
1226 | DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1,d0 */ | ||
1227 | DYNA_LSHIFT_l(3,0,0,0); /* lsr.l #3, d0 */ | ||
1228 | DYNA_MOVEQ_l_i_to_r(16,1); /* moveq #16,d1 */ | ||
1229 | DYNA_AND_l_r_to_r(1,0); /* and.l d1 d0 */ | ||
1230 | DYNA_MOVEQ_l_i_to_r(0x80,7); /* moveq #0x80,d7 */ | ||
1231 | DYNA_OR_l_r_to_r(0,7); /* or.l d0, d7 */ | ||
1232 | DYNA_BCC_c(0x6,2,0); /* branch not equal, here */ | ||
1233 | DYNA_MOVE_l_r_to_r(3,1,1); /* move.l a3,d1 */ | ||
1234 | DYNA_AND_l_i_to_r(0xFE,1); /* and.l #0xFE,d1 */ | ||
1235 | DYNA_AND_l_i_to_r(0xB0,7); /* and.l #0xB0,d7 */ | ||
1236 | break; | ||
1237 | case 0x88: /* ADC A,B */ | ||
1238 | #ifdef DYNA_DEBUG | ||
1239 | fdprintf(fd, "ADC A,B\n"); | ||
1240 | #endif | ||
1241 | break; /* FIXME: Implement */ | ||
1242 | case 0x89: /* ADC A,C */ | ||
1243 | #ifdef DYNA_DEBUG | ||
1244 | fdprintf(fd, "ADC A,C\n"); | ||
1245 | #endif | ||
1246 | break; /* FIXME: Implement */ | ||
1247 | case 0x8A: /* ADC A,D */ | ||
1248 | #ifdef DYNA_DEBUG | ||
1249 | fdprintf(fd, "ADC A,D\n"); | ||
1250 | #endif | ||
1251 | break; /* FIXME: Implement */ | ||
1252 | case 0x8B: /* ADC A,E */ | ||
1253 | #ifdef DYNA_DEBUG | ||
1254 | fdprintf(fd, "ADC A,E\n"); | ||
1255 | #endif | ||
1256 | break; /* FIXME: Implement */ | ||
1257 | case 0x8C: /* ADC A,H */ | ||
1258 | #ifdef DYNA_DEBUG | ||
1259 | fdprintf(fd, "ADC A,H\n"); | ||
1260 | #endif | ||
1261 | break; /* FIXME: Implement */ | ||
1262 | case 0x8D: /* ADC A,L */ | ||
1263 | #ifdef DYNA_DEBUG | ||
1264 | fdprintf(fd, "ADC A,L\n"); | ||
1265 | #endif | ||
1266 | break; /* FIXME: Implement */ | ||
1267 | case 0x8E: /* ADC A,(HL) */ | ||
1268 | #ifdef DYNA_DEBUG | ||
1269 | fdprintf(fd, "ADC A,(HL)\n"); | ||
1270 | #endif | ||
1271 | break; /* FIXME: Implement */ | ||
1272 | case 0x8F: /* ADC A */ | ||
1273 | #ifdef DYNA_DEBUG | ||
1274 | fdprintf(fd, "ADC A\n"); | ||
1275 | #endif | ||
1276 | break; /* FIXME: Implement */ | ||
1277 | case 0x90: /* SUB B */ | ||
1278 | #ifdef DYNA_DEBUG | ||
1279 | fdprintf(fd, "SUB B\n"); | ||
1280 | #endif | ||
1281 | break; /* FIXME: Implement */ | ||
1282 | case 0x91: /* SUB C */ | ||
1283 | #ifdef DYNA_DEBUG | ||
1284 | fdprintf(fd, "SUB C\n"); | ||
1285 | #endif | ||
1286 | break; /* FIXME: Implement */ | ||
1287 | case 0x92: /* SUB D */ | ||
1288 | #ifdef DYNA_DEBUG | ||
1289 | fdprintf(fd, "SUB D\n"); | ||
1290 | #endif | ||
1291 | break; /* FIXME: Implement */ | ||
1292 | case 0x93: /* SUB E */ | ||
1293 | #ifdef DYNA_DEBUG | ||
1294 | fdprintf(fd, "SUB E\n"); | ||
1295 | #endif | ||
1296 | break; /* FIXME: Implement */ | ||
1297 | case 0x94: /* SUB H */ | ||
1298 | #ifdef DYNA_DEBUG | ||
1299 | fdprintf(fd, "SUB H\n"); | ||
1300 | #endif | ||
1301 | break; /* FIXME: Implement */ | ||
1302 | case 0x95: /* SUB L */ | ||
1303 | #ifdef DYNA_DEBUG | ||
1304 | fdprintf(fd, "SUB L\n"); | ||
1305 | #endif | ||
1306 | break; /* FIXME: Implement */ | ||
1307 | case 0x96: /* SUB (HL) */ | ||
1308 | #ifdef DYNA_DEBUG | ||
1309 | fdprintf(fd, "SUB (HL)\n"); | ||
1310 | #endif | ||
1311 | break; /* FIXME: Implement */ | ||
1312 | case 0x97: /* SUB A (halfcarry ?) */ | ||
1313 | #ifdef DYNA_DEBUG | ||
1314 | fdprintf(fd,"SUB A\n"); | ||
1315 | #endif | ||
1316 | DYNA_CLR_l_r(1); | ||
1317 | DYNA_MOVEQ_l_i_to_r(0xC0,7); | ||
1318 | break; | ||
1319 | case 0x98: /* SBC A,B */ | ||
1320 | #ifdef DYNA_DEBUG | ||
1321 | fdprintf(fd, "SBC A,B\n"); | ||
1322 | #endif | ||
1323 | break; /* FIXME: Implement */ | ||
1324 | case 0x99: /* SBC A,C */ | ||
1325 | #ifdef DYNA_DEBUG | ||
1326 | fdprintf(fd, "SBC A,C\n"); | ||
1327 | #endif | ||
1328 | break; /* FIXME: Implement */ | ||
1329 | case 0x9A: /* SBC A,D */ | ||
1330 | #ifdef DYNA_DEBUG | ||
1331 | fdprintf(fd, "SBC A,D\n"); | ||
1332 | #endif | ||
1333 | break; /* FIXME: Implement */ | ||
1334 | case 0x9B: /* SBC A,E */ | ||
1335 | #ifdef DYNA_DEBUG | ||
1336 | fdprintf(fd, "SBC A,E\n"); | ||
1337 | #endif | ||
1338 | break; /* FIXME: Implement */ | ||
1339 | case 0x9C: /* SBC A,H */ | ||
1340 | #ifdef DYNA_DEBUG | ||
1341 | fdprintf(fd, "SBC A,H\n"); | ||
1342 | #endif | ||
1343 | break; /* FIXME: Implement */ | ||
1344 | case 0x9D: /* SBC A,L */ | ||
1345 | #ifdef DYNA_DEBUG | ||
1346 | fdprintf(fd, "SBC A,L\n"); | ||
1347 | #endif | ||
1348 | break; /* FIXME: Implement */ | ||
1349 | case 0x9E: /* SBC A,(HL) */ | ||
1350 | #ifdef DYNA_DEBUG | ||
1351 | fdprintf(fd, "SBC A,(HL)\n"); | ||
1352 | #endif | ||
1353 | break; /* FIXME: Implement */ | ||
1354 | case 0x9F: /* SBC A,A */ | ||
1355 | #ifdef DYNA_DEBUG | ||
1356 | fdprintf(fd, "SBC A,A\n"); | ||
1357 | #endif | ||
1358 | break; /* FIXME: Implement */ | ||
1359 | case 0xA0: /* AND B */ | ||
1360 | #ifdef DYNA_DEBUG | ||
1361 | fdprintf(fd, "AND B\n"); | ||
1362 | #endif | ||
1363 | break; /* FIXME: Implement */ | ||
1364 | case 0xA1: /* AND C */ | ||
1365 | #ifdef DYNA_DEBUG | ||
1366 | fdprintf(fd, "AND C\n"); | ||
1367 | #endif | ||
1368 | break; /* FIXME: Implement */ | ||
1369 | case 0xA2: /* AND D */ | ||
1370 | #ifdef DYNA_DEBUG | ||
1371 | fdprintf(fd, "AND D\n"); | ||
1372 | #endif | ||
1373 | break; /* FIXME: Implement */ | ||
1374 | case 0xA3: /* AND E */ | ||
1375 | #ifdef DYNA_DEBUG | ||
1376 | fdprintf(fd, "AND E\n"); | ||
1377 | #endif | ||
1378 | break; /* FIXME: Implement */ | ||
1379 | case 0xA4: /* AND H */ | ||
1380 | #ifdef DYNA_DEBUG | ||
1381 | fdprintf(fd, "AND H\n"); | ||
1382 | #endif | ||
1383 | break; /* FIXME: Implement */ | ||
1384 | case 0xA5: /* AND L */ | ||
1385 | #ifdef DYNA_DEBUG | ||
1386 | fdprintf(fd, "AND L\n"); | ||
1387 | #endif | ||
1388 | break; /* FIXME: Implement */ | ||
1389 | case 0xA6: /* AND (HL) */ | ||
1390 | #ifdef DYNA_DEBUG | ||
1391 | fdprintf(fd, "AND (HL)\n"); | ||
1392 | #endif | ||
1393 | break; /* FIXME: Implement */ | ||
1394 | case 0xA7: /* AND A */ | ||
1395 | #ifdef DYNA_DEBUG | ||
1396 | fdprintf(fd, "AND A\n"); | ||
1397 | #endif | ||
1398 | break; /* FIXME: Implement */ | ||
1399 | case 0xA8: /* XOR B */ | ||
1400 | #ifdef DYNA_DEBUG | ||
1401 | fdprintf(fd, "XOR B\n"); | ||
1402 | #endif | ||
1403 | break; /* FIXME: Implement */ | ||
1404 | case 0xA9: /* XOR C */ | ||
1405 | #ifdef DYNA_DEBUG | ||
1406 | fdprintf(fd, "XOR C\n"); | ||
1407 | #endif | ||
1408 | break; /* FIXME: Implement */ | ||
1409 | case 0xAA: /* XOR D */ | ||
1410 | #ifdef DYNA_DEBUG | ||
1411 | fdprintf(fd, "XOR D\n"); | ||
1412 | #endif | ||
1413 | break; /* FIXME: Implement */ | ||
1414 | case 0xAB: /* XOR E */ | ||
1415 | #ifdef DYNA_DEBUG | ||
1416 | fdprintf(fd, "XOR E\n"); | ||
1417 | #endif | ||
1418 | break; /* FIXME: Implement */ | ||
1419 | case 0xAC: /* XOR H */ | ||
1420 | #ifdef DYNA_DEBUG | ||
1421 | fdprintf(fd, "XOR H\n"); | ||
1422 | #endif | ||
1423 | break; /* FIXME: Implement */ | ||
1424 | case 0xAD: /* XOR L */ | ||
1425 | #ifdef DYNA_DEBUG | ||
1426 | fdprintf(fd, "XOR L\n"); | ||
1427 | #endif | ||
1428 | break; /* FIXME: Implement */ | ||
1429 | case 0xAE: /* XOR (HL) */ | ||
1430 | #ifdef DYNA_DEBUG | ||
1431 | fdprintf(fd, "XOR (HL)\n"); | ||
1432 | #endif | ||
1433 | break; /* FIXME: Implement */ | ||
1434 | case 0xAF: /* XOR A */ | ||
1435 | #ifdef DYNA_DEBUG | ||
1436 | fdprintf(fd, "XOR A\n"); | ||
1437 | #endif | ||
1438 | break; /* FIXME: Implement */ | ||
1439 | case 0xB0: /* OR B */ | ||
1440 | #ifdef DYNA_DEBUG | ||
1441 | fdprintf(fd, "OR B\n"); | ||
1442 | #endif | ||
1443 | break; /* FIXME: Implement */ | ||
1444 | case 0xB1: /* OR C */ | ||
1445 | #ifdef DYNA_DEBUG | ||
1446 | fdprintf(fd, "OR C\n"); | ||
1447 | #endif | ||
1448 | break; /* FIXME: Implement */ | ||
1449 | case 0xB2: /* OR D */ | ||
1450 | #ifdef DYNA_DEBUG | ||
1451 | fdprintf(fd, "OR D\n"); | ||
1452 | #endif | ||
1453 | break; /* FIXME: Implement */ | ||
1454 | case 0xB3: /* OR E */ | ||
1455 | #ifdef DYNA_DEBUG | ||
1456 | fdprintf(fd, "OR E\n"); | ||
1457 | #endif | ||
1458 | break; /* FIXME: Implement */ | ||
1459 | case 0xB4: /* OR H */ | ||
1460 | #ifdef DYNA_DEBUG | ||
1461 | fdprintf(fd, "OR H\n"); | ||
1462 | #endif | ||
1463 | break; /* FIXME: Implement */ | ||
1464 | case 0xB5: /* OR L */ | ||
1465 | #ifdef DYNA_DEBUG | ||
1466 | fdprintf(fd, "OR L\n"); | ||
1467 | #endif | ||
1468 | break; /* FIXME: Implement */ | ||
1469 | case 0xB6: /* OR (HL) */ | ||
1470 | #ifdef DYNA_DEBUG | ||
1471 | fdprintf(fd, "OR (HL)\n"); | ||
1472 | #endif | ||
1473 | break; /* FIXME: Implement */ | ||
1474 | case 0xB7: /* OR A */ | ||
1475 | #ifdef DYNA_DEBUG | ||
1476 | fdprintf(fd, "OR A\n"); | ||
1477 | #endif | ||
1478 | break; /* FIXME: Implement */ | ||
1479 | case 0xB8: /* CP B */ | ||
1480 | #ifdef DYNA_DEBUG | ||
1481 | fdprintf(fd, "CP B\n"); | ||
1482 | #endif | ||
1483 | break; /* FIXME: Implement */ | ||
1484 | case 0xB9: /* CP C */ | ||
1485 | #ifdef DYNA_DEBUG | ||
1486 | fdprintf(fd, "CP C\n"); | ||
1487 | #endif | ||
1488 | break; /* FIXME: Implement */ | ||
1489 | case 0xBA: /* CP D */ | ||
1490 | #ifdef DYNA_DEBUG | ||
1491 | fdprintf(fd, "CP D\n"); | ||
1492 | #endif | ||
1493 | break; /* FIXME: Implement */ | ||
1494 | case 0xBB: /* CP E */ | ||
1495 | #ifdef DYNA_DEBUG | ||
1496 | fdprintf(fd, "CP E\n"); | ||
1497 | #endif | ||
1498 | break; /* FIXME: Implement */ | ||
1499 | case 0xBC: /* CP H */ | ||
1500 | #ifdef DYNA_DEBUG | ||
1501 | fdprintf(fd, "CP H\n"); | ||
1502 | #endif | ||
1503 | break; /* FIXME: Implement */ | ||
1504 | case 0xBD: /* CP L */ | ||
1505 | #ifdef DYNA_DEBUG | ||
1506 | fdprintf(fd, "CP L\n"); | ||
1507 | #endif | ||
1508 | break; /* FIXME: Implement */ | ||
1509 | case 0xBE: /* CP (HL) */ | ||
1510 | #ifdef DYNA_DEBUG | ||
1511 | fdprintf(fd, "CP (HL)\n"); | ||
1512 | #endif | ||
1513 | break; /* FIXME: Implement */ | ||
1514 | case 0xBF: /* CP A */ | ||
1515 | #ifdef DYNA_DEBUG | ||
1516 | fdprintf(fd, "CP A\n"); | ||
1517 | #endif | ||
1518 | break; /* FIXME: Implement */ | ||
1519 | case 0xC0: /* RET NZ */ | ||
1520 | #ifdef DYNA_DEBUG | ||
1521 | fdprintf(fd, "RET NZ\n"); | ||
1522 | #endif | ||
1523 | break; /* FIXME: Implement */ | ||
1524 | case 0xC1: /* POP BC */ | ||
1525 | #ifdef DYNA_DEBUG | ||
1526 | fdprintf(fd, "POP BC\n"); | ||
1527 | #endif | ||
1528 | break; | ||
1529 | case 0xC2: /* JP NZ */ | ||
1530 | #ifdef DYNA_DEBUG | ||
1531 | fdprintf(fd,"JP NZ\n"); | ||
1532 | #endif | ||
1533 | DYNA_BTST_l_r(8,7); /* btst #8,d7 */ | ||
1534 | DYNA_DUMMYBRANCH(2,0); | ||
1535 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | ||
1536 | DYNA_MOVE_l_i_to_m(tclen,3); | ||
1537 | DYNA_MOVEA_l_i_to_r(readw(PC),1); | ||
1538 | DYNA_RET(); | ||
1539 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | ||
1540 | tclen--; | ||
1541 | PC+=2; | ||
1542 | break; | ||
1543 | case 0xC3: /* JP (imm) PC = readw(PC) */ | ||
735 | #ifdef DYNA_DEBUG | 1544 | #ifdef DYNA_DEBUG |
736 | fdprintf(fd,"LD B,#0x%x\n",readb(xPC)); | 1545 | fdprintf(fd,"JP (0x%x)\n",readw(xPC)); |
1546 | #endif | ||
1547 | PC=readw(PC); | ||
1548 | done=1; | ||
1549 | break; | ||
1550 | case 0xC4: /* CALL NZ */ | ||
1551 | #ifdef DYNA_DEBUG | ||
1552 | fdprintf(fd, "CALL NZ\n"); | ||
1553 | #endif | ||
1554 | break; /* FIXME: Implement */ | ||
1555 | case 0xC5: /* PUSH BC */ | ||
1556 | #ifdef DYNA_DEBUG | ||
1557 | fdprintf(fd, "PUSH BC\n"); | ||
1558 | #endif | ||
1559 | break; /* FIXME: Implement */ | ||
1560 | case 0xC6: /* ADD A,imm */ | ||
1561 | #ifdef DYNA_DEBUG | ||
1562 | fdprintf(fd, "ADD A,imm\n"); | ||
1563 | #endif | ||
1564 | break; /* FIXME: Implement */ | ||
1565 | case 0xC7: /* RST 0h */ | ||
1566 | #ifdef DYNA_DEBUG | ||
1567 | fdprintf(fd, "RST 0h\n"); | ||
1568 | #endif | ||
1569 | break; /* FIXME: Implement */ | ||
1570 | case 0xC8: /* RET Z */ | ||
1571 | #ifdef DYNA_DEBUG | ||
1572 | fdprintf(fd, "RET Z\n"); | ||
1573 | #endif | ||
1574 | break; /* FIXME: Implement */ | ||
1575 | case 0xC9: /* RET */ | ||
1576 | #ifdef DYNA_DEBUG | ||
1577 | fdprintf(fd,"RET\n"); | ||
1578 | #endif | ||
1579 | POPA(1); | ||
1580 | writepc=0; | ||
1581 | done=1; | ||
1582 | break; | ||
1583 | case 0xCA: /* JP Z */ | ||
1584 | break; /* FIXME: Implement */ | ||
1585 | case 0xCB: /* NULL */ | ||
1586 | #ifdef DYNA_DEBUG | ||
1587 | fdprintf(fd,"NULL\n"); | ||
1588 | #endif | ||
1589 | break; | ||
1590 | case 0xCC: /* CALL Z */ | ||
1591 | #ifdef DYNA_DEBUG | ||
1592 | fdprintf(fd, "CALL Z\n"); | ||
1593 | #endif | ||
1594 | break; /* FIXME: Implement */ | ||
1595 | case 0xCD: /* CALL (imm) PUSH(PC+2) PC=readw(PC); */ | ||
1596 | #ifdef DYNA_DEBUG | ||
1597 | fdprintf(fd,"CALL (0x%x)\n",readw(xPC)); | ||
1598 | #endif | ||
1599 | PUSH(PC+2); | ||
1600 | PC=readw(PC); | ||
1601 | done=1; | ||
1602 | break; | ||
1603 | case 0xCE: /* ADC A,imm */ | ||
1604 | #ifdef DYNA_DEBUG | ||
1605 | fdprintf(fd, "ADC A,imm\n"); | ||
1606 | #endif | ||
1607 | break; /* FIXME: Implement */ | ||
1608 | case 0xCF: /* RST 8h */ | ||
1609 | #ifdef DYNA_DEBUG | ||
1610 | fdprintf(fd, "RST 8h\n"); | ||
737 | #endif | 1611 | #endif |
738 | DYNA_MOVEQ_l_i_to_r(FETCH,2); | 1612 | break; /* FIXME: Implement */ |
739 | break; | 1613 | case 0xD0: /* RET NC */ |
740 | case 0x0E: /* LD C,imm */ | ||
741 | #ifdef DYNA_DEBUG | 1614 | #ifdef DYNA_DEBUG |
742 | fdprintf(fd,"LD C,#0x%x\n",readb(xPC)); | 1615 | fdprintf(fd,"RET NC\n"); |
1616 | #endif | ||
1617 | DYNA_BTST_l_r(5,7); /* btst #5,d7 */ | ||
1618 | DYNA_DUMMYBRANCH(2,0); | ||
1619 | POPA(1); /* POP %a1 */ | ||
1620 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | ||
1621 | DYNA_MOVE_l_i_to_m(tclen,3); | ||
1622 | DYNA_RET(); | ||
1623 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | ||
1624 | tclen-=3; | ||
1625 | break; | ||
1626 | case 0xD1: /* POP DE */ | ||
1627 | #ifdef DYNA_DEBUG | ||
1628 | fdprintf(fd, "POP DE\n"); | ||
1629 | #endif | ||
1630 | break; /* FIXME: Implement */ | ||
1631 | case 0xD2: /* JP NC */ | ||
1632 | #ifdef DYNA_DEBUG | ||
1633 | fdprintf(fd, "JP NC\n"); | ||
743 | #endif | 1634 | #endif |
744 | DYNA_MOVEQ_l_i_to_r(FETCH,3); | 1635 | break; /* FIXME: Implement */ |
745 | break; | 1636 | case 0xD3: /* NULL */ |
746 | case 0x16: /* LD D,imm */ | ||
747 | #ifdef DYNA_DEBUG | 1637 | #ifdef DYNA_DEBUG |
748 | fdprintf(fd,"LD D,#0x%x\n",readb(xPC)); | 1638 | fdprintf(fd,"NULL\n"); |
1639 | #endif | ||
1640 | break; | ||
1641 | case 0xD4: /* CALL NC */ | ||
1642 | #ifdef DYNA_DEBUG | ||
1643 | fdprintf(fd, "CALL NC\n"); | ||
1644 | #endif | ||
1645 | break; /* FIXME: Implement */ | ||
1646 | case 0xD5: /* PUSH DE */ | ||
1647 | #ifdef DYNA_DEBUG | ||
1648 | fdprintf(fd, "PUSH DE\n"); | ||
1649 | #endif | ||
1650 | break; /* FIXME: Implement */ | ||
1651 | case 0xD6: /* SUB imm */ | ||
1652 | #ifdef DYNA_DEBUG | ||
1653 | fdprintf(fd, "SUB imm\n"); | ||
1654 | #endif | ||
1655 | break; /* FIXME: Implement */ | ||
1656 | case 0xD7: /* RST 10h */ | ||
1657 | #ifdef DYNA_DEBUG | ||
1658 | fdprintf(fd, "RST 10h\n"); | ||
749 | #endif | 1659 | #endif |
750 | DYNA_MOVEQ_l_i_to_r(FETCH,4); | 1660 | break; /* FIXME: Implement */ |
751 | break; | 1661 | case 0xD8: /* RET C */ |
752 | case 0x1E: /* LD E,imm */ | 1662 | #ifdef DYNA_DEBUG |
1663 | fdprintf(fd, "RET C\n"); | ||
1664 | #endif | ||
1665 | break; /* FIXME: Implement */ | ||
1666 | case 0xD9: /* RETI */ | ||
1667 | #ifdef DYNA_DEBUG | ||
1668 | fdprintf(fd, "RETI\n"); | ||
1669 | #endif | ||
1670 | break; /* FIXME: Implement */ | ||
1671 | case 0xDA: /* JP C */ | ||
1672 | #ifdef DYNA_DEBUG | ||
1673 | fdprintf(fd, "JP C\n"); | ||
1674 | #endif | ||
1675 | break; /* FIXME: Implement */ | ||
1676 | case 0xDB: /* NULL */ | ||
753 | #ifdef DYNA_DEBUG | 1677 | #ifdef DYNA_DEBUG |
754 | fdprintf(fd,"LD E,#0x%x\n",readb(xPC)); | 1678 | fdprintf(fd,"NULL\n"); |
755 | #endif | 1679 | #endif |
756 | DYNA_MOVEQ_l_i_to_r(FETCH,5); | 1680 | break; |
757 | break; | 1681 | case 0xDC: /* CALL NC */ |
758 | case 0x26: /* LD H,imm */ | 1682 | #ifdef DYNA_DEBUG |
1683 | fdprintf(fd, "CALL NC\n"); | ||
1684 | #endif | ||
1685 | break; /* FIXME: Implement */ | ||
1686 | case 0xDD: /* NULL */ | ||
759 | #ifdef DYNA_DEBUG | 1687 | #ifdef DYNA_DEBUG |
760 | fdprintf(fd,"LD H,#0x%x\n",readb(xPC)); | 1688 | fdprintf(fd,"NULL\n"); |
1689 | #endif | ||
1690 | break; | ||
1691 | case 0xDE: /* SBC A,imm */ | ||
1692 | #ifdef DYNA_DEBUG | ||
1693 | fdprintf(fd, "SBC A,imm\n"); | ||
1694 | #endif | ||
1695 | break; /* FIXME: Implement */ | ||
1696 | case 0xDF: /* RST 18h */ | ||
1697 | #ifdef DYNA_DEBUG | ||
1698 | fdprintf(fd, "RST 18h\n"); | ||
761 | #endif | 1699 | #endif |
762 | DYNA_AND_l_i_to_r(0xFF,6); | 1700 | break; /* FIXME: Implement */ |
763 | DYNA_OR_l_i_to_r(FETCH<<8,6); | 1701 | case 0xE0: /* LDH (imm),A */ |
764 | break; | ||
765 | case 0x2E: /* LD L,imm */ | ||
766 | #ifdef DYNA_DEBUG | 1702 | #ifdef DYNA_DEBUG |
767 | fdprintf(fd,"LD L,#0x%x\n",readb(xPC)); | 1703 | fdprintf(fd,"LD (0x%x),A\n",readb(xPC)); |
1704 | #endif | ||
1705 | DYNA_PUSH_l_r(1,0); | ||
1706 | DYNA_PEA_w_i(FETCH); | ||
1707 | CALL_NATIVE(&writehi); | ||
1708 | DYNA_ADDQ_l_i_to_r(0,7,1); | ||
1709 | /*writehi(FETCH, A); */ | ||
1710 | break; | ||
1711 | case 0xE1: /* POP HL */ | ||
1712 | #ifdef DYNA_DEBUG | ||
1713 | fdprintf(fd, "POP HL\n"); | ||
1714 | #endif | ||
1715 | break; /* FIXME: Implement */ | ||
1716 | case 0xE2: /* LDH (imm),A */ | ||
1717 | #ifdef DYNA_DEBUG | ||
1718 | fdprintf(fd, "LDH (imm),A\n"); | ||
768 | #endif | 1719 | #endif |
769 | DYNA_AND_l_i_to_r(0xFF00,6); | 1720 | break; /* FIXME: Implement */ |
770 | DYNA_OR_l_i_to_r(FETCH,6); | 1721 | case 0xE3: /* NULL */ |
771 | break; | ||
772 | case 0x3E: /* LD A,imm */ | ||
773 | #ifdef DYNA_DEBUG | 1722 | #ifdef DYNA_DEBUG |
774 | fdprintf(fd,"LD A,#0x%x\n",readb(xPC)); | 1723 | fdprintf(fd,"NULL\n"); |
775 | #endif | 1724 | #endif |
776 | DYNA_MOVEQ_l_i_to_r(FETCH,1); | 1725 | break; |
777 | break; | 1726 | case 0xE4: /* NULL */ |
778 | 1727 | break; | |
779 | case 0xF9: /* LD SP,HL */ | ||
780 | #ifdef DYNA_DEBUG | 1728 | #ifdef DYNA_DEBUG |
781 | fdprintf(fd,"LD SP,HL\n"); | 1729 | fdprintf(fd,"NULL\n"); |
1730 | #endif | ||
1731 | case 0xE5: /* PUSH HL */ | ||
1732 | #ifdef DYNA_DEBUG | ||
1733 | fdprintf(fd, "PUSH HL\n"); | ||
1734 | #endif | ||
1735 | break; /* FIXME: Implement */ | ||
1736 | case 0xE6: /* AND imm */ | ||
1737 | #ifdef DYNA_DEBUG | ||
1738 | fdprintf(fd, "AND imm\n"); | ||
782 | #endif | 1739 | #endif |
783 | DYNA_MOVEA_w_r_to_r(6,0,0); | 1740 | break; /* FIXME: Implement */ |
784 | break; | 1741 | case 0xE7: /* RST 20h */ |
785 | case 0xF3: /* DI */ | ||
786 | #ifdef DYNA_DEBUG | 1742 | #ifdef DYNA_DEBUG |
787 | fdprintf(fd,"DI\n"); | 1743 | fdprintf(fd, "RST 20h\n"); |
788 | #endif | 1744 | #endif |
789 | DYNA_CLR_l_m(&cpu.ime); | 1745 | break; /* FIXME: Implement */ |
790 | DYNA_CLR_l_m(&cpu.ima); | 1746 | case 0xE8: /* ADD SP */ |
791 | DYNA_CLR_l_m(&cpu.halt); | 1747 | #ifdef DYNA_DEBUG |
792 | /* cpu.halt = cpu.ima = cpu.ime = 0; */ | 1748 | fdprintf(fd, "ADD SP\n"); |
793 | break; | 1749 | #endif |
794 | case 0xFB: /* EI */ | 1750 | break; /* FIXME: Implement */ |
1751 | case 0xE9: /* JP HL */ | ||
1752 | #ifdef DYNA_DEBUG | ||
1753 | fdprintf(fd, "JP HL\n"); | ||
1754 | #endif | ||
1755 | break; /* FIXME: Implement */ | ||
1756 | case 0xEA: /* LD A */ | ||
1757 | #ifdef DYNA_DEBUG | ||
1758 | fdprintf(fd, "LD A\n"); | ||
1759 | #endif | ||
1760 | break; /* FIXME: Implement */ | ||
1761 | case 0xEB: /* NULL */ | ||
795 | #ifdef DYNA_DEBUG | 1762 | #ifdef DYNA_DEBUG |
796 | fdprintf(fd,"EI\n"); | 1763 | fdprintf(fd,"NULL\n"); |
797 | #endif | 1764 | #endif |
798 | DYNA_MOVEQ_l_i_to_r(1,0); | 1765 | break; |
799 | DYNA_MOVEA_l_i_to_r(&cpu.ima,3); | 1766 | case 0xEC: /* NULL */ |
800 | DYNA_MOVE_l_r_to_m(0,3); | ||
801 | /*cpu.ima=1; */ | ||
802 | break; | ||
803 | |||
804 | case 0xE0: /* LDH (imm),A */ | ||
805 | #ifdef DYNA_DEBUG | 1767 | #ifdef DYNA_DEBUG |
806 | fdprintf(fd,"LD (0x%x),A\n",readb(xPC)); | 1768 | fdprintf(fd,"NULL\n"); |
807 | #endif | 1769 | #endif |
808 | DYNA_PUSH_l_r(1,0); | 1770 | break; |
809 | DYNA_PEA_w_i(FETCH); | 1771 | case 0xED: /* NULL */ |
810 | CALL_NATIVE(&writehi); | ||
811 | DYNA_ADDQ_l_i_to_r(0,7,1); | ||
812 | /*writehi(FETCH, A); */ | ||
813 | break; | ||
814 | |||
815 | case 0xC3: /* JP (imm) PC = readw(PC) */ | ||
816 | #ifdef DYNA_DEBUG | 1772 | #ifdef DYNA_DEBUG |
817 | fdprintf(fd,"JP (0x%x)\n",readw(xPC)); | 1773 | fdprintf(fd,"NULL\n"); |
818 | #endif | 1774 | #endif |
819 | PC=readw(PC); | 1775 | break; |
820 | done=1; | 1776 | case 0xEE: /* XOR imm */ |
821 | break; | ||
822 | case 0xCD: /* CALL (imm) PUSH(PC+2) PC=readw(PC); */ | ||
823 | #ifdef DYNA_DEBUG | 1777 | #ifdef DYNA_DEBUG |
824 | fdprintf(fd,"CALL (0x%x)\n",readw(xPC)); | 1778 | fdprintf(fd, "XOR imm\n"); |
825 | #endif | 1779 | #endif |
826 | PUSH(PC+2); | 1780 | break; /* FIXME: Implement */ |
827 | PC=readw(PC); | 1781 | case 0xEF: /* RST 28h */ |
828 | done=1; | 1782 | #ifdef DYNA_DEBUG |
829 | break; | 1783 | fdprintf(fd, "RST 28h\n"); |
830 | 1784 | #endif | |
831 | case 0x97: /* SUB A (halfcarry ?) */ | 1785 | break; /* FIXME: Implement */ |
832 | #ifdef DYNA_DEBUG | 1786 | case 0xF0: /* LDH A,(imm) */ |
833 | fdprintf(fd,"SUB A\n"); | 1787 | #ifdef DYNA_DEBUG |
834 | #endif | 1788 | fdprintf(fd,"LDH A,(0x%x)\n",readb(xPC)); |
835 | DYNA_CLR_l_r(1); | 1789 | #endif |
836 | DYNA_MOVEQ_l_i_to_r(0xC0,7); | 1790 | DYNA_PEA_w_i(FETCH); |
837 | break; | 1791 | CALL_NATIVE(&readhi); |
838 | case 0xF0: /* LDH A,(imm) */ | 1792 | DYNA_ADDQ_l_i_to_r(4,7,1); |
839 | #ifdef DYNA_DEBUG | 1793 | DYNA_MOVE_b_r_to_r(0,1); |
840 | fdprintf(fd,"LDH A,(0x%x)\n",readb(xPC)); | 1794 | /*A = readhi(FETCH)*/ |
841 | #endif | 1795 | break; |
842 | DYNA_PEA_w_i(FETCH); | 1796 | case 0xF1: /* POP AF */ |
843 | CALL_NATIVE(&readhi); | 1797 | #ifdef DYNA_DEBUG |
844 | DYNA_ADDQ_l_i_to_r(4,7,1); | 1798 | fdprintf(fd, "POP AF\n"); |
845 | DYNA_MOVE_b_r_to_r(0,1); | 1799 | #endif |
846 | /*A = readhi(FETCH)*/ | 1800 | break; /* FIXME: Implement */ |
847 | break; | 1801 | case 0xF2: /* LDH A,(imm) */ |
848 | case 0x87: // ADD A,A | 1802 | #ifdef DYNA_DEBUG |
849 | #ifdef DYNA_DEBUG | 1803 | fdprintf(fd, "LDH A,(imm)\n"); |
850 | fdprintf(fd,"ADD A,A\n"); | 1804 | #endif |
851 | #endif | 1805 | break; /* FIXME: Implement */ |
852 | /* code taken from gcc -O3 output by compiling; | 1806 | case 0xF3: /* DI */ |
853 | * c=(2*b)&0xFF; | 1807 | #ifdef DYNA_DEBUG |
854 | * a=(c) ? 0 : 0x80 | // zero flag | 1808 | fdprintf(fd,"DI\n"); |
855 | * (0x20 & (c) << 1) | // halfcarry | 1809 | #endif |
856 | * ((2*b)&0x100)>>4; // carry | 1810 | DYNA_CLR_l_m(&cpu.ime); |
857 | */ | 1811 | DYNA_CLR_l_m(&cpu.ima); |
858 | DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1, d0 */ | 1812 | DYNA_CLR_l_m(&cpu.halt); |
859 | DYNA_ADD_l_r_to_r(0,0,0); /* add.l d0, d0 */ | 1813 | /* cpu.halt = cpu.ima = cpu.ime = 0; */ |
860 | DYNA_AND_l_i_to_r(510,0); /* and.l #510, d0 */ | 1814 | break; |
861 | DYNA_MOVEA_l_r_to_r(0,3,0); /* movea.l d0,a3 */ | 1815 | case 0xF4: /* NULL */ |
862 | DYNA_CLR_b_r(7); /* clr.b d7 */ | 1816 | #ifdef DYNA_DEBUG |
863 | DYNA_TST_b_r(0,0); /* tst.b d0 */ | 1817 | fdprintf(fd,"NULL\n"); |
864 | DYNA_DUMMYBRANCH(2,0); | 1818 | #endif |
865 | DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1,d0 */ | 1819 | break; |
866 | DYNA_LSHIFT_l(3,0,0,0); /* lsr.l #3, d0 */ | 1820 | case 0xF5: /* PUSH AF */ |
867 | DYNA_MOVEQ_l_i_to_r(16,1); /* moveq #16,d1 */ | 1821 | #ifdef DYNA_DEBUG |
868 | DYNA_AND_l_r_to_r(1,0); /* and.l d1 d0 */ | 1822 | fdprintf(fd, "PUSH AF\n"); |
869 | DYNA_MOVEQ_l_i_to_r(0x80,7); /* moveq #0x80,d7 */ | 1823 | #endif |
870 | DYNA_OR_l_r_to_r(0,7); /* or.l d0, d7 */ | 1824 | break; /* FIXME: Implement */ |
871 | DYNA_BCC_c(0x6,2,0); /* branch not equal, here */ | 1825 | case 0xF6: /* OR imm */ |
872 | DYNA_MOVE_l_r_to_r(3,1,1); /* move.l a3,d1 */ | 1826 | #ifdef DYNA_DEBUG |
873 | DYNA_AND_l_i_to_r(0xFE,1); /* and.l #0xFE,d1 */ | 1827 | fdprintf(fd, "OR imm\n"); |
874 | DYNA_AND_l_i_to_r(0xB0,7); /* and.l #0xB0,d7 */ | 1828 | #endif |
875 | break; | 1829 | break; /* FIXME: Implement */ |
876 | case 0xD0: /* RET NC */ | 1830 | case 0xF7: /* RST 30h */ |
877 | #ifdef DYNA_DEBUG | 1831 | #ifdef DYNA_DEBUG |
878 | fdprintf(fd,"RET NC\n"); | 1832 | fdprintf(fd, "RST 30h\n"); |
879 | #endif | 1833 | #endif |
880 | DYNA_BTST_l_r(5,7); /* btst #5,d7 */ | 1834 | break; /* FIXME: Implement */ |
881 | DYNA_DUMMYBRANCH(2,0); | 1835 | case 0xF8: /* LD HL,SP */ |
882 | POPA(1); /* POP %a1 */ | 1836 | #ifdef DYNA_DEBUG |
883 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | 1837 | fdprintf(fd, "LD HL,SP\n"); |
884 | DYNA_MOVE_l_i_to_m(tclen,3); | 1838 | #endif |
885 | DYNA_RET(); | 1839 | break; /* FIXME: Implement */ |
886 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | 1840 | case 0xF9: /* LD SP,HL */ |
887 | tclen-=3; | 1841 | #ifdef DYNA_DEBUG |
888 | break; | 1842 | fdprintf(fd,"LD SP,HL\n"); |
889 | case 0xC9: /* RET */ | 1843 | #endif |
890 | #ifdef DYNA_DEBUG | 1844 | DYNA_MOVEA_w_r_to_r(6,0,0); |
891 | fdprintf(fd,"RET\n"); | 1845 | break; |
892 | #endif | 1846 | case 0xFA: /* LD A, (imm) */ |
893 | POPA(1); | 1847 | #ifdef DYNA_DEBUG |
894 | writepc=0; | 1848 | fdprintf(fd,"LD A,(0x%x)\n",readw(xPC)); |
895 | done=1; | 1849 | #endif |
896 | break; | 1850 | /*DYNA_PEA_w_i(readw(xPC)); |
897 | case 0x20: /* JR NZ */ | 1851 | PC+=2; \ |
898 | #ifdef DYNA_DEBUG | 1852 | CALL_NATIVE(&readb); \ |
899 | fdprintf(fd,"JR NZ\n"); | 1853 | DYNA_ADDQ_l_i_to_r(4,7,1); \ |
900 | #endif | 1854 | DYNA_MOVE_l_r_to_r(0,1,0);*/ |
901 | DYNA_BTST_l_r(8,7); /* btst #8,d7 */ | 1855 | break; |
902 | DYNA_DUMMYBRANCH(2,0); | 1856 | case 0xFB: /* EI */ |
903 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | 1857 | #ifdef DYNA_DEBUG |
904 | DYNA_MOVE_l_i_to_m(tclen,3); | 1858 | fdprintf(fd,"EI\n"); |
905 | DYNA_MOVEA_l_i_to_r(PC+1+(signed char)readb(PC),1); | 1859 | #endif |
906 | DYNA_RET(); | 1860 | DYNA_MOVEQ_l_i_to_r(1,0); |
907 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | 1861 | DYNA_MOVEA_l_i_to_r(&cpu.ima,3); |
908 | tclen--; | 1862 | DYNA_MOVE_l_r_to_m(0,3); |
909 | PC++; | 1863 | /*cpu.ima=1; */ |
910 | break; | 1864 | break; |
911 | case 0xC2: /* JP NZ */ | 1865 | case 0xFC: /* NULL */ |
912 | #ifdef DYNA_DEBUG | 1866 | #ifdef DYNA_DEBUG |
913 | fdprintf(fd,"JP NZ\n"); | 1867 | fdprintf(fd,"NULL\n"); |
914 | #endif | 1868 | #endif |
915 | DYNA_BTST_l_r(8,7); /* btst #8,d7 */ | 1869 | break; |
916 | DYNA_DUMMYBRANCH(2,0); | 1870 | case 0xFD: /* NULL */ |
917 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | 1871 | #ifdef DYNA_DEBUG |
918 | DYNA_MOVE_l_i_to_m(tclen,3); | 1872 | fdprintf(fd,"NULL\n"); |
919 | DYNA_MOVEA_l_i_to_r(readw(PC),1); | 1873 | #endif |
920 | DYNA_RET(); | 1874 | break; |
921 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | 1875 | case 0xFE: /* CMP #<imm> TODO: can be (much) more efficient.*/ |
922 | tclen--; | 1876 | #ifdef DYNA_DEBUG |
923 | PC+=2; | 1877 | fdprintf(fd,"CMP #0x%x\n",readb(xPC)); |
924 | break; | 1878 | #endif |
925 | /* case 0xFA: /* LD A, (imm) | 1879 | DYNA_MOVEA_l_r_to_r(2,3,0); /* movea.l %d2, %a3 */ |
926 | #ifdef DYNA_DEBUG | 1880 | DYNA_MOVEQ_l_i_to_r(FETCH,2); /* moveq.l #<FETCH>,%d2 */ |
927 | fdprintf(fd,"LD A,(0x%x)\n",readw(xPC)); | 1881 | CMP(2); |
928 | #endif | 1882 | DYNA_MOVE_l_r_to_r(3,2,1); /* move.l %a3, %d2 */ |
929 | DYNA_PEA_w_i(readw(xPC)); | 1883 | break; |
930 | PC+=2; \ | 1884 | case 0xFF: /* RST 38h */ |
931 | CALL_NATIVE(&readb); \ | 1885 | #ifdef DYNA_DEBUG |
932 | DYNA_ADDQ_l_i_to_r(4,7,1); \ | 1886 | fdprintf(fd, "RST 38h\n"); |
933 | DYNA_MOVE_l_r_to_r(0,1,0); | 1887 | #endif |
934 | break; */ | 1888 | break; /* FIXME: Implement */ |
935 | 1889 | default: | |
936 | case 0xFE: /* CMP #<imm> TODO: can be (much) more efficient.*/ | 1890 | snprintf(meow,499,"unimplemented opcode %d / 0x%x",op,op); |
937 | #ifdef DYNA_DEBUG | 1891 | die(meow); |
938 | fdprintf(fd,"CMP #0x%x\n",readb(xPC)); | 1892 | return; |
939 | #endif | 1893 | break; |
940 | DYNA_MOVEA_l_r_to_r(2,3,0); /* movea.l %d2, %a3 */ | 1894 | } |
941 | DYNA_MOVEQ_l_i_to_r(FETCH,2); /* moveq.l #<FETCH>,%d2 */ | ||
942 | CMP(2); | ||
943 | DYNA_MOVE_l_r_to_r(3,2,1); /* move.l %a3, %d2 */ | ||
944 | break; | ||
945 | |||
946 | case 0xB1: /* OR C */ | ||
947 | #ifdef DYNA_DEBUG | ||
948 | fdprintf(fd,"OR C\n"); | ||
949 | #endif | ||
950 | DYNA_OR_l_r_to_r(3,1); // or %d3,%d1 | ||
951 | DYNA_MOVEQ_l_i_to_r(0,7); | ||
952 | DYNA_TST_b_r(1,0); | ||
953 | DYNA_DUMMYBRANCH(2,0); | ||
954 | DYNA_MOVEQ_l_i_to_r(0x80,7); | ||
955 | DYNA_BCC_c(0x6,2,0); | ||
956 | break; | ||
957 | default: | ||
958 | snprintf(meow,499,"unimplemented opcode %d / 0x%x",op,op); | ||
959 | die(meow); | ||
960 | return; | ||
961 | break; | ||
962 | } | ||
963 | } | 1895 | } |
964 | #ifdef DYNA_DEBUG | 1896 | #ifdef DYNA_DEBUG |
965 | fdprintf(fd,"(End of Block)\n"); | 1897 | fdprintf(fd,"(End of Block)\n"); |
@@ -968,7 +1900,7 @@ void dynamic_recompile (struct dynarec_block *newblock) { | |||
968 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | 1900 | DYNA_MOVEA_l_i_to_r(&blockclen,3); |
969 | DYNA_MOVE_l_i_to_m(tclen,3); | 1901 | DYNA_MOVE_l_i_to_m(tclen,3); |
970 | if(writepc) | 1902 | if(writepc) |
971 | DYNA_MOVEA_l_i_to_r(PC,1); | 1903 | DYNA_MOVEA_l_i_to_r(PC,1); |
972 | DYNA_RET(); | 1904 | DYNA_RET(); |
973 | PC=oldpc; | 1905 | PC=oldpc; |
974 | setmallocpos(dynapointer); | 1906 | setmallocpos(dynapointer); |
@@ -976,9 +1908,9 @@ void dynamic_recompile (struct dynarec_block *newblock) { | |||
976 | invalidate_icache(); | 1908 | invalidate_icache(); |
977 | snprintf(meow,499,"/dyna_0x%x_code.rb",PC); | 1909 | snprintf(meow,499,"/dyna_0x%x_code.rb",PC); |
978 | fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); | 1910 | fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); |
979 | if(fd>=0) { | 1911 | if(fd>=0) |
1912 | { | ||
980 | write(fd,newblock->block,newblock->length); | 1913 | write(fd,newblock->block,newblock->length); |
981 | close(fd); | 1914 | close(fd); |
982 | } | 1915 | } |
983 | } | 1916 | } |
984 | #endif | ||