13 /COPYRIGHT (C) 1972, 1975
14 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
18 /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
19 /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
20 /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER
21 /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
22 /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
23 /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
24 /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
27 /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
28 /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
29 /EQUIPMRNT COROPATION.
31 /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
32 /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
42 /DEFINITIONS FOR PAL8 AND PAL10
66 /UNIT NUMBER DEFINITIONS FOR TD8E IOT'S
82 /PAGE 0 CONSTANTS AND VARIABLES
85 INPUT, 0 /INPUT UNIT CONSTANT
86 OUTPUT, 0 /OUTPUT UNIT CONSTANTS
93 OCOUNT, 0 /NUMBER OF OUTPUT UNITS SPECIFIED
97 IBLOCK, 0 /STARTING INPUT BLOCK
98 OBLOCK, 0 /STARTING OUTPUT BLOCK
99 NUMBER, 0 /NUMBER OF BLOCKS TO TRANSFER
100 FIELDS, 0 /-(HIGHEST FIELD AVAILABLE)
101 COUNT, 0 /TEMPORARY COUNTERS
106 UNIT, 0 /UNIT CONSTANT--THIS TRANSFER
107 VERF, 0 /VERIFY SWITCH (1=YES,0=NO)
108 WDCNT, 0 /-(NUMBER OF WORDS PER BLOCK)
109 RW, 0 /READ/WRITE BIT--THIS TRANSFER
110 FLD0, 0 /# OF BLOCKS IN FIELD 0 BUFFER
111 FLDN, 0 /# OF BLOCKS IN FIELD N BUFFER
112 BUF0, 0 /START OF FIELD 0 BUFFER
113 BUFN, 0 /START OF FIELD N BUFFER
114 XNUMB, 0 /# OF BLOCKS LEFT TO TRANSFER
115 BLOCKN, 0 /STARTING BLOCK NUMBER--THIS TRANSFER
119 END0, 0 /BEGINNING OF FIELD 0 VERIFY BUFFER
120 ENTRY, 0 /ENTRY TO TD8E HANDLER
125 MESSG1, TEXT @TD8E COPY V4A@
126 MESSG3, TEXT @ 12-BIT WORDS PER BLOCK@
136 JMP I [END /ONCE ONLY CODE FOR MULTIPLE FIELD TEST
140 JMS UNITNO /MAKE UNIT NUMBER CONSTANT
145 AGAIN, JMS ERR4 /*ILLEGAL RESPONSE*
153 JMS UNITNO /MAKE UNIT NUMBER CONSTANT
158 SNA CLA /IS OUTPUT UNIT = INPUT UNIT ?
159 JMP MORE2+1 /YES--ERROR
161 ISZ OCOUNT /COUNT ONE MORE OUTPUT UNIT
164 SPA CLA /WERE MORE THAN 7 UNITS SPECIFIED?
166 JMS CRLF /YES--CARRIAGE RETURN
167 JMP OALL /IGNORE EXTRA ONE
169 DCA I OPOINT /STORE UNIT CONSTANT IN LIST
173 SPA SNA CLA /ALL UNITS IN?
178 MESSG6 /@FIRST INPUT BLOCK:@
180 JMP WHOLE /COPY WHOLE TAPE
182 SNA CLA /WERE TOO MANY SPECIFIED?
185 ERROR4 /@ILLEGAL RESPONSE@
187 JMP OALL /REPEAT THE QUESTION
191 MESSG7 /@FIRST OUTPUT BLOCK:@
195 MESSG8 /@NUMBER OF BLOCKS TO COPY:@
197 SNA /WERE 0 BLOCKS SPECIFIED?
198 JMP QUEST1 /YES--REPEAT QUESTION
203 DCA NUMBER /0 MEANS WHOLE TAPE
205 MESSG9 /@VERIFY OUTPUT (YES=1,NO=0):@
211 /OUTPUT CARRIAGE RETURN/LINE FEED
218 JMP I CRLF /--RETURN--
222 ERROR4 /@ILLEGAL RESPONSE@
223 JMS CRLF /OUTPUT CARRIAGE RETURN/LINE FEED
228 JMP I ERR4 /--RETURN--
242 JMP I QUEST /--RETURN--
245 /CONVERT UNIT NUMBER TO A WORD OF THE FORM
248 /WHERE XY0 IS THE THIRD DIGIT OF THE IOT
249 /AND 0 OR 1 REFLECTS THE TD8E UNIT NUMBER
250 /ENTER WITH THE UNIT NUMBER IN THE AC
251 /EXIT WITH SPECIAL CODE IN AC
254 AND [7 /MASK OUT ALL EXTRANEOUS BITS
255 CLL RAR /SAVE 0/1 BIT IN LINK
256 MQL /STORE ROTATED WORD, CLEAR AC
258 SWP /PRESERVE 0/1 BIT IN MQ
259 TAD TABX /GET DEVICE NUMBER CORRECTLY
263 JMP I UNITNO /--RETURN--
267 /SKIP 4 LINES AND FETCH MARK TRACK
273 JMP I SKIPQ /--RETURN--
277 /USER RESPONSE HANDLER
278 /USES MQ FOR TEMPORARY STORAGE
279 /EXIT WITH RESPONSE IN MQ
280 /EXIT TO CALL+1 IF JUST CARRIAGE RETURN
281 /OR ILLEGAL CHARACTER, CARRIAGE RETURN
282 /OR ;,CARRIAGE RETURN
283 /EXIT TO CALL+2 IF GOOD DATA, CARRIAGE RETURN
284 /INCREMENT COUNT AND EXIT TO CALL+2 IF GOOD DATA;
285 /ILLEGAL CHARACTERS CAUSE WHOLE ANSWER TO BE IGNORED
292 MORE, JMS LISTEN /FETCH A CHARACTER
294 SZA /IS IT A CARRIAGE RETURN?
296 TAD [212 /YES--OUTPUT LINE FEED
298 SWITCH, NOP /SET UP EXIT ADDRESS
299 JMP I ANSWER /--RETURN--
301 SPA /IS CHARACTER LESS THAN 260?
302 JMP BAD /YES--ILLEGAL CHARACTER
304 SMA /IS IT MORE THAN 269?
305 JMP SEMI /YES--CHECK FOR SEMICOLON
306 TAD (270 /RESTORE CHARACTER
307 AND [7 /MASK OUT EXTRANEOUS BITS
310 AND (777 /MASK OUT FIRST DIGIT IF THERE ARE 4
313 MQA /FETCH NEW CHARACTER
314 MQL /STORE RESULT IN MQ
315 TAD SKIP /SET UP TO SKIP ON RETURN
317 JMP MORE /FETCH ANOTHER
323 BAD, CLA /ILLEGAL CHARACTER
325 JMP I ANSWER /--RETURN--
331 SZA CLA /IS CHARACTER A SEMICOLON?
332 JMP BAD /NO--ILLEGAL CHARACTER
333 ISZ COUNT /YES--INCREMENT COUNTER
334 JMP SWITCH /EXIT FROM ANSWER ROUTINE
337 /TELETYPE INPUT AND ECHO HANDLER
344 JMS CHECK /CHECK FOR CTRL/C AND CTRL/S
345 JMP I LISTEN /--RETURN--
347 /CHECK FOR CTRL/C AND CTRL/S
348 /ENTER WITH INPUT CHARACTER IN AC
349 /EXIT TO HANDLER OR WITH CHARACTER IN AC
354 JMP I CTRLC /YES--HANDLE IT
357 JMP I [REPEAT /YES--HANDLE IT
358 TAD (223 /RESTORE CHARACTER
359 JMP I CHECK /--RETURN--
363 /MESSAGE OUTPUT HANDLER
365 /EXPECTS MESSAGE ADDRESS TO BE IN LOCATION AFTER CALL
370 DCA FINDER /SET UP POINTER
372 DCA LOC /SET L/R SWITCH TO L (EVEN)
373 LNEXT, TAD I FINDER /GET WORD
376 SNA /IS CHARACTER 0 (TERMINATOR)?
377 JMP I MESSGE /YES--RETURN--
381 SNA CLA /IS IT A LETTER?
382 TAD [100 /YES--301-337
383 TAD [200 /NO--240-277
384 TAD CHAR /RESTORE CHARACTER
389 SZL CLA /WHICH HALF WAS THAT?
400 /TELETYPE OUTPUT ROUTINE
408 JMP I TYPE /--RETURN--
411 /INSERT IOT'S ACCORDING TO TABLES
412 /UNIT CONTAINS APPROPRIATE UNIT CODE
413 /COUNT CONTAINS -(NUMBER OF IOT'S TO TRANSFER)
414 /COUNT1 CONTAINS ADDRESS OF ADDRESS TABLE
415 /UNIT CONTAINS UNIT CODE OF CURRENT UNIT
422 TAD I COUNT3 /MAKE NEW IOT
426 TAD I COUNT3 /COMPARE WITH IOT FROM PROGRAM
427 SNA CLA /ARE THE IOT'S THE SAME AS THE LAST UNIT?
428 JMP I INSERT /YES--RETURN--
431 TAD I COUNT3 /GET IOT FROM PROGRAM
432 AND (7007 /RETAIN ONLY SIGNIFICANT BITS
433 MQA /OR IN UNIT NUMBER
434 DCA I COUNT3 /PUT IT IN PROGRAM
435 ISZ COUNT1 /BUMP COUNTERS
438 JMP I INSERT /YES--RETURN--
443 /COUNT THE NUMBER OF WORDS PER BLOCK
445 /BE SURE ALL TAPES MATCH INPUT FORMAT
448 DCA OPOINT /SET POINTER TO I/O LIST
449 DCA COUNT2 /CLEAR COUNTER
452 DCA OUTNUM /SET # OF UNITS
453 SET4, TAD (TABLE1-END1-1 /SET UP COUNTERS FOR IOT FIX
459 JMS I [INSERT /PUT THE PROPER IOT'S IN THE FOLLOWING ROUTINE
460 DCA WDCNT /CLEAR WORD COUNT
468 SZL /DOES UNIT EXIST?
470 SELERR, JMS I [ERR3 /@SELECT ERROR UNIT N@
475 TAD UNIT /GET 0 OR 1 UNIT BIT (0 OR 4000)
477 TAD [1000 /GET GO BIT
478 IOTX1, SDLC /START READING FORWARD
479 JMS SKIP4 /SKIP 8 LINES TO AVOID GARBAGE
481 IOTX3, SDSS /LOOK FOR FORWARD BLOCK NUMBER (26)
487 JMP IOTX3 /NO--KEEP LOOKING
489 SET2, JMS SKIP4 /YES--START COUNTING LINES BY FOURS
494 SZA CLA /FOUND GUARD YET?
498 IOTX2, SDLC /STOP UNIT
501 SZA /IS THIS THE INPUT UNIT?
503 TAD (-11 /YES--SAVE THE COUNT
507 JMP SET3 /FIRST OUTPUT UNIT
508 SET5, TAD (-11 /NOT INPUT UNIT
510 SZA CLA /SAME NUMBER OF WORDS AS INPUT UNIT?
511 JMP ERR5 /NO*ILLEGAL FORMAT*
512 SET3, ISZ OPOINT /NEXT UNIT
513 ISZ OUTNUM /DONE YET?
515 TAD COUNT2 /YES--PRINT MESSAGE
516 DCA I [MWORDS /SET UP NUMBER OF WORDS PER BLOCK
519 JMS I [PRINT /PRINT 4 DIGIT NUMBER OF BLOCKS
520 JMS I [MESSGE /YES--PRINT REST OF MESSAGE
524 /IF WHOLE TAPE IS TO BE COPIED, IT IS NECESSARY TO
525 /COMPUTE THE NUMBER OF BLOCKS ON THE TAPE (NB)
526 /USING THE NUMBER OF WORDS PER BLOCK (WB)
528 /OCTAL: NB=[63 6160/(WB+17)]+2
529 /DECIMAL: NB=[212,080/(WB+15)]+2
532 SZA CLA /COPY WHOLE TAPE?
534 DCA COUNT /YES--COMPUTE NUMBER OF BLOCKS ON TAPE
538 DCA COUNT1 /GET NUMBER OF WORDS PER BLOCK+17
544 ISZ COUNT /COUNT A BLOCK--TOO MANY?
551 TAD COUNT /COUNT IS [63 6160/WB+17]+1
553 DCA NUMBER /STORE AS # OF BLOCKS TO TRANSFER
559 ERROR5 /*ILLEGAL FORMAT UNIT*
560 JMS I [DECODE /PRINT UNIT NUMBER
561 JMS I [CTRLR /WAIT FOR CTRL/R
562 JMS I [CRLF /CARRIAGE RETURN/LINE FEED
568 /READ FOUR LINES AND FETCH MARK TRACK
574 JMP I SKIP4 /--RETURN--
581 /IS TAPE TO BE VERIFIED?
582 /SET UP DEPENDING ON RESPONSE
604 JMS I [LISTEN /FETCH CHARACTER
606 SZA CLA /IT IT CTRL/R?
607 JMP .-3 /NO--WAIT FOR ONE
608 JMS I [CRLF /CARRIAGE RETURN/LINE FEED
609 JMP I CTRLR /--RETURN--
614 JMS I [QUEST /@REPEAT (YES=1;NO=0):@
620 JMP I [START+4 /NO--RESTART
622 MESSG6, TEXT @FIRST INPUT BLOCK:@
623 MESSG7, TEXT @FIRST OUTPUT BLOCK:@
624 MESSG8, TEXT @NUMBER OF BLOCKS TO COPY:@
625 MESSG9, TEXT @VERIFY OUTPUT (YES=1,NO=0):@
627 MESS11, TEXT @REPEAT (YES=1,NO=0):@
628 ERROR1, TEXT @VERIFY ERROR BLOCK @
629 ERROR2, TEXT @TAPE ERROR BLOCK @
630 ERROR3, TEXT @SELECT ERROR UNIT @
634 /SETUP FOR ACTUAL READ/WRITE/VERIFY OPERATION
635 DOIT, TAD [LIMIT-END /SET UP NUMBER OF BLOCKS
636 JMS DIV1 /IN FIELD 0 BUFFER
639 JMS DIV1 /AND IN FIELD N BUFFERS
641 TAD IBLOCK /SET UP RUNNING COUNTERS AND POINTERS
642 DCA INB /FOR NEXT INPUT BLOCK
644 DCA OUTB /FOR NEXT OUTPUT BLOCK
646 DCA NUMB1 /FOR NUMBER OF BLOCKS LEFT TO TRANSFER
649 SNA CLA /DONE WITH ALL BLOCKS YET?
652 READX, TAD LIST /NO--SET UP POINTER TO OUTPUT UNITS
659 TAD NUMB1 /SET POINTERS FOR TRANSFER
662 DCA NUMB2 /SAVE COUNTER FOR WRITE
663 TAD INPUT /SELECT INPUT UNIT
665 DCA RW /SET R/W BIT TO READ
667 TAD [END /SET START OF BUFFERS IN CASE
668 DCA BUF0 /THEY WERE CHANGED BY VERIFY
670 JMS I [READY /FILL THE BUFFERS
671 TAD XNUMB /SAVE THE POINTERS
677 ISZ OUTNUM /DONE WITH ALL UNITS YET?
678 JMP .+4 /NO--CONTINUE WRITING
681 JMP ALLDUN /READ ANOTHER BUFFER LOAD
685 DCA BLOCKN /RESET POINTERS
687 DCA VB /SAVE COUNTER FOR VERIFY
690 TAD I OPOINT /SELECT OUTPUT UNIT
692 CLA CLL CML RAR /AC=4000
693 DCA RW /SET R/W BIT TO WRITE
702 /SEE HOW MANY BLOCKS WILL FIT INTO BUFFER
703 /ENTER WITH BUFFER SIZE IN AC
704 /EXIT WITH # OF BLOCKS IN AC
709 TAD COUNT1 /TOTAL WORDS
711 TAD I [MWORDS /-NUMBER OF WORDS PER BLOCK
712 SNL /RUN OUT OF ROOM?
714 ISZ COUNT /NO--COUNT A BLOCK
716 CLA CLL /IGNORE LESS THAN A BLOCK LEFT
718 VERF1, RAR /DIVIDE BY 2 IF VERIFY (NOP IF NO VERIFY)
719 JMP I DIV1 /--RETURN--
722 /REWIND TAPES TO INITIAL END ZONE
726 DCA COUNT2 /SET NUMBER OF TAPES STILL SPINNING
729 DCA OPOINT /SET POINTER TO UNIT LIST
733 DCA OUTNUM /SET NUMBER OF UNITS IN LIST
735 JMS I [CHECK /CHECK TTY FOR CTRL/S OR CTRL/C
736 ISZ OUTNUM /DONE WITH WHOLE LIST YET?
738 JMP RLIST /YES--START THROUGH LIST AGAIN
740 TAD I OPOINT /GET UNIT CODE
742 SZL CLA /STILL SPINNING?
743 JMP RUNIT /NO--TRY NEXT TAPE
752 JMS I [INSERT /PUT PROPER IOT'S IN THIS ROUTINE
755 TAD [3000 /REVERSE/GO
758 JMS I [SKIPQ /WAIT FOR DRIVE TO GET UP TO SPEED
761 IOTR3, SDRC /GET MARK TRACK BITS
765 JMP RUNIT /NO--NEXT UNIT
766 CLA CLL CML RTR /AC=2000
767 MQA /UNIT CODE STILL IN MQ FROM INSERT
768 DCA I OPOINT /SET STOPPED BIT
771 IOTR4, SDLC /STOP UNIT
773 ISZ COUNT2 /ALL TAPES STOPPED?
774 JMP RUNIT /NO--NEXT UNIT
783 /VERIFICATION ROUTINES
785 VERIFY, TAD VB /SET POINTERS AND COUNTERS FOR TRANSFER
790 TAD END0 /SET BEGINNINGS OF VERIFY BUFFERS
796 JMS I [READY /READ VERIFY BUFFERS FULL
797 TAD COUNT1 /GET # OF BLOCKS IN LAST BUFFER FILLED
799 CMA /SET AUTOINDEX POINTERS TO BUFFERS
808 DCA COUNT /SET NUMBER OF FIELDS WHICH WERE FILLED
809 JMS COMP4 /GET NUMBER OF BLOCKS
812 DCA COUNT4 /SET COUNTER
813 JMS COMP /COMPARE THE BUFFERS
818 JMS COMP4 /GET NUMBER OF BLOCKS
822 TAD COMP2 /EACH FIELD------
824 DCA COMP2 /SET CDF INSTRUCTION PROPERLY
825 CMA CLL /SET AUTOINDEX POINTERS TO BUFFERS
830 JMP COMP3 /DO THE NEXT FIELD
834 /EXIT TO CALL+1 WITH AC CLEAR IF
836 /EXIT TO CALL+2 WITH # OF BLOCKS IN AC IF
840 ISZ COUNT /LAST FIELD FILLED?
841 JMP I COMP4 /NO--RETURN--
842 TAD XNUMB /YES--OUT OF BLOCKS?
844 JMP I COMP4 /NO--RETURN--
845 TAD COUNT3 /YES--GET ACTUAL # OF BLOCKS
846 ISZ COMP4 /INCREMENT RETURN ADDRESS
847 JMP I COMP4 /--RETURN--
850 /COMPARE PORTION OF VERIFY ROUTINE
853 TAD I [MWORDS /SET NUMBER OF WORDS PER BLOCK COUNTER
855 COMP2, HALT /SHOULD CONTAIN CDF N
856 TAD I X11 /GET CORRESPONDING WORDS FROM EACH BUFFER
860 SZA CLA /DO WORDS MATCH?
861 JMP ERR1 /NO--VERIFY ERROR
862 TRY, ISZ COUNT2 /DONE WITH BLOCK?
863 JMP COMP2 /NO--CONTINUE
864 ISZ COUNT4 /DONE WITH ALL BLOCKS?
866 JMP I COMP /YES--RETURN--
869 ERROR1 /*VERIFY ERROR BLOCK *
870 TAD COUNT4 /GET CURRENT BLOCK NUMBER
872 TAD I (BLOCKS /FROM BLOCK THIS OPERATION STARTED WITH
873 JMS PRINT /PRINT 4 DIGIT BLOCK NUMBER
876 JMS I [DECODE /PRINT UNIT NUMBER
877 WAIT, JMS I [LISTEN /WAIT FOR RESPONSE
883 JMP I [WRITEX /YES--TRY AGAIN
885 SZA CLA /WAS IT CTRL/R?
886 JMP WAIT /NO--WAIT FOR A GOOD RESPONSE
887 JMP TRY /YES--IGNORE AND CONTINUE
892 /PRINT A 4 DIGIT OCTAL NUMBER
893 /ENTER WITH NUMBER IN AC
896 DCA I [MESSGE /TEMPORARY STORAGE
898 DCA I [ANSWER /SET DIGIT COUNTER
909 JMS I [TYPE /PRINT ONE DIGIT
910 ISZ I [ANSWER /DONE YET?
912 JMP I PRINT /YES--RETURN--
915 /CLEAN UP UNIT TABLES AFTER REWIND
921 DCA OUTNUM /SET POINTER AND COUNTER
922 CLEAN1, TAD I OPOINT /GET UNIT CODE
923 AND (4770 /MASK OUT EXTRANEOUS BITS
924 DCA I OPOINT /REPLACE IT
926 ISZ OUTNUM /DONE YET?
928 JMP I [DOIT /YES--NEXT OPERATION
935 /FILL ALL N FIELDS ONCE
937 /# OF BLOCKS FOR FIELD 0 IN FLD0
938 /# OF BLOCKS FOR OTHERS IN FLDN
939 /ADDRESSES OF BUFFERS IN BUF0, BUFN
940 /R/W BIT (0 OR 4000) IN RW
949 JMS I [INSERT /PUT PROPER IOT'S IN HANDLER
951 SPA CLA /EVEN OR ODD UNIT NUMBER?
954 DCA ENTRY /SET UP ENTRY TO HANDLER
956 MQL /STORE UNIT BIT FOR LATER
958 TAD FIELDS /SET COUNTER FOR # OF FIELDS
961 TAD FLD0 /ADJUST NUMBER OF BLOCKS TO
962 JMS SUB1 /TRANSFER DEPENDING ON NUMBER
963 TAD FLD0 /LEFT TO BE TRANSFERRED
964 JMS SUB2 /RESET FUNCTION WORD
965 TAD BUF0 /SET UP BUFFER POINTERS
967 JMS TRANS /TRANSFER DATA--FIELD 0
968 ZOOM, ISZ COUNT /BEGINNING OF LOOP FOR EACH FIELD ABOVE 0
970 JMP I READY /YES--RETURN--
977 RTL /GET FIELD SETTING READY
979 TAD FUNCTN /GET PREVIOUS FUNCTION WORD
980 AND [4000 /GET R/W BIT
981 MQA /OR IN FIELD SETTING
984 TAD FLDN /ADJUST NUMBER OF BLOCKS TO TRANSFER
987 JMS SUB2 /AND RESET FUNCTION WORD
989 JMS SUB3 /SET UP BUFFER POINTERS
990 JMS TRANS /TRANSFER DATA--FIELDS 1-N
991 JMP ZOOM /FILL ANOTHER FIELD
997 SMA /ARE THERE LESS BLOCKS LEFT THAN A FIELD FULL?
998 DCA XNUMB /NO--REDUCE COUNT OF BLOCKS LEFT
999 JMP I SUB1 /YES-TRANSFER BLOCKS LEFT--RETURN--
1002 DCA COUNT1 /LINK=1 IF BLOCKS LEFT, 0 IF NONE
1003 SNL /DONE WITH ALL BLOCKS YET?
1004 DCA XNUMB /YES--BUMP SWITCH
1007 MQA /PUT # OF BLOCKS INTO FUNCTION WORD
1008 DCA FUNCTN /START REVERSE
1009 JMP I SUB2 /--RETURN--
1014 TAD BLOCKN /SET STARTING BLOCK NUMBER
1018 DCA BLOCKN /RESET STARTING BLOCK FOR NEXT TIME
1019 JMP I SUB3 /--RETURN--
1022 /CALL TO THE HANDLER
1025 JMS I [PARITY /CHECK TELETYPE
1026 JMS I [CHECK /WAS ^C OR ^S TYPED?
1028 FUNCTN, 0 /FUNCTION WORD
1029 BUFADD, 0 /BUFFER ADDRESS
1030 BLOCKS, 0 /STARTING BLOCK NUMBER
1031 JMP ERR /ERROR RETURN
1032 JMS I [PARITY /CHECK TELETYPE
1033 JMS I [CHECK /WAS ^C OR ^S TYPED?
1037 JMP I TRANS /NO--RETURN--
1039 JMP I READY /--RETURN--
1040 JMP I READY /--RETURN--
1042 /TRANSFER ERROR HANDLER
1044 ERR, SNA CLA /FATAL ERROR?
1047 ERROR2 /*TAPE ERROR BLOCK *
1049 JMS I [PRINT /PRINT BLOCK NUMBER
1052 JMS DECODE /PRINT UNIT NUMBER
1056 ISZ FUNCTN /TURN AROUND AND TRY AGAIN
1062 ERROR3 /*SELECT ERROR UNIT *
1063 JMS DECODE /PRINT UNIT NUMBER
1064 JMS CTRLR /WAIT FOR CTRL/R
1065 JMP I ERR3 /--RETURN--
1068 /DECODE UNIT NUMBER FOR PRINTING
1069 /PRINT UNIT NUMBER BEFORE RETURNING
1075 MQL /SAVE ROTATED CODE IN MQ
1077 SWP /SAVE EVEN/ODD BIT IN MQ
1078 RAR /WORK ON IOT CODE
1083 MQA /INCLUDE EVEN/ODD BIT
1084 TAD [260 /MAKE ASCII DIGIT
1086 JMP I DECODE /--RETURN--
1092 /TD8E DECTAPE HANDLER
1094 /SLIGHTLY MODIFIED VERSION OF DEC-E8-UZTA-D
1095 /COPYRIGHT 1971 DIGITAL EQUIPMENT CORPORATION
1096 / MAYNARD, MASSACHUSETTS 01754
1098 /THE CALLING SEQUENCE IS:
1104 / NORMAL RETURN (AC CLEAR)
1107 / BIT 0: 0=READ, 1=WRITE
1108 / BITS 1-5: # OF BLOCKS TO BE TRANSFERRED
1109 / BITS 6-8: FIELD OF BUFFER AREA
1111 / BIT 11: 1=START FORWARD, 0=START REVERSE
1114 /THE HANDLER DETECTS TWO TYPES OF ERRORS:
1118 / TOO GREAT A BLOCK NUMBER
1119 /FATAL ERRORS TAKE ERROR RETURN WITH AC=4000
1121 / SELECT ERROR (IMPROPER UNIT NUMBER OR NO UNIT NUMBER)
1122 /NON-FATAL ERROR TAKES ERROR RETURN WITH AC=0
1128 DTA0, 0 /ENTRY POINT FROM UNIT 0
1132 DTA1, 0 /UNIT 2 ENTRY
1133 CLA CLL CML /1 TO LINK
1135 DCA DTA0 /PICK UP ARGS AT DTA0
1137 DCA YUNIT /LINK TO UNIT POSITION
1139 TAD C6203 /GET DATA FIELD AND SETUP RETURN
1141 TAD YUNIT /GET FUNCTION WORD
1142 IOT4, SDLC /PUT FUNCTION INTO DATA REGISTER
1147 DCA WCOUNT /STORE MASTER WORD COUNT
1151 ISZ DTA0 /TO BLOCK NUMBER
1154 ISZ DTA0 /POINT TO ERROR EXIT
1155 CIF CDF MFIELD /TO ROUTINES DATA FIELD
1156 IOT2, SDRD /GET FUNCTION INTO AC
1158 AND CM200 /GET # PAGES TO XFER
1161 C374, AND C70 /GET FIELD FOR XFER
1162 TAD C6201 /FORM CDF N
1163 DCA XFIELD /IF=0 AND DF=N AT XFER.
1165 DCA TRYCNT /3 ERROR TRIES
1171 IOT6, SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG.
1175 IOT7, SDRD /GET MOTION BIT TO LINK
1177 JMP GO /AND START THE MOTION.
1178 RWCOM, SDST /ANY CHECKSUM ERRORS?
1179 SZA CLA /OR CHECKSUM ERRORS?
1180 JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS
1181 /SET AT RWCOM. GETCHK SETS IT.
1182 TAD PGCT /NO ERROR..FINISHED XFER?
1185 JMP EXIT /ALL DONE. GET OUT
1186 DCA PGCT /NEW PAGE COUNT
1187 ISZ BLOCK /NEXT BLOCK TO XFER
1188 TAD WCOUNT /FORM NEXT BUFFER ADDRESS
1192 CLL CML /FORCES MOTION FORWARD
1193 GO, CLA CML RTR /LINK BECOMES MOTION BIT
1195 TAD YUNIT /PUT IN 'GO' AND UNIT #
1196 IOT8, SDLC /LOOK FOR BLOCK NO.
1197 JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK
1199 CM200, 7600 /COULD HAVE SAVED A LOC. HERE
1201 JMP .-1 /WAIT FOR SINGLE LINE FLAG
1203 CLL RTL /DIRECTION TO LINK. INFO BITS
1205 AND C374 /ISOLATE MARK TRACK BITS
1206 TAD M110 /IS IT END ZONE?
1207 SNA /THE LINK STAYS SAME THRU THIS
1209 TAD M20 /CHECK FOR BLOCK MARK
1212 IOT10, SDRD /GET THE BLOCK NUMBER
1213 SZL /IF WE ARE IN REVERSE, LOOK FOR 3
1214 /BLOCKS BEFORE TARGET BLOCK. THIS
1215 /ALLOWS TURNAROUND AND UP TO SPEED.
1219 CMA /IS IT RIGHT BLOCK?
1221 JMP FOUND /YES..HOORAY!
1222 M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT?
1223 /ABOVE SNA IS SUPERFLUOUS.
1225 ENDZ, SDRC /WE ARE IN THE END ZONE
1226 CLL RTL /DIRECTION TO LINK
1227 CLA /ARE WE IN REVERSE?
1228 JMP GO /YES..TURN US AROUND
1229 /IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR
1234 JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN
1236 CLL CML /AC=0 ON NORMAL RETURN
1241 JMP I DTA0 /--RETURN--
1261 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION?
1262 JMP GO /WRONG..TURN AROUND
1263 TAD YUNIT /PUT UNIT INTO LINK
1264 CLL RAL /AC IS NOW 0
1265 C70, 70 /********DON'T MOVE THIS!!!!******
1267 TAD BUFF /GET BUFFER ADDRESS
1268 XFIELD, HLT /INTO NEXT PAGE
1279 JMP REVGRD /LOOK FOR REVERSE GUARD
1282 TAD CM32 /IS IT REVERSE GUARD?
1284 JMP REVGRD /NO.KEEP LOOKING
1286 DCA WORDS /WORD COUNTER
1287 TAD XFUNCT /GET FUNCTION READ OR WRITE
1289 JMP READ /NEG. IS WRITE
1291 AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR
1292 CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS
1294 JMP I CFATAL /FATAL ERROR. LINK MUST BE ON
1295 JMS RDQUAD /NO ONE EVER USES THIS WORD!
1298 TAD XUNIT /INITIATE WRITE MODE
1301 JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM
1304 WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE!
1306 ISZ XBUFF /BUMP CORE POINTER
1307 K77, 77 /ABOVE MAY SKIP
1308 ISZ WORDS /DONE THIS BLOCK?
1309 JMP WRLP /NOT YET..LOOP A WHILE
1310 TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK?
1311 CLL RTR /IF NO, WRITE A 0 WORD
1314 JMS WRQUAD /WRITE A WORD OF 0
1315 JMS GETCHK /DO THE CHECK SUM
1316 JMS WRQUAD /WRITE FORWARD CHECKSUM
1317 JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN
1323 JMS RDQUAD /SKIP CONTROL WORDS
1325 TAD K7700 /TACK 7700 ONTO CHECKSUM.
1326 DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY
1328 JMS EQUFUN /COMPUT CHECKSUM AS WE GO
1329 DCA I XBUFF /IT GETS CONDENSED LATER
1331 C300, 300 /PROTECTION
1332 ISZ WORDS /DONE THIS OP?
1333 JMP RDLP /NO SUCH LUCK
1334 TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND
1335 CLL RTR /CHECKSUM THE LAST TAPE WORD
1338 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK
1339 JMS EQUFUN /CHECKSUM IT
1340 RDLP2, JMS RDQUAD /READ CHECKSUM
1343 JMS GETCHK /GET SIX BIT CHECKSUM
1346 WRQUAD, 0 /WRITE OUT A 12 BIT WORD
1347 JMS EQUFUN /ADD THIS TO CHECKSUM
1348 IOT13, SDSQ /SKIP ON QUADLINE FLAG
1350 IOT14, SDLD /LOAD DATA ONTO BUS
1351 CLA /SDLD DOESN'T CLEAR AC
1354 RDQUAD, 0 /READ A 12 BIT WORD
1357 IOT15, SDRD /READ DATA
1361 EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM
1363 DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE
1364 TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD
1365 AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE
1366 CIA /IS ASSOCIATIVE, WE CAN DO IT 12
1367 CLL RAL /BITS AT A TIME AND CONDENSE LATER.
1368 TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES:
1369 TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B)
1370 DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B)
1371 TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B))
1375 GETCHK, 0 /FORM 6 BIT CHECKSUM
1383 CLA CLL CML /FORCES LINK ON AT RWCOM
1408 /IOT TABLES FOR TD8E SUBROUTINE
1449 /IOT TABLES FOR WORDS PER BLOCK ROUTINE
1460 \fMESSG4, TEXT @FROM UNIT:@
1461 MESSG5, TEXT @TO UNITS:@
1462 ERROR5, TEXT @ILLEGAL FORMAT UNIT @
1463 ERROR6, TEXT @ UNIT @
1464 ERROR4, TEXT @ILLEGAL RESPONSE@
1471 MESSG2 /@HIGHEST FIELD AVAILABLE:@
1479 SNA /MORE THAN 1 FIELD??
1480 JMP LIM /NO--NO PROBLEM
1481 DCA COUNT1 /YES--ARE THEY ALL PRESENT?
1484 DCA CDF00 /SET FOR DATA FIELD CHANGE
1487 DCA I (10 /TRY LOCATION 10
1492 SNA CLA /IS FIELD THERE?
1493 JMP NEXT1 /YES--TRY NEXT ONE
1495 ERROR4 /ILLEGAL RESPONSE
1496 JMS I [CRLF /CARRIAGE RETURN/LINE FEED
1497 DCA COUNT /CLEAR COUNT
1499 NEXT1, ISZ COUNT1 /DONE YET?
1502 LIM, TAD (LIMIT-END /SET BEGINNING OF VERIFY BUFFER
1509 MESSG2, TEXT @HIGHEST FIELD AVAILABLE:@