Mercurial > repos > blastem
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; |