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