Commit | Line | Data |
---|---|---|
71b1fc7a SL |
1 | /* hpboot.c 4.1 83/02/16 */ |
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 | bicpsw $2 | |
80 | jbr clear | |
81 | rperr: | |
82 | halt | |
83 | /* clear core and execute program */ | |
84 | clear: | |
85 | movl $PROGSIZE,r3 | |
86 | clrcor: | |
87 | clrq (r3) | |
88 | acbl $RELOC,$8,r3,clrcor | |
89 | /* run loaded program */ | |
90 | clrl r10 /* major("/dev/hp0a") */ | |
91 | calls $0,*$0 | |
92 | brw start2 | |
93 | ||
94 | .align 2 | |
95 | physMBA: | |
96 | .long 0 | |
97 | .long 0x20010000 | |
98 | .long 0xf28000 | |
99 | ||
100 | end: |