Lines 484-491
Link Here
|
484 |
return data - origdata; |
484 |
return data - origdata; |
485 |
} |
485 |
} |
486 |
|
486 |
|
487 |
long disasm (unsigned char *data, char *output, int segsize, long offset, |
487 |
long disasm (unsigned char *data, char *output, int outbufsize, int segsize, |
488 |
int autosync, unsigned long prefer) |
488 |
long offset, int autosync, unsigned long prefer) |
489 |
{ |
489 |
{ |
490 |
struct itemplate **p, **best_p; |
490 |
struct itemplate **p, **best_p; |
491 |
int length, best_length = 0; |
491 |
int length, best_length = 0; |
Lines 583-608
Link Here
|
583 |
slen = 0; |
583 |
slen = 0; |
584 |
|
584 |
|
585 |
if (lock) |
585 |
if (lock) |
586 |
slen += sprintf(output+slen, "lock "); |
586 |
slen += snprintf(output+slen, outbufsize-slen, "lock "); |
587 |
for (i = 0; i < ins.nprefix; i++) |
587 |
for (i = 0; i < ins.nprefix; i++) |
588 |
switch (ins.prefixes[i]) { |
588 |
switch (ins.prefixes[i]) { |
589 |
case P_REP: slen += sprintf(output+slen, "rep "); break; |
589 |
case P_REP: slen += snprintf(output+slen, outbufsize-slen, "rep "); break; |
590 |
case P_REPE: slen += sprintf(output+slen, "repe "); break; |
590 |
case P_REPE: slen += snprintf(output+slen, outbufsize-slen, "repe "); break; |
591 |
case P_REPNE: slen += sprintf(output+slen, "repne "); break; |
591 |
case P_REPNE: slen += snprintf(output+slen, outbufsize-slen, "repne "); break; |
592 |
case P_A16: slen += sprintf(output+slen, "a16 "); break; |
592 |
case P_A16: slen += snprintf(output+slen, outbufsize-slen, "a16 "); break; |
593 |
case P_A32: slen += sprintf(output+slen, "a32 "); break; |
593 |
case P_A32: slen += snprintf(output+slen, outbufsize-slen, "a32 "); break; |
594 |
case P_O16: slen += sprintf(output+slen, "o16 "); break; |
594 |
case P_O16: slen += snprintf(output+slen, outbufsize-slen, "o16 "); break; |
595 |
case P_O32: slen += sprintf(output+slen, "o32 "); break; |
595 |
case P_O32: slen += snprintf(output+slen, outbufsize-slen, "o32 "); break; |
596 |
} |
596 |
} |
597 |
|
597 |
|
598 |
for (i = 0; i < elements(ico); i++) |
598 |
for (i = 0; i < elements(ico); i++) |
599 |
if ((*p)->opcode == ico[i]) { |
599 |
if ((*p)->opcode == ico[i]) { |
600 |
slen += sprintf(output+slen, "%s%s", icn[i], |
600 |
slen += snprintf(output+slen, outbufsize-slen, "%s%s", icn[i], |
601 |
whichcond(ins.condition)); |
601 |
whichcond(ins.condition)); |
602 |
break; |
602 |
break; |
603 |
} |
603 |
} |
604 |
if (i >= elements(ico)) |
604 |
if (i >= elements(ico)) |
605 |
slen += sprintf(output+slen, "%s", insn_names[(*p)->opcode]); |
605 |
slen += snprintf(output+slen, outbufsize-slen, "%s", insn_names[(*p)->opcode]); |
606 |
colon = FALSE; |
606 |
colon = FALSE; |
607 |
length += data - origdata; /* fix up for prefixes */ |
607 |
length += data - origdata; /* fix up for prefixes */ |
608 |
for (i=0; i<(*p)->operands; i++) { |
608 |
for (i=0; i<(*p)->operands; i++) { |
Lines 633-646
Link Here
|
633 |
ins.oprs[i].basereg = whichreg ((*p)->opd[i], |
633 |
ins.oprs[i].basereg = whichreg ((*p)->opd[i], |
634 |
ins.oprs[i].basereg); |
634 |
ins.oprs[i].basereg); |
635 |
if ( (*p)->opd[i] & TO ) |
635 |
if ( (*p)->opd[i] & TO ) |
636 |
slen += sprintf(output+slen, "to "); |
636 |
slen += snprintf(output+slen, outbufsize-slen, "to "); |
637 |
slen += sprintf(output+slen, "%s", |
637 |
slen += snprintf(output+slen, outbufsize-slen, "%s", |
638 |
reg_names[ins.oprs[i].basereg-EXPR_REG_START]); |
638 |
reg_names[ins.oprs[i].basereg-EXPR_REG_START]); |
639 |
} else if (!(UNITY & ~(*p)->opd[i])) { |
639 |
} else if (!(UNITY & ~(*p)->opd[i])) { |
640 |
output[slen++] = '1'; |
640 |
output[slen++] = '1'; |
641 |
} else if ( (*p)->opd[i] & IMMEDIATE ) { |
641 |
} else if ( (*p)->opd[i] & IMMEDIATE ) { |
642 |
if ( (*p)->opd[i] & BITS8 ) { |
642 |
if ( (*p)->opd[i] & BITS8 ) { |
643 |
slen += sprintf(output+slen, "byte "); |
643 |
slen += snprintf(output+slen, outbufsize-slen, "byte "); |
644 |
if (ins.oprs[i].segment & SEG_SIGNED) { |
644 |
if (ins.oprs[i].segment & SEG_SIGNED) { |
645 |
if (ins.oprs[i].offset < 0) { |
645 |
if (ins.oprs[i].offset < 0) { |
646 |
ins.oprs[i].offset *= -1; |
646 |
ins.oprs[i].offset *= -1; |
Lines 649-665
Link Here
|
649 |
output[slen++] = '+'; |
649 |
output[slen++] = '+'; |
650 |
} |
650 |
} |
651 |
} else if ( (*p)->opd[i] & BITS16 ) { |
651 |
} else if ( (*p)->opd[i] & BITS16 ) { |
652 |
slen += sprintf(output+slen, "word "); |
652 |
slen += snprintf(output+slen, outbufsize-slen, "word "); |
653 |
} else if ( (*p)->opd[i] & BITS32 ) { |
653 |
} else if ( (*p)->opd[i] & BITS32 ) { |
654 |
slen += sprintf(output+slen, "dword "); |
654 |
slen += snprintf(output+slen, outbufsize-slen, "dword "); |
655 |
} else if ( (*p)->opd[i] & NEAR ) { |
655 |
} else if ( (*p)->opd[i] & NEAR ) { |
656 |
slen += sprintf(output+slen, "near "); |
656 |
slen += snprintf(output+slen, outbufsize-slen, "near "); |
657 |
} else if ( (*p)->opd[i] & SHORT ) { |
657 |
} else if ( (*p)->opd[i] & SHORT ) { |
658 |
slen += sprintf(output+slen, "short "); |
658 |
slen += snprintf(output+slen, outbufsize-slen, "short "); |
659 |
} |
659 |
} |
660 |
slen += sprintf(output+slen, "0x%lx", ins.oprs[i].offset); |
660 |
slen += snprintf(output+slen, outbufsize-slen, "0x%lx", ins.oprs[i].offset); |
661 |
} else if ( !(MEM_OFFS & ~(*p)->opd[i]) ) { |
661 |
} else if ( !(MEM_OFFS & ~(*p)->opd[i]) ) { |
662 |
slen += sprintf(output+slen, "[%s%s%s0x%lx]", |
662 |
slen += snprintf(output+slen, outbufsize-slen, "[%s%s%s0x%lx]", |
663 |
(segover ? segover : ""), |
663 |
(segover ? segover : ""), |
664 |
(segover ? ":" : ""), |
664 |
(segover ? ":" : ""), |
665 |
(ins.oprs[i].addr_size == 32 ? "dword " : |
665 |
(ins.oprs[i].addr_size == 32 ? "dword " : |
Lines 669-698
Link Here
|
669 |
} else if ( !(REGMEM & ~(*p)->opd[i]) ) { |
669 |
} else if ( !(REGMEM & ~(*p)->opd[i]) ) { |
670 |
int started = FALSE; |
670 |
int started = FALSE; |
671 |
if ( (*p)->opd[i] & BITS8 ) |
671 |
if ( (*p)->opd[i] & BITS8 ) |
672 |
slen += sprintf(output+slen, "byte "); |
672 |
slen += snprintf(output+slen, outbufsize-slen, "byte "); |
673 |
if ( (*p)->opd[i] & BITS16 ) |
673 |
if ( (*p)->opd[i] & BITS16 ) |
674 |
slen += sprintf(output+slen, "word "); |
674 |
slen += snprintf(output+slen, outbufsize-slen, "word "); |
675 |
if ( (*p)->opd[i] & BITS32 ) |
675 |
if ( (*p)->opd[i] & BITS32 ) |
676 |
slen += sprintf(output+slen, "dword "); |
676 |
slen += snprintf(output+slen, outbufsize-slen, "dword "); |
677 |
if ( (*p)->opd[i] & BITS64 ) |
677 |
if ( (*p)->opd[i] & BITS64 ) |
678 |
slen += sprintf(output+slen, "qword "); |
678 |
slen += snprintf(output+slen, outbufsize-slen, "qword "); |
679 |
if ( (*p)->opd[i] & BITS80 ) |
679 |
if ( (*p)->opd[i] & BITS80 ) |
680 |
slen += sprintf(output+slen, "tword "); |
680 |
slen += snprintf(output+slen, outbufsize-slen, "tword "); |
681 |
if ( (*p)->opd[i] & FAR ) |
681 |
if ( (*p)->opd[i] & FAR ) |
682 |
slen += sprintf(output+slen, "far "); |
682 |
slen += snprintf(output+slen, outbufsize-slen, "far "); |
683 |
if ( (*p)->opd[i] & NEAR ) |
683 |
if ( (*p)->opd[i] & NEAR ) |
684 |
slen += sprintf(output+slen, "near "); |
684 |
slen += snprintf(output+slen, outbufsize-slen, "near "); |
685 |
output[slen++] = '['; |
685 |
output[slen++] = '['; |
686 |
if (ins.oprs[i].addr_size) |
686 |
if (ins.oprs[i].addr_size) |
687 |
slen += sprintf(output+slen, "%s", |
687 |
slen += snprintf(output+slen, outbufsize-slen, "%s", |
688 |
(ins.oprs[i].addr_size == 32 ? "dword " : |
688 |
(ins.oprs[i].addr_size == 32 ? "dword " : |
689 |
ins.oprs[i].addr_size == 16 ? "word " : "")); |
689 |
ins.oprs[i].addr_size == 16 ? "word " : "")); |
690 |
if (segover) { |
690 |
if (segover) { |
691 |
slen += sprintf(output+slen, "%s:", segover); |
691 |
slen += snprintf(output+slen, outbufsize-slen, "%s:", segover); |
692 |
segover = NULL; |
692 |
segover = NULL; |
693 |
} |
693 |
} |
694 |
if (ins.oprs[i].basereg != -1) { |
694 |
if (ins.oprs[i].basereg != -1) { |
695 |
slen += sprintf(output+slen, "%s", |
695 |
slen += snprintf(output+slen, outbufsize-slen, "%s", |
696 |
reg_names[(ins.oprs[i].basereg - |
696 |
reg_names[(ins.oprs[i].basereg - |
697 |
EXPR_REG_START)]); |
697 |
EXPR_REG_START)]); |
698 |
started = TRUE; |
698 |
started = TRUE; |
Lines 700-710
Link Here
|
700 |
if (ins.oprs[i].indexreg != -1) { |
700 |
if (ins.oprs[i].indexreg != -1) { |
701 |
if (started) |
701 |
if (started) |
702 |
output[slen++] = '+'; |
702 |
output[slen++] = '+'; |
703 |
slen += sprintf(output+slen, "%s", |
703 |
slen += snprintf(output+slen, outbufsize-slen, "%s", |
704 |
reg_names[(ins.oprs[i].indexreg - |
704 |
reg_names[(ins.oprs[i].indexreg - |
705 |
EXPR_REG_START)]); |
705 |
EXPR_REG_START)]); |
706 |
if (ins.oprs[i].scale > 1) |
706 |
if (ins.oprs[i].scale > 1) |
707 |
slen += sprintf(output+slen, "*%d", ins.oprs[i].scale); |
707 |
slen += snprintf(output+slen, outbufsize-slen, "*%d", ins.oprs[i].scale); |
708 |
started = TRUE; |
708 |
started = TRUE; |
709 |
} |
709 |
} |
710 |
if (ins.oprs[i].segment & SEG_DISP8) { |
710 |
if (ins.oprs[i].segment & SEG_DISP8) { |
Lines 713-732
Link Here
|
713 |
ins.oprs[i].offset = - (signed char) ins.oprs[i].offset; |
713 |
ins.oprs[i].offset = - (signed char) ins.oprs[i].offset; |
714 |
sign = '-'; |
714 |
sign = '-'; |
715 |
} |
715 |
} |
716 |
slen += sprintf(output+slen, "%c0x%lx", sign, |
716 |
slen += snprintf(output+slen, outbufsize-slen, "%c0x%lx", sign, |
717 |
ins.oprs[i].offset); |
717 |
ins.oprs[i].offset); |
718 |
} else if (ins.oprs[i].segment & SEG_DISP16) { |
718 |
} else if (ins.oprs[i].segment & SEG_DISP16) { |
719 |
if (started) |
719 |
if (started) |
720 |
output[slen++] = '+'; |
720 |
output[slen++] = '+'; |
721 |
slen += sprintf(output+slen, "0x%lx", ins.oprs[i].offset); |
721 |
slen += snprintf(output+slen, outbufsize-slen, "0x%lx", ins.oprs[i].offset); |
722 |
} else if (ins.oprs[i].segment & SEG_DISP32) { |
722 |
} else if (ins.oprs[i].segment & SEG_DISP32) { |
723 |
if (started) |
723 |
if (started) |
724 |
output[slen++] = '+'; |
724 |
output[slen++] = '+'; |
725 |
slen += sprintf(output+slen, "0x%lx", ins.oprs[i].offset); |
725 |
slen += snprintf(output+slen, outbufsize-slen, "0x%lx", ins.oprs[i].offset); |
726 |
} |
726 |
} |
727 |
output[slen++] = ']'; |
727 |
output[slen++] = ']'; |
728 |
} else { |
728 |
} else { |
729 |
slen += sprintf(output+slen, "<operand%d>", i); |
729 |
slen += snprintf(output+slen, outbufsize-slen, "<operand%d>", i); |
730 |
} |
730 |
} |
731 |
} |
731 |
} |
732 |
output[slen] = '\0'; |
732 |
output[slen] = '\0'; |
Lines 741-748
Link Here
|
741 |
return length; |
741 |
return length; |
742 |
} |
742 |
} |
743 |
|
743 |
|
744 |
long eatbyte (unsigned char *data, char *output) |
744 |
long eatbyte (unsigned char *data, char *output, int outbufsize) |
745 |
{ |
745 |
{ |
746 |
sprintf(output, "db 0x%02X", *data); |
746 |
snprintf(output, outbufsize, "db 0x%02X", *data); |
747 |
return 1; |
747 |
return 1; |
748 |
} |
748 |
} |