summaryrefslogtreecommitdiff
path: root/apps/plugins/rockboy/dynarec.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/rockboy/dynarec.c')
-rw-r--r--apps/plugins/rockboy/dynarec.c1946
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
136void DYNA_MOVE_b_r_to_r(un8 src,un8 dest) { 134void 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
140void DYNA_ASHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { 139void 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
150void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { 150void 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
159void DYNA_MOVE_l_i_to_r(un32 imm, un8 dest) { 160void 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
164void DYNA_MOVE_l_i_to_m(un32 imm, un8 dest_a) { 166void 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
169void DYNA_MOVE_l_r_to_m(un8 src,un8 dest_a) { 172void 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
173void DYNA_MOVE_l_r_to_r(un8 src, un8 dest, int src_is_areg) { 177void 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
180void DYNA_MOVE_w_r_to_r(un8 src, un8 dest, int src_is_areg) { 185void 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
187void DYNA_MOVEQ_l_i_to_r(un8 imm, un8 dest) { 193void 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
191void DYNA_PEA_w_i(un16 imm) { 198void DYNA_PEA_w_i(un16 imm)
199{
192 DWRITEW(0x4878); 200 DWRITEW(0x4878);
193 DWRITEW(imm); 201 DWRITEW(imm);
194} 202}
195 203
196void DYNA_PUSH_l_r(un8 reg,int src_is_areg) { 204void 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
203void DYNA_MOVEA_l_i_to_r(un32 imm, un8 dest) { 212void 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
208void DYNA_MOVEA_w_r_to_r(un8 src, un8 dest, int src_is_areg) { 218void 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
215void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) { 226void 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
223void DYNA_RET() { 235void DYNA_RET(void)
236{
224 DWRITEW(0x4E75); 237 DWRITEW(0x4E75);
225} 238}
226 239
227void DYNA_AND_l_i_to_r(un32 imm, un8 dest) { 240void 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
232void DYNA_AND_l_r_to_r(un8 src,un8 dest) { 246void 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
236void DYNA_OR_l_r_to_r(un8 src,un8 dest) { 251void 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
240void DYNA_OR_l_i_to_r(un32 imm,un8 dest) { 256void 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
245void DYNA_CLR_l_m(un32 addr) { 262void DYNA_CLR_l_m(un32 addr)
263{
246 DWRITEW(0x42B9); 264 DWRITEW(0x42B9);
247 DWRITEL(addr); 265 DWRITEL(addr);
248} 266}
249 267
250void DYNA_CLR_l_r(un8 reg) { 268void DYNA_CLR_l_r(un8 reg)
269{
251 DWRITEW(0x4280|(reg&0x7)); 270 DWRITEW(0x4280|(reg&0x7));
252} 271}
253 272
254void DYNA_CLR_w_r(un8 reg) { 273void DYNA_CLR_w_r(un8 reg)
274{
255 DWRITEW(0x42C0|(reg&0x7)); 275 DWRITEW(0x42C0|(reg&0x7));
256} 276}
257 277
258 278
259void DYNA_CLR_b_r(un8 reg) { 279void DYNA_CLR_b_r(un8 reg)
280{
260 DWRITEW(0x4200|(reg&0x7)); 281 DWRITEW(0x4200|(reg&0x7));
261} 282}
262 283
263 284
264void DYNA_ADDQ_l_i_to_r(un8 imm, un8 reg, int dest_is_a) { 285void 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
271void DYNA_ADD_l_r_to_r(un8 src, un8 dest, int src_is_areg) { 293void 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
278void DYNA_JSR(void *addr) { 301void DYNA_JSR(void *addr)
302{
279 DWRITEW(0x4EB9); 303 DWRITEW(0x4EB9);
280 DWRITEL(addr); 304 DWRITEL(addr);
281} 305}
282 306
283void DYNA_MOVEM(un8 areg,un16 mask, int frommem) { 307void 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
291void DYNA_SUBQ_l_i_to_r(un8 imm, un8 reg, int addr_reg) { 316void 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
298void DYNA_SUB_l_r_to_r(un8 src, un8 dest, int is_areg) { 324void 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
305void DYNA_EXT_l(un8 reg) { 332void DYNA_EXT_l(un8 reg)
333{
306 DWRITEW(0x48C0|(reg&0x7)); 334 DWRITEW(0x48C0|(reg&0x7));
307} 335}
308 336
309void DYNA_BCC_c(un8 cond, int size,int i) { 337void 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
330void DYNA_DUMMYBRANCH(int size,int i) { 361void 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
335void DYNA_TST_l_r(un8 reg,int is_areg) { 367void 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
342void DYNA_TST_b_r(un8 reg,int is_areg) { 375void 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
350void DYNA_BTST_l_r(un8 bit, un8 reg) { 384void 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
355void DYNA_NEG_l(un8 reg) { 390void DYNA_NEG_l(un8 reg)
391{
356 DWRITEW(0x4480|(reg&0x7)); 392 DWRITEW(0x4480|(reg&0x7));
357} 393}
358 394
359void DYNA_XOR_l_r_to_r(un8 src, un8 dest) { 395void 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
363void DYNA_SET_b_r(un8 src, un8 cond) { 400void 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
367void DYNA_INC_l_r(un8 dest,int is_areg) { 405void 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
371void DYNA_DEC_l_r(un8 dest,int is_areg) { 410void 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
376void dynamic_recompile (struct dynarec_block *newblock) { 416void 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