From f466f8490e3636ae1c9083b506fd37cc7cc2de9b Mon Sep 17 00:00:00 2001 From: Nick Downing Date: Sun, 31 Dec 2023 11:47:53 +1100 Subject: [PATCH] Initial commit, can compile and execute hello.b --- .gitignore | 5 + Makefile | 14 + as7 | 631 +++++++++++++++++ b.c | 1028 ++++++++++++++++++++++++++++ bi.c | 502 ++++++++++++++ doc/PDP7_Instruction_list_text.pdf | Bin 0 -> 109837 bytes doc/bi.s | 441 ++++++++++++ doc/bl.s | 198 ++++++ doc/op.s | 101 +++ footer.s | 5 + header.s | 20 + hello.b | 9 + n.sh | 9 + rassert.h | 11 + 14 files changed, 2974 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100755 as7 create mode 100644 b.c create mode 100644 bi.c create mode 100644 doc/PDP7_Instruction_list_text.pdf create mode 100644 doc/bi.s create mode 100644 doc/bl.s create mode 100644 doc/op.s create mode 100644 footer.s create mode 100644 header.s create mode 100644 hello.b create mode 100755 n.sh create mode 100644 rassert.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8061a12 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.o +/a.out +/b +/bi +/hello.s diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..73603a0 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +CFLAGS=-g -Wall + +all: b bi + +b.o: b.c +b: b.o + ${CC} -o $@ $< + +bi.o: bi.c +bi: bi.o + ${CC} -o $@ $< + +clean: + rm -f b bi *.o diff --git a/as7 b/as7 new file mode 100755 index 0000000..571ef47 --- /dev/null +++ b/as7 @@ -0,0 +1,631 @@ +#!/usr/bin/env perl +# +# Read in files of PDP-7 assembly code in Ken Thompson's as format +# and convert them into PDP-7 machine code +# +# (c) 2016 Warren Toomey, GPL3 +# Tweaked by Phil Budne (line, expression parsing, output formats) +# +use strict; +use warnings; +use Data::Dumper; +use Getopt::Long qw(GetOptions); + +Getopt::Long::Configure qw(gnu_getopt); + +### Global variables ### +my %Var; # Variables such as ., .., t +my %Glabel; # Global labels that are defined once +my %Llabel; # Local labels that are defined once +my %Islocal; # True if the label is a local label +my %Rlabel; # Relative labels, e.g. 1:, 2: + # with an array of locations for each label + +my @Mem; # Actual PDP-7 memory locations +my @Mline; # Source lines associated with mem locations +my $origline; # The original current input line of code +my $line; # line being parsed +my $stage = 1; # Pass one or pass two +my $errors = 0; # set to non-zero on error +my $line_error = ' '; +my $file; # current file name +my $lineno; # current line number +my $OUTPUT; # output file +my $RELATIVE = 01000000; # set on non-absolute symbol values +my $BASE = 0|$RELATIVE; # starting value for "." +### Main program ### + +## command line options +my $debug = 0; # Run in debug mode +my $format = 'a7out'; # output format +my $namelist = 0; # output n.out file +my $output = 'a.out'; # output file +my $no_label_warnings = 0; # suppress multiply defined label warnings + +# keep this near the GetOptions call to make it easy to add documentation! +sub usage { + die("Usage: $0 [--debug] [--format=a7out|list|ptr|rim ]\n" . + "\t[-n] [--out file] file1.s [file2.s ...]\n"); +} + +GetOptions( + 'debug|d' => \$debug, + 'format|f=s' => \$format, + 'namelist|n' => \$namelist, + 'output|o=s' => \$output, + 'no-label-warnings' => \$no_label_warnings, +) or usage(); + +usage() if ( @ARGV < 1 ); + +# http://minnie.tuhs.org/cgi-bin/utree.pl?file=V3/man/manx/as.1 +# ".." is the relocation constant and is added to each relocatable +# reference. On a PDP-11 with relocation hardware, its value is 0; on +# most systems without protection, its value is 40000(8). + +# PLB: "relocatable" values are flagged with $RELATIVE + +# start with the location counter at zero +# predefine syscall and opcodes as variables +%Var = ( + '.' => $BASE, + '..' => 4096, # output base addr? + + # as.s does not have an initial symbol table + # (except for the above), so there must have been a + # user "ops" file + + save => 1, # saves core dump & user area! + getuid => 2, + open => 3, + read => 4, + write => 5, + creat => 6, + seek => 7, + tell => 8, + close => 9, + link => 10, + unlink => 11, + setuid => 12, + rename => 13, + exit => 14, + time => 15, + intrp => 16, + chdir => 17, + chmod => 18, + chown => 19, + # 20 removed + sysloc => 21, # return system addresses + # 22 removed + capt => 23, # capture display? + rele => 24, # release display? + status => 25, # "stat" + smes => 27, + rmes => 28, + fork => 29, + + # List of instruction names and machine code values + # These come from https://raw.githubusercontent.com/simh/ + + sys => 0020000, # "cal i" instruction (trap indirect thru 020) + i => 0020000, # indirect bit + + # memory reference instructions + dac => 0040000, # deposit AC + jms => 0100000, # jump to subroutine + dzm => 0140000, # deposit zero in memory + lac => 0200000, # load AC + xor => 0240000, # exclusive or + add => 0300000, # one's complement add + tad => 0340000, # two's complement add + xct => 0400000, # execute + isz => 0440000, # increment and skip if zero + and => 0500000, # AND with contents of Y + sad => 0540000, # skip if AC different from content of Y + jmp => 0600000, # jump to Y + + # Type 177 Extended Arithmetic Element (EAE) + eae => 0640000, # base instruction (nop) + osc => 0640001, # OR SC into AC + omq => 0640002, # OR MQ into AC + cmq => 0640004, # Complement MQ + div => 0640323, # divide + norm => 0640444, # normalize, unsigned + lls => 0640600, # long left shift + clls => 0641600, # lls but clear AC first + als => 0640700, # AC shift + lrs => 0640500, # long right shift + ecla => 0641000, # clear AC + lacs => 0641001, # load AC with SC + lacq => 0641002, # load AC with MQ + abs => 0644000, # absolute value + divs => 0644323, # divide, signed + + clq => 0650000, # clear MQ + frdiv => 0650323, # fractional divide + lmq => 0652000, # load MQ from AC + mul => 0653122, # multiply + idiv => 0653323, # integer divide + idivs => 0657323, # integer divide, signed + frdivs => 0654323, # fractional divide, signed + muls => 0657122, # multiply, signed + + norms => 0660444, # normalize, signed + gsm => 0664000, # get sign and magnitude + lrss => 0660500, # long right shift, signed + llss => 0660600, # long left shift, signed + alss => 0660700, # AC left shift, signed + + # PLB: removed I/OT instructions: kernel uses sop.s + + # Operate Instructions + + # Group 1 (OPR 1) instructions + opr => 0740000, # base operate instruction (nop) + nop => 0740000, + cma => 0740001, # complement accumulator + cml => 0740002, # complement link + oas => 0740004, # inclusive or accumulator switches + ral => 0740010, # rotate (ac, link) left + rar => 0740020, # rotate (ac, link) right + hlt => 0740040, # HALT + xx => 0740040, + sma => 0740100, # skip on minus accumulator + sza => 0740200, # skip on zero accumulator + snl => 0740400, # skip on non-zero link + + skp => 0741000, # unconditional skip + spa => 0741100, # skip on positive accumulator + sna => 0741200, # skip on negative accumulator + szl => 0741400, # skip on zero link + + rtl => 0742010, # rotate two left (ral*2) + rtr => 0742020, # rotate two right (rar*2) + + cll => 0744000, # clear link + stl => 0744002, # set link + rcl => 0744010, # clear link, rotate left + rcr => 0744020, # clear link, rotate right + + cla => 0750000, # clear accumulator + clc => 0750001, # clear and complement acc + las => 0750004, # load acc from switches + glk => 0750010, # get link + + # Group 2 operate + law => 0760000, # load accumulator with (instruction) +# lam => 0777777, # (load accumulator minus) +); + + +# Parse all the files +print STDERR "I\n"; # like the real as +foreach my $file (@ARGV) { + parse_file($file); +} + +# Now do it all again, pass two +$Var{'.'} = $BASE; +$stage = 2; +open(my $OUT, ">$output") || die "$output"; + +print STDERR "II\n"; # like the real as +foreach my $file (@ARGV) { + print STDERR "$file\n"; # like the real as + parse_file($file); +} + +if ($format eq 'a7out') { + # print out the contents of memory + for my $i ( 0 .. $#Mem ) { + if ( defined( $Mem[$i] ) ) { + printf $OUT "%06o: %06o\t%s\n", $i, $Mem[$i], ($Mline[$i] || ""); + } + } +} +elsif ($format eq 'list') { + print $OUT "\n"; + print $OUT "Labels:\n"; + dump_labels($OUT); +} +elsif ($format eq 'ptr') { # dump absolute memory in PTR binary + for my $loc ( $Var{'..'} .. $#Mem ) { + punch($Mem[$loc] || 0); + } +} +elsif ($format eq 'rim') { # "Hardware Read In" tape + # only handles continguous memory, but no overhead + my $base = $Var{'..'}; + for my $loc ( $base .. $#Mem ) { + punch($Mem[$loc] || 0); + } + # final word: command; has 0100 lit on last frame + punch(0600000 | $base, 0100 ); +} +else { + die("unknown format $format"); +} +close($OUT); + +if ($namelist) { + # as.s writes a binary file named n.out, ours is ascii + open (my $NOUT, ">", "n.out") || die "n.out"; + dump_labels($NOUT); + close($NOUT); +} + +exit($errors); + +# report an assmebly error: +# sets error flag +# reports filename:lineno for emacs m-x compile +sub err { + $line_error = shift; + my $msg = shift; + + $errors = 1; # exit status + if ($stage == 2) { + print STDERR "$file:$lineno: $msg\n"; + print $OUT "$file:$lineno: $msg\n" if ($format eq 'list'); + } + return 0; # expression value +} + +# Set a label, either global or local +sub set_label +{ + my ($label,$loc)= @_; + + # PLB: truncate to eight: moo.s declares "standing" + # but references it as "standings" + $label = substr($label, 0, 8); + + # It is a local label if we're told it is, or if it starts with "L" + if ($Islocal{$file}{$label} || $label=~ m{^L}) { + # An error to have different values + if ( defined( $Llabel{$file}{$label} ) && $Llabel{$file}{$label} != $loc ) { + # non-fatal: as.s doesn't even warn!!!! + print STDERR "$file:$lineno: Local label $label multiply defined\n" + if ($stage == 2 && !$no_label_warnings); + } + else { + $Llabel{$file}{$label} = $loc; + printf( "Set local label %s to %#o\n", $label, $loc ) if ($debug); + } + } else { + # original as doesn't complain about multiple definitions of labels + # (Space Travel depends on this). Now a warning (on by default) + if ( defined( $Glabel{$label} ) && $Glabel{$label} != $loc ) { + print STDERR "$file:$lineno: Warning: Global label $label multiply defined\n" + if ($stage == 2 && !$no_label_warnings); + } + $Glabel{$label} = $loc; + printf( "Set global label %s to %#o\n", $label, $loc ) if ($debug); + } +} + +# Get the value of a global or local label +sub get_label +{ + my $label= shift; + # PLB: truncate to eight: moo.s declares "standing" + # but references it as "standings" + $label = substr($label, 0, 8); + return($Llabel{$file}{$label}) if (defined($Llabel{$file}{$label})); + return($Glabel{$label}); +} + +# Open and parse the given file +sub parse_file { + $file = shift; + + open( my $IN, "<", $file ) || die("Cannot open $file: $!\n"); + $lineno = 0; + while ( $line = <$IN> ) { + $lineno++; + chomp($line); # Lose the end of line + $origline = $line; + print $OUT "\t\t$line\n" + if ($stage == 2 && $line ne '' && $format eq 'list'); + parse_line(); + } + close($IN); +} + +# process a label and set its value to the location counter +# OK for symbolic label to be entered twice, so long as it's the same value +# (ie; both passes) +sub process_label { + my $label = shift; + my $loc = $Var{'.'}; + + print "process_label $label\n" if ($debug); + + if ( $label =~ m{^\d+$} ) { # numeric (relative) label? + if ($stage == 1) { + push( @{ $Rlabel{$label} }, $loc ); + printf( "Pushing %#o for label %s\n", $loc, $label ) if ($debug); + } + } # numeric label + else { # symbolic label + set_label($label, $loc); + } +} + +# Parse assembler directives. These were not in the original +# PDP-7 Unix source, but we need them so that we can write +# compilers that target this assembler. +sub parse_directive +{ + my $directive= shift; + print("Got directive $directive\n") if ($debug); + + # Set this as a local label + if ($directive=~ m{^\@local\s+(\S+)}) { + $Islocal{$file}{$1}=1; + } +} + +sub eol { + return $line eq '' || $line =~ m{^"}; # empty or comment +} + +# Blame Phil for this.... +# parses global $line based on prefixes, nibbling of a bit at a time +# (: and ; can appear in char literals) +# handles multiple ';' separated words per line +# allows " in character literals (tho none appear in listings) +sub parse_line { + while (1) { + $line_error = ' '; # clear listing error indicator + + return if (eol()); + + print "parse_line: '$line'\n" if ($debug); + + # Lose any leading whitespace + $line =~ s{^\s*}{}; + + # Assembler directives start with an @ + if ($line =~ m{^\@}) { + parse_directive($line); + return; + } + + while ($line =~ s{^([A-Za-z0-9_\.]+):\s*}{}) { # labels + process_label($1); + } + + return if (eol()); + + if ( $line =~ s{^([^;= \t]+)\s*=}{}) { # assignment + my $lhs = $1; + my $word = parse_expression(); + printf( "Setting variable %s to 0%o\n", $lhs, $word ) if ($debug); + $Var{$lhs} = $word; + printf $OUT "\t%06o %s\n", $word, $line_error + if ($stage == 2 && $format eq 'list'); + } + else { # bare expression (not assignment) + # Get its value on pass two and save to memory + # Also save the input line that altered memory + my $word = parse_expression(); + if ( $stage == 2 ) { + my $location = $Var{'.'}; + if ($location & $RELATIVE) { # non-absolute location? + $location &= 0777777; + $location += $Var{'..'} & 0777777; # relocate + # XXX check for overflow? + } + if ($word & $RELATIVE) { # word created from relative addresses? + $word &= 0777777; + $word += $Var{'..'} & 0777777; # relocate + # XXX check for overflow? + } + if ($location < 0) { + err('.', 'below base'); + } + else { + $Mem[$location] = $word; + } + $Mline[$location] = $origline; + $origline = ''; + if ($format eq 'list' and defined($word)) { + # show flags?? + printf $OUT "%06o: %06o %s\n", + $location, $word, $line_error; + } + } + # Move up to the next location in both passes + $Var{'.'}++; + } # expr + + # eat trailing whitespace and ";", if any + $line =~ s{^\s*;?}{}; + } # while +} + +# Blame Phil for this bit too... +# Parse an expression off $line and return a PDP-7 word +# as a series of whitespace separated "syllables" +# ORed, added, or subtracted +sub parse_expression { + my $word = 0; + my $flags = 0; + + print "expression: '$line'\n" if ($debug); + + while (1) { + my $syllable = 0; + my $op = '|'; + + $line =~ s{^\s+}{}; # as.s accepts ",' as whitespace too! + + if ($line eq '' || $line =~ m{^[";]}) { # EOL ; and " terminate expr + $word |= $flags; + printf("\tparse_expression => %#o\n", $word) if ($debug); + return $word; + } + + print " '$line'\n" if ($debug); + + if ($line =~ s{^-}{}) { + print "\tfound -\n" if ($debug); + $op = '-'; + } + elsif ($line =~ s{^\+}{}) { + print "\tfound +\n" if ($debug); + $op = '+'; + } + + if ($line =~ s{^<(.)}{}) { # }{}) { # char> + print "\tfound x>\n" if ($debug); + $syllable = ord($1) # absolute + } + elsif ($line =~ s{^>(.)}{}) { # >char !! + print "\tfound >x\n" if ($debug); + $syllable = ord($1) # absolute + } + elsif ($line =~ s{^([A-Za-z_\.][A-Za-z0-9_\.]*)}{}) { + my $sym = $1; + print "\tsym: $sym\n" if ($debug); + + if (defined($Var{$sym})) { + $syllable = $Var{$sym}; + printf("\tvar: %s: %#o\n", $sym, $syllable) if ($debug); + } + elsif (defined(get_label($sym))) { + $syllable = get_label($sym); + printf("\tlbl: %s: %#o\n", $sym, $syllable) if ($debug); + } + elsif ($stage == 2) { + err('U', "$sym not defined") + } # pass 2 + } # symbol + elsif ( $line =~ s{^(\d+)([fb])}{} ) { # relative label + printf "\tfound relative: $1$2\n" if ($debug); + $syllable = find_relative_label( $1, $2 ) if ($stage == 2); + } + elsif ( $line =~ s{^(\d+)}{} ) { # constant + my $value = $1; + printf "\tfound constant: $value\n" if ($debug); + if ( $value =~ m{^0} ) { + # PLB 2020-10-05: behave like as.s + $syllable = 0; + for my $digit (split(//, $value)) { + $syllable = $syllable * 010 + ord($digit) - ord('0'); + } + } + else { + $syllable = $value + 0; + } + $syllable &= 0777777; # absolute + } + else { + # From the BSD fortune file: + # Ken Thompson has an automobile which he helped design. + # Unlike most automobiles, it has neither speedometer, + # nor gas gauge, nor any of the numerous idiot lights + # which plague the modern driver. Rather, if the driver + # makes any mistake, a giant "?" lights up in the center + # of the dashboard. "The experienced driver", + # he says, "will usually know what's wrong. + err('?', "huh? '$line'"); + $line = ''; # abort processing + return undef; + } + + my $sylflags = $syllable & $RELATIVE; + $syllable &= 0777777; + + if ($op eq '+') { + $word += $syllable; + $flags |= $sylflags; + } + elsif ($op eq '-') { + $word -= $syllable; + if ($flags & $RELATIVE) { + # relative-relative => absolute! + if ($sylflags & $RELATIVE) { + $flags &= ~$RELATIVE; + } + # else: relative-abs => relative (no change) + } + else { # word is absolute + if ($sylflags & $RELATIVE) { + err('A', 'absolute value minus relative??'); + } + # else: absolute-absolute => absolute (no change) + } + } + else { + $word |= $syllable; + $flags |= $sylflags; + } + $word &= 0777777; + printf("\tsyllable: %#o word: %#o\n", $syllable, $word) if ($debug); + } +} + +# Given a relative label number and a direction, +# return the location of this relative label or +# die if we don't have one +sub find_relative_label { + my ( $label, $direction ) = @_; + my $curlocation = $Var{'.'}; + + # Error check: no labels at all + if ( !defined( $Rlabel{$label} ) ) { + return err('U', "relative label $label never defined"); + } + + # Get the list of possible locations for this label + my $locarray = $Rlabel{$label}; + + # Error check: no locations + return err('U', "No relative labels") if ( @{$locarray} == 0 ); + + if ( $direction eq 'f' ) { + # Search forward for first location larger then the current one + foreach my $reflocation ( @{$locarray} ) { + printf("forward %#o %#o\n", $reflocation, $curlocation) if ($debug); + return ($reflocation) if ( $reflocation > $curlocation ); + } + } + else { + # Search backwards for first location smaller than the current one + foreach my $reflocation ( sort( { $b <=> $a } @{$locarray} ) ) { + printf("backward %#o %#o\n", $reflocation, $curlocation) if ($debug); + return ($reflocation) if ( $reflocation < $curlocation ); + } + } + return err('U', "undefined relative reference $label$direction"); +} + +sub punch { # output a word in paper tape binary format + my $word = shift; + my $final = shift || 0; + + printf $OUT "%c%c%c", + (($word >> 12) & 077) | 0200, + (($word >> 6) & 077) | 0200, + ($word & 077) | 0200 | $final; +} + +sub dump_labels { # for 'list' and --namelist + my $file = shift; + + foreach my $key (sort keys %Glabel) { + my $addr = $Glabel{$key}; + my $flags = ($addr & $RELATIVE) ? "r" : ""; + if ($addr & $RELATIVE) { + $addr &= 0777777; + $addr += $Var{'..'}; + } + printf $file "%-8.8s %#06o %s\n", $key, $addr & 0777777, $flags; + } +} diff --git a/b.c b/b.c new file mode 100644 index 0000000..899f132 --- /dev/null +++ b/b.c @@ -0,0 +1,1028 @@ +/* b.c - B compiler for PDP-7 Unix + + Implemented in a subset of the C language compatible with B. + Coding style and organization based on lastc1120c.c + + (C) 2016 Robert Swierczek, GPL3 + + To compile hello.b: + gcc -Wno-multichar b.c -o b + ./b hello.b hello.s + perl as7 --out a.out bl.s hello.s bi.s + perl a7out a.out +*/ + +#ifdef _WIN32 +#include +#else +#include +#endif +#include +#include +#include +#include + +/* runtime */ +int fin; +int fout = 1; + +void pexpr(); +void error(int code); +void stmt(); +void blkend(); +void stmtlist(); +void getcc(); +void extdef(); + +xread() { + char buf[1]; + if (read(fin, buf, 1) <= 0) + return 4; + return buf[0]; +} + +xwrite(c) { + char buf[2]; + if (c & 0xff00) { + buf[0] = (c >> 8) & 0xff; + buf[1] = c & 0xff; + write(fout, buf, 2); + } else { + buf[0] = c & 0xff; + write(fout, buf, 1); + } +} + +xflush() { +} + +// Nick +wrstr(char *str) { + write(fout, str, strlen(str)); +} +#define eof xeof +#define read xread +#define write xwrite +#define flush xflush + +main(int argc, char **argv) { + extern symtab[], eof, *ns, nerror; + extern fin, fout; + + if (argc > 1) { + if (argc > 2) { + if ((fout = creat(argv[2], 0666))<0) { // Nick 0777 + error('fo'); + return(1); + } + } + if ((fin = open(argv[1],0))<0) { + error('fi'); + return(1); + } + } + + while (!eof) { + ns = symtab + 51; + extdef(); + blkend(); + } + return(nerror!=0); +} + +int *lookup() { + extern symtab[], symbuf[], eof, *ns; + auto *np, *sp, *rp; + + rp = symtab; + while (rp < ns) { + np = rp + 2; + sp = symbuf; + while (*np==*sp) { + if (!*np) + return(rp); + np = np+1; + sp = sp+1; + } + while (*np) + np = np+1; + rp = np+1; + } + sp = symbuf; + if (ns >= symtab + 290) { + error('sf'); + eof = 1; + return(rp); + } + *ns = 0; + ns[1] = 0; + ns = ns+2; + while (*ns = *sp) { + ns = ns+1; + sp = sp+1; + } + ns = ns+1; + return(rp); +} + +symbol() { + extern symbuf[], ctab[], peeksym, peekc, eof, line, *csym, cval; + auto b, c, ct, *sp; + + if (peeksym>=0) { + c = peeksym; + peeksym = -1; + return(c); + } + if (peekc) { + c = peekc; + peekc = 0; + } else { + if (eof) + return(0); + c = read(); + } +loop: + ct = ctab[c]; + + if (ct==0) { /* eof */ + eof = 1; + return(0); + } + + if (ct==126) { /* white space */ + if (c=='\n') + line = line+1; + c = read(); + goto loop; + } + + if (c=='=') + return(subseq('=',80,60)); + + if (c=='<') + return(subseq('=',63,62)); + + if (c=='>') + return(subseq('=',65,64)); + + if (c=='!') + return(subseq('=',34,61)); + + if (c=='$') { + if (subseq('(',0,1)) + return(2); + if (subseq(')',0,1)) + return(3); + } + if (c=='/') { + if (subseq('*',1,0)) + return(43); +com: + c = read(); +com1: + if (c==4) { + eof = 1; + error('*/'); /* eof */ + return(0); + } + if (c=='\n') + line = line+1; + if (c!='*') + goto com; + c = read(); + if (c!='/') + goto com1; + c = read(); + goto loop; + } + if (ct==124) { /* number */ + cval = 0; + if (c=='0') + b = 8; + else + b = 10; + while(c >= '0' & c <= '9') { + cval = cval*b + c -'0'; + c = read(); + } + peekc = c; + return(21); + } + if (c=='\'') { /* ' */ + getcc(); + return(21); + } + if (ct==123) { /* letter */ + sp = symbuf; + while(ct==123 | ct==124) { + if (sp= 0) + error('cc'); +} + +getstr() { + auto i, c, d; + + i = 1; +loop: + if ((c = mapch('"')) < 0) { + number(2048); + write('\n'); + return(i); + } + if ((d = mapch('"')) < 0) { + number(c*512+4); + write('\n'); + return(i); + } + number(c*512+d); + write('\n'); + i = i+1; + goto loop; +} + +mapch(c) { + extern peekc; + auto a; + + if ((a=read())==c) + return(-1); + + if (a=='\n' | a==0 | a==4) { + error('cc'); + peekc = a; + return(-1); + } + + if (a=='*') { + a=read(); + + if (a=='0') + return(0); + + if (a=='e') + return(4); + + if (a=='(') + return('{'); + + if (a==')') + return('}'); + + if (a=='t') + return('\t'); + + if (a=='r') + return('\r'); + + if (a=='n') + return('\n'); + } + return(a); +} + +void expr(lev) { + extern peeksym, *csym, cval, isn; + auto o; + + o = symbol(); + + if (o==21) { /* number */ +case21: + if ((cval & 017777)==cval) { + gen('c',cval); /* consop */ + goto loop; + } + gen('n',5); /* litrl */ + number(cval); + write('\n'); + goto loop; + } + + if (o==122) { /* string */ +#if 1 // Nick + wrstr("x .+2 \" ext\n"); + wrstr("t 2f \" tra\n"); +#else + write('x '); + write('.+'); + write('2\n'); + write('t '); + write('2f'); + write('\n'); +#endif + write('.+'); + write('1\n'); + getstr(); + write('2:'); + write('\n'); + goto loop; + } + + if (o==20) { /* name */ + if (*csym==0) { /* not seen */ + if ((peeksym=symbol())==6) { /* ( */ + *csym = 6; /* extrn */ + } else { + *csym = 2; /* internal */ + csym[1] = isn; + isn = isn+1; + } + } + if (*csym==5) /* auto */ + gen('a',csym[1]); + else { + write('x '); + if (*csym==6) { /* extrn */ + write('.'); + name(csym+2); + } else { /* internal */ + write('1f'); + write('+'); + number(csym[1]); + } +#if 1 // Nick + wrstr(" \" ext\n"); +#else + write('\n'); +#endif + } + goto loop; + } + + if (o==34) { /* ! */ + expr(1); + gen('u',4); /* unot */ + goto loop; + } + + if (o==41) { /* - */ + peeksym = symbol(); + if (peeksym==21) { /* number */ + peeksym = -1; + cval = -cval; + goto case21; + } + expr(1); + gen('u',2); /* umin */ + goto loop; + } + + if (o==47) { /* & */ + expr(1); + gen('u',1); /* uadr */ + goto loop; + } + + if (o==42) { /* * */ + expr(1); + gen('u',3); /* uind */ + goto loop; + } + + if (o==6) { /* ( */ + peeksym = o; + pexpr(); + goto loop; + } + error('ex'); + +loop: + o = symbol(); + + if (lev>=14 & o==80) { /* = */ + expr(14); + gen('b',1); /* asg */ + goto loop; + } + if (lev>=10 & o==48) { /* | ^ */ + expr(9); + gen('b',2); /* bor */ + goto loop; + } + if (lev>=8 & o==47) { /* & */ + expr(7); + gen('b',3); /* band */ + goto loop; + } + if (lev>=7 & o>=60 & o<=61) { /* == != */ + expr(6); + gen('b',o-56); /* beq bne */ + goto loop; + } + if (lev>=6 & o>=62 & o<=65) { /* <= < >= > */ + expr(5); + gen('b',o-56); /* ble blt bge bgt */ + goto loop; + } + if (lev>=4 & o>=40 & o<=41) { /* + - */ + expr(3); + gen('b',o-28); /* badd bmin */ + goto loop; + } + if (lev>=3 & o>=42 & o<=43) { /* * / */ + expr(2); + gen('b',o-27); /* bmul bdiv */ + goto loop; + } + if (lev>=3 & o==44) { /* % */ + expr(2); + gen('b',14); /* bmod */ + goto loop; + } + if (o==4) { /* [ */ + expr(15); + if (symbol() != 5) + error('[]'); + gen('n',4); /* vector */ + goto loop; + } + if (o==6) { /* ( */ + o = symbol(); + if (o==7) /* ) */ + gen('n',1); /* mcall */ + else { + gen('n',2); /* mark */ + peeksym = o; + while (o!=7) { + expr(15); + o = symbol(); + if (o!=7 & o!=9) { /* ) , */ + error('ex'); + return; + } + } + gen('n',3); /* call */ + } + goto loop; + } + + peeksym = o; +} + +void pexpr() { + if (symbol()==6) { /* ( */ + expr(15); + if (symbol()==7) /* ) */ + return; + } + error('()'); +} + +void declare(kw) { + extern *csym, cval, nauto; + auto o; + + while((o=symbol())==20) { /* name */ + if (kw==6) { /* extrn */ + *csym = 6; + o = symbol(); + } else { /* auto/param */ + *csym = 5; /* auto */ + csym[1] = nauto; + o = symbol(); + if (kw==5 & o==21) { /* auto & number */ + gen('y',nauto); /* aryop */ + nauto = nauto + cval; + o = symbol(); + } + nauto = nauto+1; + } + if (o!=9) /* , */ + goto done; + } +done: + if (o==1 & kw!=8 | o==7 & kw==8) /* auto/extrn ; param ')' */ + return; +syntax: + error('[]'); /* declaration syntax */ +} + +void extdef() { + extern peeksym, *csym, cval, nauto; + auto o, c; + + o = symbol(); + if (o==0 | o==1) /* eof ; */ + return; + + if (o!=20) /* name */ + goto syntax; + + csym[0] = 6; /* extrn */ + write('.'); + name(csym + 2); + write(':'); + o=symbol(); + + if (o==2 | o==6) { /* $( ( */ + write('.+'); + write('1\n'); + nauto = 2; + if (o==6) { /* ( */ + declare(8); /* param */ + if ((o=symbol())!=2) /* $( */ + goto syntax; + } + while((o=symbol())==19 & cval<10) /* auto extrn */ + declare(cval); + peeksym = o; + gen('s',nauto); /* setop */ + stmtlist(); + gen('n',7); /* retrn */ + return; + } + + if (o==41) { /* - */ + if (symbol()!=21) /* number */ + goto syntax; + number(-cval); + write('\n'); + return; + } + + if (o==21) { /* number */ + number(cval); + write('\n'); + return; + } + + if (o==1) { /* ; */ + write('0\n'); + return; + } + + if (o==4) { /* [ */ + c = 0; + if ((o=symbol())==21) { /* number */ + c = cval; + o = symbol(); + } + if (o!=5) /* ] */ + goto syntax; + write('.+'); + write('1\n'); + if ((o=symbol())==1) /* ; */ + goto done; + while (o==21 | o==41) { /* number - */ + if (o==41) { /* - */ + if (symbol()!=21) + goto syntax; + cval = -cval; + } + number(cval); + write('\n'); + c = c-1; + if ((o=symbol())==1) /* ; */ + goto done; + if (o!=9) /* , */ + goto syntax; + else + o = symbol(); + } + goto syntax; +done: + if (c>0) { + write('.='); + write('.+'); + number(c); + write('\n'); + } + return; + } + + if (o==0) /* eof */ + return; + +syntax: + error('xx'); + stmt(); +} + +void stmtlist() { + extern peeksym, eof; + auto o; + + while (!eof) { + if ((o = symbol())==3) /* $) */ + return; + peeksym = o; + stmt(); + } + error('$)'); /* missing $) */ +} + +void stmt() { + extern peeksym, peekc, *csym, cval, isn, nauto; + auto o, o1, o2; + +next: + o = symbol(); + + if (o==0) { /* eof */ + error('fe'); /* Unexpected eof */ + return; + } + + if (o==1 | o==3) /* ; $) */ + return; + + if (o==2) { /* $( */ + stmtlist(); + return; + } + + if (o==19) { /* keyword */ + + if (cval==10) { /* goto */ + expr(15); + gen('n',6); /* goto */ + goto semi; + } + + if (cval==11) { /* return */ + if ((peeksym=symbol())==6) /* ( */ + pexpr(); + gen('n',7); /* retrn */ + goto semi; + } + + if (cval==12) { /* if */ + pexpr(); + o1 = isn; + isn = isn+1; + jumpc(o1); + stmt(); + o = symbol(); + if (o==19 & cval==14) { /* else */ + o2 = isn; + isn = isn+1; + jump(o2); + label(o1); + stmt(); + label(o2); + return; + } + peeksym = o; + label(o1); + return; + } + + if (cval==13) { /* while */ + o1 = isn; + isn = isn+1; + label(o1); + pexpr(); + o2 = isn; + isn = isn+1; + jumpc(o2); + stmt(); + jump(o1); + label(o2); + return; + } + + error('sx'); + goto syntax; + } + + if (o==20 & peekc==':') { /* name : */ + peekc = 0; + if (!*csym) { + *csym = 2; /* param */ + csym[1] = isn; + isn = isn+1; + } else if (*csym != 2) { + error('rd'); + goto next; + } + label(csym[1]); + goto next; + } + + peeksym = o; + expr(15); + gen('s',nauto); /* setop */ + +semi: + o = symbol(); + if (o==1) /* ; */ + return; + +syntax: + error('sz'); + goto next; +} + +void blkend() { + extern isn; + auto i; + + if (!isn) + return; + write('1:'); + i = 0; + while (i < isn) { + write('l'); + number(i); + write('\n'); + i = i+1; + } + isn = 0; +} + +gen(o,n) { + write(o); + write(' '); + number(n); +#if 1 + switch (o) { + case 'a': + wrstr(" \" aut"); + break; + case 'b': + wrstr(" \" bin"); + switch (n) { + case 1: + wrstr(" asg"); + break; + case 2: + wrstr(" or"); + break; + case 3: + wrstr(" and"); + break; + case 4: + wrstr(" eq"); + break; + case 5: + wrstr(" ne"); + break; + case 6: + wrstr(" le"); + break; + case 7: + wrstr(" lt"); + break; + case 8: + wrstr(" ge"); + break; + case 9: + wrstr(" gt"); + break; + case 10: + wrstr(" rsh"); + break; + case 11: + wrstr(" lsh"); + break; + case 12: + wrstr(" add"); + break; + case 13: + wrstr(" min"); + break; + case 14: + wrstr(" mod"); + break; + case 15: + wrstr(" mul"); + break; + case 16: + wrstr(" div"); + break; + } + break; + case 'c': + wrstr(" \" cons"); + break; + case 'f': + wrstr(" \" if"); + break; + case 'n': + wrstr(" \" etc"); + switch (n) { + case 1: + wrstr(" mcall"); + break; + case 2: + wrstr(" mark"); + break; + case 3: + wrstr(" call"); + break; + case 4: + wrstr(" vector"); + break; + case 5: + wrstr(" litrl"); + break; + case 6: + wrstr(" goto"); + break; + case 7: + wrstr(" retrn"); + break; + case 8: + wrstr(" escp"); + break; + } + break; + case 's': + wrstr(" \" set"); + break; + case 't': + wrstr(" \" tra"); + break; + case 'u': + wrstr(" \" una"); + switch (n) { + case 1: + wrstr(" adr"); + break; + case 2: + wrstr(" min"); + break; + case 3: + wrstr(" ind"); + break; + case 4: + wrstr(" not"); + break; + } + break; + case 'x': + wrstr(" \" ext"); + break; + case 'y': + wrstr(" \" ary"); + break; + } +#endif + write('\n'); +} + +jumpc(n) { + write('f '); /* ifop */ + write('1f'); + write('+'); + number(n); +#if 1 // Nick + wrstr(" \" if\n"); +#else + write('\n'); +#endif +} + +jump(n) { + write('x '); + write('1f'); + write('+'); + number(n); +#if 1 // Nick + wrstr(" \" ext\n"); + gen('n',6); /* goto */ +#else + gen('\nn',6); /* goto */ +#endif +} + +label(n) { + write('l'); + number(n); + write('=.'); + write('\n'); +} + +printn(n) { + if (n > 9) { + printn(n / 10); + n = n % 10; + } + write(n + '0'); +} + +number(x) { + if (x < 0) { + write('-'); + x = -x; + } + printn(x); +} + +name(int *s) { + while (*s) { + write(*s); + s = s+1; + } +} + +void error(code) { + extern line, eof, *csym, nerror, fout; + auto f; + + if (eof | nerror==20) { + eof = 1; + return; + } + nerror = nerror+1; + flush(); + f = fout; + fout = 1; + write(code); + write(' '); + if (code=='rd' | code=='un') { + name(csym + 2); + write(' '); + } + printn(line); + write('\n'); + flush(); + fout = f; +} + +/* storage */ + +int symtab[300] = { /* class value name */ + 1, 5,'a','u','t','o', 0 , + 1, 6,'e','x','t','r','n', 0 , + 1,10,'g','o','t','o', 0 , + 1,11,'r','e','t','u','r','n', 0 , + 1,12,'i','f', 0 , + 1,13,'w','h','i','l','e', 0 , + 1,14,'e','l','s','e', 0 }; + +int ctab[] = { + 0,127,127,127, 0,127,127,127, /* NUL SOH STX ETX EOT ENQ ACK BEL */ + 127,126,126,127,127,127,127,127, /* BS TAB LF VT FF CR SO SI */ + 127,127,127,127,127,127,127,127, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */ + 127,127,127,127,127,127,127,127, /* CAN EM SUB ESC FS GS RS US */ + 126, 34,122,127,127, 44, 47,121, /* SPC ! " # $ % & ' */ + 6, 7, 42, 40, 9, 41,127, 43, /* ( ) * + , - . / */ + 124,124,124,124,124,124,124,124, /* 0 1 2 3 4 5 6 7 */ + 124,124, 8, 1, 63, 80, 65, 90, /* 8 9 : ; < = > ? */ + 127,123,123,123,123,123,123,123, /* @ A B C D E F G */ + 123,123,123,123,123,123,123,123, /* H I J K L M N O */ + 123,123,123,123,123,123,123,123, /* P Q R S T U V W */ + 123,123,123, 4,127, 5, 48,127, /* X Y Z [ \ ] ^ _ */ + 127,123,123,123,123,123,123,123, /* ` a b c d e f g */ + 123,123,123,123,123,123,123,123, /* h i j k l m n o */ + 123,123,123,123,123,123,123,123, /* p q r s t u v w */ + 123,123,123, 2, 48, 3,127,127}; /* x y z { | } ~ DEL */ + +int symbuf[10]; +int peeksym = -1; +int peekc; +int eof; +int line = 1; +int *csym; +int *ns; +int cval; +int isn; +int nerror; +int nauto; diff --git a/bi.c b/bi.c new file mode 100644 index 0000000..e2464c9 --- /dev/null +++ b/bi.c @@ -0,0 +1,502 @@ +#include +#include +#include +#include +#include +#include "rassert.h" + +#define TRACE 0 + +enum op { + OP_AUT = 1, + OP_BIN, // asg,or,and,eq,ne,le,lt,ge,gt,rsh,lsh,add,min,mod,mul,div + OP_CONS, + OP_IF, + OP_ETC, // mcall,mark,call,vector,litrl,goto,retrn,escp + OP_SET, + OP_TRA, + OP_UNA, // adr,min,ind,not + OP_EXT, + OP_ARY, +}; + +enum op_b { + OP_BIN_ASG = 1, + OP_BIN_OR, + OP_BIN_AND, + OP_BIN_EQ, + OP_BIN_NE, + OP_BIN_LE, + OP_BIN_LT, + OP_BIN_GE, + OP_BIN_GT, + OP_BIN_RSH, + OP_BIN_LSH, + OP_BIN_ADD, + OP_BIN_MIN, + OP_BIN_MOD, + OP_BIN_MUL, + OP_BIN_DIV, +}; + +enum op_n { + OP_ETC_MCALL = 1, + OP_ETC_MARK, + OP_ETC_CALL, + OP_ETC_VECTOR, + OP_ETC_LITRL, + OP_ETC_GOTO, + OP_ETC_RETRN, + OP_ETC_ESCP, +}; + +enum op_u { + OP_UNA_ADR = 1, + OP_UNA_MIN, + OP_UNA_IND, + OP_UNA_NOT, +}; + +enum sys { + SYS_WRITE = 1, +}; + +#define MEM_SIZE 0x4000 +#define MEM_MASK 0x3fff +uint32_t mem[MEM_SIZE]; + +int main(int argc, char **argv) { + if (argc < 2) { + printf("usage: %s a.out\n", argv[0]); + exit(EXIT_FAILURE); + } + char *a_out = argv[1]; + + uint32_t addr = 0, data; + + FILE *fp = fopen(a_out, "r"); + rassert(fp); + while (true) { + char buf[0x100]; + if (fgets(buf, 0x100, fp) == NULL) + break; + + int len = strlen(buf); + if (len == 0 || buf[len - 1] != '\n') { + fprintf(stderr, "no newline: %s\n", buf); + exit(EXIT_FAILURE); + } + buf[len - 1] = 0; + + addr = 0; + for (int i = 0; i < 6; ++i) { + char c = buf[i]; + if (c < '0' || c >= '8') { + fprintf(stderr, "bad address: %s\n", buf); + exit(EXIT_FAILURE); + } + addr = (addr << 3) | (c & 7); + } + + if (buf[6] != ':' || buf[7] != ' ') { + fprintf(stderr, "bad separator: %s\n", buf); + exit(EXIT_FAILURE); + } + + data = 0; + for (int i = 0; i < 6; ++i) { + char c = buf[8 + i]; + if (c < '0' || c >= '8') { + fprintf(stderr, "bad data: %s\n", buf); + exit(EXIT_FAILURE); + } + data = (data << 3) | (c & 7); + } + +#if TRACE + fprintf(stderr, "addr=%06o data=%06o\n", addr, data); +#endif + mem[addr++ & MEM_MASK] = data & 0x3FFFF; + } + fclose(fp); + + rassert(addr >= 2); + uint32_t pc = mem[0]; + uint32_t sp = mem[1]; + uint32_t dp = sp, ap = sp; + uint32_t arg0, arg1; + + while (true) { + switch (pc) { + case SYS_WRITE * 2: + sp = (dp + 3) & 0x3ffff; // s 3 + data = mem[(dp + 2) & MEM_MASK]; + if (data & 0x3fe00) + putchar(data >> 9); + if (data & 0x1ff) + putchar(data); + break; + } + + pc = (pc + 1) & 0x3ffff; + uint32_t op = mem[pc & MEM_MASK]; + addr = op & 0x3fff; + +#if TRACE + fprintf( + stderr, + "sp=%06o sp[-2]=%06o sp[-1]=%06o pc=%06o op=%06o", + sp, + mem[(sp - 2) & MEM_MASK], + mem[(sp - 1) & MEM_MASK], + pc, + op + ); + switch (op >> 14) { + case OP_AUT: + fprintf(stderr, " aut %06o", addr); + break; + case OP_BIN: + fprintf(stderr, " bin"); + switch (addr) { + case OP_BIN_ASG: + fprintf(stderr, " asg"); + break; + case OP_BIN_OR: + fprintf(stderr, " or"); + break; + case OP_BIN_AND: + fprintf(stderr, " and"); + break; + case OP_BIN_EQ: + fprintf(stderr, " eq"); + break; + case OP_BIN_NE: + fprintf(stderr, " ne"); + break; + case OP_BIN_LE: + fprintf(stderr, " le"); + break; + case OP_BIN_LT: + fprintf(stderr, " lt"); + break; + case OP_BIN_GE: + fprintf(stderr, " ge"); + break; + case OP_BIN_GT: + fprintf(stderr, " gt"); + break; + case OP_BIN_RSH: + fprintf(stderr, " rsh"); + break; + case OP_BIN_LSH: + fprintf(stderr, " lsh"); + break; + case OP_BIN_ADD: + fprintf(stderr, " add"); + break; + case OP_BIN_MIN: + fprintf(stderr, " min"); + break; + case OP_BIN_MOD: + fprintf(stderr, " mod"); + break; + case OP_BIN_MUL: + fprintf(stderr, " mul"); + break; + case OP_BIN_DIV: + fprintf(stderr, " div"); + break; + } + break; + case OP_CONS: + fprintf(stderr, " cons %06o", addr); + break; + case OP_IF: + fprintf(stderr, " if %06o", addr); + break; + case OP_ETC: + fprintf(stderr, " etc"); + switch (addr) { + case OP_ETC_MCALL: + fprintf(stderr, " mcall"); + break; + case OP_ETC_MARK: + fprintf(stderr, " mark"); + break; + case OP_ETC_CALL: + fprintf(stderr, " call"); + break; + case OP_ETC_VECTOR: + fprintf(stderr, " vector"); + break; + case OP_ETC_LITRL: + fprintf(stderr, " litrl %06o", mem[(pc + 1) & MEM_MASK]); + break; + case OP_ETC_GOTO: + fprintf(stderr, " goto"); + break; + case OP_ETC_RETRN: + fprintf(stderr, " retrn"); + break; + case OP_ETC_ESCP: + fprintf(stderr, " escp"); + break; + } + break; + case OP_SET: + fprintf(stderr, " set %06o", addr); + break; + case OP_TRA: + fprintf(stderr, " tra %06o", addr); + break; + case OP_UNA: + fprintf(stderr, " una"); + switch (addr) { + case OP_UNA_ADR: + fprintf(stderr, " adr"); + break; + case OP_UNA_MIN: + fprintf(stderr, " min"); + break; + case OP_UNA_IND: + fprintf(stderr, " ind"); + break; + case OP_UNA_NOT: + fprintf(stderr, " not"); + break; + } + break; + case OP_EXT: + fprintf(stderr, " ext %06o", addr); + break; + case OP_ARY: + fprintf(stderr, " ary %06o", addr); + break; + } + fputc('\n', stderr); +#endif + + switch (op >> 14) { + case OP_AUT: + mem[sp & MEM_MASK] = (dp + addr) & 0x3ffff; + sp = (sp + 2) & 0x3ffff; + break; + case OP_BIN: + sp = (sp - 4) & 0x3ffff; + arg0 = mem[sp & MEM_MASK]; + arg1 = mem[(sp + 2) & MEM_MASK]; + switch (addr) { + case OP_BIN_ASG: + data = mem[arg1 & MEM_MASK]; + mem[arg0 & MEM_MASK] = data; + break; + case OP_BIN_OR: + data = mem[arg0 & MEM_MASK] | mem[arg1 & MEM_MASK]; + break; + case OP_BIN_AND: + data = mem[arg0 & MEM_MASK] & mem[arg1 & MEM_MASK]; + break; + case OP_BIN_EQ: + data = mem[arg0 & MEM_MASK] == mem[arg1 & MEM_MASK]; + break; + case OP_BIN_NE: + data = mem[arg0 & MEM_MASK] != mem[arg1 & MEM_MASK]; + break; + case OP_BIN_LE: + // the bi.s comparison does not take account of overflow, we do + data = mem[arg0 & MEM_MASK] <= mem[arg1 & MEM_MASK]; + break; + case OP_BIN_LT: + // the bi.s comparison does not take account of overflow, we do + data = mem[arg0 & MEM_MASK] < mem[arg1 & MEM_MASK]; + break; + case OP_BIN_GE: + // the bi.s comparison does not take account of overflow, we do + data = mem[arg0 & MEM_MASK] >= mem[arg1 & MEM_MASK]; + break; + case OP_BIN_GT: + // the bi.s comparison does not take account of overflow, we do + data = mem[arg0 & MEM_MASK] > mem[arg1 & MEM_MASK]; + break; + case OP_BIN_RSH: + // not implemented in bi.s + data = mem[arg0 & MEM_MASK] >> mem[arg1 & MEM_MASK]; + break; + case OP_BIN_LSH: + // not implemented in bi.s + data = (mem[arg0 & MEM_MASK] << mem[arg1 & MEM_MASK]) & 0x3ffff; + break; + case OP_BIN_ADD: + data = (mem[arg0 & MEM_MASK] + mem[arg1 & MEM_MASK]) & 0x3ffff; + break; + case OP_BIN_MIN: + data = (mem[arg0 & MEM_MASK] - mem[arg1 & MEM_MASK]) & 0x3ffff; + break; + case OP_BIN_MOD: + data = ( + (int32_t)((mem[arg0 & MEM_MASK] ^ 0x20000) - 0x20000) % + (int32_t)((mem[arg1 & MEM_MASK] ^ 0x20000) - 0x20000) + ) & 0x3ffff; + break; + case OP_BIN_MUL: + data = (mem[arg0 & MEM_MASK] * mem[arg1 & MEM_MASK]) & 0x3ffff; + break; + case OP_BIN_DIV: + data = ( + (int32_t)((mem[arg0 & MEM_MASK] ^ 0x20000) - 0x20000) / + (int32_t)((mem[arg1 & MEM_MASK] ^ 0x20000) - 0x20000) + ) & 0x3ffff; + break; + default: + fprintf(stderr, "pc=%06o op=%06o invalid binop\n", pc, op); + exit(EXIT_FAILURE); + } + mem[sp & MEM_MASK] = (sp + 1) & 0x3ffff; + mem[(sp + 1) & MEM_MASK] = data; + sp = (sp + 2) & 0x3ffff; + break; + case OP_CONS: + mem[sp & MEM_MASK] = (sp + 1) & 0x3ffff; + mem[(sp + 1) & MEM_MASK] = addr; + sp = (sp + 2) & 0x3ffff; + break; + case OP_IF: + sp = (sp - 2) & 0x3ffff; + arg0 = mem[sp & MEM_MASK]; + if (mem[arg0 & MEM_MASK] == 0) + pc = (mem[addr & MEM_MASK] - 1) & 0x3ffff; + break; + case OP_ETC: + switch (addr) { + case OP_ETC_MCALL: + // call with no arguments, stands for "mark and then call" + sp = (sp - 2) & 0x3ffff; + arg0 = mem[sp & MEM_MASK]; + arg1 = mem[arg0 & MEM_MASK]; // dereference the function address + mem[sp & MEM_MASK] = dp; // saved dp + dp = sp; + mem[(sp + 1) & MEM_MASK] = pc; // saved pc + sp = (sp + 2) & 0x3ffff; + pc = (arg1 - 1) & 0x3ffff; + break; + case OP_ETC_MARK: + // dereference the function address + // it means that there is no difference between a function and a + // function pointer, because the function begins with its pointer + sp = (sp - 2) & 0x3ffff; + arg0 = mem[sp & MEM_MASK]; + mem[(sp + 1) & MEM_MASK] = mem[arg0 & MEM_MASK]; // destination pc + mem[sp & MEM_MASK] = ap; // saved ap + ap = sp; + sp = (sp + 2) & 0x3ffff; + break; + case OP_ETC_CALL: + // dereference all arguments -- changes them from temporary values + // on the stack (lvalue, 2 words) into automatic variables (1 word) + rassert(((sp - ap) & ~0xfe) == 0); // sanity check + arg0 = (ap + 2) & 0x3ffff; + arg1 = arg0; + do { + addr = mem[arg0 & MEM_MASK]; + //fprintf(stderr, "%06o -> addr=%06o *addr=%06o -> %06o\n", arg0, addr, mem[addr & MEM_MASK], arg1); + arg0 = (arg0 + 2) & 0x3ffff; + mem[arg1 & MEM_MASK] = mem[addr & MEM_MASK]; + arg1 = (arg1 + 1) & 0x3ffff; + } while (arg0 < sp); + // at this point we could back up sp to arg1, but it is not needed + // because callee will execute a set instruction to set sp = dp + n + arg0 = mem[ap & MEM_MASK]; // saved ap + mem[ap & MEM_MASK] = dp; // saved dp + dp = ap; + arg1 = mem[(ap + 1) & MEM_MASK]; // destination pc + mem[(ap + 1) & MEM_MASK] = pc; // saved pc + ap = arg0; + pc = (arg1 - 1) & 0x3ffff; + break; + case OP_ETC_VECTOR: + sp = (sp - 4) & 0x3ffff; + arg0 = mem[sp & MEM_MASK]; + arg1 = mem[(sp + 2) & MEM_MASK]; + mem[sp & MEM_MASK] = ( + mem[arg0 & MEM_MASK] + mem[arg1 & MEM_MASK] + ) & 0x3ffff; + sp = (sp + 2) & 0x3ffff; + break; + case OP_ETC_LITRL: + mem[sp & MEM_MASK] = (sp + 1) & 0x3ffff; + pc = (pc + 1) & 0x3ffff; + mem[(sp + 1) & MEM_MASK] = mem[pc & MEM_MASK]; + sp = (sp + 2) & 0x3ffff; + break; + case OP_ETC_GOTO: + sp = (sp - 2) & 0x3ffff; + arg0 = mem[sp & MEM_MASK]; + pc = (mem[arg0 & MEM_MASK] - 1) & 0x3ffff; + break; + case OP_ETC_RETRN: + sp = (sp - 2) & 0x3ffff; + arg0 = mem[sp & MEM_MASK]; + data = mem[arg0 & MEM_MASK]; // return value + sp = dp; + dp = mem[sp & MEM_MASK]; // saved dp + if (dp == 0) + // return from main() + return 0; + mem[sp & MEM_MASK] = (sp + 1) & 0x3ffff; + pc = mem[(sp + 1) & MEM_MASK]; // saved pc + mem[(sp + 1) & MEM_MASK] = data; // return value + sp = (sp + 2) & 0x3ffff; + break; + case OP_ETC_ESCP: + fprintf(stderr, "pc=%06o escp not supported\n", pc); + exit(EXIT_FAILURE); + default: + fprintf(stderr, "pc=%06o op=%06o invalid etcop\n", pc, op); + exit(EXIT_FAILURE); + } + break; + case OP_SET: + sp = dp + addr; + break; + case OP_TRA: + pc = (addr - 1) & 0x3ffff; + break; + case OP_UNA: + sp = (sp - 2) & 0x3ffff; + arg0 = mem[sp & MEM_MASK]; + switch (addr) { + case OP_UNA_ADR: + data = arg0; + break; + case OP_UNA_MIN: + data = -mem[arg0 & MEM_MASK] & 0x3ffff; + break; + case OP_UNA_IND: + data = mem[mem[arg0 & MEM_MASK] & MEM_MASK]; + break; + case OP_UNA_NOT: + data = !mem[arg0 & MEM_MASK]; + break; + default: + fprintf(stderr, "pc=%06o op=%06o invalid unaop\n", pc, op); + exit(EXIT_FAILURE); + } + mem[sp & MEM_MASK] = (sp + 1) & 0x3ffff; + mem[(sp + 1) & MEM_MASK] = data; + sp = (sp + 2) & 0x3ffff; + break; + case OP_EXT: + mem[sp & MEM_MASK] = addr; + sp = (sp + 2) & 0x3ffff; + break; + case OP_ARY: + addr += dp; + mem[addr & MEM_MASK] = (addr + 1) & 0x3fffff; + break; + default: + fprintf(stderr, "pc=%06o op=%06o invalid op\n", pc, op); + exit(EXIT_FAILURE); + } + } +} diff --git a/doc/PDP7_Instruction_list_text.pdf b/doc/PDP7_Instruction_list_text.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8b1a8bd062cd8e6ff2a8dbf56d6fc1b2f055674b GIT binary patch literal 109837 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%0Arx_DA0-3G0ZoxXL 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�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 p0wN literal 0 HcmV?d00001 diff --git a/doc/bi.s b/doc/bi.s new file mode 100644 index 0000000..6969bed --- /dev/null +++ b/doc/bi.s @@ -0,0 +1,441 @@ +"** 06-5-12.pdf page 12 +" bi + +start: + jms initio + -1 + tad .main + dac pc + +fetch: + lac pc i + lmq + and o17777 + dac addr + cla; lls 4 " XXX replaced for now: ecla lls 4 + tad .+3 + dac .+1 + jmp .. i + jmp . i + autop; binop; consop; ifop; etcop; setop; traop + unaop; extop; aryop + + +ifop: + -2 + tad sp + dac sp + lac sp i + dac t1 + lac t1 i + sza + jmp fetch + -1 + tad addr i + dac pc + jmp fetch + +autop: + lac addr + tad dp + dac sp i + isz sp + isz sp + jmp fetch + +binop: + -2 + tad sp + dac sp + tad dm1 + dac t4 + tad dm1 + dac t3 + lac t3 i + dac t1 + lac sp i + dac t2 + lac t4 + dac t3 i + lac addr + tad .+3 + dac .+1 + jmp .. i +"** 06-5-12.pdf page 13 + jmp . i + basg; bor; band; beq; bne; ble; blt; bge; bgt; brsh; blsh + badd; bmin; bmod; bmul; bdiv + +basg: + lac t2 i + dac t1 i + dac t4 i + jmp fetch + +bor: + lac t1 i + lmq + lac t2 i + omq + dac t4 i + jmp fetch + +band: + lac t1 i + and t2 i + dac t4 i + jmp fetch + +beq: + lac t1 i + xor t2 i + sna cla + lac d1 + dac t4 i + jmp fetch + +bne: + lac t1 i + xor t2 i + sza + lac d1 + dac t4 i + jmp fetch + +ble: + lac t2 i + cma + tad t1 i + spa cla + lac d1 + dac t4 i + jmp fetch + +blt: + lac t1 i + cma + tad t2 i + sma cla + lac d1 + dac t4 i + jmp fetch + +bge: + lac t1 i + cma +"** 06-5-12.pdf page 14 + tad t2 i + spa cla + lac d1 + dac t4 i + jmp fetch + +bgt: + lac t2 i + cma + tad t1 i + sma cla + lac d1 + dac t4 i + jmp fetch + +brsh: +blsh: + hlt + +badd: + lac t1 i + tad t2 i + dac t4 i + jmp fetch + +bmin: + lac t1 i + cma + tad t2 i + cma + dac t4 i + jmp fetch + +bmod: + lac t2 i + dac .+4 + lac t1 i + cll; idiv; .. + dac t4 i + jmp fetch + +bmul: + lac t2 i + dac .+4 + lac t1 i + cll; mul; .. + lacq + dac t4 i + jmp fetch + +bdiv: + lac t2 i + dac .+4 + lac t1 i + cll; idiv; .. + lacq + dac t4 i + jmp fetch + +consop: + lac sp +"** 06-5-12.pdf page 15 + tad d1 + dac sp i + isz sp + lac addr + dac sp i + isz sp + jmp fetch + +etcop: + lac addr + tad .+3 + dac .+1 + jmp .. i + jmp . i + mcall; mark; call; vector; litrl; goto; retrn; escp + +mcall: + -2 + tad sp + dac t1 + lac t1 i + dac t2 + -1 + tad t2 i + lmq + lac dp + dac t1 i + lac t1 + dac dp + isz t1 + lac pc + dac t1 i + lacq + dac pc + jmp fetch + +mark: + -1 + tad sp + dac t2 + tad dm1 + dac t1 + lac t1 i + dac t3 + lac t3 i + dac t2 i + lac ap + dac t1 i + lac t1 + dac ap + jmp fetch + +call: + lac ap + tad d1 + dac 8 + dac 9 +1: + lac 8 i + dac t1 + lac t1 i +"** 06-5-12.pdf page 16 + dac 9 i + isz 8 + -1 + tad sp + sad 8 + skp + jmp 1b + lac ap i + lmq + lac dp + dac ap i + lac ap + dac dp + isz ap + -1 + tad ap i + dac t1 + lac pc + dac ap i + lacq + dac ap + lac t1 + dac pc + jmp fetch + +vector: + -2 + tad sp + dac sp + tad dm2 + dac t1 + lac sp i + dac t2 + lac t1 i + dac t3 + lac t3 i + tad t2 i + dac t1 i + jmp fetch + +litrl: + lac sp + tad d1 + dac sp i + isz sp + lac pc i + dac sp i + isz sp + jmp fetch + +goto: + -2 + tad sp + dac sp + lac sp i + dac t1 + -1 + tad t1 i + dac pc + jmp fetch +"** 06-5-12.pdf page 17 + +retrn: + -2 + tad sp + dac sp + lac sp i + dac t1 + lac t1 i + lmq + lac dp + dac sp + dac t1 + lac sp i + sna + jmp stop + dac dp + isz sp + lac sp + dac t1 i + lac sp i + dac pc + lacq + dac sp i + isz sp + jmp fetch + +escp: + law 2 + tad pc + dac t1 + jmp t1 i + +setop: + lac addr + tad dp + dac sp + jmp fetch + +traop: + -1 + tad addr + dac pc + jmp fetch + +unaop: + -1 + tad sp + dac t3 + tad dm1 + dac t2 + lac t2 i + dac t1 + lac t3 + dac t2 i + lac addr + tad .+3 + dac .+1 + jmp .. i + jmp . i + uadr; umin; uind; unot + +uadr: +"** 06-5-12.pdf page 18 + lac t1 + dac t3 i + jmp fetch + +umin: + -1 + tad t1 i + cma + dac t3 i + jmp fetch + +uind: + lac t1 i + dac t2 i + jmp fetch + +unot: + lac t1 i + sna cla + lac d1 + dac t3 i + jmp fetch + +extop: + lac addr + dac sp i + isz sp + isz sp + jmp fetch + +aryop: + lac addr + tad dp + dac t1 + tad d1 + dac t1 i + jmp fetch + +a = 040000 +b = a+a +c = b+a +f = c+a +n = f+a +s = n+a +t = s+a +u = t+a +x = u+a +y = x+a + +d1: 1 +dm1: -1 +dm2: -2 +o17777: 017777 + +t1: 0 +t2: 0 +t3: 0 +t4: 0 +addr: 0 + +pc = 017 + +"** 06-5-12.pdf page 19 +sp: stack +dp: stack +ap: stack +stack: 0 diff --git a/doc/bl.s b/doc/bl.s new file mode 100644 index 0000000..2706567 --- /dev/null +++ b/doc/bl.s @@ -0,0 +1,198 @@ +"** 06-5-12.pdf page 3 +" bl + +jmp start + +.array: .+1 + s 2 + n 8 + n 7 + -1 + tad sp i + cma + tad lastv + dac lastv + lmq + lac sp + tad d1 + dac sp i + isz sp + lacq + dac sp i + isz sp + jmp fetch + +.read: .+1 + s 2 + n 8 + n 7 + lac sp + tad d1 + dac sp i + isz sp + jms getc + dac sp i + isz sp + jmp fetch + +.write: .+1 + s 2 + n 8 + n 7 + lac sp i + dac t1 + lrss 9 + jms putc + lac t1 + jms putc + jmp fetch + +.flush: .+1 + n 8 + n 7 + jms flush + jmp fetch + +getc: 0 + lac iflg + dzm iflg + sza + jmp getc i + lac cibufp + sad eibufp + jmp 1f +"** 06-5-12.pdf page 4 + lac cibufp i + and o777 + dac iflg + lac cibufp i + isz cibufp + lrss 9 + jmp getc i +1: + lac .fin + sys read; ibufp: ..; 64 + sna spa + jmp 1f + tad ibufp + dac eibufp + lac ibufp + dac cibufp + jmp getc+1 +1: + lac o4 + jmp getc i + +putc: 0 + and o777 + sna + jmp putc i + lmq + lac oflg + sza + jmp 1f + lacq + alss 9 + dac cobufp i + dac oflg + jmp putc i +1: + lac cobufp i + omq + dac cobufp i + dac cobufp i + dzm oflg + isz cobufp + lac cobufp + sad eobufp + skp + jmp putc i + lac .fout + sys write; obufp: ..; 64 + lac obufp + dac cobufp + jmp putc i + +stop: + jms flush + las + sma + sys exit " XXX replaced for now: sys save + sys exit + +flush: 0 + lac oflg + sza +"** 06-5-12.pdf page 5 + isz cobufp + lac cobufp + cma + tad obufp + cma + sna + jmp flush i + dac 1f+1 + lac obufp + dac 1f + lac .fout + sys write; 1: ..; .. + lac obufp + dac cobufp + dzm oflg + jmp flush i + +initio: 0 + lac 017777 i + sad d4 + jmp 2f + sad d8 + jmp 1f + + law 9 + tad 017777 + dac .+3 + law 017 + sys creat; .. + spa + jmp stop + dac .fout +1: + law 5 + tad 017777 + dac .+2 + sys open; ..; 0 + spa + jmp stop + dac .fin +2: + lac lastv + dac eibufp + dac cibufp + -64 + tad lastv + dac lastv + dac ibufp + lac lastv + dac eobufp + -64 + tad lastv + dac lastv + dac obufp + dac cobufp + dzm oflg + jmp initio i + +.fin: 0 +.fout: 1 +eibufp: 0 +"** 06-5-12.pdf page 6 +cibufp: 0 +iflg: 0 +eobufp: 0 +cobufp: 0 +oflg: 0 +lastv: 017770 + +o777: 0777 +d4:o4: 4 +d8: 8 diff --git a/doc/op.s b/doc/op.s new file mode 100644 index 0000000..1d29305 --- /dev/null +++ b/doc/op.s @@ -0,0 +1,101 @@ +"** 09-1-35.pdf page 35 +" op + +sys = 0020000 +dac = 0040000 +jms = 0100000 +dzm = 0140000 +lac = 0200000 +xor = 0240000 +add = 0300000 +tad = 0340000 +xct = 0400000 +isz = 0440000 +and = 0500000 +sad = 0540000 +jmp = 0600000 +law = 0760000 + +nop = 0740000 +cma = 0740001 +cml = 0740002 +oas = 0740004 +ral = 0740010 +rar = 0740020 +hlt = 0740040 +sma = 0740100 +sza = 0740200 +snl = 0740400 +skp = 0741000 +spa = 0741100 +sna = 0741200 +szl = 0741400 +rtl = 0742010 +rtr = 0742020 +cll = 0744000 +stl = 0744002 +rcl = 0744010 +rcr = 0744020 +cla = 0750000 +clc = 0750001 +las = 0750004 +glk = 0750010 +lrs = 0640500 +lrss= 0660500 +lls = 0640600 +llss= 0660600 +als = 0640700 +alss= 0660700 +norm= 0640444 +norms=0660444 +mul = 0653122 +muls= 0657122 +div = 0640323 +divs= 0644323 +idiv= 0653323 +idivs=0657323 +frdiv = 0650323 +frdivs = 0654323 +lacq = 0641002 +lacs = 0641001 +clq = 0650000 +ads = 0644000 +gsm = 0664000 + +"** 10-36-55.pdf page 1 +osc = 0640001 +omq = 0640002 +otq = 0642000 +cmq = 0640004 +lmq = 0652000 +ecla = 0641000 + +i = 020000 + +save = 1 +getuid = 2 +open = 3 +read = 4 +write = 5 +creat = 6 +seek = 7 +tell = 8 +close = 9 +link = 10 +unlink = 11 +setuid = 12 +rename = 13 +exit = 14 +time = 15 +intrp = 16 +chdir = 17 +chmode = 18 +chowner = 19 +sysloc = 21 +capt = 23 +rele = 24 +status = 25 +sleep = 26 +smes = 27 +rmes = 28 +fork = 29 diff --git a/footer.s b/footer.s new file mode 100644 index 0000000..ababb2e --- /dev/null +++ b/footer.s @@ -0,0 +1,5 @@ +" linked at the end, mark the stack position +" note that dp points to the 0 word on entry, then .main does sp = dp + n, +" reserving 2 words on stack as though they were the saved dp and saved pc, +" then when .main returns, the interpreter sees the saved dp == 0 and quits +stack: 0 diff --git a/header.s b/header.s new file mode 100644 index 0000000..6fadfcd --- /dev/null +++ b/header.s @@ -0,0 +1,20 @@ +" opcodes +a = 0040000 " autop +b = 0100000 " binop: asg,or,and,eq,ne,le,lt,ge,gt,rsh,lsh,add,min,mod,mul,div +c = 0140000 " consop +f = 0200000 " ifop +n = 0240000 " etcop: mcall,mark,call,vector,litrl,goto,retrn,escp +s = 0300000 " setop +t = 0340000 " traop +u = 0400000 " unaop: adr,min,ind,not +x = 0440000 " extop +y = 0500000 " aryop + +" header +. = 0 +.main +stack + +" sys +.write: .+1 +n 7 " etc retrn diff --git a/hello.b b/hello.b new file mode 100644 index 0000000..15a86ae --- /dev/null +++ b/hello.b @@ -0,0 +1,9 @@ +main $( + write('He'); + write('ll'); + write('o,'); + write(' W'); + write('or'); + write('ld'); + write('!*n'); +$) diff --git a/n.sh b/n.sh new file mode 100755 index 0000000..8d54040 --- /dev/null +++ b/n.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +./b hello.b hello.s + +# original version with opcode table, b library, hello, b interpreter +#./as7 doc/op.s doc/bl.s hello.s doc/bi.s + +# cut-down version for the VM here +./as7 header.s hello.s footer.s diff --git a/rassert.h b/rassert.h new file mode 100644 index 0000000..726565a --- /dev/null +++ b/rassert.h @@ -0,0 +1,11 @@ +#ifndef _RASSERT_H +#define _RASSERT_H + +#include + +# define rassert(expr) \ + ((expr) \ + ? __ASSERT_VOID_CAST (0) \ + : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION)) + +#endif -- 2.34.1