software: Added more and more
[pdp8.git] / sw / os8 / v3d / sources / system / dectapes / dectape3 / TDCOPY.PA
diff --git a/sw/os8/v3d/sources/system/dectapes/dectape3/TDCOPY.PA b/sw/os8/v3d/sources/system/dectapes/dectape3/TDCOPY.PA
new file mode 100644 (file)
index 0000000..e211680
--- /dev/null
@@ -0,0 +1,1515 @@
+/TD8E DECTAPE COPY, V4
+/
+/
+/
+/
+/
+/
+//
+/
+/
+/
+/
+/COPYRIGHT (C) 1972, 1975
+/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
+/
+/
+/
+/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
+/SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
+/SION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE, OR ANT OTHER
+/COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
+/TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
+/AGREES TO THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE
+/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
+/
+/
+/THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
+/NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
+/EQUIPMRNT COROPATION.
+/
+/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
+/SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
+/
+/
+/
+/
+/
+/
+\f
+
+
+/DEFINITIONS FOR PAL8 AND PAL10
+
+BSW=7002
+MQL=7421
+MQA=7501
+CAM=7621
+SWP=7521
+ACL=7701
+CAF=6007
+CDI=6203
+KCF=6030
+SDSS=6771
+SDST=6772
+SDSQ=6773
+SDLC=6774
+SDLD=6775
+SDRC=6776
+SDRD=6777
+FIXTAB
+
+
+HALT=HLT
+
+
+/UNIT NUMBER DEFINITIONS FOR TD8E IOT'S
+
+UNIT01=0770
+UNIT23=0760
+UNIT45=0750
+UNIT67=0740
+
+\f
+
+LIMIT=7600
+
+*11
+
+X11,   0
+X12,   0
+
+/PAGE 0 CONSTANTS AND VARIABLES
+
+*20
+INPUT, 0               /INPUT UNIT CONSTANT
+OUTPUT,        0               /OUTPUT UNIT CONSTANTS
+       0
+       0
+       0
+       0
+       0
+       0
+OCOUNT,        0               /NUMBER OF OUTPUT UNITS SPECIFIED
+OPOINT,        0
+LIST,  OUTPUT-1
+OUTNUM,        0
+IBLOCK,        0               /STARTING INPUT BLOCK
+OBLOCK,        0               /STARTING OUTPUT BLOCK
+NUMBER,        0               /NUMBER OF BLOCKS TO TRANSFER
+FIELDS,        0               /-(HIGHEST FIELD AVAILABLE)
+COUNT, 0               /TEMPORARY COUNTERS
+COUNT1,        0               /  "
+COUNT2,        0               /  "
+COUNT3,        0               /  "
+COUNT4,        0               /  "
+UNIT,  0               /UNIT CONSTANT--THIS TRANSFER
+VERF,  0               /VERIFY SWITCH (1=YES,0=NO)
+WDCNT, 0               /-(NUMBER OF WORDS PER BLOCK)
+RW,    0               /READ/WRITE BIT--THIS TRANSFER
+FLD0,  0               /# OF BLOCKS IN FIELD 0 BUFFER
+FLDN,  0               /# OF BLOCKS IN FIELD N BUFFER
+BUF0,  0               /START OF FIELD 0 BUFFER
+BUFN,  0               /START OF FIELD N BUFFER
+XNUMB, 0               /# OF BLOCKS LEFT TO TRANSFER
+BLOCKN,        0               /STARTING BLOCK NUMBER--THIS TRANSFER
+NUMB1, 0
+NUMB2, 0
+VB,    0
+END0,  0               /BEGINNING OF FIELD 0 VERIFY BUFFER
+ENTRY, 0               /ENTRY TO TD8E HANDLER
+INB,   0
+OUTB,  0
+OHOLD, 0
+\f
+MESSG1,        TEXT @TD8E COPY V4A@
+MESSG3,        TEXT @ 12-BIT WORDS PER BLOCK@
+\f
+*200
+
+START, TLS
+       JMS CRLF
+       JMS I [MESSGE
+       MESSG1          /@TD8E COPY@
+       JMS CRLF
+       DCA COUNT
+       JMP I [END      /ONCE ONLY CODE FOR MULTIPLE FIELD TEST
+START1,        JMS QUEST
+       MESSG4          /@FROM UNIT:@
+       SWP
+       JMS UNITNO      /MAKE UNIT NUMBER CONSTANT
+       DCA INPUT
+       TAD LIST
+       DCA OPOINT
+       SKP
+AGAIN, JMS ERR4        /*ILLEGAL RESPONSE*
+       DCA OCOUNT
+       DCA COUNT
+       JMS I [MESSGE
+       MESSG5          /@TO UNITS:@
+MORE2, JMS I [ANSWER
+       JMP AGAIN
+       ACL
+       JMS UNITNO      /MAKE UNIT NUMBER CONSTANT
+       MQL             /STORE IN MQ
+       MQA             /RESTORE TO AC
+       CIA
+       TAD INPUT
+       SNA CLA         /IS OUTPUT UNIT = INPUT UNIT ?
+       JMP MORE2+1     /YES--ERROR
+       ISZ OPOINT
+       ISZ OCOUNT      /COUNT ONE MORE OUTPUT UNIT
+       TAD OCOUNT
+       TAD [-10
+       SPA CLA         /WERE MORE THAN 7 UNITS SPECIFIED?
+       JMP .+3
+       JMS CRLF        /YES--CARRIAGE RETURN
+       JMP OALL        /IGNORE EXTRA ONE
+       SWP             /NO--
+       DCA I OPOINT    /STORE UNIT CONSTANT IN LIST
+       TAD COUNT
+       CIA
+       TAD OCOUNT
+       SPA SNA CLA     /ALL UNITS IN?
+       JMP MORE2       /YES
+\f
+OALL,  DCA COUNT
+       JMS I [MESSGE
+       MESSG6          /@FIRST INPUT BLOCK:@
+       JMS I [ANSWER
+       JMP WHOLE       /COPY WHOLE TAPE
+       TAD COUNT
+       SNA CLA         /WERE TOO MANY SPECIFIED?
+       JMP .+5
+       JMS I [MESSGE   /YES
+       ERROR4          /@ILLEGAL RESPONSE@
+       JMS CRLF
+       JMP OALL        /REPEAT THE QUESTION
+       ACL             /NO
+       DCA IBLOCK      /STORE
+       JMS QUEST
+       MESSG7          /@FIRST OUTPUT BLOCK:@
+       ACL
+       DCA OBLOCK
+       JMS QUEST
+       MESSG8          /@NUMBER OF BLOCKS TO COPY:@
+       ACL
+       SNA             /WERE 0 BLOCKS SPECIFIED?
+       JMP QUEST1      /YES--REPEAT QUESTION
+       DCA NUMBER
+       JMP .+4
+WHOLE, DCA IBLOCK
+       DCA OBLOCK
+       DCA NUMBER      /0 MEANS WHOLE TAPE
+       JMS QUEST
+       MESSG9          /@VERIFY OUTPUT (YES=1,NO=0):@
+       ACL
+       AND [7
+       DCA VERF
+       JMP I (SETUP
+\f
+/OUTPUT CARRIAGE RETURN/LINE FEED
+
+CRLF,  0
+       TAD (215
+       JMS I [TYPE
+       TAD [212
+       JMS I [TYPE
+       JMP I CRLF      /--RETURN--
+
+ERR4,  0
+       JMS I [MESSGE
+       ERROR4          /@ILLEGAL RESPONSE@
+       JMS CRLF        /OUTPUT CARRIAGE RETURN/LINE FEED
+       TAD [-4
+       TAD ERR4
+       DCA ERR4
+       DCA COUNT
+       JMP I ERR4      /--RETURN--
+
+\f
+QUEST, 0
+       TAD I QUEST
+       DCA MNUM
+       ISZ QUEST
+       JMS I [MESSGE
+MNUM,  0
+       JMS I [ANSWER
+QUEST1,        JMS ERR4
+       TAD COUNT
+       SZA CLA
+       JMP QUEST1
+       JMP I QUEST     /--RETURN--
+
+
+/CONVERT UNIT NUMBER TO A WORD OF THE FORM
+/000 XXX XXX 000 OR
+/100 XXX XXX 000
+/WHERE XY0 IS THE THIRD DIGIT OF THE IOT
+/AND 0 OR 1 REFLECTS THE TD8E UNIT NUMBER
+/ENTER WITH THE UNIT NUMBER IN THE AC
+/EXIT WITH SPECIAL CODE IN AC
+
+UNITNO,        0
+       AND [7          /MASK OUT ALL EXTRANEOUS BITS
+       CLL RAR         /SAVE 0/1 BIT IN LINK
+       MQL             /STORE ROTATED WORD, CLEAR AC
+       RAR
+       SWP             /PRESERVE 0/1 BIT IN MQ
+       TAD TABX        /GET DEVICE NUMBER CORRECTLY
+       DCA CRLF
+       TAD I CRLF
+       MQA             /OR IN 0/1 BIT
+       JMP I UNITNO    /--RETURN--
+
+TABX,  UNITS
+
+/SKIP 4 LINES AND FETCH MARK TRACK
+
+SKIPQ, 0
+IOTR5, SDSQ
+       JMP .-1
+IOTR6, SDRC
+       JMP I SKIPQ     /--RETURN--
+\f
+*400
+
+/USER RESPONSE HANDLER
+/USES MQ FOR TEMPORARY STORAGE
+/EXIT WITH RESPONSE IN MQ
+/EXIT TO CALL+1 IF JUST CARRIAGE RETURN
+/OR ILLEGAL CHARACTER, CARRIAGE RETURN
+/OR ;,CARRIAGE RETURN
+/EXIT TO CALL+2 IF GOOD DATA, CARRIAGE RETURN
+/INCREMENT COUNT AND EXIT TO CALL+2 IF GOOD DATA;
+/ILLEGAL CHARACTERS CAUSE WHOLE ANSWER TO BE IGNORED
+/AND EXIT TO CALL+1
+
+ANSWER,        0
+       CAM             /CLEAR AC AND MQ
+       TAD CLEAR
+       DCA SWITCH
+MORE,  JMS LISTEN      /FETCH A CHARACTER
+       TAD (-215
+       SZA             /IS IT A CARRIAGE RETURN?
+       JMP .+5         /NO
+       TAD [212        /YES--OUTPUT LINE FEED
+       JMS TYPE
+SWITCH,        NOP             /SET UP EXIT ADDRESS
+       JMP I ANSWER    /--RETURN--
+       TAD (215-260
+       SPA             /IS CHARACTER LESS THAN 260?
+       JMP BAD         /YES--ILLEGAL CHARACTER
+       TAD [260-270    /NO
+       SMA             /IS IT MORE THAN 269?
+       JMP SEMI        /YES--CHECK FOR SEMICOLON
+       TAD (270        /RESTORE CHARACTER
+       AND [7          /MASK OUT EXTRANEOUS BITS
+       CLL
+       SWP
+       AND (777        /MASK OUT FIRST DIGIT IF THERE ARE 4
+       RAL             /ROTATE 3 LEFT
+       RTL
+       MQA             /FETCH NEW CHARACTER
+       MQL             /STORE RESULT IN MQ
+       TAD SKIP        /SET UP TO SKIP ON RETURN
+       DCA SWITCH
+       JMP MORE        /FETCH ANOTHER
+
+\f
+CLEAR, NOP
+SKIP,  ISZ ANSWER
+
+BAD,   CLA             /ILLEGAL CHARACTER
+       JMS I [CRLF
+       JMP I ANSWER    /--RETURN--
+
+
+/TEST FOR SEMICOLON
+
+SEMI,  TAD (270-273
+       SZA CLA         /IS CHARACTER A SEMICOLON?
+       JMP BAD         /NO--ILLEGAL CHARACTER
+       ISZ COUNT       /YES--INCREMENT COUNTER
+       JMP SWITCH      /EXIT FROM ANSWER ROUTINE
+
+
+/TELETYPE INPUT AND ECHO HANDLER
+
+LISTEN,        0
+       KSF
+       JMP .-1
+       JMS I   [PARITY
+       TLS             /ECHO CHARACTER
+       JMS CHECK       /CHECK FOR CTRL/C AND CTRL/S
+       JMP I LISTEN    /--RETURN--
+
+/CHECK FOR CTRL/C AND CTRL/S
+/ENTER WITH INPUT CHARACTER IN AC
+/EXIT TO HANDLER OR WITH CHARACTER IN AC
+
+CHECK, 0
+       TAD (-203
+       SNA             /IS IT CTRL/C?
+       JMP I CTRLC     /YES--HANDLE IT
+       TAD (203-223
+       SNA             /IS IT CTRL/S?
+       JMP I [REPEAT   /YES--HANDLE IT
+       TAD (223        /RESTORE CHARACTER
+       JMP I CHECK     /--RETURN--
+
+CTRLC, LIMIT
+\f
+/MESSAGE OUTPUT HANDLER
+
+/EXPECTS MESSAGE ADDRESS TO BE IN LOCATION AFTER CALL
+/EXITS TO CALL+2
+
+MESSGE,        0
+       TAD I MESSGE
+       DCA FINDER      /SET UP POINTER
+       ISZ MESSGE
+       DCA LOC         /SET L/R SWITCH TO L (EVEN)
+LNEXT, TAD I FINDER    /GET WORD
+       BSW
+RHALF, AND [77
+       SNA             /IS CHARACTER 0 (TERMINATOR)?
+       JMP I MESSGE    /YES--RETURN--
+       DCA CHAR
+       TAD CHAR
+       AND (40
+       SNA CLA         /IS IT A LETTER?
+       TAD [100        /YES--301-337
+       TAD [200        /NO--240-277
+       TAD CHAR        /RESTORE CHARACTER
+       JMS TYPE        /OUTPUT IT
+       ISZ LOC
+       TAD LOC
+       RAR
+       SZL CLA         /WHICH HALF WAS THAT?
+       JMP .+3
+       ISZ FINDER      /RIGHT
+       JMP LNEXT
+       TAD I FINDER    /LEFT
+       JMP RHALF
+FINDER,        0
+LOC,   0
+CHAR,  0
+
+
+/TELETYPE OUTPUT ROUTINE
+
+
+TYPE,  0
+       TSF
+       JMP .-1
+       TLS
+       CLA
+       JMP I TYPE      /--RETURN--
+
+\f
+/INSERT IOT'S ACCORDING TO TABLES
+/UNIT CONTAINS APPROPRIATE UNIT CODE
+/COUNT CONTAINS -(NUMBER OF IOT'S TO TRANSFER)
+/COUNT1 CONTAINS ADDRESS OF ADDRESS TABLE
+/UNIT CONTAINS UNIT CODE OF CURRENT UNIT
+
+INSERT,        0
+       TAD I COUNT1
+       DCA COUNT3
+       TAD UNIT
+       MQL
+       TAD I COUNT3    /MAKE NEW IOT
+       AND (7007
+       MQA
+       CIA
+       TAD I COUNT3    /COMPARE WITH IOT FROM PROGRAM
+       SNA CLA         /ARE THE IOT'S THE SAME AS THE LAST UNIT?
+       JMP I INSERT    /YES--RETURN--
+INS1,  TAD I COUNT1
+       DCA COUNT3
+       TAD I COUNT3    /GET IOT FROM PROGRAM
+       AND (7007       /RETAIN ONLY SIGNIFICANT BITS
+       MQA             /OR IN UNIT NUMBER
+       DCA I COUNT3    /PUT IT IN PROGRAM
+       ISZ COUNT1      /BUMP COUNTERS
+       ISZ COUNT       /DONE YET?
+       JMP INS1        /NO
+       JMP I INSERT    /YES--RETURN--
+
+
+PAGE
+\f
+/COUNT THE NUMBER OF WORDS PER BLOCK
+/PLACE IT IN MWORDS
+/BE SURE ALL TAPES MATCH INPUT FORMAT
+
+SETUP, TAD LIST
+       DCA OPOINT      /SET POINTER TO I/O LIST
+       DCA COUNT2      /CLEAR COUNTER
+       TAD OCOUNT
+       CMA
+       DCA OUTNUM      /SET # OF UNITS
+SET4,  TAD (TABLE1-END1-1      /SET UP COUNTERS FOR IOT FIX
+       DCA COUNT
+       TAD (TABLE1
+       DCA COUNT1
+       TAD I OPOINT
+       DCA UNIT
+       JMS I [INSERT   /PUT THE PROPER IOT'S IN THE FOLLOWING ROUTINE
+       DCA WDCNT       /CLEAR WORD COUNT
+       TAD UNIT
+       AND [4000
+       TAD (2000
+IOTX7, SDLC
+       CLA
+IOTX8, SDRC
+       RTL
+       SZL             /DOES UNIT EXIST?
+       JMP .+3         /YES
+SELERR,        JMS I [ERR3     /@SELECT ERROR UNIT N@
+       JMP SETUP
+       AND (400
+       SZA CLA         /TURNED ON?
+       JMP SELERR      /NO
+       TAD UNIT        /GET 0 OR 1 UNIT BIT (0 OR 4000)
+       AND [4000
+       TAD [1000       /GET GO BIT
+IOTX1, SDLC            /START READING FORWARD
+       JMS SKIP4       /SKIP 8 LINES TO AVOID GARBAGE
+       JMS SKIP4
+IOTX3, SDSS            /LOOK FOR FORWARD BLOCK NUMBER (26)
+       JMP .-1
+IOTX4, SDRC
+       AND [77
+       TAD (-26
+       SZA CLA         /FOUND YET?
+       JMP IOTX3       /NO--KEEP LOOKING
+\f
+SET2,  JMS SKIP4       /YES--START COUNTING LINES BY FOURS
+       ISZ WDCNT
+       NOP
+       AND [77
+       TAD (-51
+       SZA CLA         /FOUND GUARD YET?
+       JMP SET2        /NO
+       TAD UNIT        /YES
+       AND [4000
+IOTX2, SDLC            /STOP UNIT
+       CLA
+       TAD COUNT2
+       SZA             /IS THIS THE INPUT UNIT?
+       JMP SET5        /NO
+       TAD (-11        /YES--SAVE THE COUNT
+       TAD WDCNT
+       CIA
+       DCA COUNT2
+       JMP SET3        /FIRST OUTPUT UNIT
+SET5,  TAD (-11        /NOT INPUT UNIT
+       TAD WDCNT
+       SZA CLA         /SAME NUMBER OF WORDS AS INPUT UNIT?
+       JMP ERR5        /NO*ILLEGAL FORMAT*
+SET3,  ISZ OPOINT      /NEXT UNIT
+       ISZ OUTNUM      /DONE YET?
+       JMP SET4        /NO
+       TAD COUNT2      /YES--PRINT MESSAGE
+       DCA I [MWORDS   /SET UP NUMBER OF WORDS PER BLOCK
+       TAD I [MWORDS
+       CIA
+       JMS I [PRINT    /PRINT 4 DIGIT NUMBER OF BLOCKS
+       JMS I [MESSGE   /YES--PRINT REST OF MESSAGE
+       MESSG3
+       JMS I [CRLF
+\f
+/IF WHOLE TAPE IS TO BE COPIED, IT IS NECESSARY TO
+/COMPUTE THE NUMBER OF BLOCKS ON THE TAPE (NB)
+/USING THE NUMBER OF WORDS PER BLOCK (WB)
+/AND THE FORMULA:
+/OCTAL:          NB=[63 6160/(WB+17)]+2
+/DECIMAL:       NB=[212,080/(WB+15)]+2
+
+       TAD NUMBER
+       SZA CLA         /COPY WHOLE TAPE?
+       JMP VERFQ       /NO--
+       DCA COUNT       /YES--COMPUTE NUMBER OF BLOCKS ON TAPE
+       TAD I [MWORDS
+       CIA
+       TAD (17
+       DCA COUNT1      /GET NUMBER OF WORDS PER BLOCK+17
+       TAD (-64
+       DCA COUNT2
+       TAD (-6160
+SUB,   CLL
+       TAD COUNT1
+       ISZ COUNT       /COUNT A BLOCK--TOO MANY?
+       SKP             /NO
+       JMP ERR5        /YES--ERROR
+       SZL
+       ISZ COUNT2
+       JMP SUB
+       CLA CLL
+       TAD COUNT       /COUNT IS [63 6160/WB+17]+1
+       IAC             /ADD 1 MORE
+       DCA NUMBER      /STORE AS # OF BLOCKS TO TRANSFER
+       JMP I .+1
+       VERFQ
+
+ERR5,  CLA
+       JMS I [MESSGE
+       ERROR5          /*ILLEGAL FORMAT UNIT*
+       JMS I [DECODE   /PRINT UNIT NUMBER
+       JMS I [CTRLR    /WAIT FOR CTRL/R
+       JMS I [CRLF     /CARRIAGE RETURN/LINE FEED
+       JMP SETUP       /TRY AGAIN
+
+
+
+
+/READ FOUR LINES AND FETCH MARK TRACK
+
+SKIP4, 0
+IOTX5, SDSQ
+       JMP .-1
+IOTX6, SDRC
+       JMP I SKIP4     /--RETURN--
+
+
+
+\f
+PAGE
+
+/IS TAPE TO BE VERIFIED?
+/SET UP DEPENDING ON RESPONSE
+VERFQ, TAD VERF
+       SZA CLA         /VERIFY?
+       JMP YES         /YES--
+       TAD (NOP        /NO--
+       DCA I VERF1A
+       TAD (OUTN
+       DCA I VERF2A
+       JMP CONT
+YES,   TAD (RAR
+       DCA I VERF1A
+       TAD (VERIFY
+       DCA I VERF2A
+CONT,  JMP I .+1
+       DOIT
+
+VERF1A,        VERF1
+VERF2A,        VERF2
+
+/WAIT FOR CTRL/R
+
+CTRLR, 0
+       JMS I [LISTEN   /FETCH CHARACTER
+       TAD [-222
+       SZA CLA         /IT IT CTRL/R?
+       JMP .-3         /NO--WAIT FOR ONE
+       JMS I [CRLF     /CARRIAGE RETURN/LINE FEED
+       JMP I CTRLR     /--RETURN--
+
+
+REPEAT,        DCA COUNT
+       JMS I [CRLF
+       JMS I [QUEST    /@REPEAT (YES=1;NO=0):@
+       MESS11
+       ACL
+       AND [7
+       SZA CLA
+       JMP I [CLEAN    /YES
+       JMP I [START+4  /NO--RESTART
+\f
+MESSG6,        TEXT @FIRST INPUT BLOCK:@
+MESSG7,        TEXT @FIRST OUTPUT BLOCK:@
+MESSG8,        TEXT @NUMBER OF BLOCKS TO COPY:@
+MESSG9,        TEXT @VERIFY OUTPUT (YES=1,NO=0):@
+MESS10,        TEXT @DONE@
+MESS11,        TEXT @REPEAT (YES=1,NO=0):@
+ERROR1,        TEXT @VERIFY ERROR BLOCK @
+ERROR2,        TEXT @TAPE ERROR BLOCK @
+ERROR3,        TEXT @SELECT ERROR UNIT @
+\f
+PAGE
+
+/SETUP FOR ACTUAL READ/WRITE/VERIFY OPERATION
+DOIT,  TAD [LIMIT-END  /SET UP NUMBER OF BLOCKS
+       JMS DIV1        /IN FIELD 0 BUFFER
+       DCA FLD0
+       TAD M200
+       JMS DIV1        /AND IN FIELD N BUFFERS
+       DCA FLDN
+       TAD IBLOCK      /SET UP RUNNING COUNTERS AND POINTERS
+       DCA INB         /FOR NEXT INPUT BLOCK
+       TAD OBLOCK
+       DCA OUTB        /FOR NEXT OUTPUT BLOCK
+       TAD NUMBER
+       DCA NUMB1       /FOR NUMBER OF BLOCKS LEFT TO TRANSFER
+       JMP .+4
+ALLDUN,        TAD XNUMB
+       SNA CLA         /DONE WITH ALL BLOCKS YET?
+       JMP REWIND      /YES
+/READ---
+READX, TAD LIST        /NO--SET UP POINTER TO OUTPUT UNITS
+       DCA OPOINT
+       TAD OCOUNT
+       CMA
+       DCA OUTNUM
+       TAD INB
+       DCA BLOCKN
+       TAD NUMB1       /SET POINTERS FOR TRANSFER
+       DCA XNUMB
+       TAD NUMB1
+       DCA NUMB2       /SAVE COUNTER FOR WRITE
+       TAD INPUT       /SELECT INPUT UNIT
+       DCA UNIT
+       DCA RW          /SET R/W BIT TO READ
+\f
+       TAD [END        /SET START OF BUFFERS IN CASE
+       DCA BUF0        /THEY WERE CHANGED BY VERIFY
+       DCA BUFN
+       JMS I [READY    /FILL THE BUFFERS
+       TAD XNUMB       /SAVE THE POINTERS
+       DCA NUMB1
+       TAD BLOCKN
+       DCA INB
+
+OUTN,  ISZ OPOINT
+       ISZ OUTNUM      /DONE WITH ALL UNITS YET?
+       JMP .+4         /NO--CONTINUE WRITING
+       TAD OHOLD       /YES
+       DCA OUTB
+       JMP ALLDUN      /READ ANOTHER BUFFER LOAD
+WRITEX,        TAD OUTB
+       DCA OHOLD
+       TAD OHOLD       /WRITE
+       DCA BLOCKN      /RESET POINTERS
+       TAD OUTB
+       DCA VB          /SAVE COUNTER FOR VERIFY
+       TAD NUMB2
+       DCA XNUMB
+       TAD I OPOINT    /SELECT OUTPUT UNIT
+       DCA UNIT
+       CLA CLL CML RAR /AC=4000
+       DCA RW          /SET R/W BIT TO WRITE
+       JMS I [READY
+       TAD BLOCKN
+       DCA OHOLD
+       JMP I .+1
+VERF2, VERIFY
+
+
+\f
+/SEE HOW MANY BLOCKS WILL FIT INTO BUFFER
+/ENTER WITH BUFFER SIZE IN AC
+/EXIT WITH # OF BLOCKS IN AC
+
+DIV1,  0
+       DCA COUNT1
+       DCA COUNT
+       TAD COUNT1      /TOTAL WORDS
+DIV2,  CLL
+       TAD I [MWORDS   /-NUMBER OF WORDS PER BLOCK
+       SNL             /RUN OUT OF ROOM?
+       JMP .+3         /YES--
+       ISZ COUNT       /NO--COUNT A BLOCK
+       JMP DIV2
+       CLA CLL         /IGNORE LESS THAN A BLOCK LEFT
+       TAD COUNT
+VERF1, RAR             /DIVIDE BY 2 IF VERIFY (NOP IF NO VERIFY)
+       JMP I DIV1      /--RETURN--
+
+/END OF OPERATION
+/REWIND TAPES TO INITIAL END ZONE
+
+REWIND,        TAD OCOUNT
+       CMA
+       DCA COUNT2      /SET NUMBER OF TAPES STILL SPINNING
+RLIST, CLA CMA
+       TAD LIST
+       DCA OPOINT      /SET POINTER TO UNIT LIST
+       TAD OCOUNT
+       IAC
+       CMA
+       DCA OUTNUM      /SET NUMBER OF UNITS IN LIST
+RUNIT, JMS I   [PARITY
+       JMS I [CHECK    /CHECK TTY FOR CTRL/S OR CTRL/C
+       ISZ OUTNUM      /DONE WITH WHOLE LIST YET?
+       SKP CLA         /NO
+       JMP RLIST       /YES--START THROUGH LIST AGAIN
+       ISZ OPOINT
+       TAD I OPOINT    /GET UNIT CODE
+       RTL
+       SZL CLA         /STILL SPINNING?
+       JMP RUNIT       /NO--TRY NEXT TAPE
+       TAD I OPOINT    /YES
+       DCA UNIT
+\f
+
+       TAD [-6
+       DCA COUNT
+       TAD [RTAB
+       DCA COUNT1
+       JMS I [INSERT   /PUT PROPER IOT'S IN THIS ROUTINE
+       TAD I OPOINT
+       AND [4000       /UNIT/READ
+       TAD [3000       /REVERSE/GO
+IOTR1, SDLC
+       JMS I [SKIPQ
+       JMS I [SKIPQ    /WAIT FOR DRIVE TO GET UP TO SPEED
+IOTR2, SDSS
+       JMP .-1
+IOTR3, SDRC            /GET MARK TRACK BITS
+       AND [77
+       TAD [-22
+       SZA CLA         /END ZONE?
+       JMP RUNIT       /NO--NEXT UNIT
+       CLA CLL CML RTR /AC=2000
+       MQA             /UNIT CODE STILL IN MQ FROM INSERT
+       DCA I OPOINT    /SET STOPPED BIT
+       TAD I OPOINT
+       AND [6000
+IOTR4, SDLC            /STOP UNIT
+M200,  7600            /CLA
+       ISZ COUNT2      /ALL TAPES STOPPED?
+       JMP RUNIT       /NO--NEXT UNIT
+       JMS I [MESSGE   /YES
+       MESS10          /@DONE@
+       JMP I [REPEAT
+
+\f
+
+PAGE
+
+/VERIFICATION ROUTINES
+
+VERIFY,        TAD VB          /SET POINTERS AND COUNTERS FOR TRANSFER
+       DCA BLOCKN
+       TAD NUMB2
+       DCA XNUMB
+       DCA RW
+       TAD END0        /SET BEGINNINGS OF VERIFY BUFFERS
+       DCA BUF0
+       TAD (3700
+       DCA BUFN
+       TAD CDF0
+       DCA COMP2
+       JMS I [READY    /READ VERIFY BUFFERS FULL
+       TAD COUNT1      /GET # OF BLOCKS IN LAST BUFFER FILLED
+       DCA COUNT3
+       CMA             /SET AUTOINDEX POINTERS TO BUFFERS
+       TAD [END
+       DCA X11
+       CMA CLL
+       TAD END0
+       DCA X12
+       TAD COUNT
+       CMA
+       TAD FIELDS
+       DCA COUNT       /SET NUMBER OF FIELDS WHICH WERE FILLED
+       JMS COMP4       /GET NUMBER OF BLOCKS
+       TAD FLD0
+       CIA
+       DCA COUNT4      /SET COUNTER
+       JMS COMP        /COMPARE THE BUFFERS
+\f
+COMP3, TAD COUNT
+       SNA CLA
+       JMP I [OUTN
+       JMS COMP4       /GET NUMBER OF BLOCKS
+       TAD FLDN
+       CIA
+       DCA COUNT4
+       TAD COMP2       /EACH FIELD------
+       TAD (10
+       DCA COMP2       /SET CDF INSTRUCTION PROPERLY
+       CMA CLL         /SET AUTOINDEX POINTERS TO BUFFERS
+       DCA X11
+       TAD (3677
+       DCA X12
+       JMS COMP
+       JMP COMP3       /DO THE NEXT FIELD
+
+
+/ENTER WITH AC CLEAR
+/EXIT TO CALL+1 WITH AC CLEAR IF
+/NORMAL BUFFER FILL
+/EXIT TO CALL+2 WITH # OF BLOCKS IN AC IF
+/LAST BUFFER
+
+COMP4, 0
+       ISZ COUNT       /LAST FIELD FILLED?
+       JMP I COMP4     /NO--RETURN--
+       TAD XNUMB       /YES--OUT OF BLOCKS?
+       SZA CLA
+       JMP I COMP4     /NO--RETURN--
+       TAD COUNT3      /YES--GET ACTUAL # OF BLOCKS
+       ISZ COMP4       /INCREMENT RETURN ADDRESS
+       JMP I COMP4     /--RETURN--
+
+\f
+/COMPARE PORTION OF VERIFY ROUTINE
+
+COMP,  0
+       TAD I [MWORDS   /SET NUMBER OF WORDS PER BLOCK COUNTER
+       DCA COUNT2
+COMP2, HALT            /SHOULD CONTAIN CDF N
+       TAD I X11       /GET CORRESPONDING WORDS FROM EACH BUFFER
+       CIA
+       TAD I X12
+CDF0,  CDF 0
+       SZA CLA         /DO WORDS MATCH?
+       JMP ERR1        /NO--VERIFY ERROR
+TRY,   ISZ COUNT2      /DONE WITH BLOCK?
+       JMP COMP2       /NO--CONTINUE
+       ISZ COUNT4      /DONE WITH ALL BLOCKS?
+       JMP COMP+1      /NO
+       JMP I COMP      /YES--RETURN--
+
+ERR1,  JMS I [MESSGE
+       ERROR1          /*VERIFY ERROR BLOCK *
+       TAD COUNT4      /GET CURRENT BLOCK NUMBER
+       CIA
+       TAD I (BLOCKS   /FROM BLOCK THIS OPERATION STARTED WITH
+       JMS PRINT        /PRINT 4 DIGIT BLOCK NUMBER
+       JMS I [MESSGE
+       ERROR6          /*UNIT *
+       JMS I [DECODE   /PRINT UNIT NUMBER
+WAIT,  JMS I [LISTEN   /WAIT FOR RESPONSE
+       DCA PRINT
+       JMS I [CRLF
+       TAD PRINT
+       TAD [-224
+       SNA             /WAS IT CTRL/T?
+       JMP I [WRITEX   /YES--TRY AGAIN
+       TAD [2
+       SZA CLA         /WAS IT CTRL/R?
+       JMP WAIT        /NO--WAIT FOR A GOOD RESPONSE
+       JMP TRY         /YES--IGNORE AND CONTINUE
+
+\f
+
+
+/PRINT A 4 DIGIT OCTAL NUMBER
+/ENTER WITH NUMBER IN AC
+
+PRINT, 0
+       DCA I [MESSGE   /TEMPORARY STORAGE
+       TAD [-4
+       DCA I [ANSWER   /SET DIGIT COUNTER
+       TAD I [MESSGE
+       RAL
+       DCA I [CRLF
+FOUR,  TAD I [CRLF
+       RAL
+       RTL
+       DCA I [CRLF
+       TAD I [CRLF
+       AND [7
+       TAD [260
+       JMS I [TYPE     /PRINT ONE DIGIT
+       ISZ I [ANSWER   /DONE YET?
+       JMP FOUR        /NO
+       JMP I PRINT     /YES--RETURN--
+
+
+/CLEAN UP UNIT TABLES AFTER REWIND
+
+CLEAN, TAD LIST
+       DCA OPOINT
+       TAD OCOUNT
+       CMA
+       DCA OUTNUM      /SET POINTER AND COUNTER
+CLEAN1,        TAD I OPOINT    /GET UNIT CODE
+       AND (4770       /MASK OUT EXTRANEOUS BITS
+       DCA I OPOINT    /REPLACE IT
+       ISZ OPOINT
+       ISZ OUTNUM      /DONE YET?
+       JMP CLEAN1      /NO
+       JMP I [DOIT     /YES--NEXT OPERATION
+
+
+
+\f
+PAGE
+
+/FILL ALL N FIELDS ONCE
+/ENTER WITH AC CLEAR
+/# OF BLOCKS FOR FIELD 0 IN FLD0
+/# OF BLOCKS FOR OTHERS IN FLDN
+/ADDRESSES OF BUFFERS IN BUF0, BUFN
+/R/W BIT (0 OR 4000) IN RW
+
+
+
+READY, 0
+       TAD [IOTLOC-TABEND-1
+       DCA COUNT
+       TAD [IOTLOC
+       DCA COUNT1
+       JMS I [INSERT   /PUT PROPER IOT'S IN HANDLER
+       TAD UNIT
+       SPA CLA         /EVEN OR ODD UNIT NUMBER?
+       CLL IAC RTL     /ODD
+       TAD [ORIGIN     /EVEN
+       DCA ENTRY       /SET UP ENTRY TO HANDLER
+       TAD RW
+       MQL             /STORE UNIT BIT FOR LATER
+       CMA
+       TAD FIELDS      /SET COUNTER FOR # OF FIELDS
+       DCA COUNT
+       CLL
+       TAD FLD0        /ADJUST NUMBER OF BLOCKS TO
+       JMS SUB1        /TRANSFER DEPENDING ON NUMBER
+       TAD FLD0        /LEFT TO BE TRANSFERRED
+       JMS SUB2        /RESET FUNCTION WORD
+       TAD BUF0        /SET UP BUFFER POINTERS
+       JMS SUB3
+       JMS TRANS       /TRANSFER DATA--FIELD 0
+ZOOM,  ISZ COUNT       /BEGINNING OF LOOP FOR EACH FIELD ABOVE 0
+       SKP             /DONE YET?
+       JMP I READY     /YES--RETURN--
+\f
+       TAD FIELDS
+       CIA CLL
+       TAD COUNT
+       IAC
+       RAL
+       RTL             /GET FIELD SETTING READY
+       MQL             /STORE IN MQ
+       TAD FUNCTN      /GET PREVIOUS FUNCTION WORD
+       AND [4000       /GET R/W BIT
+       MQA             /OR IN FIELD SETTING
+       MQL             /STORE
+       CLL
+       TAD FLDN        /ADJUST NUMBER OF BLOCKS TO TRANSFER
+       JMS SUB1
+       TAD FLDN
+       JMS SUB2        /AND RESET FUNCTION WORD
+       TAD BUFN
+       JMS SUB3        /SET UP BUFFER POINTERS
+       JMS TRANS       /TRANSFER DATA--FIELDS 1-N
+       JMP ZOOM        /FILL ANOTHER FIELD
+
+SUB1,  0
+       CIA
+       TAD XNUMB
+       CLL CML         /SET LINK=1
+       SMA             /ARE THERE LESS BLOCKS LEFT THAN A FIELD FULL?
+       DCA XNUMB       /NO--REDUCE COUNT OF BLOCKS LEFT
+       JMP I SUB1      /YES-TRANSFER BLOCKS LEFT--RETURN--
+
+SUB2,  0
+       DCA COUNT1      /LINK=1 IF BLOCKS LEFT, 0 IF NONE
+       SNL             /DONE WITH ALL BLOCKS YET?
+       DCA XNUMB       /YES--BUMP SWITCH
+       TAD COUNT1      /NO
+       BSW
+       MQA             /PUT # OF BLOCKS INTO FUNCTION WORD
+       DCA FUNCTN      /START REVERSE
+       JMP I SUB2      /--RETURN--
+
+\f
+SUB3,  0
+       DCA BUFADD
+       TAD BLOCKN      /SET STARTING BLOCK NUMBER
+       DCA BLOCKS
+       TAD COUNT1
+       TAD BLOCKN
+       DCA BLOCKN      /RESET STARTING BLOCK FOR NEXT TIME
+       JMP I SUB3      /--RETURN--
+
+
+/CALL TO THE HANDLER
+
+TRANS, 0
+       JMS I   [PARITY         /CHECK TELETYPE
+       JMS I [CHECK    /WAS ^C OR ^S TYPED?
+       JMS I ENTRY
+FUNCTN,        0               /FUNCTION WORD
+BUFADD,        0               /BUFFER ADDRESS
+BLOCKS,        0               /STARTING BLOCK NUMBER
+       JMP ERR         /ERROR RETURN
+       JMS I   [PARITY         /CHECK TELETYPE
+       JMS I [CHECK    /WAS ^C OR ^S TYPED?
+       CLA
+       TAD XNUMB
+       SZA CLA         /DONE YET?
+       JMP I TRANS     /NO--RETURN--
+       ISZ COUNT
+       JMP I READY     /--RETURN--
+       JMP I READY     /--RETURN--
+
+/TRANSFER ERROR HANDLER
+
+ERR,   SNA CLA         /FATAL ERROR?
+       JMP SELECT      /NO
+       JMS I [MESSGE   /YES
+       ERROR2          /*TAPE ERROR BLOCK *
+       TAD I (BLOCK
+       JMS I [PRINT    /PRINT BLOCK NUMBER
+       JMS I [MESSGE
+       ERROR6          /*UNIT *
+       JMS DECODE      /PRINT UNIT NUMBER
+       JMS I [CRLF
+       JMP I [REWIND
+SELECT,        JMS ERR3
+       ISZ FUNCTN      /TURN AROUND AND TRY AGAIN
+       JMP FUNCTN-1
+
+\f
+ERR3,  0
+       JMS I [MESSGE
+       ERROR3          /*SELECT ERROR UNIT *
+       JMS DECODE      /PRINT UNIT NUMBER
+       JMS CTRLR       /WAIT FOR CTRL/R
+       JMP I ERR3      /--RETURN--
+
+
+/DECODE UNIT NUMBER FOR PRINTING
+/PRINT UNIT NUMBER BEFORE RETURNING
+
+DECODE,        0
+       CLL
+       TAD UNIT
+       RAL
+       MQL             /SAVE ROTATED CODE IN MQ
+       RAL
+       SWP             /SAVE EVEN/ODD BIT IN MQ
+       RAR             /WORK ON IOT CODE
+       RTR
+       IAC
+       CMA
+       AND [7
+       MQA             /INCLUDE EVEN/ODD BIT
+       TAD [260        /MAKE ASCII DIGIT
+       JMS I [TYPE
+       JMP I DECODE    /--RETURN--
+
+
+PAGE
+
+\f
+/TD8E DECTAPE HANDLER
+
+/SLIGHTLY MODIFIED VERSION OF DEC-E8-UZTA-D
+/COPYRIGHT 1971  DIGITAL EQUIPMENT CORPORATION
+/      MAYNARD, MASSACHUSETTS 01754
+
+/THE CALLING SEQUENCE IS:
+/      JMS ENTRY
+/      FUNCTION WORD
+/      BUFFER ADDRESS
+/      STARTING BLOCK
+/      ERROR RETURN
+/      NORMAL RETURN (AC CLEAR)
+
+/FUNCTION WORD:
+/      BIT 0:          0=READ, 1=WRITE
+/      BITS 1-5:       # OF BLOCKS TO BE TRANSFERRED
+/      BITS 6-8:       FIELD OF BUFFER AREA
+/      BITS 9-10:      UNUSED
+/      BIT 11:         1=START FORWARD, 0=START REVERSE
+
+/ERRORS:
+/THE HANDLER DETECTS TWO TYPES OF ERRORS:
+/FATAL ERRORS:
+/      PARITY ERROR
+/      TIMING ERROR
+/      TOO GREAT A BLOCK NUMBER
+/FATAL ERRORS TAKE ERROR RETURN WITH AC=4000
+/NON-FATAL ERROR:
+/      SELECT ERROR (IMPROPER UNIT NUMBER OR NO UNIT NUMBER)
+/NON-FATAL ERROR TAKES ERROR RETURN WITH AC=0
+\fPAGE
+
+MFIELD=0
+ORIGIN=.
+
+DTA0,  0               /ENTRY POINT FROM UNIT 0
+       CLA CLL         /0 TO LINK
+       JMP DTA1X
+C1000, 1000
+DTA1,  0               /UNIT 2 ENTRY
+       CLA CLL CML     /1 TO LINK
+       TAD DTA1
+       DCA DTA0        /PICK UP ARGS AT DTA0
+DTA1X, RAR
+       DCA YUNIT       /LINK TO UNIT POSITION
+       RDF
+       TAD C6203       /GET DATA FIELD AND SETUP RETURN
+       DCA LEAVE
+       TAD YUNIT       /GET FUNCTION WORD
+IOT4,  SDLC            /PUT FUNCTION INTO DATA REGISTER
+       TAD I   DTA0
+IOT1,  SDLD
+       CLA
+       TAD MWORDS
+       DCA WCOUNT      /STORE MASTER WORD COUNT
+       ISZ DTA0        /TO BUFFER
+       TAD I DTA0
+       DCA BUFF
+       ISZ DTA0        /TO BLOCK NUMBER
+       TAD I DTA0
+       DCA BLOCK
+       ISZ DTA0        /POINT TO ERROR EXIT
+       CIF CDF MFIELD  /TO ROUTINES DATA FIELD
+IOT2,  SDRD            /GET FUNCTION INTO AC
+       CLL RAL
+       AND CM200       /GET # PAGES TO XFER
+       DCA PGCT
+IOT3,  SDRD
+C374,  AND C70         /GET FIELD FOR XFER
+       TAD C6201       /FORM CDF N
+       DCA XFIELD      /IF=0 AND DF=N AT XFER.
+       CLA CLL CMA RTL
+       DCA TRYCNT      /3 ERROR TRIES
+IOT5,  SDRC
+       AND C100
+       SZA CLA
+       JMP FATAL-1
+\f
+IOT6,  SDRD            /PUT FUNCT INTO XFUNCT IN SECOND PG.
+       DCA I CXFUN
+       TAD WCOUNT
+       DCA I CXWCT
+IOT7,  SDRD            /GET MOTION BIT TO LINK
+       CLL RAR
+       JMP GO          /AND START THE MOTION.
+RWCOM, SDST            /ANY CHECKSUM ERRORS?
+       SZA CLA         /OR CHECKSUM ERRORS?
+       JMP TRY3        /PLEASE NOTE THAT THE LINK IS ALWAYS
+                       /SET AT RWCOM. GETCHK SETS IT.
+       TAD PGCT        /NO ERROR..FINISHED XFER?
+       TAD CM200
+       SNA
+       JMP EXIT        /ALL DONE. GET OUT
+       DCA PGCT        /NEW PAGE COUNT
+       ISZ BLOCK       /NEXT BLOCK TO XFER
+       TAD WCOUNT      /FORM NEXT BUFFER ADDRESS
+       CIA
+       TAD BUFF
+       DCA BUFF
+       CLL CML         /FORCES MOTION FORWARD
+GO,    CLA CML RTR     /LINK BECOMES MOTION BIT
+       TAD C1000
+       TAD YUNIT       /PUT IN 'GO' AND UNIT #
+IOT8,  SDLC            /LOOK FOR BLOCK NO.
+       JMS I CRDQUD    /WAIT AT LEAST 6 LINES TO LOOK
+       JMS I CRDQUD
+CM200, 7600            /COULD HAVE SAVED A LOC. HERE
+SRCH,  SDSS
+       JMP .-1         /WAIT FOR SINGLE LINE FLAG
+IOT9,  SDRC
+       CLL RTL         /DIRECTION TO LINK. INFO BITS 
+                       /ARE SHIFTED.
+       AND C374        /ISOLATE MARK TRACK BITS
+       TAD M110        /IS IT END ZONE?
+       SNA             /THE LINK STAYS SAME THRU THIS
+       JMP ENDZ
+       TAD M20         /CHECK FOR BLOCK MARK
+       SZA CLA
+       JMP SRCH
+IOT10, SDRD            /GET THE BLOCK NUMBER
+       SZL             /IF WE ARE IN REVERSE, LOOK FOR 3
+                       /BLOCKS BEFORE TARGET BLOCK. THIS
+                       /ALLOWS TURNAROUND AND UP TO SPEED.
+       TAD C3          /REVERSE
+       CMA
+       TAD BLOCK
+       CMA             /IS IT RIGHT BLOCK?
+       SNA
+       JMP FOUND       /YES..HOORAY!
+M110,  SZL SNA CLA     /NO, BUT ARE WE HEADED FOR IT?
+                       /ABOVE SNA IS SUPERFLUOUS.
+       JMP SRCH        /YES
+ENDZ,  SDRC            /WE ARE IN THE END ZONE
+       CLL RTL         /DIRECTION TO LINK
+        CLA            /ARE WE IN REVERSE?
+       JMP GO          /YES..TURN US AROUND
+/IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR
+TRY3,  CLL CLA
+       ISZ TRYCNT
+       JMP GO          /TRY 3 TIMES
+       CLL CLA
+       JMP FATAL               /LINK OFF MEANS AC=4000 ON RETURN
+EXIT,  ISZ DTA0
+       CLL CML         /AC=0 ON NORMAL RETURN
+FATAL, TAD YUNIT
+       SDLC            /STOP THE UNIT
+       CLA CML RAR
+LEAVE, HLT
+       JMP I DTA0      /--RETURN--
+
+\f
+C6201, 6201
+C6203, 6203
+CRDQUD,        RDQUAD
+WCOUNT,        0
+BUFF,  0
+MWORDS,        0
+YUNIT, 0
+CXFUN, XFUNCT
+M20,   -20
+PGCT,  0
+CXWCT, XWCT
+C100,  100
+TRYCNT,        -3
+BLOCK=DTA1
+
+
+       *ORIGIN+170
+FOUND, SZL CLA         /RIGHT BLOCK. HOW ABOUT DIRECTION?
+       JMP GO          /WRONG..TURN AROUND
+       TAD YUNIT       /PUT UNIT INTO LINK
+       CLL RAL         /AC IS NOW 0
+C70,   70              /********DON'T MOVE THIS!!!!******
+C3,    3
+       TAD BUFF        /GET BUFFER ADDRESS
+XFIELD,        HLT             /INTO NEXT PAGE
+
+       *ORIGIN+200
+       XUNIT=EQUFUN
+
+       DCA     XBUFF
+IOT16, SDRC
+IOT17, SDLC
+       RAR             /NOW GET UNIT #
+       DCA XUNIT
+REVGRD,        SDSS
+       JMP REVGRD              /LOOK FOR REVERSE GUARD
+IOT11, SDRC
+       AND K77
+       TAD CM32        /IS IT REVERSE GUARD?
+       SZA CLA
+       JMP REVGRD      /NO.KEEP LOOKING
+       TAD XWCT
+       DCA WORDS       /WORD COUNTER
+       TAD XFUNCT      /GET FUNCTION  READ OR WRITE
+K7700, SMA CLA
+       JMP READ        /NEG. IS WRITE
+WRITE, SDRC
+       AND C300        /CHECK FOR WRITE LOCK AND SELECT ERROR
+       CLL CML         /LOCK OUT AND SELECT ARE AC 0 ERRORS
+       SZA CLA
+       JMP I CFATAL    /FATAL ERROR. LINK MUST BE ON
+       JMS RDQUAD      /NO ONE EVER USES THIS WORD!
+C7600, 7600
+       TAD C1400
+       TAD XUNIT       /INITIATE WRITE MODE
+IOT12, SDLC
+       CLA CMA
+       JMS WRQUAD      /PUT 77 IN REVERSE CHECKSUM
+       CLA CMA
+       DCA CHKSUM
+WRLP,  TAD I XBUFF     /GLORY BE! THE ACTUAL WRITE!
+       JMS WRQUAD
+       ISZ XBUFF       /BUMP CORE POINTER
+K77,   77              /ABOVE MAY SKIP
+       ISZ WORDS       /DONE THIS BLOCK?
+       JMP WRLP        /NOT YET..LOOP A WHILE
+       TAD XFUNCT      /IS THE OPERATION FOR WDSBLK PER BLOCK?
+       CLL RTR         /IF NO, WRITE A 0 WORD
+       SZL CLA
+\f
+       JMS WRQUAD      /WRITE A WORD OF 0
+       JMS GETCHK      /DO THE CHECK SUM
+       JMS WRQUAD      /WRITE FORWARD CHECKSUM
+       JMS WRQUAD      /ALLOW CHECKSUM TO BE WRITTEN
+       JMP I CRWCOM
+
+
+READ,  JMS RDQUAD
+       JMS RDQUAD
+       JMS RDQUAD      /SKIP CONTROL WORDS
+       AND K77
+       TAD K7700       /TACK 7700 ONTO CHECKSUM.
+       DCA CHKSUM      /CHECKSUM ONLY LOW 6 BITS ANYWAY
+RDLP,  JMS RDQUAD
+       JMS EQUFUN      /COMPUT CHECKSUM AS WE GO
+       DCA I XBUFF     /IT GETS CONDENSED LATER
+       ISZ XBUFF
+C300,  300             /PROTECTION
+       ISZ WORDS       /DONE THIS OP?
+       JMP RDLP        /NO SUCH LUCK
+       TAD XFUNCT      /IF OP WAS FOR WDSBLK-1, READ AND
+       CLL RTR         /CHECKSUM THE LAST TAPE WORD
+       SNL CLA
+       JMP RDLP2
+       JMS RDQUAD      /NOT NEEDED FOR WDSBLK/BLOCK
+       JMS EQUFUN      /CHECKSUM IT
+RDLP2, JMS RDQUAD      /READ CHECKSUM
+       AND K7700
+       JMS EQUFUN
+       JMS GETCHK      /GET SIX BIT CHECKSUM
+       JMP I CRWCOM
+
+WRQUAD,        0               /WRITE OUT A 12 BIT WORD
+       JMS EQUFUN      /ADD THIS TO CHECKSUM
+IOT13, SDSQ            /SKIP ON QUADLINE FLAG
+       JMP .-1
+IOT14, SDLD            /LOAD DATA  ONTO BUS
+       CLA             /SDLD DOESN'T CLEAR AC
+       JMP I WRQUAD
+
+RDQUAD,        0               /READ A 12 BIT WORD
+       SDSQ
+       JMP .-1
+IOT15, SDRD            /READ DATA
+       JMP I RDQUAD
+
+\f
+EQUFUN,        0               /COMPUTE EQUIVALENCE CHECKSUM
+       CMA
+       DCA EQUTMP      /ACTUALLY CHECKSUMS ON DECTAPE ARE
+       TAD EQUTMP      /EQUIVALENCE OF ALL WORDS IN A RECORD
+       AND CHKSUM      /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE
+       CIA             /IS ASSOCIATIVE, WE CAN DO IT 12
+       CLL RAL         /BITS AT A TIME AND CONDENSE LATER.
+       TAD EQUTMP      /THIS ROUTINE USES THESE IDENTITIES:
+       TAD CHKSUM      /A+B=(A.XOR.B)+2*(A.AND.B)
+       DCA CHKSUM      /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B)
+       TAD EQUTMP      /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B))
+       CMA
+       JMP I EQUFUN
+
+GETCHK,        0               /FORM 6 BIT CHECKSUM
+       CLA
+       TAD CHKSUM      
+       CMA
+       CLL RTL
+       RTL
+       RTL
+       JMS EQUFUN
+       CLA CLL CML     /FORCES LINK ON AT RWCOM
+       TAD CHKSUM
+       AND K7700
+       JMP I GETCHK
+
+CFATAL,        FATAL
+CRWCOM,        RWCOM
+XFUNCT,        0
+CM32,  -32
+C1400, 1400
+CHKSUM,        0
+WORDS, 0
+XBUFF, 0
+XWCT,  0
+EQUTMP,        0
+
+\fPAGE
+/
+/
+PARITY,        0
+       KRB
+       AND     [177
+       TAD     [200
+       JMP I   PARITY
+
+/IOT TABLES FOR TD8E SUBROUTINE
+
+IOTLOC,        IOT1
+       IOT2
+       IOT3
+       IOT4
+       IOT5
+       IOT6
+       IOT7
+       RWCOM
+       IOT8
+       SRCH
+       IOT9
+       IOT10
+       ENDZ
+       FATAL+1
+       REVGRD
+       IOT11
+       WRITE
+       IOT12
+       IOT13
+       IOT14
+       RDQUAD+1
+       IOT15
+       IOT16
+TABEND,        IOT17
+
+UNITS=.
+       UNIT01
+       UNIT23
+       UNIT45
+       UNIT67
+
+RTAB,  IOTR1
+       IOTR2
+       IOTR3
+       IOTR4
+       IOTR5
+       IOTR6
+
+
+/IOT TABLES FOR WORDS PER BLOCK ROUTINE
+
+TABLE1,        IOTX1
+       IOTX2
+       IOTX3
+       IOTX4
+       IOTX5
+       IOTX6
+       IOTX7
+END1,  IOTX8
+
+\fMESSG4,       TEXT @FROM UNIT:@
+MESSG5,        TEXT @TO UNITS:@
+ERROR5,        TEXT @ILLEGAL FORMAT UNIT @
+ERROR6,        TEXT @ UNIT @
+ERROR4,        TEXT @ILLEGAL RESPONSE@
+
+\f
+PAGE
+/ONCE ONLY CODE
+
+END,   JMS I (QUEST
+       MESSG2          /@HIGHEST FIELD AVAILABLE:@
+       ACL
+       AND [7
+       CIA
+       DCA FIELDS
+       TAD (CDF
+       DCA CDF00
+       TAD FIELDS
+       SNA             /MORE THAN 1 FIELD??
+       JMP LIM         /NO--NO PROBLEM
+       DCA COUNT1      /YES--ARE THEY ALL PRESENT?
+NEXT,  TAD CDF00
+       TAD (10
+       DCA CDF00       /SET FOR DATA FIELD CHANGE
+       TAD (HLT
+CDF00, CDF
+       DCA I (10       /TRY LOCATION 10
+       TAD I (10
+       CDF 0
+       CIA
+       TAD (HLT
+       SNA CLA         /IS FIELD THERE?
+       JMP NEXT1       /YES--TRY NEXT ONE
+       JMS I [MESSGE   /NO
+       ERROR4          /ILLEGAL RESPONSE
+       JMS I [CRLF     /CARRIAGE RETURN/LINE FEED
+       DCA COUNT       /CLEAR COUNT
+       JMP END         /TRY AGAIN
+NEXT1, ISZ COUNT1      /DONE YET?
+       JMP NEXT        /NO
+
+LIM,   TAD (LIMIT-END  /SET BEGINNING OF VERIFY BUFFER
+       CLL RAR
+       TAD [END
+       DCA END0
+       TAD (NOP
+       DCA I (START1-1
+       JMP I (START1
+MESSG2,        TEXT @HIGHEST FIELD AVAILABLE:@
+
+FIELD 0
+*200
+
+$
+\f\f