comparison 68kinst.c @ 10:4553fc97b15e

Added new OPSIZE for unsized instructions so they can be properly disassembled without making them special cases
author Mike Pavone <pavone@retrodev.com>
date Wed, 14 Nov 2012 09:24:40 -0800
parents 0a0cd3705c19
children d5e9bac9ebdf
comparison
equal deleted inserted replaced
9:0a0cd3705c19 10:4553fc97b15e
471 break; 471 break;
472 case 9: 472 case 9:
473 #ifdef M68010 473 #ifdef M68010
474 decoded->op = M68K_BKPT; 474 decoded->op = M68K_BKPT;
475 decoded->src.addr_mode = MODE_IMMEDIATE; 475 decoded->src.addr_mode = MODE_IMMEDIATE;
476 decoded->extra.size = OPSIZE_BYTE; 476 decoded->extra.size = OPSIZE_UNSIZED;
477 decoded->src.params.u8 = *istream & 0x7; 477 decoded->src.params.u32 = *istream & 0x7;
478 #endif 478 #endif
479 break; 479 break;
480 case 0x10: 480 case 0x10:
481 decoded->op = M68K_EXT; 481 decoded->op = M68K_EXT;
482 decoded->src.addr_mode = MODE_REG; 482 decoded->src.addr_mode = MODE_REG;
510 optype = *istream & 0xFF; 510 optype = *istream & 0xFF;
511 if (optype == 0xFA) { 511 if (optype == 0xFA) {
512 //BGND - CPU32 only 512 //BGND - CPU32 only
513 } else if (optype == 0xFC) { 513 } else if (optype == 0xFC) {
514 decoded->op = M68K_ILLEGAL; 514 decoded->op = M68K_ILLEGAL;
515 decoded->extra.size = OPSIZE_UNSIZED;
515 } else { 516 } else {
516 if (size == OPSIZE_INVALID) { 517 if (size == OPSIZE_INVALID) {
517 decoded->op = M68K_TAS; 518 decoded->op = M68K_TAS;
518 } else { 519 } else {
519 decoded->op = M68K_TST; 520 decoded->op = M68K_TST;
535 if (*istream & 0x40) { 536 if (*istream & 0x40) {
536 decoded->op = M68K_JMP; 537 decoded->op = M68K_JMP;
537 } else { 538 } else {
538 decoded->op = M68K_JSR; 539 decoded->op = M68K_JSR;
539 } 540 }
540 istream = m68k_decode_op(istream, OPSIZE_INVALID, &(decoded->src)); 541 decoded->extra.size = OPSIZE_UNSIZED;
542 istream = m68k_decode_op(istream, OPSIZE_UNSIZED, &(decoded->src));
541 } else { 543 } else {
542 //it would appear bit 6 needs to be set for it to be a valid instruction here 544 //it would appear bit 6 needs to be set for it to be a valid instruction here
543 switch((*istream >> 3) & 0x7) 545 switch((*istream >> 3) & 0x7)
544 { 546 {
545 case 0: 547 case 0:
546 case 1: 548 case 1:
547 //TRAP 549 //TRAP
548 decoded->op = M68K_TRAP; 550 decoded->op = M68K_TRAP;
549 decoded->extra.size = OPSIZE_BYTE; 551 decoded->extra.size = OPSIZE_UNSIZED;
550 decoded->src.addr_mode = MODE_IMMEDIATE; 552 decoded->src.addr_mode = MODE_IMMEDIATE;
551 decoded->src.params.u8 = *istream & 0xF; 553 decoded->src.params.u32 = *istream & 0xF;
552 break; 554 break;
553 case 2: 555 case 2:
554 //LINK.w 556 //LINK.w
555 decoded->op = M68K_LINK; 557 decoded->op = M68K_LINK;
556 decoded->extra.size = OPSIZE_WORD; 558 decoded->extra.size = OPSIZE_WORD;
560 decoded->dst.params.u16 = immed; 562 decoded->dst.params.u16 = immed;
561 break; 563 break;
562 case 3: 564 case 3:
563 //UNLK 565 //UNLK
564 decoded->op = M68K_UNLK; 566 decoded->op = M68K_UNLK;
567 decoded->extra.size = OPSIZE_UNSIZED;
565 decoded->dst.addr_mode = MODE_AREG; 568 decoded->dst.addr_mode = MODE_AREG;
566 decoded->dst.params.regs.pri = *istream & 0x7; 569 decoded->dst.params.regs.pri = *istream & 0x7;
567 break; 570 break;
568 case 4: 571 case 4:
569 case 5: 572 case 5:
576 decoded->src.addr_mode = MODE_AREG; 579 decoded->src.addr_mode = MODE_AREG;
577 decoded->src.params.regs.pri = *istream & 0x7; 580 decoded->src.params.regs.pri = *istream & 0x7;
578 } 581 }
579 break; 582 break;
580 case 6: 583 case 6:
584 decoded->extra.size = OPSIZE_UNSIZED;
581 switch(*istream & 0x7) 585 switch(*istream & 0x7)
582 { 586 {
583 case 0: 587 case 0:
584 decoded->op = M68K_RESET; 588 decoded->op = M68K_RESET;
585 break; 589 break;
586 case 1: 590 case 1:
587 decoded->op = M68K_NOP; 591 decoded->op = M68K_NOP;
588 break; 592 break;
589 case 2: 593 case 2:
590 decoded->op = M68K_STOP; 594 decoded->op = M68K_STOP;
591 decoded->extra.size = OPSIZE_WORD;
592 decoded->src.addr_mode = MODE_IMMEDIATE; 595 decoded->src.addr_mode = MODE_IMMEDIATE;
593 decoded->src.params.u16 =*(++istream); 596 decoded->src.params.u32 =*(++istream);
594 break; 597 break;
595 case 3: 598 case 3:
596 decoded->op = M68K_RTE; 599 decoded->op = M68K_RTE;
597 break; 600 break;
598 case 4: 601 case 4:
599 #ifdef M68010 602 #ifdef M68010
600 decoded->op = M68K_RTD; 603 decoded->op = M68K_RTD;
601 decoded->extra.size = OPSIZE_WORD;
602 decoded->src.addr_mode = MODE_IMMEDIATE; 604 decoded->src.addr_mode = MODE_IMMEDIATE;
603 decoded->src.params.u16 =*(++istream); 605 decoded->src.params.u32 =*(++istream);
604 #endif 606 #endif
605 break; 607 break;
606 case 5: 608 case 5:
607 decoded->op = M68K_RTS; 609 decoded->op = M68K_RTS;
608 break; 610 break;
1078 case MODE_AREG_POSTINC: 1080 case MODE_AREG_POSTINC:
1079 return sprintf(dst, "%s (a%d)+", c, decoded->params.regs.pri); 1081 return sprintf(dst, "%s (a%d)+", c, decoded->params.regs.pri);
1080 case MODE_AREG_PREDEC: 1082 case MODE_AREG_PREDEC:
1081 return sprintf(dst, "%s -(a%d)", c, decoded->params.regs.pri); 1083 return sprintf(dst, "%s -(a%d)", c, decoded->params.regs.pri);
1082 case MODE_IMMEDIATE: 1084 case MODE_IMMEDIATE:
1083 return sprintf(dst, "%s #%d", c, size == OPSIZE_LONG ? decoded->params.u32 : (size == OPSIZE_WORD ? decoded->params.u16 : decoded->params.u8)); 1085 return sprintf(dst, "%s #%d", c, (size == OPSIZE_LONG || size == OPSIZE_UNSIZED) ? decoded->params.u32 : (size == OPSIZE_WORD ? decoded->params.u16 : decoded->params.u8));
1084 default: 1086 default:
1085 return 0; 1087 return 0;
1086 } 1088 }
1087 } 1089 }
1088 1090
1100 } else if (decoded->op == M68K_BSR) { 1102 } else if (decoded->op == M68K_BSR) {
1101 size = OPSIZE_LONG; 1103 size = OPSIZE_LONG;
1102 ret = sprintf(dst, "bsr%s", decoded->variant == VAR_BYTE ? ".s" : ""); 1104 ret = sprintf(dst, "bsr%s", decoded->variant == VAR_BYTE ? ".s" : "");
1103 } else { 1105 } else {
1104 size = decoded->extra.size; 1106 size = decoded->extra.size;
1105 ret = sprintf(dst, "%s%s.%c", 1107 ret = sprintf(dst, "%s%s.%s",
1106 mnemonics[decoded->op], 1108 mnemonics[decoded->op],
1107 decoded->variant == VAR_QUICK ? "q" : (decoded->variant == VAR_IMMEDIATE ? "i" : ""), 1109 decoded->variant == VAR_QUICK ? "q" : (decoded->variant == VAR_IMMEDIATE ? "i" : ""),
1108 decoded->extra.size == OPSIZE_BYTE ? 'b' : (size == OPSIZE_WORD ? 'w' : 'l')); 1110 size == OPSIZE_BYTE ? "b" : (size == OPSIZE_WORD ? "w" : (size == OPSIZE_LONG ? "l" : "")));
1109 } 1111 }
1110 op1len = m68K_disasm_op(&(decoded->src), size, dst + ret, 0); 1112 op1len = m68K_disasm_op(&(decoded->src), size, dst + ret, 0);
1111 ret += op1len; 1113 ret += op1len;
1112 ret += m68K_disasm_op(&(decoded->dst), size, dst + ret, op1len); 1114 ret += m68K_disasm_op(&(decoded->dst), size, dst + ret, op1len);
1113 return ret; 1115 return ret;