xref: /original-bsd/sys/vax/mdec/hpboot.c (revision 39c8fdd5)
1 /*	hpboot.c	6.1	83/07/29	*/
2 
3 /*
4  * RP??/RM?? 1st level boot program: loads next 7.5Kbytes from
5  * boot sector of file system and sets it up to run.
6  * Always reads from drive 0.
7  */
8 	.set	BOOTSIZE,15		/* size of boot in sectors */
9 	.set	RELOC,0x70000
10 /* MBA registers */
11 	.set	M_cr,4			/* MBA control reg */
12 	.set	M_var,12		/* MBA virt addr reg */
13 	.set	M_bc,16			/* MBA byte count reg */
14 	.set	M_map,0x800		/* start of MBA map reg's */
15 	.set	MBAinit,1		/* MBA init bit in MBA control reg */
16 /* Drive information */
17 	.set	RP,0x400		/* start of drive registers */
18 	.set	RP_cr,RP+0		/* control status register */
19 	.set	RP_sr,RP+4		/* drive status reg */
20 	.set	RP_stk,RP+0x14		/* desired track/sector reg */
21 	.set	RP_dt,RP+0x18		/* drive type reg */
22 	.set	RP_off,RP+0x24		/* RP offset reg */
23 	.set	RP_cyl,RP+0x28		/* desired cyl reg */
24 	.set	RPBPSECT,512		/* bytes per sector */
25 /* RP?? function codes, status bits  */
26 	.set	RP_GO,1			/* go */
27 	.set	RP_RED,070		/* read */
28 	.set	RP_DC,010		/* drive clear */
29 	.set	RP_RIP,020		/* read in preset */
30 	.set	RP_FMT,0x1000		/* format 22 */
31 	.set	RP_MOL,0x1000		/* medium on line */
32 	.set	RP_DRY,0200		/* drive ready */
33 	.set	RP_ERR,040000		/* composite error */
34 	.set	RP_pDRY,7		/* bit position of RP_DRY */
35 	.set	RP_pERR,14		/* bit position of RP_ERR */
36 
37 init:
38 	.word	0			/* entry mask for DEC monitor */
39 	nop;nop;nop;nop;nop;nop;nop;nop	/* some no-ops for 750 boot to skip */
40 	nop;nop;
41 start:
42 	movl	r5,r11
43 	movl	$RELOC,sp
44 	moval	init,r6
45 	movc3	$end,(r6),(sp)
46 	jmp	*$RELOC+start1
47 /* running relocated */
48 start1:
49 /* get cpu type */
50 	.set	SID,0x3e
51 	mfpr	$SID,r0
52 	extzv	$24,$8,r0,r0
53 	ashl	$2,r0,r1
54 /* get mba location and init it */
55 	moval	physMBA,r2
56 	addl3	r1,r2,r3
57 	movl	(r3),r9
58 	movl	$MBAinit,M_cr(r9)
59 /* read-in-preset the drive and set format */
60 	movl	$RP_RIP+RP_GO,RP_cr(r9)
61 	movl	$RP_FMT,RP_off(r9)
62 
63 	.set	PROGSIZE,(BOOTSIZE*RPBPSECT)
64 start2:
65 	movl	$0,RP_cyl(r9)
66 	movl	$1,RP_stk(r9)
67 	movl	$-PROGSIZE,M_bc(r9)
68 /* set up MASSBUS map for DMA */
69 	clrl	r0
70 1:
71 	bisl3	$0x80000000,r0,M_map(r9)[r0]
72 	aobleq	$BOOTSIZE,r0,1b
73 	clrl	M_var(r9)
74 	movl	$RP_RED+RP_GO,RP_cr(r9)
75 rprdy:
76 	movl	RP_sr(r9),r0
77 	bbc	$RP_pDRY,r0,rprdy
78 	bbs	$RP_pERR,r0,rperr
79 	clrl	r3
80 /* Eagle's are too fast for the controller. Slow the thing down. */
81 buzz:	acbl	$2000,$1,r3,buzz
82 	bicpsw	$2
83 	jbr	clear
84 rperr:
85 	halt
86 /* clear core and execute program */
87 clear:
88 	movl	$PROGSIZE,r3
89 clrcor:
90 	clrq	(r3)
91 	acbl	$RELOC,$8,r3,clrcor
92 /* run loaded program */
93 	clrl	r10			/* major("/dev/hp0a") */
94 	calls	$0,*$0
95 	brw	start2
96 
97 	.align	2
98 physMBA:
99 	.long	0
100 	.long	0x20010000
101 	.long	0xf28000
102 
103 end:
104