Allow CALL and other non-relative branches to generate lables too
This commit is contained in:
61
disassem.pl
61
disassem.pl
@@ -254,10 +254,12 @@ sub decode_instruction
|
||||
local $amode = undef;
|
||||
local @operands = ();
|
||||
local $comment = "";
|
||||
local $branch = 0;
|
||||
|
||||
if ($byte == 0x00) {
|
||||
output_instruction("NOP");
|
||||
} elsif ($byte == 0x01) {
|
||||
branch();
|
||||
output_instruction("INT9");
|
||||
} elsif ($byte == 0x02) {
|
||||
set_operand("A");
|
||||
@@ -302,6 +304,7 @@ sub decode_instruction
|
||||
set_operand("A");
|
||||
output_instruction("SUBDC");
|
||||
} elsif ($byte == 0x13) {
|
||||
branch();
|
||||
set_operand('@A');
|
||||
output_instruction("JCTX");
|
||||
} elsif ($byte == 0x14) {
|
||||
@@ -431,6 +434,7 @@ sub decode_instruction
|
||||
read_operand_imm16();
|
||||
output_instruction("SUBW");
|
||||
} elsif ($byte == 0x3A) {
|
||||
branch();
|
||||
set_operand("A");
|
||||
read_operand_imm16();
|
||||
read_operand_rel();
|
||||
@@ -575,46 +579,59 @@ sub decode_instruction
|
||||
read_operand_rlst();
|
||||
output_instruction("POPW");
|
||||
} elsif ($byte == 0x60) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
unconditional_branch();
|
||||
output_instruction("BRA");
|
||||
} elsif ($byte == 0x61) {
|
||||
branch();
|
||||
set_operand('@A');
|
||||
unconditional_branch();
|
||||
output_instruction("JMP");
|
||||
} elsif ($byte == 0x62) {
|
||||
branch();
|
||||
read_operand_addr16();
|
||||
unconditional_branch();
|
||||
output_instruction("JMP");
|
||||
} elsif ($byte == 0x63) {
|
||||
branch();
|
||||
read_operand_addr24();
|
||||
unconditional_branch();
|
||||
output_instruction("JMPP");
|
||||
} elsif ($byte == 0x64) {
|
||||
branch();
|
||||
read_operand_addr16();
|
||||
output_instruction("CALL");
|
||||
} elsif ($byte == 0x65) {
|
||||
branch();
|
||||
read_operand_addr24();
|
||||
output_instruction("CALL");
|
||||
} elsif ($byte == 0x66) {
|
||||
branch();
|
||||
unconditional_branch();
|
||||
output_instruction("RETP");
|
||||
} elsif ($byte == 0x67) {
|
||||
branch();
|
||||
unconditional_branch();
|
||||
output_instruction("RET");
|
||||
} elsif ($byte == 0x68) {
|
||||
branch();
|
||||
read_operand_vct8();
|
||||
output_instruction("INT");
|
||||
} elsif ($byte == 0x68) {
|
||||
branch();
|
||||
read_operand_vct8();
|
||||
output_instruction("INT");
|
||||
} elsif ($byte == 0x69) {
|
||||
branch();
|
||||
read_operand_addr16();
|
||||
output_instruction("INT");
|
||||
} elsif ($byte == 0x6A) {
|
||||
branch();
|
||||
read_operand_addr24();
|
||||
output_instruction("INTP");
|
||||
} elsif ($byte == 0x6B) {
|
||||
branch();
|
||||
unconditional_branch();
|
||||
output_instruction("RETI");
|
||||
} elsif ($byte == 0x6C) {
|
||||
@@ -700,54 +717,71 @@ sub decode_instruction
|
||||
set_operand_imm4($byte & 0xf);
|
||||
output_instruction("MOVN");
|
||||
} elsif (($byte & 0xf0) == 0xE0) {
|
||||
branch();
|
||||
set_operand_imm4($byte & 0xf);
|
||||
output_instruction("CALLV");
|
||||
} elsif ($byte == 0xF0) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BZ");
|
||||
} elsif ($byte == 0xF1) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BNZ");
|
||||
} elsif ($byte == 0xF2) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BC");
|
||||
} elsif ($byte == 0xF3) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BNC");
|
||||
} elsif ($byte == 0xF4) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BN");
|
||||
} elsif ($byte == 0xF5) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BP");
|
||||
} elsif ($byte == 0xF6) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BV");
|
||||
} elsif ($byte == 0xF7) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BNV");
|
||||
} elsif ($byte == 0xF8) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BT");
|
||||
} elsif ($byte == 0xF9) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BNT");
|
||||
} elsif ($byte == 0xFA) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BLT");
|
||||
} elsif ($byte == 0xFB) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BGE");
|
||||
} elsif ($byte == 0xFC) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BLE");
|
||||
} elsif ($byte == 0xFD) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BGT");
|
||||
} elsif ($byte == 0xFE) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BLS");
|
||||
} elsif ($byte == 0xFF) {
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("BHI");
|
||||
} else {
|
||||
@@ -801,26 +835,32 @@ sub decode_bit_manipulation
|
||||
read_operand_addr16_bp($byte & 0x7);
|
||||
output_instruction("SETB");
|
||||
} elsif (($byte & 0xf8) == 0x80) {
|
||||
branch();
|
||||
read_operand_io_bp($byte & 0x7);
|
||||
read_operand_rel();
|
||||
output_instruction("BBC");
|
||||
} elsif (($byte & 0xf8) == 0x88) {
|
||||
branch();
|
||||
read_operand_dir_bp($byte & 0x7);
|
||||
read_operand_rel();
|
||||
output_instruction("BBC");
|
||||
} elsif (($byte & 0xf8) == 0x98) {
|
||||
branch();
|
||||
read_operand_addr16_bp($byte & 0x7);
|
||||
read_operand_rel();
|
||||
output_instruction("BBC");
|
||||
} elsif (($byte & 0xf8) == 0xA0) {
|
||||
branch();
|
||||
read_operand_io_bp($byte & 0x7);
|
||||
read_operand_rel();
|
||||
output_instruction("BBS");
|
||||
} elsif (($byte & 0xf8) == 0xA8) {
|
||||
branch();
|
||||
read_operand_dir_bp($byte & 0x7);
|
||||
read_operand_rel();
|
||||
output_instruction("BBS");
|
||||
} elsif (($byte & 0xf8) == 0xB8) {
|
||||
branch();
|
||||
read_operand_addr16_bp($byte & 0x7);
|
||||
read_operand_rel();
|
||||
output_instruction("BBS");
|
||||
@@ -1012,6 +1052,7 @@ sub decode_ea_70
|
||||
output_instruction("SUBL");
|
||||
} elsif ($op == 0x40) {
|
||||
set_operand_ea("RW", $byte);
|
||||
branch();
|
||||
read_operand_imm16();
|
||||
read_operand_rel();
|
||||
output_instruction("CWBNE");
|
||||
@@ -1033,6 +1074,7 @@ sub decode_ea_70
|
||||
output_instruction("XORL");
|
||||
} elsif ($op == 0xE0) {
|
||||
set_operand_ea("R", $byte);
|
||||
branch();
|
||||
read_operand_imm8();
|
||||
read_operand_rel();
|
||||
output_instruction("CBNE");
|
||||
@@ -1046,10 +1088,12 @@ sub decode_ea_71
|
||||
my $byte = getbyte();
|
||||
my $op = $byte & 0xe0;
|
||||
if ($op == 0x00) {
|
||||
branch();
|
||||
set_operand_ea('@RL', $byte);
|
||||
unconditional_branch();
|
||||
output_instruction("JMPP");
|
||||
} elsif ($op == 0x20) {
|
||||
branch();
|
||||
set_operand_ea('@RL', $byte);
|
||||
output_instruction("CALLP");
|
||||
} elsif ($op == 0x40) {
|
||||
@@ -1121,10 +1165,12 @@ sub decode_ea_73
|
||||
my $byte = getbyte();
|
||||
my $op = $byte & 0xe0;
|
||||
if ($op == 0x00) {
|
||||
branch();
|
||||
set_operand_ea('@RW', $byte);
|
||||
unconditional_branch();
|
||||
output_instruction("JMP");
|
||||
} elsif ($op == 0x20) {
|
||||
branch();
|
||||
set_operand_ea('@RW', $byte);
|
||||
output_instruction("CALL");
|
||||
} elsif ($op == 0x40) {
|
||||
@@ -1188,6 +1234,7 @@ sub decode_ea_74
|
||||
output_instruction("XOR");
|
||||
} elsif ($op == 0xE0) {
|
||||
set_operand_ea("R", $byte);
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("DBNZ");
|
||||
} else {
|
||||
@@ -1268,6 +1315,7 @@ sub decode_ea_76
|
||||
output_instruction("XORW");
|
||||
} elsif ($op == 0xE0) {
|
||||
set_operand_ea("RW", $byte);
|
||||
branch();
|
||||
read_operand_rel();
|
||||
output_instruction("DWBNZ");
|
||||
} else {
|
||||
@@ -1475,7 +1523,13 @@ sub read_operand_addr16
|
||||
my $byte2 = getbyte();
|
||||
my $addr = $byte1;
|
||||
$addr += $byte2 << 8;
|
||||
set_operand(sprintf("%sD:0x%.4x", $at, $addr));
|
||||
if ($branch) {
|
||||
$addr = ($addr & 0xffff) | ($address & ~0xffff);
|
||||
set_operand(sprintf("%s%s", $at, get_label($addr)));
|
||||
add_comment(sprintf("0x%.6x", $addr));
|
||||
} else {
|
||||
set_operand(sprintf("%sD:0x%.4x", $at, $addr));
|
||||
}
|
||||
}
|
||||
|
||||
sub read_operand_addr16_bp
|
||||
@@ -1662,6 +1716,11 @@ sub set_operand_ea
|
||||
}
|
||||
}
|
||||
|
||||
sub branch
|
||||
{
|
||||
$branch = 1;
|
||||
}
|
||||
|
||||
sub unconditional_branch
|
||||
{
|
||||
# $finish_disassembly = 1;
|
||||
|
||||
Reference in New Issue
Block a user