File: DSDHDN.PA of Tape: OS8/OS8-V40/v40-9
(Source file text) 

/ DSDH HANDLER FOR HIGH DENSITY FLOPPY	11/2/76
/ X21HDN.PA	2/7/77
/ USES 8 BIT MODE PACKING SCHEME FOR MAXIMUM EFFICIENCY.
/ THUS AVAILABLE SPACE = 658(10) =1222(8) BLKS INSTEAD OF
/	    OS/8 SPACE = 494(10) = 756(8) BLKS.
/ IF TRACK 0 USED THEN = 667(10) =1233(8) BLKS. (+ 35% )

/ HARDWARE ASSUMPTIONS MADE.  ASSUMES EITHER DONE OR TRREQ WILL
/	BECOME SET, AND DOESN'T COUNT BYTES TRANSFERRED.
/ CAUTION: THIS HANDLER WILL MODIFY THE 2ND PAGE OF A BLOCK
/	   IF ONLY THE FIRST PAGE IS SPECIFIED TO BE WRITTEN.

/ ENTRANCE POINT REFERS TO LOGICAL DRIVE 1 ONLY.

/ THIS IS A 2 PAGE HANDLER WITH ASCII DUMP TO CONSOLE DEVICE
/ OF COMPLETE ERROR STATUS WHENEVER ANY ERRORS ARE DETECTED.
/ PRINTS "<CRLF>CM=<COMMND>  BK=<3*OS/8 BLK#>  ST= <XDR STT>
/	 "EC= <FUNCTION 7 DEFINITIVE ERROR CODE (PAGE 2)>
/	<COMMAND> 24 = WRITE DRIVE 1, 26 = READ DRIVE 1
/	<OS/8 BLK> 3 * VALUE IN DIRECTORY LISTING.
/	<XDR STT  > SEE XDR - BIT 10=>PARITY, BIT11 =>CRC ERROR
/	<	  > SEE PAGE 2 TABLE FOR CODE INTERPRETATION.

/ STANDARD OS/8 CALL SEQUENCE USED BY DRIVER.

/	JMS DSDHEN	/ AC CLEARED ON ENTRANCE AND NORMAL RETURN
/	 FUNCTION WORD	/ W P P  P P P  F F F  X X X
/			/ W = 1 FOR WRITE.
/			/ PPPPP = #128. WD PAGES XFERRED.
/			/ FFF = DATA TRANSFER MEMORY FIELD.
/	STARTING CORE TRANSFER ADDRESS.
/	STARTING LOGICAL DISK BLOCK (0-755) (2 PAGES/BLOCK)
/	ERROR RETURN	/ AC = 4000
/	NORMAL RETURN	/ NO ERRORS DETECTED

/ DEFS FOR INTERFACE OPERATION.

LCDR=6751	/ LOAD COMMAND REG: CLEAR AC.

/ X X X  X MA SZ  DH DR FN  FN FN X
/	MA = 1 FOR MAINTAINANCE MODE.
/	SZ = DATA WORD SIZE: 0=>12 BITS, 1=>8 BITS.
/	DH = HIGH DRIVE'S SELECT FOR DRIVE # 2.
/	DR = DRIVE SELECT.  0=>DRIVE 0, 1=>DRIVE 1.
/	FN = FUNCTION (0 - 7)
/	 0=FILL BUFFER: GET 64 12 BIT WDS OR 128 8 BIT WDS
/	 1=EMPTY BUFFER(VERIFIES DATA: DOESEN'T CHANGE BUF)
/	 2=WRITE SECTOR	3 = READ SECTOR
/	 4= NOP		5 = READ STATUS (250 MSEC.) SEE XDR DEFS
/	 6= WRITE DELETED DATA SECTOR
/	 7= READ ERROR REG: SEE PAGE 2 FOR ERROR CODES.

XDR=6752	/ TRANSFER DATA REGISTER: BIDIRECTIONAL.
		/ IF 12 BIT MODE READ, JAMS DATA INTO AC
		/ IF 8  BIT MODE READ, OR'S DATA INTO AC.
		/ IF WRITE LOADS FROM AC, AC UNCHANGED.
/  NOTE:  AFTER A LCD COMMAND FINISHED STATUS IS AVAILABLE
/		BY DOING AN XDR.
/		AC4= DRIVE READY
/		AC5= DELETED DATA MARK DETECTED IN ID
/		AC9= INITIALIZE COMPLETE.
/		AC10=PARITY ERROR ON CONTROL INF.
/		AC11=CRC ERROR DETECTED IN DATA.

STRF=6753	/ SKIP ON TRANSFER REQUEST.
		/ AN XDR INSTRUCTION IS DESIRED.

SERF=6754	/ SKIP ON ERROR FLAGS SET.
		/ DONE FLAG ALSO SET WHEN TRUE.

SDNF=6755	/ SKIP ON DONE FLAG SET AND CLEAR DONE.
		/ ATTACHED TO INTERRUPT LINE.

SINTR=6756	/ SET INTERRUPT STATE
		/ AC11=1 ENABLES INTERRUPT ON DONE FLAG SET.
		/ AC11=0 DISABLES FLOPPY INTERRUPT.

INIT=6757	/ INIT THE FLOPPY CONTROLLER - INTERFACE.

SAM2=STA CLL RAL
/ ERROR CODES GIVEN BY READ ERROR STATUS FUNCT (MODE 7)

/ CODE	LIGHT #		MEANING
/ 10	2	DRIVE 0 FAILED TO HOME ON INIT, OR DIDN'T SELECT
/ 20	2	DRIVE 1 FAILED TO HOME ON INIT, OR DIDN'T SELECT
/ 30	2	FOUND HOME WHEN STEPPING OUT 10 TRACKS FOR INIT.
/ 40	2	TRACK GREATER THAN 77. OR UNIT SELECT ERROR.
/ 50	2	HOME BEFORE DESIRED TRACK FOUND.
/ 70	2	DESIRED SECTOR COULD NOT BE FOUND AFTER 2 REVS.
/
/ 100	3	WRITE PROTECT ERROR.
/ 110		MORE THAN 40 USEC AND NO SEPERATED CLOCK FOUND.
/ 120	0	NO PREAMBLE WAS FOUND ( 24 BITS OF 0'S)
/ 130	0	PREAMBLE FOUND BUT NO I/O MARK WITHIN WINDOW.
/ 140	0	CRC ERROR ON WHAT APPEARED TO BE HEADER.
/ 150	2	HEADER TRACK ADDRESS OF A GOOD HEADER DIDN'T
/		MATCH DESIRED TRACK.
/ 160	0	TOO MANY TRIES FOR AN I.D. ADDRESS MARK.
/ 170	0	DATA ADDRESS MARK NOT FOUND IN ALLOTED TIME.
/ 200	0	CRC ERROR ON READING SECTOR FROM DISK.
/		RXES STATUS BIT 11 ALSO SET.
/ 210	1	PARITY ERROR (INTERFACE <=> CONTROLLER)
/		RXES STATUS BIT 10 ALSO SET.
/ 220	2	DRIVE 2 FAILED TO HOME ON INIT.
/ 230	2	DRIVE 3 FAILED TO HOME ON INIT.
/ 240	3	FORMATTER ENABLE ERROR.
/ 250	0	EXPECTED HEADER NOT FOUND AFTER TRACK FORMAT.
/ 260	0	INDEX MARK NOT FOUND IN EXPECTED RANGE.
/		 (FORMAT NOT BEGUN)
/ 270	0	INDEX MARK NOT FOUND IN EXPECTED RANGE.
/		 (FORMAT HAS OCCURED)


/ LIGHTS	MEANING
/ 0	FRONT	DATA TYPE ERROR
/ 1	FRONT	PARITY ERROR BETWEEN CONTROLLER-INTERFACE.
/ 2	FRONT	SEEK TYPE ERRORS
/ 3	FRONT	SWITCH CONFLICT ERROR OR CONTROLLER ERROR.
/		INCLUDES WRITE PROTECT OR FORMAT INHIBIT ERRORS.
/	BOARD LIGHTS
/ 4	UP-LEFT	CONTROLLER WAITING FOR BUS INTERFACE READY.
/ 5	UP-RGHT	INIT IN PROGRESS.
/ 6	LW-LEFT	READ IN PROGRESS
/ 7	LW-RGHT	WRITE IN PROGRESS.
/ TABLE FORMAT FOR OS/8 BUILD ENTRIES.

/ NOTE - THE USER OF THIS HANDLER MUST PATCH - THE DEVICE
/	LENGTH IN OCTAL INTO PIP AT LOCATION 13600 + DEVICE TYPE#
/	FOR DEVICE TYPE 55  PATCH 13655 TO 6556 ( = -1222)

/ NOTE: THIS HANDLER DOES NOT WRITE COMPATABLE FILES WITH THE
/	NORMAL NON-SYSTEM FLOPPY HANDLER

/ WORD 1-2	DEVICE TYPE
/ WORD 3-4	OS/8 DEVICE NAME
/ WORD 5	DEVICE CONTROL BLOCK ENTRY
/		BIT 0 =1	FILE STRUCTURED DEVICE
/		BIT 1 =1	READ ONLY
/		BIT 2 =1	WRITE ONLY
/		BITS 3-8	DEVICE TYPE.  SEE TABLE 2-12 OS/8
/		BITS 9-11	USED BY MONITOR
/ WORD 6	ENTRY POINT WORD.
/		BIT 0 = 1	2 PAGE HANDLER
/		BIT 1 = 1	ENTRY POINT = SYS:
/		BIT 2 = 1	ENTRY POINT CORESIDENT WITH SYS:
/		BIT 5-11	ENTRY POINT OFFSET FROM PAGE BEG.
/ WORD 7	MUST BE 0
/ WORD 8	MUST BE 0 UNLESS SYSTEM HANDLER.
/		  THEN = BLOCK LENGTH OF DEVICE.


*0
	-1	/ ONLY ONE ENTRANCE POINT.
DEVICE	DSDH; DEVICE HDX; 4600; 4000+DSDHEN-DRVBEG; 0; 0
*200

DRVBEG,		/ BEGINNING FOR RELOCATION PURPOSES
TRNADR,	0	/ CORE TRANSFER ADDRESS.
LOADPT,	0	/ WORKING POINTER.
WRDCNT,	0	/ - # WORDS TO BE TRANSFERRED.
WRDPCT,	0	/ - # WORD PAIRS TO BE TRANSFERRED.

/ ENTRANCE FOR RETURN TO CALLER.
RETOK,	ISZ DSDHEN	/ DO OK RETURN.
	TAD P7130; LCDR	/ INSURE DONE UP FOR EXIT.
CDFRET,	CDF CIF 0
	JMP I DSDHEN	/ DO RETURN

FUNCT,	0	/ 2 = READ, 0 = WRITE.
LODMOD,	0	/ SET -1 TO LOAD HIGH 4 BYTES 400 WDS
		/ SET =0 TO LOAD LOW 8 BITS FIRST 200 WDS
		/ SET =1 TO LOAD LOW 8 BITS LAST 200 WDS.

/ SUBROUTINE TO PACK HIGH 4 BITS OF A WORD INTO LOW 4

TMPWDR,		/ TEMP WORD FOR READING.
GTHG4S,	0
	TAD I LOADPT; ISZ LOADPT	/ GET S WORD
	AND M7400		/ HIGH 4 BITS
	TAD TMPWDW; RTL; RTL	/ PUT INTO LOW ORDER
	JMP I GTHG4S
/ PUT ENTRANCE POINT AT RKA3 POSITION.
/ MUST MOVE IF THIS HANDLER IS TO BE OPERATED WITH AN RKA3:
/**********************************************************

DSDHEN,	0
	CLA STL RAR	/ AC = 4000, L=0
	TAD I DSDHEN	/ GET FUNCTION WORD
	AND P70		/ EXTRACT TRANSFER DATA FIELD.
	TAD CDFDAT; DCA XFRFLD	/ SET UP FOR TRANSFER
	CML RTL; DCA FUNCT / 0 = WRITE, 2 = READ.
	TAD I DSDHEN; RAL  / GET PAGE COUNT
	AND B7600; CIA; DCA WRDCNT	/ MAKE INTO WORD COUNT.
	TAD WRDCNT
P7130,	STL RAR; DCA WRDPCT	/ WORD PAIR COUNTER.
	ISZ DSDHEN

	RDF; TAD WRTFIN; DCA CDFRET	/ SET UP RETURN DATA FIELD

	TAD I DSDHEN; DCA TRNADR
	ISZ DSDHEN

	TAD I DSDHEN; CLL RAL
	TAD I DSDHEN; MQL	/ DISPLAY 3 * OS/8 BLOCK #
/	DISK BLOCK # TAKEN FROM MQ ON 2ND PAGE.
	ISZ DSDHEN

	SDNF; JMP .-1
CDFDAT,	CDF 0		/ SET TO 0 FOR DISK DRIVER.

BLKLP,	CLL STA; DCA LODMOD	/ SET LOADING MODE TO HIGH 4 BITS
SCTRLP,	TAD FUNCT; SZA; JMS RWSUB / READ PRIOR TO EMPTY BUF.


/ FILL OR EMPTY (100 OR 102)  BUFFER IN 8 BIT MODE.
	TAD FUNCT; TAD RXFL8	/ FILL/EMPTY BUF CMMD.
	LCDR

	TAD LODMOD; SMA SZA CLA	/ SET = -1 TO XFER HIGH 4 BITS (256)
	 JMP .+3		/ SET = 0 TO LOAD LOW 8 BITS (128 WDS)
	  TAD TRNADR; DCA LOADPT / RESET POINTER IF MODE -1 OR 0
XFRFLD,	0	/ LOADED WITH CDF TRANSFER FIELD FOR DATA XFER.
	ISZ LODMOD		/ BUMP TO NEXT MODE
	 JMP LDLW8		/ DO LOW 8 BIT LOAD IF MODE NOT -1
	TAD FUNCT; SNA CLA; JMP WTHG4B	/ DO FILL MODE.

/ IF MODE WAS -1 THEN READ HIGH 4 BITS OF 400 WORDS.

RDHG4B,	JMS XDRSUB	/ GET A BYTE
	JMS RDHG4S	/ LOAD HIGH 4 BITS INTO CORE.
	TAD TMPWDR	/ GET SHIFTED WORD BACK
	JMS RDHG4S	/ AND LOAD IN NEXT SEQ. ADDR (HIGH NIBBLE)
	ISZ WRDPCT; JMP RDHG4B	/ LOOP TILL DONE FLAG COMES UP
				/ DOES DISPATCH FROM INSIDE XDRSUB
	JMS XDRSUB; JMP .-1	/ DON'T XFER ON WRDCNT OVERFLOW.

TMPWDW,		/ TEMP WORD FOR WRITING.
RDHG4S,	0
	RTL; RTL	/ SHIFT 4 BITS LEFT
	DCA TMPWDR; TAD TMPWDR
	AND M7400; DCA I LOADPT / LOAD HIGH 4, ZERO LOW 8 BITS
	ISZ LOADPT
RXFL8,	100	/ FILL BUFF IN 8 BIT MODE.
	JMP I RDHG4S

/ SECTION TO WRITE HIGH NIBBLE.

WTHG4B,	CLA CLL; DCA TMPWDW	/ ZERO IT EVERY WRD PAIR.
	JMS GTHG4S; DCA TMPWDW	/ MODE -1, WRITE HIGH 4 BITS.
	JMS GTHG4S; RAL		/ PUT INTO LOW BYTE POSITION.
	JMS XDRSUB
	JMP WTHG4B

/ LOOP TO MERGE IN LOW 8 BITS IN MODE 0 AND 1.
/ USED IN BOTH READ AND WRITE MODES.

LDLW8,	TAD I LOADPT	/ GET ORIGINAL CONTENTS FOR ORING
	JMS XDRSUB	/ DOES LOGICAL OR IN 8 BIT MODE.
	DCA I LOADPT
	ISZ LOADPT
P70,	70	/ MASK FOR DATA FIELD EXTRACTION
	ISZ WRDCNT; M7400, 7400
	JMP LDLW8
 /	SDNF; HLT	/ SHOULD BE UP
 /	JMP WRTFIN	/ DO FINAL WRITE.

/ ROUTINE TO DO BYTE TRANSFER.
/ DOES FINAL WRITE IF WRITE COMMAND AND
/ EXITS TO BLKLP WHEN BUFFER XFER COMPLETE.

XDRSUB,	0
	STRF; JMP NOTYET	/ DATA NOT AVAILABLE YET OR DONE.
	XDR
	JMP I XDRSUB

NOTYET,	SDNF; JMP XDRSUB+1	/ CONTINUE WAITING.
WRTFIN,	CDF CIF 0	/ RESET DATA FIELD TO 0
B7600,	CLA+400; TAD FUNCT	/ SKIP IF READ FUNCTION.
	SNA CLA; JMS RWSUB	/ DO THE WRITE

/ NOTE THAT WRDPCT IS USED IN MODE 0 SO EXIT ONLY ON MODE 1 OR 2
/	EXIT ON MODE 1 OR 2 IF WRDCNT = 0.
	TAD WRDCNT; SNA CLA; JMP RETOK	/ DO DONE EXIT.
/ FINISHED MODE 2 AND WRDCNT NOT ZERO?
	SAM2; TAD LODMOD	/ RECYCLE ON MODE 2?
	SZA CLA; JMP SCTRLP	/ NO - DO NEXT MODE = 1,2
	TAD LOADPT; DCA TRNADR	/ YES - UPDATE FOR NEXT TRANSFER
	JMP BLKLP


*DRVBEG+175

/ CALLED WITH 0 OR 2 IN AC FOR FUNCTION CODE.
/ MQ CONTAINS OS/8 BLOCK #.

RWSUB,	0	/ PUT THE BURDEN ON PAGE 2.
	CLL RTR		/ PUT RW FLAG INTO LINK
	TAD RWSUB	/ PASS RET ADDR IN AC.
/ COS BLK MAPPING USES 3 WAY INTERLEAVE
/ BLK 10 =	T1 S25, T1 S30, T2 S1
/ BLK 11 =	T2 S4,  T2 S7,  T2 S12
/ BLK 12 =	T2 S15, T2 S20, T2 S23
/ BLK 13 =	T2 S26, T2 S31, T2 S2

	DCA RWSUBR	/ STORE RETURN ADDRESS.
	RTL		/ LINK INTO 0 OR 2 FUNCTION.
	TAD UNITCD; DCA RWFUNC	/ AC = 0 ON CALL FOR WRITE, 2 = READ.
	TAD M4; DCA RETRYC	/ SET RETRY COUNTER.
	MQA; DCA DSKADR	/  'OR' IN DISK ADDRESS
	MQA; IAC; MQL		/ INCREMENT IT BY 1 IN MQ
RWRETR,	TAD RWFUNC; LCDR		/ LOAD THE OPERATION.
	DCA TRACK		/ CLEAR FOR CONVERSION.
	TAD DSKADR

BLKCNV,	TAD M26D		/ DIVIDE BY 26 SECTORS / TRACK.
	SNL; JMP .+4		/ CONTINUE TILL OVERFLOW OCCURS.
	 ISZ TRACK
	 CLL; JMP BLKCNV

	DCA TMPSCT		/ NEGATIVE REMAINDER.
	TAD TMPSCT; CLL RAL	/ 2 * REMAINDER.
	TAD TMPSCT		/ 3 * REMAINDER

	TAD P26D; SPA; JMP .-2	/ GET A SECTOR # MOD 26
	IAC			/ PUT IN 1 - 26. RANGE
	STRF; JMP .-1		/ WAIT FOR TRNREQ
	 XDR			/ LOAD IT AS SECTOR #.

	CLA IAC; TAD TRACK	/ GET TRACK # (1 - 77)
	STRF; JMP .-1		/ WAIT FOR TRNREQ.
	 XDR			/ LOAD TRACK VALUE.

	SDNF; JMP .-1		/ WAIT FOR READ COMPLETE.

P7600,	CLA+400
	SERF; JMP I RWSUBR	/ RETURN IF NO ERROR.

/ ERROR DETECTED - PRINT COMPLETE STATUS.

PNTERR,	TAD P155; JMS PCHAR	/ CR
	TAD P152; JMS PCHAR	/ LF
	JMS PRINTC; 4355	/ "CM= "
	TAD RWFUNC		/ 24 ( + 2 IF READ)
	JMS PNTOCT		/ 24 = WRITE, 26 = READ.

	JMS PRINTC; 4253	/ "BK= "
	MQA			/ 'OR' IN OS/8 BLOCK #.
	JMS PNTOCT

	JMS PRINTC; 6364	/ "ST= "
	XDR			/ STATUS FLAGS
	JMS PNTOCT

	TAD CMDERF	/ DO A "READ DEFINITIVE STT
	LCDR
	SDNF; JMP .-1
	JMS PRINTC; 4543	/ "EC= "
	XDR
	JMS PNTOCT

	ISZ RETRYC; JMP RWRETRY	/ RETRY IT .
	INIT
	TAD RWSUBR; AND P7600	/ GET CALLING PAGE
	TAD P7; DCA RWSUBR	/ RETURN ADDR FOR FAT ERR
	CLA STL RAR		/ SET AC = 4000
	JMP I RWSUBR

IFNZRO CDFRET&177-7 <CDFRET, ERROR>

RWSUBR,	0
RETRYC,	0	/ RETRY COUNTER.

CMDERF,	116	/ DEFINITIVE ERROR STATUS FUNCTION. (8 BIT MODE)

DSKADR,	0	/ 3* BLOCK # AS INCREMENTED.
UNITCD,	24	/ WRITE DRIVE 1.
RWFUNC,	0	/ 26 = READ DRIVE 1, 24 = WRITE DRIVE 1.

M26D,	-32	/ # SECTORS / TRACK.
P26D,	32	/ + 26. SECTORS / TRACK.
*DRVBEG+325

PNTOCT,	0
	DCA	TEMPC
P152,	TAD M4; DCA TEMP1
	JMS PRINTC; 3500	/ PRINT "= "
PNTOLP,	TAD TEMPC; CLL RTL; RAL; DCA TEMPC
	TAD TEMPC; RAL; AND P7	/ GET A DIGIT.
	TAD P20; JMS PCHAR
	ISZ	TEMP1; JMP PNTOLP
	JMS PRINTC
TEMP1,	 0		/ USE AS 0 FOR 2 SPACES
	JMP I PNTOCT


TEMPC,	0	/ OCTPNT TEMPORARY OFR NUMBER SAVE.
M4,	-4
P7,	7
P77,	77
P240,	240
P20,	20

TRACK,		/ USED AS TEMPORARY FOR TRACK CALCULATION
PRINTC,	0
	TAD I PRINTC; BSW	/ CAUTION ON NON 8-E MACHINES
	AND P77; JMS PCHAR
	TAD I PRINTC; AND P77; JMS PCHAR
	ISZ	PRINTC
	JMP I PRINTC

TMPSCT,		/ USED AS TEMPORARY IN SECTOR # CALCULATION.
PCHAR,	0
P155,	TAD P240
	TLS
	TSF; JMP .-1
	CLA
	JMP I PCHAR

$	$	$	$	$	$	$