/DSKHND     DATE = 03/23/84 CURRENT EDIT
/
/

/ 052   KMD	26-Sep-85	Add Dutch & Spanish Xlations
/ 051	Mart	20-aug-85	fix ITALIAN edit bugs
/ 050	MART	24-APR-85	change dskhnd to call v25st on warm boot
/ 049	EMcD	04-Mar-85	Add read in/kick start V2.5 into life
/ 048	EMcD	27-Feb-85	Add DECDEV switch
/ 047	DFB	20-DEC-84	Fix to display date/time after error(dev 0=HD)
/ 046	DFB	31-AUG-84	Fix to pass unit number to verify on restart
/ 045	DFB	18-AUG-84	Fix to error retry for multiblock load
/ 044	DFB	08-AUG-84	Fix to read verify 12 bit logical
/ 043	HLP	23-MAR-84	Change load table for new system init
/ 042	DFB	21-FEB-84	Add get status code
/ 041	WJY	06-FEB-84	Addl. fix for DEC I compatability
/ 040	DFB	17-JAN-84	DEF fix for DEC I compatability
/ 039	DFB	12-JAN-84	Fix for load4
/ 038	HLP	20-DEC-83	Change read-in address for printer
/ 037	DFB	02-DEC-83	Add update to winnie function
/ 036	DFB	29-NOV-83	Fix to read multiple blks on winnie
/ 035	DFB	01-NOV-83	Set to handle mount system vol
/ 034	DFB	16-SEPT-83	Set to return error if winnie not mounted

/VERSION 033  ********************
/
/ 033	WCE	3-SEP-83	Changed RZ IOT's to RX IOT's and changed
/				FIELD instructions to standard instructions
/ 032	DFB	07-19-83	/WINNIE ADDITIONS
/				Jswap for winnie defined as RDOSWQ in WPF1
/				FROM DSKHND VER31
/ 031	DFB	04-08-83	/Update defs for DI,DII functionality
/ 030	DFB	12-DEC-82	/Update condor defs for DI,DII assy
/ 029	DFB	02-DEC-82	Stop Gold Halt exit during getdns
/ 028	DFB	16-NOV-82	Fix to allow JSWAP chnge externally
/				RDOSWP defined in WPF1.. overlayed by jswap in
/				WPCU2.after proper initialization of system
/				Jswap must overlay RDOSWP
/
/ 027	DFB	10-NOV-82	Set drive 0 to 4 for load
/				conditional load4=1
/ 026	DFB	22-OCT-82	Return after 1st write if RX50 write protect.
/				And do JSWAP if done not set on read/write
/				AND error return if Gold halt pressed during
/				error process
/ 025	DFB	15-AUG-82	Fix bug in physio 12 bit verify
/ 024	DFB	23-AUG-82	Set up to handle RX01 and RX02
/ 023	DFB	03-AUG-82	Seek trk 0 instead of init(err. retry)
/ 				Delete skew code (determined not necessary)
/ 022	DFB	19-JUL-82	Set GET DEN to time out(ret err5)
/				Add seek tr 79 rx50 error logic
/				Add offset 2 code (skew=1 to install)
/ 021	DFB	15-JUL-82	Delete sel error return
/ 020	DFB	12-JUL-82	FIX TO SEL DEVICE ON ERR RETRY
/ 019	DFB	10-MAY-82	Verify Rx50  and rx50 startup fixes
/ 018	DFB	16-APR-82	Verify Rx50  and rx50 startup fixes
/
/*****COPIED FROM DSKHND.PA VERSION 17  28-FEB-82***************
/ 017	GDH	28-FEB-82	Modified startup "read in" code.
/ 016	DFB	23-FEB-82	Set hndlr to rewrite then read when error
/				is detected during verify
/ 015	DFB	16-FEB-82	Add verify read after write
/ 014	DFB	04-FEB-82	Set error retry to init heads
/ 013	DFB	01-FEB-82	Double density interleave of 3
/ 012	DFB	27-JAN-82	Double density interleave of 2
/ 011	DFB	13-JAN-82	Allow 8bit phys i/o for dd
/ 010	DFB	06-JAN-82	Fix to return status in ret code
/ 009	DFB	28-DEC-81	Fix blk 6 1st loc=7401 for DOC diskette
/ 008	DFB	14-DEC-81	Add doc disk message
/
/	*******if DMESS changes location other than 6400
/	*******DCSTRT in RXPRDF MUST CHANGE ACCORDINGLY
/ 007	DFB	02-DEC-81	Fix to error hndler
/ 006	DFB	25-NOV-81	Fix to handle 2 RX02's
/ 005	DFB	18-NOV-81	Fix error hndler init on retry
/ 004	DFB	17-NOV-81	Fix to handle errs during boot
/ 003	GDH	13-NOV-81	Bug fix for Get Density on
/ 002	GDH	11-09-81	FIXED FOR RX01.
/ 001	DFB	10-29-81

/*****************************************************************
/		 COPYRIGHT (C) 1977 BY
/	 DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/ THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
/ ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE AND WITH THE
/ INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR ANY  OTHER
/ COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
/ OTHER PERSON.  NO TITLE TO AND OWNERSHIP TO  THE  SOFTWARE  IS HEREBY
/ TRANSFERRED.
/
/ THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
/ NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
/ EQUIPMENT CORPORATION.
/
/ DIGITAL ASSUMES NO  RESPONSIBILITY FOR THE USE OR  RELIABILITY
/ OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
/
/
/*******************************************************************
/
/
/ THE FOLLOWING CODE IS USED TO WRITE THE RX02 HANDLER TO
/  DISC.  IT IS REPEATED IN BOTH MODULES TO ALLOW FOR A SEPARATION
/  OF THESE MODULES AT A LATER DATE.  OBVIOUSLY WHEN DOING SO
/  THE PARAMETERS (DLRXLD, LFRXLD AND STRT ADDR.) WOULD HAVE TO BE REPLACED
/  WITH THE CORRECT BLOCK NUMBERS,LENGTH AND STARTING ADDRESS.
/
/
/*********************************************************************

				EJECT
			FIELD 0
			*200
	JMP I	.+3		/WRITE BLOCK
	JMP I	.+1
	7600
	RXLOAD

			*RXLDLS
	RXEWT				/WRITE CODE
	0				/DEVICE NUM
	RXQBLK				/#BLOCKS
	.				/LIST PNTR-1
	DLRXLD				/BLOCK NUM
	RXDLDP-200			/START ADDRESS(COMP FOR 1/2 BLK)/XXXDFB
	IFNDEF DECDEV <
	CDFMNU				/FIELD NO		/M048	/M033
	>
	IFDEF DECDEV <
	CDF 50							/A048
	>
	-DSRXLD				/BLOCK COUNT
	0				/END BLOCK
/*********************************************************************
/*******************************************************************
/*******************************************************************
/*******************************************************************
/
/
/----------------    THE COMMENTS IN THIS PROGRAM ARE NOT-------------
/-----------------                AS ACCURATE AS ONE WOULD------------
/-----------------    LIKE.  WHEN THE COMMENTS ARE UPDATED------------
/------------------- THIS PARAGRAPH WILL BE DELETED      -------------
/
/*********************************************************************
/*********************************************************************
/*********************************************************************
/*********************************************************************
/
/		THE DIVISOR FOR THE INTERLEAVE ALGORITHM MUST BE
/	MODIFIED TO "25" FOR A DOUBLE DENSITY INTERLEAVE OPERATION,
/	BUT MUST REMAIN "26" FOR A SINGLE DENSITY OPERATION. THE
/	REASON BEHIND THIS LIES IN THE THEORY OF NUMBERS.
/		THE INTERLEAVE FACTOR AND THE NUMBER OF TRACKS PER
/	SECTOR MUST BE RELATIVELY PRIME, WHICH "2" AND "26" ARE NOT.
/	HOWEVER, FOR FOR A SINGLE DENSITY OPERATION THEY ARE RELATIVELY
/	PRIME, AS "3" AND "26" ALWAYS ARE.
/		HENCE, THE "DIVISOR" FOR THE INTERLEAVE OPERATION, AND
/	ONLY FOR THAT PARTICULAR OPERATION MUST BE MODIFIED TO "25"
/	DOUBLE DENSITY OPERATIONS, AND MUST REMAIN "26" FOR ALL SINGLE
/	DENSITY OPERATIONS. THIS IS ACCOMPLISHED, BY THE FOLLOWING
/	MECHANISM.
/
/		-26 + ( +1 ) = -25, FOR DOUBLE DENSITY OPERATIONS.
/		-26 + ( 0  ) = -26, FOR SINGLE DENSITY OPERATIONS.
/
/	THE FACTOR OF "0" OR "1" IS THE DISKETTE DENSITY PARAMETER
/	"RZDENS", OR "BTRXID" IN THE BOOTSTRAPS, WHICH IS RETURNED
/	AS A "0" FOR A SINGLE DENSITY DISKETTE, AND AS A "1" FOR A
/	DOUBLE DENSITY DISKETTE.
/		SCHEMATICALLY, THE ALGORITHM PROCEEDS AS FOLLOWS.
/
/	SINGLE DENSITY			DOUBLE DENSITY
/			0>=N>=25
/
/	3N		   (A.)		2N
/	Q(1)=3N(MOD 26.)   (B.)		Q(2)=2N(MOD 25.)
/	S(1)=Q(1) + 1	   (C.)		S(2)=Q(2) + 1
/
/	(A.) CALCULATE 2*SECTOR NUMBER WITHIN THE TRACK
/		I.E. THE RESIDUE FROM THE DIVIDE.
/
/		USING THE DENSITY PARAMETER, SD=0/DD=1,
/		BUILD 2*SECTOR NUMBER + SECTOR NUMBER
/		FOR A SINGLE DENSITY DISKETTE, OR
/		SIMPLY 2*SECTOR NUMBER + 0 FOR A DOUBLE
/		DENSITY DISKETTE.
/
/	(B.) CALCULATE THE PHYSICAL SECTOR NUMBER MINUS ONE BASED
/		ON THE CORRECT MODULUS.
/
/		I.E. K*SECTOR NUMBER - 26 + DENSITY PARAMETER (SD=0/DD=1)
/		AND CONTINUE ADDING " - 26 + DENSITY PARAMETER"
/		TO THE RESULT WHILE IT REAMAINS POSITIVE.
/
/	(C.) FOR EITHER DENSITY ADD "1" TO THE FINAL RESULT TO
/		OBTAIN THE CORRECT PHYSICAL SECTOR NUMBER.
/
/
/*********************************************************************
				EJECT
/	** -1- ** PAGE 1 DOCUMENTATION ****
/*********************************************************************
/
/				PAGE 1
/
/*********************************************************************
/
/	PAGE 1 OF THE DRIVER CONTAINS, AND IN THE PROPER ORDER,
/		THE FOLLOWING ROUTINES, AND DATA AREAS.
/
/	A.	THE ENTRY POINT TO THE DRIVER.
/
/	B.	THE "DPB" ( I.E. DEVICE PARAMETER BLOCK ) TRANSFER
/			ROUTINE.
/
/	C.	THE CONTROLLER SELECT CODE.
/
/	D.	THE IOT MODIFICATION PROCESSOR.
/
/	E.	THE DISKETTE DENSITY DETERMINATION.
/
/	F.	THE BUILD OF THE CONTROLLER COMMAND.
/
/	G.	THE INITIALISATION/RE-TRY PROCESSOR.
/
/	H.	THE READ/WRITE PROCESSOR/DISPATCHER.
/
/	I.	THE PAGE 1 DATA AREAS.
/
/*********************************************************************
/
		IFNDEF DECDEV <
			FIELD 2		/FOR WRITE DISK ONLY
		>
		IFDEF DECDEV <
			FIELD 5
		>
/			FIELD 00	/ACTUAL LOAD FIELD
			*RXDLDP		/LOAD ADDRESS FOR DRIVER.
/
/

/---------------------------------------------------------------------
/
/************************ ENTRY POINT TO RX01/RX02 DEVICE DRIVER *****
/
/	ARGUMENTS ARE ACCESSED BY A "PASCAL-LIKE" CASE STATEMENT,
/	AS IMPLEMENTED IN PDP-8 ASSEMBLY LANGUAGE, AS INDICATED
/		IN THE PREAMBLE TO THIS DRIVER.
/
/---------------------------------------------------------------------
/								/A015
/		VERIFY BIT = BIT 1				/A015
/								/A015
/		WHEN SET IN RZXDIR ON INPUT			/A015
/		LOGICAL WRITE=READ AFTER WRITE (DONT EMPTY SILO)/A015
/		LOGICAL READ(12BIT) =READ AND COMPARE SILO TO BUFFER	/A015
/		PHYSICAL READ=READ AND COMPARE SILO TO BUFFER	/A015
/
/---------------------------------------------------------------/A015
RX2SYS,	0			/ ENTRY POINT TO "RX2SYS".
	DCA	RZEXIT		/SET RETURN FIELD(IN ACC UPON ENTRY)
	TAD	RZCDF0		/ BUILD PROPER "CDF",...
	RDF			/ ...TO KNOW WHICH DATA FIELD,...
	DCA	RZCCDF		/ ......DRIVER WAS CALLED FROM.
	JMS	RZARGS		/ LOAD TABLE HEAD.
RZACNT,	RZDRIV-RZARGS		/ COUNT OF # OF ARGUMENTS PASSED.
RZCTLR,				/ * LOCAL STORAGE FOR THE CONTROLLER #.
RZDRIV,	0			/ LOCAL STORAGE FOR DRIVE # ( 0-3 ).
PYSECT,				/ SECTOR NO FOR PHYSICAL I/O
RZBLKN,	0			/ LOCAL STORAGE FOR START BLOCK # ON DISKETTE.
RZBCDF,	0			/ LOCAL STORAGE FOR "CDF" OF BUFFER FIELD.
RZBPTR,	0			/ LOCAL STORAGE FOR BUFFER ADDRESS WITHIN FIELD.
RZBCTR,	0			/ LOCAL STORAGE FOR # OF BLOCKS TO TRANSFER.
PYTRAK,	0		/TRACK NO FOR PHYSICAL IO
RZXDIR,	0			/ LOCAL STORAGE FOR TRANSFER DIRECTION.
RZUNIT,				/ * LOCAL STORAGE FOR UNIT #.
RZARGS,	0			/ ENTRY POINT TO "RXARGS".
	TAD	RZACNT		/ LOAD COUNT OF ,...
	DCA	RZACTR		/ ...NUMBER OF ARGUMENTS PASSED.
RZARG1,	ISZ	RZARGS		/ UPDATE POINTER TO ADDR. OF NEXT LOCAL ARG.
RZCCDF,	CDFSYS			/ * "CDF" TO CALLER FIELD.		/M033
	TAD I	RX2SYS		/ LOAD ARGUMENT,...
	CDFSYS			/ ENSURE LOCAL DATA FIELD.		/M033
	ISZ	RX2SYS		/ ...UPDATE TO ADDRESS OF NEXT ARGUMENT,...
	DCA I	RZARGS		/ ......STORE ARGUMENT LOCALLY,...
	ISZ	RZACTR		/ ALL ARGUMENTS PASSED ?
	JMP	RZARG1		/ NO - RETREIVE NEXT.
/---------------------------------------------------------------------
/
/************************ INITIALISE/SET RETRY PARAMETERS ************
/
/---------------------------------------------------------------------
	TAD  	RZRTCT		/ LOAD THE RE-TRY COUNT,...
	DCA 	RZECTR		/ ...AND SAVE IT.
/---------------------------------------------------------------------
/
/************************ SELECT SPECIFIED CONTROLLER ****************
/
/---------------------------------------------------------------------
/---------------------------------------------------------------------
/		FOR DECMATE I
/
/	 RZDRIV = 0,1     SEL DRIVE 0   UNIT 0,1
/	 RZDRIV = 2,3	  SEL DRIVE 1   UNIT 0,1
/
/
/		FOR DECMATE II
/
/
/	 RZDRIV = 0,1     SEL DRIVE 0   UNIT 0,1 HEAD 0
/	RZDRIV = 4,5	SEL DRIVE 0	UNIT 0,1 HEAD 1
/	 RZDRIV = 2,3	  SEL DRIVE 1   UNIT 0,1 HEAD 0
/	RZDRIV = 6,7	SEL DRIVE 1	UNIT 0,1 HEAD 1
/
/--------------------------------------------------------------------
  IFDEF	WINNIE	<
	TAD	RZXDIR		/FUNCTION CODE			/A032
	SPA			/=PHYIO?		/A032	/M036
	CMA			/YES 			/A032	/M036
	RAR			/WINNIE BIT IN LINK	/A032	/M036
	SZL			/=WINNIE?		/A032	/M036
	JMP	ISAWIN		/TAG SPEAKS FOR ITSELF		/A036
/D036	JMS	WINCHK		/CHECKS FOR WINNIE RETRNS IF NOT/A032
	CLA			/NOT CLEAR ON RETURN		/A032
			>	/END IFDEF WINNIE		/A032
  IFDEF	CONDOR		<
	IFNDEF LOAD4	<
	CLA CLL IAC RTL		/=4		DEVICE PAIR BIT	/A019
	AND	RZDRIV		/GET DRIVE
			>	/END IFNDEF LOAD4		/A027
	IFDEF LOAD4	<
	JMS	SET4	/SET UP DRIVE 4				/A027
			>	/END IFDEF LOAD4		/A027
	CLL RTR			/SET PAIR BIT(11)		/A019
	RTR							/A019
	DCA	RZPAIR		/SAVE
			>					/A018
	CLA CLL CML IAC RAL	/ YES - 0003 = MASK FOR DRIVE NUMBER.
	AND	RZDRIV		/ MASK OFF DRIVE NUMBER.
	RAR			/
	MQL			/SAVE UNIT
	RTR;BSW			/SHIFT INTO POS
	DCA	RZUNIT
	CLA SWP			/GET CTRLR
	IFDEF	CONDOR	<
	TAD	RZPAIR		/ADD PAIR BIT(11)		/A019
			>	/END IFDEF CONDOR		/A030
	DCA	RZSLDV		/SAVE PAIR TO BE SELECTED	/A020
	JMS	SELCMD		/SET SELECT			/A018
/D036	CLA							/A006
	JMS	RZSETB		/RESET CDF'S
			SIZE=	.-RX2SYS

/
/************************ PHYSICAL I/O SET UP AND CALL*****************
/
/****************      PHYSICAL I/O READS/WRITES ONLY ONE  ************
/*************   CALL IN RZXDIR IS COMPLEMENT OF READ/WRITE *********
/****************          FOR PHYSICAL I/O        ********************
/*******************          SECTOR FOR EACH CALL      ***************
/
/-----------------------------------------------------------------------
RZBYPS,	TAD	RZXDIR
  IFDEF	CONDOR		<
	SPA		/IS LOGIO?				/A025
	CMA		/NO=PHYSIO COMPL.			/A025
	AND	(1000						/M025	
	DCA	RZ50SW		/SET RZ50X SWITCH. 0=NO 1=YES	/M025
	TAD	RZXDIR						/C025
			>				/A018	/M025
	SPA			/IS PHYSICAL I/O?
	JMP	PHYSIO		/YES
				EJECT
/	** -1- ** MORE INITIALIZATION ****
/---------------------------------------------------------------------
/
/************************ BUILD CONTROLLER COMMAND *******************
/
/---------------------------------------------------------------------
LOGIO,	DCA	RZPAT1		/SAVE FULL COMMAND
	JMS	DVSET		/SET DISK VERIFY SW		/A015
	TAD	RZPAT1
	AND	MSK37		/CLEAR ALL BUT FUNCTION BITS
	DCA	RZXDIR		/RESET
	TAD	RZPAT1
	AND	MSK400		/GET DENSITY BIT
	SZA CLA			/IS SD?
	IAC			/NO. IT IS DD
	DCA 	RZDENS		/SET DENSITY FLAG 0=SD 1=DD
	TAD	RZ50SW		/IS IT RX50
	SZA CLA
	JMP	LOGIOA		/YES CLEAR MODE SW
	TAD 	RZDENS
	SNA CLA 		/IF SD SET MODE BIT = 100
	CLA IAC BSW			/....ELSE IS DD MODE BIT = 000
LOGIOA,	DCA 	RZMODE
	TAD	RZPAT1		/GET FULL CMND
	AND	MSK400		/GET DENSITY BIT
	TAD	RZXDIR		/GET CMND AND CONTINUE
	TAD  	RZMODE		/MODE BIT 5=0 12BIT MODE  =1 8BIT MODE
	TAD	RZUNIT		/ YES - LOAD IN UNIT CODE,...
	TAD	RZHEAD		/ADD HEAD BIT FOR X50
	DCA  	RZCMND		/ ......AND SAVE IT.
	DCA  	RZPHSW		/CLR PHYS/LOG IO SW 0=LOGIO
/---------------------------------------------------------------------
/
/************************ CALCULATE LOGICAL SECTOR NUMBER ************
/
/---------------------------------------------------------------------
	TAD  	RZ50SW
	SZA CLA			/IS IT RX50?
	JMP	RZINT3		/INTERLEAVE BY 2 IF 50
	TAD  	RZDENS		/ LOAD THE DENSITY SPECIFIER.
	SNA CLA			/ DOUBLE DENSITY ?
	TAD	RZBLKN		/ NO - MAKE IT  *3.
RZINT2,	TAD	RZBLKN		/ YES - MAKE IT,...
RZINT3,	TAD	RZBLKN		/ ...ONLY *2.
	DCA 	RZLSEC		/ ......AND SAVE IT.
/
/
RZRTRY,
	JMS	BLKSET			/SET BLOCK CNT			/c045
	TAD  	RZLSEC		/ BACK UP THE "LOGICAL" SECTOR #,...
	DCA	RZCSEC		/ ...AND [RE-]SET THE CURRENT SECT. #.
	TAD	RZBPTR		/ GET THE CURRENT BUFFER POINTER,...
	DCA  	RZBFFR		/ ...AND SAVE IT FOR A RETRY.
	JMS	RZDIVD		/ CALCULATE FIRST TRACK/SECTOR VALUES.
	JMS	RZNEXT
RZEXIT,	CIFSYS			/RETURN TOO CALLER			/M033
RZ2RET,	JMP I	RX2SYS			/RETURN TO CALLER
/D032RZCDIF,	CIFSYS			/USED TO SET RETURN		/M033
MSK37,	37			/MASK
MSK400,	400			/DENSITY BIT MASK
RZACTR,						/A015
RZPAT1,	0		/TEMP STORE			/A015
RZ50SW,	0			/0=RX01 OR RX02-- NOT 0=RX50
RZHEAD,	0	/HEAD SIDE
  IFDEF	CONDOR		<
RZPAIR,	0	/PAIR BIT(11)  1 = 2 RX50 OR RX50 +RX02	/A019
			>
			SIZE=	.-LOGIO
/
/	** -1- ** PAGE 1 DATA AREA ****
/---------------------------------------------------------------------
/
/************************ OFF-PAGE POINTERS, DATA, ETC. **************
/
/---------------------------------------------------------------------
RZCSEC,	0			/ * CURRENT SECTOR NUMBER.
/
RZCDF0,	CDFSYS			/ "CDF 0" INSTRUCTION.			/M033
/
RZRTCT,	-10			/ POINTER TO RETRY COUNT.
RZLSEC,	0		/LOGICAL SECTOR
RZECTR,	0			/ERROR COUNT WORD
RZPHSW,	0		/PHYSICAL I/O SW 0=LOGIO 1=PHYS
RZDENS,	0		/DENSITY SW			/M036
			SIZE=	.-RZCSEC
			SPARE=	.+177&7600-.
				PAGE
			EJECT
/	** -2- ** PAGE 2 DOCUMENTATION ****
/*********************************************************************
/
/				PAGE 2
/
/*********************************************************************
/
/	THIS PAGE OF THE DRIVER CONTAINS ALL OF THE I/O FUNCTIONS
/	AND CONTROLLER I/O COMMAND PROCESSORS, AND CONCOMMITANT
/			DATA AREAS.
/
/	A.	THE 8 BIT MODE/SINGLE DENSITY, SECTOR 1, DATA
/			PACKING ROUTINE.
/
/	B.	THE 8 BIT MODE/SINGLE DENSITY, SECTOR 1, DATA
/			UNPACKING ROUTINE.
/
/	C.	COMBINED MODE/DUAL DENSITY, READ PRIMITIVE.
/
/	D.	COMBINED MODE/DUAL DENSITY, WRITE PRIMITIVE.
/
/	E.	THE PHYSICAL I/O CONTROLLER PRIMITIVE.
/
/	F.	THE CONTROLLER COMMAND PRIMITIVES.
/
/	G.	THE CONTROLLER "DONE"/"ERROR" PROCESSOR PRIMITIVES.
/
/	H.	THE PAGE 2 DATA AREA.
/
/*********************************************************************

/	** -2- ** PACKING ALGORITHM ****
/*********************************************************************
/
/	THE ROUTINE "DXPACK" PERFORMS A TRANSFORMATION OF A
/	BLOCK (I.E. 256(10)) OF TWELVE BIT WORDS INTO THREE
/	128(10) SECTORS OF 8 BIT BYTES SCHEMATICALLY INDICATED
/	BY THE FOLLOWING DIAGRAM.
/
/	THE ROUTINE "DXUNPK" REVERSES THIS PACKING ALGORITHM.
/
/
/	NOTA BENE - Nx,y INDICATES NIBBLE(BITS 0-3) OF PAGE "x", WORD "y".
/				WHILE
/		    Bx,y INDICATES BYTE(BITS 4-11) OF PAGE "x", WORD "y".
/
/			!<--------12------->!
/			!<--4->!<----8----->!
/			! N0,0 !    B0,0    !
/			! N0,1 !    B0,1    !
/			! N0,2 !    B0,2    !
/			! N0,3 !    B0,3    !
/				.
/				.
/				.
/				ETC.
/				.
/				.
/				.
/			!N1,127!   B1,127   !
/
/
/
/			IS TRANSFORMED INTO
/
/
/
/ !  SECTOR "1" !		! SECTOR "2" !		! SECTOR "3" !
/ !<-----8----->!		!<----8----->!		!<----8----->!
/ ! N0,1 ! N0,0 !		!    B0,0    !		!    B1,0    !
/ ! N0,3 ! N0,2 !		!    B0,1    !		!    B1,1    !
/ ! N0,5 ! N0,4 !		!    B0,2    !		!    B1,2    !
/ ! N0,7 ! N0,6 !		!    B0,3    !		!    B1,3    !
/ 	.				.			.
/ 	.				.			.
/ 	.				.			.
/ 	ETC.	+			ETC.	+		ETC.
/ 	.				.			.
/ 	.				.			.
/ 	.				.			.
/ !N1,127!N1,126!		!   B0,127   !		!   B1,127   !
/
/*********************************************************************
				EJECT
/	** -2- ** RX01 SECTOR PACKING ROUTINE ****
/---------------------------------------------------------------------
/
/************************ RX01 SECTOR PACKING ROUTINE ****************
/
/!!!!!!!!!!!!!!!!!!!!!!!! NOTA BENE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/   THE DATA FIELD OF THIS ROUTINE IS THE SPECIFIED BUFFER FIELD.
/
/!!!!!!!!!!!!!!!!!!!!!!!! END NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/---------------------------------------------------------------------
DXPACK,	0			/ ENTRY POINT TO "DXPACK".
	JMS	RZLCMD		/ INITIATE A "FILL SILO" OPERATION.
DXPAK1,	CLA CLL			/ ENSURE REGISTER CLEAR, "XDR" DOESN'T.
RZ1SET,	CDFSYS								/M033
	TAD I	RZBTMP		/ LOAD A DATUM,...
	AND	DXNMSK		/ ...AND ISOLATE THE HIGH ORDER 4 BITS.
	ISZ	RZBTMP		/ UPDATE BUFFER ADDRESS TO NEXT DATUM.
DXNMSK,	7400			/ (NOP)- JUST IN CASE THE "ISZ" SKIPS. -/M033
	CLL RTR			/ ALIGN BITS AGAINST HOB BOUNDARY,...
	RTR
	MQL			/ ...AND SAVE TEMPORARILY.
	TAD I	RZBTMP		/ LOAD NEXT SEQUENTIAL DATUM,...
	CDFSYS			/RESET					/M033
	AND	DXNMSK		/ ...AND ISOLATE HIGH ORDER 4 BITS.
	ISZ	RZBTMP		/ UPDATE BUFFER ADDRESS TO NEXT DATUM.
	NOP			/ - JUST IN CASE THE "ISZ" SKIPS.
	BSW			/ ALIGN BITS ON LOB BOUNDARY,...
	CLL RTR			/ ...COMPLETE BUILD OF 8 BIT BYTE,...
	MQA			/ ......BY COMPLETING ALIGNMENT,...
	JMS I	R2XFER		/ .........THEN TRANSFER TO SILO.
	JMP	DXPAK1		/  - REPEAT PROCESS.
	JMP	RZEPRO			/ERROR RETURN
	JMS	RZPHYS
	JMS	DYWRIT		/ DONE - LET "DYWRIT" FINISH IT OFF.
	JMP I	DXPACK		/ RETURN TO CALLER.
			SIZE=	.-DXPACK

				EJECT
/	** -2- ** RX01 UNPACKING ROUTINE ****
/---------------------------------------------------------------------
/
/************************ RX01 UNPACKING ROUTINE *********************
/
/!!!!!!!!!!!!!!!!!!!!!!!! NOTA BENE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/   THE DATA FIELD OF THIS ROUTINE IS THE SPECIFIED BUFFER FIELD.
/
/!!!!!!!!!!!!!!!!!!!!!!!! END NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/---------------------------------------------------------------------
DXUNPK,	0			/ ENTRY POINT TO "DXUNPK".
	JMS	RZPHYS		/ EFFECT A "READ SECTOR" OPERATION.
	JMS	RZLCMD		/ INITIATE AN "EMPTY SILO" OPERATION,...
DXUPK1,	JMS I	R2XFER		/ TRANSFER A DATUM,...
	JMP	DXCONT		/TRANSFER
	JMP	RZEPRO			/ERROR RET
	JMP	DXDONE		/DONE RETURN
DXCONT,	AND	DXK377		/ ...AND ENSURE HIGH ORDER NIBBLE = 0.
	CLL RTL			/ ALIGN NIBBLES ONTO BYTE BOUNDARY.
	MQL			/ SAVE.
	MQA			/ RETREIVE.
	AND	DXBMSK		/ ISOLATE HIGH ORDER NIBBLE,...
	CLL RTL			/ ...COMPLETE ALIGNMENT,...
RZ2SET,	CDFSYS								/M033
	DCA I	RZBTMP		/ ......AND INSERT INTO BUFFER.
	ISZ	RZBTMP		/ UPDATE POINTER TO NEXT BUFFER ADDRESS.
DXK377,	0377			/ - JUST IN CASE THE "ISZ" SKIPS.
				/ ( == "AND 377 ).
	MQA			/ RETREIVE DATUM.
	AND	DXPC77		/ ISOLATE NEXT SEQUENTIAL NIBBLE,...
	BSW			/ ...ISOLATE INTO HIGH ORDER BYTE,...
	DCA I	RZBTMP		/ ......THEN INSERT INTO BUFFER.
	CDFSYS			/RESET					/M033
	ISZ	RZBTMP		/ UPDATE POINTER TO NEXT BUFFER ADDRESS.
DXPC77,	0077			/ - JUST IN CASE THE "ISZ" SKIPS.
				/ ( == "AND 77 ).
	JMP	DXUPK1		/ NO - REPEAT.
DXDONE,	JMS	DYREAD		/ YES - LET "DYREAD" FINISH IT OFF.
	JMP I	DXUNPK		/ RETURN TO CALLER.
			SIZE=	.-DXUNPK

				EJECT
/	** -2- ** READ PRIMITIVE ****
/---------------------------------------------------------------------
/
/************************ READ PRIMITIVE *****************************
/
/!!!!!!!!!!!!!!!!!!!!!!!! NOTA BENE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/   THE DATA FIELD OF THIS ROUTINE IS THE SPECIFIED BUFFER FIELD.
/
/!!!!!!!!!!!!!!!!!!!!!!!! END NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/
/	THE FOLLOWING ROUTINE UTILISES A PROPERTY OF THE
/	RX28 SUBSYSTEM THAT IS MODE DEPENDENT.
/
/	IN 12 BIT MODE:
/			ALL TRANSFERS TO THE AC FROM THE
/			INTERFACE REGISTER ARE 12 BIT JAM
/			TRANSFERS.
/
/	IN 8 BIT MODE:
/			ALL TRANSFERS TO THE AC FROM THE
/			INTERFACE REGISTER ARE LOCICAL "OR'S"
/			INTO BITS 4-11 OF THE AC.
/
/	THUS, IN 12 BIT MODE, THE DATA IN THE AC, ACCESSED
/	BY THE "TAD I	RZBFFR", ARE OVER-WRITTEN BY THE
/	TRANSFER. IN 8 BIT MODE, HOWEVER, THE DATA TRANSFERRED
/	IS "OR"ED INTO THE DATA ALREADY IN THE AC ( USUALLY
/	THE HIGH ORDER FOUR(4) BITS OF A PACKED WORD).
/
/	HENCE, THIS FUNCTION MAY BE EMPLOYED AS A "READ"
/	PRIMITIVE.
/
/
/---------------------------------------------------------------------
DYREAD,	0			/ ENTRY POINT TO "DYREAD".
DYRD01,	JMS	RZPHYS		/ EXECUTE A "READ SECTOR" OPERATION.
	JMS	RZLCMD		/ INITIATE "EMPTY SILO" OPERATION.
DYRD02,
	TAD	RZXVFY		/VERIFY MODE?		/A024
	SZA						/A024
	JMP	RZ3SET		/YES			/A024
	TAD	RZPHSW		/PHYSICAL IO SW
RZ3SET,	CDFSYS								/M033
	SNA CLA CLL			/IF  SET DONT ADD CONTENTS OF BUFFER
	TAD I	RZBFFR		/ LOAD CONTENTS OF BUFFER.
	CDFSYS			/RESET					/M033
	JMS I	R2XFER		/ LOAD A DATUM.
				/#(12 BIT MODE = JAM XFER BITS 0-11)
				/#( 8 BIT MODE = "OR" OF BITS 4-11.)
	JMP	DYCONT		/TRDONE
	JMP	RZEPRO			/ERROR RETURN
	JMP	DYDONE		/DONE RETURN
DYCONT,
RZ4SET,	CDFSYS								/M033
/__________________________________________________________/A015
/
/		VERIFY DISKETTE				   	/A015
/	MUST BE LOCATED IN SAME PAGE AREA AS CALLING SUBROUTINE /A015
/	ELSE CDF'S AND/OR SECOND BUFFER POINTER NEEDED		/A015
/
/		VERIFY MODE COMPARES BUFFER TO SILO		/A015
/
RZVJMP,	JMP	RZXNOV		/NOT VERIFY MODE=JMP..NOP=VFY MODE/A015
	CIA							/A015
	TAD I	RZBFFR		/CHECK AGAINST BUFFER		/A015
	SNA CLA							/A015
	JMP	DVFCNT		/OK CONTINUE			/A015
	CDFSYS			/RESET TO DRIVE FIELD		/M033
RZXLOP,	CLA			/WILL NOT RESET 10 TIMES	/A015
	JMS I	R2XFER		/WAIT UNTILL DONE TO CLEAR FLAGS/A015
	JMP	RZXLOP		/TR TRY AGN			/A015
	JMP	RZEPRO		/IS ERROR			/C024
	JMP	RZEPRO		/IS ERROR			/C024
RZXNOV,							/A015
	DCA I	RZBFFR		/STORE				/A015
DVFCNT,	CDFSYS			/RESET				/M033
/
	ISZ	RZBFFR		/ UPDATE BUFFER ADDRESS - WRAP ?
DXBMSK,	SMA CLA			/ - JUST IN CASE THE "ISZ" SKIPS -
				/ ( == 7700 & WILL NEVER SKIP!!!)
	JMP	DYRD02		/ CHECK FOR OPERATION DONE.
DYDONE,	ISZ	RZSCTR		/ YES - ALL SECTORS PROCESSED ?
	JMP	DYRD01		/ NO - PROCESS NEXT.
	JMP I	DYREAD		/ YES - RETURN TO CHECK FOR END OF REQUEST.	/M032
RZVSKP,	JMP	RZXNOV		/VERIFY SKIP INSTRUCTION	/A015
			SIZE=	.-DYREAD

				EJECT
/	** -2- ** WRITE PRIMITIVE ****
/---------------------------------------------------------------------
/
/************************ WRITE PRIMITIVE ****************************
/
/!!!!!!!!!!!!!!!!!!!!!!!! NOTA BENE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/   THE DATA FIELD OF THIS ROUTINE IS THE SPECIFIED BUFFER FIELD.
/
/!!!!!!!!!!!!!!!!!!!!!!!! END NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/---------------------------------------------------------------------
DYWRIT,	0			/ ENTRY POINT TO "DYWRIT".
DYWRT1,	JMS	RZLCMD		/ INITIATE A "FILL SILO" COMMAND.
DYWRT0,	 CLA CLL		/
RZ5SET,	CDFSYS								/M033
	TAD I	RZBFFR		/UPDATE BUFFER ADDR
	CDFSYS			/RESET					/M033
	JMS I	R2XFER		/TRANSMIT
	JMP	DYCNT1		/TRANSMIT RETURN
	JMP	RZEPRO			/ERROR RETURN
	JMP	DYDNE		/DONE RETTURN
DYCNT1,	ISZ	RZBFFR	
	NOP			/NECESSARY WHEN REACH END OF FLD
	JMP	DYWRT0		/NEXT
DYDNE,	JMS	RZPHYS		/ YES - EXECUTE A "WRITE SECTOR" OPERATION.
	ISZ	RZSCTR		/ ALL SECTORS PROCESSED ?
	JMP	DYWRT1		/ NO - DO NEXT.
	JMP I	DYWRIT		/ YES - RETURN TO CHECK FOR END OF REQUEST.	/M032
			SIZE=	.-DYWRIT

/								/M032
/CHECK FOR PHYSICAL IO						/M032
/	RETURN+1 IF  SWITCH=1					/M032
/
CHKPHY,	0							/M032
	CLA							/M032
	TAD	RZPHSW		/PHYS IO?		/M012	/M032
	SZA CLA						/A012	/M032
	ISZ	CHKPHY					/A012	/M032
	JMP I	CHKPHY					/A012	/M032
/*****************************************************
			EJECT
/
/____________________________________________________________/A015
/	FOLLOWING MAY NOT BE NECESSARY TO RESET TO WRITE UPON EXIT/A015
/		TO BE RECHECKED					?A015
/_______________________________________________________________/A015
DVSETW,	0
	CLA CLL CMA RTL		/7775				/A015
	AND 	RZCMND		/CLEAR READ BIT			/A015
	DCA 	RZCMND						/A015
	JMP I	DVSETW						/A015
/
/
RZXVFY,	0			/VERIFY MODE SWITCH		/A015
/	** -2- ** PAGE 2 DATA AREA ****
/---------------------------------------------------------------------
/
/************************ OFF-PAGE POINTERS, DATA, ETC. **************
/
/!!!!!!!!!!!!!!!!!!!!!!!! NOTA BENE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/   THE DATA FIELD OF THIS ROUTINE IS THE SPECIFIED BUFFER FIELD.
/
/!!!!!!!!!!!!!!!!!!!!!!!! END NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/---------------------------------------------------------------------
RZCMND,	0			/ * CONTROLLER COMMAND WORD.
RZBFFR,	0			/ * RUNNING BUFFER ADDRESS.
RZBTMP,	0			/ * TEMPORARY BUFFER POINTER.
RZTRAK,	0			/ * THE PHYSICAL TRACK NUMBER.
RZSECT,	0			/ * THE PHYSICAL SECTOR NUMBER.
RZSCTR,	0			/ * SECTOR COUNTER.
/
/
R2XFER,	RZXFER			/POINTER TO "RZXFER ROUTINE
			SIZE=	.-RZCMND
			SPARE=	.+177&7600-.
				PAGE
			EJECT
/--------------------------------------------------------------------
/
/************************ PHYSICAL I/O SET UP AND CALL*****************
/
/****************      PHYSICAL I/O READS/WRITES ONLY ONE  ************
/*************   CALL IN RZXDIR IS COMPLEMENT OF READ/WRITE *********
/****************          FOR PHYSICAL I/O        ********************
/*******************          SECTOR FOR EACH CALL      ***************
/
/-----------------------------------------------------------------------
PHYSIO,	CMA			/
	DCA	RZXDIR		/RESET CALL
/D032	IAC			/PHYSICAL IO SW FOR DVSET	/A015
	JMS	DVSET		/SET VERIFY SW			/A015
	CLA CLL IAC BSW		/100
	AND	RZXDIR		/MASK  COMPUTED MODE BIT
	DCA	RZMODE		/SET MODE CALLED FOR
	TAD	RZUNIT		/ADD UNIT NO
	TAD	RZHEAD		/HEAD 0/1 FOR RX50
	TAD	RZXDIR
	AND 	KON536		/MASK OUT COMMAND BITS
	DCA	RZCMND		/    SAVE COMMAND
			/PHYSIO DENSITY BIT USED ONLY AS SW
			/IN LDCMND  ROUTINE
	TAD	RZXDIR		/GET MODE TO RESET DENSITY SW
	AND	(400		/DENSITY BIT			/A011
	SZA CLA			/CHECK DENSITY			/A011
	IAC			/IS DBLE DEN			/A011
	DCA	RZDENS		/... SET ACTUAL DENSITY FOR THIS DSKETTE
	TAD	PYTRAK
	DCA	RZTRAK		/SET TRACK
	TAD	PYSECT
	DCA	RZSECT		/SET SECTOR
RZPHIO,							/M025
	CLA IAC			/RETRY I/O ERR		/C016	/C025
	DCA	RZPHSW		/SET PHYSICAL IO SW=-1
	TAD	RZBPTR		/BUFFER POINTER			/M025
	DCA	RZBFFR		/RESET				/M025
	CMA			/-1				/M016
	DCA	RZSCTR		/SET TO READ ONLY 1 SECTOR	/M016
	TAD	RZCMND	
	JMS	RZXJMP		/SET JMP TO FUNCTION
	RZWRIT			/FUNCTION 0=WRITE
	RZREAD			/	  2=READ
	RZFRMT			/	  4=FORMAT DSKETTE
	RZLDEN			/	  6=GET DENSITY
	RZEXT			/	 10=IGNORE
	RZDSTY			/	 12=READ ERROR STATUS
TRCON,				/SPACE WARS			  /M011
RZXJMP,	0
	CLL RAR			/  /2
	AND	KON7
	TAD	RZXJMP		/GET ADDR
	DCA	RZXJMP		/SAVE LOC
	TAD I	RZXJMP
	DCA	RZXJMP
	JMP I	RZXJMP		/EXEC
RZFRMT,	TAD	KYWORD		/KEYWORD TO SET DENS
RZDSTY,	DCA	TRCON		/111 FOR TRNSFER 0 FOR DONE
RZFUNC,	AC0004			/EXECUTE PHYSICAL IO FUNCTION		/M033
	JMS	RZLCMD
/D019	JMP	RZERR1			/ERR
	TAD	TRCON
	SKP			/SET FOR TRNSFER
	CLA			/SET FOR DONE RETURN
	JMS	RZXFER		/READ STATUS
	JMP .-2			/CHECK DONE
	JMP	RZERR6			/ERR RET
	JMP I	R3RET		/DONE RETURN
RZREAD,	JMS	DYREAD		/GO READ IT
	JMP I	R3RET		/EXIT
RZWRIT,	JMS	DYWRIT		/WRITE IT
	JMP I	R3RET		/EXIT
RZLDEN,
	JMS	RZIDEN	/GET DENSITY
RZEXT,	JMP I	R3RET		/EXIT
R3RET,	RZEXIT		/DONE RET
				EJECT
/	** -1- ** RX01/RX02 PROCESS DISPATCHER ****
/---------------------------------------------------------------------
/
/************************ RX01/RX02 PROCESS DISPATCHER ***************
/
/	THIS IS THE MAIN I/O PROCESSOR - ALL I/O LOOPS THROUGH THIS
/	ROUTINE.
/
/	THE FOLLOWING DISPATCH ROUTINE IS BASED UPON AN INDEX, A SUM
/	CALCULATED FROM THE DENSITY FUNCTION, AND THE I/O FUNCTION
/	AS FOLLOWS:
/
/			SD		DD
/	RZDENS		0		1
/
/			WRITE		READ
/	RZXDIR		0		2
/
/	THEREFORE,
/
/	"INDEX"		0	=>	SINGLE DENSITY/WRITE.
/			1	=>	DOUBLE DENSITY/WRITE.
/			2	=>	SINGLE DENSITY/READ.
/			3	=>	DOUBLE DENSITY/READ.
/
/---------------------------------------------------------------------
RZNEXT,	0
RZNXTA,	TAD 	RZBFFR		/ SET/RE-SET TEMPORARY BUFFER,...
	DCA 	RZBTMP		/ ...POINTER FOR PACK/UNPACK ROUTINES.
	TAD	RZ50SW
	SNA CLA			/IS IT RX50?
	TAD	(-1		/NO INTERLEAVE 2
	TAD	(-1		/YES INTERLEAVE 1
	DCA 	RZSCTR		/ ...SECTOR COUNT,...
	TAD	RZXVFY		/CHECK VERIFY MODE		/A015
	SZA CLA							/A015
	CLA CLL IAC RTL		/=4 ADD TO TABLE FOR VERIFY MODE/A015
RZNXTB,	TAD 	RZDENS		/ LOAD THE DENSITY CODE,...
	TAD	RZXDIR		/ ...AND BUILD DISPATCH CODE.
	JMS	RZDISP		/ LOAD THE TABLE HEAD.
	DXPACK			/ SD/8 BIT WRITE.
	DYWRIT			/ DD/12 BIT WRITE.
	DXUNPK			/ SD/8 BIT READ.
	DYREAD			/ DD/12 BIT READ.
	DVPACK			/8BIT SD WRITE WITH VERIFY	/A015
	DVWRIT			/12BIT DD WRITE WITH VERIFY	/A015
	RZVERF			/8BIT SD READ VERIFY(NOT ALLWD LOGIO)	/A015
	DVREAD			/12BIT DD READ VERIFY(ALLWD LOGIO)/A015/C024
RZDISP,	0			/ TABLE ENTRY ADDRESS/DISPATCH ADDRESS.
	TAD	RZDISP		/ BUILD,...
	DCA	RZDISP		/ ...DISPATCH,...
	TAD I	RZDISP		/ ......ADDRESS,...
	DCA	RZDISP		/ .........THEN,...
	JMS I	RZDISP		/ .................AND DISPATCH.
	ISZ	RZBCNT		/ REQUEST COMPLETE ?		/C045
	JMP	RZNXTA		/ NO - DO ANOTHER BLOCK.
	JMP I	RZNEXT		/ ...AND EXIT DRIVER.	/M032
			SIZE=	.-RZNEXT
/SPACE WARS MOVE VERSION 034
/

DVSETR,	0
	CLA CLL IAC RAL	/=2			/A015	/M034
	TAD 	RZCMND		/ADD			/A015	/M034
	DCA 	RZCMND		/RESET			/A015	/M034
	JMP I	DVSETR					/A015	/M034
/
				EJECT
KYWORD,	111		/KEYWORD TO FORMAT DENSITY		/M032
KON536,	536		/MASK  9 BIT =HEAD/SCND SIDE RX50
KON7,	7
			SPARE= .+177&7600-.
				PAGE

				EJECT
/	** -2- ** PHYSICAL I/O PRIMITIVE ****
/---------------------------------------------------------------------
/
/************************ PHYSICAL I/O PRIMITIVE *********************
/
/!!!!!!!!!!!!!!!!!!!!!!!! NOTA BENE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/   THE DATA FIELD OF THIS ROUTINE IS THE SPECIFIED BUFFER FIELD.
/
/!!!!!!!!!!!!!!!!!!!!!!!! END NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/---------------------------------------------------------------------
RZPHYS,	0			/ ENTRY POINT TO "RZPHYS".
	AC0004			/ SET IN THE "PHYSICAL I/O" BIT,...	/M033
	JMS	RZLCMD		/ ...AND TRANSMIT COMMAND TO CONTROLLER.
	TAD	RZSECT		/ LOAD THE PHYSICAL SECTOR,...
	JMS 	RZXFER		/ ...AND TRANSMIT IT.
	JMP	RZCNT1		/TR DONE RETURN
	JMP	RZEPRO			/ERROR RETURN
	JMP	RZERR3			/SHOULD NOT GET DONE RETURN
RZCNT1,	CLA CLL			/ ENSURE REGISTER CLEAR, "XDR" DOESN'T.
	TAD	RZTRAK		/ LOAD THE PHYSICAL TRACK,...
	JMS 	RZXFER		/ ...AND TRANSMIT IT TOO.
	JMP	RZCNT2		/TR RETURN
	JMP	RZEPRO			/ERROR RETURN
	JMP	RZERR3			/SHOULD NOT GET DONE YET
RZCNT2,
	JMS	CHKPHY		/CHECK PHYSIO	SKIP ONE IF TRUE	/A012
	JMS	RZDIVD		/THEN CALCULATE THE NEXT TRACK AND SECTOR./M012
	JMS	RDNSWP			/DO SWAP IF DONE	/A026
			/DONE RETURN
	CDFSYS			/ RESTORE OUR DATA FIELD,...		/M033
	JMP I	RZPHYS		/ YES - RETURN TO CALLER.		/M032
			SIZE=	.-RZPHYS

				EJECT
/	** -2- ** CONTROLLER PRIMITIVES ****
/---------------------------------------------------------------------
/
/************************ CONTROLLER FUNCTION PRIMITIVE **************
/
/!!!!!!!!!!!!!!!!!!!!!!!! NOTA BENE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/   THE DATA FIELD OF THIS ROUTINE IS THE SPECIFIED BUFFER FIELD.
/
/!!!!!!!!!!!!!!!!!!!!!!!! END NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/
/---------------------------------------------------------------------
RZLCMD,	0			/ ENTRY POINT TO "RZPHYS".
	TAD	RZCMND		/ LOAD THE COMMAND,...
RZIO01,	RXILCD			/ SUBMIT COMMAND, OR FIRST BYTE OF, 	/M033
				/ TO CONTROLLER,...
	TAD	RZMODE		/ ...8 BIT MODE OPERATION ?,...
	SNA CLA	
	JMP	INCRET			/NO 12 BIT
	TAD	RZDENS		/SET 2ND HALF OF WORD FOR LCD		/A011
RZLCM2,	JMS	RZXFER		/ .........YES - SEND OUT SECOND BYTE,...
	JMP  	INCRET		/NORMAL RETURN
	JMP	RZERR1		/ERROR RETURN			/C019
	JMP	RZERR1		/DONE RETURN=ERROR		/C019
INCRET,							/C019
	CLA			/CLEAR FOR 8 BIT DD TRNSFER
	JMP I	RZLCMD		/			/M032
/*****RZLCM3 MUST BE LOCATED ON SAME PAGE AS RZLCM2		/A024
RZLCM3,	JMS	RZXFER	/CONSTANT USED TO OVERLAY RZLCM2	/A024
/******************						/A024
/---------------------------------------------------------------------
/
/************************ CONTROLLER READY PRIMITIVE *****************
/
/   THE DATA FIELD OF THIS ROUTINE IS THE SPECIFIED BUFFER FIELD.
/
/************************ CONTROLLER DATA TRANSFER PRIMITIVE *********
/
/************************ OPERATION COMPLETE/ERROR PROCESSOR *********
/
/---------------------------------------------------------------------
RZXFER,	0		/ENTRY POINT
RZXRDY,				/RZXRDY  USED TO CHECK ASSEM REF ERRS(TEMP)
RZIO02,	RXISTR			/TRANS READY?				/M033
	JMP	RZDONE		/NO CHECK DONE
RZIO03,	RXIXDR			/YES TRANSFER				/M033
	JMP I	RZXFER		/TRANSFER COMPLETE RETURN		/M032
RZDONE,				/RZDONE TEMP TO CHECK REFERENCES
RZIO04,	RXISDN			/OP COMPLETE				/M033
	JMP	RZXRDY		/NO CHECK TRANSFER
RZIO05,	RXISER			/ANY ERROR				/M033
	JMP RZNOER		//NO
	JMS	RZTMPE		/ ERROR ROUTINE
	JMP	RZERXT		/YES
RZNOER,
	CLA							/A007
	ISZ	RZXFER		/SET DONE RETURN
RZERXT,	ISZ	RZXFER		/SET ERROR RETURN
	JMP I	RZXFER			/M032
RZTMPE,	0		/ ERROR ROUTINE
	CLA								/A011
	RXIXDR			/GET STATUS				/M033
	AND	M377
	DCA	RZSTAT		/TO RZSTAT (FOR RZIDEN).		/M003
	TAD	RZCMND		/GET DEVICE NO
	AND	KON20
	TAD	KON16		/ERR STATUS CODE
	RXILCD			/TRNSFER				/M033
	RXISDN								/M033
	JMP	.-1
	RXIXDR								/M033
	AND	M377
	DCA	RZERST		/SET ERROR STATUS
	JMP I	RZTMPE		/
KON20,	20
KON16,	16
RZMODE,	0			/MODE SW: 0=12(DD) BIT MODE 1=8(SD) BIT MODE
/
M377,	377

				EJECT
/	** -3- ** PAGE 3 DOCUMENTATION ****
/*********************************************************************
/
/				PAGE 3
/
/*********************************************************************
/
/	THE FOLLOWING PAGE CONTAINS ALL OF THE UTILITY ROUTINES
/	USED BY THE PAGE 1, AND PAGE 2 ROUTINES, PLUS THE ASSOCIATED
/				DATA AREAS.
/
/	A.	THE ERROR PROCESSOR.
/
/	B.	THE EXTERNAL/INTERNAL DENSITY DETERMINATION ROUTINES.
/
/	C.	THE TRACK,SECTOR AND INTERLEAVE ROUTINES.
/
/      [D.	THE OPTIONAL I/O WAIT ROUTINE-USED ONLY IF ALL ELSE FAILS.]
/
/	E.	THE PAGE 3 DATA AREA.
/
/*********************************************************************
/	** -3- ** ERROR PROCESSOR ****
/---------------------------------------------------------------------
/
/************************ PROCESSES ERRORS/RE-TRY ********************
/
/---------------------------------------------------------------------
RZEPRO,
	IFDEF  CONDOR	<
	JMS	CKWPRO		/CHECK IF WRITE PROTECT ERROR	/A026
	JMP	RZERR2		/YES IT IS(DON'T) RETRY 10 TIMES/A026
			>	/END ENDIF CONDOR		/A026
	TAD I	R2BPTR		/ ......AND THE,...
	DCA I	R2BFFR		/ .........BUFFER ADDRESS.
	JMS	RZINCR		/CHECK INIT COUNT		/M016
	TAD	RZXVFY		/IS VERIFY MODE			/A016
	SZA CLA							/A016
	JMP	RZERR8		/YES.				/A016
	TAD	RZPHSW		/IS PHYSIO?			/A007
	SZA CLA							/A007
	JMP	RZERR6		/YES				/A007
RZXPRC,	TAD I	R2CSEC		/ RE-SET THE OFFENDING,...
	DCA I	R2LSEC		/ ...SECTOR NUMBER,...
	ISZ I	R2ECTR		/ RETRY COUNT EXHAUSTED ?
	JMP I	R2RTRY		/ NO - RE-TRY THIS OPERATION.
	JMP	RZERR2		/PROCESS ERROR 2
/
/
RZERR8,	TAD	RZPHSW		/IT IS VERIFY MODE BUTIS PHYSIO?/A016
	SNA CLA							/C044
/D044	JMP	RZERR7		/YES				/A016
/D044	JMS	DVSETW		/NO IT'S LOGIO WRITE WITH VERIFY/A016
	JMP	RZXPRC		/....AFTER SETTING TOWRITE CONT../A016
/
RZERR7,	TAD RZCMND	/CHECK COMMAND LAST PERFORMED	  /A016
	AND	KON16
	SNA CLA 			/0=WRITE 2 =READ....		  /A016
	JMP	RZERRR		/WAS WRITE(WOULD BE FLUKE IF OCCURED)/A016
	JMS	DVSETW		/SET TO WRITE			     /A016
	CMA							/A016
	DCA	RZSCTR		/SET SECTOR COUNT		/A016
	JMS	DYWRIT		/WRITE IT			/A016
RZERRR,	JMS	DVSETR		/SET READ			/A016
	JMP	RZERR6		/DO IT				/A016
			SIZE=	.-RZEPRO
				EJECT
/	** -2- ** PAGE 2 DATA AREA ****
/---------------------------------------------------------------------
/
/************************ OFF-PAGE POINTERS, DATA, ETC. **************
/
/---------------------------------------------------------------------
RZERST,	0			/ * ERROR-STATUS WORD.
/
/
R2EXIT,	RZEXIT			/ LINK TO EXIT CODE.
/
R2RTRY,	RZRTRY			/ POINTER TO "RZRTRY".
R2CSEC,	RZCSEC			/ POINTER TO "RZCSEC".
R2BPTR,	RZBPTR			/ POINTER TO "RZBPTR".
R2BFFR,	RZBFFR			/ POINTER TO "RZBFFR".
R2ECTR,	RZECTR			/ POINTER TO "RZECTR".
R2LSEC,	RZLSEC			/POINTER TO "RZLSEC"
/
/m 050 this routine moved here in V2.5
/
/	THIS ROUTINE ENTERED FOR 12 BIT LOGICAL READ AND VERIFY	/M027
/
DVREAD,	0						/M032
	JMS	DYREAD		/READ AND COMPARE SILO		/M032
	JMP I	DVREAD						/M032
/
/		END SPACE WARS

			SPARE=	.+177&7600-.
				PAGE
				EJECT

/
/
/************************ INTERNAL CALL DENSITY PROCESSOR ************
/
/---------------------------------------------------------------------
RZIDEN,	0			/ ENTRY POINT TO "RZIDEN".
	IFDEF	WINNIE	<
	JMP	CHKWIN		/CHECK WINNIE(SPACE WARS CLUGE)		/A032
			>	/END IFDEF WINNIE			/A032
				/.....NOT A WINNIE RETURN		/A032
/
NOWINI,
	DCA I	R3CMND			/CLEAR COMMAND TEMP
	DCA I	R3MODE		/ENSURE 12 BIT MODE FOR LOAD STATUS CMND
	TAD I	R3UNIT		/UNIT NO
	TAD	CON12		/101X BIN READ STATUS
	JMS	RZLCMD		/EX CMMND
				/#	"SINGLE DENSITY"
				/#	"12 BIT MODE"
				/ ...OPERATION.
	DCA	RZDLCT		/SET DELAY COUNT		/A022
	TAD	KONDLY		/DELAY CONSTANT 7421(SNL)	/A023
	DCA	RZDLC2		/OUTSIDE LOOP=-APPROX 240 DEC	/A023
	JMP	RZDELY	/***********************
RZIO10,	RXISDN			/DONE FLAG SET?			/M033
	JMP	RZDELY		/INC TIMEOUT			/A022
RZIO11,	RXISER			/IS THERE ANY ERROR		/M033
	JMP	RZDNOK		/NO  DONE IS OK			/A022
	JMS	RZTMPE		/READ ERROR STATUS		/A022
	JMP	RZPASS		/GET STATUS			/A022
RZDNOK,								/A022
RZIO07,	RXIXDR			/READ STATUS			/M033
	DCA	RZSTAT		/SAVE STAT TEMP
RZPASS,	TAD	RZSTAT
	AND	(377			/CLEAR UNUSED BITS
	DCA	RZSTAT
	TAD	(200		/DEVICE READY?
	AND	RZSTAT
	SNA CLA			/IS READY?
	JMP	RZERR5		/NO
	CLA IAC BSW		/100=RX50 BIT			/A023
	AND	RZSTAT		/				/C023
	SNA CLA			/IS IT A 50
	JMP	NOTA50	
	CLA CLL IAC RAL		/=2				/A024
	JMS	RZSETX		/SET TYPE			/A024
	TAD	RZSTAT
	AND	(1000		/2ND HEAD AVAILABLE
	SZA CLA
	IAC			/SET DENS TO 3
	TAD	(2		/2=RX50 ONE SIDE  3=RX50 2 SIDES
	JMP	RZSETF		/SET DENSITY
NOTA50,
	TAD	RZSTAT		/ GET STATUS				/A002
	AND	(10)		/ ISOLATE THE RX02 BIT.			/A002
	JMS	RZSETX		/SET UP FOR RX02/RX01 		/A024
	TAD	RZSTAT		/GET STATUS
	AND	(40		/MASK DENSITY BIT
	SZA CLA			/IS IT READY?
	IAC			/DD
RZSETF,
	DCA I	R3DENS		/SET DENSITY 0=SD 1=DD
				/............3=RX50 ONE SIDE
				/............4=RX50 TWO SIDE
RZCNT3,	TAD I	R3DENS		/GET WORKING DENSITY
	JMP I	RZIDEN		/  -  RETURN.		/M032
RZSTAT,	0			/SAVE STATUS JUST READ
				/.....BIT 6 = DENSITY(0=SD)
CON12,	12
RZDLCT,	0	/DELAY COUNT INITIALIZED TO 0 TO APPROX 18.4 MSEC/C022
RZDLC2,	0	/OUTSIDE LOOP (-240 APPROX.) =5SEC TOTAL/A023
			SIZE=	.-RZIDEN

				EJECT
/	** -3- ** TRACK, SECTOR AND INTERLEAVE ****
/---------------------------------------------------------------------
/
/************************ TRACK/SECTOR-INTERLEAVE PROCESSOR **********
/
/	THE FOLLOWING ROUTINE IS A "ONE'S COMPLEMENT" DIVIDE
/	ROUTINE.
/
/	THE QUOTIENT IS RETURNED AS THE ONE'S COMPLEMENT
/	OF THE TRUE QOUTIENT, WHILE THE REMAINDER IS RETURNED
/	AS A POSITIVE NUMBER, GREATER OR EQUAL TO ZERO, AND LESS
/	THAN THE DIVISOR.
/
/	THE MAXIMUM NUMBER OF ITERATIONS THAT MAY BE EXECUTED FOR
/	TRACK/SECTOR CALCULATIONS IS TEN(10) DECIMAL. THUS, THE
/	MAXIMUM TIME THAT MAY BE SPENT WITHIN THE DIVIDE ROUTINE
/	PROPER FOR THE MAXIMUM BLOCK COUNT (<=1001(10)) IS ABOUT
/	1.2 MILLISECONDS, FOR ALL OTHER SUCH CALCULATIONS,
/	PROPORTIONATELY LESS.
/
/	ADJUSTMMENT OF THE TRACK NUMBER, IN THE ROUTINE, "RZINTL"
/	TO THE RANGE OF 1<=TRACK<=77, IS ACCOMPLISHED BY A "CIA"
/	INSTRUCTION, SIMULTANEOUSLY 1'S ORIGINING THE TRACK, AND
/	BUILDING A POSITIVE NUMBER. FOR A TRUE DIVIDE THE QUOTIENT
/	MUST BE MADE POSITIVE BY MEANS OF A "CMA" INSTRUCTION.
/
/---------------------------------------------------------------------
RZDIVD,	0			/ ENTRY POINT TO "RZDIVD".
	CLA MQL			/ INIT. THE RESIDUE,...
	TAD	RZ50SW		/RX50 SW
	SNA CLA			/IS IT SET
	TAD	RZ02DV		/DIVISOR FOR RX01/RX02
	TAD	RZ50DV		/DIVISOR FOR RX50
	DCA	RZDVSR		/SET IT UP(10 SECTORS FOR 50__26 FOR 01/02)
	CMA CLL CML		/ ...AND THE QUOTIENT,...
	DCA I	R3TRAK		/ ......(THE PHYSICAL TRACK ~).
	TAD I	R3LSEC		/ LOAD THE LOGICAL SECTOR #.
	SNA			/ LOGICAL SECTOR = 0 ?
	JMP	RZINTL		/ YES - JUST INTERLEAVE.
RZDIV0,	RAL			/ NO - NORMALISE,...
KONDLY,	SNL			/ ...THE LOGICAL SECTOR,...	/C023
	JMP	RZDIV0		/ ......NUMBER.
RZDIV1,	DCA I	R3SECT		/ SAVE THE CALCULATED PHYSICAL SECTOR.
	MQA			/ LOAD RESIDUE.
	RAL			/ SHIFT,...
	MQL			/ ...AND SAVE.
	MQA			/ RETREIVE RESIDUE.
	TAD	RZDVSR		/ "SUBTRACT" DIVISOR (# SECTORS/TRACK).
	SMA			/ OVERFLOW ?
	MQL			/ NO - SAVE VALUE.
	CLA CML			/ YES - CLEAR REGISTER, FIX LINK.
	TAD I	R3TRAK		/ RETREIVE QUOTIENT.
	RAL			/ SHIFT AND,...
	DCA I	R3TRAK		/ ...SAVE.

	TAD I	R3SECT		/ RETREIVE SECTOR,...
	CLL RAL			/ ...AND SHIFT.
	SZA			/ DONE ?
	JMP	RZDIV1		/ NO - REPEAT.
				/ YES - TIME TO INTERLEAVE.
			SIZE=	.-RZDIVD
/---------------------------------------------------------------------
/
/************************ INTERLEAVE SECTORS *************************
/
/---------------------------------------------------------------------
RZINTL,	MQA			/ RETREIVE QUOTIENT.
	CLL RAL			/ BUILD 2*Q.
	DCA I	R3SECT		/ SAVE 2*Q.
	TAD 	RZ50SW		/ GET DENSITY INDICATOR (0=SD,1=DD).
	 SNA CLA		/RX50 INTERLEAVE 2 ELSE 3
	MQA			/ NO - LOAD "Q".
	TAD I	R3SECT		/ YES - BUILD CORRECT INTERLEAVE FACTOR.
RZDIV2,	DCA I	R3SECT		/ SAVE "PHYSICAL" SECTOR #.
	TAD 	RZ50SW						/A018
	SZA CLA			/IS A 50?			/A018
	TAD I	R3DENS		/.YES. ADJUST MODULUS FOR DENSITY TYPE/M018
	TAD I	R3SECT		/ RETREIVE "PHYSICAL" SECTOR #.
	TAD	RZDVSR		/ "SUBTRACT" # SECTORS/TRACK.
	SMA SZA			/ OVERFLOW ?
	JMP	RZDIV2		/ NO - REPEAT UNTIL OVERFLOW.
	ISZ I	R3SECT		/ YES - ADD 1 TO BUILD CORRECT PHYSICAL SECTOR.
	CLA
	TAD I	R3TRAK		/ LOAD THE PHYSICAL TRACK #,...
	CIA			/ ...ADJUST TO RANGE 1<=TRK<=77.,...
	DCA I	R3TRAK		/ ......AND SAVE IT FOR CALLS.
	ISZ I	R3LSEC		/ UPDATE LOGICAL SECTOR.
	JMP I	RZDIVD		/ RETURN TO CALLER.		/M032
			SIZE=	.-RZINTL

				EJECT
/	** -3- ** PAGE 3 DATA AREA ****
/---------------------------------------------------------------------
/
/************************ OFF-PAGE POINTERS, DATA, ETC. **************
/
/---------------------------------------------------------------------
/
RZDVSR,	0			/ TRACK/SECTOR DIVISOR.
RZ02DV,	-20		/DIVISOR FOR RX01/2=-(20+12)
RZ50DV,	-12			/DIVISOR FOR RX50=10 DEC.
/
/
R3DENS,	RZDENS			/ POINTER TO "RZDENS".
R3TRAK,	RZTRAK			/ POINTER TO "RZTRAK".
R3SECT,	RZSECT			/ POINTER TO "RZSECT".
R3LSEC,	RZLSEC			/ POINTER TO "RZLSEC".
R3UNIT,	RZUNIT			/ POINTER TO "RZUNIT".
R3CMND,	RZCMND			/ POINTER TO "RXCMND".
R3MODE,	RZMODE			/POINTER TO "RZMODE"
			SIZE=	.-RZDVSR
			SPARE=	.+177&7600-.
				PAGE
				EJECT
/************************************************************/A026
/
/	THIS ROUTINE SET UP TO CHECK DONE. IT RETURNS IF DONE SET /A026
/	IF ERROR OR TRANSFER  FLAG SET GOES TO APPROP. ERROR ROUTINE/A026
/
/	RDOSWP	 defined in WPF1  overlayed by WPCU2 after
/		initialization done. allows swaping of tasks
/		pending read/write done being set
/		If error on RDOSWP ... WPF1 must change
/		to = address in dskhnd.... currently=6412
/
/
/************************************************************/A026
RDNSWP,	0					/A026
RNOSWP,	RXISTR		/TRNSFER READY			/M033
	JMP	RNOXDR	/NO CHECK DONE			/C028
	RXIXDR		/CLEAR IT			/M033
	JMP	RZERR4	/TRANSFER READY ILLEGAL		/A026
RNOXDR,	RXISDN		/DONE?				/M033
	JMP	RDOSWP					/A032
/
/
/D032ROVSWP,	JMP	RNOSWP	/CHECK TRANSFER			/C028
	RXISER		/ERROR?				/M033
	JMP I	RDNSWP					/A026
	JMP	RZEPRO	/PROCESS ERROR			/A026
RDOSWP,	CLA		/OVERLAYED WITH JSWAP		/C028
	JMP	RNOSWP					/A032
/*********************************************************/A018
/
/	THIS ROUTINE SELECTS THE DEVICE PAIR AS SPECIFIED IN AC	/A018
/	IF DONE IS SET IT RETURNS ...CALL+1
/	ELSE AFTER TIMEOUT
/	INITIALIZES DISKETTES AND TAKES ERROR RETURN
/	...WITH 5777 IN AC... BIT 0=ERROR
/			      BITS 1,2,3 =101 FOR DENSITY DEVICE NOT/A018
/			.......................READY
/			      BITS 4-11 =377  UNIQUE ERROR CODE	/A018
/				..............FOR LATER USE	/A018
/************************************************************/A018
SELCMD,	0
	TAD	RZSLDV	/GET PAIR				/M022
RXI00A,	RXISEL		/SELECT DRIVE PAIR			/M033
	RXISEL		/SELECT DRIVE PAIR(in case drves 6-7)	/M033
	CLA		/SET COUNT				/M022
/SET UP TRANSFER FOR LOAD COMMAND. 0 FOR RX01
/		SECOND TRANSFER   JMS RZXFER FOR RX02(RX50)	/A024
/
/
	TAD	RZDRIV	/GET DRIVE #				/A024
	AND	KON07	/MASK IT				/A024
	TAD	TBLPTR	/TABLE POINTER				/A024
	DCA	USEPTR	/SET IT UP				/A024
	TAD I	USEPTR	/GET SWITCH CODE			/A024
	SZA CLA		/IS RX01 OR RX02(50) TYPE		/A024
	TAD	RZLCM3	/GET JMS RZXFER FRO RX02(50)		/A024
	DCA	RZLCM2	/SET CODE OR 0				/A024
/
RXI00B,								/M022
SELRPT,							/M022
	RXISDN		/DONE					/M033
	NOP							/M022
	JMP I	SELCMD	/RETURN					/M022
RZSLDV,	0	/DEVICE PAIR SELECTED			/M022
/---------------------------------------------------------------/A016
/	IF RX50  THIS ROUTINE WILL INIT DISK PRIOR TO RETRY	/A022
/	THEN WILL SEEK TO TR 079 TILL ERRCOUNT  IS EXHAUSTED	/A022
/---------------------------------------------------------------/A016
RZINCR,	0			/DO INIT AFTER 5 RETRIES      /A005
	JMS	RZSEEK		/CHECK TIME TO SEEK 079		/A022
	JMP I	RZINCR		/RETURN W/O INIT		/A022
RZIO06,	RXIINI			/INIT DSK			/M033
RZIO00,	RXISDN			/WAIT DONE			/M033
	JMP 	.-1
	JMS	SELCMD		/SELECT PAIR			/A020
	JMP I	RZINCR		/RET
RZSEEK,	0
	JMS	RZCHKH		/CHECK HALT			/A026
	TAD	RZ50SW		/IS RX50?			/A022
	SNA CLA							/A022
	JMP	RZSEK1		/NO SET RETURN +1		/A022
	TAD	RZECTR		/ERROR COUNT			/A023
	TAD	KON10		/1ST TIME			/A023
	SNA							/A023
	JMP	RZSEK1		/YES INITIALIZE			/A023
	TAD	MIN4						/A023
	SMA CLA			/G.T. THAN 4 TIMES		/A023
	TAD 	KON79		/YES SEEK TRACK 79		/A023
	DCA	RZSEKT		/IF NO SEEK TRACK 0		/A023
	TAD	RZCMND		/LOAD COMMAND			/A022
	AND	KON20		/MASK DRIVE BIT			/A022
	TAD	KON406		/DENSITY AND READ		/A022
	RXILCD			/LOAD COMMAND			/M033
	CLA IAC			/=1 (SECTOR)			/A022
	RXISTR			/TRANSFER READY?		/M033
	JMP	.-1		/NO				/A022
	RXIXDR			/YES --TRANSFER			/M033
	CLA			/CLEAR SECTOR			/A023
	TAD	RZSEKT		/GET TRACK NO			/C023
	RXISTR			/TRANSFER READY?		/M033
	JMP	.-1		/NO				/A022
	RXIXDR			/YES --TRANSFER			/M033
	RXISDN			/DONE?				/M033
	JMP	.-1		/NO				/A022
	RXISER			/ERR?				/M033
	JMP	RZSEK2		/NO   				/A022
RZSEK1,	ISZ	RZSEEK		/YES INIT ANYWAY		/A022
RZSEK2,	CLA							/A022
	JMP I	RZSEEK						/A022
/
/
/	SET CODE FOR RX01 OR RX02(50) TYPE DEVICE		/A024
/	0=RX01 10=RX02 2=RX50					/A024
RZSETX,	0							/A024
	MQL		/SAVE CODE				/A024
	TAD	RZDRIV	/GET DRIVE				/A024
	AND 	KON07	/MASK NUMBER				/A024
	TAD	TBLPTR	/GET POINTER TO TABLE +OFFSET		/A024
	DCA	USEPTR	/USER POINTER				/A024
	MQA		/GET SWITCH				/A024
	DCA I	USEPTR	/STORE IT				/A024
	JMP I	RZSETX						/A024
/
/
/	THIS ROUTINE IS CALLED DURING THE ERROR RETRY PROCESS	/A026
/	IS CHECKS TO SEE IF THE DEVICE IS AN RX50 IN WRITE	/A026
/	PROTECT MODE.						/A026
/
CKWPRO,	0							/A026
	TAD	RZ50SW		/IS A 50			/A026
	SNA CLA							/A026
	JMP	CHKRET		/NO RETURN			/A026
	TAD	RZCMND		/GET FUNCTION CODE READ		/A026
	AND	KON12	/IS=WRITE 				/A026
	SZA CLA							/A026
	JMP	CHKRET		/NO EXIT			/A026
	TAD	RZSTAT		/GET STATUS			/A026
	AND	KON10		/WRITE BIT			/A026
	SNA CLA			/IS WRITE PROTECT		/A026
CHKRET,	ISZ	CKWPRO		/NO 				/A026
	JMP I	CKWPRO		/RET				/A026
/
/
/
USEPTR,	0	/USED TO SAVE POINTER TO CURRENT DEVICE	/A024
TBLPTR,	DEVTBL		/POINTER TO DEVICE TABLE		/A024
/	TABLE USED TO SAVE DEVICE TYPE 0=RX01 10=RX02/RX50	/A024
/	ALLOWS MIX OF RX01,RX02 AND RX50'S			/A024
DEVTBL,	0;0;0;0;0;0;0;0						/A024
	IFDEF	WINNIE	<
	0;0							/A032
			>	/END IFDEF WINNIE		/A032
KON406,	406							/A022
KON79,	117			/79.				/C023
KON12,	12					/A026
KON10,	10						/A023
KON07,	7	/DRIVE NUMBER MASK			/A024
MIN4,	-4							/A023
RZSEKT,	0			/TRACK NO.			/A023

/ m050 the following is moved here to get it out of the startup
/ m050 feild which is now overwritten by the 8 bit fallback routine

	IFDEF	WINNIE	<
/RDGTST ROUTINE GETS STATUS OF LAST BLOCK READ			/A042
/    AND RETURNS IN WORD 1    BIT 5--1IF PHYSICAL CYLNDER 0	/A042
/			      BIT 6--IF WRITE FAULT LAST DSK OP	/A042
/			      BIT 7--IF SELECTED UNIT DEFINED	/A052
/			      BIT 8--UNDEFINED			/A042
/			      BIT 9--IF SEEK COMPLETE		/A042
/			      BIT10--IF UNIT 1 SELECTED		/A042
/			      BIT11--IF UNIT 0 SELECTED		/A042
/
/		    WORD 2         =CYLINDER NUMBER		/A042
/		    WORD 4	   =SECTOR NUMBER		/A042
/		    WORD 5	   =CONTROLLER VERSION NUMBER	/A042
/
RDGTST,								/A042
	DCA	RDEFSW		/SET EMPTY SW				/A042
	TAD	(WINSTA		/GET STATUS FUNCTION CODE		/A042
	JMP	RDRZXT		/DO IT					/A042
			>	/END IFDEF WINNIE				/A042

				PAGE
				EJECT

/
/FOLLOWING CODE MOVED HERE TO PUT AT MORE STABLE LOCATION FOR DATE/TIME
/AS THE LAST LOCATION IS REFERENCED AS LOCATION THAT UNIT NUMBER IS
/PASSED TO VERIFY ON ERROR AND FORCED RESTART.
/
/*******MOVED VER 046 *****
/
/
/
/
/GETTIM SAVTIM USED ONLY DURING STARTUP
/  Reference in WPF1 to SVFVFY=6600
SVFVFY=6600			/REFERENCED IN WPF1		/A046
/
/CMNDBF USED FOR WINNIE
/
GETTIM,		/LOCATION WHERE TIME IS STORED
SAVTIM,			/    "      "     "   "   "
CMNDBF=.				/COMMAND BUFFER		/A032
WRD1=CMNDBF			/1ST WORD			/A032
WRD2=WRD1+1			/2ND WORD			/A032
WRD3=WRD2+1			/3RD WORD			/A032
	0;0;0;0;0;0;0;0;0;0;0;0
TIMLNT,	SAVTIM+1+2-.		/LENGTH OF TIME FIELD	/A032/C046	/C047
				/......LAST LOCATION NOW USED TO PASS PARAMETER
				/......FROM ACP TO VERIFY DURING WARM START
/D046	7401		/THIS LOC=7401 NECESSARY FOR BLOCK 6 ON DOC DISKETTE
/D046	0
/---------------------------------------------------------------------
/
/************************ SET BUFFER DATA FIELD **********************
/
/---------------------------------------------------------------------
RZSETB,	0
RZSETD,	JMS	RZSETA		/SET ALL CDFS FOR BUFFER REFERENCES
RZSETS,	RZ1SET
	RZ2SET
	RZ3SET
	RZ4SET
	RZ5SET
		0		/END TABLE			/A032
	JMP I	RZSETB		/RET				/A032
/
RZSETA,	0
RZSETL,
	TAD I	RZSETA		/GET MEMBER IN LIST
	SNA			/END TABLE?			/A032
	JMP 	RZSETC						/A032
	DCA	RZSETT		/TEMP STORE
	TAD	RZBCDF		/BUFFER CDF POINTER
	DCA I	RZSETT		/STORE
	ISZ	RZSETA						/A032
	JMP	RZSETL		/NO
RZSETC,	ISZ	RZSETA					/A032
	JMP I	RZSETA						/A032
RZSETT,	0		/TEMP STOREAGE
			SIZE=.-RZSETB
/


/--------------------------------------------------------------------
/
/			THIS ROUTINE SETS THE VERIFY SW 	/A015
/		AC=0 LOGIO UPON ENTRY ELSE PHYSIO		/A015
/	FOR LOGIO	JMP IS STORED IN RZVJMP			/A015
/	FOR READ PHYSIO NOP IS STORED IN RZVJMP			/A015
/	FOR OTHER PHYSIO JMP IS STORED IN RZVJMP		/A015
/
/_______________________________________________________________/A015

DVSET,	0							/A015
/D032	MQL			/SAVE SW			/A015
	CLA CLL CML RTR		/=2000				/A015
	AND	RZXDIR		/MASK VERIFY BIT		/A015
	DCA	RZXVFY		/SET VERIFY SWITCH		/A015
	CLA CLL CML RTR		/2000				/A015
	CMA			/SET TO CLEAR SWITCH IN RZXDIR	/A015
	AND	RZXDIR						/A015
	DCA	RZXDIR						/A015
	TAD	RZXVFY						/A015
	SNA CLA			/VERIFY MODE?			/A015
	JMP	DVSNOP		/SET NOP			/A015
	TAD	RZXDIR		/GET CMND			/A015
	AND	(16		/MASK FNCTION BITS		/A015
	CIA							/A015
	TAD	(2		/READ FUNCTION CODE		/A015
	SZA CLA			/IS READ?			/A015
	JMP	DVSNOP		/NO				/A015
	TAD	(NOP						/A015
	SKP			/STORE				/A015
DVSNOP,	TAD	RZVSKP		/SKIP VERIFY			/A015
	DCA	RZVJMP		/SET IT				/A015
	JMP I	DVSET						/A015
/*********************************************************************
/
/--------------------ERROR ROUTINES-------------------------------------
/----------------THESE ROUTINES HANDLE ALL I/O ERRORS-------------------
/---------------- WHEN CALLED THE AC CONTAINS THE ERROR-----------------
/-----------------STATUS REGISTER, WHILE THE MQ CONTAINS THE------------
/-----------------GENERAL STATUS REGISTER. ERROR ROUTINES---------------
/----------------- 1 THRU 6 SET THE H/O BIT(BIT0) TO 1------------------
/----------------- AND SETS BITS 1-3 TO 001--110 FOR -------------------
/----------------- ERRORS 1-6 RESPECTIVELY.-----------------------------
/
/***********************************************************************
RZERR6,
	ISZ 	RZECTR		/INCR ERROR STATUS
	JMP	RZPHIO		/RETRY 10 TIMES PHYSICAL I/O
	ISZ	RZSAV1		/BITS 9-11 =6-PHYS IO ERROR
RZERR5,	ISZ	RZSAV1		/BITS 9-11 =5-NOT READY
RZERR4,	ISZ	RZSAV1		/BITS 9-11 =4-ILLEGAL TR
RZERR3,	ISZ	RZSAV1		/BITS 9-11 =3-ILLEGAL DONE
RZERR2,	ISZ	RZSAV1		/BITS 9-11 =2-ERROR RET
RZERR1,	ISZ	RZSAV1		/BITS 9-11 =1ERR LD CMND
	CLA
RZERR0,							/M029
	TAD	RZSAV1
	BSW			/SET BITS1-3 = 000 THRU 110
	CLL RTL
	TAD	RZSTAT		/GET STATUS IN L/O BITS 5-11	/C010
	TAD	RZ4000		/ERROR BIT
	DCA	RZSAV2		/SAVE TEMP
	DCA	RZSAV1		/CLEAR COUNT FOR NEXT TIME
	TAD	RZSAV2		/GET ERR CODE
	JMP 	RZEXIT		/EXIT RETURN
RZ4000,	4000
RZSAV1,	0
RZSAV2,	0
	EJECT
/*****************************************************
/		CHECK FOR GOLD HALT DURING ERROR RETRY/A026	/M032
/		IF SET RETURN RZERR0 WITH NO MORE RETRIES/A026
/
/************************************************************** /A026
RZCHKH,	0					/A026	/M032
	CDFSYS					/A026	/M032
	TAD I	HLTFLG	/GET HALT FLAG		/A026	/M032
	CDFSYS					/A026	/M032	/M033
	SNA CLA		/IS SET?		/A026	/M032
	JMP I	RZCHKH	/NO...NORMAL RETURN	/A026	/M032
/YES ERROR RETURN WITH 4000 BITS IN ACC AND REG STATUS IN L/O 8 BITS/A026
	JMP	RZERR0			/A026	/M032
/
/
/
RZDELY,	ISZ	RZDLCT		/DONE?				/A022/M032
	JMP	RZIO10		/NO CHECK DONE FLAG		/A022/M032
	ISZ	RZDLC2		/OUTSIDE LOOP TOTAL APPROX 5 SEC/A023/M032
	JMP	RZIO10		/NO CHECK DONE FLAG		/A023/M032
	JMP	RZERR5		/TIME OUT ERR. DEVICE NO PRESENT/A022/M032
/***************************************************************
/
/------------ SET UP POINTERS AND FIELD CDF'S
/		BOTH FIELDS= FIELD 0
/
/****************************************************************
SETMOV,	0		/SET UP MOVE PARAMS
	TAD I	SETMOV
	ISZ	SETMOV
	DCA	INBUF	/FROM FIELD PTR
	TAD I	SETMOV
	ISZ	SETMOV
	DCA	OUTBUF	/TO FIELD PTR
	TAD	TIMLNT				/LENGTH OF TIME FIELD	/A032
	DCA	MOVCNT	/COUNTER
/D032MOVDAT,	0		/MOVE DATA FROM ONE FIELD TO ANOTHER
INCDF,									/M032
	TAD I	INBUF						/M032
	DCA I	OUTBUF							/M032
	ISZ	INBUF							/M032
	ISZ	OUTBUF	/SET TO NEXT WORD				/M032
	ISZ	MOVCNT	/DONE?						/M032
	JMP	INCDF	/NO						/M032
/D032	JMP I	MOVDAT	/YES
/D032	JMS	MOVDAT	/MOVE DATA
	JMP I	SETMOV
/
/
INBUF,	0		/INPUT BUFFER ADDR
OUTBUF,	0			/OUTPUT  "     "
MOVCNT,	0			/WORD COUNT
/SPACE WARS MOVE VERSION 034
/
/
/--------------------------------------------------------------------/A015/M034
/
/		RZVERF USED ONLY IF VERIFY BIT ADVERSILY SET	/A015	/M034
/		DURING LOGIO READ				/A015	/M034
/		MAY BE ABLE TO DELETE THIS ROUTINE
/_____________________________________________________________________/A015/M034
RZVERF,	0			/NECESSARY BECAUSE OF WAY CMNDS EXEC..
	DCA	RZXVFY		/CLEAR IF SET			/A015	/M034
	JMP I	RZERR2		/ERROR ILLEGAL CODE  EXIT DRIVER./M032/C034
/
			PAGE
			EJECT

DMESS,
	7401		/THIS LOC=7401 NECESSARY FOR BLOCK 6 ON DOC DISKETTE
	CLA;TAD I DMESSP		/OUTPUT MESSAGE
	BSW								/A034
	JMS	PRINTM
	TAD I	DMESSP			/SAME WORD			/A034
	JMS	PRINTM			/PRINT L/O BYTE			/A034
	ISZ	DMESSP							/A034
	JMP	DMESS			/NEXT				/A034
/
PRINTM,	0								/A034
	AND	K77							/A034
	SNA				/END OF TABLE?			/A034
	JMP	.			/YES				/A034
	BSW								/A034
	SMA				/SPECIAL CHAR			/A034
	IAC								/A034
	BSW								/A034
	TAD	M77							/A034
	SNA								/A034
	TAD	K44							/A034
	TAD	K77							/A034
	TLS								/A034
PRINTN,	TSF								/A034
	JMP	PRINTN							/A034
	CLA								/A034
	JMP I	PRINTM							/A034
K77,	77								/A034
M77,	-77								/A034
K44,	33-77								/A034
/************************************************************
/		THE FOLLOWING IS THE RESULT OF THE OLD
/			SPACE WARS GAME
/**************************************************************
/
/
	IFDEF	WINNIE	<
/
/
/ENTRIES IN DRIVE TABLE =
/				0  =  SINGLE DENSITY OR NO ENTRY	/A034
/			      400  =  DOUBLE DENSITY RX02		/A034
/			     1400  =  -------------- RX50		/A034
/			     4000  =  WINNIE DEVICE			/A034
/			     4001  =  MOUNTED WINNIE			/A034
/
CHKWIN,
	CLA IAC			/				/A032
	RDNOOP			/CHECK WINNIE ON LINE		/A032
	SZA CLA			/0=WINNIE ON LINE		/A032
	JMP	NOWINI		/NO				/A032
YSWINI,
	TAD	DENDV0		/ADDRESS OF DEV 0 IN ACP DEV TABLE	/A034
	TAD	RZDRIV		/OFFSET FOR DRIVE
	DCA	DVPACK		/TEMP LOCATION				/A034
	CDFACP			/ACP FIELD				/A034
	TAD I	DVPACK		/GET CODE				/A034
	CDFDSK			/DRIVER FIELD				/A034
	RAL			/WINNIE BIT TO LINK			/A034
	SNL			/IS WINNIE DEVICE?			/A034
	JMP	NOWNCL		/NOT A WINNIE				/A034
	SNA CLA			/IS WINNIE MOUNTED			/A034
	JMP	RZERR2		/NO--SET DENSITY ERROR			/A034
	CLA CLL IAC RTL		/4=WINNIE REFERENCE		/A032
	JMP 	RZSETF		/SET DENSITY			/A032
NOWNCL,	CLA								/A034
	JMP	NOWINI		/NOT A WINNIE			/A034
			>	/END IFDEF WINNIE			/A032
/
/------------------------------------------------------------/A015
/								/A015
/	VERIFY ROUTINES ...CALLED WITH BIT 1 SET DURING		/A015
/		           LOGICAL WRITE   AND PHYSICAL READ 	/A015
/
/		PHYSICAL READ WITH VERIFY=COMPARE BUFFER TO SILO/A015
/		(SHOULD ONLY BE USED AFTER PHYSICAL WRITE	/A015
/		LOGICAL WRITE WITH VERIFY=READ AFTER WRITE	/A015
/					  WITHOUT SILO EMPTY	/A015
/		LOGICAL READ 12 BIT MODE =READ  COMPARES BUFFER	/A024
/					  TO SILO		/A024
/
/---------------------------------------------------------------/A015
/

DVPACK,	0		/VERIFY LOGG WRITE 8 BIT MODE		/A015
	JMS	DXPACK	/WRITE					/A015
	CLA CLL CMA  RTL	/-3				/A015
	JMS	DVVFY		/READ NO EMPTY SILO		/A015
	JMP I	DVPACK		/RETURN				/A015
/

DVVFY,	0							/A015
	DCA	DVBCTR		/SET SECTOR COUNT		/A015
	TAD	RZCSEC		/SET LOG SECTOR			/A015
	DCA 	RZLSEC						/A015
	JMS	DVSETR		/SET READ LOGICAL SECTOR AND COMMAND/A015
	JMS	RZDIVD		/SET SECTOR FOR I/O		/A015
DVVFY2,	JMS	RZPHYS		/DO IT				/A015
	ISZ	DVBCTR		/DONE?				/A015
	JMP	DVVFY2		/NO				/A015
	JMS	DVSETW		/RESET CMND FOR WRITE		/A015
	JMP I	DVVFY						/A015
DVBCTR,	0		/SAVE TEMP SECTORR COUNT	/A015
/


DVWRIT,	0			/WRITE 12 BIT WITH VERIFY/A015
	JMS	DYWRIT			/WRITE IT		/A015
	TAD 	RZ50SW			/RX50 SET?		/A018
	SNA CLA							/A018
	TAD	M1			/-1			/A018
	TAD	M1			/-1....-1 RX50  -2 RX01/2/A018
	JMS	DVVFY						/A015
	JMP I	DVWRIT						/A015
M1,	-1			/CONST				/A018
/******************************************************************/M032/M036
/----------------- CHECK ZERO BLK COUNT FOR LOGIO-------------------/M032/M036
/-----------------     SET -1  IF TRUE-----------------------------/M032/M036
/*****************************************************************/M032/M036
BLKSET,	0						/A036
	TAD	RZBCTR			/LOG IO = BLOCK COUNT/M032/M036
	SNA				/=0		/M032/M036
	CMA				/YES SET NEG	/M032/M036
	DCA	RZBCNT			/RESET		/M032/M036/C045
/******SPACE WARS MOVE*****TO LOAD LO BLOCK NUM FOR WINNIE	/A037
	IFDEF	WINNIE	<
	TAD	RZBLKN		/GET BLOCK NUMBER		/M037
	DCA	LOBLK		/SAVE L/O			/M037
			>	/END IFDEF WINNIE		/A037
	JMP I	BLKSET						/A036
RZBCNT,	0	/#BLOCKS TO BE PROCESSED		/A045
/---------------------------------------------------------------------
/
/		END SPACE WARS
/************************************************************
/	
/	SET4 USED TO SET ALL REFERENCES TO 0 AS DRIVE 4
/
	IFDEF	LOAD4	<
SET4,	0						/A027
	TAD	RZDRIV					/GET DRIVE NO
	SNA			/IS=0			/A027
	CLA CLL IAC RTL		/YES SET TO 4		/A027
	DCA	RZDRIV					/A027
	CLA CLL IAC RTL		/SET 4			/A027
	AND	RZDRIV		/MASK PAIR		/A027
	JMP I	SET4		/RETURN			/A027
DMESSP,	.+1						/A039
	TEXT	/?[2J?[5H SYS DSK IN DRV 0 AND RSTRT./	/A039
			>	/END IFDEF LOAD4	/A027

	IFNDEF	LOAD4	<
DMESSP,	.+1
/D034	200
/D034	ESC; "[; "H
/D034	ESC; "[; "J
/D034	LF;LF;LF;LF;LF			/DOWN FIVE LINES
IFDEF ENGLSH <
	TEXT	/![[2J![[5HPUT SYSTEM DISKETTE IN DRIVE 0 AND RESTART/ /M051C045
>
IFDEF SPANISH <
	TEXT	/![[2J![[5HCOLOQUE EL SISTEMA DSK EN UNIDAD 0 Y ARRAN./ /M051C045
>
IFDEF ITALIAN <
	TEXT    /![[2J![[5H INSERIRE IL DISCO SISTEMA E RIPARTIRE./>
IFDEF FRENCH <
	TEXT	/?[2J?5H PLACE SYSTEM DISKETTE IN DRIVE 0 AND RESTART./ /C037
>
IFDEF GERMAN <
	TEXT	/?[2J?5H MIT SYSTEM DISKETTE IM LINKEN LAUFWERK STARTEN./ /C037
>
IFDEF DUTCH <
	TEXT	/?[2J?5H ZET SYSTEEMDISKETTE IN 0 EN OPNIEUW./ /C037
>
/D037	0			/ 0 SIGNIFIES END OF MESSAGE TO OUTPUT

			>	/END IFNDEF LOAD4		/A039
PAGE
		EJECT
  IFNDEF WINNIE	< ZBLOCK 400 >	/ LEAVE 2 PGS OF FILLER FOR NON-WINNIE	/A041

/
  IFDEF WINNIE	<

/
/COMMAND CODES
WINMNT=CLA		/0=MOUNT VOLUME
WINSTB=CLA CLL IAC		/1=SET BLOCK
WINFIL=CLA CLL IAC RAL		/2=FILL BUFFER
WINWRT=CLA CLL CML IAC RAL		/3=WRITE
WINRD=CLA CLL IAC RTL			/4=READ
WINDIS=5		/5=DISMOUNT VOLUME
WINUPD=CLA CLL CML IAC RTL	/6=UPDATE VOLUME
WINEMT=25		/EMPTY BUFFER
WINSTA=26		/26=READ STATUS
WINERS=27		/27=READ ERROR STATUS
WINVOL=30		/30=GET VOLUME DATA
WINDIR=33		/33=GET VOLUME DIRECTORY
/
/	TRANSFER COMMAND + 1 FOR DONE FOR COUNTS
/
SETCNT=4		/SET BLOCK COUNT
DISCNT=2		/DISMOUNT COUNT
MNTCNT=12		/MOUNT COUNT
/************************************************************
RDNOSW,	0	
	RDSC		/SPACE SAVER TO HERE		/A032
RNOSW,	RDSR		/TRNSFER READY
	JMP	RNOXD	/NO CHECK DONE
	JMP	TRNERR	/TRANSFER READY ILLEGAL
RNOXD,	RDSD		/DONE?
	JMP	RDOSWQ					/A032
/
	RDSE		/ERROR?
	JMP I	RDNOSW					/A026
	JMP	TRNERR	/PROCESS ERROR
RDOSWQ,	CLA		/OVERLAYED WITH JSWAP
	JMP	RNOSW					/A032
/*********************************************************
/
/
/COMES HERE IF A WINNIE
/
ISAWIN,
	CLL RAL			/RESET WITHOUT WINNIE BIT	/A032
	DCA	RZXDIR						/A032
	JMS	BLKSET		/SET BLK CNT			/A036
	JMS	DVSET		/SET VERIFY BIT			/A032
	TAD	RZBPTR
	DCA	RDBUFO		/SET BUFFER POINTER
/
	CLA IAC BSW		/100=MODE SW			/A032
	AND	RZXDIR						/A032
	DCA	RDMODE		/SET MODE SW			/A032
RDONXT,							/A036
	JMS	RZSETA					/M037
	RD1SET						/M037
	RD2SET						/M037
	RD3SET
	RD4SET						/M037
/D037	RD5SET
	0		/TERMINATOR			/M037
	TAD	RZXDIR						/A032
	JMS	RZXJMP		/JMP SUB			/A032
	RDWRIT			/-2=WRITE A BLK			/A032
	RDREAD			/-4=READ				/A032
	RDMNT			/-6=MOUNT VOLUME
	RDSMNT			/-10DISMOUNT VOLUME
	RDVOL			/-12=GET VOLUME DATA
	RDDIR			/-14=GET VOLUME DIRECTORY
	RDUPD			/-16=UPDATE VOLUME	/A037
	RDGTST			/-20=GET STATUS			/A042
/
/
/WRITE A RECORD
/
RDWRIT,
	JMS	WINSET		/SET UP BLOCK AND STRT PARAMS ADDR
	CLA IAC
	DCA	RDEFSW		/SET FILL SW
	WINFIL		/SET UP FILL BUF CMND
	JMS	RDCMPT		/FILL BUFFER
	WINWRT		/SET UP WRITE
	JMS	RDNOSW		/CHECK DONE AND SWAP IF NOT	/A032
	TAD	RZXVFY		/VERIFY MODE?
	SNA CLA		/SKIP TO RDREAD	
	JMP 	RDRD1		/XIT				/C036
/
/
/READ A RECORD
/
	TAD	RZBPTR
	DCA	RDBUFO		/SET BUFFER POINTER
RDREAD,						/M036
	JMS	WINSET		/SET UP BLOCK
	WINRD		/SET UP READ CMND
	JMS	RDNOSW		/CHECK DONE AND SWAP IF NOT	/A032
	DCA	RDEFSW		/CLEAR EMPTY SW
	TAD	(WINEMT		/SET UP EMPTY BUFFER
	JMS	RDCMPT	/FILL OR EMPTY SILO		/A032
RDRD1,
	ISZ	LOBLK		/NEXT BLOCK			/A036
	ISZ	RZBCNT		/DONE?				/A036	/C045
	JMP	RDONXT		/NO DO NEXT			/A036
	JMP	RZEXIT		/YES EXIT			/A036
/
/************************************************************
/
/READ DENSITY FOR WINNIE RETURNS -1 FOR DEVICES
/     0-15
//
/RDDEN,
/	CLA CLL IAC RTL		/4RETURN 4 FOR DEV 0-15 WHEN WINNIE ON LINE
/	JMP	RZEXIT	/EXIT
/
/
/RD LOAD FUNCTION
/
/RDLDCMND,	0
/	TAD	RDCMND		/GET COMMAND
/	RDSC			/SEND COMMAND
/	JMS	RDXFER		/CHECK DONE,TR RDY, ERROR?
/	JMP I	RDLDCMND	/TR READY RET
/	ISZ	RDLDCMND	/DONE RET
/	ISZ	RDLDCMND	/ERROR RET
/	JMP I	RDLDCMND	/RET


/
/
/
/RDXFER     USED TO CHECK AND RETURN
/           CALL+1 = TR READY
/	    CALL+2 = DONE
/	    CALL+3 = ERROR
/
RDXFER,	0
RDXFRA,
	RDSR		/SKIP TR READY
	SKP
	JMP I	RDXFER	/TR READY
	RDSD		/SKIP IF DONE FLAG SET
	JMP	RDXFRA	/CHECK TR READY
	ISZ	RDXFER	/SET RET
	RDSE		/SKIP ERROR
	JMP I	RDXFER	/DONE RET
	ISZ	RDXFER	/SET ERROR  RET
	JMP I	RDXFER
/
/
/SET COMMAND
/
/WINCMD,	0
/	TAD I	WINCMD		/GET CODE
/	ISZ	WINCMD		/SET RETURN
/	DCA	RDCMND
/	TAD	RDCMND
/	RDSC			/SEND COMMAND
/	JMP I	WINCMD
/
/MOUNT COMMAND
/	MOUNT VOLUME COMMAND
/		MOUNTS THE VOLUME REFERENCED IN RZBPTR IN DATA FIELD
/				  REFERENCED BY RXBCDF TO DRIVE IN RZDRIV
/
RDMNT,
	JMS	MOVPAR		/MOVE PARAMETERS TO DRIVE FIELD
	TAD	(-MNTCNT		/WORD COUNT
	JMS	SVSPCE		/SET UP 		/A032
	TAD	WRD1
	TAD	(300		/ALLOW READ WRITE BITS (5&6)
	DCA	WRD1		/INTO TABLE
	WINMNT			/MOUNT COMMAND
	JMP	RDTRLP		/TRANSFER LOOP THEN EXIT
/
/DISMOUNT COMMAND
/	DISMOUNT VOLUME ASSOC WITH DRIVE # IN RXDRIV
/
RDSMNT,
	CLA CLL CMA RAL			/-2 DISMNT COUNT
	JMS	SVSPCE		/SET UP 		/A032
	TAD	(WINDIS			/DISMOUNT CODE
RDTRLP,
	JMS	TRLOOP		/TRANSFER
	JMP 	RZEXIT		/XIT
/
SVSPCE,	0
	DCA	RDCNT
	TAD	(CMNDBF	
	DCA	WINPTR		/SET IT
	TAD	WINFLD
	DCA	RD1SET		/SET UP FIELD PTR
	TAD	RZDRIV		/GET DRIVE #
	AND	(37		/L/O 4 BITS			/C035
	DCA	WRD1
	JMP I	SVSPCE
/
/READ VOLUME DATA
/
RDVOL,
	JMS	WINSET		/SET BLOCK DEFAULTS TO BLOCK IN RZBLKN
	DCA	RDEFSW		/SET EMPTY SW
	TAD	(WINVOL		/COMMAND
	JMP	RDRZXT		/EMPTY AND EXIT
		PAGE
		EJECT
/
/UPDATE VOLUME DATA
/
RDUPD,			/UPDATE VOLUME DATA	/A037
	CLA CMA			/-1			/A037
	DCA	RDEFSW		/SET SW			/A037
	WINUPD			/6=CMND CODE		/A037
	JMP	RDRZXT		/DO IT 			/A037
/
/
/READ DISK DIRECTORIES
/
RDDIR,
	DCA	RDEFSW		/SET EMPTY SW
	TAD	(WINDIR		/READ DIR COMMAND
RDRZXT,
	JMS	RDCMPT		/EMPTY OR FILL
	JMP	RZEXIT
/
/MOVE PARAMETERS FROM DATA FIELD IN RZBCDF TO WIN FIELD
/
MOVPAR,	0
	TAD	(-10		/COUNT
	DCA	RDCNT		
	TAD	RZBPTR
	DCA	MVPTR2		/BUFFER POINTER
	TAD	(CMNDBF+1	
	DCA	MVPTR3
RD4SET,	CDFSYS								/M033
	TAD I	MVPTR2
	CDFSYS								/M033
	DCA I	MVPTR3
	ISZ	MVPTR2
	ISZ	MVPTR3
	ISZ	RDCNT
	JMP	RD4SET		/NOT DONE
	JMP I	MOVPAR		/DONE
MVPTR2,	0
MVPTR3,	0
/
/
/
/
/SET BLOCK FUNCTION
/
WINSET,	0
	TAD	(-4
	JMS	SVSPCE		/SET UP 		/A032
	TAD	LOBLK		/LO ORDER
	DCA	WRD2
	TAD	HOBLK		/HI ORDER BLOCK NO
	DCA	WRD3
	WINSTB			/SET BLOCK CMND
	JMS	TRLOOP		/TRANSFER
	JMP I	WINSET
/
WINFLD,	CDFSYS								/M033
/
/EMPTY BUFFER COMMAND SET UP
/
/
/
/TRLOOP  WILL SEND REMAINING TRANSFERS BASED ON RDCNT
TRLOOP,	0
	RDSC		/SEND IT
TRNCHK,
	JMS	RDXFER		/CHECK DONE
	JMP	TRANOK		/TR RDY
	ISZ	RDCNT		/IS DONE--WAS LAST TR?
	JMP	TRNERR		/TRANSFER ERROR
	JMP I	TRLOOP		/OK
TRANOK,
RD1SET,	CDFSYS								/M033
	TAD I	WINPTR		/GET WORD TO BE TRANSFERED
	CDFSYS								/M033
	RDTD			/TRANSFER IT
	ISZ	WINPTR
	ISZ	RDCNT
	JMP	TRNCHK		/MORE TO TRANS
	JMP	TRNERR		/PREMATURE END
/
/
/EMPTY BUFFER ROUTINE
/		AFTER READ
/
/******DON'T FORGET CDF'S*********
/
RDCMPT,	0
	TAD	RDMODE		/8 OR 12 BIT MODE
	RDSC			/SEND IT
RDCNXA,
	JMS	RDXFER
	JMP	RDCNXT	/NEXT CHAR
	JMP I	RDCMPT		/DONE
	JMP	RDERROR
RDCNXT,	TAD	RDEFSW		/EMPTY OR FILL BUFFER SW
	SPA
	JMP	RDCUPT			/UPDATE SPECIAL CASE
	SNA CLA
	JMP	RDDNXT			/EMPTY
	JMS	RDADDC		/ADD CHAR FROM RDBUF0		/C037
	RDTD		/SEND DATA
	JMP	RDCCNT	/CONTINUE
RDDNXT,
	TAD	RZXVFY		/VERIFY SW
	SNA CLA			/VERIFY MODE?
	JMP	RDENXT		/NO EMPTY SILO
	RDTD			/READ CHAR
	CIA			/TWO'S COMP.
	JMS	RDADDC		/ADD CHAR FROM RDBUF0		/C037
	SNA CLA			/COMPARE =
	JMP	RDCCNT		/YES
	JMP	TRNERR		/NO****MUST SET TO CLEAR ALL TR FLAGS*****
RDENXT,
	RDTD		/RECIEVE DATA
RD2SET,	CDFSYS								/M033
	DCA I	RDBUFO	/GET CHAR
	CDFSYS	
RDCCNT,
	ISZ	RDBUFO
	NOP		/FOR WRAP AROUND BUFFER
	JMP	RDCNXA		/FOR FIELD LOOP

RDCUPT,
	CLA IAC
	DCA	RDEFSW		/SWITCH ONLY TO TRANSFER DEVICE NUM
	TAD	RZDRIV
	AND	(17
	RDTD			/TRANSFER DEV NUM
	JMP	RDCNXA		/CONTINUE
/
/
/
RDADDC,	0	/ADD CHAR FROM RDBUF0		/A037
RD3SET,	CDFSYS								/M033
	TAD I	RDBUFO	/GET CHAR
	CDFSYS								/M033
	JMP I	RDADDC	/RET				/A037
/
/
RDEFSW,	0		/EMPTY/FILL SW
/
/FILL BUFFER ROUTINE
/	BEFORE WRITE
/
/******DON'T FORGET CDF'S*********
/
/RDFMPT,	0
/	TAD	RZBPTR	/REALLY NEED THIS????
/	DCA	RDBUFO
/RDFNXA,
/	JMS	RDXFER
/	JMP	RDFNXT	/NEXT CHAR
/	JMP I	RDFMPT
/	JMP	RDERROR
/RDFNXT,
/RD3SET,	CDFSYS							/M033
/	TAD I	RDBUFO	/GET CHAR
/	CDFSYS								/M033
/	RDTD		/SEND DATA
/	ISZ	RDBUFO
/	JMP	RDFNXA
/
/RDDSTY,
/	JMS	WINCMD
/	WINSTA		/GET STATUS
/	RDTD			/GET IT
/	JMP	RZEXIT		/EXIT
/
/
/
/RDERROR/WRTERROR
/
/RDERROR,
/WRTERROR,
/	JMS	WINCMD
/	WINSTA		/GET ERROR STATUS
/	RDTD			/GET IT
/	TAD	(4000		/ADD ERROR BIT
/	JMP	RZEXIT
/
/TRANSFER ERROR= DONE OR TR FLAG OUT OF SEQ
/*****MUST GET ALL 4 WORDS****CHANGE WINSTA
/
RDERROR,
WRTERROR,
TRNERR,
	CLA CLL CMA RAL		/-2 WORD COUNT+1
	DCA	RDCNT
	TAD	(CMNDBF		/PNTR
	DCA	WINPTR
	TAD	WINFLD		/FIELD
	DCA	RD1SET
	TAD	(WINERS		/GET STATUS
	JMS	TRLOOP		/GET STATUS
	TAD	WRD1		/GET IT
	TAD	(6000		/2 H/O BITS FOR RD ERROR SYTATUS NOTATION
	JMP	RZEXIT
/
/ RETRY RESET
/CAN BE DELETED FOR ROOM.. NOT USED CURRENTLY.. TO BE USED IF WANT INCREASE
/ IN RETRY COUNT.   NOT REALLY NECESSARY
/
/
/WINRTR,	0
/	CLA CLL CMA RAL		/-2
/	DCA	RDCNT
/	TAD	(13	
/	DCA	RDCMND		/SET COMMAND
/	TAD	(10
/	DCA	WRD1
/	JMP I	WINRTR
/
HOBLK,	0	/STOREAGE OF THE H/O BLK FOR I/O
LOBLK,	0	/STOREAGE OF THE L/O BLK FOR I/O
WINPTR,	0	/TEMP POINTER AREA
RDMODE,	0	/MODE BIT FOR WINNIE I/O
RDBUFO,	0	/POINTER TO BUFFER AREA FOR WINNIE
RDCNT,	0			/TRANSFER COUNT
/ moved here in edit							/a050
DENDV0,	5601		/ADDRESS OF DENSITY SW FOR DRIVE0 (ACPLDP+1)	/M033
/RDCMND,	0			/COMMAND
		PAGE
			>	/END IFDEF WINNIE	/A032
		EJECT


/***********************************************************************/a050	
/ WARNING ----								/a050
/		V25STB defines the address of the table STBLK in WPF1	/a050
/		Do not change this code without checking that this still holds/a050
/		If you do change it then reassemble WPRINT as it modifies/a050
/		the table. Messy isn't IT!!!!				/a050
/***********************************************************************/a050

/******************************************************************
/
/
/         THIS CODE IS USED TO LOAD FIELDS 0,1,2
/		THEN MOVES PAGE 0 FIELD 2 TO PAGE 0
/		THIS FIELD
/         IT CALLED BY THE BOOT ROUTINE IN BLOCK 0
/
/         IT CALLS THE RX02 HANDLER TO EXECUTE TO APPROPRIATE
/	    IO INSTRUCTIONS THE JMPS TO 7600 IN FIELD  0
/		WHICH IS THE START ADDRESS FOR THE SYSTEM
/
/*********************************************************************
/
/*****************************************************************
/
/------------- CHECK SEE IF WE SAVE CURRENT TIME-------------------
/
/*******************************************************************
STLOAD,
/D034	7401			/NEEDED AT BEGINNING OF BLOCK 6	/A015
	DCA	BTLOC		/SAVE SYSTEM0 TYPE		/A032
	TAD	STPTR		/GET LIST PNTR			/M032
	DCA	X0		/INDEX PTR			/M032
	TAD	RDRPT		/INIT JMP FOR RESTART	/C028	/C032
	DCA	RDOSWP		/SET IT			/C028	/M032
	IFDEF WINNIE	<
	TAD	RDRPT		/INIT JMP FOR RESTART FOR WINNIE	/A032
	DCA	RDOSWQ		/SET IT				/A032
			>	/END IFDEF WINNIE		/A034
	TAD	TIMESW		/FIRST TIME
	SNA CLA
	JMP	FIRSTM		/YES
	JMS	SETMOV		/SETUP MOVE AND SAVE TIME
	CLOCK+2			/START ADDRESS OF CLOCK			/C047
	SAVTIM+2			/LOCATION TO BE SAVED IN	/C047
	JMP	STSLOP		/LOAD USING DRV 0 AS PREV. DEFINED/c050	/A032
FIRSTM,
	TAD	BTLOC		/CODE 0 =RX01/RX02/RX50  4001=WININIE	/A034
				/....PASSED TO LOAD FROM BOOT		/A034
	CDFFIO			/ACP FIELD				/A034
	DCA I	DENDVA0		/NIT TABLEADDRESS OF DRIVE 0 CODE IN TABLE/A034
	CDFDSK			/MY FIELD				/A034
	TAD	BTLOC							/A034
	SMA CLA			/DRIVE 0=WINNIE?			/A034
	JMP	FIRSTN		/NO					/A034
	IAC			/SET WINNIE BIT				/A034
	JMP	SETCMD		/SET READ				/A034
FIRSTN,
	TAD	M7		/M7=ONES COMP OF 6=GET DEN PHYSIO
	DCA	STCMND
	JMS	RDWTIO		/DO I/O  GET DENS. 0=SD 1=DD
	DCA	SVDEN		/SAVE DENSITY
	CLA CLL IAC RAL		/2
	AND	SVDEN
	SNA CLA			/=RX50
	JMP	PASS50		/NO
	TAD	K1400		/YES
	JMP	SETCMD
PASS50,	TAD	SVDEN			/GET DEN
	SZA CLA				/DD?
	TAD	K400		/DD SET CODE TO -400 DD/READ 12 BIT LOGIO
SETCMD,	TAD	K2		/SD SET CODE TO READ 8 BIT LOG		/M018	
	DCA	STCMND		/SAVE CMND			/M018
STSLOP,									/a050
	JMS	RDWTIO		/ First time through load V25 startup
	JMS I	(V25ST)		/ and do it

STLOOP,	TAD I	X0		/GET START BLOCK NO
	SNA
	JMP 	STDONE		/DONE
	DCA	STBLK		/SAVE
	TAD I	X0		/CDF BUFFER FLD
	DCA	STFLD
	TAD I	X0		/BUFFER ADDRESS
	DCA	STLOC
	TAD I	X0		/NEG BLOCK COUNT
	DCA	STCNT
	JMS	RDWTIO		/READ
	CLA
	TAD	INCSAV		/GET PTR		/C032
	DCA	X0		/SET
	JMP	STLOOP		/NEXT BLOCK
RDWTIO,	0			/CALLS HNDLER TO LOAD BFFRS
RDRPT,	CLA
	TAD	X0
	DCA	INCSAV			/SAVE FOR LOAD		/C032
	TAD	RETFLD			/SET RETURN FLD IN AC
	JMS 	RX2SYS			/CALL DRIVER
	0				/DRIVE #

/***********************************************************************/a050
/ WARNING ----								/a050	
/		V25STB defines the address of the table STBLK in WPF1	/a050
/		Do not change this code without checking that this still holds/a050
/		If you do change it then reassemble WPRINT as it modifies/a050
/		the table. Messy isn't IT!!!!				/a050
/***********************************************************************/a050
V25STB,									/a050	
STBLK,	DLCMPS				/START BLOCK#
STFLD,	CDFSYS				/CDF BUFFER FLD
STLOC,	V25ST				/BUFFER START ADDRESS
STCNT,	-DSCMPS				/NEG BLK CNT
	0				/TRACK NO PHYSIO
STCMND,	2				/RXREAD "READ" FUNCTION CODE
	SPA					/ERRORS?
	JMP	RDRPT				/YES REREAD BLOCK
	JMP I	RDWTIO			/RETURN
STPTR,	STLIST-1				/PTR TO LIST-1
/________________________________________________________________
/
/****************   LOAD SYSTEM FIELD  0, 0-4777 ****************
/
/________________________________________________________________
STLIST,			/START OF PARAM LIST SET IN BLKS OF 4
			/ENDING WHEN STRT BLK# = 0  AND IN
			/THE FOLLOWING ORDER
	DLFD0A				/START BLOCK ON DISKETTE
	CDFSYS				/"CDF" OF BUFFER  FLD		/M033
	0				/BUFFER ADDRESS
	-DSFD0A				/NEG BLK COUNT
/D040	IFNDEF	WINNIE	<
/D040/________________________________________________________________
/D040/
/D040/****************   LOAD SYSTEM FIELD  0, 7000-7777 *************
/D040/
/D040/________________________________________________________________
/D040	DLFD0B				/START BLOCK ON DISKETTE
/D040	CDFSYS				/"CDF" OF BUFFER  FLD		/M033
/D040	7000				/BUFFER ADDRESS
/D040	-DSFD0B				/NEG BLK COUNT
/D040			>	/END IFNDEF WINNIE	/AXXXDFB

/________________________________________________________________
/
/****************   LOAD SYSTEM FIELD  1, 0-7000 ****************
/
/________________________________________________________________
	DLFD1				/START BLOCK ON DISKETTE
	CDFPRT				/"CDF" OF BUFFER  FLD		/M033
	PRBOTM				/ADDRESS			/A043
/D043	PRTOPP				/ADDRESS			/C038
	-DSFD1				/NEG BLK COUNT

/________________________________________________________________
/
/****************   LOAD SYSTEM FIELD  2, 0-4777 *************
/
/________________________________________________________________
	DLFD2				/START BLOCK ON DISKETTE
	CDFMNU				/"CDF" OF BUFFER  FLD		/M033
	0				/BUFFER ADDRESS
	-DSFD2				/NEG BLK COUNT

/-----------------------------------------------------------------
/
/****************** LOAD WPSFIL FIELD 7, 0-6777 ********************
/
/-------------------------------------------------------------------
/D049	DLFD7				/START BLOCK NO.
/D049	CDFFIO				/CDF BUFFER FIELD		/M033
/D049	0				/BUFFER ADDRESS
/D049	-DSFD7				/NEG BLK COUNT(20)
/________________________________________________________________
ENDLST,	0		//END OF LIST
/__--------------------------------------------------------
/----------------------------------------------------------------
/
/******************* MOVE PAGE 0, FIELD 2 **************************
/*******************   TO PAGE 0, FIELD 7 **************************
/
/___________________________________________________________________
/
/------------- RESTORE TIME TO FLD 0----------------------------
/
STDONE,	TAD	BTLOC						/A034
	SPA 			/WINNIE?			/A034
	JMP	STDNE2		/YES RESTORE NOW THAT TABLE IS LOADED	/A034
	CLA							/A034
STDNE1,								/A018
	TAD	STCMND		/GET READ COMMAND			/A018
	AND	K1400		/1400	DENSITY, RX50 		/A018/C032/C034
STDNE2,								/A032
	CDFFIO							/A034
	DCA I	DENDVA0		/SET SYSTEM DRIVE DENSITY IN ACP FOR LOGIO
	CDFSYS			/MYFLD					/M033
				/WHILE WAITING DONE	/A026
STDNE3,
	TAD	TIMESW
	SNA CLA
	JMP	SKIPIT
	DCA	STTYPE		/SET WARM STARTUP(IGNORE SET TIME)
	JMS	SETMOV		/RESTORE TIME
	GETTIM+2			/ADDR OF TIME		/C047
	CLOCK+2			/ADDR TO BE STORED			/C047
	SKP
SKIPIT,	ISZ	TIMESW	/SET SKIP SW
	CDISYS			/SET TO START				/M033
	JMP I	.+1		/START WPS
	201
/
/
/
		EJECT
TIMESW,	0			/FIRST TIME SW
SYHDLR,	RX2SYS			/RX02HNDLER
SVDEN,				/SAVE DENSITY***CAUTION***/M026
INCSAV,	0	/SAVE				/A032
K1400,	1400					
K400,	400								
K2,	2								
M7,	-7			/INES COMP OF 6=GET DENS CMND
BTLOC,	0	/SYSTEM 0 DEVICE TYPE- 0=RX01/02 1=RX50 4000=RD50
DENDVA0,5601	/ address of density switch for drive0			/a050
		/ also defined at DENDV0 in above page			/a050
		/ modified from /m033 so that this page is redundant 	/a050
		/ after initialisation					/a050
RETFLD,	CIFSYS			/SET RETURN THIS FLD			/M033

/**********************************************************************
/ Be WARNED IF YOU USE THIS SPACE
/	You ca be overwritten at any minite by the print initialisation
/	which follows
/*********************************************************************	/a050
		PAGE
LF=12		/LINE FEED
CR=15		/CARRIAGE RETURN
		EJECT
				/ END-OF-FILE.