├── scans ├── Makefile ├── dskres.s ├── dsksav.s ├── lcase.b ├── rm.s ├── ind.b ├── dsw.s ├── trysys.s ├── chrm.s ├── un.s ├── pd.s ├── rn.s ├── tm.s ├── maksys.s ├── st5.s ├── t8.s ├── t1.s ├── chmod.s ├── chown.s ├── dskio.s ├── cp.s ├── sop.s ├── op.s ├── joshd-s9.s ├── ln.s ├── s9.s ├── stat.s ├── t4.s ├── t5.s ├── t7.s ├── p3.s ├── cat.s ├── p5.s ├── st3.s ├── st7.s ├── t6.s ├── p4.s ├── st2.s ├── bl.s ├── joshd-s1.s ├── s1.s ├── p2.s ├── nm.s ├── README.md ├── p1.s └── joshd-s8.s ├── src ├── other │ ├── Readme │ ├── hello.b │ ├── ctype.b │ ├── hello.s │ ├── pbboot.s │ ├── chrtbl.s │ ├── string.b │ ├── brtb.b │ ├── wktmv.s │ ├── wktln.s │ ├── test.b │ ├── wktod.s │ ├── wktcp.s │ └── wktcat.s ├── tests │ ├── testmul.s │ ├── fork_test.s │ ├── write_test.s │ ├── octal_test.s │ └── decimal_out.s ├── cmd │ ├── rm.s │ ├── lcase.b │ ├── ind.b │ ├── dsw.s │ ├── un.s │ ├── pd.s │ ├── rn.s │ ├── tm.s │ ├── dsksav.s │ ├── dskres.s │ ├── st5.s │ ├── chrm.s │ ├── op.s │ ├── ln.s │ ├── stat.s │ ├── t1.s │ ├── t8.s │ ├── p3.s │ ├── chown.s │ ├── chmod.s │ ├── p5.s │ ├── p4.s │ ├── bl.s │ ├── t5.s │ ├── cp.s │ ├── t7.s │ ├── p2.s │ ├── nm.s │ ├── p1.s │ ├── st3.s │ ├── t4.s │ └── st7.s ├── sys │ ├── trysys.s │ ├── maksys.s │ ├── s9.s │ ├── NOTES.md │ └── sop.s └── alt │ ├── chrm.s │ └── wktmkdir.s ├── .gitignore ├── man ├── date.1 ├── ln.1 ├── rn.1 ├── chown.1 ├── mv.1 ├── link.1 ├── od.1 ├── chmod.1 ├── cp.1 ├── cat.1 ├── ls.1 ├── stat.1 ├── chrm.1 └── dir.5 ├── misc ├── README.md ├── git_notes.txt └── urls.txt ├── tools ├── compare ├── README.md ├── 3dump ├── ccov7 └── sdump ├── Makefile └── .github └── workflows └── main.yml /scans/Makefile: -------------------------------------------------------------------------------- 1 | AS7=../tools/as7 2 | 3 | system: 4 | $(AS7) s?.s sop.s > output 5 | -------------------------------------------------------------------------------- /src/other/Readme: -------------------------------------------------------------------------------- 1 | This directory holds other source code for PDP-7 Unix, e.g. rewritten versions 2 | of utilities that did not come from the original scans. 3 | -------------------------------------------------------------------------------- /src/other/hello.b: -------------------------------------------------------------------------------- 1 | main $( 2 | write('He'); 3 | write('ll'); 4 | write('o,'); 5 | write(' W'); 6 | write('or'); 7 | write('ld'); 8 | write('!*n'); 9 | $) 10 | -------------------------------------------------------------------------------- /src/other/ctype.b: -------------------------------------------------------------------------------- 1 | /* ctype.b - character types */ 2 | 3 | isalpha(c) { 4 | return((c >= 'a' & c <= 'z') | (c >= 'A' & c <= 'Z')); 5 | } 6 | 7 | isdigit(c) { 8 | return(c >= '0' & c <= '9'); 9 | } 10 | -------------------------------------------------------------------------------- /src/tests/testmul.s: -------------------------------------------------------------------------------- 1 | lac d10 2 | cll " clear link 3 | mul " mutiply by radix 4 | num2: 10 5 | lacq 6 | cll 7 | idiv; 10 8 | nop 9 | hlt 10 | 11 | d10: 10 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | /sys 3 | /tests 4 | 5 | *~ 6 | build/a.lst 7 | build/a.out 8 | build/boot.rim 9 | build/image.fs 10 | build/bin 11 | build/n.out 12 | build/alt/a.lst 13 | build/alt/a.out 14 | build/alt/image.fs 15 | **/.DS_Store 16 | /a.out 17 | /build/cas.out 18 | /build/chrtbl.out 19 | -------------------------------------------------------------------------------- /man/date.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''DATE(I)' 2 | .ta 18 21 3 | NAME date - print the date 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | date 8 | .sp 9 | DESCRIPTION The current date is printed to the second. 10 | .sp 11 | FILES -- 12 | .sp 13 | SEE ALSO -- 14 | .sp 15 | DIAGNOSTICS -- 16 | .sp 17 | BUGS It is always 1970. 18 | .sp 19 | OWNER wkt 20 | 21 | -------------------------------------------------------------------------------- /misc/README.md: -------------------------------------------------------------------------------- 1 | Misc documentation 2 | ================== 3 | 4 | See also github wiki pages: 5 | https://github.com/DoctorWkt/pdp7-unix/wiki/Links 6 | https://github.com/DoctorWkt/pdp7-unix/wiki/roff-commands 7 | 8 | dated: 9 | https://github.com/DoctorWkt/pdp7-unix/wiki/Source-file-status-scoreboard 10 | https://github.com/DoctorWkt/pdp7-unix/wiki/Unanswered-questions 11 | -------------------------------------------------------------------------------- /scans/dskres.s: -------------------------------------------------------------------------------- 1 | "** 07-13-19.pdf page 41 2 | " dskres 3 | 4 | iof 5 | hlt 6 | dzm track 7 | -640 8 | dac c1 9 | 1: 10 | lac track 11 | jms dskrd0 12 | 13 | lac track 14 | jms dskwr1 15 | 16 | lac track 17 | tad d10 18 | dac track 19 | isz c1 20 | jmp 1b 21 | 22 | hlt 23 | sys exit 24 | 25 | track: 0 26 | c1: 0 27 | d10: 10 28 | -------------------------------------------------------------------------------- /scans/dsksav.s: -------------------------------------------------------------------------------- 1 | "** 07-13-19.pdf page 40 2 | " dsksav 3 | 4 | iof 5 | hlt 6 | dzm track 7 | -640 8 | dac c1 9 | 1: 10 | lac track 11 | jms dskrd1 12 | 13 | lac track 14 | jms dskwr0 15 | 16 | lac track 17 | tad d10 18 | dac track 19 | isz c1 20 | jmp 1b 21 | 22 | hlt 23 | sys exit 24 | 25 | track: 0 26 | c1: 0 27 | d10: 10 28 | -------------------------------------------------------------------------------- /man/ln.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''LN(I)' 2 | .ta 18 30 3 | NAME ln -- link files 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | ln 8 | srcdir file... 9 | .sp 10 | DESCRIPTION make links in current dir to named files in srcdir 11 | .sp 12 | FILES -- 13 | .sp 14 | SEE ALSO link 15 | .sp 16 | DIAGNOSTICS "twofiles" - please provide two filenames 17 | "? file" - unable to make the link 18 | .sp 19 | BUGS -- 20 | .sp 21 | OWNER ken, dmr 22 | -------------------------------------------------------------------------------- /man/rn.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''RN(I)' 2 | .ta 18 31 3 | NAME rn -- rename files 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | rn 8 | from to ... 9 | .sp 10 | DESCRIPTION Files are taken in pairs; The file from 11 | is renamed to to, and so on... 12 | .sp 13 | FILES -- 14 | .sp 15 | SEE ALSO cp 16 | .sp 17 | DIAGNOSTICS 18 | "? file" - either unable to remove or create 19 | a file 20 | .sp 21 | BUGS The diagnostic is ambiguous. 22 | .sp 23 | OWNER ken, dmr 24 | -------------------------------------------------------------------------------- /tools/compare: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # shell script to help compare src/{cmd,sys}/file and scans/file 4 | 5 | SCAN=$1 6 | SRC=$2 7 | 8 | TMPDIR=/tmp/compare$$ 9 | trap "rm -fr $TMPDIR" 0 10 | mkdir -p $TMPDIR/scan $TMPDIR/src 11 | 12 | F=`basename $SCAN` 13 | TSCAN=$TMPDIR/scan/$F 14 | TSRC=$TMPDIR/src/$F 15 | 16 | sed -e '/^ *"/d' -e 's/ *".*$//' < $SCAN > $TSCAN 17 | sed -e '/^ *"/d' -e 's/ *".*$//' < $SRC > $TSRC 18 | 19 | diff -uw $TSCAN $TSRC 20 | -------------------------------------------------------------------------------- /man/chown.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''CHOWN(I)' 2 | .ta 18 21 3 | NAME chown -- change owner 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | chown 8 | owner file 9 | .sp 10 | DESCRIPTION 11 | .ul 12 | owner 13 | becomes the new owner of the files. The 14 | owner is an octal UID. 15 | .sp 16 | Only the owner of a file is allowed to change 17 | the owner. 18 | .sp 19 | FILES -- 20 | .sp 21 | SEE ALSO stat 22 | .sp 23 | DIAGNOSTICS ? 24 | .sp 25 | BUGS -- 26 | .sp 27 | OWNER ken, dmr 28 | -------------------------------------------------------------------------------- /scans/lcase.b: -------------------------------------------------------------------------------- 1 | main $( 2 | auto ch; 3 | extrn read, write; 4 | 5 | goto loop; 6 | while (ch != 04) 7 | $( if (ch > 0100 & ch < 0133) 8 | ch = ch + 040; 9 | if (ch==015) goto loop; 10 | if (ch==014) goto loop; 11 | if (ch==011) 12 | $( ch = 040040; 13 | write(040040); 14 | write(040040); 15 | $) 16 | write(ch); 17 | loop: 18 | ch = read()&0177; 19 | $) 20 | $) -------------------------------------------------------------------------------- /src/other/hello.s: -------------------------------------------------------------------------------- 1 | .main:.+1 2 | s 2 3 | x .write 4 | n 2 5 | n 5 6 | 36965 7 | n 3 8 | s 2 9 | x .write 10 | n 2 11 | n 5 12 | 55404 13 | n 3 14 | s 2 15 | x .write 16 | n 2 17 | n 5 18 | 56876 19 | n 3 20 | s 2 21 | x .write 22 | n 2 23 | n 5 24 | 16471 25 | n 3 26 | s 2 27 | x .write 28 | n 2 29 | n 5 30 | 56946 31 | n 3 32 | s 2 33 | x .write 34 | n 2 35 | n 5 36 | 55396 37 | n 3 38 | s 2 39 | x .write 40 | n 2 41 | n 5 42 | 16906 43 | n 3 44 | s 2 45 | n 7 46 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | include build/os.mk 3 | 4 | all: buildit 5 | 6 | buildit: 7 | cd build && $(MAKE) all 8 | 9 | run: buildit 10 | cd build && $(MAKE) run 11 | 12 | alt: 13 | cd build && $(MAKE) alt 14 | 15 | altrun: alt 16 | cd build && $(MAKE) altrun 17 | 18 | clean: 19 | cd build && $(MAKE) clean 20 | 21 | binaries: buildit 22 | mkdir -p binaries 23 | cp build/image.fs binaries/ 24 | cp build/boot.rim binaries/ 25 | cp build/unixv0.simh binaries/ 26 | 27 | -------------------------------------------------------------------------------- /scans/rm.s: -------------------------------------------------------------------------------- 1 | " ** 11-56-91.pdf page 7 2 | " rm 3 | 4 | lac 017777 5 | tad d1 6 | dac 2f 7 | 1: 8 | lac 017777 i 9 | sad d4 10 | sys exit 11 | tad dm4 12 | dac 017777 i 13 | lac 2f 14 | tad d4 15 | dac 2f 16 | sys unlink; 2: 0 17 | sma 18 | jmp 1b 19 | lac 2b 20 | dac 2f 21 | lac d1 22 | sys write; 2: 0; 4 23 | lac d1 24 | sys write; 1f; 2f-1f 25 | jmp 1b 26 | 1: 27 | 040077;012000 28 | 2: 29 | 30 | d1: 1 31 | d4: 4 32 | dm4: -4 33 | 34 | -------------------------------------------------------------------------------- /man/mv.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''MV(I)' 2 | .ta 18 31 3 | NAME mv -- move or rename a file 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | mv 8 | name1 name2 9 | .sp 10 | DESCRIPTION 11 | .ul 12 | mv 13 | changes the name of name with the rename 14 | system call. 15 | .sp 16 | FILES -- 17 | .sp 18 | SEE ALSO -- 19 | .sp 20 | DIAGNOSTICS "twofiles" - please provide two filenames 21 | "? file" - either unable to remove or create 22 | a file 23 | .sp 24 | BUGS The second diagnostic is ambiguous. 25 | .sp 26 | OWNER wkt 27 | -------------------------------------------------------------------------------- /src/cmd/rm.s: -------------------------------------------------------------------------------- 1 | " ** 11-56-91.pdf page 7 2 | " rm 3 | 4 | lac 017777 5 | tad d1 6 | dac 2f 7 | 1: 8 | lac 017777 i 9 | sad d4 10 | sys exit 11 | tad dm4 12 | dac 017777 i 13 | lac 2f 14 | tad d4 15 | dac 2f 16 | sys unlink; 2: 0 17 | sma 18 | jmp 1b 19 | lac 2b 20 | dac 2f 21 | lac d1 22 | sys write; 2: 0; 4 23 | lac d1 24 | sys write; 1f; 2f-1f 25 | jmp 1b 26 | 1: 27 | 040077;012000 28 | 2: 29 | 30 | d1: 1 31 | d4: 4 32 | dm4: -4 33 | 34 | -------------------------------------------------------------------------------- /src/cmd/lcase.b: -------------------------------------------------------------------------------- 1 | /* ** 08-rest.pdf page 4 */ 2 | main $( 3 | auto ch; 4 | extrn read, write; 5 | 6 | goto loop; 7 | while (ch != 04) 8 | $( if (ch > 0100 & ch < 0133) 9 | ch = ch + 040; 10 | if (ch==015) goto loop; 11 | if (ch==014) goto loop; 12 | /* -->------------------------> if (ch == 0177) goto loop; */ 13 | if (ch==011) 14 | $( ch = 040040; 15 | write(040040); 16 | write(040040); 17 | $) 18 | write(ch); 19 | loop: 20 | ch = read()&0177; 21 | $) 22 | $) -------------------------------------------------------------------------------- /scans/ind.b: -------------------------------------------------------------------------------- 1 | main $( 2 | extrn read, write; 3 | auto i, c, state, line 100; 4 | 5 | loop: 6 | state = i = 0; 7 | loop1: 8 | c = read(); 9 | if(c==4) return; 10 | if(c==':' & state==0) state = 2; 11 | if((c<'0' ^ c>'9'&c<'a' ^ c>'z') & state==0) state = 1; 12 | line[i] = c; 13 | i = i+1; 14 | if(c!=012) goto loop1; 15 | if(state==2 ^ i==1) goto noi; 16 | write(' '); 17 | write(' '); 18 | noi: 19 | i = 0; 20 | loop3: 21 | c = line[i]; 22 | write(c); 23 | i = i+1; 24 | if(c!=012) goto loop3; 25 | goto loop; 26 | $) 27 | -------------------------------------------------------------------------------- /src/cmd/ind.b: -------------------------------------------------------------------------------- 1 | main $( 2 | extrn read, write; 3 | auto i, c, state, line 100; 4 | 5 | loop: 6 | state = i = 0; 7 | loop1: 8 | c = read(); 9 | if(c==4) return; 10 | if(c==':' & state==0) state = 2; 11 | if((c<'0' ^ c>'9'&c<'a' ^ c>'z') & state==0) state = 1; 12 | line[i] = c; 13 | i = i+1; 14 | if(c!=012) goto loop1; 15 | if(state==2 ^ i==1) goto noi; 16 | write(' '); 17 | write(' '); 18 | noi: 19 | i = 0; 20 | loop3: 21 | c = line[i]; 22 | write(c); 23 | i = i+1; 24 | if(c!=012) goto loop3; 25 | goto loop; 26 | $) 27 | -------------------------------------------------------------------------------- /man/link.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''LINK(I)' 2 | .ta 18 30 3 | NAME link -- link to a file 4 | .sp 5 | .in 0 6 | SYNOPSIS 7 | .in 8 8 | .ul 9 | link 10 | file 11 | .sp 12 | .ul 13 | link 14 | srcdir file 15 | .sp 16 | .ul 17 | link 18 | srcdir file name 19 | .sp 20 | .in 0 21 | DESCRIPTION 22 | .in 8 23 | With one argument makes a link to file in system directory. 24 | .sp 25 | With two arguments, makes a link to file in srcdir. 26 | .sp 27 | With three arguments, make name a link to file in srcdir. 28 | .sp 29 | .in 0 30 | FILES -- 31 | .sp 32 | SEE ALSO ln 33 | .sp 34 | BUGS -- 35 | .sp 36 | OWNER ken, dmr 37 | -------------------------------------------------------------------------------- /man/od.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''OD(I)' 2 | .ta 18 21 3 | NAME od -- octal dump 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | od 8 | file 9 | .sp 10 | DESCRIPTION 11 | .ul 12 | od 13 | dumps the words of the named file in octal 14 | format, eight words per line. Each line is 15 | prefixed by the offset into the file, and this 16 | is separated from the file output by a colon. 17 | .sp 18 | FILES -- 19 | .sp 20 | SEE ALSO -- 21 | .sp 22 | DIAGNOSTICS If a file cannot be opened, its name is printed 23 | followed by "?". If no argument is given, "no 24 | arg" is output. 25 | .sp 26 | BUGS -- 27 | .sp 28 | OWNER wkt 29 | -------------------------------------------------------------------------------- /scans/dsw.s: -------------------------------------------------------------------------------- 1 | "** 07-13-19.pdf page 45 2 | " dsw 3 | 4 | lac djmp 5 | dac .-1 6 | oas cla 7 | cma 8 | tad d1 9 | dac t1 10 | sys open; dd; 0 11 | 1: 12 | lac d2 13 | sys read; dir; 8 14 | sna 15 | sys exit 16 | lac dir 17 | sna 18 | jmp 1b 19 | isz t1 20 | jmp 1b 21 | 22 | wr: 23 | lac d1 24 | sys write; dir+1; 4 25 | lac d1 26 | sys write; o12; 1 27 | sys save 28 | do: 29 | sys unlink; dir+1 30 | sys exit 31 | 32 | d1: 1 33 | d2: 2 34 | o12: 012 35 | t1: 0 36 | djmp: jmp do 37 | dd: 056056;040040;040040;040040 38 | dir: .=.+8 39 | -------------------------------------------------------------------------------- /src/cmd/dsw.s: -------------------------------------------------------------------------------- 1 | "** 07-13-19.pdf page 45 2 | " dsw 3 | 4 | lac djmp 5 | dac .-1 6 | oas cla 7 | cma 8 | tad d1 9 | dac t1 10 | sys open; dd; 0 11 | 1: 12 | lac d2 13 | sys read; dir; 8 14 | sna 15 | sys exit 16 | lac dir 17 | sna 18 | jmp 1b 19 | isz t1 20 | jmp 1b 21 | 22 | wr: 23 | lac d1 24 | sys write; dir+1; 4 25 | lac d1 26 | sys write; o12; 1 27 | sys save 28 | do: 29 | sys unlink; dir+1 30 | sys exit 31 | 32 | d1: 1 33 | d2: 2 34 | o12: 012 35 | t1: 0 36 | djmp: jmp do 37 | dd: 056056;040040;040040;040040 38 | dir: .=.+8 39 | -------------------------------------------------------------------------------- /scans/trysys.s: -------------------------------------------------------------------------------- 1 | "** 01-s1.pdf page 65 2 | " trysys 3 | 4 | sys open; a.out; 0 5 | spa 6 | jmp error 7 | sys read; buf; 3072 8 | sad .-1 9 | jmp error 10 | iof 11 | caf 12 | cdf 13 | clof 14 | law buf 15 | dac t1 16 | dzm t2 17 | -3072 18 | dac c1 19 | 1: 20 | lac t1 i 21 | dac t2 i 22 | isz t1 23 | isz t2 24 | isz c1 25 | jmp 1b 26 | jmp 0100 27 | 28 | error: 29 | lac d1 30 | sys write; 1f; 1 31 | sys exit 32 | 1: 077012 33 | 34 | a.out: 35 | ;;;;;040040;040040;040040 38 | d1: 1 39 | d4: 4 40 | d5: 5 41 | dm4: -4 -------------------------------------------------------------------------------- /man/chmod.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''CHMOD(I)' 2 | .ta 18 21 3 | NAME chmod -- change mode 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | chmod 8 | octal file1 file2 file3 ... 9 | .sp 10 | DESCRIPTION The octal mode replaces the mode of each of the 11 | files. The mode is constructed from the OR of 12 | the following modes: 13 | .sp 14 | 01 write for non--owner 15 | 02 read for non--owner 16 | 04 write for owner 17 | 10 read for owner 18 | 20 executable 19 | 40 set--UID 20 | .sp 21 | Only the owner of a file may change its mode. 22 | .sp 23 | FILES -- 24 | .sp 25 | SEE ALSO stat, ls 26 | .sp 27 | DIAGNOSTICS -- 28 | .sp 29 | BUGS -- 30 | .sp 31 | OWNER ken, dmr 32 | -------------------------------------------------------------------------------- /man/cp.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''CP(I)' 2 | .ta 18 21 3 | NAME cp -- copy 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | cp 8 | file11 file12 file21 file22 ... 9 | .sp 10 | DESCRIPTION Files are taken in pairs; the first is opened 11 | for reading, the second created mode 17. Then 12 | the first is copied into the second. 13 | .sp 14 | FILES -- 15 | .sp 16 | SEE ALSO cat, pr, rn 17 | .sp 18 | DIAGNOSTICS Error returns are checked at every system call, 19 | and appropriate diagnostics are produced. 20 | .sp 21 | BUGS The second file should be created in the mode of 22 | the first. A directory convention as used in mv 23 | should be adopted to cp. 24 | .sp 25 | OWNER ken, dmr 26 | -------------------------------------------------------------------------------- /tools/README.md: -------------------------------------------------------------------------------- 1 | # Tools 2 | 3 | ## 3dump 4 | 5 | An application which dumps PDP-7 binary files 6 | 7 | ## a7out 8 | 9 | User-mode simulator for PDP-7 Unix applications 10 | 11 | ## as7 12 | 13 | An assembler for PDP-7 assembler files 14 | 15 | ## b.c 16 | 17 | A prototypical compiler for the B language 18 | 19 | ## fsck7 20 | 21 | Check and dump the details of a PDP-7 filesystem image for SimH 22 | 23 | ## mkfs7 24 | 25 | Makes a PDP-7 filesystem image for SimH 26 | 27 | ## sdump 28 | 29 | A tool to dump the contents of the ../build/image.fs filesystem 30 | 31 | ## xref7 32 | 33 | A quick and nasty tool to cross-reference the kernel code 34 | -------------------------------------------------------------------------------- /man/cat.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''CAT(I)' 2 | .ta 18 21 3 | NAME cat -- concatenate and print 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | cat 8 | file1 ... 9 | .sp 10 | DESCRIPTION 11 | .ul 12 | cat 13 | reads each file in sequence and writes it on 14 | the standard output stream. Thus: 15 | .sp 16 | .ul 17 | cat file 18 | .sp 19 | is about the easiest way to print a file. Also: 20 | .sp 21 | .ul 22 | cat filel file2 >file3 23 | .sp 24 | is about the easiest way to concatenate files. 25 | .sp 26 | FILES -- 27 | .sp 28 | SEE ALSO pr, cp 29 | .sp 30 | DIAGNOSTICS If a file cannot be found it is ignored. If no 31 | files are given, "no files" is output. 32 | .sp 33 | BUGS -- 34 | .sp 35 | OWNER ken, dmr 36 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | jobs: 9 | build-ubuntu: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v2 14 | 15 | - name: get libdatetime-perl 16 | run: sudo apt-get install libdatetime-perl 17 | 18 | - name: build 19 | run: make clean;make alt; make clean; make 20 | 21 | build-macos: 22 | runs-on: macos-latest 23 | 24 | steps: 25 | - uses: actions/checkout@v2 26 | 27 | - name: get DateTime 28 | run: sudo cpan -i DateTime 29 | 30 | - name: build 31 | run: make clean;make alt; make clean; make 32 | -------------------------------------------------------------------------------- /scans/un.s: -------------------------------------------------------------------------------- 1 | "** 14-148-165.pdf page 18 2 | " un 3 | 4 | sys open; n.out; 0 5 | spa 6 | jmp error 7 | sys read; buf; 3072 8 | cll; idiv; 6 9 | lacq; cma; tad d1 10 | dac c1 11 | 1: 12 | lac t1 13 | tad d4 14 | dac t2 15 | lac i t2 16 | sad d3 17 | skp 18 | jmp 2f 19 | lac d1 20 | sys write; t1: buf; 4 21 | lac d1 22 | sys write; mes+1; 1 23 | 2: 24 | lac t1 25 | tad d6 26 | dac t1 27 | isz c1 28 | jmp 1b 29 | 30 | sys exit 31 | 32 | error: 33 | lac d1 34 | sys write; mes; 2 35 | sys exit 36 | 37 | mes: 38 | 077; 012 39 | n.out: 40 | ;;;;; ; ; 012000 36 | childmsg: ; ; ; ; ; ; ; ; 012000 40 | -------------------------------------------------------------------------------- /man/stat.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''STAT(I)' 2 | .ta 18 21 24 3 | NAME stat -- get file status 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | stat 8 | name 9 | .sp 10 | DESCRIPTION 11 | .ul 12 | stat 13 | gives several kinds of information about one file. 14 | .sp 15 | .nf 16 | i-number 17 | flags 18 | owner 19 | links 20 | size 21 | .sp 22 | flag bits are: 23 | .nf 24 | .in 8 25 | 40 special file 26 | 20 directory 27 | 10 read, owner 28 | 04 write, owner 29 | 02 read, non-owner 30 | 01 write, non-owner 31 | .in 8 32 | .sp 33 | All values are printed in octal. 34 | .in 0 35 | .sp 36 | FILES -- 37 | .sp 38 | SEE ALSO 39 | .in 8 40 | .ul 41 | list 42 | shows all files in a directory in the same format as 43 | .ul 44 | stat. 45 | .in 0 46 | .sp 47 | DIAGNOSTICS "name ?" for any error. "nofiles" if no file 48 | name is given. 49 | .sp 50 | BUGS none 51 | .sp 52 | OWNER ken, dmr 53 | 54 | -------------------------------------------------------------------------------- /man/chrm.1: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''CHRM(I)' 2 | .ta 18 21 3 | NAME chrm -- remove (unlink) files 4 | .sp 5 | SYNOPSIS 6 | .ul 7 | chrm 8 | directory name1 ... 9 | .sp 10 | DESCRIPTION 11 | .ul 12 | chrm 13 | removes the entries for one or more files 14 | from the named directory. If an entry was the 15 | last link to the file, the file is destroyed. 16 | Removal of a file requires write permission in 17 | its directory, but neither read nor write 18 | permission on the file itself. 19 | .sp 20 | Directories cannot be removed by 21 | .ul 22 | chrm. 23 | .sp 24 | FILES -- 25 | .sp 26 | SEE ALSO -- 27 | .sp 28 | DIAGNOSTICS If the file cannot be removed or does not exist, 29 | the name of the file followed by a question mark 30 | is typed. 31 | .sp 32 | BUGS 33 | .ul 34 | chrm 35 | probably should ask whether a read-only 36 | file is really to be removed. 37 | .sp 38 | OWNER ken, dmr 39 | -------------------------------------------------------------------------------- /src/other/chrtbl.s: -------------------------------------------------------------------------------- 1 | " PLB 2020-01-05 2 | " start of a file to assemble output of cas.s 3 | 4 | " base. maybe AFTER table?? 5 | b: 6 | 7 | " 128-word dispatch table for ASCII 8 | 9 | null; null; null; null; null; null; null; null 10 | null; null; null; null; null; null; null; null 11 | null; null; null; null; null; null; null; null 12 | null; null; null; null; null; null; null; null 13 | space; excla; quote; number; dollar; percent; amper; accl 14 | lparn; rparn; aster; plus; comma; minus; period; sla 15 | c0; c1; c2; c3; c4; c5; c6; c7 16 | c8; c9; colon; semcln; less; equal; great; quest 17 | at; ca; cb; cc; cd; ce; cf; cg 18 | ch; ci; cj; ck; cl; cm; cn; co 19 | cp; cq; cr; cs; ct; cu; cv; cw 20 | cx; cy; cz; lbk; bsla; rbk; cmflx; under 21 | accr; la; lb; lc; ld; le; lf; lg 22 | lh; li; lj; lk; ll; lm; ln; lo 23 | lp; lq; lr; ls; lt; lu; lv; lw 24 | lx; ly; lz; lbr; or; rbr; tild; null 25 | -------------------------------------------------------------------------------- /tools/3dump: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | # 3 | # Dump a binary PDP-7 file where a word is encoded as three bytes, 4 | # with sixbits are stored big-endian in each of the three byte. 5 | # 6 | use strict; 7 | use warnings; 8 | 9 | die("Usage: $0 binaryfile\n") if (@ARGV==0); 10 | 11 | open(my $IN, "<", $ARGV[0]) || die("Can't open $ARGV[0]: $!\n"); 12 | while (1) { 13 | # Convert three bytes into one 18-bit word 14 | my $result= read($IN, my $three, 3); 15 | last if ($result != 3); # Not enough bytes read 16 | my ($b1, $b2, $b3)= unpack("CCC", $three); 17 | my $word= (($b1 & 077) << 12) | (($b2 & 077) << 6) | ($b3 & 077); 18 | 19 | my $c1= ($word >> 9) & 0777; 20 | $c1= (($c1 >= 32) && ($c1 <= 126)) ? chr($c1) : ' '; 21 | my $c2= $word & 0777; 22 | $c2= (($c2 >= 32) && ($c2 <= 126)) ? chr($c2) : ' '; 23 | printf("%06o %s%s\n", $word, $c1, $c2) 24 | } 25 | close($IN); 26 | exit(0); 27 | -------------------------------------------------------------------------------- /scans/pd.s: -------------------------------------------------------------------------------- 1 | " ** 11-56-91.pdf page 1 2 | " pd 3 | 4 | sys open; dotdot; 0 5 | spa; jms error 6 | dac df 7 | law dir-1 8 | dac 8 9 | 1: 10 | lac df 11 | sys read; tbuf; 8 12 | spa; jms error 13 | sna 14 | jmp 1f 15 | lac tbuf 16 | sna 17 | jmp 1b 18 | -8 19 | dac c1 20 | law tbuf-1 21 | dac 9 22 | 2: 23 | lac 9 i 24 | dac 8 i 25 | isz c1 26 | jmp 2b 27 | jmp 1b 28 | 29 | 1: 30 | lac df 31 | sys close 32 | law 017 33 | sys creat; dotdot 34 | spa; jms error 35 | dac df 36 | law dir-2 37 | cma 38 | tad 8 39 | dac .+4 40 | lac df 41 | sys write; dir; .. 42 | spa; jms error 43 | lac df 44 | sys close 45 | sys exit 46 | 47 | error: 0 48 | -1 49 | tad error 50 | hlt 51 | sys save 52 | 53 | dotdot: 54 | 056056; 040040; 040040; 040040 55 | 56 | c1: .=.+1 57 | df: .=.+1 58 | tbuf: .=.+8 59 | dir: 60 | -------------------------------------------------------------------------------- /scans/rn.s: -------------------------------------------------------------------------------- 1 | " ** 11-56-91.pdf page 8 2 | " rn 3 | 4 | lac 017777 5 | tad d1 6 | dac name2 7 | loop: 8 | lac 017777 i 9 | sad d4 10 | sys exit 11 | sad d8 12 | jmp unbal 13 | tad dm8 14 | dac 017777 i 15 | lac name2 16 | tad d4 17 | dac name1 18 | tad d4 19 | dac name2 20 | sys unlink; name2: 0 21 | lac name2 22 | dac 1f 23 | sys rename; name1: 0; 1: 0 24 | sma 25 | jmp loop 26 | lac name1 27 | dac 1f 28 | lac d1 29 | sys write; 1: 0; 4 30 | lac d1 31 | sys write; mes; 1 32 | lac name2 33 | dac 1f 34 | lac d1 35 | sys write; 1: 0; 4 36 | lac d1 37 | sys write; mes; 2 38 | jmp loop 39 | mes: 40 | 040000;077012 41 | unbal: 42 | lac name2 43 | tad d4 44 | dac 1f 45 | lac d1 46 | sys write; 1: 0; 4 47 | lac d1 48 | sys write; mes; 2 49 | sys exit 50 | 51 | d1: 1 52 | d4: 4 53 | d8: 8 54 | dm8: -8 55 | -------------------------------------------------------------------------------- /src/cmd/pd.s: -------------------------------------------------------------------------------- 1 | " ** 11-56-91.pdf page 1 2 | " pd 3 | 4 | sys open; dotdot; 0 5 | spa; jms error 6 | dac df 7 | law dir-1 8 | dac 8 9 | 1: 10 | lac df 11 | sys read; tbuf; 8 12 | spa; jms error 13 | sna 14 | jmp 1f 15 | lac tbuf 16 | sna 17 | jmp 1b 18 | -8 19 | dac c1 20 | law tbuf-1 21 | dac 9 22 | 2: 23 | lac 9 i 24 | dac 8 i 25 | isz c1 26 | jmp 2b 27 | jmp 1b 28 | 29 | 1: 30 | lac df 31 | sys close 32 | law 017 33 | sys creat; dotdot 34 | spa; jms error 35 | dac df 36 | law dir-2 37 | cma 38 | tad 8 39 | dac .+4 40 | lac df 41 | sys write; dir; .. 42 | spa; jms error 43 | lac df 44 | sys close 45 | sys exit 46 | 47 | error: 0 48 | -1 49 | tad error 50 | hlt 51 | sys save 52 | 53 | dotdot: 54 | 056056; 040040; 040040; 040040 55 | 56 | c1: .=.+1 57 | df: .=.+1 58 | tbuf: .=.+8 59 | dir: 60 | -------------------------------------------------------------------------------- /src/cmd/rn.s: -------------------------------------------------------------------------------- 1 | " ** 11-56-91.pdf page 8 2 | " rn 3 | 4 | lac 017777 5 | tad d1 6 | dac name2 7 | loop: 8 | lac 017777 i 9 | sad d4 10 | sys exit 11 | sad d8 12 | jmp unbal 13 | tad dm8 14 | dac 017777 i 15 | lac name2 16 | tad d4 17 | dac name1 18 | tad d4 19 | dac name2 20 | sys unlink; name2: 0 21 | lac name2 22 | dac 1f 23 | sys rename; name1: 0; 1: 0 24 | sma 25 | jmp loop 26 | lac name1 27 | dac 1f 28 | lac d1 29 | sys write; 1: 0; 4 30 | lac d1 31 | sys write; mes; 1 32 | lac name2 33 | dac 1f 34 | lac d1 35 | sys write; 1: 0; 4 36 | lac d1 37 | sys write; mes; 2 38 | jmp loop 39 | mes: 40 | 040000;077012 41 | unbal: 42 | lac name2 43 | tad d4 44 | dac 1f 45 | lac d1 46 | sys write; 1: 0; 4 47 | lac d1 48 | sys write; mes; 2 49 | sys exit 50 | 51 | d1: 1 52 | d4: 4 53 | d8: 8 54 | dm8: -8 55 | -------------------------------------------------------------------------------- /scans/tm.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 3 2 | " tm 3 | 4 | sys time 5 | cll 6 | div 7 | 216000 8 | dac t1 9 | lacq 10 | cll 11 | idiv 12 | 10 13 | tad o60 14 | dac buf+1 15 | lacq 16 | cll; idiv; 10 17 | tad o60 18 | dac buf 19 | lacq 20 | sna 21 | jmp 1f 22 | tad o60 23 | alss 9 24 | xor buf 25 | dac buf 26 | 1: 27 | lac t1 28 | cll 29 | idiv 30 | 6 31 | lacq 32 | cll 33 | idiv 34 | 10 35 | tad o56060 36 | dac buf+6 37 | lacq 38 | cll 39 | idiv 40 | 10 41 | tad o60 42 | dac buf+5 43 | lacq 44 | cll 45 | idiv 46 | 6 47 | tad o72060 48 | dac buf+4 49 | lacq 50 | cll 51 | idiv 52 | 10 53 | tad o60 54 | dac buf+3 55 | lacq 56 | cll 57 | idiv 58 | 6 59 | tad o72060 60 | dac buf+2 61 | lac d1 62 | sys write; buf; 8 63 | sys exit 64 | 65 | "** 13-120-147.pdf page 4 66 | d1: 1 67 | d13: 13 68 | d2: 2 69 | o60: 060 70 | o56060: 056060 71 | o72060: 072060 72 | t1: 0 73 | t2: 0 74 | buf: .=.+7; 012 75 | -------------------------------------------------------------------------------- /src/cmd/tm.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 3 2 | " tm 3 | 4 | sys time 5 | cll 6 | div 7 | 216000 8 | dac t1 9 | lacq 10 | cll 11 | idiv 12 | 10 13 | tad o60 14 | dac buf+1 15 | lacq 16 | cll; idiv; 10 17 | tad o60 18 | dac buf 19 | lacq 20 | sna 21 | jmp 1f 22 | tad o60 23 | alss 9 24 | xor buf 25 | dac buf 26 | 1: 27 | lac t1 28 | cll 29 | idiv 30 | 6 31 | lacq 32 | cll 33 | idiv 34 | 10 35 | tad o56060 36 | dac buf+6 37 | lacq 38 | cll 39 | idiv 40 | 10 41 | tad o60 42 | dac buf+5 43 | lacq 44 | cll 45 | idiv 46 | 6 47 | tad o72060 48 | dac buf+4 49 | lacq 50 | cll 51 | idiv 52 | 10 53 | tad o60 54 | dac buf+3 55 | lacq 56 | cll 57 | idiv 58 | 6 59 | tad o72060 60 | dac buf+2 61 | lac d1 62 | sys write; buf; 8 63 | sys exit 64 | 65 | "** 13-120-147.pdf page 4 66 | d1: 1 67 | d13: 13 68 | d2: 2 69 | o60: 060 70 | o56060: 056060 71 | o72060: 072060 72 | t1: 0 73 | t2: 0 74 | buf: .=.+7; 012 75 | -------------------------------------------------------------------------------- /man/dir.5: -------------------------------------------------------------------------------- 1 | .oh '11/3/70''DIRECTORY(I)' 2 | .ta 18 21 3 | NAME format of directories 4 | .sp 5 | SYNOPSIS -- 6 | .sp 7 | DESCRIPTION A directory behaves exactly like an ordinary 8 | file, save that no user may write into a 9 | directory. The fact that a file is a directory 10 | is indicated by a bit in the flag word of its 11 | i-node entry. 12 | .sp 13 | Directory entries are 8 words long. The first 14 | word is the i-node of the file represented by 15 | the entry, if non-zero; if zero, the entry is 16 | empty. 17 | .sp 18 | Words 1-4 represent the (8-character) file name, 19 | space padded on the right. These words are not 20 | necessarily cleared for empty slots. 21 | .sp 22 | By convention, the first entry in each directory 23 | is for "dd", which is the "directory directory" 24 | that holds all the users' home directories and 25 | the "system" directory. The "system" directory 26 | contains "init" and "sh". 27 | .sp 28 | FILES -- 29 | .sp 30 | SEE ALSO file system format 31 | .sp 32 | DIAGNOSTICS -- 33 | .sp 34 | BUGS -- 35 | .sp 36 | OWNER ken, dmr 37 | -------------------------------------------------------------------------------- /scans/maksys.s: -------------------------------------------------------------------------------- 1 | "** 01-s1.pdf page 64 -- handwritten maksys 2 | " copy a.out to disk track 18x 3 | " where x is the argument 4 | 5 | lac 017777 i; sad d8; skp; jmp error 6 | lac 017777; tad d5; dac track 7 | lac i track; lrss 9; tad om60 8 | spa; jmp error; dac track 9 | tad dm10; sma; jmp error 10 | 11 | sys open; a.out; 0 12 | spa; jmp error 13 | sys read; bufp: buf; 3072 14 | sad .-1 15 | jmp error 16 | 17 | dscs 18 | -3072; dslw 19 | lac bufp; dslm 20 | lac track; alss 8; xor o300000; dsld 21 | lac o3000; dsls 22 | dssf; jmp .-1 23 | dsrs; spa; jmp error 24 | -1024; dslw 25 | lac d3072; dslm 26 | lac track; alss 8; xor o300110; dsld 27 | lac o3000; dsls 28 | dssf; jmp .-1 29 | dsrs; spa; jmp error 30 | sys exit 31 | 32 | error: 33 | lac d1; sys write; 1f; 2 34 | sys exit 35 | 1: 077077;012 36 | 37 | dm10: -10 38 | d5: 5 39 | om60: -060 40 | o300000: 0300000 41 | o300110: 0300110 42 | d8: 8 43 | d3072: 3072 44 | o3000: 03000 45 | d1: 1 46 | a.out: 47 | ;;;;;040040;040040;040040 " Filename dd 38 | d1: 1 39 | d4: 4 40 | d5: 5 41 | dm4: -4 42 | -------------------------------------------------------------------------------- /src/other/brtb.b: -------------------------------------------------------------------------------- 1 | /* brtb.b - B run-time library */ 2 | 3 | char(s, n) { 4 | if (n & 1) return(s[n/2] & 0777); 5 | return((s[n/2]/512) & 0777); 6 | } 7 | 8 | lchar(s, n, c) { 9 | if (n & 1) s[n/2] = (s[n/2] & 0777000) | c; 10 | else s[n/2] = (s[n/2] & 0777) | (c*512); 11 | return(c); 12 | } 13 | 14 | putnum(n, b) { 15 | auto a, d; 16 | 17 | d = 0; 18 | if (n < 0) { 19 | n = -n; 20 | if (n < 0) { 21 | n = n-1; 22 | d = 1; 23 | } else 24 | putchar('-'); 25 | } 26 | if (a = n/b) 27 | putnum(a, b); 28 | putchar(n%b + '0' + d); 29 | } 30 | 31 | printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9) { 32 | auto adx, a, c, i, n; 33 | 34 | i = 0; 35 | adx = &x1; 36 | loop: 37 | while ((c = char(fmt, i)) != '%') { 38 | if (c == '*e') 39 | return; 40 | putchar(c); 41 | i = i+1; 42 | } 43 | i = i+1; 44 | a = *adx; 45 | c = char(fmt, i); 46 | if (c=='d') 47 | putnum(a, 10); 48 | else if (c=='o') 49 | putnum(a, 8); 50 | else if (c=='c') 51 | putchar(a); 52 | else if (c=='s') { 53 | n = 0; 54 | while ((c = char(a, n)) != '*e') { 55 | putchar(c); 56 | n = n+1; 57 | } 58 | } else { 59 | putchar('%'); 60 | goto loop; 61 | } 62 | i = i+1; 63 | adx = adx+1; 64 | goto loop; 65 | } 66 | -------------------------------------------------------------------------------- /src/other/wktmv.s: -------------------------------------------------------------------------------- 1 | " Warren's version of mv. mv file1 file2 2 | 3 | main: 4 | 5 | lac 017777 i " Load the pointer pointer in 017777 6 | sad d8 " to see if we have two 7 | jmp nofiles " No arguments, stop now 8 | lac 017777 " Move five words past the argument word count 9 | tad d5 " so that AC points at the first argument 10 | dac name1 " and save it 11 | tad d4 " Then do the same for the second name 12 | dac name2 13 | 14 | sys rename; name1:0; name2:0 " Rename the file 15 | spa 16 | jmp badfile " Print out an error on failure 17 | sys exit 18 | 19 | 20 | nofiles: 21 | lac d1 22 | sys write; 1f; 5 " Write "No files\n" to stdout 23 | sys exit " and exit 24 | 25 | 1: ; ;;; ;; abc 6 | perl as7 --out test.out brt.s brtb.s test.s bi.s 7 | perl a7out test.out 8 | */ 9 | 10 | /* convert command line argument into a string */ 11 | strarg(s, a) { 12 | auto i, c; 13 | i = 0; 14 | while (i < 8) { 15 | if ((c = char(a,i)) == ' ') 16 | goto done; 17 | lchar(s,i,c); 18 | i = i+1; 19 | } 20 | done: 21 | lchar(s,i,'*e'); 22 | return(s); 23 | } 24 | 25 | main { 26 | extrn fname, fin, fout, argv; 27 | auto ch,p,n,str 5; 28 | 29 | p = 017777; 30 | printf("mem[0%o] = 0%o*n",p,*p); 31 | printf("mem[0%o] = %d*n",*p,**p); 32 | 33 | printf("argv = %d*n",argv); 34 | printf("**argv = %d*n",*argv); 35 | printf("argv[0] = %d*n",argv[0]); 36 | n = 0; 37 | while (n < argv[0]) { 38 | n = n+1; 39 | printf("argv[%d] = 0%o *"%s*"*n",n,argv[n],strarg(str,argv[n])); 40 | } 41 | 42 | printf("array(0) = 0%o*n",array(0)); 43 | printf("array(64) = 0%o*n",array(64)); 44 | printf("array(0) = 0%o*n",array(0)); 45 | 46 | /* fin = open(fname, 0); */ 47 | fin = open("abc ", 0); 48 | 49 | goto loop; 50 | while (ch != 04) { 51 | putchr(ch); 52 | loop: 53 | ch = getchr(); 54 | } 55 | 56 | flush(); 57 | } 58 | 59 | fname [] 'ab','c ',' ',' '; 60 | -------------------------------------------------------------------------------- /src/tests/write_test.s: -------------------------------------------------------------------------------- 1 | " Test program for several system calls: open, read, write, close, exit 2 | " Do: 3 | " ./as7 write_test.s > a.out 4 | " ./a7out -d a.out 5 | main: 6 | " Test the lac, dac instructions 7 | lac in 8 | dac out 9 | 10 | " Write hello to fd1 i.e stdout 11 | lac d1 12 | sys write; hello; 7 13 | 14 | " Test if the assembler can dac into a mid-line label 15 | lac helloptr 16 | dac 1f 17 | lac d1 18 | sys write; 1:0; 7 19 | 20 | " Try to open file fred 21 | sys open; fred; 0; 22 | 23 | " read 5 words into the buffer from stdin: type in 10 or more characters! 24 | lac d0 25 | sys read; buf; 5 26 | 27 | " Stop and dump memory, so you can see five words at location 0400 28 | " Comment out the hlt instruction to test close and exit 29 | hlt 30 | 31 | " close stdin 32 | lac d0 33 | sys close 34 | 35 | " exit 36 | sys exit 37 | 38 | " We should not get to the halt instruction 39 | hlt 40 | 41 | 42 | " Some memory locations for lac and dac 43 | . = 0100 44 | in: 023 45 | 46 | . = 0200 47 | out: 0 48 | 49 | " Hello, world\n, two ASCII chars per word 50 | hello: ; ; 040; ; ; ; ; 040040; 040040 55 | 56 | " Input buffer for read 57 | . = 0400 58 | buf: 0 59 | 60 | d0: 0 61 | d1: 1 62 | -------------------------------------------------------------------------------- /src/cmd/st5.s: -------------------------------------------------------------------------------- 1 | "** 12-92-119.pdf page 19 2 | " space travel 5 3 | 4 | dsplanet: 0 " display planet center 5 | tad points " add points address to ac (planet index) 6 | dac 9f+t 7 | lac i 9f+t 8 | dac i clistp " set planet brightness 9 | lac o246256 10 | dac i clistp 11 | lac o253052 12 | dac i clistp 13 | lac o246036 14 | dac i clistp 15 | jmp dsplanet i 16 | 17 | dispname: 0 " display planet name 18 | tad names " add names address to ac (planet index) 19 | dac 9f+t 20 | lac i 9f+t 21 | tad dm1 22 | dac 8 23 | law namedsp-1 24 | dac 9 25 | -10 26 | dac 9f+t 27 | 1: 28 | lac i 8 29 | sna 30 | jmp 2f 31 | dac 9f+t+1 32 | lrss 9 33 | dac i 9 34 | isz 9f+t 35 | skp 36 | jmp i dispname 37 | lac 9f+t+1 38 | and o177 39 | sna 40 | jmp 2f 41 | dac i 9 42 | isz 9f+t 43 | jmp 1b 44 | jmp i dispname 45 | 2: 46 | dzm i 9 47 | isz 9f+t 48 | jmp 2b 49 | jmp i dispname 50 | 51 | t = t+2 52 | 53 | dspsca: 0 " display scale 54 | lac scale " AC = scale 55 | sma 56 | jmp 1f " if (scale < 0) { 57 | lac o55 "- 58 | dac dssca " dssca[0] = '-' 59 | -1 60 | tad scale 61 | cma " AC = -AC 62 | jmp 2f 63 | 1: " } else { 64 | "** 12-92-119.pdf page 20 65 | lac o53 "+ 66 | dac dssca " dssca[0] = '+' 67 | lac scale 68 | 2: " } 69 | cll; idiv; 10 70 | tad o60 71 | dac dssca+2 " dssca[2] = (AC % 10) + '0' 72 | lacq 73 | tad o60 74 | dac dssca+1 " dssca[1] = (AC / 10) + '0' 75 | jmp i dspsca 76 | -------------------------------------------------------------------------------- /src/tests/octal_test.s: -------------------------------------------------------------------------------- 1 | " Octal test: This code borrowed from ds.s to test the llss 2 | " instruction. It should print out num in octal followed by 3 | " a space. 4 | 5 | lac num 6 | jms octal; -3 7 | sys exit 8 | 9 | octal: 0 10 | lmq " Move the negative argument into the MQ 11 | " as we will use shifting to deal with the 12 | " number by shifting groups of 3 digits. 13 | 14 | lac d5 " By adding 5 to the negative count and 15 | tad octal i " complementing it, we set the actual 16 | cma " loop count up to 6 - count. So, if we 17 | dac c " want to print 2 digits, we lose 6 - 2 = 4 digits 18 | 1: 19 | llss 3 " Lose top 3 bits of the MQ 20 | isz c " Do we have any more to lose? 21 | jmp 1b " Yes, keep looping 22 | lac octal i " Save the actual number of print digits into c 23 | dac c " as a negative number. 24 | 1: 25 | cla 26 | llss 3 " Shift 3 more bits into AC 27 | tad o60 " Add AC to ASCII '0' 28 | dac buf " and print out the digit 29 | lac fd1 30 | sys write; buf; 1 31 | isz c " Any more characters to print out? 32 | jmp 1b " Yes, loop back 33 | lac o40 " Print out a space 34 | dac buf 35 | lac fd1 36 | sys write; buf; 1 37 | isz octal " Move return address 1 past the argument 38 | jmp octal i " and return from subroutine 39 | 40 | fd1: 1 41 | d5: 5 42 | o40: 040 43 | o60: 060 44 | num: 0126 45 | buf: 0 46 | c: .=.+1 47 | -------------------------------------------------------------------------------- /src/tests/decimal_out.s: -------------------------------------------------------------------------------- 1 | " Routine to print AC in decimal 2 | lac testnum " Print an example number 3 | jms decprnt; -5 " with five digits 4 | sys exit 5 | 6 | 7 | decprnt: 0 8 | dac num 9 | lac endptr " Point at the end of the buffer 10 | dac dbufptr 11 | dzm count " and set no characters so far 12 | lac num 13 | 1: cll 14 | sza " Is there anything left in the number? 15 | jmp 3f 16 | lac o60 " No, so put a space into the buffer 17 | jmp 4f 18 | 19 | 3: idiv; 10 " Divide AC by 10 20 | tad o60 " Add ASCII '0' 21 | 4: dac dbufptr i " and save the character into the buffer 22 | -1 " Move pointer back a word 23 | tad dbufptr 24 | dac dbufptr 25 | isz count " Bump up the count of characters 26 | lacq " and move the quotient into AC 27 | isz decprnt i " Add 1 to the # digits the user wants 28 | jmp 1b " Loop back for the next digit 29 | 30 | 5: isz dbufptr " Restore the pointer to the first digit 31 | lac d1 " Print as a string on stdout 32 | sys write; dbufptr:dbufend; count:0 33 | isz decprnt 34 | jmp decprnt i " and return from the routine 35 | 36 | " We set aside 5 words to buffer the characters, and we write 37 | " from the end backwards to the front 38 | dbuf: .=.+4 " First 4 words in the buffer 39 | dbufend: 0 " and the last word 40 | endptr: dbufend 41 | 42 | d1: 1 43 | o40: 040 44 | o60: 060 45 | num: 0 46 | zero: 0> 47 | 48 | testnum: 1234 49 | -------------------------------------------------------------------------------- /scans/cp.s: -------------------------------------------------------------------------------- 1 | " cp 2 | 3 | lac 017777 4 | tad d1 5 | dac name2 6 | loop: 7 | lac 017777 i 8 | sad d4 9 | sys exit 10 | sad d8 11 | jmp unbal 12 | tad dm8 13 | dac 017777 i 14 | lac name2 15 | tad d4 16 | dac name1 17 | tad d4 18 | dac name2 19 | sys open; name1: 0; 0 20 | spa 21 | jmp error 22 | lac o17 23 | sys creat; name2: 0 24 | spa 25 | jmp error 26 | dzm nin 27 | 28 | 1: 29 | lac bufp 30 | tad nin 31 | dac 0f 32 | -1 33 | tad nin 34 | cma 35 | tad d1024 36 | dac 0f+1 37 | lac d2 38 | sys read; 0:..;.. 39 | sna 40 | jmp 2f 41 | tad nin 42 | dac nin 43 | sad d1024 44 | jmp 2f 45 | jmp 1b 46 | 2: 47 | lac nin 48 | dac 2f 49 | lac d3 50 | sys write; buf; 2: 0 51 | dzm nin 52 | lac 2b 53 | sad d1024 54 | jmp 1b 55 | lac d2 56 | sys close 57 | lac d3 58 | sys close 59 | jmp loop 60 | error: 61 | lac name1 62 | dac 1f 63 | lac d1 64 | sys write; 1: 0; 4 65 | lac d1 66 | sys write; mes; 1 67 | lac name2 68 | dac 1f 69 | lac d1 70 | sys write; 1: 0; 4 71 | lac d1 72 | sys write; mes; 2 73 | jmp loop 74 | mes: 75 | 040000;077012 76 | unbal: 77 | lac name2 78 | tad d4 79 | dac 1f 80 | lac d1 81 | sys write; 1: 0; 4 82 | lac d1 83 | sys write; mes; 2 84 | sys exit 85 | 86 | d1: 1 87 | d4: 4 88 | d8: 8 89 | o17: 017 90 | dm8: -8 91 | d3: 3 92 | d1024: 1024 93 | nin: 0 94 | bufp: buf 95 | d2: 2 96 | 97 | buf: -------------------------------------------------------------------------------- /src/cmd/chrm.s: -------------------------------------------------------------------------------- 1 | " chrm: chrm dir file [file file ...] 2 | " 3 | " chdir into the named directory and unlink the files that are in there 4 | " 5 | " The code depends on a "dd" directory existing which holds the named dir 6 | 7 | lac 017777 " Go to the argc 8 | tad d5 " Skip past the argc and argv[0] 9 | dac 1f " Save argv[1] in the chdir arg below 10 | dac 2f " and in the unlink as well? Yes, we skip it 11 | lac 017777 i " How many arguments do we have? 12 | sad d4 13 | sys exit " None, so exit 14 | tad dm4 " Subtract 1 15 | dac 017777 i " and save in the argc 16 | 17 | sys chdir; dd " chdir to dd 18 | sys chdir; 1:0 " and then into the first argument 19 | 1: 20 | lac 017777 i " Any arguments left? 21 | sad d4 22 | sys exit " No, exit the program 23 | tad dm4 " Subtract 4 from the argc and update it 24 | dac 017777 i 25 | lac 2f " Move up to the next filename 26 | tad d4 27 | dac 2f " and save it in the unlink arg 28 | sys unlink; 2:0 " Unlink the file 29 | sma 30 | jmp 1b " Loop back if the unlink was OK, or issue err 31 | lac 2b " Copy the filename pointer below 32 | dac 2f 33 | lac d1 " Write the filename on stdout 34 | sys write; 2:0; 4 35 | lac d1 36 | sys write; 1f; 2 " Write " ?\n" on stdout 37 | jmp 1b " and loop back 38 | 39 | 1: 40 | 040077;012000 " String literal " ?\n" 41 | dd: 42 |
;040040;040040;040040 " Filename dd 43 | d1: 1 44 | d4: 4 45 | d5: 5 46 | dm4: -4 47 | -------------------------------------------------------------------------------- /tools/ccov7: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | # 3 | # Load a code coverage report from SimH and a kernel assembly listing 4 | # from as7, and show which lines in the kernel were not executed. 5 | # 6 | # To capture the list of executed locations in SimH, run SimH but stop 7 | # before executing any code, e.g. dep pc 0100 but don't go. 8 | # 9 | # Run this command to log execution of locations 21-4545: 10 | # set br 21-4545[200000000] 11 | # 12 | # Eventually, ctrl-E to stop execution. Now dump the results: 13 | # show @brk.list break all 14 | # 15 | # which will output a BRK.LIST Then run this command: 16 | # ccov7 BRK.LIST a.lst | less 17 | # 18 | # 19 | # (c) 2016 Warren Toomey, GPL3 20 | # 21 | use strict; 22 | use warnings; 23 | use Data::Dumper; 24 | 25 | die("Usage: $0 breaklist_file a.lst\n") if (@ARGV !=2); 26 | 27 | # Read in the breaklist file and work out which lines were not 28 | # used. We assume that [200000000] was used in SimH 29 | my @Unused; 30 | open(my $IN, "<", $ARGV[0]) || die("Can't open $ARGV[0]: $!\n"); 31 | while (<$IN>) { 32 | if (m{^(\d+):.*\[(\d+)\]}) { 33 | $Unused[$1]=1 if ($2 == 200000000); 34 | } 35 | } 36 | close($IN); 37 | 38 | # Now open the kernel listing file. Decorate those lines which 39 | # were not executed 40 | my $decoration= "\t NOT EXECUTED"; 41 | 42 | open($IN, "<", $ARGV[1]) || die("Can't open $ARGV[1]: $!\n"); 43 | while (<$IN>) { 44 | chomp; 45 | if (m{^(\d+):}) { # Find a line starting with digits, trim 46 | my $location= $1; # leading zeroes, append $decoration 47 | $location=~ s{^0+}{}; # if this is an unused location 48 | $_ .= $decoration if (defined($Unused[$location])); 49 | } 50 | print("$_\n"); 51 | } 52 | close($IN); 53 | exit(0); 54 | -------------------------------------------------------------------------------- /scans/sop.s: -------------------------------------------------------------------------------- 1 | "** 01-s1.pdf page 62 2 | " sop 3 | 4 | dac = 0040000 5 | jms = 0100000 6 | dzm = 0140000 7 | lac = 0200000 8 | xor = 0240000 9 | add = 0300000 10 | tad = 0340000 11 | xct = 0400000 12 | isz = 0440000 13 | and = 0500000 14 | sad = 0540000 15 | jmp = 0600000 16 | nop = 0740000 17 | i = 020000 18 | law = 0760000 19 | cma = 0740001 20 | las = 0750004 21 | ral = 0740010 22 | rar = 0740020 23 | hlt = 0740040 24 | sma = 0740100 25 | sza = 0740200 26 | snl = 0740400 27 | skp = 0741000 28 | spa = 0741100 29 | sna = 0741200 30 | szl = 0741400 31 | rtl = 0742010 32 | rtr = 0742020 33 | cll = 0744000 34 | rcl = 0744010 35 | rcr = 0744020 36 | cla = 0750000 37 | lrs = 0640500 38 | lrss = 0660500 39 | lls = 0640600 40 | llss = 0660600 41 | als = 0640700 42 | alss = 0660700 43 | mul = 0653122 44 | idiv = 0653323 45 | lacq = 0641002 46 | clq = 0650000 47 | omq = 0640002 48 | cmq = 0640004 49 | lmq = 0652000 50 | 51 | dscs = 0707141 52 | dslw = 0707124 53 | dslm = 0707142 54 | dsld = 0707104 55 | dsls = 0707144 56 | dssf = 0707121 57 | dsrs = 0707132 58 | 59 | iof = 0700002 60 | ion = 0700042 61 | caf = 0703302 62 | clon = 0700044 63 | clsf = 0700001 64 | "** 01-s1.pdf page 63 65 | clof = 0700004 66 | ksf = 0700301 67 | krb = 0700312 68 | tsf = 0700401 69 | tcf = 0700402 70 | tls = 0700406 71 | sck = 0704301 72 | cck = 0704304 73 | lck = 0704312 74 | rsf = 0700101 75 | rsa = 0700104 76 | rrb = 0700112 77 | psf = 0700201 78 | pcf = 0700202 79 | psa = 0700204 80 | cdf = 0700501 81 | lds = 0701052 82 | lda = 0701012 83 | wcga = 0704206 84 | raef = 0700742 85 | rlpd = 0700723 86 | beg = 0700547 87 | spb = 0704401 88 | cpb = 0704404 89 | lpb = 0704412 90 | wbl = 0704424 91 | dprs = 0704752 92 | dpsf = 0704741 93 | dpcf = 0704761 94 | dprc = 0704712 95 | crsf = 0706701 96 | crrb = 0706712 97 | -------------------------------------------------------------------------------- /scans/op.s: -------------------------------------------------------------------------------- 1 | "** 09-1-35.pdf page 35 2 | " op 3 | 4 | sys = 0020000 5 | dac = 0040000 6 | jms = 0100000 7 | dzm = 0140000 8 | lac = 0200000 9 | xor = 0240000 10 | add = 0300000 11 | tad = 0340000 12 | xct = 0400000 13 | isz = 0440000 14 | and = 0500000 15 | sad = 0540000 16 | jmp = 0600000 17 | law = 0760000 18 | 19 | nop = 0740000 20 | cma = 0740001 21 | cml = 0740002 22 | oas = 0740004 23 | ral = 0740010 24 | rar = 0740020 25 | hlt = 0740040 26 | sma = 0740100 27 | sza = 0740200 28 | snl = 0740400 29 | skp = 0741000 30 | spa = 0741100 31 | sna = 0741200 32 | szl = 0741400 33 | rtl = 0742010 34 | rtr = 0742020 35 | cll = 0744000 36 | stl = 0744002 37 | rcl = 0744010 38 | rcr = 0744020 39 | cla = 0750000 40 | clc = 0750001 41 | las = 0750004 42 | glk = 0750010 43 | lrs = 0640500 44 | lrss= 0660500 45 | lls = 0640600 46 | llss= 0660600 47 | als = 0640700 48 | alss= 0660700 49 | norm= 0640444 50 | norms=0660444 51 | mul = 0653122 52 | muls= 0657122 53 | div = 0640323 54 | divs= 0644323 55 | idiv= 0653323 56 | idivs=0657323 57 | frdiv = 0650323 58 | frdivs = 0654323 59 | lacq = 0641002 60 | lacs = 0641001 61 | clq = 0650000 62 | ads = 0644000 63 | gsm = 0664000 64 | 65 | "** 10-36-55.pdf page 1 66 | osc = 0640001 67 | omq = 0640002 68 | otq = 0642000 69 | cmq = 0640004 70 | lmq = 0652000 71 | ecla = 0641000 72 | 73 | i = 020000 74 | 75 | save = 1 76 | getuid = 2 77 | open = 3 78 | read = 4 79 | write = 5 80 | creat = 6 81 | seek = 7 82 | tell = 8 83 | close = 9 84 | link = 10 85 | unlink = 11 86 | setuid = 12 87 | rename = 13 88 | exit = 14 89 | time = 15 90 | intrp = 16 91 | chdir = 17 92 | chmode = 18 93 | chowner = 19 94 | sysloc = 21 95 | capt = 23 96 | rele = 24 97 | status = 25 98 | sleep = 26 99 | smes = 27 100 | rmes = 28 101 | fork = 29 102 | -------------------------------------------------------------------------------- /src/cmd/op.s: -------------------------------------------------------------------------------- 1 | "** 09-1-35.pdf page 35 2 | " op 3 | 4 | sys = 0020000 5 | dac = 0040000 6 | jms = 0100000 7 | dzm = 0140000 8 | lac = 0200000 9 | xor = 0240000 10 | add = 0300000 11 | tad = 0340000 12 | xct = 0400000 13 | isz = 0440000 14 | and = 0500000 15 | sad = 0540000 16 | jmp = 0600000 17 | law = 0760000 18 | 19 | nop = 0740000 20 | cma = 0740001 21 | cml = 0740002 22 | oas = 0740004 23 | ral = 0740010 24 | rar = 0740020 25 | hlt = 0740040 26 | sma = 0740100 27 | sza = 0740200 28 | snl = 0740400 29 | skp = 0741000 30 | spa = 0741100 31 | sna = 0741200 32 | szl = 0741400 33 | rtl = 0742010 34 | rtr = 0742020 35 | cll = 0744000 36 | stl = 0744002 37 | rcl = 0744010 38 | rcr = 0744020 39 | cla = 0750000 40 | clc = 0750001 41 | las = 0750004 42 | glk = 0750010 43 | lrs = 0640500 44 | lrss= 0660500 45 | lls = 0640600 46 | llss= 0660600 47 | als = 0640700 48 | alss= 0660700 49 | norm= 0640444 50 | norms=0660444 51 | mul = 0653122 52 | muls= 0657122 53 | div = 0640323 54 | divs= 0644323 55 | idiv= 0653323 56 | idivs=0657323 57 | frdiv = 0650323 58 | frdivs = 0654323 59 | lacq = 0641002 60 | lacs = 0641001 61 | clq = 0650000 62 | ads = 0644000 63 | gsm = 0664000 64 | 65 | "** 10-36-55.pdf page 1 66 | osc = 0640001 67 | omq = 0640002 68 | otq = 0642000 69 | cmq = 0640004 70 | lmq = 0652000 71 | ecla = 0641000 72 | 73 | i = 020000 74 | 75 | save = 1 76 | getuid = 2 77 | open = 3 78 | read = 4 79 | write = 5 80 | creat = 6 81 | seek = 7 82 | tell = 8 83 | close = 9 84 | link = 10 85 | unlink = 11 86 | setuid = 12 87 | rename = 13 88 | exit = 14 89 | time = 15 90 | intrp = 16 91 | chdir = 17 92 | chmode = 18 93 | chowner = 19 94 | sysloc = 21 95 | capt = 23 96 | rele = 24 97 | status = 25 98 | sleep = 26 99 | smes = 27 100 | rmes = 28 101 | fork = 29 102 | -------------------------------------------------------------------------------- /scans/joshd-s9.s: -------------------------------------------------------------------------------- 1 | " s9 -- cold boot 2 | 3 | . = coldentry+4 4 | 5 | " zero i-list 6 | 7 | dzm ii 8 | jms copyz; dskbuf; 64 9 | 1: 10 | lac ii 11 | jms dskio; 07000 12 | isz ii 13 | -710 14 | tad ii 15 | sza 16 | jmp 1b 17 | 18 | " free rest of disk 19 | 20 | 1: 21 | lac ii 22 | jms free 23 | isz ii 24 | -6400 25 | tad ii 26 | sza 27 | jmp 1b 28 | 29 | " read in tapes 30 | 31 | dzm ii 32 | 1: 33 | dzm sum 34 | jms getw " count 35 | sza 36 | jmp .+3 37 | hlt 38 | jmp 1b " 0 count means pause 39 | dac xx 40 | isz ii 41 | lac ii 42 | jms iget 43 | jms copyz; inode; 12 44 | jms getw " flags 45 | dac i.flags 46 | -1 47 | dac i.uid 48 | jms getw " number links 49 | dac i.nlks 50 | -2 51 | tad xx 52 | dac i.size 53 | lac ii 54 | dac i.uniq 55 | law 4096-1 56 | dac 8 57 | -1 58 | tad i.size 59 | cma 60 | sna 61 | jmp 3f 62 | dac xx 63 | 2: 64 | jms getw 65 | dac 8 i 66 | isz xx 67 | jmp 2b 68 | 3: 69 | lac sum 70 | dac xx 71 | jms getw " checksum 72 | sad xx 73 | skp 74 | jms halt 75 | lac i.size 76 | dac .+4 77 | cla 78 | jms iwrite; 4096; .. 79 | jms iput 80 | cla 81 | jms diskio; 07000 " jms copy; sysdata; ??? (unreadable) 82 | jmp 1b 83 | 84 | getw: 0 85 | jms getc 86 | alss 12 87 | lmq 88 | jms getc 89 | alss 6 90 | omq 91 | lmq 92 | jms getc 93 | omq 94 | lmq 95 | add sum 96 | dac sum 97 | lacq 98 | jmp getw i 99 | 100 | getc: 0 101 | iof 102 | rsa 103 | rsf 104 | jmp .-1 105 | rrb 106 | sna 107 | jmp getc+1 108 | and o77 109 | ion 110 | jmp getc i 111 | xx: 0 112 | sum: 0 113 | -------------------------------------------------------------------------------- /scans/ln.s: -------------------------------------------------------------------------------- 1 | "** 09-1-35.pdf page 15 2 | " ln 3 | 4 | lac 017777 i 5 | sad d4 6 | jmp error 7 | lac 017777 8 | tad d1 9 | dac dirn 10 | lac dirn i 11 | sad qli 12 | jmp clink 13 | lac 017777 14 | tad d5 15 | dac dirn 16 | dac name 17 | 18 | loop: 19 | lac 017777 i 20 | sad d8 21 | sys exit 22 | tad dm4 23 | dac 017777 i 24 | lac name 25 | tad d4 26 | dac name 27 | dac name1 28 | sys link; dirn: 0; name: 0; name1: 0 29 | sma 30 | jmp loop 31 | lac name 32 | dac 1f 33 | lac d1 34 | sys write; 1: 0; 4 35 | lac d1 36 | sys write; errmes; 2 37 | jmp loop 38 | 39 | clink: 40 | lac 017777 i 41 | sad d8 42 | jmp arg1 43 | sad d12 44 | jmp arg2 45 | sad d16 46 | jmp arg3 47 | 48 | error: 49 | lac d1 50 | sys write; errmes+1; 1 51 | sys exit 52 | 53 | arg1: 54 | lac 017777 55 | tad d5 56 | dac larg+1 57 | dac larg+2 58 | jmp dlink 59 | arg2: 60 | lac 017777 61 | tad d5 62 | dac larg 63 | tad d4 64 | "** 09-1-35.pdf page 16 65 | dac larg+1 66 | dac larg+2 67 | jmp dlink 68 | arg3: 69 | lac 017777 70 | tad d5 71 | dac larg 72 | tad d4 73 | dac larg+1 74 | tad d4 75 | dac larg+2 76 | dlink: 77 | sys link; larg: defdir;0;0 78 | sma 79 | sys exit 80 | lac larg 81 | dac 1f 82 | lac larg+1 83 | dac 2f 84 | lac larg+2 85 | dac 3f 86 | lac d1 87 | sys write; 1:..; 4 88 | lac d1 89 | sys write; 2:..; 4 90 | lac d1 91 | sys write; 3:..; 4 92 | lac d1 93 | sys write; errmes; 2 94 | sys exit 95 | 96 | errmes: 97 | 040; 077012 98 | d1: 1 99 | qli:
  • 100 | d12: 12 101 | d16: 16 102 | defdir: ;;;040040 103 | d4: 4 104 | d8: 8 105 | dm4: -4 106 | d5: 5 107 | -------------------------------------------------------------------------------- /scans/s9.s: -------------------------------------------------------------------------------- 1 | "** 01-s1.pdf page 53 2 | " s9 -- cold boot 3 | 4 | . = coldentry+4 5 | 6 | " zero i-list 7 | 8 | dzm ii 9 | jms copyz; dskbuf; 64 10 | 1: 11 | lac ii 12 | jms dskio; 07000 13 | isz ii 14 | -710 15 | tad ii 16 | sza 17 | jmp 1b 18 | 19 | " free rest of disk 20 | 21 | 1: 22 | lac ii 23 | jms free 24 | isz ii 25 | -6400 26 | tad ii 27 | sza 28 | jmp 1b 29 | 30 | " read in tapes 31 | 32 | dzm ii 33 | 1: 34 | dzm sum 35 | jms getw " count 36 | sza 37 | jmp .+3 38 | hlt 39 | jmp 1b " 0 count means pause 40 | dac xx 41 | isz ii 42 | lac ii 43 | jms iget 44 | jms copyz; inode; 12 45 | jms getw " flags 46 | dac i.flags 47 | -1 48 | dac i.uid 49 | jms getw " number links 50 | dac i.nlks 51 | -2 52 | tad xx 53 | dac i.size 54 | lac ii 55 | dac i.uniq 56 | law 4096-1 57 | dac 8 58 | -1 59 | tad i.size 60 | cma 61 | sna 62 | jmp 3f 63 | dac xx 64 | 65 | "** 01-s1.pdf page 54 66 | 2: 67 | jms getw 68 | dac 8 i 69 | isz xx 70 | jmp 2b 71 | 3: 72 | lac sum 73 | dac xx 74 | jms getw " checksum 75 | sad xx 76 | skp 77 | jms halt 78 | lac i.size 79 | dac .+4 80 | cla 81 | jms iwrite; 4096; .. 82 | jms iput 83 | cla 84 | jms dskio; 07000 "** writing on listing 85 | jmp 1b 86 | 87 | getw: 0 88 | jms getc 89 | alss 12 90 | lmq 91 | jms getc 92 | alss 6 93 | omq 94 | lmq 95 | jms getc 96 | omq 97 | lmq 98 | add sum 99 | dac sum 100 | lacq 101 | jmp getw i 102 | 103 | getc: 0 104 | iof 105 | rsa 106 | rsf 107 | jmp .-1 108 | rrb 109 | sna 110 | jmp getc+1 111 | and o77 112 | ion 113 | jmp getc i 114 | xx: 0 115 | sum: 0 116 | -------------------------------------------------------------------------------- /src/cmd/ln.s: -------------------------------------------------------------------------------- 1 | "** 09-1-35.pdf page 15 2 | " ln 3 | 4 | lac 017777 i 5 | sad d4 6 | jmp error 7 | lac 017777 8 | tad d1 9 | dac dirn 10 | lac dirn i 11 | sad qli 12 | jmp clink 13 | lac 017777 14 | tad d5 15 | dac dirn 16 | dac name 17 | 18 | loop: 19 | lac 017777 i 20 | sad d8 21 | sys exit 22 | tad dm4 23 | dac 017777 i 24 | lac name 25 | tad d4 26 | dac name 27 | dac name1 28 | sys link; dirn: 0; name: 0; name1: 0 29 | sma 30 | jmp loop 31 | lac name 32 | dac 1f 33 | lac d1 34 | sys write; 1: 0; 4 35 | lac d1 36 | sys write; errmes; 2 37 | jmp loop 38 | 39 | clink: 40 | lac 017777 i 41 | sad d8 42 | jmp arg1 43 | sad d12 44 | jmp arg2 45 | sad d16 46 | jmp arg3 47 | 48 | error: 49 | lac d1 50 | sys write; errmes+1; 1 51 | sys exit 52 | 53 | arg1: 54 | lac 017777 55 | tad d5 56 | dac larg+1 57 | dac larg+2 58 | jmp dlink 59 | arg2: 60 | lac 017777 61 | tad d5 62 | dac larg 63 | tad d4 64 | "** 09-1-35.pdf page 16 65 | dac larg+1 66 | dac larg+2 67 | jmp dlink 68 | arg3: 69 | lac 017777 70 | tad d5 71 | dac larg 72 | tad d4 73 | dac larg+1 74 | tad d4 75 | dac larg+2 76 | dlink: 77 | sys link; larg: defdir;0;0 78 | sma 79 | sys exit 80 | lac larg 81 | dac 1f 82 | lac larg+1 83 | dac 2f 84 | lac larg+2 85 | dac 3f 86 | lac d1 87 | sys write; 1:..; 4 88 | lac d1 89 | sys write; 2:..; 4 90 | lac d1 91 | sys write; 3:..; 4 92 | lac d1 93 | sys write; errmes; 2 94 | sys exit 95 | 96 | errmes: 97 | 040; 077012 98 | d1: 1 99 | qli:
  • 100 | d12: 12 101 | d16: 16 102 | defdir: ;;;040040 103 | d4: 4 104 | d8: 8 105 | dm4: -4 106 | d5: 5 107 | -------------------------------------------------------------------------------- /scans/stat.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 1 2 | " stat 3 | 4 | arg = 017777 5 | 6 | lac arg 7 | tad d1 8 | dac name 9 | 10 | loop: 11 | lac arg i 12 | sad d4 13 | sys exit 14 | tad dm4 15 | dac arg i 16 | lac name 17 | tad d4 18 | dac name 19 | 20 | law statbuf 21 | sys status; dotdot; name: .. 22 | spa 23 | jmp error 24 | law obuf-1 25 | dac 12 26 | lac ii 27 | lmq 28 | -3 29 | jms octal 30 | lac iflags 31 | lmq 32 | -2 33 | jms octal 34 | lac iuid 35 | lmq 36 | -2 37 | jms octal 38 | -1 39 | tad inlks 40 | cma 41 | lmq 42 | -2 43 | jms octal 44 | lac isize 45 | lmq 46 | -5 47 | jms octal 48 | lac o12 49 | dac obuf+18 50 | lac d1 51 | sys write; obuf; 19 52 | jmp loop 53 | 54 | error: 55 | lac name 56 | dac 1f 57 | lac d1 58 | sys write; 1:..; 4 59 | lac d1 60 | sys write; 1f; 2 61 | jmp loop 62 | 1: 040077; 012 63 | 64 | "** 13-120-147.pdf page 2 65 | octal: 0 66 | dac c 67 | law tbuf-1 68 | dac 8 69 | lac o40 70 | dac 8 i 71 | 1: 72 | lacq 73 | and o7 74 | tad o60 75 | dac 8 i 76 | lrs 3 77 | isz c 78 | jmp 1b 79 | lac 8 80 | dac c 81 | 1: 82 | lac c i 83 | dac 12 i 84 | sad o40 85 | jmp octal i 86 | -1 87 | tad c 88 | dac c 89 | jmp 1b 90 | 91 | dotdot: 92 | 056056; 040040; 040040; 040040 93 | 94 | d1: 1 95 | d2: 2 96 | d3: 3 97 | d8: 8 98 | d14: 14 99 | d12: 12 100 | o12: 012 101 | o60: 060 102 | o40: 040 103 | o7: 7 104 | d4: 4 105 | dm4: -4 106 | 107 | c: .=.+1 108 | 109 | statbuf: 110 | iflags: .=.+1 111 | .=.+7 112 | iuid: .=.+1 113 | inlks: .=.+1 114 | isize: .=.+1 115 | .=.+1 116 | ii: .=.+1 117 | 118 | obuf: .=.+19 119 | tbuf: .=.+10 120 | -------------------------------------------------------------------------------- /src/cmd/stat.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 1 2 | " stat 3 | 4 | arg = 017777 5 | 6 | lac arg 7 | tad d1 8 | dac name 9 | 10 | loop: 11 | lac arg i 12 | sad d4 13 | sys exit 14 | tad dm4 15 | dac arg i 16 | lac name 17 | tad d4 18 | dac name 19 | 20 | law statbuf 21 | sys status; dotdot; name: .. 22 | spa 23 | jmp error 24 | law obuf-1 25 | dac 12 26 | lac ii 27 | lmq 28 | -3 29 | jms octal 30 | lac iflags 31 | lmq 32 | -2 33 | jms octal 34 | lac iuid 35 | lmq 36 | -2 37 | jms octal 38 | -1 39 | tad inlks 40 | cma 41 | lmq 42 | -2 43 | jms octal 44 | lac isize 45 | lmq 46 | -5 47 | jms octal 48 | lac o12 49 | dac obuf+18 50 | lac d1 51 | sys write; obuf; 19 52 | jmp loop 53 | 54 | error: 55 | lac name 56 | dac 1f 57 | lac d1 58 | sys write; 1:..; 4 59 | lac d1 60 | sys write; 1f; 2 61 | jmp loop 62 | 1: 040077; 012 63 | 64 | "** 13-120-147.pdf page 2 65 | octal: 0 66 | dac c 67 | law tbuf-1 68 | dac 8 69 | lac o40 70 | dac 8 i 71 | 1: 72 | lacq 73 | and o7 74 | tad o60 75 | dac 8 i 76 | lrs 3 77 | isz c 78 | jmp 1b 79 | lac 8 80 | dac c 81 | 1: 82 | lac c i 83 | dac 12 i 84 | sad o40 85 | jmp octal i 86 | -1 87 | tad c 88 | dac c 89 | jmp 1b 90 | 91 | dotdot: 92 | 056056; 040040; 040040; 040040 93 | 94 | d1: 1 95 | d2: 2 96 | d3: 3 97 | d8: 8 98 | d14: 14 99 | d12: 12 100 | o12: 012 101 | o60: 060 102 | o40: 040 103 | o7: 7 104 | d4: 4 105 | dm4: -4 106 | 107 | c: .=.+1 108 | 109 | statbuf: 110 | iflags: .=.+1 111 | .=.+7 112 | iuid: .=.+1 113 | inlks: .=.+1 114 | isize: .=.+1 115 | .=.+1 116 | ii: .=.+1 117 | 118 | obuf: .=.+19 119 | tbuf: .=.+10 120 | -------------------------------------------------------------------------------- /src/cmd/t1.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 5 2 | " TMG 3 | " console switches: 4 | " bit 0: do not save/dump core!! 5 | " bit 15: trace first recognition or generate instruction & halt 6 | " bit 16: trace all generation instructions 7 | " bit 17: trace all recognition instructions 8 | t=0 9 | main: 10 | lac 017777 i 11 | sad d4 12 | jmp 2f 13 | sad d8 14 | jmp 1f 15 | law 9 16 | tad 017777 17 | dac 0f 18 | law 017 19 | sys creat;0:0 20 | dac output 21 | 1:law 5 22 | tad 017777 23 | dac 0f 24 | sys open;0:0;0 25 | dac input 26 | spa 27 | sys exit 28 | 2: 29 | jms advance; jmp 1f 30 | jmp rinterp 31 | 32 | 0:lac 2f " get EOS 33 | jms obuild " add to obuf 34 | 1:lac owrite " here on retreat 35 | spa " anything in obuf? 36 | jmp 0b " no, put EOS 37 | jms oflush " flush buffered output 38 | las " get switches 39 | spa " high bit set? 40 | sys exit " yes: exit 41 | sys save " no, dump core!!!! 42 | 2:o777 43 | 44 | 45 | "special machine language code 46 | 47 | "puts out and octal strin g from symtab entry 48 | 49 | symoct: " BUILTIN: (output last symtab ent in octal?) 50 | lac equ 51 | add equbot 52 | dac 9f+t " save temp pointer 53 | lac 1f " fetch "gf" (execute native code) inst below 54 | jms twoktab; lac 9f+t i " second word is contents of word *temp 55 | " first word of "two word ktab" entry: 56 | 1:gf .+1 x " invoke native code (below), and exit 57 | lac ii " fetch instruction pointer 58 | dac 8 " save in auto-increment register 8 59 | lac 8 i " fetch word after *ii 60 | add symbot " use as offset into symtab 61 | dac 9f+t " save in temp 62 | 63 | 2:lac 9f+t i " fetch symtab word *temp 64 | jms putoct " output octal 65 | lac onenl " output newline 66 | jms obuild 67 | lac 9f+t i 68 | and o600600 69 | sza "skip unless word contained eof (0777) 70 | jmp ggoon 71 | 72 | "** 13-120-147.pdf page 6 73 | isz 9f+t 74 | jmp 2b 75 | t=t+1 76 | o600600:0600600 77 | -------------------------------------------------------------------------------- /scans/t4.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 19 2 | " put symbuf symbol into table 3 | 4 | table: 5 | lac equwrite 6 | dac equ 7 | jms between; add d0; add equmax 8 | jms halt 9 | add delta 10 | dac equwrite 11 | lac equ 12 | add equbot 13 | tad m1 14 | dac 8 15 | lac symwrite 16 | dac 8 i 17 | add symbot 18 | dac 2f 19 | lac mdelta 20 | 1:dzm 8 i 21 | tad d1 22 | spa 23 | jmp 1b 24 | lac sbbot 25 | jms move 26 | 2:0 27 | add o400000 28 | cma 29 | add symbot 30 | cma 31 | add o400000 32 | and o17777 33 | dac symwrite 34 | jms between; add d0; add symmax 35 | jms halt 36 | jmp goon 37 | 38 | " find occurrence of symbuf symbol in equtab 39 | 40 | prev: 41 | lac equ 42 | jmp find+1 43 | find: 44 | lac equwrite 45 | dac 9f+t 46 | lac o777 47 | jms sbput 48 | lac sbbot 49 | dac 2f 50 | 1:lac 9f+t 51 | tad mdelta 52 | dac 9f+t 53 | spa 54 | jmp nuts 55 | add equbot 56 | dac junk 57 | lac junk i 58 | add symbot 59 | jms comp 60 | 2:0 61 | jmp 1b 62 | lac 9f+t 63 | dac equ 64 | 65 | "** 13-120-147.pdf page 20 66 | jmp goon 67 | t=t+1 "next equtab location to test 68 | 69 | sbput:0 70 | lmq 71 | lac sbwrite 72 | add sbbot 73 | dac 1f 74 | lacq 75 | jms dchar 76 | 1:0 77 | lac sbwrite 78 | add o400000 79 | dac sbwrite 80 | jms cbetween; add d0; add sbmax 81 | jms halt 82 | jmp sbput i 83 | 84 | getname: 85 | lac equ 86 | add equbot 87 | dac 9f+t 88 | lac 1f 89 | jms twoktab; lac 9f+t i 90 | 91 | 1:gf .+1 x 92 | lac ii 93 | dac 8 94 | lac 8 i 95 | add symbot 96 | and o17777 97 | jms obuild 98 | jmp ggoon 99 | t=t+1 "equtable entry 100 | 101 | " puts double word entries in ktab and gives 102 | "pointer to first as result 103 | 104 | twoktab:0 105 | jms kput 106 | lac l.gk 107 | add k 108 | dac nframe i 109 | isz nframe 110 | xct twoktab i 111 | jms kput 112 | jmp goon 113 | -------------------------------------------------------------------------------- /scans/t5.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 21 2 | char: 3 | lac j 4 | dac jsav 5 | isz ii 6 | jms ctest 7 | jmp backup 8 | jmp goon 9 | 10 | string: 11 | isz ii 12 | jms ctest 13 | jmp goon 14 | jmp string+1 15 | 16 | ctest:0 17 | jms jget 18 | jms class; add ii i 19 | jmp ctest i 20 | jms sbput 21 | lac j 22 | add o400000 23 | dac j 24 | isz ctest 25 | jmp ctest i 26 | 27 | mark: 28 | jms jget 29 | dzm sbwrite 30 | jmp goon 31 | 32 | parsedo: 33 | isz ii 34 | jms advance; jmp 3f 35 | jms advance; jmp 1f 36 | jms aget 37 | dac ii 38 | jmp rinterp 39 | 40 | 1:lac frame 41 | add refrsz 42 | dac ii 43 | sad nframe 44 | jmp retreat 45 | dac gflag 46 | lac gefrsz 47 | dac dffrmsz 48 | jms advance; jmp 2f 49 | jmp ginterp 50 | 51 | 2:lac refrsz 52 | dac dffrmsz 53 | add frame 54 | dac nframe 55 | dzm gflag 56 | jmp retreat 57 | 58 | 3:jms s0get; add d.k 59 | dac k 60 | jmp goon 61 | 62 | bundle: 63 | jms bundlep 64 | 65 | "** 13-120-147.pdf page 22 66 | dac 9f+t 67 | sna 68 | jmp goon 69 | jms nframe0 70 | dac nframe 71 | lac 9f+t 72 | dac nframe i 73 | isz nframe 74 | jmp goon 75 | t=t+1 76 | 77 | " jms between;add a; add b; skip if a<=ac;;;;;;; 51 | ;;; 52 | bugg:.+1;;;;;;;; 53 | 54 | o17:017 55 | o60:060 56 | o77:077 57 | o777:0777 58 | 59 | o417777:0417777 60 | o400000:0400000 61 | o740000:0740000 62 | o377700:0377700 63 | o17777:017777 64 | 65 | "** 13-120-147.pdf page 27 66 | o757777:0757777 67 | o600600:0600600 68 | 69 | junk:0 70 | junk1:0 71 | 72 | output:1 73 | input:0 74 | 75 | stbit:st 76 | fibit:fi 77 | holdlv:0 78 | rand1:0 79 | rand2:0 80 | 81 | 82 | symwrite:0 83 | symbot: symtab 84 | symsiz = 500 85 | symmax:symsiz 86 | 87 | equwrite:0 88 | equread:0 89 | equ = equread 90 | equbot: equtab 91 | equsiz = 500 92 | equmax: equsiz 93 | delta: 2 94 | mdelta:0-2 95 | 96 | sbsiz=50 97 | sbmax:sbsiz 98 | sbwrite:0 99 | sbbot:sbbuf 100 | 101 | fflag:0 102 | gflag:0 103 | ignore:.+1;0400000;0;0;0;0;0;0;4 104 | frame:rstack 105 | nframe:rstack+6 106 | env = ignore 107 | d.ii = d2 108 | d.env = d3 109 | d.blkmod = d3 110 | d.j = d4 111 | d.k = d5 112 | dffrmsz:6 113 | framsiz:4 114 | refrsz = d6 115 | gefrsz = d4 116 | ii: start 117 | k:0 118 | 119 | rsiz = 500 120 | rmax: rsiz 121 | rbot:rstack 122 | rtop:rstack+rsiz 123 | 124 | owrite:0 125 | obot:obuf 126 | osiz=64 127 | -------------------------------------------------------------------------------- /src/sys/s9.s: -------------------------------------------------------------------------------- 1 | "** 01-s1.pdf page 53 2 | " s9 -- cold boot 3 | 4 | . = coldentry+4 5 | 6 | " zero i-list 7 | 8 | dzm ii " Set ii to zero 9 | jms copyz; dskbuf; 64 " Zero the 64-word dskbuf 10 | 1: 11 | lac ii " Zero blocks 0 to 709 12 | jms dskio; 07000 13 | isz ii " Move up to next block number 14 | -710 15 | tad ii 16 | sza 17 | jmp 1b " Loop back until we reach block 710 18 | " i.e. we don't write block 710 19 | 20 | " free rest of disk 21 | 22 | 1: 23 | lac ii " Free blocks 710 up to 6399 24 | jms free 25 | isz ii 26 | -6400 27 | tad ii 28 | sza 29 | jmp 1b " Loop back until we reach block 6400 30 | 31 | " read in tapes 32 | 33 | dzm ii 34 | 1: 35 | dzm sum 36 | jms getw " count 37 | sza 38 | jmp .+3 39 | hlt 40 | jmp 1b " 0 count means pause 41 | dac xx 42 | isz ii 43 | lac ii 44 | jms iget 45 | jms copyz; inode; 12 46 | jms getw " flags 47 | dac i.flags 48 | -1 49 | dac i.uid 50 | jms getw " number links 51 | dac i.nlks 52 | -2 53 | tad xx 54 | dac i.size 55 | lac ii 56 | dac i.uniq 57 | law 4096-1 58 | dac 8 59 | -1 60 | tad i.size 61 | cma 62 | sna 63 | jmp 3f 64 | dac xx 65 | 66 | "** 01-s1.pdf page 54 67 | 2: 68 | jms getw 69 | dac 8 i 70 | isz xx 71 | jmp 2b 72 | 3: 73 | lac sum 74 | dac xx 75 | jms getw " checksum 76 | sad xx 77 | skp 78 | jms halt 79 | lac i.size 80 | dac .+4 81 | cla 82 | jms iwrite; 4096; .. 83 | jms iput 84 | cla 85 | jms dskio; 07000 "** writing on listing 86 | jmp 1b 87 | 88 | getw: 0 89 | jms getc 90 | alss 12 91 | lmq 92 | jms getc 93 | alss 6 94 | omq 95 | lmq 96 | jms getc 97 | omq 98 | lmq 99 | add sum 100 | dac sum 101 | lacq 102 | jmp getw i 103 | 104 | getc: 0 105 | iof 106 | rsa 107 | rsf 108 | jmp .-1 109 | rrb 110 | sna 111 | jmp getc+1 112 | and o77 113 | ion 114 | jmp getc i 115 | xx: 0 116 | sum: 0 117 | -------------------------------------------------------------------------------- /src/cmd/t8.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 28 2 | " op.s is the op code defination file 3 | " for the assembler 4 | " no iot ops are defined 5 | " system cal entries are defined 6 | " 7 | dac = 0040000 " MEM: deposit AC 8 | jms = 0100000 " MEM: jump to subroutine 9 | dzm = 0140000 " MEM: deposit zero to memory 10 | lac = 0200000 " MEM: load AC 11 | xor = 0240000 " MEM: XOR with AC 12 | add = 0300000 " MEM: one's complement add 13 | tad = 0340000 " MEM: two's complement add 14 | xct = 0400000 " MEM: execute 15 | isz = 0440000 " MEM: increment and skip if zero 16 | and = 0500000 " MEM: AND 17 | sad = 0540000 " MEM: skip if AC different 18 | jmp = 0600000 " MEM: jump 19 | eae = 0640000 " Extended Arithmetic Element 20 | i = 020000 " indirect 21 | opr = 0740000 " Operator (bit encoded) 22 | law = opr i " OPR: load accumulator with (instr) 23 | cma = opr 1 " OPR: complement AC 24 | cml = opr 2 " OPR: complement LINK 25 | ral = opr 010 " OPR: rotate AC left 26 | rar = opr 020 " OPR: rotate AC right 27 | sma = opr 0100 " OPR: skip on minus AC 28 | sza = opr 0200 " OPR: skip on zero AC 29 | snl = opr 0400 " OPR: skip on non-zero link 30 | skp = opr 01000 " OPR: skip unconditionally 31 | spa = opr 01100 " OPR: skip on positive AC 32 | sna = opr 01200 " OPR: skip on non-zero AC 33 | szl = opr 01400 " OPR: skip on zero link 34 | cll = opr 04000 " OPR: clear link 35 | cla = opr 010000 " OPR: clear AC 36 | las = opr 010004 " OPR: load AC from switches 37 | lrs = eae 0500 " EAE: long right shift 38 | lrss = i lrs " EAE: long right shift, signed 39 | lls = eae 0600 " EAE: long left shift 40 | llss = i lls " EAE: long left shift, signed 41 | als = eae 0700 " EAE: AC left shift 42 | alss = i als " EAE: AC left shift, signed 43 | lacq = eae 01002 " EAE: load AC with MQ 44 | lacs = eae 01001 " EAE: load AC with SC (not used) 45 | clq = eae 010000 " EAE: clear MQ 46 | omq = eae 2 " EAE: OR MQ into AC 47 | cmq = eae 4 " EAE: complement MQ 48 | lmq = eae 012000 " EAE: load MQ from AC 49 | 50 | sys = i " CAL instruction w/ indirect bit 51 | save = 1 52 | open = 3 53 | read = 4 54 | write = 5 55 | creat = 6 56 | seek = 7 57 | close = 9 58 | exit = 14 59 | -------------------------------------------------------------------------------- /tools/sdump: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | # 3 | # sdump: Dump the contents of a filesystem in SimH format 4 | # 5 | # (c) 2016 Warren Toomey, GPL3 6 | # 7 | use strict; 8 | use warnings; 9 | use Fcntl qw(:flock SEEK_SET); 10 | 11 | ### read a word from a file in SimH format 12 | ### return -1 on EOF 13 | sub read_word { 14 | my $F = shift; 15 | 16 | # Convert four bytes into one 18-bit word 17 | return -1 if ( read( $F, my $four, 4 ) != 4 ); # Not enough bytes read 18 | my ( $b1, $b2, $b3, $b4 ) = unpack( "CCCC", $four ); 19 | return ( 20 | ( $b1 & 0xff ) | ( ( $b2 & 0xff ) << 8 ) | ( ( $b3 & 0xff ) << 16 ) | 21 | ( ( $b4 & 0xff ) << 24 ) ); 22 | } 23 | 24 | ### Main program 25 | die("Usage: $0 imagefile\n") if ( @ARGV != 1 ); 26 | 27 | open( my $IN, "<", $ARGV[0] ) || die("Couldn't open $ARGV[0]: $!\n"); 28 | 29 | use constant NUMBLOCKS => 8000; # Number of blocks on a surface 30 | use constant WORDSPERBLK => 64; # 64 words per block 31 | use constant BYTESPERWORD => 4; # We encode each word into 4 bytes 32 | 33 | # Skip the first surface 34 | seek( $IN, NUMBLOCKS * WORDSPERBLK * BYTESPERWORD, SEEK_SET ) 35 | || die("Cannot seek: $!\n"); 36 | 37 | foreach my $blocknum ( 0 .. NUMBLOCKS * 2 - 1 ) { 38 | printf( "Block %d (%06o)\n", $blocknum, $blocknum ); 39 | foreach my $line ( 0 .. 7 ) { 40 | 41 | # Print out the words in octal 42 | my @buf; 43 | foreach my $offset ( 0 .. 7 ) { 44 | 45 | # Get a word 46 | my $word = read_word($IN); 47 | exit(0) if ( $word == -1 ); 48 | $buf[$offset] = $word; 49 | } 50 | foreach my $offset ( 0 .. 7 ) { 51 | printf( "%06o ", $buf[$offset] ); 52 | } 53 | print(" "); 54 | foreach my $offset ( 0 .. 7 ) { 55 | my $c1 = ( $buf[$offset] >> 9 ) & 0777; 56 | $c1 = ( ( $c1 >= 32 ) && ( $c1 <= 126 ) ) ? chr($c1) : ' '; 57 | my $c2 = $buf[$offset] & 0777; 58 | $c2 = ( ( $c2 >= 32 ) && ( $c2 <= 126 ) ) ? chr($c2) : ' '; 59 | print("$c1$c2"); 60 | } 61 | print("\n"); 62 | } 63 | print("\n"); 64 | } 65 | exit(0); 66 | -------------------------------------------------------------------------------- /scans/p3.s: -------------------------------------------------------------------------------- 1 | "** 10-36-55.pdf page 11 2 | " p3 3 | 4 | rad = 02000 5 | diam = rad+rad 6 | diam3 = diam-0200 7 | middle: 0100000 8 | high: 0177700-010000 9 | low: 010000 10 | ballinit: 0 11 | -nball 12 | dac 9f+t 13 | 14 | " Q ball 15 | 16 | lac middle 17 | dac ball1+x 18 | lac low 19 | dac ball1+y 20 | dzm ball1+vx 21 | dzm ball1+vy 22 | dzm ball1+sflg 23 | jms put 24 | 25 | " top row 26 | 27 | lac d1 28 | dac ball1+sflg 29 | lac high 30 | dac ball1+y 31 | -diam-diam-diam 32 | tad ball1+x 33 | dac ball1+x 34 | jms put 35 | jms put 36 | jms put 37 | jms put 38 | jms put 39 | 40 | " second row 41 | 42 | -diam3 43 | tad ball1+y 44 | dac ball1+y 45 | -diam-diam-diam 46 | tad ball1+x 47 | dac ball1+x 48 | -diam-rad 49 | tad ball1+x 50 | dac ball1+x 51 | jms put 52 | jms put 53 | jms put 54 | jms put 55 | 56 | " third row 57 | 58 | -diam3 59 | tad ball1+y 60 | dac ball1+y 61 | -diam-diam-diam-rad 62 | tad ball1+x 63 | dac ball1+x 64 | "** 10-36-55.pdf page 12 65 | jms put 66 | jms put 67 | jms put 68 | 69 | " fourth row 70 | 71 | -diam3 72 | tad ball1+y 73 | dac ball1+y 74 | -diam-diam-rad 75 | tad ball1+x 76 | dac ball1+x 77 | jms put 78 | jms put 79 | 80 | " last row 81 | 82 | -diam3 83 | tad ball1+y 84 | dac ball1+y 85 | -diam-rad 86 | tad ball1+x 87 | dac ball1+x 88 | jms put 89 | 90 | jmp ballinit i 91 | 92 | put: 0 93 | jms putball; ball1; 9f+t 94 | -diam-1 95 | cma 96 | tad ball1+x 97 | dac ball1+x 98 | isz 9f+t 99 | jmp put i 100 | jmp put i 101 | t = t+1 102 | 103 | getball: 0 104 | -1 105 | tad getball i 106 | dac 8 107 | isz getball 108 | lac getball i 109 | dac 9f+t 110 | lac nballp 111 | tad 9f+t i 112 | cll; mul; bvsize 113 | lacq 114 | tad listpm1 115 | dac 9 116 | -bvsize 117 | dac 9f+t 118 | 1: 119 | lac 9 i 120 | dac 8 i 121 | isz 9f+t 122 | jmp 1b 123 | isz getball 124 | jmp getball i 125 | 126 | "** 10-36-55.pdf page 13 127 | putball: 0 128 | -1 129 | tad putball i 130 | dac 8 131 | isz putball 132 | lac putball i 133 | dac 9f+t 134 | lac nballp 135 | tad 9f+t i 136 | cll; mul; bvsize 137 | lacq 138 | tad listpm1 139 | dac 9 140 | -bvsize 141 | dac 9f+t 142 | 1: 143 | lac 8 i 144 | dac 9 i 145 | isz 9f+t 146 | jmp 1b 147 | isz putball 148 | jmp putball i 149 | t = t+1 150 | -------------------------------------------------------------------------------- /src/cmd/p3.s: -------------------------------------------------------------------------------- 1 | "** 10-36-55.pdf page 11 2 | " p3 3 | 4 | rad = 02000 5 | diam = rad+rad 6 | diam3 = diam-0200 7 | middle: 0100000 8 | high: 0177700-010000 9 | low: 010000 10 | ballinit: 0 11 | -nball 12 | dac 9f+t 13 | 14 | " Q ball 15 | 16 | lac middle 17 | dac ball1+x 18 | lac low 19 | dac ball1+y 20 | dzm ball1+vx 21 | dzm ball1+vy 22 | dzm ball1+sflg 23 | jms put 24 | 25 | " top row 26 | 27 | lac d1 28 | dac ball1+sflg 29 | lac high 30 | dac ball1+y 31 | -diam-diam-diam 32 | tad ball1+x 33 | dac ball1+x 34 | jms put 35 | jms put 36 | jms put 37 | jms put 38 | jms put 39 | 40 | " second row 41 | 42 | -diam3 43 | tad ball1+y 44 | dac ball1+y 45 | -diam-diam-diam 46 | tad ball1+x 47 | dac ball1+x 48 | -diam-rad 49 | tad ball1+x 50 | dac ball1+x 51 | jms put 52 | jms put 53 | jms put 54 | jms put 55 | 56 | " third row 57 | 58 | -diam3 59 | tad ball1+y 60 | dac ball1+y 61 | -diam-diam-diam-rad 62 | tad ball1+x 63 | dac ball1+x 64 | "** 10-36-55.pdf page 12 65 | jms put 66 | jms put 67 | jms put 68 | 69 | " fourth row 70 | 71 | -diam3 72 | tad ball1+y 73 | dac ball1+y 74 | -diam-diam-rad 75 | tad ball1+x 76 | dac ball1+x 77 | jms put 78 | jms put 79 | 80 | " last row 81 | 82 | -diam3 83 | tad ball1+y 84 | dac ball1+y 85 | -diam-rad 86 | tad ball1+x 87 | dac ball1+x 88 | jms put 89 | 90 | jmp ballinit i 91 | 92 | put: 0 93 | jms putball; ball1; 9f+t 94 | -diam-1 95 | cma 96 | tad ball1+x 97 | dac ball1+x 98 | isz 9f+t 99 | jmp put i 100 | jmp put i 101 | t = t+1 102 | 103 | getball: 0 104 | -1 105 | tad getball i 106 | dac 8 107 | isz getball 108 | lac getball i 109 | dac 9f+t 110 | lac nballp 111 | tad 9f+t i 112 | cll; mul; bvsize 113 | lacq 114 | tad listpm1 115 | dac 9 116 | -bvsize 117 | dac 9f+t 118 | 1: 119 | lac 9 i 120 | dac 8 i 121 | isz 9f+t 122 | jmp 1b 123 | isz getball 124 | jmp getball i 125 | 126 | "** 10-36-55.pdf page 13 127 | putball: 0 128 | -1 129 | tad putball i 130 | dac 8 131 | isz putball 132 | lac putball i 133 | dac 9f+t 134 | lac nballp 135 | tad 9f+t i 136 | cll; mul; bvsize 137 | lacq 138 | tad listpm1 139 | dac 9 140 | -bvsize 141 | dac 9f+t 142 | 1: 143 | lac 8 i 144 | dac 9 i 145 | isz 9f+t 146 | jmp 1b 147 | isz putball 148 | jmp putball i 149 | t = t+1 150 | -------------------------------------------------------------------------------- /scans/cat.s: -------------------------------------------------------------------------------- 1 | "** 06-5-12.pdf page 21 2 | " cat 3 | 4 | lac 017777 i 5 | sad d4 6 | jmp nofiles 7 | lac 017777 8 | tad d1 9 | tad d4 10 | dac name 11 | 12 | loop: 13 | sys open; name: 0; 0 14 | spa 15 | jmp badfile 16 | dac fi 17 | 18 | 1: 19 | jms getc 20 | sad o4 21 | jmp 1f 22 | jms putc 23 | jmp 1b 24 | 25 | 1: 26 | lac fi 27 | sys close 28 | 29 | loop1: 30 | -4 31 | tad 017777 i 32 | dac 017777 i 33 | sad d4 34 | jmp done 35 | lac name 36 | tad d4 37 | dac name 38 | jmp loop 39 | 40 | badfile: 41 | lac name 42 | dac 1f 43 | lac d8 44 | sys write; 1:0; 4 45 | lac d8 46 | sys write; 1f; 2 47 | jmp loop1 48 | 49 | 1: 040;077012 50 | nofiles: 51 | lac d8 52 | sys write; 1f; 5 53 | sys exit 54 | 55 | 1: ; 040; ;;;;

    ;;

    ; < a>; ; 012 81 | 82 | badfile: 83 | lac argptr " Get the pointer to the argument 84 | dac 1f " Store it in 1f below 85 | lac d1 86 | sys write; 1:0; 4 " Write the name, max 4 words 87 | lac d1 " Then write " ?\n" 88 | sys write; 1f; 2 89 | sys exit " and exit 90 | 1: 040; 077012 " String literal: " ?\n" 91 | 92 | ibufptr: buf 93 | bufptr: buf 94 | buf: .=.+8 " Buffer of eight words 95 | count: 0 " Count of words read in 96 | offset: 0 " Offset from the beginning of file 97 | cbuf: 0 " Used to print out in the octal routing 98 | c: .=.+1 " Loop counter for printing octal digits 99 | fd: 0 100 | 101 | fd1: d1: 1 102 | d4: 4 103 | d5: 5 104 | d8: 8 105 | o60: 060 106 | 107 | colon: 072040 " Colon space string 108 | space: 040 " Space string 109 | newline: 012 " Newline string 110 | -------------------------------------------------------------------------------- /scans/st3.s: -------------------------------------------------------------------------------- 1 | "** 12-92-119.pdf page 10 2 | " space travel 3 3 | 4 | updshp: 0 5 | lac forflg 6 | spa 7 | jmp .+4 8 | lac bacflg 9 | sma 10 | jmp 3f 11 | fld; ascale 12 | lac forflg 13 | sma 14 | jmp 1f 15 | lac bacflg 16 | sma 17 | jmp 1f+1 18 | fld; fpzero 19 | jmp 2f 20 | 1: 21 | fng 22 | lac scale 23 | tad aexp 24 | dac aexp 25 | lac forflg 26 | sma 27 | jmp .+3 28 | 2: 29 | lac accflg "[arrow pointing here from the text "how to set?" - scan markup] 30 | sma 31 | jmp .+3 32 | fad; maxa 33 | fng 34 | fst; ftmp1 35 | fmp; ctheta 36 | fad; ax 37 | fst; ax 38 | fld; ftmp1 39 | fmp; stheta 40 | fad; ay 41 | fst; ay 42 | 3: 43 | fld; ox 44 | fng 45 | fad; ax 46 | fst; ftmp1 47 | fld; x 48 | lac aexp 49 | tad d1 50 | dac aexp 51 | fad; ftmp1 52 | fst; ftmp1 53 | fld; x 54 | fst; ox 55 | fld; ftmp1 56 | fst; x 57 | fld; oy 58 | fng 59 | fad; ay 60 | fst; ftmp1 61 | fld; y 62 | lac aexp 63 | tad d1 64 | "** 12-92-119.pdf page 11 65 | dac aexp 66 | fad; ftmp1 67 | fst; ftmp1 68 | fld; y 69 | fst; oy 70 | fld; ftmp1 71 | fst; y 72 | lac par 73 | sad maxj 74 | jmp i updshp 75 | jms absxy 76 | jms shipxy 77 | lac par 78 | jms absv 79 | fld; ox 80 | fng 81 | fad; x 82 | fad; absx 83 | fst; ox 84 | fld; oy 85 | fng 86 | fad; y 87 | fad; absy 88 | fst; oy 89 | lac maxj 90 | dac par 91 | jms absv 92 | fld; ox 93 | fng 94 | fad; absx 95 | fst; ox 96 | fld; oy 97 | fng 98 | fad; absy 99 | fst; oy 100 | lac par 101 | jms absxy 102 | fld; absx 103 | fad; shipx 104 | fng 105 | fst; x 106 | fad; ox 107 | fst; ox 108 | fld; absy 109 | fad; shipy 110 | fng 111 | fst; y 112 | fadins: 113 | fad; oy 114 | fst; oy 115 | lac par 116 | tad fppar 117 | dac 1f 118 | lac i 1f 119 | tad prsq 120 | dac 1f 121 | fld; 1:.. 122 | sqrt 123 | fst; rpar 124 | jms dspsca 125 | lac par 126 | "** 12-92-119.pdf page 12 127 | jms dispname 128 | jmp i updshp 129 | 130 | inscr: 0 131 | fng 132 | fix 133 | tad d383 134 | spa 135 | jmp i inscr 136 | tad dm768 137 | sma 138 | jmp i inscr 139 | isz inscr 140 | jmp i inscr 141 | 142 | absxy: 0 143 | sna 144 | jmp 7f 145 | lmq 146 | lac fldins 147 | dac 2f-1 148 | dac 4f-1 149 | lacq 150 | 1: 151 | dac absi 152 | sna 153 | jmp i absxy 154 | tad fppar 155 | dac 9f+t 156 | lac i 9f+t 157 | 5: 158 | tad px 159 | dac 2f 160 | fldins: 161 | fld; absx 162 | fad; 2:.. 163 | fst; absx 164 | lac i 9f+t 165 | 6: 166 | tad py 167 | dac 4f 168 | fld; absy 169 | fad; 4:.. 170 | fst; absy 171 | lac fadins 172 | dac 2b-1 173 | dac 4b-1 174 | lac absi 175 | tad ppar 176 | dac 9f+t 177 | lac i 9f+t 178 | jmp 1b 179 | 7: 180 | dzm absx 181 | dzm absx+1 182 | dzm absx+2 183 | dzm absy 184 | dzm absy+1 185 | dzm absy+2 186 | jmp i absxy 187 | "** 12-92-119.pdf page 13 188 | t = t+1 189 | -------------------------------------------------------------------------------- /src/alt/wktmkdir.s: -------------------------------------------------------------------------------- 1 | " Warren's alternative mkdir command: mkdir newdir 2 | 3 | main: 4 | lac 017777 i " Do we have any arguments? 5 | sad d4 6 | jmp noarg 7 | 8 | lac 017777 " Move five words past the argument word count 9 | tad d5 " so that AC points at the first argument 10 | dac 017777 11 | dac 6f " Save this as the argument name in 12 | dac 7f " several system calls 13 | dac 8f 14 | dac 9f 15 | 16 | " Get the status of the argument so that we can 17 | " see if it exists. Apparently creat (below) works 18 | " on an existing file 19 | lac statbufptr 20 | sys status; 6:0 21 | sna 22 | jmp badfile 23 | 24 | " Try to create a new file but with the isdir bit set 25 | lac o34 26 | sys creat; 7:0 27 | spa 28 | jmp badfile 29 | dac fd 30 | 31 | " Get the status of the current directory so that we can 32 | " get its i-num 33 | lac statbufptr 34 | sys status; dot 35 | 36 | " Write a dummy entry into the new directory that is 37 | " equivalent to .., just so we can refer to the parent 38 | lac fd 39 | sys write; s.inum; 8 40 | 41 | " Move into the new directory 42 | sys chdir; 8:0 43 | 44 | " Create a . link to us 45 | sys link; up; 9:0; dot 46 | 47 | " Create a .. link to the parent 48 | sys link; up; dot; dotdot 49 | 50 | " Try to make a system link; this may fail 51 | sys link; up; system; system 52 | 53 | " Now zero the i-num of the dummy entry 54 | lac fd 55 | sys seek; 0; 0 56 | lac fd 57 | sys write; zero; 1 58 | 59 | " Close the file and exit 60 | lac fd 61 | sys close 62 | sys exit 63 | 64 | noarg: 65 | " Print a "no arg" error and exit 66 | lac d1 67 | sys write; noargstr; 4 68 | sys exit 69 | noargstr: ; < a>; ; 012 70 | 71 | badfile: 72 | lac lac 017777 " Get the pointer to the new dirname 73 | dac 1f " Store it in 1f below 74 | lac d1 75 | sys write; 1:0; 4 " Write the name, max 4 words 76 | lac d1 " Then write " ?\n" 77 | sys write; 1f; 2 78 | sys exit " and exit 79 | 1: 040; 077012 " String literal: " ?\n" 80 | 81 | fd: 0 " File descriptor of the new directory 82 | zero: 0 83 | d1: 1 84 | d4: 4 85 | d5: 5 86 | o34: 034 " drw-- permission bits 87 | 88 | statbufptr: statbuf " Pointer to the statbuf 89 | statbuf: " Status buffer fields below 90 | s.perm: 0 91 | s.blk1: 0 92 | s.blk2: 0 93 | s.blk3: 0 94 | s.blk4: 0 95 | s.blk5: 0 96 | s.blk6: 0 97 | s.blk7: 0 98 | s.uid: 0 99 | s.nlinks: 0 100 | s.size: 0 101 | s.uniq: 0 102 | s.inum: 0 103 | up: ; 040040; 040040; 040040 104 | pad: 0; 0; 0 105 | dotdot: <..>; 040040; 040040; 040040 106 | dot: 056040; 040040; 040040; 040040 107 | system: ; ; ; 040040 108 | -------------------------------------------------------------------------------- /scans/st7.s: -------------------------------------------------------------------------------- 1 | "** 12-92-119.pdf page 26 2 | " space travel 7 3 | 4 | clistp = 017 5 | br0 = 040004 6 | br1 = 040005 7 | br2 = 040006 8 | br3 = 040007 9 | 10 | d10: 10 11 | d3: 3 12 | o246256: 0246256 13 | o253052: 0253052 14 | o246036: 0246036 15 | o177: 0177 16 | nplan: 32 17 | d1: 1 18 | d20: 20 19 | dm1: -1 20 | o141577: 0141577 21 | o161577: 0161577 22 | o164372: 0164372 23 | o114: 0114 24 | o20714: 020714 25 | d383: 383 26 | dm768: -768 27 | o145777: 0145777 28 | o165777: 0165777 29 | o7: 7 30 | o60: 060 31 | o55: 055 32 | o53: 053 33 | o41: 041 34 | o220000: 0220000 35 | d400: 400 36 | dm20: -20 37 | o40004: 040004 38 | 39 | fardst: 020;0200000; 0 40 | f2pi: 03;0311037;552421 41 | pid10: -01;0240662;756647 42 | thrs: 02;0200000;0 43 | f400: 011;0310000;0 44 | crash: -028;0200000;0 45 | stheta: 01;0200000;0 46 | ctheta: 0;0;0 47 | fpzero: 0;0;0 48 | scale: 0 49 | vscale: 6 50 | ascale: -1 51 | sdphi: -05;0253436;0700177 52 | cdphi: 000;0377743;0201725 53 | dhalt: 0400000 54 | fpone: 01;0200000;0 55 | 56 | 9: .=.+t 57 | horizv: .=.+3 58 | .pbson: .=.+1 59 | .pbsint: .=.+1 60 | dspflg: .=.+1 61 | par: .=.+1 62 | absi: .=.+1 63 | absx: .=.+3 64 | "** 12-92-119.pdf page 27 65 | absy: .=.+3 66 | v: .=.+3 67 | vv: .=.+3 68 | spx: .=.+3 69 | spy: .=.+3 70 | wx: .=.+3 71 | wy: .=.+3 72 | twx: .=.+3 73 | twy: .=.+3 74 | setx: .=.+1 75 | sety: .=.+1 76 | narcs: .=.+1 77 | nt: .=.+1 78 | inflg: .=.+1 79 | grvflg: .=.+1 80 | dtmp1: .=.+3 81 | dtmp2: .=.+3 82 | delx: .=.+1 83 | dely: .=.+1 84 | tsetx: .=.+1 85 | tsety: .=.+1 86 | accflg: .=.+1 87 | locpar: .=.+1 88 | crflg: .=.+1 89 | rpar: .=.+3 90 | dpar: .=.+3 91 | ax: .=.+3 92 | ay: .=.+3 93 | maxa: .=.+3 94 | maxj: .=.+1 95 | dcplan: .=.+1 96 | fcplan: .=.+1 97 | cplan: .=.+1 98 | shipx: .=.+3 99 | shipy: .=.+3 100 | x: .=.+3 101 | y: .=.+3 102 | ox: .=.+3 103 | oy: .=.+3 104 | lanflg: .=.+1 105 | goflg: .=.+1 106 | forflg: .=.+1 107 | bacflg: .=.+1 108 | sphi: .=.+3 109 | cphi: .=.+3 110 | ftmp1: .=.+3 111 | ftmp2: .=.+3 112 | locflg: .=.+3 113 | 114 | dsetx = 0140000 115 | dsety = 0164000 116 | vecx = 0120000 117 | vecy = 0124000 118 | m = 02000 119 | displist: 120 | 075057 "scale 1 intens 3 blink on lp 0 sym 0 121 | dsetx 800 122 | dsety 20 123 | dispcl: 124 | 0 125 | 060004 "intens 0 blink off 126 | "** 12-92-119.pdf page 28 127 | dsetx 0 128 | dsety 20 129 | namedsp: 130 | .=.+10 131 | dsetx 400 132 | dsety 20 133 | dssca: 134 | .=.+3 135 | 040040 "scale 0 136 | dsetx 127 137 | dsety 250 138 | vecx 768 139 | dsetx 895 140 | dsety 255 141 | vecy 768 142 | dsetx 895 143 | dsety 1023 144 | vecx m 768 145 | dsetx 127 146 | dsety 1023 147 | vecy m 768 148 | dsetx 127 149 | dsety 255 150 | vecx 768 151 | dsetx 511 152 | dsety 255 153 | vecy 767 154 | dsetx 127 155 | dsety 639 "[--- - scan markup] 156 | vecx 767 "[an arrow starts between vecx and dspl, it points to the right - scan markup] 157 | dspl: 158 | 0400000 159 | -------------------------------------------------------------------------------- /scans/t6.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 23 2 | rerm: 3 | jms aget 4 | jmp 1f 5 | rers: 6 | jms aget 7 | add frame 8 | 1:dac holdlv 9 | lac holdlv i 10 | jmp 2f 11 | rerv: 12 | jms aget 13 | lls 6 14 | lrs 6 15 | 2:dac nframe i 16 | isz nframe 17 | jmp goon 18 | 19 | rero: 20 | jms decnf 21 | dac rand1 22 | jms aget 23 | and o77 24 | add obranch 25 | dac 2f 26 | cma 27 | tad unary 28 | spa 29 | jmp 1f 30 | jms decnf 31 | dac rand2 32 | 1:lac rand1 33 | 2:xct 34 | jmp result 35 | 36 | obranch: 37 | xct .+1 38 | opr ;op=0400000+1 39 | jmp rorel ;le=op;op=op+1 40 | jmp rorel ;ne=op;op=op+1 41 | jmp rorel ;lt=op;op=op+1 42 | jmp rorel ;ge=op;op=op+1 43 | jmp rorel ;eq=op;op=op+1 44 | jmp rorel ;gt=op;op=op+1 45 | tad rand2 ;ad=op;op=op+1 46 | jms sub ;sb=op;op=op+1 47 | and rand2 ;an=op;op=op+1 48 | jmp roor ;or=op;op=op+1 49 | xor rand2 ;xo=op;op=op+1 50 | jmp rosr ;sr=op;op=op+1 51 | jmp rosl ;sl=op;op=op+1 52 | jmp romn ;mn=op;op=op+1 53 | jmp romx ;mx=op;op=op+1 54 | lac rand2 ;as=op;op=op+1 55 | 56 | opr ;pl=op;op=op+1 57 | jmp romi ;mi=op;op=op+1 58 | cma ;cm=op;op=op+1 59 | jmp roindir;indir=op;op=op+1 60 | lac holdlv ;addr=op;op=op+1 61 | unary:xct obranch+1+pl 62 | 63 | rorel: "<= 001 64 | 65 | "** 13-120-147.pdf page 24 66 | jms sub "!= 010 67 | sna "< 011 68 | jmp 2f ">= 100 69 | spa "= 101 70 | jmp 1f "> 110 71 | lac d1 "a>b, code 001 72 | jmp 3f 73 | 1:lac d2 "a= 0 38 | jmp readerror " Result was -ve, so error result 39 | sna " Skip if result was >0 40 | jmp fileend " Result was zero, so nothing left to read 41 | 42 | " Save the count of words read in 43 | dac 1f 44 | 45 | " Write five words from the buffer to the output file 46 | lac outfd 47 | sys write; buf; 1:0 48 | spa " Skip if result was >= 0 49 | jmp writeerror " Result was -ve, so error result 50 | 51 | " and loop back for more words to read 52 | jmp fileloop 53 | 54 | fileend: 55 | " Close the open file descriptors 56 | lac infd 57 | sys close 58 | lac outfd 59 | sys close 60 | sys exit 61 | 62 | " This code comes from the real cat.s 63 | badfile: 64 | lac name " Get the pointer to the filename 65 | dac 1f " Store it in 1f below 66 | lac d8 " Load fd 8 which is stderr 67 | sys write; 1:0; 4 " Write the name, max 4 words 68 | lac d8 " Then write " ?\n" 69 | sys write; 1f; 2 70 | sys exit " and exit 71 | 72 | 1: 040; 077012 " String literal: " ?\n" 73 | 74 | readerror: 75 | " Print an "err read" string on stderr and exit 76 | lac d8 77 | sys write; noreadstr; 5 78 | sys exit 79 | 80 | noreadstr: 81 | ;;;012000 82 | 83 | writeerror: 84 | " Print an "err write" string on stderr and exit 85 | lac d8 86 | sys write; nowritestr; 6 87 | sys exit 88 | 89 | nowritestr: 90 | ;;;;;;012000 100 | 101 | 102 | infd: 0 " fd of the input file 103 | outfd: 0 " fd of the output file 104 | d5: 5 105 | d9: 9 106 | d8: 8 " stderr seems to have fd 8 107 | d12: 12 108 | 109 | " Input buffer for read 110 | buf: .=.+64 111 | -------------------------------------------------------------------------------- /src/other/wktcat.s: -------------------------------------------------------------------------------- 1 | " Warren's cat program: cat [arg1 arg2 ...] 2 | 3 | main: 4 | " Load the pointer pointer in 017777 to see if we have any arguments 5 | lac 017777 i 6 | sad d4 " Skip if we have more than four argument words 7 | jmp stdinout " Only four argument words, so no arguments 8 | 9 | lac 017777 " Move five words past the argument word count 10 | tad d1 " so that AC points at the first argument 11 | tad d4 12 | 13 | " This section opens files and copies their contents to standard output 14 | catfiles: 15 | " We start with AC pointing to an argument. Save it at the "name" label 16 | dac name 17 | 18 | " Open the file and get the fd into AC 19 | sys open; name:0; 0; 20 | spa 21 | jmp badfile " Negative fd, exit with an error message 22 | dac fd " Save the file descriptor 23 | 24 | fileloop: 25 | " Read 64 words into the buffer from the input file 26 | lac fd 27 | sys read; buf; 64 28 | spa " Skip if result was >= 0 29 | jmp error " Result was -ve, so error result 30 | sna " Skip if result was >0 31 | jmp fileend " Result was zero, so nothing left to read 32 | 33 | " Save the count of words read in 34 | dac 1f 35 | 36 | " Write five words from the buffer to stdout 37 | lac d1 38 | sys write; buf; 1:0 39 | 40 | " and loop back for more words to read 41 | jmp fileloop 42 | 43 | fileend: 44 | " Close the open file descriptor 45 | lac fd 46 | sys close 47 | 48 | " Subtract 4 from the count of argument words 49 | -4 50 | tad 017777 i 51 | dac 017777 i 52 | sad d4 " Is the value 4, i.e. no args left? 53 | jmp end " Yes, so exit 54 | 55 | " Still an argument, so move up to the next filename argument 56 | lac name 57 | tad d4 58 | dac name 59 | jmp catfiles " and loop back to cat this file 60 | 61 | end: 62 | " exit 63 | sys exit 64 | 65 | " This section copies from standard input to standard output 66 | " We cheat by setting the fd value to zero and storing 8 67 | " into the argc word count, so that when the code hits 68 | " fileend, the word count drops to 4 and we exit. 69 | stdinout: 70 | lac d8 71 | dac 017777 i " Save 8 into the word count 72 | lac d0 73 | dac fd " Save file descriptor 0 74 | jmp fileloop 75 | 76 | " This code comes from the real cat.s 77 | badfile: 78 | lac name " Get the pointer to the filename 79 | dac 1f " Store it in 1f below 80 | lac d8 " Load fd 8 which is stderr 81 | sys write; 1:0; 4 " Write the name, max 4 words 82 | lac d8 " Then write " ?\n" 83 | sys write; 1f; 2 84 | sys exit " and exit 85 | 86 | 1: 040; 077012 " String literal: " ?\n" 87 | 88 | error: 89 | " Print an "err read" string on stderr and exit 90 | lac d8 91 | sys write; noreadstr; 5 92 | sys exit 93 | 94 | noreadstr: 95 | ;;;012000 96 | 97 | fd: 0 " fd of the open file 98 | d0: 0 " Constants 0, 1, 4 and 8 99 | d1: 1 100 | d4: 4 101 | d8: 8 " stderr seems to have fd 8 102 | minus4: 0777774 " Constant -4 103 | 104 | " Input buffer for read 105 | buf: .=.+64 106 | -------------------------------------------------------------------------------- /misc/urls.txt: -------------------------------------------------------------------------------- 1 | General PDP-7 info at: 2 | http://www.soemtron.org/pdp7.html 3 | 4 | a "macro7" cross-assembler at: 5 | https://github.com/simh/simtools/tree/master/crossassemblers/macro7 6 | 7 | The Evolution of the Unix Timesharing System at 8 | https://www.bell-labs.com/usr/dmr/www/hist.html 9 | 10 | PDP-7 stuff at Bitsavers 11 | http://bitsavers.trailing-edge.com/pdf/dec/pdp7/ 12 | Name Last modified Size Description 13 | DEC-07-SDDA-D_DECSYS7_Nov66.pdf 2009-12-27 21:50 1.5M 14 | DEC-7-I0-O_TTYpkg_Jan65.pdf 2009-12-27 21:50 221K 15 | DEC-7U-YXTA-D_DECTOG_Oct69.pdf 2009-12-27 21:50 337K 16 | DECSYS-7_OperMan.pdf 2009-12-27 21:50 1.4M 17 | DIGITAL-7-10-O_TTYoutputPkg.pdf 2009-12-27 21:50 215K 18 | DIGITAL-7-11-IO_TICTOC_Apr64.pdf 2009-12-27 21:50 446K 19 | DIGITAL-7-12-I_FFloader.pdf 2009-12-27 21:50 357K 20 | DIGITAL-7-12-I_FunnyFormat_Loader_Jan65.pdf 2009-12-27 21:50 339K 21 | DIGITAL-7-13-I_RIM_Loader_Jul65.pdf 2009-12-27 21:50 73K 22 | DIGITAL-7-20-IO-FB_DECTOG.pdf 2009-12-27 21:50 1.4M 23 | DIGITAL-7-21-IO-Sym_DECTREIVE.pdf 2009-12-27 21:50 633K 24 | DIGITAL-7-22A-IO_DECTAPE_Subrts_Jan66.pdf 2009-12-27 21:50 892K 25 | DIGITAL-7-30-A_FltPtPkg.pdf 2009-12-27 21:50 628K 26 | DIGITAL-7-31-F-Sym_SignedMult.pdf 2009-12-27 21:51 197K 27 | DIGITAL-7-40-U_MasterTapeDuplicator_Dec64.pdf 2009-12-27 21:51 252K 28 | DIGITAL-7-40-U_tapeDupl.pdf 2009-12-27 21:51 256K 29 | DIGITAL-7-42-U_RIM_Puncher_Sep62.pdf 2009-12-27 21:51 168K 30 | DIGITAL-7-50-M_ttyTest.pdf 2009-12-27 21:51 164K 31 | DIGITAL-7-51-M_ClockIntrTest_Nov62.pdf 2009-12-27 21:51 173K 32 | DIGITAL-7-52-M_CONTEST_II_May63.pdf 2009-12-27 21:51 518K 33 | DIGITAL-7-54-M_MAINDEC701_InstrTest_Mar66.pdf 2009-12-27 21:51 1.8M 34 | DIGITAL-7-55-M_MAINDEC_702R_ExtMemChkbd_May66.pdf 2009-12-27 21:51 576K 35 | DIGITAL-7-56-M_MAINDEC_703_MemAdrTest_Jul65.pdf 2009-12-27 21:51 210K 36 | DIGITAL-7-57-M_MAINDEC_710_PTP_Rdr_Aug65.pdf 2009-12-27 21:51 561K 37 | DIGITAL-7-60-N_Type34DisplayTest_Apr65.pdf 2009-12-27 21:51 767K 38 | DIGITAL-7-78-M_370LightPenDiag_Apr64.pdf 2009-12-27 21:51 843K 39 | DIGITAL-7-81-M_MAINDEC_712_PTP_Pun_Jul65.pdf 2009-12-27 21:51 497K 40 | DIGITAL-7-92-M_PDP-7_EAE_Part1_Mar66.pdf 2009-12-27 21:51 2.2M 41 | DIGITAL-7-93-U_DECTRIEVE-7_Dec65.pdf 2009-12-27 21:51 466K 42 | DIGITAL-7-94-U_DECTAPE_COPY_Jan66.pdf 2009-12-27 21:51 221K 43 | DIGITAL-7-95-U_ExecuteSubr_Jan66.pdf 2009-12-27 21:51 247K 44 | F-75P_PDP7prelimUM_Dec64.pdf 2009-12-27 21:52 5.5M 45 | F-75_PDP-7userHbk_Jun65.pdf 2009-12-27 21:52 11M 46 | F-77A_pdp7maint_1966.pdf 2009-12-27 21:53 17M 47 | MAINDEC-7-D1CC-D_extdMemTest_Nov69.pdf 2009-12-27 21:53 3.8M 48 | PDP-7_AsmMan.pdf 2009-12-27 21:53 1.6M 49 | PDP-7_BUS-PAK_II_Jan65.pdf 2009-12-27 21:53 3.5M 50 | PDP-7_Brochure.pdf 2009-12-27 21:53 1.3M 51 | PDP-7_DDT_Ref.pdf 2009-12-27 21:53 763K 52 | PDP-7_FortranII.pdf 2009-12-27 21:53 2.8M 53 | PDP-7_InterfMan.pdf 2009-12-27 21:54 3.3M 54 | PDP-7_Maint.pdf 2009-12-27 21:55 36M 55 | PDP-7_SymTapeEd.pdf 2009-12-27 21:55 1.0M 56 | PDP-7_brochure.zip 2009-12-27 21:55 6.5M 57 | PDP7_ProgramLibrList.pdf 2009-12-27 21:55 305K 58 | PDP7_appNote701.pdf 2009-12-27 21:55 91K 59 | -------------------------------------------------------------------------------- /src/cmd/bl.s: -------------------------------------------------------------------------------- 1 | "** 06-5-12.pdf page 3 2 | " bl 3 | 4 | jmp start 5 | 6 | .array: .+1 7 | s 2 8 | n 8 9 | n 7 10 | -1 11 | tad sp i 12 | cma 13 | tad lastv 14 | dac lastv 15 | lmq 16 | lac sp 17 | tad d1 18 | dac sp i 19 | isz sp 20 | lacq 21 | dac sp i 22 | isz sp 23 | jmp fetch 24 | 25 | .read: .+1 26 | s 2 27 | n 8 28 | n 7 29 | lac sp 30 | tad d1 31 | dac sp i 32 | isz sp 33 | jms getc 34 | dac sp i 35 | isz sp 36 | jmp fetch 37 | 38 | .write: .+1 39 | s 2 40 | n 8 41 | n 7 42 | lac sp i 43 | dac t1 44 | lrss 9 45 | jms putc 46 | lac t1 47 | jms putc 48 | jmp fetch 49 | 50 | .flush: .+1 51 | n 8 52 | n 7 53 | jms flush 54 | jmp fetch 55 | 56 | getc: 0 57 | lac iflg 58 | dzm iflg 59 | sza 60 | jmp getc i 61 | lac cibufp 62 | sad eibufp 63 | jmp 1f 64 | "** 06-5-12.pdf page 4 65 | lac cibufp i 66 | and o777 67 | dac iflg 68 | lac cibufp i 69 | isz cibufp 70 | lrss 9 71 | jmp getc i 72 | 1: 73 | lac .fin 74 | sys read; ibufp: ..; 64 75 | sna spa 76 | jmp 1f 77 | tad ibufp 78 | dac eibufp 79 | lac ibufp 80 | dac cibufp 81 | jmp getc+1 82 | 1: 83 | lac o4 84 | jmp getc i 85 | 86 | putc: 0 87 | and o777 88 | sna 89 | jmp putc i 90 | lmq 91 | lac oflg 92 | sza 93 | jmp 1f 94 | lacq 95 | alss 9 96 | dac cobufp i 97 | dac oflg 98 | jmp putc i 99 | 1: 100 | lac cobufp i 101 | omq 102 | dac cobufp i 103 | dac cobufp i 104 | dzm oflg 105 | isz cobufp 106 | lac cobufp 107 | sad eobufp 108 | skp 109 | jmp putc i 110 | lac .fout 111 | sys write; obufp: ..; 64 112 | lac obufp 113 | dac cobufp 114 | jmp putc i 115 | 116 | stop: 117 | jms flush 118 | las 119 | sma 120 | sys exit " XXX replaced for now: sys save 121 | sys exit 122 | 123 | flush: 0 124 | lac oflg 125 | sza 126 | "** 06-5-12.pdf page 5 127 | isz cobufp 128 | lac cobufp 129 | cma 130 | tad obufp 131 | cma 132 | sna 133 | jmp flush i 134 | dac 1f+1 135 | lac obufp 136 | dac 1f 137 | lac .fout 138 | sys write; 1: ..; .. 139 | lac obufp 140 | dac cobufp 141 | dzm oflg 142 | jmp flush i 143 | 144 | initio: 0 145 | lac 017777 i 146 | sad d4 147 | jmp 2f 148 | sad d8 149 | jmp 1f 150 | 151 | law 9 152 | tad 017777 153 | dac .+3 154 | law 017 155 | sys creat; .. 156 | spa 157 | jmp stop 158 | dac .fout 159 | 1: 160 | law 5 161 | tad 017777 162 | dac .+2 163 | sys open; ..; 0 164 | spa 165 | jmp stop 166 | dac .fin 167 | 2: 168 | lac lastv 169 | dac eibufp 170 | dac cibufp 171 | -64 172 | tad lastv 173 | dac lastv 174 | dac ibufp 175 | lac lastv 176 | dac eobufp 177 | -64 178 | tad lastv 179 | dac lastv 180 | dac obufp 181 | dac cobufp 182 | dzm oflg 183 | jmp initio i 184 | 185 | .fin: 0 186 | .fout: 1 187 | eibufp: 0 188 | "** 06-5-12.pdf page 6 189 | cibufp: 0 190 | iflg: 0 191 | eobufp: 0 192 | cobufp: 0 193 | oflg: 0 194 | lastv: 017770 195 | 196 | o777: 0777 197 | d4:o4: 4 198 | d8: 8 199 | -------------------------------------------------------------------------------- /src/cmd/t5.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 21 2 | char: " BUILTIN: match one char from bitset or fail. 3 | lac j 4 | dac jsav 5 | isz ii 6 | jms ctest 7 | jmp backup " not in bitset: restore j from jsav, fail 8 | jmp goon 9 | 10 | string: " BUILTIN: match zero or more chars from bitset 11 | isz ii 12 | jms ctest 13 | jmp goon " not in bitset, quit (but do not fail) 14 | jmp string+1 15 | 16 | ctest:0 17 | jms jget 18 | jms class; add ii i " bitset check w/ table ptr *ii 19 | jmp ctest i " char not in bitset, return w/o skip 20 | jms sbput " matched: add to symbuf 21 | lac j " increment j (char ptr) 22 | add o400000 23 | dac j 24 | isz ctest " give skip return 25 | jmp ctest i 26 | 27 | mark: " BUILTIN: clear symbuf 28 | jms jget " consume ignored characters 29 | dzm sbwrite 30 | jmp goon 31 | 32 | parsedo: " BUILTIN: invoke rule 33 | isz ii 34 | jms advance; jmp 3f " on retreat restore k 35 | jms advance; jmp 1f " on retreat switch to generation 36 | jms aget " get new instruction pointer 37 | dac ii 38 | jmp rinterp 39 | 40 | 1:lac frame " on retreat (second advance call) 41 | add refrsz 42 | dac ii " set instruction pointer to "nframe" 43 | sad nframe " was anything pushed onto nframe?? 44 | jmp retreat " no: retreat again. 45 | dac gflag " yes: set gflag (don't bundle on retreat) 46 | lac gefrsz 47 | dac dffrmsz " change (advance) frame size to generate size 48 | jms advance; jmp 2f " on retreat switch back to recognition mode 49 | jmp ginterp " interpret generate instructions! 50 | 51 | 2:lac refrsz " on retreat from generate mode 52 | dac dffrmsz " switch back to recognition sized frames 53 | add frame 54 | dac nframe " reset nframe pointer 55 | dzm gflag " clear gflag (resume bundling on retreat) 56 | jmp retreat " retreat (again)!! 57 | 58 | 3:jms s0get; add d.k " on retreat (first advance call) 59 | dac k " restore k from current frame 60 | jmp goon 61 | 62 | bundle: " BUILTIN: bundle results 63 | jms bundlep " get bundle of results (if more than one) 64 | 65 | "** 13-120-147.pdf page 22 66 | dac 9f+t 67 | sna " got any? 68 | jmp goon " nope. success. 69 | jms nframe0 " look for original nframe 70 | dac nframe " restore 71 | lac 9f+t " get bundle result ptr (in ktab if multi-word) 72 | dac nframe i " push @nframe 73 | isz nframe 74 | jmp goon 75 | t=t+1 76 | 77 | " jms between;add a; add b; skip if a<=ac;;;;;;; " ptr to rec. op names 51 | ;;; 52 | bugg:.+1;;;;;;;; " ptr to gen. op names 53 | " NOTE! ginterp ignores high bit of 54 | " opcode (to allow as char indicator 55 | " bit for gx instruction), but bug 56 | " routine does not, so table should 57 | " include two more entries??? 58 | 59 | o17:017 60 | o60:060 61 | o77:077 62 | o777:0777 63 | 64 | o417777:0417777 65 | o400000:0400000 66 | o740000:0740000 67 | o377700:0377700 68 | o17777:017777 69 | 70 | "** 13-120-147.pdf page 27 71 | o757777:0757777 72 | o600600:0600600 73 | 74 | " variables 75 | junk:0 76 | junk1:0 77 | 78 | output:1 79 | input:0 80 | 81 | stbit:st 82 | fibit:fi 83 | holdlv:0 84 | rand1:0 85 | rand2:0 86 | 87 | 88 | symwrite:0 89 | symbot: symtab 90 | symsiz = 500 91 | symmax:symsiz 92 | 93 | equwrite:0 94 | equread:0 95 | equ = equread 96 | equbot: equtab 97 | equsiz = 500 98 | equmax: equsiz 99 | delta: 2 100 | mdelta:0-2 101 | 102 | sbsiz=50 103 | sbmax:sbsiz 104 | sbwrite:0 105 | sbbot:sbbuf 106 | 107 | fflag:0 108 | gflag:0 109 | ignore:.+1;0400000;0;0;0;0;0;0;4 " pointer to ignored character set 110 | " default ignore set (NUL and DEL) 111 | " set stored using first (high) 16 of each wd. 112 | frame:rstack " frame pointer 113 | nframe:rstack+6 " next frame pointer 114 | env = ignore 115 | d.ii = d2 " frame offset for instruction pointer 116 | d.env = d3 " frame offset for env/ignore 117 | d.blkmod = d3 " SYMBOL NOT USED 118 | d.j = d4 " frame offset for saved j 119 | d.k = d5 " frame offset for saved k 120 | dffrmsz:6 " current frame size (one of [rg]efrsz) 121 | framsiz:4 " LOCATION NOT USED 122 | refrsz = d6 " recognition frame size 123 | gefrsz = d4 " generation frame size 124 | ii: start " interpreter instruction pointer 125 | k:0 " saved data (ktab) pointer 126 | 127 | rsiz = 500 " stack size 128 | rmax: rsiz " stack size as variable 129 | rbot:rstack " pointer to first stack entry 130 | rtop:rstack+rsiz " pointer to last stack entry 131 | 132 | owrite:0 " index into obuf 133 | obot:obuf " pointer to first word of output buffer 134 | osiz=64 " output buffer size 135 | -------------------------------------------------------------------------------- /scans/joshd-s1.s: -------------------------------------------------------------------------------- 1 | " S1 2 | 3 | .. = 0 4 | t = 0 5 | orig: 6 | hlt 7 | jmp pibreak 8 | 9 | . = orig+7 10 | -1 11 | 12 | . = orig+020 13 | 1f 14 | iof 15 | dac u.ac 16 | lac 020 17 | dac 1f 18 | lac 1f-1 19 | dac 020 20 | lac u.ac 21 | jmp 1f+1 22 | 1f 23 | 1: 0 24 | iof 25 | dac u.ac 26 | lacq 27 | dac u.mq 28 | lac 8 29 | dac u.rq 30 | lac 9 31 | dac u.rq+1 32 | jms copy; 10; u.rq+2; 6 33 | lac 1b 34 | dac u.rq+8 35 | -1 36 | dac .savblk 37 | dac .insys 38 | lac uquant 39 | jms betwen; d0; maxquant 40 | jms swap 41 | ion 42 | -1 43 | tad u.rq+8 44 | jms laci 45 | jms betwen; o20001; swn 46 | jmp badcal 47 | tad swp 48 | dac .+1 49 | jmp .. i 50 | 51 | . = orig+0100 52 | jmp coldentry 53 | jms halt 54 | 55 | okexit: 56 | dzm: u.ac 57 | sysexit: 58 | ion 59 | lac .savblk 60 | sza 61 | jmp 1f 62 | jms copy; sysdata; dskbuf; 64 63 | cla 64 | jms dskio; o7000 65 | 1: 66 | dzm .insys 67 | jms chkint 68 | skp 69 | jmp .save 70 | jms copy; u.rq+2; 10; 6 71 | lac u.rq+1 72 | dac 9 73 | lac u.rq 74 | dac 8 75 | lac u.rq 76 | lmq 77 | lac u.ac 78 | jmp u.rq+8 i 79 | 80 | swap: 0 81 | ion 82 | 1: 83 | jms lookfor; 3 " out/ready 84 | jmp 1f 85 | jms lookfor; 1 " in/ready 86 | skp 87 | jmp 1b 88 | dzm maxquant 89 | jmp 3f 90 | 1: 91 | dac 9f+t 92 | jms lookfor; 2 " in/notready 93 | jmp 1f 94 | jms lookfor; 1 " in/ready 95 | jmp 1f 96 | jmp 2f 97 | 1: 98 | lac swap 99 | dac u.swapret 100 | iof 101 | lac o200000 102 | tad u.ulistp i 103 | dac u.ulistp i 104 | ion 105 | jms dskswap; 07000 106 | lac u.dspbuf 107 | sna 108 | jmp 2f 109 | law dspbuf 110 | jms movdsp 111 | 2: 112 | iof 113 | lac o600000 114 | tad 9f+t i 115 | dac 9f+t i 116 | ion 117 | jms dskswap; 06000 118 | lac u.swapret 119 | dac swap 120 | lac o20 121 | dac maxquant 122 | lac u.dspbuf 123 | sza 124 | jms movdsp 125 | 3: 126 | dzn uquant 127 | iof 128 | jmp swap i 129 | t = t+1 130 | 131 | swp: 132 | jmp . 133 | .save; .getuid; .open; .read; .write; .creat; .seek; .tell 134 | .close; .link; .unlink; .setuid; .rename; .exit; .time; .intrp 135 | .chdir; .chmod; .chown; badcal; .syslog; badcal; .capt; .rels 136 | .status; badcal; .smes; .rmes; .fork 137 | swn: 138 | .=swp-1 i " ??? 139 | 140 | .intrp: 141 | lac u.ac 142 | dac u.intflg 143 | jmp okexit 144 | 145 | .sysloc: 146 | lac u.ac 147 | and o17777 148 | jms betwen; d1; locn 149 | jms error 150 | tad locsw 151 | dac .+1 152 | lac .. 153 | dac u.ac 154 | jmp sysexit 155 | 156 | locsw: 157 | lac . 158 | iget; inode; userdata; sysdata; copy; copy2; betwen; dksrd " ??? 159 | dskwr; dskbuf; dpdata; namei; pbsflgs; alloc; free; dscdata 160 | crdata 161 | locn: 162 | .=locsw-1 163 | 164 | chkint: 0 165 | lac .insys 166 | sza 167 | jmp chkint i 168 | lac .int1 169 | sna 170 | jmp 1f 171 | sad u.ofiles+2 172 | jmp 2f 173 | 1: 174 | lac .int2 175 | sna 176 | jmp chkint i 177 | sad u.ofiles+2 178 | skp 179 | jmp chkint i 180 | dzm .int2 181 | jmp 1f 182 | 2: 183 | dzm .int1 184 | 1: 185 | lac u.intflg 186 | sza 187 | jmp chkint i 188 | -1 189 | dac .insys 190 | ion 191 | isz chkint 192 | jmp chkint i 193 | 194 | 195 | 196 | -------------------------------------------------------------------------------- /scans/s1.s: -------------------------------------------------------------------------------- 1 | " S1 2 | 3 | .. = 0 4 | t = 0 5 | orig: 6 | hlt 7 | jmp pibreak 8 | 9 | . = orig+7 10 | -1 11 | 12 | . = orig+020 13 | 1f 14 | iof 15 | dac u.ac 16 | lac 020 17 | dac 1f 18 | lac 1f-1 19 | dac 020 20 | lac u.ac 21 | jmp 1f+1 22 | 1f 23 | 1: 0 24 | iof 25 | dac u.ac 26 | lacq 27 | dac u.mq 28 | lac 8 29 | dac u.rq 30 | lac 9 31 | dac u.rq+1 32 | jms copy; 10; u.rq+2; 6 33 | lac 1b 34 | dac u.rq+8 35 | -1 36 | dac .savblk 37 | dac .insys 38 | lac uquant 39 | jms betwen; d0; maxquant 40 | jms swap 41 | ion 42 | -1 43 | tad u.rq+8 44 | jms laci 45 | jms betwen; o20001; swn 46 | jmp badcal 47 | tad swp 48 | dac .+1 49 | jmp .. i 50 | 51 | . = orig+0100 52 | jmp coldentry 53 | jms halt 54 | 55 | okexit: 56 | dzm u.ac 57 | sysexit: 58 | ion 59 | lac .savblk 60 | sza 61 | jmp 1f 62 | jms copy; sysdata; dskbuf; 64 63 | cla 64 | jms dskio; 07000 65 | 1: 66 | dzm .insys 67 | jms chkint 68 | skp 69 | jmp .save 70 | jms copy; u.rq+2; 10; 6 71 | lac u.rq+1 72 | dac 9 73 | lac u.rq 74 | dac 8 75 | lac u.mq 76 | lmq 77 | lac u.ac 78 | jmp u.rq+8 i 79 | 80 | swap: 0 81 | ion 82 | 1: 83 | jms lookfor; 3 " out/ready 84 | jmp 1f 85 | jms lookfor; 1 " in/ready 86 | skp 87 | jmp 1b 88 | dzm maxquant 89 | jmp 3f 90 | 1: 91 | dac 9f+t 92 | jms lookfor; 2 " in/notready 93 | jmp 1f 94 | jms lookfor; 1 " in/ready 95 | jmp 1f 96 | jmp 2f 97 | 1: 98 | lac swap 99 | dac u.swapret 100 | iof 101 | lac o200000 102 | tad u.ulistp i 103 | dac u.ulistp i 104 | ion 105 | jms dskswap; 07000 106 | lac u.dspbuf 107 | sna 108 | jmp 2f 109 | law dspbuf 110 | jms movdsp 111 | 2: 112 | iof 113 | lac o600000 114 | tad 9f+t i 115 | dac 9f+t i 116 | ion 117 | jms dskswap; 06000 118 | lac u.swapret 119 | dac swap 120 | lac o20 121 | dac maxquant 122 | lac u.dspbuf 123 | sza 124 | "** 01-s1.pdf page 4 125 | jms movdsp 126 | 3: 127 | dzm uquant 128 | iof 129 | jmp swap i 130 | t = t+1 131 | 132 | swp: 133 | jmp . 134 | .save; .getuid; .open; .read; .write; .creat; .seek; .tell 135 | .close; .link; .unlink; .setuid; .rename; .exit; .time; .intrp 136 | .chdir; .chmod; .chown; badcal; .sysloc; badcal; .capt; .rele 137 | .status; badcal; .smes; .rmes; .fork 138 | swn: 139 | .-swp-1 i 140 | 141 | .intrp: 142 | lac u.ac 143 | dac u.intflg 144 | jmp okexit 145 | 146 | .sysloc: 147 | lac u.ac 148 | and o17777 149 | jms betwen; d1; locn 150 | jms error 151 | tad locsw 152 | dac .+1 153 | lac .. 154 | dac u.ac 155 | jmp sysexit 156 | 157 | locsw: 158 | lac . 159 | iget; inode; userdata; sysdata; copy; copyz; betwen; dskrd 160 | dskwr; dskbuf; dpdata; namei; pbsflgs; alloc; free; dspdata 161 | crdata 162 | locn: 163 | .-locsw-1 164 | 165 | chkint: 0 166 | lac .insys 167 | sza 168 | jmp chkint i 169 | lac .int1 170 | sna 171 | jmp 1f 172 | sad u.ofiles+2 173 | jmp 2f 174 | 1: 175 | lac .int2 176 | sna 177 | jmp chkint i 178 | sad u.ofiles+2 179 | skp 180 | jmp chkint i 181 | dzm .int2 182 | jmp 1f 183 | 2: 184 | dzm .int1 185 | 1: 186 | "** 01-s1.pdf page 5 187 | lac u.intflg 188 | sza 189 | jmp chkint i 190 | -1 191 | dac .insys 192 | ion 193 | isz chkint 194 | jmp chkint i 195 | 196 | -------------------------------------------------------------------------------- /scans/p2.s: -------------------------------------------------------------------------------- 1 | "** 10-36-55.pdf page 7 2 | " p2 3 | 4 | frict: 0 5 | las 6 | and d1 7 | sza 8 | jmp frict i 9 | lac ball1+vx 10 | cll; muls; frfac 11 | dac ball1+vx 12 | lac ball1+vy 13 | cll; muls; frfac 14 | dac ball1+vy 15 | gsm 16 | dac 9f+t 17 | lac ball1+vx 18 | gsm 19 | tad 9f+t 20 | tad minvx 21 | sma 22 | jmp frict i 23 | dzm ball1+vx 24 | dzm ball1+vy 25 | jmp frict i 26 | t = t+1 27 | 28 | ballball: 0 29 | llss 15 " x**2+y**2 in q 30 | cma 31 | tad o300000 32 | dac 1f; dac 2f 33 | lac ball2+y 34 | cma 35 | tad ball1+y 36 | cma 37 | cll; muls; 1:..; llss 6 38 | dac sin 39 | lac ball2+x 40 | cma 41 | tad ball1+x 42 | cma 43 | cll; muls; 2:..; llss 6 44 | dac cos 45 | 46 | " calculate closing velocities 47 | 48 | lac ball1+vx 49 | gsm 50 | dac .+3 51 | lac cos 52 | muls; ..; llss 3 53 | dac 9f+t 54 | lac ball1+vy 55 | gsm 56 | dac .+3 57 | lac sin 58 | muls; ..; llss 3 59 | tad 9f+t 60 | dac vp1 61 | 62 | lac ball2+vx 63 | gsm 64 | "** 10-36-55.pdf page 8 65 | dac .+3 66 | lac cos 67 | muls; ..; llss 3 68 | dac 9f+t 69 | lac ball2+vy 70 | gsm 71 | dac .+3 72 | lac sin 73 | muls; ..; llss 3 74 | tad 9f+t 75 | dac vp2 76 | cma 77 | tad vp1 78 | cma 79 | sma 80 | jmp ballball i 81 | 82 | " calculate tangential velocities 83 | 84 | lac ball1+vx 85 | gsm 86 | dac .+3 87 | lac sin 88 | muls; ..; llss 3 89 | dac 9f+t 90 | lac ball1+vy 91 | gsm 92 | dac .+3 93 | lac cos 94 | muls; ..; llss 3 95 | cma 96 | tad 9f+t 97 | cma 98 | dac vt1 99 | 100 | lac ball2+vx 101 | gsm 102 | dac .+3 103 | lac sin 104 | muls; ..; llss 3 105 | dac 9f+t 106 | lac ball2+vy 107 | gsm 108 | dac .+3 109 | lac cos 110 | muls; ..; llss 3 111 | cma 112 | tad 9f+t 113 | cma 114 | dac vt2 115 | 116 | " recalculate x,y velocities 117 | " with interchanged closing components 118 | 119 | lac vp2 120 | gsm 121 | dac .+3 122 | lac cos 123 | muls; ..; llss 3 124 | cma 125 | dac 9f+t 126 | "** 10-36-55.pdf page 9 127 | lac vt1 128 | gsm 129 | dac .+3 130 | lac sin 131 | muls; ..; llss 3 132 | tad 9f+t 133 | cma 134 | dac ball1+vx 135 | 136 | lac vp2 137 | gsm 138 | dac .+3 139 | lac sin 140 | muls; ..; llss 3 141 | dac 9f+t 142 | lac vt1 143 | gsm 144 | dac .+3 145 | lac cos 146 | muls; ..; llss 3 147 | tad 9f+t 148 | dac ball1+vy 149 | 150 | lac vp1 151 | gsm 152 | dac .+3 153 | lac cos 154 | muls; ..; llss 3 155 | cma 156 | dac 9f+t 157 | lac vt2 158 | gsm 159 | dac .+3 160 | lac sin 161 | muls; ..; llss 3 162 | tad 9f+t 163 | cma 164 | dac ball2+vx 165 | 166 | lac vp1 167 | gsm 168 | dac .+3 169 | lac sin 170 | muls; ..; llss 3 171 | dac 9f+t 172 | lac vt2 173 | gsm 174 | dac .+3 175 | lac cos 176 | muls; ..; llss 3 177 | tad 9f+t 178 | dac ball2+vy 179 | 180 | jmp ballball i 181 | t = t+1 182 | 183 | dump: 0 184 | lac o17 185 | sys creat; dmpname 186 | spa 187 | sys save 188 | "** 10-36-55.pdf page 10 189 | dac waitup 190 | sys write; qsin; 1 191 | lac waitup 192 | sys write; qcos; 1 193 | lac nballp 194 | cll; mul; bvsize 195 | lacq 196 | dac 0f 197 | lac waitup 198 | sys write; list; 0:.. 199 | lac waitup 200 | sys close 201 | jmp dump i 202 | 203 | restore: 0 204 | sys open; dmpname; 0 205 | spa 206 | sys save 207 | dac waitup 208 | sys read; qsin; 1 209 | lac waitup 210 | sys read; qcos; 1 211 | lac nballp 212 | cll; mul; bvsize 213 | lacq 214 | dac 0f 215 | lac waitup 216 | sys read; list; 0:.. 217 | sad 0b 218 | skp 219 | sys save 220 | lac waitup 221 | sys read; dump; 1 222 | sza 223 | sys save 224 | lac waitup 225 | sys close 226 | jmp restore i 227 | -------------------------------------------------------------------------------- /src/cmd/p2.s: -------------------------------------------------------------------------------- 1 | "** 10-36-55.pdf page 7 2 | " p2 3 | 4 | frict: 0 5 | las 6 | and d1 7 | sza 8 | jmp frict i 9 | lac ball1+vx 10 | cll; muls; frfac 11 | dac ball1+vx 12 | lac ball1+vy 13 | cll; muls; frfac 14 | dac ball1+vy 15 | gsm 16 | dac 9f+t 17 | lac ball1+vx 18 | gsm 19 | tad 9f+t 20 | tad minvx 21 | sma 22 | jmp frict i 23 | dzm ball1+vx 24 | dzm ball1+vy 25 | jmp frict i 26 | t = t+1 27 | 28 | ballball: 0 29 | llss 15 " x**2+y**2 in q 30 | cma 31 | tad o300000 32 | dac 1f; dac 2f 33 | lac ball2+y 34 | cma 35 | tad ball1+y 36 | cma 37 | cll; muls; 1:..; llss 6 38 | dac sin 39 | lac ball2+x 40 | cma 41 | tad ball1+x 42 | cma 43 | cll; muls; 2:..; llss 6 44 | dac cos 45 | 46 | " calculate closing velocities 47 | 48 | lac ball1+vx 49 | gsm 50 | dac .+3 51 | lac cos 52 | muls; ..; llss 3 53 | dac 9f+t 54 | lac ball1+vy 55 | gsm 56 | dac .+3 57 | lac sin 58 | muls; ..; llss 3 59 | tad 9f+t 60 | dac vp1 61 | 62 | lac ball2+vx 63 | gsm 64 | "** 10-36-55.pdf page 8 65 | dac .+3 66 | lac cos 67 | muls; ..; llss 3 68 | dac 9f+t 69 | lac ball2+vy 70 | gsm 71 | dac .+3 72 | lac sin 73 | muls; ..; llss 3 74 | tad 9f+t 75 | dac vp2 76 | cma 77 | tad vp1 78 | cma 79 | sma 80 | jmp ballball i 81 | 82 | " calculate tangential velocities 83 | 84 | lac ball1+vx 85 | gsm 86 | dac .+3 87 | lac sin 88 | muls; ..; llss 3 89 | dac 9f+t 90 | lac ball1+vy 91 | gsm 92 | dac .+3 93 | lac cos 94 | muls; ..; llss 3 95 | cma 96 | tad 9f+t 97 | cma 98 | dac vt1 99 | 100 | lac ball2+vx 101 | gsm 102 | dac .+3 103 | lac sin 104 | muls; ..; llss 3 105 | dac 9f+t 106 | lac ball2+vy 107 | gsm 108 | dac .+3 109 | lac cos 110 | muls; ..; llss 3 111 | cma 112 | tad 9f+t 113 | cma 114 | dac vt2 115 | 116 | " recalculate x,y velocities 117 | " with interchanged closing components 118 | 119 | lac vp2 120 | gsm 121 | dac .+3 122 | lac cos 123 | muls; ..; llss 3 124 | cma 125 | dac 9f+t 126 | "** 10-36-55.pdf page 9 127 | lac vt1 128 | gsm 129 | dac .+3 130 | lac sin 131 | muls; ..; llss 3 132 | tad 9f+t 133 | cma 134 | dac ball1+vx 135 | 136 | lac vp2 137 | gsm 138 | dac .+3 139 | lac sin 140 | muls; ..; llss 3 141 | dac 9f+t 142 | lac vt1 143 | gsm 144 | dac .+3 145 | lac cos 146 | muls; ..; llss 3 147 | tad 9f+t 148 | dac ball1+vy 149 | 150 | lac vp1 151 | gsm 152 | dac .+3 153 | lac cos 154 | muls; ..; llss 3 155 | cma 156 | dac 9f+t 157 | lac vt2 158 | gsm 159 | dac .+3 160 | lac sin 161 | muls; ..; llss 3 162 | tad 9f+t 163 | cma 164 | dac ball2+vx 165 | 166 | lac vp1 167 | gsm 168 | dac .+3 169 | lac sin 170 | muls; ..; llss 3 171 | dac 9f+t 172 | lac vt2 173 | gsm 174 | dac .+3 175 | lac cos 176 | muls; ..; llss 3 177 | tad 9f+t 178 | dac ball2+vy 179 | 180 | jmp ballball i 181 | t = t+1 182 | 183 | dump: 0 184 | lac o17 185 | sys creat; dmpname 186 | spa 187 | sys save 188 | "** 10-36-55.pdf page 10 189 | dac waitup 190 | sys write; qsin; 1 191 | lac waitup 192 | sys write; qcos; 1 193 | lac nballp 194 | cll; mul; bvsize 195 | lacq 196 | dac 0f 197 | lac waitup 198 | sys write; list; 0:.. 199 | lac waitup 200 | sys close 201 | jmp dump i 202 | 203 | restore: 0 204 | sys open; dmpname; 0 205 | spa 206 | sys save 207 | dac waitup 208 | sys read; qsin; 1 209 | lac waitup 210 | sys read; qcos; 1 211 | lac nballp 212 | cll; mul; bvsize 213 | lacq 214 | dac 0f 215 | lac waitup 216 | sys read; list; 0:.. 217 | sad 0b 218 | skp 219 | sys save 220 | lac waitup 221 | sys read; dump; 1 222 | sza 223 | sys save 224 | lac waitup 225 | sys close 226 | jmp restore i 227 | -------------------------------------------------------------------------------- /scans/nm.s: -------------------------------------------------------------------------------- 1 | "** 09-1-35.pdf page 31 2 | " nm 3 | 4 | lac 017777 i 5 | sad d4 6 | skp 7 | jmp 1f 8 | law n.out 9 | dac fname 10 | jmp 2f 11 | 1: 12 | lac 017777 13 | tad d1 14 | dac fname 15 | 16 | loop: 17 | lac 017777 i 18 | sad d4 19 | jmp done 20 | tad dm4 21 | dac 017777 i 22 | lac fname 23 | tad d4 24 | dac fname 25 | 2: 26 | law 012 27 | jms putc 28 | sys open; fname: 0; 0 29 | sma 30 | jmp 1f 31 | lac fname 32 | dac 2f 33 | lac d1 34 | sys write; 2: 0; 4 35 | lac d1 36 | sys write; mes; 2 37 | jmp loop 38 | mes: 39 | 040077; 012 40 | 41 | 1: 42 | lac d2 43 | sys read; buf; 3072 44 | cll; idiv; 6 45 | lacq 46 | dac size 47 | law o200000 48 | dac c2 49 | 50 | print: 51 | lac o200000 52 | dac c2 i 53 | dzm c2name 54 | -1 55 | tad size 56 | cma 57 | dac c1 58 | law buf 59 | dac c3 60 | lac o200000 61 | dac c2name 62 | 1: 63 | lac c3 i 64 | "** 09-1-35.pdf page 32 65 | cma 66 | tad c2name 67 | spa 68 | jmp 2f 69 | lac c3 i 70 | dac c2name 71 | lac c3 72 | dac c2 73 | 2: 74 | law 6 75 | tad c3 76 | dac c3 77 | isz c1 78 | jmp 1b 79 | lac c2name 80 | sad o200000 81 | skp 82 | jmp 1f 83 | lac d2 84 | sys close 85 | jmp loop 86 | 1: 87 | 88 | lac c2 89 | tad d3 90 | dac t 91 | lac i t 92 | sna 93 | jmp print 94 | isz t 95 | lac i t 96 | sna 97 | jmp print 98 | -1 99 | tad c2 100 | dac 8 101 | -4 102 | dac c3 103 | 1: 104 | lac 8 i 105 | lrss 9 106 | jms putc 107 | llss 9 108 | jms putc 109 | isz c3 110 | jmp 1b 111 | lac i t 112 | sad d3 113 | jmp undef 114 | sna 115 | jmp 1f 116 | law 0162 117 | skp 118 | 1: 119 | law 0141 120 | dac type 121 | law 040 122 | jms putc 123 | isz t 124 | lac i t 125 | lmq 126 | "** 09-1-35.pdf page 33 127 | -6 128 | dac c3 129 | 1: 130 | cla 131 | llss 3 132 | tad o60 133 | jms putc 134 | isz c3 135 | jmp 1b 136 | law 040 137 | jms putc 138 | lac type 139 | jms putc 140 | law 012 141 | jms putc 142 | jmp print 143 | undef: 144 | -8 145 | dac c3 146 | 1: 147 | law 040 148 | jms putc 149 | isz c3 150 | jmp 1b 151 | law 0165 152 | jms putc 153 | law 012 154 | jms putc 155 | jmp print 156 | 157 | done: 158 | lac noc 159 | sna 160 | sys exit 161 | and d1 162 | sna cla 163 | jmp 1f 164 | jms putc 165 | jmp done 166 | 1: 167 | lac noc 168 | rcr 169 | dac 1f 170 | lac fo 171 | sys write; iopt+1; 1:.. 172 | sys exit 173 | 174 | putc: 0 175 | and o777 176 | dac 2f+1 177 | lac opt 178 | dac 2f 179 | add o400000 180 | dac opt 181 | spa 182 | jmp 1f 183 | lac 2f i 184 | xor 2f+1 185 | jmp 3f 186 | 1: 187 | lac 2f+1 188 | "** 09-1-35.pdf page 34 189 | alss 9 190 | 3: 191 | dac 2f i 192 | isz noc 193 | lac noc 194 | sad d128 195 | skp 196 | jmp putc i 197 | lac fo 198 | sys write; iopt+1; 64 199 | lac iopt 200 | dac opt 201 | dzm noc 202 | jmp putc i 203 | 2: 0;0 204 | ipt: 0 205 | eipt: 0 206 | iipt: .+1; .=.+64 207 | fi: 0 208 | opt: .+2 209 | iopt: .+1; .=.+64 210 | noc: 0 211 | fo: 1 212 | 213 | c1: 0 214 | c2: 0 215 | c3: 0 216 | t: 0 217 | size: 0 218 | c2name: 0 219 | type: 0 220 | 221 | d1: 1 222 | d128: 128 223 | o200000: 0200000 224 | o777: 0777 225 | o400000: 0400000 226 | d2: 2 227 | d4: 4 228 | dm4: -4 229 | o60: 060 230 | d3: 3 231 | d6: 6 232 | n.out: 233 | 0156056;0157165;0164040;040040 234 | buf: 235 | -------------------------------------------------------------------------------- /src/cmd/nm.s: -------------------------------------------------------------------------------- 1 | "** 09-1-35.pdf page 31 2 | " nm 3 | 4 | lac 017777 i 5 | sad d4 6 | skp 7 | jmp 1f 8 | law n.out 9 | dac fname 10 | jmp 2f 11 | 1: 12 | lac 017777 13 | tad d1 14 | dac fname 15 | 16 | loop: 17 | lac 017777 i 18 | sad d4 19 | jmp done 20 | tad dm4 21 | dac 017777 i 22 | lac fname 23 | tad d4 24 | dac fname 25 | 2: 26 | law 012 27 | jms putc 28 | sys open; fname: 0; 0 29 | sma 30 | jmp 1f 31 | lac fname 32 | dac 2f 33 | lac d1 34 | sys write; 2: 0; 4 35 | lac d1 36 | sys write; mes; 2 37 | jmp loop 38 | mes: 39 | 040077; 012 40 | 41 | 1: 42 | lac d2 43 | sys read; buf; 3072 44 | cll; idiv; 6 45 | lacq 46 | dac size 47 | law o200000 48 | dac c2 49 | 50 | print: 51 | lac o200000 52 | dac c2 i 53 | dzm c2name 54 | -1 55 | tad size 56 | cma 57 | dac c1 58 | law buf 59 | dac c3 60 | lac o200000 61 | dac c2name 62 | 1: 63 | lac c3 i 64 | "** 09-1-35.pdf page 32 65 | cma 66 | tad c2name 67 | spa 68 | jmp 2f 69 | lac c3 i 70 | dac c2name 71 | lac c3 72 | dac c2 73 | 2: 74 | law 6 75 | tad c3 76 | dac c3 77 | isz c1 78 | jmp 1b 79 | lac c2name 80 | sad o200000 81 | skp 82 | jmp 1f 83 | lac d2 84 | sys close 85 | jmp loop 86 | 1: 87 | 88 | lac c2 89 | tad d3 90 | dac t 91 | lac i t 92 | sna 93 | jmp print 94 | isz t 95 | lac i t 96 | sna 97 | jmp print 98 | -1 99 | tad c2 100 | dac 8 101 | -4 102 | dac c3 103 | 1: 104 | lac 8 i 105 | lrss 9 106 | jms putc 107 | llss 9 108 | jms putc 109 | isz c3 110 | jmp 1b 111 | lac i t 112 | sad d3 113 | jmp undef 114 | sna 115 | jmp 1f 116 | law 0162 117 | skp 118 | 1: 119 | law 0141 120 | dac type 121 | law 040 122 | jms putc 123 | isz t 124 | lac i t 125 | lmq 126 | "** 09-1-35.pdf page 33 127 | -6 128 | dac c3 129 | 1: 130 | cla 131 | llss 3 132 | tad o60 133 | jms putc 134 | isz c3 135 | jmp 1b 136 | law 040 137 | jms putc 138 | lac type 139 | jms putc 140 | law 012 141 | jms putc 142 | jmp print 143 | undef: 144 | -8 145 | dac c3 146 | 1: 147 | law 040 148 | jms putc 149 | isz c3 150 | jmp 1b 151 | law 0165 152 | jms putc 153 | law 012 154 | jms putc 155 | jmp print 156 | 157 | done: 158 | lac noc 159 | sna 160 | sys exit 161 | and d1 162 | sna cla 163 | jmp 1f 164 | jms putc 165 | jmp done 166 | 1: 167 | lac noc 168 | rcr 169 | dac 1f 170 | lac fo 171 | sys write; iopt+1; 1:.. 172 | sys exit 173 | 174 | putc: 0 175 | and o777 176 | dac 2f+1 177 | lac opt 178 | dac 2f 179 | add o400000 180 | dac opt 181 | spa 182 | jmp 1f 183 | lac 2f i 184 | xor 2f+1 185 | jmp 3f 186 | 1: 187 | lac 2f+1 188 | "** 09-1-35.pdf page 34 189 | alss 9 190 | 3: 191 | dac 2f i 192 | isz noc 193 | lac noc 194 | sad d128 195 | skp 196 | jmp putc i 197 | lac fo 198 | sys write; iopt+1; 64 199 | lac iopt 200 | dac opt 201 | dzm noc 202 | jmp putc i 203 | 2: 0;0 204 | ipt: 0 205 | eipt: 0 206 | iipt: .+1; .=.+64 207 | fi: 0 208 | opt: .+2 209 | iopt: .+1; .=.+64 210 | noc: 0 211 | fo: 1 212 | 213 | c1: 0 214 | c2: 0 215 | c3: 0 216 | t: 0 217 | size: 0 218 | c2name: 0 219 | type: 0 220 | 221 | d1: 1 222 | d128: 128 223 | o200000: 0200000 224 | o777: 0777 225 | o400000: 0400000 226 | d2: 2 227 | d4: 4 228 | dm4: -4 229 | o60: 060 230 | d3: 3 231 | d6: 6 232 | n.out: 233 | 0156056;0157165;0164040;040040 234 | buf: 235 | -------------------------------------------------------------------------------- /scans/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Scans 4 | 5 | This area contains the OCR'd versions of the PDP-7 scans that are at: 6 | 7 | https://www.tuhs.org/Archive/Distributions/Research/McIlroy_v0/ 8 | 9 | The files should be unaltered versions of the scanned pages. 10 | 11 | Micro Focus owns the rights to the Unix source code, so these files are probably 12 | (c) 1970 Micro Focus. They are certainly not under the GPLv3 license. 13 | 14 | For modified versions of these files, look in src/cmds and src/sys. 15 | 16 | Details of the files: 17 | 18 | * s1.s: pages 2-5 of 01-s1.pdf 19 | * s2.s: pages 7-12 of 01-s1.pdf 20 | * s3.s: pages 14-19 of 01-s1.pdf 21 | * s4.s: pages 21-26 of 01-s1.pdf 22 | * s5.s: pages 28-32 of 01-s1.pdf 23 | * s6.s: pages 34-38 of 01-s1.pdf 24 | * s7.s: pages 41-46 of 01-s1.pdf 25 | * s8.s: pages 48-51 of 01-s1.pdf 26 | * s9.s: pages 53-55 of 01-s1.pdf 27 | * sysmap: pages 57-61 of 01-s1.pdf 28 | * sop.s pages 62-63 of 01-s1.pdf 29 | * maksys.s: page 64 of 01-s1.pdf 30 | * trysys.s: page 65 of 01-s1.pdf 31 | * scope.cas: pages 3-18 of 03-scope.pdf 32 | * cas.s: pages 1-8 of 04-cas.pdf 33 | * cas.cas: pages 9-17 of 04-cas.pdf 34 | * adm.s: pages 2-11 of 05-1-4.pdf 35 | * ald.s: pages 13-17 of 05-1-4.pdf 36 | * apr.s: pages 19-30 of 05-1-4.pdf 37 | * as.s: pages 32-48 of 05-1-4.pdf 38 | * bl.s: pages 3-6 of 06-5-12.pdf 39 | * bc.s: pages 7-11 of 06-5-12.pdf 40 | * bi.s: pages 12-19 of 06-5-12.pdf 41 | * cat.s: pages 21-23 of 06-5-12.pdf 42 | * check.s: pages 25-30 of 06-5-12.pdf 43 | * chown.s: pages 32-33 of 06-5-12.pdf 44 | * chmod.s: pages 35-36 of 06-5-12.pdf 45 | * cp.s: pages 38-39 of 06-5-12.pdf 46 | * chrm.s: page 41 of 06-5-12.pdf 47 | * db.s: pages 2-21 of 07-13-19.pdf 48 | * dmabs.s: pages 23-27 of 07-13-19.pdf 49 | * ds.s: pages 30-38 of 07-13-19.pdf 50 | * dsksav.s: page 40 of 07-13-19.pdf 51 | * dskres.s: page 41 of 07-13-19.pdf 52 | * dskio.s: pages 42-43 of 07-13-19.pdf 53 | * dsw.s: page 45 of 07-13-19.pdf 54 | * init.s: pages 47-51 of 07-13-19.pdf 55 | * ind.b: page 2 of 08-rest.pdf 56 | * lcase.b: page 4 of 08-rest.pdf 57 | * ed1.s: pages 7-20 of 08-rest.pdf 58 | * ed2.s: pages 21-29 of 08-rest.pdf 59 | * fop.s: pages 1-14 of 09-1-35.pdf 60 | * ln.s: pages 15-16 of 09-1-35.pdf 61 | * ls.s: pages 17-21 of 09-1-35.pdf 62 | * moo.s: pages 22-30 of 09-1-35.pdf 63 | * nm.s: pages 31-34 of 09-1-35.pdf 64 | * op.s: page 35 of 09-1-35.pdf and page 1 of 10-36-55.pdf 65 | * p1.s: pages 2-6 of 10-36-55.pdf 66 | * p2.s: pages 7-10 of 10-36-55.pdf 67 | * p3.s: pages 11-13 of 10-36-55.pdf 68 | * p4.s: pages 14-17 of 10-36-55.pdf 69 | * p5.s: pages 18-20 of 10-36-55.pdf 70 | * pd.s: page 1 of 11-56-91.pdf 71 | * psych.s: page 2-6 of 11-56-91.pdf 72 | * rm.s: page 7 of 11-56-91.pdf 73 | * rn.s: page 8 of 11-56-91.pdf 74 | * roff.s: pages 9-24 of 11-56-91.pdf 75 | * salv.s: pages 25-29 of 11-56-91.pdf 76 | * sh.s: pages 30-36 of 11-56-91.pdf 77 | * st1.s: pages 1-5 of 12-92-119.pdf 78 | * st2.s: pages 6-9 of 12-92-119.pdf 79 | * st3.s: pages 10-13 of 12-92-119.pdf 80 | * st4.s: pages 14-18 of 12-92-119.pdf 81 | * st5.s: pages 19-20 of 12-92-119.pdf 82 | * st6.s: pages 21-25 of 12-92-119.pdf 83 | * st7.s: pages 26-28 of 12-92-119.pdf 84 | * stat.s: pages 1-2 of 13-120-147.pdf 85 | * tm.s: pages 3-4 of 13-120-147.pdf 86 | * t1.s: pages 5-6 of 13-120-147.pdf 87 | * t2.s: pages 7-13 of 13-120-147.pdf 88 | * t3.s: pages 14-18 of 13-120-147.pdf 89 | * t4.s: pages 19-20 of 13-120-147.pdf 90 | * t5.s: pages 21-22 of 13-120-147.pdf 91 | * t6.s: pages 23-25 of 13-120-147.pdf 92 | * t7.s: pages 26-27 of 13-120-147.pdf 93 | * t8.s: pages 28 of 13-120-147.pdf 94 | * ttt1.s: pages 1-12 of 14-148-165.pdf 95 | * ttt2.s: pages 13-17 of 14-148-165.pdf 96 | * un.s: page 18 of 14-148-165.pdf 97 | -------------------------------------------------------------------------------- /scans/p1.s: -------------------------------------------------------------------------------- 1 | "** 10-36-55.pdf page 2 2 | " p1 3 | 4 | t = 0 5 | las 6 | dac .sw 7 | law 13 8 | sys sysloc 9 | dac .pb 10 | jms ballinit 11 | lac nballp 12 | cll; mul; bvsize 13 | lacq 14 | tad listpm1 15 | dac 15 16 | tad d1 17 | sys capt 18 | law outline-1 19 | dac 8 20 | -noutline 21 | dac 9f+t 22 | 1: 23 | lac 8 i 24 | dac 15 i 25 | isz 9f+t 26 | jmp 1b 27 | lac 15 28 | dac displist 29 | lac o400000 30 | dac 15 i 31 | jms dump 32 | 33 | loop: 34 | 35 | " dump/restore 36 | 37 | lac waitup 38 | sza 39 | jmp 2f 40 | lac .pb i 41 | als 5; ral 42 | snl 43 | jmp 1f 44 | jms dump 45 | jmp 3f 46 | 1: 47 | sma 48 | jmp 3f 49 | jms restore 50 | jmp 3f 51 | 2: 52 | lac .pb i 53 | als 5; ral 54 | szl 55 | jmp 3f 56 | spa 57 | jmp 3f 58 | dzm waitup 59 | 3: 60 | sys time 61 | lacq 62 | sad stime 63 | jmp loop 64 | "** 10-36-55.pdf page 3 65 | tad dm1 66 | sad stime 67 | jmp loop 68 | tad d1 69 | dac stime 70 | lac .pb i 71 | als 7 72 | spa 73 | sys exit 74 | 75 | lac displist 76 | dac 15 77 | 78 | -nball 79 | dac 9f+t 80 | 81 | " q and stich controls 82 | 83 | jms getball; ball1; 9f+t 84 | lac ball1+vx 85 | lmq 86 | lac ball1+vy 87 | omq 88 | sza 89 | jmp 1f 90 | jms stickcont 91 | jms putball; ball1; 9f+t 92 | 93 | 1: 94 | jms getball; ball1; 9f+t 95 | 96 | " if in pocket, ignore 97 | 98 | lac ball1+sflg 99 | spa 100 | jmp 4f 101 | lac 9 102 | dac 14 103 | 104 | " update 105 | 106 | lac ball1+vx 107 | lrss 6 108 | tad ball1+x 109 | and o177777 110 | dac ball1+x 111 | lac ball1+vy 112 | lrss 6 113 | tad ball1+y 114 | and o177777 115 | dac ball1+y 116 | 117 | " display 118 | 119 | lac ball1+x 120 | lrss 6 121 | xor o142000 " setx 122 | dac 15 i 123 | lac ball1+y 124 | lrss 6 125 | xor o164000 " sety 126 | "** 10-36-55.pdf page 4 127 | dac 15 i 128 | 129 | law circle-1 130 | dac 8 131 | -circsize 132 | dac 9f+t+1 133 | 2: 134 | lac 8 i 135 | dac 15 i 136 | isz 9f+t+1 137 | jmp 2b 138 | 139 | " degrade velocity 140 | jms frict 141 | 142 | " edge collision 143 | 144 | lac lefttest 145 | tad ball1+x 146 | sma 147 | jmp 2f 148 | jms pocketlr 149 | jmp 4f 150 | lac ball1+vx 151 | sma 152 | jmp 2f 153 | cma 154 | tad d1 155 | dac ball1+vx 156 | 2: 157 | lac bottest 158 | tad ball1+y 159 | sma 160 | jmp 2f 161 | jms pockettb 162 | jmp 4f 163 | lac ball1+vy 164 | sma 165 | jmp 2f 166 | cma 167 | tad d1 168 | dac ball1+vy 169 | 2: 170 | lac righttest 171 | tad ball1+x 172 | spa 173 | jmp 2f 174 | jms pocketlr 175 | jmp 4f 176 | lac ball1+vx 177 | spa 178 | jmp 2f 179 | cma 180 | tad d1 181 | dac ball1+vx 182 | 2: 183 | lac toptest 184 | tad ball1+y 185 | spa 186 | jmp 2f 187 | jms pockettb 188 | "** 10-36-55.pdf page 5 189 | jmp 4f 190 | lac ball1+vy 191 | spa 192 | jmp 2f 193 | cma 194 | tad d1 195 | dac ball1+vy 196 | 2: 197 | 198 | " ball/ball collision 199 | 200 | lac 9f+t 201 | tad d1 202 | sma 203 | jmp 4f 204 | dac 9f+t+1 205 | 206 | 2: 207 | lac 14 i 208 | dac ball2+0 209 | lac 14 i 210 | dac ball2+1 211 | lac 14 i 212 | dac ball2+2 213 | lac 14 i 214 | dac ball2+3 215 | lac 14 i 216 | dac ball2+4 217 | lac ball2+sflg 218 | spa 219 | jmp 3f 220 | lac ball1+x 221 | cma 222 | tad ball2+x 223 | cma 224 | lmq 225 | gsm 226 | dac .+3 227 | lacq 228 | muls; .. 229 | dac 9f+t+3 230 | lrss 4 231 | sza 232 | jmp 3f 233 | lac ball1+y 234 | cma 235 | tad ball2+y 236 | cma 237 | lmq 238 | gsm 239 | dac .+3 240 | lacq 241 | muls; .. 242 | tad 9f+t+3 243 | lrss 4 244 | sza 245 | jmp 3f 246 | jms ballball 247 | jms putball; ball2; 9f+t+1 248 | 3: 249 | isz 9f+t+1 250 | "** 10-36-55.pdf page 6 251 | jmp 2b 252 | 4: 253 | 254 | jms putball; ball1; 9f+t 255 | isz 9f+t 256 | jmp 1b 257 | 258 | lac o400000 259 | dac 15 i 260 | jmp loop 261 | t = t+3 262 | -------------------------------------------------------------------------------- /src/cmd/p1.s: -------------------------------------------------------------------------------- 1 | "** 10-36-55.pdf page 2 2 | " p1 3 | 4 | t = 0 5 | las 6 | dac .sw 7 | law 13 8 | sys sysloc 9 | dac .pb 10 | jms ballinit 11 | lac nballp 12 | cll; mul; bvsize 13 | lacq 14 | tad listpm1 15 | dac 15 16 | tad d1 17 | sys capt 18 | law outline-1 19 | dac 8 20 | -noutline 21 | dac 9f+t 22 | 1: 23 | lac 8 i 24 | dac 15 i 25 | isz 9f+t 26 | jmp 1b 27 | lac 15 28 | dac displist 29 | lac o400000 30 | dac 15 i 31 | jms dump 32 | 33 | loop: 34 | 35 | " dump/restore 36 | 37 | lac waitup 38 | sza 39 | jmp 2f 40 | lac .pb i 41 | als 5; ral 42 | snl 43 | jmp 1f 44 | jms dump 45 | jmp 3f 46 | 1: 47 | sma 48 | jmp 3f 49 | jms restore 50 | jmp 3f 51 | 2: 52 | lac .pb i 53 | als 5; ral 54 | szl 55 | jmp 3f 56 | spa 57 | jmp 3f 58 | dzm waitup 59 | 3: 60 | sys time 61 | lacq 62 | sad stime 63 | jmp loop 64 | "** 10-36-55.pdf page 3 65 | tad dm1 66 | sad stime 67 | jmp loop 68 | tad d1 69 | dac stime 70 | lac .pb i 71 | als 7 72 | spa 73 | sys exit 74 | 75 | lac displist 76 | dac 15 77 | 78 | -nball 79 | dac 9f+t 80 | 81 | " q and stich controls 82 | 83 | jms getball; ball1; 9f+t 84 | lac ball1+vx 85 | lmq 86 | lac ball1+vy 87 | omq 88 | sza 89 | jmp 1f 90 | jms stickcont 91 | jms putball; ball1; 9f+t 92 | 93 | 1: 94 | jms getball; ball1; 9f+t 95 | 96 | " if in pocket, ignore 97 | 98 | lac ball1+sflg 99 | spa 100 | jmp 4f 101 | lac 9 102 | dac 14 103 | 104 | " update 105 | 106 | lac ball1+vx 107 | lrss 6 108 | tad ball1+x 109 | and o177777 110 | dac ball1+x 111 | lac ball1+vy 112 | lrss 6 113 | tad ball1+y 114 | and o177777 115 | dac ball1+y 116 | 117 | " display 118 | 119 | lac ball1+x 120 | lrss 6 121 | xor o142000 " setx 122 | dac 15 i 123 | lac ball1+y 124 | lrss 6 125 | xor o164000 " sety 126 | "** 10-36-55.pdf page 4 127 | dac 15 i 128 | 129 | law circle-1 130 | dac 8 131 | -circsize 132 | dac 9f+t+1 133 | 2: 134 | lac 8 i 135 | dac 15 i 136 | isz 9f+t+1 137 | jmp 2b 138 | 139 | " degrade velocity 140 | jms frict 141 | 142 | " edge collision 143 | 144 | lac lefttest 145 | tad ball1+x 146 | sma 147 | jmp 2f 148 | jms pocketlr 149 | jmp 4f 150 | lac ball1+vx 151 | sma 152 | jmp 2f 153 | cma 154 | tad d1 155 | dac ball1+vx 156 | 2: 157 | lac bottest 158 | tad ball1+y 159 | sma 160 | jmp 2f 161 | jms pockettb 162 | jmp 4f 163 | lac ball1+vy 164 | sma 165 | jmp 2f 166 | cma 167 | tad d1 168 | dac ball1+vy 169 | 2: 170 | lac righttest 171 | tad ball1+x 172 | spa 173 | jmp 2f 174 | jms pocketlr 175 | jmp 4f 176 | lac ball1+vx 177 | spa 178 | jmp 2f 179 | cma 180 | tad d1 181 | dac ball1+vx 182 | 2: 183 | lac toptest 184 | tad ball1+y 185 | spa 186 | jmp 2f 187 | jms pockettb 188 | "** 10-36-55.pdf page 5 189 | jmp 4f 190 | lac ball1+vy 191 | spa 192 | jmp 2f 193 | cma 194 | tad d1 195 | dac ball1+vy 196 | 2: 197 | 198 | " ball/ball collision 199 | 200 | lac 9f+t 201 | tad d1 202 | sma 203 | jmp 4f 204 | dac 9f+t+1 205 | 206 | 2: 207 | lac 14 i 208 | dac ball2+0 209 | lac 14 i 210 | dac ball2+1 211 | lac 14 i 212 | dac ball2+2 213 | lac 14 i 214 | dac ball2+3 215 | lac 14 i 216 | dac ball2+4 217 | lac ball2+sflg 218 | spa 219 | jmp 3f 220 | lac ball1+x 221 | cma 222 | tad ball2+x 223 | cma 224 | lmq 225 | gsm 226 | dac .+3 227 | lacq 228 | muls; .. 229 | dac 9f+t+3 230 | lrss 4 231 | sza 232 | jmp 3f 233 | lac ball1+y 234 | cma 235 | tad ball2+y 236 | cma 237 | lmq 238 | gsm 239 | dac .+3 240 | lacq 241 | muls; .. 242 | tad 9f+t+3 243 | lrss 4 244 | sza 245 | jmp 3f 246 | jms ballball 247 | jms putball; ball2; 9f+t+1 248 | 3: 249 | isz 9f+t+1 250 | "** 10-36-55.pdf page 6 251 | jmp 2b 252 | 4: 253 | 254 | jms putball; ball1; 9f+t 255 | isz 9f+t 256 | jmp 1b 257 | 258 | lac o400000 259 | dac 15 i 260 | jmp loop 261 | t = t+3 262 | -------------------------------------------------------------------------------- /src/cmd/st3.s: -------------------------------------------------------------------------------- 1 | "** 12-92-119.pdf page 10 2 | " space travel 3 3 | 4 | updshp: 0 5 | lac forflg 6 | spa 7 | jmp .+4 8 | lac bacflg 9 | sma 10 | jmp 3f " if (forflg || bacflg) { 11 | fld; ascale " FAC = ascale 12 | lac forflg 13 | sma 14 | jmp 1f 15 | lac bacflg 16 | sma 17 | jmp 1f+1 18 | fld; fpzero " if (forflg && bacflg) FAC = 0 19 | jmp 2f 20 | 1: 21 | fng " if (!forflg) FAC = -FAC 22 | lac scale 23 | tad aexp 24 | dac aexp " FAC = FAC * 2**scale 25 | lac forflg 26 | sma 27 | jmp .+3 28 | 2: 29 | lac accflg "[arrow pointing here from the text "how to set?" - scan markup] 30 | sma 31 | jmp .+3 32 | fad; maxa " if (accflg) FAC += maxa 33 | fng " FAC = -FAC 34 | fst; ftmp1 35 | fmp; ctheta 36 | fad; ax 37 | fst; ax " ax += ftmp1 * ctheta 38 | fld; ftmp1 39 | fmp; stheta 40 | fad; ay 41 | fst; ay " ay += ftmp1 * stheta 42 | 3: " } 43 | fld; ox 44 | fng 45 | fad; ax 46 | fst; ftmp1 " ftmp1 = -ox + ax 47 | fld; x 48 | lac aexp 49 | tad d1 50 | dac aexp 51 | fad; ftmp1 52 | fst; ftmp1 " ftmp1 += x*2 53 | fld; x 54 | fst; ox " ox = x 55 | fld; ftmp1 56 | fst; x " x = ftmp1 57 | fld; oy 58 | fng 59 | fad; ay 60 | fst; ftmp1 " ftmp1 = -oy + ay 61 | fld; y 62 | lac aexp 63 | tad d1 64 | "** 12-92-119.pdf page 11 65 | dac aexp 66 | fad; ftmp1 67 | fst; ftmp1 " ftmp1 += y*2 68 | fld; y 69 | fst; oy " oy = y 70 | fld; ftmp1 71 | fst; y " y = ftmp1 72 | lac par 73 | sad maxj 74 | jmp i updshp " if (par == maxj) return 75 | jms absxy " absxy(par) 76 | jms shipxy " shipxy() 77 | lac par 78 | jms absv " absv(par) 79 | fld; ox 80 | fng 81 | fad; x 82 | fad; absx 83 | fst; ox " ox = -ox + x + absx 84 | fld; oy 85 | fng 86 | fad; y 87 | fad; absy 88 | fst; oy " oy = -oy + y + absy 89 | lac maxj 90 | dac par " par = maxj 91 | jms absv " absv(par) 92 | fld; ox 93 | fng 94 | fad; absx 95 | fst; ox " ox = -ox + absx 96 | fld; oy 97 | fng 98 | fad; absy 99 | fst; oy " oy = -oy + absy 100 | lac par 101 | jms absxy " absxy(par) 102 | fld; absx 103 | fad; shipx 104 | fng 105 | fst; x " x = -(absx + shipx) 106 | fad; ox 107 | fst; ox " ox += x 108 | fld; absy 109 | fad; shipy 110 | fng 111 | fst; y " y = -(absy + shipy) 112 | fadins: " fad instruction 113 | fad; oy 114 | fst; oy " oy += y 115 | lac par 116 | tad fppar 117 | dac 1f 118 | lac i 1f 119 | tad prsq 120 | dac 1f 121 | fld; 1:.. 122 | sqrt 123 | fst; rpar " rpar = sqrt(prsq[par]) 124 | jms dspsca " dspsca() 125 | lac par 126 | "** 12-92-119.pdf page 12 127 | jms dispname " dispname(par) 128 | jmp i updshp 129 | 130 | inscr: 0 " in screen 131 | fng 132 | fix " AC = (int) -FAC 133 | tad d383 " AC += 383 134 | spa 135 | jmp i inscr " if (AC < 0) return 136 | tad dm768 " AC -= 768 137 | sma " if (AC >= 0) return 138 | jmp i inscr 139 | isz inscr 140 | jmp i inscr " return AC 141 | 142 | absxy: 0 143 | sna 144 | jmp 7f " if (AC) { 145 | lmq 146 | lac fldins 147 | dac 2f-1 " C(2f-1) = fld 148 | dac 4f-1 " C(4f-1) = fld 149 | lacq 150 | 1: " while (true) { 151 | dac absi " absi = AC 152 | sna 153 | jmp i absxy " if (!absi) return 154 | tad fppar 155 | dac 9f+t 156 | lac i 9f+t 157 | 5: 158 | tad px 159 | dac 2f 160 | fldins: " fld instruction 161 | fld; absx 162 | fad; 2:.. 163 | fst; absx " if (i==0) absx = px[absi]; else absx += px[absi] 164 | lac i 9f+t 165 | 6: 166 | tad py 167 | dac 4f 168 | fld; absy 169 | fad; 4:.. 170 | fst; absy " if (i==0) absy = py[absi]; else absy += py[absi] 171 | lac fadins 172 | dac 2b-1 173 | dac 4b-1 174 | lac absi 175 | tad ppar 176 | dac 9f+t 177 | lac i 9f+t " AC = ppar[absi] 178 | jmp 1b " } 179 | 7: " } else { 180 | dzm absx " absx = 0 181 | dzm absx+1 182 | dzm absx+2 183 | dzm absy " absy = 0 184 | dzm absy+1 185 | dzm absy+2 186 | jmp i absxy " } 187 | "** 12-92-119.pdf page 13 188 | t = t+1 189 | -------------------------------------------------------------------------------- /src/sys/sop.s: -------------------------------------------------------------------------------- 1 | "** 01-s1.pdf page 62 2 | " sop 3 | 4 | dac = 0040000 " MEM: deposit AC 5 | jms = 0100000 " MEM: jump to subroutine 6 | dzm = 0140000 " MEM: deposit zero to memory 7 | lac = 0200000 " MEM: load AC 8 | xor = 0240000 " MEM: XOR with AC 9 | add = 0300000 " MEM: one's complement add 10 | tad = 0340000 " MEM: two's complement add 11 | xct = 0400000 " MEM: execute 12 | isz = 0440000 " MEM: increment and skip if zero 13 | and = 0500000 " MEM: AND 14 | sad = 0540000 " MEM: skip if AC different 15 | jmp = 0600000 " MEM: jump 16 | nop = 0740000 " OPR: no-op 17 | i = 020000 " indirect 18 | law = 0760000 " OPR: load accumulator with (instr) 19 | cma = 0740001 " OPR: complement AC 20 | las = 0750004 " OPR: load AC from switches 21 | ral = 0740010 " OPR: rotate AC left 22 | rar = 0740020 " OPR: rotate AC right 23 | hlt = 0740040 " OPR: halt 24 | sma = 0740100 " OPR: skip on minus AC 25 | sza = 0740200 " OPR: skip on zero AC 26 | snl = 0740400 " OPR: skip on non-zero link 27 | skp = 0741000 " OPR: skip unconditionally 28 | spa = 0741100 " OPR: skip on positive AC 29 | sna = 0741200 " OPR: skip on non-zero AC 30 | szl = 0741400 " OPR: skip on zero link 31 | rtl = 0742010 " OPR: rotate two left 32 | rtr = 0742020 " OPR: rotate two right 33 | cll = 0744000 " OPR: clear link 34 | rcl = 0744010 " OPR: clear link, rotate left 35 | rcr = 0744020 " OPR: clear link, rotate right 36 | cla = 0750000 " OPR: clear AC 37 | lrs = 0640500 " EAE: long right shift 38 | lrss = 0660500 " EAE: long right shift, signed 39 | lls = 0640600 " EAE: long left shift 40 | llss = 0660600 " EAE: long left shift, signed 41 | als = 0640700 " EAE: AC left shift 42 | alss = 0660700 " EAE: AC left shift, signed 43 | mul = 0653122 " EAE: multiply 44 | idiv = 0653323 " EAE: integer divide 45 | lacq = 0641002 " EAE: load AC with MQ 46 | clq = 0650000 " EAE: clear MQ 47 | omq = 0640002 " EAE: OR MQ into AC 48 | cmq = 0640004 " EAE: complement MQ 49 | lmq = 0652000 " EAE: load MQ from AC 50 | 51 | dscs = 0707141 " DSK: clear status register 52 | dslw = 0707124 " DSK: clear and load WC from AC 53 | dslm = 0707142 " DSK: clear and load MAC from AC 54 | dsld = 0707104 " DSK: clear and load TA and SA from AC 55 | dsls = 0707144 " DSK: load status 56 | dssf = 0707121 " DSK: skip on flags 57 | dsrs = 0707132 " DSK: read status register 58 | 59 | iof = 0700002 " PIC: interrupts off 60 | ion = 0700042 " PIC: interrupts on 61 | caf = 0703302 " CPU: clear all flags 62 | clon = 0700044 " CLK: clear flag, enable 63 | clsf = 0700001 " CLK: skip if overflow 64 | "** 01-s1.pdf page 63 65 | clof = 0700004 " CLK: clear flag, disable 66 | ksf = 0700301 " KBD: skip if flag set 67 | krb = 0700312 " KBD: read buffer 68 | tsf = 0700401 " TTY: skip if flag set 69 | tcf = 0700402 " TTY: clear flag 70 | tls = 0700406 " TTY: load buffer, select 71 | sck = 0704301 " G-2: skip on console keyboard 72 | cck = 0704304 " G-2: clear console keyboard 73 | lck = 0704312 " G-2: load console keyboard 74 | rsf = 0700101 " PTR: skip if flag set 75 | rsa = 0700104 " PTR: select alphanumeric mode 76 | rrb = 0700112 " PTR: clear flag, or read buffer 77 | psf = 0700201 " PTP: skip if flag set 78 | pcf = 0700202 " PTP: clear flag 79 | psa = 0700204 " PTP: alphanumeric mode 80 | cdf = 0700501 " G-2: clear display flags 81 | lds = 0701052 " G-2: load display status 82 | lda = 0701012 " G-2: load display address 83 | wcga = 0704206 " G-2: ??? 84 | raef = 0700742 " G-2: resume after edges flag 85 | rlpd = 0700723 " G-2: resume after light pen stop, disabled 86 | beg = 0700547 " G-2: begin 87 | spb = 0704401 " G-2: skip on push button flag 88 | cpb = 0704404 " G-2: clear push button flag 89 | lpb = 0704412 " G-2: load push buttons 90 | wbl = 0704424 " G-2: write button lights 91 | dprs = 0704752 " dataphone: read status 92 | dpsf = 0704741 " dataphone: skip on flag 93 | dpcf = 0704761 " dataphone: clear flag 94 | dprc = 0704712 " dataphone: read character 95 | crsf = 0706701 " CDR: skip if ready 96 | crrb = 0706712 " CDR: read buffer 97 | -------------------------------------------------------------------------------- /src/cmd/t4.s: -------------------------------------------------------------------------------- 1 | "** 13-120-147.pdf page 19 2 | " put symbuf symbol into table 3 | 4 | table: " BUILTIN 5 | lac equwrite " get equtab write index 6 | dac equ " save as last found 7 | jms between; add d0; add equmax 8 | jms halt " overflow 9 | add delta " increment 10 | dac equwrite " save as next to write 11 | lac equ " get our entry index 12 | add equbot " get our entry address 13 | tad m1 " decrement for pre-auto-increment 14 | dac 8 " save in auto-increment reg 15 | lac symwrite " get name index into symtab 16 | dac 8 i " save in equtab 17 | add symbot " get symtab addr 18 | dac 2f " save as move dest 19 | lac mdelta " get negative equtab entry word count 20 | 1:dzm 8 i " zero equtab word 21 | tad d1 " increment count 22 | spa " positive? 23 | jmp 1b " no, loop and zero another 24 | lac sbbot " yes, get symbuf base 25 | jms move " copy string into symtab (string table) 26 | 2:0 27 | add o400000 " increment char addr 28 | cma 29 | add symbot 30 | cma 31 | add o400000 32 | and o17777 33 | dac symwrite " save new symtab write pointer 34 | jms between; add d0; add symmax 35 | jms halt " symtab overflow 36 | jmp goon " success 37 | 38 | " find occurrence of symbuf symbol in equtab 39 | 40 | prev: " BUILTIN 41 | lac equ " last entry found/created 42 | jmp find+1 " start search 43 | find: " BUILTIN 44 | lac equwrite " get end index to equ table 45 | dac 9f+t " save 46 | lac o777 " get EOS 47 | jms sbput " append to sbbuf 48 | lac sbbot " get sbbuf base 49 | dac 2f " stash as "comp" argument 2 (loop invariant) 50 | 1:lac 9f+t " get equbuf index 51 | tad mdelta " decrement (by two) 52 | dac 9f+t " save 53 | spa " still positive? 54 | jmp nuts " no: return failure 55 | add equbot " turn into equbuf pointer 56 | dac junk " save as temp 57 | lac junk i " get symtab entry offset 58 | add symbot " get symtab entry address 59 | jms comp " compare 60 | 2:0 " compare arg2 here 61 | jmp 1b " non-skip return: continue 62 | lac 9f+t " skipped: get offset 63 | dac equ " save as last found 64 | 65 | "** 13-120-147.pdf page 20 66 | jmp goon " success! 67 | t=t+1 "next equtab location to test 68 | 69 | sbput:0 " put character in AC into symbuf (sbbuf) 70 | lmq " save character in MQ 71 | lac sbwrite " get sbbut write index 72 | add sbbot " add to start of sbbuf 73 | dac 1f " save as dchar dest 74 | lacq " get char back 75 | jms dchar " save 76 | 1:0 77 | lac sbwrite " get sbbuf write index 78 | add o400000 " increment 79 | dac sbwrite " save back 80 | jms cbetween; add d0; add sbmax 81 | jms halt " sbbuf overflow 82 | jmp sbput i 83 | 84 | getname: " BUILTIN 85 | lac equ " get last entry index 86 | add equbot " get equtab addr (addr of pointer to string) 87 | dac 9f+t " save in temp 88 | lac 1f " get "gf" instruction 89 | jms twoktab; lac 9f+t i " make 2-work ktab entry (does not return) 90 | 91 | 1:gf .+1 x " jump to native code & exit 92 | lac ii " get instruction pointer 93 | dac 8 " save in auto-pre-increment reg 8 94 | lac 8 i " fetch next word (symtab index) 95 | add symbot " make pointer into symtab 96 | and o17777 " get just address 97 | jms obuild " send to output 98 | jmp ggoon " success 99 | t=t+1 "equtable entry 100 | 101 | " puts double word entries in ktab and gives 102 | "pointer to first as result 103 | " takes first word (addr for gk instr) in AC 104 | " and indirect load instr after "jms twoktab" 105 | " Called (as final action) by builtins (symoct,octal,getname) 106 | " DOES NOT RETURN!!! 107 | twoktab:0 108 | jms kput " save AC in ktab 109 | lac l.gk 110 | add k " make gk intruction, pointing to new entry 111 | dac nframe i " push onto nframe 112 | isz nframe 113 | xct twoktab i " execute lac i instruction after "jms twoktab" 114 | jms kput " save in ktab as second word 115 | jmp goon " success 116 | -------------------------------------------------------------------------------- /scans/joshd-s8.s: -------------------------------------------------------------------------------- 1 | " s8 2 | 3 | " manifests 4 | mnproc = 10 5 | dspbss = 270 6 | ndskbs = 4 7 | 8 | " flags 9 | .insys: 0 10 | .int1: 0 11 | .int2: 0 12 | .ac: 0 13 | .savnlk: 0 14 | .dsptm: 0 15 | .dskb: 0 16 | .dske: 0 17 | 18 | " pointers 19 | tadu: tad ulist 20 | dacu: dac ulist 21 | maxquant: 30 22 | ofilesp: u.ofiles 23 | idskpp: i.dskps 24 | dskbufp: dskbuf 25 | edspbuf: dspbuf+dspbsz 26 | dspbufp3: dspbuf+3 27 | fblksp: s.fblks 28 | dacq1: dac q1 29 | lacq1: lac q1 30 | q2p: q2 31 | 32 | " strings 33 | initf: 34 | n;t;< > ;< > " 35 | 36 | " constants 37 | d0: 0 38 | d1: 1 39 | d2: 2 40 | d3: 3 41 | d4: 4 42 | d5: 5 43 | d6: 6 44 | d7: o7: 07 45 | d8: 8 46 | d9: 9 47 | o12: d10: 10 48 | o14: 014 49 | o15: 015 50 | o17: 017 51 | o20: 020 52 | o33: 033 53 | o40: 040 54 | o55: 055 55 | o77: 077 56 | d65:o101: 0101 57 | d33: 33 58 | o132: 0132 59 | o134: 0134 60 | o137: 0137 61 | o155: 0155 62 | o177: 0177 63 | o212: 0212 64 | o375: 0375 65 | o777: 0777 66 | o2000: 02000 67 | o4000: 04000 68 | d7999: 7999 69 | o10000: 010000 70 | o17762: 017762 71 | o17777: 017777 72 | o20001: 020001 73 | o40000: 040000 74 | o40001: 040001 75 | o70000: 070000 76 | o77777: 077777 77 | o100000: 0100000 78 | o140000: 0140000 79 | o200000: 0200000 80 | o200001: 0200001 81 | o300000: 0300000 82 | o300001: 0300001 83 | o400000: 0400000 84 | o500000: 0500000 85 | o577777: 0577777 86 | o600000: 0600000 87 | o640000: 0640000 88 | o700000: 0700000 89 | o777700: 0777700 90 | o777760: 0777760 91 | dm3: -3 92 | dm1: -1 93 | 94 | 9: .=.+t 95 | c1: .=.+1 96 | q1: q2;q2+98 " ??? 97 | .=.+14 98 | q2: 99 | .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 100 | .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 101 | .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 102 | .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 103 | .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;0;0 104 | dsploc: .=.+1 105 | dspino: .=.+1 106 | dspbuf: 107 | 0065057;0147740;0160000 108 | . = .+30 109 | coldentry: 110 | dzm 0100 " not re-entrant 111 | caf 112 | ion 113 | clon 114 | law 3072 115 | wcga 116 | jms dspinit 117 | law dspbuf 118 | jms movdsp 119 | cla 120 | jms dskio; 06000 121 | jms copy; dskbuf; sysdata; ulist-sysdata 122 | lac d3 123 | jms namei; initf 124 | jms halt 125 | jms iget 126 | cla 127 | jms iread; 4096; 4096 128 | jmp 4096 129 | . = dspbuf + dspbsz+3 130 | dskbuf = 07700 131 | dskbs: .=.+65+65+65+65 132 | edskbsp: . 133 | uquant: .=.+1 134 | dspbufp: .=.+1 135 | pbsflgs: .=.+2 136 | mode: .=.+1 137 | nttychar: .=.+1 138 | npptchar: .=.+1 139 | ttydelay: .=.+1 140 | name: .=.+4 141 | lnkaddr: .=.+1 142 | char: .=.+1 143 | dskaddr: .=.+1 144 | uniqpid: 1 145 | lu: .=.+4 146 | sfiles: .=.+10 147 | dpdata: 148 | dpstat: .=.+1 149 | dpread: .=.+1 150 | dpwrite: .=.+1 151 | dpchar: .=.+1 152 | dspdata: 153 | .dspb: .=.+1 154 | .lpba: .=.+1 " 4 155 | crdata: 156 | crread: .=.+1 157 | crchar: .=.+1 158 | sysdata: 159 | s.nxfblk: .=.+1 160 | s.nfblks: .=.+1 161 | s.fblks: .=.+10 162 | s.uniq: .=.+1 163 | s.tim: .=.+2 164 | ulist: 165 | 0131000;1;0;0 166 | 0031040;0;0;0 167 | 0031100;0;0;0 168 | 0031140;0;0;0 169 | 0031200;0;0;0 170 | 0031240;0;0;0 171 | 0031300;0;0;0 172 | 0031340;0;0;0 173 | 0031400;0;0;0 174 | 0031440;0;0;0 175 | userdata: 176 | u.ac: 0 177 | u.mq: 0 178 | u.rg: .=.+9 179 | u.uid: -1 180 | u.pid: 1 181 | u.cdir: 3 182 | u.ulistp: ulist 183 | u.swapret: 0 184 | u.base: 0 185 | u.count: 0 186 | u.limit: 0 187 | u.ofiles: .=.+30 188 | u.dspbuf: 0 189 | u.intflg: 1 190 | .=userdata+64 191 | ii: .=.+1 192 | inode: 193 | i.flags: .=.+1 194 | i.dskps: .=.+7 195 | i.uid: .=.+1 196 | i.nlks: .=.+1 197 | i.size: .=.+1 198 | . = inode+12 199 | di: .=.+1 200 | dnode: 201 | d.i: .=.+1 202 | d.name: .=.+4 203 | d.uniq: .=.+1 204 | . = dnode+8 205 | fnode: 206 | f.flags: .=.+1 207 | f.badd: .=.+1 208 | f.i: 0 209 | 210 | -------------------------------------------------------------------------------- /src/cmd/st7.s: -------------------------------------------------------------------------------- 1 | "** 12-92-119.pdf page 26 2 | " space travel 7 3 | 4 | clistp = 017 5 | br0 = 040004 " intens 0 6 | br1 = 040005 " intens 1 7 | br2 = 040006 " intens 2 8 | br3 = 040007 " intens 3 9 | 10 | d10: 10 11 | d3: 3 12 | o246256: 0246256 " incr n=1 dir=1 (NE), n=2 dir=6 (W) 13 | o253052: 0253052 " incr n=2 dir=4 (S), n=2 dir=2 (E) 14 | o246036: 0246036 " incr n=1 dir=0 (N), n=1 dir=6 (W) 15 | o177: 0177 " 7-bit mask (127) 16 | nplan: 32 " number of planets 17 | d1: 1 18 | d20: 20 19 | dm1: -1 20 | o141577: 0141577 " dsetx 895 (view right) 21 | o161577: 0161577 " dsetx (delay) 895 (view right) 22 | o164372: 0164372 " dsety (delay) 250 (view bottom) 23 | o114: 0114 " ascii L 24 | o20714: 020714 " ascii "CL" 25 | d383: 383 " 895 (view right) - 512 (scope width / 2) 26 | dm768: -768 " 127 (view left) - 895 (view right) 27 | o145777: 0145777 " dsety 1023 (view top) 28 | o165777: 0165777 " dsety (delay) 1023 (view top) 29 | o7: 7 30 | o60: 060 31 | o55: 055 32 | o53: 053 33 | o41: 041 34 | o220000: 0220000 " short vec vis 35 | d400: 400 36 | dm20: -20 37 | o40004: 040004 38 | 39 | fardst: 020;0200000; 0 " fardst = 32768 40 | f2pi: 03;0311037;552421 " 2 * pi, missing octal prefix 41 | pid10: -01;0240662;756647 " pi / 10, missing octal prefix 42 | thrs: 02;0200000;0 " threshold = 2.0 43 | f400: 011;0310000;0 44 | crash: -028;0200000;0 " crash ~ 0 45 | stheta: 01;0200000;0 46 | ctheta: 0;0;0 47 | fpzero: 0;0;0 48 | scale: 0 49 | vscale: 6 50 | ascale: -1 " loaded as a float = -1;0777773;0253436 ~ -0.5 51 | sdphi: -05;0253436;0700177 " sin(1.2 deg) 52 | cdphi: 000;0377743;0201725 " cos(1.2 deg) 53 | dhalt: 0400000 54 | fpone: 01;0200000;0 55 | 56 | 9: .=.+t 57 | horizv: .=.+3 " horizontal velocity 58 | .pbson: .=.+1 59 | .pbsint: .=.+1 60 | dspflg: .=.+1 61 | par: .=.+1 " current planet 62 | absi: .=.+1 63 | absx: .=.+3 64 | "** 12-92-119.pdf page 27 65 | absy: .=.+3 66 | v: .=.+3 67 | vv: .=.+3 68 | spx: .=.+3 " screen position x 69 | spy: .=.+3 " screen position y 70 | wx: .=.+3 71 | wy: .=.+3 72 | twx: .=.+3 73 | twy: .=.+3 74 | setx: .=.+1 75 | sety: .=.+1 76 | narcs: .=.+1 " number of arcs 77 | nt: .=.+1 78 | inflg: .=.+1 79 | grvflg: .=.+1 " gravity flag 80 | dtmp1: .=.+3 81 | dtmp2: .=.+3 82 | delx: .=.+1 83 | dely: .=.+1 84 | tsetx: .=.+1 85 | tsety: .=.+1 86 | accflg: .=.+1 87 | locpar: .=.+1 88 | crflg: .=.+1 " crash landing flag 89 | rpar: .=.+3 " planet radius 90 | dpar: .=.+3 " distance to planet 91 | ax: .=.+3 92 | ay: .=.+3 93 | maxa: .=.+3 " strongest gravity acceleration 94 | maxj: .=.+1 " index of planet with strongest gravity 95 | dcplan: .=.+1 96 | fcplan: .=.+1 " floating point count planet (float index) 97 | cplan: .=.+1 " count planet (index) 98 | shipx: .=.+3 99 | shipy: .=.+3 100 | x: .=.+3 " x position relative to planet 101 | y: .=.+3 " y position relative to planet 102 | ox: .=.+3 103 | oy: .=.+3 104 | lanflg: .=.+1 " landing flag 105 | goflg: .=.+1 " game over flag 106 | forflg: .=.+1 " forward flag 107 | bacflg: .=.+1 " backward flag 108 | sphi: .=.+3 109 | cphi: .=.+3 110 | ftmp1: .=.+3 111 | ftmp2: .=.+3 112 | locflg: .=.+3 113 | 114 | dsetx = 0140000 115 | dsety = 0164000 116 | vecx = 0120000 117 | vecy = 0124000 118 | m = 02000 119 | displist: " display list 120 | 075057 "scale 1 intens 3 blink on lp 0 sym 0 121 | dsetx 800 122 | dsety 20 123 | dispcl: " display L/CL 124 | 0 125 | 060004 "intens 0 blink off 126 | "** 12-92-119.pdf page 28 127 | dsetx 0 128 | dsety 20 129 | namedsp: " display name 130 | .=.+10 131 | dsetx 400 132 | dsety 20 133 | dssca: " display scale 134 | .=.+3 135 | 040040 "scale 0 136 | dsetx 127 137 | dsety 250 138 | vecx 768 139 | dsetx 895 140 | dsety 255 141 | vecy 768 142 | dsetx 895 143 | dsety 1023 144 | vecx m 768 145 | dsetx 127 146 | dsety 1023 147 | vecy m 768 148 | dsetx 127 149 | dsety 255 150 | vecx 768 151 | dsetx 511 152 | dsety 255 153 | vecy 767 154 | dsetx 127 155 | dsety 639 "[--- - scan markup] 156 | vecx 767 "[an arrow starts between vecx and dspl, it points to the right - scan markup] 157 | dspl: " display planets 158 | 0400000 159 | --------------------------------------------------------------------------------