Commit | Line | Data |
---|---|---|
81e70d48 PH |
1 | / RX01 RESTORE |
2 | / This program will receive a RX01 image and write it to the disk. The | |
3 | / entire disk it written, with a reread check when done writing. | |
4 | / | |
5 | / This program should be started before the program (PC) sending the data | |
6 | / | |
7 | / See dump for the format of the serial data. | |
8 | / To run start at 0200. | |
9 | / SR9-11 shoulb be drive number | |
10 | / Should halt at label GDHLT (140) with AC = 0 if it worked. | |
11 | / At normal exit hitting cont will restart the program | |
12 | ||
13 | LCD=6751 / Load the command reg with AC | |
14 | XDR=6752 / Load or read the transfer register | |
15 | STR=6753 / Skip on transfer request flag | |
16 | SER=6754 / Skip on error flag | |
17 | SDN=6755 / Skip on done flag | |
18 | INTR=6756 / AC = 0 interrupt off, 1 = on | |
19 | INIT=6757 / Initialize RX8/RX01 | |
20 | ||
21 | INAD=030 / Address of serial input, 30 for console | |
22 | KCF2=6000 INAD | |
23 | KSF2=6001 INAD | |
24 | KCC2=6002 INAD | |
25 | KRS2=6004 INAD | |
26 | KIE2=6005 INAD | |
27 | KRB2=6006 INAD | |
28 | ||
29 | OUTAD=040 / Address of serial output, 40 for console | |
30 | TFL2=6000 OUTAD | |
31 | TSF2=6001 OUTAD | |
32 | TCF2=6002 OUTAD | |
33 | TPC2=6004 OUTAD | |
34 | TSK2=6005 OUTAD | |
35 | TLS2=6006 OUTAD | |
36 | ||
37 | *10 | |
38 | WRTLOC, 7777 / Address to write data to disk, auto inc | |
39 | BUFLOC, 7777 / Address to store next word received | |
40 | ||
41 | *20 | |
42 | DRIVE, 0 / Drive # * 2 | |
43 | DRVMSK, 60 / Mask for drive bits | |
44 | DONEFG, 0 / Set to one when fe end of data flag rx | |
45 | WRCMD, 104 / 8 bit write | |
46 | FILCMD, 100 / 8 bit fill buffer | |
47 | RDCMD,106 / 8 bit read | |
48 | EMPCMD, 102 / 8 bit empty buffer | |
49 | RDERR, 116 / 8 bit read error | |
50 | TRACK, 0 | |
51 | SECT, 0 | |
52 | SCNT, 0 | |
53 | NUMSEC, 0 / Number of sectors received but not written | |
54 | K37, 37 | |
55 | K377, 377 | |
56 | KN1, 7777 | |
57 | M32, -32 | |
58 | M115, -115 | |
59 | CHKSUM, 0 | |
60 | TEMP, 0 | |
61 | STATE, 0 / Where in serial data we are 0 = Need ff sector head, | |
62 | / 1 = need image size byte | |
63 | / -1 = byte1, ... -3 = byte 3 | |
64 | BUFCNT, 0 / Count of words received in sector | |
65 | ISRAC, 0 | |
66 | ISRFLG, 0 | |
67 | RISR, ISR | |
68 | DECIMAL | |
69 | NBLKSZ, -130 / 128 words + track and sector number | |
70 | M128, -128 | |
71 | OCTAL | |
72 | WRITEF, WRITE | |
73 | FREREAD,REREAD | |
74 | STARTF, START | |
75 | ||
76 | SIZEFG, 0 | |
77 | ||
78 | L10, 10 | |
79 | L32, 32 | |
80 | L400, 400 | |
81 | L412, 412 | |
82 | L422, 422 /20 SAYS UNIT 1, 402 FOR CONVENIENCE | |
83 | L7700, 7700 | |
84 | L1734, 1734 | |
85 | L4110, | |
86 | LM3670, -3670 | |
87 | ZOO, 0 | |
88 | DENSW, 0 | |
89 | SIZE, 0 | |
90 | FN, 0 | |
91 | LTYPE, TYPE | |
92 | RX02, 0 | |
93 | LLCD, 0 /REPLACED BY ROUTINE TO LOAD CMD REGISTER | |
94 | LLCD1, LCD1 | |
95 | LLCD2, LCD2 | |
96 | ||
97 | *1 | |
98 | JMP I RISR / Interrupt handler | |
99 | ||
100 | *140 | |
101 | GDHLT, HLT | |
102 | JMP I STARTF | |
103 | ||
104 | *200 | |
105 | START, CDF 0 / Init all our variables | |
106 | CAF | |
107 | CLA CLL OSR / Init variables changed during run | |
108 | RTL | |
109 | RTL | |
110 | AND DRVMSK | |
111 | DCA DRIVE | |
112 | DCA DONEFG | |
113 | DCA CHKSUM | |
114 | IAC | |
115 | DCA STATE | |
116 | CMA | |
117 | DCA WRTLOC | |
118 | CMA | |
119 | DCA BUFLOC | |
120 | DCA NUMSEC | |
121 | TAD M32 | |
122 | DCA SCNT | |
123 | ION / Turn on serial interrupt handler | |
124 | CLA CLL IAC / Set bit 11 to enable interrupts | |
125 | KIE2 | |
126 | KRB2 | |
127 | / RPE / Testing, use PTR with emulator | |
128 | / RFC | |
129 | RECAL, CLA CLL | |
130 | INIT | |
131 | SDN / Done? | |
132 | JMP .-1 | |
133 | JMS TYPE | |
134 | ILP, CLA | |
135 | TAD STATE / Wait for size flag to be sent | |
136 | SZA | |
137 | JMP ILP | |
138 | TAD SIZE | |
139 | AND K377 / Size received is only a byte so mask our size | |
140 | CMA IAC | |
141 | TAD SIZEFG | |
142 | SZA / If disk size not same as image being sent | |
143 | HLT / then halt | |
144 | JMP I WRITEF | |
145 | ||
146 | TYPE, 0 | |
147 | TAD L412 /MAKE A DOUBLE DENSITY READ STATUS CODE | |
148 | TAD DRIVE | |
149 | LCD | |
150 | SDN | |
151 | JMP .-1 | |
152 | XDR /GET STATUS WORD | |
153 | DCA RX02 | |
154 | TAD RX02 | |
155 | AND L32 /KEEP DENSITY ERROR; DOUBLE; QUAD | |
156 | TAD L10 /SINGLE=10;SING/DOUB=40;DOUB=20;QUAD=22 | |
157 | AND L422 /SINGLE=0;SING/DOUB=0;DOUB=20;QUAD=22 | |
158 | DCA ZOO /PLACE TYPE CODE, THREE LOC.'S AFTER ENTRY POINT | |
159 | SER | |
160 | NORMAL, TAD ZOO /FETCH BACK TYPE CODE | |
161 | SZA CLA /SKIP IF A SINGLE DENSITY | |
162 | TAD L7700 /DOUBLE | |
163 | TAD L7700 /SINGLE=7700, DOUBLE=7600 | |
164 | DCA DENSW /PLACE FOR LOOP CONTROL | |
165 | TAD ZOO | |
166 | CLL RTR /PUT QUAD BIT TO LINK | |
167 | SNA CLA /SKIP IF DOUBLE OR QUAD | |
168 | TAD L1734 /SINGLE | |
169 | TAD L4110 /D&Q=4110, S=6044 | |
170 | SNL /SKIP ON QUAD, IT'S OK RIGHT NOW | |
171 | CLL CML RAR /SINGLE AND DOUBLE DIVIDE BY 2 | |
172 | DCA SIZE /S=7022, D=6044, Q=4110 | |
173 | TAD DENSW /7700 IF SINGLE, 7600 IF DOUBLE | |
174 | CLL CMA RTL /375 IF SINGLE, 775 IF DOUBLE | |
175 | AND L400 | |
176 | TAD DRIVE /VOILA, 400*DOUBLE + 20*DRIVE | |
177 | DCA FN /PLACE INTO FUNCTION CONTROL WORD | |
178 | CLA | |
179 | TAD ZOO /FETCH BACK TYPE CODE | |
180 | SZA CLA /SKIP IF A SINGLE DENSITY | |
181 | TAD M128 /256 BYTES SECTOR DOUBLE | |
182 | TAD M128 /128 BYTES SINGLE | |
183 | TAD KN1 /2 extra bytes for sector # etc in buffer | |
184 | TAD KN1 | |
185 | DCA NBLKSZ | |
186 | TAD RX02 | |
187 | AND L10 | |
188 | SNA CLA | |
189 | JMP RX01 | |
190 | TAD LLCD2 | |
191 | DCA LLCD | |
192 | JMP I TYPE /RETURN | |
193 | RX01, TAD LLCD1 | |
194 | DCA LLCD | |
195 | JMP I TYPE /RETURN | |
196 | ||
197 | PAGE | |
198 | WRITE, CLA CLL | |
199 | IOF / Turn off interrupts so we can safely update | |
200 | CLA / # of sectors in buffer | |
201 | TAD NUMSEC | |
202 | SNA | |
203 | JMP NODAT | |
204 | TAD KN1 | |
205 | DCA NUMSEC | |
206 | IAC | |
207 | NODAT, ION | |
208 | SZA | |
209 | JMP WRSEC | |
210 | CMA | |
211 | TAD DONEFG / All data rx | |
212 | SZA | |
213 | JMP WRITE / no | |
214 | JMP DONE / yes | |
215 | ||
216 | WRSEC, CLA CLL / We have one waiting, write it | |
217 | CDF 10 | |
218 | TAD I WRTLOC | |
219 | DCA TRACK | |
220 | TAD I WRTLOC | |
221 | CDF 0 | |
222 | DCA SECT | |
223 | TAD FILCMD | |
224 | JMS I LLCD / Do fill buffer command | |
225 | CDF 10 | |
226 | LOOP, STR | |
227 | SKP | |
228 | JMP FILL | |
229 | SDN / All Done? | |
230 | JMP LOOP / No | |
231 | SER / Any errors | |
232 | JMP WRTIT / No | |
233 | ||
234 | XDR / Yes, leave error in AC and halt | |
235 | HLT | |
236 | CLA | |
237 | TAD RDERR | |
238 | JMS I LLCD | |
239 | SDN | |
240 | JMP .-1 | |
241 | XDR | |
242 | HLT | |
243 | ||
244 | FILL, TAD I WRTLOC | |
245 | XDR | |
246 | CLA | |
247 | JMP LOOP | |
248 | ||
249 | WRTIT, CLA CLL | |
250 | TAD WRCMD | |
251 | JMS I LLCD | |
252 | STR | |
253 | JMP .-1 | |
254 | TAD SECT | |
255 | XDR | |
256 | STR | |
257 | JMP .-1 | |
258 | CLA | |
259 | TAD TRACK | |
260 | XDR | |
261 | ||
262 | SDN / Done? | |
263 | JMP .-1 | |
264 | CLA | |
265 | SER / Any errors | |
266 | JMP NEXT / No | |
267 | ||
268 | XDR / Yes, leave error in AC and halt | |
269 | HLT | |
270 | CLA | |
271 | TAD RDERR | |
272 | JMS I LLCD | |
273 | SDN | |
274 | JMP .-1 | |
275 | XDR | |
276 | HLT | |
277 | ||
278 | NEXT, CLA CLL | |
279 | JMP WRITE | |
280 | ||
281 | DONE, CLA CLL / Done, wait for one more byte | |
282 | TAD WRTLOC | |
283 | IAC | |
284 | CIA | |
285 | TAD BUFLOC | |
286 | SZA | |
287 | JMP DONE | |
288 | TAD CHKSUM / Got checksum byte, receive routine has added it | |
289 | AND K377 / to checksum, verify final checksum (8 bit) is zero | |
290 | SZA | |
291 | HLT / Stop if checksum wrong | |
292 | JMP I FREREAD | |
293 | ||
294 | PAGE | |
295 | REREAD, CLA IAC / Reread disk to check for errors | |
296 | DCA SECT | |
297 | DCA TRACK | |
298 | DCA CHKSUM | |
299 | ||
300 | RDCHK, CLA CLL / Standard read from manual | |
301 | TAD TRACK | |
302 | TAD SECT | |
303 | TAD K377 | |
304 | TAD CHKSUM | |
305 | DCA CHKSUM | |
306 | TAD RDCMD | |
307 | JMS I LLCD | |
308 | STR | |
309 | JMP .-1 | |
310 | TAD SECT | |
311 | XDR | |
312 | STR | |
313 | JMP .-1 | |
314 | CLA | |
315 | TAD TRACK | |
316 | XDR | |
317 | ||
318 | SDN / Done? | |
319 | JMP .-1 | |
320 | CLA | |
321 | SER / Any errors | |
322 | SKP | |
323 | JMP ERROR | |
324 | CLA CLL | |
325 | TAD EMPCMD | |
326 | JMS I LLCD | |
327 | ELOOP, STR | |
328 | SKP | |
329 | JMP EMPTY | |
330 | SDN | |
331 | JMP ELOOP | |
332 | SER | |
333 | JMP GOOD | |
334 | HLT | |
335 | EMPTY, XDR | |
336 | TAD CHKSUM | |
337 | DCA CHKSUM | |
338 | JMP ELOOP | |
339 | ||
340 | GOOD, CLA CLL IAC RAL / LOAD 2 | |
341 | ISZ SCNT | |
342 | SKP | |
343 | JMP NXTTRK | |
344 | TAD SECT | |
345 | DCA SECT | |
346 | TAD SECT | |
347 | TAD M32 | |
348 | SPA SNA | |
349 | JMP RDCHK | |
350 | IAC | |
351 | DCA SECT | |
352 | JMP RDCHK | |
353 | NXTTRK, CLA IAC | |
354 | DCA SECT | |
355 | TAD M32 | |
356 | DCA SCNT | |
357 | ISZ TRACK | |
358 | TAD TRACK | |
359 | TAD M115 | |
360 | SZA | |
361 | JMP RDCHK | |
362 | CLA CMA | |
363 | TAD K377 / fe at end before checksum | |
364 | TAD CHKSUM | |
365 | CDF 10 | |
366 | TAD I WRTLOC / received checksum | |
367 | CDF 0 | |
368 | AND K377 | |
369 | JMP GDHLT | |
370 | ||
371 | ERROR, XDR / Yes, leave error in AC and halt | |
372 | HLT | |
373 | CLA | |
374 | TAD RDERR | |
375 | JMS I LLCD | |
376 | SDN | |
377 | JMP .-1 | |
378 | XDR | |
379 | HLT | |
380 | JMP I STARTF | |
381 | ||
382 | LCD1, 0 | |
383 | TAD FN | |
384 | LCD | |
385 | JMP I LCD1 | |
386 | ||
387 | LCD2, 0 | |
388 | TAD FN | |
389 | DCA CMD | |
390 | TAD CMD | |
391 | LCD | |
392 | CLA | |
393 | TAD CMD | |
394 | CLL RTL | |
395 | RTL | |
396 | RAL | |
397 | STR | |
398 | JMP .-1 | |
399 | XDR | |
400 | CLA | |
401 | JMP I LCD2 | |
402 | CMD, 0 | |
403 | ||
404 | ||
405 | PAGE | |
406 | ISR, | |
407 | DCA ISRAC / Save AC | |
408 | GTF | |
409 | DCA ISRFLG / And flags | |
410 | CDF 10 / Buffer in field 1 | |
411 | KSF2 / Have character waiting | |
412 | / RSF / Testing, use PTR with emulator | |
413 | JMP IRET / No, not our interrupt | |
414 | CLA | |
415 | KRB2 / Get character | |
416 | / RRB RFC / PTR | |
417 | DCA TEMP | |
418 | TAD CHKSUM | |
419 | TAD TEMP | |
420 | DCA CHKSUM | |
421 | TAD STATE / Find out where in sequence we are | |
422 | SNA | |
423 | JMP SBLK / Start of block | |
424 | CMA IAC / STATE +1, get size flag | |
425 | IAC | |
426 | SZA | |
427 | JMP DATA | |
428 | TAD TEMP | |
429 | DCA SIZEFG | |
430 | DCA STATE | |
431 | JMP IRET | |
432 | DATA, CLA / data byte | |
433 | TAD TEMP | |
434 | DCA I BUFLOC | |
435 | ISZ BUFCNT | |
436 | JMP IRET | |
437 | DCA STATE / End of sector, set to 0 to check header byte | |
438 | ISZ NUMSEC / Inc number of sectors buffered | |
439 | TAD K37 | |
440 | CIA | |
441 | TAD NUMSEC | |
442 | SNA | |
443 | HLT / To many buffered, halt. Must of had to many | |
444 | / retries in a row | |
445 | IRET, CLA | |
446 | TAD ISRFLG | |
447 | RTF | |
448 | CLA | |
449 | TAD ISRAC | |
450 | JMP I 0 | |
451 | SBLK, TAD K377 | |
452 | CIA | |
453 | TAD TEMP / Is is a ff? | |
454 | SNA | |
455 | JMP FLAGOK / Yes | |
456 | IAC / Is it a fe? | |
457 | SZA | |
458 | HLT / No, halt | |
459 | ISZ DONEFG / All data received | |
460 | FLAGOK, STA / -1 for byte 1 | |
461 | DCA STATE | |
462 | TAD NBLKSZ / And setup to look for blocksize words | |
463 | DCA BUFCNT | |
464 | JMP IRET | |
465 | ||
466 | $ |