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:
+28
-42
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user