mirror of
https://github.com/softwarejanitor/as65.git
synced 2024-11-21 17:32:10 +00:00
Added invalid branch detection
This commit is contained in:
parent
fb32a1e8c2
commit
35940077f5
53
as65.pl
53
as65.pl
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user