/ tape boot program to load and transfer
/ to a 'tp' entry

/ entry is made by jsr pc,*$0
/ so return can be rts pc
/ jsr pc,(r5) is putc
/ jsr pc,2(r5) is getc
/ jsr pc,4(r5) is mesg

core = 24.
.mt. = 0
.tc. = 0
.tu. = 1
.. = [core*2048.]-512.
start:
	mov	$..,sp
	mov	$name,r4
	mov	sp,r1
	cmp	pc,r1
	bhis	2f
	clr	r0
	cmp	(r0),$407
	bne	1f
	mov	$20,r0
1:
	mov	(r0)+,(r1)+
	cmp	r1,$end
	blo	1b
	jmp	(sp)

2:
	jsr	pc,rew
	mov	$tvec,r5
	mov	$'=,r0
	jsr	pc,(r5)
2:
	mov	r4,r1
1:
	jsr	pc,2(r5)
	cmp	r0,$'\n
	beq	1f
	cmp	r0,$'@
	beq	2b
	movb	r0,(r1)+
	cmp	r0,$'#
	bne	1b
	sub	$2,r1
	cmp	r1,r4
	blo	2b
	br	1b
1:
	clrb	(r1)
	cmp	r1,r4
	blos	start
	mov	$1,tapa
	mov	$-6144.,wc
	jsr	pc,taper
	clr	r1
1:
	mov	r1,r2
	mov	r4,r0
2:
	cmpb	(r0)+,(r1)
	bne	2f
	tstb	(r1)+
	bne	2b
	br	1f
2:
	mov	r2,r1
	add	$64.,r1
	cmp	r1,$12288.
	blo	1b
	jsr	pc,rew
	br	start
1:
	mov	44.(r2),tapa
	mov	38.(r2),r0
	inc	r0
	clc
	ror	r0
	neg	r0
	mov	r0,wc
	clr	r0
1:
	clr	(r0)+
	cmp	r0,sp
	blo	1b
	jsr	pc,taper
	jsr	pc,rew
	clr	r0
	cmp	(r0),$407		/ unix a.out?
	bne	2f
1:
	mov	20(r0),(r0)+
	cmp	r0,sp
	blo	1b
2:
	jsr	pc,*$0
	br	start

.if .mt.
mts = 172520
mtc = 172522
mtbrc = 172524
mtcma = 172526

taper:
	clr	mtma
	cmp	mtapa,tapa
	beq	1f
	bhi	2f
	jsr	pc,rrec
	br	taper
2:
	jsr	pc,rew
	br	taper
1:
	mov	wc,r1
1:
	jsr	pc,rrec
	add	$256.,r1
	bmi	1b
	rts	pc

rrec:
	bit	$2,*$mts
	bne	rrec
	tstb	*$mtc
	bge	rrec
	mov	$-512.,*$mtbrc
	mov	mtma,*$mtcma
	mov	$60003,*$mtc
1:
	tstb	*$mtc
	bge	1b
	tst	*$mtc
	bge	1f
	mov	$-1,*$mtbrc
	mov	$60013,*$mtc
	br	rrec
1:
	add	$512.,mtma
	inc	mtapa
	rts	pc

rew:
	mov	$60017,*$mtc
	clr	mtapa
	rts	pc
.endif

.if .tu.
tucs1 = 172440
tuwc = 172442
tuba = 172444
tufc = 172446
tucs2 = 172450
tuds = 172452
tutc = 172472

taper:
	clr	mtma
	cmp	mtapa,tapa
	beq	1f
	bhi	2f
	jsr	pc,rrec
	br	taper
2:
	jsr	pc,rew
	br	taper
1:
	mov	wc,r1
1:
	jsr	pc,rrec
	add	$256.,r1
	bmi	1b
	rts	pc

rrec:
	bit	$020000,*$tuds
	bne	rrec
	tstb	*$tucs1
	bge	rrec
	mov	$-256.,*$tuwc
	mov	mtma,*$tuba
	mov	$071,*$tucs1
1:
	tstb	*$tucs1
	bge	1b
	bit	$040000,*$tucs1
	beq	1f
	mov	$040,*$tucs2
	mov	$-1,*$tufc
	mov	$033,*$tucs1
	br	rrec
1:
	add	$512.,mtma
	inc	mtapa
	rts	pc

rew:
	mov	$040,*$tucs2
	mov	$07,*$tucs1
	clr	mtapa
	rts	pc
.endif

.if .tc.
tcdt = 177350
tccm = 177342
taper:
	mov	$tcdt,r0
	mov	$tccm,r1
for:
	mov	$3,(r1)			/ rbn for
1:
	tstb	(r1)
	bge	1b
	tst	(r1)
	blt	rev
	cmp	tapa,(r0)
	beq	rd
	bgt	for

rev:
	mov	$4003,(r1)		/ rbn bac
1:
	tstb	(r1)
	bge	1b
	tst	(r1)
	blt	for
	mov	(r0),r2
	add	$5,r2
	cmp	tapa,r2
	blt	rev
	br	for

rd:
	clr	-(r0)				/ bus addr
	mov	wc,-(r0)			/ wc
	mov	$5,-(r0)			/ read
1:
	tstb	(r1)
	bge	1b
	tst	(r1)
	blt	taper
	rts	pc

rew:
	mov	$4003,tccm
	rts	pc
.endif

tvec:
	br	putc
	br	getc
	br	mesg

tks = 177560
tkb = 177562
getc:
	mov	$tks,r0
	inc	(r0)
1:
	tstb	(r0)
	bge	1b
	mov	tkb,r0
	bic	$!177,r0
	cmp	r0,$'A
	blo	1f
	cmp	r0,$'Z
	bhi	1f
	add	$40,r0
1:
	cmp	r0,$'\r
	bne	putc
	mov	$'\n,r0

tps = 177564
tpb = 177566
putc:
	tstb	tps
	bge	putc
	cmp	r0,$'\n
	bne	1f
	mov	$'\r,r0
	jsr	pc,(r5)
	mov	$'\n+200,r0
	jsr	pc,(r5)
	clr	r0
	jsr	pc,(r5)
	mov	$'\n,r0
	rts	pc
1:
	mov	r0,tpb
	rts	pc

mesg:
	movb	*(sp),r0
	beq	1f
	jsr	pc,(r5)
	inc	(sp)
	br	mesg
1:
	add	$2,(sp)
	bic	$1,(sp)
	rts	pc

end:
tapa:	.=.+2
mtapa:	.=.+2
mtma:	.=.+2
wc:	.=.+2
name:	.=.+32.
