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

⟦aec7ac8e6⟧

    Length: 26910 (0x691e)
    Notes: pts_type(SC)
    Names: »DRDU01.SC«

Derivation

└─⟦7e2393f80⟧ Bits:30009710 Philips computer tape "M_KONV"
    └─⟦this⟧ »M:KONV/DRDU01.SC« 

PTS(SC)

	IDENT DRDU01 	REL 9.2 79-11-16  870105040920 

* 
* 
**********************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRDU01 = DRIVER FOR ONE/TWO DISC UNITS X/1215 AND/OR X/1216 
* 
* 
* 
* 
* 
* 
* 
**************************************************
* 
* 
*   THIS DISC DRIVER HANDLES UP TO TWO DISC 
*   DRIVES X/1215,X/1216 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 
* 
	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 
	ENTRY	DWDU02	DWT ADDRESS DISC UNIT NO. 2 
	EJECT			DRDU01 
* 
* 
************* 
* EXTERNALS * 
************* 
* 
* 
	EXTRN	TDISP	DISPATCHER 
	EXTRN	TENDIO	END I/O 
	EXTRN	SAVE8	SAVE REGS. A1-A8 ON A15 STACK
	EXTRN	DISIOE	REQUEST ERROR 
	EXTRN	INIFLG	INITIALIZATION FLAG 
	EXTRN	INTSAV	SAVE AREA LAST INTERRUPT
	EXTRN	SETIMP	TIMER 
	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 
	EJECT			DRDU01 
* 
* 
**************************
*                        *
*  CONDITIONAL ASSEMBLY  *
*                        *
**************************
* 
* 
*   READ AFTER WRITE MAY BE EXCLUDED FOR ORDER /15
*   BY SETTING X:A = 0
* 
X:A	EQU	0 
RAW	EQU	0 
* 
* 
*   THIS DRIVER CAN HANDLE TWO DISC UNITS 
*   IF X:B := 2 
* 
X:B	EQU	1 
NUNITS	EQU	2
* 
* 
*   DRIVE 1 MAY BE A X/1216 INSTEAD OF A X/1215 
*   BY SETTING X:C = 1
* 
X:C	EQU	0 
TYPE1	EQU	0 
* 
* 
*   DRIVE 2 MAY BE A X/1216 INSTEAD OF A X/1215 
*   BY SETTING X:D = 1
* 
X:D	EQU	0 
TYPE2	EQU	1 
* 
	EJECT			DRDU01 
* 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
* 
*   IF DISC ACCESSES ARE MADE EXCLUSIVELY BY DATA 
*   MANAGEMENT, AND MMUPAG=1, THEN X:E := 1, ELSE 0.
* 
X:E	EQU	0 
ONLYDM	EQU	0
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	1
* 
* 
*	A PROGRAM VERSION USING TOSS DISC PAGING
*	IS OBTAINED BY SETTING DSKPAG EQU 1.
* 
DSKPAG	EQU	0
* 
	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
* 
MAXCY5	EQU	203	MAX CYLINDER NO X/1215 
MAXCY6	EQU	407	MAX CYLINDER NO X/1216 
LENGTH	EQU	410	SECTOR LENGTH, CHARACTERS
QRETRY	EQU	4	NO OF RETRIES
TIME	EQU	1000	1 MIN 40 SEC
* 
	EJECT			DRDU01			DRDU01
* 
* 
	DATA	0	INDICATES NO MMU BUFFER 
	DATA	4	DISC DEVICE INDEX 
DUADR	DATA	DUAD	ACTIVATION ADDRESS
	DATA	0	ABORT ROUTINE ADDRESS 
* 
BUF	RES	5	SECTOR BUFFER - 200 WORDS 
	IFT	RAW=1
	RES	200	READ AFTER WRITE BUFFER
	XIF
* 
	EJECT			DRDU01 
* 
*   RETRY IS USED TO DETECT RETRIES 
* 
RETRY	DATA	0	MAX NO OF TRIES
* 
* 
*   TABLE FOR CONVERSION FROM LOGICAL TO PHYSICAL 
*   SECTOR NUMBER 
* 
* 
SECTAB	DATA	/0003,/0609,/0C0F,/0205,/080B,/0E01,/0407,/0A0D 
	DATA	/1013,/1619,/1C1F,/1215,/181B,/1E11,/1417,/1A1D 
* 
	EJECT			DRDU01			DRDU01
* 
* 
***************** 
*               * 
*  ACTIVATION   * 
*               * 
***************** 
* 
* 
DUAD	EQU	*	ACTIVATION ENTRY 
	IFT	NUNITS=2 
	LDKL	A1,/7FFF
	LDR*	A2,A6	GET OTHER DISC UNIT DWT 
	ANS	A1,DWTST,A2	SET OTHER DISC UNIT BUSY 
	XIF
* 
DUA:00	EQU	*
	LDK	A4,QRETRY	GET MAX NO OF RETRIES TO MAKE
	ADK	A7,0	SET CR
	RF(Z)	TEST	TEST STATUS ORDER 
* 
	IFT	MMUPAG=1 
	IFF	1-ONLYDM+DSKPAG=0
	LDR*	A1,A8	GET FIRST WORD OF ECB 
	ANKL	A1,/3000	GET BITS 0-1 IN 18-BIT ADDRESS 
	RF(Z)	DUA:05	BUFFER IN SYSTEM AREA?
* 
	EJECT			DRDU01 
* 
* 
	LD	A2,2,A8	GET BUFFER ADDRESS
	LDR	A3,A2
	ANKL	A2,/F000
	SRL	A2,2 
	SLL	A1,2 
	ORR	A1,A2
	ST	A1,DWT:PA,A6	PAGE NUMBER (PSEUDO MMU TABLE) 
	ANKL	A3,/FFF 
	LDR	A1,A3
	ORK	A1,1	INDICATE ADDRESS NOT ZERO 
* 
DUA:05	ST	A1,DWT:LA,A6	16 BIT LOGICAL BUFFER ADDRESS
	XIF
* 
	EJECT			DRDU01 
* 
* 
	LD	A2,DWTOR,A6	GET INDEX AND ORDER 
	ST	A2,DWTORD,A6	SAVE IT FOR RECOVERY 
	SRL	A2,7	GET INDEX (DOUBLED) 
	ADR	A2,A6
	LD	A1,DWTBSY,A2
	ABL(NZ)	END:15 
	LDR	A1,A7	CHECK ORDER
	SUK	A1,1	
	RF(Z)	DUA:30	BASIC READ
	SUK	A1,4 
	RF(Z)	DUA:30	BASIC WRITE 
	SUK	A1,12	 
	RF(Z)	DUA:30	PHYSICAL READ 
	SUK	A1,4	
	RF(Z)	DUA:30	PHYSICAL WRITE
* 
DUERR	ABL	DISIOE	REQUEST ERROR
* 
	EJECT			DRDU01			DRDU01
* 
* 
********************* 
*                   * 
*   TEST STATUS     * 
*                   * 
********************* 
* 
* 
TEST	EQU	*
	CF	A5,VO:NAM	READ VOLUME NAME
	RF	DENDIO	PERFORM ENDIO
* 
	EJECT			DRDU01 
* 
* 
DUA:30	LD	A1,4,A8	REQUESTED LENGTH
	SUKL	A1,LENGTH 
	RB(NZ)	DUERR	REQUESTED LENGTH # 410
	LD	A2,10,A8	RELATIVE SECTOR NUMBER 
	LDR	A3,A2
	ANK	A3,/1F	LOGICAL SECTOR NUMBER 
	LC	A3,SECTAB,A3	PHYSICAL SECTOR NUMBER 
	SC	A3,DWTSEC,A6	SAVE IT
	SRL	A2,5	CYLINDER NUMBER 
	CW	A2,DWTCMX,A6
	RB(G)	DUERR	CYLINDER NO GREATER THAN MAX.
	CW	A2,DWTCYL,A6	COMPARE WITH CURRENT CYLINDER NUMBER 
	RF(E)	DU:030	DISC HEAD ALREADY POSITIONED
	ST	A2,DWTCYL,A6	SAVE CYLINDER NUMBER 
* 
* 
************************
*                      *
*   SEEK SECTOR N      *
*                      *
************************
* 
* 
DU:010	CF	A5,SEEK	SEEK CYLINDER N 
	SLC	A1,5 
	RF(N)	DU:030	OK. SEEK COMPLETED
* 
	EJECT			DRDU01 
* 
* 
************************
*                      *
*   SEEK CYLINDER 0    *
*                      *
************************
* 
* 
DU:015	CF	A5,SEEKZ	SEEK CYLINDER 0
	SLC	A1,6 
	RF(N)	DU:020	SECTOR 0 NOT FOUND
	SUK	A4,1 
	RB(NZ)	DU:010	TRY AGAIN
* 
DU:020	LDKL	A3,/FFFF	ALL RETRIES DONE 
	ST	A3,DWTCYL,A6	SET ILLEGAL CYLINDER NUMBER
	LDKL	A1,/200	SEEK ERROR RETURN CODE
	RF	DENDIO	PERFORM ENDIO
* 
	EJECT			DRDU01			DRDU01
* 
* 
**************************
*                        *
*  GO AND EXECUTE ORDER  *
*                        *
**************************
* 
* 
DU:030	LDR	A1,A7	ORDER
	SUK	A1,5 
	RF(Z)	WRIT:N	BASIC WRITE 
	SUK	A1,12
	RF(NP)	READ:N	READ 
* 
* 
************************
*                      *
*   READ SECTOR N-1    *
*                      *
************************
* 
* 
P:WRIT	CF	A5,WER:R5	EXECUTE WER INSTRUCTIONS
	CF	A5,READ5	READ FIVE WORDS
	ANK	A1,2 
	RF(Z)	P:WR10	OK. CHECK CYLINDER NUMBER 
	SUK	A4,1	DECREMENT RETRY COUNTER 
	RB(NZ)	P:WRIT	TRY AGAIN? 
	RF	DENDIO	ALL RETRIES DONE, GIVE UP
* 
P:WR10	LD	A2,DWTCYL,A6	CYLINDER NUMBER
	CW	A2,BUF+1	COMPARE WITH CURRENT CYLINDER NUMBER 
	RB(NE)	DU:015	ERROR.SEEK CYLINDER 0
* 
	EJECT			DRDU01 
* 
* 
********************* 
*                   * 
*   WRITE SECTOR N  * 
*                   * 
********************* 
* 
* 
WRIT:N	CF	A5,WER:W	EXECUTE WER INSTRUCTIONS 
	CF	A5,WRITE	WRITE SECTOR N 
	ANK	A1,/1F 
	RF(Z)	WRIT20	OK. NO RETURN CODE
	SUK	A4,1	DECREMENT RETRY COUNTER 
	RB(NZ)	WRIT:N	TRY AGAIN? 
	RF	DENDIO	ALL RETRIES DONE, GIVE UP
* 
WRIT20	EQU	*
	IFT	RAW=1
	SUK	A7,5 
	RF(E)	DENDIO	JUMP IF BASIC WRITE 
	LDKL	A3,BUF	DRIVER BUFFER ADDRESS
* 
WRIT30	CF	A5,WER:R	EXECUTE WER INSTRUCTIONS 
	CF	A5,READ	READ SECTOR N 
	ANK	A1,/F
	RF(Z)	DENDIO	JUMP IF OK
	SUK	A4,1	DECREMENT RETRY COUNTER 
	RB(NZ)	WRIT30	TRY AGAIN? 
	XIF
* 
	RF	DENDIO	ALL RETRIES DONE, GIVE UP
* 
	EJECT			DRDU01			DRDU01
* 
* 
**********************
*                    *
*   READ SECTOR N    *
*                    *
**********************
* 
* 
READ:N	CF	A5,WER:R	EXECUTE WER INSTRUCTIONS 
	CF	A5,READ	READ SECTOR N 
	ANK	A1,/F
	RF(Z)	READ10	OK. NO RETURN CODE
	SUK	A4,1	DECREMENT RETRY COUNTER 
	RB(NZ)	READ:N	TRY AGAIN? 
* 
DENDIO	EQU	*	COMMON BRANCH LABEL
	ABL 	END:IO	ALL RETRIES DONE 
* 
	EJECT			DRDU01 
* 
* 
*************************** 
*                         * 
*  CHECK CYLINDER NUMBER  * 
*                         * 
*************************** 
* 
* 
READ10	EQU	*
	IFT	MMUPAG=0 
	LD*	A2,2,A8	GET CURRENT CYLINDER NUMBER
	XIF
* 
	IFT	MMUPAG=1 
	IFF	1-ONLYDM+DSKPAG=0
	LD	A2,DWT:LA,A6	GET FLAG/LOGICAL BUFFER ADDRESS
	RF(Z)	READ30	JUMP IF BUFFER IN SYSTEM AREA 
	TS	-30,A15	SAVE MMU REGISTERS ON STACK 
	TL	DWT:PA,A6	LOAD PSEUDO MMU TABLE 
	ELR	A2,A2	GET CURRENT CYLINDER NUMBER
	TL	-30,A15	RESTORE MMU REGISTERS FROM STACK
	RF	READ40
* 
READ30	EQU	*
	LD*	A2,2,A8	GET CURRENT CYLINDER NUMBER
	XIF
* 
	EJECT			DRDU01 
* 
* 
	IFT	MMUPAG=1 
	IFT	ONLYDM-DSKPAG=1
	LD*	A2,2,A8	GET CURRENT CYLINDER NUMBER
	XIF
* 
READ40	EQU	*
	CW	A2,DWTCYL,A6	COMPARE WITH REQUESTED CYLINDER NUMBER 
	RB(E)	DENDIO	OK, PERFORM ENDIO 
	RB 	DU:015	ERROR. SEEK CYLINDER 0
* 
	EJECT			DRDU01			DRDU01
* 
* 
******************************
*                            *
*  EXECUTE WER INSTRUCTIONS  *
*                            *
******************************
* 
* 
WER:R5	LDKL	A2,/8005	READ 5 WORDS 
	LDKL	A3,BUF	DRIVER BUFFER ADDRESS
	RF	EX:WER
* 
WER:R	LDKL	A2,/80CD	READ 1 SECTOR 
	CWK	A3,BUF 
	RF(E)	EX:WER 
	RF	WER:WB
* 
WER:W	LDKL	A2,/C0CD	WRITE 1 SECTOR
* 
	EJECT			DRDU01 
* 
* 
WER:WB	LD	A3,2,A8	USER BUFFER ADDRESS 
* 
	IFT	MMUPAG=1 
	IFF	1-ONLYDM+DSKPAG=0
	LDR*	A1,A8	GET FIRST WORD OF ECB 
	ANKL	A1,/3000	GET BITS 16-17 IN BUFFER ADDRESS 
	ORR	A2,A1
	XIF
* 
EX:WER	EQU	*
	EX	DWTWR1,A6	EXECUTE 1:ST WER
	EX	DWTWR2,A6	EXECUTE 2:ND WER
	RTN	A5 
* 
	EJECT			DRDU01			DRDU01
* 
* 
******************* 
*                 * 
*  SEEK CYLINDER  * 
*                 * 
******************* 
* 
* 
SEEK	LD	A2,DWTCYL,A6	CYLINDER NUMBER
	SLL	A2,3 
	ORK	A2,2 
	RF	CIO	EXECUTE CIO-START 
* 
SEEKZ	EQU	* 
	LDK	A2,3 
	RF	CIO	EXECUTE CIO-START 
* 
READ5	LC	A2,DWTSEC,A6	SECTOR NUMBER 
	ANK	A2,/1F 
	SUK	A2,3	SECTOR N-1
	ANK	A2,/1F 
	SLL	A2,2 
	RF	CIO	EXECUTE CIO-START 
* 
	EJECT			DRDU01			DRDU01
* 
* 
READ	LC	A2,DWTSEC,A6	SECTOR NUMBER
	ANK	A2,/1F 
	SLL	A2,2 
	RF	CIO	EXECUTE CIO-START 
* 
WRITE	LD	A2,DWTCYL,A6	CYLINDER NUMBER 
* 
	IFT	MMUPAG=0 
	ST*	A2,2,A8	PUT CYL. NR IN USER BUFFER 
	XIF
* 
	IFT	MMUPAG=1 
	IFF	1-ONLYDM+DSKPAG=0
	LD	A1,DWT:LA,A6	GET FLAG/LOGICAL BUFFER ADDRESS
	RF(Z)	WRITE3	JUMP IF BUFFER IN SYSTEM AREA 
	TS	-30,A15	SAVE MMU REGISTERS ON STACK 
	TL	DWT:PA,A6	LOAD PSEUDO MMU TABLE 
	ESR	A2,A1	PUT CYL. NR IN USER BUFFER 
	TL	-30,A15	RESTORE MMU REGISTERS FROM STACK
	RF	WRITE4
* 
WRITE3	EQU	*
	ST*	A2,2,A8	PUT CYL. NR IN USER BUFFER 
	XIF
* 
	EJECT			DRDU01 
* 
* 
	IFT	MMUPAG=1 
	IFT	ONLYDM-DSKPAG=1
	ST*	A2,2,A8	PUT CYLNMB. IN USER BUFFER 
	XIF
* 
WRITE4	EQU	*
	LC	A2,DWTSEC,A6	SECTOR NUMBER
	SLL	A2,2 
	ADK	A2,1 
* 
	EJECT			DRDU01			DRDU01
* 
* 
CIO	EQU	* 
 	LC	A1,DWTOR,A6	 
	ANK	A1,1	INDEX 
	ADR	A1,A1	DOUBLE INDEX 
	ADR	A1,A6
	EX	DWTCIO,A1	EXECUTE CIO-START 
	LDK	A1,1 
	ABL(3)	END:20	DEVICE ADDRESS UNKNOWN?
	ST	A4,DWTA4,A6	           A4 
	ST	A5,DWTA5,A6	           A5 
* 
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 
	LD	A1,INIFLG	INITIALIZATION FLAG 
	RF(Z)	DUON20	POWER UP
* 
DURED2	EQU	*
	LDKL	A1,/7FFF
	ANS	A1,DWTST,A6	SET DISC UNIT BUSY 
* 
	IFT	NUNITS=2 
	LDR*	A6,A6	GET OTHER DWT ADDRESS 
	ANS	A1,DWTST,A6	SET DWT BUSY 
	XIF
* 
	EJECT			DRDU01 
* 
* 
DUON05	EQU	*
 	LDKL	A5,DWTSB2	STACK BASE 
	ADR	A5,A6	STACK BASE 
	CF	A5,VO:NAM	GET VOLUME NAME 
* 
	IFT	NUNITS=2 
	LDR*	A6,A6	OTHER DISC UNIT DWT ADDRESS 
	LDKL	A5,DWTSB2 
	ADR	A5,A6	STACK BASE 
	CF	A5,VO:NAM	GET VOLUME NAME 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	RF(NZ)	DUON10	ANY REQUEST ON?
	LDR*	A6,A6	NO, CHECK NEXT DRIVE
	XIF
* 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	RF(Z)	DUON15	NO REQUEST ON?
* 
DUON10	LD	A7,DWTORD,A6	GET ORDER
	ST	A7,DWTOR,A6	RESTORE INDEX AND ORDER 
	ANK	A7,/3F 
	ABL	DUA:00	REPEAT REQUEST
* 
	EJECT			DRDU01 
* 
* 
DUON15	CF	A15,TENDIO
* 
	IFT	NUNITS=2 
	LDR*	A6,A6	GET OTHER DWT ADDRESS 
	CF	A15,TENDIO
	XIF
	RB	T:DISP	DISPATCH 
* 
*    READY INTERRUPT
* 
DUREDY	LD	A1,TIMER
	RB(Z)	DURED2	NO TIMER ACTIVE 
* 
	IFT	NUNITS=1 
	CM*	TIMER	KILL TIMER 
	RF	DUON40
	XIF
* 
	RB	T:DISP	TIMER ACTIVE 
* 
	EJECT			DRDU01 
* 
*  SET DISC BUSY AND START TIMER
* 
DUON20	LDKL	A1,/7FFF
	IFT	NUNITS=2 
	ANS	A1,DWTST,A6	SET UNIT BUSY
	LDR*	A6,A6	OTHER DWT ADDRESS 
	XIF
	ANS	A1,DWTST,A6	SET UNIT BUSY
	LDKL	A5,DWTSB2	GET STACK BASE
	ADR	A5,A6
	CF	A5,VO:NAM	READ VOLUME NAME
* 
	IFT	NUNITS=2 
	LDR	A4,A1	SAVE RETURN CODE 
	LDR*	A6,A6	GET OTHER DWT ADDRESS 
	LDKL	A5,DWTSB2	GET STACK BASE
	ADR	A5,A6
	CF	A5,VO:NAM	READ VOLUME NAME
	LDR	A3,A1	SAVE RETURN CODE 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	RF(Z)	DUON23	NO REQUEST ON THIS DISC?
	ADK	A1,0	CHECK RETURN CODE 
	RB(Z)	DUON10	REPEAT REQUEST? 
* 
DUON23	EQU	*
	LDR*	A6,A6	GET OTHER DWT ADDRESS 
	LDR	A1,A4	RESTORE RETURN CODE FROM OTHER DISC
	XIF
* 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	RF(Z)	DUON26	NO REQUEST ON THIS DISC?
	ADK	A1,0	CHECK RETURN CODE 
	RB(Z)	DUON10	REPEAT REQUEST? 
* 
	EJECT			DRDU01 
* 
* 
DUON26	EQU	*
	IFT	NUNITS=2 
	ADR	A1,A3	CHECK RETURN CODES 
	RB(Z)	DUON15	NO REQUESTS AND BOTH OPERABLE?
	XIF
* 
	IFT	NUNITS=1 
	ADK	A1,0	SET CR
	RB(Z)	DUON15	NO REQUEST AND OPERABLE?
	XIF
* 
	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 
	RB	DUON05
* 
	EJECT			DRDU01			DRDU01
* 
* 
*********************** 
*                     * 
*  INTERRUPT HANDLER  * 
*                     * 
*********************** 
* 
* 
IHDU2	EQU	* 
	IFT	NUNITS=2 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	NUNITS=2 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFT	NUNITS=2 
	LDKL	A6,DWDU02	DISC UNIT NO. 2 
	RF	IHDU10
	XIF
* 
	EJECT			DRDU01 
* 
* 
IHDU	EQU	*
IHDU1	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
	IFT	NUNITS=2 
	LDR	A2,A1
	ANK	A2,/40 
	RF(Z)	IHDU20 
	LDKL	A6,DWDU02 
	XIF
* 
IHDU20	ANKL	A1,/460F	MASK RETURN CODE 
	SLL	A1,1 
	RB(N)	DUREDY	READY INTERRUPT 
	SRL	A1,1 
	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,DWTOR,A6 
	ANK	A7,/3F	ORDER 
	LD	A8,DWTECB,A6	ECB ADDRESS
	RTN	A5 
* 
	EJECT			DRDU01			DRDU01
* 
* 
******************* 
*                 * 
*  PERFORM ENDIO  * 
*                 * 
******************* 
* 
* 
END:IO	EQU	*
	ANKL	A1,/20F	MASK RETURN CODE
	RF(NZ)	END:10	ERROR
	LD	A2,4,A8	REQUESTED LENGTH =
	ST	A2,6,A8	EFFECTIVE LENGTH
* 
END:10	EQU	*
	LDK	A2,QRETRY	GET MAX NO OF RETRIES
	CW	A2,DWTA4,A6 
	RF(E)	END:15	NO RETRY
	ORKL	A1,/100	BIT 7 = RETRIES 
* 
END:15	EQU	*
	LC	A2,DWTOR,A6	ORDER 
	ANK	A2,1	INDEX 
	ADR	A2,A2
	ADR	A2,A6
	CM	DWTBSY,A2	RESET READY WORD
* 
	EJECT			DRDU01 
* 
* 
END:20	EQU	*
	IFT	NUNITS=2 
	LDR*	A6,A6	OTHER DISC UNIT DWT ADDRESS 
	CF	A15,TENDIO	PERFORM ENDIO
	LDR*	A6,A6	ACTIVE DISC UNIT DWT ADDRESS
	XIF
* 
	CF	A15,TENDIO	PERFORM ENDIO
 	ABL	TDISP	GO TO DISPATCHER
* 
	EJECT			DRDU01 
* 
* 
VO:NAM	EQU	*
	CM	DWTSAV,A6	INDICATE VOLUME NAME READING
	CM	DWTOR,A6	INDEX=0
* 
VO:NA5	EQU	*
 	CF	A5,SEEKZ	SEEK SECTOR 0 
	ANKL	A1,/203 
	RF(NZ)	VO:NA8	SEEK-,THROUGHPUT ERROR,NOT OPERABLE
	CF	A5,WER:R5	EXECUTE WER INSTRUCTIONS
	LDK	A2,0	CYLINDER NUMBER = 0 
	ST	A2,DWTCYL,A6
	CF	A5,CIO	READ VOLUME LABEL
	ANK	A1,3 
	RF(NZ)	VO:NA8	THROUGHPUT ERROR,NOT OPERABLE
	LDK	A2,DWTNAM
	ADR	A2,A6
	LD	A3,DWTOR,A6	
	RF(Z)	DUNA10	FIXED DISC
	ADK	A2,6	CARTRIDGE DISC
* 
	EJECT			DRDU01 
* 
* 
DUNA10	LDKL	A3,BUF+2	GET BUFFER ADDRESS 
	ST	A4,DWTA4,A6	SAVE RETRY COUNTER
	LDK	A4,6 
* 
DUNA20	LDR*	A7,A3	GET VOLUME NAME 
	CWR*	A7,A2	COMPARE WITH LAST VOLUME NAME 
	RF(E)	DUNA30	SAME DISC 
	LDK	A1,/80	NEW DISC LOADED 
* 
DUNA30	STR	A7,A2	SAVE DISC NAME 
	ADK	A2,2	INCREMENT POINTERS
	ADK	A3,2 
	SUK	A4,2 
	RB(NZ)	DUNA20	GET NEXT WORD
	ADK	A1,0	SET CR
	RF(Z)	DUNA40	VOLUME MATCH
	LD	A4,INIFLG	CHECK INITIALIZATION FLAG 
	RF(NZ)	DUNA40	NOT POWER UP?
	LC	A4,DWTOR,A6	INDEX 
	ADR	A4,A4
	ADR	A4,A6
	ST	A1,DWTBSY,A4	NEW VOLUME LOADED
* 
	EJECT			DRDU01 
* 
* 
DUNA40	EQU	*
	LD	A4,DWTA4,A6	RESTORE RETRY COUNTER 
	LD	A1,DWTOR,A6	ORDER 
	RF(NZ)	VO:NA6
	LDK	A1,1 
	SC	A1,DWTOR,A6	INDEX=1 
	RB	VO:NA5
* 
VO:NA6	LDK	A1,0	RESET RETURN CODE 
* 
VO:NA8	EQU	*
	LDKL	A2,-1 
	ST	A2,DWTSAV,A6
	RTN	A5 
* 
*   TIMER POINTER 
* 
TIMER	DATA	0	TIMER POINTER
* 
	EJECT			DRDU01			DRDU01
* 
* 
*   DEVICE WORK TABLE DISC UNIT NO. 2 
* 
* 
DWDU02	EQU	*
	IFT	NUNITS=2 
	DATA	DWDU01	POINTER TO OTHER DWT 
	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	ECBDU2	MMU ECB ADDRESS
	XIF
	IFT	NUNITS=2 
	DATA	/00FF	LEFT BYTE=SECTOR NUMBER 
	DATA	0,0,0	SAVE AREA FOR REGISTERS 
	DATA	0,0	STACK 
	DATA	0,0 
	DATA	0	DISC UNIT BUSY INDICATOR
	DATA	0 
			RIGHT BYTE = CYLINDER NUMBER 
	CIO	A2,1,DAF2	CIO-START FIXED DISC 
	CIO	A2,1,DAC2	CIO-START CARTRIDGE DISC 
* 
	EJECT			DRDU01 
* 
* 
	WER	A2,WER1
	WER	A3,WER1+1
	DATA	0,0,0	VOLUME NAME FIXED DISC
	DATA	0,0,0	VOLUME NAME CARTRIDGE DISC
	DATA	-1
	DATA	0 
	DATA	/FFFF	CYLINDER NO.
	IFT	TYPE2=0
	DATA	MAXCY5	MAX CYLINDER NO
	XIF
	IFT	NUNITS+TYPE2=3 
	DATA	MAXCY6	MAX CYLINDER NO
	XIF
* 
	IFT	NUNITS=2 
	IFT	MMUPAG=1 
	DATA	0	PAGE NUMBER (PSEUDO MMU TABLE)
	DATA	0	16 BIT LOGICAL BUFFER ADDRESS 
ECBDU2	EQU	*
	DATA	0,0,0,0,0,0 
	XIF
* 
	EJECT			DRDU01			DRDU01
* 
* 
*   DEVICE WORK TABLE DISC UNIT NO. 1 
* 
* 
DWDU01	EQU	*
	DATA	DWDU02	POINTER TO OTHER DWT 
	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
DWTSEC	EQU	*-DWDU01	
	DATA	/00FF	LEFT BYTE=SECTOR NUMBER 
	DATA	0,0,0	SAVE AREA FOR REGISTERS 
	DATA	0,0	STACK 
	DATA	0,0 
DWTBSY	EQU	*-DWDU01	
	DATA	0	UNIT BUSY INDICATOR 
	DATA	0	UNIT BUSY INDICATOR 
DWTCIO	EQU	*-DWDU01	CIO-START 
	CIO	A2,1,DAF1
	CIO	A2,1,DAC1
* 
	EJECT			DRDU01 
* 
* 
DWTWR1	EQU	*-DWDU01	1:ST WER INSTRUCTION
	WER	A2,WER1
DWTWR2	EQU	*-DWDU01	2:ND WER INSTRUCTION
	WER	A3,WER1+1
DWTNAM	EQU	*-DWDU01 
	DATA	0,0,0	VOLUME NAME FIXED DISC
	DATA	0,0,0	VOLUME NAME CARTRIDGE DISC
DWTSAV	EQU	*-DWDU01 
	DATA	-1
DWTORD	EQU	*-DWDU01 
	DATA	0 
DWTCYL	EQU	*-DWDU01 
	DATA	/FFFF	CYLINDER NUMBER 
	IFT	TYPE1=0
DWTCMX	EQU	*-DWDU01 
	DATA	MAXCY5	MAX CYLINDER X/1215
	XIF
	IFT	TYPE1=1
DWTCMX	EQU	*-DWDU01 
	DATA	MAXCY6	MAX CYLINDER NO X/1216 
	XIF
* 
	EJECT			DRDU01 
* 
* 
	IFT	MMUPAG=1 
DWT:PA	EQU	*-DWDU01 
	DATA	0	PAGE NUMBER (PSEUDO MMU TABLE)
DWT:LA	EQU	*-DWDU01 
	DATA	0	16 BIT LOGICAL BUFFER ADDRESS 
ECBDU1	EQU	*
	DATA	0,0,0,0,0,0 
	XIF
* 
* 
* 
	END

Full view