Added invalid branch detection

This commit is contained in:
Leeland Heins 2018-12-18 11:50:09 -06:00 committed by GitHub
parent fb32a1e8c2
commit 35940077f5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

53
as65.pl
View File

@ -327,7 +327,7 @@ my %mnemonics = (
},
'BMI' => {
# BMI Relative BMI Oper 30 2 2
'Relative' => 0x0f,
'Relative' => 0x30,
},
'BNE' => {
# BNE Relative BNE Oper D0 2 2
@ -770,8 +770,8 @@ sub sym_add {
sub sym_sub {
my ($symval, $offset) = @_;
if ($symval =~ /\$([0-9a-fA-F]+])/) {
return hex(lc($1)) + $offset;
if ($symval =~ /\$([0-9a-fA-F]+)/) {
return hex(lc($1)) - $offset;
}
return $symval - $offset;
}
@ -798,6 +798,9 @@ sub handle_8_bit_symbol_add {
my $symval = $symbols{$symbol};
if (defined $symval) {
my $opval = sym_add($symval, $val);
if ($opval > 255) {
$opval -= 256;
}
generate_16($ofh, $addr, $opcode, $opval);
} else {
print "**** $lineno - Unknown symbol '$symbol'\n";
@ -812,6 +815,9 @@ sub handle_8_bit_symbol_sub {
if (defined $symval) {
my $opval = sym_sub($symval, $val);
generate_16($ofh, $addr, $opcode, $opval);
if ($opval < 0) {
$opval += 256;
}
} else {
print "**** $lineno - Unknown symbol '$symbol'\n";
generate_16($ofh, $addr, $opcode, 0x00);
@ -1710,22 +1716,10 @@ sub generate_Indirect_Zero_Page {
# Allow arithmetic on symbol
} elsif ($operand =~ /^\(([A-Za-z\.][A-Za-z0-9_\.]+)\s*[+]\s*(\d+)\)$/) {
# Add
my $symval = $symbols{$1};
if (defined $symval) {
my $opval = sym_add($symval, $2);
generate_16($ofh, $addr, $opcode, $opval);
} else {
print "**** $lineno - Unknown symbol '$1'\n";
}
handle_8_bit_symbol_add($ofh, $lineno, $addr, $opcode, $1, $2);
} elsif ($operand =~ /^\(([A-Za-z\.][A-Za-z0-9_\.]+)\s*[-]\s*(\d+)\)$/) {
# Subtract
my $symval = $symbols{$1};
if (defined $symval) {
my $opval = sym_sub($symval, $2);
generate_16($ofh, $addr, $opcode, $opval);
} else {
print "**** $lineno - Unknown symbol '$1'\n";
}
handle_8_bit_symbol_sub($ofh, $lineno, $addr, $opcode, $1, $2);
} else {
print ">>>> $lineno - Indirect_Zero_Page Bad Operand '$operand'\n";
}
@ -1780,7 +1774,12 @@ sub generate_Relative {
if ($rel > 255) {
$rel -= 256;
}
generate_16($ofh, $addr, $opcode, $rel);
if ($rel < 0 || $rel > 255) {
print "^^^^ $lineno - Illegal Branch\n";
generate_16($ofh, $addr, $opcode, 0x00);
} else {
generate_16($ofh, $addr, $opcode, $rel);
}
# Decode decimal
} elsif ($operand =~ /^(\d+)$/) {
my $rel = (0 - ($addr - $1)) + 254;
@ -1790,7 +1789,12 @@ sub generate_Relative {
if ($rel > 255) {
$rel -= 256;
}
generate_16($ofh, $addr, $opcode, $rel);
if ($rel < 0 || $rel > 255) {
print "^^^^ $lineno - Illegal Branch\n";
generate_16($ofh, $addr, $opcode, 0x00);
} else {
generate_16($ofh, $addr, $opcode, $rel);
}
# Handle symbols
} elsif ($operand =~ /^([A-Za-z\.][A-Za-z0-9_\.]+)$/) {
my $symval = $symbols{$1};
@ -1809,7 +1813,12 @@ sub generate_Relative {
if ($rel > 255) {
$rel -= 256;
}
generate_16($ofh, $addr, $opcode, $rel);
if ($rel < 0 || $rel > 255) {
print "^^^^ $lineno - Illegal Branch\n";
generate_16($ofh, $addr, $opcode, 0x00);
} else {
generate_16($ofh, $addr, $opcode, $rel);
}
} else {
print "**** $lineno - Unknown symbol '$1'\n";
}
@ -2132,8 +2141,8 @@ if (open($ifh, "<$input_file")) {
my $ucmnemonic = uc($mnemonic);
# Skip ORG and EQU on pass 2.
next if $ucmnemonic eq 'ORG';
next if $ucmnemonic eq 'EQU';
next if $ucmnemonic =~ /ORG/i;
next if $ucmnemonic =~ /EQU|\.EQ/i;
if (defined $mnemonics{$ucmnemonic}) {
my $foundit = 0;