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

⟦7e790d303⟧

    Length: 55770 (0xd9da)
    Notes: pts_type(SC)
    Names: »DRFD01.SC«

Derivation

└─⟦7b35573c9⟧ Bits:30009690 Philips computer tape "600402"
    └─⟦this⟧ »M:AF/DRFD01.SC« 

PTS(SC)

	IDENT DRFD01 	REL 11.0 81-04-14 870105041100 

			=8, REL 11.0 81-02-27
			=8, IBM ,MMU AND IO TO SYSTEM AREA NO CODE CONVERSION
			=7, REL 11.0 81-02-23
			=7, CRN UPDATED EVEN IF ERROR FOR SEQUENTIAL READ
			=6, REL 11.0 81-02-23
			=6, BIT INDICATING VOLUME NAMES READ NOT CORRECT 
			=5, REL 11.0 81-02-23
			=5, SAME AS 4, NOT CHANGED CORRRECT
			=4, REL 11.0 81-02-18
			=4, IBM VOLUME NAME NOT READ TO DWT
			=3, REL 11.0 81-01-27
			=3, IBM,LOAD ORDER, DATA SET SECTOR NBR IN ECBCW1
			=2, REL 11.0 81-01-26
			=2, NOT OP. GIVEN IF WRONGLY STRAPT CU 
			=1, PRR 11.0 80-11-19 ,ATTACH BIT CLEARED BY RECOVERY
* 
**********************************************
* 
*  PHILIPS TERMINAL SYSTEM PTS
* 
*  DRFD01 = DRIVER FOR FLEXIBLE DISK
* 
* 
* 
* 
* 
* 
********************************************* 
* 
* 
*  THIS DISK DRIVER HANDLES UP TO FOUR DAISY
*  CHAINED FLEXIBLE DISK DRIVES PTS 6879, 
*  CONNECTED TO CPU VIA CHANNEL UNIT CHFD ON
*  MULTIPLEX OR PROGRAMMED CHANNEL
* 
* 
	EJECT			DRFD01 
* 
*  ORDERS:
* 
*  /00   TEST STATUS
*  /01   PHYSICAL READ
*  /02   SEQUENTIAL READ                       -IBM DISC ONLY-
*  /05   BASIC WRITE
*  /06   SEQUENTIAL WRITE                       -IBM DISC ONLY- 
*  /11   PHYSICAL READ
*  /15   PHYSICAL WRITE 
*  /21	OPEN 
*  /22	CLOSE
*  /24   WRITE DELETED DATA 
*  /26   LOCK 
*  /31   REWIND                                 -IBM DISC ONLY- 
*  /37   LOAD 
*  /38   UNLOAD 
* 
*  ENTRY PARAMETERS:
* 
*   A5   STACK BASE 
*   A6   DWT-ADDRESS
*   A7   ORDER
*   A8   ECB-ADDRESS
	EJECT			DRFD01 
* 
*********** 
*         * 
* ENTRIES * 
*         * 
*********** 
* 
	ENTRY 	FDADR	ACTIVATION ADDRESS
	ENTRY	IHFD	INTERRUPT HANDLER 
	ENTRY	FDON	RECOVERY ROUTINE
	ENTRY	DWFD01	DWT-ADDRESS 
	EJECT			DRFD01 
* 
************* 
*           * 
* EXTERNALS * 
*           * 
************* 
* 
	EXTRN	TDISP	DISPATCHER 
	EXTRN	TENDIO	ENDIO 
	EXTRN	DISIOE	REQUEST ERROR 
	EXTRN	DISEND	PERFORM TENDIO AND TDISP
	EXTRN	VOLCLR	CLEAR VOLUME NAME 
	EXTRN	VOLNAM	VOLUME NAME ADDRESS 
	EXTRN	VOLGET	VOLUME NAME TO DWT AND SET NVL
	EXTRN	NVLCHK	CHECK FOR NEW VOLUME LOADED 
	EXTRN	DWTST	STATUS 
	EXTRN	DWTECB	ECB ADDRESS 
	EXTRN	DWTUEC	USER ECB ADDRESS
	EXTRN	DWTOR	DWT INDEX AND ORDER
	EXTRN	DWTORD	ORDER/INDEX SAVE AREA 
	EXTRN	DWTTAB	TTAB ADDRESS
	EXTRN	DWTA2	SAVE AREA A2 
	EXTRN	DWTSB2	STACK BASE 2 IN DWT 
	EXTRN	TTB:MT	MMU TABLE 
	EXTRN	SAVE8	SAVE A1-A8 ON A15 STACK
	EXTRN	SETIMP	TIMER 
	EXTRN	INTSAV	INTERRUPT SAVE AREA 
	EXTRN	PFPOST	PWF POST PROC. FLAG 
	EXTRN	TASCII	EBCDIC TO ASCII TAB 
	EXTRN	TEBCDIC	ASCII TO EBCDIC TAB
	EXTRN	SPDLCI	OPEN/CLOSE STATUS FOR FD DRIVE
	EXTRN	ECBBA	ECB BUFFER ADDRESS 
	EXTRN	ECBRL	ECB REQUESTED LENGTH 
	EXTRN	ECBEL	ECB EFFECTIVE LENGTH 
	EXTRN	ECBCW1	ECB CONTROL WORD 1
	EXTRN	ECBCW2	ECB CONTROL WORD 2
	EJECT			DRFD01 
* 
************************
*                      *
* CONDITIONAL ASSEMBLY *
*                      *
************************
* 
* MULTIPLEX CHANNEL INSTEAD OF PROGRAMMED 
* CHANNEL BY SETTING X:A = 0
* 
X:A	EQU	1 
CHAN	EQU	1
* 
*	A PROGRAM VERSION INCLUDING TOSS DISC FORMAT
*	IS OBTAINED BY SETTING TOSS EQU 1.
* 
X:B	EQU	0 
TOSS	EQU	0
* 
*	A PROGRAM VERSION INCLUDING IBM DISC FORMAT 
*	IS OBTAINED BY SETTING IBM EQU 1. 
* 
X:C	EQU	0 
IBM	EQU	0 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	1
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	0
* 
	EJECT			DRFD01 
* 
* 
*    ORDERS /21 OPEN AND /22 CLOSE WHICH CONTROLS THE POWER 
*    TO THE DISK DRIVE UNIT CAN BE INCLUDED BY SETTING OPCLOS =1
* 
X:D	EQU	0 
OPCLOS	EQU	0
* 
	EJECT			DRFD01 
* 
* 
*   MMU BUFFER SIZE 
* 
* 
	IFT	MMUPAG=0 
DVBLEN	EQU	256
	XIF
* 
	IFT	MMUPAG=1 
X:E	EQU	256		 
DVBLEN	EQU	256		
	XIF
* 
* 
*   MMU DEVICE INDEX
* 
* 
DEVIND	EQU	10 
* 
	EJECT			DRFD01 
* 
************* 
*           * 
* CONSTANTS * 
*           * 
************* 
* 
CUADR	EQU	09	CONTROL UNIT ADDRESS 
MUXADR	EQU	CUADR+CUADR	MUX-ADDRESS
SOPDA	EQU	/2E	S.O.P. DEVICE ADDRESS 
SECLEN	EQU	128	SECTOR LENGTH
MAXSEC	EQU	2002	MAX SECTOR NUMBER 
MAXIBM	EQU	1923	MAX SECTOR NUMBER IBM DISC
BOE	EQU	28	BEGIN OF EXTENT POSITION 
EOE	EQU	34	END OF EXTENT POSITION 
EOD	EQU	74	END OF DATA POSITION 
TIME	EQU	20	DELAY - POWER ON
OPENTI	EQU	10	DELAY AT OPEN ORDERS
* 
DIXTAB	EQU	*	DOUBLE INDEX TABLE 
	DATA	/0102 
	DATA	/0408 
* 
	EJECT			DRFD01 
* 
**********
*        *
* TABLES *
*        *
**********
* 
	IFF	CHAN+IBM=0 
	DATA	DVBLEN+DVBLEN	MMU BUFFER SIZE 
	XIF
* 
	IFT	CHAN=0 
	IFT	IBM=0
	DATA	0	INDICATE NO MMU BUFFER
	XIF
* 
	DATA	DEVIND	DEVICE INDEX 
FDADR	DATA	FDAD	ACTIVATION ADDRESS
	DATA	0	ABORT ROUTINE ADDRESS 
* 
	EJECT			DRFD01 
* 
*************** 
*             * 
* TEST STATUS * 
*             * 
*************** 
* 
TESTST	EQU	*
	IFF	IBM+TOSS=0 
	CF	A15,NVLCHK
	STR	A1,A6	SAVE NVL INDICATOR 
	XIF
* 
	LDKL	A2,/FFF9	BIO DUMMY
	CF	A5,FD:WRI 
	ANK	A1,1 
	RF(NZ)	DIS:EN	DISC NOT OPERABLE
	LDKL	A2,/7FFF	RESET REQUEST ERROR BIT
	ANRS	A2,A6 
* 
	IFF	TOSS+IBM=0 
	CF	A5,VO:NAM	GET VOLUME NAME 
	LD	A1,DWTORD,A6	RESTORE INDEX AND ORDER
	ST	A1,DWTOR,A6 
	CF	A15,VOLNAM
	RF	FORM70	END:IO 
	XIF
* 
	IFT	TOSS+IBM=0 
	ABL	END:RC 
	XIF
* 
	EJECT		DRFD01
* 
**********************
*                    *
* FORMAT VOLUME      *
*                    *
**********************
* 
FORMAT	EQU	*
	CF	A15,NVLCHK
	ADK	A1,0 
	RF(NZ)	DIS:EN	ERROR: NEW VOLUME LOADED 
	LDK	A2,36	CLEAR VOLUME NAME
FORM10	EQU	*
	CM	BUF,A2
	SUK	A2,2 
	RB(NN)	FORM10
	CF	A15,VOLCLR	CLEAR VOLUME NAME FROM DWT 
	LDK	A2,1	BIO 
	LDK	A3,36	LENGTH 
	LDKL	A4,BUF	VOLUME LABEL ADDRESS 
	LD	A1,ECBCW1,A8
	RF(NZ)	FORM50	IBM DISC 
	LDKL	A1,'TO'	WRITE TOSS IN VOLUME LABEL
	ST	A1,BUF+32 
	LDKL	A1,'SS' 
	ST	A1,BUF+34 
	IFT	IBM=1
	C1	A1,DWTA3,A6	INDICATE TOSS 
	ANS	A1,DWTLAB,A6 
	XIF
	RF	FORM60
* 
	EJECT		DRFD01
* 
* 
FORM50	EQU	*
	CF	A5,FD:WRI	WRITE SECTOR 0
	LDKL	A4,BUF	BUFFER ADDRESS 
	LDKL	A1,/E5D6	VO IN EBCDIC 
	STR	A1,A4
	LDKL	A1,/D3F1	L1 IN EBCDIC 
	ST	A1,BUF+2
	IFT	IBM=1
	LD	A1,DWTA3,A6	INDICATE IBM
	ORS	A1,DWTLAB,A6 
	XIF
	LDK	A2,/31	BIO 
	LDK	A3,36	LENGTH 
FORM60	EQU	*
	CF	A5,FD:WRI 
FORM70	EQU	*
	ABL	END:RC 
* 
	EJECT			DRFD01 
* 
**************
*            *
* ACTIVATION *
*            *
**************
* 
FDAD	EQU	*	ACTIVATION ENTRY 
	IFT	MMUPAG=1 
	IFT	CHAN=0 
	CM	BUFFLG,A6 
	XIF
* 
	LD	A2,DWTOR,A6	INDEX AND ORDER 
	ST	A2,DWTORD,A6	SAVE FOR RECOVERY PURPOSES 
	CMR	A6	RESET TEMPORARY RETURN CODE 
	LDK	A3,0 
	LC	A3,DWTOR,A6	GET INDEX 
* 
	IFT	OPCLOS=1 
* 
*    CHECK IF OPEN OR CLOSE ORDER 
* 
	LDR	A1,A7	ORDER
	SUK	A1,/21 
	RF(Z)	OPEN	OPEN
	SUK	A1,1 
	RF(NZ)	FD:ORD	NOT CLOSE ORDER
* 
	EJECT
* 
********* 
*       * 
* CLOSE * 
*       * 
********* 
* 
*    CLOSE IS PERFORMED BY WRITING A ONE TO BIT 
*    ZERO OF THE SOP LIGHTS EXTERNAL REGISTER 
* 
	LDKL	A1,/8000	MASK FOR BIT 0 
	ORS	A1,SPDLCI	SET OPEN/CLOSE BIT 
	RF	OPEN10
* 
	EJECT
* 
********
*      *
* OPEN *
*      *
********
* 
*    OPEN IS PERFORMED BY WRITING A ZERO TO BIT 
*    ZERO OF THE SOP LIGHTS EXTERNAL REGISTER.
* 
OPEN	EQU	*
	LD	A1,DWTTP2,A6	TIMER POINTER
	RF(NZ)	OPEN20	TIMER ACTIVE 
	LDKL	A1,/7FFF	MASK FOR BIT 0 
	ANS	A1,SPDLCI	CLEAR OPEN/CLOSE BIT 
* 
OPEN10	EQU	*
	LD	A1,SPDLCI	SOP LIGHTS AND OPEN/CLOSE DATA
	OTR	A1,0,SOPDA	OPEN FD DRIVE 
* 
*    WAIT FOR DRIVE TO BECOME OPERABLE
* 
	LDK	A4,DWTTP2	TIMER POINTER OFFSET 
	ADR	A4,A6	A4:=TIMER POINTER ADDRESS
	LDR	A1,A6	SAVE DWT-ADDR
	CF	A15,SETIMP	WAIT 
	DATA	OPENRE,OPENTI	START ADDR, WAIT TIME 
OPEN20	EQU	*
	ABL	TDISP	EXIT 
* 
OPENRE	EQU	*
	LDR	A6,A1	GET DWT-ADDR 
	CM	DWTTP2,A6	INDICATE NO TIMER RUNNING 
	LDK	A1,0	RETURN CODE 
	RF	DIS:EN	PERFORM TENDIO AND TDISP 
	XIF
* 
	EJECT
* 
*  PUT DRIVE NO IN CIO-INSTRUCTION
* 
FD:ORD	EQU	*
	LC	A2,DIXTAB,A3
	SC	A2,DWTA3+1,A6	SAVE DRIVE INDEX MASK 
* 
	IFT	IBM+TOSS=2 
	AN	A2,DWTLAB,A6
	SC	A2,DWTFIB+1,A6	INDICATE TOSS/IBM
	XIF
* 
	CF	A5,SETCIO	A3,A4 AFFECTED
* 
	EJECT		DRFD01
* 
* 
	LDR	A3,A7
	RB(Z)	TESTST	TEST STATUS 
* 
	IFT	IBM=0
	SUK	A3,31
	RB(Z)	FORMAT	FORMAT VOLUME 
	SUK	A3,7 
	RF(N)	INTEST	READ/WRITE ORDER
	SUK	A3,18
	ABL(NP)	LOAD	LOAD/UNLOAD 
	XIF
* 
	IFT	IBM=1
	SUK	A3,1 
	RF(Z)	INTEST	BASIC READ
	SUK	A3,1 
	RF(Z)	IBMCHK	SEQUENTIAL READ 
	SUK	A3,3 
	RF(Z)	INTEST	BASIC WRITE 
	SUK	A3,1 
	RF(Z)	IBMCHK	SEQUENTIAL WRITE
	SUK	A3,25
	RB(Z)	FORMAT	FORMAT VOLUME 
	SUK	A3,7 
	RF(N)	INTEST	PHYSICAL READ/WRITE 
	SUK	A3,11
	RF(Z)	IBMCHK	REWIND
	SUK	A3,7 
	ABL(NP)	LOAD	LOAD/UNLOAD 
	XIF
* 
IBMCHK	EQU	*
	IFT	TOSS+IBM=2 
	LD	A4,DWTFIB,A6
	ABL(NZ)	IBMDSK	IBM DISC HANDLING 
	XIF
* 
	IFT	TOSS=0 
	IFT	IBM=1
	ABL	IBMDSK	IBM DISC HANDLING 
	XIF
* 
	EJECT		DRFD01
* 
* 
REQERR	ABL	DISIOE	REQUEST ERROR 
* 
INCLEN	EQU	*	INCORRECT REQUESTED LENGTH EXIT
	LDKL	A1,/8008	RETURN CODE
* 
DIS:EN	EQU	*
	ABL	DISEND	PERFORM TENDIO AND GO TO TDISP
* 
	EJECT		DRFD01
* 
* INPUT PARAMETER CHECK 
* 
INTEST	EQU	*
	IFF	TOSS+IBM=0 
	CF	A15,NVLCHK	CHECK IF NEW VOLUME LOADED 
	ADK	A1,0 
	RB(NZ)	DIS:EN	NEW VOLUME LOADED
	XIF
* 
	LD	A3,ECBRL,A8 
	RB(Z)	INCLEN	INCORRECT INPUT PARAMETER ECBRL 
	IFT	MMUPAG+CHAN=2
	LDKL	A2,DVBLEN+DVBLEN	CHECK MMU BUFFER SIZE
	CWK	A2,512 
	RF(NL)	INTES3	SUFFICIENT 
	CWR	A3,A2
	RB(G)	INCLEN	MMU BUFFER TOO SMALL
INTES3	EQU	*
	XIF
	SRC	A3,7	NUMBER OF PHYSICAL SECTORS
	RB(N)	INCLEN	INCORRECT INPUT PARAMETER ECBRL 
	CWK	A3,/01FF 
	RB(G)	INCLEN	INCORRECT INPUT PARAMETER ECBRL 
	LD	A2,ECBCW2,A8	GET SECTOR NUMBER
* 
	IFT	IBM+TOSS=2 
	LD	A4,DWTFIB,A6
	RF(NZ)	INTES5	IBM-DISC 
	XIF
* 
	IFT	TOSS=1 
	LDR	A4,A3
	SRC	A4,1	CHECK IF EVEN NUMBER OF PHYSICAL SECTORS
	RB(N)	INCLEN	INCORRECT INPUT PARAMETER ECBRL 
	SLL	A2,1	TRANSFER TOSS-SEC. NO TOPHYSICAL SEC. NO
* 
	EJECT		DRFD01
* 
* 
INTES5	EQU	*
	XIF
	LDR	A4,A2	SAVE PHYSICAL SECTOR NUMBER
	RB(N)	REQERR	REQUEST ERROR 
	SUKL	A4,MAXSEC	
	RB(NN)	REQERR	REQUEST ERROR
	ADR	A4,A3
	RB(P)	INCLEN	INCORRECT LENGTH
	ST	A3,DWTNOS,A6	SAVE NUMBER OF SECTORS 
	ST	A2,DWTCW2,A6	DWTCW2 CONTAINING PHYS SEC NO
	LD	A2,ECBBA,A8	GET ECBBA 
	ST	A2,DWTBA,A6	SAVE ECB BUFFER ADDRESS 
* 
	IFT	MMUPAG=1 
	LCR	A2,A8
	ANK	A2,/30 
	ST	A2,DWT:BF,A6	SAVE BITS 0-1 IN 18-BIT ADDRESS
	XIF
* 
	EJECT		DRFD01
* 
*   MULTIPLE SECTOR IO ENTRY
* 
FD:000	EQU	*
	IFT	MMUPAG=1 
	IFT	CHAN=0 
	LD	A2,DWT:BF,A6
	ST	A2,BUFFLG,A6	SET BUFFER FLAG
	XIF
* 
	LDKL	A2,512
	LDK	A4,3 
	SUK	A3,4 
	RF(NN)	FD:005	FOUR PHYS. SEC. IO 
* 
FD:003	SUK	A2,128 
	SUK	A4,1 
	ADK	A3,1 
	RB(NZ)	FD:003
* 
FD:005	EQU	*
	ST	A4,DWTSIO,A6	SECTORS IN ONE IO ON DISC
	ST	A2,DWTRL,A6	UPDATE DWTRL FOR BIO
	ST	A3,DWTNOS,A6	UPDATE NUMBER OF SECTORS 
* 
	EJECT			DRFD01 
* 
* 
	IFT	MMUPAG=1 
	IFF	CHAN+IBM=0 
	LD	A2,DWTBA,A6	BUFFER ADDRESS
	LD	A1,DWT:BF,A6
	RF(NZ)	FD:007	BUFFER NOT IN SYSTEM AREA
	LDR	A3,A2
	RF(NN)	FD:009
	AD	A3,DWTRL,A6	CHECK IF 64K LIMIT WILL BE PASSED 
	RF(N)	FD:009	NO
* 
	EJECT		DRFD01
* 
* 
FD:007	EQU	*
	ECR	A3,A2
	ANK	A3,/F0 
	SRL	A3,2 
	SLL	A1,2 
	ORR	A1,A3
	SC	A1,DWT:PA,A6	6 BIT PHYSICAL BUFFER ADDRESS
	ADK	A1,/4	CREATE ONE MORE MMU ENTRY
	SC	A1,DWT:PA+2,A6
	ANKL	A2,/FFF 
	LDR	A1,A2
	ORK	A1,1	INDICATE ADDRESS NOT ZERO 
* 
FD:009	ST	A1,DWT:LA,A6	16 BIT LOGICAL BUFFER ADDRESS
	XIF
* 
	LDK	A4,0	PREPARE FOR BIO 
	LD	A1,DWTOR,A6 
	ANK	A1,/3F	ORDER 
	SUK	A1,1 
	RF(Z)	FD:060	BASIC READ
	SUK	A1,4 
	RF(Z)	FD:015	BASIC WRITE 
	SUK	A1,12
	RF(Z)	FD:060	PHYSICAL READ 
	SUK	A1,4 
	RF(Z)	FD:013	PHYSICAL WRITE
	SUK	A1,15	CHECK IF WRITE DELETED DATA
* 
RQ:ERR	EQU	*
	RB(NZ)	REQERR
* 
	EJECT			DRFD01 
* 
*   WRITE DELETED DATA, PHYSICAL AND BASIC WRITE ORDERS 
* 
	LDK	A4,1	WRITE DELETED DATA ORDER
FD:013	EQU	*	PHYSICAL WRITE ORDER 
	ADK	A4,4 
FD:015	EQU	*	BASIC WRITE ORDER
	ADK	A4,1 
	CF	A5,BIO	PREPARATION FOR CIO
* 
	IFT	MMUPAG=1 
	IFT	CHAN=0 
	IFT	TOSS+IBM=2 
	LD	A1,DWTFIB,A6
	RF(Z)	FD:018	NOT IBM 
	XIF
* 
	IFT	MMUPAG=1 
	IFF	CHAN+IBM=0 
	LD	A1,DWT:LA,A6	GET FLAG/LOGICAL BUFFER ADDRESS
	RF(Z)	FD:019	BUFFER IN SYSTEM AREA 
	LDR	A7,A3	REQUESTED LENGTH 
	LDR	A8,A2	SAVE A2
	LDKL	A4,BUF	DRIVER BUFFER ADDRESS
	LDR	A2,A4
	TS	-30,A15	SAVE RUNNING TASK MMU 
	TL	DWT:PA,A6	LOAD PSEUDO MMU TABLE 
	MVUS	A7	MOVE BUFFER FROM USER TO SYSTEM AREA 
	TL	-30,A15	RESTORE MMU FROM STACK
	LDR	A2,A8	RESTORE A2 
	CM	BUFFLG,A6	INDICATE BUFFER IN SYSTEM AREA
FD:019	EQU	*
	XIF
* 
	IFT	TOSS+IBM=2 
	LD	A1,DWTFIB,A6
	RF(Z)	FD:018	NOT IBM 
	XIF
* 
	IFT	IBM=1
	LDR	A7,A3	NO OF CHAR. TO BE TRANSFORMED
	CF	A5,EBCDIC 
FD:018	EQU	*
	XIF
* 
	EJECT			DRFD01 
* 
* 
	CF	A5,FD:WRITE	PERFORME WRITE
	ANKL	A3,/200	CHECK IF WRITE PROTECTED
	RF(Z)	FD:020 
	LDK	A3,/40	INDICATE ERROR
	ORRS	A3,A6	UPDATE TEMPORARY RETURN CODE
FD:020	EQU	*
	RF	FD:100	GOTO FDMSIO
* 
	EJECT			DRFD01 
* 
***************** 
*               * 
* PHYSICAL READ * 
*               * 
***************** 
* 
FD:060	CF	A5,BIO
* 
	IFT	MMUPAG=1 
	IFT	CHAN=0 
	IFT	TOSS+IBM=2 
	LD	A1,DWTFIB,A6
	RF(Z)	FD:070	TOSS DISC 
	LDKL	A4,BUF	DRIVER BUFFER ADDRESS
	CM	BUFFLG,A6	INDICATE BUFFER IN SYSTEM AREA
	XIF
* 
FD:070	EQU	*
	IFT	MMUPAG=1 
	IFT	CHAN=1 
	LD	A1,DWT:LA,A6
	RF(Z)	FD:080	BUFFER IN SYSTEM AREA 
	LDKL	A4,BUF	DRIVER BUFFER ADDRESS
	CM	BUFFLG,A6	INDICATE BUFFER IN SYSTEM AREA
	XIF
* 
	IFT	MMUPAG=1 
	IFT	IBM=1
	IFT	TOSS+CHAN=0
	LDKL	A4,BUF	DRIVER BUFFER ADDRESS
	CM	BUFFLG,A6	INDICATE BUFFER IN SYSTEM AREA
	XIF
* 
FD:080	EQU	*
	CF	A5,FD:REA	PERFORM READ
* 
	IFT	TOSS+IBM=2 
	LD	A1,DWTFIB,A6
	RF(Z)	FD:090	NOT IBM 
	XIF
* 
	IFT	IBM=1
	IFT	MMUPAG=0 
	LD	A4,DWTBA,A6	ASCII OUTPUT ADDRESS
	XIF
* 
	IFT	IBM=1
	LD	A7,DWTRL,A6	REQ. LEN
	IFT	MMUPAG=1		=8 
	LD	A4,DWT:LA,A6	LOGICAL ADDRESS	=8 
	RF(NZ)	FD:085	NOT SYSTEM AREA	=8 
	LD	A4,DWTBA,A6	BUFFER ADDRESS	=8 
	CF	A5,ASC:00	CONVERT EBCDIC-ASCII	=8 
	RF	FD:090		=8
FD:085	EQU	*		=8
	XIF			=8 
	IFT	IBM=1		=8
	CF	A5,ASCII		=8
FD:090	EQU	*
	XIF
* 
	EJECT			DRFD01 
* 
* 
	IFT	MMUPAG=1 
	IFT	CHAN=0 
	IFT	TOSS+IBM=2 
	LD	A1,DWTFIB,A6
	RF(Z)	FD:100	TOSS DISC 
	XIF
* 
	IFT	MMUPAG=1 
	IFF	CHAN+IBM=0 
	LD	A2,DWT:LA,A6	GET FLAG/LOGICAL BUFFER ADDRESS
	RF(Z)	FD:100	BUFFER IN SYSTEM AREA 
	LD	A7,DWTRL,A6	REQUESTED LENGTH
	LDKL	A1,BUF	GET DWT BUFFER ADDRESS 
	TS	-30,A15	SAVE RUNNING TASK MMU 
	TL	DWT:PA,A6	LOAD PSEUDO MMU TABLE 
	MVSU	A7	MOVE BUFFER FROM SYSTEM TO USER AREA 
	TL	-30,A15	RESTORE MMU FROM STACK
	XIF
FD:100	EQU	*
	ABL	FDMSIO 
* 
	EJECT			DRFD01 
* 
********
*      *
* LOAD *
*      *
********
* 
LOAD	EQU	*
	ADK	A3,0	CHECK ORDER CODE
	RF(Z)	UNLOAD	UNLOAD ORDER
	ADK	A3,1 
	RF(Z)	LOAD00	LOAD ORDER
	ADK	A3,17
	RB(NZ)	RQ:ERR	ERROR IF NOT LOCK
* 
LOAD00	EQU	*
	LDK	A2,/14	LOCK
	CF	A5,FD:REA 
	ANK	A3,1 
	RF(NZ)	LOA:80	ENDIO NOT OPERABLE 
* 
	IFT	TOSS+IBM=2 
	LD	A1,DWTFIB,A6
	RF(Z)	LOA:70	TOSS DISC 
	XIF
* 
	IFT	IBM=1
	LC	A3,DWTOR+1,A6	GET ORDER 
	SUK	A3,/26 
	RF(Z)	LOA:65	LOCK ORDER
	CF	A5,VO:NAM 
	CF	A5,LD:RC	CHECK RETURN CODE
	EJECT			DRFD01 
* 
*  READ DATA SET LABEL
* 
	LD	A2,ECBCW1,A8	SECTOR NUMBER	=3 
	SUK	A2,7 
	RF(N)	LOA:85	REQUEST ERROR 
	SUK	A2,18
	RF(P)	LOA:85	REQUEST ERROR 
	ADK	A2,25
	SLL	A2,3	BIO 
	LDK	A3,80	LENGTH 
	LDKL	A4,BUF
	CF	A5,FD:REA 
	SLL	A1,4	CHECK NO DATA BIT 
	RF(NN)	LOA:60	NOT NO DATA
	ORK	A3,/10	INDICATE ILLEGAL DATA SET LABEL 
LOA:60	EQU	*
	CF	A5,LD:RC
	ENB
	LD	A3,ECBCW1,A8	DATA SET LABEL SECTOR	=3 
	LDK	A1,DWTDSS
	CF	A5,STDWT	SAVE IN DWT
	ADK	A4,BOE	BOE ADDRESS 
	CF	A5,LOGSEC	TRANSFORM TO LOGICAL SECTOR 
	LDK	A1,DWTBOE
	CF	A5,STDWT	STORE BOE NO IN DWT
	SUK	A3,1	CRN 
	LDK	A1,DWTCRN
	CF	A5,STDWT
	ADK	A4,EOE-BOE	EOE ADDRESS 
	CF	A5,LOGSEC 
	LDK	A1,DWTEOE
	CF	A5,STDWT	STORE EOE NO IN DWT
	ADK	A4,EOD-EOE	EOD ADDRESS 
	CF	A5,LOGSEC 
	INH		INHIBIT INTERRUPTS                                 	INHIBIT 
	LDK	A1,DWTEOD
	CF	A5,STDWT	STORE EOD NO IN DWT
* 
LOA:65	EQU	*
	LDKL	A3,/400 
	ORRS	A3,A6	UPDATE TEMPORARY RETURN CODE
* 
LOA:70	EQU	*
	XIF
	LD	A2,DWTA3,A6 
	ORS	A2,DWTLC,A6	INDICATE LOCK
LOA:80	EQU	*
	ABL	END:RC 
* 
	IFT	IBM=1
LOA:85	EQU	*
	LDK	A1,/80	REQUEST ERROR 
	SCR	A1,A6	UPDATE TEMPORARY RETURN CODE 
	XIF
* 
	EJECT			DRFD01 
* 
* 
	IFF	TOSS+IBM=0 
* 
*  ERROR , UNLOCK 
* 
LOA:90	EQU	*
	LDR	A5,A6
	ADKL	A5,DWTSB2	STACK BASE
	LDK	A2,/C	UNLOCK 
	CF	A5,FD:REA 
	RB	LOA:80
* 
*   LD:RC  SUBROUTINE 
* 
LD:RC	EQU	* 
	ANK	A3,/17	FATAL ERROR 
	RB(NZ)	LOA:90
	LDKL	A4,BUF	DRIVER BUFFER ADDRESS
	RTN	A5 
	XIF
* 
	EJECT			DRFD01 
* 
**********
*        *
* UNLOAD *
*        *
**********
* 
UNLOAD	EQU	*
	IFT	IBM=1
* 
*    DATA SET OPEN
* 
	CF	A5,DSOPCH	A1,AFFECTED 
	ADK	A7,0	SET CR (CHECK EOD)
	RF(Z)	UNL:70	NOT OPEN
	ST	A7,12,A8	STORE EOD-NO IN CONTROL WORD OF ECB
* 
*  READ DATA SET LABEL TO DRIVER BUFFER 
* 
	CF	A5,DSLIO	PREPARE FOR I/O
	CF	A5,FD:REA	READ DATA SET LABEL 
	CF	A5,UNL:RC	RETURN CODE CHECK 
	ENB
* 
*  TRANSFORM RETURN CODE TO IBM SECTOR NO (EBCDIC-CODED)
* 
	CF	A5,DSOPCH	EOD-NO TO A7
* 
*  DIVIDE EOD BY 26 
* 
	LDK	A1,0 
UNL:10	SUK	A7,26
	RF(N)	UNL:20 
	ADK	A1,1 
	RB	UNL:10
* 
	EJECT			DRFD01 
* 
* 
UNL:20	ADK	A7,27
* 
*   A1 = BINARY TRACK NO
*   A7 = SECTOR NO WITHIN TRACK (0-25)
* 
	CF	A5,BINDEC	TRANSFORM SEC.NO TO A3
	LDKL	A4,BUF+EOD+4	ADDRESS TO POS 79
	SCR	A3,A4
	SUK	A4,1 
	SRL	A3,8	LEFT BYTE 
	SCR	A3,A4	STORE IN BUFFER
	LDR	A7,A1	TRACK
	CF	A5,BINDEC	DEC EBCDIC-CODED IN A3
	SUK	A4,3 
	STR	A3,A4	TRACK INTO BUF 
	INH		INHIBIT INTERRUPTS                                 	INHIBIT 
* 
*  WRITE DATA SET LABEL 
* 
	CF	A5,DSLIO	PREPARE FOR I/O
	ORK	A2,5	PHYSICAL WRITE
	CF	A5,FD:WRITE	WRITE DATA SET LEBEL
	CF	A5,UNL:RC	CHECK RETURN CODE 
	CF	A5,DSOPCH 
	CMR	A2	INDICATE NOT OPEN 
* 
	EJECT			DRFD01 
* 
*    UNLOCK 
* 
	XIF
UNL:70	EQU	*
	LDK	A2,/C	UNLOCK 
	CF	A5,FD:REA 
	ANK	A3,1 
	RB(NZ)	LOA:80	NOT OPERABLE 
	C1	A2,DWTA3,A6	INDEX MASK
	ANS	A2,DWTLC,A6	INDICATE UNLOCK IN DWT 
	RB	LOA:80	END:IO 
* 
	IFT	IBM=1
* 
*   UNLOAD RETURN CODE CHECK
* 
UNL:RC	EQU	*
	ANKL	A3,/207 
	RF(Z)	RTN:A5	NO RETURN CODE
	ANKL	A3,/200 
	RF(Z)	RTN:A5	NOT WRITE PROTECTED 
	CF	A5,DSOPCH 
	ADK	A7,0	SET CR (CHECK EOD)
	RF(Z)	RTN:A5	NOT OPEN
	LDK	A3,/40 
	ORRS	A3,A6	UPDATE TEMPORARY RETURN CODE
RTN:A5	EQU	*
	RTN	A5 
* 
	EJECT			DRFD01 
* 
* 
IBMDSK	EQU	*	IBM DISK HANDLING ENTRY
	IFT	IBM=1
	CF	A15,NVLCHK	CHECK IF NEW VOLUME LOADED 
	ADK	A1,0 
	ABL(NZ)	END:IO	NEW VOLUME LOADED 
	CF	A5,DSOPCH	GET EOD 
	ADK	A7,0	SET CR (CHECK EOD)
	RF(Z)	FD:DIS	NOT OPEN, ERROR 
	LC	A1,DWTOR+1,A6	ORDER CODE
	SUK	A1,49
	RF(Z)	REWIND	REWIND FILE 
	LD	A3,ECBRL,A8	CHECK REQUESTED LENGTH
	IFT	MMUPAG+CHAN=2
	CWK	A3,DVBLEN+DVBLEN 
	ABL(G)	INCLEN	MMU BUFFER TOO SMALL 
	XIF
	IFT	IBM=1
	SUK	A3,SECLEN
	ABL(NZ)	INCLEN	INCORRECT LENGTH
	ADK	A1,43
	RF(Z)	SQWRITE	SEQUENTIAL WRITE 
	ADK	A1,4 
	RF(NZ)	FD:DIS	ERROR IF NOT SEQUENTIAL READ 
* 
	EJECT			DRFD01 
* 
******************* 
* SEQUENTIAL READ * 
******************* 
* 
	ADK	A2,DWTCRN-DWTEOD	A2 = ADDRESS TO CRN 
	LDR*	A3,A2	CRN 
	ADK	A3,1	CRN+1 
	ST	A3,ECBCW2,A8	STORE CRN+1 IN ECB 
	CWK	A3,MAXIBM
	RF(P)	FD:DIS	REQUEST ERROR 
	CWR	A3,A7
	RF(NL)	SQR:10	END OF DATA
	LDK	A4,0	BIO READ
	CF	A5,BIOSQ
	CF	A5,FD:REA	READ SECTOR POINTED AT BY CRN+1 
* 
	IFT	MMUPAG=0 
	LD	A4,ECBBA,A8	USER BUFFER ADDRESS 
	XIF
* 
	IFT	IBM=1
	LDK	A7,SECLEN
	CF	A5,ASCII	TRANSFORM TO ASCII 
* 
	EJECT			DRFD01 
* 
* 
	IFT	MMUPAG=1 
	TS	-30,A15	SAVE RUNNING TASK'S MMU 
	LD	A7,DWTTAB,A6	TTAB ADDRESS 
	TL	TTB:MT,A7	LOAD MMU TABLE
	LDKL	A1,BUF	DRIVER BUFFER ADDRESS
	LD	A2,DWTUEC,A6	USER ECB ADDRESS 
	EL	A2,ECBBA,A2	USER BUFFER ADDRESS 
	LDK	A7,SECLEN	LENGTH 
	MVSU	A7	MOVE SECTOR TO USER BUFFER 
	TL	-30,A15	RESTORE MMU TABLE FROM STACK
	XIF
* 
	IFT	IBM=1
	LDK	A1,DWTCRN
	CF	A5,DSPAD
	ANK	A3,1	NOT OPERABLE	=7 
	RF	SQW:10	UPDATE CRN 
* 
*    END OF DATA
* 
SQR:10	LDKL	A1,/1000	RETURN CODE
	RF	END:IO
* 
	EJECT			DRFD01 
* 
******************* 
* SEQUENTIAL WRITE *
******************* 
* 
SQWRIT	EQU	*
* 
*   CHECK IF END OF EXTENT
* 
	LDK	A1,DWTEOE
	CF	A5,DSPAD	EOE-NO ADDRESS TO A2 
	ST	A7,ECBCW2,A8	STORE EOD IN ECB C. W. 
	CWK	A7,MAXIBM
	RF(P)	FD:DIS	REQUEST ERROR 
	CWR*	A7,A2 
	RF(G)	ENDEOE	END OF EXTENT 
* 
	IFT	MMUPAG=1 
	TS	-30,A15	SAVE RUNNING TASK'S MMU 
	LD	A7,DWTTAB,A6	TTAB ADDRESS 
	TL	TTB:MT,A7	LOAD MMU TABLE
	LD	A1,DWTUEC,A6	USER ECB ADDRESS 
	EL	A1,ECBBA,A1	USER BUFFER ADDRESS 
	LDKL	A2,BUF	DRIVER BUFFER ADDRESS
	LDK	A7,SECLEN	LENGTH 
	MVUS	A7	MOVE SECTOR TO DRIVER BUFFER 
	TL	-30,A15	RESTORE MMU TABLE FROM STACK
	XIF
* 
	IFT	IBM=1
	LDK	A4,5	BIO WRITE 
	CF	A5,BIOSQ
	LDK	A7,SECLEN
	CF	A5,EBCDIC	TRANSFORM AND MOVE TO BUF 
* 
	EJECT		DRFD01
* 
* 
	CF	A5,FD:WRI 
	SRL	A1,3	IF BIT 6 SET THEN	=7
	ANK	A1,/40	SET BIT 9	=7
	ORRS	A1,A6	UPDATE TEMPORARY RETURN CODE	=7 
	CF	A5,DSOPCH 
SQW:10	EQU	*
	ANKL	A3,/207	WRITE PROTECTED OR NOT OPERABLE 
	RF(NZ)	END:RC
	IMR	A2	EOD=EOD+1 OR CRN=CRN+1 IN DWT 
	LDK	A2,SECLEN
	ST	A2,ECBEL,A8	UPDATE EFFECTIVE LENGTH 
	RF	END:RC
* 
FD:DIS	EQU	*
	ABL	DISIOE	REQUEST ERROR 
* 
	EJECT			DRFD01 
* 
**********
* REWIND *
**********
* 
REWIND	EQU	*
	LDR	A3,A2	SAVE EOD ADDRESS 
	LDK	A1,DWTBOE
	CF	A5,DSPAD
	LDR*	A4,A2	BOE 
	STR	A4,A3	EOD = BOE
	LDK	A1,DWTCRN
	CF	A5,DSPAD
	SUK	A4,1	BOE - 1 
	STR	A4,A2	CRN = BOE -1 
	LDK	A1,0	RETURN CODE 
	RF	END:IO
	XIF
* 
	EJECT			DRFD01 
* 
***************** 
*               * 
* PERFORM ORDER * 
*               * 
***************** 
* 
* 
*  INPUT:  A2  BIO CONTENTS 
*          A3  NO OF BYTES TO BE TRANSFERED 
*          A4  BUFFER ADDRESS 
* 
FD:WRI	EQU	*
	IFT	CHAN=0 
	LDKL	A1,/C000	WORDS,WRITE
	XIF
	IFT	CHAN=1 
	LDK	A1,0	INDICATOR WRITE MODE
	XIF
	RF	FD:800
* 
FD:REA	EQU	*
	IFT	CHAN=1 
	LDK	A1,1	READ MODE 
	XIF
	IFT	CHAN=0 
	LDKL	A1,/8000	WORDS  READ
	XIF
FD:800	EQU	*
	IFT	CHAN=0 
	SRL	A3,1	FROM BYTES TO WORDS 
* 
	EJECT			DRFD01 
* 
* 
	IFT	MMUPAG=1 
	LD	A7,BUFFLG,A6	CHECK WHAT BUFFER TO READ TO 
	RF(Z)	FD:810	BUFFER IN SYSTEM AREA 
	LD	A7,DWT:BF,A6	BITS 0-1 IN 18-BIT ADDRESS 
	ECR	A7,A7
	ORR	A1,A7
FD:810	EQU	*
	XIF
* 
	IFT	CHAN=0 
	ORR	A3,A1
WER1	WER	A3,MUXADR	FIRST WER
WER2	WER	A4,MUXADR+1	SECOND WER 
	XIF
	IFT	CHAN=1 
* 
	EJECT			DRFD01 
* 
*  PUT BUFFER START AND END ADDRESS IN DWT
* 
	ST	A1,DWTRW,A6	INDICATE MODE 
	ST	A4,DWTUB,A6 
	ADR	A3,A4
	ST	A3,DWTUBE,A6	END ADDRESS+2
	XIF
	ST	A5,DWTA5,A6	SAVE STACK POINTER
	LD	A3,PFPOST 
	RF(NZ)	T:DISP	POST PROCESSING FLAG SET 
FD:CIO	EQU	*	LABEL USED FOR CHANGE OF CUADR 
	CIO	A2,1,CUADR	CIO START 
	RF(3)	END:30	DEVICE ADDRESS UNKNOWN
	RF	T:DISP
* 
	EJECT			DRFD01 
* 
************************************* 
* 
*  FDMSIO - UPDATE PARAMETERS FOR MULTIPLE SECTOR IO  * 
*                                   * 
************************************* 
* 
FDMSIO	EQU	*
	IM	DWTCW2,A6	UPDATE SECTOR NUMBER
	LDR*	A1,A6	RETURN CODE 
	ANK	A1,/7F	GET ERROR RETURN CODE 
	RF(NZ)	END:RC
	LD	A2,DWTSIO,A6	GET NUMBER OF SECTORS DONE 
	ADS	A2,DWTCW2,A6	UPDATE DWTCW2 
	LD	A2,DWTRL,A6 
	ADS	A2,ECBEL,A8	UPDATE ECBEL 
	LD	A3,DWTNOS,A6
	RF(NP)	END:RC	LAST SECTOR DONE 
	IFT	MMUPAG=1 
	LD	A4,DWTBA,A6	GET BUFFER POINTER
	ADR	A2,A4	UPDATE BUFFER POINTER
	ST	A2,DWTBA,A6 
	RF(N)	FDMSI1	NOT PASSED 64K LIMIT
	ADK	A4,0 
	RF(NN)	FDMSI1	NOT PASSED 64K LIMIT 
	LDK	A2,/10 
	ADS	A2,DWT:BF,A6	UPDATE BITS 0-1 
FDMSI1	EQU	*
	XIF
* 
	IFT	MMUPAG=0 
	ADS	A2,DWTBA,A6	UPDATE BUFFER POINTER
	XIF
	ABL	FD:000	MORE SECTORS IN MULTIPLE SECTOR IO
* 
	EJECT			DRFD01 
* 
**********
*        *
* END:IO *
*        *
**********
* 
	IFT	IBM=1
ENDEOE	EQU	*	END OF EXTENT EXIT 
	LDKL	A1,/2000	RETURN CODE
	RF	END:IO
	XIF
* 
END:RC	EQU	*
	LDR*	A1,A6	RETURN CODE 
END:IO	EQU	*
	CF	A15,TENDIO
T:DISP	ABL	TDISP
* 
END:30	EQU	*	CU ADDRESS UNKNOWN 
	LDK	A1,1	NOT OPERABLE
	ORS	A1,DWTST,A6	RECOVERY DONE	=1 
	RB	END:IO
	EJECT			DRFD01 
* 
********************
*                  *
* RECOVERY ROUTINE *
*                  *
********************
* 
FDON	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,DWFD01	DWT ADDRESS 
	LDKL	A4,/7FFE	SET UNIT BUSY AND RECOVERY ON	=1 
	ANS	A4,DWTST,A6		=1
	IM	DWTA2,A6	SET FDON FLAG
* 
	EJECT
* 
* DELAY 2 SEC 
* 
	LD	A4,DWTTP,A6 
	RF(Z)	FDON10	NO TIMER SET
	LDKL	A4,-TIME
	ST*	A4,DWTTP,A6	RESTART TIMER
	RB	T:DISP
FDON10	LDK	A4,DWTTP 
	ADR	A4,A6
	LDR	A1,A6	SAVE A6
	CF	A15,SETIMP
	DATA	FDON20,TIME 
* 
F:DISP	EQU	*
	RB	T:DISP
* 
*   TIME OUT ROUTINE
* 
FDON20	LDR	A6,A1
	CM	DWTTP,A6
	LDKL	A5,DWTSB2 
	ADR	A5,A6	GET STACK BASE 
* 
FDONVL	EQU	*	ENTRY USED BY READY INTERRUPT ROUTINE
	IFT	MMUPAG=1 
	IFT	CHAN=0 
	CM	BUFFLG,A6	RESET BUFFER FLAG 
	XIF
* 
	IFF	TOSS+IBM=0 
	IM	DWTST2,A6	SET RECOVERY/READY INT. INDICATOR 
	LDK	A3,3	4 VOLUMES 
* 
	EJECT		DRFD01
* 
* 
*  READ VOLUME NAME 
* 
FDONLD	EQU	*
	SC	A3,DWTOR,A6	GET VOLUME NAME 
	LC	A4,DIXTAB,A3	DRIVE INDEX MASK 
	SC	A4,DWTA3+1,A6	SAVE IT 
	CF	A5,SETCIO 
	LDK	A2,/14 
	CF	A5,FD:REA	LOCK
	ANK	A3,1 
	RF(Z)	FDON19	OPERABLE
	LDK	A1,6	NOT OPERABLE
	CF	A15,VOLCLR	CLEAR VOLUME NAME
	RF	FDON21	CONTINUE WITH NEXT DISC
* 
FDON19	EQU	*
	CF	A5,VO:NAM 
	LDKL	A2,/FBFF	RESET IBM IND. BIT 
	ANRS	A2,A6	UPDATE TEMPORARY RETURN CODE
FDON21	EQU	*
	LDK	A2,/C
	CF	A5,FD:REA	UNLOCK
	LDK	A3,0 
	LC	A3,DWTOR,A6	GET INDEX FOR LAST VOL. 
	SUK	A3,1 
	RB(NN)	FDONLD	NEXT VOLUME
	CM	DWTOR,A6
	CM	DWTST2,A6	INDICATE VOLUMES READ 
	XIF
	IM	DWTST,A6	INDICATE VOLUME NAMES READ 
* 
	IFT	OPCLOS=1 
* 
	EJECT
* 
*    TERMINATE WAIT REQUEST FOR OPEN ORDER IF RUNNING 
* 
	LD	A4,DWTTP2,A6	TIMER POINTER
	RF(Z)	FDON09	NOT RUNNING 
	CMR	A4	STOP TIMER
	CM	DWTTP2,A6	INDICATE NO TIMER 
FDON09	EQU	*
* 
*    OPEN FD TO MAKE FOLLOWING LOCK ORDER POSSIBLE
* 
	LDKL	A4,SPDLCI	OPEN/CLOSE STATUS WORD ADDRESS
	LDKL	A2,/8000	OPEN/CLOSE BIT MASK
	ANR*	A2,A4	A2:=OPEN/CLOSE FLAG 
	ORS	A2,DWTOCF,A6	SAVE
	XRRS	A2,A4	SET STATUS WORD TO OPEN 
	LDR*	A2,A4 
	OTR	A2,0,SOPDA	SET DRIVE TO OPEN 
* 
FDON23	EQU	*
	XIF
* 
	EJECT
* 
*  LOCK DOORS 
* 
	LDK	A2,1 
FDON25	EQU	*
	LD	A1,DWTLC,A6	LOCK INDICATOR
	ANR	A1,A2
	RF(Z)	FDON30	NOT LOCKED
	ST	A2,DWTA3,A6	SAVE
* 
	EJECT
* 
*  PUT DRIVE NO IN CIO INSTR
* 
	SRN	A2,A3	DRIVE NO IN A3 
	CF	A5,SETCIO	PUT DRVE NO IN CIO-INSTR
	LDK	A2,/14	LOCK
	CF	A5,FD:REA 
	LD	A2,DWTA3,A6	DRIVE IND.
	ANK	A3,1 
	RF(Z)	FDON30	OK
	XRS	A2,DWTLC,A6	INDICATE UNLOCK
FDON30	EQU	*
	SLL	A2,1 
	CWK	A2,/0010 
	RB(NE)	FDON25
* 
	IFT	OPCLOS=1 
* 
*    RESTORE OPEN/CLOSE STATUS TO SAME VALUE AS BEFORE POWER OFF
* 
	LD	A2,DWTOCF,A6	OPEN/CLOSE FLAG
	ORS	A2,SPDLCI	TO STATUS WORD 
	CM	DWTOCF,A6	CLEAR FLAG
	LD	A2,SPDLCI	OPEN/CLOSE STATUS 
	OTR	A2,0,SOPDA	CLOSE DRIVE IF IT WAS CLOSED
	XIF
* 
	EJECT
* 
*  ANY REQUEST
* 
	CM	DWTA2,A6	RESET FDON FLAG
FDON60	EQU	*
	LD	A8,DWTECB,A6
	ABL(Z)	END:IO	NO REQUEST, RETURN VIA TENDIO
* 
*  RETRY REQUEST
* 
	IM	DWTRTY,A6	INDICATE RETRY
	LD	A7,DWTORD,A6
	ST	A7,DWTOR,A6	RESTORE INDEX AND ORDER 
	CM	ECBEL,A8	RESET EFFECTIVE LENGTH 
	ANK	A7,/3F	ORDER 
	ABL	FDAD	REACTIVATE
* 
	EJECT			DRFD01 
* 
********************
*                  *
*  READY INTERRUPT *
*                  *
********************
* 
FDRE	EQU	*
	LD	A2,DWTA2,A6 
	RB(NZ)	F:DISP	POWER ON ROUTINE ACTIVE
	LDKL	A5,DWTSB2 
	ADR	A5,A6	STACK BASE 
* 
	IFT	TOSS+IBM=0 
	RB	FDON60
	XIF
* 
	IFF	TOSS+IBM=0 
	LDKL	A3,/7FFE	SET UNIT BUSY AND RECOVERY ON	=1 
	ANS	A3,DWTST,A6		=6
	RB	FDONVL	READ VOLUME NAMES
	XIF
* 
	EJECT			DRFD01 
* 
********************* 
*                   * 
* INTERRUPT HANDLER * 
*                   * 
********************* 
* 
IHFD	EQU	*
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE REGISTERS ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDKL	A6,DWFD01	DWT ADDRESS 
	IFT	CHAN=1 
	ENB
	LD	A1,DWTUB,A6	GET BUFFER POINTER
	LD	A2,DWTUBE,A6	END OF BUFFER
	SUR	A2,A1	LENGTH 
IH005	EQU	* 
	SST	A3,CUADR	GET STATUS
	RF(A)	IH:000	READY INTERRUPT 
	LD	A3,PFPOST 
	RF(NZ)	IHDISP	POST PROCESSING FLAG SET 
	LD	A3,DWTRW,A6	READ/WRITE INDICATOR
	RF(NZ)	IH050	READ
* 
	EJECT		DRFD01
* 
* 
IH010	EQU	* 
	LDR*	A3,A1	ONE WORD FROM BUFFER
	OTR	A3,0,CUADR	WRITE 
	RB(NA)	IH005 
	ADK	A1,2	UPDATE BUFFER POINTER 
	SUK	A2,2 
	RB(P)	IH010
	CIO	A2,0,CUADR	CIO HALT
IHDISP	EQU	*
	ABL	TDISP	GOTO DISPATCHER
* 
IH050	EQU	* 
	INR	A3,0,CUADR	READ
	RB(NA)	IH005 
	STR	A3,A1	ONE WORD TO BUFFER 
	ADK	A1,2	UPDATE BUFFER POINTER 
	SUK	A2,2 
	RB(P)	IH050
	CIO	A2,0,CUADR	CIO HALT
	SST	A3,CUADR	STATUS
	RB(NA)	*-2 
IH:000	EQU	*
	INH
	XIF
* 
	EJECT			DRFD01 
* 
* 
	IFT	CHAN=0 
	SST	A3,CUADR	STATUS
	RF(A)	IH:00		=2
	CIO	A3,0,CUADR		=2 
	SST	A3,CUADR		=2 
	RB(NA)	*-2		=2 
	LDK	A3,1	NOT OPERABLE	=2 
IH:00	EQU	*		=2 
	XIF
	LD	A8,DWTECB,A6	ECB ADDRESS
	LD	A5,DWTA5,A6	STACK POINTER 
	LDR	A2,A3	STATUS 
	SLL	A2,1 
	RB(N)	FDRE	READY INTERRUPT 
	LD	A2,DWTRTY,A6	RETRY
	RF(Z)	IH:10	NO 
	CM	DWTRTY,A6	RESET RETRY FLAG
	LDR	A1,A3
	ANK	A1,5	DATA FAULT, NOT OPERABLE
	RF(Z)	IH:10	RETURN CODE OK 
	ORK	A3,4 
IH:10	EQU	* 
* 
	EJECT			DRFD01 
* 
* TRANSFORM RETURN CODE, CU - ECB 
* 
	ANKL	A3,/FF37
	RF(Z)	IH:80
	LDR	A1,A3
	ANKL	A3,/0A05	UNCHANGED BITS 
	ECR	A4,A3
	ANK	A4,8	CHECK IF NO DATA
	RF(Z)	IH:70	NOT NO DATA
	ORK	A3,4	SET BIT 13 ALSO 
IH:70	EQU	* 
	LDR	A4,A1
	ANKL	A4,/0400	BIT 5
	SLC	A4,7	TO BIT 14 
	ORR	A3,A4
* 
	IFT	TOSS+IBM=0 
	LDR	A4,A1
	ANKL	A4,/2000	BIT 2
	SLL	A4,1	TO BIT 1
	ORR	A3,A4
	XIF
* 
	LDR	A4,A1
	ANK	A4,/20	BIT 10
	SLL	A4,3	TO BIT 7
	ORR	A3,A4
	ANK	A1,/10	BIT 11
	SRC	A1,5	TO BIT 0
	ORR	A3,A1
	ORRS	A3,A6	UPDATE TEMPORARY RETURN CODE
	ANKL	A3,/F7FF
IH:80	EQU	* 
	LDR	A1,A3
	RTN	A5 
* 
	EJECT			DRFD01 
* 
******************************************* 
*                                         * 
*    S U B R O U T I N E S                * 
*                                         * 
******************************************* 
* 
******* 
*     * 
* BIO * 
*     * 
******* 
* 
*  INPUT:  A8  ECB ADDRESS
*          A4   ORDER 
* 
*  OUTPUT: A2  BITS 0-12 OF CONTROL WORD USED BY CIO START
*          A3  NO OF BYTES TO BE TRANSFERED 
*          A4  BUFFER ADDRESS 
* 
BIO	EQU	* 
	LD	A1,DWTCW2,A6	GET SECTOR NUMBER
	SLL	A1,3	PUT IN RIGHT BIO POSITION 
	LD	A2,DWTSIO,A6	GET NUMBER OF SECTORS IN THIS IO 
	SRC	A2,2 
	ORR	A2,A1	COMPLETE BIO 
	ADR	A2,A4	COMPLETE BIO WITH ORDER
	LD	A4,DWTBA,A6	BUFFER ADDRESS
	LD	A3,DWTRL,A6	GET REQ. LENGTH 
	RTN	A5 
* 
	EJECT		DRFD01
* 
* 
***************** 
*               * 
*   BIOSQ       * 
*               * 
***************** 
* 
*  INPUT:  A8  ECB ADDRESS
*          A4   ORDER 
* 
*  OUTPUT: A2  BITS 0-12 OF CONTROL WORD USED BY CIO START
*          A3  NO OF BYTES TO BE TRANSFERED 
*          A4  BUFFER ADDRESS 
* 
BIOSQ	EQU	* 
	IFT	IBM=1
	LD	A2,ECBCW2,A8	GET SECTOR NUMBER
	SLL	A2,3	PUT IN RIGHT BIO POSITION 
	ADR	A2,A4	COMPLETE BIO WITH ORDER
* 
	IFT	MMUPAG=0 
	LD	A4,ECBBA,A8	GET BUFFER ADDRESS
	XIF
* 
	IFT	IBM=1
	IFT	MMUPAG=1 
	LDKL	A4,BUF	DRIVER BUFFER ADDRESS
	XIF
* 
	IFT	IBM=1
	LDK	A3,SECLEN	REQUESTED LENGTH 
	RTN	A5 
	XIF
* 
	EJECT		DRFD01
* 
******************
*   VO:NAM       *
******************
* 
* 
VO:NAM	EQU	*
	IFT	TOSS+IBM=2 
	LDK	A3,36	LENGTH 
	XIF
* 
	IFT	TOSS=1 
	IFT	IBM=0
	LDK	A3,6	VOLUME NAME LENGTH
	XIF
* 
	IFT	TOSS=1 
	LDK	A2,0	BIO 
	LDKL	A4,BUF	READ TO BUFFER 
	CF	A5,FD:REA 
	ANK	A3,/17	FATAL ERROR 
	RF(NZ)	VOL:40
	IFT	IBM=1
	LD	A2,BUF+32 
	CWK	A2,'TO'
	RF(NE)	VOL:10	IBM DISC 
	LD	A2,BUF+34	GET NEXT WORD 
	CWK	A2,'SS'
	RF(NZ)	VOL:10	IBM DISC 
VOL:05	EQU	*
	C1	A1,DWTA3,A6	DRIVE BIT MASK
	ANS	A1,DWTLAB,A6	INDICATE TOSS DISC
	XIF
* 
	EJECT			DRFD01 
* 
* 
	IFT	TOSS=1 
	LDKL	A2,BUF
	IFT	IBM=1
	RF	VOL:20
	XIF
* 
	IFT	IBM=1
VOL:10	EQU	*
	LDK	A3,10	LENGTH 
	LDK	A2,/30	BIO 
	LDKL	A4,BUF+10	READ TO BUF+10FER 
	CF	A5,FD:REA 
	ANK	A3,/17 
	RF(NZ)	VOL:40	IO ERROR	=4
	IFT	TOSS=1 
	LD	A2,BUF+10	CHECK IF IBM VOLUME LABEL 
	CWK	A2,/E5D6	VO
	RB(NE)	VOL:05	NOT IBM
	LD	A2,BUF+12 
	CWK	A2,/D3F1	L1
	RB(NE)	VOL:05	NOT IBM DISC 
	XIF
	IFT	IBM=1
*				=4 
	LD	A1,DWTA3,A6	DRIVE NO BIT MASK 
	ORS	A1,DWTLAB,A6	INDICATE IBM
	LDKL	A1,/400 
	ORRS	A1,A6	UPDATE TEMPORARY RETURN CODE
	LDK	A7,20	NBR OF CHARACTERS	=5 
	LDKL	A4,BUF	VOLUME NAME ADDRESS	=5 
	CF	A5,ASCII	TRANSFER IBM VOLUME NAME TO ASCII
	LDKL	A2,BUF+14		=5 
	XIF
* 
	EJECT			DRFD01 
* 
* 
VOL:20	EQU	*
	IFF	TOSS+IBM=0 
	LDK	A3,/F8	FILE CODE 
	LD	A1,DWTST2,A6
	RF(NZ)	VOL:30	NOT TEST STATUS
	ORKL	A3,/8000	INDICATE NO NEW NVL SET
VOL:30	EQU	*
	CF	A15,VOLGET	VOLUME NAME TO DWT SET NVL 
	LD	A8,DWTECB,A6
	LDK	A3,0 
VOL:40	EQU	*
	RTN	A5 
	XIF
* 
	IFT	IBM=1
	EJECT			DRFD01 
* 
********* 
* ASCII * 
********* 
* 
*  FUNCTION:  ASCII TRANSFORMS A STRING FROM EBCDIC TO
*             ASCII CODE
*             INPUT STRING ADDRESS IS BUF 
*  INPUT:     A7  NO OF CHARACTERS
*	     A4 = BUFFER ADDRESS
*  OUTPUT:    A1  CHANGED 
*	     A4 = BUFFER ADDRESS
*             A7  CHANGED 
* 
ASCII	EQU	* 
	IFT	MMUPAG=1 
	LDKL	A4,BUF	DRIVER BUFFER ADDRESS
	XIF
* 
	IFT	IBM=1
ASC:00	EQU	*		=8
	ENB
	ADR	A4,A7
ASC:10	EQU	*
	SUK	A4,1 
	LCR	A1,A4	EBCDIC CHARACTER 
	ANK	A1,/FF 
	LC	A1,TASCII,A1	TRANSFORM TO ASCII 
	SCR	A1,A4	PUT ASCII CHAR. IN OUTPUT BUFFER 
	SUK	A7,1 
	RB(P)	ASC:10 
	RF	EBC:90
* 
	EJECT			DRFD01 
* 
**********
* EBCDIC *
**********
* 
*  FUNCTION:  EBCDIC TRANSFORMES A STRING FROM ASCII TO 
*             EBCDIC CODE 
*             OUTPUT STRING IS PUT IN DRIVER BUFFER 
* 
*  INPUT:     A7 NO OF CHARACTERS 
*	     A4 = BUFFER ADDRESS
* 
*  OUTPUT:    A1  CHANGED 
*	     A4 = BUFFER ADDRESS
*             A7  CHANGED 
EBCDIC	EQU	*
	ENB
	IFT	MMUPAG=1 
	LDKL	A4,BUF	DRIVER BUFFER ADDRESS
	XIF
* 
	IFT	IBM=1
	ADR	A4,A7
EBC:10	EQU	*
	SUK	A4,1 
	LCR	A1,A4	GET ASCII CHAR.
	ANK	A1,/FF 
	LC	A1,TEBCDIC,A1 
	SC	A1,BUF-1,A7 
	SUK	A7,1 
	RB(P)	EBC:10 
	LDKL	A4,BUF	DRIVER BUFFER ADDRESS
EBC:90	EQU	*
	INH		INHIBIT INTERRUPTS
	RTN	A5 
* 
	EJECT			DRFD01 
* 
**********
* LOGSEC *
********* 
* 
*  FUNCTION:  LOGSEC TRANSFORMS PHYSICAL SECTOR TO STANDARD 
*              LOGICAL SECTOR (BINARY). 
*             FORMAT OF PHYS. SEC.  TT0SS  (EBCDIC CODE)
*              TT = TRACK,  SS=SECTOR 
* 
*  INPUT:    A4  ADDRESS TO PHYS. SECTOR
* 
*  OUTPUT:   A3  BINARY SECTOR NO 
*            A4  ADDRESS TO PHYS. SEC. + 4
* 
LOGSEC	EQU	*
	CF	A5,DECBIN 
	LDR	A3,A1	SAVE 
	ADK	A4,2 
* 
*  MULTIPLY BY 26 
* 
	SLL	A3,5	*32 
	LDR	A2,A1
	SLL	A2,2 
	SUR	A3,A2	*28
	SLL	A1,1 
	SUR	A3,A1	*26
	CF	A5,DECBIN 
	SUK	A1,1 
	ADR	A3,A1
* 
	EJECT			DRFD01 
* 
*  CHECK SECTOR NO
* 
	LDR	A1,A3
	SUK	A1,25
	RF(NP)	LOG:10
	CWK	A4,BUF+EOD+4	EOD 
	RF(E)	LOG:02	YES!
	SUKL	A1,1898 
	RF	LOG:04
* 
*  CHECK EOD LESS/EQUAL 74001 
* 
LOG:02	SUKL	A1,1899 
LOG:04	EQU	*
	RF(P)	LOG:10	NOT ACC SEC. NO 
	SUK	A4,4	RESET BUFFER POINTER
	RTN	A5 
* 
*  FATAL ERROR
* 
LOG:05	ADK	A5,4	ADJUST STACK POINTER
LOG:10	LDK	A1,/10	RETURN CODE 
	ORRS	A1,A6	UPDATE TEMPORARY RETURN CODE
	INH		INHIBIT INTERRUPTS
	ABL	LOA:90	ERROR ROUTINE 
* 
	EJECT			DRFD01 
* 
**********
* DECBIN* 
**********
* 
*  FUNCTION:  DECBIN TRANSFORMS TWO EBCDIC CODED DIGITS TO
*             BINARY. RANGE OF EBCDIC CODE /F0 - /F9 IS CHECKED 
*     INPUT:  A4  ADDRESS TO FIRST DIGIT
*   OUTPUT: A1  BINARY
*   WORKING REG:  A2,A7 
* 
DECBIN	LDK	A1,0 
	LDK	A7,2 
DEC:10	LCR	A2,A4	DIGIT
	ANK	A2,/FF 
	SUK	A2,/F0 
	RB(N)	LOG:05 
	SUK	A2,9 
	RB(P)	LOG:05	NOT DIGIT 
	ADK	A2,9 
	SUK	A7,1 
	RF(Z)	DEC:30 
	ADK	A4,1	ADDRESS TO SECOND DIGIT 
DEC:20	SUK	A2,1 
	RB(N)	DEC:10	NEXT DIGIT
	ADK	A1,/A	MULTIPLY BY 10 
	RB	DEC:20
DEC:30	ADR	A1,A2
	RTN	A5 
	XIF
* 
	EJECT			DRFD01 
* 
**********
* SETCIO *
**********
* 
*  FUNCTION:  PUT DRIVE NO IN CIO INSTRUCTION 
* 
*  INPUT:  A3  DRIVE NO , (BITS 0-13 MUST BE ZEROES 
* 
*  OUTPUT: A3  CHANGED
*          A4  CHANGED
* 
SETCIO	LDKL	A4,/FFCF
	ANS	A4,FD:CIO
	SLL	A3,4 
	ORS	A3,FD:CIO
	RTN 	A5
	IFT	IBM=1
* 
	EJECT			DRFD01 
* 
**********
* BINDEC *
**********
* 
*  FUNCTION:  BINDEC TRANSFORMS A BINARY NUMBER TO TWO
*             EBCDIC-CODED DIGITS (DECIMAL) 
* 
*  INPUT:  A7  BINARY NUMBER
* 
*  OUTPUT: A3  EBCDIC CODED DECIMAL DIGITS
*          A7  CHANGED
* 
BINDEC	LDK	A3,0 
BIN:10	SUK	A7,10
	RF(N)	BIN:20 
	ADK	A3,1 
	RB	BIN:10
BIN:20	ADK	A7,10
	SLL	A3,8 
	ORR	A3,A7	DECIMAL CONVERTED NO IN A3 
	ORKL	A3,/F0F0	EBCDIC CODED 
	RTN A5 
* 
	EJECT			DRFD01 
********* 
* DSLIO * 
********* 
* 
*  FUNCTION:  PREPARE FOR READING DATA SET LABEL
* 
*  INPUT:  A6  DWT ADDRESS
* 
*  OUTPUT: A2  BITS 0-12 SECTOR NO, BITS 13-15 ZEROES 
*          A3   128 
*          A4  DRIVER BUFFER ADDRESS
*          A6  DWT ADDRESS
*           A1 IS CHANGED 
* 
DSLIO	LDK	A1,DWTDSS 
	CF	A5,DSPAD
	LDR*	A2,A2 
	SLL	A2,3 
	LDK	A3,128 
	LDKL	A4,BUF
	RTN	A5 
* 
	EJECT			DRFD01 
* 
**********
* DSOPCH *
**********
* 
*  FUNCTION:  GET EOD-NO AND EOD-NO ADDRESS IN DWT
* 
*  INPUT:  A6  DWT ADDRESS
* 
*  OUTPUT: A2  EOD ADDRESS
*          A7  EOD-NO      (0=NOT OPEN) 
*          A1  CHANGED
DSOPCH	LDK	A1,DWTEOD
	CF	A5,DSPAD
	LDR*	A7,A2	EOD-NO
	RTN	A5 
* 
	EJECT			DRFD01 
* 
********* 
* DSPAD * 
********* 
* 
*  FUNCTION: GET ABSOLUTE ADDRESS OF SPECIFIED
*            TYPE OF DATA FOR CORRESPONDING DRIVE 
* 
*  INPUT:  A1  DWT OFFSET 
*          A6  DWT ADDRESS
* 
*  OUTPUT: A2  ADDRESS TO DATA
*          A6  DWT ADDRESS
* 
DSPAD	LC	A2,DWTOR,A6	DRIVE NO 
	ANK	A2,/3
	ADR	A2,A2
	ADR	A2,A6
	ADR	A2,A1
	RTN	A5 
* 
	EJECT			DRFD01 
* 
********* 
* STDWT * 
********* 
* 
*  FUNCTION: STORE INPUT WORD IN DWT-AREA DEPENDING OF
*            DRIVE NO 
* 
*  INPUT:    A1  OFFSET TO DWT AREA 
*            A3  WORD TO BE STORED IN DWT 
*            A6  DWT ADDRESS
* 
*  OUTPUT:   A1  UNCHANGED
*            A2  ADDRESS TO WORD IN DWT AREA
*            A3  UNCHANGED
*            A6  UNCHANGED
* 
STDWT	EQU	* 
	CF	A5,DSPAD
	STR	A3,A2
	RTN	A5 
	XIF
* 
	EJECT			DRFD01 
* 
*    D R I V E R   B U F F E R
* 
BUF	EQU	* 
	IFT	IBM=1
	RES	DVBLEN 
	XIF
* 
	IFT	TOSS=1 
	IFT	IBM=0
	DATA	0,0,0	VOLUME NAME BUFFER
	IFT	MMUPAG+CHAN=2
	RES	DVBLEN-3	MMU BUFFER
	XIF
* 
	IFT	TOSS+IBM=0 
	IFT	MMUPAG+CHAN=2
	RES	DVBLEN	MMU BUFFER
	XIF
* 
	EJECT			DRFD01 
* 
********************* 
*                   * 
* DEVICE WORK TABLE * 
*                   * 
********************* 
* 
DWFD01	EQU	*
DWTRCW	EQU	*-DWFD01	TEMP RETURN CODE
	DATA	0 
	DATA	/8000	DWT STATUS
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	FDADR	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	DEVECB	MMU ECB ADDRESS
	XIF
* 
DWTA3	EQU	*-DWFD01
	DATA	0 
	DATA	0	SAVE AREA 
	DATA	0 
	DATA	0 
	DATA	0,0,0,0	STACK (3 LEVELS)
	DATA	0	ORDER SAVE AREA 
* 
	EJECT			DRFD01 
* 
* 
	IFF	TOSS+IBM=0 
	DATA	/8000	NVL INDICATOR 0 
	DATA	/8000	NVL INDICATOR 1 
	DATA	/8000	NVL INDICATOR 2 
	DATA	/8000	NVL INDICATOR 3 
DWTVO0	EQU	*-DWFD01	VOLUME NAME NO 0
	DATA	/FFFF,/FFFF,/FFFF 
DWTVO1	EQU	*-DWFD01	VOLUME NAME NO 1
	DATA	/FFFF,/FFFF,/FFFF 
DWTVO2	EQU	*-DWFD01	VOLUME NAME NO 2
	DATA	/FFFF,/FFFF,/FFFF 
DWTVO3	EQU	*-DWFD01	VOLUME NAME NO 3
	DATA	/FFFF,/FFFF,/FFFF 
DWTST2	EQU	*-DWFD01	SAVE STATUS WORD
	DATA	0 
	XIF
DWTA5	EQU	*-DWFD01
	DATA	0 
DWTRTY	EQU	*-DWFD01	RETRY REQUEST FLAG
	DATA	0 
DWTTP	EQU	*-DWFD01	TIMER POINTER
	DATA	0 
* 
	EJECT			DRFD01 
* 
* 
	IFT	IBM=1
DWTLAB	EQU	*-DWFD01	DISC LABEL INDICATOR
	DATA	0 
	XIF
* 
DWTLC	EQU	*-DWFD01	DRIVE LOCK INDICATOR 
	DATA	0 
* 
	IFT	OPCLOS=1 
DWTTP2	EQU	*-DWFD01	TIMER POINTER FOR OPEN
	DATA	0 
DWTOCF	EQU	*-DWFD01	OPEN/CLOSE FLAG AT POWER ON 
	DATA	0 
	XIF
* 
	EJECT			DRFD01 
* 
* 
	IFT	CHAN=1 
DWTUB	EQU	*-DWFD01	POINTER AT NEXT WORD IN BUFFER 
	DATA	0 
DWTUBE	EQU	*-DWFD01	BUFFER END ADDRESS+2
	DATA	0 
DWTRW	EQU	*-DWFD01	READ/WRITE INDICATOR 
	DATA	0 
	XIF
* 
	IFT	IBM=1
DWTBOE	EQU	*-DWFD01	BEGINNING OF EXTENT 
	DATA	0,0,0,0 
DWTEOD	EQU	*-DWFD01	END OF DATA 
	DATA	0,0,0,0 
DWTEOE	EQU	*-DWFD01	END OF EXTENT 
	DATA	0,0,0,0 
DWTCRN	EQU	*-DWFD01	CURRENT RECORD NO 
	DATA	0,0,0,0 
DWTDSS	EQU	*-DWFD01	DATA SET LABEL SECTOR 
	DATA	0,0,0,0 
	XIF
* 
	EJECT			DRFD01 
* 
* 
DWTBA	EQU	*-DWFD01	BUFFER POINTER 
	DATA	0 
DWTRL	EQU	*-DWFD01	LENGTH IN SUB IO 
	DATA	0 
DWTCW2	EQU	*-DWFD01	SECTOR NUMBER 
	DATA	0 
DWTNOS	EQU	*-DWFD01	SECTOR NUMBER COUNTER 
	DATA	0 
DWTSIO	EQU	*-DWFD01	NUMBER OF SECTORS IN SUB IO 
	DATA	0 
* 
	IFT	IBM+TOSS=2 
DWTFIB	EQU	*-DWFD01	IBM INDICATOR 
	DATA	0 
	XIF
* 
	EJECT			DRFD01 
* 
* 
	IFT	MMUPAG=1 
DWT:BF	EQU	*-DWFD01 
	DATA	0	SAVE AREA BUFFER ADDRESS
BUFFLG	EQU	*-DWFD01 
	DATA	0 
* 
	IFF	CHAN+IBM=0 
DWT:PA	EQU	*-DWFD01 
	DATA	0	6 BIT PHYSICAL BUFFER ADDRESS 
	DATA	0	SECOND MMU ENTRY
* 
DWT:LA	EQU	*-DWFD01 
	DATA	0	16 BIT LOGICAL BUFFER ADDRESS 
	XIF
* 
	IFT	MMUPAG=1 
DEVECB	EQU	*
	DATA	0,0,0,0,0,0,0 
	XIF
* 
* 
* 
	END

Full view