print "\tORG\t\$8000\n";
+my %transtable = ( '02' => 'IDIV' ,
+ '03' => 'FDIV' ,
+ '08' => 'INX' ,
+ '09' => 'DEX',
+ '0A' => 'CLV',
+ '0D' => 'SEC',
+ '0E' => 'CLI',
+ '0F' => 'SEI',
+ '19' => 'DAA',
+ '1B' => 'ABA',
+ '30' => 'TSX',
+ '31' => 'INS',
+ '32' => 'PULA',
+ '33' => 'PULB',
+ '34' => 'DES',
+ '35' => 'TXS',
+ '36' => 'PSHA',
+ '37' => 'PSHB',
+ '3C' => 'PSHX',
+ '38' => 'PULX',
+ '3A' => 'ABX',
+ '3B' => 'RTI',
+ '3E' => 'WAI',
+ '43' => 'COMA',
+ '46' => 'RORA',
+ '49' => 'ROLA',
+ '4A' => 'DECA',
+ '4C' => 'INCA',
+ '4F' => 'CLRA',
+ '53' => 'COMB',
+ '56' => 'RORB',
+ '59' => 'ROLB',
+ '5A' => 'DECB',
+ '5F' => 'CLRB',
+ '8F' => 'XGDX',
+ '39' => 'RTS' );
+
+ # '10' => 'SBA',
+
+
+my %twobytefirst = ( '18' => '1' );
+
+my %twobytesecond = ( '18 38' => 'PULY',
+ '18 3A' => 'ABY',
+ '18 3C' => 'PSHY');
+
+my %twobytesecondword = ( '18 FE' => 'LDY\t>%s',
+ '18 FF' => 'STY\t>%s');
+
+my %onewitharg = ('60' => "NEG\t\$%s,X",
+ '63' => "COM\t\$%s,X",
+ '64' => "LSR\t\$%s,X",
+ '67' => "ASR\t\$%s,X",
+ '68' => "ASL\t\$%s,X",
+ '6A' => "DEC\t\$%s,X",
+ '6C' => "INC\t\$%s,X",
+ '6D' => "TST\t\$%s,X",
+ '6E' => "JMP\t\$%s,X",
+ '6F' => "CLR\t\$%s,X",
+ '80' => "SUBA\t#\$%s",
+ '81' => "CMPA\t#\$%s",
+ '82' => "SBCA\t#\$%s",
+ '84' => "ANDA\t#\$%s",
+ '85' => "BITA\t#\$%s",
+ '86' => "LDAA\t#\$%s",
+ '88' => "EORA\t#\$%s",
+ '8A' => "ORA\t#\$%s",
+ '8B' => "ADDA\t#\$%s",
+ 'A0' => "SUBA\t\$%s,X",
+ 'A1' => "CMPA\t\$%s,X",
+ 'A2' => "SBCA\t\$%s,X",
+ 'A3' => "SUBD\t\$%s,X",
+ 'A4' => "ANDA\t\$%s,X",
+ 'A6' => "LDAA\t\$%s,X",
+ 'A7' => "STA\t\$%s,X",
+ 'A8' => "EORA\t\$%s,X",
+ 'A9' => "ADCA\t\$%s,X",
+ 'AA' => "ORAA\t\$%s,X",
+ 'AB' => "ADDA\t\$%s,X",
+ 'AC' => "CPX\t\$%s,X",
+ 'AD' => "JSR\t\$%s,X",
+ 'AE' => "LDS\t\$%s,X",
+ 'AF' => "STS\t\$%s,X",
+ 'C0' => "SUBB\t#\$%s",
+ 'C1' => "CMPB\t#\$%s",
+ 'C2' => "SBCB\t#\$%s",
+ 'C4' => "ANDB\t#\$%s",
+ 'C5' => "BITB\t#\$%s",
+ 'C6' => "LDAB\t#\$%s",
+ 'C8' => "EORB\t#\$%s",
+ 'C9' => "ADCB\t#\$%s",
+ 'CA' => "ORB\t#\$%s",
+ 'CB' => "ADDB\t#\$%s",
+ 'E0' => "SUBB\t\$%s,X",
+ 'E1' => "CMPB\t\$%s,X",
+ 'E2' => "SBCB\t\$%s,X",
+ 'E3' => "ADDD\t\$%s,X",
+ 'E4' => "ANDB\t\$%s,X",
+ 'E6' => "LDAB\t\$%s,X",
+ 'E7' => "STAB\t\$%s,X",
+ 'E8' => "EORB\t\$%s,X",
+ 'E9' => "ADCB\t\$%s,X",
+ 'EA' => "ORAB\t\$%s,X",
+ 'EB' => "ADDB\t\$%s,X",
+ 'EC' => "LDD\t\$%s,X",
+ 'ED' => "STD\t\$%s,X",
+ 'EE' => "LDX\t\$%s,X",
+ 'EF' => "STX\t\$%s,X" );
+
+
+my %onewithword = (
+ '70' => "NEG\t>%s",
+ '73' => "COM\t>%s",
+ '74' => "LSR\t>%s",
+ '76' => "ROR\t>%s",
+ '77' => "ASR\t>%s",
+ '78' => "LSL\t>%s",
+# LSL == ASL
+# '78' => "ASL\t>%s",
+ '79' => "ROL\t>%s",
+ '7A' => "DEC\t>%s",
+ '7C' => "INC\t>%s",
+ '7D' => "TST\t>%s",
+ '7F' => "CLR\t>%s",
+# '95' => "BITA\t<%s",
+ 'B0' => "SUBA\t>%s",
+ 'B1' => "CMPA\t>%s",
+ 'B2' => "SBCA\t>%s",
+ 'B3' => "SUBD\t>%s",
+ 'B4' => "ANDA\t>%s",
+ 'B5' => "BITA\t>%s",
+ 'B6' => "LDAA\t>%s",
+ 'B7' => "STAA\t>%s",
+ 'B9' => "ADCA\t>%s",
+ 'BA' => "ORAA\t>%s",
+ 'BB' => "ADDA\t>%s",
+ 'BC' => "CPX\t>%s",
+ 'BD' => "JSR\t>%s",
+ 'BE' => "LDS\t>%s",
+ 'BF' => "STS\t>%s",
+ 'D5' => "BITB\t>%s",
+ 'F0' => "SUBB\t>%s",
+ 'F1' => "CMPB\t>%s",
+ 'F2' => "SBCB\t>%s",
+ 'F3' => "ADDD\t>%s",
+ 'F4' => "ANDB\t>%s",
+ 'F5' => "BITB\t>%s",
+ 'F6' => "LDAB\t>%s",
+ 'F7' => "STAB\t>%s",
+ 'FA' => "ORAB\t>%s",
+ 'FB' => "ADDB\t>%s",
+ 'F8' => "EORB\t>%s",
+ 'F9' => "ADCB\t>%s",
+ 'FC' => "LDD\t>%s",
+ 'FD' => "STD\t>%s",
+ 'FE' => "LDX\t>%s",
+ 'FF' => "STX\t>%s" );
+
LINE: while (<>) {
# if blank line, print blank line
# otherwise, catch all, print bytes
if (/^([A-F0-9]{4}) ((([A-F0-9]{2}) )*[A-F0-9]{2})/) {
- print ";$_";
- @_=split(' ',$2);
- print "\tFCB\t\$".join(', $',@_)."\n";
+ instruction($_);
next LINE;
}
# FINAL print commented out
print ";$_";
}
+
+# Process one instruction
+# Usage: instruction line
+sub instruction {
+ my ($line) = @_;
+
+ $instruction = substr($line,5,2);
+
+ if (defined $transtable{$instruction}) {
+ print ";$line";
+ print "\t$transtable{$instruction}";
+ $line =~ /$transtable{$instruction}(.*)$/i;
+ print "$1\n";
+ return;
+ }
+
+ if (defined $twobytefirst{$instruction}) {
+ print ";$line";
+ $thing = substr($line,5,5);
+ if (defined $twobytesecond{$thing}) {
+ print "\t" . $twobytesecond{$thing};
+ $line =~ /$twobytesecond{$thing}(.*)$/i;
+ print "$1\n";
+ return;
+ }
+
+ if (defined $twobytesecondword{$thing}) {
+ $athing = substr($line,11,2);
+ $athing2 = substr($line,14,2);
+ if (!($athing2 =~ /\s+/)) {
+ $curraddr = substr($line,0,4);
+ printf "FOO%s\tEQU\t\$%s%s\n", $curraddr,$athing,$athing2;
+ printf "\t$twobytesecondword{$thing}", "FOO$curraddr";
+ $line =~ /$twobytesecondword{$thing} [0-9A-F][0-9A-F][0-9A-F][0-9A-F](.*)$/i;
+ print "\t;$1\n";
+ return;
+ }
+ }
+ }
+
+ if (defined $onewitharg{$instruction}) {
+ print ";$line";
+ $thing = substr($line,8,2);
+
+ printf "\t$onewitharg{$instruction}", $thing;
+ $line =~ /$onewitharg{$instruction} [0-9A-F][0-9A-F](.*)$/i;
+ print "\t;$1\n";
+ return;
+ }
+
+ if (defined $onewithword{$instruction}) {
+ print ";$line";
+ $thing = substr($line,8,2);
+ $thing2 = substr($line,11,2);
+ if (!($thing2 =~ /\s+/)) {
+ $curraddr = substr($line,0,4);
+ printf "FOO%s\tEQU\t\$%s%s\n", $curraddr,$thing,$thing2;
+ printf "\t$onewithword{$instruction}", "FOO$curraddr";
+ $line =~ /$onewithword{$instruction} [0-9A-F][0-9A-F][0-9A-F][0-9A-F](.*)$/i;
+ print "\t;$1\n";
+ return;
+ }
+ }
+
+ print ";$line";
+ if ($line =~ /^([A-F0-9]{4}) ((([A-F0-9]{2}) )*[A-F0-9]{2})/) {
+ @_=split(' ',$2);
+ print "\tFCB\t\$".join(', $',@_)."\n";
+ }
+}