software: Added more and more
[pdp8.git] / sw / os8 / v3d / sources / system / dectapes / dectape4 / RXCOPY.PA
diff --git a/sw/os8/v3d/sources/system/dectapes/dectape4/RXCOPY.PA b/sw/os8/v3d/sources/system/dectapes/dectape4/RXCOPY.PA
new file mode 100644 (file)
index 0000000..0186db7
--- /dev/null
@@ -0,0 +1,940 @@
+/ RXCOPY FOR OS/8 V3D AND OS/78 V1A
+/
+/ THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
+/ SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
+/ OF THE ABOVE SOPYRIGHT NOTICE.  THIS SOFTWARE, OR ANY THEREOF,
+/ MAY NOT BE 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
+/ EQUIPMENT CORPORATION.
+/
+/ DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
+/ SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
+/
+\f
+/
+/ VERSION V4A  M.H.    MAY 20, 1977
+/              S.R.    MAY 20, 1977
+/
+/ START ADDRESS 16000;  JSW 7403
+/
+/ THIS PROGRAM PERFORMS COPY, READ, AND COMPARE OPERATIONS ON
+/ RX FLOPPY DISKS ON A TRACK BY TRACK BASIS.  THE COMMAND FORMAT
+/ IS:   DEV:<DEV:/OPTION   WHERE OPTIONS ARE P, N, M, R, OR V.
+/P     PAUSE BEFORE AND AFTER ACCESSING DISK
+/M     MATCH WITH NO IMPLIED COPY
+/N     COPY WITH NO IMPLIED MATCH
+/R     READ OUTPUT DEVICE WITH NO IMPLIED MATCH OR COPY
+/V     PRINT VERSION NUMBER
+/C     (NOT DOCUMENTED) COPY
+/ IF NO OPTIONS ARE EXPLICITYLY DECLARED, COPY AND MATCH ARE ASSUMED.
+/ IF THE R OPTION IS THE ONLY DISK ACCESSING OPTION SELECTED, THE
+/ FOLLOWING FORMATS WORK: DEV:/R  DEV:</R   <DEV:/R.
+/ 
+\f
+MAGIC=7623             /LOCATION IN RX SYSTEM HANDLER WITH A 7004 IF
+                       /UNIT 0 OR A 7024 IF UNIT 1.  THIS IS ONLY
+                       /ACCESSED IF THE USER USES SYS: IN THE COMMAND
+                       /STRING AND SYS: IS KNOWN TO BE AN RX!!
+OPT1=7643              /1ST COMMAND DECODER OPTION WORD
+OPT2=7644              /2ND COMMAND DECODER OPTION WORD
+BUFF=2000              /INPUT BUFFER FOR TTY MSGS
+DEVTYP=25              /DEVICE CODE FOR FLOPPY DISKS
+BSIZE=6400             /BUFFER SIZE IN OCTAL WORDS
+BSTART=20              /BUFFER START
+BHALF=BSIZE%2          /HALF OF BSIZE
+USR=200                        /ENTRY POINT OF USR
+NOMAT=2000             /NO MATCH OPTION MASK
+COPY=1000              /COPY OPTION MASK
+MMATCH=3777            /CMA OF MATCH OPTION MASK
+MCOPY=6777             /CMA OF COPY OPTION MASK
+MATCH=4000             /MATCH OPTION MASK
+READ=0100              /READ OPTION MASK
+VERSION=0004           /VERSION OPTION MASK
+PAUS=0400              /PAUSE OPTION MASK
+\f
+/      RXCOPY  READ-WRITE SUBROUTINE
+/
+       *6420
+/
+/  READ-WRITE SUBROUTINE TO HANDLE FLOPPY DISK IN 8-BIT MODE
+/  ROUTINE LIVES IN FIELD 0 TO BE CALLED FROM FIELD 10
+/
+/  CALLING SEQUENCE
+/
+/      CIF 0           /ASSUMED CDF 10, CALLED FROM FIELD 10
+/      TAD     TRACK   /TRACK # INTO AC
+/      JMS I   (RW
+/      BITS            /4000 IF FIELD 10 BUFFER, 2 IF READ, 20 IF UNIT 1
+/      OK RETURN       /CDF AND CIF TO 10
+/      ERROR           /SECTOR # IN AC
+/
+/  READS OR WRITES A TRACK AT A TIME. TWO BUFFERS LIVE IN 20-6417
+/  EACH OF FIELD 0 AND 10
+/
+/ USES AUTO-INCREMENT REGISTER 10 OF FIELD 0
+X10=10
+/
+/  AN ALTERNATE ENTRY OF CONTIN (JMP NOT JMS) CAUSES THE
+/  SUBROUTINE TO CONTINUE WORKING ON THE SAME TRACK ON WHICH THE
+/  ERROR OCCURRED.
+/
+/  THREE RETRIES ARE DONE ON A SECTOR BEFORE AN ERROR IS DECLARED.
+/
+SDN=6755
+LCD=6751
+STR=6753
+XDR=6752
+SER=6754
+FLINIT=6757
+/
+/
+/  USE PART OF PAGE AT 6400 TO SPREAD OUT WRITE LOOP
+/  FOR A LITTLE EXTRA SAFETY ON MAKING INTERLEAVE TIMING
+/
+WRIT1, TAD     (-10    /8 TIMES THRU 16 BYTE > 128
+       DCA     WRTCNT
+ST4,   TAD I   X10     /FETCH A BYTE
+       STR             /SKIP IF READY TO TRANSFER
+       JMP     .-1     /NO (SHOULDN'T HIT THIS ON VT78)
+       XDR             /MOVE BYTE TO SILO
+       CLA             /CLEAR THE MUMBLE AC
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD I   X10
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       ISZ     WRTCNT  /THRU WITH SILO?
+       JMP     ST4     /NO
+       JMP     WRIT2   /REST OF LOOP ON OTHER PAGE
+/
+WRTCNT,        0               /CONTROL COUNT FOR FILL SILO LOOP
+/
+       PAGE
+/
+\f/
+/  READ-WRITE ENTRY POINT
+/
+/
+RW,    0
+       DCA     TRCKNO  /ARRIVES WITH TRACK # IN AC
+       TAD I   RW      /DATA FIELD 10, FETCH CONTROL BITS
+       TAD     L7100   /FLOPPY CONTROLLER IGNORES TOP 4 BITS; 100
+/                      /BIT IS 8 BIT MODE; CONTROL FOR UNIT, R/W, IN PLACE
+       DCA     FN      /BUFFER BIT (COMPLEMENTED) ALSO STORED IN FN
+       TAD     (17     /SET UP AUTO-INCR REG.
+       DCA     X10
+       TAD     (-32    /26 DECIMAL SECTORS PER TRACK
+       DCA     SECTOR
+       ISZ     RW      /POINT TO OK EXIT
+       TAD     FN      /IF FIELD ZERO BUFFER, NEED TO CDF
+       SPA             /SKIP ON FIELD 10 BUFFER, ALREADY SET!
+       CDF 0
+       RTR             /READ/WRITE BIT TO LINK
+       SZL CLA         /SKIP IF WRITE
+       JMP     READLP  /GO TO READ
+/
+/  WRITE LOOP
+/
+WRITLP,        CLL CLA CMA RTL /LITERAL -3 FOR RETRY COUNT
+       DCA     RETRY
+WRTRY, TAD     FN      /RETRY ERROR HERE THREE TIMES
+       JMS     LDCMD
+       JMP     WRIT1   /OTHER PAGE TO MOVE DATA TO SILO
+WRIT2, JMS     DOIO    /RETURN FROM OTHER PAGE TO ACCESS I/O
+       ISZ     SECTOR
+       JMP     WRITLP
+XT1,   CDF CIF 10
+       JMP I   RW
+/
+/  READ LOOP
+/
+READLP,        CLL CLA CMA RTL /LITERAL -3 FOR RETRY COUNT
+       DCA     RETRY
+RDTRY, JMS     DOIO    /COME HERE TO RETRY I/O
+       TAD     FN
+       JMS     LDCMD
+       TAD     (-40    /32 PASSES THRU 4 BYTES MOVED
+       DCA     FLEA
+ST5,   STR
+       JMP     .-1
+       XDR
+       DCA I   X10
+       STR
+       JMP     .-1
+       XDR
+       DCA I   X10
+       STR
+       JMP     .-1
+       XDR
+       DCA I   X10
+       STR
+       JMP     .-1
+       XDR
+       DCA I   X10
+       ISZ     FLEA
+       JMP     ST5
+       ISZ     SECTOR
+       JMP     READLP
+       JMP     XT1
+/
+/  DO READ OR WRITE I/O FUNCTION
+/
+DOIO,  0
+       TAD     FN      /SILO FUNCTION, CONVERTED TO READ-WRITE
+       TAD     L7004   /BY LITERAL 4 (TOP FOUR BITS IRREL)
+       JMS     LDCMD
+       JMS     GETSEC  /FETCH SECTOR TO AC
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD     TRCKNO
+       STR
+       JMP     .-1
+       XDR
+       CLA
+       TAD     L7530   /UNIT 1, 8-BIT NO-OP (TOP 4 BITS IGNORED)
+       JMS     LDCMD
+       JMP I   DOIO
+/
+/  LOAD COMMAND REGISTER
+/
+FLEA=.
+LDCMD, 0
+       SDN             /SKIP ON DONE
+       JMP     .-1
+       LCD             /LOAD COMMAND
+       SER             /SKIP ON ERROR
+       JMP I   LDCMD
+       ISZ     RETRY   /TRIED THREE TIMES YET
+       JMP     KEEPON  /NO, KEEP ON TRYING
+       JMS     GETSEC  /RETURN SECTOR IN AC
+       ISZ     RW      /ON ERROR, RETURN ONE FURTHER DOWN
+       JMP     XT1     /EXIT TO CALLER WITH SECTOR # IN AC
+/
+/  ENTRY TO CONTINUE AFTER ERROR
+/
+CONTIN,        STA             /BACK UP EXIT TO GOOD EXIT
+       TAD     RW
+       DCA     RW
+       TAD     FN      /SET DATA FIELD TO 0 IF NECESSARY
+       SPA CLA         /ALREADY CDF TO 10, SKIP IF OK
+       CDF 0           /NO, SO SET TO 0
+       JMP I   LDCMD   /PRETEND OPERATION OK, SO RETURN THRU LDCMD!
+/
+KEEPON,        FLINIT          /DO A RECAL TO SHAKE IT UP
+       TAD     FN      /RETRYING READ OR WRITE
+       RTR             /R/W BIT TO LINK
+       SZL CLA         /SKIP ON WRITE
+       JMP     RDTRY   /RETRY A READ
+       TAD     (-200   /BACK UP AUTO INCR TO REFILL SILO FOR WRITE
+       TAD     X10     /SINCE THE FLINIT CLEARED SILO
+       DCA     X10
+       JMP     WRTRY   /SO GO RETRY WRITE
+/
+/  CONVERT COUNT TO SECTOR
+/
+GETSEC,        0
+       TAD     SECTOR  /CONVERT -32 TO -1 TO INTERLEAVED SECTOR
+       TAD     (15
+L7100, CLL             /100 BIT SETS 8-BIT MODE, AS LITERAL
+L7530, SPA SZL         /SZL JUST TO MAKE CORRECT LITERAL, NO-OP WAIT
+       TAD     (15
+       CML RAL
+       IAC
+       JMP I   GETSEC
+L7004, 7004
+/
+/
+/
+TRCKNO,        0               /TRACK NUMBER, INVARIANT THRU CALL
+SECTOR,        0               /COUNTS -32 UP TO 0; 26 DECIMAL SECTORS PER TRACK
+FN,    0               /FUNCTION BITS: ALWAYS 100 FOR 8BIT MODE
+/                      /20 IF UNIT 1
+/                      /2 IF READ OPERATION (2 IS SILO FETCH; 0 SILO FILL)
+/                      /MINUS WORD IF BUFFER IN FIELD 0, PLUS IF FIELD 10
+/                      /CONTROLLER IGNORES TOP 4 BITS OF WORD
+RETRY, 0               /RETRY COUNTER -3 TO 0
+\f      FIELD   1
+       *6000
+/
+/ ***** BEGIN ONCE ONLY CODE *****
+/
+/
+/ ENTER HERE AND GET USER INPUTS
+/
+START, CLA!SKP                 /NORMAL ENTRY (MUST CALL DECODER)
+CHAIN, JMP     NODEC           /CHAIN ENTRY
+       JMS I   (USR            /CALL IT
+       5
+       5200                    /DEFAULT INPUT EXT.(SPECIAL MODE)
+       0                       /PRESERVE TENTATIVE FILES
+/
+/ LOAD CONSOLE TTY HANDLER
+/
+NODEC, JMS I   (USR            /LOAD THE KL8E HANDLER
+       1
+       DEVICE  TTY
+TTYEP, 7201
+       JMP     ERRUSR          /PRINT USER ERROR
+       TAD     TTYEP           /MOVE ENTRY POINT FROM THIS PAGE
+       DCA     TTYENT
+/
+/ LOAD OUTPUT DEVICE IF SPECIFIED
+/
+       JMS     CTRLC           /CHECK FOR CONTROL C TYPE-IN
+       TAD I   (7600           /GET OUTPUT DEV
+       AND     (17
+       DCA     OUTDEV
+       TAD I   (7605           /GET INPUT DEVICE
+       AND     (17
+       DCA     INDEV
+       TAD     OUTDEV          /IF NO OUTPUT DEVICE
+       SZA                     /IS NAMED MOVE INPUT
+       JMP     LOC10           /TO OUTPUT DEVICE
+       TAD     INDEV           /MOVE IT!
+       DCA     OUTDEV
+       DCA     INDEV           /ZERO INPUT DEVICE
+/
+/ VALIDATE OUTPUT DEVICES AND FILES
+/
+LOC10, JMS     CTRLC           /CHECK FOR CONTROL C
+       TAD     (7601           /MAKE SURE THAT THERE ARE NO OUTPUT FILES
+       DCA     TMP1            /OR OTHER OUTPUT DEVICES
+       TAD     (-4
+       DCA     TMP2
+LOC1,  TAD I   TMP1            /GET DECODER ENTRY 
+       SZA!CLA                 /IS IT ZERO?
+       JMP     ERR2            /NO -- ERROR
+       ISZ     TMP1            /INCREMENT POINTER
+       ISZ     TMP2            /YES -- DONE WITH OUTPUT ENTRIES?
+       JMP     LOC1            /NO -- PROCEED
+                               /YES --
+/
+       JMS     CTRLC           /CHECK FOR CONTROL C
+       TAD I   (7605           /WAS THERE ANY INPUT SPECIFICATION?
+       SNA
+       JMP     LOC3A           /NO
+       TAD     (7606           /YES -- MAKE SURE THAT THERE ARE NO INPUT FILES
+       DCA     TMP1            /OR OTHER INPUT DEVICES
+       TAD     (-5
+       DCA     TMP2
+LOC2,  TAD I   TMP1            /GET DECODER ENTRY
+       SZA!CLA                 /IS IT ZERO?
+       JMP     ERR2            /NO -- ERROR
+       ISZ     TMP1            /INCREMENT POINTER
+       ISZ     TMP2            /YES -- DONE WITH INPUT ENTRIES?
+       JMP     LOC2            /NO -- PROCEED
+                               /YES --
+/
+LOC3A, JMS I   (USR            /LOAD RXA0 AND RXA1 SO UNIT NUMBERS CAN
+       1                       /BE FOUND.
+       DEVICE  RXA0
+RX0EP, 200
+       NOP
+       JMS I   (USR
+       1
+       DEVICE  RXA1
+RX1EP, 200
+       NOP
+       JMP     LOC3            /GO TO NEXT PAGE
+/
+OUTDEV,        0                       /OUTPUT DEVICE NUMBER
+INDEV, 0                       /INPUT DEVICE NUMBER
+TMP1,  0                       /TEMP STORE
+TMP2,  0                       /TEMP STORE
+/
+ERR2,  TAD     (MSG2           /ILLEGAL SPECIFICATION
+PERR,  JMS     TYPE            /PRINT ERROR MESSAGE
+       JMP     EXIT            /LEAVE
+/
+ERRUSR,        JMS I   (USR            /PRINT USER ERROR
+       7
+       2
+       JMP     EXIT
+/
+/ SUBROUTINE UNIT -- FIND OUT WHAT THE UNIT NUMBER IS
+/                      ON ENTRY AC HAS DEVICE NUMBER
+/                      ON EXIT AC HAS 0 IFF UNIT 0 OR 0020 IFF UNIT 1
+/
+UNIT,  0
+       DCA     TMP1            /SAVE DEVICE NUMBER
+       CLA!CMA
+       TAD     TMP1            /IS DEVICE SYS:?(I.E. IS DEV NUM=1?)
+       SZA!CLA
+       JMP     UNITNS          /NO
+UNITSY,        CDF     0               /YES -- FIND OUT WHICH UNIT IS SYS:
+       TAD I   (MAGIC          /GUT HOOK RX SYSTEM HANDLER********
+       CDF     10
+       AND     (0020           /IF AC IS 0 ITS UNIT 0
+       JMP I   UNIT
+UNITNS,        TAD     TMP1            /GET INFO ON DEVICE NUMBER
+       JMS I   (USR
+       12
+UNITIN,        0
+       JMP     ERR3            /SAY DEVICE IS NOT RX IF ERROR HERE
+       TAD     UNITIN          /IS DEV SYS: IN DISGUISE?
+       RAL
+       SZL!CLA
+       JMP     UNITSY          /YES -- GO DIG OUT THE UNIT NUM.
+       TAD     UNITIN          /NO -- DOES EP MATCH RXA0'S
+       CMA!IAC
+       TAD     RX0EP
+       SNA!CLA
+       JMP I   UNIT            /YES
+       TAD     UNITIN          /NO -- CHECK RXA1
+       CMA!IAC
+       TAD     RX1EP
+       SZA!CLA
+       JMP     ERR3            /NO -- ERROR
+       TAD     (20             /YES
+       JMP I   UNIT
+\f
+/
+       PAGE
+/
+\f
+/
+/ CHECK THAT REQ'D DEVICES WERE SPECIFIED FOR OPTIONS SELECTED
+/
+LOC3,  JMS     OUTD            /CHECK THAT OUTPUT DEVICE  WAS GIVEN
+       TAD I   (OPT2           /IF COPY OR MATCH, CHECK FOR INPUT DEV
+       AND     (NOMAT!MATCH
+       SZA!CLA
+       JMS     IND
+       TAD I   (OPT2           /IF NOT READ OPTION, CHECK FOR INPUT DEV
+       AND     (READ
+       SNA!CLA
+       JMS     IND
+/
+/ PRINT VERSION IF SELECTED
+/
+VERS,  JMS     CTRLC           /CHECK FOR CONTROL C
+       TAD I   (OPT2           /SHOULD VERSION NUMBER BE PRINTED?
+       AND     (VERSION
+       SNA!CLA
+       JMP     TRANS           /NO -- GO CHECK THAT DEVS ARE RXS
+       TAD     (VERBUF         /YES -- PRINT MESSAGE
+       JMS     TYPE
+/
+/ PREPARE FOR DATA TRANSFER
+/
+TRANS, TAD I   (OPT2           /SET C SWITCH IF COPY REQ'D
+       AND     (MATCH!READ
+       SNA!CLA
+       JMP     TRANSB
+       TAD I   (OPT2
+       AND     (NOMAT
+       SNA!CLA
+       JMP     TRANSA          /DON'T SET C SWITCH
+TRANSB,        TAD I   (OPT1           /SET IT
+       AND     (MCOPY
+       TAD     (COPY
+       DCA I   (OPT1
+TRANSA,        TAD I   (OPT2           /SET M SWITCH IF MATCH REQ'D
+       AND     (NOMAT!READ
+       SZA!CLA
+       JMP     TRANS1
+       TAD I   (OPT2
+       AND     (MMATCH
+       TAD     (MATCH
+       DCA I   (OPT2
+TRANS1,        TAD     OUTDEV          /NO -- CHECK THAT OUTPUT DEV IS RX
+       TAD     (7757           /PREPARE TO GET DEV TYPE FROM TABLE
+       DCA     TMP3
+       TAD I   TMP3
+       AND     (0770
+       RTR!CLL
+       RAR
+       TAD     (-DEVTYP        /WAS DEVICE AN RX?
+       SZA!CLA                 /DOES IT MATCH?
+       JMP     ERR3            /NO -- OUTDEV IS NOT AN RX!!
+       TAD     OUTDEV          /SETUP UNIT NUMBERS
+       JMS     UNIT            /FOR OUPUT DEVICE
+       DCA     WO1
+       TAD     WO1
+       TAD     (4002
+       DCA     RO1
+/
+OUTOK, TAD I   (OPT1           /IF MATCH OR COPY GET INFO ON INDEV
+       AND     (COPY
+       SZA!CLA
+       JMP     OUTOK1
+       TAD I   (OPT2
+       AND     (MATCH
+       SNA!CLA                 /WAS MATCH OR COPY SELECTED?
+       JMP     DORDY           /NO -- OK
+OUTOK1,        TAD     INDEV           /MAKE SURE INPUT DEVICE IS AN RX
+       TAD     (7757           /PREPARE TO ACCESS TABLE
+       DCA     TMP3
+       TAD I   TMP3
+       AND     (0770
+       RTR!CLL
+       RAR
+       TAD     (-DEVTYP
+       SZA!CLA                 /DOES IT MATCH?
+       JMP     ERR3            /NO -- ERROR
+       TAD     INDEV           /SETUP UNIT NUMBERS
+       JMS     UNIT            /FOR INPUT DEVICE
+       TAD     (2
+       DCA     RI1
+DORDY, JMS     QUEST           /PAUSE IF SPECIFIED
+       MSG12
+       JMP     DO              /PROCESS DISKS
+\f
+/
+/ SUBROUTINE IND -- RETURN IF INPUT DEVICE NUMBER IS NON-ZERO
+/
+IND,   0
+       TAD     INDEV           /IF INPUT DEV WAS SPEC'D RETURN
+       SNA!CLA                 /IF NOT DECLARE ERROR
+       JMP     ERR5
+       JMP I   IND
+/
+/ SUBROUTINE OUTD -- RETURN IF OUTPUT DEVICE NUMBER IS NON-ZERO
+/
+OUTD,  0
+       CLA
+       TAD     OUTDEV          /IF OUTPUT DEV WAS SPEC'D RETURN
+       SNA!CLA                 /IF NOT DECLARE ERROR
+       JMP     ERR6
+       JMP I   OUTD
+/
+TMP3,  0                       /TEMP STORE
+TMP4,  0                       /TEMP STORE
+/
+ERR3,  TAD     (MSG3
+       JMP     PERR
+ERR5,  TAD     (MSG5
+       JMP     PERR
+ERR6,  TAD     (MSG6
+       JMP     PERR
+\f
+/
+       PAGE
+/
+\f
+DO,    JMS I   (USR            /UNLOCK USR FROM CORE
+       11
+       TAD     (-115           /INIT COUNTER TO -77 DECIMAL
+       DCA     CNT
+       DCA     TRACK           /INIT TRACK NUMBER TO 0
+       JMP     DO1
+/
+/ ****** END OF ONCE ONLY CODE ******
+/
+       *6420
+/
+/ WAS COPY SELECTED?
+/
+DO1,   TAD I   (OPT1           /SHOULD WE COPY?
+       AND     (COPY
+       SNA!CLA
+       JMP     DO2             /NO
+       JMS     RI              /YES -- READ INPUT DEVICE INTO FIELD 0
+       JMS     WO              /WRITE OUTPUT DEVICE FROM FIELD 0
+/
+/ WAS READ SELECTED?
+/
+DO2,   TAD I   (OPT2           /SHOULD WE READ?
+       AND     (READ
+       SNA!CLA
+       JMP     DO3             /NO -- CHECK MATCH
+       IAC                     /YES -- READ OUTPUT DEVICE INTO FIELD 1
+       JMS     RO
+/
+/ WAS MATCH SELECTED?
+/
+DO3,   TAD I   (OPT2           /SHOULD WE MATCH?
+       AND     (MATCH
+       SNA!CLA
+       JMP     DO5             /NO
+       TAD I   (OPT1           /YES -- WAS THERE A COPY?
+       AND     (COPY
+       SNA!CLA
+       JMS     RI              /NO -- READ INPUT DEVICE INTO FILED 0
+       TAD I   (OPT2           /YES -- WAS THERE A READ?
+       AND     (READ
+       SZA!CLA
+       JMP     DO4             /YES
+       IAC                     /NO -- READ OUTDEV TO FIELD 1
+       JMS     RO
+/
+/ COMPARE BUFFERS
+/
+DO4,   TAD     (BSTART
+       DCA     PTR             /INIT BUFFER POINTER
+       TAD     (-BSIZE         /SETUP WD IN BUFFER COUNTER
+       DCA     WDCNT
+DO4A,  TAD I   PTR             /GET A WD FROM FIELD 1
+       DCA     TMP5            /SAVE
+       CDF     0               /GET A WD FROM FIELD 0
+       TAD I   PTR
+       CDF     10
+       CMA!IAC                 /NEGATE
+       TAD     TMP5            /DID WDS MATCH?
+       SZA!CLA                 /SKIP IF SO
+       JMS     ERR7            /NO -- ERROR (BUT NOT FATAL)
+       ISZ     PTR             /YES -- INCREMENT POINTER
+       ISZ     WDCNT           /DONE WITH BUFFER?
+       JMP     DO4A            /NO -- PROCEED
+                               /YES --
+/
+/ TEST FOR END OF DISK
+/
+DO5,   ISZ     TRACK           /INCREMENT TRACK
+       ISZ     CNT             /DONE?
+       JMP     DO1             /NO
+       JMP     EXITOK          /YES
+TMP5,  0                       /TEMP STORE
+CNT,   0                       /ISZ COUNTER OF TRACKS
+TRACK, 0                       /TRACK NUMBER
+PTR,   0                       /WORD IN BUFFER POINTER
+WDCNT, 0                       /BUFFER WORD COUNTER
+/
+/ SUBROUTINE QUEST -- PRINT MSG AND ASK QUESTION
+/                      ASK IT ONLY IF /P WAS SPECIFIED
+/                      JMS+1 HAS MSG TO ASK
+/                      RETURN ONLY WHEN ANSWER IS YES
+/
+QUEST, 0
+       TAD I   (OPT2           /WAS /P SPECIFIED?
+       AND     (PAUS
+       SNA!CLA
+       JMP     Q2              /NO -- RETURN
+Q1,    TAD I   QUEST           /YES -- GET MESG ADDR
+       JMS     TYPE            /PRINT IT
+       TAD     (BUFF           /SELECT INPUT BUFFER
+       JMS     RDANS           /READ ANSWER
+       TAD I   (BUFF           /WAS IT "Y"?
+       AND     (77
+       TAD     (-31
+       SZA!CLA
+       JMP     Q1              /NO -- ASK AGAIN
+Q2,    ISZ     QUEST           /YES -- RETURN AT JMS+2
+       JMP I   QUEST
+/
+/ SUBROUTINE CTRLC -- CHECK FOR CONTROL C
+/
+CTRLC, 0
+       KRS
+       AND     (177
+       TAD     (-3
+       SNA!CLA
+       KSF
+       JMP I   CTRLC
+       JMP     EXIT
+/
+/ EXIT PROGRAM
+/
+EXITOK,        JMS     QUEST
+       MSG11
+EXIT,  CIF!CDF 0
+       JMP I   (7605
+\f
+/
+       PAGE
+/
+\f
+/
+/ SUBROUTINE RI -- READ FROM INPUT DEVICE
+/
+RI,    0                       /READ FROM INPUT DEVICE
+       JMS     CTRLC           /CHECK FOR CONTROL C
+       TAD     TRACK           /GET TRACK NUMBER INTO AC
+       CIF     0               /PREPARE TO ENTRY DRIVER
+       JMS I   (RW             /CALL DRIVER
+RI1,   0                       /FUNCTION WORD
+       JMP I   RI              /EXIT -- SUCCESSFUL
+       JMS     ERR8            /ERROR
+       JMS     CTRLC           /CHECK FOR CONTROL C
+       CIF     0
+       JMP I   (CONTIN         /PROCEED
+/
+/ SUBROUTINE RO -- READ FROM OUTPUT DEVICE
+/
+RO,    0                       /READ FROM OUTDEV
+       JMS     CTRLC           /CHECK FOR CONTROL C
+       TAD     TRACK
+       CIF     0
+       JMS I   (RW
+RO1,   0
+       JMP I   RO
+       JMS     ERR9
+       JMS     CTRLC
+       CIF     0
+       JMP I   (CONTIN
+\f
+/
+/ SUBROUTINE WO -- WRITE OUTPUT DEVICE
+/
+WO,    0                       /WRITE TO OUTPUT DEVICE
+       JMS     CTRLC
+       TAD     TRACK
+       CIF     0
+       JMS I   (RW
+WO1,   0
+       JMP I   WO
+       JMS     ERR10
+       JMS     CTRLC
+       CIF     0
+       JMP I   (CONTIN
+\f/
+/ MISC ERROR ROUTINES
+/
+ERR7,  0
+       TAD     (-BSTART        /SUBTRACK BUFFER START
+       TAD     PTR             /FROM WORD IN BUFFER POINTER
+       TAD     (-BHALF         /THEN SUBTRACT 1/2 OF BUFFER SIZE
+       SPA                     /SKIP IF PTR IN 2ND HALF
+       JMP     ERR7A           /PTR IN 1ST HALF
+       AND     (7600           /DIVIDE BY 64 DECIMAL AND ADD 2
+       CLL!RTR
+       RTR
+       RTR
+       IAC
+       JMP     ERR7W
+ERR7A, TAD     (BHALF          /MAKE POSITIVE
+       AND     (7600           /DIVIDE BY 64 AND ADD 1
+       CLL!RTR
+       RTR
+       RTR
+ERR7W, IAC
+       DCA     ERRTMP          /SAVE SECTOR NUMBER
+       TAD     TRACK           /WAS THERE ANOTHER MISMATCH ON THIS SECTOR?
+       TAD     ERR7TR
+       SZA!CLA
+       JMP     ERR7P           /NO
+       TAD     ERRTMP          /MAYBE
+       TAD     ERR7SC
+       SNA!CLA
+       JMP I   ERR7            /YES
+ERR7P, TAD     (MSG7
+       JMS     TYPE
+       TAD     ERRTMP
+       JMS     ADPRNT
+       TAD     TRACK           /SAVE TRACK AND SECTOR
+       CMA!IAC                 /AS 2'S COMP FOR FUTURE COMPARISION
+       DCA     ERR7TR
+       TAD     ERRTMP
+       CMA!IAC
+       DCA     ERR7SC
+       JMP I   ERR7
+ERR7TR,        400
+ERR7SC,        400
+ERR8,  0
+       DCA     ERRTMP
+       TAD     (MSG8
+       JMS     TYPE
+       TAD     ERRTMP
+       JMS     ADPRNT
+       JMP I   ERR8
+ERR9,  0
+       DCA     ERRTMP
+       TAD     (MSG9
+       JMS     TYPE
+       TAD     ERRTMP
+       JMS     ADPRNT
+       JMP I   ERR9
+ERR10, 0
+       DCA     ERRTMP
+       TAD     (MSG10
+       JMS     TYPE
+       TAD     ERRTMP
+       JMS     ADPRNT
+       JMP I   ERR10
+/
+ERRTMP,        0
+/
+\f
+/
+/ SUBROUTINE TYPE -- PRINT MESSAGE
+/                      ON ENTRY AC HAS MESSAGE ADDRESS
+/
+TYPE,  0
+       DCA     TYPAD           /SAVE ADDR
+       CIF     0
+       JMS I   TTYENT
+       4110
+TYPAD, 0
+       0
+       NOP
+       JMP I   TYPE
+/
+/ SUBROUTINE RDANS -- READ ANSWER FROM TTY
+/                      ON ENTRY AC HAS BUFFER ADDR
+/
+RDANS, 0
+       DCA     RDAD            /SAVE ADDR
+       CIF     0
+       JMS I   TTYENT
+       0110
+RDAD,  0
+       0
+       NOP
+       JMP I   RDANS
+/
+TTYENT,        0                       /ENTRY POINT TO TTY HANDLER
+/
+\f
+/
+       PAGE
+/
+\f/
+/ SUBROUTINE APRNT -- PRINT TRACK AND SECTOR
+/                      ENTER WITH SECTOR IN AC
+/
+ADPRNT,        0
+       JMS     SETIN
+       MSG13B-1
+       TAD I   TRACKN
+       JMS     SETIN
+       MSG13A-1
+       TAD     MSG
+       JMS I   TYPEIT
+       JMP I   ADPRNT
+TYPEIT,        TYPE
+TRACKN,        TRACK
+MSG,   MSG13
+\f
+/
+/ SUBROUTINE SETIN -- ENTER NUMBER INTO A MESSAGE
+/
+/      ON ENTRY AC HAS NUMBER AND JMS+1 HAS POINTER TO MESSAGE
+/      HOLE MINUS 1. (2 DECIMAL DIGIT NUMBERS ARE ASSUMED)
+/
+SETIN, 0
+       DCA     SETIN1          /SAVE NUMBER
+       DCA     SETCNT          /ZERO 10'S COUNTER
+       TAD I   SETIN           /GET MSG ADDR
+       DCA     10              /ENTER INTO AUTOINC POINTER
+       ISZ     SETIN           /BUMP RETURN ADDR
+SETINB,        TAD     SETIN1          /GET NUMBER
+       TAD     M12             /SUBTRACT 10 DECIMAL
+       SMA                     /DONE DIVIDING?
+       JMP     SETINA          /NO
+       CLA                     /YES
+       TAD     SETCNT          /GET 10'S
+       TAD     P260            /MAKE IT ASCII
+       DCA I   10              /STORE IN MESSAGE
+       TAD     SETIN1          /GET REMAINDER
+       TAD     P260            /MAKE IT ASCII
+       DCA I   10              /STORE IN MESSAGE
+       JMP I   SETIN
+SETINA,        DCA     SETIN1          /SAVE RESULT
+       ISZ     SETCNT          /INCREMENT 10'S COUNT
+       JMP     SETINB          /CONTINUE
+/
+SETIN1,        0                       /NUMBER STORAGE
+SETCNT,        0                       /10'S COUNTER
+M12,   -12                     /MINUS 10 DECIMAL
+P7,    7                       /LITERAL
+P260,  260                     /LITERAL
+\f
+/ 
+/ ERROR MESSAGES
+/
+VERBUF,        "R; "X; "C; "O; "P; "Y; 240; "V; "4; "A; 240; 215; 212; 232
+MSG2,  "I; "L; "L; "E; "G; "A; "L; 240; "S; "P; "E; "C; "I; "F; "I
+       "C; "A; "T; "I; "O; "N; 215; 212; 232
+MSG3,  "D; "E; "V; "I; "C; "E; 240; "I; "S; 240; "N; "O; "T; 240
+       "R; "X; 215; 212; 232
+MSG5,  "N; "O; 240; "I; "N; "P; "U; "T; 240; "D; "E; "V; "I; "C;
+       "E; 215; 212; 232
+MSG6,  "N; "O; 240; "O; "U; "T; "P; "U; "T; 240
+       "D; "E; "V; "I; "C; "E; 215; 212; 232
+MSG7,  "C; "O; "M; "P; "A; "R; "E; 240
+       "E; "R; "R; "O; "R; 232
+MSG8,  "I; "N; "P; "U; "T; 240; "D; "E; "V; "I; "C; "E; 240
+       "R; "E; "A; "D; 240; "E; "R; "R; "O; "R; 232
+MSG9,  "O; "U; "T; "P; "U; "T; 240; "D; "E; "V; "I; "C; "E; 240
+       "R; "E; "A; "D; 240; "E; "R; "R; "O; "R; 232
+MSG10, "O; "U; "T; "P; "U; "T; 240; "D; "E; "V; "I; "C; "E; 240
+       "W; "R; "I; "T; "E; 240; "E; "R; "R; "O; "R; 232
+MSG11, "I; "S; 240; "M; "O; "N; "I; "T; "O; "R; 240
+       "R; "E; "M; "O; "U; "N; "T; "E; "D
+       "?; 232
+MSG12, "R; "E; "A; "D; "Y; "?; 232
+MSG13, 240; "T; "R; "A; "C; "K; 240
+MSG13A,        0
+       0
+       ",; "S; "E; "C; "T; "O; "R; 240
+MSG13B,        0
+       0
+       215; 212; 232
+$