#! /usr/local/bin/perl @opcodes = ( #/* 00 */ ['lii', 2], ['lij', 2], ['lia', 2], ['lib', 2], ['ix', 1], ['dx', 1], ['iy', 1], ['dy', 1], ['mvw', 1], ['exw', 1], ['mvb', 1], ['exb', 1], ['adn', 1], ['sbn', 1], ['adw', 1], ['sbw', 1], #/* 1x */ ['lidp', 3], ['lidl', 2], ['lip', 2], ['liq', 2], ['adb', 1], ['sbb', 1], ['undef', 1], ['undef', 1], ['mvwd', 1], ['exwd', 1], ['mvbd', 1], ['exbd', 1], ['srw', 1], ['slw', 1], ['film', 1], ['fild', 1], #/* 2x */ ['ldp', 1], ['ldq', 1], ['ldr', 1], ['clra', 1], ['ixl', 1], ['dxl', 1], ['iys', 1], ['dys', 1], ['jrnzp', 2], ['jrnzm', 2], ['jrncp', 2], ['jrncm', 2], ['jrp', 2], ['jrm', 2], ['undef', 1], ['loop', 2], #/* 3x */ ['stp', 1], ['stq', 1], ['str', 1], ['nop', 1], ['push', 1], ['mvwp', 1], ['undef', 1], ['rtn', 1], ['jrzp', 2], ['jrzm', 2], ['jrcp', 2], ['jrcm', 2], ['undef', 1], ['undef', 1], ['undef', 1], ['undef', 1], #/* 4x */ ['inci', 1], ['deci', 1], ['inca', 1], ['deca', 1], ['adm', 1], ['sbm', 1], ['anma', 1], ['orma', 1], ['inck', 1], ['deck', 1], ['incm', 1], ['decm', 1], ['ina', 1], ['nop', 1], ['wait', 2], ['cup', 1], #/* 5x */ ['incp', 1], ['decp', 1], ['std', 1], ['mvdm', 1], ['mvmp', 1], ['mvmd', 1], ['ldpc', 1], ['ldd', 1], ['swp', 1], ['ldm', 1], ['sl', 1], ['pop', 1], ['undef', 1], ['outa', 1], ['undef', 1], ['outf', 1], #/* 6x */ ['anim', 2], ['orim', 2], ['tsim', 2], ['cpim', 2], ['ania', 2], ['oria', 2], ['tsia', 2], ['cpia', 2], ['nop', 1], ['case2', 4], ['nop', 1], ['test', 2], ['undef', 1], ['undef', 1], ['undef', 1], ['cdn', 1], #/* 7x */ ['adim', 2], ['sbim', 2], ['rz', 1], ['rz', 1], ['adia', 2], ['sbia', 2], ['rz', 1], ['rz', 1], ['call', 3], ['jp', 3], ['case1', 4], ['undef', 1], ['jpnz', 3], ['jpnc', 3], ['jpz', 3], ['jpc', 3], #/* 8x */ ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], #/* 9x */ ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], #/* Ax */ ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], #/* Bx */ ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], ['lp', 1], #/* Cx */ ['incj', 1], ['decj', 1], ['incb', 1], ['decb', 1], ['adcm', 1], ['sbcm', 1], ['tsma', 1], ['cpma', 1], ['incl', 1], ['decl', 1], ['incn', 1], ['decn', 1], ['inb', 1], ['nop', 1], ['nop', 1], ['undef', 1], #/* Dx */ ['sc', 1], ['rc', 1], ['sr', 1], ['nop', 1], ['anid', 2], ['orid', 2], ['tsid', 2], ['sz', 1], ['leave', 1], ['nop', 1], ['exab', 1], ['exam', 1], ['undef', 1], ['outb', 1], ['undef', 1], ['outc', 1], #/* Ex */ ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], #/* Fx */ ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2], ['cal', 2] ); $maxops = 4; $pc = 0; $ncase = 0; # set start address if ($ARGV[0] eq '-a') { if ($ARGV[1] =~ /[0-9A-Za-z]/) { $pc = hex($ARGV[1]); } } while (!eof(STDIN)) { printf "%04x ", $pc; ++$pc; $code = ord(getc(STDIN)); if (($ncase > 0) && ($code != 0x69)) { $nm = 'case3'; $len = 3; $ops[2] = $code; --$ncase; } else { $nm = $opcodes[$code][0]; $len = $opcodes[$code][1]; } printf "%02x ", $code; for ($i = 0; $i < $len - 1; $i++) { $ops[$i] = ord(getc(stdin)); ++$pc; printf "%02x ", $ops[$i]; } for (; $i < $maxops; $i++) { printf " "; } printf "%-8s", $nm; if ($nm eq 'lp') { printf "%02x", $code & 0x3f; } elsif ($nm eq 'cal') { printf "%02x%02x", $code & 0x1f, $ops[0]; } elsif ($nm eq 'case1') { printf "%02x %02x%02x", $ops[0], $ops[1], $ops[2]; $ncase = $ops[0]; } elsif ($nm eq 'case2') { --$ncase; printf "%02x %02x%02x", $ops[0], $ops[1], $ops[2]; } elsif ($nm eq 'case3') { printf "%02x %02x%02x", $ops[2], $ops[0], $ops[1]; } elsif (($nm eq 'loop') || ($nm =~ /jr.*m/)) { #printf "%04x", ($pc - $ops[0]) & 0xffff; printf "%04x", ($pc - $ops[0] - 1) & 0xffff; } elsif ($nm =~ /jr.*p/) { printf "%04x", ($pc + $ops[0] - 1) & 0xffff; } else { for ($i = 0; $i < $len - 1; $i++) { printf "%02x", $ops[$i]; } } printf "\n"; }