Commit | Line | Data |
---|---|---|
736d93cd KT |
1 | / disk boot program to load and transfer |
2 | / to a unix entry | |
3 | ||
4 | / entry is made by jsr pc,*$0 | |
5 | / so return can be rts pc | |
6 | ||
7 | core = 28. | |
8 | .. = [core*2048.]-512. | |
9 | ||
10 | / establish sp and check if running below | |
11 | / intended origin, if so, copy | |
12 | / program up to 'core' K words. | |
13 | start: | |
14 | mov $..,sp | |
15 | mov sp,r1 | |
16 | cmp pc,r1 | |
17 | bhis 2f | |
18 | clr r0 | |
19 | cmp (r0),$407 | |
20 | bne 1f | |
21 | mov $20,r0 | |
22 | 1: | |
23 | mov (r0)+,(r1)+ | |
24 | cmp r1,$end | |
25 | blo 1b | |
26 | jmp (sp) | |
27 | ||
28 | / clear core to make things clean | |
29 | 2: | |
30 | clr (r0)+ | |
31 | cmp r0,sp | |
32 | blo 2b | |
33 | ||
34 | / at origin, read pathname, | |
35 | / initialize rp | |
36 | ||
37 | clr *$rpcs / selects drive zero | |
38 | / spread out in array 'names', one | |
39 | / component every 14 bytes. | |
40 | mov $names,r1 | |
41 | 1: | |
42 | mov r1,r2 | |
43 | 2: | |
44 | jsr pc,getc | |
45 | cmp r0,$'\n | |
46 | beq 1f | |
47 | cmp r0,$'/ | |
48 | beq 3f | |
49 | movb r0,(r2)+ | |
50 | br 2b | |
51 | 3: | |
52 | cmp r1,r2 | |
53 | beq 2b | |
54 | add $14.,r1 | |
55 | br 1b | |
56 | ||
57 | / now start reading the inodes | |
58 | / starting at the root and | |
59 | / going through directories | |
60 | 1: | |
61 | mov $names,r1 | |
62 | mov $2,r0 | |
63 | 1: | |
64 | clr bno | |
65 | jsr pc,iget | |
66 | tst (r1) | |
67 | beq 1f | |
68 | 2: | |
69 | jsr pc,rmblk | |
70 | br start | |
71 | mov $buf,r2 | |
72 | 3: | |
73 | mov r1,r3 | |
74 | mov r2,r4 | |
75 | add $16.,r2 | |
76 | tst (r4)+ | |
77 | beq 5f | |
78 | 4: | |
79 | cmpb (r3)+,(r4)+ | |
80 | bne 5f | |
81 | cmp r4,r2 | |
82 | blo 4b | |
83 | mov -16.(r2),r0 | |
84 | add $14.,r1 | |
85 | br 1b | |
86 | 5: | |
87 | cmp r2,$buf+512. | |
88 | blo 3b | |
89 | br 2b | |
90 | ||
91 | / read file into core until | |
92 | / a mapping error, (no disk address) | |
93 | 1: | |
94 | clr r1 | |
95 | 1: | |
96 | jsr pc,rmblk | |
97 | br 1f | |
98 | mov $buf,r2 | |
99 | 2: | |
100 | mov (r2)+,(r1)+ | |
101 | cmp r2,$buf+512. | |
102 | blo 2b | |
103 | br 1b | |
104 | / relocate core around | |
105 | / assembler header | |
106 | 1: | |
107 | clr r0 | |
108 | cmp (r0),$407 | |
109 | bne 2f | |
110 | 1: | |
111 | mov 20(r0),(r0)+ | |
112 | cmp r0,sp | |
113 | blo 1b | |
114 | / enter program and | |
115 | / restart if return | |
116 | 2: | |
117 | jsr pc,*$0 | |
118 | br start | |
119 | ||
120 | / get the inode specified in r0 | |
121 | iget: | |
122 | add $15.,r0 | |
123 | mov r0,r5 | |
124 | ash $-3.,r0 | |
125 | bic $!17777,r0 | |
126 | mov r0,dno | |
127 | clr r0 | |
128 | jsr pc,rblk | |
129 | bic $!7,r5 | |
130 | ash $6,r5 | |
131 | add $buf,r5 | |
132 | mov $inod,r4 | |
133 | 1: | |
134 | mov (r5)+,(r4)+ | |
135 | cmp r4,$inod+64. | |
136 | blo 1b | |
137 | rts pc | |
138 | ||
139 | / read a mapped block | |
140 | / offset in file is in bno. | |
141 | / skip if success, no skip if fail | |
142 | / the algorithm only handles a single | |
143 | / indirect block. that means that | |
144 | / files longer than 10+128 blocks cannot | |
145 | / be loaded. | |
146 | rmblk: | |
147 | add $2,(sp) | |
148 | mov bno,r0 | |
149 | cmp r0,$10. | |
150 | blt 1f | |
151 | mov $10.,r0 | |
152 | 1: | |
153 | mov r0,-(sp) | |
154 | asl r0 | |
155 | add (sp)+,r0 | |
156 | add $addr+1,r0 | |
157 | movb (r0)+,dno | |
158 | movb (r0)+,dno+1 | |
159 | movb -3(r0),r0 | |
160 | bne 1f | |
161 | tst dno | |
162 | beq 2f | |
163 | 1: | |
164 | jsr pc,rblk | |
165 | mov bno,r0 | |
166 | inc bno | |
167 | sub $10.,r0 | |
168 | blt 1f | |
169 | ash $2,r0 | |
170 | mov buf+2(r0),dno | |
171 | mov buf(r0),r0 | |
172 | bne rblk | |
173 | tst dno | |
174 | bne rblk | |
175 | 2: | |
176 | sub $2,(sp) | |
177 | 1: | |
178 | rts pc | |
179 | ||
180 | cyl = 0. | |
181 | read = 4 | |
182 | go = 1 | |
183 | ||
184 | rpcs = 176710 | |
185 | rpda = 176724 | |
186 | rpca = 176722 | |
187 | rpba = 176720 | |
188 | / rp03 disk driver. | |
189 | / low order address in dno, | |
190 | / high order in r0. | |
191 | rblk: | |
192 | mov r1,-(sp) | |
193 | mov dno,r1 | |
194 | div $20.*10.,r0 | |
195 | / add $cyl,r0 | |
196 | mov r0,*$rpca | |
197 | clr r0 | |
198 | div $10.,r0 | |
199 | swab r0 | |
200 | bis r1,r0 | |
201 | mov r0,*$rpda | |
202 | mov $rpba,r1 | |
203 | mov $buf,(r1) | |
204 | mov $-256.,-(r1) | |
205 | mov $read+go,-(r1) | |
206 | 1: | |
207 | tstb (r1) | |
208 | bge 1b | |
209 | mov (sp)+,r1 | |
210 | rts pc | |
211 | ||
212 | tks = 177560 | |
213 | tkb = 177562 | |
214 | / read and echo a teletype character | |
215 | getc: | |
216 | mov $tks,r0 | |
217 | inc (r0) | |
218 | 1: | |
219 | tstb (r0) | |
220 | bge 1b | |
221 | mov tkb,r0 | |
222 | bic $!177,r0 | |
223 | cmp r0,$'A | |
224 | blo 1f | |
225 | cmp r0,$'Z | |
226 | bhi 1f | |
227 | add $'a-'A,r0 | |
228 | 1: | |
229 | ||
230 | tps = 177564 | |
231 | tpb = 177566 | |
232 | / print a teletype character | |
233 | putc: | |
234 | tstb *$tps | |
235 | bge putc | |
236 | mov r0,*$tpb | |
237 | cmp r0,$'\r | |
238 | bne 1f | |
239 | mov $'\n,r0 | |
240 | br putc | |
241 | 1: | |
242 | rts pc | |
243 | ||
244 | end: | |
245 | inod = ..-1024. | |
246 | addr = inod+12. | |
247 | buf = inod+64. | |
248 | bno = buf+512. | |
249 | dno = bno+2 | |
250 | names = dno+2 | |
251 | reset = 5 |