xref: /csrg-svn/sys/vax/mdec/hpboot.c (revision 29801)
123142Smckusick /*
226875Skarels  * Copyright (c) 1980,1986 Regents of the University of California.
323142Smckusick  * All rights reserved.  The Berkeley software License Agreement
423142Smckusick  * specifies the terms and conditions for redistribution.
523142Smckusick  */
611089Ssam 
7*29801Skarels /* "@(#)hpboot.c	7.2 (Berkeley) 08/28/86" */
8*29801Skarels #include <sys/disklabel.h>
923142Smckusick 
1023142Smckusick 
1111089Ssam /*
1211089Ssam  * RP??/RM?? 1st level boot program: loads next 7.5Kbytes from
1326875Skarels  * boot sectors of file system and sets it up to run.
1426875Skarels  * Reads from the controller and drive passed in from the boot
1526875Skarels  * rom.
1626875Skarels  *   R1:  address of the boot device's adapter
1726875Skarels  *   R2:  controller number of the boot device
1826875Skarels  *   R3:  unit number of the boot device
1926875Skarels  *   R5:  software boot control flags
2026875Skarels  *   R6:  address of driver subroutine from ROM
2126875Skarels  *   SP:  base address of usable memory + 0x200
2211089Ssam  */
2311089Ssam 	.set	BOOTSIZE,15		/* size of boot in sectors */
2411089Ssam 	.set	RELOC,0x70000
2511089Ssam /* MBA registers */
2611089Ssam 	.set	M_cr,4			/* MBA control reg */
2726875Skarels 	.set	M_sr,8			/* MBA status reg */
2811089Ssam 	.set	M_var,12		/* MBA virt addr reg */
2911089Ssam 	.set	M_bc,16			/* MBA byte count reg */
3011089Ssam 	.set	M_map,0x800		/* start of MBA map reg's */
3111089Ssam 	.set	MBAinit,1		/* MBA init bit in MBA control reg */
3226875Skarels 	.set	MBABUSY,0x80000000	/* MBA SR: data transfer busy */
3326875Skarels 	.set	pMBABUSY,31		/* bit position of  MBABUSY */
3411089Ssam /* Drive information */
3511089Ssam 	.set	RP,0x400		/* start of drive registers */
3626875Skarels 	.set	RPDR,0x80		/* offset per drive unit */
3726875Skarels 	.set	RP_cr,0			/* control status register */
3826875Skarels 	.set	RP_sr,4			/* drive status reg */
3926875Skarels 	.set	RP_stk,0x14		/* desired track/sector reg */
4026875Skarels 	.set	RP_dt,0x18		/* drive type reg */
4126875Skarels 	.set	RP_off,0x24		/* RP offset reg */
4226875Skarels 	.set	RP_cyl,0x28		/* desired cyl reg */
4311089Ssam 	.set	RPBPSECT,512		/* bytes per sector */
4411089Ssam /* RP?? function codes, status bits  */
4511089Ssam 	.set	RP_GO,1			/* go */
4611089Ssam 	.set	RP_RED,070		/* read */
4711089Ssam 	.set	RP_DC,010		/* drive clear */
4811089Ssam 	.set	RP_RIP,020		/* read in preset */
4911089Ssam 	.set	RP_FMT,0x1000		/* format 22 */
5011089Ssam 	.set	RP_MOL,0x1000		/* medium on line */
5111089Ssam 	.set	RP_DRY,0200		/* drive ready */
5211089Ssam 	.set	RP_ERR,040000		/* composite error */
5311089Ssam 	.set	RP_pDRY,7		/* bit position of RP_DRY */
5411089Ssam 	.set	RP_pERR,14		/* bit position of RP_ERR */
5511089Ssam 
5611089Ssam init:
5711089Ssam 	.word	0			/* entry mask for DEC monitor */
5811089Ssam 	nop;nop;nop;nop;nop;nop;nop;nop	/* some no-ops for 750 boot to skip */
5911089Ssam 	nop;nop;
6011089Ssam start:
6126875Skarels 	clrl	r10			/* major("/dev/hp0a") */
6226875Skarels 	extzv	$13,$2,r1,r4		/* get MBA number from R1 */
6326875Skarels 	insv	r4,$24,$8,r10		/* set MBA number */
6426875Skarels 	insv	r3,$16,$8,r10		/* drive number */
6526875Skarels 	extzv	$12,$4,r5,r4		/* get partition from r5 */
6626875Skarels 	bicw2	$0xf000,r5		/* remove from r5 */
6726875Skarels 	insv	r4,$8,$4,r10		/* set partition */
6811089Ssam 	movl	r5,r11
6926875Skarels 	movl	r1,r9			/* save adaptor address */
7026875Skarels 	movl	r3,r8			/* and unit number */
71*29801Skarels 	brw	start0
72*29801Skarels 
73*29801Skarels /*
74*29801Skarels  * Leave space for pack label.
75*29801Skarels  */
76*29801Skarels pad:
77*29801Skarels 	.space	LABELOFFSET - (pad - init)
78*29801Skarels packlabel:
79*29801Skarels 	.space	d_end_
80*29801Skarels 
81*29801Skarels start0:
8211089Ssam 	movl	$RELOC,sp
8311089Ssam 	moval	init,r6
8411089Ssam 	movc3	$end,(r6),(sp)
8511089Ssam 	jmp	*$RELOC+start1
8611089Ssam /* running relocated */
8711089Ssam start1:
8811089Ssam 	movl	$MBAinit,M_cr(r9)
8911089Ssam /* read-in-preset the drive and set format */
9026875Skarels 	mull2	$RPDR,r8
9126875Skarels 	movab	RP(r9)[r8],r8
9226875Skarels 	movl	$RP_RIP+RP_GO,RP_cr(r8)
9326875Skarels 	movl	$RP_FMT,RP_off(r8)
9411089Ssam 
9511089Ssam 	.set	PROGSIZE,(BOOTSIZE*RPBPSECT)
9611089Ssam start2:
9726875Skarels 	movl	$0,RP_cyl(r8)
9826875Skarels 	movl	$1,RP_stk(r8)
9911089Ssam 	movl	$-PROGSIZE,M_bc(r9)
10011089Ssam /* set up MASSBUS map for DMA */
10111089Ssam 	clrl	r0
10211089Ssam 1:
10311089Ssam 	bisl3	$0x80000000,r0,M_map(r9)[r0]
10411089Ssam 	aobleq	$BOOTSIZE,r0,1b
10511089Ssam 	clrl	M_var(r9)
10626875Skarels 	movl	$RP_RED+RP_GO,RP_cr(r8)
10711089Ssam rprdy:
10826875Skarels 	movl	RP_sr(r8),r0
10911089Ssam 	bbc	$RP_pDRY,r0,rprdy
11011089Ssam 	bbs	$RP_pERR,r0,rperr
11126875Skarels rprdy2:
11226875Skarels 	bbs	$pMBABUSY,M_sr(r9),rprdy2
11326875Skarels 
11426875Skarels /* Eagles are too fast for the controller. Slow the thing down. */
11526875Skarels /* (May not be needed with wait for mba above.) */
11611319Ssam 	clrl	r3
11711319Ssam buzz:	acbl	$2000,$1,r3,buzz
11811089Ssam 	bicpsw	$2
11911089Ssam 	jbr	clear
12011089Ssam rperr:
12111089Ssam 	halt
12211089Ssam /* clear core and execute program */
12311089Ssam clear:
12411089Ssam 	movl	$PROGSIZE,r3
12511089Ssam clrcor:
12611089Ssam 	clrq	(r3)
12711089Ssam 	acbl	$RELOC,$8,r3,clrcor
12811089Ssam /* run loaded program */
12911089Ssam 	calls	$0,*$0
13011089Ssam 	brw	start2
13111089Ssam 
13211089Ssam end:
133