DataMuseum.dk

Presents historical artifacts from the history of:

Philips Data Systems

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Philips Data Systems

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦440fc80f7⟧

    Length: 39676 (0x9afc)
    Notes: pts_type(SC)
    Names: »DRCD02.SC«

Derivation

└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
    └─⟦this⟧ »TOSSWORK/DRCD02.SC« 

PTS(SC)

	IDENT DRCD02 	REL 11.0 81-04-06 870105041100 

* 
* 
**********************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRCD02 = DRIVER FOR ONE/TWO DISC UNITS PTS 6877 
*            PTS 6961 OR PTS 6962 
* 
* 
* 
* 
* 
* 
* 
**************************************************
* 
* 
*   THIS DISC DRIVER HANDLES UP TO TWO DISC 
*   UNITS PTS 6877 CONNECTED TO CPU VIA 
*   BUILT IN DMA CHANNEL
* 
* 
*   THE FOLLOWING ORDERS ARE TREATED :
* 
*   /00    TEST STATUS
*   /01    BASIC READ 
*   /05    BASIC WRITE
*   /11    PHYSICAL READ
*   /15    PHYSICAL WRITE 
*   /1F    FORMAT VOLUME
* 
	EJECT		DRCD02
* 
* 
********************* 
*                   * 
*   ENTRIES         * 
*                   * 
********************* 
* 
	ENTRY	CDADR	DRIVER ADDRESS BLOCK 
	ENTRY	CDON	RECOVERY ROUTINE
	ENTRY	IHCD	INTERRUPT ROUTINE 
	ENTRY	DWCD01	DWT ADDRESS 
* 
	EJECT		DRCD02
* 
* 
************* 
* EXTERNALS * 
************* 
* 
* 
	EXTRN	TDISP	DISPATCHER 
	EXTRN	TENDIO	END I/O 
	EXTRN	SAVE8	SAVE REGS. A1-A8 ON A15 STACK
	EXTRN	NVLCHK	CHECK IF NEW VOLUME LOADED
	EXTRN	VOLGET	PUT VOLUME NAME IN DWT SET NVL
	EXTRN	VOLNAM	VOLUME NAME FROM DWT TO USER BUFFER 
	EXTRN	VOLCLR	CLEAR VOLUME NAMES IN DWT 
	EXTRN	INXDWT	DOUBLED INDEX + DWT ADDRESS 
	EXTRN	DISIOE	REQUEST ERROR 
	EXTRN	INIFLG	INITIALIZATION FLAG 
	EXTRN	PFPOST	PWF POST PROCESSING FLAG
	EXTRN	INTSAV	SAVE AREA LAST INTERRUPT
	EXTRN	SETIMP	TIMER 
	EXTRN	TTB:MT 
	EXTRN	DWTST	STATUS 
	EXTRN	DWTECB	ECB ADDRESS 
	EXTRN	DWTOR	DWT INDEX AND ORDER
	EXTRN	DWTA4	SAVE AREA A4 
	EXTRN	DWTA5	SAVE AREA A5 
	EXTRN	DWTORD	SAVE AREA FOR ORDER 
	EXTRN	ECBBA	ECB BUFFER ADDRESS 
	EXTRN	ECBRL	ECB REQUESTED LENGTH 
	EXTRN	ECBEL	ECB EFFECTIVE LENGTH 
	EXTRN	ECBRC	ECB RETURN CODE
	EXTRN	ECBCW1	ECB 1:ST CONTROL WORD 
	EXTRN	ECBCW2	ECB 2:ND CONTROL WORD 
* 
	EJECT		DRCD02
* 
* 
**************************
*                        *
*  CONDITIONAL ASSEMBLY  *
*                        *
**************************
* 
* 
*   THIS DRIVER CAN HANDLE TWO DISC UNITS 
*   IF X:A := 2 
* 
X:A	EQU	1 
NUNITS	EQU	X:A
* 
* 
*   READ AFTER WRITE MAY BE INCLUDED FOR ORDER /15
*   BY SETTING X:B = 1
* 
X:B	EQU	0 
RAW	EQU	X:B 
* 
* 
*   THIS DRIVER CAN BE ADAPTED FOR EITHER SMD DRIVES
*   OR CMD DRIVES , THE CMD VERSION IS OBTAINED BY
*   SETTING X:C = 0 
* 
X:C	EQU	0 
SMDIND	EQU	X:C
* 
	EJECT		DRCD02
* 
* 
*   IF CMD REQUIRED IT CAN BE ADAPTED FOR EITHER
*   16+16 MB OR 16+80 MB
*   IF 16+80 MB IS CONNECTED AS 1ST DRIVE 
*   SET X:D = 1 
*   IF 16+80 MB IS CONNECTED AS 2ND DRIVE SET 
*       X:E = 1 
* 
X:D	EQU	0 
CMDIX1	EQU	X:D
* 
X:E	EQU	0 
CMDIX2	EQU	X:E
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
CPU852	EQU	1
* 
	EJECT		DRCD02
* 
************************* 
*                       * 
*   CONSTANTS           * 
*                       * 
************************* 
* 
CUADR	EQU	/17	CONTROL UNIT ADDRESS
CUAD1	EQU	CUADR	ADDRESS UNIT 1
CUAD2	EQU	CUADR+/20	ADDRESS UNIT 2
DEVIND	EQU	10	DEVICE INDEX
RY3	EQU	3	3 RETRIES 
PHSECL	EQU	/180	PHYSICAL SECTOR LENGTH
LOSECL	EQU	/80	LOGICAL SECTOR LENGTH
SEZCOM	EQU	/E800	SEEK ZERO COMMAND CODE 
SEEKCO	EQU	/A800	SEEK COMMAND CODE
REDCOM	EQU	/0800	READ COMMAND CODE
VERCOM	EQU	/3800	VERIFY COMMAND CODE
WRICOM	EQU	/1800	WRITE COMMAND CODE 
WHACOM	EQU	/22C0	WRITE SECTOR MARKS COMMAND CODE
NOTRAN	EQU	/8000	NO TRANSFER BIT
TIME	EQU	1000	1 MIN 40 SECONDS
MAXCYL	EQU	822	MAXIMAL CYLINDER NUMBER
MS80M1	EQU	8	MAXIMAL NUMBER 80 MB 
MS80M2	EQU	/53C6
SPC80M	EQU	115
MS16M1	EQU	1	16MB DISC PARAMETERS 
MS16M2	EQU	/5D8E
SPC16M	EQU	23 
INLACE	EQU	5	INTERLACING FACTOR 
SEPRTR	EQU	23	SECTORS PER TRACK 
* 
	EJECT		DRCD02
* 
* 
************************
* DRIVE TYPE DEPENDENT *
* CONSTANTS            *
************************
* 
* 
	IFT	SMDIND=1	IF SMD DRIVE(S) IS CONNNECTED 
MXSE11	EQU	MS80M1	MAX SCTOR NUMBER
MXSE12	EQU	MS80M2 
MXSE21	EQU	MS80M1 
MXSE22	EQU	MS80M2 
MXSE31	EQU	0
MXSE32	EQU	0
MXSE41	EQU	0
MXSE42	EQU	0
SPCUN1	EQU	SPC80M	SECTORS PER CYLINDER
SPCUN2	EQU	SPC80M 
SPCUN3	EQU	0
SPCUN4	EQU	0
	XIF
	IFT	SMDIND=0	IF CMD DRIVE(S) IS CONNECTED
MXSE11	EQU	MS16M1	MAX SECTOR NUMBER 
MXSE12	EQU	MS16M2 
MXSE31	EQU	MS16M1 
MXSE32	EQU	MS16M2 
SPCUN1	EQU	SPC16M 
SPCUN3	EQU	SPC16M	SECTORS PER CYLINDER
	IFT	CMDIX1=0	16+16 CONNECTED 
MXSE21	EQU	MS16M1 
MXSE22	EQU	MS16M2 
SPCUN2	EQU	SPC16M 
	XIF
	IFT	SMDIND+CMDIX2=0	16+16 CONNECTED
MXSE41	EQU	MS16M1 
MXSE42	EQU	MS16M2 
SPCUN4	EQU	SPC16M 
	XIF
	IFT	SMDIND=0 
	IFT	CMDIX1=1	16+80 CONNECTED 
MXSE21	EQU	MS80M1 
MXSE22	EQU	MS80M2 
SPCUN2	EQU	SPC80M 
	XIF
	IFT	SMDIND=0 
	IFT	CMDIX2=1	16+80 CONNECTED 
MXSE41	EQU	MS80M1 
MXSE42	EQU	MS80M2 
SPCUN4	EQU	SPC80M 
	XIF
* 
	EJECT		DRCD02
* 
* 
*   DRIVER ADDRESS BLOCK
* 
* 
	DATA	0	INDICATES NO MMU BUFFER 
	DATA	DEVIND	DISC DEVICE INDEX
CDADR	DATA	CDAD	ACTIVATION ADDRESS
	DATA	0	ABORT ROUTINE ADDRESS 
* 
* 
* 
*   DRIVER BUFFER 
* 
* 
BUFFER	EQU	*
	RES	256
* 
	EJECT		DRCD02
* 
* 
****************************
*                          *
*   ACTIVATION             *
*                          *
****************************
* 
CDAD	EQU	*
	LDK	A5,DWTSB3
	ADR	A5,A6	GET STACK BASE 
	LD	A4,DWTRE1,A6	GET GRAND TOTAL OF RETRIES 
	ST	A4,DWTRE2,A6	PRESENT TOTAL RETRY COUNTER
	CF	A15,NVLCHK	CHECK IF NEW VOLUME LOADED 
*			SAVE INDEX AND ORDER
	ADK	A7,0	SET CR
	RF(NZ)	CDA:00	NOT TEST STATUS ORDER
* 
	EJECT		DRCD02
* 
* 
********************* 
*                   * 
*   TEST STATUS     * 
*                   * 
********************* 
* 
* 
	ORS	A1,ECBRC,A8	NVL BIT
	IM	DWTSAV,A6	INDICATE TEST STATUS
	CF	A5,VO:NAM	READ VOLUME NAME
	ANK	A1,1 
	RF(NZ)	TESEND	NOT OPERABLE 
	LD	A8,DWTECB,A6	ECB ADDRESS
	CF	A15,VOLNAM	TRANSFER VOLUME NAME TO USER BUFFER
	LDK	A1,0	RESET RETURN CODE 
TESEND	EQU	*
	CM	DWTSAV,A6	TEST STATUS DONE
	CF	A15,INXDWT
	LD	A4,DWTSPC,A4	SECTORS PER TRACK
	SUK	A4,SPC16M
	RF(NE)	TESE10	NOT 16MB DISC
	ORKL	A1,/800	INDICATE 16MB DISC IN RC
TESE10	EQU	*
	RF	DENDIO	PERFORM ENDIO
* 
	EJECT			DRCD02 
* 
*************************************** 
*                                     * 
*   NEW VOLUME LOADED CHECK           * 
*   ORDER CODE CHECK                  * 
*                                     * 
*************************************** 
* 
*   INPUT: A1=NVL RETURN CODE FROM NVLCHK 
*          A7=ORDER CODE
* 
* 
CDA:00	EQU	*
	ADK	A1,0	CHECK IF NEW VOLUME LOADED
	RF(NZ)	DENDIO	PERFORM ENDIO
	SUK	A7,1 
	RF(Z)	CD:010	BASIC READ
	SUK	A7,4 
	RF(Z)	CD:000	BASIC WRITE 
	SUK	A7,12	 
	RF(Z)	CD:010	PHYSICAL READ 
	SUK	A7,4 
	RF(Z)	CD:000	PHYSICAL WRITE
	SUK	A7,10
	RF(Z)	FORMAT	FORMAT VOLUME 
* 
DUERR	ABL	DISIOE	REQUEST ERROR
* 
INCLEN	EQU	*	REQUESTED LENGTH ERROR 
	LDKL	A1,/8008
DENDIO	EQU	*
	ABL	END:IO	
* 
* 
	EJECT		DRCD02
* 
* 
********************************* 
*                               * 
*   FORMAT VOLUME               * 
*                               * 
********************************* 
* 
* 
FORMAT	EQU	*
	LDKL	A1,SEEKCO	SEEK OPERATION CODE 
	ST	A1,DWTSEK,A6	TO SEEK OPERATION AREA 
	CF	A5,SEEKZ	CYLINDER 0 
	RF	FOR:50
FOR:10	EQU	*
	CF	A5,SEEK 
FOR:50	EQU	*
	MLK	3
	DATA	REDCOM
	DATA	LOSECL
	DATA	NOTRAN+LOSECL 
	MS	3,DWTCOP,A6	PREPARE FOR READ
	LDR	A4,A6	WHA POINTER
* 
	EJECT		DRCD02
* 
* 
FOR:60	EQU	*
	LDK	A1,/EF	RESET DEVICE NUMBER BIT 
	ANS	A1,DWTWHA,A4 
	LD	A1,ECBCW1,A8
	RF(Z)	FOR:70	NO BAD TRACK FLAG CHECK 
	CF	A5,CIO	READ PART OF SECTOR
	SRL	A1,8	BAD TRACK FLAG INDICATOR
FOR:70	EQU	*
	ORK	A1,/22	PREPARE WHA 
	SC	A1,DWTWHA,A4
	IM	DWTCOP,A6	NEXT HEAD 
	ADK	A4,4 
	LDR	A2,A4
	SUR	A2,A6
	SRL	A2,2	/4
	MUK	SEPRTR 
	LC	A1,DWTOR,A6	INDEX 
	ANK	A1,3 
	SLL	A1,1 
	ADR	A1,A6
	CW	A2,DWTSPC,A1
	RB(L)	FOR:60	NEXT HEAD 
	LDKL	A1,/800	INTERUPT BIT
	ORS	A1,DWTWHA-4,A4 
	CF	A5,HOMEAD	WRITE SECTOR MARKS
	IM	DWTSEK,A6	NEXT CYLINDER 
	LD	A1,DWTSEK,A6
	SUKL	A1,SEEKCO+MAXCYL	SEEK ORDER CODE + MAX CYLINDER NUMBER
	RB(NZ)	FOR:10	NEXT CYLINDER
	LDKL	A2,MAXCYL-1	821 
	IFT	NUNITS=1 
	ST	A2,DWTCYL,A6	CYLINDER NUMBER
	XIF
	IFT	NUNITS=2 
	CF	A15,INXDWT
	LD	A3,DWTSMD,A6
	RF(NZ)	FOR:80	SMD DISC 
	LC	A4,DWTOR,A6	GET DISPLACEMENT
	ANK	A4,2 
	ADR	A4,A6
FOR:80	EQU	*
	ST	A2,DWTCYL,A4	CYLINDER NUMBER
	XIF
	RB	DENDIO	PERFORM ENDIO
	EJECT		DRCD02
* 
* 
********************************************
*                                          *
*   INPUT ECB-PARAMETER CHECK              *
*                                          *
********************************************
* 
* 
CD:000	EQU	*
	LDK	A7,5	INDICATE WRITE
CD:010	EQU	*
	LC	A4,DWTOR,A6 
	ANK	A4,3 
	SLL	A4,2	*4
	ADR	A4,A6
	ML	2,ECBCW1,A8	GET SECTOR NUMBER 
	DS	DWTSMX,A4	CHECK SECTOR NUMBER 
	RB(NN)	DUERR 
	LDK	A2,0	CLEAR REGISTER
	LD	A1,ECBRL,A8	GET REQUESTED LENGTH
	RB(Z)	INCLEN	INCORRECT REQUEST 
	ECR	A2,A1	DIVIDE BY 256
	ANK	A1,/FF	REST AFTER DIVISION 
	RB(NZ)	INCLEN	INCORRECT REQUEST
	ST	A2,DWTLOS,A6	SAVE NUMBER OF LOGICAL SECTORS 
	DA	ECBCW1,A8	LOGICAL SECTOR NUMBER 
	DS	DWTSMX,A4 
	RB(P)	INCLEN	INCORRECT REQUEST 
* 
	EJECT		DRCD02
* 
* 
*   GET PHYSICAL SECTOR NUMBER
*   GET BUFFER ADDRESS
*   PREPARE SECTOR MASK 
* 
* 
	MLR	2,A8	GET 18 BIT BUFFER ADDRESS 
	SLC	A1,4	MOST SIGNIFICANT BITS 
	ANK	A1,3 
	SRL	A2,1 
	MS	2,DWTBA,A6
	ML	2,ECBCW1,A8	GET LOGICAL SECTOR NUMBER 
	LDK	A3,0	DIVIDE MOST SIGN PART BY 3
CD:100	EQU	*
	ADK	A3,1 
	SUK	A1,3 
	RB(NN)	CD:100
	ADK	A1,3 
	SUK	A3,1 
	ST	A3,DWTSEC,A6	PHYSICAL SECTOR NUMBER 
	DVK	3	DIVIDE BY 3
	ST	A2,DWTSEC+2,A6	LEAST SIGNIFICANT PART 
	CF	A5,MASKPR	PREPARE IO MASK 
	ANK	A7,4	ORDER CHECK 
	RF(Z)	REA:00	READ ORDER
	EJECT		DRCD02
* 
* 
********************************
*                              *
*   WRITE SECTORS              *
*                              *
********************************
* 
* 
	LD	A3,DWTMAS,A6	SECTOR MASK
	SUK	A3,7 
	RF(Z)	WRI:50	TOTAL PHYSICAL SECTOR 
WRI:10	EQU	*
	ML	3,DWTBSE,A6	GET IDENTITY OF SECTORS IN DRIVER BUFFER
	OR	A3,DWTMAS,A6	GET SECTOR MASK
	SUK	A3,7 
	RF(NZ)	WRI:20	NOT COMPLETE PHYSICAL SECTOR 
	LD	A3,DWTOR,A6	GET UNIT NUMBER 
	ANKL	A3,/300 
	SUR	A1,A3
	DS	DWTSEC,A6	SECTOR NUMBER 
	RF(Z)	WRI:30	CORRECT SECTORS IN DRIVER BUFFER
* 
	EJECT		DRCD02
* 
* 
WRI:20	EQU	*
	IM	DWTTRA,A6	INDICATE NO TRANSFER
	CF	A5,READ	READ SECTORS TO DRIVER BUFFER 
* 
WRI:30	EQU	*
	CF	A5,WRITE	WRITE ONE PHYSICAL SECTOR
	IFT	RAW=1
	LD	A1,DWTOR,A6	GET ORDER 
	ANK	A1,/10 
	RF(Z)	WRI:35	BASIC WRITE 
	CF	A5,VERIFY	VERIFY IF PHYSICAL WRITE
WRI:35	EQU	*
	XIF
	CF	A5,UPDATE 
	LD	A1,DWTLOS,A6	GET NUMBER OF LOGICAL SECTORS
	RF(Z)	REA:50	LAST SECTOR DONE
	CF	A5,MASK00	PREPARE SECTOR MASK 
	LD	A1,DWTMAS,A6	GET MASK 
	SUK	A1,7 
	RB(NZ)	WRI:10	LESS THAN 3 SECTOR IO
* 
	EJECT		DRCD02
* 
* 
WRI:50	EQU	*
	IFT	RAW=1
	ML	4,DWTBA,A6	SAVE PARAMETERS FOR READ AFTER WRITE 
	MS	4,DWTRAW,A6 
	LD	A1,DWTSEC+2,A6
	ST	A1,DWTRAW+8,A6
	LDK	A3,7 
	ST	A3,DWTMAS,A6	SECTOR MASK
	XIF
WRI:55	EQU	*
	CF	A5,WRITE
	IFT	RAW=1
	IM	DWTTRA,A6	INDICATE NO UPDATE OF EFFECTIVE LENGTH
	XIF
	CF	A5,UPDAT
	IFT	RAW=1
	CM	DWTTRA,A6 
	XIF
	LD	A1,DWTLOS,A6	NUMBER OF LOGICAL SECTORS
	SUK	A1,3 
	RB(NN)	WRI:55	NEXT PHYSICAL SECTOR 
	IFT	RAW=1
* 
	EJECT		DRCD02
* 
* 
	LD	A2,DWTOR,A6 
	ANK	A2,/10 
	RF(Z)	WRI:70	BASIC WRITE 
	ML	4,DWTRAW,A6	RESTORE PARAMETERS FOR VERIFY 
	MS	4,DWTBA,A6
	LD	A1,DWTRAW+8,A6
	ST	A1,DWTSEC+2,A6
WRI:60	EQU	*
	CF	A5,CIOLOD 
	CF	A5,VERIFY 
	CF	A5,UPDAT
	LD	A1,DWTLOS,A6	NUMBER OF LOGICAL SECTORS
	SUK	A1,3 
	RB(NN)	WRI:60	NEXT PHYSICAL SECTOR 
	XIF
WRI:70	EQU	*
	ADK	A1,3 
	RF(Z)	REA:50	LAST SECTOR DONE
	CF	A5,MASK00	PREPARE SECTOR MASK 
	RB	WRI:10	LAST SECTORS 
* 
	EJECT		DRCD02
* 
* 
********************************
*                              *
*   READ SECTORS               *
*                              *
********************************
* 
* 
REA:00	EQU	*
	CF	A5,READ	PERFORM READ
	CF	A5,UPDATE 
	LDK	A3,7 
	ST	A3,DWTMAS,A6	SECTOR MASK
	LD	A1,DWTLOS,A6	NUMBER OF LOGICAL SECTORS
	RF(Z)	REA:50	IO READY
	SUK	A1,3 
	RB(NN)	REA:00	AT LEAST ONE PHYSICAL SECTOR 
	CF	A5,MASK00 
	CF	A5,READ 
	CF	A5,UPDATE 
	LDK	A1,0	RESET RETURN CODE 
REA:50	EQU	*
	ABL	END:00	END IO
* 
	EJECT		DRCD02
* 
* 
********************* 
*                   * 
*   READ SECTOR N   * 
*                   * 
********************* 
* 
* 
READ	EQU	*
	CF	A5,CIOLOD 
	CM	DWTBSE+4,A6	CLEAR BUFFER IND. IN CASE OF ERROR
	LDKL	A3,REDCOM	GET READ COMMAND CODE 
	ORS	A3,DWTCOP,A6	READ A RECORD COMMAND 
READ00	EQU	*
	LDK	A4,RY3	RETRIES 
READ10	CF	A5,CIO	EXECUTE READ 
	ANK	A1,/F
	RF(Z)	RET34	OK. NO RETURN CODE 
* 
* IO ERROR IN READING 
* 
	IM	DWTRE2,A6 
	SUK	A4,1	DECREMENT RETRYCOUNTER
	RB(P)	READ10	3:RD RETRY IN THIS STATE NOT DONE 
	LDK	A4,RY3	REINIT RETRYCOUNTER 
* 
	EJECT		DRCD02
* 
* 
* UPDATE READ-COMMAND 
* 
* 
	LC	A2,DWTCOP,A6
	ANK	A2,/C0	LAST RETRY WITH EARLY- OR LATE- 
	RF(NZ)	RET31	DATA STROBE ? 
	LDKL	A3,/8000	PREPARE FOR EARLY DATA STROBE
	ORS	A3,DWTCOP,A6 
	RB	READ10	RETRY 3 TIMES WITH EARLY DATA STROBE 
RET31	EQU	* 
	ANK	A2,/80 
	RF(Z)	RET32	LAST RETRIES WERE LATE DATA STROBE 
	LDKL	A3,/C000
	XRS	A3,DWTCOP,A6	CHANGE FROM EARLY- TO LATE DATA STROBE
	RB	READ10	RETRY 3 TIMES WITH LATE DATA STROBE
RET32	EQU	* 
	LDKL	A3,/3FFF
	ANS	A3,DWTCOP,A6	RESET LATE DATA STROBE
	LC	A2,DWTCOP+2,A6
	ANK	A2,/C0	LAST RETRY CARRIAGE+ OR CARRIAGE- 
	RF(NZ)	RET33 
	LDKL	A3,/8000	PREPARE FOR CARRIAGE+
	ORS	A3,DWTCOP+2,A6 
	RB	READ10	RETRY 3 TIMES WITH CARRIAGE+ 
* 
	EJECT		DRCD02
* 
* 
RET33	EQU	* 
	ANK	A2,/80 
	RF(Z)	RET35	LAST RETRY WAS A CARRIAGE- 
	LDKL	A3,/C000
	XRS	A3,DWTCOP+2,A6	CHANGE FROM CARRIAGE+TO CARRIAGE- 
	RB	READ10	RETRY 3 TIMES WITH CARRIAGE- 
RET35	EQU	* 
	LD	A2,DWTSAV,A6
	RB(Z)	REA:50	NOT VO:NAM CALLING
RET34	EQU	*	NO MORE RETRIES 
	LDR	A3,A1	RETURN CODE
	RTN	A5 
* 
	EJECT		DRCD02
* 
* 
**************************
*                        *
*   WRITE SECTOR N       *
*                        *
**************************
* 
WRITE	EQU	* 
	CF	A5,CIOLOD 
	LDKL	A3,WRICOM	WRITE ORDER CODE
	ORS	A3,DWTCOP,A6 
	LDK	A4,RY3	RETRIES TO BE PERFORMED 
WRIT20	EQU	*
	CF	A5,CIO
	ANK	A1,/F
	RF(Z)	WRIT50	WRITE OK
	IM	DWTRE2,A6	RETRY PERFORMED 
	SUK	A4,1 
	RB(NZ)	WRIT20	RETRY
	RB	REA:50	NO MORE RETRIES
WRIT50	EQU	*
	RTN	A5 
* 
	IFT	RAW=1
	EJECT		DRCD02
* 
* 
****************************
*                          *
*   VERIFY SECTOR N        *
*                          *
****************************
* 
VERIFY	EQU	*
	LDKL	A3,VERCOM	ORDER CODE FOR VERIFY 
	ORS	A3,DWTCOP,A6 
	RB	READ00
* 
	XIF
	EJECT		DRCD02
* 
* 
*   SEEK,SEEKZ,WRITE HOME ADDRESS AND CIO 
* 
* 
SEEK	EQU	*
	LDK	A2,DWTSEK	GET EFFECTIVE ADDRESS TO SEEK OP.
	RF	SEEK00
* 
* 
SEEKZ	EQU	* 
	LDK	A2,DWTSEZ	GET EFFECTIVE ADDRESS TO SEEK 0 OP.
SEEK00	EQU	*
	ADR	A2,A6
	RF	EXCIO 
* 
* 
HOMEAD	EQU	*
	LDK	A2,DWTWHA	GET WRITE HOME ADDRESS OP. 
	RF	CIO00 
* 
* 
CIO	EQU	* 
	LDK	A2,DWTCOP	GET EFFECTIVE ADDRESS TO CIO OP. 
* 
CIO00	EQU	* 
	ADR	A2,A6
	LD	A3,DWTSMD,A6
	RF(NZ)	CIO10	SMD 
	LC	A3,DWTOR,A6	INDEX 
	ANK	A3,1	UNIT NUMBER 
	SLL	A3,4 
	ORRS	A3,A2 
CIO10	EQU	* 
	EJECT		DRCD02
* 
* 
EXCIO	EQU	* 
	ST	A4,DWTA4,A6	SAVE A4 
	LD	A3,PFPOST 
	RF(NZ)	CIOAB	PWF POST PROCESSING ON
	IFT	NUNITS=2 
	CF	A15,INXDWT	GET INDEXED DWT DISPLACEMENT 
	LD	A3,DWTSMD,A6
	RF(NZ)	CIO20	SMD DRIVE 
	LC	A4,DWTOR,A6 
	ANK	A4,2 
	ADR	A4,A6	ADDRESS IN DWT 
CIO20	EQU	* 
	EX	DWTCIO,A4 
	XIF
	IFT	NUNITS=1 
	EX	DWTCIO,A6 
	XIF
	ABL(3)	END:30
CIOAB	EQU	* 
	ST	A5,DWTA5,A6	           A5 
	ABL	TDISP	GO TO DIPATCHER
* 
	EJECT		DRCD02
* 
* 
***************************************** 
*                                       * 
*   SUBROUTINE CIOLOD                   * 
*              PREPARE CIO WORK AREA    * 
*                                       * 
***************************************** 
* 
*   REGISTER DISPOSITION
*   A1 = WORK REGISTER
*   A2 = WORK REGISTER
*   A3 = MASK 
*   A4 = CIO WORK AREA POINTER
*   A7 = USER BUFFER POINTER
*   A8 = DRIVER BUFFER POINTER
* 
*   DWTTRA = TRANSFER INDICATOR 
*   DWTMAS = MASK INDICATING SECTORS TO/FROM USER BUFFER
*   DWTBA  = BUFFER POINTER 
* 
CIOLOD	EQU	*
	LDKL	A4,-4 
	ST	A4,DWTSAV,A6	COUNTER
	LDR	A4,A6	GET DWT ADDRESS
	ADK	A4,DWTCOP-2	CIO WORK AREA ADDRESS
	LDKL	A8,BUFFER	DRIVER BUFFFER ADDRESS
	LD	A3,DWTMAS,A6	GET BUFFER MASK
	SRC	A3,4	MASK IN POSITION
	LDK	A7,0	USER BUFFER POINTER 
	LDKL	A1,/4000+LOSECL	PREPARE PARTIAL LENGTH
	ST	A1,6,A4 
	ST	A1,12,A4
	ST	A1,18,A4
* 
	EJECT		DRCD02
* 
* 
CIOL10	EQU	*
	LDK	A1,0 
	ADK	A4,6 
	IM	DWTSAV,A6	COUNTER 
	RF(Z)	CIOL60	WORK AREA READY 
	SLL	A3,1 
	RF(NN)	CIOL50	TO/FROM DRIVER BUFFER
	LD	A2,DWTTRA,A6	TRANSFER INDICATOR 
	RF(NZ)	CIOL55	NO TRANSFER
* 
	LDR	A2,A7	USER BUFFER POINTER
	DA	DWTBA,A6	GET USER BUFFER ADDRESS
	SLL	A2,1	IN POSITION 
	ADK	A7,LOSECL	UPDATE USER BUFFER POINTER 
	RF	CIOL58
* 
	EJECT		DRCD02
* 
* 
CIOL50	EQU	*
	LDR	A2,A8	DRIVER BUFFER
	ADKL	A8,/100	UPDATE DRIVER BUFFERPOINTER 
	RF	CIOL58
CIOL55	EQU	*
	LDKL	A1,/C000+LOSECL	NO TRANSFER 
	STR	A1,A4
CIOL58	EQU	*
	MS	2,2,A4
	RB	CIOL10
CIOL60	EQU	*
	LDKL	A1,/8000+LOSECL 
	ANS	A1,DWTCOP+16,A6	CLEAR BIT
	LDKL	A1,PHSECL 
	ST	A1,DWTCOP+2,A6
	CM	DWTTRA,A6	CLEAR NO TRANSFER FLAG
* 
	EJECT		DRCD02
* 
* 
***************************************** 
*                                       * 
*              PUT SECTOR NUMBER        * 
*              AND HEAD NUMBER IN POS.  * 
*                                       * 
***************************************** 
* 
*   INPUT:  PHYSICAL SECTOR NUMBER
*   OUTPUT: INTERLACED SECTOR NUMBER AND HEAD NUMBER
*           IN POSITION FOR CIO 
*   PERFORM SEEK
* 
	CF	A15,INXDWT
	ML	2,DWTSEC,A6	PHYSICAL SECTOR NUMBER
	DV	DWTSPC,A4	SECTORS PER CYLINDER
*   A1 = REST = HEAD NUMBER * SECTOR NUMBER 
*   A2 = QUOTIENT = CYLINDER NUMBER 
	LDR	A3,A2	SAVE CYLINDER NUMBER 
	LDR	A2,A1
	LDK	A1,0 
	DVK	23 
*   A1 = SECTOR NUMBER
*   A2 = HEAD NUMBER
	ORKL	A2,/800	INTERUPT BIT
	ST	A2,DWTCOP,A6	COP WORK AREA
	LDR	A2,A1	SECTOR NUMBER
	MUK	INLACE	INTERLACING 
	SRC	A3,1 
	RF(NN)	CIOP10	EVEN CYLINDER NUMBE
	ADK	A2,12	SKEW FACTOR
* 
	EJECT		DRCD02
* 
* 
CIOP10	EQU	*
	DVK	SEPRTR	GET INTERLACED AND SKEWED SECTOR NUMBER 
	SLL	A1,5	IN POSITION 
	ORS	A1,DWTCOP,A6	COP WORK AREA 
	SLC	A3,1	RESTORE CYLINDER NUMBER IN POSITION 
	IFT	NUNITS=2 
	LD	A1,DWTSMD,A6	SMD FLAG 
	RF(NZ)	CIOP20	SMD DRIVE
	LC	A4,DWTOR,A6	INDEX 
	ANK	A4,2 
	ADR	A4,A6
CIOP20	EQU	*
	CW	A3,DWTCYL,A4
	RF(E)	CIOP50	SAME CYLINDER 
	ST	A3,DWTCYL,A4	SAVE CYLINDER NUMBER 
	XIF
	IFT	NUNITS=1 
	CW	A3,DWTCYL,A6
	RF(E)	CIOP50	SAME CYLINDER 
	ST	A3,DWTCYL,A6	SAVE CYLINDER NUMBER 
	XIF
	ADKL	A3,SEEKCO	SEEK ORDER
	ST	A3,DWTSEK,A6	SEEK WORK AREA 
* 
	EJECT		DRCD02
* 
*   SEEK CYLINDER 
* 
* 
	LDK	A4,RY3	RETRIES 
SE:010	EQU	*
	CF	A5,SEEK	SEEK CYLINDER N 
	ANK	A1,2 
	RF(Z)	CIOP50	OK. SEEK COMPLETED
	IM	DWTRE2,A6 
	SUK	A4,1	DECREMENT RETRY-COUNTER 
	RF(Z)	SE:020	LAST RETRY
* 
	CF	A5,SEEKZ	SEEK CYLINDER 0
	ANK	A1,2 
	RB(Z)	SE:010	CYLINDER ZERO FOUND 
* 
SE:020	EQU	*
	RF	END:SE	SEEK ERROR END IO
CIOP50	EQU	*
	RTN	A5 
* 
	EJECT		DRCD02
* 
* 
************************************* 
*                                   * 
*   SUBROUTINE UPDATE               * 
*                                   * 
************************************* 
* 
*   UPDATES : DWTBSE   PRESENT SECTORS IN DRIVER BUFFER 
*             DWTLOS   NUMBER OF LOGICAL SECTORS LEFT IN IO 
*             DWTBA    USER BUFFER POINTER
*             DWTSEC   PHYSICAL SECTOR POINTER
*             ECBEL    EFFECTIVE LENGTH 
* 
UPDATE	EQU	*
	LDK	A2,0 
	LD	A3,DWTMAS,A6	GET SECTOR MASK
	C1R	A3,A3	COMPLIMENT 
	ANK	A3,7	3 BITS
	LD	A1,DWTOR,A6	GET INDEX 
	ANKL	A1,/300	UNIT NUMBER 
	DA	DWTSEC,A6	SECTOR NUMBER 
	MS	3,DWTBSE,A6	SAVE
UPDAT	EQU	* 
	LD	A1,DWTMAS,A6	GET SECTOR MASK
	LDK	A2,0 
	SRC	A1,3 
UPDA00	EQU	*
	RF(NN)	UPDA10	IO TO/FROM DRIVER BUFFER 
	ADK	A2,1	NUMBER OF SECTORS IN LAST IO
UPDA10	EQU	*
	SLL	A1,1 
	RB(NZ)	UPDA00	MORE SECTORS 
* 
	EJECT		DRCD02
* 
* 
	LD	A3,DWTLOS,A6	UPDATE DWTLOS
	SUR	A3,A2
	ST	A3,DWTLOS,A6
	SLL	A2,7	UPDATE DWTBA
	LDR	A3,A2	SAVE LENGTH
	DA	DWTBA,A6
	MS	2,DWTBA,A6
	SLL	A3,1 
	IFT	RAW=1
	LD	A1,DWTTRA,A6
	RF(Z)	UPDA50	UPDATE EFFECTIVE LENGTH 
	LD	A7,DWTOR,A6	GET ORDER 
	ANK	A7,/10 
	RF(NZ)	UPDA60
	XIF
* 
	EJECT		DRCD02
* 
* 
UPDA50	EQU	*
	ADS	A3,ECBEL,A8
UPDA60	EQU	*
* 
	LDK	A1,0 
	LDK	A2,1 
	DA	DWTSEC,A6 
	MS	2,DWTSEC,A6 
* 
	RTN	A5 
	EJECT		DRCD02
* 
* 
******************************************* 
*                                         * 
*   SUBROUTINE MASKPR                     * 
*              SET BITS FOR LOGICAL       * 
*              SECTORS IN PHYSICAL        * 
*                                         * 
******************************************* 
* 
*   A1 = POSITION IN SECTOR 
*   DWTLOS = NUMBER OF SECTORS
* 
* 
MASK00	EQU	*
	LDK	A1,0 
MASKPR	EQU	*
	LD	A3,DWTLOS,A6	NUMBER OF SECTORS
	SUK	A3,2 
	LDK	A3,4	1  0  0 
	RF(N)	MASK10	1 SECTOR LEFT IN IO 
	LDK	A3,6	1  1  0 
	RF(Z)	MASK10	2 SECTORS LEFT IN IO
	LDK	A3,7	1  1  1 
MASK10	EQU	*
	SUK	A1,1 
	RF(Z)	MASK20	0  1  0 
	RF(N)	MASK30	1  0  0 
	SRL	A3,1	0  0  1 
MASK20	EQU	*
	SRL	A3,1 
MASK30	EQU	*
	ST	A3,DWTMAS,A6	SAVE MASK
	RTN	A5 
* 
	EJECT		DRCD02
* 
* 
************************* 
*                       * 
*   PERFORM END IO      * 
*                       * 
************************* 
* 
END:SE	EQU	*	SEEK ERROR 
	IFT	NUNITS=1 
	LDKL	A3,/FFFF
	ST	A3,DWTCYL,A6	DUMMY CYLINDER NUMBER
	XIF
	IFT	NUNITS=2 
	CF	A15,INXDWT
	LD	A3,DWTSMD,A6
	RF(NZ)	END:S1	SMD DRIVE
	LC	A4,DWTOR,A6 
	ANK	A4,2 
	ADR	A4,A6
END:S1	EQU	*
	LDKL	A3,/FFFF
	ST	A3,DWTCYL,A4	DUMMY CYLINDER NUMBER
	XIF
END:00	EQU	*
	LD	A2,DWTRE2,A6
	CW	A2,DWTRE1,A6
	RF(E)	END:IO 
	ST	A2,DWTRE1,A6	GRAND TOTAL OF RETRIES 
	ORKL	A1,/100	RETRIES PERFORMED 
* 
END:IO	EQU	*
	CF	A15,TENDIO	PERFORM TENDIO 
T:DISP	EQU	*
	ABL	TDISP
END:30	EQU	*
	LDK	A1,1 
	ORS	A1,DWTST,A6	INDICATE RECOVERY DONE 
	RB	END:IO
* 
	EJECT		DRCD02
* 
* 
**********************
*                    *
*  RECOVERY ROUTINE  *
*                    *
**********************
* 
* 
CDON	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDKL	A6,DWCD01 
	LDK	A5,DWTSB3	GET STACK BASE 
	ADR	A5,A6
	LDKL	A1,-1 
	ST	A1,DWTSAV,A6	INDICATE RECOVERY
	LDKL	A1,/7FFE	SET UNIT BUSY AND RECOVERY ON
	ANS	A1,DWTST,A6	 
	CM	DWTSMD,A6	INDICATE CMD DRIVE
	LD	A1,INIFLG	INITIALIZATION FLAG 
	RF(NZ)	CDON05	NOT POWER UP 
* 
	EJECT		DRCD02
* 
* 
	IFT	NUNITS=2 
	CM	DWTOR,A6	1ST UNIT 
	CF	A5,SEEKZ	TEST IF OPERABLE 
	ANK	A1,1 
	RF(NZ)	CDON80	NOT OPERABLE 
	LDK	A1,2 
	SC	A1,DWTOR,A6	2ND UNIT
	XIF
	CF	A5,SEEKZ	TEST IF OPERABLE 
	ANK	A1,1 
	RF(NZ)	CDON80	NOT OPERABLE 
* 
	EJECT			DRCD02 
* 
* 
CDON05	EQU	*
	CM	DWTOR,A6	1ST UNIT 
	CF	A5,VO:NAM 
	LDK	A1,1	2ND UNIT
	SC	A1,DWTOR,A6 
	CF	A5,VO:NAM 
	IFT	NUNITS=2 
	LDK	A1,2 
	SC	A1,DWTOR,A6 
	CF	A5,VO:NAM	3RD VOLUME
	LDK	A1,3 
	SC	A1,DWTOR,A6 
	CF	A5,VO:NAM	4TH VOLUME
	XIF
* 
	EJECT		DRCD02
* 
* 
CDON30	EQU	*
	IM	DWTST,A6	INDICATE VOLUME NAMES READ 
	CM	DWTSAV,A6	RECOVERY DONE 
* 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	RB(Z)	END:IO	NO REQUEST ON 
* 
CDON40	LD	A7,DWTORD,A6	GET ORDER
	ST	A7,DWTOR,A6	RESTORE INDEX AND ORDER 
	ANK	A7,/3F 
* 
	CM	ECBEL,A8	RESET EFFECTIVE LENGTH 
	ABL	CDAD	REPEAT REQUEST
* 
	EJECT			DRCD02 
* 
*    READY INTERRUPT
* 
CDREDY	LD	A1,TIMER
	RF(Z)	CDON95	NO TIMER ACTIVE 
* 
	IFT	NUNITS=1 
	CM*	TIMER	KILL TIMER 
	RF	CDON90
	XIF
* 
	IFT	NUNITS=2 
	RB	T:DISP	TIMER ACTIVE 
	XIF
* 
	EJECT			DRCD02 
* 
* 
CDON80	EQU	*
	LDKL	A4,TIMER	TIMER POINTER ADDRESS
	LDR*	A3,A4 
	RF(Z)	CDON85	NO TIMER ACTIVE 
	LDKL	A1,-TIME
	STR	A1,A3	RESTART TIMER
	RB	T:DISP
* 
* 
CDON85	CF	A15,SETIMP	START TIMER
	DATA	CDON90,TIME	TIME OUT ADDRESS, TIME
	RB	T:DISP
* 
*   TIME OUT
* 
CDON90	LDKL	A6,DWCD01 
	CM	TIMER 
CDON95	EQU	*
	LDKL	A1,/7FFE	SET UNIT BUSY AND RECOVERY ON
	ANS	A1,DWTST,A6	 
	LDKL	A1,-1 
	ST	A1,DWTSAV,A6	INDICATE RECOVERY
	LDK	A5,DWTSB3	GET STACK BASE 
	ADR	A5,A6
	RB	CDON05
* 
	EJECT		DRCD02
* 
* 
*********************** 
*                     * 
*  INTERRUPT HANDLER  * 
*                     * 
*********************** 
* 
* 
*          OUTPUT BIT                  1          12 13 14 15 
*   INPUT BIT 
*          1  READY AFTER UNREADY 
*          2  BAD TRACK FLAG           X           X
*          4  RECORD NOT FOUND                           X
*          6  SEEK ERROR                                 X
*          9  DRIVE NUMBER
*         12  INCORRECT LENGTH                     X
*         13  PARITY ERROR                            X 
*         14  THROUGHPUT ERROR                           X
*         15  NOT OPERABLE                                  X 
* 
IHCD	EQU	*
	ST	P,INTSAV	SAVE LAST INTERRUPT
	MSR	8,A15	SAVE REGISTERS ON STACK
	LDKL	A6,DWCD01	DWT ADDRESS 
	SST	A1,CUADR	GET STATUS
	LDR	A2,A1
	ANK	A1,/F	KEEP BITS
	SLL	A2,1 
	RB(N)	CDREDY	READY INTERRUPT 
	SLL	A2,1 
	RF(NN)	IHCD40	NOT BAD TRACK FLAG 
	ORKL	A1,/4004	INDICATE BAD TRACK FLAG
* 
	EJECT		DRCD02
* 
* 
IHCD40	EQU	*
	ANKL	A2,/2800
	RF(Z)	IHCD50 
	ORK	A1,2 
IHCD50	EQU	*
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	LDR	A3,A1	RETURN CODE
	LD	A2,DWTSAV,A6
	RF(NZ)	IHCD70	VO:NAM CALLING 
	ANK	A3,1 
	ABL(NZ)	END:IO	NOT OPERABLE
IHCD70	EQU	*
	LD	A5,DWTA5,A6	GET STACK POINTER 
	LD	A4,DWTA4,A6	GET RETRY COUNTER 
	RTN	A5 
* 
	EJECT		DRCD02
* 
**********
* VO:NAM *
**********
* 
* 
VO:NAM	EQU	*
	CF	A5,SEEKZ
	ANK	A1,3 
	RF(NZ)	VO:NA7	ERROR
	MLK	3
	DATA	/800,PHSECL,/4000+LOSECL+LOSECL 
	MS	3,DWTCOP,A6	PREPARE CIO WORK AREA 
	MLK	3
	DATA	0,BUFFER,/8000+LOSECL 
	MS	3,DWTCOP+6,A6 
	CF	A5,READ00	READ SECTOR 0 TO DRIVER BUFFER
	CM	DWTBSE+4,A6	CLEAR IN CASE OF ERROR
	ANK	A1,/F
	RF(NZ)	VO:NA7	ERROR
	LD	A1,DWTOR,A6 
	ANKL	A1,/300	UNIT NUMBER 
	LDK	A2,0 
	LDK	A3,6 
	MS	3,DWTBSE,A6	UPDATE DRIVER BUFFER INDICATOR
	LDKL	A2,BUFFER 
	LDK	A3,/FC	FILE CODE 
	LD	A1,DWTSAV,A6
	RF(N)	VO:NA5 
	LDKL	A3,/80FC	INDICATE TEST STATUS 
VO:NA5	EQU	*
	CF	A15,VOLGET	VOLUME NAME TO DWT 
* 
	EJECT		DRCD02
* 
* 
	LDK	A1,0	RESET RETURN CODE 
	LDK	A3,0	CYLINDER NUMBER 
	RF	VO:NA8
VO:NA7	EQU	*
	LDK	A1,6	CLEAR SEX BYTES 
	CF	A15,VOLCLR
	LDR	A1,A3	RETURN CODE
	LDKL	A3,/FFFF	DUMMY CYLINDER NUMBER
VO:NA8	EQU	*
	IFT	NUNITS=1 
	ST	A3,DWTCYL,A6	HEAD POSITION
	XIF
	IFT	NUNITS=2 
	CF	A15,INXDWT
	LD	A2,DWTSMD,A6
	RF(NZ)	VO:NA9	SMD
	LC	A4,DWTOR,A6 
	ANK	A4,2 
	ADR	A4,A6
VO:NA9	EQU	*
	ST	A3,DWTCYL,A4
	XIF
	RTN	A5 
* 
* 
*   TIMER POINTER 
* 
TIMER	DATA	0
* 
	EJECT		DRCD02
* 
* 
************************************* 
*                                   * 
*   DEVICE WORK TABLE               * 
*                                   * 
************************************* 
* 
* 
DWCD01	EQU	*
	DATA	0 
	DATA	/8000	DWT STATUS
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	CDADR	ACTIVATION ADDRESS
	DATA	0	TTAB ADDRESS
	DATA	0	WAIT/ACTIVATE INDICATOR 
	DATA	0	TERMINAL QUEUE
* 
	IFT	MMUPAG=1 
	DATA	0	SAVE AREA USER ECB ADDRESS
	DATA	ECBCD1	MMU ECB ADDRESS
	XIF
* 
DWTTRA	EQU	*-DWCD01 
	DATA	0 
	DATA	0,0,0	SAVE AREA FOR REGISTERS 
DWTBSE	EQU	*-DWCD01	DRIVER BUFFER INDICATOR 
	DATA	0,0,0 
DWTSAV	EQU	*-DWCD01 
	DATA	0 
* 
	EJECT		DRCD02
* 
* 
	DATA	0 
	DATA	/8000	NEW VOLUME LOADED INDICATOR UNIT 1
	DATA	/8000	NEW VOLUME LOADED INDICATOR UNIT 2
	DATA	/8000	UNIT 3
	DATA	/8000	UNIT 4
	DATA	/FFFF,/FFFF,/FFFF	VOLUME NAME UNIT 1
	DATA	/FFFF,/FFFF,/FFFF	VOLUME NAME UNIT 2
	IFT	NUNITS=2 
	DATA	/FFFF,/FFFF,/FFFF	VOLUME NAME UNIT 3
	DATA	/FFFF,/FFFF,/FFFF	VOLUME NAME UNIT 4
	XIF
DWTBA	EQU	*-DWCD01
	DATA	0,0 
DWTLOS	EQU	*-DWCD01	LOGICAL SECTOR COUNTER
	DATA	0 
DWTSEC	EQU	*-DWCD01	PHYSICAL SECTOR NUMBER
	DATA	0,0 
DWTMAS	EQU	*-DWCD01	LOGICAL SECTOR MASK 
	DATA	0 
DWTSMD	EQU	*-DWCD01 
	DATA	SMDIND	FLAG INDICATING SMD DRIVE(S) 
* 
	EJECT		DRCD02
* 
*   CIO WORK AREAS
* 
DWTCIO	EQU	*-DWCD01	CIO INTRUCTIONS AREA
	CIO	A2,1,CUAD1	CIO ON 1ST UNIT 
	IFT	NUNITS=2 
	CIO	A2,1,CUAD2	CIO ON 2ND UNIT 
	XIF
DWTSEK	EQU	*-DWCD01	SEEK OPERATION AREA 
	DATA	SEEKCO
DWTSEZ	EQU	*-DWCD01	SEEK TO ZERO OPERATION AREA 
	DATA	SEZCOM
DWTWHA	EQU	*-DWCD01	WRITE HOME ADDRESS AND SECTOR MARK
	DATA	WHACOM
	DATA	PHSECL
	DATA	WHACOM+1
	DATA	PHSECL
	DATA	WHACOM+2
	DATA	PHSECL
	DATA	WHACOM+3
	DATA	PHSECL
	DATA	WHACOM+/804	INTERRUPT BIT SET 
	DATA	PHSECL
DWTCOP	EQU	*-DWCD01	CIO WORK AREA 
	DATA	0,0,0,0 
	DATA	0,0,0,0 
	DATA	0,0,0 
DWTRE1	EQU	*-DWCD01	GRAND TOTAL RETRY COUNTER 
	DATA	0 
DWTRE2	EQU	*-DWCD01	TOTAL RETRY COUNTER 
	DATA	0 
* 
	EJECT		DRCD02
* 
* 
DWTCYL	EQU	*-DWCD01	PRESENT CYLINDER NUMBER 
	DATA	/FFFF	UNIT 1
	IFT	NUNITS=2 
	DATA	/FFFF 
	XIF
	DATA	0,0 
	DATA	0,0 
	DATA	0,0 
DWTSB3	EQU	*-DWCD01-2	STACK 
	IFT	RAW=1
DWTRAW	EQU	*-DWCD01	READ AFTER WRITE SAVE AREA
	DATA	0,0,0,0 
	DATA	0 
	XIF
	IFT	MMUPAG=1 
ECBCD1	EQU	*
	DATA	0,0,0,0,0,0,0 
	XIF
DWTSMX	EQU	*-DWCD01	MAX SECTOR NUMBER 
	DATA	MXSE11,MXSE12 
	DATA	MXSE21,MXSE22 
	IFT	NUNITS=2 
	DATA	MXSE31,MXSE32 
	DATA	MXSE41,MXSE42 
	XIF
DWTSPC	EQU	*-DWCD01	SECTORS PER CYLINDER
	DATA	SPCUN1
	DATA	SPCUN2
	IFT	NUNITS=2 
	DATA	SPCUN3
	DATA	SPCUN4
	XIF
* 
	END

Full view