The Unix Heritage Society mailing list
 help / color / mirror / Atom feed
* [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).