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

⟦f3cc8520e⟧

    Length: 26984 (0x6968)
    Notes: pts_type(SC)
    Names: »DRFD02.SC«

Derivation

└─⟦71472ef1e⟧ Bits:30009661 Philips computer tape "600103"
    └─⟦this⟧ »BDKMON/DRFD02.SC« 

PTS(SC)

	IDENT  DRFD01 	PRERELEASE  1977-09-09
			UPDATE   #0   77-09-09 
* 
**********************************************
* 
*  PHILIPS TERMINAL SYSTEM PTS
* 
*  DRFD01 = DRIVER FOR FLEXIBLE DISK
* 
* 
*   LEVEL     #2  77-09-09
* 
*   RELEASE   #7  77-09-09
* 
********************************************* 
*  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
* 
********* 
* 
*  ORDERS:
* 
*  /00   TEST STATUS
*  /01   PHYSICAL READ
*  /02   SEQUENTIAL READ                       -IBM DISC ONLY-
*  /05   BASIC WRITE
*  /06   SEQUENTIAL WRITE                       -IBM DISC ONLY- 
*  /0C   WRITE DELETED DATA 
*  /11   PHYSICAL READ
*  /15   PHYSICAL WRITE 
*  /1A   SEARCH KEY 
*  /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
* 
*********** 
*         * 
* ENTRIES * 
*         * 
*********** 
* 
	ENTRY 	FDADR	ACTIVATION ADDRESS
	ENTRY	IHFD	INTERRUPT HANDLER 
	ENTRY	FDON	RECOVERY ROUTINE
	ENTRY	DWFD01	DWT-ADDRESS 
* 
************* 
*           * 
* EXTERNALS * 
*           * 
************* 
* 
	EXTRN	TDISP	DISPATCHER 
	EXTRN	TENDIO	ENDIO 
	EXTRN	DISIOE	REQUEST ERROR 
	EXTRN	DWTOR	ORDER
	EXTRN	DWTECB	ECB-ADDRESS 
	EXTRN	DWTST	DWT STATUS 
	EXTRN	SAVE8	SAVE A1-A8 ON A15 STACK
	EXTRN	SETIMP	TIMER 
	EXTRN	INIFLG	INITIALIZATION FLAG 
	EXTRN	INTSAV	INTERRUPT SAVE AREA 
* 
************************
*                      *
* CONDITIONAL ASSEMBLY *
*                      *
************************
* 
* MULTIPLEX CHANNEL INSTEAD OF PROGRAMMED 
* CHANNEL BY SETTING X:A = 0
* 
X:A	EQU	1 
CHAN	EQU	X:A
* 
* FD DRIVER MAY BE ADAPTED FOR DATA MANAGEMENT
* BY SETTING X:B = 1
* 
X:B	EQU	0 
DAMA	EQU	X:B
* 
*  IBM LABELLED DISC HANDLING MAY BE INCLUDED BY SETTING
*   X:C = 1 
* 
X:C	EQU	1 
IBM	EQU	X:C 
	EJECT
* 
************* 
*           * 
* CONSTANTS * 
*           * 
************* 
* 
CUADR	EQU	09	CONTROL UNIT ADDRESS 
MUXADR	EQU	CUADR+CUADR	MUX-ADDRESS
LENGTH	EQU	410	SECTOR LENGTH
TIME	EQU	20	DELAY - POWER ON
********************
*                  *
* DWT-DISPLACEMENTS*
*                  *
********************
* 

DWTA2	EQU	/12 
DWTA3	EQU	/14 
DWTA5	EQU	/16 
DWTSB2	EQU	/1E	STACK BASE 
* 
**********
*        *
* TABLES *
*        *
**********
* 
FDADR	DATA	FDAD	ACTIVATION ADDRESS
* 
	EJECT
* 
**************
*            *
* ACTIVATION *
*            *
**************
* 
FDAD	EQU	*	ACTIVATION ENTRY 
	LDK	A3,0 
	LC	A3,DWTOR,A6	INDEX 
	LDR	A2,A3	SAVE FOR FDIX
	SLL	A3,4 
* 
*  PUT DRIVE NO IN CIO-INSTRUCTION
* 
	LDKL	A4,/FFCF
	ANS	A4,FD:CIO
	ORS	A3,FD:CIO
* 
	CM	DWTRCW,A6	SAVE RETURN CODE WORD 
* 
*  CHECK IF LOCKED
* 
	LD	A1,DWTLC,A6	 LOCK INDICATOR 
	CF	A5,FDIX	GET BIT MASK IN A3
	ST	A3,DWTA3,A6	SAVE DRIVE INDEX MASK 
	ANR	A1,A3
	RF(NZ)	FD:ORD	LOCKED 
	LDR	A1,A7
	SUK	A1,/26 
	RF(Z)	FD:100	LOCK ORDER
	SUK	A1,/11 
	RF(Z)	FD:100	LOAD ORDER
	LDKL	A1,/8001	RETURN CODE
	ABL	END:IO 
	EJECT
* 
*   ORDER?
* 
FD:ORD	EQU	*
* 
	LDR	A1,A7
	RF(Z)	FD:070	TEST STATUS 
	SUK	A1,1 
	RF(Z)	FD:040	PHYSICAL READ 
	SUK	A1,4 
	RF(Z)	FD:010	BASIC WRITE 
	SUK	A1,7 
	RF(Z)	FD:030	WRITE DELETED DATA
	SUK	A1,5 
	RF(Z)	FD:040	PHYSICAL READ 
	SUK	A1,4 
	RF(Z)	FD:020	PHYSICAL WRITE
	SUK	A1,5 
	IFT	DAMA=0 
	RF(Z)	FD:050	SEARCH KEY
	XIF
	SUK	A1,/1E 
	ABL(Z)	FD:400	UNLOAD 

FD:DIS	EQU	*
	ABL	DISIOE	REQUEST ERROR 
	EJECT
* 
*************** 
*             * 
* BASIC WRITE * 
*             * 
*************** 
* 
FD:010	CF	A5,BIO
	ORK	A2,1 
FD:015	CF	A5,FD:WRI	PERFORM WRITE 
	RF	FD:048	TRANSFORM RETURN CODE
* 
******************
*                *
* PHYSICAL WRITE *
*                *
******************
* 
FD:020	CF	A5,BIO
	ORK	A2,5	INSERT BIO BITS 13-15 
	RB	FD:015
	EJECT
* 
**********************
*                    *
* WRITE DELETED DATA *
*                    *
**********************
* 
FD:030	CF	A5,BIO
	ORK	A2,6 
	RB	FD:015
* 
***************** 
*               * 
* PHYSICAL READ * 
*               * 
***************** 
* 
FD:040	CF	A5,BIO:RE 
FD:045	CF	A5,FD:REA	PERFORM READ
FD:048	EQU	*
	ABL	FD:RC
	EJECT
	IFT	DAMA=0 
* 
**************
*            *
* SEARCH KEY *
*            *
**************
* 
FD:050	EQU	*
	LD	A4,10,A8	KEY AREA ADDRESS 
	LDR*	A2,A4	KEY AREA LENGTH 
	LDR	A1,A2
	ABL(NP)	END:10	ILLEGAL LENGTH
	SUK	A1,128 
	ABL(P)	END:10	ILLEGAL LENGTH 
	LDR	A3,A2
* 
*   IF ODD CHANGE TO EVEN NO OF BYTES 
* 
	ADK	A3,1 
	SRL	A3,1 
	SLL	A3,1 
* 
	SLL	A2,3 
	ORK	A2,7	BIO 
	ADK	A3,4 
	ADK	A4,2	KEY ADDRESS 
	CF	A5,FD:WRI	SEARCH KEY
	LDR	A3,A3	RETURN CODE
	RB(NZ)	FD:048
* 
*  READ RECORD WITH KEY COMMAND 
* 
FD:060	EQU	*
	LDKL	A2,/8004	BIO
	LD	A3,4,A8	REQUESTED LENGTH
	CWK	A3,130 
	ABL(NE)	END:10	ILLEGAL LENGTH
	LD	A4,2,A8	BUFFER ADDRESS
	RB	FD:045
	XIF
* 
*************** 
*             * 
* TEST STATUS * 
*             * 
*************** 
* 
FD:070	EQU	*
	LDKL	A2,/FFF9	BIO DUMMY
	CF	A5,FD:WRI 
	ANKL	A3,/0201	WRITE PROTECT? 
	LDR	A1,A3
	LC	A3,DWTOR,A6	DRIVE NO
	CF	A5,VOLADR	GET VOL NAME ADDR IN A2 
	ST	A2,10,A8	STORE IN CONTROL WORD
	ABL	END:IO 
* 
********
*      *
* LOAD *
*      *
********
* 
FD:100	EQU	*
	LDK	A2,/24 
	DATA	/5700	CF A5,FD:190
	ANK	A3,0 
	RF(NZ)	FD:210	NOT OPERABLE 
	IFT	IBM=1
* 
*  CHECK IF TOSS/IBM LABEL
* 
	LDK	A2,0	BIO 
	LDKL	A4,BUF
	LDK	A3,36	NO OF BYTES
	CF	A5,FD:REA 
	CF	A5,LD:RC
	LD	A1,DWTA3,A6	DRIVE INDEX 
	LDKL	A4,BUF
	ADK	A4,34
	LDR*	A2,A4 
	CWK	A2,'DT'
	RF(NE)	FD:110	IBM LABEL PREASSUMED 
	ADK	A4,2 
	LDR*	A2,A4 
	CWK	A2,'OS'
	RF(NE)	FD:110	IBM LABEL
	XIF
* 
*  READ VOLUME NAME 
* 
	LDK	A3,8	LENGTH
	LDK	A2,0	BIO 
	IFT	IBM=1
	C1R	A1,A1
	ANS	A1,DWTLAB,A6 
	RF	FD:120
* 
FD:110	LDK	A3,10	LENGTH 
	LDK	A2,/30	BIO 
	ORS	A1,DWTLAB,A6	INDICATE IBM DISC 
FD:120	EQU	*
	XIF
	LDKL	A4,BUF	BUFFER ADDRESS 
	CF	A5,FD:REA 
	CF	A5,LD:RC
	LDK	A1,2 
	IFT	IBM=1
	LD	A2,DWTLAB,A6
	AN	A2,DWTA3,A6 
	RF(Z)	FD:130	TOSS LABEL
	LDK	A3,10
	LDKL	A4,BUF
	CF	A5,ASCII
	LDK	A1,4 
FD:130	EQU	*
	XIF
* 
*  GET DWT VOL NAME ADDRESS 
* 
	LC	A3,DWTOR,A6	DRIVE NO
	CF	A5,VOLADR	ADDRESS TO A2 
* 
*  STORE NAME IN DWT
* 
	LDK	A3,3 
FD:140	LD	A4,BUF,A1 
	STR	A4,A2
	SUK	A3,1 
	RF(Z)	FD:150 
	ADK	A1,2 
	ADK	A2,2 
	RB	FD:140
FD:150	EQU	*
	IFT	IBM=1
* 
* DATA SET OPENING WANTED?
* 
	LD	A1,DWTA3,A6	DRIVE INDEX 
	AN	A1,DWTLAB,A6
	RF(Z)	FD:200	TOSS
	LD	A1,DWTOR,A6 
	ANK	A1,/37	ORDER 
	SUK	A1,/26 
	RF(Z)	FD:200	LOCK
* 
*  READ DATA SET LABEL
* 
	LD	A2,10,A8	SECTOR NO
	SUK	A2,8 
	ABL(N)	DISIOE
	SUK	A2,17
	ABL(P)	DISIOE
	ADK	A2,25
	SLL	A2,3	BIO 
	LDK	A3,80	LENGTH 
	LDKL	A4,BUF
	CF	A5,FD:REA 
	CF	A5,LD:RC
	LDKL	A4,BUF
	ADK	A4,34	BOE ADDRESS
	CF	A5,LOGSEC	TRANSFORM TO LOGICAL SECTOR 
	LDK	A2,DWTBOE
	CF	A5,STDWT	STORE BOE NO IN DWT
	ADK	A4,2 
	CF	A5,LOGSEC 
	LDK	A2,DWTEOE
	CF	A5,STDWT	STORE EOE NO IN DWT
	ADK	A4,36
	CF	A5,LOGSEC 
	LDK	A2,DWTEOD
	CF	A5,STDWT	STORE EOD NO IN DWT
* 
FD:200	EQU	*
	XIF
	LD	A2,DWTA3,A6 
	ORS	A2,DWTLC,A6	INDICATE LOCK
FD:205	LD	A3,DWTRCW,A6	RETURN CODE
FD:210	RF	FD:RC 
* 
*  ERROR , UNLOCK 
* 
FD:220	LDK	A2,/14 
	DATA	/5700	CF	A5,FD:190
	RB	FD:205
* 
*   LD:RC  SUBROUTINE 
* 
LD:RC	ORS	A3,DWTRCW,A6
	ANKL	A3,/0405	FATAL ERROR? 
	RB(NZ)	FD:220
	RTN	A5 
* 
**********
*        *
* UNLOAD *
*        *
**********
* 
FD:400	EQU	*
	LDK	A2,/14 
	DATA	/5700	CF A5,FD:190
	ANKL	A3,0	TEMP DUMMY 
	RF(NZ)	FD:410
	LD	A2,DWTA3,A6	INDEX MASK
	XRS	A2,DWTLC,A6	INDICATE UNLOCKED
FD:410	EQU	*
	RF	FD:RC 
	EJECT
* 
***************** 
*               * 
* 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 
	CM	DWTRW,A6	INDICATOR TO WRITE MODE
	XIF
	RF	FD:800
* 
FD:REA	EQU	*
	IFT	CHAN=1 
	LDK	A1,1 
	ST	A1,DWTRW,A6	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 
	ORR	A3,A1
WER1	WER	A3,MUXADR	FIRST WER
WER2	WER	A4,MUXADR+1	SECOND WER 
	XIF
	IFT	CHAN=1 
* 
*  PUT BUFFER START AND END ADDRESS IN DWT
* 
	ST	A4,DWTUB,A6 
	ADR	A3,A4
	ST	A3,DWTUBE,A6	END ADDRESS+2
	XIF
FD:820	EQU	*
	ST	A5,DWTA5,A6	SAVE STACK POINTER
FD:CIO	CIO	A2,1,CUADR	CIO-START 
	RF	T:DISP
	EJECT
* 
************************************* 
*                                   * 
*  FD:RC - TRANSFORM RETURN CODE    * 
*                                   * 
************************************* 
* 
*  INPUT:  A3  RETURN CODE FROM CONTROL UNIT
* 
FD:RC	EQU	* 
	LDR	A1,A3
	RF(Z)	FD:RC2	ZERO
	ANKL	A1,/0A05
	LDR	A4,A3
	ANKL	A4,/0400	BIT 5
	SLC	A4,7	SHIFT TO BIT 14 
	ORR	A1,A4
	IFT	DAMA=0 
	LDR	A4,A3
	ANKL	A4,/2000	BIT 2
	SLL	A4,1	SHIFT TO BIT 1
	ORR	A1,A4
	XIF
	LDR	A4,A3
	ANK	A4,/20	BIT 10
	SLL	A4,3	SHIFT TO BIT 7
	ORR	A1,A4
	ANK	A3,/10	BIT 11
	SRC	A3,5	SHIFT TO BIT 0
	ORR	A1,A3
FD:RC2	EQU	*
* 
*  PUT EFFECTIVE LENGTH IN ECB
* 
	LD	A2,4,A8	REQ LENGTH
	ST	A2,6,A8	EFF LENGTH
* 
**********
*        *
* END:IO *
*        *
**********
* 
END:IO	CF	A15,TENDIO
T:DISP	ABL	TDISP
* 
* 
*  ENTRY FROM RECOVERY ROUTINE
* 
END:05	CM	DWTECB,A6	RESET ECB ADDRESS IN DWT
* 
*  ILLEGAL LENGTH 
* 
END:10	LDKL	A1,/8008	RETURN CODE
	RB	END:IO
	EJECT
* 
********************
*                  *
* RECOVERY ROUTINE *
*                  *
********************
* 
FDON	INH
	CF	A15,SAVE8 
	LDKL	A6,DWFD01	DWT ADDRESS 
	LD	A1,INIFLG 
	RF(Z)	FDON05	POWER UP
	LDKL	A1,-1 
	ST	A1,DWTST2,A6
FDON05	EQU	*
	IM	DWTA2,A6	SET FDON FLAG
	CM	DWTRTY,A6	RESET RETRY FLAG
	LDK	A5,DWTSB2
	ADR	A5,A6	STACK BASE 
	CF	A5,SETBSY	SAVE DWTST IF NOT DONE , INDICATE BUSY
* 
* 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 
	ST	A4,DWTTP,A6 
	RB	T:DISP
* 
*   TIME OUT ROUTINE
* 
FDON20	LDR	A6,A1
	CM	DWTTP,A6
	LDK	A5,DWTSB2
	ADR	A5,A6	STACK BASE 
* 
*  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
* 
*  PUT DRIVE NO IN CIO INSTR
* 
	LDKL	A4,/FFCF
	ANS	A4,FD:CIO
	SRN	A2,A4
	SLL	A4,4 
	ORS	A4,FD:CIO
	LDK	A2,/24 
	DATA	/5700	CF A5 FD:190
	LD	A2,DWTA3,A6	DRIVE IND.
	ANKL	A3,/0	TEMP CODE 
	RF(Z)	FDON30	OK
	XRS	A2,DWTLC,A6	INDICATE UNLOCK
FDON30	EQU	*
	SLL	A2,1 
	CWK	A2,/0010 
	RB(NE)	FDON25
* 
*  ANY REQUEST? 
* 
	CF	A5,GETST
	CM	DWTA2,A6	RESET FDON FLAG
FDON60	EQU	*
	LD	A2,DWTST,A6 
	RB(N)	END:05	NO REQUEST, RETURN VIA TENDIO 
* 
*  RETRY REQUEST
* 
	IM	DWTRTY,A6	INDICATE RETRY
	LD	A7,DWTOR,A6 
	ANK	A7,/3F	ORDER 
	LD	A8,DWTECB,A6	ECB ADDRESS
	ABL	FDAD	REACTIVATE
	EJECT
* 
********************* 
*                   * 
* INTERRUPT HANDLER * 
*                   * 
********************* 
* 
IHFD	EQU	*
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CHAN=1 
	STR	A1,A15 
	STR	A2,A15 
	LDKL	A2,DWFD01 
	LD	A1,DWTUB,A2	POINTER AT WORD IN BUFFER 
	LD	A2,DWTRW,A2	READ / WRITE INDICATOR
	RF(NZ)	IH010	READ
	LDR*	A2,A1 
	OTR	A2,0,CUADR	WRITE 
	RF(A)	IH020	ACCEPTED 
	RF	IH040	NOT ACCEPTED
IH010	INR	A2,0,CUADR	READ 
	RF(NA)	IH040	NOT ACCEPTED
	STR	A2,A1	STORE WORD IN BUFFER 
IH020	LDKL	A2,DWFD01	DWT-ADDRESS
	ADK	A1,2 
	ST	A1,DWTUB,A2	POINTER AT NEXT WORD
	CW	A1,DWTUBE,A2
	RF(NE)	IH030	NOT LAST WORD 
	CIO	A2,0,CUADR	CIO HALT
IH030	EQU	* 
	LDR*	A2,A15
	LDR*	A1,A15
	RTN	A15
* 
* SAVE A4-A8 FOR DISPATCHER 
* 
IH040	EQU	* 
	LDR*	A2,A15
	LDR*	A1,A15
	XIF
	CF	A15,SAVE8 
	SST	A3,CUADR	STATUS
	LDKL	A6,DWFD01	DWT ADDRESS 
	LD	A8,DWTECB,A6	ECB ADDRESS
	LD	A5,DWTA5,A6	STACK POINTER 
	SLL	A3,1 
	RF(N)	FDRE	READY INTERRUPT 
	SRL	A3,1 
	LD	A2,DWTRTY,A6	RETRY? 
	RF(Z)	IH:10	NO 
	CM	DWTRTY,A6	RESET RETRY FLAG
	LDR	A1,A3
	ANKL	A1,/0405
	RF(Z)	IH:10	RETURN CODE OK 
	LDK	A1,/4
	ORR	A3,A1	CRC ERROR
IH:10	EQU	* 
	ANKL	A3,/FF37
	RTN	A5 
	EJECT
* 
********************
*                  *
*  READY INTERRUPT *
*                  *
********************
* 
FDRE	EQU	*
	LD	A2,DWTA2,A6 
	ABL(NZ)	T:DISP	POWER ON ROUTINE ACTIVE 
	LDK	A5,DWTSB2
	ADR	A5,A6	STACK BASE 
	RB	FDON60
	EJECT
* 
******************************************* 
*                                         * 
*    S U B R O U T I N E S                * 
*                                         * 
******************************************* 
* 
* 
**********
*        *
* SETBSY *
*        *
**********
* 
* SETBSY SAVES DWTST TO DWTST2 IF NOT ALREADY DONE. 
* DWTST IS SET BUSY 
* 
*  INPUT:  A6  DWT ADDRESS
* 
*         REG A2 IS WORKING REGISTER
SETBSY	EQU	*
	LD	A2,DWTST2,A6
	CWK	A2,-1
	RF(NE)	SET:10	ALREADY SAVED
	LD	A2,DWTST,A6 
	ST	A2,DWTST2,A6
SET:10	CM	DWTST,A6	SET BUSY 
	RTN	A5 
	EJECT
* 
********* 
*       * 
* GETST * 
*       * 
********* 
* 
* FUNCTION:  GETST RESTORES STATUS SAVED IN DWTST2 TO DWTST.
*            DWTST2 IS SET TO -1
* 
* INPUT:     A6  DWT ADDRESS
* 
* WORKING REGISTER:  A2 
* 
GETST	EQU	* 
	LD	A2,DWTST2,A6
	ST	A2,DWTST,A6 
	LDKL	A2,-1 
	ST	A2,DWTST2,A6
	RTN	A5 
* 
	EJECT
* 
******* 
*     * 
* BIO * 
*     * 
******* 
* 
* 
*  INPUT:  A8  ECB ADDRESS
* 
*  OUTPUT: A2  BITS 0-12 OF CONTROL WORD USED BY CIO START
*          A3  NO OF BYTES TO BE TRANSFERED 
*          A4  BUFFER ADDRESS 
* 
BIO	EQU	* 
	LDK	A4,0	FLAG
	RF	BIO010
BIO:RE	LDK	A4,1 
BIO010	EQU	*
	LD	A1,4,A8	REQ LEN 
	RF(N)	BIOERR	ILLEGAL LENGTH
	LDR	A3,A1
	IFT	DAMA=0 
	LDK	A2,0 
BIO020	LDR	A4,A4
	RF(NZ)	BIO030
	SUK	A1,128 
	RF(Z)	BIO100	REQ LEN ACCEPTED
	RF	BIO040
BIO030	SUK	A1,128 
	RF(NP)	BIO100	REQ LEN ACCEPTED 
BIO040	ADK	A2,1	NO OF SECTEORS
	CWK	A2,3 
	RB(NG)	BIO020
BIO050	RF	BIOERR	ILLEGAL LENGTH 
	XIF
	IFT	DAMA=1 
	SUKL	A1,LENGTH 
BIO055	LDR	A4,A4
	RF(Z)	BIO070	WRITE 
	LDR	A1,A1
	RF(P)	BIOERR	REQ LEN NOT ACCEPTED
	LDK	A2,0 
	LDR	A1,A3	REQ LEN
BIO060	SUK	A1,128 
	RF(NP)	BIO100	REQ LEN ACCEPTED 
	ADK	A2,1 
	CWK	A2,3 
	RB(NG)	BIO060
	RF	BIOERR	ILLEGAL REQ LENGTH 
BIO070	LDR	A1,A1
	RF(NZ)	BIOERR	ILLEGAL LENGTH 
	LDK	A2,3	NO OF SECTORS 
	XIF
* 
* 
BIO100	SRC	A2,2	SHIFT NO OF SECTORS INTO POS 0-1
	LD	A1,10,A8	SECTOR NO
	LDR	A4,A1
	IFT	DAMA=1 
	SUKL	A4,499
	RF(P)	BIODIS 
	SLL	A1,2	MULTIPLY BY 4 
	XIF
	IFF	DAMA=1 
	SUKL	A4,2001 
	RF(P)	BIODIS 
	XIF
	SLL	A1,3 
	ORR	A2,A1
	LD	A4,2,A8	BUFFER ADDRESS
	RTN	A5 
* 
* 
*  ILLEGAL REQUESTED LENGTH, RETURN VIA TENDIO
* 
BIOERR	ABL	END:10 
BIODIS	ABL	FD:DIS	ILLEGAL SECTOR NO 
* 
********* 
*       * 
* FDIX  * 
*       * 
********* 
* 
*  INPUT:  A2   X 
* 
*  OUTPUT: A3   2 POWER(X)
* 
FDIX	LDK	A3,1 
	LDR	A2,A2
FDIX10	EQU	*
	RF(Z)	FDIX20 
	SLL	A3,1 
	SUK	A2,1 
	RB	FDIX10
FDIX20	RTN	A5 
	EJECT
******************
*                *
*  VOLADR        *
*                *
******************
* 
*  INPUT:  A3  BIT 14-15  DRIVE NO
*          A6  DWT ADDRESS
* 
*  OUTPUT: A2  VOLUME NAME ADDRESS
*          A3  ZERO 
* 
VOLADR	LDK	A2,DWTVO0
	ADR	A2,A6
	ANK	A3,/3
VOLA10	EQU	*
	RF(Z)	VOLA20 
	ADK	A2,6	UPDATE ADDRESS
	SUK	A3,1 
	RB	VOLA10
VOLA20	RTN	A5 

	IFT	IBM=1
	EJECT
* 
********* 
* ASCII * 
********* 
* 
*  FUNCTION:  ASCII TRANSFORMS A STRING FROM EBCDIC TO
*             ASCII CODE
*  INPUT:     A3  NO OF CHARACTERS
*             A4  STRING ADDRESS
*  WORKING REG:  A1,A2
* 
ASCII	EQU	* 
	RTN	A5 
	EJECT
* 
**********
* 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. SEC.
*  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
* 
*  CHECK SECTOR NO
* 
	LDR	A1,A3
	SUK	A1,25
	RF(NP)	LOG:10
	SUKL	A1,1898 
	RF(P)	LOG:10	NOT ACC SEC. NO 
	RTN	A5 
LOG:10	LDKL	A1,/4000	RETURN CODE
	ORS	A1,DWTRCW,A6 
	ABL	FD:220	ERROR ROUTINE 
* 
**********
* 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	A2,0 
	LDK	A7,2 
DEC:10	LCR	A2,A4	DIGIT
	SUK	A2,/F0 
	RB(N)	LOG:10 
	SUK	A2,9 
	RB(P)	LOG:10	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 
	EJECT
* 
********* 
* STDWT * 
********* 
* 
*  FUNCTION:  STDWT STORES SECTOR NO INDWT
*  INPUT:     A2  OFFSET IN DWT 
*             A3  SECTOR NO 
*             A6  DWT ADDRESS 
* 
STDWT	EQU	* 
	LDK	A1,0 
	LC	A1,DWTOR,A6	DRIVE NO
	SLL	A1,1	DRIVE OFFSET
	ADR	A1,A2
	STR	A3,A6
	RTN	A5 
	XIF
* 
*    D R I V E R   B U F F E R
BUF	DATA	0,0,0,0
	IFT	IBM=1
	RES	38 
	XIF
	EJECT
* 
********************* 
*                   * 
* DEVICE WORK TABLE * 
*                   * 
********************* 
* 
DWFD01	EQU	*
	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
	DATA	0 
	DATA	0	SAVE AREA 
	DATA	0 
	DATA	0 
	DATA	0,0,0,0	STACK 
DWTST2	EQU	*-DWFD01	SAVE STATUS WORD
	DATA	-1
DWTRTY	EQU	*-DWFD01	RETRY REQUEST FLAG
	DATA	0 
DWTTP	EQU	*-DWFD01	TIMER POINTER
	DATA	0 
DWTRCW	EQU	*-DWFD01	TEMP RETURN CODE
	DATA	0 
DWTLAB	EQU	*-DWFD01	DISC LABEL INDICATOR
	DATA	0 
DWTLC	EQU	*-DWFD01	DRIVE LOCK INDICATOR 
	DATA	0 
DWTVO0	EQU	*-DWFD01	VOLUME NAME NO 0
	DATA	0,0,0 
DWTVO1	EQU	*-DWFD01	VOLUME NAME NO 1
	DATA	0,0,0 
DWTVO2	EQU	*-DWFD01	VOLUME NAME NO 2
	DATA	0,0,0 
DWTVO3	EQU	*-DWFD01	VOLUME NAME NO 3
	DATA	0,0,0 
	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 
	XIF
	END

Full view