A large commit.
[pdp8.git] / sw / dumprest / original / restrx01.pal
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 $