Commit | Line | Data |
---|---|---|
92e67171 | 1 | /* hkboot.c 6.1 83/07/29 */ |
405a2f58 SL |
2 | |
3 | /* | |
4 | * RK07 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 RELOC,0x50000 | |
9 | .set BOOTSIZE,15 /* size of boot in sectors */ | |
10 | .set SID,62 /* system ID register */ | |
11 | /* UBA registers */ | |
12 | .set UBA_CNFGR,0 /* UBA configuration register */ | |
13 | .set UBA_CR,4 /* UBA control register offset */ | |
14 | .set UBA_MAP,0x800 /* UBA offset to map reg's */ | |
15 | .set UBAinit,1 /* UBA init bit in UBA control reg */ | |
16 | .set pUBIC,16 /* Unibus init complete */ | |
17 | /* RK611 registers and bits */ | |
18 | .set HK,0177440-0160000 /* address of RK611 */ | |
19 | .set HK_cs1,HK+0 /* control and status */ | |
20 | .set HK_wc,HK+2 /* word count */ | |
21 | .set HK_ba,HK+4 /* bus address */ | |
22 | .set HK_da,HK+6 /* disk address */ | |
23 | .set HK_dc,HK+020 /* desired cylinder */ | |
24 | .set HKBPSECT,512 /* bytes per sector */ | |
25 | .set HK_GO,1 /* go bit */ | |
26 | .set HK_PACK,2 /* pack acknowledge */ | |
27 | .set HK_RCOM,020 /* read command */ | |
28 | .set HK_SEL7,02000 /* select RK07 disk */ | |
29 | .set HK_pRDY,7 /* position of ready bit */ | |
30 | .set HK_pERR,15 /* position of error bit */ | |
31 | ||
32 | init: | |
33 | /* r9 UBA address */ | |
34 | /* r10 umem addr */ | |
35 | .word 0 /* entry mask for dec monitor */ | |
36 | nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */ | |
37 | nop;nop; | |
38 | /* get cpu type and find the first uba */ | |
39 | mfpr $SID,r0 | |
40 | extzv $24,$8,r0,r0 /* get cpu type */ | |
41 | ashl $2,r0,r1 | |
42 | movab physUBA,r2 /* get physUBA[cpu] */ | |
43 | addl2 r1,r2 | |
44 | movl (r2),r9 | |
45 | movab physUMEM,r2 /* get physUMEM[cpu] */ | |
46 | addl2 r1,r2 | |
47 | movl (r2),r10 | |
48 | /* if 780, init uba */ | |
49 | cmpl r0,$1 | |
50 | bneq 2f | |
51 | movl $UBAinit,UBA_CR(r9) | |
52 | 1: | |
53 | bbc $pUBIC,UBA_CNFGR(r9),1b | |
54 | 2: | |
55 | /* init rk611, set vv in drive 0; if any errors, give up */ | |
56 | movw $HK_SEL7+HK_GO,HK_cs1(r10) | |
57 | 1: | |
58 | movw HK_cs1(r10),r0 | |
59 | bbc $HK_pRDY,r0,1b | |
60 | bbs $HK_pERR,r0,9f | |
61 | movw $HK_SEL7+HK_PACK+HK_GO,HK_cs1(r10) | |
62 | 1: | |
63 | movw HK_cs1(r10),r0 | |
64 | bbc $HK_pRDY,r0,1b | |
65 | bbc $HK_pERR,r0,start | |
66 | 9: | |
67 | halt | |
68 | /* relocate to high core */ | |
69 | start: | |
70 | movl r5,r11 /* boot flags */ | |
71 | movl $RELOC,sp | |
72 | moval init,r6 | |
73 | movc3 $end,(r6),(sp) | |
74 | jmp *$RELOC+start2 | |
75 | /* now running relocated */ | |
76 | /* bring in the boot program */ | |
77 | .set PROGSIZE,(BOOTSIZE*HKBPSECT) | |
78 | start2: | |
79 | movw $0,HK_dc(r10) | |
80 | movw $1,HK_da(r10) | |
81 | movw $-PROGSIZE/2,HK_wc(r10) | |
82 | clrl r0 | |
83 | 1: | |
84 | bisl3 $0x80000000,r0,UBA_MAP(r9) | |
85 | addl2 $4,r9 | |
86 | aobleq $BOOTSIZE,r0,1b | |
87 | clrw HK_ba(r10) | |
88 | movw $HK_SEL7+HK_RCOM+HK_GO,HK_cs1(r10) | |
89 | hkrdy: | |
90 | movw HK_cs1(r10),r0 | |
91 | bbc $HK_pRDY,r0,hkrdy | |
92 | bbs $HK_pERR,r0,hkerr | |
93 | brw done | |
94 | hkerr: | |
95 | halt /* ungraceful */ | |
96 | done: | |
97 | movl $PROGSIZE,r3 | |
98 | clrcor: | |
99 | clrq (r3) | |
100 | acbl $RELOC,$8,r3,clrcor | |
101 | /* start loaded program */ | |
102 | movl $3,r10 /* major("/dev/hk0a") */ | |
103 | calls $0,*$0 | |
104 | brw start2 | |
105 | physUBA: | |
106 | .long 0 | |
107 | .long 0x20006000 /* 11/780 */ | |
108 | .long 0xf30000 /* 11/750 */ | |
109 | .long 0xf26000 /* 11/730 */ | |
110 | physUMEM: | |
111 | .long 0 | |
112 | .long 0x2013e000 /* 11/780 */ | |
113 | .long 0xffe000 /* 11/750 */ | |
114 | .long 0xffe000 /* 11/730 */ | |
115 | end: |