V7M/sys/mdec/hkuboot.s

Compare this file to the similar file:
Show the results in this format:

/ UNIX/v7m RK06/7 disk block 0 bootstrap
/ Can only boot from unit zero.
/ Assumes disk at standard address (0177440).
/
/ Fred Canter 5/1/81
/
/ Disk boot program to load and transfer
/ to a unix file system entry.

reset	= 5
halt	= 0

core	= 28.
.. = [core*2048.]-512.

/ establish sp and check if running below
/ intended origin, if so, copy
/ program up to 'core' K words.

start:
	mov	$..,sp
	clr	r0
	mov	sp,r1
	cmp	pc,r1
	bhis	2f
1:
	mov	(r0)+,(r1)+
	cmp	r1,$end
	blo	1b
	jmp	(sp)

/ clear core to make things clean
2:
	clr	(r0)+
	cmp	r0,sp
	blo	2b

/ initialize the disk hardware
/ and select the drive.
/
/ Attempt to select rk06 first,
/ if the drive can't be selected as rk06
/ then try to select it as an rk07,
/ if that fails then halt !

	reset
	mov	$21,dtcmd	/rk06 drive type + read cmd
	mov	$hkcs1,r0	/Disk CSR address
	clr	10(r0)		/unit 0 select
	mov	$3,(r0)		/pack ack for rk06
1:
	tstb	(r0)		/wait for ready
	bpl	1b
	tst	(r0)		/error ?
	bpl	4f		/no, drive is rk06 !
	bit	$40,14(r0)	/yes, drive type error ?
	beq	3f		/no, fatal error
	reset			/yes, drive is not rk06
	mov	$2021,dtcmd	/rk07 drive type + read cmd
	clr	10(r0)		/try rk07 unit 0
	mov	$2003,(r0)	/pack ack rk07
2:
	tstb	(r0)		/wait for ready
	bpl	2b
	tst	(r0)		/error ?
	bpl	4f		/no, continue boot
3:
	halt			/halt if can't select drive
4:

/ print CRLF # as a prompt

	mov	$'\r,r0
	jsr	pc,putc
	mov	$'#,r0
	jsr	pc,putc

/ at origin, read pathname,
/ spread out in array 'names', one
/ component every 14 bytes.
	mov	$names,r1
1:
	mov	r1,r2
2:
	jsr	pc,getc
	cmp	r0,$'\n
	bne	4f
	cmp	r1,r2
	beq	4b
	br	1f
4:
	cmp	r0,$'/
	beq	3f
	movb	r0,(r2)+
	br	2b
3:
	cmp	r1,r2
	beq	2b
	add	$14.,r1
	br	1b

/ now start reading the inodes
/ starting at the root and
/ going through directories
1:
	mov	$names,r1
	mov	$2,r0
1:
	clr	bno
	jsr	pc,iget
	tst	(r1)
	beq	1f
2:
	jsr	pc,rmblk
		br start
	mov	$buf,r2
3:
	mov	r1,r3
	mov	r2,r4
	add	$16.,r2
	tst	(r4)+
	beq	5f
4:
	cmpb	(r3)+,(r4)+
	bne	5f
	cmp	r4,r2
	blo	4b
	mov	-16.(r2),r0
	add	$14.,r1
	br	1b
5:
	cmp	r2,$buf+512.
	blo	3b
	br	2b

/ read file into core until
/ a mapping error, (no disk address)
1:
	clr	r1
1:
	jsr	pc,rmblk
		br 1f
	mov	$buf,r2
2:
	mov	(r2)+,(r1)+
	cmp	r2,$buf+512.
	blo	2b
	br	1b
/ relocate core around
/ assembler header
1:
	clr	r0
	cmp	(r0),$407
	bne	2f
1:
	mov	20(r0),(r0)+
	cmp	r0,sp
	blo	1b
/ enter program and
/ restart if return
2:
	clr	pc

/ get the inode specified in r0
iget:
	add	$15.,r0
	mov	r0,r5
	ash	$-3.,r0
	bic	$!17777,r0
	mov	r0,dno
	clr	r0
	jsr	pc,rblk
	bic	$!7,r5
	ash	$6,r5
	add	$buf,r5
	mov	$inod,r4
1:
	mov	(r5)+,(r4)+
	cmp	r4,$inod+64.
	blo	1b
	rts	pc

/ read a mapped block
/ offset in file is in bno.
/ skip if success, no skip if fail
/ the algorithm only handles a single
/ indirect block. that means that
/ files longer than 10+128 blocks cannot
/ be loaded.
rmblk:
	add	$2,(sp)
	mov	bno,r0
	cmp	r0,$10.
	blt	1f
	mov	$10.,r0
1:
	mov	r0,-(sp)
	asl	r0
	add	(sp)+,r0
	add	$addr+1,r0
	movb	(r0)+,dno
	movb	(r0)+,dno+1
	movb	-3(r0),r0
	bne	1f
	tst	dno
	beq	2f
1:
	jsr	pc,rblk
	mov	bno,r0
	inc	bno
	sub	$10.,r0
	blt	1f
	ash	$2,r0
	mov	buf+2(r0),dno
	mov	buf(r0),r0
	bne	rblk
	tst	dno
	bne	rblk
2:
	sub	$2,(sp)
1:
	rts	pc

/ rk06 & rk07 disk driver.
/ low order address in dno,
/ high order in r0.

hkcs1	= 177440
hkda	= hkcs1+6
hkcs2	= hkcs1+10
hkds	= hkcs1+12
hkdc	= hkcs1+20

rblk:
	mov	r1,-(sp)
	mov	dno,r1
	div	$22.*3.,r0
	mov	r0,*$hkdc
	clr	r0
	div	$22.,r0
	swab	r0
	bis	r1,r0
	mov	$hkda,r1
	mov	r0,(r1)
	mov	$buf,-(r1)
	mov	$-256.,-(r1)
	mov	dtcmd,-(r1)
1:
	tstb	(r1)
	bge	1b
	mov	(sp)+,r1
	rts	pc

tks = 177560
tkb = 177562
/ read and echo a teletype character
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	$'a-'A,r0
1:

tps = 177564
tpb = 177566
/ print a teletype character
putc:
	mov	r0,*$tpb
2:
	tstb	*$tps
	bge	2b
	cmp	r0,$'\r
	bne	1f
	mov	$'\n,r0
	br	putc
1:
	rts	pc

end:
inod = ..-1024.
addr = inod+12.
buf = inod+64.
bno = buf+512.
dtcmd = bno+2
dno = dtcmd+2
names = dno+2