V8/usr/sys/boot/bb/hpboot.s

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

/*
 * RP??/RM?? disk boot program to load "/boot" from
 * a UNIX filesystem (starting at block 1 on pack on
 * drive 0) into low core and to execute that file.
 * This program can only read regular small version 7 files
 * from the root of a UNIX filesystem.
 */
	.set	BLKSIZ,1024		/* file system block size */
	.set	RELOC,0x70000
	.set	HDRSIZ,040
	.set	INOSIZ,64		/* no. bytes/inode entry */
	.set	INOBLK,BLKSIZ/INOSIZ	/* no. inodes/disc block */
	.set	INOMSK,0xfffffff0	/* changes with inode size */
	.set	NAMSIZ,14		/* bytes in directory name */
	.set	ENTADR,024		/* offset to entry addr in a.out */
	.set	DIRSIZ,16		/* size of directory entry, bytes */
	.set	ROOTINO,2		/* root dir inode no. */
	.set	NBOO,1
	.set	NSUP,1
/* MBA registers */
	.set	M_cr,4			/* MBA control reg */
	.set	M_var,12		/* MBA virt addr reg */
	.set	M_bc,16			/* MBA byte count reg */
	.set	M_map,0x800		/* start of MBA map reg's */
	.set	MBAinit,1		/* MBA init bit in MBA control reg */
/* Drive information */
	.set	RP6TRK,19
	.set	RP6SEC,22
	.set	RM3SEC,32
	.set	RM3TRK,5
	.set	RM5SEC,32
	.set	RM5TRK,19
	.set	RM80SEC,31
	.set	RM80TRK,14
	.set	RP7TRK,32
	.set	RP7SEC,50
	.set	RP6typ,022
	.set	RM3typ,024
	.set	RM5typ,027
	.set	RM80typ,026
	.set	RP7typ,042
	.set	RP,0x400		/* start of drive registers */
	.set	RP_cr,RP+0		/* control status register */
	.set	RP_sr,RP+4		/* drive status reg */
	.set	RP_stk,RP+0x14		/* desired track/sector reg */
	.set	RP_dt,RP+0x18		/* drive type reg */
	.set	RP_off,RP+0x24		/* RP offset reg */
	.set	RP_cyl,RP+0x28		/* desired cyl reg */
/*  RP06 function codes, status bits  */
	.set	RP_GO,1			/* go */
	.set	RP_RED,070		/* read */
	.set	RP_DC,010		/* drive clear */
	.set	RP_RIP,020		/* read in preset */
	.set	RP_FMT,0x1000		/* format 22 */
	.set	RP_MOL,0x1000		/* medium on line */
	.set	RP_DRY,0200		/* drive ready */
	.set	RP_ERR,040000		/* composite error */
	.set	RP_pDRY,7		/* bit position of RP_DRY */
	.set	RP_pERR,14		/* bit position of RP_ERR */

init:
	.word	0			/* entry mask for DEC monitor */
	nop;nop;nop;nop;nop;nop;nop;nop	/* some no-ops for 750 boot to skip */
	nop;nop;
start:
	movl	r5,r11
	movl	$RELOC,sp
	moval	init,r6
	movc3	$end,(r6),(sp)
	jmp	*$RELOC+start1
/* running relocated */
start1:
/* get cpu type */
	.set	SID,0x3e
	mfpr	$SID,r0
	extzv	$24,$8,r0,r0
	ashl	$2,r0,r1
/* get mba location and init it */
	moval	physMBA,r2
	addl3	r1,r2,r3
	movl	(r3),r9
	movl	$MBAinit,M_cr(r9)
/* read-in-preset the drive and set format */
	movl	$RP_RIP+RP_GO,RP_cr(r9)
	movl	$RP_FMT,RP_off(r9) 
/* get drive type */
	movl	RP_dt(r9),r0
	cmpb	$RP6typ,r0; bneq 1f; movzwl $(RP6SEC<<8)|RP6TRK,r1; 1:
	cmpb	$RM3typ,r0; bneq 1f; movzwl $(RM3SEC<<8)|RM3TRK,r1; 1:
	cmpb	$RM5typ,r0; bneq 1f; movzwl $(RM5SEC<<8)|RM5TRK,r1; 1:
	cmpb	$RM80typ,r0; bneq 1f; movzwl $(RM80SEC<<8)|RM80TRK,r1; 1:
	cmpb	$RP7typ,r0; bneq 1f; movzwl $(RP7SEC<<8)|RP7TRK,r1; 1:
	movzbl	r1,*$rptrk
	ashl	$-8,r1,r1
	movzbl	r1,*$rpsec
	mull3	*$rpsec,*$rptrk,*$rpst
start2:
/* search for ``boot'' program in root inode */
	movl	$names+RELOC,r6
	movzbl	$ROOTINO,r0
nxti:
	clrw	*$bno
	bsbw	iget
	tstb	(r6)
	beql	getfil
get1b:
	bsbw	rmblk
	beql	start2
	movl	$buf,r7
nxtent:
	tstw	(r7)
	beql	dirchk
	cmpc3	$NAMSIZ,(r6),2(r7)
	bneq	dirchk
	movzwl	(r7),r0
	addl2	$NAMSIZ,r6
	brb	nxti
dirchk:
	acbl	$buf+BLKSIZ-1,$DIRSIZ,r7,nxtent
	brb	get1b
/* found inode, get desired file */
getfil:
	clrl	bufptr
getlop:
	bsbb	rmblk
	beql	clear
	addl2	$BLKSIZ,bufptr
	brb	getlop
/* clear core and execute program */
clear:
	movl	*$size,r3
clrcor:
	clrq	(r3)
	acbl	$RELOC,$8,r3,clrcor
/* run loaded program */
	clrl	r10			/* major("/dev/hp0a") */
	calls	$0,*$0
	brw	start2
/* iget: get inode whose number is in r0 */
iget:
	addl3	$(INOBLK*(NBOO+NSUP))-1,r0,r8
	divl3	$INOBLK,r8,r4
	bsbw	rblk
	bicl2	$INOMSK,r8
	mull2	$INOSIZ,r8
	addl2	$buf,r8
	movc3	$time-inode,(r8),*$inode
	rsb
/* rmblk: read block bno into addr */
rmblk:
	movzwl	*$bno,r0
	addw2	$3,*$bno
	addl2	$addr,r0
/*  this boot assumes only small files (<=20 blocks) */
	extzv	$0,$24,(r0),r4
	bneq	rblk
	rsb
/* rblk: read block in r4 */
rblk:
	mull2	$BLKSIZ/512,r4
	clrl	r5
	ediv	*$rpst,r4,RP_cyl(r9),r1
	clrl	r2
	ediv	*$rpsec,r1,r1,r0
	insv	r1,$8,$5,r0
	movl	r0,RP_stk(r9)
	movl	$-BLKSIZ,M_bc(r9)
	ashl	$-9,bufptr,r0
	bisl3	$0x80000000,r0,M_map(r9)
	incl	r0
	bisl3	$0x80000000,r0,M_map+4(r9)
	clrl	M_var(r9)
	movl	$RP_RED+RP_GO,RP_cr(r9)
rprdy:
	movl	RP_sr(r9),r0
	bbc	$RP_pDRY,r0,rprdy
	bbs	$RP_pERR,r0,rperr
	bicpsw	$2
	rsb
rperr:
	halt

bufptr:  .long  buf
names:
	.byte	'b,'o,'o,'t,0,0,0,0,0,0,0,0,0,0
	.byte  0

	.align	2
physMBA:
	.long	0
	.long	0x20010000
	.long	0xf28000

end:
	.set	buf,RELOC-1536
	.set	inode,RELOC-512
	.set	mode,inode
	.set	nlink,mode+2
	.set	uid,nlink+2
	.set	gid,uid+2
	.set	size,gid+2
	.set	addr,size+4
	.set	time,addr+40
	.set	bno,time+12
	.set	rptrk,bno+4
	.set	rpsec,rptrk+4
	.set	rpst,rpsec+4