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

⟦1260d4efa⟧

    Length: 58796 (0xe5ac)
    Notes: pts_type(SC)
    Names: »DRDU01.SC«

Derivation

└─⟦a16d9b08d⟧ Bits:30009712 Philips computer tape "TOSS11"
    └─⟦this⟧ »UPD2/DRDU01.SC« 
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
    └─⟦this⟧ »TOSSWORK/DRDU01.SC« 

PTS(SC)

	IDENT DRDU01 	REL 11.0 81-08-12 870105041100 

			=4, ERROR WHEN A3 AND PASSING LIMIT /FFFE
			=4, REL 11.0 81-05-18
			=3, CONDITION FOR CPU857 CHANGED 
			=3, REL 11.0 81-04-02
			=2, A2 AND A3 DISCS IN SAME SYSTEM 
			=2, REL 11.0 81-01-26 ,DATA CORRUPTED
			=1, PRR 11.0 80-11-19 ,ATTACH BIT CLEARED BY RECOVERY
* 
* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRDU01 = DRIVER FOR ONE/TWO DISC UNITS
* 
*   PTS 6875 (X1215) AND/OR PTS 6876 (X1216)
* 
* 
* 
* 
* 
**************************************************
* 
* 
*   THIS DISC DRIVER HANDLES UP TO TWO DISC 
*   DRIVES X1215,X1216 CONNECTED TO CPU VIA IOP 
*   ON MULTIPLEX 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			DRDU01			DRDU01
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	DUADR	ACTIVATION ADDRESS 
	ENTRY	DUON	RECOVERY ROUTINE
	ENTRY	IHDU1	INTERRUPT HANDLER DISC UNIT NO. 1
	ENTRY	IHDU	INTERRUPT HANDLER DISC UNIT NO. 1 
	ENTRY	IHDU2	INTERRUPT HANDLER DISC UNIT NO. 2
	ENTRY	DWDU01	DWT ADDRESS DISC UNIT NO. 1 
	EJECT			DRDU01 
* 
* 
************* 
* 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	DWTA2	SAVE AREA A2 
	EXTRN	DWTA4	SAVE AREA A4 
	EXTRN	DWTA5	SAVE AREA A5 
	EXTRN	DWTSB1	STACK BASE 1 IN DWT 
	EXTRN	DWTSB2	STACK BASE 2 IN DWT 
	EXTRN	DWTUEC	USER ECB ADDRESS
	EXTRN	DWTORD	SAVE AREA FOR ORDER 
	EXTRN	DWTNVL	NEM VOLUME LOADED INDICATORS
	EXTRN	DWTVOL	VOLUME NAMES
	EXTRN	DWTTAB	TTAB ADDRESS
	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 
	EXTRN	DK:DIX	DEVICE INDEX
	EJECT			DRDU01 
* 
* 
**************************
*                        *
*  CONDITIONAL ASSEMBLY  *
*                        *
* 
* 
*   READ AFTER WRITE MAY BE EXCLUDED FOR ORDER /15
*   BY SETTING X:A = 0
* 
X:A	EQU	0 
RAW	EQU	X:A 
* 
* 
*   THIS DRIVER CAN HANDLE TWO DISC UNITS 
*   IF X:B := 2 
* 
X:B	EQU	1 
NUNITS	EQU	X:B
* 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	1
* 
	EJECT		DRDU01
* 
* 
*	A PROGRAM VERSION USING THE INSTRUCTION SET OF
*	CPU 857 IS OBTAINED BY SETTING CPU857 EQU 1 
* 
CPU857	EQU	0		=3
* 
* 
*	PROGRAM VERSION FOR FORMAT
*	A2 IS OBTAINED BY SETTING VERSA2 EQU 1
*	A3 IS OBTAINED BY SETTING VERSA3 EQU 1
* 
X:C	EQU	1 
VERSA2	EQU	X:C
* 
X:D	EQU	1 
VERSA3	EQU	X:D
* 
* 
	EJECT			DRDU01			DRDU01
* 
* 
************* 
* CONSTANTS * 
************* 
* 
* 
DAF1	EQU	/28	DEVICE ADDRESS FIXED DISC NO. 1
DAC1	EQU	/08	DEVICE ADDRESS CARTRIDGE DISC NO. 1
DAF2	EQU	/38	DEVICE ADDRESS FIXED DISC NO. 2
DAC2	EQU	/18	DEVICE ADDRESS CARTRIDGE DISC NO. 2
WER1	EQU	/10	MULTIPLEXOR ADDRESS
CUADR	EQU	/08	CONTROL UNIT ADDRESS
* 
MAXSEC	EQU	6528	MAX NO OF SECTORS ON UNPACKED PTS 6875
SECLEN	EQU	256	SECTOR LENGTH, CHARACTERS
PHSECL	EQU	384	PHYSICAL SECTOR LENGTH 
QRETRY	EQU	4	NO OF RETRIES
TIME	EQU	1000	1 MIN 40 SEC
* 
* 
	EJECT			DRDU01			DRDU01
* 
* 
	DATA	0	INDICATES NO MMU BUFFER 
	DATA	DK:DIX	DEVICE INDEX 
DUADR	DATA	DUAD	ACTIVATION ADDRESS
	DATA	0	ABORT ROUTINE ADDRESS 
* 
	IFT	VERSA3=1 
BUFFER	RES	193
	XIF
* 
	IFT	VERSA3=0 
BUFFER	RES	25 
* 
	IFT	RAW=1
	RES	103
	XIF
	IFT	VERSA2=1		=2 
CYLBUF	RES	2	CYL ID CHECK BUFFER	=2 
	XIF			=2 
* 
	EJECT			DRDU01			DRDU01
* 
* 
***************** 
*               * 
*  ACTIVATION   * 
*               * 
***************** 
* 
* 
DUAD	EQU	*
	CM	DWTRTY,A6	RETRY INDICATOR 
	CM	DWTFBU,A6	RESET DRIVER BUFFER INDICATOR 
	LDK	A1,0 
	LC	A1,DWTOR,A6	GET INDEX 
	IFT	NUNITS=1 
	SUK	A1,1 
	XIF
	IFT	NUNITS=2 
	SUK	A1,3 
	XIF
	RF(P)	DUERR	FAULT IN INDEX 
* 
DUA:00	EQU	*
* 
	LDK	A5,DWTSB3
	ADR	A5,A6	LOAD STACK BASE
	IFT	MMUPAG=1 
	MLR	2,A8	GET 18 BIT BUFFER ADDRESS 
	SLC	A1,4	MOST SIGN. BITS 
	ANK	A1,3 
	SRL	A2,1	WORD ADDDRESS 
	CF	A5,MMULOG	GET LOGICAL ADDRESS 
	XIF
* 
	CF	A15,NVLCHK	CHECK IF NEW VOLUME LOADED 
*			SAVE INDEX AND ORDER
	ADK	A7,0	SET CR
	RF(NZ)	DUA:05	NOT TEST STATUS ORDER
* 
	EJECT		DRDU01
* 
* 
********************* 
*                   * 
*   TEST STATUS     * 
*                   * 
********************* 
* 
* 
	ORS	A1,ECBRC,A8	NVL BIT
	LDKL	A2,/200 
	ANS	A2,DWTOR,A6	VO:NAM ON FIRST OR SECOND UNIT 
	LDK	A2,1 
	ST	A2,DWTSAV,A6	INDICATE TEST STATUS 
	CF	A5,VO:NAM	READ VOLUME NAME
	ADK	A1,0 
	RF(NZ)	TESEND	NOT OPERABLE 
	LD	A2,DWTORD,A6	RESTORE INDEX AND ORDER
	ST	A2,DWTOR,A6 
	LD	A8,DWTECB,A6	ECB ADDRESS
	CF	A15,VOLNAM	TRANSFER VOLUME NAME TO USER BUFFER
	LDK	A1,0	RESET RETURN CODE 
TESEND	EQU	*
	LDKL	A2,-1 
	ST	A2,DWTSAV,A6	INDICATE TEST STATUS DONE
	ABL	END:IO	PERFORM ENDIO 
* 
	EJECT			DRDU01 
* 
*************************************** 
*                                     * 
*   NEW VOLUME LOADED CHECK           * 
*   ORDER CODE CHECK                  * 
*                                     * 
*************************************** 
* 
*   INPUT: A1=NVL RETURN CODE FROM NVLCHK 
*          A7=ORDER CODE
* 
* 
DUA:05	EQU	*
	ADK	A1,0	CHECK IF NEW VOLUME LOADED
	ABL(NZ)	END:IO	PERFORM TENDIO
	SUK	A7,1 
	RF(Z)	DUA:10	BASIC READ
	SUK	A7,4 
	RF(Z)	DUA:10	BASIC WRITE 
	SUK	A7,12	 
	RF(Z)	DUA:10	PHYSICAL READ 
	SUK	A7,4 
	RF(Z)	DUA:10	PHYSICAL WRITE
	SUK	A7,10
	RF(Z)	FORMAT	FORMAT VOLUME 
* 
DUERR	ABL	DISIOE	REQUEST ERROR
* 
INCLEN	EQU	*	REQUESTED LENGTH ERROR 
	LDKL	A1,/8008
	ABL	END:20	
	EJECT		DRDU01
* 
* 
**************************
*                        *
*   FORMAT VOLUME         * 
*                        *
**************************
* 
* 
FORMAT	EQU	*
	LDK	A7,204	NUMBER OF CYLINDERS ON PTS 6875 
	LD	A1,ECBCW1,A8	GET DISC TYPE
	IFT	VERSA2+VERSA3=2
	ECR	A2,A1
	XIF
	ANK	A1,1 
	RF(NZ)	FORM03	PTS 6875 
	ADK	A7,204	PTS 6876
FORM03	EQU	*
* 
	IFT	VERSA2+VERSA3=2
	LDKL	A3,BUFFER 
	LDKL	A1,/C001	WRITE ONE WORD 
	ANK	A2,3 
	SUK	A2,3 
	RF(NZ)	FORM05	A1 OR A2 
	LDKL	A1,/C0C1	WRITE 386 BYTES
	ADKL	A3,PHSECL 
FORM05	EQU	*
	ST	A1,DWTFBU,A6	SAVE 1ST WER 
	XIF
* 
	IFT	VERSA2=1 
	IFT	VERSA3=0 
	LDKL	A3,BUFFER 
	XIF
* 
	IFT	VERSA2=0 
	IFT	VERSA3=1 
	LDKL	A3,BUFFER+PHSECL	POSITION FOR CYL ID
	XIF
* 
	STR	A3,A6	DRIVER BUFFER POINTER
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	CM	DWTCYL,A2	CYLINDER ZERO 
	XIF
	IFT	NUNITS=1 
	CM	DWTCYL,A6	CYLINDER ZERO 
	XIF
* 
	EJECT		DRDU01
* 
* 
FORM20	EQU	*
	LDK	A4,QRETRY
FORM30	EQU	*
	IFT	NUNITS=2 
	CF	A5,INXUNI	GET UNIT INDEX
	XIF
	CF	A5,SEEK	SEEK CYLINDER 
	SLL	A1,5	STATUS
	RF(NN)	FORM40	SEEK ERROR 
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	LD	A1,DWTCYL,A2
	XIF
	IFT	NUNITS=1 
	LD	A1,DWTCYL,A6
	XIF
	ST*	A1,0,A6	PREPARE DRIVER BUFFER WITH CYL. ID 
	LDK	A3,0 
	CF	A5,SKEW	WRITE SECTOR 0 ON EVEN CYLINDERS
*			WRITE SECTOR 8 ON ODD CYLINDERS 
	ORK	A3,1	ORDER CODE: WRITE 
* 
	IFT	VERSA2+VERSA3=2
	LD	A1,DWTFBU,A6	GET 1ST WER
	XIF
* 
	IFT	VERSA2=1 
	IFT	VERSA3=0 
	LDKL	A1,/C002
	XIF
* 
	IFT	VERSA2=0 
	IFT	VERSA3=1 
	LDKL	A1,/C0C1	1ST WER WRITE 386 BYTES
	XIF
* 
	LDKL	A2,BUFFER 
	CF	A5,CIO:50	CIO:50 SECTOR 
	ANK	A1,/1F 
	RF(NZ)	FORM40	WRITE ERROR
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	IM	DWTCYL,A2 
	XIF
	IFT	NUNITS=1 
	IM	DWTCYL,A6 
	XIF
	SUK	A7,1	DECREMENT CYLINDER COUNTER
	RB(NZ)	FORM20
	LD	A2,ECBCW1,A8	GET FORMAT AND TYPE OF DISC
	ABL	TRANPA	PUT FORMAT AND TYPE IN DWT
FORM40	EQU	*
	CF	A5,SEEKZ	SEEK CYLINDER 0
	SLL	A1,6 
	RF(N)	FORM50	SEEK ERROR
	SUK	A4,1	RETRY COUNTER 
	RB(NZ)	FORM30	RETRY
FORM50	EQU	*
	LDK	A1,2	SEEK ERROR RETURN CODE
	ABL	END:IO	PERFORM END IO
	EJECT			DRDU01			DRDU01
* 
* 
************************************************* 
*                                               * 
*   CHECK IF ALLOWED SECTOR LENGTH, BUFFER SIZE * 
*   AND SECTOR NUMBER                           * 
*   SAVE BUFFER ADDRESS AND SET SECTOR COUNTER  * 
*                                               * 
************************************************* 
* 
*   INPUT: ECB
*   OUTPUT: A7=SECTOR COUNTER 
*           DWTUBU=USER BUFFER POINTER
* 
* 
DUA:10	EQU	*
	LD	A3,ECBRL,A8	REQUESTED LENGTH
	RB(Z)	INCLEN 
	ECR	A7,A3	DIVIDE BY 256 TO GET NUMBER OF SECTORS 
	ANK	A3,/FF	SET CONDITION REGISTER
	RB(NZ)	INCLEN	NOT AN INTEGER NUMBER OF SECTORS 
	LD	A3,ECBCW2,A8	SECTOR NUMBER WHERE THE BUFFER BEGIN 
	RB(N)	DUERR	INCORRECT SECTOR NUMBER
	CW	A3,DWTSMX,A2
	RB(NL)	DUERR	INCORRECT SECTOR NUMBER 
	ADR	A3,A7
	CW	A3,DWTSMX,A2
	RB(G)	INCLEN	SECTOR NUMBER OVERFLOW
* 
	IFT	MMUPAG=0 
	LD	A1,ECBBA,A8 
	ST	A1,DWTUBU,A6	USER BUFFER POINTER
	XIF
* 
	EJECT		DRDU01
* 
	IFT	VERSA2+VERSA3=2
* 
* 
******************************
*                            *
*   DISC VERSION SEPARATION  *
*                            *
***************************** 
* 
* 
	LD	A2,DWTFOR,A2
	SUK	A2,2 
	RF(Z)	RW:800	VERSION A2
	XIF
* 
	EJECT		DRDU01
* 
	IFT	VERSA3=1 
* 
************************************* 
*                                   * 
*                                   * 
*   GET PHYSICAL SECTOR NUMBER BY   * 
*   DIVIDE BY 3                     * 
*                                   * 
************************************* 
* 
	IFT	CPU852=0 
	LDK	A1,0	PREPARE FOR DIVISION
	LD	A2,ECBCW2,A8	GET LOGICAL SECTOR NUMBER
	DVK	3
*   A1=REMAINER=LOGICAL SECTOR POSITION 
*   A2=QUOTIENT=PHYSICAL SECTOR NUMBER ON DISC
	XIF
* 
	IFT	VERSA3=1 
	IFT	CPU852=1 
	LD	A1,ECBCW2,A8
	LDR	A3,A1	SECTOR NUMBER
	LDK	A2,0 
DVK:00	EQU	*
	ADR	A2,A3	I:= I+I/4
	SRL	A3,2	I:= I/4 
	RB(NZ)	DVK:00
	SRL	A2,2	TRUNCATE
	SUR	A1,A2
	SUR	A1,A2
	SUR	A1,A2	REST AFTER LOOP
	SUK	A2,1 
DVK:10	EQU	*
	ADK	A2,1 
	SUK	A1,3	DIVIDE BY 3 
	RB(NN)	DVK:10
	ADK	A1,3	REST
*   A1=REMAINER=LOGICAL SECTOR POSITION 
*   A2=QUOTIENT=PHYSICAL SECTOR NUMBER ON DISC
* 
	EJECT		DRDU01
	XIF
* 
	IFT	VERSA3=1 
* 
************************************* 
*                                   * 
*   SAVE PHYSICAL SECTOR NUMBER     * 
*   AND SECTOR POSITION             * 
*   BRANCH ACCORDING TO SECTOR      * 
*   POSITION                        * 
*                                   * 
************************************* 
* 
*   INPUT: A1=SECTOR POSITION INDICATOR 
*          A2=LOGICAL SECTOR NUMBER / 3 
* 
* 
	ADR	A2,A2
	STR	A2,A6	SAVE PHYSICAL SECTOR NUMBER
	SUK	A1,1 
	IFT	RAW=1
	ST	A1,DWTSEP,A6	SAVE SECTOR POSITION 
	ST	A2,DWTSEI,A6	SAVE 1ST PHYS. SECTOR NUMBER 
	XIF
* 
	IFT	VERSA3=1 
*			LOGICAL SECTOR POSITION 
	RF(N)	RW:300	,XXXX  ,      , 
	RF(Z)	RW:200	,    XX,XX    , 
*			,      ,  XXXX, 
* 
	EJECT		DRDU01
* 
************************************* 
*                                   * 
*   READ/WRITE FROM SECTOR IN       * 
*   POSITION ,      ,  xxxx,        * 
*                                   * 
************************************* 
* 
	IMR	A6	LOG. SECTOR IN NEXT PHYSICAL
	IFT	RAW=1
	IM	DWTSEI,A6	SAVE FOR READ AFTER WRITE 
	XIF
* 
	IFT	VERSA3=1 
	CF	A5,IOROUT 
	DATA	/0084 
	SUK	A7,1 
	RF	RW:300
* 
	EJECT		DRDU01
* 
************************************* 
*                                   * 
*   READ/WRITE FROM SECTOR IN       * 
*   POSITION ,    xx,               * 
*                                   * 
************************************* 
* 
* 
RW:200	EQU	*
	CF	A5,IOROUT 
	DATA	/0048 
	SUK	A7,2	NUMBER OF SECTORS 
	RF(N)	RW:230	1 SECTOR IN IO
	RF(NZ)	RW:260	>2 SECTORS IN IO 
*			,    XX,XXXXXX, 
	CF	A5,IOROUT 
	DATA	/00C0 
	RF	RW:600
RW:230	EQU	*	,    XX,XX    ,
	CF	A5,IOROUT 
	DATA	/0040 
	RF	RW:600
RW:260	EQU	*	,    XX,XXXXXX,
	CF	A5,IOROUT 
	DATA	/80C0 
* 
	EJECT		DRDU01
* 
************************************
*                                  *
*   DIRECT READ/WRITE AS LONG      *
*   AS POSIBLE                     *
*                                  *
************************************
* 
* 
RW:300	EQU	*
	SUK	A7,3	SECTOR COUNTER
	RF(NG)	RW:500	LESS THAN FOUR SECTORS IN IO 
	CF	A5,IOROUT 
	DATA	/80C0 
	CF	A5,IOROUT 
	DATA	/80C0 
	RB	RW:300
* 
	EJECT		DRDU01
* 
************************************
*                                  *
*   READ/WRITE ON THE LAST SECTORS *
*   IN IO                          *
*                                  *
************************************
* 
* 
RW:500	EQU	*
	RF(Z)	RW:580	3 SECTORS 
	ADK	A7,2 
	RF(P)	RW:560	2 SECTORS 
	RF(N)	RW:600	0 SECTORS 
RW:530	EQU	*	,XXXX  ,      ,
	CF	A5,IOROUT 
	DATA	/0080 
	RF	RW:600
RW:560	EQU	*	,XXXXXX,XX    ,
	CF	A5,IOROUT 
	DATA	/80C0 
	CF	A5,IOROUT 
	DATA	/0040 
	RF	RW:600
RW:580	EQU	*	,XXXXXX,XXXXXX,
	CF	A5,IOROUT 
	DATA	/80C0 
	CF	A5,IOROUT 
	DATA	/00C0 
* 
	EJECT		DRDU01
* 
* 
RW:600	EQU	*
	IFT	RAW=1
* 
************************
*                      *
*   READ AFTER WRITE   *
*                      *
************************
* 
*   DWTSEI=1:ST PHYSICAL SECTOR NUMBER IN IO
*   1ST POS IN DWT=LAST PHYSICAL SECTOR NUMBER IN IO
*   A7=SECTOR COUNTER 
* 
	LD	A7,DWTOR,A6 
	ANK	A7,/FF	GET ORDER 
	SUK	A7,/15 
	RF(NZ)	RW:700	NOT PHYSICAL WRITE 
	LDKL	A2,-/100
	LD	A1,DWTSEP,A6	GET 1ST SECTOR POSITION
	RF(Z)	RW:645	,    XX,
	RF(P)	RW:640	,  XXXX,
	ADK	A2,/80 
RW:640	EQU	*
	ADK	A2,/80 
RW:645	EQU	*
	ST	A2,ECBEL,A8	PREPARE EFFECTIVE LENGTH
	LD	A1,DWTSEI,A6	RAW FROM THIS SECTOR 
	LDR*	A7,A6	GET LAST SECTOR NO
	SUR	A7,A1	GET NUMBER OF PHYSICAL SECTORS 
	STR	A1,A6
* 
	EJECT		DRDU01
* 
* 
RW:650	EQU	*
	CF	A5,IOROUT 
	DATA	/40C0 
	IMR	A6	NEXT PHYSICAL SECTOR
	LDKL	A1,PHSECL 
	ADS	A1,ECBEL,A8	UPDATE ECBEL 
	SUK	A7,1 
	RB(NZ)	RW:650
	LD	A7,ECBRL,A8 
	ST	A7,ECBEL,A8	CORRECT EFFECTIVE LENGTH
	XIF
* 
	IFT	VERSA3=1 
RW:700	EQU	*
	LDK	A1,0	RETURN CODE 
	ABL	END:20	ENDIO 
* 
	XIF
* 
	EJECT		DRDU01
* 
	IFT	VERSA2=1 
* 
* 
********************************* 
*                               * 
*   DISC FORMAT A2              * 
*                               * 
********************************* 
* 
* 
RW:800	EQU	*
	CF	A5,DIV31
	IFT	RAW=1
	ST	A7,DWTSEI,A6	SAVE NUMBER OF SECTORS FOR READ AFTER WRITE
	XIF
* 
	IFT	VERSA2=1 
RW:850	EQU	*
	CF	A5,IOROUT 
	DATA	/A080	INDICATE FORMAT A2
	LDKL	A1,/100 
	ADS	A1,DWTUBU,A6	UPDATE USER BUFFER POINTER
	SUK	A7,1 
	RB(NZ)	RW:850	MORE SECTORS IN IO 
* 
	EJECT		DRDU01
* 
* 
	IFT	RAW=1
	LD	A7,DWTOR,A6	GET ORDER 
	ANK	A7,/FF 
	SUK	A7,/15 
* 
	IFT	VERSA3=1 
	RB(NZ)	RW:700	NOT PHYSICAL WRITE 
	XIF
* 
	IFT	VERSA3=0 
	IFT	VERSA2=1 
	IFT	RAW=1
	RF(NZ)	RW:905
	XIF
* 
	IFT	VERSA2=1 
	IFT	RAW=1
	CM	ECBEL,A8	PREPARE FOR READ AFTER WRITE 
	LD	A7,DWTSEI,A6
	CF	A5,DIV31
* 
	EJECT		DRDU01
* 
* 
RW:900	EQU	*
	CF	A5,IOROUT 
	DATA	/E080	READ AFTER WRITE
	SUK	A7,1 
	RB(NZ)	RW:900
	XIF
* 
	IFT	VERSA2+VERSA3=2
	RB	RW:700
	XIF
* 
	IFT	VERSA3=0 
	IFT	VERSA2=1 
RW:905	EQU	*
	LDK	A1,0	RESET RETURN CODE 
	ABL	END:20 
	XIF
* 
	EJECT		DRDU01
* 
*********************************************** 
*                                             * 
*   IOROUT PERFORM READ OR WRITE AND SEEK     * 
*   IF NECESSARY                              * 
*                                             * 
*********************************************** 
* 
*   INPUT : ONE DATA WORD AFTER CF
*          BIT 0 :INDICATES DIRECT IO 
*          BIT 1 :INDICATES READ AFTER WRITE
*          BIT 2 :INDICATES FORMAT A2 
*          BIT 8-11:NUMBER OF WORDS/16
*          BIT12-15:START IN DRIVER BUFFER/32 
*   AFTER SEEK THE CYLINDER ID WILL BE CHECKED BY A READ
*   DWTBSE CONTAINS THE PRESENT SECTOR IN THE DRIVER BUFFER 
*   DWTRTY INDICATES RETRIES DONE 
*   DWTSWD SAVED WORD FROM USER BUFFER WHEN IO NOT VIA DRIVER BUFFER
* 
IOROUT	EQU	*
	LDR*	A3,A6	GET PHYSICAL SECTOR NUMBER
	SRL	A3,5	GET CYLINDER NUMBER 
* 
	IFT	VERSA2+VERSA3=2
	LD*	A4,4,A5	GET DATA WORD
	SLL	A4,2 
	RF(NN)	SEE:05	FORMAT A3
	ADK	A3,0 
	XIF
* 
	EJECT		DRDU01
* 
* 
	IFT	VERSA2=1 
	RF(NZ)	SEE:05	NOT CYLINDER 0 
	CF	A5,SEEKZ
	SLL	A1,6 
	RF(N)	SEE:20	ERROR 
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	CM	DWTCYL,A2	CYLINDER ZERO 
	RF	VA2BR 
	XIF
	IFT	VERSA2=1 
	IFT	NUNITS=1 
	CM	DWTCYL,A6 
	RF	VA2BR 
	XIF
* 
	EJECT		DRDU01
* 
* 
SEE:05	EQU	*
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	CW	A3,DWTCYL,A2	COMPARE WITH PRESENT 
	XIF
	IFT	NUNITS=1 
	CW	A3,DWTCYL,A6
	XIF
* 
	IFT	VERSA2=1 
	IFT	VERSA3=0 
	RF(E)	VA2:00 
	XIF
* 
	IFT	VERSA2=0 
	IFT	VERSA3=1 
	RF(E)	SEE:90	HEAD IN POSITION
	XIF
* 
	IFT	VERSA2+VERSA3=2
	RF(NE)	SEE:07	NOT SAME CYLINDER
	ADK	A4,0 
	RF(N)	VA2BR	FORMAT A2
	RF	SEE:90
* 
	EJECT		DRDU01
* 
* 
SEE:07	EQU	*
	XIF
* 
	IFT	NUNITS=1 
	ST	A3,DWTCYL,A6	NEW CYLINDER NUMBER
	XIF
* 
	IFT	NUNITS=2 
	ST	A3,DWTCYL,A2	NEW CYLINDER 
	XIF
	LDK	A4,QRETRY	NUMBER OF RETRIES
SEE:10	EQU	*
	IFT	NUNITS=2 
	CF	A5,INXUNI	DOUBLED UNIT INDEX
	XIF
	CF	A5,SEEK 
	SLC	A1,5	RETURN CODE 
	RF(N)	SEE:30	OK
* 
	EJECT		DRDU01
* 
* 
SEE:15	EQU	*
	CF	A5,SEEKZ	SEEK CYL ZERO
	SLC	A1,6	RETURN CODE 
	RF(N)	SEE:20	ERROR 
	IM	DWTRTY,A6	INDICATE RETRY
	SUK	A4,1	RETRY COUNTER 
	RB(NZ)	SEE:10	TRY AGAIN
SEE:20	EQU	*
	LDKL	A3,/FFFF
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	ST	A3,DWTCYL,A2	DUMMY CYLINDER NUMBER
	XIF
	IFT	NUNITS=1 
	ST	A3,DWTCYL,A6	DUMMY CYLINDER NUMBER
	XIF
	LDK	A1,/02	RETURN CODE 
	RF	SEE:35	END IO 
* 
	EJECT		DRDU01
* 
* 
SEE:30	EQU	*
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	XIF
	IFT	VERSA2+VERSA3=2
	LD*	A1,4,A5	GET DATA WORD
	SLL	A1,2 
	RF(NN)	SEE:31	FORMAT A3
	XIF
* 
	IFT	VERSA2=1 
	EJECT		DRDU01
* 
* 
*   FORMAT A2 
* 
	LDK	A3,0 
	CF	A5,SKEW 
	LDKL	A1,/8002	READ 2 WORDS 
	LDKL	A2,CYLBUF	READ TO CYLINDER CHECK BUFFER	=2
	CF	A5,CIO:50 
	ANK	A1,/1F	ERROR CHECK 
	RF(NZ)	SEE:32
	LD	A3,CYLBUF	GET CYLINDER ID	=2
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	CW	A3,DWTCYL,A2	CHECK IF SAME CYLINDER 
	XIF
	IFT	VERSA2=1 
	IFT	NUNITS=1 
	CW	A3,DWTCYL,A6	CHECK IF SAME CYLINDER 
	XIF
	IFT	VERSA2=1 
	RB(NE)	SEE:15	NOT SAME CYL ID
VA2BR	EQU	* 
	ABL	VA2:00 
	XIF
* 
	IFT	VERSA3=1 
	EJECT		DRDU01
* 
* 
*   FORMAT A3 
* 
SEE:31	EQU	*
	IFT	NUNITS=2 
	LD	A3,DWTCYL,A2
	XIF
	IFT	VERSA3=1 
	IFT	NUNITS=1 
	LD	A3,DWTCYL,A6
	XIF
* 
	IFT	VERSA3=1 
	SLL	A3,5	GET SECTOR NUMBER 
	ST	A3,DWTBSE,A6	SAVE FOR BSELOD
	LDK	A3,0 
	CF	A5,SKEW	TO READ SECTOR 0 OR 8 ON DISC 
	IM	DWTFBU,A6	INDICATE READ TO DRIVER BUFFER
	CF	A5,READ 
	LD	A3,DWTBSE,A6	GET SECTOR NUMBER FOR BSELOD 
	ANK	A1,/1F	ERROR CODE CHECK
	CF	A5,BSEL00 
	RF(Z)	SEE:40	OK
	XIF
* 
SEE:32	EQU	*
	IM	DWTRTY,A6	INDICATE RETRY
	SUK	A4,1	RETRY COUNTER 
	RB(NZ)	SEE:15	RETRY
SEE:35	EQU	*
	ABL	END:10 
* 
	IFT	VERSA3=1 
* 
	EJECT		DRDU01
* 
* 
SEE:40	EQU	*
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	LD	A3,DWTCYL,A2	GET CYLINDER NUMBER
	XIF
	IFT	VERSA3=1 
	IFT	NUNITS=1 
	LD	A3,DWTCYL,A6	GET CYLINDER NUMBER
	XIF
	IFT	VERSA3=1 
	CW	A3,BUFFER+PHSECL	COMPARE WITH CYL ID
	RB(NE)	SEE:15	RETRY
* 
	EJECT		DRDU01
* 
************************* 
*                       * 
*   READ AND WRITE      * 
*   FORMAT A3           * 
*                       * 
************************* 
* 
SEE:90	EQU	*
	LD	A4,DWTOR,A6	GET ORDER 
	ANK	A4,4 
	RF(Z)	READ00	READ ORDER
	LD*	A2,4,A5
	RF(N)	WRIT20	WRITE DIRECT FROM USER BUFFER 
	SLL	A2,1 
	IFT	RAW=1
	RF(N)	READWR	READ AFTER WRITE
	XIF
* 
	IFT	VERSA3=1 
	CWK	A2,PHSECL	 
	RF(E)	WRIT10	WRITE FROM DRIVER BUFFER
	IM	DWTFBU,A6	INDICATE READ TO DRIVER BUFFER
	CF	A5,REA:00	READ BEFORE WRITE 
* 
	EJECT		DRDU01
* 
* 
WRIT10	EQU	*
	LD*	A2,4,A5	GET DATA WORD
	LDR	A4,A2
	ANK	A4,/C0	GET NUMBER OF WORDS TO MOVE 
	SLL	A4,1	BYTES 
	ANK	A2,/F	BEG ADRESS IN DRIVER BUFFER
	SLL	A2,5 
	CF	A5,MOVWRI	MOVE TO DRIVER BUFFER 
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	LD	A2,DWTCYL,A2	GET CYLINDER NUMBER
	XIF
	IFT	VERSA3=1 
	IFT	NUNITS=1 
	LD	A2,DWTCYL,A6	GET CYLINDER NUMBER
	XIF
	IFT	VERSA3=1 
	ST	A2,BUFFER+PHSECL	PUT IN DRIVER BUFFER 
	IM	DWTFBU,A6	INDICATE WRITE FROM DRIVER BUFFER 
	CF	A5,WRI:00	WRITE FROM DRIVER BUFFER
	RF	SEE:95
* 
	EJECT		DRDU01
* 
* 
WRIT20	EQU	*
	IFT	MMUPAG=0 
	LDKL	A2,PHSECL	PHYSICAL SECTOR LENGTH
	ADS	A2,DWTUBU,A6	UPDATE USER BUFFER POINTER
	LD*	A4,DWTUBU,A6	GET WORD IN USER BUFFER 
	ST	A4,DWTSWD,A6	SAVE WORD
	IM	DWTFSW,A6	INDICATE SAVED WORD 
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	LD	A2,DWTCYL,A2	GET CYLINDER NUMBER
	ST*	A2,DWTUBU,A6	PUT IN USER BUFFER
	XIF
	IFT	VERSA3=1 
	IFT	MMUPAG=0 
	IFT	NUNITS=1 
	LD	A2,DWTCYL,A6
	ST*	A2,DWTUBU,A6	PUT IN USER BUFFER
	XIF
* 
	IFT	VERSA3=1 
	IFT	MMUPAG=1 
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	LD	A4,DWTCYL,A2	GET CYLINDER NUMBER
	XIF
	IFT	VERSA3=1 
	IFT	MMUPAG=1 
	IFT	NUNITS=1 
	LD	A4,DWTCYL,A6	GET CYLINDER NUMBER
	XIF
	IFT	VERSA3=1 
	IFT	MMUPAG=1 
	TS	-30,A15	SAVE REGISTERS ON STACK 
	TL	DWTPAG,A6	LOAD PAGE WITH CYL ID 
	LD	A2,DWTUBU,A6	GET LOGICAL BUFFER POINTER 
	EL	A3,PHSECL,A2	GET WORD TO SAVE 
	ES	A4,PHSECL,A2	PUT CYL ID IN POSITION 
	TL	-30,A15	GET REGISTERS 
	ST	A3,DWTSWD,A6	SAVA WORD
	IM	DWTFSW,A6	INDICATE SAVED WORD 
	XIF
* 
	IFT	VERSA3=1 
	CM	DWTFBU,A6	INDICATE WRITE FROM USER BUFFER 
	CF	A5,WRI:00	WRITE SECTOR FROM USER BUFFER 
	CF	A5,REWORD	RESTORE WORD TO USER BUFFER 
	RF	SEE:95
* 
	EJECT		DRDU01
* 
* 
	IFT	RAW=1
READWR	EQU	*
	CF	A5,REA:10	READ AFTER WRITE
	RF	SEE:97
	XIF
* 
	IFT	VERSA3=1 
READ00	EQU	*
	LD*	A2,4,A5	GET DATA WORD
	RF(N)	READ20	DIRECT READ 
	IM	DWTFBU,A6	INDICATE READ TO DRIVER BUFFER
	CF	A5,REA:00	READ TO DRIVER BUFFER 
	LD*	A1,4,A5	GET DATA WORD
	SLL	A1,1 
	LDR	A4,A1
	ANKL	A4,/180	GET NUMBER OF BYTES TO BE MOVED 
	ANK	A1,/18	GET POSITION
	SLL	A1,4 
	CF	A5,MOVRED 
	RF	SEE:95
READ20	EQU	*
	IFT	MMUPAG=0 
	LDKL	A3,PHSECL 
	ADS	A3,DWTUBU,A6	UPDATE USER BUFFER POINTER
	XIF
* 
	IFT	VERSA3=1 
	CM	DWTFBU,A6	INDICATE READ TO USER BUFFER
	CF	A5,REA:00	READ TO USER BUFFER 
SEE:95	EQU	*
	IMR	A6	UPDATE PHYSICAL SECTOR POINTER
	XIF
* 
	EJECT		DRDU01
* 
* 
SEE:96	EQU	*
	LD*	A2,4,A5	GET DATA WORD
	ANK	A2,/C0	LENGTH
	SLL	A2,1 
	ADS	A2,ECBEL,A8	UPDATE ECBEL 
* 
	IFT	MMUPAG=1 
	LDK	A1,0 
	SRL	A2,1	WORD MODE 
	DA	DWTBA1,A6	UPDATE PHYSICAL BUFFER ADDRESS
	CF	A5,MMULOG	GET LOGICAL ADDRESS 
	XIF
* 
SEE:97	EQU	*
	LDK	A1,2	UPDATE RETURN 
	ADS	A1,4,A5
	RTN	A5 
* 
	EJECT		DRDU01
* 
	IFT	VERSA2=1 
* 
* 
********************************
*                              *
*   DISC FORMAT A2             *
*                              *
********************************
* 
* 
VA2:00	EQU	*
	LDK	A4,QRETRY	RETRIES
VA2:10	EQU	*
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	XIF
	IFT	VERSA2=1 
	CF	A5,INLACE	INTERLACE AND SKEW
* 
	IFT	MMUPAG=0 
	LDKL	A1,/8080	1ST WER
	IFT	RAW=1
	LD*	A2,4,A5
	SLL	A2,1 
	RF(NN)	VA2:20	NOT READ AFTER WRITE 
	LDKL	A2,BUFFER 
	RF	VA2:35
VA2:20	EQU	*
	XIF
* 
	IFT	VERSA2=1 
	IFT	MMUPAG=1 
	LDKL	A1,/0808	1ST WER SHIFTED
	XIF
* 
	IFT	VERSA2=1 
	IFT	RAW=1
	IFT	MMUPAG=1 
	LD*	A2,4,A5
	SLL	A2,1 
	RF(NN)	VA2:20	NOT READ AFTER WRITE 
	LDKL	A1,/8080
	LDKL	A2,BUFFER 
	RF	VA2:35
VA2:20	EQU	*
	XIF
* 
	IFT	VERSA2=1 
	LD	A2,DWTOR,A6	GET ORDER 
	ANK	A2,4 
	RF(Z)	VA2:30	READ
* 
	IFT	MMUPAG=0 
	LDKL	A1,/C080
	XIF
* 
	IFT	VERSA2=1 
	IFT	MMUPAG=1 
	LDKL	A1,/080C	1ST WER SHIFTED
	XIF
* 
	IFT	VERSA2=1 
	ADK	A3,1	ORDER CODE FOR WRITE
* 
	EJECT		DRDU01
* 
* 
VA2:30	EQU	*
* 
	IFT	MMUPAG=0 
	LD	A2,DWTUBU,A6	2ND WER
	XIF
* 
	IFT	VERSA2=1 
	IFT	MMUPAG=1 
	LDK	A2,0 
	DA	DWTBA1,A6 
	SRC	A1,4	1ST WER IN POSITION 
	SLL	A2,1	2ND WER IN POSITION 
	XIF
* 
	IFT	VERSA2=1 
VA2:35	EQU	*
	CF	A5,CIO:50 
	ANK	A1,/1F 
	RF(Z)	VA2:40	IO ERROR
	IM	DWTRTY,A6 
	SUK	A4,1 
	RB(NZ)	VA2:10	RETRY
	RF	WRI:50	ERROR
* 
	EJECT		DRDU01
* 
* 
VA2:40	EQU	*
	LDR*	A3,A6	GET PHYSICAL SECTOR NUMBER
	ADK	A3,1	NEXT SECTOR 
	LDR	A2,A3
	CWK	A2,31
	RF(NE)	VA2:50	NOT CYLINDER 0 
	ADK	A3,2	CYLINDER 0 TO CYLINDER 1
VA2:50	EQU	*
	ANK	A2,/1F 
	RF(NZ)	VA2:60	SAME CYLINDER
	ADK	A3,1	NEW CYLINDER
VA2:60	EQU	*
	STR	A3,A6	PHYSICAL SECTOR NUMBER 
	RB	SEE:96
	XIF
* 
	IFT	VERSA3=1 
	EJECT		DRDU01
* 
****************************
*                          *
*   SUBROUTINES FOR WRITE  *
*   FROM USER BUFFER:      *
*   FROM DRIVER     :      *
*                          *
****************************
* 
WRI:00	EQU	*
	LDK	A4,QRETRY	RETRIES
WRI:20	EQU	*
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	XIF
	IFT	VERSA3=1 
	CF	A5,INLACE	INTERLACE SECTOR NUMBER 
	CF	A5,WRITE	CIO
	ANK	A1,/1F	RETURN CODE ? 
	CF	A5,BSELOD 
	RF(Z)	WRI:80	NO RETURN CODE
	IM	DWTRTY,A6	INDICATE RETRY
	SUK	A4,1	DECREMENT RETRY COUNTER 
	RB(NZ)	WRI:20
	CF	A5,REWORD	RESTORE WORD IF NECESSARY 
	XIF
* 
WRI:50	EQU	*
	ABL	END:10	ERROR END IO
* 
	IFT	VERSA3=1 
* 
WRI:80	EQU	*
	RTN	A5 
* 
	EJECT		DRDU01
* 
********************************* 
*                               * 
*   SUBROUTINES FOR READ TO     * 
*   USER BUFFER :               * 
*   DRIVER BUFFER :             * 
*                               * 
********************************* 
* 
REA:00	EQU	*
	LD	A3,DWTOR,A6	GET INDEX 
	ANKL	A3,/300 
	SLL	A3,6	IN POSITION 
	ORR*	A3,A6	ADD SECTOR NUMBER 
	CW	A3,DWTBSE,A6	ALLREADY READ ?
	RF(E)	REA:85 
REA:10	EQU	*
	LDK	A4,QRETRY
REA:20	EQU	*
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	XIF
	IFT	VERSA3=1 
	CF	A5,INLACE	INTERLACE SECTOR NUMBER 
	CF	A5,READ	READ SECTOR 
	ANK	A1,/F
	CF	A5,BSELOD	UPDATE DRIVER BUFFER INDICATOR
	RF(Z)	REA:30	NO RETURN CODE
REA:25	EQU	*
	IM	DWTRTY,A6	INDICATE RETRY
	SUK	A4,1	DECREMENT RETRY COUNTER 
	RB(NZ)	REA:20	RETRY
	ABL	END:20 
* 
	EJECT		DRDU01
* 
* 
REA:30	EQU	*
	LD	A3,BUFFER+PHSECL	GET CYL ID	=4
	LD	A2,DWTFBU,A6
	RF(NZ)	REA:50	READ TO DRIVER BUFFER	=4 
	IFT	MMUPAG=0 
	LD*	A3,DWTUBU,A6	GET CYLINDER ID FROM USER BUFFER
	XIF
* 
	IFT	VERSA3=1 
	IFT	MMUPAG=1 
	TS	-30,A15	SAVE REGISTERS
	TL	DWTPAG,A6	LOAD MMUPAGE
	LD	A3,DWTUBU,A6	GET LOGICAL BUFFER POINTER 
	EL	A3,PHSECL,A3	GET CYL ID 
	TL	-30,A15	RESET REGISTERS 
	XIF
* 
	IFT	VERSA3=1 
REA:50	EQU	*
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	CW	A3,DWTCYL,A2
	XIF
	IFT	VERSA3=1 
	IFT	NUNITS=1 
	CW	A3,DWTCYL,A6
	XIF
	IFT	VERSA3=1 
	RF(E)	REA:90	RIGHT CYLINDER ID 
	LDK	A1,2	SEEK ERROR
* 
	EJECT		DRDU01
* 
* 
	RB	REA:25
REA:85	EQU	*
	LD	A1,DWTFBU,A6
	RF(NZ)	REA:90	READ TO DRIVER BUFFER
	LDKL	A4,/180	BYTES TO BE MOVED 
	IFT	MMUPAG=0 
	NGR	A2,A4
	ADS	A2,DWTUBU,A6	RESET USER BUFFER POINTER FOR DIRECT MOVE 
	XIF
	IFT	VERSA3=1 
	CF	A5,MOVRED	MOVE TO USER BUFFER 
REA:90	EQU	*
	RTN	A5 
* 
	EJECT		DRDU01
* 
* 
************************************* 
*                                   * 
*   SUBROUTINES FOR MOVING WORDS    * 
*   USER BUFFER TO DRIVER BUFFER: 
*   MOVWRI                          * 
*   DRIVER BUFFER TO USER BUFFER    * 
*   MOVRED                          * 
*                                   * 
************************************* 
* 
*   A1   BUFFER ADDRESS IN
*   A2   BUFFER ADDRESS OUT 
*   A4   BUFFER LENGTH
*   A3   USED 
* 
MOVRED	EQU	*
	ADKL	A1,BUFFER 
	IFT	MMUPAG+CPU857=0
	LD	A2,DWTUBU,A6	PRESENT POINT IN USER BUFFER 
	XIF
* 
	IFT	VERSA3=1 
	IFT	CPU852+MMUPAG=0
	IFT	CPU857=1 
	LD	A2,DWTUBU,A6	GET USER BUFFER POINTER
	ADS	A4,DWTUBU,A6	UPDATE USER BUFFER POINTER
	MVB	A4 
	XIF
* 
	IFT	VERSA3=1 
	IFT	CPU852=0 
	IFT	MMUPAG=1 
	LD	A2,DWTBA2,A6	GET PHYSICAL BUFFER ADDRESS
	SLL	A2,1	BYTE MODE 
	TS	-30,A15	SAVE REGISTERS
	TL	DWTPAG,A6 
	LD	A2,DWTUBU,A6	GET LOGICAL ADDRESS
	MVSU	A4
	XIF
* 
	IFT	VERSA3=1 
	RF	MOV:00
* 
	EJECT		DRDU01
* 
* 
MOVWRI	EQU	*
	ADKL	A2,BUFFER	DRIVER BUFFER POINTER 
	IFT	MMUPAG+CPU857=0
	LD	A1,DWTUBU,A6	PRESENT POINT IN USER BUFFER 
	XIF
* 
	IFT	VERSA3=1 
	IFT	CPU852+MMUPAG=0
	IFT	CPU857=1 
	LD	A1,DWTUBU,A6	GET USER BUFFER POINTER
	ADS	A4,DWTUBU,A6	UPDATE USER BUFFER POINTER
	MVB	A4 
	XIF
* 
	IFT	VERSA3=1 
	IFT	CPU852=0 
	IFT	MMUPAG=1 
	LD	A1,DWTBA2,A6	GET PHYSICAL BUFFER ADDRESS
	SLL	A1,1	BYTE MODE 
	TS	-30,A15	SAVE REGISTERS
	TL	DWTPAG,A6 
	LD	A1,DWTUBU,A6	GET LOGICAL ADDRESS
	MVUS	A4
	XIF
* 
	IFT	VERSA3=1 
MOV:00	EQU	*
	IFT	MMUPAG+CPU857=0
	ADS	A4,DWTUBU,A6	UPDATE USER BUFFER POINTER
	XIF
* 
	IFT	VERSA3=1 
	IFT	MMUPAG=1 
	TL	-30,A15	RESET REGISTERS 
	XIF
* 
	IFT	VERSA3=1 
	IFT	MMUPAG+CPU857=0
	IFT	CPU852=1 
* 
	EJECT		DRDU01
* 
* 
MOV:10	EQU	*
	LDR*	A3,A1 
	STR	A3,A2
	ADK	A1,2 
	ADK	A2,2 
	SUK	A4,2 
	RB(P)	MOV:10 
	XIF
* 
	IFT	VERSA3=1 
	IFT	CPU852=0 
	IFT	MMUPAG+CPU857=0
	MSR	12,A15	SAVE REGISTERS ON STACK 
	LDR	A11,A4	NUMBER OF BYTES 
	LDR	A10,A2	OUTPUT ADDRESS
	LDR	A9,A1	INPUT ADDRESS
	LDKL	A12,16	BYTES IN EACH LOOP 
MOV:15	EQU	*
	MLR	8,A9 
	MSR	8,A10
	ADR	A10,A12
	ADR	A9,A12 
	SUR	A11,A12
	RB(P)	MOV:15 
	MLR	12,A15	RESTORE REGISTERS FROM STACK
	XIF
* 
	IFT	VERSA3=1 
	RTN	A5 
* 
	XIF
* 
	IFT	VERSA2=1 
	EJECT		DRDU01
* 
* 
*************************** 
*                         * 
*   DIV31                 * 
*                         * 
*************************** 
* 
*   INPUT: ECBCW2=LOGICAL SECTOR NUMBER 
*   OUTPUT: 1ST DWT = PHYSICAL SECTOR NUMBER
* 
DIV31	EQU	* 
* 
	IFT	CPU852=1 
	LD	A1,ECBCW2,A8	GET LOGICAL SECTOR NUMBER
	LDR	A3,A1
	LDK	A2,0 
DIV:20	EQU	*
	ADR	A2,A3	I0:=I0+I1
	SRL	A3,5	I1:=I1/32 
	RB(NZ)	DIV:20
	LDR	A3,A2
	ANKL	A3,/FFE0	32*
	SRL	A2,5	TRUNCATE
	SUR	A3,A2
	SUR	A3,A1
	ADK	A3,31
	RF(P)	DIV:30 
	ADK	A2,1	NEXT CYLINDER 
DIV:30	EQU	*
	ADK	A2,0 
	RF(Z)	DIV:50	CYLINDER 0
	ADR	A1,A2
	ADK	A1,1 
* 
	EJECT		DRDU01
* 
* 
DIV:50	EQU	*
	STR	A1,A6	PUT PHYSICAL SECTOR NUMBER IN DWT
	RTN	A5 
* 
	XIF
* 
	IFT	VERSA2=1 
	IFT	CPU852=0 
	LD	A2,ECBCW2,A8	GET SECTOR NUMBER
	STR	A2,A6	PHYSICAL SECTOR NUMBER 
	LDK	A1,0 
	DVK	31 
	ADK	A2,0 
	RF(Z)	DIV:10	CYLINDER 0
	ADK	A2,1 
DIV:10	EQU	*
	ADRS	A2,A6	PHYSICAL SECTOR NUMBER
	RTN	A5 
	XIF
* 
	EJECT		DRDU01
* 
********************************* 
*                               * 
*   SUBROUTINES FOR             * 
*   INTERLACING AND/OR          * 
*   SKEWING                     * 
*                               * 
********************************* 
* 
*  OUTPUT : A3 CONTAINING INTERLACED AND SKEWED SECTOR NUMBER 
* 
INLACE	EQU	*
	LDR*	A3,A6	GET PHYSICAL SECTOR NUMBER
	LDR	A1,A3
	ADR	A3,A3
	ADR	A3,A1	INTERLACING FACTOR 3 
SKEW	EQU	*
	IFT	NUNITS=2 
	LD	A2,DWTCYL,A2	GET CYLINDER NUMBER
	XIF
	IFT	NUNITS=1 
	LD	A2,DWTCYL,A6	GET CYLINDER NUMBER
	XIF
	ANK	A2,1 
	RF(Z)	INLAC5	EVEN CYLINDER 
	ADK	A3,8	SKEW FACTOR 180 DEG.
INLAC5	EQU	*
	ANK	A3,/1F 
	SLL	A3,2	IN POSITION 
	RTN	A5 
* 
	IFT	NUNITS=2 
	EJECT		DRDU01
* 
* 
**********
* INXUNI *
**********
* 
*   OUTPUT  A2=DOUBLED UNIT INDEX + DWT ADDRESS 
* 
INXUNI	EQU	*
	LC	A2,DWTOR,A6 
	ANK	A2,2 
	ADR	A2,A6
	RTN	A5 
	XIF
* 
	IFT	MMUPAG=1 
	EJECT		DRDU01
* 
* 
******************************************
*                                        *
*   MMULOG : GET LOGICAL ADDRESS AND     *
*            PAGE                        *
*                                        *
******************************************
* 
* 
MMULOG	EQU	*
	MS	2,DWTBA1,A6	SAVE PHYSICAL WORD ADDRESS
	DLA	4
	SRC	A1,6	IN POSITION 
	ST	A1,DWTPAG,A6	PAGE 
	ADKL	A1,/400	NEXT PAGE 
	ST	A1,DWTPAG+2,A6	PSEUDO MMU TABLE 
	SRL	A2,3 
	ST	A2,DWTUBU,A6	LOGICAL ADDRESS
	RTN	A5 
* 
	XIF
* 
	EJECT			DRDU01 
* 
	IFT	VERSA3=1 
* 
* 
******************************
* 
*  UPDATE DRIVER BUFFER INDICATOR 
* 
******************************* 
* 
*   INPUT  A1=RETURN CODE (AFTER READ)
*   OUTPUT DWTBSE=DRIVER BUFFER INDICATOR 
* 
BSELOD	EQU	*
	LDR*	A3,A6	GET READ SECTOR NUMBER
BSEL00	EQU	*	FROM SEEK VERIFY 
	LD	A2,DWTFBU,A6
	RF(Z)	BSEL50	READ/WRITE TO USER BUFFER 
	LDKL	A2,/FFFF	DUMMY
	ADK	A1,0 
	RF(NZ)	BSEL40	READ ERROR 
	LD	A2,DWTOR,A6	GET INDEX 
	ANKL	A2,/300 
	SLL	A2,6 
	ORR	A2,A3
BSEL40	EQU	*
	ST	A2,DWTBSE,A6	UPDATE DRIVER BUFFER INDICATOR 
BSEL50	EQU	*
	RTN	A5 
* 
	EJECT		DRDU01
* 
* 
*************************************** 
*                                     * 
*   RESTORE WORD TO USER BUFFER       * 
*   IF NECESSARY                      * 
*                                     * 
*************************************** 
* 
*   INPUT: DWTFSW=SAVED WORD INDICATOR
*          DWTSWD=SAVED WORD
*          DWTUBU=POINTER TO USER BUFFER
* 
REWORD	EQU	*
	LD	A3,DWTFSW,A6
	RF(Z)	REWO50	NO SAVED WORD 
	LD	A3,DWTSWD,A6
	IFT	MMUPAG=1 
	TS	-30,A15	SAVE REGISTERS
	TL	DWTPAG,A6	SET MMU REGISTERS 
	LD	A2,DWTUBU,A6	GET LOGICAL BUFFER ADDRESS 
	ES	A3,PHSECL,A2	RESTORE SAVED WORD 
	TL	-30,A15	RESET REGISTERS 
	XIF
* 
	IFT	VERSA3=1 
	IFT	MMUPAG=0 
	ST*	A3,DWTUBU,A6	RESTORE SAVED WORD
	XIF
* 
	IFT	VERSA3=1 
	CM	DWTFSW,A6	INDICATE NO SAVED WORD
REWO50	EQU	*
	RTN	A5 
* 
	XIF
* 
	EJECT			DRDU01			DRDU01
* 
* 
******************* 
*                 * 
*  SEEK CYLINDER  * 
*                 * 
******************* 
* 
* 
SEEK	EQU	*
	IFT	NUNITS=2 
	LD	A3,DWTCYL,A2	CYLINDER NUMBER
	XIF
	IFT	NUNITS=1 
	LD	A3,DWTCYL,A6
	XIF
	SLL	A3,3 
	ORK	A3,2 
	RF	CIO	EXECUTE CIO-START 
* 
SEEKZ	EQU	* 
	LDK	A3,3 
	RF	CIO	EXECUTE CIO-START 
* 
	EJECT		DRDU01
* 
* 
**********************************
*                                *
*   CIO: READ AND WRITE          *
*                                *
**********************************
* 
*  INPUT: A3=PHYSICAL SECTOR NUMBER SHIFTED 
* 
	IFT	VERSA3=1 
	IFT	MMUPAG=0 
READ	EQU	*
	LDKL	A1,/80C1	1ST WER
	RF	CIO:20
WRITE	EQU	* 
	LDKL	A1,/C0C1	1ST WER
	ADK	A3,1	ORDER CODE
CIO:20	EQU	*
	LD	A2,DWTFBU,A6
	RF(NZ)	CIO:30	IO FROM/TO DRIVER BUFFER 
	LD	A2,DWTUBU,A6	USER BUFFER POINTER
	SUKL	A2,PHSECL 
	RF	CIO:50
CIO:30	EQU	*
	LDKL	A2,BUFFER	DRIVER BUFFER ADDRESS 
	XIF
* 
	IFT	VERSA3=1 
	IFT	MMUPAG=1 
READ	EQU	*
	LDKL	A1,/0C18	1ST WER SHIFTED
	RF	CIO:20
WRITE	EQU	* 
	LDKL	A1,/0C1C	1ST WER SHIFTED
	ADK	A3,1	ORDER CODE
CIO:20	EQU	*
	LD	A2,DWTFBU,A6
	RF(NZ)	CIO:30	IO FROM/TO DRIVER BUFFER 
	DA	DWTBA1,A6	GET USER BUFFER ADDRESS 
	SLL	A2,1	BYTE MODE ADDRESS 
	RF	CIO:40
CIO:30	EQU	*
	LDKL	A2,BUFFER	DRIVER BUFFER ADDRESS 
CIO:40	EQU	*
	SRC	A1,4	1ST WER IN POSITION 
	XIF
* 
CIO:50	EQU	*
	WER	A1,WER1
	WER	A2,WER1+1
* 
	EJECT			DRDU01			DRDU01
* 
* 
CIO	EQU	* 
	ST	A4,DWTA4,A6	SAVE A4 
	LD	A2,PFPOST 
	RF(NZ)	CIOAB	PWF POST PROCESSING ON
	CF	A15,INXDWT	GET INDEXED DWT ADDRESS
	EX	DWTCIO,A4	EXECUTE CIO-START 
	ABL(3)	END:30	CU ADDRESS UNKNOWN 
CIOAB	EQU	* 
	ST	A5,DWTA5,A6	           A5 
	ST	A7,DWTA2,A6	SAVE SECTOR COUNTER 
* 
T:DISP	ABL	TDISP	GO TO DISPATCHER 
* 
	EJECT			DRDU01			DRDU01
* 
* 
**********************
*                    *
*  RECOVERY ROUTINE  *
*                    *
**********************
* 
* 
DUON	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,DWDU01 
	LDK	A5,DWTSB3	GET STACK BASE 
	ADR	A5,A6
	LDKL	A1,/7FFE	UNIT BUSY AND RECOVERY ON	=1 
	ANS A1,DWTST,A6		=1
	CM	DWTSAV,A6	INDICATE RECOVERY 
	LD	A1,INIFLG	INITIALIZATION FLAG 
	RF(NZ)	DUON05	NOT POWER UP 
* 
	EJECT		DRDU01
* 
* 
	CM	DWTOR,A6	1ST UNIT 
	CF	A5,SEEKZ	TEST IF OPERABLE 
	ANK	A1,1 
	RF(NZ)	DUON26	NOT OPERABLE 
	IFT	NUNITS=2 
	LDK	A1,2 
	SC	A1,DWTOR,A6	NEXT UNIT 
	CF	A5,SEEKZ
	ANK	A1,1 
	RF(NZ)	DUON26	NOT OPERABLE 
	XIF
* 
	EJECT			DRDU01 
* 
* 
DUON05	EQU	*
	CM	DWTOR,A6
	CF	A5,VO:NAM	READ VOLUME NAME
	ANK	A1,1 
	RF(Z)	DUON07	NO ERROR
	CM	DWTOR,A6	PREPARE FOR VOLCLR 
	LDK	A1,12
	CF	A15,VOLCLR
DUON07	EQU	*
	IFT	NUNITS=2 
	LDK	A1,2	OTHER DISC UNIT 
	SC	A1,DWTOR,A6 
	CF	A5,VO:NAM 
	ANK	A1,1 
	RF(Z)	DUON08	NO ERROR
	LDK	A1,2	OTHER DISC UNIT 
	SC	A1,DWTOR,A6 
	LDK	A1,12
	CF	A15,VOLCLR
DUON08	EQU	*
	XIF
	IM	DWTST,A6	INDICATE VOLUME NAMES READ 
	LDKL	A1,-1 
	ST	A1,DWTSAV,A6	RECOVERY DONE
* 
	EJECT		DRDU01
* 
* 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	RF(Z)	END:IO	NO REQUEST ON?
* 
DUON10	LD	A7,DWTORD,A6	GET ORDER
	ST	A7,DWTOR,A6	RESTORE INDEX AND ORDER 
	ANK	A7,/3F 
* 
	IFT	VERSA3=1 
	CF	A5,REWORD	RESTORE WORD IF NECESSARY 
	XIF
* 
	CM	ECBEL,A8	RESET EFFECTIVE LENGTH 
	ABL	DUA:00	REPEAT REQUEST
* 
	EJECT			DRDU01 
* 
*    READY INTERRUPT
* 
DUREDY	LD	A1,TIMER
	RF(Z)	DUON50	NO TIMER ACTIVE 
* 
	IFT	NUNITS=1 
	CM*	TIMER	KILL TIMER 
	RF	DUON40
	XIF
* 
	IFT	NUNITS=2 
	RB	T:DISP	TIMER ACTIVE 
	XIF
* 
	EJECT			DRDU01 
* 
* 
DUON26	EQU	*
	LDKL	A4,TIMER	TIMER POINTER ADDRESS
	LDR*	A3,A4 
	RF(Z)	DUON30	NO TIMER ACTIVE 
	LDKL	A1,-TIME
	STR	A1,A3	RESTART TIMER
	RB	T:DISP
* 
* 
DUON30	CF	A15,SETIMP	START TIMER
	DATA	DUON40,TIME	TIME OUT ADDRESS, TIME
	RB	T:DISP
* 
*   TIME OUT
* 
DUON40	LDKL	A6,DWDU01 
	CM	TIMER 
DUON50	EQU	*
	LDKL	A5,/7FFE	SET UNIT BUSY AND RECOVERY ON	=1 
	ANS	A5,DWTST,A6		=1
	CM	DWTSAV,A6	INDICATE RECOVERY 
	LDK	A5,DWTSB3	GET STACK BASE 
	ADR	A5,A6
	RB	DUON05
* 
	EJECT			DRDU01			DRDU01
* 
* 
*********************** 
*                     * 
*  INTERRUPT HANDLER  * 
*                     * 
*********************** 
* 
* 
IHDU	EQU	*
IHDU1	EQU	* 
IHDU2	EQU	* 
	ST	P,INTSAV	SAVE LAST INTERRUPT
* 
	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,DWDU01	DISC UNIT NO. 1 
* 
	EJECT			DRDU01 
* 
* 
IHDU10	SST	A1,CUADR	GET STATUS
IHDU20	ANKL	A1,/460F	MASK RETURN CODE 
	SLL	A1,1 
	RB(N)	DUREDY	READY INTERRUPT 
	SRL	A1,1 
	LDR	A2,A1
	ANKL	A2,/200	SEEK ERROR
	RF(Z)	IHDU30 
	ANKL	A1,/440F	MOVE SEEK ERROR BIT
	ORK	A1,/02 
IHDU30	EQU	*
	LD	A8,DWTECB,A6	ECB ADDRESS
	LD	A2,DWTSAV,A6
	RF(NN)	GET 
	LDR	A3,A1
	ANK	A3,1 
	RF(NZ)	END:IO	DISC UNIT NOT OPERABLE 
* 
GET	LD	A5,DWTA5,A6	RELOAD REGISTERS A5
	LD	A4,DWTA4,A6	                 A4 
	LD	A7,DWTA2,A6	GET SECTOR COUNTER
	RTN	A5 
* 
	EJECT			DRDU01			DRDU01
* 
* 
******************* 
*                 * 
*  PERFORM ENDIO  * 
*                 * 
******************* 
* 
* 
END:30	EQU	*	CU ADDRESS UNKNOWN 
	LDK	A1,1	NOT OPERABLE
	ORS	A1,DWTST,A6	INDICATE RECOVERY DONE	=1
	RF	END:IO
END:10	EQU	*
* 
	IFT	RAW=1
	LD*	A7,DWTSB3-2,A6	GET 1ST RETURN ADDRESS
	SLL	A7,1 
	RF(N)	END:20	READ AFTER WRITE
	LD	A7,DWTORD,A6
	ANK	A7,/FF	GET ORDER 
	SUK	A7,/15 
	RF(NZ)	END:20	NOT READ AFTER WRITE 
	CM	ECBEL,A8	RESET SECTORS DONE 
	XIF
* 
END:20	EQU	*
	LDKL	A2,/FF00
	ANS	A2,ECBEL,A8
	LD	A2,DWTRTY,A6	GET RETRY INDICATOR
	RF(Z)	END:IO	NO RETRIES DONE 
	ORKL	A1,/100	SET BIT 7 IN RETURN CODE
	EJECT		DRDU01
* 
* 
END:IO	EQU	*
	CF	A15,TENDIO	PERFORM ENDIO
 	ABL	TDISP	GO TO DISPATCHER
* 
	EJECT			DRDU01 
* 
* 
VO:NAM	EQU	*
 	CF	A5,SEEKZ	SEEK SECTOR 0 
	ANK	A1,1 
	RF(NZ)	VO:NA8	SEEK-,THROUGHPUT ERROR,NOT OPERABLE
	CMR	A6	SECTOR 0
	IFT	NUNITS=2 
	CF	A5,INXUNI 
	CM	DWTCYL,A2	CYLINDER 0
	XIF
	IFT	NUNITS=1 
	CM	DWTCYL,A6 
	XIF
	LDK	A3,0	SECTOR 0
* 
	IFT	VERSA3=1 
	IM	DWTFBU,A6	READ TO DRIVER BUFFER 
	CF	A5,READ 
	ANK	A1,3 
	CF	A5,BSELOD	UPDATE DRIVER BUFFER INDICATOR
	XIF
* 
	IFT	VERSA3=0 
	LDKL	A1,/8019	READ SECTOR ZERO 
	LDKL	A2,BUFFER	TO DRIVER BUFFER
	CF	A5,CIO:50 
	ANK	A1,3	ERROR ? 
	XIF
* 
	RF(NZ)	VO:NA8	THROUGHPUT ERROR,NOT OPERABLE
	LDKL	A2,BUFFER 
	LDK	A3,/F0	FILE CODE 
	LD	A1,DWTSAV,A6
	RF(Z)	VO:NA6 
	LDKL	A3,/80F0	INDICATE TEST STATUS 
VO:NA6	EQU	*
	CF	A15,VOLGET	VOLUMR NAME TO DWT INDICATE NVL
	EJECT			DRDU01 
* 
* 
DUNA40	EQU	*
	LDK	A1,1 
	LDK	A7,1	TO INDICATE NOT TRANSFER PARAMETER ORDER
	LD	A2,BUFFER+32	CHECK IF TOSS DISC 
	CWK	A2,'TO'
	RF(NE)	DUNA70	NO TOSS
	LD	A2,BUFFER+40	CHECK IF RELEASE 10 OR GREATER 
	CWK	A2,/2031 
	RF(NE)	DUNA70	REL LESS THAN 10 
	LD	A2,BUFFER+48	GET FORMAT AND DEVICE TYPE PARAMETER 
TRANPA	EQU	*	LABEL FOR TRANSFER PARAMETER ORDER 
	CF	A15,INXDWT	GET INDEXED DWT ADDRESS
	ECR	A3,A2	SEPARATE THE PARAMETERS
	ANK	A3,/3
	ANK	A2,/3
	ST	A3,DWTFOR,A4	SAVE FORMAT PARAMETER
	LDKL	A1,6324	SECTORS ON VERSION A2 
	SUK	A3,2	FORMAT ?
	RF(Z)	DUNA60	VERSION A2
	RF(N)	DUNA50	VERSION A1
	ADK	A1,204	VERSION A3
DUNA50	EQU	*
	ADKL	A1,9588-6324
DUNA60	EQU	*
	SUK	A2,1 
	RF(Z)	DUNA70	PTS 6875
	ADR	A1,A1	PTS 6876 2*MAXSEC ON PTS 6875
DUNA70	EQU	*
	ST	A1,DWTSMX,A4	MAX SECTOR NO IN DWT 
	LDK	A1,0	RESET RETURN CODE FOR TRANSFER PARAM. 
	ADK	A7,0	CHECK IF TRANSFER PARAMETER 
	RB(Z)	END:20 
* 
	EJECT		DRDU01
* 
* 
	LD	A4,DWTA4,A6	RESTORE RETRY COUNTER 
	LC	A1,DWTOR,A6 
	ADK	A1,1 
	SC	A1,DWTOR,A6 
	ANK	A1,1 
	RB(NZ)	VO:NAM
	RF	VO:NA9
VO:NA8	EQU	*
	LDK	A1,1	ERROR CODE
VO:NA9	EQU	*
	RTN	A5 
* 
*   TIMER POINTER 
* 
TIMER	DATA	0	TIMER POINTER
* 
	EJECT			DRDU01			DRDU01
* 
* 
************************************* 
*                                   * 
*   DEVICE WORK TABLE               * 
*                                   * 
************************************* 
* 
* 
DWDU01	EQU	*
	DATA	0	PHYSICAL SECTOR NUMBER
	DATA	/8000	DWT STATUS
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	DUADR	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	ECBDU1	MMU ECB ADDRESS
	XIF
* 
DWTFSW	EQU	*-DWDU01 
	DATA	0 
	DATA	0,0,0	SAVE AREA FOR REGISTERS 
DWTBSE	EQU	*-DWDU01 
	DATA	0 
DWTUBU	EQU	*-DWDU01	USER BUFFER POINTER 
	DATA	0 
DWTSWD	EQU	*-DWDU01 
	DATA	0 
* 
	EJECT		DRDU01
* 
* 
DWTRTY	EQU	*-DWDU01 
	DATA	0 
	DATA	0 
	DATA	/C000	FIXED 
	DATA	/8000	NEW VOLUME LOADED INDICATOR CARTR. 1
	DATA	/C000	FIXED 
	DATA	/8000	NEW VOLUME LOADED IND. CARTR. 2 
	DATA	/FFFF,/FFFF,/FFFF	VOLUME NAME 1ST FIXED 
	DATA	/FFFF,/FFFF,/FFFF	VOLUME NAME 1ST CARTRIDGE 
* 
	IFT	NUNITS=2 
	DATA	/FFFF,/FFFF,/FFFF	VOLUME NAME 2ND FIXED 
	DATA	/FFFF,/FFFF,/FFFF	VOLUME NAME 2ND CARTRIDGE 
	XIF
* 
	EJECT		DRDU01
* 
* 
DWTSAV	EQU	*-DWDU01 
	DATA	-1
DWTFBU	EQU	*-DWDU01	FLAG INDICATING IO TO DRIVER BUF
	DATA	0 
DWTCIO	EQU	*-DWDU01	CIO-START 
	CIO	A3,1,DAF1
	CIO	A3,1,DAC1
* 
	IFT	NUNITS=2 
	CIO	A3,1,DAF2
	CIO	A3,1,DAC2
	XIF
* 
DWTCYL	EQU	*-DWDU01 
	DATA	/FFFF	CYLINDER NUMBER 
* 
	IFT	NUNITS=2 
	DATA	/FFFF	2ND UNIT
	XIF
* 
DWTSMX	EQU	*-DWDU01 
	DATA	1	MAX SECTORS ON FIXED DISC 
	DATA	1	MAX SECTORS ON CARTRIDGE
* 
	IFT	NUNITS=2 
	DATA	1	2ND UNIT
	DATA	1	2ND UNIT
	XIF
* 
DWTFOR	EQU	*-DWDU01 
	DATA	0	DISC FORMAT ON FIXED
	DATA	0	DISC FORMAT CARTRIDGE 
* 
	IFT	NUNITS=2 
	DATA	0 
	DATA	0 
	XIF
* 
	DATA	0,0	STACK 
	DATA	0,0	STACK 
	DATA	0,0 
DWTSB3	EQU	*-DWDU01-2 
* 
	IFT	RAW=1
DWTSEP	EQU	*-DWDU01 
	DATA	0 
DWTSEI	EQU	*-DWDU01 
	DATA	0 
	XIF
* 
	IFT	MMUPAG=1 
ECBDU1	EQU	*
	DATA	0,0,0,0,0,0,0 
DWTBA1	EQU	*-DWDU01 
	DATA	0 
DWTBA2	EQU	*-DWDU01 
	DATA	0 
DWTPAG	EQU	*-DWDU01	MMU PAGE
	DATA	0 
	DATA	0 
	XIF
* 
* 
* 
	END

Full view