/RXCOP4.PA FOR OS78 V4
/ORGINAL SOURCE:
/ RXCOPY FOR OS/8 V3D AND OS/78 V3.0
/
/ 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.
/

/
/ VERSION V4A	M.H.	MAY 20, 1977
/		S.R.	MAY 20, 1977
/ VERSION V4B	S.R.	AUG 24, 1978
/
/ VERSION V4C   JPD	JAN 1,1979
/
/ VERSION V5A	R.R.	APR 13,1979
/

/VERSION "A0"  JUNE 81 RELEASE FOR OS/78 V4 (VT278 SUPPORT)
/CHANGED CTRLC ROUTINE TO ENABLE KEYBOARD AND PRINT ^C, SINCE MONITOR
/NO LONGER LOOKS FOR "UNPRINTED" ^C.

/ START ADDRESS 16000;  JSW 7003
/
/ THIS PROGRAM PERFORMS COPY, READ, AND COMPARE OPERATIONS ON
/ RX FLOPPY DISKS ON A TRACK BY TRACK BASIS.
/
/  THE COMMAND OPTIONS ARE:
/
/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
/S	FORMAT (ONLY) OUTPUT DEVICE TO SINGLE DENSITY
/D	FORMAT (ONLY) OUTPUT DEVICE TO DOUBLE DENSITY
/ IF NO OPTIONS ARE EXPLICITLY DECLARED, COPY AND MATCH ARE ASSUMED.
/
/  THERE ARE TWO COMMAND FORMATS:
/
/   DEV:<DEV:/OPTION   WHERE OPTIONS ARE  C, P, N, M, OR V.
/   DEV:/R     DEV:</R   <DEV:/R  THREE FORMATS FOR  R, S, D, OR V.
/ 
/
/  WARNING!!
/
/  THIS PROGRAM HAS TWO CONNECTIONS WITH THE STANDARD
/  RX HANDLERS
/
/  IT IS ASSUMED THAT THE RX SYSTEM HANDLER HAS AT LOCATION 7623
/  A WORD THAT CONTAINS THE 20 BIT IF BOOTED TO UNIT #1
/
/  IT IS ASSUMED THAT THE RX NON-SYSTEM HANDLER HAS ENTRY POINTS
/  CORRESPONDING TO UNIT NUMBERS AS FOLLOWS:
/
/		UNIT		LAST DIGIT OF ENTRY POINT
/
/		0		0
/		1		4
/		2		1
/		3		5
/
/  WHERE UNITS 2 AND 3 ARE A SECOND PAIR OF FLOPPIES ON A VT78 ONLY!
/
/
/	V5A	D.H./R.R.	CHANGES TO FIX FOR 88 OPERATION:
/
/			1. MOVE IOSUB TO ABOVE 26417 WHICH IS 
/			   DYNAMICALLY USED IN RX02 OPERATION.
/			2. CHANGED REF TO V2B TO OS/78 V3.0.
/			3. CHANGED AT IOSUB, JMP TO NOSEL TO
/			   AVOID EXECUTION OF UNNEEDED IOT'S.
/			4. CHANGE SELECT CODE SO THAT ONCE ONLY
/			   CODE IOTS ARE NOT CHANGED WHEN SELECT 
/			   IS CALLED DURING READ/WRITE/COMPARE OP-
/			   ERATIONS.  (BUFFER WAS GETTING MODIFIED)

MAGIC=7623		/WORD IN RX SYSTEM HANDLER HAS 20 IF BOOTED ONTO
/			/UNIT #1 (RIGHT-HAND ONE)
OPT1=7643		/1ST COMMAND DECODER OPTION WORD
OPT2=7644		/2ND COMMAND DECODER OPTION WORD
OPT3=7645		/3RD COMMAND DECODER OPTION WORD
BUFF=2000		/INPUT BUFFER FOR TTY MSGS
TYP1=25			/DEVICE CODE FOR RX01
TYP2=32			/DEVICE CODE FOR MULTI-RX HANDLER WAS 27 (TAKEN BY TA8E)
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
MATCH=4000		/MATCH OPTION MASK; NOTE SOME CODE !KNOWS! THIS IS 4000
READ=0100		/READ OPTION MASK
VERSION=0005		/VERSION OPTION MASK
PAUS=0400		/PAUSE OPTION MASK
SINGLE=40		/SINGLE DENSITY FORMAT ONLY
DOUBLE=200		/DOUBLE DENSITY FORMAT ONLY
OLDOUB=400		/ORIGINAL POSITION OF DOUBLE BIT
CHANGE=1		/IN OPTION WORD, 1 MEANS MUST FORMAT OUTPUT MEDIA
/
/  CORE LAYOUT
/
/  FIELD 0
/
/  RX BUFFER	0020-6417
/  ERROR MSGS	6420-7177
/  TTY HANDLER	7200-7577
/  SYSTEM	7600-7777
/
/  FIELD 1
/
/  RX BUFFER	0020-6417
/  INIT CODE	5000-6417
/  PROGRAM	6420-7577
/  SYSTEM	7600-7777
/
/  FIELD 2&3 (OPTIONAL)
/
/  RX BUFFER	0020-6417
/
/  EXECUTION ORDER
/
/  INIT CODE STARTS AT 6000, THEN TO 5000, 5200, 5400, 7110
/
/  MAIN LOOP IS AT 6420
/  SERVICE SUBROUINES OCCUPY MOST OF REST OF THE FIELD
/
/
/  FLOPPY IOT'S
/
SDN=6755
LCD=6751
STR=6753
XDR=6752
SER=6754
FLINIT=6757
/
/	NEW DEVICE CODE ASSIGNMENT
/
NEWCDE=760		/FOR SECOND SET OF DRIVES ON NON-VT78 SYSTEMS
/
/  WARNING ***** IF YOU ADD ANY IOT'S PLEASE PUT IN IOTTAB SO
/	THAT THEY CAN BE CHANGED DYNAMICALLY. ****
/

AC7776=CLL CLA CMA RAL		/SET AC TO -2
AC7775=CLL CLA CMA RTL		/SET AC TO -3
AC0002=CLL CLA CML RTL		/SET AC TO 2
AC4000=CLL CLA CML RAR		/SET AC TO 4000
/
/
/  THE OPTION WORDS FROM THE COMMAND DECODER ARE COMBINED INTO ONE WORD
/  HERE CALLED 'OPTION'. THE BITS IN OPTION ARE M,N,C,P,D,R,S,0,0,V,0,0.
/  NOTE THAT ONLY THE 'D' BIT HAS BEEN REPOSITIONED.
/
/  WARNING! THE MEANING OF THE M AND C BITS ON INPUT IS DIFFERENT THAN THAT
/  WHILE THE PROGRAM IS ACTUALLY RUNNING. ON INPUT C IS COPY AND MATCH.
/  ON INPUT M IS MATCH WITHOUT COPY. WHILE THE PROGRAM IS RUNNING, M
/  IS MATCH (INDEPENDENT OF COPY), AND C IS COPY (INDEPENDENT OF MATCH).
/
/  SUMMARY OF CONFIGURATION DEPENDENT VARIABLES
/
/	ISVT78		1 IF A VT78 OR VT278, 0 IF NOT
/	ISBIG		1 IF GREATER THAN 12K, 0 IF NOT
/	ISDOUB		0 IF SINGLE DENSITY TRANSFER, 1 IF DOUBLE
/
/
/  SUMMARY OF DERIVED VARIABLES  (DO NOT APPEAR AS SUCH IN PROGRAM)
/
/	HLFTRK		(NOT ISBIG).AND.ISDOUB=1.AND.MATCH OPTION
/	SHORT		ISDOUB=0.IOR.HLFTRK
/	SLOW		ISVT78.AND.ISDOUB=1
/
/  I/O CONTROLL INFORMATION IS PLACED IN THE VARIABLES RIFN, ROFN
/
/	RIFN		4000  IF RX02 OR RX03 HARDWARE
/			0400  IF A DOUBLE DENSITY TRANSFER IS TAKING PLACE
/			0020  IF UNITS 1 OR 3
/			0002  ALWAYS SET, INDICATES READ FUNCTION
/			0001  IF UNITS 2 OR 3, SECOND PAIR ON VT78
/
/	ROFN		WHICH IS THE SAME WORD FOR OUTPUT, GETS BITS IN
/			THE SAME FORMAT
/
/  THE ABOVE VARIABLES RESULT IN THE SETTING OF THE FOLLOWING COUNTS
/    WHICH ARE PLACED HERE AND THERE IN CONVENIENT PAGES
/
/	COUNT1		-20 IF ISDOUB=1, -10 IF NOT
/	COUNT2		-100 IF ISDOUB=1, -40 IF NOT
/	COUNT3		-400 IF ISDOUB=1, -200 IF NOT
/	COUNT4		-2 IF DOUBLE HEADED, -1 IF NOT
/	COUNT5		-2 IF HLFTRK, -1 IF NOT; 
/	COUNT6		10 IF SHORT, 20 IF NOT
/	COUNT7		-1 IF SHORT, -2 IF NOT
/	COUNT8		3 IF SLOW, 2 IF NOT
/	COUNT9		SKP IF SLOW, IAC IF NOT
/
/
	FIELD	1
	*5000
/
/  ADDITIONAL ONCE-ONLY CODE
/
/
/
/  PRINT VERSION NUMBER EVEN IF SOME ERRORS
/
LOC3,	TAD	OPT2	/PRINT VERSION FIRST EVEN IF AN ERROR
	AND	(VERSION
	SNA CLA		/SKIP IF PRINTOUT NEEDED
	JMP	VALID	/NO, CONTINUE CHECKING
	TAD	(VERBUF	/ADDRESS OF MESSAGE IN FIELD 0
	JMS	TYPE
/
/
/
/  VARIOUS CHECKING FOR ILLEGAL SWITCHES
/
VALID,	TAD	(-COPY-OLDOUB-1  /IS SWITCH OTHER THAN COPY OR DOUBLE?
	AND	OPT1	/IN THE FIRST COMMAND DECODER OPTION WORD
	SZA CLA		/SKIP IF OK
	JMP	ERR17
	TAD	(-MATCH-NOMAT-PAUS-READ-SINGLE-VERSIO-1
	AND	OPT2	/CHECKING FOR OTHER THAN M,N,P,R,S,V
	SZA CLA
	JMP	ERR17
	TAD	OPT3	/THIS WORD SHOULD BE 0, I.E. NO SWITCHES AT ALL
	SZA CLA		/SKIP IF OK
	JMP	ERR17
	TAD	OPT1	/DOUBLE, IF PRESENT, MUST CHANGE POSITION
	AND	(OLDOUB	/CHECK IT IN OLD POSITION
	SZA CLA		/SKIP IF NOT THERE
	TAD	(DOUBLE-OLDOUB	/MOVE TO NEW POSITION
NOFORM,	TAD	OPT1	/JOIN ALL SWITCHES INTO ONE WORD
	TAD	OPT2	/COMBINING WORDS
	DCA	OPTION	/HOLD ALL TOGETHER FOR SIMPPLICITY
	TAD	(BITTAB	/LOAD UP TO TEST COMBINATIONS
	DCA	TMP5
	TAD	OPTION
	DCA	TMP6
VALLOO,	TAD	TMP6
	CLL RAL		/NEXT OPTION BIIT TO LINK
	DCA	TMP6
	TAD I	TMP5	/NEXT MASK
	SNA		/SKIP IF MORE TO DO
	JMP	CROSS	/CROSS TALK CHECKED OUT
	ISZ	TMP5	/BUMP POINTER
	AND	TMP6	/CHECK ILLEGAL POSSIBILITIES
	SNL		/SKIP ONLY IF MASTER BIT IS ON
	CLA		/GO OUT VIA JMP VALLOO
	SNA CLA		/SKIP IF MASTER AND SOME OTHER MATCH, ILLEGAL
	JMP	VALLOO
ERR17,	TAD	(MSG17-MSG6	/SWITCHES ERROR MSG
ERR6,	TAD	(MSG6-MSG5
ERR5,	TAD	(MSG5-MSG3
ERR3,	TAD	(MSG3
	JMP	PERR	/GO PRINT ERROR
/
CROSS,	TAD	(SINGLE+DOUBLE+MATCH+READ	/ANY SPECIFIED FUNCTION
	AND	OPTION
	SZA CLA		/SKIP IF NO
	JMP	CROSS1	/A FUNCTION THERE, DON'T SET C
	TAD	OPTION
	AND	(-COPY-1
	TAD	(COPY
	DCA	OPTION
CROSS1,	TAD	(SINGLE+DOUBLE+NOMAT+READ
	AND	OPTION	/SET M IF REQUIRED
	SZA CLA		/SKIP IF NECESSARY
	JMP	CROSS3	/NO
	TAD	OPTION
	RAL		/KNOW! THAT MATCH=4000
	CLL CML RAR
	DCA	OPTION
/
/  NOW OUTPUT DEVICE
/
CROSS3,	TAD	OUTDEV
	SNA
	JMP	ERR6	/DEVICE NOT THERE AT ALL!
	JMS	CHCKRX	/IS IT REALLY AN RX? RETURN UNIT NUMBER;+2 FOR READ
	DCA	ROFN	/BUILD REST OF IT IN LATER
/
/  NOW INPUT DEVICE (IF ANY)
/
CROSS2,	TAD	(READ+SINGLE+DOUBLE
	AND	OPTION	/AN INPUT DEVICE NEEDED
	SZA CLA		/SKIP IF NECESSARY
	JMP	REAFOR	/READ OR FORMAT
	TAD	INDEV
	SNA
	JMP	ERR5	/DEVICE NOT PRESENT AT ALL, ERROR
	JMS	CHCKRX	/IS IT REALLY AN RX? RETURN READ CODE +UNIT #
	DCA	RIFN
	TAD	RIFN	/CHECK IF UNIT NUMBERS THE SAME
	CIA		/WHICH IS AN ERROR
	TAD	ROFN
	SNA CLA		/SKIP IF DIFFERENT
	JMP	ERR2
	JMP	IICNT
/
REAFOR,	TAD	INDEV	/FOR READ AND FORMAT INPUT DEVICE IS ILLEGAL
	SZA CLA		/SKIP IF NOT PRESENT
	JMP	ERR2	/SPECIFICATION ERROR ON EXTRA DEVICE
	JMP	IICNT	/OK, CONTINUE INITIALIZATION
/
/
TMP5,	0		/WORK LOCATIONS
TMP6,	0
/
	PAGE
/
/
/  ESTABLISH FUNDAMENTAL CONFIGURATION VARIABLES
/
IICNT,	JMS I	(USR	/UNLOCK USR
	11
	TAD	OPTION	/IF SLASH-P, MUST GET CORRECT FLOPPY ON!
	AND	(PAUS
	SNA CLA		/SKIP IF SLASH-P
	JMP	IICNT2	/NO, JUST KEEP GOING
SYSOFF,	JMS	QUEST	/ASK REMOUNT QUESTION
	MSG12		/ADDR OF MESSAGE
	JMP	SYSOFF	/"N" ASK AGAIN
/			/"Y" CONTINUE TO INITIALIZE
IICNT2,	KCF		/TEST FOR A VT278
	KSF		/VT278 WILL SKP
	SKP		/GO TEST FOR VT78
	JMP	SET78	/SET 78 FLAG
	CDF	70	/TEST FOR A VT78
	RDF
	CDF	10	/BACK TO US
	TAD	(7750	/VT78 RETURNS 30 FROM 70 !
	SNA CLA
SET78,	IAC		/ SET FLAG TO A 1
	DCA	ISVT78	/FOR VT78 AND VT278
	CDF	0	/FETCH CORE SIZE WORD
	TAD I	(7777
	CDF	10	/INDIRECTS HERE
	AND	(70
	TAD	(7750	/MAKING + IF 16 OR MORE K OF CORE
	SMA CLA		/SKIP IF NOT 16K
	IAC		/16K
	DCA	ISBIG	/SAVE THAT INFO
	TAD	ROFN	/GET DEVICE STATUS TYPE FOR OUTPUT DEVICE
	JMS	DEVSTT	/RETURN CODE IN .+1, UPDATED ROFN WORD IN AC
MEDOU,	-1		/RETURN 0-3;SINGLE;SINGLE ON DOUB;DOUB;QUAD
	DCA	ROFN
	TAD	MEDOU	/DEFAULT FOR MEDIN, IF NO INPUT MEDIA AT ALL
	DCA	MEDIN
	TAD	INDEV	/IS AN INPUT DEVICE?
	SNA CLA		/SKIP IF YES
	JMP	ONLY1	/SPECIAL PROCESSING FOR ONE DEVICE CASES
	TAD	RIFN	/GETTING UNIT NUMBER
	JMS	DEVSTT	/CHECK FOR READY, RETURN TYPE CODE
MEDIN,	-1		/RETURN 0-3, SAME AS MEDOU
	DCA	RIFN	/FULL I/O SKELETON
	TAD	MEDIN	/CONVENIENCE, MAKE INPUT OUTER LEVEL INDEX
	RTL
	TAD	MEDOU	/INNER LEVEL INDEX
	TAD	(ACTAB	/TABLE FOR WHICH ACTION TO TAKE
	DCA	TMP7
	TAD I	TMP7	/AN EXTRA INDIRECT NEEDED
	DCA	TMP7
	JMP I	TMP7	/GO TO CORRECT ACTION
/
/  DEVSTT
/
/  CALL WITH 2 (READ CODE) + UNIT NUMBER IN AC: PARTIAL RIFN/ROFN WORD
/
/  IF DRIVE NOT READY, ERROR OUT DIRECTLY
/
/  RETURN WITH DEVICE TYPE IN CALL +1
/
/	0		RX01 DRIVE
/	1		RX02 DRIVE WITH RX01 FLOPPY
/	2		DOUBLE DENSITY DRIVE AND MEDIA; EITHER BOTH NOT
/			BOTH MAY BE DOUBLE SIDED, BUT THAT IS IGNORED!!
/	3		RX03 DRIVE AND RX03 FLOPPY
/
/  RETURN WITH FULL RIFN/ROFN CODE IN AC
/
DEVSTT,	0
	DCA	TMP7	/SAVE CALLING CODE
	TAD	TMP7	/BUT CHECK OUT WHICH DRIVE PAIR
	JMS	SELECT	/SELECT PAIR, IF NECESSARY; AC HAS BEEN ANDED WITH 7776
	TAD	(410	/DO DOUBLE DENSITY 12 BIT READ STATUS
	JMS	ONCOVR	/IOT SEQUENCE PLACED OUTSIDE OF BUFFER AREA SINCE
			/IT GETS MODIFIED LATER

	AND	(232	/KEEPING READY, DENSITY ERROR, DOUBLE, QUAD
	DCA	TMP8	/SAVE WHILE WE CLEAR UP DEVICE
	TAD	(416	/DUMMY READ ERROR STATUS TO SET DONE AGAIN
	JMS	TWCOVR	/GO DO THE REST OF THE IOT SEQUENCE

L7600,	7600		/IT MAY SKIP!
	TAD	TMP8	/GET BACK STATUS
	TAD	L7600	/CHECK FOR READY
	SPA
	JMP	STERR	/NOT READY, PRINT ERROR
	CLL RTR		/PUT QUAD BIT TO LINK
	SZL		/SKIP ON NOT QUAD
	CLL CML CLA CMA	/ALL BITS TO 1 !! FALLS THRU TO EXIT WITH 3
	RTR		/PUT DOUBLE BIT TO LINK
	SNL		/SKIP ON DOUBLE
	JMP	REJOIN	/JOIN WITH OTHER CASES, AC NOW 0
	CMA		/MAKING SINGLE -2, DOUBLE -1, QUAD 0
	TAD	(3	/MAKING SINGLE 1, DOUBLE 2, QUAD 3
REJOIN,	DCA I	DEVSTT	/RETURN 0-3 TYPE IN CALL+1
	TAD I	DEVSTT	/GET CODE BACK
	TAD	(FNTAB	/TURN CODE INTO FUNCTION BITS
	DCA	TMP8
	TAD I	TMP8	/4000 FOR DOUBLE DRIVE, 400 FOR DOUBLE TRANSFER
	TAD	TMP7	/ORIGINAL CALLING BITS
	ISZ	DEVSTT	/HOP OVER RETURNED ARGUMENT
	JMP I	DEVSTT	/EXIT WITH CODE IN AC
/
/
STERR,	CLA			/AC JUNK COMING IN
	TAD	(MSG18-MSG19	/PRINT MESSAGE 18
ERR19,	TAD	(MSG19-MSG15	/PRINT MESSAGE 19
ERR15,	TAD	(MSG15		/PRINT MESSAGE 15
	JMP	PERR
/
TMP7,	0
TMP8,	0

/
	PAGE
/
/  SPECIAL CODE FOR ONE DEVICE CASES; READ, SINGLE, DOUBLE
/
ONLY1,
	TAD	OPTION	/SEPARATE OUT READ
	AND	(SINGLE+DOUBLE
	SNA		/SKIP IF NOT READ (CAN ONLY BE ONE OF THREE BITS!)
	JMP	READIT	/READ CASE, FALL INTO OTHER CODE
	RAL		/WATCH OUT! GOING TO SPLICE PROPER DENSITY BIT
	JMP	TOUGH	/INTO ROFN FOR LATER FORMAT
/
/  ENTER FROM DISPATCHER, AUTO-FORMAT, AND OK
/
CISZ,	ISZ	OPTION	/SET CHANGE DENSITY BIT IN OPTION WORD
SAME,
/
/  SET UP COUNT VARIABLES
/
IICNT4,	TAD	RIFN	/PUT TRANSFER DENSITY BIT FROM INPUT INTO OUTPUT
TOUGH,	AND	(400	/KEEPING THAT BIT; FORMAT ONLY CASE JOINS HERE
	DCA	ISDOUB	/TERMPORARY USE OF LATER VARIABLE
	TAD	ROFN	/OUTPUT CONTROL
	AND	(7377	/KEEPING OTHER BITS
	TAD	ISDOUB
	DCA	ROFN	/REPLACING MODIFIED OUTPUT WORD
READIT,	AC7776		/TAKE OFF READ BIT FOR OUTPUT WRITE FUNCTION
	TAD	ROFN
	DCA	WOFN
	AC7776		/
	TAD	MEDIN	/MAKE A TEMPORARY VARIABLE ISDOUB
	SMA CLA		/SKIP IF SINGLE
	IAC
	DCA	ISDOUB	/WHICH IS 1 IF DOUBLE DENSITY MEDIA
	TAD	ISDOUB	/SIGNLE OR DOUBLE
	SZA CLA		/SKIP IF SINGLE
	TAD	(-10	/DOUBLE, MAKE -20
	TAD	(-10	/SINGLE, MAKE -10
	DCA	COUNT1
	TAD	COUNT1	/NOW MULTIPLY BY FOUR
	CLL RAL
	CLL RAL
	DCA	COUNT2
	TAD	COUNT2	/NOW AGAIN BY FOUR
	CLL RAL
	CLL RAL
	DCA	COUNT3
	AC7775
	TAD	MEDIN	/CHECK FOR QUAD SIZED
	SMA CLA		/SKIP IF NOOT
	IAC
	CMA		/MAKE A -2 IF YES, -1 IF NO
	DCA	COUNT4
	TAD	ISBIG	/MAKE VARIABLE HLFTRK
	SNA CLA		/MISSES COLLECT IN SZA CHAIN
	TAD	OPTION
	SPA CLA		/!!KNOWS!! THAT MATCH BIT IS AC0
	TAD	ISDOUB
	SZA CLA
	IAC		/HALF TRACK; SMALL MACHINE, MATCH OPTION, DOUBLE DENSITY
	CMA
	DCA	COUNT5	/-2 IF HALF-TRACK, OTHERWISE -1
	TAD	COUNT5	/FIND OUT IF ONE OR TWO FIELDS PER SWOOP
	AND	ISDOUB	/LEAVING 1 IN AC IF TWO FIELDS
	CMA		/SO MAKE ANOTHER -2,-1 COUNTER
	DCA	COUNT7
	TAD	COUNT7	/NOW MULTIPLY IT BY -10 OCTAL TO MAKE FIELD SPAN
	CIA
	CLL RAL
	RTL
	DCA	COUNT6
	TAD	ISVT78	/NOW CONSTRUCT INTERLEAVE, TWO OR THREE
	AND	ISDOUB	/THREE IF DOUBLE DENSITY ON A VT78
	TAD	(2
	DCA	COUNT8
	AC7775		/REST OF JOB, MAKE SKP OR IAC
	TAD	COUNT8
	SZA CLA		/SKIP IF IT WAS THREE INTERLEAVE
	TAD	(IAC-SKP /TWO INTERLEAVE, WANTS AN IAC
	TAD	(SKP	/THREE INTERLEAVE, WANTS A SKIP
	DCA	COUNT9
	TAD	OPTION	/INITIALIZE ROFLD
	AND	(READ	/IS IT ONLY A READ
	SNA CLA		/SKIP IF YES, CDF 0
	TAD	COUNT6	/MATCH, INIT AT CDF SPAN
	TAD	(CDF 0
	DCA	ROFLD
	TAD	OPTION	/NEED TO REFORMAT OUTPUT DRIVE?
	AND	(CHANGE+SINGLE+DOUBLE
	SNA CLA		/SKIP IF YES
	JMP	DO00	/NO, GO DO OPERATION
	JMP	REFORM	/GO TO REFORMATTER
/
/
ISBIG,	0		/1 IF IT HAS 16K OF CORE, 0 IF LESS
ISDOUB,	0		/1 IF TRANSFER DOUBLE DENSITY
/
	PAGE
	FIELD	1
	*6000
/
/
/  EQUATES FOR AUTO-INCR REG'S, SO THEY SHOW UP IN CREF
/
X10=10
X11=11
X17=17
/
/ ***** BEGIN ONCE ONLY CODE *****
/
/
/ ENTER HERE AND GET USER INPUTS
/
START,	CLA!SKP			/NORMAL ENTRY (MUST CALL DECODER)
CHAIN,	JMP	NODEC		/CHAIN ENTRY
	CDF	10
	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 CLA			/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 CLA
	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
LOC3A,	JMP	LOC3		/YES -- CONTINUE ON NEXT PAGE
/
OUTDEV,	0			/OUTPUT DEVICE NUMBER
INDEV,	0			/INPUT DEVICE NUMBER
TMP0,	0
TMP1,	0			/TEMP STORE
TMP2,	0			/TEMP STORE
/
ERR2,	TAD	(MSG2		/ILLEGAL SPECIFICATION
PERR,	JMS	TYPE		/PRINT ERROR MESSAGE
	JMP	GOEXIT		/LEAVE
/
ERRUSR,	JMS I	(USR		/PRINT USER ERROR
	7
	2
	JMP	GOEXIT
/
/
/  CHCKRX
/
/  CALL WITH DEVICE # IN AC, RETURN IF REALLY AN RX
/  RETURN WITH UNIT NUMBER IN AC; 20 IF RIGHT HAND DRIVE (#1)
/  PLUS 1 IF A SECOND PAIR ON A VT78
/  PLUS ALWAYS HAVING A 2 ADDED IN FOR A READ FUNCTION
/
OLDRX=TYP1^10
NEWRX=TYP2^10		/TYPE CODES FOR RX HANDLERS
/
/
/
CHCKRX,	0
	DCA	TMP0	/SAVE DEVICE NUMBER
	CLA CMA
	TAD	TMP0	/CHECK IF IT IS SYS
	SZA CLA		/SKIP IF YES
	JMP	NONSYS	/NO, GO TO NON-SYS PROCESSING
CHCKSY,	CDF	0	/FETCH SKELETON WORD FROM SYS
	AC0002		/PUT IN READ BIT (BIT NOT SET IN MAGIC)
	TAD I	(MAGIC
	CDF	10
	JMP	CHCKJ	/JOIN UP TO MASK AND EXIT
NONSYS,	TAD	(7757	/TABLE BASE
	TAD	TMP0
	DCA	TMP1	/HOLD FOR INDIRECT
	TAD I	TMP1	/GET STORED CODE
	AND	(770	/KEEP TYPE BITS
	TAD	(-NEWRX	/IS IT A NEW ONE
	SZA		/SKIP IF YES, BOUNCE DOWN SZA'S
	TAD	(-OLDRX+NEWRX /SO SEE IF OLD ONE
	SZA	CLA	/SKIP IF GOT A MATCH
	JMP	ERR3	/WRONG DEVICE TYPE, ERROR OUT
	TAD	(4001	/RE-ESTABLISH LOAD ADDRESS ARGUMENT
	DCA	LOADAD
	TAD	TMP0	/TRY TO LOAD HANDLER
	JMS I	(USR
	1		/LOAD CODE
LOADAD,	4001		/GETS WRITTEN OVER
	JMP	ERR3	/ERROR OUT
	TAD	LOADAD	/OUCH!! ENTRY POINT FOR UNIT 1+3, HAS A 4 IN IT!!
/			/ENTRY POINT FOR UNIT 2+3 HAS A 1 IN IT
	AND	(5	/KEEP ONLY THE TWO RELEVANT BITS
	TAD	(16	/SHIFT 4 TO 20, PUT IN 2 FOR READ CODE
CHCKJ,	AND	(23	/KEEP 2 FOR READ CODE, 20 AND 1 FOR UNIT SPECIFIERS
	JMP I	CHCKRX	/OK, RETURN
/
	PAGE
/

/
/
	*6400
/
/  PUT TABLES HERE TO FIT
/  BITTAB
/
/  TABLE FOR DETERMINING ILLEGAL CALLING OPTIONS
/
BITTAB,	6700		/WITH M; N,C,D,R,S  ILLEGAL
	5600		/WITH N; C,D,R,S  ILLEGAL
	3400		/WITH C; D,R,S  ILLEGAL
	0001		/WITH P; ALL ARE LEGAL
	6000		/WITH D; R,S ILLEGAL
	4000		/WITH R; S ILLEGAL
	0		/LOOP STOPPER; ALL LEGAL WITH V, FALLS OUT OK
/
/  ACTAB
/
/  TABLE OF ACTION FOR 16 COMBINATIONS OF INPUT AND OUTPUT TYPES
/
ACTAB,	SAME		/IN TYPE 0, OUT TYPE 0
	SAME		/0,1
	CISZ		/0,2
	CISZ		/0,3
	SAME		/1,0
	SAME		/1,1
	CISZ		/1,2
	CISZ		/1,3
	ERR15		/2,0
	CISZ		/2,1
	SAME		/2,2
	SAME		/2,3  ?????	NOT SURE IF CORRECT - CAN'T TEST
	ERR15		/3,0
	ERR15		/3,1
	ERR15		/3,2
	SAME		/3,3
/
/
FNTAB,	0		/FUNCTION BITS BY TYPE CODE 0-3
	4000		/SINGLE MEDIA BUT 4000 DOUBLE DRIVE
	4400		/DOUBLE ON DOUBLE
	4400		/QUAD ON QUAD, LOOP HANDLES WHICH HEAD
/
/
DO00,	TAD	(-115	/TRACK LOOP CONTROL COUNT
	DCA	TRACK
/
/ ****** END OF ONCE ONLY CODE ******
	IFNZRO	.-6420&4000	<*6420>	/FORCE BEYOND BUFFER
/
/  ##  MAIN LOOP  ##
/
DO0,	TAD	COUNT4		/SET UP HEAD CONTROLLER
	DCA	HEADER
DO1,	TAD	COUNT5		/SET UP HALF-TRACK CONTROLLER
	DCA	HFTRCK
/
/ WAS COPY SELECTED?
/
DO2,	TAD	HEADER		/PLACE HEADER INFO TO COMMAND WORD
	CMA CLL RTR
	RTR			/0 IF FIRST, 1000 IF SECOND
	TAD	(100		/ALSO NEED EIGHT-BIT BIT
	DCA	LOOPFN		/FUNCTION FOR THIS LOOP
	TAD	OPTION		/SHOULD WE COPY?
	AND	(COPY
	SNA!CLA
	JMP	DO3		/NO
	JMS	RI		/YES -- READ INPUT DEVICE INTO FIELD 0
	JMS	WO		/WRITE OUTPUT DEVICE FROM FIELD 0
/
/ WAS READ SELECTED?
/
DO3,	TAD	OPTION		/SHOULD WE READ?
	AND	(READ
	SZA CLA			/SKIP IF NOT NEEDED
	JMS	RO
/
/ WAS MATCH SELECTED?
/
DO4,	AC4000		/ADD PUTS MATCH BIT TO LINK
	TAD	OPTION
	AND	(COPY	/MATCH IN LINK, COPY IN AC
	SNL		/SKIP IF A MATCH
	JMP	DO6	/NO MATCH, READY FOR LOOP CONTROL
	SNA CLA		/HAS A COPY ALREADY BEEN DONE; IF SO DON'T READ TWICE
	JMS	RI	/READ FROM INPUT DEVICE
	JMS	RO	/READ FROM OUTPUT DEVICE
/
/ COMPARE BUFFERS
/
DO5,	JMS	COMP		/CALL ACTION TO DO COMPARE
/
/  LOOP CONTROLLERS
/
DO6,	CLA			/MAY HIT WITH JUNK IN AC
	ISZ	HFTRCK		/GO AGAIN FOR OTHER HALF TRACK?
	JMP	DO2		/YES
	ISZ	HEADER		/NEED TO GO TO OTHER HEAD?
	JMP	DO1		/OTHER HEAD, LOOP AGAIN
	ISZ	TRACK		/INCREMENT TRACK, CHECK DONE
	JMP	DO0		/NO
EXITOK,	TAD	OPTION		/DOES HE NEED TO REMOUNT SYS?
	AND	(PAUS
	SNA CLA			/SKIP IF YES
	JMP	GOEXIT		/NO, BACK TO SYSTEM
SYSON,	JMS	QUEST		/ASK HIM
	MSG11			/ADDR OF MESSAGE
	JMP	SYSON		/"N" ANSWER, ASK AGAIN
			//V3 TYPO: JMS SYSON. FOR V4 CORRECTED TO JMP SYSON.
/				/"Y" ANSWER, GO EXIT
GOEXIT,	JMS	SELECT		/FORCE BACK TO FIRST PAIR
	CDF CIF 0		/FIELDS FOR EXEC
	JMP I	(7605
/
/  ##  END OF MAIN LOOP  ##
/
OPTION,	0			/OPTION BITS TOGETHER IN ONE WORD
COUNT4,	0			/-1 IF ONE HEAD, -2 IF TWO
COUNT5,	0			/-2 IF TRACK MUST BE DONE IN TWO PASSES
/				/OTHERWISE -1
HFTRCK,	0			/CONTROLS LOOP PASSES PER TRACK,FILL FROM COUNT5
HEADER,	0			/FILL FROM COUNT4, CONTROLS HEAD
LOOPFN,	0			/EIGHT-BIT MODE + WHICH HEAD TO USE
/
/ SUBROUTINE QUEST -- PRINT MSG AND ASK QUESTION
/
/			JMS	QUEST
/			ADDR OF MESSAGE
/			"N" RETURN
/			"Y" RETURN
/
QUEST,	0
Q1,	TAD I	QUEST		/GET ADDR OF MESSAGE
	JMS	TYPE		/PRINT IT
	TAD	(BUFF		/SELECT INPUT BUFFER
	JMS	RDANS		/READ ANSWER
	TAD I	(BUFF		/WHAT WAS IT?
	AND	(177
	TAD	(-116		/WAS IT A "N"
	SNA
	JMP	Q3		/GO TO "N" EXIT
	TAD	(-131+116	/WAS IT A "Y"
	SZA!CLA
	JMP	Q1		/NO -- ASK AGAIN
Q2,	ISZ	QUEST		/"Y" RETURN AT JMS+3
Q3,	ISZ	QUEST		/"N" RETURN AT JMS+2
	JMP I	QUEST
/
/ SUBROUTINE CTRLC -- CHECK FOR CONTROL C
/
CTRLC,	0
	KSF		/SKIP IF A CHARACTER HAS BEEN TYPED
	JMP I	CTRLC	/NO
	KRB		//V4: KEEP KEYBOARD ENABLED;
	AND	(177
	TAD	(-3
	SZA CLA		//AND IF A ^C IS FOUND,
	JMP I	CTRLC
	TAD (MSG20
	JMS I (TYPE	//PRINT IT
	JMP GOEXIT	//BEFORE EXITING

/
/
	PAGE
/

/
/ SUBROUTINE RI -- READ FROM INPUT DEVICE
/
RI,	0			/READ FROM INPUT DEVICE
	TAD	RISEC		/SET UP OUR SECTOR
	DCA	SECTOR
	TAD	RIFN		/AND OUR FUNCTION (UNIT, READ, ETC.)
	TAD	LOOPFN		/AND LOOP CONTROLLER FUNCTION
/				/DENSITY, HEAD, AND 8BIT MODE
	DCA	FN
	TAD	RIFLD		/SET UP OUR FIELD
	JMS	BUMPER		/GO DO IT
	MSG8			/ERROR MESSAGE ADDRESS
	TAD	SECTOR		/GET OUR SECTOR BACK
	DCA	RISEC
	JMP I	RI		/BACK TO MAIN LOOP
/
RISEC,	-32			/START AT SECTOR 1 (OFFSET BY 33)
RIFLD,	CDF	0		/START AT FIELD 0
RIFN,	0			/4000 IF DOUBLE DENSITY DRIVE, 20 IF ODD # UNIT
/				/2 ALWAYS FOR READ, 1 IF SECOND PAIR ON VT78
/				/400 IF DOUBLE DENSITY TRANSFER
/
/ SUBROUTINE RO -- READ FROM OUTPUT DEVICE
/
RO,	0			/READ FROM OUTDEV
	TAD	ROSEC		/SET UP OUR SECTOR
	DCA	SECTOR
	TAD	ROFN		/SET UP OUR FUNCTION
	TAD	LOOPFN
	DCA	FN
	TAD 	ROFLD		/SET UP OUR FIELD
	JMS	BUMPER		/GO DO IT
	MSG9
	TAD	SECTOR		/GET BACK OUR SECTOR
	DCA	ROSEC
	JMP I	RO		/BACK TO MAIN
/
ROSEC,	-32			/START AT SECTOR 1
ROFLD,	CDF	0		/SET AT INIT TIME
ROFN,	0			/SET AT INIT TIME, SAME FORMAT AS RIFN

/
/ SUBROUTINE WO -- WRITE OUTPUT DEVICE
/
WO,	0			/WRITE TO OUTPUT DEVICE
	TAD	WOSEC		/SET UP OUR SECTOR
	DCA	SECTOR
	TAD	WOFN		/SET UP OUR FUNCTION
	TAD	LOOPFN
	DCA	FN
	TAD	WOFLD		/SET UP OUR FIELD
	JMS	BUMPER		/GO DO IT
	MSG10
	TAD	SECTOR		/GET BACK OUR SECTOR
	DCA	WOSEC
	JMP I	WO		/BACK TO MAIN LINE
/
WOFLD,	CDF	0		/FIELD TO START OUR WRITE
WOSEC,	-32			/OUR SECTOR, START AT 1
WOFN,	0			/SET FUNCTION AT INIT TIME
/				/SAME FORMAT AS ROFN, BUT NO READ BIT

/
/
/ SUBROUTINE COMP -- COMPARE BUFFERS
/
COMP,	0
	TAD	COMSEC		/OUR SECTOR
	DCA	SECTOR
	DCA	FN		/0 IS COMPARE FUNCTION
	TAD	COMFLD		/SET OUR FIELD
	JMS	BUMPER		/DO IT
	MSG7
	TAD	SECTOR		/SAVE OUR SECTOR
	DCA	COMSEC
	JMP I	COMP
/
COMSEC,	-32			/START AT 1
COMFLD,	CDF	0		/
/
/
/  BUMPER
/
/  ROUTINE TO HANDLER SECTORING, CORE POINTER, AND FIELDS
/
/  CALLED BY RI, RO, WO, COMP;
/  STARTING FIELD IN AC,  ERROR MSG ADDR IN CALL+1
/  BUMPER IN TURN CALLS ACTION
/
BUMPER,	0
	DCA	BUMFLD		/PLACE CDF SO SETS WHEN CALL ACTION
	JMS	CTRLC		/CHECK A CONTROL C
	TAD	FN		/NEED TO SELECT
	SZA			/NOT NECESSARY ON COMPARE TO SELECT
	JMS	SELECT		/DO IF NECESSARY, AC.AND.7776
	DCA	FN		/REPLACE FUNCTION, SELECT ONCE PER BUMPER CALL
	TAD	COUNT7		/HOW MANY FIELDS TO INCREMENT THRU
	DCA	BUMCNT
B0,	TAD	(BSTART-1	/SET AUTO INCREMENT REG'S
	DCA	X10
	TAD	X10
	DCA	X11
	TAD	BUMFLD		/SET FIELD INTO ACTION
	DCA	BFIELD
BUMFLD,	0			/CDF PLACED HERE BY CALLER
	JMS	ACTION		/CALL ACTION ROUTIN
	JMS	OOPS		/ERROR, PRINTOUT SOMTHING
	TAD	SECTOR		/MOVE TO NEXT SECTOR
	TAD	COUNT8		/ADD IN INTERLEAVE
	SPA			/SKIP IF SPECIAL COMPUTING NEEDED
	JMP	B2		/NO SPECIAL NEEDED, REPLACE SECTOR
COUNT9,	0			/IAC OR SKP PLACED HERE !!
	AND	(1		/FOR 2 INTERLEAVE, SWAP 0 AND 1
	TAD	(-32		/WRAP BACK TO MINUS
B2,	DCA	SECTOR
	TAD	X10		/CHECK IF DONE WITH BUFFER
	TAD	(-BSTART-BSIZE+1 /DONE IF POINTING TO LAST LOC
	SZA CLA			/SKIP IF DONE
	JMP	BUMFLD		/NO, DO NEXT SECTOR
	TAD	(10		/INCREMENT FIELD
	TAD	BUMFLD
	DCA	BUMFLD
	ISZ	BUMCNT		/DONE WITH ALL FIELDS
	JMP	B0		/NO, DO NEXT ONE
	ISZ	BUMPER		/SKIP OVER ERROR POINTER
	JMP I	BUMPER
/
COUNT7,	0			/MINUS NUMBER OF FIELDS PER PASS
COUNT8,	0			/INTERLEAVE 2 OR 3 SET AT INIT TIME
BUMCNT,	0			/LOOP CONTROL FOR FIELDS, FILL FROM COUNT7
/
/  CONSTRUCT ERROR MESSAGE
/
OOPS,	0
	TAD I	BUMPER		/GET ADDR OF MESSAGE
	JMS	TYPE		/PRINT TYPE OF FAILURE
	JMS	ADPRNT		/PRINT (HEAD), TRACK, SECTOR
	JMP I	OOPS
/
/ THE IOTS WHICH ARE DONE AS PART O THE ONCE ONLY CODE ARE PLACED HERE
/ OUT OF THE BUFFER AREA.      THIS IS HERE ONLY FOR FIT!
/
/***	OVERLAYED CODE STARTS HERE
ONCOVR,	0
SDN1,	SDN		/WAITING ON DONE
	JMP	.-1
LCD1,	LCD		
SDN2,	SDN		/WAIT AGAIN ON DONE
	JMP	.-1
XDR1,	XDR		/GET STATUS
	JMP I	ONCOVR

/***	OVERLAYED CODE ENDS HERE

	PAGE

/
/ SUBROUTINE TYPE -- PRINT MESSAGE
/			ON ENTRY AC HAS MESSAGE ADDRESS
/
TYPE,	0
	DCA	TYPAD		/SAVE ADDR
	CIF	0
	JMS I	TTYENT
	4100
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
/
/
/ SUBROUTINE APRNT -- PRINT TRACK AND SECTOR
/			ENTER WITH SECTOR IN AC
/
ADPRNT,	0
	TAD	LOOPFN		/WHICH HEAD
	CLL RTL
	RAL			/HEAD BIT TO AC11
	CLA RAL			/BUT CLEARING OUT OTHER BITS
	JMS	SETIN		/PUT TO MESSAGE
	MSG13A-1
	TAD	TRACK		/TRACK KEPT IN COMPLEMENT FORM
	CMA
	JMS	SETIN
	MSG13B-1
	TAD	SECTOR		/SECTOR KEPT AS SECTOR-33
	TAD	(33
	JMS	SETIN
	MSG13C-1
	TAD	COUNT4		/IS QUAD OPERATION
	IAC			/COUNT4 COMES -2 FOR QUAD, -1 NOT
	SNA CLA			/SKIP IF YES
	TAD	(10		/NO, DON'T TALK ABOUT HEADS
	TAD	(MSG13		/ADDR FOR PRINTOUT
	JMS	TYPE
	JMP I	ADPRNT

/
/ 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	X17		/ENTER INTO AUTOINC POINTER
	ISZ	SETIN		/BUMP RETURN ADDR
SETINB,	TAD	SETIN1		/GET NUMBER
	TAD	(-12		/SUBTRACT 10 DECIMAL
	SMA			/DONE DIVIDING?
	JMP	SETINA		/NO
	CLA			/YES
	TAD	SETCNT		/GET 10'S
	SNA			/SKIP IF A LEADING DIGIT
	TAD	(-20		/MAKE LEADING 0 A LEADING BLANK
	TAD	(260		/MAKE IT ASCII
	CDF	0		/ERROR MESSAGES IN FIELD 0!
	DCA I	X17		/STORE IN MESSAGE
	TAD	SETIN1		/GET REMAINDER
	TAD	(260		/MAKE IT ASCII
	DCA I	X17		/STORE IN MESSAGE
	CDF	10		/POINT CDF BACK HERE
	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
/
/  REFORMAT
/
/  BELONGING HERE ONLY FOR REASONS OF FIT
/
/
REFORM,	TAD	ROFN	/OK, WHAT OUTPUT DENSITY DO WE HAVE
	SMA CLA		/SKIP IF DRIVE IS CAPABLE OF A REFORMAT
	JMP	ERR15	/GO PRINT ILLEGAL TYPE
	TAD	ROFN	/GET FUNCTION BACK
	JMS	SELECT	/ALSO MUST CHECK WHICH PAIR; AC=AC.AND.7776
	TAD	(4006	/TURN OFF TOP BIT, MAKE 2 READ INTO 10 REFORMAT

/***	OVERLAYED CODE STARTS HERE

SDN3,	SDN		/CONTROLLER READY
	JMP	.-1
LCD3,	LCD
STR1,	STR		/WAIT FOR READY TO TAKE CODE
	JMP	.-1
	TAD	(111	/SAFETY CODE
XDR2,	XDR		/PLACE TO DRIVE
	CLA
SDN4,	SDN		/WAIT FOR OVERALL DONE
	JMP	.-1	/WIGGLE AC TO SHOW LIFE ??
	AC7776		/SET AC TO STRIP WHICH PAIR BIT
SER2,	SER		/SKIP IF AN ERROR DURING FORMAT
	CLL		/CLEAR LINK TO SHOW NO ERROR
	AND	ROFN	/SET DONE FLAG
	TAD	(4014	/BY A DUMMY READ ERROR STATUS, FLIPS LINK!
LCD4,	LCD

/***	OVERLAYED CODE ENDS HERE

	SNL		/SKIP IF REFORMAT HAD NO ERROR
	JMP	ERR19	/ERROR DURING REFORMAT, FATAL
	TAD	OPTION	/WAS IT A REFORMAT ONLY?
	AND	(SINGLE+DOUBLE
	SNA CLA		/SKIP IF YES
	JMP	DO00	/NO, GO DO OTHER STUFF
/	JMS	QUEST	/ASK IF ANOTHER FORMAT OPERATION WANTED
/	MSG16
	JMP	EXITOK	/"N" RETURN
/	JMP	REFORM	/"Y" RETURN
/
/ THE FOLLOWING IS PART OF THE IOT SEQUENC USED IN THE ONCE ONLY CODE
/ IT IS PLACED HERE ONLY FOR REASONS OF FIT.

/***	OVERLAYED CODE STARTS HERE

TWCOVR,	0
LCD2,	LCD
SER1,	SER		/CLEAR POOSSIBLE ERROR FLAG
	NOP		/MAY SKIP
	JMP I	TWCOVR

/***	OVERLAYED CODE ENDS HERE

	PAGE
/
/
/  ACTION ROUTINE ENTRY POINT
/
/  WATCH IT! WE CALLED WITH CDF POINTING TO BUFFER
/  ALSO CDF IS PLACED IN BFIELD,
/  SO WE CAN DO NO INDIRECTS EXCEPT THRU AUTO INCR TO BUFFER !!
/
/  RETURN WITH SKIP IF OK, DIRECT RETURN WITH ERROR
/
/  RESTORES DF TO 10 ON EITHER EXIT
/
/  DO A SECTOR AT A TIME FOR A SINGLE FUNCTION
/
ACTION,	0
	AC7775		/-3 ERROR RETRY COUNT
	DCA	RETRY
	TAD	FN	/SORT FUNCTIONS
	SNA
	JMP	COMPAR	/GO DO COMPAR
	RTR		/READ/WRITE BIT TO LINK
	SZL CLA		/SKIP IF WRITE
	JMP	READLP	/GO TO READ
/
/  WRITE LOOP
/
WRITLP,	TAD	FN	/SET UP SILO OPERATION
	JMS	LDCMD
	JMP	WRIT1	/OTHER PAGE TO MOVE DATA TO SILO
WRIT2,	JMS	DOIO	/RETURN FROM OTHER PAGE TO ACCESS I/O
	JMP	REFILL	/COMMON EXIT
/
/  READ LOOP
/
READLP,	JMS	DOIO	/COME HERE TO RETRY I/O
	TAD	FN
	JMS	LDCMD
	TAD	COUNT2	/RX01, 32 PASSES THRU 4 BYTES MOVED
	DCA	RDCNT	/RX02, 64 PASSES THRU

/***	START OF OVERLAYED AREA

ST5,	STR
	JMP	.-1
XDR3,	XDR
	DCA I	X10
STR2,	STR
	JMP	.-1
XDR4,	XDR
	DCA I	X10
STR3,	STR
	JMP	.-1
XDR5,	XDR
	DCA I	X10
STR4,	STR
	JMP	.-1
XDR6,	XDR

/***	END OF OVERLAYED CODE

	DCA I	X10
	ISZ	RDCNT
	JMP	ST5
REFILL,	ISZ	ACTION	/OK EXIT, ALSO A LITERAL
ACTEND,	CDF	10	/DATA FIELD NORMAL AGAIN
	JMP I	ACTION
/
/  COMPAR
/
/  COMPARE THE TWO BUFFERS
/
COMPAR,	TAD	REFILL	/RESTORE ERROR FLAG TO 'OK'
	DCA	ZOT
	TAD	BFIELD	/CREATE OTHER FIELD POINTER
	TAD	COUNT6
	DCA	CFIELD
	TAD	COUNT3	/SET UP LOOP CONTROL
	DCA	COMCNT
BFIELD,	0		/CDF PLACED HERE
	TAD I	X10	/COMPARE
	CIA
CFIELD,	0		/CDF PLACED HERE
	TAD I	X11
	SZA CLA		/SKIP IF OK
	DCA	ZOT	/NOT OK, MAKE NON-SKIP RETURN!!!!
	ISZ	COMCNT	/THRU?
	JMP	BFIELD	/NO
ZOT,	0		/ISZ ACTION PLACED HERE
	JMP	ACTEND	/RESTORE FIELD, GO BACK
/
/
/  DO I/O FUNCTION FOR READ OR WRITE
/
DOIO,	0
	TAD	FN	/SILO FUNCTION, CONVERTED TO READ-WRITE
	TAD	(4	/CONVERT SILO OPERATION TO I/O OPERATION
	JMS	LDCMD
	TAD	SECTOR	/REQUESTED SECTOR TO HARDWARE
	TAD	(33	/STORED AS -32 TO -1

/***	START OF OVERLAYED CODE

STR5,	STR
	JMP	.-1
XDR7,	XDR

/***	END OF OVERLAYED CODE

	CLA
	TAD	TRACK
	CMA		/COMPLEMENT TO PLUS NUMBER

/***	START OF OVERLAYED CODE

STR6,	STR
	JMP	.-1
XDR8,	XDR

/***	END OVERLAYED CODE

	CLL CLA CMA RTL	/AC=-3 TO KILL READ-WRITE BIT
	AND	FN	/I/O SKELETON WITHOUT READ-WRITE BIT
	TAD	(16	/LOAD ERROR STATUS IS GOOD NO-OP
	JMS	LDCMD
	JMP I	DOIO
/
/  LOAD COMMAND REGISTER
/
RDCNT=.
LDCMD,	0
	DCA	CMDTMP	/SAVE THE COMMAND
	TAD	CMDTMP
	AND	(376	/DOUBLE, KEEP ONLY 8 BITS, SINGLE NEVER HAD THEM

/***	OVERLAYED CODE STARTS HERE

SDN5,	SDN		/SKIP ON DONE
	JMP	.-1
LCD5,	LCD		/PUT THE COMMAND

/***	OVERLAYED CODE ENDS HERE

	TAD	CMDTMP	/CHECKING TOP BIT FOR DOUBLE DRIVE
	SMA
	JMP	CDCK	/SINGLE, JUST GO CHECK ERROR
	RTL
	RTL
	RAL
	AND	(7	/TOP FOUR BITS NOW SENT

/***	OVERLAYED CODE STARTS HERE

STR7,	STR
	JMP	.-1
XDR9,	XDR
CDCK,	CLA
SER3,	SER		/SKIP ON ERROR

/***	OVERLAYED CODE ENDS HERE

	JMP I	LDCMD
	ISZ	RETRY	/TRIED THREE TIMES YET
	JMP	KEEPON	/NO, KEEP ON TRYING
	TAD	FN	/DID WE ERROR OUT OF READ OR WRITE
	RTR		/READ-WRITE BIT TO LINK
	SNL CLA		/SKIP IF READ
	JMP	ACTEND	/WRITE IS ALL SET, GO TO ERROR RETURN
	TAD	COUNT3	/READ MUST ADD APPROPRIATE AMOUNT TO X10
	CIA		/SO LOOP CONTROL IN BUMPER WORKS RIGHT!
	TAD	X10	/
	DCA	X10
	JMP	ACTEND	/SET CDF BACK, AND ERROR EXIT
/
/  ENTRY TO CONTINUE AFTER ERROR
/
/
KEEPON,	TAD	FN	/RETRYING READ OR WRITE
	RTR		/R/W BIT TO LINK
	SZL CLA		/SKIP ON WRITE
	JMP	READLP	/RETRY A READ
	JMP	WRIT2	/SO GO RETRY WRITE
/
COUNT2,	0		/MINUS NUMBER OF READ PASSES PER SECTOR
COUNT3,	0		/MINUS NUMBER OF BYTES (WORDS AS WELL) PER SECTOR
COUNT6,	0		/DELTA FIELDS FOR COMPARE
TRACK,	0		/TRACK NUMBER IN COMPLEMENT FORM FOR ISZ
SECTOR,	0		/SECTOR TO DO, SET BY INTERLEAVE ROUTINE
FN,	0		/FUNCTION BITS: ALWAYS 100 FOR 8BIT MODE
/			/+4000 FOR DOUBLE DRIVE, +1 FOR SECOND PAIR
/			/NOTE, THE 1 IS STRIPPED PRIOR TO CALL TO ACTION
RETRY,	0		/RETRY COUNTER -3 TO 0
CMDTMP,
COMCNT,	0		/TEMPORARY FOR COMPARE OR I/O
/
	PAGE
/
/  PART OF ACTION ROUTINE
/
/  FILL SILO FOR WRITE
/
/  SPREAD OUT TO SPEED UP
/
/
/
WRIT1,	TAD	COUNT1	/FOR RX01, 8 TIMES THRU 16 BYTE GIVES 128
	DCA	WRTCNT	/FOR RX02, 16 TIMES THRU FOR 256

/***	START OF OVERLAYED CODE

ST4,	TAD I	X10	/FETCH A BYTE
STR8,	STR		/SKIP IF READY TO TRANSFER
	JMP	.-1	/NO (SHOULDN'T HIT THIS ON VT78)
XDR10,	XDR		/MOVE BYTE TO SILO
	CLA		/CLEAR THE MUMBLE AC
	TAD I	X10
STR9,	STR
	JMP	.-1
XDR11,	XDR
	CLA
	TAD I	X10
STR10,	STR
	JMP	.-1
XDR12,	XDR
	CLA
	TAD I	X10
STR11,	STR
	JMP	.-1
XDR13,	XDR
	CLA
	TAD I	X10
STR12,	STR
	JMP	.-1
XDR14,	XDR
	CLA
	TAD I	X10
STR13,	STR
	JMP	.-1
XDR15,	XDR
	CLA
	TAD I	X10
STR14,	STR
	JMP	.-1
XDR16,	XDR
	CLA
	TAD I	X10
STR15,	STR
	JMP	.-1
XDR17,	XDR
	CLA
	TAD I	X10
STR16,	STR
	JMP	.-1
XDR18,	XDR
	CLA
	TAD I	X10
STR17,	STR
	JMP	.-1
XDR19,	XDR
	CLA
	TAD I	X10
STR18,	STR
	JMP	.-1
XDR20,	XDR
	CLA
	TAD I	X10
STR19,	STR
	JMP	.-1
XDR21,	XDR
	CLA
	TAD I	X10
STR20,	STR
	JMP	.-1
XDR22,	XDR
	CLA
	TAD I	X10
STR21,	STR
	JMP	.-1
XDR23,	XDR
	CLA
	TAD I	X10
STR22,	STR
	JMP	.-1
XDR24,	XDR
	CLA
	TAD I	X10
STR23,	STR
	JMP	.-1
XDR25,	XDR

/***	END OVERLAYED CODE

	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
COUNT1,	0		/FILLED AT INIT TIME, WRITE PASSES PER SECTOR!
/
/
/
/  SELECT SUBROUTINE
/
/  CALL WITH AC11=0 TO SELECT FIRST PAIR, AC11=1 TO SELECT SECOND
/
/  RETURN AC.AND.7776
/
/  IF SELECT REQUESTED IS SAME AS LAST SELECT, NO ACTION TAKEN
/
SELECT,	0
	DCA	WRTCNT	/TEMPORARY TO SAVE ARGUMENT
	TAD	WRTCNT
	TAD	LSTSEL	/IS IT SAME AS LAST TIME
	RAR		/TEST BIT TO LINK
	SNL CLA		/SKIP IF DIFFERENT
	JMP	NOSEL	/NO SELECT NEEDED
	ISZ	LSTSEL	/CHANGE TO OTHER TYPE
	NOP		/MAY INDEED SKIP
	TAD ISVT78	/NOW SEE IF A VT78
	SNA CLA		/IF NON-ZER0 YES
	JMP IOSUB	/NO SET IOT'S FOR SECOND SET OF DRIVES

NEWSEL,	CLA IAC
	AND	LSTSEL	/SELECT NEW TYPE

/***	OVERLAYED CODE STARTS HERE

OVER6,	6750		/SELECT IOT
SER4,	SER		/MUST CLEAR ERROR FLAG, MAY RANDOMLY SET
	NOP
SDN6,	SDN		/SAME FOR DONE
	NOP
STR24,	STR		/AND TRANSFER
	NOP
	CLA
	TAD	(16	/DUMMY READ ERROR STATUS TO SET DONE FLAG!!
LCD6,	LCD

/***	OVERLAYED CODE ENDS HERE

NOSEL,	AC7776		/RETURN ARGUMENT WITH LOW BIT CLEARED
	AND	WRTCNT
	JMP I	SELECT

IOSUB,	CDF CIF 20	/OFF IN FIELD 2
	JMS I (IOSET	/GO FLIP ALL THE IOT'S
	JMP NOSEL	/NOW BACK TO ORIGINAL CODE
			/##1

LSTSEL,	0		/START OFF ON FIRST PAIR
ISVT78,	0		/1 IF A VT78, OTHERWISE 0
NEWTMP,	0		/TEMP STORAGE FOR CALLING ARGUMENT
/
	PAGE

        FIELD   0
        *6420
/
/  PUT ERROR MESSAGES IN FIELD 0 RIGHT AFTER BUFFER
/
/ 
/ ERROR MESSAGES
/
				//V4:
VERBUF, "R; "X; "C; "O; "P; "Y; 240; "V; "A; "0; 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; "H; "E; "A; "D; 
MSG13A, 0
        0
        ",
        240; "T; "R; "A; "C; "K; 240
MSG13B, 0
        0
        ",
        240; "S; "E; "C; "T; "O; "R; 240
MSG13C, 0
        0
        215; 212; 232
MSG15,  "I; "L; "L; "E; "G; "A; "L; 240; "F; "L; "O; "P; "P; "Y; 
        240; "T; "Y; "P; "E;
        215; 212; 232
MSG16,  "F; "O; "R; "M; "A; "T; 240; "A; "N; "O; "T; "H; "E; "R;
        240; "F; "L; "O; "P; "P; "Y; "?; 232
MSG17,  "I; "L; "L; "E; "G; "A; "L; 240; "S; "W; "I; "T; "C; "H;
        "(; "E; "S; "); 215; 212; 232
MSG18,  "F; "L; "O; "P; "P; "Y; 240; "N; "O; "T; 240; "R; "E; "A; "D; "Y;
        215; 212; 232
MSG19,  "E; "R; "R; "O; "R; 240; "D; "U; "R; "I; "N; "G; 240;
        "F; "O; "R; "M; "A; "T; 215; 212; 232
MSG20,	"^; "C; 232

/	RXCOPY EXPANDED TO 12K FOR TESTS OF SECOND SET OF FLOPPYS
/

	FIELD 2
	X12=12		/AUTO INDEX FOR IOSET
	*6420

IOSET,	0		/SUBROUTINE TO MODIFY ALL IOT'S IN CODE
	TAD (IOTTAB-1	/GET ADDR. OF IOT TABLE
	DCA X12		/SAVE IN AUTO INDEX
	CDF 10		/FIELD ONE LOCATION
	TAD I (LSTSEL	/NOW SEE IF FIRST OR SECOND SET OF DRIVES
	CDF 20		/BACK TO OUR FIELD
	RAR		/LOW BIT SET FOR SECOND SET
	SNL CLA		/CLEAR ALL
	JMP MOVLOP-2	/FIRST SET OF DRIVES SET TO ORIGINAL STATE
	TAD (NEWCDE	/GET THE NEW DEVICE CODE FOR SECOND SET
	SKP		/SKIP THE OLD CODE
	TAD (750	/ORIGINAL CODE DRIVES 0 & 1
	DCA DEVCDE	/SAVE FOR MODIFICATION
MOVLOP,	TAD I X12	/GET A POINTER FROM IOT POINTER LIST
	SNA		/A ZERO MEANS END OF TABLE
	JMP IODONE	/RETURN WHEN DONE
	DCA DPNT	/SAVE THE POINTER
	CDF 10		/IOT'S MUST RESIDE IN FIELD 1
	TAD I DPNT	/NOW GET THE PREVIOUS IOT
	AND (7007	/WIPE OUT OLD DEVICE CODE
	TAD DEVCDE	/NOW GET THE NEW DEVICE CODE
	DCA I DPNT	/AND PUT BACK
	CDF 20		/NOW BACK TO OUR FIELD
	JMP MOVLOP	/NOW GO DO IT ALL AGAIN

IODONE,	CDF CIF 10	/RETURN TO FIELD 1
	JMP I IOSET	/RETURN TO CALLER

DPNT,	0		/POINT TO OVERLAYED AREA
DEVCDE,	0		/GETS THE DEVICE CODE FOR MOD.

/	THIS IS THE TABLE OF POINTERS OF ALL IOT'S
/	IN RXCOPY.  BELIEVE IT OR NOT!
/	NEEDED FOR A SECOND SET OF DRIVES ON A NON-VT78 SYSTEM.
/	USED TO CHANGE THE I/O DEVICE CODES DYNAMICALLY.
/	***** NOTE: IF YOU ADD ANY IOT'S PLEASE UPDATE THE TABLE. *****

/	THE TABLE IS TERMINATED BY A ZERO WORD AND DOES NOT CROSS FIELD
/	BOUNDARIES.

IOTTAB,	SDN1;SDN2;LCD1;LCD2;XDR1;SER1	/THESE IOTS ARE DONE IN ONCE ONLY CODE
	SDN3;SDN4;SDN5;SDN6		/THE REST OF THEM ARE IN MAIN CODE
	LCD3;LCD4;LCD5;LCD6
	STR1;ST5;STR2;STR3;STR4;STR5
	STR6;STR7;STR8;STR9;STR10;STR11
	STR12;STR13;STR14;STR15;STR16;STR17
	STR18;STR19;STR20;STR21;STR22;STR23
	STR24
	XDR2;XDR3;XDR4;XDR5;XDR6
	XDR7;XDR8;XDR9;XDR10;XDR11;XDR12
	XDR13;XDR14;XDR15;XDR16;XDR17;XDR18
	XDR19;XDR20;XDR21;XDR22;XDR23;XDR24
	XDR25
	SER2;SER3;SER4
	0000			/TERMINATION WORD
	PAGE
$

