|
|
1.1 root 1: /*
2: * RP??/RM?? disk boot program to load "/boot" from
3: * a UNIX filesystem (starting at block 1 on pack on
4: * drive 0) into low core and to execute that file.
5: * This program can only read regular small version 7 files
6: * from the root of a UNIX filesystem.
7: */
8: .set BLKSIZ,1024 /* file system block size */
9: .set RELOC,0x70000
10: .set HDRSIZ,040
11: .set INOSIZ,64 /* no. bytes/inode entry */
12: .set INOBLK,BLKSIZ/INOSIZ /* no. inodes/disc block */
13: .set INOMSK,0xfffffff0 /* changes with inode size */
14: .set NAMSIZ,14 /* bytes in directory name */
15: .set ENTADR,024 /* offset to entry addr in a.out */
16: .set DIRSIZ,16 /* size of directory entry, bytes */
17: .set ROOTINO,2 /* root dir inode no. */
18: .set NBOO,1
19: .set NSUP,1
20: /* MBA registers */
21: .set M_cr,4 /* MBA control reg */
22: .set M_var,12 /* MBA virt addr reg */
23: .set M_bc,16 /* MBA byte count reg */
24: .set M_map,0x800 /* start of MBA map reg's */
25: .set MBAinit,1 /* MBA init bit in MBA control reg */
26: /* Drive information */
27: .set RP6TRK,19
28: .set RP6SEC,22
29: .set RM3SEC,32
30: .set RM3TRK,5
31: .set RM5SEC,32
32: .set RM5TRK,19
33: .set RM80SEC,31
34: .set RM80TRK,14
35: .set RP7TRK,32
36: .set RP7SEC,50
37: .set RP6typ,022
38: .set RM3typ,024
39: .set RM5typ,027
40: .set RM80typ,026
41: .set RP7typ,042
42: .set RP,0x400 /* start of drive registers */
43: .set RP_cr,RP+0 /* control status register */
44: .set RP_sr,RP+4 /* drive status reg */
45: .set RP_stk,RP+0x14 /* desired track/sector reg */
46: .set RP_dt,RP+0x18 /* drive type reg */
47: .set RP_off,RP+0x24 /* RP offset reg */
48: .set RP_cyl,RP+0x28 /* desired cyl reg */
49: /* RP06 function codes, status bits */
50: .set RP_GO,1 /* go */
51: .set RP_RED,070 /* read */
52: .set RP_DC,010 /* drive clear */
53: .set RP_RIP,020 /* read in preset */
54: .set RP_FMT,0x1000 /* format 22 */
55: .set RP_MOL,0x1000 /* medium on line */
56: .set RP_DRY,0200 /* drive ready */
57: .set RP_ERR,040000 /* composite error */
58: .set RP_pDRY,7 /* bit position of RP_DRY */
59: .set RP_pERR,14 /* bit position of RP_ERR */
60:
61: init:
62: .word 0 /* entry mask for DEC monitor */
63: nop;nop;nop;nop;nop;nop;nop;nop /* some no-ops for 750 boot to skip */
64: nop;nop;
65: start:
66: movl r5,r11
67: movl $RELOC,sp
68: moval init,r6
69: movc3 $end,(r6),(sp)
70: jmp *$RELOC+start1
71: /* running relocated */
72: start1:
73: /* get cpu type */
74: .set SID,0x3e
75: mfpr $SID,r0
76: extzv $24,$8,r0,r0
77: ashl $2,r0,r1
78: /* get mba location and init it */
79: moval physMBA,r2
80: addl3 r1,r2,r3
81: movl (r3),r9
82: movl $MBAinit,M_cr(r9)
83: /* read-in-preset the drive and set format */
84: movl $RP_RIP+RP_GO,RP_cr(r9)
85: movl $RP_FMT,RP_off(r9)
86: /* get drive type */
87: movl RP_dt(r9),r0
88: cmpb $RP6typ,r0; bneq 1f; movzwl $(RP6SEC<<8)|RP6TRK,r1; 1:
89: cmpb $RM3typ,r0; bneq 1f; movzwl $(RM3SEC<<8)|RM3TRK,r1; 1:
90: cmpb $RM5typ,r0; bneq 1f; movzwl $(RM5SEC<<8)|RM5TRK,r1; 1:
91: cmpb $RM80typ,r0; bneq 1f; movzwl $(RM80SEC<<8)|RM80TRK,r1; 1:
92: cmpb $RP7typ,r0; bneq 1f; movzwl $(RP7SEC<<8)|RP7TRK,r1; 1:
93: movzbl r1,*$rptrk
94: ashl $-8,r1,r1
95: movzbl r1,*$rpsec
96: mull3 *$rpsec,*$rptrk,*$rpst
97: start2:
98: /* search for ``boot'' program in root inode */
99: movl $names+RELOC,r6
100: movzbl $ROOTINO,r0
101: nxti:
102: clrw *$bno
103: bsbw iget
104: tstb (r6)
105: beql getfil
106: get1b:
107: bsbw rmblk
108: beql start2
109: movl $buf,r7
110: nxtent:
111: tstw (r7)
112: beql dirchk
113: cmpc3 $NAMSIZ,(r6),2(r7)
114: bneq dirchk
115: movzwl (r7),r0
116: addl2 $NAMSIZ,r6
117: brb nxti
118: dirchk:
119: acbl $buf+BLKSIZ-1,$DIRSIZ,r7,nxtent
120: brb get1b
121: /* found inode, get desired file */
122: getfil:
123: clrl bufptr
124: getlop:
125: bsbb rmblk
126: beql clear
127: addl2 $BLKSIZ,bufptr
128: brb getlop
129: /* clear core and execute program */
130: clear:
131: movl *$size,r3
132: clrcor:
133: clrq (r3)
134: acbl $RELOC,$8,r3,clrcor
135: /* run loaded program */
136: clrl r10 /* major("/dev/hp0a") */
137: calls $0,*$0
138: brw start2
139: /* iget: get inode whose number is in r0 */
140: iget:
141: addl3 $(INOBLK*(NBOO+NSUP))-1,r0,r8
142: divl3 $INOBLK,r8,r4
143: bsbw rblk
144: bicl2 $INOMSK,r8
145: mull2 $INOSIZ,r8
146: addl2 $buf,r8
147: movc3 $time-inode,(r8),*$inode
148: rsb
149: /* rmblk: read block bno into addr */
150: rmblk:
151: movzwl *$bno,r0
152: addw2 $3,*$bno
153: addl2 $addr,r0
154: /* this boot assumes only small files (<=20 blocks) */
155: extzv $0,$24,(r0),r4
156: bneq rblk
157: rsb
158: /* rblk: read block in r4 */
159: rblk:
160: mull2 $BLKSIZ/512,r4
161: clrl r5
162: ediv *$rpst,r4,RP_cyl(r9),r1
163: clrl r2
164: ediv *$rpsec,r1,r1,r0
165: insv r1,$8,$5,r0
166: movl r0,RP_stk(r9)
167: movl $-BLKSIZ,M_bc(r9)
168: ashl $-9,bufptr,r0
169: bisl3 $0x80000000,r0,M_map(r9)
170: incl r0
171: bisl3 $0x80000000,r0,M_map+4(r9)
172: clrl M_var(r9)
173: movl $RP_RED+RP_GO,RP_cr(r9)
174: rprdy:
175: movl RP_sr(r9),r0
176: bbc $RP_pDRY,r0,rprdy
177: bbs $RP_pERR,r0,rperr
178: bicpsw $2
179: rsb
180: rperr:
181: halt
182:
183: bufptr: .long buf
184: names:
185: .byte 'b,'o,'o,'t,0,0,0,0,0,0,0,0,0,0
186: .byte 0
187:
188: .align 2
189: physMBA:
190: .long 0
191: .long 0x20010000
192: .long 0xf28000
193:
194: end:
195: .set buf,RELOC-1536
196: .set inode,RELOC-512
197: .set mode,inode
198: .set nlink,mode+2
199: .set uid,nlink+2
200: .set gid,uid+2
201: .set size,gid+2
202: .set addr,size+4
203: .set time,addr+40
204: .set bno,time+12
205: .set rptrk,bno+4
206: .set rpsec,rptrk+4
207: .set rpst,rpsec+4
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.