mirror of
https://github.com/softwarejanitor/as65.git
synced 2024-09-30 23:55:17 +00:00
Added invalid branch detection
This commit is contained in:
parent
fb32a1e8c2
commit
35940077f5
47
as65.pl
47
as65.pl
@ -327,7 +327,7 @@ my %mnemonics = (
|
|||||||
},
|
},
|
||||||
'BMI' => {
|
'BMI' => {
|
||||||
# BMI Relative BMI Oper 30 2 2
|
# BMI Relative BMI Oper 30 2 2
|
||||||
'Relative' => 0x0f,
|
'Relative' => 0x30,
|
||||||
},
|
},
|
||||||
'BNE' => {
|
'BNE' => {
|
||||||
# BNE Relative BNE Oper D0 2 2
|
# BNE Relative BNE Oper D0 2 2
|
||||||
@ -770,8 +770,8 @@ sub sym_add {
|
|||||||
sub sym_sub {
|
sub sym_sub {
|
||||||
my ($symval, $offset) = @_;
|
my ($symval, $offset) = @_;
|
||||||
|
|
||||||
if ($symval =~ /\$([0-9a-fA-F]+])/) {
|
if ($symval =~ /\$([0-9a-fA-F]+)/) {
|
||||||
return hex(lc($1)) + $offset;
|
return hex(lc($1)) - $offset;
|
||||||
}
|
}
|
||||||
return $symval - $offset;
|
return $symval - $offset;
|
||||||
}
|
}
|
||||||
@ -798,6 +798,9 @@ sub handle_8_bit_symbol_add {
|
|||||||
my $symval = $symbols{$symbol};
|
my $symval = $symbols{$symbol};
|
||||||
if (defined $symval) {
|
if (defined $symval) {
|
||||||
my $opval = sym_add($symval, $val);
|
my $opval = sym_add($symval, $val);
|
||||||
|
if ($opval > 255) {
|
||||||
|
$opval -= 256;
|
||||||
|
}
|
||||||
generate_16($ofh, $addr, $opcode, $opval);
|
generate_16($ofh, $addr, $opcode, $opval);
|
||||||
} else {
|
} else {
|
||||||
print "**** $lineno - Unknown symbol '$symbol'\n";
|
print "**** $lineno - Unknown symbol '$symbol'\n";
|
||||||
@ -812,6 +815,9 @@ sub handle_8_bit_symbol_sub {
|
|||||||
if (defined $symval) {
|
if (defined $symval) {
|
||||||
my $opval = sym_sub($symval, $val);
|
my $opval = sym_sub($symval, $val);
|
||||||
generate_16($ofh, $addr, $opcode, $opval);
|
generate_16($ofh, $addr, $opcode, $opval);
|
||||||
|
if ($opval < 0) {
|
||||||
|
$opval += 256;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
print "**** $lineno - Unknown symbol '$symbol'\n";
|
print "**** $lineno - Unknown symbol '$symbol'\n";
|
||||||
generate_16($ofh, $addr, $opcode, 0x00);
|
generate_16($ofh, $addr, $opcode, 0x00);
|
||||||
@ -1710,22 +1716,10 @@ sub generate_Indirect_Zero_Page {
|
|||||||
# Allow arithmetic on symbol
|
# Allow arithmetic on symbol
|
||||||
} elsif ($operand =~ /^\(([A-Za-z\.][A-Za-z0-9_\.]+)\s*[+]\s*(\d+)\)$/) {
|
} elsif ($operand =~ /^\(([A-Za-z\.][A-Za-z0-9_\.]+)\s*[+]\s*(\d+)\)$/) {
|
||||||
# Add
|
# Add
|
||||||
my $symval = $symbols{$1};
|
handle_8_bit_symbol_add($ofh, $lineno, $addr, $opcode, $1, $2);
|
||||||
if (defined $symval) {
|
|
||||||
my $opval = sym_add($symval, $2);
|
|
||||||
generate_16($ofh, $addr, $opcode, $opval);
|
|
||||||
} else {
|
|
||||||
print "**** $lineno - Unknown symbol '$1'\n";
|
|
||||||
}
|
|
||||||
} elsif ($operand =~ /^\(([A-Za-z\.][A-Za-z0-9_\.]+)\s*[-]\s*(\d+)\)$/) {
|
} elsif ($operand =~ /^\(([A-Za-z\.][A-Za-z0-9_\.]+)\s*[-]\s*(\d+)\)$/) {
|
||||||
# Subtract
|
# Subtract
|
||||||
my $symval = $symbols{$1};
|
handle_8_bit_symbol_sub($ofh, $lineno, $addr, $opcode, $1, $2);
|
||||||
if (defined $symval) {
|
|
||||||
my $opval = sym_sub($symval, $2);
|
|
||||||
generate_16($ofh, $addr, $opcode, $opval);
|
|
||||||
} else {
|
|
||||||
print "**** $lineno - Unknown symbol '$1'\n";
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
print ">>>> $lineno - Indirect_Zero_Page Bad Operand '$operand'\n";
|
print ">>>> $lineno - Indirect_Zero_Page Bad Operand '$operand'\n";
|
||||||
}
|
}
|
||||||
@ -1780,7 +1774,12 @@ sub generate_Relative {
|
|||||||
if ($rel > 255) {
|
if ($rel > 255) {
|
||||||
$rel -= 256;
|
$rel -= 256;
|
||||||
}
|
}
|
||||||
|
if ($rel < 0 || $rel > 255) {
|
||||||
|
print "^^^^ $lineno - Illegal Branch\n";
|
||||||
|
generate_16($ofh, $addr, $opcode, 0x00);
|
||||||
|
} else {
|
||||||
generate_16($ofh, $addr, $opcode, $rel);
|
generate_16($ofh, $addr, $opcode, $rel);
|
||||||
|
}
|
||||||
# Decode decimal
|
# Decode decimal
|
||||||
} elsif ($operand =~ /^(\d+)$/) {
|
} elsif ($operand =~ /^(\d+)$/) {
|
||||||
my $rel = (0 - ($addr - $1)) + 254;
|
my $rel = (0 - ($addr - $1)) + 254;
|
||||||
@ -1790,7 +1789,12 @@ sub generate_Relative {
|
|||||||
if ($rel > 255) {
|
if ($rel > 255) {
|
||||||
$rel -= 256;
|
$rel -= 256;
|
||||||
}
|
}
|
||||||
|
if ($rel < 0 || $rel > 255) {
|
||||||
|
print "^^^^ $lineno - Illegal Branch\n";
|
||||||
|
generate_16($ofh, $addr, $opcode, 0x00);
|
||||||
|
} else {
|
||||||
generate_16($ofh, $addr, $opcode, $rel);
|
generate_16($ofh, $addr, $opcode, $rel);
|
||||||
|
}
|
||||||
# Handle symbols
|
# Handle symbols
|
||||||
} elsif ($operand =~ /^([A-Za-z\.][A-Za-z0-9_\.]+)$/) {
|
} elsif ($operand =~ /^([A-Za-z\.][A-Za-z0-9_\.]+)$/) {
|
||||||
my $symval = $symbols{$1};
|
my $symval = $symbols{$1};
|
||||||
@ -1809,7 +1813,12 @@ sub generate_Relative {
|
|||||||
if ($rel > 255) {
|
if ($rel > 255) {
|
||||||
$rel -= 256;
|
$rel -= 256;
|
||||||
}
|
}
|
||||||
|
if ($rel < 0 || $rel > 255) {
|
||||||
|
print "^^^^ $lineno - Illegal Branch\n";
|
||||||
|
generate_16($ofh, $addr, $opcode, 0x00);
|
||||||
|
} else {
|
||||||
generate_16($ofh, $addr, $opcode, $rel);
|
generate_16($ofh, $addr, $opcode, $rel);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
print "**** $lineno - Unknown symbol '$1'\n";
|
print "**** $lineno - Unknown symbol '$1'\n";
|
||||||
}
|
}
|
||||||
@ -2132,8 +2141,8 @@ if (open($ifh, "<$input_file")) {
|
|||||||
my $ucmnemonic = uc($mnemonic);
|
my $ucmnemonic = uc($mnemonic);
|
||||||
|
|
||||||
# Skip ORG and EQU on pass 2.
|
# Skip ORG and EQU on pass 2.
|
||||||
next if $ucmnemonic eq 'ORG';
|
next if $ucmnemonic =~ /ORG/i;
|
||||||
next if $ucmnemonic eq 'EQU';
|
next if $ucmnemonic =~ /EQU|\.EQ/i;
|
||||||
|
|
||||||
if (defined $mnemonics{$ucmnemonic}) {
|
if (defined $mnemonics{$ucmnemonic}) {
|
||||||
my $foundit = 0;
|
my $foundit = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user