tools/a7out: I took out the code to pretend to deal with binary files,

and I did a perltidy to reformat the code.
This commit is contained in:
Warren Toomey
2016-03-01 18:28:37 +10:00
parent cd60f962c0
commit a2e8a187b2
+28 -42
View File
@@ -37,7 +37,8 @@ while ( defined( $ARGV[0] ) && ( $ARGV[0] =~ m{^-} ) ) {
# -d: debug mode # -d: debug mode
if ( $ARGV[0] eq "-d" ) { if ( $ARGV[0] eq "-d" ) {
$debug = 1; shift(@ARGV); $debug = 1;
shift(@ARGV);
} }
# -b: set a breakpoint # -b: set a breakpoint
@@ -248,14 +249,7 @@ sub add {
my ( $instruction, $addr, $indaddr ) = @_; my ( $instruction, $addr, $indaddr ) = @_;
dprintf( "add AC (value %06o) with addr %06o (%06o)\n", dprintf( "add AC (value %06o) with addr %06o (%06o)\n",
$AC, $indaddr, $Mem[$indaddr] ); $AC, $indaddr, $Mem[$indaddr] );
# $LINK = 0;
# $AC = $AC + $Mem[$indaddr];
# if ( $AC & LINKMASK ) {
# $AC++; # End-around carry
# $LINK = LINKMASK;
# }
# $AC = $AC & MAXINT;
#
# This logic shamelessly borrowed from SimH # This logic shamelessly borrowed from SimH
# https://github.com/simh/simh/blob/master/PDP18B/pdp18b_cpu.c # https://github.com/simh/simh/blob/master/PDP18B/pdp18b_cpu.c
my $sum = $AC + $Mem[$indaddr]; my $sum = $AC + $Mem[$indaddr];
@@ -266,7 +260,6 @@ sub add {
$LINK = LINKMASK; # set link $LINK = LINKMASK; # set link
} }
$AC = $sum; $AC = $sum;
$PC++; $PC++;
} }
@@ -350,10 +343,12 @@ sub opr {
} }
# List of skip opcode names for the next section # List of skip opcode names for the next section
my @skipop= ( '', 'sma', 'sza', 'sza sma', my @skipop = (
'', 'sma', 'sza', 'sza sma',
'snl', 'snl sma', 'snl sza', 'snl sza sma', 'snl', 'snl sma', 'snl sza', 'snl sza sma',
'skp', 'spa', 'sna', 'sna spa', 'skp', 'spa', 'sna', 'sna spa',
'szl', 'szl spa', 'szl sna', 'szl sna spa'); 'szl', 'szl spa', 'szl sna', 'szl sna spa'
);
# This logic shamelessly borrowed from SimH # This logic shamelessly borrowed from SimH
# https://github.com/simh/simh/blob/master/PDP18B/pdp18b_cpu.c # https://github.com/simh/simh/blob/master/PDP18B/pdp18b_cpu.c
@@ -363,23 +358,29 @@ sub opr {
$skip = 1 if ( ( $i == 1 ) && ( $AC & SIGN ) != 0 ); # sma $skip = 1 if ( ( $i == 1 ) && ( $AC & SIGN ) != 0 ); # sma
$skip = 1 if ( ( $i == 2 ) && ( $AC & MAXINT ) == 0 ); # sza $skip = 1 if ( ( $i == 2 ) && ( $AC & MAXINT ) == 0 ); # sza
$skip=1 if (($i == 3) && $skip = 1 if ( ( $i == 3 )
((($AC & MAXINT) == 0) || (($AC & SIGN) != 0))); # sza | sma && ( ( ( $AC & MAXINT ) == 0 ) || ( ( $AC & SIGN ) != 0 ) ) )
; # sza | sma
$skip = 1 if ( ( $i == 4 ) && ($LINK) ); # snl $skip = 1 if ( ( $i == 4 ) && ($LINK) ); # snl
$skip = 1 if ( ( $i == 5 ) && ( $LINK || ( $AC >= SIGN ) ) ); # snl | sma $skip = 1 if ( ( $i == 5 ) && ( $LINK || ( $AC >= SIGN ) ) ); # snl | sma
$skip = 1 if ( ( $i == 6 ) && ( $LINK || ( $AC == 0 ) ) ); # snl | sza $skip = 1 if ( ( $i == 6 ) && ( $LINK || ( $AC == 0 ) ) ); # snl | sza
$skip=1 if (($i == 7) && $skip = 1 if ( ( $i == 7 )
($LINK || ($AC >= SIGN) || ($AC == 0))); # snl | sza | sma && ( $LINK || ( $AC >= SIGN ) || ( $AC == 0 ) ) ); # snl | sza | sma
$skip = 1 if ( $i == 010 ); # skp $skip = 1 if ( $i == 010 ); # skp
$skip = 1 if ( ( $i == 011 ) && ( ( $AC & SIGN ) == 0 ) ); # spa $skip = 1 if ( ( $i == 011 ) && ( ( $AC & SIGN ) == 0 ) ); # spa
$skip = 1 if ( ( $i == 012 ) && ( ( $AC & MAXINT ) != 0 ) ); # sna $skip = 1 if ( ( $i == 012 ) && ( ( $AC & MAXINT ) != 0 ) ); # sna
$skip=1 if (($i == 013) && $skip = 1 if ( ( $i == 013 )
(($AC & MAXINT) != 0) && (($AC & SIGN) == 0)); # sna & spa && ( ( $AC & MAXINT ) != 0 )
&& ( ( $AC & SIGN ) == 0 ) ); # sna & spa
$skip = 1 if ( ( $i == 014 ) && ( $LINK == 0 ) ); # szl $skip = 1 if ( ( $i == 014 ) && ( $LINK == 0 ) ); # szl
$skip=1 if (($i == 015) && ($LINK == 0) && ($AC < SIGN)); # szl & spa $skip = 1
$skip=1 if (($i == 016) && ($LINK == 0) && ($AC != 0)); # szl & sna if ( ( $i == 015 ) && ( $LINK == 0 ) && ( $AC < SIGN ) ); # szl & spa
$skip=1 if (($i == 017) && $skip = 1
($LINK == 0) && ($AC != 0) && ($AC != 0)); # szl & sna & spa if ( ( $i == 016 ) && ( $LINK == 0 ) && ( $AC != 0 ) ); # szl & sna
$skip = 1 if ( ( $i == 017 )
&& ( $LINK == 0 )
&& ( $AC != 0 )
&& ( $AC != 0 ) ); # szl & sna & spa
# Clear operations # Clear operations
if ( $instruction & 010000 ) { # cla if ( $instruction & 010000 ) { # cla
@@ -389,10 +390,12 @@ sub opr {
dprintf(" cli"); $LINK = 0; dprintf(" cli"); $LINK = 0;
} }
if ( $instruction & 000002 ) { # cmi if ( $instruction & 000002 ) { # cmi
dprintf(" cmi"); $LINK= ($LINK) ? 0 : LINKMASK; dprintf(" cmi");
$LINK = ($LINK) ? 0 : LINKMASK;
} }
if ( $instruction & 000001 ) { # cma if ( $instruction & 000001 ) { # cma
dprintf(" cma"); $AC= ($AC ^ MAXINT) & MAXINT; dprintf(" cma");
$AC = ( $AC ^ MAXINT ) & MAXINT;
} }
# Rotate instructions # Rotate instructions
@@ -477,7 +480,6 @@ sub eae {
# Save the AC's sign into LINK # Save the AC's sign into LINK
my $newlink = ( $AC << 1 ) & LINKMASK; my $newlink = ( $AC << 1 ) & LINKMASK;
$AC = ( ( $LINK | $AC ) >> $step ) & MAXINT; $AC = ( ( $LINK | $AC ) >> $step ) & MAXINT;
$LINK = $newlink; $LINK = $newlink;
$PC++; $PC++;
@@ -486,7 +488,6 @@ sub eae {
if ( $instruction == 0660700 ) { # alss: long left shift, signed if ( $instruction == 0660700 ) { # alss: long left shift, signed
# We don't fill the lsb with LINK yet # We don't fill the lsb with LINK yet
dprintf( "alss %06o AC step %d\n", $AC, $step ); dprintf( "alss %06o AC step %d\n", $AC, $step );
$AC = ( $AC << $step ) & MAXINT; $AC = ( $AC << $step ) & MAXINT;
$PC++; $PC++;
return; return;
@@ -526,6 +527,7 @@ sub sys_close {
# Open system call # Open system call
sub sys_open { sub sys_open {
# Open seems to have 2 arguments: PC+1 is a pointer to the filename. # Open seems to have 2 arguments: PC+1 is a pointer to the filename.
# PC+2 seems to be 1 for write, 0 for read. # PC+2 seems to be 1 for write, 0 for read.
# Some programs seem to have a third argument always set to 0. # Some programs seem to have a third argument always set to 0.
@@ -595,22 +597,12 @@ sub sys_read {
$count = 0; $count = 0;
foreach my $addr ( $start .. $end ) { foreach my $addr ( $start .. $end ) {
# It's a terminal, so convert from ASCII
if ( -t $FH ) {
my $c1 = getc($FH); my $c1 = getc($FH);
last if ( !defined($c1) ); # No character, leave the loop last if ( !defined($c1) ); # No character, leave the loop
my $c2 = getc($FH) || ""; # No character, make it a NUL my $c2 = getc($FH) || ""; # No character, make it a NUL
$Mem[$addr] = $Mem[$addr] =
( ord($c1) << 9 ) | ord($c2); # Pack both into one word ( ord($c1) << 9 ) | ord($c2); # Pack both into one word
$count++; $count++;
} else {
# otherwise (for now) read in one line and convert to octal
my $line = <$FH>;
last if ( !defined($line) ); # No line, leave the loop
chomp($line);
$Mem[$addr] = oct($line) & MAXINT;
$count++;
}
} }
# No error # No error
@@ -647,13 +639,7 @@ sub sys_write {
my $FH = $FD[$fd]; my $FH = $FD[$fd];
foreach my $addr ( $start .. $end ) { foreach my $addr ( $start .. $end ) {
# It's a terminal, so convert to ASCII
# otherwise (for now) print in octal
if ( -t $FH ) {
print( $FH word2ascii( $Mem[$addr] ) ); print( $FH word2ascii( $Mem[$addr] ) );
} else {
printf( $FH "%06o\n", $Mem[$addr] );
}
} }
# No error # No error