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