A large commit.
[pdp8.git] / sw / dumprest / original / dumptd8e.pal
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/
12/ The program (PC) receiving the data should be started before this program
13/
14/ To run start at 0200.
15/ SR 11 should be drive, only 0 and 1 supported without reassembling
16/ SR 6-8 should be maximum memory field in computer, needs 8k minimum
17/ The receiving program should be running first.
18/ At normal exit hitting cont will restart the program
19/
20/ Should halt at label finish (140) with number of recoverable errors in AC
21/ The current block being read will be displayed in the AC
22/ while running.
23/
24/ If a unrecoverable error occurs the program will halt with the error in
25/ the AC. Hit continue to dump more or comment out hlt, search for *****.
26/ The PC program will print out the bad location if an error occurs
27/
28/ We will retry each read up to 16 times on error
29/
30/ This transfers the standard 129 word by 1474 blocks used by OS/8 etc.
31/ Other formats can be handled by changing constants below
32
33 INAD=030 / Address of serial input, 30 for console
34 KCF2=6000 INAD
35 KSF2=6001 INAD
36 KCC2=6002 INAD
37 KRS2=6004 INAD
38 KIE2=6005 INAD
39 KRB2=6006 INAD
40
41 OUTAD=040 / Address of serial output, 40 for console
42 TFL2=6000 OUTAD
43 TSF2=6001 OUTAD
44 TCF2=6002 OUTAD
45 TPC2=6004 OUTAD
46 TSK2=6005 OUTAD
47 TLS2=6006 OUTAD
48
49/2 TD8E INITIALIZER PROGRAM, V7A
50/
51/COPYRIGHT (C) 1975, 1977
52/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
53/
54/
55/
56/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
57/SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
58/SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER
59/COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
60/TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
61/AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
62/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
63/
64/
65/THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
66/NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
67/EQUIPMRNT COROPATION.
68/
69/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
70/SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
71/
72/
73/
74/
75/
76/
77\f
78/DECEMBER 21, 1973 GB/RL/EF/SR
79
80/ABSTRACT--
81/ THE ROUTINE DESCRIBED AND LISTED HERE IS A GENERAL
82/DATA HANDLER FOR THE TD8E DECTAPE SYSTEM. THE ROUTINE
83/CONTAINS SEARCH, READ, AND WRITE FUNCTIONS IN A FORMAT
84/WHICH IS COMPATIBLE WITH OS/8 DEVICE HANDLER CALLING
85/SEQUENCES.
86
87/FIXES SINCE FIELD-TEST RELEASE:
88
89/1. FIXED BUG RE CLA ON RETRY AFTER ERROR
90/2. ALLOWED FINAL BOOTSTRAP TO BE INTO A WRITE-LOCKED DEVICE
91
92/OS/8 V3D CHANGES:
93
94/3. FIXED BUG RE TD8E BUILD (V6B PATCH)
95\f
96/THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE
97/VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS
98/CONTROL:
99/A) WHAT DRIVES (UNITS 0-7) WILL BE USED
100/B) THE ORIGIN OF THE TWO PAGE ROUTINE
101/C) WHAT MEMORY FIELD THE ROUTINE WILL RUN IN
102/D) THE SIZE OF THE DECTAPE BLOCK TO BE READ/WRITTEN
103
104/FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD
105/DEC VERSION OF THIS ROUTINE:
106
107 DRIVE=10 /UNITS 0 AND 1 SELECTED
108 ORIGIN=600 /ENTER AT ORIGIN, ORIGIN+4
109 AFIELD=0 /INITIAL FIELD SETTING
110 MFIELD=00 /AFIELD*10=MFIELD
111 WDSBLK=201 /129 WORDS PER BLOCK
112
113/THE USE OF THE PARAMETERS IS AS FOLLOWS:
114
115/ DRIVE: DRIVE DETERMINES WHICH UNITS WILL BE SELECTED
116/ DRIVE=10 IMPLIES UNITS 0 &1
117/ DRIVE=20 IMPLIES UNITS 2&3
118/ DRIVE=30 IMPLIES UNITS 4&5
119/ DRIVE=40 IMPLIES UNITS 6&7
120
121/ORIGIN: ALTERING ORIGIN CAUSES ASSEMBLY IN A DIFFERENT
122/ MEMORY LOCATION. WHEN CHANGING ORIGIN KEEP IN MIND
123/THAT THIS IS A TWO PAGE ROUTINE.
124
125/AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE
126/ LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7.
127
128/MFIELD: MFIELD IS USED IN A CIF CDF MFIELD INSTRUCTION.
129/ THE VALUE INSERTED FOR MFIELD SHOULD BE 10(8) TIMES
130/ THE VALUE FOR AFIELD. THE PERMISSIBLE VALUES ARE 00-70.
131
132/WDSBLK: WDSBLK GOVERNS HOW MANY WORDS THE ROUTINE THINKS ARE
133/ IN A DECTAPE BLOCK. THE STANDARD VALUE IS 201(8) OR
134/ 128 DECIMAL. NOTE THAT THE FUNCTION WORD BIT 10 CAN
135/ 129 DECIMAL ??? (DJG)
136/ BE USED TO SUBTRACT ONE FROM WDSBLK. THE VALUE USED
137/ FOR WDSBLK SHOULD BE THE NUMBER OF WORDS THE TAPE WAS
138/ FORMATTED TO CONTAIN.
139
140/IF WE WANT A HANDLER FOR UNITS 2&3 TO RESIDE IN
141/FIELD 2 AT LOCATION 3000 AND READ/WRITE 256(10) WORDS
142/PER BLOCK, THE PARAMETERS WOULD BE:
143/ DRIVE=20
144/ ORIGIN=3000
145/ AFIELD=2
146/ MFIELD=20
147/ WDSBLK=400
148\f/THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE
149/CALLING SEQUENCE FOR OS/8 DEVICE HANDLERS.
150/THE CALLING SEQUENCE IS:
151
152/ CDF CURRENT
153/ CIF MFIELD /MFIELD=FIELD ASSEMBLED IN
154/ JMS ENTRY /ENTRY=ORIGIN (EVEN NUMBERED DRIVE
155 /AND ORIGIN+4 FOR ODD NUMBERED DRIVE.
156/ ARG1
157/ ARG1B (DJG)
158/ ARG2
159/ ARG3
160/ ERROR RETURN
161/ NORMAL RETURN
162
163/THE ARGUMENTS ARE:
164
165/ARG1: FUNCTION WORD BIT0: 0=READ, 1=WRITE
166/ BITS 1-5: UNUSED, WAS # BLOCKS IN OPERATION (DJG)
167/ BITS 6-8: FIELD OF BUFFER AREA
168/ BIT 9: UNUSED
169/ BIT 10: # OF WORDS/BLOCK.
170/ 0= WDSBLK, 1=WDSBLK-1
171/ BIT 11: 1=START FORWARD, 0=REVERSE
172/ARG1A: # OF BLOCKS IN OPERATIONA (DJG)
173/ARG2: BUFFER ADDRESS FOR OPERATION
174/ARG3: STARTING BLOCK FOR OPERATION
175
176/ERRORS: THE HANDLER DETECTS TWO TYPES OF ERRORS:
177/A) FATAL ERRORS- PARITY ERROR, TIMING ERROR,
178/ TOO GREAT A BLOCK NUMBER
179/ FATAL ERRORS TAKE ERROR RETURN WITH THE
180/ AC=4000.
181/B) NON-FATAL- SELECT ERROR.
182/ IF NO PROPER UNIT IS SELECTED, THE ERROR
183/ RETURN IS TAKEN WITH CLEAR AC.
184/FATAL ERRORS TRY THREE TIMES BEFORE TAKING ERROR RETURN.
185/THE NORMAL RETURN IS TAKEN AFTER ALL INDICATED
186/BLOCKS HAVE BEEN TRANSFERRED. THE AC IS CLEAR.
187
188/THE TD8E IOT'S ARE:
189 SDSS=7001-DRIVE /SKIP ON SINGLE LINE FLAG
190 SDST=7002-DRIVE /SKIP ON TIMING ERROR
191 SDSQ=7003-DRIVE /SKIP ON QUAD LINE FLAG
192 SDLC=7004-DRIVE /LOAD COMMAND REGISTER
193 SDLD=7005-DRIVE /LOAD DATA REGISTER
194 SDRC=7006-DRIVE /READ COMMAND REGISTER
195 SDRD=7007-DRIVE /READ DATA REGISTER
196
197/THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X.
198/THE OTHERS CONTROL UNITS 2-7.
199
200/ THIS HANDLER USES DECTAPE BLOCKS NOT OS/8 BLOCKS !
201
202 *ORIGIN
203
204/ MODIFIED SO BIT 0 ON ENTRY IS UNIT 1
205DTA0, 0
206 DCA UNIT /SAVE UNIT POSITION
207 RDF
208 TAD C6203 /GET DATA FIELD AND SETUP RETURN
209 DCA LEAVE
210 TAD I DTA0 /GET FUNCTION WORD
211 SDLD /PUT FUNCTION INTO DATA REGISTER
212 CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER
213 /BLOCK INTO LINK
214 SZL CLA /KNOCK ONE OFF WDSBLK?
215 IAC /YES
216 TAD MWORDS
217 DCA WCOUNT /STORE MASTER WORD COUNT
218 ISZ DTA0 /TO BLOCK COUNT (DJG)
219 TAD I DTA0 / (DJG)
220 CIA / (DJG)
221 DCA PGCT / (DJG)
222 ISZ DTA0 /TO BUFFER
223 TAD I DTA0
224 DCA XBUFF /SAVE ADDRESS (DJG)
225/ DCA BUFF
226 ISZ DTA0 /TO BLOCK NUMBER
227 TAD I DTA0
228 DCA BLOCK
229 ISZ DTA0 /POINT TO ERROR EXIT
230 CIF CDF MFIELD /TO ROUTINES DATA FIELD
231/ SDRD /GET FUNCTION INTO AC
232/ CLL RAL
233/ AND CM200 /GET # PAGES TO XFER
234/ DCA PGCT
235 SDRD
236 AND C70 /GET FIELD FOR XFER
237 TAD C6201 /FORM CDF N
238 DCA XFIELD /IF=0 AND DF=N AT XFER.
239 TAD UNIT /TEST FOR SELECT ERROR
240 SDLC
241 CLA / Moved here because my drive 1 is slow selecting
242 TAD RETRY
243 DCA TRYCNT /3 ERROR TRIES
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, 7774 / RETRY UP TO 4 TIME
494NUMBLK, 2702 / NUMBER OF BLOCKS
495MWORDS, -WDSBLK / WORDS PER BLOCK
496WCOUNT, 0
497BLKFLD, 37 / 31 129 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 / BLOCKS TO SEND TO PC
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 *140
519FINISH, HLT / Normal good halt
520 JMP START
521
522 *200
523START, CDF 0
524 CAF
525 CLA CLL OSR / Get drive
526 AND (1
527 RTR
528 DCA DRVSEL
529 CLA CLL OSR / Get max field
530 RTR
531 RAR
532 AND (7
533 SNA
534 HLT / Must have at least 1 field for buffer
535 CIA
536 DCA FIELDS
537 DCA ERRCN2
538RDSZLP, TAD BLKFLD / Multiply by number of fields available
539 ISZ FIELDS
540 JMP RDSZLP
541 DCA RDSIZE / NUMBER BLOCK PER READ
542 DCA CBLOCK
543 DCA CHKSM
544
545DUMPLP, CLA
546 TAD RDSIZE
547 TAD CBLOCK
548 CIA
549 TAD NUMBLK / MORE BLOCKS LEFT THAN READSIZE?
550 SMA / NO, READ NUMBER LEFT
551 CLA / YES, ONLY READ RDSIZE
552 TAD RDSIZE
553 SNA / ANY MORE BLOCKS?
554 JMP DONE / NO, DO FINISH STUFF
555 DCA ARGSZ
556 TAD CBLOCK
557 DCA ARGBK
558 TAD DRVSEL
559 JMS DTA0
560 0010 / READ STARTING IN FIELD 1
561ARGSZ, 0
562 0
563ARGBK, 0
564 JMP ERRRET
565 TAD (377 / All blocks good
566 DCA READST
567 / Send data, each block starts with FF
568 CLA CLL / then 2 12 bit words in 3 bytes
569 DCA LOC / ERRRET DUPLICATES SOME OF THIS
570 TAD ARGSZ
571 CIA
572 DCA BCNT / Setup loop counter with number blocks read
573 CDF 10
574OUTBL1, JMS OUTBLK / Send a block
575 ISZ CBLOCK
576 ISZ BCNT / Send all read?
577 JMP OUTBL1 / No
578 CDF 0
579 JMP DUMPLP / Go read next batch
580
581
582DONE, CLA / Send FE and -checksum of all words
583 TAD (376
584 JMS PUN
585 CLA CLL
586 TAD CHKSM / Send checksum in two bytes, low bits first
587 CIA
588 JMS PUN
589 CLA CLL
590 TAD CHKSM
591 CIA
592 RTR
593 RTR
594 RTR
595 RTR
596 AND C17
597 JMS PUN
598 CLA
599 TAD DRVSEL
600 JMS DTA0 / REWIND TAPE
601 0010
602 1
603 0
604 0
605 NOP
606 TAD ERRCN2 / Leave AC with # of errors
607 JMP FINISH
608
609 /SEND GOOD BLOCKS READ WITH GOOD BLOCK FLAG
610 /THEN BAD WITH BAD BLOCK FLAG.
611ERRRET,
612/ HLT / ****** If we want to stop on error
613 CDF 10
614 CLA CLL
615 DCA LOC
616 TAD CBLOCK
617 CIA
618 TAD BLOCK /Get - number good blocks read
619 CIA /Last was bad
620 SNA
621 JMP FSTBAD /First block is bad, no good to send
622 DCA BCNT
623 TAD (377
624 DCA READST
625OUTBL2, JMS OUTBLK /Send good blocks
626 ISZ CBLOCK
627 ISZ BCNT
628 JMP OUTBL2
629FSTBAD, TAD (375 /NOW SEND BAD BLOCK
630 DCA READST
631 JMS OUTBLK
632 ISZ CBLOCK
633 ISZ ERRCN2
634 CDF 0
635 JMP DUMPLP /And read from here on
636
637 PAGE
638OUTBLK, 0 /Send a block of data out serial port
639 CLA
640 TAD WCOUNT
641 DCA LEN
642 TAD READST /Send good/bad flag
643 JMS PUN
644OUT, CLA CLL
645 TAD I LOC
646 TAD CHKSM / Keep checksum of all words sent
647 DCA CHKSM
648 TAD I LOC / Send 2 words as 3 bytes
649 JMS PUN
650 CLA CLL
651 TAD I LOC
652 RTR / Shift top 4 bits to low 4
653 RTR
654 RTR
655 RTR
656 AND C17
657 DCA TEMP
658 ISZ LOC
659 JMP STFLD3+1 /NOT AT END OF FIELD (DJG)
660 RDF /At end, inc to next field
661 TAD (6211 /BUILD CDF
662 DCA STFLD3
663STFLD3, NOP
664 ISZ LEN /END IF BUFFER?
665 SKP /NO
666 JMP ENDBK /YES
667 TAD I LOC
668 TAD CHKSM
669 DCA CHKSM
670 TAD I LOC
671 RTL
672 RTL
673 AND C360
674 TAD TEMP
675 JMS PUN
676 CLA CLL
677 TAD I LOC
678 RTR
679 RTR
680 JMS PUN
681 ISZ LOC
682 JMP STFLD4+1 /NOT AT END OF FIELD (DJG)
683 RDF
684 TAD (6211 /BUILD CDF
685 DCA STFLD4
686STFLD4, NOP
687 ISZ LEN
688 JMP OUT
689 JMP I OUTBLK
690ENDBK, TAD TEMP /SEND LAST PART OF WORD
691 JMS PUN
692 JMP I OUTBLK
693
694PUN, 0 / Send byte out serial port
695/ PLS / Punch for testing with emulator
696 TLS2 / Send out console
697 CLA CLL
698 TAD CBLOCK
699/ PSF
700 TSF2 /Wait until character sent
701 JMP .-1
702 CLA
703 JMP I PUN
704
705 $