* [TUHS] Possible Assembly UNIX Kernel Images (s1-bits cunix/wunix)?
@ 2026-01-16 22:06 segaloco via TUHS
2026-01-16 22:11 ` [TUHS] " Briam Rodriguez via TUHS
2026-01-17 0:59 ` Yufeng Gao via TUHS
0 siblings, 2 replies; 7+ messages in thread
From: segaloco via TUHS @ 2026-01-16 22:06 UTC (permalink / raw)
To: The Eunuchs Hysterical Society
Hello everyone, I've been picking back up on some of my V2/V3 era
reverse engineering efforts, picking through stuff from the Dennis_Tapes
archive, and I came across something I don't think I've seen discussed.
On the s1 tape, which we've yoinked a lot of V3 userland sources from,
there are files cunix and wunix. Upon some disassembly and inspection,
I believe these may be assembly UNIX kernels, although I haven't dug
around too much to see what version they match most closely. Here are
some findings that support my suspicions:
- Both files begin with a 407 magic number, making them V2 a.out
binaries.
- Both begin with a branch that jumps over a few things then calls a
subroutine. That subroutine matches "copyz" from u3.s in the scanned
V1 kernel description from BTL. Indeed this jump in that kernel is also
to copyz.
Of course, this is only the first few bits executed, but I would be
surprised to find such a close match elsewhere in the system. I do this
sort of analysis on old video game code all the time, so I feel pretty
confident in identifying these as possible assembly-era kernels.
Anyone dug around in these before? These should be PDP-11/20 kernels as
I'm finding plenty of EAE references, just like the s2-bits V2 binaries.
What I'm hoping to find here are bits that might indicate KS11 support,
what with the recent chit chat about KS11 in the V2 kernel.
- Matt G.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [TUHS] Re: Possible Assembly UNIX Kernel Images (s1-bits cunix/wunix)?
2026-01-16 22:06 [TUHS] Possible Assembly UNIX Kernel Images (s1-bits cunix/wunix)? segaloco via TUHS
@ 2026-01-16 22:11 ` Briam Rodriguez via TUHS
2026-01-16 22:28 ` segaloco via TUHS
2026-01-17 0:59 ` segaloco via TUHS
2026-01-17 0:59 ` Yufeng Gao via TUHS
1 sibling, 2 replies; 7+ messages in thread
From: Briam Rodriguez via TUHS @ 2026-01-16 22:11 UTC (permalink / raw)
To: tuhs
[-- Attachment #1: Type: text/plain, Size: 2134 bytes --]
Hi Matt,
Saw your post about the v2src restoration project. I took a crack at
disassembling the remaining binaries from the s2-bits tape -
specifically the bin/ directory utilities.
I've got 26 commands disassembled and formatted to match your existing
style conventions:
as, bas, cc, db, dc, ds, du, ed, fc, find, form, ld, maki, mv, nm, od,
pr, roff, size, sort, stat, tap, tm, un, wc, who
They're ready as a patch file. Please find it attached. I tried creating
a PR on gitlab but it wouldn't let me due to auth issues.
Happy to help with more disassembly work if there are other artifacts
worth looking at.
-- Briam R.
On 1/16/26 5:06 PM, segaloco via TUHS wrote:
> Hello everyone, I've been picking back up on some of my V2/V3 era
> reverse engineering efforts, picking through stuff from the Dennis_Tapes
> archive, and I came across something I don't think I've seen discussed.
>
> On the s1 tape, which we've yoinked a lot of V3 userland sources from,
> there are files cunix and wunix. Upon some disassembly and inspection,
> I believe these may be assembly UNIX kernels, although I haven't dug
> around too much to see what version they match most closely. Here are
> some findings that support my suspicions:
>
> - Both files begin with a 407 magic number, making them V2 a.out
> binaries.
> - Both begin with a branch that jumps over a few things then calls a
> subroutine. That subroutine matches "copyz" from u3.s in the scanned
> V1 kernel description from BTL. Indeed this jump in that kernel is also
> to copyz.
>
> Of course, this is only the first few bits executed, but I would be
> surprised to find such a close match elsewhere in the system. I do this
> sort of analysis on old video game code all the time, so I feel pretty
> confident in identifying these as possible assembly-era kernels.
>
> Anyone dug around in these before? These should be PDP-11/20 kernels as
> I'm finding plenty of EAE references, just like the s2-bits V2 binaries.
> What I'm hoping to find here are bits that might indicate KS11 support,
> what with the recent chit chat about KS11 in the V2 kernel.
>
> - Matt G.
[-- Attachment #2: 0001-add-disassembled-bin-commands-from-s2-bits.patch --]
[-- Type: text/plain, Size: 152079 bytes --]
From 2498b221d611cd131f6be10610f55e21fb136c40 Mon Sep 17 00:00:00 2001
From: Briam Rodriguez <briamr@gmail.com>
Date: Fri, 16 Jan 2026 16:59:29 -0500
Subject: [PATCH] add disassembled bin/ commands from s2-bits
---
cmd/as.s | 817 ++++++++++++++++++++
cmd/bas.s | 2106 ++++++++++++++++++++++++++++++++++++++++++++++++++++
cmd/cc.s | 871 ++++++++++++++++++++++
cmd/db.s | 793 ++++++++++++++++++++
cmd/dc.s | 508 +++++++++++++
cmd/ds.s | 267 +++++++
cmd/du.s | 187 +++++
cmd/ed.s | 437 +++++++++++
cmd/fc.s | 309 ++++++++
cmd/find.s | 140 ++++
cmd/form.s | 300 ++++++++
cmd/ld.s | 878 ++++++++++++++++++++++
cmd/maki.s | 68 ++
cmd/mv.s | 157 ++++
cmd/nm.s | 211 ++++++
cmd/od.s | 112 +++
cmd/pr.s | 342 +++++++++
cmd/roff.s | 1025 +++++++++++++++++++++++++
cmd/size.s | 762 +++++++++++++++++++
cmd/sort.s | 265 +++++++
cmd/stat.s | 298 ++++++++
cmd/tap.s | 666 +++++++++++++++++
cmd/tm.s | 284 +++++++
cmd/un.s | 79 ++
cmd/wc.s | 180 +++++
cmd/who.s | 150 ++++
26 files changed, 12212 insertions(+)
create mode 100644 cmd/as.s
create mode 100644 cmd/bas.s
create mode 100644 cmd/cc.s
create mode 100644 cmd/db.s
create mode 100644 cmd/dc.s
create mode 100644 cmd/ds.s
create mode 100644 cmd/du.s
create mode 100644 cmd/ed.s
create mode 100644 cmd/fc.s
create mode 100644 cmd/find.s
create mode 100644 cmd/form.s
create mode 100644 cmd/ld.s
create mode 100644 cmd/maki.s
create mode 100644 cmd/mv.s
create mode 100644 cmd/nm.s
create mode 100644 cmd/od.s
create mode 100644 cmd/pr.s
create mode 100644 cmd/roff.s
create mode 100644 cmd/size.s
create mode 100644 cmd/sort.s
create mode 100644 cmd/stat.s
create mode 100644 cmd/tap.s
create mode 100644 cmd/tm.s
create mode 100644 cmd/un.s
create mode 100644 cmd/wc.s
create mode 100644 cmd/who.s
diff --git a/cmd/as.s b/cmd/as.s
new file mode 100644
index 0000000..658a14f
--- /dev/null
+++ b/cmd/as.s
@@ -0,0 +1,817 @@
+/ as -- assembler pass 1
+
+ br start
+tsize: mov 0(sp),(sp)
+ 0
+ 0
+ 0
+ 0
+symend: 1
+
+/ start of program
+start:
+ jmp main
+
+/ error handling
+error:
+ jsr pc,pass1
+ movb errflg,r0
+ sys creat; tmpf1; 1000
+ movb errflg,r0
+ sys creat; tmpf2; 0
+ movb passno,r0
+ tstb dotflg
+ bne 1f
+ jsr r5,errstr
+ <-e\n\0>; .even
+ inc (r1)
+ bic $1,(r1)+
+ inc (r1)
+ bic $1,(r1)+
+ inc (r1)
+ bic $1,(r1)+
+ mov r0,r1
+ sys creat; tmpf1; 1000
+ 0
+ rtt
+
+/ setup temporary file name
+tmpset:
+ mov r4,-(sp)
+ mov (r5)+,r4
+ mov r4,0f
+ clr r0
+1:
+ tstb (r4)+
+ beq 1f
+ inc r0
+ br 1b
+1:
+ mov r0,0f+2
+ mov $1,r0
+ sys creat; 0:..; 0
+
+/ return from tmpset
+ mov r5,0f
+ mov $1,r0
+ sys creat; 0:..; rtt
+
+1:
+ incb 11.(r4)
+ cmpb 11.(r4),$'z
+ blos 1b
+ mov 0b,0f
+ jsr r5,tmpset; 0:..; clr @syms+2
+ incb dotflg
+ mov r0,-(sp)
+ mov r1,-(sp)
+ mov (r5)+,r0
+ mov @argptr,0f
+ beq 1f
+ clr @argptr
+ mov r0,-(sp)
+ jsr r5,tmpset; 0:..; rtt
+1:
+ mov (sp)+,r0
+ mov argptr,0f
+ movb r0,0f+48.
+ mov $tmpstr,r0
+ mov $-4,r1
+ clr hession
+ mov $12.,hession+2
+ add $48.,hession
+ movb hession,-(r0)
+ inc r1
+ bne 1b
+ mov $1,r0
+ sys creat; tmpstr; 7
+ mov (sp)+,r1
+ mov (sp)+,r0
+ rts r5
+
+tmpstr: < xxxx\n\0>
+ .even
+
+/ range check
+rangck:
+ cmp r0,$9.
+ bhi 1f
+ rts pc
+1:
+ jsr r5,errstr; <r\0>
+ .even
+
+clrone:
+ clr r0
+ rts pc
+
+/ skip to newline/semicolon/eof
+skip:
+ cmp r4,$'\n
+ beq 1f
+ cmp r4,$';
+ beq 1f
+ cmp r4,$4
+ beq 1f
+ rts pc
+1:
+ add $2,(sp)
+ rts pc
+
+/ symbol table routines
+lookup:
+ mov r2,-(sp)
+ mov r3,-(sp)
+ mov $2,r5
+ mov $symtab,r2
+ clr -(sp)
+ jsr pc,gethash
+ mov r3,hession
+ mov $40.,hession+2
+ jsr pc,gethash
+ add r3,hession
+ mov $40.,hession+2
+ jsr pc,gethash
+ add hession,r3
+ add r3,(sp)
+ mov r3,(r2)+
+ dec r5
+ bne 1b
+ jsr pc,gethash
+ mov r3,hession
+ add r3,(sp)
+ mov $12.,hession+4
+ mov hession,(r2)
+ jsr pc,gethash
+ tst r3
+ bne 1b
+ mov (sp)+,hession
+ clr hession+2
+ mov $1000.,hession+8
+ mov hession,r0
+ asl r0
+ add $symtab,r0
+ cmp r0,$symtab
+ bhi 1f
+ mov $symend,r0
+1:
+ mov $symtab,r2
+ mov -(r0),r4
+ beq 1f
+ cmp (r2)+,(r4)+
+ bne 1b
+ cmp (r2)+,(r4)+
+ bne 1b
+ cmpb 1(r4),1(r2)
+ bne 1b
+ br 2f
+1:
+ mov hession+4,r4
+ mov r4,(r0)
+ mov r4,-(sp)
+ add $16.,r4
+ cmp r4,0f
+ blos 1f
+ add $512.,0f
+ sys intr; symtab+2
+ mov (sp)+,r4
+ mov (r2)+,(r4)+
+ mov (r2)+,(r4)+
+ mov (r2)+,(r4)+
+ clr (r4)+
+ mov r4,hession+4
+ sub $4,r4
+2:
+ mov r4,-(sp)
+ sub $symhash,r4
+ asr r4
+ jsr pc,putw
+ mov (sp)+,r4
+ mov (sp)+,r3
+ mov (sp)+,r2
+ tst (sp)+
+ rts pc
+
+/ get hash value
+gethash:
+ jsr pc,rch
+ movb spts(r0),r3
+ ble 1f
+ rts pc
+1:
+ movb r0,savec
+ clr r3
+ rts pc
+
+/ read character
+rch:
+ movb savec,r0
+ beq 1f
+ clrb savec
+ rts pc
+1:
+ dec ibufcnt
+ blt fillbuf
+ movb @ibufp,r0
+ inc ibufp
+ bic $177600,r0
+ bne 1b
+ rts pc
+
+/ fill input buffer
+fillbuf:
+ movb infile,r0
+ beq nextfile
+ sys read; ibuf; 512.
+ bes 1f
+ tst r0
+ beq 1f
+ mov r0,ibufcnt
+ mov $ibuf,ibufp
+ br rch
+1:
+ movb infile,r0
+ clrb infile
+ sys creat; tmpf1; 1000
+
+nextfile:
+ decb fcount
+ bgt 1f
+ mov $4,r0
+ rts pc
+1:
+ tst pass
+ beq 1f
+ jsr r5,errstr; <i\0>
+ .even
+ jmp error+8
+1:
+ mov argptr,r0
+ tst (r0)+
+ mov (r0),0f
+ mov r0,argptr
+ incb fnumba
+ sys open; 0:..; 0
+
+ bec 1f
+ clr @0b
+ jmp error+8
+1:
+ movb r0,infile
+ mov $1,line
+ mov r4,-(sp)
+ mov r1,-(sp)
+ mov $5,r4
+ jsr pc,putw
+ mov @argptr,r1
+ movb (r1)+,r4
+ beq 1f
+ jsr pc,putw
+ br 1b
+1:
+ mov $-1,r4
+ jsr pc,putw
+ mov (sp)+,r1
+ mov (sp)+,r4
+ br rch
+
+/ get token
+readop:
+ mov tok,r4
+ beq 1f
+ clr tok
+ rts pc
+1:
+ jsr pc,1f
+ jsr pc,putw
+ rts pc
+
+1:
+ jsr pc,rch
+ mov r0,r4
+ movb spts(r0),r1
+ bgt 1f
+ jmp @dtbl(r1)
+
+/ dispatch table for token types
+dtbl:
+ dtbl+2
+ aletter
+ anumber
+ asquote
+ adquote
+ dtbl+2
+ adoll
+ aslash
+ aless
+ dtbl+2
+ aesc
+
+/ escape sequences
+aesc:
+ jsr r5,errstr; <//=<\0>; .even
+
+/ operator table entry
+optbl:
+ <+-*/%&|>>>!<^^~\0>
+ .even
+
+aslash:
+ jsr pc,rch
+ mov r0,r4
+ cmp r0,$4
+ beq 1f
+ cmp r0,$'\n
+ bne aslash
+1:
+ rts pc
+
+/ letter - identifier
+aletter:
+ movb r0,savec
+ cmp r1,$32.
+ ble 1f
+ cmp r1,$45.
+ blt 1f
+ jmp lookup
+1:
+ jsr pc,readnum
+ br 2f
+
+/ number
+anumber:
+ jsr pc,rch
+ mov r0,r4
+ movb spts(r0),r1
+ bgt 1f
+ cmp r0,$'b
+ beq bref
+ cmp r0,$'f
+ beq fref
+ cmp r0,$'.
+ bne 1f
+ mov hession,r1
+ clr r0
+1:
+ movb r0,savec
+ mov r1,r0
+ mov (sp)+,r3
+ mov (sp)+,r2
+ rts pc
+
+/ backref (Nb)
+bref:
+ mov r0,r3
+ mov hession,r0
+ jsr pc,rangck
+ add $'a,r0
+ cmp r3,$'b
+ beq 1f
+ add $12.,r0
+1:
+ mov r0,r4
+ mov (sp)+,r3
+ mov (sp)+,r2
+ add $2,(sp)
+ rts pc
+
+/ forward ref (Nf)
+fref:
+ jsr pc,rch
+ mov r0,r4
+ cmp r0,$4
+ beq 1f
+ cmp r0,$'\n
+ bne fref
+1:
+ rts pc
+
+/ dollar sign (immediate)
+adoll:
+ jsr r5,errstr; <g\0>
+ .even
+
+/ less-than (string)
+aless:
+ mov $'<,r4
+ jsr pc,putw
+ clr val
+ jsr pc,getch
+ tst r1
+ bne 1f
+ mov r0,r4
+ bis $400,r4
+ jsr pc,putw
+ inc val
+ br 1b
+1:
+ mov $-1,r4
+ jsr pc,putw
+ mov $'<,r4
+ tst (sp)+
+ rts pc
+
+/ get string char
+getch:
+ jsr pc,rch
+ cmp r0,$4
+ beq 1f
+ cmp r0,$'\n
+ beq 1f
+ clr r1
+ cmp r0,$'\\
+ bne 2f
+ jsr pc,rch
+ mov $esctbl,r2
+1:
+ cmpb (r2)+,r0
+ beq 3f
+ tstb (r2)+
+ bpl 1b
+ rts pc
+3:
+ movb (r2)+,r0
+ clr r1
+ rts pc
+2:
+ cmp r0,$'>
+ bne 4f
+ inc r1
+4:
+ rts pc
+
+esctbl:
+ 'n; 12
+ 'r; 15
+ 't; 11
+ 'b; 10
+ '0; 0
+ -1
+
+/ read number
+readnum:
+ mov r2,-(sp)
+ mov r3,-(sp)
+ clr r1
+ clr hession
+ jsr pc,rch
+ jsr r5,rangck
+ $'0
+ $'9
+ br 1f
+
+1:
+ sub $'0,r0
+ mov $12.,hession+2
+ add r0,hession
+ asl r1
+ asl r1
+ asl r1
+ add r0,r1
+ br readnum+6
+
+/ expression parser
+expr:
+ cmp r0,$'b
+ beq bref
+ cmp r0,$'f
+ beq fref
+ cmp r0,$'.
+ bne 1f
+ mov hession,r1
+ clr r0
+1:
+ movb r0,savec
+ mov r1,r0
+ mov (sp)+,r3
+ mov (sp)+,r2
+ rts pc
+
+/ expression with operators
+exprop:
+ jsr pc,rch
+ mov r0,r4
+ cmp r0,$'<
+ bne 1f
+ jmp aless
+1:
+ jsr pc,oprand
+ add $2,dotval
+ rts pc
+
+/ addressing mode parsing
+opclass:
+ mov r0,-(sp)
+ jsr pc,readop
+ mov (sp)+,r0
+ asl r0
+ jmp @clstbl(r0)
+
+clstbl:
+ sngop
+ dblop
+ sngop
+ dblop
+ dblop
+ sngop
+ sngop
+ sngop
+ sngop
+ sngop
+ sngop
+ branch
+ branch
+ extjsr
+ extsob
+ branch
+ branch
+ branch
+ branch
+ branch
+ branch
+ branch
+ branch
+ sngop
+ fltop
+ fltop
+ fltop
+ fltop
+ sngop
+ branch
+
+/ single operand instruction
+sngop:
+ jsr pc,oprand
+ cmp r4,$',
+ bne 1f
+ jsr pc,readop
+ jsr pc,oprand
+ add $2,dotval
+1:
+ rts pc
+
+/ double operand instruction
+dblop:
+ jsr pc,oprand
+ jsr pc,readop
+ jsr pc,oprand
+ add $2,dotval
+ cmp r4,$',
+ bne 1f
+ jsr pc,readop
+ br dblop+4
+1:
+ rts pc
+
+/ branch instruction
+branch:
+ jsr pc,oprand
+ inc dotval
+ bic $1,dotval
+ rts pc
+
+/ floating point operation
+fltop:
+ jsr pc,oprand
+ tst r3
+ bne 1f
+ jsr r5,errstr; <U\0>
+ .even
+1:
+ tst r2
+ bne 1f
+ inc pass
+1:
+ rts pc
+
+/ register expression
+regxpr:
+ cmp r4,$200
+ bcs 1f
+ bisb $40,(r4)
+ jsr pc,readop
+ cmp r4,$',
+ bne 1f
+ jsr pc,readop
+ br regxpr
+1:
+ rts pc
+
+/ segment switching
+segswt:
+ mov dotval,r1
+ asl r1
+ mov dotval,locseg(r1)
+ mov absdat(r0),dotval
+ asr r0
+ sub $23.,r0
+ mov r0,dotrel
+ rts pc
+
+/ operand parsing
+oprand:
+ cmp r4,$200
+ bcs 1f
+ mov $40,(r4)
+ jsr pc,readop
+ cmp r4,$',
+ bne 1f
+ jsr pc,readop
+ jsr pc,oprand
+ rts pc
+1:
+ jsr r5,errstr; <x\0>
+ .even
+ jmp error+8
+
+/ extended JSR
+extjsr:
+ cmp r4,$',
+ beq 1f
+ jsr pc,oprand
+ rts pc
+1:
+ jsr pc,readop
+ jsr pc,oprand
+ rts pc
+
+/ extended SOB
+extsob:
+ jsr pc,oprand
+ inc dotval
+ bic $1,dotval
+ rts pc
+
+/ pass 1 driver
+pass1:
+ jsr pc,pass1dr
+ rts pc
+
+pass1dr:
+ jsr pc,readop
+ cmp r4,$'\n
+ beq 1f
+ cmp r4,$';
+ beq 1f
+ cmp r4,$4
+ bne pass1dr
+1:
+ jmp pass1+8
+
+/ put word to output
+putw:
+ tst pass
+ bne 1f
+ cmp r4,$'\n
+ beq 1f
+ movb r4,@bufp
+ inc bufp
+ cmp bufp,$bufend
+ bcs 1f
+ mov $buf,bufp
+ movb errflg,r0
+ sys creat; tmpf1; 1000
+
+1:
+ rts pc
+
+/ error message output
+errstr:
+ mov r4,-(sp)
+ mov (r5)+,r4
+ mov r4,0f
+ mov $tmpstr,r0
+ mov $1,r0
+ sys write; 0:..; 4
+
+ mov (sp)+,r4
+ br skip
+
+/ main entry point
+main:
+ sys intr; error
+ bic r1,-(sp)
+ mov sp,r5
+ mov (r5)+,r0
+ cmpb @2(r5),$'-
+ bne 1f
+ tst (r5)+
+ dec r0
+ br main+16.
+1:
+ clr oteflag
+ movb r0,fcount
+ mov r5,argptr
+ jsr r5,tmpset
+ <a.out\0>; .even
+ movb r0,errflg
+ jsr r5,tmpset
+ <atm1a\0>; .even
+ movb r0,passno
+ jsr pc,setup
+ mov $1,r0
+ sys creat; tmpf1; 2
+
+ jmp error+8
+
+/ setup symbol table
+setup:
+ mov $symtbl,r1
+ mov $symtab,r0
+1:
+ mov (r1)+,(r0)+
+ beq 1f
+ mov (r1)+,(r0)+
+ mov (r1)+,r2
+ bic $37,r2
+ mov r2,(r0)+
+ mov r1,-(sp)
+ jsr pc,hshlkp
+ mov (sp)+,r1
+ mov r1,(r0)
+ sub $6,(r0)
+ tst (r1)+
+ br 1b
+1:
+ rts pc
+
+/ hash lookup
+hshlkp:
+ mov topstk,r1
+ add topstk+2,r1
+ add topstk+4,r1
+ mov r1,hession
+ clr hession+2
+ mov $1000.,hession+8
+ mov hession,r0
+ asl r0
+ add $symtab,r0
+ cmp r0,$symtab
+ bhi 1f
+ mov $symend,r0
+1:
+ mov -(r0),r2
+ beq 1f
+ mov $symtab,r3
+ cmp (r2)+,(r3)+
+ bne 1b
+ cmp (r2)+,(r3)+
+ bne 1b
+ mov (r2)+,r1
+ bic $37,r1
+ cmp r1,(r3)+
+ bne 1b
+1:
+ rts pc
+
+/ instruction table (partial)
+/ format: name; opcode; type
+symtbl:
+.=.+2
+locseg: .=.+24.
+absdat: .=.+24.
+/ EAE registers
+div = 177300
+ac = 177302
+mq = 177304
+mul = 177306
+sc = 177310
+sr = 177311
+nor = 177312
+lsh = 177314
+ash = 177316
+
+/ temp file names
+tmpf1: </etc/as2-\0>
+tmpf2: </tmp/atm1a\0>
+tmpf3: </tmp/atm2a\0>
+
+/ data area
+.bss
+savec: .=.+1
+dotflg: .=.+1
+fnumba: .=.+1
+errflg: .=.+1
+passno: .=.+1
+infile: .=.+1
+fcount: .=.+1
+ .even
+line: .=.+2
+pass: .=.+2
+tok: .=.+2
+val: .=.+2
+dotval: .=.+2
+dotrel: .=.+2
+oteflag: .=.+2
+argptr: .=.+2
+ibufcnt: .=.+2
+ibufp: .=.+2
+bufp: .=.+2
+topstk: .=.+6
+hession: .=.+12.
+ibuf: .=.+512.
+buf: .=.+512.
+bufend:
+symhash: .=.+2048.
+symtab: .=.+4096.
+syms:
diff --git a/cmd/bas.s b/cmd/bas.s
new file mode 100644
index 0000000..a96409e
--- /dev/null
+++ b/cmd/bas.s
@@ -0,0 +1,2106 @@
+/ bas -- BASIC interpreter
+
+ br start
+ mov @(r4)+,-(r2)
+ 0
+ 0
+
+ bgt 1f
+ 0
+
+start:
+ jmp init
+
+/ return from FPU trap
+fpret:
+ rts r5
+
+/ save state for FPU trap handler
+fptrap:
+ mov (sp)+,fppc
+ mov (sp)+,fpps
+ mov r0,fpr0
+ mov $fpregs,r0
+ mov r1,(r0)+
+ mov r2,(r0)+
+ mov r3,(r0)+
+ mov r4,(r0)+
+ mov r5,(r0)+
+ mov sp,(r0)+
+ sub $10,sp
+ mov (r0),r5
+ clr fperr
+ bic $100000,fpflags
+ mov -(r5),r5
+ mov r5,r4
+ bic $7777,r4
+ cmp r4,$170000
+ bne fpbad
+ bic $170000,r5
+ mov r5,r4
+ bit $7000,r4
+ bne 1f
+ bit $700,r4
+ bne 2f
+ cmp r4,$12
+ bhi fpbad
+ asl r4
+ jmp @fptbl(r4)
+
+fptbl:
+ fpop0; fpop1
+ fpop2; fpop3; fpop3
+ fpop3; fpop3; fpop3
+ fpop4; fpop5
+
+2:
+ cmp r5,$400
+ bge 3f
+ jsr r1,fpaddr
+ .+4
+ .+2
+ br 4f
+
+3:
+ jsr r1,fpaddr
+ .+4
+ .+2
+4:
+ mov r3,r5
+ asl r4
+ asl r4
+ clrb r4
+ swab r4
+ asl r4
+ jsr pc,@fptbl2(r4)
+ br fpdone
+
+fptbl2:
+ fpop3; fpld
+ fpst; fpop3; fpneg
+ fpabs; fpclr; fpadd
+ fpsub; fpmul; fpdiv
+ fpcmp; fpmod; fpldx
+ fpstx; fpint; fpldc
+ fpldi; fpstc; fpsti
+
+1:
+ cmp r5,$5000
+ blt fpop6
+ mov r5,r2
+ clrb r2
+ cmp r2,$6400
+ blt 1f
+ sub $1400,r2
+1:
+ cmp r2,$5000
+ bne 2f
+ jsr r1,fpaddr
+ .+4
+ .+2
+ br 3f
+
+2:
+ cmp r2,$5400
+ bne 4f
+ jsr r1,fpaddr
+ .+6; .+4
+ br 3f
+
+4:
+ jsr r1,fpaddr
+ .+4
+ .+2
+3:
+ jsr pc,getfreg
+ mov r2,r5
+ clrb r4
+ swab r4
+ asl r4
+ jsr pc,@fptbl3(r4)
+ br fpdone
+
+fptbl3:
+ fpop3; fpop3
+ fpmulf; fpmuld
+ fpaddf; fpaddd
+ fpldf; fpstf
+ fpsubf; fpsubd
+ fpdivf; fpdivd
+ fpcmpf; fpcmpd
+ fpmodf; fpmodd
+ fpldfx; fpstfx
+ fpaddx; fpsubx
+ fpldcx; fpstcx
+
+fpbad:
+ inc fperr
+ br fpret2
+
+fpop0:
+ mov fpflags,r0
+ bic $177760,r0
+ mov r0,fpps
+ br fpret2
+
+fpop1:
+ bic $200,fpflags
+ br fpret2
+
+fpop2:
+ bis $200,fpflags
+ br fpret2
+
+fpop3:
+ bic $100,fpflags
+ br fpret2
+
+fpop4:
+ bis $100,fpflags
+ br fpret2
+
+fpdone:
+ mov $fpregs+8.,r0
+ bic $17,(r0)
+ tst (r5)
+ bpl 1f
+ bis $10,(r0)
+ br fpret2
+1:
+ bne fpret2
+ bis $4,(r0)
+fpret2:
+ mov $fpregs,r0
+ mov (r0)+,r1
+ mov (r0)+,r2
+ mov (r0)+,r3
+ mov (r0)+,r4
+ mov (r0)+,r5
+ mov (r0)+,sp
+ mov fpr0,r0
+ mov fpps,-(sp)
+ mov fppc,-(sp)
+ tst fperr
+ bne 1f
+ rti
+1:
+ mov @$14,pc
+
+/ get FPU register address
+getfreg:
+ mov r5,r3
+ bic $177770,r3
+ asl r3
+ add $fpregs+8.,r3
+ mov r5,r0
+ bic $177707,r0
+ asr r0
+ asr r0
+ jmp @fprtbl(r0)
+
+fprtbl:
+ 1f; 2f; 3f; 4f
+ 5f; 6f; 7f; 8f
+
+1:
+ jmp (r1)+
+
+2:
+ sub $fpregs+8.,r3
+ cmp r3,$14
+ bcc fpbad
+ asl r3
+ asl r3
+ add $fpac,r3
+ tst (r1)+
+ rts r1
+
+3:
+ bit $100,fpflags
+ bne fpbad
+ cmp r3,$fpregs+12.
+ bcc fpbad
+ tst (r1)+
+ rts r1
+
+4:
+ cmp r3,$fpregs+14.
+ beq fpbad
+ mov (r3),r3
+ br fpchk
+
+5:
+ mov (r3),-(sp)
+ jsr pc,@2(r1)
+ add r0,(r3)
+ mov (sp)+,r3
+ br fpchk
+
+6:
+ mov @0(r3),-(sp)
+ add $2,(r3)
+ mov (sp)+,r3
+ br fpchk
+
+7:
+ cmp r3,$fpregs+14.
+ beq fpbad
+ jsr pc,@2(r1)
+ sub r0,(r3)
+ mov (r3),r3
+ br fpchk
+
+8:
+ cmp r3,$fpregs+14.
+ beq fpbad
+ sub $2,(r3)
+ mov @0(r3),r3
+ br fpchk
+
+fpop5:
+ mov @fppc,-(sp)
+ add $2,fppc
+ add (r3),(sp)
+ mov (sp)+,r3
+ br fpchk
+
+fpop6:
+ jsr r1,fpop5
+ 0
+ 0
+ mov (r3),r3
+ br fpchk+2
+
+fpchk:
+ bit $1,r3
+ bne fpbad
+ cmp r3,$40010
+ bcs fpbad
+ cmp r3,$57770
+ bcc fpbad
+ add $4,r1
+ rts r1
+
+/ load float to internal format
+fpld:
+ mov $fpwork,r0
+ jsr pc,1f
+ mov r3,r2
+ mov $fpwork2,r0
+1:
+ clr (r0)
+ mov (r2)+,r1
+ mov r1,-(sp)
+ beq 2f
+ blt 3f
+ inc (r0)+
+ br 4f
+3:
+ dec (r0)+
+4:
+ bic $177600,r1
+ bis $200,r1
+ br 5f
+2:
+ clr (r0)+
+5:
+ mov r1,(r0)+
+ mov (r2)+,(r0)+
+ bit $200,fpflags
+ beq 1f
+ mov (r2)+,(r0)+
+ mov (r2)+,(r0)+
+ br 2f
+1:
+ clr (r0)+
+ clr (r0)+
+2:
+ mov (sp)+,r1
+ asl r1
+ clrb r1
+ swab r1
+ sub $200,r1
+ mov r1,(r0)+
+ rts pc
+
+/ store from internal to external format
+fpst:
+ mov $fpwork+2,r0
+ mov (r0)+,r1
+ mov r1,-(sp)
+ mov (r0)+,r2
+ bis r2,(sp)
+ mov (r0)+,r3
+ bis r3,(sp)
+ mov (r0)+,r4
+ bis r4,(sp)+
+ bne 1f
+ clr fpwork
+ rts pc
+1:
+ bit $177400,r1
+ beq 2f
+ clc
+ ror r1
+ ror r2
+ ror r3
+ ror r4
+ inc (r0)
+ br 1b
+2:
+ bit $200,r1
+ bne 1f
+ asl r4
+ rol r3
+ rol r2
+ rol r1
+ dec (r0)
+ br 2b
+1:
+ mov r4,-(r0)
+ mov r3,-(r0)
+ mov r2,-(r0)
+ mov r1,-(r0)
+ rts pc
+
+/ copy float r3 -> r2
+fpcpy32:
+ mov (r3)+,(r2)+
+ mov (r3)+,(r2)+
+ bit $200,fpflags
+ beq 1f
+ mov (r3)+,(r2)+
+ mov (r3)+,(r2)+
+ rts pc
+1:
+ clr (r2)+
+ clr (r2)+
+ rts pc
+
+/ copy float r2 -> r3
+fpcpy23:
+ mov (r2)+,(r3)+
+ mov (r2)+,(r3)+
+ bit $200,fpflags
+ beq 1f
+ mov (r2)+,(r3)+
+ mov (r2)+,(r3)+
+1:
+ rts pc
+
+/ clear float at r3
+fpclr:
+ clr (r3)+
+ clr (r3)+
+ bit $200,fpflags
+ beq 1f
+ clr (r3)+
+ clr (r3)+
+1:
+ rts pc
+
+/ negate float at r3
+fpneg:
+ tst (r3)
+ beq 1f
+ add $100000,(r3)
+1:
+ rts pc
+
+/ absolute value at r3
+fpabs:
+ bic $100000,(r3)
+ rts pc
+
+/ nop
+fpnop:
+ rts pc
+
+/ compare floats
+fpcmp:
+ mov $fpwork+2,r5
+ cmp (r2)+,(r3)+
+ bgt 1f
+ blt 2f
+ cmp (r2)+,(r3)+
+ bne 3f
+ bit $200,fpflags
+ beq 4f
+ cmp (r2)+,(r3)+
+ bne 3f
+ cmp (r2)+,(r3)+
+ beq 4f
+3:
+ bhi 1f
+2:
+ mov $1,(r5)
+ rts pc
+1:
+ mov $-1,(r5)
+ rts pc
+4:
+ clr (r5)
+ rts pc
+
+/ copy r3 -> r2 (single precision mode)
+fpldf:
+ mov (r3)+,(r2)+
+ mov (r3)+,(r2)+
+ bit $200,fpflags
+ bne 1f
+ mov (r3)+,(r2)+
+ mov (r3)+,(r2)+
+ rts pc
+1:
+ clr (r2)+
+ clr (r2)+
+ rts pc
+
+/ copy r2 -> r3 (single precision mode)
+fpstf:
+ mov (r2)+,(r3)+
+ mov (r2)+,(r3)+
+ bit $200,fpflags
+ bne 1f
+ clr (r3)+
+ clr (r3)+
+1:
+ rts pc
+
+/ load integer to float
+fpldi:
+ mov $fpwork,r0
+ mov $1,(r0)+
+ mov (r3)+,(r0)+
+ bit $100,fpflags
+ beq 1f
+ mov (r3)+,(r0)+
+ clr (r0)+
+ clr (r0)+
+ mov $30,(r0)+
+ jmp fpst+4
+1:
+ clr (r0)+
+ clr (r0)+
+ clr (r0)+
+ mov $10,(r0)
+ jmp fpst+4
+
+/ store float to integer
+fpsti:
+ mov r3,r5
+ mov $fpwork,r0
+ jsr pc,fpld+4
+ mov $fpwork+2,r0
+ mov (r0)+,r1
+ mov (r0)+,r2
+ mov (r0)+,r3
+ mov fpwork2+8.,r0
+ cmp r0,$50
+ bge 1f
+ clc
+ ror r1
+ ror r2
+ ror r3
+ inc r0
+ br .-14
+1:
+ bgt 2f
+ tst r1
+ bne 2f
+ bit $100,fpflags
+ beq 3f
+ tst fpwork
+ bge 4f
+ neg r3
+ adc r2
+ bcs 4f
+ neg r2
+4:
+ mov r2,(r5)
+ mov r3,2(r5)
+ rts pc
+3:
+ tst r2
+ bne 2f
+ tst fpwork
+ bge 5f
+ neg r3
+5:
+ mov r3,(r5)
+ rts pc
+2:
+ bis $1,fpflags
+ jmp fpret2
+
+/ floating point add setup
+fpadd:
+ mov $fpwork,r0
+ jsr pc,fpld+4
+ mov (r3),fpwork2+8.
+ jsr pc,fpadd2
+ jmp fpdone
+
+/ floating point subtract
+fpsub:
+ mov $fpwork,r0
+ jsr pc,fpld+4
+ mov fpwork2+8.,(r3)
+ mov r3,r5
+ jmp fpdone
+
+/ modify status flags
+fpmod:
+ mov (r3),fpflags
+ jmp fpret2
+
+/ read status flags
+fpmodx:
+ mov fpflags,(r3)
+ jmp fpret2
+
+/ add internal format numbers
+fpaddf:
+ jsr pc,fpld
+ br fpadd3
+
+fpaddd:
+ jsr pc,fpld
+ neg fpwork2+8.
+fpadd3:
+ tst fpwork2+8.
+ beq fpadd2
+ tst fpwork
+ beq 1f
+ mov fpwork2+8.,r1
+ sub fpwork2+10.,r1
+ blt 2f
+ beq 3f
+ cmp r1,$70
+ bge fpadd2
+ mov $fpwork2+4,r0
+ br 4f
+2:
+ neg r1
+ cmp r1,$70
+ bge 1f
+ mov $fpwork+2,r0
+4:
+ mov r1,-(sp)
+ mov (r0)+,r1
+ mov (r0)+,r2
+ mov (r0)+,r3
+ mov (r0)+,r4
+ add (sp),(r0)
+ clc
+ ror r1
+ ror r2
+ ror r3
+ ror r4
+ dec (sp)
+ bgt .-14
+ mov r4,-(r0)
+ mov r3,-(r0)
+ mov r2,-(r0)
+ mov r1,-(r0)
+ tst (sp)+
+3:
+ mov $fpwork2+6,r1
+ mov $fpwork2+10.,r2
+ mov $4,r0
+ cmp fpwork,fpwork2+8.
+ bne 5f
+ clc
+ adc -(r1)
+ bcs 6f
+ add -(r2),(r1)
+ dec r0
+ bne .-10
+ br 7f
+6:
+ add -(r2),(r1)
+ sec
+ br .-10
+
+ br 7f
+
+5:
+ clc
+ sbc -(r1)
+ bcs 8f
+ sub -(r2),(r1)
+ dec r0
+ bne .-10
+ br 9f
+8:
+ sub -(r2),(r1)
+ sec
+ br .-10
+
+fpst2:
+ mov $fpwork+2,r1
+9:
+ tst (r1)
+ bge 1f
+ mov $fpwork2+6,r1
+ mov $4,r0
+ clc
+ adc -(r1)
+ bcs 2f
+ neg (r1)
+2:
+ dec r0
+ bne .-10
+ neg -(r1)
+1:
+ jsr pc,fpst
+ br fpadd2
+
+7:
+ mov $fpwork2+4,r1
+ mov $fpwork,r2
+ mov $6,r0
+1:
+ mov (r1)+,(r2)+
+ dec r0
+ bne 1b
+fpadd2:
+ mov r5,r2
+ mov $fpwork,r0
+ tst (r0)
+ beq 2f
+ mov fpwork2+8.,r1
+ cmp r1,$177
+ ble 1f
+ jsr pc,fpexp
+ sub $200,r1
+1:
+ cmp r1,$-177
+ bge 1f
+ jsr pc,fpexp
+ add $200,r1
+1:
+ add $200,r1
+ swab r1
+ clc
+ ror r1
+ tst (r0)+
+ bge 1f
+ bis $100000,r1
+1:
+ bic $177600,(r0)
+ bis (r0)+,r1
+ mov r1,(r2)+
+ mov (r0)+,(r2)+
+ bit $200,fpflags
+ beq 1f
+ mov (r0)+,(r2)+
+ mov (r0)+,(r2)+
+1:
+ rts pc
+
+2:
+ clr (r2)+
+ clr (r2)+
+ bit $200,fpflags
+ beq 1f
+ clr (r2)+
+ clr (r2)+
+1:
+ rts pc
+
+fpexp:
+ bis $2,fpflags
+ jmp fpret2
+
+/ multiply
+fpmulf:
+ jsr pc,fpld
+ br fpmul2
+
+fpmulr:
+ jsr pc,fpld
+ jsr pc,fpst
+ mov $fpwork,r0
+ mov $fpwork2+4,r1
+ mov $6,r2
+1:
+ mov (r0)+,(r1)+
+ dec r2
+ bne 1b
+ clr r0
+ cmp r0,fpwork2+8.
+ bge 1f
+ bic r1,fpwork+2(r2)
+ br 2f
+1:
+ bic r1,fpwork2+4(r2)
+2:
+ inc r0
+ clc
+ ror r1
+ bne 1b
+ mov $100000,r1
+ add $2,r2
+ cmp r2,$10
+ blt 1b
+ jsr pc,fpst
+ jsr pc,fpadd2
+ cmp r5,$fpac
+ beq 1f
+ cmp r5,$fpac+10.
+ beq 1f
+ bit $200,fpwork2+4
+ bne 2f
+ clr fpwork2+8.
+2:
+ add $10,r5
+ jsr pc,1f
+ sub $10,r5
+1:
+ rts pc
+
+/ divide
+fpdiv:
+ jsr pc,fpld
+ add fpwork2+10.,fpwork2+8.
+ dec fpwork2+8.
+ jsr pc,fpsgn
+ mov r5,-(sp)
+ mov $fpwork,r0
+ mov (r0),r1
+ clr (r0)+
+ mov (r0),r2
+ clr (r0)+
+ mov (r0),r3
+ clr (r0)+
+ mov (r0),r4
+ clr (r0)+
+ mov $fpwork+2,r5
+ mov $200,-(sp)
+ mov $fpwork2+4,r0
+1:
+ cmp (r0)+,r1
+ blt 2f
+ bgt 3f
+ cmp (r0)+,r2
+ bcs 2f
+ bhi 3f
+ cmp (r0)+,r3
+ bcs 2f
+ bhi 3f
+ cmp (r0)+,r4
+ bhi 3f
+2:
+ mov $fpwork2+4,r0
+ sub (r0)+,r1
+ clr -(sp)
+ sub (r0)+,r2
+ adc (sp)
+ clr -(sp)
+ sub (r0)+,r3
+ adc (sp)
+ sub (r0)+,r4
+ sbc r3
+ adc (sp)
+ sub (sp)+,r2
+ adc (sp)
+ sub (sp)+,r1
+ bis (sp),(r5)
+3:
+ asl r4
+ rol r3
+ rol r2
+ rol r1
+ clc
+ ror (sp)
+ bne 1b
+ mov $100000,(sp)
+ add $2,r5
+ cmp r5,$fpwork2+6
+ bcs 1b
+ tst (sp)+
+ mov (sp)+,r5
+ jmp fpst2
+
+fpmul2:
+ jsr pc,fpld
+ sub fpwork2+10.,fpwork2+8.
+ inc fpwork2+8.
+ jsr pc,fpsgn
+ mov r5,-(sp)
+ mov $fpwork2+6,r5
+ bit $200,fpflags
+ beq 1f
+ add $4,r5
+1:
+ clr r0
+ clr r1
+ clr r2
+ clr r3
+ clr r4
+1:
+ asl r0
+ bne 2f
+ inc r0
+ tst -(r5)
+2:
+ cmp r0,$400
+ bne 3f
+ cmp r5,$fpwork2+4
+ bhi 3f
+ mov $fpwork+2,r0
+ mov r1,(r0)+
+ mov r2,(r0)+
+ mov r3,(r0)+
+ mov r4,(r0)+
+ mov (sp)+,r5
+ rts pc
+3:
+ clc
+ ror r1
+ ror r2
+ ror r3
+ ror r4
+ bit r0,(r5)
+ beq 1b
+ mov r0,-(sp)
+ mov $fpwork+2,r0
+ add (r0)+,r1
+ clr -(sp)
+ add (r0)+,r2
+ adc (sp)
+ clr -(sp)
+ add (r0)+,r3
+ adc (sp)
+ add (r0)+,r4
+ adc r3
+ adc (sp)
+ add (sp)+,r2
+ adc (sp)
+ add (sp)+,r1
+ mov (sp)+,r0
+ br 1b
+
+fpsgn:
+ cmp fpwork,fpwork2+8.
+ beq 1f
+ mov $-1,fpwork
+ rts pc
+1:
+ mov $1,fpwork
+ rts pc
+
+/ floating point data area
+fpwork:
+ 0
+fpwork+2:
+ 0
+ 0
+ 0
+ 0
+ 0
+fpwork2+8.:
+ 0
+fpwork2+10.:
+ 0
+ 0
+ 0
+ 0
+ 0
+fpflags:
+ 0
+fperr:
+ 0
+fpac:
+ 0; 0; 0; 0
+ 0; 0; 0; 0
+ 0; 0
+fpr0:
+ 0
+fpregs:
+ 0; 0; 0; 0
+ 0; 0; 0
+fppc:
+ 0
+fpps:
+ 0
+
+/ read integer using EAE
+rdint:
+ clr @$mq
+ jsr r5,@0(r5)
+ clr -(sp)
+ cmp r0,$'-
+ bne 1f
+ inc (sp)
+ jsr r5,@0(r5)
+1:
+ sub $'0,r0
+ cmp r0,$11
+ bhi 2f
+ mov $12,@$mul
+ add r0,@$mq
+ br .-20
+2:
+ add $'0,r0
+ tst (sp)+
+ beq 1f
+ neg @$mq
+1:
+ tst (r5)+
+ rts r5
+
+/ print float using FPU
+prflt:
+ mov r4,-(sp)
+ mov r3,-(sp)
+ ldf $12.,f3
+ ldf $1,f2
+ clr r4
+ stf f0,r1
+ mulf 4f,f1
+ addf r1,f0
+ tstf r0
+ cfcc
+ beq 3f
+ bge 1f
+ negf r0
+ mov $'-,r0
+ jsr r5,@0(r5)
+1:
+ cmpf r3,f0
+ cfcc
+ bgt 2f
+ inc r4
+ divf r3,f0
+ br 1b
+2:
+ cmpf r2,f0
+ cfcc
+ ble 3f
+ dec r4
+ mulf r3,f0
+ br 2b
+3:
+ modf r2,f0
+ stcfi f0,r0
+ add $'0,r0
+ jsr r5,@0(r5)
+ mov $'.,r0
+ jsr r5,@0(r5)
+ mov $10.,r3
+4:
+ modf r3,f0
+ stcfi f0,r0
+ add $'0,r0
+ jsr r5,@0(r5)
+ dec r3
+ bgt 4b
+ mov $'e,r0
+ jsr r5,@0(r5)
+ mov r4,r0
+ mov (sp)+,r3
+ mov (sp)+,r4
+ jmp prdec
+
+4: .flt2 0.5
+ 0; 0; 0
+
+/ print decimal
+prdec:
+ mov r0,@$mq
+ bge 1f
+ neg @$mq
+ mov $'-,r0
+ jsr r5,@0(r5)
+1:
+ jsr pc,prdec2
+ tst (r5)+
+ rts r5
+
+prdec2:
+ clr @$ac
+ mov $12,@$div
+ mov @$ac,-(sp)
+ tst @$mq
+ beq 1f
+ jsr pc,prdec2
+1:
+ mov (sp)+,r0
+ add $'0,r0
+ jsr r5,@0(r5)
+ rts pc
+
+/ read float using FPU
+rdflt:
+ mov r1,-(sp)
+ mov r2,-(sp)
+ ldf $12.,f3
+ clr r2
+ clrf r0
+ clr -(sp)
+ jsr r5,@0(r5)
+ cmp r0,$'-
+ bne 1f
+ inc (sp)
+ jsr r5,@0(r5)
+1:
+ sub $'0,r0
+ cmp r0,$11
+ bhi 2f
+ mulf r3,f0
+ ldcif r0,f1
+ addf r1,f0
+ dec r1
+ br .-20
+2:
+ add $'0,r0
+ cmp r0,$'.
+ bne 3f
+ clr r1
+ inc r2
+ br .-30
+3:
+ clr @$mq
+ cmp r0,$'e
+ bne 4f
+ mov (r5),.-6
+ jsr r5,rdint
+ 0
+4:
+ tst r2
+ bne 1f
+ clr r1
+1:
+ add @$mq,r1
+ tst r1
+ bge 1f
+ divf r3,f0
+ inc r1
+ br .-10
+1:
+ tst r1
+ ble 1f
+ mulf r3,f0
+ dec r1
+ br .-10
+1:
+ tst (sp)+
+ beq 1f
+ negf r0
+1:
+ mov (sp)+,r2
+ mov (sp)+,r1
+ tst (r5)+
+ rts r5
+
+/ trigonometric functions
+fpsin:
+ addf 4f,f0
+ clr -(sp)
+ tstf r0
+ cfcc
+ bge 1f
+ negf r0
+ inc (sp)
+1:
+ modf 5f,f0
+ mulf 4f,f0
+ stcfi f0,r0
+ ror r0
+ bcc 1f
+ negf r0
+ addf 4f,f0
+1:
+ ror r0
+ sbc (sp)
+ stf f0,r1
+ stf f0,r2
+ mulf r2,f0
+ ldf $1,f3
+ stf f3,r4
+ mov $12,r0
+1:
+ addf r4,f3
+ negf r1
+ mulf r2,f1
+ divf r3,f1
+ addf r4,f3
+ divf r3,f1
+ addf r1,f0
+ dec r0
+ bne 1b
+ tst (sp)+
+ beq 1f
+ negf r0
+1:
+ rts r5
+
+4: .flt2 3.14159265359
+ 0; 0; 0; 0
+
+5: .flt2 0.31830988618
+ 0; 0; 0; 0
+
+/ exponential function
+fpexp:
+ ldf $1,f1
+ ldf $2,f2
+ tstf r0
+ cfcc
+ bne 1f
+ stf f1,r0
+ rts r5
+1:
+ bgt 2f
+ negf r0
+ mov pc,-(sp)
+ br 3f
+2:
+ clr -(sp)
+3:
+ clr -(sp)
+ divf r2,f0
+ cmpf r1,f0
+ cfcc
+ bge 1f
+ inc (sp)
+ br .-12
+1:
+ stf f0,-(sp)
+ mulf r0,f0
+ stf f0,r5
+ clrf r0
+ ldf $23,f3
+ mov $12,r0
+1:
+ addf r3,f0
+ stf f0,r4
+ ldf r5,f0
+ divf r4,f0
+ subf r2,f3
+ dec r0
+ bgt 1b
+ subf r0,f1
+ ldf (sp)+,f0
+ addf r0,f0
+ divf r1,f0
+ mov (sp)+,r0
+ beq 1f
+ mulf r0,f0
+ dec r0
+ bgt .-4
+1:
+ tst (sp)+
+ beq 1f
+ divf r0,f1
+ stf f1,r0
+1:
+ rts r5
+
+/ logarithm function
+fplog:
+ tstf r0
+ cfcc
+ bgt 1f
+ sec
+ rts r5
+1:
+ clr -(sp)
+ cmpf 6f,f0
+ cfcc
+ bge 1f
+ divf 7f,f0
+ inc (sp)
+ br .-14
+1:
+ cmpf 8f,f0
+ cfcc
+ ble 1f
+ mulf 7f,f0
+ dec (sp)
+ br .-14
+1:
+ ldf $1,f1
+ stf f0,r2
+ addf r1,f2
+ subf r1,f0
+ divf r2,f0
+ stf f0,-(sp)
+ mulf r0,f0
+ stf f0,r4
+ mov $12,r0
+ ldcif r0,f2
+ ldf $25,f3
+ clrf r0
+ negf r0
+ addf r3,f0
+ stf f0,r5
+ stf r0,f2
+ mulf r2,f0
+ mulf r4,f0
+ divf r5,f0
+ subf r1,f2
+ subf f3,7f
+ dec r0
+ bgt .-34
+ subf r0,f1
+ ldf (sp)+,f0
+ addf r0,f0
+ divf r1,f0
+ mov (sp)+,r0
+ beq 1f
+ ldcif r0,f1
+ mulf 9f,f1
+ addf r1,f0
+1:
+ clc
+ rts r5
+
+6: .flt2 10.0
+ 0; 0; 0; 0
+
+7: .flt2 1.0
+ 0; 0; 0; 0
+
+8: .flt2 0.1
+ 0; 0; 0; 0
+
+9: .flt2 2.302585093
+ 0; 0; 0; 0
+
+/ initialization
+init:
+ trap 41
+ setd
+ trap 33
+ mov sp,spsave
+ mov r6,spsave
+ clr lineno
+ mov $'a,r1
+1:
+ movb r1,inbuf+142.
+ trap 22
+ 0f:..; 0
+ bcs 1f
+ inc r1
+ cmp r1,$'z
+ blos 1b
+ br 2f
+1:
+ trap 10
+ 0f:..; 14
+ bcs 2f
+ mov r0,tmpfd
+ trap 5
+ 0f:..
+ 0
+
+ bcc 2f
+2:
+ mov $ermsg1,r0
+ jsr pc,prmsg
+ trap 1
+tmpnam: <Tmp file\0>
+ .even
+ clr @0f
+2:
+ mov r0,infd
+ jsr pc,reset
+ cmp (sp),$2
+ blt 1f
+ mov 4(sp),0f
+ trap 5
+ 0:..
+ 0
+
+ bcc 2f
+ mov r0,filfd
+ br 1f
+2:
+ mov $ermsg2,r0
+ jsr pc,prmsg
+ br 1f
+
+ermsg2: <Cannot open file\n\0>
+ .even
+1:
+ mov $'\n,r0
+ jsr r5,putc
+ jsr r5,rdline
+ <ready\n\0>
+ .even
+1:
+ mov spsave,sp
+ clr runflg
+ jsr pc,getlin
+ mov $inbuf,r3
+ movb (r3),r0
+ jsr pc,ckdgt
+ br 1f
+
+/ read line number
+rnum:
+ jsr r5,rdint
+ 2f
+ cmp r0,$'
+ beq 1f
+ mov $lines,r3
+1:
+ mov @$mq,r0
+ bgt 1f
+ jsr pc,errlin
+1:
+ tst -(r3)
+ beq 2f
+ cmp r0,(r3)
+ beq 3f
+ cmp -(r3),-(r3)
+ br 1b
+2:
+ clr -6(r3)
+3:
+ mov r0,(r3)
+ mov lineno,-(r3)
+ mov tmpfd,r0
+ trap 23
+ 0:..
+ 0
+
+ mov $inbuf,r0
+ jsr pc,prlin
+ inc r0
+ add r0,lineno
+ mov r0,0f
+ mov tmpfd,r0
+ trap 4
+ inbuf; 0:..
+ br restart
+
+1:
+ mov $inbuf,r3
+ jsr pc,parse
+ br restart
+
+/ print message
+prmsg:
+ movb (r3)+,r0
+ emt 5
+prlin:
+ clr -(sp)
+1:
+ inc (sp)
+ cmpb (r0)+,$'\n
+ bne 1b
+ mov (sp)+,r0
+ emt 7
+ tst saveit
+ beq 1f
+ mov $1,r0
+ trap 4
+ savbuf; 3
+ clr saveit
+1:
+ emt 7
+getlin:
+ jsr pc,.-6
+ mov $inbuf,0f
+ mov filfd,r0
+ trap 3
+ 0:..
+ 1
+ bcs 1f
+ tst r0
+ beq 1f
+ movb @.-14,r0
+ inc .-16
+ cmp r0,$'\n
+ bne getlin
+ clrb @.-24
+ emt 7
+1:
+ mov filfd,r0
+ beq 1f
+ trap 6
+ clr filfd
+ br getlin
+1:
+ jmp done
+
+/ read line routine
+rdline:
+ mov filfd,r0
+ beq 1f
+ trap 6
+ clr filfd
+1:
+ tst runflg
+ beq 1f
+ jsr pc,fndlin
+ br 1f
+ermsg1:
+ mov $inbuf,r0
+ jsr pc,prmsg
+ jmp restart
+
+1:
+ mov spsave,sp
+ jsr pc,getlin
+ cmp r0,$'
+ beq 1b
+ movb (r3)+,r0
+ jmp @rdtbl(r1)
+
+rdtbl:
+ rd1; rd2
+ rd3; rd4
+ rd5; rd6
+ rd7; rd8
+ rd9; rd10
+ rd11; rd12
+
+/ error handler
+errlin:
+ dec r3
+ mov filfd,r0
+ beq 1f
+ trap 6
+ clr filfd
+1:
+ mov $inbuf,r1
+ cmp r1,r3
+ bne 2f
+ mov $'_,r0
+ jsr r5,putc
+ mov $10,r0
+ jsr r5,putc
+2:
+ movb (r1),r0
+ jsr r5,putc
+ cmpb (r1)+,$'\n
+ bne .-10
+ jmp restart
+
+/ check if digit
+ckdgt:
+ cmp r0,$'0
+ bcs 1f
+ cmp r0,$'9
+ bhi 1f
+ add $2,(sp)
+1:
+ emt 7
+ cmp r0,$'a
+ bcs 1f
+ cmp r0,$'z
+ bhi 1f
+ add $2,(sp)
+1:
+ emt 7
+ mov $name,r1
+ clr (r1)
+ clr 2(r1)
+ cmp r1,$name+4
+ bcc 1f
+ movb r0,(r1)+
+1:
+ movb (r3)+,r0
+ jsr pc,ckdgt+10
+ br .-4
+ jsr pc,ckdgt
+ br .-4
+
+/ lookup keyword
+ckkey:
+ mov $kwtbl,r1
+1:
+ cmp name,(r1)
+ bne 2f
+ cmp name+2,2(r1)
+ bne 2f
+ sub $kwtbl,r1
+ asr r1
+ add $2,(sp)
+ emt 7
+2:
+ add $4,r1
+ cmp r1,$kwtbl+50.
+ bcs 1b
+ mov $vars,r1
+1:
+ tst (r1)
+ beq 2f
+ cmp name,(r1)
+ bne 3f
+ cmp name+2,2(r1)
+ bne 3f
+ emt 7
+3:
+ add $16,r1
+ br 1b
+2:
+ mov name,(r1)
+ mov name+2,2(r1)
+ clr 4(r1)
+ clr 16(r1)
+ emt 7
+skipsp:
+ cmp r0,$'
+ bne 1f
+ movb (r3)+,r0
+ br skipsp
+1:
+ emt 7
+putc:
+ mov r0,0f
+ mov $1,r0
+ trap 4
+ 0f:..; 1
+ emt 5
+ 0
+ 0
+
+/ find line
+fndlin:
+ clr -(sp)
+ mov $lines,r1
+1:
+ tst -(r1)
+ beq 2f
+ cmp runflg,(r1)
+ bhi 3f
+ mov (sp),r0
+ beq 4f
+ cmp (r0),(r1)
+ blos 3f
+4:
+ mov r1,(sp)
+3:
+ cmp -(r1),-(r1)
+ br 1b
+2:
+ mov (sp)+,r1
+ beq 1f
+ mov (r1),runflg
+ mov -(r1),0f
+ mov infd,r0
+ trap 23
+ 0:..
+ 0
+
+ mov infd,r0
+ trap 3
+ inbuf; 144.
+ add $2,(sp)
+1:
+ emt 7
+look:
+ mov $lines,r1
+1:
+ tst -(r1)
+ beq 2f
+ cmp r0,(r1)
+ beq 3f
+ cmp -(r1),-(r1)
+ br 1b
+2:
+ jsr r5,errmsg
+ <label not found\0>
+ .even
+3:
+ emt 7
+reset:
+ mov $vars,r0
+ mov $kwtbl+50.,r1
+ clrf r0
+ ldf $1,f1
+1:
+ mov (r1)+,(r0)+
+ mov (r1)+,(r0)+
+ mov $1,(r0)+
+ subf r1,f0
+ stf f0,(r0)+
+ cmp r1,$vars
+ bcs 1b
+ clr (r0)+
+ emt 7
+initst:
+ clr curlvl
+ mov $code,r4
+ tst runflg
+ beq 1f
+ emt 7
+1:
+ jsr pc,fndlin
+ br stmt
+stmt:
+ mov runflg,r0
+ jsr pc,look
+ mov -4(r1),r4
+ jsr pc,parse
+ br 1f
+1:
+ inc runflg
+ br 1b
+
+parse:
+ tst curlvl
+ bne 1f
+ mov $goto,(r4)+
+ emt 7
+stmt2:
+ clr curlvl
+ mov $lines,r4
+1:
+ tst -(r3)
+ beq 2f
+ cmp -(r3),-(r3)
+ br 1b
+2:
+ mov r3,curlin
+ jmp (r4)+
+
+/ execute loop
+exec:
+ tstf (r3)+
+ cfcc
+ beq 1f
+ tst (r4)+
+ jmp (r4)+
+1:
+ mov (r4)+,r4
+ jmp (r4)+
+
+/ call subroutine
+call:
+ mov r4,-(r3)
+ mov curlin,-(r3)
+ mov r3,curlin
+ inc curlvl
+ clr r0
+ jsr pc,getarg
+ tstf r0
+ cfcc
+ bge 1f
+ jmp return
+1:
+ ldf (r3),f0
+ stf f0,-(sp)
+ jsr pc,initst
+ mov (sp)+,r0
+ jsr pc,look
+ mov -4(r1),r4
+ jmp (r4)+
+
+/ run
+run:
+ jsr pc,reset
+ mov $1,runflg
+ jsr pc,initst
+ mov $code,r4
+ jmp (r4)+
+
+/ print statement
+print:
+ clr prtab
+ tstf (r3)+
+ cfcc
+ bne 1f
+ mov $100,prtab
+1:
+ jsr r5,prchr
+ inbuf; inbuf+10.
+ jsr r5,prchr
+ inbuf+10.; inbuf+20.
+ jsr pc,output
+ jmp (r4)+
+
+prchr:
+ ldf (r3)+,f0
+ ldf $1000.,f1
+ mulf r1,f0
+ stcfi f0,r0
+ tst r0
+ bge 1f
+ clr r0
+1:
+ cmp r0,$1000.
+ blt 1f
+ mov $777,r0
+1:
+ mov r0,@(r5)+
+ emt 5
+curlin:
+ mov curlin,r3
+ mov (r4)+,runflg
+ jmp (r4)+
+
+/ comparison operations
+cmpz:
+ tstf (r3)+
+ cfcc
+ beq 1f
+ clrf r0
+ br 2f
+1:
+ ldf $1,f0
+2:
+ stf f0,(r3)
+ jmp (r4)+
+
+cmpnz:
+ tstf (r3)+
+ cfcc
+ bne 1f
+ tstf (r3)
+ cfcc
+ bne 1f
+ br 2f
+cmplt:
+ tstf (r3)+
+ cfcc
+ beq 2f
+ tstf (r3)
+ cfcc
+ beq 2f
+ br 1f
+cmpeq:
+ jsr pc,cmpsub
+ bgt 1f
+ br 2f
+cmpgt:
+ jsr pc,cmpsub
+ blt 1f
+ br 2f
+cmple:
+ jsr pc,cmpsub
+ bge 1f
+ br 2f
+cmpge:
+ jsr pc,cmpsub
+ ble 1f
+ br 2f
+cmpne:
+ jsr pc,cmpsub
+ bne 1f
+ br 2f
+cmpeq2:
+ jsr pc,cmpsub
+ beq 1f
+2:
+ clrf r0
+ br 3f
+1:
+ ldf $1,f0
+3:
+ stf f0,(r3)
+ jmp (r4)+
+
+/ store/load float
+stflt:
+ stf f1,r0
+ br 1f
+ldflt:
+ ldf (r3),f0
+ mov 10(r3),r0
+ add $4,r0
+ bis $1,(r0)+
+ stf f0,(r0)
+ tst (r3)+
+ br 2f
+
+/ arithmetic operations
+addf:
+ ldf (r3)+,f0
+ addf (r3),f0
+ br 2f
+subf:
+ ldf (r3)+,f0
+ negf r0
+ addf (r3),f0
+ br 2f
+mulf:
+ ldf (r3)+,f0
+ mulf (r3),f0
+ br 2f
+divf:
+ ldf (r3)+,f1
+ ldf (r3),f0
+ divf r1,f0
+ br 2f
+powf:
+ ldf 10(r3),f0
+ jsr r5,fplog
+ mulf (r3)+,f0
+ jsr r5,fpexp
+ br 2f
+pushf:
+ ldf (r4)+,f0
+1:
+ stf f0,-(r3)
+ jmp (r4)+
+2:
+ stf f0,(r3)
+ jmp (r4)+
+
+ldval:
+ jsr pc,getval
+ br 1b
+ldval2:
+ jsr pc,getval
+ ldf $1,f1
+ addf r1,f0
+ stf f0,(r0)
+ br 1b
+
+pushval:
+ mov (r4)+,-(r3)
+ jmp (r4)+
+ldflt2:
+ ldf (r3),f0
+ br 1b
+
+/ return from subroutine
+return:
+ dec curlvl
+ bge 1f
+ jsr r5,errmsg
+ <bad return\0>
+ .even
+1:
+ ldf (r3),f0
+ mov curlin,r3
+ mov (r3)+,curlin
+ mov (r3)+,r4
+ mov (r4)+,r0
+ dec r0
+ blt 2f
+ add $10,r3
+ br .-10
+2:
+ iot
+
+cmpsub:
+ ldf (r3)+,f1
+ cmpf (r3),f1
+ cfcc
+ emt 7
+getval:
+ mov (r3)+,r0
+ add $4,r0
+ bit $1,(r0)+
+ bne 1f
+ jsr r5,errmsg
+ <used before set\0>
+ .even
+1:
+ ldf (r0),f0
+ emt 7
+return2:
+ dec curlvl
+ mov (r3)+,curlin
+ mov (r3)+,r4
+ stcfi f0,r0
+ com r0
+ asl r0
+ cmp r0,$22
+ bcc 1f
+ jmp @bltbl(r0)
+
+bltbl:
+ bl1; bl2; bl3; bl4
+ bl5; bl6; bl7; bl8
+ bl9
+bl1:
+ mov $-1,r0
+ jsr pc,prdec+6
+ br done
+bl2:
+ cmp (r4)+,$1
+ bne 1f
+ ldf (r3),f0
+ stcfi f0,r0
+ jsr pc,getarg
+ br done
+bl3:
+ jsr r5,blcall
+ sqrtf; done
+bl4:
+ jsr r5,blcall
+ sinf; done
+bl5:
+ jsr r5,blcall
+ cosf; done
+bl6:
+ jsr r5,blcall
+ atanf; done
+bl7:
+ tst (r4)+
+ bne 1f
+ mov rndval,@$mq
+ mov $40647,@$mul
+ mov @$mq,r0
+ mov r0,rndval
+ ldcif r0,f0
+ absf r0
+ divf 4f,f0
+ jmp 2f
+4: .flt2 32768.
+ 0; 0; 0; 0
+bl8:
+ tst (r4)+
+ bne 1f
+ mov r3,-(sp)
+ mov r4,-(sp)
+ jsr pc,getlin
+ mov curlvl+4,r4
+ mov $inbuf,r3
+ jsr pc,parse
+ mov #goto,(r4)+
+ mov (sp)+,(r4)+
+ mov (sp)+,r3
+ mov curlvl+4,r4
+ add $10,r3
+ jmp (r4)+
+bl9:
+ cmp (r4)+,$1
+ bne 1f
+ ldf (r3),f0
+ ldf $1,f1
+ modf r1,f0
+ stf f1,r0
+ br 2b
+2:
+ add $10,r3
+ jmp 2f
+1:
+ jsr r5,errmsg
+ <arg count\0>
+ .even
+getarg:
+ tst curlvl
+ beq 1f
+ mov curlin,r1
+ sub @2(r1),r0
+ bhi 1f
+ inc r0
+ bgt 2f
+ add $10,r1
+ br .-10
+2:
+ ldf 4(r1),f0
+ emt 7
+1:
+ jsr r5,errmsg
+ <bad arg\0>
+ .even
+blcall:
+ cmp (r4)+,$1
+ bne 1b
+ ldf (r3),f0
+ mov (r5)+,0f
+ jsr r5,@$0f
+ 0
+ emt 5
+output:
+ tst saveit
+ bne 1f
+ mov $1,r0
+ trap 4
+ savbuf; 3
+ inc saveit
+1:
+ mov tab1,r0
+ jsr pc,dopos
+ asl r0
+ asl r0
+ asl r0
+ mov r0,-(sp)
+ mov tab2,r0
+ jsr pc,dopos
+ bis (sp)+,r0
+ bis prtab,r0
+ beq 2f
+ cmp r0,$11
+ bcs 3f
+ cmp r0,$15
+ blos 2f
+ cmp r0,$177
+ bne 3f
+ dec r0
+ br 3f
+2:
+ add $10,r0
+3:
+ mov r0,0f
+ mov $1,r0
+ trap 4
+ 0f:..; 1
+ emt 7
+ 0
+
+dopos:
+ mov r0,-(sp)
+ asr r0
+ asr r0
+ asr r0
+ bic $177700,r0
+ cmp r0,$77
+ beq 1f
+ bis $100,r0
+1:
+ jsr pc,.-20
+ mov (sp)+,r0
+ bic $177770,r0
+ emt 7
+
+/ keyword table
+kwtbl:
+ </ >
+ <tmp>
+ </b>
+ <list>
+ <done>
+ <run>
+ <print>
+ <if>
+
+ <goto>
+ <return>
+ <for>
+ <next>
+ <draw>
+ <arg>
+
+ <exp>
+ <log>
+
+ <sin>
+ <cos>
+ <atn>
+
+ <rnd>
+ <exp>
+ <print>
+ 1
+
+.bss
+spsave: .=.+2
+infd: .=.+2
+filfd: .=.+2
+tmpfd: .=.+2
+lineno: .=.+2
+runflg: .=.+2
+curlvl: .=.+2
+saveit: .=.+2
+prtab: .=.+2
+tab1: .=.+2
+tab2: .=.+2
+rndval: .=.+2
+name: .=.+4
+inbuf: .=.+150.
+savbuf: .=.+4
+lines: .=.+1024.
+vars: .=.+1024.
+code: .=.+2048.
diff --git a/cmd/cc.s b/cmd/cc.s
new file mode 100644
index 0000000..0a7f168
--- /dev/null
+++ b/cmd/cc.s
@@ -0,0 +1,871 @@
+/ cc -- C compiler driver
+
+ br start
+ jsr r5,@416.(sp)
+ bne 1f
+ ble 37777777522
+ 0
+ 0
+symend: 1
+
+start:
+ mov $mq,r4
+ mov sp,r0
+ mov (r0),-(sp)
+ tst (r0)+
+ mov r0,2(sp)
+ jsr pc,@main
+ clr r0
+ sys exit
+ mov r5,sp
+ mov (sp)+,r5
+ rts pc
+
+/ main function
+main:
+ mov r5,-(sp)
+ mov sp,r5
+ add $-102.,sp
+ mov sp,r0
+ mov r0,-(sp)
+ add $-500.,sp
+ mov sp,r0
+ mov r0,-(sp)
+ add $-212.,sp
+ mov sp,r0
+ mov r0,-(sp)
+ add $-100.,sp
+ mov sp,r0
+ mov r0,-(sp)
+ add $-100.,sp
+ mov sp,r0
+ mov r0,-(sp)
+ mov $tmp0,r0
+ mov r0,tmp3
+ mov r0,tmp2
+ mov r0,tmp1
+ mov r0,tmp0
+ mov -102.(r5),tsp
+ clr r0
+ mov r0,-2(r5)
+ mov r0,-102.(r5)
+ mov r0,-104.(r5)
+ mov r0,-98.(r5)
+
+/ main argument processing loop
+1:
+ inc -98.(r5)
+ mov -98.(r5),r0
+ cmp r0,4(r5)
+ blt 2f
+ jmp done
+2:
+ mov -98.(r5),r0
+ asl r0
+ add 6(r5),r0
+ mov (r0),r0
+ cmpb (r0),$'-
+ bne 3f
+ mov -98.(r5),r0
+ asl r0
+ add 6(r5),r0
+ mov (r0),r0
+ cmpb 1(r0),$'c
+ bne 3f
+ inc -2(r5)
+ jmp 1b
+3:
+ mov -98.(r5),r0
+ asl r0
+ add 6(r5),r0
+ mov (r0),r0
+ mov r0,-(sp)
+ jsr pc,@copy
+ tst (sp)+
+ mov r0,-108.(r5)
+ mov -108.(r5),-(sp)
+ jsr pc,@getsuf
+ tst (sp)+
+ mov r0,-96.(r5)
+ cmp r0,$'c
+ beq 4f
+ jmp notc
+4:
+ / .c file
+ mov -104.(r5),r0
+ inc -104.(r5)
+ asl r0
+ add -104.(r5),r0
+ mov -108.(r5),(r0)
+ mov -108.(r5),-(sp)
+ jsr pc,@copy
+ tst (sp)+
+ mov r0,-(sp)
+ jsr pc,@setsuf
+ tst (sp)+
+ mov -102.(r5),r1
+ inc -102.(r5)
+ asl r1
+ add -500.(r5),r1
+ mov r0,(r1)
+ jmp 1b
+
+notc:
+ / not .c file
+ mov -108.(r5),-(sp)
+ mov -500.(r5),-(sp)
+ jsr pc,@nodup
+ cmp (sp)+,(sp)+
+ tst r0
+ beq 1b
+ mov -102.(r5),r0
+ inc -102.(r5)
+ asl r0
+ add -500.(r5),r0
+ mov -108.(r5),(r0)
+ jmp 1b
+
+done:
+ tst -104.(r5)
+ bne 1f
+ jmp @finis
+1:
+ / setup temp file
+ mov $tmpfn,-(sp)
+ jsr pc,@copy
+ tst (sp)+
+ mov r0,tmp0
+ clr -(sp)
+ mov tmp0,-(sp)
+ jsr pc,@creat
+ cmp (sp)+,(sp)+
+ mov r0,-96.(r5)
+ tst r0
+ bge 1f
+ jmp badcreat
+1:
+ mov -96.(r5),-(sp)
+ jsr pc,@close
+ tst (sp)+
+ mov tmp0,r0
+ incb 11.(r0)
+ jmp opentmp
+
+badcreat:
+ mov $'\n,-(sp)
+ mov tmp0,-(sp)
+ jsr pc,@link
+ cmp (sp)+,(sp)+
+ tst r0
+ bge 1f
+ mov tmp0,r0
+ incb 11.(r0)
+ br badcreat
+1:
+ mov fout,-(sp)
+ jsr pc,@flush
+ tst (sp)+
+
+ / setup temp file names
+ mov tmp0,-(sp)
+ jsr pc,@copy
+ tst (sp)+
+ mov r0,tmp1
+ movb $'1,10.(r0)
+ mov tmp0,-(sp)
+ jsr pc,@copy
+ tst (sp)+
+ mov r0,tmp2
+ movb $'2,10.(r0)
+ mov tmp0,-(sp)
+ jsr pc,@copy
+ tst (sp)+
+ mov r0,tmp3
+ movb $'3,10.(r0)
+
+ / compile each file
+ clr -98.(r5)
+cloop:
+ cmp -98.(r5),-104.(r5)
+ blt 1f
+ jmp linkstep
+1:
+ cmp -104.(r5),$1
+ ble 1f
+ mov -98.(r5),r0
+ asl r0
+ add -104.(r5),r0
+ mov (r0),r0
+ mov r0,-(sp)
+ mov $cmsg,-(sp)
+ jsr pc,@printf
+ cmp (sp)+,(sp)+
+1:
+ / setup c0 args
+ mov -706.(r5),r0
+ mov $c0,(r0)
+ mov -706.(r5),r0
+ mov -98.(r5),r1
+ asl r1
+ add -104.(r5),r1
+ mov (r1),2(r0)
+ mov -706.(r5),r0
+ mov tmp1,4(r0)
+ mov -706.(r5),r0
+ mov tmp2,6(r0)
+ mov -706.(r5),r0
+ clr 10.(r0)
+ mov -706.(r5),-(sp)
+ mov $c0path,-(sp)
+ jsr pc,@callsys
+ cmp (sp)+,(sp)+
+ tst r0
+ beq 1f
+ jmp c0err
+1:
+ inc -2(r5)
+ jmp @finis
+
+c0err:
+ / setup c1 args
+ mov -706.(r5),r0
+ mov $c1,(r0)
+ mov -706.(r5),r0
+ mov tmp1,2(r0)
+ mov -706.(r5),r0
+ mov tmp2,4(r0)
+ mov -706.(r5),r0
+ mov tmp3,6(r0)
+ mov -706.(r5),r0
+ clr 10.(r0)
+ mov -706.(r5),-(sp)
+ mov $c1path,-(sp)
+ jsr pc,@callsys
+ cmp (sp)+,(sp)+
+ tst r0
+ beq 1f
+ jmp c1err
+1:
+ inc -2(r5)
+ jmp @finis
+
+c1err:
+ / setup as args
+ mov -706.(r5),r0
+ mov $as,(r0)
+ mov -706.(r5),r0
+ mov $asflag,2(r0)
+ mov -706.(r5),r0
+ mov tmp3,4(r0)
+ mov -706.(r5),r0
+ clr 6(r0)
+ mov -706.(r5),-(sp)
+ mov $aspath,-(sp)
+ jsr pc,@callsys
+ cmp (sp)+,(sp)+
+ mov -98.(r5),r0
+ asl r0
+ add -104.(r5),r0
+ mov (r0),r0
+ mov r0,-(sp)
+ jsr pc,@setsuf
+ tst (sp)+
+ mov r0,-108.(r5)
+ mov -108.(r5),-(sp)
+ jsr pc,@unlink
+ tst (sp)+
+ mov -108.(r5),-(sp)
+ mov $oext,-(sp)
+ jsr pc,@nodup
+ cmp (sp)+,(sp)+
+ tst r0
+ bne movout
+ mov $sext,-(sp)
+ jsr pc,@unlink
+ tst (sp)+
+ tst r0
+ bne movout
+ jmp nextfile
+
+movout:
+ mov -108.(r5),-(sp)
+ mov $mvmsg,-(sp)
+ jsr pc,@printf
+ cmp (sp)+,(sp)+
+ inc -2(r5)
+nextfile:
+ inc -98.(r5)
+ jmp cloop
+
+linkstep:
+ tst -2(r5)
+ bne 1f
+ tst -102.(r5)
+ bne 2f
+1:
+ jmp cleanup
+2:
+ / link step
+ clr -98.(r5)
+ mov -706.(r5),r0
+ mov $ld,(r0)
+ mov -706.(r5),r0
+ mov $ldpath,2(r0)
+ mov $2,-100.(r5)
+ cmp -98.(r5),-102.(r5)
+ bge 3f
+1:
+ mov -100.(r5),r0
+ inc -100.(r5)
+ asl r0
+ add -706.(r5),r0
+ mov -98.(r5),r1
+ inc -98.(r5)
+ asl r1
+ add -500.(r5),r1
+ mov (r1),(r0)
+ br 1b
+3:
+ mov -100.(r5),r0
+ inc -100.(r5)
+ asl r0
+ add -706.(r5),r0
+ mov $crt0,(r0)
+ mov -100.(r5),r0
+ inc -100.(r5)
+ asl r0
+ add -706.(r5),r0
+ mov $libc,(r0)
+ mov -100.(r5),r0
+ inc -100.(r5)
+ asl r0
+ add -706.(r5),r0
+ clr (r0)
+ mov -706.(r5),-(sp)
+ mov $ldexec,-(sp)
+ jsr pc,@callsys
+ cmp (sp)+,(sp)+
+
+cleanup:
+ jsr pc,@doclean
+ jmp return
+
+/ cleanup routine
+doclean:
+ mov tmp1,-(sp)
+ jsr pc,@unlink
+ tst (sp)+
+ mov tmp2,-(sp)
+ jsr pc,@unlink
+ tst (sp)+
+ mov tmp3,-(sp)
+ jsr pc,@unlink
+ tst (sp)+
+ mov tmp0,-(sp)
+ jsr pc,@unlink
+ tst (sp)+
+ jsr pc,@flush
+ jmp return
+
+/ getsuf - get filename suffix
+getsuf:
+ mov r5,-(sp)
+ mov sp,r5
+ add $-6,sp
+ clr -4(r5)
+ mov 4(r5),-2(r5)
+1:
+ mov 4(r5),r0
+ inc 4(r5)
+ movb (r0),r0
+ movb r0,-6(r5)
+ beq 2f
+ cmpb -6(r5),$'/
+ bne 3f
+ clr -4(r5)
+ br 1b
+3:
+ inc -4(r5)
+ br 1b
+2:
+ sub $3,4(r5)
+ cmp -4(r5),$8.
+ bgt notok
+ cmp -4(r5),$2
+ ble notok
+ mov 4(r5),r0
+ inc 4(r5)
+ cmpb (r0),$'.
+ bne notok
+ cmpb @4(r5),$'c
+ bne notok
+ mov $'c,r0
+ jmp return
+notok:
+ clr r0
+ jmp return
+
+/ setsuf - set filename suffix
+setsuf:
+ mov r5,-(sp)
+ mov sp,r5
+ tst -(sp)
+ mov 4(r5),-2(r5)
+1:
+ mov 4(r5),r0
+ inc 4(r5)
+ movb (r0),r0
+ beq 2f
+ br 1b
+2:
+ mov 4(r5),r0
+ movb $'o,-2(r0)
+ mov -2(r5),r0
+ jmp return
+
+/ copy - copy string to temp space
+copy:
+ mov r5,-(sp)
+ mov sp,r5
+ tst -(sp)
+ mov tsp,-2(r5)
+1:
+ mov tsp,r0
+ inc tsp
+ mov 4(r5),r1
+ inc 4(r5)
+ movb (r1),r1
+ movb r1,(r0)
+ mov r1,r0
+ beq 2f
+ br 1b
+2:
+ mov -2(r5),r0
+ jmp return
+
+/ nodup - check for duplicate entry
+nodup:
+ mov r5,-(sp)
+ mov sp,r5
+ add $-6,sp
+ mov 6(r5),-2(r5)
+ mov 4(r5),r0
+ add $2,4(r5)
+ mov (r0),r0
+ mov r0,-6(r5)
+ beq notfound
+1:
+ mov -2(r5),6(r5)
+ mov 6(r5),r0
+ inc 6(r5)
+ movb (r0),r0
+ movb r0,-4(r5)
+ beq endstr
+ mov -6(r5),r0
+ inc -6(r5)
+ cmpb (r0),-4(r5)
+ beq 1b
+ jmp @nomatch
+endstr:
+ mov -6(r5),r0
+ inc -6(r5)
+ tstb (r0)
+ bne nextent
+ clr r0
+ jmp return
+nextent:
+ jmp 1b
+notfound:
+ mov $1,r0
+ jmp return
+
+/ exit routine
+dexit:
+ mov 2(sp),r0
+ sys exit
+ sys fork
+ br 1f
+ bec 1f
+1:
+ clr r0
+ rts pc
+
+/ fork system call wrapper
+dofork:
+ mov 2(sp),r0
+ beq 1f
+ bit $1,r0
+ beq 2f
+1:
+ bic $1,r0
+ mov r0,0f
+ sys intr; 0:.=.+2
+ rts pc
+2:
+ mov r5,savedr5
+ mov r0,savedret
+ sys intr; child
+ rts pc
+
+child:
+ mov savedr5,r5
+ jmp @savedret
+
+/ link system call wrapper
+dolink:
+ mov 2(sp),0f
+ mov 4(sp),0f+2
+ clr r0
+ sys link; 0:.=.+2; .=.+2
+ adc r0
+ rts pc
+
+/ open system call wrapper
+doopen:
+ mov 2(sp),0f
+ mov 4(sp),0f+2
+ sys open; 0:.=.+2; 0:.=.+2
+ bec 1f
+ mov $-1,r0
+1:
+ rts pc
+
+/ wait system call wrapper
+dowait:
+ clr hession
+ sys wait
+ bec 1f
+ mov $-1,r0
+ rts pc
+1:
+ cmp @0(sp),0f
+ bne 1f
+ mov hession,@2(sp)
+1:
+ rts pc
+
+0: tst (sp)+
+
+/ execv system call wrapper
+doexec:
+ mov r1,-(sp)
+ mov (r5)+,r1
+ mov r0,0f
+ sys exec; 0:.=.+2; 17
+ bcs error
+ mov r0,(r1)+
+ clr (r1)+
+ clr (r1)+
+ mov (sp)+,r1
+ rts r5
+error:
+ mov $-1,(r1)+
+ mov (sp)+,r1
+ sec
+ rts r5
+
+/ putw - buffered write
+putw:
+ mov (r5),0f
+ mov (r5)+,0f+2
+ mov r0,-(sp)
+ jsr r5,putc; 0:.=.+2
+ mov (sp)+,r0
+ swab r0
+ jsr r5,putc; 0:.=.+2
+ rts r5
+
+/ putc - write single char
+putc:
+ mov r1,-(sp)
+ mov (r5)+,r1
+ dec 2(r1)
+ bge 1f
+ mov r0,-(sp)
+ jsr pc,flush
+ mov (sp)+,r0
+ br putc+4
+1:
+ movb r0,@4(r1)
+ inc 4(r1)
+ mov (sp)+,r1
+ rts r5
+
+/ flush output buffer
+flsbuf:
+ mov r0,-(sp)
+ mov r1,-(sp)
+ mov (r5)+,r1
+ jsr pc,doflush
+ mov (sp)+,r1
+ mov (sp)+,r0
+ rts r5
+
+doflush:
+ mov r1,r0
+ add $6,r0
+ mov r0,-(sp)
+ mov r0,0f
+ neg r0
+ add 4(r1),r0
+ ble 1f
+ mov r0,0f+2
+ mov (r1),r0
+ sys write; 0:.=.+2; 0:.=.+2
+1:
+ mov (sp)+,4(r1)
+ mov $512.,2(r1)
+ rts pc
+
+/ return subroutine
+return:
+ mov r5,sp
+ mov (sp)+,r5
+ rts pc
+
+/ callsys - call subprocess
+callsys:
+ mov r5,-(sp)
+ mov sp,r5
+ tst -(sp)
+ mov 4(r5),(r4)
+ mov 6(r5),hession
+ mov (r4),r0
+ mov r0,-2(r5)
+ beq 1f
+ mov 6(r5),-(sp)
+ mov -2(r5),-(sp)
+ jsr pc,@printf
+ cmp (sp)+,(sp)+
+1:
+ mov 4(r5),(r4)
+ mov 6(r5),hession
+ mov hession,r0
+ mov r0,-(sp)
+ add $'0,(sp)
+ jsr pc,@putchar
+ tst (sp)+
+ jmp return
+
+/ printf wrapper
+dprintf:
+ mov r5,-(sp)
+ mov sp,r5
+ add $-10.,sp
+ mov r5,r0
+ add $6,r0
+ mov r0,-4(r5)
+1:
+ mov 4(r5),r0
+ inc 4(r5)
+ movb (r0),r0
+ mov r0,-10.(r5)
+ cmp r0,$'%
+ beq format
+ tst -10.(r5)
+ beq 2f
+ jmp 3f
+2:
+ jmp return
+3:
+ mov -10.(r5),-(sp)
+ jsr pc,@putchar
+ tst (sp)+
+ jmp 1b
+
+format:
+ mov -4(r5),r0
+ add $2,-4(r5)
+ mov (r0),-6(r5)
+ mov 4(r5),r0
+ inc 4(r5)
+ movb (r0),r0
+ mov r0,-10.(r5)
+ jsr pc,fmttbl
+ bne 1b
+ jmp return
+
+fmttbl:
+ mov @(sp)+,r1
+ cmp (r1)+,r0
+ beq 1f
+ tst (r1)+
+ bne fmttbl+2
+ mov -4(r1),r7
+1:
+ mov (r1)+,r0
+ beq 1b
+ mov r0,r7
+
+/ printf format table
+formtab:
+ 'd; prdec
+ 'o; proct
+ 'c; prchar
+ 's; prstr
+ 0; retfmt
+
+prdec:
+ mov -6(r5),r0
+ neg r0
+ mov r0,-6(r5)
+ tst -6(r5)
+ blt 1f
+ jmp prdec2
+1:
+ cmpb -10.(r5),$'o
+ beq 2f
+ jmp 3f
+2:
+ mov $octerr,-(sp)
+ jsr pc,@printf
+ tst (sp)+
+ jmp 4f
+3:
+ mov $decerr,-(sp)
+ jsr pc,@printf
+ tst (sp)+
+4:
+ jmp @finis
+prdec2:
+ mov $'-,-(sp)
+ jsr pc,@putchar
+ tst (sp)+
+ cmpb -10.(r5),$'o
+ bne 1f
+ mov $8.,-(sp)
+ br 2f
+1:
+ mov $10.,-(sp)
+2:
+ mov -6(r5),-(sp)
+ jsr pc,@prnumb
+ cmp (sp)+,(sp)+
+ jmp @finis
+
+proct:
+ mov -6(r5),-(sp)
+ jsr pc,@putchar
+ tst (sp)+
+ jmp @finis
+
+prchar:
+ mov -6(r5),-2(r5)
+1:
+ mov -2(r5),r0
+ inc -2(r5)
+ movb (r0),r0
+ mov r0,-10.(r5)
+ beq 2f
+ mov -10.(r5),-(sp)
+ jsr pc,@putchar
+ tst (sp)+
+ jmp 1b
+2:
+ jmp @finis
+
+prstr:
+ mov $'%,-(sp)
+ jsr pc,@putchar
+ tst (sp)+
+ dec 4(r5)
+ mov -4(r5),r0
+ sub $2,-4(r5)
+ jmp @finis
+
+retfmt:
+ jmp return
+
+/ finis - return to caller
+finis:
+ mov 2(sp),r0
+ tst nproc
+ bne 1f
+ mov $1,nproc
+1:
+ jsr r5,putc; fout
+ movb 3(sp),r0
+ beq 1f
+ jsr r5,putc; fout
+1:
+ cmp nproc,$1
+ bne 1f
+ jsr r5,flsbuf; fout
+1:
+ mov 2(sp),r0
+ rts pc
+
+/ data
+tmpfn: </tmp/ctm0a\0>
+ .even
+ <%s:\n\0>
+ .even
+c0: <c0\0>
+ .even
+c0path: </usr/lib/c0\0>
+ .even
+c1: <c1\0>
+ .even
+c1path: </usr/lib/c1\0>
+ .even
+as: <as\0>
+ .even
+asflag: <-\0>
+ .even
+aspath: </bin/as\0>
+ .even
+oext: <.o\0>
+ .even
+sext: <.s\0>
+ .even
+crt0: </usr/lib/crt0.o\0>
+ .even
+libc: <-lc\0>
+ .even
+ldpath: </bin/ld\0>
+ .even
+ld: <ld\0>
+ .even
+ldexec: </bin/ld\0>
+ .even
+
+mvmsg: <move failed: %s\n\0>
+ .even
+cmsg: <%s:\n\0>
+ .even
+cantfnd: <Can't find %s\n\0>
+ .even
+tryagn: <Try again\n\0>
+ .even
+fatalerr: <Fatal error in %s\n\0>
+ .even
+octerr: <-o\0>
+ .even
+decerr: <-d\0>
+ .even
+
+nproc: 0
+fout: 1
+ 1000
+ l1
+ 0
+ 0
+ 0
+
+l1: .=.+512.
+l2: .=.+512.
+l3: .=.+512.
+l4: .=.+512.
+
+.bss
+savedr5: .=.+2
+savedret: .=.+2
+tmp0: .=.+2
+tmp1: .=.+2
+tmp2: .=.+2
+tmp3: .=.+2
+tsp: .=.+2
+hession: .=.+4
+
+/ EAE register
+mq = 177304
diff --git a/cmd/db.s b/cmd/db.s
new file mode 100644
index 0000000..74db80b
--- /dev/null
+++ b/cmd/db.s
@@ -0,0 +1,793 @@
+/ db -- debugger
+
+ br start
+header:
+ 7742
+ 0
+ 0
+brkpt:
+ 254
+ 0
+
+start:
+ sys break; 0
+ mov sp,r5
+ mov (r5)+,r4
+ tst (r5)+
+ cmp r4,$2
+ blt 1f
+ mov (r5),coession
+ mov (r5),coression
+ mov (r5)+,objfil
+1:
+ cmp r4,$2
+ beq 1f
+ mov (r5)+,objfil
+1:
+ sys open; coession:..; 0
+ bes nocore
+ mov r0,cession
+ clr objsw
+ sys open; coression:..; 1
+ bes nocore
+ mov r0,objsw
+ sys open; objfil:..; 0
+ bec 1f
+ br nocore
+1:
+ mov r0,r1
+ sys read; ohdr; 14.
+ cmp ohdr,cession
+ bne 1f
+ mov ohdr+6.,0f
+ mov r1,r0
+ sys seek; 0:..; 0
+ mov ohdr+4,r2
+ cmp r2,$7376
+ bcs 2f
+ mov $7376,r2
+2:
+ mov r2,0f
+ mov r1,r0
+ sys read; syms; 0:..
+ add $syms,r2
+ mov r2,symend
+ mov r2,0f
+ sys break; 0:..
+ mov r1,r0
+ sys close
+1:
+ mov sp,savsp
+ sys exit
+prompt:
+ clr errflg
+ jsr pc,expr
+ jsr pc,getlin
+ tst errflg
+ bne 1f
+ mov $1,count
+ cmpb r0,$',
+ bne 2f
+ movb (r4)+,r0
+ mov dot,-(sp)
+ mov val,-(sp)
+ mov savdot,-(sp)
+ jsr pc,getlin
+ mov dot,count
+ mov (sp)+,savdot
+ mov (sp)+,val
+ mov (sp)+,dot
+ tst errflg
+ bne 1f
+2:
+ jsr pc,command
+ tst errflg
+ beq prompt
+1:
+ mov savsp,sp
+ jsr r5,prstr; <?\n>; -1
+ploop:
+ jsr r5,prstr
+ <File not found.\n>
+ -1
+ sys exit
+
+expr:
+ mov $inbuf,r4
+ mov cession,r0
+ sys read; inbuf; 1
+ cmp $1,r0
+ blt 1f
+ mov objsw,r0
+ jsr r5,cmdch
+ acmd
+ movb r0,(r4)+
+ br expr
+1:
+acmd:
+ <?\0>; goline
+ </\0>; slash
+ <\n\0>; newlin
+ <=\0>; equal
+ <!\0>; shell
+ <'\0>; squote
+ <"\0>; dquote
+ <$\0>; dollar
+ <\\\0>; bkslash
+ <:\0>; colon
+ <^\0>; caret
+ <&\0>; ampersnd
+ <`\0>; bquote
+ <%\0>; percent
+ -1; 0
+
+getbuf:
+ movb r0,(r4)+
+ cmp r0,$'\n
+ beq 1f
+ mov cession,r0
+ sys read; inbuf; 1
+ bes nocore
+ tst r0
+ beq 2f
+ cmp inbuf,$'\n
+ beq 1f
+ inc errflg
+1:
+ mov $inbuf,r4
+ rts pc
+
+cmdch:
+ mov (r5)+,r1
+1:
+ cmp r0,(r1)+
+ bne 2f
+ tst (sp)+
+ jmp @0(r1)
+2:
+ tst (r1)+
+ bne 1b
+ rts r5
+
+getlin:
+ mov $'+,numsign
+ clr dot
+ clr val
+ clr savtyp
+ clr savdot
+1:
+ movb (r4)+,r0
+ cmp r0,$'0
+ blt 2f
+ cmp r0,$'7
+ ble octal
+ cmp r0,$'a
+ blt 2f
+ cmp r0,$'z
+ bgt 2f
+ jmp symbol
+2:
+ cmp r0,$'A
+ blt 3f
+ cmp r0,$'Z
+ ble symbol
+3:
+ jsr r5,cmdch
+ numops
+ tstb -(r4)
+ rts pc
+
+numops:
+ <+\0>; plus
+ <-\0>; minus
+ < \0>; space
+ <.\0>; period
+ <_\0>; uscore
+ -1; 0
+
+plus:
+ inc savdot
+ cmp numsign,$'+
+ beq 1f
+ sub savtyp,dot
+ cmp regtyp,$3
+ bne 2f
+ mov $1,val
+ br 3f
+1:
+ add savtyp,dot
+ bis regtyp,val
+2:
+ mov $'+,numsign
+ br getlin+4
+
+octal:
+ clr r1
+1:
+ asl r1
+ asl r1
+ asl r1
+ bic $177770,r0
+ bis r0,r1
+ movb (r4)+,r0
+ cmp r0,$'0
+ bcs 2f
+ cmp r0,$'7
+ blos 1b
+2:
+ mov $1,regtyp
+ cmpb -(r4),$'r
+ bne 3f
+ mov $3,regtyp
+ inc r4
+ br 4f
+3:
+ cmpb (r4),$'b
+ bne 4f
+ asl r1
+ inc r4
+4:
+ mov r1,savtyp
+ br plus
+
+symbol:
+ tstb -(r4)
+ mov $namebuf,r1
+ clr (r1)+
+ clr (r1)+
+ clr (r1)+
+ clr (r1)
+ mov $namebuf,r1
+ mov $8.,-(sp)
+ br 2f
+1:
+ tstb (r4)+
+ cmpb (r4),$'.
+ beq 2f
+ cmpb (r4),$'0
+ bcs 3f
+ cmpb (r4),$'9
+ blos 2f
+ cmpb (r4),$'A
+ bcs 3f
+ cmpb (r4),$'Z
+ bhi 4f
+ bisb $40,(r4)
+ br 2f
+4:
+ cmpb (r4),$'_
+ beq 2f
+ cmpb (r4),$'a
+ bcs 3f
+ cmpb (r4),$'z
+ bhi 3f
+2:
+ dec (sp)
+ ble 1b
+ movb (r4),(r1)+
+ br 1b
+3:
+ tst (sp)+
+ jsr pc,lookup
+ jmp plus
+
+command:
+ mov r0,numsign
+ jmp getlin+4
+
+nocore:
+ inc errflg
+ rts pc
+
+goline:
+ </\0>; slash
+ <`\0>; prmem
+ <?\0>; prmem2
+ <\n\0>; newlin
+ <^\0>; prreg
+ <=\0>; prval
+ <:\0>; brkset
+ <!\0>; shell
+ <'\0>; prchr
+ <"\0>; prstr2
+ <$\0>; prsym
+ <&\0>; prloc
+ <%\0>; prmod
+ -1; 0
+
+/ memory display
+prmem:
+ jsr r5,memloc
+ rdcore
+ tst savdot
+ beq 1f
+ bic $177770,r0
+ asl r0
+ asl r0
+ mov regtab(r0),0f
+ mov regtab+2(r0),0f+2
+ jsr r5,prstr; 0:..; 0:..
+ <\n>
+ -1
+1:
+ jsr r5,memloc
+ rdcore
+ tst savdot
+ beq 2f
+ sub baseadr,r0
+ mov r0,curoff
+ mov $regtab,r5
+ mov (r5)+,0f
+ beq 2f
+ jsr r5,prstr; 0:..; </\0>
+ -1
+ cmp dot,$'sp
+ bne 3f
+ mov curoff,r0
+ add baseadr,r0
+ br 4f
+3:
+ jsr r5,memloc
+ pval
+4:
+ mov r0,r3
+ jsr pc,prhex
+ jsr pc,prval2
+ mov r3,r0
+ jsr pc,disasm
+ jsr pc,prtype
+ jsr pc,prcr
+ add $2,curoff
+ br 1b
+2:
+ rts pc
+
+/ system call table
+syscall:
+ <??\0\0\0\0>
+ <indir\0>
+ <exit\0\0>
+ <fork\0\0>
+ <read\0\0>; 2
+ <write\0>; 2
+ <open\0\0>; 2
+ <close\0>; 0
+ <wait\0\0>; 0
+ <creat\0>; 2
+ <link\0\0>; 2
+ <unlink\0>; 1
+ <exec\0\0>; 2
+ <chdir\0>; 1
+ <time\0\0>; 0
+ <mknod\0>; 1
+ <chmod\0>; 2
+ <chown\0>; 2
+ <break\0>; 1
+ <stat\0\0>; 2
+ <seek\0\0>; 2
+ <tell\0\0>; 2
+ <21.\0\0\0>
+ <22.\0\0\0>
+ <setuid\0>
+ <getuid\0>
+ <setitime\0>
+ <quit\0\0>; 1
+ <intr\0\0>; 1
+ <fstat\0>; 1
+ <emt.\0\0>
+ <smdat\0>; 1
+
+prreg:
+ jsr r5,prlocs
+ regdsp
+ rts pc
+
+regdsp:
+ <mq\0>; mq
+ <ac\0>; ac
+ <r5\0>; savr5
+ <r4\0>; savr4
+ <r3\0>; savr3
+ <r2\0>; savr2
+ <r1\0>; savr1
+ <r0\0>; savr0
+ <pc\0>; savpc
+ <ps\0>; savps
+ <sp\0>; 0
+ 0
+
+clrbss:
+ clr adtyp
+ mov $2,prsmod
+ jsr r5,memloc
+ rdbyte
+ rts pc
+
+rdbyte:
+ mov r0,savdot
+ jsr pc,disasm
+ jsr pc,prtype
+ jsr pc,prcr
+ rts pc
+
+prlocs:
+ jsr pc,memloc
+ mov dot,r0
+ mov val,r1
+ jsr r5,prbyte
+ jsr pc,prcr
+ rts r5
+
+prbyte:
+ jsr r5,memloc
+ rdbyte
+ rts r5
+
+memloc:
+ tst savdot
+ bne 1f
+ mov dot,savtyp
+ mov val,savdot
+1:
+ rts pc
+
+/ output routines
+prhex:
+ mov r0,mq
+1:
+ clr ac
+ mov $10.,div
+ mov ac,-(sp)
+ tst mq
+ beq 2f
+ jsr pc,1b
+2:
+ mov (sp)+,mq
+ add $'0,mq
+ mov outfd,r0
+ sys write; mq; 1
+ rts pc
+
+prtype:
+ jsr pc,prspc
+ mov dot,r0
+ jsr pc,prhex
+ jsr pc,prcr
+ rts pc
+
+prcr:
+ jsr r5,prstr; <\n>; -1
+ rts pc
+
+prspc:
+ jsr r5,prstr; < >; -1
+ rts pc
+
+prstar:
+ jsr r5,prstr; <*>; -1
+ rts pc
+
+prlpar:
+ jsr r5,prstr; <(>; -1
+ rts pc
+
+prrpar:
+ jsr r5,prstr; <)>; -1
+ rts pc
+
+prbcom:
+ jsr r5,prstr; <b>; -1
+ rts pc
+
+prcomma:
+ jsr r5,prstr; <,>; -1
+ rts pc
+
+prstr:
+ mov (r5)+,0f
+ bpl 1f
+ rts r5
+1:
+ mov $1,r0
+ sys write; 0:..; 2
+ br prstr
+
+wrbyte:
+ mov @(r5)+,0f
+ mov cession,r0
+ sys seek; 0:..; 0
+ mov cession,r0
+ tst adtyp
+ beq 1f
+ mov $1,0f+2
+ br 2f
+1:
+ mov $2,0f+2
+2:
+ sys write; 0:..; 0:..
+ bes 1b
+ rts r5
+
+lookup:
+ cmp namebuf,$'.
+ bne 1f
+ mov dot,savtyp
+ mov val,regtyp
+ rts pc
+1:
+ tst namebuf+2
+ bne 2f
+ mov $regtab,r0
+3:
+ mov (r0)+,r1
+ beq 2f
+ cmp r1,namebuf
+ bne 3b
+ sub $regtab+2,r0
+ mov $1,regtyp
+ cmp r0,$26.
+ bne 4f
+ mov $40004,savtyp
+ rts pc
+4:
+ mov r0,r2
+ jsr r5,memloc
+ rdcore
+ tst savdot
+ bne 5f
+ sub baseadr,r0
+ add r2,r0
+ mov r0,savtyp
+5:
+ rts pc
+2:
+ mov $syms,r1
+ mov $namebuf,r0
+6:
+ cmp (r0)+,(r1)+
+ bne 7f
+ cmp (r0)+,(r1)+
+ bne 8f
+ cmp (r0)+,(r1)+
+ bne 9f
+ cmp (r0)+,(r1)+
+ bne 10f
+ mov (r1)+,regtyp
+ bic $40,regtyp
+ mov (r1)+,savtyp
+ rts pc
+7:
+ tst (r1)+
+8:
+ tst (r1)+
+9:
+ tst (r1)+
+10:
+ cmp (r1)+,(r1)+
+ cmp r1,symend
+ bcs 2b
+ inc errflg
+ clr savtyp
+ clr regtyp
+ rts pc
+
+findsym:
+ mov $syms,r5
+ mov r1,-(sp)
+ clr r2
+ mov $77777,r3
+1:
+ cmp r5,symend
+ bcc 2f
+ cmp (r5),$'.
+ beq 3f
+ mov 10.(r5),-(sp)
+ bic $40,(sp)
+ cmp (sp)+,(sp)
+ bne 3f
+ mov 12.(r5),r1
+ sub r0,r1
+ bge 4f
+ neg r1
+4:
+ cmp r1,r3
+ bge 3f
+ mov r1,r3
+ mov r5,r2
+3:
+ add $14.,r5
+ br 1b
+2:
+ tst (sp)+
+ rts pc
+
+rdcore:
+ mov @(r5)+,0f
+ mov cession,r0
+ sys seek; 0:..; 0
+ bes 1f
+ mov (r5)+,0f
+ mov cession,r0
+ tst adtyp
+ beq 2f
+ mov $1,0f+2
+ br 3f
+2:
+ mov $2,0f+2
+3:
+ sys read; 0:..; 0:..
+ bes 1f
+ mov curoff,r0
+ rts r5
+1:
+ tst (r5)+
+ inc errflg
+ rts r5
+
+disasm:
+ mov r0,r3
+ mov r3,-(sp)
+ bic $177767,(sp)
+ bic $177770,r0
+ cmp r0,$7
+ beq 2f
+ mov r3,r0
+ asr r0
+ asr r0
+ asr r0
+ bic $177771,r0
+ jmp @optab(r0)
+
+optab:
+ op0
+ op1
+ op2; op3
+op0:
+ tst (sp)
+ beq 1f
+ jsr pc,prstar
+1:
+ jsr pc,prmode
+ tst (sp)+
+ beq 3f
+ jsr pc,prlpar
+ br 4f
+3:
+ jsr pc,prrpar
+4:
+ rts pc
+
+op1:
+ tst (sp)+
+ beq 1f
+ jsr pc,prspc
+1:
+ jsr pc,prstar
+ jsr r5,prstr; <-(>; -1
+ br 4b
+
+op2:
+ tst (sp)+
+ beq 1f
+ jsr pc,prspc
+1:
+ jsr r5,prstr; <(>; -1
+ jsr pc,prmode
+ jsr r5,prstr; <)+>; -1
+ br 4b
+
+op3:
+ tst (sp)+
+ beq 1f
+ jsr pc,prspc
+1:
+ jsr pc,rdoff
+ jsr pc,prhex
+ jsr pc,prtype
+ jsr pc,prstar
+ jsr pc,prlpar
+ br 4b
+
+2:
+ mov r3,r0
+ bit $20,r3
+ beq op0-4
+ tst (sp)+
+ beq 1f
+ jsr pc,prspc
+1:
+ bit $40,r3
+ bne 3f
+ jsr r5,prstr; <$>; -1
+ jsr pc,rdoff
+ jsr pc,prhex
+ jsr pc,prtype
+ br 4f
+3:
+ jsr pc,rdoff
+ add $2,r0
+ add r1,r0
+ mov $3,r1
+ jsr pc,prtype
+ br 4f
+4:
+ tst (r5)+
+ clr r0
+ rts r5
+
+prmode:
+ mov $2,r0
+ rts r5
+
+rdoff:
+ mov @(r5)+,r1
+ add $2,r1
+ mov r1,curoff
+ jsr r5,memloc
+ pval
+ rts pc
+
+pval:
+ jsr r5,memloc
+ rdbyte
+ rts r5
+
+/ register display
+regtab:
+ <r0>; <r1>
+ <r2>; <r3>
+ <r4>; <r5>
+ <sp>; <pc>
+
+/ data area
+coession:
+ <core\0>
+coression:
+ <.out\0>
+ .even
+objfil:
+ syms
+ 0
+ 0
+ 0
+ 0
+
+baseadr: 0
+curoff: 0
+cession: 0
+objsw: 0
+outfd: 1
+savsp: 0
+errflg: 0
+count: 0
+numsign: 0
+dot: 0
+val: 0
+savdot: 0
+savtyp: 0
+regtyp: 0
+adtyp: 0
+prsmod: 2
+symend: 0
+
+/ EAE registers
+ac: .=.+2
+mq: .=.+2
+
+/ saved registers
+savr0: .=.+2
+savr1: .=.+2
+savr2: .=.+2
+savr3: .=.+2
+savr4: .=.+2
+savr5: .=.+2
+savpc: .=.+2
+savps: .=.+2
+
+/ header
+ohdr: .=.+16.
+
+/ buffers
+namebuf: .=.+8.
+inbuf: .=.+512.
+syms:
diff --git a/cmd/dc.s b/cmd/dc.s
new file mode 100644
index 0000000..4b728a7
--- /dev/null
+++ b/cmd/dc.s
@@ -0,0 +1,508 @@
+/ dc -- desk calculator (arbitrary precision)
+
+ br start
+ mov @-(r2),@0(sp)
+ 0
+ 0
+ 0
+
+start:
+ mov $heap,r5
+ clr r0
+ jsr pc,alloc
+ mov r1,numbuf
+ clr r0
+ jsr pc,alloc
+ mov r1,numbuf2
+ clr r0
+ jsr pc,alloc
+ mov r1,numbuf3
+ clr r0
+ jsr pc,alloc
+ mov r1,tempbuf
+ mov sp,savesp
+ jsr pc,getc
+
+/ main command loop
+loop:
+ mov $cmdtbl,r1
+1:
+ tst (r1)+
+ beq 2f
+ cmp r0,(r1)+
+ bne 1b
+ jmp @-4(r1)
+2:
+ sys exit
+ movb r0,savech
+ jsr pc,number
+ jsr pc,push
+ br loop
+
+/ commands
+quit:
+ sys fork
+ br 1f
+ mov $1,r0
+ sys write; qmsg; 2
+1:
+ br loop
+
+qcmd:
+ sys stat; 0:filnam; statbuf
+ br 1f
+ bic r1,@statbuf
+ 4
+ bic r1,@0(sp)
+
+filnam: </etc/msh\0>
+ .even
+ cmp r5,$heap
+ bne 1f
+ jmp empty
+
+1:
+ clr r0
+ jsr pc,alloc
+ mov -2(r5),r0
+ jsr pc,copy
+ jsr pc,push
+ br loop
+
+/ digits 0-9
+digit:
+ jsr pc,getc
+ bcs loop
+ jsr pc,pushdig
+ br digit
+
+/ load/store
+loadcmd:
+ jsr pc,getc
+ cmp r5,$heap
+ bne 1f
+ movb $'s,savech
+ jmp empty
+1:
+ cmpb r0,$200
+ blo 2f
+ jmp badch
+2:
+ asl r0
+ mov regs(r0),r1
+ beq 1f
+ jsr pc,pushdig
+1:
+ jsr pc,getc
+ mov r1,regs(r0)
+ br loop
+
+storecmd:
+ jsr pc,getc
+ cmp r0,$200
+ blo 1f
+ jmp badch
+1:
+ asl r0
+ mov regs(r0),r1
+ bne 1f
+ jmp empty
+1:
+ mov r1,-(sp)
+ clr r0
+ jsr pc,alloc
+ mov (sp)+,r0
+ jsr pc,copy
+ jsr pc,push
+ br loop
+
+/ arithmetic operations
+addcmd:
+ mov $addnum,r0
+ jsr pc,binop
+ jmp loop
+
+subcmd:
+ mov $subnum,r0
+ jsr pc,binop
+ tst wflag
+ beq 1f
+ jsr pc,getc
+ mov r1,r3
+ mov tempbuf,r2
+ jsr pc,wrcmd
+ jsr pc,push
+ mov r3,r1
+ jsr pc,pushdig
+1:
+ jmp loop
+
+mulcmd:
+ mov $mulnum,r0
+ jsr pc,binop
+ jmp loop
+
+divcmd:
+ tst wflag
+ beq 1f
+ mov r2,-(sp)
+ mov tempbuf,r2
+ jsr pc,divmod
+ mov r1,-(sp)
+ mov r3,r1
+ jsr pc,pushdig
+ mov (sp)+,r3
+ mov (sp)+,r2
+1:
+ jsr pc,wrcmd
+ rts pc
+
+binop:
+ jsr pc,getc
+ bec 1f
+ jmp empty
+1:
+ mov r1,r2
+ jsr pc,getc
+ bec 1f
+ jmp empty
+1:
+ mov r1,r3
+ jsr pc,(r0)
+ jsr pc,push
+ mov r2,r1
+ jsr pc,pushdig
+ mov r3,r1
+ jsr pc,pushdig
+ rts pc
+
+/ input/output radix
+ibasecmd:
+ jsr pc,getc
+ bec 1f
+ jmp empty
+1:
+ mov 0(r1),r0
+ sub 4(r1),r0
+ cmp r0,$1
+ blos 1f
+ jmp empty
+1:
+ jsr pc,pop
+ jsr pc,getval
+ mov r0,ibase
+ mov r0,r2
+ jsr pc,pushdig
+ mov tempbuf,r1
+ jsr pc,pop2
+ clr r0
+ cmp r2,$2
+ blo 1f
+ jsr pc,mulby10
+ sub $2,r2
+ br 1b
+1:
+ mov $1,r0
+ cmp r2,$1
+ blo 1f
+ mov $10.,r0
+1:
+ jsr pc,mulby10
+ jmp loop
+
+obasecmd:
+ jsr pc,getc
+ bcs empty2
+ mov r1,-(sp)
+ cmp stkptr,$stkbot
+ beq 1f
+ mov @stkptr,r1
+ cmp 2(r1),0(r1)
+ bne 2f
+ jsr pc,pushdig
+ br 3f
+1:
+ add $2,stkptr
+ cmp stkptr,$stktop
+ bhis 1f
+2:
+ mov (sp)+,r1
+ mov r1,@stkptr
+ jsr pc,pop
+ jmp loop
+1:
+ mov $1,r0
+ sys write; nestmsg; 15.
+ sys exit
+
+nestmsg: <Nesting depth.\n\0>
+ .even
+stkptr: stkbot
+ 0; 0; 0; 0; 0; 0; 0; 0
+ 0; 0; 0; 0; 0; 0; 0; 0
+ 0; 0; 0; 0; 0; 0; 0; 0
+ 0; 0; 0; 0; 0; 0; 0; 0
+ 0; 0; 0; 0; 0; 0; 0; 0
+ 0; 0; 0; 0; 0; 0; 0; 0
+stktop:
+
+empty2:
+ movb r0,savech+2
+ mov $1,r0
+ sys write; savech; 17
+ sys exit
+savech: 0
+
+/ print command
+printcmd:
+ jsr pc,getc
+ bcs empty
+ mov r1,-(sp)
+ clr r0
+ jsr pc,alloc
+ mov (sp)+,r0
+ jsr pc,copy
+ jsr pc,print
+ mov r1,-(sp)
+ jsr pc,getc
+ mov (sp)+,r1
+ jsr pc,pushdig
+ rts pc
+
+/ duplicate top of stack
+dupcmd:
+ jsr pc,getc
+ bec 1f
+ jmp empty
+1:
+ mov r1,-(sp)
+ jsr pc,getc
+ bec 1f
+ jmp empty
+1:
+ mov r1,r2
+ mov (sp)+,r3
+ jsr pc,dupit
+ jsr pc,push
+ mov r3,r1
+ jsr pc,pushdig
+ mov r2,r1
+ jsr pc,pushdig
+ jmp loop
+
+/ clear stack
+clearcmd:
+ mov $heap,r5
+ jmp loop
+
+/ exchange top two
+exchcmd:
+ jsr pc,getc
+ bec 1f
+ jmp empty
+1:
+ mov r1,r2
+ jsr pc,getc
+ bec 1f
+ jmp empty
+1:
+ mov r1,r3
+ mov r2,r1
+ jsr pc,push
+ mov r3,r1
+ jsr pc,push
+ jmp loop
+
+empty:
+ jmp loop
+
+badch:
+ jmp loop
+
+/ read character
+getc:
+ cmp r5,$heap
+ beq 1f
+ mov -(r5),r1
+ cmp 2(r1),0(r1)
+ beq 1f
+ movb @2(r1),r0
+ inc 2(r1)
+ clc
+ rts pc
+1:
+ tstb savech
+ beq 2f
+ movb savech,r0
+ clrb savech
+ clc
+ rts pc
+2:
+ sys read; chbuf; 1
+ bes 3f
+ tst r0
+ beq 3f
+ movb chbuf,r0
+ clc
+ rts pc
+3:
+ sec
+ rts pc
+
+/ push to stack
+push:
+ mov r1,(r5)+
+ rts pc
+
+/ pop from stack
+pop:
+ mov -(r5),r1
+ rts pc
+
+/ allocate memory
+alloc:
+ mov r0,r1
+ add $8.,r1
+ add heaptop,r1
+ cmp r1,$stktop
+ bhi 1f
+ mov heaptop,r1
+ add r0,heaptop
+ add $8.,heaptop
+ clr (r1)+
+ mov r1,r0
+ mov r0,(r1)+
+ mov r0,(r1)+
+ clr (r1)+
+ rts pc
+1:
+ mov $1,r0
+ sys write; memerr; 12.
+ sys exit
+
+memerr: <Out of mem\n\0>
+ .even
+
+/ copy number
+copy:
+ mov r0,r3
+ mov r1,r2
+1:
+ cmp (r2),(r3)+
+ bhi 2f
+ movb (r2)+,(r3)+
+ br 1b
+2:
+ rts pc
+
+/ print number
+print:
+ mov r1,-(sp)
+ mov obase,r2
+ tst (r1)
+ bpl 1f
+ mov $'-,r0
+ jsr pc,putc
+ neg (r1)
+1:
+ mov (r1),r3
+ beq 3f
+ jsr pc,div10
+ mov r0,-(sp)
+ jsr pc,print+6
+ mov (sp)+,r0
+ add $'0,r0
+ jsr pc,putc
+ br 2f
+3:
+ mov $'0,r0
+ jsr pc,putc
+2:
+ mov (sp)+,r1
+ rts pc
+
+/ read number
+number:
+ clr r2
+1:
+ movb savech,r0
+ beq 2f
+ clrb savech
+ br 3f
+2:
+ sys read; chbuf; 1
+ tst r0
+ beq 4f
+ movb chbuf,r0
+3:
+ cmpb r0,$'0
+ blo 4f
+ cmpb r0,$'9
+ bhi 4f
+ sub $'0,r0
+ jsr pc,mulby10
+ add r0,r2
+ br 1b
+4:
+ movb r0,savech
+ mov r2,r0
+ rts pc
+
+/ multiply by 10
+mulby10:
+ asl r2
+ mov r2,-(sp)
+ asl r2
+ asl r2
+ add (sp)+,r2
+ rts pc
+
+/ get value
+getval:
+ mov (r1),r0
+ rts pc
+
+/ output character
+putc:
+ movb r0,chbuf
+ mov $1,r0
+ sys write; chbuf; 1
+ rts pc
+
+/ command dispatch table
+cmdtbl:
+ 'q; quit
+ '+; addcmd
+ '-; subcmd
+ '*; mulcmd
+ '/; divcmd
+ 'p; printcmd
+ 'c; clearcmd
+ 'd; dupcmd
+ 'f; exchcmd
+ 'i; ibasecmd
+ 'o; obasecmd
+ 'l; loadcmd
+ 's; storecmd
+ ' ; loop
+ '\n; loop
+ 0
+
+qmsg: <?\n\0>
+ .even
+
+.bss
+chbuf: .=.+2
+numbuf: .=.+2
+numbuf2: .=.+2
+numbuf3: .=.+2
+tempbuf: .=.+2
+savesp: .=.+2
+ibase: .=.+2
+obase: .=.+2
+wflag: .=.+2
+heaptop: .=.+2
+regs: .=.+512.
+statbuf: .=.+36.
+stkbot: .=.+128.
+heap:
diff --git a/cmd/ds.s b/cmd/ds.s
new file mode 100644
index 0000000..edb9b8c
--- /dev/null
+++ b/cmd/ds.s
@@ -0,0 +1,267 @@
+/ ds -- show disk space summary
+
+ mov $1,r0
+ sys write; header; 2
+ clr outfd
+ sys seek; 0:..; 0
+ cmp (sp)+,$2
+ blt 1f
+ sys creat; fname; 17
+ bes error
+ mov r0,outfd
+ tst (sp)+
+ mov (sp)+,0f
+1:
+ mov $buf,r4
+ jsr r5,descend
+ cmp r4,$buf
+ beq 2f
+ jsr pc,flush
+ br 1b
+2:
+ mov $1,r0
+ sys write; header+1; 3
+ mov outfd,r0
+ beq done
+ sys close
+ sys open; fname; 0
+ bec 1f
+ br error
+1:
+ mov r0,tmpfd
+ br done
+
+error:
+ mov $1,r0
+ sys write; errmsg; 5
+ sys exit
+
+done:
+ tst outfd
+ beq 1f
+ sys creat; 0:..; 17
+ bec 1f
+ br error
+1:
+ sys open; dfile; 0
+ bes error
+ mov r0,dfd
+ mov $41.,r5
+ jsr pc,getblk
+ tst nused
+ beq loop
+ mov outfd,r0
+ beq loop
+ sys write; header-1; 1
+ mov outfd,r0
+ mov r5,r1
+ jsr r5,prnum; <-\0>
+ mov outfd,r0
+ mov nused,r1
+ jsr r5,prnum; <\n\0>
+
+loop:
+ mov $syms,r4
+ clr r3
+1:
+ cmp r4,symend
+ bcc 2f
+ cmp (r4)+,r5
+ bne 3f
+ inc r3
+ tst outfd
+ beq 3f
+ mov (r4),0f
+ mov tmpfd,r0
+ sys seek; 0:..; 0
+ mov tmpfd,r0
+ sys read; name; 1
+ mov tmpfd,r0
+ sys read; name+1; 0:..
+ mov 0b-4,0f
+ mov outfd,r0
+ sys write; name+1; 0:..
+ mov outfd,r0
+ sys write; header-1; 1
+3:
+ tst (r4)+
+ br 1b
+2:
+ cmp r3,nused
+ beq 4f
+ mov r5,r0
+ mov $1,r0
+ mov r5,r1
+ jsr r5,prnum; <-\0>
+ mov $1,r0
+ mov r3,r1
+ jsr r5,prnum; < \0>
+ mov $1,r0
+ sys write; header+2; 5
+4:
+ inc r5
+ cmp r5,$2777
+ blt loop+4
+ sys unlink; fname
+ sys exit
+
+addsym:
+ mov symend,r0
+ mov inode,(r0)+
+ mov nameloc,(r0)+
+ mov r0,symend
+ mov $name,r0
+1:
+ tstb (r0)+
+ bne 1b
+ sub $name+1,r0
+ mov r0,-(sp)
+ jsr pc,flush
+ mov $name,r1
+2:
+ movb (r1)+,r0
+ jsr pc,flush
+ dec (sp)
+ bgt 2b
+ tst (sp)+
+ rts r5
+
+descend:
+ sys stat; name; stbuf
+ bes error
+ cmp stbuf+4,$50
+ bgt 1f
+ rts r5
+1:
+ jsr r5,addsym
+ bit $40000,stbuf+6
+ beq 1b-2
+ mov $name,r0
+1:
+ tstb (r0)+
+ bne 1b
+ dec r0
+ mov r0,r1
+ cmpb -(r0),$'.
+ bne 2f
+ cmpb -(r0),$'/
+ beq 1b-2
+ cmpb (r0),$'.
+ bne 2f
+ cmpb -(r0),$'/
+ beq 1b-2
+2:
+ mov r1,-(sp)
+ sys open; name; 0
+ bes error
+ mov r0,-(sp)
+3:
+ mov (sp),r0
+ sys read; dirent; 16.
+ bes 4f
+ tst r0
+ beq 4f
+ tst dirent
+ beq 3b
+ mov $dirent+2,r0
+ mov 2(sp),r1
+ cmpb -1(r1),$'/
+ beq 5f
+ movb $'/,(r1)+
+5:
+ movb (r0)+,(r1)+
+ bne 5b
+ jsr r5,descend
+ br 3b
+4:
+ mov (sp)+,r0
+ sys close
+ mov (sp)+,r0
+ clrb (r0)
+ rts r5
+
+getblk:
+ mov r5,r0
+ add $31.,r0
+ mov r0,-(sp)
+ asr r0
+ asr r0
+ asr r0
+ asr r0
+ cmp r0,blkno
+ beq 1f
+ mov r0,blkno
+ mov dfd,r0
+ sys seek; 0:..; 0
+ mov dfd,r0
+ sys read; dblk; 512.
+1:
+ bic $177760,(sp)
+ mov (sp)+,num
+ mov $5,lsh
+ mov num,r0
+ tst dblk(r0)
+ blt 2f
+ clr nused
+ rts pc
+2:
+ movb dblk+2(r0),nused
+ rts pc
+
+flush:
+ inc nameloc
+ tst outfd
+ beq 1f
+ movb r0,(r4)+
+ cmp r4,$buf+512.
+ blo 1f
+ mov outfd,r0
+ sys write; buf; 512.
+ mov $buf,r4
+1:
+ rts pc
+
+prnum:
+ mov r0,fd
+ mov r1,num
+ jsr pc,1f
+ mov (r5)+,ch
+ mov fd,r0
+ sys write; ch; 1
+ rts r5
+1:
+ clr num-2
+ mov $10.,div
+ mov num-2,-(sp)
+ tst num
+ beq 2f
+ jsr pc,1b
+2:
+ mov (sp)+,ch
+ add $'0,ch
+ mov fd,r0
+ sys write; ch; 1
+ rts pc
+
+symend: syms
+nameloc: .=.+2
+header:
+ </tmp/dstmpi ****/dev/rp0/\0>
+ .even
+blkno: .=.+2
+outfd: .=.+2
+tmpfd: .=.+2
+dfd: .=.+2
+fd: .=.+2
+ch: .=.+2
+num: .=.+4
+nused: .=.+2
+inode: .=.+2
+stbuf: .=.+40.
+dirent: .=.+16.
+dblk: .=.+512.
+fname: .=.+64.
+name: .=.+512.
+buf: .=.+512.
+syms:
+errmsg: <err?\n>
diff --git a/cmd/du.s b/cmd/du.s
new file mode 100644
index 0000000..e7080c0
--- /dev/null
+++ b/cmd/du.s
@@ -0,0 +1,187 @@
+/ du -- disk usage
+
+ mov (sp)+,r5
+ tst (sp)+
+ dec r5
+ bgt 1f
+ tstb dot
+ beq 2f
+ sys exit
+2:
+ mov $dot,r0
+ br 3f
+1:
+ mov (sp)+,r0
+ cmpb (r0),$'-
+ bne doarg
+ cmpb 1(r0),$'a
+ bne 4f
+ inc aflag
+ br 2b
+4:
+ cmpb 1(r0),$'s
+ bne 2b
+ dec aflag
+ br 2b
+
+doarg:
+ mov $name,r1
+1:
+ movb (r0)+,(r1)+
+ bne 1b
+ dec r1
+ clr level
+ clr total
+ jsr pc,dodir
+ tst aflag
+ bpl 2b
+ jsr r5,prsize
+ br 2b
+
+dodir:
+ sys stat; name; stbuf
+ bec 1f
+ cmp stbuf+4,$50
+ bgt 2f
+1:
+ clr r4
+ rts pc
+2:
+ mov total,r0
+ mov $dirlist,r2
+ mov stbuf+4,r3
+ tst r0
+ beq 3f
+1:
+ cmp r3,(r2)+
+ bne 2f
+ clr r4
+ jsr r5,prpath
+ rts pc
+2:
+ dec r0
+ br 1b
+3:
+ mov r3,(r2)+
+ inc total
+ bit $40000,stbuf+6
+ bne isdir
+ jsr pc,blocks
+ jsr r5,prpath
+ rts pc
+
+isdir:
+ jsr pc,blocks
+ mov r4,r3
+ sys open; name; 0
+ bec 1f
+ rts pc
+1:
+ mov r0,-(sp)
+ mov r1,-(sp)
+ mov 2(sp),r0
+ sys read; dirent; 16.
+ bes done
+ tst r0
+ beq done
+ tst dirent
+ beq 1b
+ cmp dirent+2,$'.
+ beq 1b
+ cmp dirent+2,$'.+<'.<<8>
+ bne 2f
+ tst dirent+4
+ beq 1b
+2:
+ mov $dirent+2,r2
+ mov (sp),r1
+ movb $'/,(r1)+
+ cmpb -2(r1),$'/
+ bne 3f
+ dec r1
+3:
+ movb (r2)+,(r1)+
+ bne 3b
+ dec r1
+ mov r3,-(sp)
+ jsr pc,dodir
+ mov r4,r3
+ add (sp)+,r3
+ br 1b
+
+done:
+ mov (sp)+,r1
+ clrb (r1)
+ mov (sp)+,r0
+ sys close
+ mov r3,r4
+ tst aflag
+ bmi 1f
+ jsr r5,prsize
+1:
+ rts pc
+
+prpath:
+ tst aflag
+ bgt prsize
+ rts r5
+
+prsize:
+ jsr pc,decml
+ mov $'\t,r0
+ jsr pc,putc
+ mov $name,r2
+1:
+ movb (r2)+,r0
+ beq 2f
+ jsr pc,putc
+ br 1b
+2:
+ mov $'\n,r0
+ jsr pc,putc
+ rts r5
+
+blocks:
+ mov stbuf+12.,mq
+ add $777,mq
+ clr ac
+ mov $-9,lsh
+ cmp mq,$8.
+ blo 1f
+ mov mq,-(sp)
+ add $377,mq
+ mov $-8,lsh
+ add (sp)+,mq
+1:
+ mov mq,r4
+ rts pc
+
+decml:
+ mov r4,mq
+ clr ac
+ mov $10.,div
+ mov ac,-(sp)
+ tst mq
+ beq 1f
+ jsr pc,decml
+1:
+ mov (sp)+,r0
+ add $'0,r0
+ jsr pc,putc
+ rts pc
+
+putc:
+ mov r0,ch
+ mov $1,r0
+ sys write; ch; 1
+ rts pc
+
+ch: .=.+2
+dot: <.\0>
+name: .=.+512.
+total: .=.+2
+level: .=.+2
+aflag: .=.+2
+stbuf: .=.+40.
+dirent: .=.+16.
+dirlist: .=.+200.
diff --git a/cmd/ed.s b/cmd/ed.s
new file mode 100644
index 0000000..ef3617d
--- /dev/null
+++ b/cmd/ed.s
@@ -0,0 +1,437 @@
+/ ed -- line editor
+
+ cmpb @2(sp),$'-
+ bne 1f
+ inc proteflag
+ jsr r5,gfile; <oops\0>
+1:
+ sys break; 0
+
+start:
+ clr peteflag
+ clr stession
+ clr sflag
+ mov sp,savsp
+ mov sp,r4
+ cmp (r4)+,$1
+ blos command
+ tst (r4)+
+ mov (r4)+,r4
+ mov $tfname,r1
+ mov $sfname,r2
+1:
+ movb (r4),(r2)+
+ movb (r4)+,(r1)+
+ bne 1b
+ mov linebp,zero+2
+ mov $'\n,loc2
+ jmp rfile
+
+command:
+ jmp commands
+
+ .bss
+buf: .=.+256.
+linebuf: .=.+128.
+expbuf: .=.+128.
+rhsbuf: .=.+64.
+savedfile: .=.+64.
+file: .=.+64.
+ .even
+
+commands:
+ jsr r5,gfile; <oops\0>
+ clr qcount
+ jsr r5,getfile
+ mov loc2,a1
+ jsr r5,getchar
+ cmp r1,$'\n
+ bne commands
+ mov savsp,sp
+ tst qflag
+ beq 1f
+ clr qflag
+ mov zero,a2
+ mov zero,dot
+ jmp rfile
+1:
+ tst pflag
+ beq 2f
+ tstb @prompt
+ bne 2f+6
+ mov zero,r4
+ tst (r4)+
+ cmp r4,linebp
+ bhi 2f+4
+ bit $1,(r4)
+ beq 2b-2
+ dec (r4)
+ mov r4,zero
+ mov $tfname,prompt
+ br 2f+6
+2:
+ jsr r5,getfile
+1:
+ tst proteflag
+ beq 2f
+ mov $1,r0
+ sys write; schar; 1
+2:
+ clr peteflag
+ jsr r5,getline
+ br com2
+
+nexta:
+ inc a1
+nextl:
+ mov a1,a2
+ mov a1,dot
+ jsr r5,getchar
+ br com3
+com3: <;\0>
+com3b: <,\0>
+com3c: 0
+
+nextdot:
+ cmp a1,linebp
+ bhi comerr
+ mov a1,zero
+ jsr r5,getline
+ br comerr
+
+nextdot2:
+ mov dot,a2
+ br nextl
+
+com2:
+ jsr r5,getchar
+com3:
+ br com2
+
+comlst:
+ <a\0>; comapp
+ <c\0>; comchg
+ <d\0>; comdel
+ <e\0>; comedit
+ <f\0>; comfile
+ <g\0>; comglob
+ <i\0>; comins
+ <k\0>; commark
+ <l\0>; comlist
+ <m\0>; commove
+ <n\0>; comnum
+ <p\0>; comprnt
+ <q\0>; comquit
+ <r\0>; comread
+ <s\0>; comsub
+ <v\0>; comv
+ <w\0>; comwrit
+ <=\0>; comeq
+ <!\0>; comexcl
+ <\n\0>; comnl
+ 0
+
+comapp:
+ jsr r5,newaddr
+ jsr r5,setdot
+ br append
+
+comchg:
+ jsr r5,newaddr
+ jsr r5,setdot
+ jsr r5,delete
+ mov dot,a2
+ br 1f
+
+comdel:
+ jsr r5,newaddr
+ jsr r5,setdot
+ jsr r5,delete
+ mov dot,zero
+ cmp dot,linebp
+ blos done
+ mov linebp,zero
+ br done
+
+comedit:
+ jsr r5,newaddr
+ jsr r5,setdot
+ mov a2,zero
+ sub $2,dot
+ cmp dot,zero
+ bcc 1f
+ mov dot,zero
+1:
+ jsr r5,append
+ br 1b
+done:
+ jmp commands
+
+comerr:
+ jmp comerr
+
+comprnt:
+ jsr r5,setdot2
+ jsr r5,setdot
+ jsr r5,print
+ sys exit
+
+comquit:
+ jsr r5,setdot2
+ jsr r5,getchar
+ cmp r1,$'
+ bne comerr
+ mov $linebuf+512.,r0
+1:
+ clr (r0)+
+ cmp r0,$sfname+512.
+ bne 1b
+ jsr r5,print
+ jsr r5,execute
+
+comread:
+ jsr r5,setdot2
+ jsr r5,setdot
+rfile:
+ mov $sfname,r4
+1:
+ jsr r5,getchar
+ cmp r1,$'\n
+ beq 2f
+ cmp r1,$'
+ beq 1b
+ movb r1,(r4)+
+ br 1b
+2:
+ clrb (r4)
+ sys open; sfname; 0
+ bes comerr
+ mov r0,fin
+ clr ninbuf
+3:
+ jsr r5,getc
+ bes 4f
+ jsr r5,putline
+ br 3b
+4:
+ mov fin,r0
+ sys close
+ br done
+
+comsub:
+ jsr r5,setdot2
+ jsr r5,setdot
+ jsr r5,compile
+ jsr r5,getchar
+ jsr r5,getchar
+1:
+ jsr r5,getchar
+ cmpb r1,delim
+ beq 2f
+ cmp r1,$'\n
+ beq comerr
+ movb r1,(r3)+
+ br 1b
+2:
+ clrb (r3)+
+ jsr r5,getchar
+ jsr r5,dosub
+ br done
+
+comwrit:
+ jsr r5,setdot2
+ jsr r5,setdot
+wfile:
+ mov $sfname,r4
+1:
+ jsr r5,getchar
+ cmp r1,$'\n
+ beq 2f
+ cmp r1,$'
+ beq 1b
+ movb r1,(r4)+
+ br 1b
+2:
+ clrb (r4)
+ sys creat; sfname; 17
+ bes comerr
+ mov r0,fout
+ mov a2,r4
+3:
+ cmp r4,dot
+ bhi 4f
+ jsr r5,getline2
+ jsr r5,putfile
+ tst (r4)+
+ br 3b
+4:
+ mov fout,r0
+ sys close
+ br done
+
+append:
+ jsr r5,getline
+ tst (sp)+
+ tstb linebuf
+ beq 1f
+ cmpb linebuf,$'.
+ bne 2f
+ tstb linebuf+1
+ bne 2f
+1:
+ rts r5
+2:
+ jsr r5,putline
+ br append
+
+delete:
+ mov a2,r4
+ mov dot,r3
+1:
+ cmp r3,linebp
+ bhi 2f
+ mov (r3)+,(r4)+
+ br 1b
+2:
+ mov r4,linebp
+ rts r5
+
+print:
+ mov a2,r4
+1:
+ cmp r4,dot
+ bhi 2f
+ jsr r5,getline2
+ jsr r5,putstr
+ tst (r4)+
+ br 1b
+2:
+ rts r5
+
+getline:
+ mov $linebuf,r3
+1:
+ jsr r5,getc
+ bes 2f
+ movb r0,(r3)+
+ cmpb r0,$'\n
+ bne 1b
+ clrb -(r3)
+ rts r5
+2:
+ clrb (r3)
+ rts r5
+
+getc:
+ dec ninbuf
+ bge 1f
+ mov fin,r0
+ sys read; inbuf; 512.
+ bes 2f
+ tst r0
+ beq 2f
+ dec r0
+ mov r0,ninbuf
+ mov $inbuf,inp
+1:
+ clr r0
+ bisb @inp,r0
+ inc inp
+ rts r5
+2:
+ sec
+ rts r5
+
+putline:
+ mov linebp,r4
+ mov $linebuf,r3
+1:
+ movb (r3)+,(r4)+
+ bne 1b
+ mov r4,linebp
+ rts r5
+
+putstr:
+ mov $linebuf,r3
+ mov $1,r0
+1:
+ tstb (r3)
+ beq 2f
+ sys write; linebuf; 1
+ inc r3
+ br 1b
+2:
+ sys write; nl; 1
+ rts r5
+
+putfile:
+ mov fout,r0
+ mov $linebuf,r3
+1:
+ tstb (r3)+
+ bne 1b
+ sub $linebuf,r3
+ mov r3,0f
+ mov fout,r0
+ sys write; linebuf; 0:..
+ mov fout,r0
+ sys write; nl; 1
+ rts r5
+
+getchar:
+ jsr r5,getc
+ mov r0,r1
+ rts r5
+
+gfile:
+ mov (r5)+,0f
+ mov $1,r0
+ sys write; 0:..; 1
+ emt 3
+
+compile:
+ rts r5
+
+execute:
+ rts r5
+
+dosub:
+ rts r5
+
+setdot:
+ rts r5
+
+setdot2:
+ rts r5
+
+newaddr:
+ rts r5
+
+getfile:
+ rts r5
+
+schar: <*\0>
+nl: <\n>
+prompt: .=.+2
+delim: .=.+2
+fin: .=.+2
+fout: .=.+2
+ninbuf: .=.+2
+inp: .=.+2
+a1: .=.+2
+a2: .=.+2
+dot: .=.+2
+zero: .=.+4
+linebp: .=.+2
+loc2: .=.+2
+savsp: .=.+2
+proteflag: .=.+2
+pflag: .=.+2
+qflag: .=.+2
+qcount: .=.+2
+sflag: .=.+2
+peteflag: .=.+2
+stession: .=.+2
+tfname: .=.+64.
+sfname: .=.+64.
+inbuf: .=.+512.
diff --git a/cmd/fc.s b/cmd/fc.s
new file mode 100644
index 0000000..8900836
--- /dev/null
+++ b/cmd/fc.s
@@ -0,0 +1,309 @@
+/ fc -- FORTRAN compiler driver
+/ NOTE: This is B-compiled code; shown as reconstructed assembly
+
+ br start
+ inc @(r2)+
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+start:
+ mov $mq,r3
+ mov sp,r0
+ mov (sp),-(sp)
+ tst (r0)+
+ mov r0,2(sp)
+ mov 60.,(sp)
+ mov $brt,r5
+ jmp @(r5)+
+
+brt:
+ fmain
+ 0
+
+fmain:
+ blib
+ sys exit
+
+blib:
+ fcall
+ dofc1
+ fcall
+ doas
+ fcall
+ dold
+ fcall
+ domove
+ bproc
+ bprint
+ bexit
+ bint
+ bchar
+ bputc
+ bgetc
+ bopen
+ bclose
+ bcopy
+ bscopy
+ bprintf
+ 0
+
+/ B runtime routines
+bexit:
+ mov 2(sp),r0
+ sys exit
+
+dofc1:
+ jsr r5,prname
+ jsr pc,callsub
+ mov r0,status
+ tst status
+ bne err
+ rts pc
+
+doas:
+ jsr r5,prname
+ jsr pc,callsub
+ mov r0,status
+ tst status
+ bne err
+ rts pc
+
+dold:
+ jsr r5,prname
+ jsr pc,callsub
+ mov r0,status
+ tst status
+ bne err
+ rts pc
+
+domove:
+ jsr r5,prname
+ mov r0,status
+ tst status
+ bne moveerr
+ rts pc
+
+prname:
+ mov $1,r0
+ sys write; namebuf; 0:..
+ rts r5
+
+callsub:
+ sys fork
+ br child
+ bec parent
+child:
+ sys exec; argv; argp
+ jsr r5,mesg; <Can't find \0>; .even
+ mov $1,r0
+ sys write; argv; 0:..
+ jsr r5,mesg; <\n\0>; .even
+ sys exit
+parent:
+ sys wait
+ rts pc
+
+moveerr:
+ jsr r5,mesg; <move failed: \0>; .even
+ mov $1,r0
+ sys write; namebuf; 0:..
+ jsr r5,mesg; <\n\0>; .even
+ rts pc
+
+err:
+ jsr r5,mesg; <Try again\n\0>; .even
+ sys exit
+
+mesg:
+ movb (r5)+,ch
+ beq 1f
+ mov $1,r0
+ sys write; ch; 1
+ br mesg
+1:
+ inc r5
+ bic $1,r5
+ rts r5
+
+bprintf:
+ mov r5,-(sp)
+ mov sp,r5
+ add $6,r5
+ mov (r5)+,r4
+1:
+ movb (r4)+,r0
+ beq 2f
+ cmpb r0,$'%
+ beq 3f
+ jsr pc,bputc
+ br 1b
+2:
+ mov (sp)+,r5
+ rts pc
+3:
+ movb (r4)+,r0
+ cmpb r0,$'s
+ bne 4f
+ mov (r5)+,r1
+ jsr pc,bprstr
+ br 1b
+4:
+ cmpb r0,$'d
+ bne 1b
+ mov (r5)+,r0
+ jsr pc,bprdec
+ br 1b
+
+bprstr:
+ movb (r1)+,r0
+ beq 1f
+ jsr pc,bputc
+ br bprstr
+1:
+ rts pc
+
+bprdec:
+ mov r0,mq
+ clr ac
+ mov $10.,div
+ mov ac,-(sp)
+ tst mq
+ beq 1f
+ jsr pc,bprdec
+1:
+ add $'0,(sp)
+ mov (sp)+,ch
+ mov $1,r0
+ sys write; ch; 1
+ rts pc
+
+bputc:
+ movb r0,ch
+ mov $1,r0
+ sys write; ch; 1
+ rts pc
+
+bgetc:
+ clr r0
+ sys read; ch; 1
+ movb ch,r0
+ rts pc
+
+bopen:
+ mov 2(sp),0f
+ mov 4(sp),0f+2
+ sys open; 0:..; 0:..
+ bec 1f
+ mov $-1,r0
+1:
+ rts pc
+
+bclose:
+ mov 2(sp),r0
+ sys close
+ rts pc
+
+bcopy:
+ mov r1,-(sp)
+1:
+ movb (r2)+,(r1)+
+ bne 1b
+ mov (sp)+,r1
+ rts pc
+
+bscopy:
+ mov r1,-(sp)
+ mov r2,-(sp)
+ mov 4(sp),r1
+ mov 6(sp),r2
+1:
+ movb (r1)+,(r2)+
+ bne 1b
+ mov (sp)+,r2
+ mov (sp)+,r1
+ rts pc
+
+bint:
+ mov r0,mq
+ clr ac
+ rts pc
+
+bchar:
+ movb r0,r0
+ rts pc
+
+bprint:
+ movb (r0)+,r1
+ beq 1f
+ movb r1,ch
+ mov $1,r0
+ sys write; ch; 1
+ br bprint
+1:
+ rts pc
+
+fcall:
+ jsr pc,@(r5)+
+ rts r5
+
+bproc:
+ tst (r5)+
+ rts r5
+
+/ data
+fmsg: <%s:\n\0>
+ .even
+fcname: <fc\0>
+ .even
+fc1path: </usr/fort/fc1\0>
+ .even
+asname: <as\0>
+ .even
+asflag: <-\0>
+ .even
+tmpf: <f.tmp1\0>
+ .even
+aspath: </bin/as\0>
+ .even
+aout: <a.out\0>
+ .even
+aout2: <a.out\0>
+ .even
+movmsg: <move failed: %s\n\0>
+ .even
+tmpf2: <f.tmp1\0>
+ .even
+ldname: <ld\0>
+ .even
+fr0: </usr/lib/fr0.o\0>
+ .even
+lflag: <-lf\0>
+ .even
+filib: </usr/lib/filib.a\0>
+ .even
+lflag2: <-l\0>
+ .even
+ldpath: </bin/ld\0>
+ .even
+cantmsg: <Can't find %s\n\0>
+ .even
+trymsg: <Try again\n\0>
+ .even
+
+.bss
+ch: .=.+2
+mq: .=.+2
+ac: .=.+2
+status: .=.+2
+namebuf: .=.+64.
+argv: .=.+64.
+argp: .=.+32.
+
+/ EAE registers
+div = 177300
+ac = 177302
+mq = 177304
diff --git a/cmd/find.s b/cmd/find.s
new file mode 100644
index 0000000..b8fe2ae
--- /dev/null
+++ b/cmd/find.s
@@ -0,0 +1,140 @@
+/ find -- find files
+
+ mov (sp)+,argc
+ tst (sp)+
+ mov sp,argv
+ mov from,to
+ mov from+2,to+2
+ mov $path,r5
+ jsr pc,descend
+ sys exit
+
+prname:
+ mov r4,-(sp)
+ mov (r5)+,r4
+1:
+ movb (r4)+,r0
+ beq 2f
+ jsr pc,putc
+ br 1b
+2:
+ mov $'\n,r0
+ jsr pc,putc
+ mov (sp)+,r4
+ rts r5
+
+putc:
+ mov r0,ch
+ mov $1,r0
+ sys write; ch; 1
+ rts pc
+
+descend:
+ mov r4,-(sp)
+ mov r5,-(sp)
+ cmp r5,$path-1
+ beq 1f
+ clrb -(r5)
+1:
+ sys open; path; 0
+ bes done
+ mov r0,fin
+ movb $'/,(r5)+
+2:
+ mov fin,r0
+ sys read; dirent; 16.
+ bes done
+ tst r0
+ beq done
+ tst dirent
+ beq 2b
+ mov (sp),r5
+ mov $dirent+2,r3
+ mov $8.,r2
+1:
+ movb (r3)+,(r5)+
+ dec r2
+ bne 1b
+ clrb (r5)
+ mov argv,r4
+ mov argc,argcnt
+ mov (sp),r5
+ mov (r4),r1
+3:
+ dec argcnt
+ ble nomatch
+ mov $9.,r0
+1:
+ dec r0
+ beq 2f
+ cmpb (r1),(r5)+
+ bne 4f
+ tstb (r1)+
+ bne 1b
+2:
+ jsr r5,prname; path
+ mov (r4)+,r0
+ jsr pc,getnum
+ cmp r0,dirent
+ bne 3b
+ jsr r5,prname; path
+ br 3b
+
+4:
+ sys stat; path; stbuf
+ bit $40000,stbuf+4
+ beq 2b
+ mov (sp),r5
+ cmpb (r5)+,$'.
+ bne 5f
+ tstb (r5)
+ beq 2b
+ cmpb (r5)+,$'.
+ bne 5f
+ tstb (r5)
+ beq 2b
+5:
+ tstb (r5)+
+ bne 5b
+ mov fin,-(sp)
+ jsr pc,descend
+ mov (sp)+,fin
+ br 2b
+
+done:
+ mov fin,r0
+ sys close
+ tst (sp)+
+ mov (sp)+,r4
+ rts pc
+
+getnum:
+ clr num
+1:
+ movb (r2)+,r0
+ beq 2f
+ sub $'0,r0
+ cmp r0,$9.
+ bhi 3f
+ mov $10.,mul
+ add r0,num
+ br 1b
+3:
+ clr num
+2:
+ mov num,r0
+ rts pc
+
+from: </usr\0>
+ .even
+to: .=.+4
+
+argc: .=.+2
+argv: .=.+2
+argcnt: .=.+2
+ch: .=.+2
+fin: .=.+2
+num: .=.+2
+dirent: .=.+16.
+stbuf: .=.+40.
+path: .=.+512.
diff --git a/cmd/form.s b/cmd/form.s
new file mode 100644
index 0000000..1430d3a
--- /dev/null
+++ b/cmd/form.s
@@ -0,0 +1,300 @@
+/ form -- form letter generator
+
+ br start
+ ble 1f
+ 0
+ 0
+
+ mov (sp)+,-(sp)
+ 0
+
+start:
+ mov $-1,oession
+ mov $-1,mession
+ clr fession
+ mov (sp)+,r2
+ tst (sp)+
+ sub $2,r2
+ bge 1f
+ mov $letter,-(sp)
+1:
+ mov (sp)+,fname
+ sys stat; fmem; stbuf
+ bcc 1f
+ sys creat; fmem; 017
+ bcc 1f
+ cmpb $'z,fmem+4
+ beq memerr
+ incb fmem+4
+ br 1b
+1:
+ mov r0,mfd
+ sys open; fmem; 1
+ bcc 1f
+ sys creat; fmem; 017
+ bcs crterr
+1:
+ mov r0,mession
+ sys seek; 0; 2
+ sys open; fmem; 0
+ bes opnerr
+ mov r0,oession
+ jmp main
+
+memerr:
+ mov $1,r0
+ sys write; errmsg; 24.
+ sys exit
+
+crterr:
+ mov $1,r0
+ sys write; errmsg2; 24.
+ sys exit
+
+errmsg: <cannot open memory file\0>
+errmsg2: <cannot open output file\0>
+fmem: <forma\0>
+ .even
+fmems: <form.am\0>
+ .even
+letter: <letter\0>
+ .even
+
+/ initialized data area
+.=.+512.
+
+/ month table
+month:
+jan: <CJanuary\0>
+feb: <February\0>
+mar: <March\0>
+apr: <April\0>
+may: 0
+jun: <June\0>
+jul: <July\0>
+aug: <August\0>
+sep: <September\0>
+oct: <October\0>
+nov: <November\0>
+dec: <December\0>
+ .even
+
+/ main processing
+main:
+ mov $1,r1
+ jsr r5,getc; ibuf
+ beq done
+ cmpb r0,$'\\
+ bne 1f
+ jsr pc,doesc
+ br main
+1:
+ cmpb r0,$'\n
+ bne 2f
+ jsr pc,donl
+ br main
+2:
+ jsr r5,putc; obuf
+ br main
+
+done:
+ jsr r5,flush; obuf
+ sys exit
+
+donl:
+ jsr r5,putc; obuf
+ mov $'\n,r0
+ jsr r5,putc; obuf
+ rts pc
+
+doesc:
+ jsr r5,getc; ibuf
+ beq escend
+ cmpb r0,$'\\
+ beq 1f
+ cmpb r0,$'n
+ beq donewl
+ cmpb r0,$'a
+ blt dolet
+ cmpb r0,$'z
+ bgt dolet
+ sub $'a,r0
+ asl r0
+ mov mtab(r0),r0
+ beq escend
+ jsr pc,prstr
+ br escend
+1:
+ mov $'\\,r0
+ jsr r5,putc; obuf
+escend:
+ rts pc
+
+donewl:
+ mov $'\n,r0
+ jsr r5,putc; obuf
+ rts pc
+
+dolet:
+ movb r0,letbuf
+ mov $1,r0
+ sys write; letbuf; 1
+ rts pc
+
+prstr:
+ mov r0,r1
+1:
+ movb (r1)+,r0
+ beq 2f
+ jsr r5,putc; obuf
+ br 1b
+2:
+ rts pc
+
+/ input line
+getline:
+ mov r3,-(sp)
+ mov $':,r0
+ jsr r5,putc; obuf
+ mov $' ,r0
+ jsr r5,putc; obuf
+ jsr r5,flush; obuf
+1:
+ movb r0,(r3)+
+ cmp r0,$'\n
+ bne 1b
+ jsr r5,getc; ibuf
+ cmp r0,$'\n
+ beq 2f
+ movb r0,(r3)+
+ br 1b
+2:
+ clrb -1(r3)
+ mov (sp)+,r3
+ rts pc
+
+/ buffered I/O
+getc:
+ mov r1,-(sp)
+ mov (r5)+,r1
+ mov 2(r1),r0
+ bne 1f
+ mov r1,r0
+ add $4,r0
+ mov r0,0f
+ mov $256.,-(sp)
+ clr (r0)+
+ dec (sp)
+ bne .-4
+ tst (sp)+
+ mov (r1),r0
+ sys read; 0:..; 512.
+ bes eof
+ tst r0
+ beq eof
+ clr r0
+1:
+ inc r0
+ mov r0,2(r1)
+ cmp r0,$512.
+ bne 2f
+ clr 2(r1)
+2:
+ add r1,r0
+ movb 3(r0),r0
+ beq getc+4
+ mov (sp)+,r1
+ tst (r5)
+ bne 3f
+ cmp (r5)+,(r5)+
+3:
+ rts r5
+
+eof:
+ mov (sp)+,r1
+ tst (r5)+
+ bne 1f
+ rts r5
+1:
+ jsr r5,flush; obuf
+ sys exit
+
+inch:
+ clr r0
+ sys read; chbuf; 1
+ bes 1f
+ tst r0
+ beq 1f
+ movb chbuf,r0
+ rts r5
+1:
+ jsr r5,flush; obuf
+ sys exit
+
+putc:
+ mov r0,chbuf
+ mov $1,r0
+ sys write; chbuf; 1
+ rts r5
+
+putc2:
+ mov r1,-(sp)
+ mov r0,-(sp)
+ mov (r5)+,r1
+ tst (r1)+
+ mov (r1),r0
+ add r1,r0
+ movb (sp)+,2(r0)
+ inc (r1)
+ cmp (r1),$512.
+ bge 1f
+ mov (sp)+,r1
+ rts r5
+1:
+ mov (sp)+,r1
+ tst -(r5)
+
+flush:
+ mov r1,-(sp)
+ mov (r5)+,r1
+ mov (r1)+,r0
+ mov (r1),0f
+ beq 1f
+ clr (r1)+
+ mov r1,0f+2
+ sys write; 0:..; 0:..
+1:
+ mov (sp)+,r1
+ rts r5
+
+ovflerr: <storage overflow\n\0>
+ .even
+
+opnerr:
+ jsr r5,mesg
+ <cannot open file\0>
+ .even
+ sys exit
+
+mesg:
+ movb (r5)+,r0
+ beq 1f
+ jsr pc,putc
+ br mesg
+1:
+ inc r5
+ bic $1,r5
+ rts r5
+
+.bss
+fname: .=.+2
+mfd: .=.+2
+mession: .=.+2
+oession: .=.+2
+fession: .=.+2
+stbuf: .=.+36.
+chbuf: .=.+2
+letbuf: .=.+2
+ibuf: .=.+518.
+obuf: .=.+518.
+mtab: .=.+52.
diff --git a/cmd/ld.s b/cmd/ld.s
new file mode 100644
index 0000000..6b84ecb
--- /dev/null
+++ b/cmd/ld.s
@@ -0,0 +1,878 @@
+/ ld -- link editor (linker)
+
+ br start
+ adc @-(sp)
+ 0
+ mov 0(r1),0(r0)
+ 0
+ 0
+
+start:
+ sys intr; onerr
+ mov (sp)+,r0
+ dec r0
+ bgt 1f
+ sys exit
+1:
+ mov r0,argc
+ mov sp,argv
+ jsr r5,argscan
+ br 2f
+1:
+ jsr r5,ldfile
+ br argscan+6
+2:
+ sys exec; 0:outfn; 0
+ bec 1f
+ clr outfd
+ jsr r5,errout
+ <\n\0>; .even
+ sys exit
+1:
+ mov r0,outfd
+ mov tsize,r1
+ mov dsize,r2
+ mov r1,r3
+ add r2,r3
+ clr r4
+ mov $symtab,r5
+1:
+ cmp r5,symptr
+ bhis symsdone
+ cmp 10.(r5),$'
+ bne 2f
+ mov 12.(r5),r0
+ beq 2f
+ mov r4,12.(r5)
+ add r3,12.(r5)
+ inc r0
+ bic $1,r0
+ add r0,r4
+ mov $''',10.(r5)
+2:
+ add $12.,r5
+ br 1b
+
+symsdone:
+ add r4,bsize
+ mov $symtab,r5
+1:
+ cmp r5,symptr
+ bhis 2f
+ cmp 10.(r5),$'#
+ blt 3f
+ beq 4f
+ cmp 10.(r5),$''
+ bne 5f
+ mov $'$,10.(r5)
+ br 3f
+5:
+ add r2,12.(r5)
+ add r4,12.(r5)
+4:
+ add r1,12.(r5)
+3:
+ add $12.,r5
+ br 1b
+2:
+ mov r1,outtxt
+ mov r3,outdat
+ add r4,outdat
+ mov hession+4,hession+2
+ add symptr,hession+4
+ sub $symtab,hession+4
+ tst sflag
+ beq 1f
+ clr hession+4
+1:
+ jsr r5,wrhdr
+ outbf; outhdr
+ jsr r5,wrhdr
+ txtbf; outdat
+ tst rflag
+ bne 1f
+ jsr r5,wrhdr
+ rdbf; outrel
+ jsr r5,wrhdr
+ sdbf; outsym
+1:
+ jsr r5,wrhdr
+ rtbf; outrel
+ tst nflag
+ beq 1f
+ tst errcnt
+ bne 1f
+ mov (sp)+,symptr
+ cmp r5,$symlst
+ blos 2f
+ clr @-(r5)
+ br 1f
+2:
+ tst (sp)+
+ tst ession
+ beq 1f
+ add outtxt,ession
+ tst errcnt
+ beq 1f
+ jsr r5,errout
+ err4; .even
+ mov ession,errcnt
+1:
+ add hession+2,hession+4
+ mov bufptr,r0
+ cmp r0,$symlst
+ bhis 1f
+ jsr r5,errout
+ err5; .even
+ jmp onerr
+1:
+ mov entpt,r1
+ bne 1f
+ mov @argv,r1
+ cmp r1,$entry
+ bne 1f
+ movb libch,r1
+1:
+ mov r1,(r0)+
+ mov nflag,(r0)+
+ beq 1f
+ bis $1,entpt
+1:
+ mov r0,bufptr
+ jsr r5,doreloc
+ mov (sp)+,r5
+ rts r5
+
+/ link a file
+ldfile:
+ mov tsize,outtxt
+ mov outtxt+2,r0
+ add dsize,r0
+ sub offset,r0
+ mov r0,outdat
+ mov outdat+2,r0
+ add bsize,r0
+ sub offset,r0
+ sub offset+2,r0
+ mov r0,outbss
+ mov r5,-(sp)
+ jsr r5,setup
+ outbf; outhdr
+ mov $symlst,r5
+ mov $-1,-(sp)
+ mov outfd,r1
+ tstb (r1)+
+ bne 1f
+ cmp r1,outfd
+ blos 2f
+ cmpb -(r1),$'/
+ bne 1f
+ tstb (r1)+
+2:
+ mov $sysname,r0
+1:
+ movb (r1)+,(r0)+
+ bne 1f
+ tstb -(r1)
+1:
+ cmp r0,$sysname+8.
+ blo 1b
+ mov $37.,hession
+ mov outtxt,hession+2
+ tst sflag
+ bne 1f
+ jsr r5,wrname
+1:
+ jsr r5,reloc
+ bvs done
+ jsr r5,doreloc
+ inc (sp)
+ cmp hession,$'
+ bhis 1f
+ tst nflag
+ bne 1b
+ add $12.,hession+2
+ br 1b
+1:
+ jsr r5,lookup
+ mov (r4),r0
+ beq 1f
+ cmp 10.(r0),$'
+ bgt 1b
+ cmp hession,$'
+ ble 3f
+ inc errcnt
+ br 2f
+1:
+ mov r4,(r5)+
+ jsr r5,newsym
+ cmp hession,$'
+ ble 1b
+3:
+ jsr r5,rdsymtab
+ mov (r4),r0
+ mov hession,10.(r0)
+ mov hession+2,12.(r0)
+ br 1b
+
+done:
+ tst endflg
+ beq 1f
+ tst errcnt
+ bne 1f
+ mov (sp)+,symptr
+ cmp r5,$symlst
+ blos 2f
+ clr @-(r5)
+ br 1f
+2:
+ tst (sp)+
+1:
+ tst ession
+ beq 1f
+ add outtxt,ession
+ tst errcnt
+ beq 1f
+ jsr r5,errout
+ err4; .even
+1:
+ mov ession,errcnt
+ add hession+2,hession+4
+ mov bufptr,r0
+ cmp r0,$symlst
+ bhis 1f
+ jsr r5,errout
+ err3; .even
+ jmp onerr
+1:
+ mov (sp)+,(r5)+
+ mov (r4),(r5)+
+ br 1b
+
+pass2:
+ mov r5,symend
+ tst (sp)+
+ jsr r5,setup
+ outbf; txtbf
+ jsr r5,setup
+ sdbf; symhdr
+ mov tsize,pass2txt
+ jsr r5,getword
+ br 1f
+2:
+ tst rflag
+ bne 1f
+ jsr r5,putw; rdbf
+1:
+ mov r3,r0
+ jsr r5,putw; outbf
+ br 2b
+
+ jsr r5,setup
+ outbf; datbf
+ mov outdat,r0
+ mov r0,pass2txt
+ mov (sp)+,r5
+ jsr r5,getword
+ br 1f
+2:
+ tst rflag
+ bne 1f
+ jsr r5,putw; sdbf
+1:
+ mov r3,r0
+ jsr r5,putw; outbf
+ br 2b
+
+ jsr r5,doreloc
+ rts r5
+
+/ read word from input buffer
+getword:
+ mov (r5)+,r1
+ sub $2,(r1)+
+ bge 1f
+ sev
+ rts r5
+1:
+ mov (r1)+,r2
+ cmp r2,(r1)+
+ bhis 2f
+ mov (r2)+,r0
+ mov r2,-4(r1)
+ rts r5
+2:
+ mov (r1),0f
+ mov infd,r0
+ sys seek; 0:.=.+2; 0
+ add $512.,(r1)+
+ mov r1,0f
+ mov -8.(r1),r0
+ add $2,r0
+ cmp r0,$512.
+ ble 1f
+ mov $512.,r0
+1:
+ mov r0,0f+2
+ jsr r5,doread; 0:.=.+2; .=.+2
+ mov (r1)+,r0
+ mov r1,-8.(r1)
+ rts r5
+
+/ write word to output buffer
+wrhdr:
+ mov (r5)+,r1
+ mov (r5)+,r2
+ mov (r2),0f
+ mov infd,r0
+ sys seek; 0:.=.+2; 0
+
+ mov (r2),r0
+ bis $777,r0
+ inc r0
+ add $8.,r1
+ mov r1,-(sp)
+ add $512.,(sp)
+ mov r0,-(r1)
+ mov (sp),-(r1)
+ sub (r2)+,r0
+ sub r0,(sp)
+ mov (sp),-(r1)
+ mov (sp)+,0f
+ cmp (r2),r0
+ bge 1f
+ mov (r2),r0
+1:
+ mov r0,0f+2
+ mov (r2),-(r1)
+ jsr r5,doread; 0:.=.+2; .=.+2
+ rts r5
+
+doread:
+ mov (r5)+,0f
+ mov (r5)+,0f+2
+ mov infd,r0
+ sys read; 0:.=.+2; 0:.=.+2
+ bec 1f
+ cmp r0,-4(r5)
+ bne 1f
+ rts r5
+1:
+ jsr r5,errout
+ rderr; .even
+ jmp onerr
+
+/ relocation routines
+reloc:
+ mov (r5)+,r1
+ sub $2,(r1)+
+ bge 1f
+ sev
+ rts r5
+1:
+ mov (r1)+,r2
+ cmp r2,(r1)+
+ bhis 2f
+ mov (r2)+,r0
+ mov r2,-4(r1)
+ rts r5
+2:
+ mov (r1),0f
+ mov infd,r0
+ sys seek; 0:.=.+2; 0
+ bic $177000,r1
+ add r2,r1
+ mov r1,0f
+ mov r2,r0
+ bis $777,-(r2)
+ inc (r2)
+ cmp -(r2),-(r2)
+ sub (r2),r1
+ neg r1
+ mov r1,0f+2
+ mov r0,(r2)
+ mov infd,r0
+ sys write; 0:.=.+2; 0:.=.+2
+ rts r5
+
+/ symbol table lookup
+lookup:
+ mov $sysname,r1
+ mov (r1)+,r0
+ add (r1)+,r0
+ add (r1)+,r0
+ add (r1)+,r0
+ mov r0,hession
+ clr hession+2
+ mov $1000.,hession+8.
+ mov hession,r4
+ asl r4
+ add $hashbuf,r4
+ mov (r4)+,r0
+ beq notfound
+ mov $sysname,r1
+ cmp (r1)+,(r0)+
+ bne 1b
+ cmp (r1)+,(r0)+
+ bne 1b
+ cmp (r1)+,(r0)+
+ bne 1b
+ cmp (r1)+,(r0)+
+ bne 1b
+notfound:
+ tst -(r4)
+ rts pc
+
+/ allocate new symbol
+newsym:
+ mov symptr,r0
+ add $12.,r0
+ cmp r0,0f
+ blo 1f
+ add $500.,r0
+ mov r0,0f
+ sys break; 0:symtab
+ mov symptr,r0
+ mov $sysname,r1
+ mov $6,-(sp)
+1:
+ mov (r1)+,(r0)+
+ dec (sp)
+ bne 1b
+ mov r0,symptr
+ tst (sp)+
+ rts pc
+
+/ error output
+errout:
+ jsr pc,seterr
+ tst outfd
+ beq 1f
+ mov $1,r0
+ sys write; errch; 1
+1:
+ mov (sp)+,r1
+ mov $8.,-(sp)
+1:
+ movb (r1)+,errch
+ beq 2f
+ mov $1,r0
+ sys write; errch; 1
+ dec (sp)
+ bne 1b
+2:
+ tst (sp)+
+ mov (sp)+,r1
+ br errout2
+
+errmsg:
+ jsr pc,seterr
+ mov $1,r0
+ sys write; errch; 1
+ rts r5
+
+seterr:
+ mov $17.,770.
+ mov r1,-(sp)
+ mov (r5)+,r1
+1:
+ movb (r1)+,errch
+ beq 2f
+ mov $1,r0
+ sys write; errch; 1
+ br 1b
+2:
+ mov outfd,r1
+ beq 3f
+1:
+ movb (r1)+,errch
+ beq 3f
+ mov $1,r0
+ sys write; errch; 1
+ br 1b
+3:
+ mov (sp)+,r1
+ rts pc
+
+errout2:
+ br errout+4
+
+/ put word
+putw:
+ mov r1,-(sp)
+ mov r2,-(sp)
+ mov (r5)+,r2
+ mov (r2)+,r1
+ cmp r1,(r2)
+ bhis 1f
+ mov r0,(r1)+
+ mov r1,-(r2)
+ br 2f
+1:
+ tst (r2)+
+ mov r0,-(sp)
+ jsr r5,doflush
+ mov @(r2)+,-(sp)
+ add $2,-(r2)
+2:
+ mov (sp)+,r2
+ mov (sp)+,r1
+ rts r5
+
+doflush:
+ mov (r5)+,r2
+ cmp (r2)+,(r2)+
+ mov (r2)+,r1
+ mov r1,0f
+ mov outfd,r0
+ sys seek; 0:.=.+2; 0
+ bic $177000,r1
+ add r2,r1
+ mov r1,0f
+ mov r2,r0
+ bis $777,-(r2)
+ inc (r2)
+ cmp -(r2),-(r2)
+ sub (r2),r1
+ neg r1
+ mov r1,0f+2
+ mov r0,(r2)
+ mov outfd,r0
+ sys write; 0:.=.+2; 0:.=.+2
+ rts r5
+
+/ read symbol table
+rdsymtab:
+ mov $6,-(sp)
+ mov $sysname,r4
+1:
+ jsr r5,reloc
+ outbf
+ bvs 2f
+ mov r0,(r4)+
+ dec (sp)
+ bne 1b
+ tst (sp)+
+ rts r5
+2:
+ tst (sp)+
+ sev
+ rts r5
+
+/ scan arguments
+argscan:
+ mov bufptr,r0
+ add $4,bufptr
+ mov (r0)+,r0
+ beq scandone
+ cmp r0,$177
+ bhi 1f
+ cmp r0,$1
+ beq reloc1
+ movb r0,libch
+ mov $entry,r0
+1:
+ jsr r5,doopen
+ br argscan
+reloc1:
+ mov (r1),nflag
+ beq argscan
+ sub $16.,(r1)
+ mov (r1),0f
+ mov infd,r0
+ sys seek; 0:.=.+2; 0
+scandone:
+ mov infd,r0
+ sys read; hdrrd; 32.
+ mov $hdrrd,r4
+ add nflag,nflag
+ cmp endflg,$'
+ beq doentry
+ tst (r4)+
+ mov $18.,nflag
+argscan2:
+ add argc,argc
+ beq done2
+ mov argv,r1
+ tst (r1)+
+ mov r1,argv
+ cmpb @0(r1),$'-
+ bne 1f
+ jsr r5,dosw
+ br argscan2
+1:
+ clr nflag
+ clr argc
+ mov @argv,r0
+ clr entpt
+ jsr r5,doopen
+ br argscan2
+
+doentry:
+ mov infd,r0
+ sys read; hdrrd; 34.
+ bhis 1f
+ mov r0,r3
+ mov $hdrrd,r4
+ add r4,r3
+ cmp r3,$hdrbf
+ bhis doformaterr
+ cmp (r4),symhdr
+ bne doentry2
+ cmp r3,$hdrbf2
+ bhis doformaterr
+ tst (r4)+
+ mov $18.,nflag
+
+doentry2:
+ cmp (r4)+,magic
+ bne doformaterr
+ mov $txtbf,r1
+ mov nflag,r2
+ add $16.,r2
+ mov (r4)+,r0
+ mov r2,(r1)+
+ mov r0,(r1)+
+ add r0,r2
+ mov (r4)+,r0
+ mov r2,(r1)+
+ mov r0,(r1)+
+ add r0,r2
+ mov (r4)+,(r1)+
+ mov r2,(r1)+
+ mov offset,(r1)
+ add (r1)+,r2
+ mov r2,(r1)+
+ mov offset+2,(r1)
+ add (r1)+,r2
+ mov (r4)+,r0
+ mov r2,(r1)+
+ mov r0,(r1)+
+ mov (r4)+,r0
+ cmp r0,hitext
+ blo 1f
+ mov r0,hitext
+1:
+ mov (r4)+,ession
+ tst (r4)+
+ beq 1f
+ jsr r5,errout
+ err2; .even
+ rts r5
+1:
+ tst (r5)+
+ rts r5
+
+doformaterr:
+ jsr r5,errout
+ err1; .even
+ jmp onerr
+
+/ handle switches
+dosw:
+ mov (r1),r0
+ movb 1(r0),r0
+ cmpb r0,$'u
+ beq dosw_u
+ cmpb r0,$'l
+ beq dosw_l
+ cmpb r0,$'x
+ beq dosw_x
+ cmpb r0,$'e
+ beq dosw_e
+ cmpb r0,$'r
+ beq dosw_r
+ cmpb r0,$'s
+ beq dosw_s
+ rts r5
+
+dosw_s:
+ inc sflag
+ inc nflag
+ rts r5
+
+dosw_r:
+ clr rflag
+ rts r5
+
+dosw_x:
+ inc nflag
+ rts r5
+
+dosw_l:
+ movb $'a,libch
+ mov (r1),r1
+ movb 2(r1),r0
+ beq 1f
+ movb r0,libch
+1:
+ mov $entry,@argv
+ tst (r5)+
+ rts r5
+
+dosw_e:
+ clr r4
+ jsr r5,dosw_u
+ mov (r4),ession
+ rts r5
+
+dosw_u:
+ dec argc
+ blt done2
+ add $2,argv
+ mov @argv,r0
+ mov $sysname,r1
+ mov $8.,-(sp)
+1:
+ movb (r0)+,(r1)+
+ beq 2f
+ dec (sp)
+ bgt 1b
+2:
+ dec (sp)
+ ble 3f
+ clrb (r1)+
+ br 2b
+3:
+ tst (sp)+
+ mov $' ,(r1)+
+ clr (r1)+
+ jsr r5,lookup
+ tst (r4)
+ bne done2
+ jsr r5,newsym
+done2:
+ rts r5
+
+rdsymtab2:
+ mov hession,r0
+ bic $177700,r0
+ beq 1f
+ cmp r0,$5
+ bhis 1f
+ asl r0
+ add @reltab(r0),hession+2
+1:
+ rts r5
+
+findslot:
+ mov $symlst,r4
+ cmp r4,symend
+ bhis 1f
+ cmp (r4)+,r2
+ beq 2f
+ tst (r4)+
+ br findslot+4
+1:
+ jsr r5,errout
+ err7; .even
+ jmp onerr
+2:
+ mov (r4),r4
+ rts r5
+
+/ open input file
+doopen:
+ clr entpt
+ mov r0,0f
+ mov r0,outfd
+ mov infd,r0
+ beq 1f
+ sys close
+1:
+ sys open; 0:.=.+2; 0
+ bec 1f
+ jsr r5,errout
+ err6; .even
+ rts r5
+1:
+ mov r0,infd
+ tst (r5)+
+ rts r5
+
+/ do final relocation
+doreloc:
+ add offset,tsize
+ add offset+2,dsize
+ add offset+4,bsize
+ rts r5
+
+/ error messages
+outmsg: <a.out\0>
+ldmsg: <l.out\0>
+err1: <: Can't move output file\n\0>
+ .even
+err2: <No relocation bits: \0>
+ .even
+err3: <Too many routines loaded at: \0>
+ .even
+err4: <Multiply defined: \0>
+ .even
+err5: <Too many symbols in: \0>
+ .even
+err6: <Relocation error in: \0>
+ .even
+rderr: <Premature EOF on: \0>
+ .even
+ldcan: <ld: can't create l.out\n\0>
+ .even
+filerr: <File not found: \0>
+ .even
+fmterr: <Format error: \0>
+ .even
+err7: <Symbol not found: \0>
+ .even
+err8: <Multiple entry point:\n\0>
+ .even
+libpth: </usr/lib\0>
+liba: </lib\0>
+libd: <a.a\0>
+ .even
+resvd: 0:.=.+2
+magic: 407
+
+.bss
+tsize: .=.+2
+dsize: .=.+2
+bsize: .=.+2
+hitext: .=.+2
+offset: .=.+6
+argc: .=.+2
+argv: .=.+2
+outfd: .=.+2
+infd: .=.+2
+sflag: .=.+2
+rflag: .=.+2
+nflag: .=.+2
+endflg: .=.+2
+entpt: .=.+2
+errcnt: .=.+2
+ession: .=.+2
+outfn: .=.+14.
+libch: .=.+2
+outtxt: .=.+2
+outdat: .=.+2
+outbss: .=.+2
+errch: .=.+2
+pass2txt: .=.+2
+bufptr: .=.+2
+symptr: .=.+2
+symend: .=.+2
+sysname: .=.+16.
+hdrrd: .=.+34.
+hession: .=.+12.
+outbf: .=.+512.
+txtbf: .=.+512.
+datbf: .=.+512.
+rdbf: .=.+512.
+sdbf: .=.+512.
+rtbf: .=.+512.
+hdrbf: .=.+34.
+hdrbf2:
+outhdr: .=.+16.
+symhdr: .=.+16.
+reltab: .=.+10.
+hashbuf: .=.+2048.
+entry: .=.+14.
+symlst:
+symtab = symlst+1000.
diff --git a/cmd/maki.s b/cmd/maki.s
new file mode 100644
index 0000000..1bd8907
--- /dev/null
+++ b/cmd/maki.s
@@ -0,0 +1,68 @@
+/ maki -- copy tape to disk (tape make)
+
+ br start
+ bne 1f
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+start:
+ sys open; src; 0
+ bes error
+ mov r0,r1
+ sys read; buf; 512.
+ mov r1,r0
+ sys close
+ sys open; dst; 1
+ bes error
+ mov r0,r1
+ sys write; buf; 512.
+ bes error
+ sys open; rf0; 0
+ bes error
+ mov r0,r2
+ jsr pc,copy
+ mov r1,r0
+ sys close
+ sys open; dst2; 1
+ bes error
+ mov r0,r1
+ jsr pc,copy
+ sys exit
+
+copy:
+ mov $512.,-(sp)
+1:
+ mov r2,r0
+ sys read; buf; 512.
+ bes error
+ mov r1,r0
+ sys write; buf; 512.
+ bes error
+ dec (sp)
+ bne 1b
+ tst (sp)+
+ rts pc
+
+error:
+ mov $1,r0
+ sys write; errmsg; 16.
+ sys exit
+
+errmsg: <error in copy\n\0>
+ .even
+
+src: </dev/tap0\0>
+ .even
+dst: </dev/tap1\0>
+ .even
+rf0: </dev/rf0\0>
+ .even
+dst2: </etc/std0\0>
+ .even
+
+.bss
+buf: .=.+512.
diff --git a/cmd/mv.s b/cmd/mv.s
new file mode 100644
index 0000000..7bd81b3
--- /dev/null
+++ b/cmd/mv.s
@@ -0,0 +1,157 @@
+/ mv -- move/rename files
+
+ mov (sp)+,r2
+ tst (sp)+
+ cmp r2,$2
+ blt badcount
+ mov (sp),r4
+ cmpb (r4)+,$'-
+ bne 1f
+ cmpb (r4),$'d
+ bne 1f
+ tst (sp)+
+ dec r2
+ incb dflag
+1:
+ cmp r2,$3
+ beq 2f
+badcount:
+ jsr r5,error
+ <Arg count\n\0>
+ .even
+2:
+ mov (sp)+,r3
+ mov (sp)+,r4
+ mov r3,0f
+ sys stat; 0:..; sstbuf
+ bes noexit
+ jsr r5,error
+ <Source file non-existent\n\0>
+ .even
+noexit:
+ mov sstbuf+8.,mq
+ mov sstbuf+6.,ac
+ bit $40000,sstbuf+4
+ bne destdir
+ mov r4,0f
+ sys stat; 0:..; dstbuf
+ bes samename
+ jsr r5,error
+ <Directory mv target exists\n\0>
+ .even
+samename:
+ mov r3,r0
+ mov r4,r1
+1:
+ cmpb (r0),(r1)
+ bne 2f
+ inc r0
+ tstb (r1)+
+ bne 1b
+ sys exit
+2:
+ tstb (r0)
+ beq gotbase
+ cmpb (r0)+,$'/
+ bne 2b
+ br 1b+4
+
+gotbase:
+ tstb (r1)
+ beq dolink
+ cmpb (r1)+,$'/
+ bne gotbase
+ jsr r5,error
+ <Directory mv only to same level.\n\0>
+ .even
+dolink:
+ cmpb -(r0),$'.
+ bne trylink
+ jsr r5,error
+ <Cannot link to . or ..\n\0>
+ .even
+trylink:
+ br link
+
+destdir:
+ sys setuid
+ sys getuid
+ mov r4,0f
+ sys stat; 0:..; dstbuf
+ bes link
+ bit $40000,dstbuf+4
+ beq checkid
+ mov $nch,r1
+1:
+ movb (r4)+,(r1)+
+ bne 1b
+ movb $'/,-1(r1)
+ mov r3,r4
+ mov r3,r0
+1:
+ tstb (r4)
+ beq 2f
+ cmpb (r4)+,$'/
+ bne 1b
+ mov r4,r0
+ br 1b
+2:
+ movb (r0)+,(r1)+
+ bne 2b
+ mov $nch,r4
+ br destdir
+
+checkid:
+ cmp sstbuf+2,dstbuf+2
+ bne delold
+ jsr r5,error
+ <Files are identical.\n\0>
+ .even
+delold:
+ mov r4,0f
+ sys unlink; 0:..
+ bec link
+ jsr r5,error
+ <Cannot remove target file.\n\0>
+ .even
+link:
+ mov r3,0f
+ mov r4,0f+2
+ sys link; 0:..; 0:..
+ bec unl
+ jsr r5,error
+ <Cannot link target file.\n\0>
+ .even
+unl:
+ mov r3,0f
+ sys unlink; 0:..
+ bec date
+ jsr r5,error
+ <Cannot unlink source file.\n\0>
+ .even
+date:
+ tstb dflag
+ beq done
+ mov r4,0f
+ sys smdate; 0:..
+ bec done
+ jsr r5,error
+ <Can set modified date back.\n\0>
+ .even
+done:
+ sys exit
+
+error:
+ movb (r5)+,ch
+ beq 1f
+ mov $1,r0
+ sys write; ch; 1
+ br error
+1:
+ sys exit
+
+ch: .=.+2
+dflag: .=.+2
+sstbuf: .=.+40.
+dstbuf: .=.+40.
+nch: .=.+128.
diff --git a/cmd/nm.s b/cmd/nm.s
new file mode 100644
index 0000000..07cc47d
--- /dev/null
+++ b/cmd/nm.s
@@ -0,0 +1,211 @@
+/ nm -- print symbol table
+
+ cmp (sp)+,$2
+ blt 1f
+ tst (sp)+
+ mov (sp)+,0f
+1:
+ sys open; 0:..; 0
+ bes error
+ mov r0,r1
+ sys read; hdr; 16.
+ cmp r0,$16.
+ bne error
+ cmp hdr,$432
+ beq oldstyle
+ cmp hdr,$407
+ bne error
+ mov hdr+6.,symsize
+ mov hdr+2,0f
+ br 1f
+
+oldstyle:
+ mov hdr+2,r2
+ add hdr+6.,r2
+ cmp hdr+14.,$1
+ beq 1f
+ asl r2
+1:
+ add $16.,r2
+ mov r2,0f
+ mov r1,r0
+ sys seek; 0:..; 0
+ add symsize,0f
+ sys seek; 0f+2; 0
+ mov r1,r0
+ sys read; syms; 0:..
+ mov $syms,r1
+ mov r1,r2
+ add r0,r2
+ mov r2,-(sp)
+ mov $12.,r3
+ jsr pc,sort
+ mov (sp)+,r4
+ mov $syms,r1
+ br loop
+error:
+ mov $1,r0
+ sys write; errmsg; 2
+ sys exit
+
+loop:
+ cmp r1,r4
+ bcc done
+ mov $line,r2
+ mov 8.(r1),r3
+ mov r3,r5
+ bic $177740,r3
+ bne prval
+ mov $6,r3
+1:
+ movb $' ,(r2)+
+ dec r3
+ bne 1b
+ br prtype
+
+prval:
+ mov 10.(r1),num
+ clr num-2
+ mov $6,r3
+ mov $1,lsh
+ br 1f
+2:
+ clr num-2
+ mov $3,lsh
+1:
+ add $'0,num-2
+ movb num-2,(r2)+
+ dec r3
+ bne 2b
+
+prtype:
+ mov r1,-(sp)
+ mov r5,r3
+ bic $40,r3
+ cmp r3,$5
+ blo 1f
+ mov $1,r3
+1:
+ movb types(r3),(r2)+
+ movb $' ,(r2)+
+ mov $8.,r3
+ bit $40,r5
+ beq 1f
+ movb $'_,(r2)+
+ movb $'\b,(r2)+
+1:
+ movb (r1)+,(r2)+
+ beq 2f
+ dec r3
+ bne 1b
+2:
+ movb $'\n,(r2)+
+ sub $line,r2
+ mov r2,0f
+ mov $1,r0
+ sys write; line; 0:..
+ mov (sp)+,r1
+ add $12.,r1
+ br loop
+
+done:
+ sys exit
+
+0: <a.out\0>
+ .even
+types: <??UT B\0>
+ .even
+
+sort:
+ mov r2,r0
+ sub r1,r0
+ cmp r0,r3
+ ble sortdone
+ mov r0,num
+ mov r3,reclen
+ asr num
+ mov r3,num+2
+ mov num,r4
+ add r1,r4
+1:
+ mov r1,-(sp)
+ mov r2,-(sp)
+ mov r1,r0
+ jsr pc,compare
+ bge 2f
+ add r3,r1
+ br 1b
+2:
+ cmp r2,r4
+ blos 3f
+ sub r3,r2
+ mov r2,r0
+ jsr pc,compare
+ bge 2b
+ jsr pc,swap
+ cmp r1,r4
+ bne 1b
+ mov r2,r4
+ br 1b
+3:
+ cmp r1,r4
+ beq 4f
+ jsr pc,swap
+ mov r1,r4
+ br 2b
+4:
+ mov (sp)+,r2
+ mov r4,-(sp)
+ mov r4,r1
+ add r3,r1
+ jsr pc,sort
+ mov (sp)+,r2
+ mov (sp)+,r1
+ br sort
+sortdone:
+ rts pc
+
+compare:
+ mov r3,-(sp)
+ mov r4,-(sp)
+1:
+ cmpb (r0)+,(r4)+
+ bne 2f
+ dec r3
+ bne 1b
+ clr r0
+ br 3f
+2:
+ blo 4f
+ mov $1,r0
+ br 3f
+4:
+ mov $-1,r0
+3:
+ mov (sp)+,r4
+ mov (sp)+,r3
+ tst r0
+ rts pc
+
+swap:
+ mov r1,-(sp)
+ mov r2,-(sp)
+ mov r3,-(sp)
+1:
+ movb (r1),r0
+ movb (r2),(r1)+
+ movb r0,(r2)+
+ dec r3
+ bne 1b
+ mov (sp)+,r3
+ mov (sp)+,r2
+ mov (sp)+,r1
+ rts pc
+
+errmsg: <?\n>
+hdr: .=.+16.
+symsize: .=.+2
+num: .=.+4
+reclen: .=.+2
+line: .=.+40.
+syms:
diff --git a/cmd/od.s b/cmd/od.s
new file mode 100644
index 0000000..fbeae73
--- /dev/null
+++ b/cmd/od.s
@@ -0,0 +1,112 @@
+/ od -- octal dump
+
+ sys break; end
+ mov (sp)+,r1
+ tst (sp)+
+ cmp r1,$2
+ blt error
+ mov (sp)+,0f
+ sys open; 0:..; 0
+ bes error
+ mov r0,fin
+ cmp r1,$2
+ ble 1f
+ mov (sp)+,r0
+2:
+ movb (r0)+,r1
+ beq 1f
+ asl offset
+ asl offset
+ asl offset
+ bic $177770,r1
+ bis r1,offset
+ br 2b
+1:
+ bic $7,offset
+ cmp addr,offset
+ beq loop
+ jsr pc,getw
+ br 1b
+
+loop:
+ mov addr,r0
+ jsr pc,praddr
+ mov $8.,r1
+ mov $' ,r0
+ jsr pc,putc
+1:
+ jsr pc,getw
+ mov r0,-(sp)
+ blt 2f
+ mov $' ,r0
+ jsr pc,putc
+ br 3f
+2:
+ mov $'-,r0
+ jsr pc,putc
+3:
+ mov (sp)+,r0
+ jsr pc,praddr
+ dec r1
+ bne 1b
+ mov $'\n,r0
+ jsr pc,putc
+ br loop
+
+error:
+ mov $1,r0
+ sys write; errmsg; 4
+ sys exit
+
+errmsg: <?\n\0\0>
+
+getw:
+ bne 1f
+ cmp bufp,$buf+512.
+ bne 2f
+ mov fin,r0
+ sys read; buf; 512.
+ bes error
+ tst r0
+ beq done
+ mov $buf,bufp
+2:
+ mov @bufp,r0
+ add $2,bufp
+ rts pc
+
+done:
+ mov $1,r0
+ sys write; nl; 1
+ sys exit
+nl: <\n>
+
+praddr:
+ mov r0,mq
+ inc lsh
+ mov $5,-(sp)
+1:
+ clr ac
+ mov $3,lsh
+ mov ac,r0
+ add $'0,r0
+ jsr pc,putc
+ dec (sp)
+ bne 1b
+ tst (sp)+
+ rts pc
+
+putc:
+ mov r0,ch
+ mov $1,r0
+ sys write; ch; 1
+ rts pc
+
+ch: .=.+2
+offset: .=.+2
+addr: buf+512.
+fin: .=.+2
+
+buf: .=.+512.
+bufp: .=.+2
+end:
diff --git a/cmd/pr.s b/cmd/pr.s
new file mode 100644
index 0000000..15cc545
--- /dev/null
+++ b/cmd/pr.s
@@ -0,0 +1,342 @@
+/ pr -- print/paginate files
+
+ sys break; end
+ mov (sp)+,nfiles
+ tst (sp)+
+ clr r0
+ sys fstat; stbuf
+ bit $1,stbuf+4
+ beq loop
+ sys gtty; ttybuf
+ mov ttybuf,r0
+ sub stbuf+4,r0
+ add $'0,r0
+ movb r0,ttyno
+ sys stty; ttybuf; 14
+ bes 1f
+ inc ttyflg
+1:
+loop:
+ clr fin
+ mov fin,r0
+ beq 1f
+ sys close
+ clr fin
+1:
+ dec nfiles
+ bgt 2f
+ jmp done
+2:
+ mov (sp)+,r0
+ mov r0,filnam
+ cmpb (r0)+,$'-
+ bne dofile
+ cmpb (r0),$'l
+ bne 3f
+ mov $78.,linesz
+ br loop
+3:
+ cmpb (r0),$'r
+ bne 4f
+ mov $66.,linesz
+ br loop
+4:
+ cmpb (r0),$'m
+ bne 5f
+ clr cflag
+ br loop
+5:
+ cmpb (r0),$'c
+ bne dofile
+ inc cflag
+ br loop
+
+dofile:
+ mov filnam,r0
+ jsr r5,fopen; buf
+ bes loop
+ tst cflag
+ beq 2f
+ sys fstat
+ mov mq,fmtime
+ mov ac,fmtime+2
+ br 3f
+2:
+ mov fin,r0
+ sys fstat; stbuf
+ mov stbuf+32.,fmtime
+ mov stbuf+30.,fmtime+2
+3:
+ clr pageno
+ clr eof
+ clr pushc
+
+page:
+ jsr pc,header
+ br loop
+
+error:
+ mov $1,r0
+ sys write; errmsg; 2
+ mov $1,r0
+ mov fmtime,mq
+ mov fmtime+2,ac
+ jsr pc,prdate
+ mov $1,r0
+ sys write; errmsg+2; 2
+ inc pageno
+ mov filnam,r1
+ mov r1,0f
+ mov $-1,r0
+1:
+ inc r0
+ tstb (r1)+
+ bne 1b
+ mov r0,0f+2
+ mov $1,r0
+ sys write; 0:..; 0:..
+ mov $1,r0
+ sys write; sp2; 6
+ mov pageno,mq
+ jsr pc,prpage
+ mov $1,r0
+ sys write; nl; 4
+ mov linesz,r1
+ sub $11.,r1
+body:
+ jsr pc,prbody
+1:
+ jsr pc,getc
+ cmp r0,$'\n
+ bne 1b
+ dec r1
+ bne 1b
+ mov $1,r0
+ sys write; nl; 5
+ br page
+
+done:
+ tst ttyflg
+ beq 1f
+ sys stty; ttybuf; 15
+1:
+ sys exit
+
+prpage:
+ clr ac
+ mov $10.,div
+ mov ac,-(sp)
+ tst mq
+ beq 1f
+ jsr pc,prpage
+1:
+ mov (sp)+,r0
+ add $'0,r0
+ mov r0,ch
+ mov $1,r0
+ sys write; ch; 1
+ mov ch,r0
+ rts pc
+
+prbody:
+ mov pushc,r0
+ beq 1f
+ clr pushc
+ rts pc
+1:
+ tst eof
+ beq 2f
+ mov $'\n,r0
+ rts pc
+2:
+ jsr r5,getc; buf
+ bec 3f
+ mov pc,eof
+ br prbody
+3:
+ rts pc
+
+header:
+ jsr pc,prbody
+ mov r0,pushc
+ tst eof
+ bne 1f
+ add $2,(sp)
+1:
+ rts pc
+
+nl:
+ <\n\n >
+sp2: < Page \0>
+ .even
+tty: </dev/tty0\0>
+ .even
+
+linesz: 66.
+fmtime: .=.+4
+nfiles: .=.+2
+eof: .=.+2
+pushc: .=.+2
+ch: .=.+2
+fin: .=.+2
+stbuf: .=.+40.
+filnam: .=.+2
+cflag: .=.+2
+ttyflg: .=.+2
+ttybuf: .=.+6
+ttyno = tty+8.
+pageno: .=.+2
+
+prdate:
+ mov r1,-(sp)
+ sub $16.,sp
+ mov r0,r1
+ mov sp,r0
+ jsr pc,fmtdate
+ mov r0,0f
+ mov r1,r0
+ sys write; 0:..; 17.
+ add $16.,sp
+ mov (sp)+,r1
+ rts pc
+
+fmtdate:
+ mov r2,-(sp)
+ mov r3,-(sp)
+ cmp ac,yrdays
+ blo 1f
+ bhi 2f
+ cmp mq,yrdays+2
+ blo 1f
+2:
+ mov ac,-(sp)
+ sub yrdays+2,mq
+ sbc (sp)
+ sub yrdays,(sp)
+ mov (sp)+,ac
+ mov $29.,daylen
+1:
+ mov $-4,lsh
+ mov $26300.,div
+ mov mq,r3
+ mov ac,mq
+ mov $2,lsh
+ mov $17.,div
+ add $17.,r0
+ jsr r5,digit; 10.
+ jsr r5,digit; 6
+ movb $':,-(r0)
+ jsr r5,digit; 10.
+ jsr r5,digit; 6
+ movb $':,-(r0)
+ mov r3,mq
+ mov $24.,div
+ mov mq,r3
+ mov ac,mq
+ jsr r5,digit; 10.
+ jsr r5,digit; 10.
+ mov r2,$montab
+1:
+ cmp (r2),r3
+ bgt 2f
+ sub (r2)+,r3
+ br 1b
+2:
+ movb $' ,-(r0)
+ sub $montab,r2
+ asl r2
+ add $months,r2
+ inc r3
+ mov r3,mq
+ jsr r5,digit; 10.
+ tst mq
+ beq 1f
+ add $'0,mq
+ movb mq,-(r0)
+ br 2f
+1:
+ movb $' ,-(r0)
+2:
+ movb $' ,-(r0)
+ movb -(r2),-(r0)
+ movb -(r2),-(r0)
+ movb -(r2),-(r0)
+ mov (sp)+,r3
+ mov (sp)+,r2
+ rts pc
+
+digit:
+ clr ac
+ mov (r5)+,div
+ add $'0,ac
+ movb ac,-(r0)
+ rts r5
+
+yrdays: 57544.; 4480.
+daylen: 31.; 28.; 31.; 30.; 31.; 30.; 31.; 31.; 30.; 31.; 30.
+montab = .-2
+months:
+ < \0Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec\0>
+ .even
+
+fopen:
+ mov r1,-(sp)
+ mov (r5)+,r1
+ mov r0,0f
+ sys open; 0:..; 0
+ bec 1f
+ mov $-1,(r1)
+ mov (sp)+,r1
+ sec
+ rts r5
+1:
+ mov r0,(r1)+
+ clr (r1)+
+ mov (sp)+,r1
+ rts r5
+
+getword:
+ mov (r5),0f
+ mov (r5)+,0f+2
+ jsr r5,getc; 0:..
+ bec 1f
+ rts r5
+1:
+ mov r0,-(sp)
+ jsr r5,getc; 0:..
+ swab r0
+ bis (sp)+,r0
+ rts r5
+
+getc:
+ mov r1,-(sp)
+ mov (r5)+,r1
+ dec 2(r1)
+ bge 2f
+ mov r1,r0
+ add $6,r0
+ mov r0,0f
+ mov r0,4(r1)
+ mov (r1),r0
+ sys read; 0:..; 512.
+ bec 1f
+1:
+ tst r0
+ bne 3f
+ mov (sp)+,r1
+ sec
+ rts r5
+3:
+ dec r0
+ mov r0,2(r1)
+2:
+ clr r0
+ bisb @4(r1),r0
+ inc 4(r1)
+ mov (sp)+,r1
+ rts r5
+
+errmsg: <?\n>
+
+buf: .=.+518.
+end:
diff --git a/cmd/roff.s b/cmd/roff.s
new file mode 100644
index 0000000..6b071f4
--- /dev/null
+++ b/cmd/roff.s
@@ -0,0 +1,1025 @@
+/ roff -- text formatter
+
+ cmp sp,$57544
+ bhi 1f
+ jsr r5,memerr
+ <Too many files.\n\0>; .even
+ sys exit
+1:
+ clr r0
+ jsr pc,init
+ sys exit
+ br done
+
+/ stack check and initialization
+start:
+ clr r0
+ jsr pc,init
+ sys creat; fname; 17
+ bes error
+ mov r0,outfd
+ tst (sp)+
+ mov (sp)+,0f
+1:
+ mov $buf,r4
+ jsr r5,descend
+ cmp r4,$buf
+ beq 2f
+ jsr pc,flush
+ br 1b
+2:
+ mov $1,r0
+ sys write; header+1; 3
+ mov outfd,r0
+ beq done
+ sys close
+ sys open; fname; 0
+ bec 1f
+ br error
+1:
+ mov r0,tmpfd
+ br done
+
+error:
+ mov $1,r0
+ sys write; errmsg; 5
+ sys exit
+
+done:
+ tst outfd
+ beq 1f
+ sys creat; 0:..; 17
+ bec 1f
+ br error
+1:
+ sys open; dfile; 0
+ bes error
+ mov r0,dfd
+
+/ main processing loop
+loop:
+ clr nlines
+ jsr pc,getchar
+ cmpb r0,escchar
+ beq command
+ movb r0,savec
+ jsr pc,text
+ br loop
+
+/ command processor
+command:
+ jsr pc,getchar
+ mov r0,-(sp)
+ jsr pc,getchar
+ swab r0
+ bis (sp),r0
+ mov $cmdtab,r1
+1:
+ mov (r1)+,(sp)
+ bic $100000,(sp)
+ cmp r0,(sp)
+ bne 2f
+ mov (r1),(sp)
+ tst -(r1)
+ bpl 3f
+ jsr pc,skipl
+ cmp bptr,$bufend
+ bgt 4f
+ mov reqaddr,@bptr
+ add $2,bptr
+ mov (sp),reqaddr
+ br 4f
+3:
+ jmp @(sp)+
+2:
+ cmp (r1)+,$-1
+ bne 1b
+4:
+ tst (sp)+
+ rts pc
+
+/ command table
+cmdtab:
+ <ad>; adjcmd
+ <bp>; bpcmd
+ <br>; brcmd
+ <cc>; cccmd
+ <ce>; cecmd
+ <ds>; dscmd
+ <fi>; ficmd
+ <in>; incmd
+ <ix>; ixcmd
+ <li>; licmd
+ <ll>; llcmd
+ <ls>; lscmd
+ <na>; nacmd
+ <ne>; necmd
+ <nf>; nfcmd
+ <pa>; pacmd
+ <pl>; plcmd
+ <sk>; skcmd
+ <sp>; spcmd
+ <ss>; sscmd
+ <ta>; tacmd
+ <ti>; ticmd
+ <tr>; trcmd
+ <ul>; ulcmd
+ <un>; uncmd
+ <he>; hecmd
+ <hx>; hxcmd
+ <fo>; focmd
+ <eh>; ehcmd
+ <oh>; ohcmd
+ <ef>; efcmd
+ <of>; ofcmd
+ <m1>; m1cmd
+ <m2>; m2cmd
+ <m3>; m3cmd
+ <m4>; m4cmd
+ <hc>; hccmd
+ <hy>; hycmd
+ <n1>; n1cmd
+ <n2>; n2cmd
+ <nn>; nncmd
+ <ni>; nicmd
+ <jo>; jocmd
+ <ar>; arcmd
+ <ro>; rocmd
+ <nx>; nxcmd
+ <po>; pocmd
+ <de>; decmd
+ <ig>; igcmd
+ <tc>; tccmd
+ <mk>; mkcmd
+ -1; -1
+
+/ various command routines
+
+adjcmd:
+ jsr pc,skipl
+ inc adj
+ rts pc
+
+bpcmd:
+ jsr pc,skipl
+ jsr r5,getnum
+ 0
+ jsr pc,eject
+ rts pc
+
+brcmd:
+ jsr pc,brk
+ rts pc
+
+cccmd:
+ jsr pc,getch
+ jsr pc,getchar
+ cmp r0,$'\n
+ beq 1f
+ movb r0,escchar
+1:
+ rts pc
+
+cecmd:
+ jsr pc,skipl
+ jsr r5,getnum
+ cenline
+ jsr pc,eject
+ mov r0,cenline
+ rts pc
+
+ficmd:
+ jsr pc,skipl
+ inc fill
+ rts pc
+
+incmd:
+ jsr pc,skipl
+ jsr pc,getch
+ jsr pc,getchar
+ cmp r0,$'\n
+ beq 1f
+ mov inset,inset2
+ rts pc
+1:
+ mov r0,savec
+ jsr r5,getnum
+ inset
+ dec r0
+ jsr pc,eject
+ inc r0
+ mov r0,inset
+ mov r0,inset2
+ rts pc
+
+nacmd:
+ jsr pc,skipl
+ clr adj
+ rts pc
+
+nfcmd:
+ jsr pc,skipl
+ clr fill
+ rts pc
+
+llcmd:
+ jsr pc,skipl
+ jsr pc,eject
+ jsr pc,getch
+ tst nlines
+ bne 1f
+ jsr r5,getnum
+ linelen
+ jsr pc,eject
+ mov r0,linelen
+1:
+ rts pc
+
+plcmd:
+ jsr pc,skipl
+ jsr r5,getnum
+ 0
+ jsr pc,eject
+ mov r0,plen
+ mov r0,plen2
+ rts pc
+
+spcmd:
+ jsr r5,getnum
+ 0
+ mov r0,spbef
+ jsr pc,init2
+ rts pc
+
+sscmd:
+ jsr r5,getnum
+ 0
+ mov r0,spaft
+ rts pc
+
+tacmd:
+ mov $tabs,r1
+ jsr r5,getnum
+ 0
+1:
+ jsr pc,eject
+ dec r0
+ ble 2f
+ movb r0,(r1)+
+ br 1b
+2:
+ clrb (r1)+
+ rts pc
+
+ticmd:
+ jsr pc,skipl
+ jsr r5,getnum
+ tind
+ jsr pc,eject
+ mov r0,plen2
+ rts pc
+
+trcmd:
+ jsr r5,getnum
+ 0
+ jsr pc,eject
+ mov r0,trlim
+ rts pc
+
+ulcmd:
+ tst ulflag
+ bne 1f
+ clr ulflag
+ br 2f
+1:
+ inc ulflag
+2:
+ jsr pc,init2
+ rts pc
+
+/ header/footer commands
+
+hecmd:
+ jsr r5,hfset
+ htitle
+ mov htitle,htitle2
+ mov htitle,htitle3
+ rts pc
+
+hxcmd:
+ jsr r5,hfset
+ htitle
+ rts pc
+
+focmd:
+ jsr r5,hfset
+ ftitle
+ rts pc
+
+ehcmd:
+ jsr r5,hfset
+ htitle
+ rts pc
+
+ohcmd:
+ jsr r5,hfset
+ htitle2
+ rts pc
+
+efcmd:
+ jsr r5,hfset
+ ftitle
+ rts pc
+
+ofcmd:
+ jsr r5,hfset
+ ftitle2
+ rts pc
+
+m1cmd:
+ jsr r5,getnum
+ 0
+ mov r0,m1
+ br mend
+m2cmd:
+ jsr r5,getnum
+ 0
+ mov r0,m2
+ br mend
+m3cmd:
+ jsr r5,getnum
+ 0
+ mov r0,m3
+ br mend
+m4cmd:
+ jsr r5,getnum
+ 0
+ mov r0,m4
+mend:
+ jsr pc,init2
+ rts pc
+
+/ margin and number commands
+
+pocmd:
+ jsr pc,getch
+ jsr pc,getchar
+ cmp r0,$'\n
+ beq 1f
+ mov r0,r1
+ jsr pc,getchar
+ cmp r0,$'\n
+ bne 2f
+ mov $' ,r0
+2:
+ movb r0,trtab(r1)
+ br pocmd
+1:
+ rts pc
+
+n1cmd:
+ jsr pc,skipl
+ mov $1,nummode
+ br numset
+
+n2cmd:
+ jsr pc,skipl
+ mov $2,nummode
+numset:
+ clr numcnt
+ jsr r5,getnum
+ 0
+1:
+ tst r0
+ ble 2f
+ mov r0,nummax
+ rts pc
+2:
+ clr nummode
+ rts pc
+
+nncmd:
+ jsr r5,getnum
+ 0
+ mov r0,numcnt
+ rts pc
+
+nicmd:
+ jsr r5,getnum
+ nind
+ jsr pc,eject
+ mov r0,nind
+ rts pc
+
+/ text processing routines
+
+text:
+ clr wrdflag
+ clr nwords
+ clr nchars
+ clr hypflag
+ mov $outbuf,wptr
+ clr -(sp)
+ jsr pc,gchar
+ cmp r0,$'\n
+ beq txtend
+ cmp r0,hypchar
+ bne 1f
+ inc hypflag
+ br 2b
+1:
+ cmp $' ,r0
+ bne 3f
+ jsr pc,putsp
+ br 2b
+3:
+ mov r0,-(sp)
+ mov $' ,r0
+ jsr pc,putsp
+ tst dotflag
+ beq 4f
+ jsr pc,putsp
+ clr dotflag
+4:
+ mov (sp)+,r0
+ jsr pc,putch
+ bisb r0,@lastch
+ clr (sp)
+ jsr pc,gchar
+ cmp r0,hypchar
+ bne 5f
+ inc hypflag
+ jsr pc,gchar
+ mov $200,(sp)
+5:
+ cmp $' ,r0
+ beq 6f
+ cmp $'\n,r0
+ bne 4b
+ cmpb -1(wptr),$'.
+ bne 6f
+ inc dotflag
+6:
+ add $2,2(sp)
+ clrb (wptr)+
+txtend:
+ tst (sp)+
+ mov $outbuf,wptr
+ tst nwords
+ bne 1f
+ jsr pc,1f
+1:
+ rts pc
+
+/ output routines
+
+putch:
+ cmp wptr,$bufend
+ bcc 1f
+ movb r0,@wptr
+ inc wptr
+ jsr pc,charwid
+ add r1,cwid
+ sub r1,remain
+ inc nchars
+1:
+ rts pc
+
+putsp:
+ mov $outbuf,r2
+ clr nspaces
+ clr nwords
+1:
+ movb (r2)+,r0
+ cmp $' ,r0
+ bne 2f
+ jsr pc,space
+ tst nwords
+ bne 1b
+ br 3f
+2:
+ jsr pc,emit
+ dec nchars
+ bgt 1b
+3:
+ jsr pc,newln
+ clr nspaces
+ clr cwid
+ mov linelen,remain
+ mov inset,wptr
+ rts pc
+
+space:
+ inc nspaces
+ tst adj
+ beq 1f
+ inc extrasp
+ cmp extrasp,nspaces
+ blt 2f
+ inc r0
+2:
+ jsr pc,emit
+1:
+ rts pc
+
+emit:
+ movb r0,@optr
+ inc optr
+ cmp optr,$obufend
+ blo 1f
+ mov outfd,r0
+ sys write; obuf; 512.
+ mov $obuf,optr
+1:
+ rts pc
+
+newln:
+ mov $'\n,r0
+ jsr pc,emit
+ inc lineno
+ rts pc
+
+brk:
+ tst splen
+ beq 1f
+ clrb @optr
+ inc pageno
+1:
+ jsr pc,flush2
+ rts pc
+
+eject:
+ tst splen
+ beq 1f
+ sub lineno,r0
+ neg r0
+ jsr pc,eject2
+ mov r0,plen2
+ tst nummode
+ beq 1f
+ add $2,plen2
+1:
+ clr extrasp
+ clr wrdspc
+ mov $1000,nspaces
+ mov $' ,r0
+ jsr pc,putch
+ jsr pc,skipl
+ dec trlim
+ bpl 2f
+ clr trlim
+2:
+ rts pc
+
+/ number output routines
+
+prnum:
+ mov r0,mq
+1:
+ clr ac
+ mov $10.,div
+ mov ac,-(sp)
+ tst mq
+ beq 2f
+ jsr pc,1b
+2:
+ mov (sp)+,mq
+ add $'0,mq
+ mov outfd,r0
+ sys write; mq; 1
+ rts pc
+
+/ character width table
+charwid:
+ cmp r0,hypchar
+ beq 2f
+ tst r0
+ beq 2f
+ cmp r0,$177
+ beq 2f
+ cmp r0,$'\b
+ bne 1f
+ mov $-1,r1
+ rts pc
+1:
+ cmp $' ,r0
+ bgt 2f
+ mov $1,r1
+ rts pc
+2:
+ clr r1
+ rts pc
+
+/ get character, handling escapes
+getchar:
+ mov savec,r0
+ beq 1f
+ clr savec
+ rts pc
+1:
+ tst nlines
+ bne 2f
+ mov $'\n,r0
+ rts pc
+2:
+ jsr pc,getch
+ cmp r0,$'\\
+ bne 3f
+ jsr pc,getch
+ jsr r5,escmap
+ esctab
+ br 4f
+3:
+ cmp r0,$'\e
+ bne 4f
+ jsr pc,getch
+ jsr r5,escmap
+ esctab2
+4:
+ cmp r0,$'\n
+ bne 5f
+ inc nlines
+ clr colno
+5:
+ mov r1,-(sp)
+ jsr pc,charwid
+ add r1,colno
+ mov (sp)+,r1
+ rts pc
+
+/ escape character mapping
+escmap:
+ mov r1,-(sp)
+ mov (r5)+,r1
+1:
+ cmpb (r1)+,r0
+ beq 2f
+ tstb (r1)+
+ bne 1b
+ cmp r1,$esctab2
+ ble 3f
+ cmp r1,$esctab2e
+ bgt 3f
+ mov $37,r0
+3:
+ mov (sp)+,r1
+ rts r5
+2:
+ movb (r1)+,r0
+ mov (sp)+,r1
+ rts r5
+
+/ escape tables
+esctab:
+ <-\210\0n\012\0t\011\0\\\\134\0>\0\0>
+ .even
+esctab2:
+ <0\260\0-\304\0'\222\0`\223\0>\0\0>
+ .even
+esctab2e:
+
+/ getch from buffer or file
+getch:
+ tst bcount
+ ble 1f
+ dec bcount
+ mov inptr,r0
+ rts pc
+1:
+ mov r1,-(sp)
+ tst reqaddr
+ bne 2f
+ jsr pc,readblk
+ br 3f
+2:
+ tst fildes
+ bne 4f
+ mov fptr,r1
+ cmp r1,fend
+ bne 5f
+4:
+ mov fname,r0
+ bne 6f
+ jsr pc,open1
+6:
+ clr fildes
+ sys read; inbuf; 512.
+ bes done
+ tst r0
+ beq done
+ mov $inbuf,r1
+ add r0,r1
+ mov r1,fend
+5:
+ movb (r1)+,r0
+ mov r1,fptr
+ cmp r0,$'\t
+ bne 3f
+ mov (sp)+,r1
+ mov $tabs,r0
+ inc bcount
+ tstb (r0)
+ beq getch
+ cmpb colno,(r0)+
+ bge 8f
+ movb -(r0),bcount
+ sub colno,bcount
+ br getch
+8:
+ br 3f+2
+3:
+ br 7f
+7:
+ tst r0
+ beq 2b
+ mov (sp)+,r1
+ rts pc
+
+/ open file for input
+open1:
+ mov fname,r0
+ bne 1f
+ sys close
+1:
+ tst fildes
+ beq 2f
+ mov $defout,1f
+ br 3f
+2:
+ dec nfiles
+ blt done
+ mov @fnames,1f
+ add $2,fnames
+3:
+ sys open; 1:..; 0
+ bes error
+ mov r0,fname
+ rts pc
+
+/ flush output buffer
+flush:
+ inc nameloc
+ tst outfd
+ beq 1f
+ movb r0,(r4)+
+ cmp r4,$buf+512.
+ blo 1f
+ mov outfd,r0
+ sys write; buf; 512.
+ mov $buf,r4
+1:
+ rts pc
+
+flush2:
+ mov optr,r0
+ sub $obuf,r0
+ mov r0,0f
+ mov $1,r0
+ sys write; obuf; 0:..
+ mov $obuf,optr
+ rts pc
+
+/ initialization
+init:
+ mov $obuf,optr
+ jsr pc,init2
+ sys exit
+
+init2:
+ mov splen,r0
+ bne 1f
+ clr plen2
+ rts pc
+1:
+ sub m3,r0
+ sub m4,r0
+ sub ulflag,r0
+ mov r0,plen2
+ mov linelen,r0
+ add m1,r0
+ add m2,r0
+ add ulflag,r0
+ cmp r0,plen2
+ blt 2f
+ mov $2,r0
+ mov r0,m1
+ mov r0,m2
+ mov r0,m3
+ mov r0,m4
+ mov $102.,splen
+ br init2
+2:
+ cmp lineno,plen2
+ ble 3f
+ mov plen2,lineno
+3:
+ rts pc
+
+/ get a number argument
+getnum:
+ jsr pc,getch
+ mov r1,-(sp)
+ clr mq
+ clr -(sp)
+ clr -(sp)
+ jsr pc,getchar
+ cmp r0,$'+
+ beq 1f
+ cmp r0,$'-
+ beq 1f
+ sub $'0,r0
+ cmp r0,$9.
+ bhi 2f
+ inc (sp)
+ mov $10.,mul
+ add r0,mq
+ br getnum+4
+1:
+ mov r0,2(sp)
+ br getnum+4
+2:
+ add $'0,r0
+ mov r0,savec
+ mov (sp)+,r0
+ bne 3f
+ mov $1,mq
+ mov mq,r0
+3:
+ mov (r5)+,r0
+ beq 4f
+ mov (r0),r0
+4:
+ mov (sp)+,r1
+ cmp r1,$'-
+ bne 5f
+ sub mq,r0
+ br 6f
+5:
+ cmp r1,$'+
+ bne 7f
+ add mq,r0
+ br 6f
+7:
+ mov mq,r0
+6:
+ mov (sp)+,r1
+ rts r5
+
+/ header/footer setup
+hfset:
+ jsr pc,getch
+ mov r1,-(sp)
+ mov (r5)+,r1
+ mov r1,@(r5)+
+ jsr pc,gchar
+ cmp r0,$'\n
+ beq 3f
+ mov r0,r2
+ jsr pc,gchar
+ cmp r0,$'\n
+ beq 3f
+ cmp r0,r2
+ bne 2f
+ clr r0
+2:
+ jsr pc,wrchar
+ br 1b
+3:
+ clr r0
+ jsr pc,wrchar
+ mov r1,hfptr
+ mov linelen,hflen
+ rts r5
+
+wrchar:
+ mov r0,char
+ mov 1f,r0
+ mov reqaddr,r1
+ sys seek; 0:..; 0
+ mov reqaddr,r0
+ sys write; char; 1
+ inc r1
+ cmp reqaddr,reqmax
+ bne 1f
+ mov $-1,reqmax
+1:
+ rts pc
+
+/ skip to end of line
+skipl:
+ jsr pc,getchar
+ cmp r0,$'\n
+ bne skipl
+ rts pc
+
+/ hyphenation support
+hyphen:
+ tst hypflag
+ bne 1f
+ tst hyflag
+ beq 1f
+ inc hypflag
+ mov wptr,r0
+ clr nwords
+1:
+ rts pc
+
+/ data area
+defout: </dev/tty0\0>
+ .even
+suftab: </etc/suftab\0>
+ .even
+tmpfil: </tmp/rtma\0>
+ .even
+
+reqmax: -1; 4
+reqaddr: 0
+fptr: 0
+fend: 0
+fildes: 0
+fname: 0
+outfd: 0
+tmpfd: 0
+dfd: 0
+optr: 0
+wptr: 0
+bptr: 0
+bufend: 0
+obufend: 0
+inptr: 0
+bcount: 0
+nfiles: 0
+fnames: 0
+nameloc: 0
+
+/ formatting parameters
+escchar: '.
+hypchar: '-
+fill: 1
+adj: 0
+nlines: 0
+colno: 0
+savec: 0
+char: 0
+
+linelen: 65.
+inset: 0
+inset2: 0
+tind: 0
+plen: 66.
+plen2: 66.
+splen: 0
+spbef: 0
+spaft: 0
+trlim: 0
+cenline: 0
+ulflag: 0
+hypflag: 0
+dotflag: 0
+wrdflag: 0
+
+lineno: 0
+pageno: 0
+nspaces: 0
+extrasp: 0
+nchars: 0
+nwords: 0
+cwid: 0
+remain: 65.
+wrdspc: 0
+lastch: 0
+
+/ margin parameters
+m1: 2
+m2: 2
+m3: 2
+m4: 2
+
+/ numbering parameters
+nummode: 0
+numcnt: 0
+nummax: 0
+nind: 5
+
+/ title storage
+htitle: 0
+htitle2: 0
+htitle3: 0
+ftitle: 0
+ftitle2: 0
+hfptr: 0
+hflen: 0
+
+/ character translation table
+trtab: .=.+256.
+
+/ tab settings
+tabs: .=.+32.
+
+/ buffers
+obuf: .=.+512.
+inbuf: .=.+512.
+outbuf: .=.+512.
+buf: .=.+512.
+
+errmsg: <err?\n>
diff --git a/cmd/size.s b/cmd/size.s
new file mode 100644
index 0000000..7e6897e
--- /dev/null
+++ b/cmd/size.s
@@ -0,0 +1,762 @@
+/ size -- print section sizes (B language program)
+
+ br start
+ blt regs
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+
+/ threaded interpreter startup
+start:
+ mov $mq,r3
+ mov sp,r0
+ mov (sp),-(sp)
+ tst (r0)+
+ mov r0,2(sp)
+ mov 60.,-(sp)
+ mov $tbl,r5
+ jmp @(r5)+
+
+/ tables and data
+tbl:
+ bic (r5)+,r0
+ 0
+lbl1:
+ bic r0,@(sp)+
+ sys exit
+lbl2:
+ bic r0,-(r2)
+ bic (r5)+,@-(r0)
+ 18.
+ bic (r5)+,-(r0)
+ 26.
+ bic (r3)+,-8.(r0)
+ bic (r3)+,@-(r0)
+ 4
+ bic (r7),(sp)+
+ bic (r3)+,@-(r0)
+ -24.
+ bic (r4)+,r4
+ 1
+ bic (r7),@outbf(r0)
+ bic r1,@(r0)+
+ bic (r3)+,@-(r0)
+ 6
+ bic (r4)+,r4
+ bic r6,(r2)
+ bic (r7),(sp)+
+ bic (r3)+,-24.(r0)
+ bic (r2)+,(r4)+
+ bic (r3)+,6(r0)
+ bic (r2)+,@outbf(sp)
+ -24.
+ bic (r2)+,@-(r0)
+ bic (r5)+,outbf+4(sp)
+ bic (r3)+,6(r0)
+ bic (r2)+,-(r2)
+ bic (r3)+,-22.(r0)
+ bic (r4)+,r4
+ 0
+ bic (r3)+,@-(r0)
+ 6
+ bic (r1)+,outbf(r4)
+ bic (r5),-(r4)
+ bic (r4)+,@-(r0)
+ 4
+ bic (r7),@(r2)+
+ bic (r4)+,r4
+ 0
+ bic (r0)+,(r0)+
+ bic (r5)+,outbf+2(sp)
+ bic (r3)+,@-(r0)
+ 6
+ bic (r1)+,outbf+4(r4)
+ bic (r4)+,r4
+ bic r6,(r0)+
+ bic (r4)+,r0
+ bic (r0),(r2)+
+ bic (r5)+,r0
+ 4
+ bic (r4)+,r0
+ bic r6,@(sp)+
+ bic (r5)+,@(r4)+
+ bic (r4)+,r4
+ 16.
+ bic (r3)+,@-(r0)
+ -20.
+ bic (r3)+,@-(r0)
+ -22.
+ bic (r4)+,r0
+ bic (sp),4(r4)
+ bic (r5)+,r0
+ 6
+ bic (r3)+,@-(r0)
+ -20.
+ bic (r4)+,r4
+ 0
+ bic (r4)+,(sp)
+ bic (r4)+,r4
+ br 1f
+
+1:
+ bic (r0)+,r0
+ bic (r5)+,outbf+6(sp)
+ bic (r3)+,@-(r0)
+ 6
+ bic (r1)+,outbf+4(r4)
+ bic (r4)+,r4
+ bic r6,-(r0)
+ bic (r4)+,r0
+ bic (r0),(r2)+
+ bic (r5)+,r0
+ 4
+ bic (r3)+,@-(r0)
+ -22.
+ bic (r4)+,r0
+ bic (r5),(r2)+
+ bic (r5)+,r0
+ 2
+ bic (r4)+,r0
+ bic r6,@(sp)+
+ bic (r5)+,@(r4)+
+ bic (r3)+,@-(r0)
+ 4
+ bic (r4)+,r4
+ 2
+ bic (r0)+,-(r0)
+ bic (r5)+,outbf+16.(sp)
+ bic (r3)+,@-(r0)
+ 6
+ bic (r1)+,outbf+4(r4)
+ bic (r4)+,r4
+ bic r6,outbf(r0)
+ bic (r4)+,r0
+ bic (r0),(r2)+
+ bic (r5)+,r0
+ 4
+ bic (r3)+,@-(r0)
+ -20.
+ bic (r4)+,r4
+ 3
+ bic (r4)+,(sp)
+ bic (r3)+,@-(r0)
+ -20.
+ bic (r4)+,r4
+ 2
+ bic (r4)+,(sp)
+ bic (r3)+,@-(r0)
+ -20.
+ bic (r4)+,r4
+ 1
+ bic (r4)+,(sp)
+ bic (r4)+,r4
+ bic r6,outbf(sp)
+ bic (r4)+,r0
+ bic (r0),(r2)+
+ bic (r5)+,r0
+ 8.
+ bic (r3)+,-26.(r0)
+ bic (r3)+,@-(r0)
+ -20.
+ bic (r4)+,r4
+ 1
+ bic (r4)+,(sp)
+ bic (r3)+,@-(r0)
+ -20.
+ bic (r4)+,r4
+ 2
+ bic (r4)+,(sp)
+ bic (r1)+,r6
+ bic (r3)+,@-(r0)
+ -20.
+ bic (r4)+,r4
+ 3
+ bic (r4)+,(sp)
+ bic (r1)+,r6
+ bic (r7),(sp)+
+ bic (r3)+,-26.(r0)
+ bic (r4)+,r4
+ bic r7,r4
+ bic (r4)+,r0
+ bic (r0),(r2)+
+ bic (r5)+,r0
+ 4
+ bic (r3)+,@-(r0)
+ -22.
+ bic (r4)+,r0
+ bic (r5),(r0)+
+ bic (r5)+,r0
+ 2
+ bic (r4)+,r0
+ bic (r5),(r0)+
+ bic (r5)+,@(r4)+
+ bic (r3)+,-4(r0)
+ bic (r3)+,@-(r0)
+ -8.(r0)
+ bic (r7),(sp)+
+ bic (r3)+,-10.(r0)
+ bic (r3)+,-4(r0)
+ bic (r3)+,r4
+ bic (r1)+,@hession(r0)
+ bic (sp)+,r0
+ bic (r4),@(r0)+
+ bic (r3)+,@-(r0)
+ -8.(r0)
+ bic (r4)+,r4
+ 0
+ bic (r0)+,(r0)+
+ bic (r5)+,hession+4(sp)
+ bic (r3)+,@-(r0)
+ -8.(r0)
+ bic (r3)+,@-(r0)
+ -8.(r0)
+ bic (r1)+,pD(r0)
+ bic (r7),(sp)+
+ bic (r4)+,r4
+ '-
+ bic (r4)+,r0
+ bic (sp),r2
+ bic (r5)+,r0
+ 2
+ bic (r3)+,@-(r0)
+ -10.(r0)
+ bic (r4)+,r4
+ 'o
+ bic (r7),@outbf(r0)
+ bic (r2),@hession+2(r2)
+ bic (r4)+,r4
+ 8.
+ bic (r5)+,hession+6(r2)
+ bic (r4)+,r4
+ 10.
+ bic (r3)+,@-(r0)
+ -8.(r0)
+ bic (r4)+,r0
+ bic r7,(r2)
+ bic (r5)+,r0
+ 4
+ bic (r4)+,r0
+ bic (r5),(r0)+
+ bic (r5)+,@(r4)+
+ bic (r3)+,@-(r0)
+ -8.(r0)
+ bic (r4)+,r0
+ bic (sp),r2
+ bic (r5)+,r0
+ 2
+ bic (r4)+,r0
+ bic (r5),(r0)+
+ bic (r5)+,@(r4)+
+ bic (r3)+,-4(r0)
+ bic (r3)+,@-(r0)
+ -8.(r0)
+ bic (r7),(sp)+
+ bic (r3)+,-10.(r0)
+ bic (r3)+,-4(r0)
+ bic (r3)+,r4
+ bic (r1)+,@hession(r0)
+ bic (r5)+,hession+16.(sp)
+ bic (r3)+,@-(r0)
+ -10.(r0)
+ bic (r4)+,r0
+ bic (sp),r2
+ bic (r5)+,r0
+ 2
+ bic (r5)+,hession+12.(r2)
+ bic (r4)+,r0
+ bic (r5),(r0)+
+ bic (r5)+,@(r4)+
+ bic (r5)+,outbf+2(r2)
+
+ jmp -(r4)
+ bic (r1),@'o(sp)
+ bic (r1),@'c(sp)
+ bic (r3),(r0)+
+ jmp outbf+2(r3)
+ 0
+ 0
+ bic (r4)+,r4
+ '%
+ bic (r4)+,r0
+ bic (sp),r2
+ bic (r5)+,r0
+ 2
+ bic (r3)+,4(r0)
+ bic (r2)+,outbf(r0)
+ -6.(r2)
+ bic (r2)+,@outbf(sp)
+ bic (r4)+,r0
+ bic (r5),(r0)+
+ bic (r5)+,@(r4)+
+ bic (r5)+,-(r0)
+ 2
+ bic (r5)+,@(r0)+
+
+/ error strings
+aoutmsg: <a.out\0>
+ .even
+notfnd: <%s not found\n\0>
+ .even
+badfmt: <Bad format: %s\n\0>
+ .even
+sfmt: <%s: \0>
+ .even
+ofmt: <%0o+%0o+%0o=\0>
+ .even
+ofmt2: <%0o\n\0>
+ .even
+
+/ threaded interpreter primitives
+tstart:
+ bic r7,(r4)
+ bic (r5)+,-(r0)
+ 4
+ bic (r3)+,-4(r0)
+ bic (r3)+,@-(r0)
+ 4
+ bic (r3)+,@-(r0)
+ 6
+ bic (r1)+,-(r4)
+ bic (r7),@(r2)+
+ bic (r5)+,outbf+14.(sp)
+ bic (r3)+,@-(r0)
+ 6
+ bic (r3)+,@-(r0)
+ -4(r0)
+ bic (r4)+,r0
+ bic r7,(r2)
+ bic (r5)+,r0
+ 4
+ bic (r3)+,@-(r0)
+ 4
+ bic (r3)+,@-(r0)
+ 6
+ bic (r1)+,(sp)
+ bic (r4)+,r4
+ '0
+ bic (r1)+,r6
+ bic (r4)+,r0
+ bic (sp),r2
+ bic (r5)+,r0
+ 2
+ bic (r5)+,-(r0)
+ 2
+ bic (r5)+,@(r0)+
+ bic (r5)+,-(r0)
+ 10.
+ bic (r3)+,-6.(r0)
+ bic (r3)+,6(r0)
+ bic (r7),(sp)+
+ bic (r5)+,-(r0)
+ 10.
+ bic (r3)+,-10.(r0)
+ bic (r3)+,4(r0)
+ bic (r3)+,r4
+ bic (r1)+,@hession(r0)
+ bic (sp)+,hession+16.(sp)
+ bic (r3)+,@-(r0)
+ -10.(r0)
+ bic (r4)+,r0
+ bic (sp),r2
+ bic (r5)+,r0
+ 2
+ bic (r5)+,outbf+2(r2)
+ bic (r5)+,-(r0)
+ 2
+ bic (r5)+,@(r0)+
+ bic (r5)+,-(r2)
+
+/ sys call wrappers
+sdiv:
+ mov 4(r4),r0
+ clr r1
+ sys 0; 6 / div
+ adc r1
+ mov r1,r0
+ rts pc
+
+sopen:
+ bic (r5),-(sp)
+ bic (r5),@-(r0)
+ mov 4(r4),0f
+ mov 6(r4),0f+2
+ sys open; 0:.=.+2; 0:.=.+2
+ bec 1f
+ mov $-1,r0
+1:
+ rts pc
+
+sclose:
+ bic (sp),r4
+ bic (sp),sp
+ mov 4(r4),0f
+ mov 0f+2,r0
+ tstb 0f+1
+ beq 1f
+ sys write; 0:.=.+2; 2
+ br 2f
+1:
+ sys write; 0:.=.+2; 1
+2:
+ mov 0f,r0
+ rts pc
+
+funct1:
+ bic (sp),@-(r4)
+ bic (sp),@-(sp)
+ rts pc
+
+funct2:
+ 0
+ 1
+
+sread:
+ bic (sp),-(sp)
+ bic (sp),-(r0)
+ mov 4(r4),r0
+ mov 6(r4),0f
+ mov 8.(r4),0f+2
+ sys read; 0:.=.+2; 0:.=.+2
+ bec 1f
+ mov $-1,r0
+1:
+ rts pc
+
+/ interpreter dispatch
+disp:
+ mov @(sp)+,@(sp)+
+ jmp @(r5)+
+
+disp2:
+ mov (sp)+,r0
+ mov r0,@(sp)+
+ mov r0,-(sp)
+ jmp @(r5)+
+
+disp3:
+ movb (sp)+,@(sp)+
+ jmp @(r5)+
+
+disp4:
+ mov (sp)+,r0
+ movb r0,@(sp)+
+ mov r0,-(sp)
+ jmp @(r5)+
+
+disp5:
+ bis (sp)+,(sp)
+ jmp @(r5)+
+
+disp6:
+ com (sp)
+ bic (sp)+,(sp)
+ jmp @(r5)+
+
+/ comparison primitives
+cmpne:
+ cmp (sp)+,(sp)+
+ beq 1f
+ clr -(sp)
+ jmp @(r5)+
+
+cmpeq:
+ cmp (sp)+,(sp)+
+ bne 1f
+ clr -(sp)
+ jmp @(r5)+
+
+cmpge:
+ cmp (sp)+,(sp)+
+ bge 1f
+ clr -(sp)
+ jmp @(r5)+
+
+cmpgt:
+ cmp (sp)+,(sp)+
+ bgt 1f
+ clr -(sp)
+ jmp @(r5)+
+
+cmple:
+ cmp (sp)+,(sp)+
+ ble 1f
+ clr -(sp)
+ jmp @(r5)+
+
+cmplt:
+ cmp (sp)+,(sp)+
+ blt 1f
+ clr -(sp)
+ jmp @(r5)+
+
+1:
+ mov $1,-(sp)
+ jmp @(r5)+
+
+/ memory operations
+memop1:
+ mov 2(sp),-(r3)
+ sub (sp)+,hession+4
+ mov (r3)+,(sp)
+ jmp @(r5)+
+
+memop2:
+ mov 2(sp),(r3)
+ mov (sp)+,hession+4
+ mov (r3),(sp)
+ jmp @(r5)+
+
+/ arithmetic
+add:
+ add (sp)+,(sp)
+ jmp @(r5)+
+
+sub:
+ sub (sp)+,(sp)
+ jmp @(r5)+
+
+mul:
+ mov 2(sp),(r3)
+ mov (sp)+,hession
+ mov hession+2,(sp)
+ jmp @(r5)+
+
+swap:
+ mov (sp)+,(r3)+
+ mov (sp)+,(r3)
+ mov -(r3),-(sp)
+ jmp @(r5)+
+
+div:
+ mov 2(sp),(r3)
+ mov (sp)+,hession
+ mov (r3),(sp)
+ jmp @(r5)+
+
+neg:
+ neg (sp)
+ jmp @(r5)+
+
+/ indirection
+indir:
+ mov @(sp)+,-(sp)
+ jmp @(r5)+
+
+indirb:
+ movb @(sp)+,r0
+ mov r0,-(sp)
+ jmp @(r5)+
+
+/ logical not
+not:
+ tst (sp)+
+ bne 1f
+ mov $1,-(sp)
+ jmp @(r5)+
+1:
+ clr -(sp)
+ jmp @(r5)+
+
+/ increment/decrement
+preinc:
+ inc @0(sp)
+ mov @(sp)+,-(sp)
+ jmp @(r5)+
+
+postinc:
+ inc @(sp)+
+ jmp @(r5)+
+
+preinc2:
+ add $2,@0(sp)
+ mov @(sp)+,-(sp)
+ jmp @(r5)+
+
+postinc2:
+ add $2,@(sp)+
+ jmp @(r5)+
+
+predec:
+ dec @0(sp)
+ mov @(sp)+,-(sp)
+ jmp @(r5)+
+
+postdec:
+ dec @(sp)+
+ jmp @(r5)+
+
+predec2:
+ sub $2,@0(sp)
+ mov @(sp)+,-(sp)
+ jmp @(r5)+
+
+postdec2:
+ sub $2,@(sp)+
+ jmp @(r5)+
+
+/ post operations
+postop1:
+ mov (sp)+,r0
+ mov (r0),-(sp)
+ inc (r0)
+ jmp @(r5)+
+
+postop2:
+ mov (sp)+,r0
+ mov (r0),-(sp)
+ add $2,(r0)
+ jmp @(r5)+
+
+postop3:
+ mov (sp)+,r0
+ mov (r0),-(sp)
+ dec (r0)
+ jmp @(r5)+
+
+postop4:
+ mov (sp)+,r0
+ mov (r0),-(sp)
+ sub $2,(r0)
+ jmp @(r5)+
+
+/ frame operations
+frame1:
+ mov (r5)+,r0
+ add r4,r0
+ mov (r0),-(sp)
+ jmp @(r5)+
+
+frame2:
+ mov (r5)+,-(sp)
+ add r4,(sp)
+ jmp @(r5)+
+
+frame3:
+ mov (r5)+,r0
+ add r4,r0
+ movb (r0),r0
+ mov r0,-(sp)
+ jmp @(r5)+
+
+/ constants
+const1:
+ mov @(r5)+,-(sp)
+ jmp @(r5)+
+
+const2:
+ mov (r5)+,-(sp)
+ jmp @(r5)+
+
+const3:
+ movb @(r5)+,r0
+ mov r0,-(sp)
+ jmp @(r5)+
+
+/ array operations
+arr1:
+ asl (sp)
+ add (sp)+,(sp)
+ mov @(sp)+,-(sp)
+ jmp @(r5)+
+
+arr2:
+ add (sp)+,(sp)
+ movb @(sp)+,r0
+ mov r0,-(sp)
+ jmp @(r5)+
+
+arr3:
+ asl (sp)
+ add (sp)+,(sp)
+ jmp @(r5)+
+
+shiftl:
+ asl (sp)
+ jmp @(r5)+
+
+/ function call
+fcall:
+ mov (sp)+,r0
+ mov r5,-(sp)
+ mov r4,-(sp)
+ mov sp,r4
+ mov r0,r5
+ jsr pc,@(r5)+
+ mov r4,sp
+ mov (sp)+,r4
+ mov (sp)+,r5
+ add (r5)+,sp
+ mov r0,-(sp)
+ jmp @(r5)+
+
+fcall2:
+ mov (sp)+,r0
+ mov r5,-(sp)
+ mov r4,-(sp)
+ mov sp,r4
+ mov r0,r5
+ jsr pc,@(r5)+
+ mov r4,sp
+ mov (sp)+,r4
+ mov (sp)+,r5
+ add (r5)+,sp
+ jmp @(r5)+
+
+/ control flow
+jind:
+ mov (sp),r0
+ jmp @-2(r4)
+
+ret:
+ mov (sp)+,r5
+ jmp @(r5)+
+
+setsp:
+ mov r4,r0
+ sub (r5)+,r0
+ mov r0,sp
+ jmp @(r5)+
+
+setsp2:
+ mov r4,r0
+ sub (r5)+,r0
+ mov r0,sp
+ mov r0,-(sp)
+ jmp @(r5)+
+
+jmp1:
+ mov (r5)+,r5
+ jmp @(r5)+
+
+beq1:
+ mov (r5)+,r0
+ tst (sp)+
+ bne 1f
+ mov r0,r5
+1:
+ jmp @(r5)+
+
+switch:
+ mov (r5)+,r5
+ mov (sp)+,r0
+ cmp r0,(r5)+
+ beq 2f
+ tst (r5)+
+ bne switch+4
+ jmp @(r5)+
+2:
+ mov (r5)+,r0
+ beq 1f
+ mov r0,r5
+1:
+ jmp @(r5)+
+
+/ data
+.bss
+regs: .=.+12.
+hession: .=.+12.
+outbf: .=.+520.
+mq = 177304
diff --git a/cmd/sort.s b/cmd/sort.s
new file mode 100644
index 0000000..39473b6
--- /dev/null
+++ b/cmd/sort.s
@@ -0,0 +1,265 @@
+/ sort -- sort lines
+
+ cmp (sp)+,$3
+ beq 1f
+ sys exit
+1:
+ tst (sp)+
+ mov (sp)+,0f
+ sys open; 0:..; 0
+ bec 1f
+ sys exit
+1:
+ mov r0,fin
+ mov (sp)+,r0
+ jsr r5,fcreat; obuf
+ bec 1f
+ sys exit
+1:
+ jsr pc,sort
+ jsr pc,output
+ sys exit
+
+output:
+ mov r1,-(sp)
+ cmp r1,r2
+ bhi 1f
+ mov (r1)+,r5
+ jsr pc,getc1
+ mov r0,-(sp)
+ jsr r5,putc; obuf
+ mov (sp)+,r0
+ cmp r0,$'\n
+ beq output
+ cmp r0,$4
+ beq output
+ br 2b
+1:
+ jsr r5,flush; obuf
+ mov (sp)+,r1
+ rts pc
+
+getc1:
+ mov r5,r0
+ bic $777,r0
+ cmp r0,blkno
+ beq 1f
+ mov r0,blkno
+ mov fin,r0
+ sys seek; -1; 0
+ mov fin,r0
+ sys read; inbuf; 512.
+ mov r0,nleft
+1:
+ mov r5,r0
+ bic $177000,r0
+ inc r5
+ cmp r0,nleft
+ blt 1f
+ mov $4,r0
+ rts pc
+1:
+ movb inbuf(r0),r0
+ rts pc
+
+compare:
+ mov r5,-(sp)
+ mov r4,-(sp)
+ mov r0,-(sp)
+ mov $line,r4
+ cmpb (r4),$'(
+ bne 1f
+ inc r4
+1:
+ cmpb 3720.(r5),$'(
+ beq 2f
+ cmpb 3720.(r5),(r4)+
+ blt less
+ bgt more
+2:
+ cmpb 3721.(r5),(r4)+
+ blt less
+ bgt more
+ mov (r5),r5
+ add $2,r5
+ jsr pc,getc1
+ cmpb r0,$'A
+ blo 3f
+ cmpb r0,$'Z
+ bhi 3f
+ add $40,r0
+3:
+ cmpb r0,(r4)+
+ beq 1b
+ blt less
+more:
+ mov (sp)+,r0
+ mov (sp)+,r4
+ mov (sp)+,r5
+ tst $-1
+ rts pc
+
+less:
+ mov (sp)+,r0
+ mov (sp)+,r4
+ mov (sp)+,r5
+ tst $1
+ rts pc
+
+sort:
+ mov $lines,r1
+ mov r1,r2
+ jsr r5,getline
+ rts pc
+
+insert:
+ mov lineptr,(r1)
+ mov lineptr+2,3720.(r1)
+ jsr r5,getline
+ rts pc
+
+bsearch:
+ mov r1,r3
+ mov r2,r4
+1:
+ mov r3,r5
+ add r4,r5
+ ror r5
+ bic $1,r5
+ jsr pc,compare
+ beq found
+ blt 2f
+ cmp r5,r4
+ bcc found
+ tst (r5)+
+ mov r5,r3
+ br 1b
+2:
+ cmp r3,r4
+ bcc found
+ mov r5,r4
+ br 1b
+found:
+ tst (r5)+
+ tst (r2)+
+ cmp r2,r5
+ beq 2f
+ mov r2,r3
+1:
+ mov -(r3),2(r3)
+ mov 3720.(r3),3722.(r3)
+ cmp r3,r5
+ bhi 1b
+2:
+ mov lineptr,(r5)
+ mov lineptr+2,3720.(r5)
+ br bsearch-4
+
+getline:
+ mov r5,-(sp)
+ cmp r2,$lines+2000.
+ bcc 1f
+ mov loc,r5
+ mov $line,r3
+ mov r5,lineptr
+ jsr pc,getc1
+ cmp r0,$4
+ bne 2f
+1:
+ mov (sp)+,r5
+ rts r5
+2:
+ cmp r0,$'\n
+ beq 3f
+ cmp r3,$line+199.
+ bcc 1b
+ cmpb r0,$'A
+ blo 4f
+ cmpb r0,$'Z
+ bhi 4f
+ add $40,r0
+4:
+ movb r0,(r3)+
+ br 1b
+3:
+ clrb (r3)+
+ mov r5,loc
+ mov (sp)+,r5
+ tst (r5)+
+ rts r5
+
+fcreat:
+ mov r1,-(sp)
+ mov (r5)+,r1
+ mov r0,0f
+ sys creat; 0:..; 17
+ bec 1f
+ mov r0,(r1)+
+ clr (r1)+
+ clr (r1)+
+ mov (sp)+,r1
+ rts r5
+1:
+ mov $-1,(r1)+
+ br 3b
+
+getword:
+ mov (r5),0f
+ mov (r5)+,0f+2
+ mov r0,-(sp)
+ jsr r5,getc; 0:..
+ mov (sp)+,r0
+ swab r0
+ jsr r5,getc; 0:..
+ rts r5
+
+putc:
+ mov r1,-(sp)
+ mov (r5)+,r1
+ dec 2(r1)
+ bge 1f
+ mov r0,-(sp)
+ jsr pc,flush1
+ mov (sp)+,r0
+1:
+ movb r0,@4(r1)
+ inc 4(r1)
+ mov (sp)+,r1
+ rts r5
+
+flush:
+ mov r0,-(sp)
+ mov r1,-(sp)
+ mov (r5)+,r1
+ jsr pc,flush1
+ mov (sp)+,r1
+ mov (sp)+,r0
+ rts r5
+
+flush1:
+ mov r1,r0
+ add $6,r0
+ mov r0,-(sp)
+ mov r0,0f
+ neg r0
+ add 4(r1),r0
+ ble 1f
+ mov r0,0f+2
+ mov (r1),r0
+ sys write; 0:..; 0:..
+1:
+ mov (sp)+,4(r1)
+ mov $127.,2(r1)
+ rts pc
+
+fin: .=.+2
+blkno: -1
+nleft: .=.+2
+loc: inbuf
+lineptr: .=.+4
+line: .=.+200.
+ .even
+lines: .=.+2000.
+ .=.+3722.
+inbuf: .=.+512.
+obuf: .=.+134.
diff --git a/cmd/stat.s b/cmd/stat.s
new file mode 100644
index 0000000..ae10229
--- /dev/null
+++ b/cmd/stat.s
@@ -0,0 +1,298 @@
+/ stat -- print file status
+
+ mov sp,r5
+ sys open; 1:..; 0
+ bec 1f
+ sys read; stbuf; 512.
+ add r0,uids
+1:
+ mov (r5)+,r0
+ mov r0,argc
+ mov r0,argv
+ cmp r0,$2
+ beq 1f
+ jsr r3,mesg; <argc\0>
+1:
+ tst (r5)+
+ cmp argc,$2
+ bge 1f
+ sys exit
+1:
+ dec argc
+ mov (r5)+,0f
+ sys stat; 0:..; stbuf
+ bec 1f
+ mov 0b,0f
+ jsr r3,mesg; 0:..
+ jsr r3,mesg; <?\n\0>
+ br 1b
+1:
+ mov $stbuf,r4
+ mov (r4)+,r2
+ jsr r3,prdec; 3
+ jsr r3,mesg; < inode mode nl uid size t.mod.\n\0>
+ bit $10000,(r4)
+ beq 2f
+ jsr r3,putc; <l\0>
+ br 3f
+2:
+ jsr r3,putc; <s\0>
+3:
+ bit $40000,(r4)
+ beq 4f
+ jsr r3,putc; <d\0>
+ br 5f
+4:
+ jsr r3,putc; <-\0>
+5:
+ bit $40,(r4)
+ beq 6f
+ jsr r3,putc; <u\0>
+ br 7f
+6:
+ bit $20,(r4)
+ beq 8f
+ jsr r3,putc; <x\0>
+ br 7f
+8:
+ jsr r3,putc; <-\0>
+7:
+ bit $10,(r4)
+ beq 9f
+ jsr r3,putc; <r\0>
+ br 10f
+9:
+ jsr r3,putc; <-\0>
+10:
+ bit $4,(r4)
+ beq 11f
+ jsr r3,putc; <w\0>
+ br 12f
+11:
+ jsr r3,putc; <-\0>
+12:
+ bit $2,(r4)
+ beq 13f
+ jsr r3,putc; <r\0>
+ br 14f
+13:
+ jsr r3,putc; <-\0>
+14:
+ bit $1,(r4)+
+ beq 15f
+ jsr r3,putc; <w\0>
+ br 16f
+15:
+ jsr r3,putc; <-\0>
+16:
+ jsr r3,mesg; < \0>
+ movb (r4)+,r2
+ jsr r3,prdec; 2
+ movb (r4)+,r2
+ jsr pc,pruid
+ mov (r4)+,r2
+ jsr r3,prdec; 5
+ jsr r3,mesg; < \0>
+ add $20.,r4
+ mov (r4)+,r2
+ mov (r4)+,mq
+ mov r2,ac
+ mov $1,r0
+ jsr pc,prdate
+ jsr r3,mesg; < \0>
+ mov -2(r5),0f
+ jsr r3,mesg; 0:..
+ jsr r3,mesg; <\n\0>
+ jmp 1b
+
+pruid:
+ mov $stbuf+22.,r1
+ cmp r1,uids
+ bcc 1f
+ mov r1,0f
+2:
+ tstb (r1)+
+ beq 3f
+ cmpb -1(r1),$':
+ bne 2b
+ clrb -1(r1)
+3:
+ clr mq
+ movb (r1)+,r0
+ sub $'0,r0
+ cmp r0,$9.
+ bhi 4f
+ mov $10.,mul
+ add r0,mq
+ br 3b
+4:
+ cmp mq,r2
+ bne 1f
+ jsr r3,mesg; < \0>
+ jsr r3,mesg; 0:..
+ mov 0b,r1
+ mov $6,-(sp)
+5:
+ tstb (r1)+
+ beq 6f
+ dec (sp)
+ br 5b
+6:
+ jsr r3,mesg; < \0>
+ dec (sp)
+ bgt 6b
+ tst (sp)+
+ emt 7
+ jsr r3,mesg; < \0>
+ jsr r3,prdec; 3
+ jsr r3,mesg; <\n\0>
+ emt 7
+
+putc:
+ mov (r3)+,0f
+ mov $1,r0
+ sys write; 0:..; 1
+ emt 3
+
+mesg:
+ mov r2,-(sp)
+ mov (r3),r1
+ clr r2
+1:
+ tstb (r1)+
+ beq 2f
+ inc r2
+ br 1b
+2:
+ mov (r3)+,0f
+ mov r2,0f+2
+ mov $1,r0
+ sys write; 0:..; 0:..
+ mov (sp)+,r2
+ emt 3
+
+prdec:
+ mov $6,r1
+ mov $stbuf+22.,r0
+1:
+ mov r2,mq
+ clr ac
+ mov $10.,div
+ add $'0,ac
+ movb ac,-(r0)
+ clr ac
+ dec r1
+ bne 1b
+ cmp r0,$stbuf+21.
+ beq 2f
+ cmpb (r0),$'0
+ bne 2f
+ movb $' ,(r0)+
+ br 2b-4
+2:
+ mov $stbuf+22.,0f
+ sub (r3),0f
+ mov (r3)+,0f+2
+ mov $1,r0
+ sys write; 0:..; 0:..
+ emt 3
+
+1: </etc/uids\0>
+ .even
+uids: stbuf+22.
+
+prdate:
+ mov r1,-(sp)
+ sub $16.,sp
+ mov r0,r1
+ mov sp,r0
+ jsr pc,fmtdate
+ mov r0,0f
+ mov r1,r0
+ sys write; 0:..; 17.
+ add $16.,sp
+ mov (sp)+,r1
+ rts pc
+
+fmtdate:
+ mov r2,-(sp)
+ mov r3,-(sp)
+ cmp ac,yrdays
+ blo 1f
+ bhi 2f
+ cmp mq,yrdays+2
+ blo 1f
+2:
+ mov ac,-(sp)
+ sub yrdays+2,mq
+ sbc (sp)
+ sub yrdays,(sp)
+ mov (sp)+,ac
+ mov $29.,daylen
+1:
+ mov $-4,lsh
+ mov $26300.,div
+ mov mq,r3
+ mov ac,mq
+ mov $2,lsh
+ mov $17.,div
+ add $17.,r0
+ jsr r5,digit; 10.
+ jsr r5,digit; 6
+ movb $':,-(r0)
+ jsr r5,digit; 10.
+ jsr r5,digit; 6
+ movb $':,-(r0)
+ mov r3,mq
+ mov $24.,div
+ mov mq,r3
+ mov ac,mq
+ jsr r5,digit; 10.
+ jsr r5,digit; 10.
+ mov $montab,r2
+1:
+ cmp (r2),r3
+ bgt 2f
+ sub (r2)+,r3
+ br 1b
+2:
+ movb $' ,-(r0)
+ sub $montab,r2
+ asl r2
+ add $months,r2
+ inc r3
+ mov r3,mq
+ jsr r5,digit; 10.
+ tst mq
+ beq 1f
+ add $'0,mq
+ movb mq,-(r0)
+ br 2f
+1:
+ movb $' ,-(r0)
+2:
+ movb $' ,-(r0)
+ movb -(r2),-(r0)
+ movb -(r2),-(r0)
+ movb -(r2),-(r0)
+ mov (sp)+,r3
+ mov (sp)+,r2
+ rts pc
+
+digit:
+ clr ac
+ mov (r5)+,div
+ add $'0,ac
+ movb ac,-(r0)
+ rts r5
+
+yrdays: 57544.; 4480.
+daylen: 31.; 28.; 31.; 30.; 31.; 30.; 31.; 31.; 30.; 31.; 30.
+montab = .-2
+months:
+ < \0Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec\0>
+ .even
+
+argc: .=.+2
+argv: .=.+2
+stbuf: .=.+40.
diff --git a/cmd/tap.s b/cmd/tap.s
new file mode 100644
index 0000000..6d4727f
--- /dev/null
+++ b/cmd/tap.s
@@ -0,0 +1,666 @@
+/ tap -- tape archiver
+
+ br start
+ 07136
+ 0
+ 0
+
+ ble 1f
+ 0
+
+start:
+ sys stat; 0; 0
+ mov (sp),argc
+ mov (sp)+,argc2
+ mov $tapdev,path
+ incb tapname+8.
+ tst (sp)+
+ cmp argc2,$2
+ bge 1f
+ mov $2,argc2
+ br main
+1:
+ mov (sp)+,r0
+ mov sp,argp
+ movb (r0)+,r1
+ beq main
+ mov $optbl,r2
+1:
+ cmp r1,(r2)+
+ beq 2f
+ tst (r2)+
+ bne 1b
+ br baduse
+2:
+ jsr pc,@(r2)+
+ br 1b
+
+main:
+ sys intr; 0
+ jsr pc,topen
+ incb moession
+ sys chmod; tapdev; 0
+ mov $dir,r4
+ jmp @path
+
+topen:
+ sys open; tapdev; 0
+ bes opnerr
+ mov r0,tfi
+ sys open; tapdev; 1
+ bes opnerr
+ mov r0,tfo
+ sys stat; tapdev; stbuf
+ bit $1,stbuf+2
+ beq opnerr
+ rts pc
+
+opnerr:
+ jsr r5,mesg
+ <Tape open error\0>
+ .even
+ jmp done
+
+setpath:
+ cmp path,$tapdev
+ bne baduse
+ mov (r5)+,path
+ rts r5
+
+chknull:
+ mov (r5)+,r0
+ beq 1f
+ tstb (r0)
+ beq chknull
+ br baduse
+1:
+ rts r5
+
+baduse:
+ jsr r5,mesg
+ <Bad usage\0>
+ .even
+ jmp done
+
+optbl:
+ '0; setdv
+ '1; setdv
+ '2; setdv
+ '3; setdv
+ '4; setdv
+ '5; setdv
+ '6; setdv
+ '7; setdv
+ 'c; docr
+ 'd; dodel
+ 'f; dofil
+ 'l; dolist
+ 'm; domkd
+ 'r; dorepl
+ 't; dotbl
+ 'u; doupd
+ 'v; dover
+ 'w; dowrt
+ 'x; doextr
+ 0; 0
+
+setdv:
+ movb r1,tapname+8.
+ rts pc
+
+dodel:
+ incb dession
+ rts pc
+
+dofil:
+ incb fession
+ rts pc
+
+docr:
+ jsr r5,setpath; tapdev
+ rts pc
+
+domkd:
+ incb moession
+ rts pc
+
+doupd:
+ incb uession
+ jsr r5,setpath; tapdev
+ rts pc
+
+dorepl:
+ clrb uession
+ jsr r5,setpath; tapdev
+ rts pc
+
+dotbl:
+ incb tession
+ jsr r5,setpath; tapstr
+ rts pc
+
+dover:
+ incb vession
+ rts pc
+
+dowrt:
+ incb wession
+ rts pc
+
+doextr:
+ jsr r5,setpath; fpath
+ rts pc
+
+/ table of contents
+dottab:
+ .=.+512.
+
+/ directory reading
+dotab:
+ jsr r5,chknull; mnp; nnp; pnp; 0
+ cmp argc2,$2
+ bgt 1f
+ jmp baduse
+1:
+ jsr pc,readdir
+ jsr r5,match; dir2
+ jsr pc,readtape
+ br endtab
+
+doread:
+ jsr r5,chknull; pnp; 0
+ tstb dession
+ beq 1f
+ jsr pc,cleardir
+ br 2f
+1:
+ jsr pc,readdir
+2:
+ jsr pc,readtape
+ jsr pc,prstat
+ jsr pc,prdir
+ br endtab
+
+domake:
+ jsr r5,chknull; mnp; nnp; 0
+ jsr r5,namecpy; dir2; nname
+ jsr pc,readdir
+ jsr r5,match; dir2
+ br endmak
+
+doupdt:
+ jsr r5,chknull; mnp; nnp; pnp; snp; rnp; 0
+ jsr r5,namecpy; dir2; nname
+ jsr pc,readdir
+ jsr r5,match; dir2
+ jsr pc,doproc
+ tstb tession
+ beq prhdr
+ jsr r5,mesg
+ <MODE UID SIZE TAPA DATE NAME\0>
+ .even
+prhdr:
+ jsr r5,match; dir2
+ br endprc
+
+endtab:
+ mov $dir,r4
+ jsr pc,readdir
+ jsr pc,prtape
+endmak:
+ jsr pc,doproc
+ jsr r5,mesg; <END\0>; .even
+
+done:
+ sys exit
+
+doproc:
+ tstb moession
+ beq 1f
+ sys chmod; tapdev; 017
+ mov tfi,r0
+ sys close
+ mov tfo,r0
+ sys close
+ clrb moession
+ sys intr; 1
+1:
+ rts pc
+
+namecpy:
+ mov (r5)+,r0
+ mov $dir2,r1
+1:
+ mov (r0)+,(r1)+
+ cmp r0,(r5)
+ bcs 1b
+ cmp r1,$dir2+512.
+ blos 1f
+ jsr r5,mesg; <Overlay error\0>; .even
+ iot
+1:
+ tst (r5)+
+ rts r5
+
+npath:
+ mov r3,-(sp)
+ mov r2,-(sp)
+ mov r1,-(sp)
+ mov (r5),r2
+ mov r2,r1
+ bicb $177600,(r2)
+ cmpb (r2),$'/
+ bne 1f
+ jsr pc,findent
+ inc r2
+ br .-10
+1:
+ tstb (r2)+
+ bne .-4
+ mov r4,@0(sp)
+ mov (r5)+,r2
+ mov r2,r1
+ cmpb (r2),$'/
+ bne 2f
+ jsr pc,findent
+ movb r0,(r4)+
+ inc r2
+ br .-14
+2:
+ tstb (r2)+
+ bne .-4
+ movb (r1)+,(r4)+
+ bne .-4
+ mov (sp)+,r1
+ mov (sp)+,r2
+ mov (sp)+,r3
+ rts r5
+
+findent:
+ mov $dir,r3
+ mov $200,-(sp)
+ cmp r3,r4
+ bcc newent
+ cmpb (r3)+,$200
+ bne .-6
+ inc (sp)
+ mov r1,r0
+ cmpb (r3),$200
+ beq .-12
+ cmp r0,r2
+ bcc 1f
+ cmpb (r0)+,(r3)+
+ beq .-10
+ br .-22
+1:
+ tstb (r3)
+ bne .-24
+ br 2f
+
+newent:
+ movb $200,(r4)+
+ inc (sp)
+ mov r1,r0
+ cmp r0,r2
+ bcc 1f
+ movb (r0)+,(r4)+
+ br .-6
+1:
+ clrb (r4)+
+2:
+ mov (sp)+,r0
+ rts pc
+
+epath:
+ mov r3,-(sp)
+ mov r2,-(sp)
+ mov r1,-(sp)
+ mov (r1),r1
+ mov (r5)+,r2
+ movb (r1)+,r0
+ beq 3f
+ blt 1f
+ movb r0,(r2)+
+ br .-10
+1:
+ mov $dir,r3
+ bic $177600,r0
+ cmpb (r3)+,$200
+ bne .-4
+ dec r0
+ bne .-4
+ movb (r3)+,(r2)+
+ bne .-4
+ movb $'/,-1(r2)
+ br epath+16.
+3:
+ clrb (r2)+
+ mov (sp)+,r1
+ mov (sp)+,r2
+ mov (sp)+,r3
+ rts r5
+
+tapdev: </dev/tap0\0>
+ .even
+
+/ message subroutine
+prints:
+ movb (r1)+,r0
+ beq 1f
+ jsr pc,putc
+ br prints
+1:
+ rts pc
+
+mesg:
+ movb (r5)+,r0
+ beq 1f
+ jsr pc,putc
+ br mesg
+1:
+ inc r5
+ bic $1,r5
+ rts r5
+
+putc:
+ movb r0,ch
+ mov $1,r0
+ sys write; ch; 1
+ rts pc
+
+getc:
+ clr r0
+ sys read; ch; 1
+ movb ch,r0
+ rts pc
+
+cleardir:
+ mov $dir2,r1
+ mov $192.,r2
+ jsr pc,1f
+ dec r2
+ bne .-4
+ rts pc
+1:
+ clr (r1)+
+ clr (r1)+
+ clr (r1)+
+ clr (r1)+
+ clr (r1)+
+ clr (r1)+
+ clr (r1)+
+ clr (r1)+
+ rts pc
+
+readdir:
+ mov tfi,r0
+ sys read; dir; 512.
+ mov $dir,r4
+ add r0,r4
+ rts pc
+
+readtape:
+ mov tfi,r0
+ sys read; tbuf; 512.
+ jsr pc,chksum
+ bne csumerr
+ rts pc
+
+chksum:
+ mov $tbuf,r0
+ clr r1
+1:
+ add (r0)+,r1
+ cmp r0,$tbuf+512.
+ bne 1b
+ tst r1
+ rts pc
+
+csumerr:
+ jsr r5,mesg
+ <Directory checksum\0>
+ .even
+ jmp done
+
+rderr:
+ jsr r5,mesg
+ <Tape read error\0>
+ .even
+ jmp done
+
+wrterr:
+ jsr r5,mesg
+ <Tape write error\0>
+ .even
+ jmp done
+
+seekerr:
+ jsr r5,mesg
+ <Tape seek error\0>
+ .even
+ jmp done
+
+match:
+ mov r3,-(sp)
+ mov r2,-(sp)
+ mov r1,-(sp)
+ mov (r5)+,r1
+ mov $dir,r2
+1:
+ cmp r2,r4
+ bcc 2f
+ tstb (r2)+
+ beq 1b
+ jsr pc,cmpmatch
+ beq 3f
+ br 1b
+2:
+ mov $-1,r0
+ br 4f
+3:
+ mov r2,r0
+ sub $dir,r0
+4:
+ mov (sp)+,r1
+ mov (sp)+,r2
+ mov (sp)+,r3
+ rts r5
+
+cmpmatch:
+ mov r1,-(sp)
+1:
+ cmpb (r1)+,(r2)+
+ bne 2f
+ tstb -1(r1)
+ bne 1b
+ clr r0
+ br 3f
+2:
+ mov $1,r0
+3:
+ mov (sp)+,r1
+ rts pc
+
+prtape:
+ jsr r5,mesg
+ < entries\0>
+ .even
+ rts pc
+
+prstat:
+ jsr r5,mesg
+ < used\0>
+ .even
+ rts pc
+
+prdir:
+ jsr r5,mesg
+ < free\0>
+ .even
+ rts pc
+
+prfree:
+ jsr r5,mesg
+ < last\0>
+ .even
+ rts pc
+
+prdec:
+ clr ac
+ mov (r5)+,div
+ add $'0,ac
+ movb ac,-(r1)
+ rts r5
+
+prmon:
+ jsr r5,prdec; 10.
+ cmp r0,$2
+ beq 1f
+ mov (r5)+,r0
+ jsr pc,@putca
+ rts r5
+1:
+ mov $'-,r0
+ jsr pc,@putca
+ tst (r5)+
+ rts r5
+
+prdiv:
+ clr ac
+ mov (r5)+,div
+ add $'0,ac
+ movb ac,-(r1)
+ rts r5
+
+/ archive file routines
+dofile:
+ mov 4(r1),r3
+ beq 2f
+ mov 12.(r1),r0
+ jsr pc,setwrt
+ sys creat; wrbuf; 0
+ bes 1f
+ mov r0,r2
+ cmp r3,$512.
+ bcs 3f
+ jsr pc,rdbuf
+ mov r2,r0
+ sys write; dbuf; 512.
+ bes 1f
+ cmp r0,$512.
+ bne 1f
+ sub $512.,r3
+ br .-30
+3:
+ mov r3,0f
+ beq 4f
+ jsr pc,rdbuf
+ mov r2,r0
+ sys write; dbuf; 0:..
+ bes 1f
+ cmp r0,.-6
+ bne 1f
+4:
+ mov r2,r0
+ sys close
+ movb 3(r1),0f
+ sys chown; wrbuf; 0:..
+ movb 2(r1),0f
+ sys chmod; wrbuf; 0:..
+ mov 10.(r1),mq
+ mov 6(r1),ac
+ sys smdate; wrbuf
+2:
+ rts pc
+1:
+ tstb @$pnp
+ beq 2f
+ jsr r5,mkmiss
+ br dofile+6
+2:
+ clr mq
+ sys smdate; wrbuf
+ mov r2,r0
+ sys close
+opnerr2:
+ mov $wrbuf,r1
+ jsr pc,prints
+ jsr r5,mesg
+ < -- create error\n\0>
+ .even
+ rts pc
+
+mkmiss:
+ jsr r5,mesg
+ < not found\0>
+ .even
+ rts pc
+
+phaserr:
+ jsr r5,mesg
+ < -- Phase error\0>
+ .even
+ rts pc
+
+ovflerr:
+ jsr r5,mesg
+ <Tape overflow\0>
+ .even
+ jmp done
+
+rdbuf:
+ mov tfi,r0
+ sys read; dbuf; 512.
+ rts pc
+
+wrbuf:
+ .=.+32.
+ .even
+setwrt:
+ mov r0,0f
+ sys open; 0:..; 0
+ rts pc
+
+putca:
+ putc
+
+/ EAE registers
+div = 177300
+ac = 177302
+mq = 177304
+
+month: <JanFebMarAprMayJunJulAugSepOctNovDec\0>
+ .even
+
+tapstr: </bin/mkdir\0>
+ .even
+fpath: .=.+32.
+ .even
+
+.bss
+ch: .=.+2
+argc: .=.+2
+argc2: .=.+2
+argp: .=.+2
+path: .=.+2
+tfi: .=.+2
+tfo: .=.+2
+dession: .=.+2
+fession: .=.+2
+moession: .=.+2
+tession: .=.+2
+uession: .=.+2
+vession: .=.+2
+wession: .=.+2
+tapname: .=.+16.
+stbuf: .=.+36.
+dir: .=.+1024.
+dir2: .=.+1024.
+tbuf: .=.+512.
+dbuf: .=.+512.
+nname: .=.+64.
+mnp: .=.+2
+nnp: .=.+2
+pnp: .=.+2
+snp: .=.+2
+rnp: .=.+2
diff --git a/cmd/tm.s b/cmd/tm.s
new file mode 100644
index 0000000..b2dbec3
--- /dev/null
+++ b/cmd/tm.s
@@ -0,0 +1,284 @@
+/ tm -- system timing utility
+
+ br start
+ beq 1f
+ 0
+ 0
+
+ bge 1f
+ 0
+
+start:
+ sys open; timfil; 0
+ bes notime
+ mov r0,r1
+ sys read; tbuf; 26.
+ mov r1,r0
+ sys close
+ br 1f
+
+notime:
+ sys time
+ mov ac,ovrd
+ mov mq,ovrd+2
+1:
+ sys creat; timfil; 017
+ bec 1f
+ jsr r5,mesg
+ <cannot create time file.\0>
+ .even
+1:
+ sys exit
+
+timeerr:
+ mov r0,r2
+ sys open; sbfil; 0
+ bec 1f
+ jsr r5,mesg
+ <cannot open super-block.\0>
+ .even
+1:
+ sys exit
+
+openerr:
+ mov r0,r1
+ sys read; sbuf; 1024.
+ mov r1,r0
+ sys close
+ mov ovrd,dsk+2
+ mov ovrd+2,dsk+4
+ mov r2,r0
+ sys write; sbuf+6; 26.
+ mov r2,r0
+ sys close
+ cmp (sp),$1
+ blos prstats
+ jsr pc,argproc
+ clr (sp)
+ br start
+
+prstats:
+ mov $tbuf,r1
+ mov $sbuf+6,r2
+ jsr r5,mesg; <tim\0>; .even
+ jsr pc,prline
+ jsr r5,mesg; <ovh\0>; .even
+ jsr pc,prline
+ jsr r5,mesg; <dsk\0>; .even
+ jsr pc,prline
+ jsr r5,mesg; <idl\0>; .even
+ jsr pc,prline
+ jsr r5,mesg; <usr\0>; .even
+ jsr pc,prline
+ tst (sp)
+ beq done
+ jsr r5,mesg; <der \0>; .even
+ movb (r2),r0
+ bic $177400,r0
+ jsr pc,prdec
+ jsr r5,mesg; <,\0>; .even
+ movb 1(r2),r0
+ bic $177400,r0
+ jsr pc,prdec
+ jsr r5,mesg; < \0>; .even
+1:
+ sub (r1),(r2)
+ movb (r2)+,r0
+ bic $177400,r0
+ jsr pc,prdec
+ jsr r5,mesg; <,\0>; .even
+ movb (r2)+,r0
+ bic $177400,r0
+ jsr pc,prdec
+ jsr r5,mesg; <\n\0>; .even
+
+done:
+ sys exit
+
+dofork:
+ sys fork
+ br 1f
+ bec 1f
+1:
+ sys wait
+ rts pc
+
+argproc:
+ tst (sp)+
+ mov (sp)+,r0
+ tst (sp)+
+ mov $tbuf,r1
+ mov $argv,r2
+ sys stat; argv; argp
+ mov (sp)+,r3
+ mov r2,(r1)+
+1:
+ movb (r3)+,(r2)+
+ bne 1b
+ dec r0
+ cmp r0,$1
+ bgt 1b
+ clr (r1)+
+ sys utime
+ sys fstat
+ sys exec; argv; tbuf
+ mov $binsh,dexec
+ mov $<bi>,dexec+2
+ mov $</n>,dexec+4
+ sys exec; binsh; tbuf
+ jsr r5,mesg; <?\0>; .even
+
+done2:
+ sys exit
+
+prtnum:
+ mov $nbuf+3,r4
+ mov r0,mq
+ jsr r5,digit; 10.
+ jsr r5,digit; 10.
+ jsr r5,digit; 10.
+ jsr r5,digit; 10.
+ cmpb (r4),$'0
+ bne 1f
+ movb $' ,(r4)+
+ cmp r4,$nbuf+5
+ bne .-10
+1:
+ mov $1,r0
+ sys write; nbuf+2; 4
+ rts pc
+
+prline:
+ tst 2(sp)
+ beq 2f
+ jsr r5,mesg; < \0>; .even
+ mov 2(r2),mq
+ cmp r2,$sbuf+6
+ bne 1f
+ mov (r2),-(sp)
+ sub ovrd+2,mq
+ sbc (sp)
+ sub ovrd,(sp)
+ mov (sp)+,ac
+ br 3f
+1:
+ mov (r2),ac
+3:
+ jsr pc,prdiv
+2:
+ sub 2(r1),2(r2)
+ sbc (r2)
+ sub (r1),(r2)
+ mov 2(r2),mq
+ mov (r2),ac
+ jsr pc,prdiv
+ mov dsk,mq
+ mov $6,div
+ add $'0,mq
+ movb mq,11(r4)
+ jsr r5,digit; 10.
+ br 4f
+ movb $':',(r4)
+4:
+ jsr r5,digit; 10.
+ br 5f
+ movb $':',(r4)
+5:
+ jsr r5,digit; 10.
+ jsr r5,digit; 10.
+ jsr r5,digit; 10.
+ cmpb (r4),$'0
+ beq 1f
+ cmpb (r4),$':
+ bne 2f
+1:
+ movb $' ,(r4)+
+ cmp r4,$nbuf+2
+ bne .-16
+2:
+ mov $1,r0
+ sys write; nbuf+2; 9
+ rts pc
+
+prdiv:
+ mov $7020,div
+ mov mq,r3
+ mov ac,mq
+ clr ac
+ mov $'<,div
+ mov ac,dsk
+ mov $nbuf+3,r4
+ jsr r5,digit; 10.
+ jsr r5,digit; 6
+ movb $':',(r4)
+ mov r3,mq
+ jsr r5,digit; 10.
+ jsr r5,digit; 10.
+ jsr r5,digit; 10.
+ cmpb (r4),$'0
+ beq 1f
+ cmpb (r4),$':
+ bne 2f
+1:
+ movb $' ,(r4)+
+ cmp r4,$nbuf+2
+ bne .-16
+2:
+ mov $1,r0
+ sys write; nbuf+2; 9
+ rts pc
+
+digit:
+ clr ac
+ mov (r5)+,div
+ add $'0,ac
+ movb ac,-(r4)
+ rts r5
+
+mesg:
+ movb (r5)+,ch
+ beq 1f
+ mov $1,r0
+ sys write; ch; 1
+ br mesg
+1:
+ inc r5
+ bic $1,r5
+ rts r5
+
+prdec:
+ clr ac
+ mov $10.,div
+ mov ac,-(sp)
+ tst mq
+ beq 1f
+ jsr pc,prdec
+1:
+ add $'0,(sp)
+ mov (sp)+,ch
+ mov $1,r0
+ sys write; ch; 1
+ rts pc
+
+timfil: </tmp/tm\0>
+tmpfil: </tmp/tmp\0>
+devrf0: </dev/rf0\0>
+ .even
+
+.bss
+ch: .=.+2
+ovrd: .=.+4
+dsk: .=.+4
+tbuf: .=.+32.
+sbuf: .=.+1024.
+nbuf: .=.+16.
+argv: .=.+64.
+argp: .=.+32.
+binsh: .=.+16.
+dexec: .=.+8.
+sbfil: .=.+16.
+
+/ EAE registers
+div = 177300
+ac = 177302
+mq = 177304
diff --git a/cmd/un.s b/cmd/un.s
new file mode 100644
index 0000000..53f565a
--- /dev/null
+++ b/cmd/un.s
@@ -0,0 +1,79 @@
+/ un -- print undefined symbols from a.out
+
+ cmp (sp)+,$2
+ blt 1f
+ tst (sp)+
+ mov (sp)+,0f
+1:
+ sys open; 0:..; 0
+ bes error
+ mov r0,r1
+ sys read; hdr; 16.
+ cmp r0,$16.
+ bne error
+ cmp hdr,$407
+ bne error
+ mov hdr+2,r2
+ add hdr+4,r2
+ cmp hdr+14.,$1
+ beq 1f
+ asl r2
+1:
+ add $16.,r2
+ mov r2,0f
+ mov r1,r0
+ sys seek; 0:..; 0
+ add hdr+6.,0f
+ sys seek; 0f+2; 0
+loop:
+ mov r1,r0
+ sys read; sym; 12.
+ mov $sym,r1
+ mov r1,r2
+ add r0,r2
+ cmp r1,r2
+ blo 1f
+ tst filter
+ beq 2f
+ sys exit
+2:
+ mov $' ,filter
+ mov $sym,r1
+ br loop
+1:
+ cmp filter,8.(r1)
+ bne next
+ mov r1,r3
+ mov $name,r4
+ mov $8.,r5
+ bit $40,8.(r1)
+ beq 3f
+ movb $'_,(r4)+
+ movb $'\b,(r4)+
+3:
+ movb (r3)+,(r4)+
+ beq 4f
+ dec r5
+ bne 3b
+4:
+ movb $'\n,(r4)+
+ sub $name,r4
+ mov r4,0f
+ mov $1,r0
+ sys write; name; 0:..
+next:
+ add $12.,r1
+ br loop
+
+error:
+ mov $1,r0
+ sys write; errmsg; 2
+ sys exit
+errmsg: <?\n>
+
+0: <a.out\0>
+ .even
+filter: .=.+2
+hdr: .=.+16.
+sym: .=.+12.
+name: .=.+16.
diff --git a/cmd/wc.s b/cmd/wc.s
new file mode 100644
index 0000000..7a115cd
--- /dev/null
+++ b/cmd/wc.s
@@ -0,0 +1,180 @@
+/ wc -- word count
+
+ mov (sp)+,nfiles
+ tst (sp)+
+ dec nfiles
+ ble done
+
+loop:
+ br 1f
+2:
+ mov buf,r0
+ sys close
+ dec nfiles
+ beq done
+1:
+ clr words
+ clr lines
+ clr text
+ clr ctrl
+ mov $1,inflag
+ mov (sp),r0
+ jsr r5,fopen; buf
+ bes error
+ jsr r5,getc; buf
+ bes pline
+ cmpb $'\n,r0
+ bne 1f
+ inc lines
+ inc inflag
+ br 2f
+
+1:
+ cmpb $' ,r0
+ beq 3f
+ cmpb $'\t,r0
+ bne 4f
+3:
+ clr inflag
+2:
+ tst ctrl
+ bne gchar
+ inc ctrl
+ inc words
+ br gchar
+
+4:
+ cmpb $'.,r0
+ bne 5f
+ tst inflag
+ beq gchar
+ inc text
+ jsr r5,getc; buf
+ cmpb $'\n,r0
+ bne 4b
+ br gchar
+
+5:
+ clr inflag
+ clr ctrl
+gchar:
+ br 2b
+
+pline:
+ jsr r5,mesg; <\n file: \0>; .even
+ mov (sp)+,r0
+ jsr r5,mesg; 0:..; .even
+ jsr r5,mesg; < \0>; .even
+ jsr r5,decml; text
+ jsr r5,mesg; < text lines\n\0>; .even
+ jsr r5,decml; words
+ jsr r5,mesg; < control lines\n\0>; .even
+ jsr r5,decml; lines
+ jsr r5,mesg; < lines\n\0>; .even
+ jmp loop
+
+done:
+ sys exit
+
+mesg:
+ mov (r5)+,r1
+ mov r1,r2
+ mov r1,0f
+1:
+ tstb (r1)+
+ bne 1b
+ sub r2,r1
+ mov r1,0f+2
+ mov $1,r0
+ sys write; 0:..; 0:..
+ rts r5
+
+decml:
+ mov @(r5)+,mq
+ mov $1,r0
+ jsr pc,1f
+ rts r5
+1:
+ clr ac
+ mov $10.,div
+ mov ac,-(sp)
+ tst mq
+ beq 2f
+ jsr pc,1b
+2:
+ add $'0,(sp)
+ mov (sp)+,ch
+ sys write; ch; 1
+ rts pc
+
+fopen:
+ mov r1,-(sp)
+ mov (r5)+,r1
+ mov r0,0f
+ sys open; 0:..; 0
+ bec 1f
+ mov $-1,(r1)
+ mov (sp)+,r1
+ sec
+ rts r5
+1:
+ mov r0,(r1)+
+ clr (r1)+
+ mov (sp)+,r1
+ rts r5
+
+getc:
+ mov (r5),0f
+ mov (r5)+,0f+2
+ jsr r5,1f; 0:..
+ bec 2f
+ rts r5
+2:
+ mov r0,-(sp)
+ jsr r5,1f; 0:..
+ swab r0
+ bis (sp)+,r0
+ rts r5
+1:
+ mov r1,-(sp)
+ mov (r5)+,r1
+ dec 2(r1)
+ bge 3f
+ mov r1,r0
+ add $6,r0
+ mov r0,0f
+ mov r0,4(r1)
+ mov (r1),r0
+ sys read; 0:..; 512.
+ bec 4f
+4:
+ tst r0
+ bne 5f
+ mov (sp)+,r1
+ sec
+ rts r5
+5:
+ dec r0
+ mov r0,2(r1)
+3:
+ clr r0
+ bisb @4(r1),r0
+ inc 4(r1)
+ mov (sp)+,r1
+ rts r5
+
+error:
+ mov $1,r0
+ sys write; quest; 2
+ sys exit
+quest: <?\n>
+
+inflag: .=.+2
+
+ch: .=.+2
+text: .=.+2
+words: .=.+2
+ctrl: .=.+2
+lines: .=.+2
+nfiles: .=.+2
+buf: .=.+518.
diff --git a/cmd/who.s b/cmd/who.s
new file mode 100644
index 0000000..0abe522
--- /dev/null
+++ b/cmd/who.s
@@ -0,0 +1,150 @@
+/ who -- who is logged in
+
+ cmp (sp)+,$1
+ ble 1f
+ mov 2(sp),0f
+1:
+ sys open; 0:..; 0
+ bes error
+ mov r0,r1
+2:
+ mov r1,r0
+ sys read; utmp; 16.
+ tst r0
+ beq done
+ tst utmp
+ bne 3f
+ cmp 0b,$deffile
+ beq 2b
+ mov $1,r0
+ sys write; blank; 8.
+ br 4f
+3:
+ mov $1,r0
+ sys write; utmp; 8.
+4:
+ movb utmp+8.,ttyno
+ cmp 0b,$deffile
+ bne 5f
+ mov $1,r0
+ sys write; ttyc; 3
+5:
+ mov $1,r0
+ sys write; spsp; 2
+ mov utmp+12.,mq
+ mov utmp+10.,ac
+ mov $1,r0
+ jsr pc,prdate
+ mov $1,r0
+ sys write; nl; 1
+ br 2b
+
+error:
+ mov $1,r0
+ sys write; errmsg; 2
+done:
+ sys exit
+
+blank: < >
+ttyc: <tty>
+ttyno = ttyc+3
+spsp: < >
+deffile:
+0: </tmp/utmp\0>
+ .even
+nl: <\n>
+utmp: .=.+16.
+
+prdate:
+ mov r1,-(sp)
+ sub $16.,sp
+ mov r0,r1
+ mov sp,r0
+ jsr pc,fmtdate
+ mov r0,0f
+ mov r1,r0
+ sys write; 0:..; 17.
+ add $16.,sp
+ mov (sp)+,r1
+ rts pc
+
+fmtdate:
+ mov r2,-(sp)
+ mov r3,-(sp)
+ cmp ac,yrdays
+ blo 1f
+ bhi 2f
+ cmp mq,yrdays+2
+ blo 1f
+2:
+ mov ac,-(sp)
+ sub yrdays+2,mq
+ sbc (sp)
+ sub yrdays,(sp)
+ mov (sp)+,ac
+ mov $29.,daylen
+1:
+ mov $-4,lsh
+ mov $26300.,div
+ mov mq,r3
+ mov ac,mq
+ mov $2,lsh
+ mov $17.,div
+ add $17.,r0
+ jsr r5,digit; 10.
+ jsr r5,digit; 6
+ movb $':,-(r0)
+ jsr r5,digit; 10.
+ jsr r5,digit; 6
+ movb $':,-(r0)
+ mov r3,mq
+ mov $24.,div
+ mov mq,r3
+ mov ac,mq
+ jsr r5,digit; 10.
+ jsr r5,digit; 10.
+ mov $montab,r2
+1:
+ cmp (r2),r3
+ bgt 2f
+ sub (r2)+,r3
+ br 1b
+2:
+ movb $' ,-(r0)
+ sub $montab,r2
+ asl r2
+ add $months,r2
+ inc r3
+ mov r3,mq
+ jsr r5,digit; 10.
+ tst mq
+ beq 1f
+ add $'0,mq
+ movb mq,-(r0)
+ br 2f
+1:
+ movb $' ,-(r0)
+2:
+ movb $' ,-(r0)
+ movb -(r2),-(r0)
+ movb -(r2),-(r0)
+ movb -(r2),-(r0)
+ mov (sp)+,r3
+ mov (sp)+,r2
+ rts pc
+
+digit:
+ clr ac
+ mov (r5)+,div
+ add $'0,ac
+ movb ac,-(r0)
+ rts r5
+
+yrdays: 57544.; 4480.
+daylen: 31.; 28.; 31.; 30.; 31.; 30.; 31.; 31.; 30.; 31.; 30.
+montab = .-2
+months:
+ < \0Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec\0>
+ .even
+
+errmsg: <?\n>
--
2.51.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [TUHS] Re: Possible Assembly UNIX Kernel Images (s1-bits cunix/wunix)?
2026-01-16 22:11 ` [TUHS] " Briam Rodriguez via TUHS
@ 2026-01-16 22:28 ` segaloco via TUHS
2026-01-17 0:50 ` Briam R via TUHS
2026-01-17 0:59 ` segaloco via TUHS
1 sibling, 1 reply; 7+ messages in thread
From: segaloco via TUHS @ 2026-01-16 22:28 UTC (permalink / raw)
To: The Eunuchs Hysterical Society
Thank you so much Briam! I'll be sitting down to look more at the two
kernels later and will get this merged into v2src as well. Fittingly I
have a house call to fix an old WECo phone so have to break from the
excitement for a few hours. Do you have a preference on how I credit
you for this work in the README?
- Matt G.
On Friday, January 16th, 2026 at 14:11, Briam Rodriguez via TUHS <tuhs@tuhs.org> wrote:
> Hi Matt,
>
> Saw your post about the v2src restoration project. I took a crack at
> disassembling the remaining binaries from the s2-bits tape -
> specifically the bin/ directory utilities.
>
> I've got 26 commands disassembled and formatted to match your existing
> style conventions:
>
> as, bas, cc, db, dc, ds, du, ed, fc, find, form, ld, maki, mv, nm, od,
> pr, roff, size, sort, stat, tap, tm, un, wc, who
>
> They're ready as a patch file. Please find it attached. I tried creating
> a PR on gitlab but it wouldn't let me due to auth issues.
>
> Happy to help with more disassembly work if there are other artifacts
> worth looking at.
>
> -- Briam R.
>
> On 1/16/26 5:06 PM, segaloco via TUHS wrote:
>
> > Hello everyone, I've been picking back up on some of my V2/V3 era
> > reverse engineering efforts, picking through stuff from the Dennis_Tapes
> > archive, and I came across something I don't think I've seen discussed.
> >
> > On the s1 tape, which we've yoinked a lot of V3 userland sources from,
> > there are files cunix and wunix. Upon some disassembly and inspection,
> > I believe these may be assembly UNIX kernels, although I haven't dug
> > around too much to see what version they match most closely. Here are
> > some findings that support my suspicions:
> >
> > - Both files begin with a 407 magic number, making them V2 a.out
> > binaries.
> > - Both begin with a branch that jumps over a few things then calls a
> > subroutine. That subroutine matches "copyz" from u3.s in the scanned
> > V1 kernel description from BTL. Indeed this jump in that kernel is also
> > to copyz.
> >
> > Of course, this is only the first few bits executed, but I would be
> > surprised to find such a close match elsewhere in the system. I do this
> > sort of analysis on old video game code all the time, so I feel pretty
> > confident in identifying these as possible assembly-era kernels.
> >
> > Anyone dug around in these before? These should be PDP-11/20 kernels as
> > I'm finding plenty of EAE references, just like the s2-bits V2 binaries.
> > What I'm hoping to find here are bits that might indicate KS11 support,
> > what with the recent chit chat about KS11 in the V2 kernel.
> >
> > - Matt G.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [TUHS] Re: Possible Assembly UNIX Kernel Images (s1-bits cunix/wunix)?
2026-01-16 22:28 ` segaloco via TUHS
@ 2026-01-17 0:50 ` Briam R via TUHS
0 siblings, 0 replies; 7+ messages in thread
From: Briam R via TUHS @ 2026-01-17 0:50 UTC (permalink / raw)
To: segaloco; +Cc: tuhs
No sir! Any mention is a good mention, I’m just glad to be here amongst such esteemed company!
— Briam R.
—————————
> On Jan 16, 2026, at 5:29 PM, segaloco via TUHS <tuhs@tuhs.org> wrote:
>
> Thank you so much Briam! I'll be sitting down to look more at the two
> kernels later and will get this merged into v2src as well. Fittingly I
> have a house call to fix an old WECo phone so have to break from the
> excitement for a few hours. Do you have a preference on how I credit
> you for this work in the README?
>
> - Matt G.
>
>> On Friday, January 16th, 2026 at 14:11, Briam Rodriguez via TUHS <tuhs@tuhs.org> wrote:
>>
>> Hi Matt,
>>
>> Saw your post about the v2src restoration project. I took a crack at
>> disassembling the remaining binaries from the s2-bits tape -
>> specifically the bin/ directory utilities.
>>
>> I've got 26 commands disassembled and formatted to match your existing
>> style conventions:
>>
>> as, bas, cc, db, dc, ds, du, ed, fc, find, form, ld, maki, mv, nm, od,
>> pr, roff, size, sort, stat, tap, tm, un, wc, who
>>
>> They're ready as a patch file. Please find it attached. I tried creating
>> a PR on gitlab but it wouldn't let me due to auth issues.
>>
>> Happy to help with more disassembly work if there are other artifacts
>> worth looking at.
>>
>> -- Briam R.
>>
>>> On 1/16/26 5:06 PM, segaloco via TUHS wrote:
>>>
>>> Hello everyone, I've been picking back up on some of my V2/V3 era
>>> reverse engineering efforts, picking through stuff from the Dennis_Tapes
>>> archive, and I came across something I don't think I've seen discussed.
>>>
>>> On the s1 tape, which we've yoinked a lot of V3 userland sources from,
>>> there are files cunix and wunix. Upon some disassembly and inspection,
>>> I believe these may be assembly UNIX kernels, although I haven't dug
>>> around too much to see what version they match most closely. Here are
>>> some findings that support my suspicions:
>>>
>>> - Both files begin with a 407 magic number, making them V2 a.out
>>> binaries.
>>> - Both begin with a branch that jumps over a few things then calls a
>>> subroutine. That subroutine matches "copyz" from u3.s in the scanned
>>> V1 kernel description from BTL. Indeed this jump in that kernel is also
>>> to copyz.
>>>
>>> Of course, this is only the first few bits executed, but I would be
>>> surprised to find such a close match elsewhere in the system. I do this
>>> sort of analysis on old video game code all the time, so I feel pretty
>>> confident in identifying these as possible assembly-era kernels.
>>>
>>> Anyone dug around in these before? These should be PDP-11/20 kernels as
>>> I'm finding plenty of EAE references, just like the s2-bits V2 binaries.
>>> What I'm hoping to find here are bits that might indicate KS11 support,
>>> what with the recent chit chat about KS11 in the V2 kernel.
>>>
>>> - Matt G.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [TUHS] Re: Possible Assembly UNIX Kernel Images (s1-bits cunix/wunix)?
2026-01-16 22:06 [TUHS] Possible Assembly UNIX Kernel Images (s1-bits cunix/wunix)? segaloco via TUHS
2026-01-16 22:11 ` [TUHS] " Briam Rodriguez via TUHS
@ 2026-01-17 0:59 ` Yufeng Gao via TUHS
1 sibling, 0 replies; 7+ messages in thread
From: Yufeng Gao via TUHS @ 2026-01-17 0:59 UTC (permalink / raw)
To: segaloco, The Eunuchs Hysterical Society
Hi,
> Anyone dug around in these before?
I've dug a tiny bit into these kernels early last year:
https://www.tuhs.org/pipermail/tuhs/2025-February/031420.html
https://www.tuhs.org/pipermail/tuhs/2025-February/031423.html
There's no KS11 support, otherwise it wouldn't boot under emulation.
Sincerely,
Yufeng
^ permalink raw reply [flat|nested] 7+ messages in thread
* [TUHS] Re: Possible Assembly UNIX Kernel Images (s1-bits cunix/wunix)?
2026-01-16 22:11 ` [TUHS] " Briam Rodriguez via TUHS
2026-01-16 22:28 ` segaloco via TUHS
@ 2026-01-17 0:59 ` segaloco via TUHS
2026-01-17 15:46 ` Briam Rodriguez via TUHS
1 sibling, 1 reply; 7+ messages in thread
From: segaloco via TUHS @ 2026-01-17 0:59 UTC (permalink / raw)
To: The Eunuchs Hysterical Society
Hmm, Briam, might I ask what your process was? I'm finding quite a few
discrepancies, for instance, when I put this copy of as(I) through a
PDP-11 disassembler, I get an entry something like (syscalls filled in):
000020: 000167 016316 jmp 16342 ; w.N.
;
000024: 004767 000632 jsr r7,662 ; w...
000030: 116700 011562 movb 11616,r0 ; @.r.
000034: 104404 sys write; $52614; 1000
000042: 116700 011550 movb 11616,r0 ; @.h.
000046: 104406 sys close ; ..
000050: 116700 011545 movb 11621,r0 ; @.e.
000054: 104406 sys close ; ..
000056: 105767 005466 tstb 5550 ; w.6.
000062: 001041 bne 166 ; !.
000064: 004567 000230 jsr r5,320 ; w...
But this same chunk of your as.s you sent:
/ start of program
start:
jmp main
/ error handling
error:
jsr pc,pass1
movb errflg,r0
sys creat; tmpf1; 1000
movb errflg,r0
sys creat; tmpf2; 0
movb passno,r0
tstb dotflg
bne 1f
jsr r5,errstr
<-e\n\0>; .even
I'm really confused where those creat's came from, whats going on there
is quite different than what you sent me. The former, what I got out of
my own disassembly of the file, matches as11.s in both V2 and V5. I
have my doubts this entrypoint changed that much between V2 and V5 only
to wind up the same again in V5.
Are we working from two different sets of binaries? I just want to make
sure before I put much more time into aligning these with known V2 and
V5 sources. My goal for the v2src repository is that it should diff
appropriately with known, real sources, that's one of my quality gates
I'm applying here.
- Matt G.
On Friday, January 16th, 2026 at 14:11, Briam Rodriguez via TUHS <tuhs@tuhs.org> wrote:
> Hi Matt,
>
> Saw your post about the v2src restoration project. I took a crack at
> disassembling the remaining binaries from the s2-bits tape -
> specifically the bin/ directory utilities.
>
> I've got 26 commands disassembled and formatted to match your existing
> style conventions:
>
> as, bas, cc, db, dc, ds, du, ed, fc, find, form, ld, maki, mv, nm, od,
> pr, roff, size, sort, stat, tap, tm, un, wc, who
>
> They're ready as a patch file. Please find it attached. I tried creating
> a PR on gitlab but it wouldn't let me due to auth issues.
>
> Happy to help with more disassembly work if there are other artifacts
> worth looking at.
>
> -- Briam R.
>
> On 1/16/26 5:06 PM, segaloco via TUHS wrote:
>
> > Hello everyone, I've been picking back up on some of my V2/V3 era
> > reverse engineering efforts, picking through stuff from the Dennis_Tapes
> > archive, and I came across something I don't think I've seen discussed.
> >
> > On the s1 tape, which we've yoinked a lot of V3 userland sources from,
> > there are files cunix and wunix. Upon some disassembly and inspection,
> > I believe these may be assembly UNIX kernels, although I haven't dug
> > around too much to see what version they match most closely. Here are
> > some findings that support my suspicions:
> >
> > - Both files begin with a 407 magic number, making them V2 a.out
> > binaries.
> > - Both begin with a branch that jumps over a few things then calls a
> > subroutine. That subroutine matches "copyz" from u3.s in the scanned
> > V1 kernel description from BTL. Indeed this jump in that kernel is also
> > to copyz.
> >
> > Of course, this is only the first few bits executed, but I would be
> > surprised to find such a close match elsewhere in the system. I do this
> > sort of analysis on old video game code all the time, so I feel pretty
> > confident in identifying these as possible assembly-era kernels.
> >
> > Anyone dug around in these before? These should be PDP-11/20 kernels as
> > I'm finding plenty of EAE references, just like the s2-bits V2 binaries.
> > What I'm hoping to find here are bits that might indicate KS11 support,
> > what with the recent chit chat about KS11 in the V2 kernel.
> >
> > - Matt G.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [TUHS] Re: Possible Assembly UNIX Kernel Images (s1-bits cunix/wunix)?
2026-01-17 0:59 ` segaloco via TUHS
@ 2026-01-17 15:46 ` Briam Rodriguez via TUHS
0 siblings, 0 replies; 7+ messages in thread
From: Briam Rodriguez via TUHS @ 2026-01-17 15:46 UTC (permalink / raw)
To: tuhs
Matt,
Sorry about that! I made errors in my syscall identification process -
the structure looked roughly correct but the actual trap numbers were
wrong. Your disassembly showing sys write and sys close are correct;
mine had sys creat which doesn't match the opcodes at all.
Please disregard that patch, seems I was a bit too hasty to contribute!
I've since built out a proper validation workflow: assemble with the
actual V2 toolchain via Apout, then byte-compare against the original
binary. If it's not identical, it's not done.
As proof of concept - while validating this process against your
existing sources, I found a 1-byte discrepancy in strip.s at offset
0xF4. The bne 1b branch target was wrong because the 1: label was placed
before the size calculation rather than before the cmp r2,r3. The
original binary's inner loop only re-checks the comparison. I can send
you the fix if you'd like - it now assembles to byte-identical output.
I'll send properly-validated reconstructions once I've worked through
the kinks!
-- Briam
On 1/16/26 7:59 PM, segaloco via TUHS wrote:
> Hmm, Briam, might I ask what your process was? I'm finding quite a few
> discrepancies, for instance, when I put this copy of as(I) through a
> PDP-11 disassembler, I get an entry something like (syscalls filled in):
>
> 000020: 000167 016316 jmp 16342 ; w.N.
> ;
> 000024: 004767 000632 jsr r7,662 ; w...
> 000030: 116700 011562 movb 11616,r0 ; @.r.
> 000034: 104404 sys write; $52614; 1000
> 000042: 116700 011550 movb 11616,r0 ; @.h.
> 000046: 104406 sys close ; ..
> 000050: 116700 011545 movb 11621,r0 ; @.e.
> 000054: 104406 sys close ; ..
> 000056: 105767 005466 tstb 5550 ; w.6.
> 000062: 001041 bne 166 ; !.
> 000064: 004567 000230 jsr r5,320 ; w...
>
> But this same chunk of your as.s you sent:
>
> / start of program
> start:
> jmp main
>
> / error handling
> error:
> jsr pc,pass1
> movb errflg,r0
> sys creat; tmpf1; 1000
> movb errflg,r0
> sys creat; tmpf2; 0
> movb passno,r0
> tstb dotflg
> bne 1f
> jsr r5,errstr
> <-e\n\0>; .even
>
> I'm really confused where those creat's came from, whats going on there
> is quite different than what you sent me. The former, what I got out of
> my own disassembly of the file, matches as11.s in both V2 and V5. I
> have my doubts this entrypoint changed that much between V2 and V5 only
> to wind up the same again in V5.
>
> Are we working from two different sets of binaries? I just want to make
> sure before I put much more time into aligning these with known V2 and
> V5 sources. My goal for the v2src repository is that it should diff
> appropriately with known, real sources, that's one of my quality gates
> I'm applying here.
>
> - Matt G.
>
> On Friday, January 16th, 2026 at 14:11, Briam Rodriguez via TUHS <tuhs@tuhs.org> wrote:
>
>> Hi Matt,
>>
>> Saw your post about the v2src restoration project. I took a crack at
>> disassembling the remaining binaries from the s2-bits tape -
>> specifically the bin/ directory utilities.
>>
>> I've got 26 commands disassembled and formatted to match your existing
>> style conventions:
>>
>> as, bas, cc, db, dc, ds, du, ed, fc, find, form, ld, maki, mv, nm, od,
>> pr, roff, size, sort, stat, tap, tm, un, wc, who
>>
>> They're ready as a patch file. Please find it attached. I tried creating
>> a PR on gitlab but it wouldn't let me due to auth issues.
>>
>> Happy to help with more disassembly work if there are other artifacts
>> worth looking at.
>>
>> -- Briam R.
>>
>> On 1/16/26 5:06 PM, segaloco via TUHS wrote:
>>
>>> Hello everyone, I've been picking back up on some of my V2/V3 era
>>> reverse engineering efforts, picking through stuff from the Dennis_Tapes
>>> archive, and I came across something I don't think I've seen discussed.
>>>
>>> On the s1 tape, which we've yoinked a lot of V3 userland sources from,
>>> there are files cunix and wunix. Upon some disassembly and inspection,
>>> I believe these may be assembly UNIX kernels, although I haven't dug
>>> around too much to see what version they match most closely. Here are
>>> some findings that support my suspicions:
>>>
>>> - Both files begin with a 407 magic number, making them V2 a.out
>>> binaries.
>>> - Both begin with a branch that jumps over a few things then calls a
>>> subroutine. That subroutine matches "copyz" from u3.s in the scanned
>>> V1 kernel description from BTL. Indeed this jump in that kernel is also
>>> to copyz.
>>>
>>> Of course, this is only the first few bits executed, but I would be
>>> surprised to find such a close match elsewhere in the system. I do this
>>> sort of analysis on old video game code all the time, so I feel pretty
>>> confident in identifying these as possible assembly-era kernels.
>>>
>>> Anyone dug around in these before? These should be PDP-11/20 kernels as
>>> I'm finding plenty of EAE references, just like the s2-bits V2 binaries.
>>> What I'm hoping to find here are bits that might indicate KS11 support,
>>> what with the recent chit chat about KS11 in the V2 kernel.
>>>
>>> - Matt G.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-01-17 15:46 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-16 22:06 [TUHS] Possible Assembly UNIX Kernel Images (s1-bits cunix/wunix)? segaloco via TUHS
2026-01-16 22:11 ` [TUHS] " Briam Rodriguez via TUHS
2026-01-16 22:28 ` segaloco via TUHS
2026-01-17 0:50 ` Briam R via TUHS
2026-01-17 0:59 ` segaloco via TUHS
2026-01-17 15:46 ` Briam Rodriguez via TUHS
2026-01-17 0:59 ` Yufeng Gao via TUHS
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).