A large commit.
[pdp8.git] / sw / dumprest / original / resttd8e.pal
1 / TD8E Dectape RESTORE Program
2 / This program will receive a DECtape image and write it to the tape. The
3 / tape is written, then it is reread to verify.
4 /
5 / The program (PC) sending the data should be started before this program
6 /
7 / See dump for the format of the serial data.
8 / To run start at 0200.
9 / SR 11 should be drive, only 0 and 1 supported without reassembling
10 / SR 6-8 should be maximum memory field in computer, needs 8k minimum
11 / Should halt at label FINISH (140) with AC = 0 if it worked, AC not equal to
12 / zero indicates checksum on read didn't match that of data received
13 / Hitting cont will restart the program if at normal end
14 /
15 / Number of retries is set to 1 for reading and writing.
16 /
17 / The current block being written to will be displayed in the AC
18 / while serial data is transfering.
19 /
20 / This program only will work with the resttd8e C program since it needs
21 / to hanshake transfers to prevent overrun on the serial data.
22 / The C program must be started first.
23 /
24 / This transfers the standard 129 word by 1474 blocks used by OS/8 etc.
25 / Other formats can be handled by changing constants below
26
27 INAD=400 / Address of serial input, 30 for console
28 KCF2=6000 INAD
29 KSF2=6001 INAD
30 KCC2=6002 INAD
31 KRS2=6004 INAD
32 KIE2=6005 INAD
33 KRB2=6006 INAD
34
35 OUTAD=410 / Address of serial output, 40 for console
36 TFL2=6000 OUTAD
37 TSF2=6001 OUTAD
38 TCF2=6002 OUTAD
39 TPC2=6004 OUTAD
40 TSK2=6005 OUTAD
41 TLS2=6006 OUTAD
42
43 /2 TD8E INITIALIZER PROGRAM, V7A
44 /
45 /COPYRIGHT (C) 1975, 1977
46 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
47 /
48 /
49 /
50 /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
51 /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
52 /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER
53 /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
54 /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
55 /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
56 /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
57 /
58 /
59 /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
60 /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
61 /EQUIPMRNT COROPATION.
62 /
63 /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
64 /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
65 /
66 /
67 /
68 /
69 /
70 /
71 \f
72 /DECEMBER 21, 1973 GB/RL/EF/SR
73
74 /ABSTRACT--
75 / THE ROUTINE DESCRIBED AND LISTED HERE IS A GENERAL
76 /DATA HANDLER FOR THE TD8E DECTAPE SYSTEM. THE ROUTINE
77 /CONTAINS SEARCH, READ, AND WRITE FUNCTIONS IN A FORMAT
78 /WHICH IS COMPATIBLE WITH OS/8 DEVICE HANDLER CALLING
79 /SEQUENCES.
80
81 /FIXES SINCE FIELD-TEST RELEASE:
82
83 /1. FIXED BUG RE CLA ON RETRY AFTER ERROR
84 /2. ALLOWED FINAL BOOTSTRAP TO BE INTO A WRITE-LOCKED DEVICE
85
86 /OS/8 V3D CHANGES:
87
88 /3. FIXED BUG RE TD8E BUILD (V6B PATCH)
89 \f
90 /THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE
91 /VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS
92 /CONTROL:
93 /A) WHAT DRIVES (UNITS 0-7) WILL BE USED
94 /B) THE ORIGIN OF THE TWO PAGE ROUTINE
95 /C) WHAT MEMORY FIELD THE ROUTINE WILL RUN IN
96 /D) THE SIZE OF THE DECTAPE BLOCK TO BE READ/WRITTEN
97
98 /FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD
99 /DEC VERSION OF THIS ROUTINE:
100
101 DRIVE=10 /UNITS 0 AND 1 SELECTED
102 ORIGIN=600 /ENTER AT ORIGIN, ORIGIN+4
103 AFIELD=0 /INITIAL FIELD SETTING
104 MFIELD=00 /AFIELD*10=MFIELD
105 WDSBLK=201 /129 WORDS PER BLOCK
106
107 /THE USE OF THE PARAMETERS IS AS FOLLOWS:
108
109 / DRIVE: DRIVE DETERMINES WHICH UNITS WILL BE SELECTED
110 / DRIVE=10 IMPLIES UNITS 0 &1
111 / DRIVE=20 IMPLIES UNITS 2&3
112 / DRIVE=30 IMPLIES UNITS 4&5
113 / DRIVE=40 IMPLIES UNITS 6&7
114
115 /ORIGIN: ALTERING ORIGIN CAUSES ASSEMBLY IN A DIFFERENT
116 / MEMORY LOCATION. WHEN CHANGING ORIGIN KEEP IN MIND
117 /THAT THIS IS A TWO PAGE ROUTINE.
118
119 /AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE
120 / LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7.
121
122 /MFIELD: MFIELD IS USED IN A CIF CDF MFIELD INSTRUCTION.
123 / THE VALUE INSERTED FOR MFIELD SHOULD BE 10(8) TIMES
124 / THE VALUE FOR AFIELD. THE PERMISSIBLE VALUES ARE 00-70.
125
126 /WDSBLK: WDSBLK GOVERNS HOW MANY WORDS THE ROUTINE THINKS ARE
127 / IN A DECTAPE BLOCK. THE STANDARD VALUE IS 201(8) OR
128 / 128 DECIMAL. NOTE THAT THE FUNCTION WORD BIT 10 CAN
129 / 129 DECIMAL ??? (DJG)
130 / BE USED TO SUBTRACT ONE FROM WDSBLK. THE VALUE USED
131 / FOR WDSBLK SHOULD BE THE NUMBER OF WORDS THE TAPE WAS
132 / FORMATTED TO CONTAIN.
133
134 /IF WE WANT A HANDLER FOR UNITS 2&3 TO RESIDE IN
135 /FIELD 2 AT LOCATION 3000 AND READ/WRITE 256(10) WORDS
136 /PER BLOCK, THE PARAMETERS WOULD BE:
137 / DRIVE=20
138 / ORIGIN=3000
139 / AFIELD=2
140 / MFIELD=20
141 / WDSBLK=400
142 \f/THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE
143 /CALLING SEQUENCE FOR OS/8 DEVICE HANDLERS.
144 /THE CALLING SEQUENCE IS:
145
146 / CDF CURRENT
147 / CIF MFIELD /MFIELD=FIELD ASSEMBLED IN
148 / JMS ENTRY /ENTRY=ORIGIN (EVEN NUMBERED DRIVE
149 /AND ORIGIN+4 FOR ODD NUMBERED DRIVE.
150 / ARG1
151 / ARG1B (DJG)
152 / ARG2
153 / ARG3
154 / ERROR RETURN
155 / NORMAL RETURN
156
157 /THE ARGUMENTS ARE:
158
159 /ARG1: FUNCTION WORD BIT0: 0=READ, 1=WRITE
160 / BITS 1-5: UNUSED, WAS # BLOCKS IN OPERATION (DJG)
161 / BITS 6-8: FIELD OF BUFFER AREA
162 / BIT 9: UNUSED
163 / BIT 10: # OF WORDS/BLOCK.
164 / 0= WDSBLK, 1=WDSBLK-1
165 / BIT 11: 1=START FORWARD, 0=REVERSE
166 /ARG1A: # OF BLOCKS IN OPERATIONA (DJG)
167 /ARG2: BUFFER ADDRESS FOR OPERATION
168 /ARG3: STARTING BLOCK FOR OPERATION
169
170 /ERRORS: THE HANDLER DETECTS TWO TYPES OF ERRORS:
171 /A) FATAL ERRORS- PARITY ERROR, TIMING ERROR,
172 / TOO GREAT A BLOCK NUMBER
173 / FATAL ERRORS TAKE ERROR RETURN WITH THE
174 / AC=4000.
175 /B) NON-FATAL- SELECT ERROR.
176 / IF NO PROPER UNIT IS SELECTED, THE ERROR
177 / RETURN IS TAKEN WITH CLEAR AC.
178 /FATAL ERRORS TRY THREE TIMES BEFORE TAKING ERROR RETURN.
179 /THE NORMAL RETURN IS TAKEN AFTER ALL INDICATED
180 /BLOCKS HAVE BEEN TRANSFERRED. THE AC IS CLEAR.
181
182 /THE TD8E IOT'S ARE:
183 SDSS=7001-DRIVE /SKIP ON SINGLE LINE FLAG
184 SDST=7002-DRIVE /SKIP ON TIMING ERROR
185 SDSQ=7003-DRIVE /SKIP ON QUAD LINE FLAG
186 SDLC=7004-DRIVE /LOAD COMMAND REGISTER
187 SDLD=7005-DRIVE /LOAD DATA REGISTER
188 SDRC=7006-DRIVE /READ COMMAND REGISTER
189 SDRD=7007-DRIVE /READ DATA REGISTER
190
191 /THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X.
192 /THE OTHERS CONTROL UNITS 2-7.
193
194 / THIS HANDLER USES DECTAPE BLOCKS NOT OS/8 BLOCKS !
195
196 *ORIGIN
197
198 / MODIFIED SO BIT 0 ON ENTRY IS UNIT 1
199 DTA0, 0
200 DCA UNIT /SAVE UNIT POSITION
201 RDF
202 TAD C6203 /GET DATA FIELD AND SETUP RETURN
203 DCA LEAVE
204 TAD I DTA0 /GET FUNCTION WORD
205 SDLD /PUT FUNCTION INTO DATA REGISTER
206 CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER
207 /BLOCK INTO LINK
208 SZL CLA /KNOCK ONE OFF WDSBLK?
209 IAC /YES
210 TAD MWORDS
211 DCA WCOUNT /STORE MASTER WORD COUNT
212 ISZ DTA0 /TO BLOCK COUNT (DJG)
213 TAD I DTA0 / (DJG)
214 CIA / (DJG)
215 DCA PGCT / (DJG)
216 ISZ DTA0 /TO BUFFER
217 TAD I DTA0
218 DCA XBUFF /SAVE ADDRESS (DJG)
219 / DCA BUFF
220 ISZ DTA0 /TO BLOCK NUMBER
221 TAD I DTA0
222 DCA BLOCK
223 ISZ DTA0 /POINT TO ERROR EXIT
224 CIF CDF MFIELD /TO ROUTINES DATA FIELD
225 / SDRD /GET FUNCTION INTO AC
226 / CLL RAL
227 / AND CM200 /GET # PAGES TO XFER
228 / DCA PGCT
229 SDRD
230 AND C70 /GET FIELD FOR XFER
231 TAD C6201 /FORM CDF N
232 DCA XFIELD /IF=0 AND DF=N AT XFER.
233 TAD RETRY
234 DCA TRYCNT /3 ERROR TRIES
235 TAD UNIT /TEST FOR SELECT ERROR
236 SDLC
237 CLA / Moved here because my drive 1 is slow selecting
238 TAD RETRY
239 DCA TRYCNT /3 ERROR TRIES
240 SDRC
241 AND C100
242 SZA CLA
243 JMP FATAL-1
244 SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG.
245 DCA I CXFUN
246 TAD WCOUNT
247 DCA I CXWCT
248 SDRD /GET MOTION BIT TO LINK
249 CLL RAR
250 XFIELD, HLT /INTO NEXT PAGE
251 JMP GO /AND START THE MOTION.
252 RWCOM, SDST /ANY CHECKSUM ERRORS?
253 SZA CLA /OR CHECKSUM ERRORS?
254 JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS
255 /SET AT RWCOM. GETCHK SETS IT.
256 / TAD PGCT /NO ERROR..FINISHED XFER?
257 / TAD CM200
258 / SNA
259 ISZ PGCT / (DJG)
260 SKP / (DJG)
261 JMP EXIT /ALL DONE. GET OUT
262 / DCA PGCT /NEW PAGE COUNT
263 ISZ BLOCK /NEXT BLOCK TO XFER
264 / TAD WCOUNT /FORM NEXT BUFFER ADDRESS
265 / CIA
266 / TAD BUFF
267 / DCA XBUFF /SAVE ADDRESS (DJG)
268 / DCA BUFF / (DJG)
269 CLL CML /FORCES MOTION FORWARD
270 GO, CLA CML RTR /LINK BECOMES MOTION BIT
271 TAD C1000
272 TAD UNIT /PUT IN 'GO' AND UNIT #
273 SDLC /LOOK FOR BLOCK NO.
274 CLA
275 TAD XBUFF /SAVE LOC OF BLOCK START SO
276 DCA OLDBUF /CAN RETRY ON ERROR
277 RDF
278 TAD C6201
279 DCA OLDFLD
280 JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK
281 JMS I CRDQUD
282 CM200, 7600 /COULD HAVE SAVED A LOC. HERE
283 SRCH, SDSS
284 JMP .-1 /WAIT FOR SINGLE LINE FLAG
285 SDRC
286 CLL RTL /DIRECTION TO LINK. INFO BITS
287 /ARE SHIFTED.
288 AND C374 /ISOLATE MARK TRACK BITS
289 TAD M110 /IS IT END ZONE?
290 SNA /THE LINK STAYS SAME THRU THIS
291 JMP ENDZ
292 TAD M20 /CHECK FOR BLOCK MARK
293 SZA CLA
294 JMP SRCH
295 SDRD /GET THE BLOCK NUMBER
296 SZL /IF WE ARE IN REVERSE, LOOK FOR 3
297 /BLOCKS BEFORE TARGET BLOCK. THIS
298 /ALLOWS TURNAROUND AND UP TO SPEED.
299 TAD C3 /REVERSE
300 CMA
301 TAD BLOCK
302 CMA /IS IT RIGHT BLOCK?
303 SNA
304 JMP FOUND /YES..HOORAY!
305 M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT?
306 /ABOVE SNA IS SUPERFLUOUS.
307 JMP SRCH /YES
308 ENDZ, SDRC /WE ARE IN THE END ZONE
309 CLL RTL /DIRECTION TO LINK
310 CLA /ARE WE IN REVERSE?
311 JMP GO /YES..TURN US AROUND
312 /IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR
313 TRY3, CLA
314 OLDFLD, NOP /RESET FIELD
315 TAD OLDBUF /RESET BACK TO START OF BLOCK
316 DCA XBUFF
317 ISZ TRYCNT
318 JMP GO /TRY 3 TIMES
319 JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN
320 EXIT, ISZ DTA0
321 CLL CML /AC=0 ON NORMAL RETURN
322 FATAL, TAD UNIT
323 SDLC /STOP THE UNIT
324 CLA CML RAR
325 LEAVE, HLT
326 JMP I DTA0
327
328 \f
329 C6203, 6203
330 C6201, 6201
331 CRDQUD, RDQUAD
332 /WCOUNT, 0 (MOVED PAGE 0 DJG)
333 BUFF, 0
334 /MWORDS, -WDSBLK (MOVED PAGE 0 DJG)
335 UNIT, 0
336 CXFUN, XFUNCT
337 M20, -20
338 PGCT, 0
339 CXWCT, XWCT
340 C100, 100
341 TRYCNT, -3
342 C1000, 1000
343
344
345 *ORIGIN+172
346 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION?
347 JMP GO /WRONG..TURN AROUND
348 TAD UNIT /PUT UNIT INTO LINK
349 CLL RAL /AC IS NOW 0
350 C70, 70 /********DON'T MOVE THIS!!!!******
351 C3, 3
352 / TAD BUFF /GET BUFFER ADDRESS (DJG)
353 /XFIELD, HLT /INTO NEXT PAGE
354 \f *ORIGIN+200
355 CIF MFIELD
356 / DCA XBUFF /SAVE ADDRESS (DJG)
357 RAR /NOW GET UNIT #
358 DCA XUNIT
359 SDRC
360 SDLC
361 REVGRD, SDSS
362 JMP .-1 /LOOK FOR REVERSE GUARD
363 SDRC
364 AND K77
365 TAD CM32 /IS IT REVERSE GUARD?
366 SZA CLA
367 JMP REVGRD /NO.KEEP LOOKING
368 TAD XWCT
369 DCA WORDS /WORD COUNTER
370 TAD XFUNCT /GET FUNCTION READ OR WRITE
371 K7700, SMA CLA
372 JMP READ /NEG. IS WRITE
373 WRITE, SDRC
374 AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR
375 CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS
376 SZA CLA
377 JMP I CFATAL /FATAL ERROR. LINK MUST BE ON
378 JMS RDQUAD /NO ONE EVER USES THIS WORD!
379 C7600, 7600
380 TAD C1400
381 TAD XUNIT /INITIATE WRITE MODE
382 SDLC
383 CLA CMA
384 JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM
385 CLA CMA
386 DCA CHKSUM
387 WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE!
388 JMS WRQUAD
389 ISZ XBUFF /BUMP CORE POINTER
390 JMP STFLD1+1 /NOT AT END OF FIELD (DJG)
391 RDF
392 TAD (6211
393 DCA STFLD1
394 STFLD1, NOP
395 ISZ WORDS /DONE THIS BLOCK?
396 JMP WRLP /NOT YET..LOOP A WHILE
397 TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK?
398 CLL RTR /IF NO, WRITE A 0 WORD
399 SZL CLA
400 JMS WRQUAD /WRITE A WORD OF 0
401 JMS GETCHK /DO THE CHECK SUM
402 JMS WRQUAD /WRITE FORWARD CHECKSUM
403 JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN
404 JMP I CRWCOM
405 K77, 77 /ABOVE MAY SKIP (NOT ANYMORE DJG)
406 \fREAD, JMS RDQUAD
407 JMS RDQUAD
408 JMS RDQUAD /SKIP CONTROL WORDS
409 AND K77
410 TAD K7700 /TACK 7700 ONTO CHECKSUM.
411 DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY
412 RDLP, JMS RDQUAD
413 JMS EQUFUN /COMPUT CHECKSUM AS WE GO
414 DCA I XBUFF /IT GETS CONDENSED LATER
415 ISZ XBUFF /AT END OF FIELD?
416 JMP STFLD2+1 /NOT AT END OF FIELD (DJG)
417 RDF
418 TAD (6211
419 DCA STFLD2
420 STFLD2, NOP
421 ISZ WORDS /DONE THIS OP?
422 JMP RDLP /NO SUCH LUCK
423 TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND
424 CLL RTR /CHECKSUM THE LAST TAPE WORD
425 SNL CLA
426 JMP RDLP2
427 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK
428 JMS EQUFUN /CHECKSUM IT
429 RDLP2, JMS RDQUAD /READ CHECKSUM
430 AND K7700
431 JMS EQUFUN
432 JMS GETCHK /GET SIX BIT CHECKSUM
433 JMP I CRWCOM
434 C300, 300 /PROTECTION (NOT ANYMORE DJG)
435
436 WRQUAD, 0 /WRITE OUT A 12 BIT WORD
437 JMS EQUFUN /ADD THIS TO CHECKSUM
438 SDSQ /SKIP ON QUADLINE FLAG
439 JMP .-1
440 SDLD /LOAD DATA ONTO BUS
441 CLA /SDLD DOESN'T CLEAR AC
442 JMP I WRQUAD
443
444 RDQUAD, 0 /READ A 12 BIT WORD
445 SDSQ
446 JMP .-1
447 SDRD /READ DATA
448 JMP I RDQUAD
449
450 \fXUNIT,
451 EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM
452 CMA
453 DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE
454 TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD
455 AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE
456 CIA /IS ASSOCIATIVE, WE CAN DO IT 12
457 CLL RAL /BITS AT A TIME AND CONDENSE LATER.
458 TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES:
459 TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B)
460 DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B)
461 TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B))
462 CMA
463 JMP I EQUFUN
464
465 GETCHK, 0 /FORM 6 BIT CHECKSUM
466 CLA
467 TAD CHKSUM
468 CMA
469 CLL RTL
470 RTL
471 RTL
472 JMS EQUFUN
473 CLA CLL CML /FORCES LINK ON AT RWCOM
474 TAD CHKSUM
475 AND K7700
476 JMP I GETCHK
477
478 CFATAL, FATAL
479 CRWCOM, RWCOM
480 XFUNCT, 0
481 CM32, -32
482 C1400, 1400
483 CHKSUM, 0
484 WORDS, 0
485 XWCT, 0
486 EQUTMP, 0
487
488 *20
489 RETRY, 7776 / RETRY UP TO 1 TIME
490 NUMBLK, 2702 / NUMBER OF BLOCKS
491 MWORDS, -WDSBLK / WORDS PER BLOCK
492 WCOUNT, 0
493 BLKFLD, 37 / BLOCKS PER FIELD, 31 MAX FOR 129 WORDS/BLOCK
494 / WRAPPING PAST END OF LAST FIELD DOESN'T WORK
495 FIELDS, 0
496 RDSIZE, 0 / NUMBER BLOCKS PER READ
497 CBLOCK, 0 / CURRENT BLOCK TO XFER
498 CLKSUM, 0
499 DRVSEL, 0
500 READST, 377
501 LOC, 0
502 LEN, 0
503 BCNT, 0
504 TEMP, 0
505 C17, 17
506 C7400, 7400
507 CHKSM, 0
508 DONEFG, 0
509 OLDBUF, 0 / USED BY DTA0 ROUTINE
510 XBUFF, 0 / USED BY DTA0 ROUTINE
511 C374, 374 / USED BY DTA0 ROUTINE
512 BLOCK, 0 / USED BY DTA0 ROUTINE
513
514 *140
515 FINISH,
516 CLA IAC
517 6742
518 IAC
519 6742
520 CLA
521 TAD BO1
522 DCA 30
523 TAD BO2
524 DCA 31
525 JMP 31
526
527 / HLT / Normal good halt
528 / JMP START / And restart if requested
529
530 / REBOOT FROM RK05
531 BO1, 6743
532 BO2, JMP 31
533
534 *200
535 START, CDF 0
536 CAF
537 CLA CLL / Get drive
538 AND (1
539 RTR
540 DCA DRVSEL
541 CLA CLL / Get max field
542 TAD (0030
543 RTR
544 RAR
545 AND (7
546 SNA
547 HLT / Must have at least 1 field for buffer
548 CIA
549 DCA FIELDS
550 RDSZLP, TAD BLKFLD / Multiply by number of fields available
551 ISZ FIELDS
552 JMP RDSZLP
553 DCA RDSIZE / NUMBER BLOCK PER READ
554 DCA CBLOCK
555 DCA CHKSM
556 DCA DONEFG
557
558 DUMPLP, CLA
559 TAD DONEFG / If all transfered do finish stuff
560 SZA
561 JMP DONE
562 TAD RDSIZE / Always ask for maximum number of blocks
563 DCA ARGSZ / Will accept less
564 TAD CBLOCK / The serial read routine uses these variables
565 DCA ARGBK
566
567 DCA LOC
568 TAD ARGSZ
569 JMS PUN / ASK FOR UP TO THIS MANY BLOCKS
570 TAD ARGSZ
571 CIA
572 DCA BCNT / Our block counter
573 CDF 10
574 INBL1, JMS INBLK / Get a block
575 JMP GOTALL / If Not last block
576 TAD ARGSZ / Is last block, calculate number received
577 TAD BCNT
578 SNA / If no blocks transfered must be done flag
579 JMP DONE / Do finish processing
580 DCA ARGSZ / Else write data received
581 IAC
582 DCA DONEFG
583 JMP WRTIT
584
585 GOTALL, ISZ CBLOCK / Go get next block
586 ISZ BCNT
587 JMP INBL1
588 WRTIT, CDF 0 / Got all, write them out
589 TAD DRVSEL
590 JMS DTA0
591 4010 / ONLY EVEN # WORDS/BLOCK WORKS
592 ARGSZ, 0
593 0
594 ARGBK, 0
595 JMP ERRRET
596 JMP DUMPLP / Go get more
597
598 DONE, CLA / Send a character to get checksum
599 CDF 0
600 JMS PUN
601 JMS GETCH
602 DCA TEMP
603 JMS GETCH / Convert the 2 bytes to 12 bit word
604 RTL / Shift low 4 bits to top 4
605 RTL
606 RTL
607 RTL
608 AND C7400
609 TAD TEMP
610 DCA TEMP
611 TAD TEMP
612 TAD CHKSM
613 SZA / Checksum received is - sum so should be 0
614 HLT / Give up if not, serial error
615 / Do reread check
616 TAD ARGSZ / Get size of last block written for first
617 DCA ARGSZ2 / to reread
618 TAD CBLOCK / And last block number
619 DCA ARGBK2
620 TAD TEMP / Store checksum received in our checksum
621 DCA CHKSM / Should give 0 at end
622 RDCHK, CLA
623 TAD ARGSZ2 / Decrease block number by number of blocks to
624 CIA / Read so we read starting at first block
625 TAD ARGBK2 / Read routine can't read backward
626 DCA ARGBK2
627 TAD DRVSEL
628 JMS DTA0 / REREAD AND CHECK
629 10
630 ARGSZ2, 0
631 0
632 ARGBK2, 0
633 JMP RDERR
634 TAD ARGSZ2 / Checksum over number of blocks read
635 CIA
636 DCA BCNT
637 DCA LOC
638 CDF 10
639 SUMIT, JMS SUMBLK / Sum each block
640 ISZ BCNT
641 JMP SUMIT
642 CDF 0
643 TAD RDSIZE / Read full blocks for rest of read
644 DCA ARGSZ2
645 TAD ARGBK2 / If at block 0 then we are done
646 SZA
647 JMP RDCHK
648
649 TAD CHKSM / Leave AC with checksum, should be 0
650 JMP FINISH
651
652 RDERR, HLT
653 ERRRET, HLT
654
655 PAGE
656 INBLK, 0 / Read a block of data from serial port
657 CLA / Read block size words
658 TAD MWORDS
659 DCA LEN
660 JMS GETCH / Get start of block flag
661 CIA
662 TAD (377
663 SNA
664 JMP IN
665 TAD (-1 / Is it end of data flag?
666 SZA
667 HLT / Not it, give up, we lost sync on serial data
668 ISZ INBLK / Return end of data state
669 JMP I INBLK
670 IN,
671 JMS GETCH / Get 3 bytes and convert to 2 words
672 DCA I LOC
673 JMS GETCH
674 DCA TEMP
675 TAD TEMP
676 RTL / Shift low 4 bits to top 4
677 RTL
678 RTL
679 RTL
680 AND C7400
681 TAD I LOC
682 DCA I LOC
683 TAD I LOC
684 TAD CHKSM /Keep checksum of all words received
685 DCA CHKSM
686 ISZ LOC
687 JMP STFLD3+1 /NOT AT END OF FIELD (DJG)
688 RDF /At end, inc field
689 TAD (6211
690 DCA STFLD3
691 STFLD3, NOP
692 ISZ LEN /END IF BUFFER?
693 SKP /NO
694 JMP I INBLK /YES, DONE
695 TAD TEMP
696 RTR
697 RTR
698 AND C17
699 DCA TEMP
700 JMS GETCH
701 RTL
702 RTL
703 TAD TEMP
704 DCA I LOC
705 TAD I LOC
706 TAD CHKSM
707 DCA CHKSM
708 ISZ LOC
709 JMP STFLD4+1 /Not at end of field
710 RDF /At end, inc field
711 TAD (6211
712 DCA STFLD4
713 STFLD4, NOP
714 ISZ LEN
715 JMP IN
716 JMP I INBLK
717
718 SUMBLK, 0 / Sum a block of memory
719 CLA
720 TAD MWORDS
721 DCA LEN
722 SUMLP, TAD I LOC
723 TAD CHKSM / Keep checksum of all words
724 DCA CHKSM
725 ISZ LOC
726 JMP STFLD5+1 /Not at end of field
727 RDF /At end, inc field
728 TAD (6211
729 DCA STFLD5
730 STFLD5, NOP
731 ISZ LEN
732 JMP SUMLP
733 JMP I SUMBLK
734
735 PUN, 0 / Send a character
736 / PLS / Punch for testing with emulator
737 TLS2 / Send out console
738 CLA CLL
739 TAD CBLOCK
740 / PSF
741 TSF2 /Wait until character sent
742 JMP .-1
743 CLA
744 JMP I PUN
745
746 GETCH, 0 / Get a character
747 CLA CLL
748 TAD CBLOCK
749 / RSF
750 KSF2 / Have character waiting
751 JMP .-1 / No, try again
752 / RRB RFC
753 KRB2 / Get character
754 JMP I GETCH
755 $