File: RX01RT.PA of Tape: Sources/RTS/macrel-1a-rts8-src-2
(Source file text) 

/5 FLOPPY DISK HANDLER FOR RTS-8 V2B
	VERS=	1
	XLIST	1		/COPYRIGHT ALSO GIVEN IN PARAM.PA
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1975,1976 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/
	XLIST	0	/LIST TASK
	IFNDEF	TASK	<TASK=RX8A>	/MAY BE EDITED TO 'RX8B', 'RX8C', OR 'RX8D' .
				/OR MAY INCLUDE AN RXCF
	INIWT=0
	IFNDEF	RXFLD	<RXFLD=10>
	IFNDEF	RXLOC	<RXLOC=3200>
	CUR=	RXFLD

	LOC=RXLOC	/LOAD ADDRESS

	IFNDEF RXDVCD <RXDVCD=750>	/DEVICE CODE OF FLOPPY CONTROLLER

/	SR
/EDIT HISTORY:
/	V2B FIXES (S.R.)

/1.	ADDED POWER FAIL CODE
/2.	FIX BUG RE 8-BIT MODE READS
/3.	ADDED MODBIT TO CMD
/4.	ALLOWED POSSIBILITY OF AN RX CONTROL FILE
/5.	REMOVED MODBIT, USED MSK INSTEAD, BUMMED LOCATIONS

/	MESSAGE FORMAT:

/RXMESG,ZBLOCK 3
/	CODE+DEL+MODE+UNIT
/	RW+PAGES+FIELD
/	BUFADD
/	BLOKNO
/	STATUS

/MODE=	0	TRANSFER IN 12-BIT MODE
/	100	TRANSFER IN 8-BIT MODE

/CODE=	0	IGNORE DEL AND USE PAGES & BLOKNO IN OS/8 SENSE
/	4000	SPECIAL PHYSICAL SECTOR ACTION.  IGNORE PAGES AND
/		ASSUME BLOKNO HAS FORM TTTTTTTSSSSS
/		SPECIFYING ABSOLUTE PHYSICAL TRACK AND SECTOR NUMBER

/DEL=	0	DON'T CONSIDER DELETED DATA MARKS
/	2000	HANDLE DELETED DATA MARK (IF CODE=4000)
/		IF WRITING SECTOR, WRITE DELETED DATA INDICATION
/		IF READING SECTOR, ALWAYS RETURN STATUS WORD
/		SET STATUS BIT 5 TO A 1 IF READ DELETED DATA INDICATION
/		OTHER ERROR BITS STILL SET (STATUS NEGATIVE IF HARD ERROR)
/GENERAL INFORMATION:

/THERE ARE 128 BYTES PER SECTOR,
/26 SECTORS PER TRACK NUMBER 1-26 DECIMAL (1-32 OCTAL)
/77 TRACKS PER FLOPPY NUMBERED 0-76 DECIMAL (0-114 OCTAL)

/IN 12-BIT MODE, THERE ARE 64 WORDS PER SECTOR (4 SECTORS PER OS/8 BLOCK)
/IN 8-BIT MODE, THERE ARE 128 BYTES PER SECTOR (2 SECTORS PER OS/8 BLOCK)


/STANDARD RTS-8, OS/8 INTERLEAVE SCHEME ON FLOPPY IS AS FOLLOWS:

/ OS/8	LOGICAL	PHYSICAL	PHYSICAL
/ BLK	REC #	TRACK #		SECTORS

/0	0-3	1	1,3,5,7
/1	4-7	1	9,11,13,15
/2	8-11	1	17,19,21,23
/3	12-15	1	25,2,4,6
/4	16-19	1	8,10,12,14
/5	20-23	1	16,18,20,22
/6	24-27	1/2	24,26/1,3
/7	28-31	2	5,7,9,11
/8	32-35	2	13,15,17,19
/9	36-39	2	21,23,25,2
/10	40-43	2	4,6,8,10
/11	44-47	2	12,14,16,18
/12	48-51	2	20,22,24,26
/13	52-55	3	1,3,5,7
/...	...

/ALGORITHM TO CONVERT OS/8 BLOCK NUMBER TO PHYSICAL TRACK AND SECTOR #S:

/1.	MULTIPLY OS/8 BLOCK NUMBER, B, BY 4 TO GET INITIAL LOGICAL
/	RECORD NUMBER.  (NEXT 3 LOGICAL RECORD NUMBERS ARE SEQUENTIAL.)

/2.	DIVIDE LOGICAL RECORD NUMBER BY 13 TO GET QUOTIENT Q 
/	AND REMAINDER R.

/3.	DIVIDE QUOTIENT Q BY 2 TO GET NEW QUOTIENT T AND NEW REMAINDER S.

/4.	PHYSICAL TRACK NUMBER IS 1+T .

/5.	PHYSICAL SECTOR NUMBER IS 1+2*R+S .
/FORMAT OF RX8E COMMAND REGISTER:
/BITS 0-3	UNUSED
/BIT 4		MAINTENANCE
/BIT 5		MODE BIT (1 MEANS 8-BIT MODE, 0 MEANS 12-BIT MODE)
/BIT 6		UNUSED
/BIT 7		DRIVE
/BITS 8-10	FUNCTION
/		000	FILL BUFFER
/		001	EMPTY BUFFER
/		010	WRITE SECTOR
/		011	READ SECTOR
/		100	UNUSED
/		101	READ STATUS
/		110	WRITE DELETED DATA SECTOR
/		111	MAINTENANCE
/BIT 11		UNUSED

/FORMAT OF RX8E STATUS WORD:

/BITS 0-3	UNUSED
/BIT 4		SELECTED DRIVE READY
/BIT 5		DELETED DATA INDICATION
/BITS 6-7	UNUSED
/BIT 8		UNUSED BUT RESERVED FOR FUTURE USE
/BIT 9		INIT DONE
/BIT 10		PARITY ERROR
/BIT 11		CRC ERROR

/A FLOPPY CONTAINS 3722(8)=2002(10) SECTORS.
/SINCE 26(10)=32(8) ARE NOT USED BY OS/8,
/THE HIGHEST LOGICAL RECORD # IS 1975(10)=3667(8).
/THUS THE LARGEST OS/8 BLOCK NUMBER IS 493(10)=755(8).
/IN OTHER WORDS, A FLOPPY CONTAINS 494(10) OS/8 BLOCKS OF DATA.
LCD=	6001+RXDVCD	/LOAD COMMAND REGISTER
XDR=	6002+RXDVCD	/TRANSFER DATA REGISTER
STR=	6003+RXDVCD	/SKIP ON TRANSFER REQUEST FLAG, CLEAR FLAG
SER=	6004+RXDVCD	/SKIP ON ERROR FLAG, CLEAR FLAG
SDN=	6005+RXDVCD	/SKIP ON DONE FLAG, CLEAR FLAG
INTR=	6006+RXDVCD	/INTERRUPT ENABLE/DISABLE
INIT=	6007+RXDVCD	/INITIALIZE CONTROLLER AND RECALIBRATE DRIVES

	FIELD CUR%10
	*LOC

BUFFER,			/BUFFER ADDRESS
START,	CAL		/INSERT INTERRUPT SKIP IN SKIP CHAIN
DFLAG,	SKPINS		/ <0 WAITING, =0 FINISHED, >0 PENDING
			/FLOPPY IS INITIALLY BUSY
CMD,	INTRPT
REC,	CLA IAC
WC,	INTR		/ENABLE INTERRUPTS
STATUS,	CLA
FNCTN,	CAL		/CODE+DEL+MODE+UNIT	/ONCE-ONLY CODE
BLOCK,	WAITE		/BLOCK NUMBER
FN,	DFLAG		/RW+PAGES+FIELD		/WAIT FOR DONE
MSK,	DCA I	MADDR	/77 IF 12-BIT MODE	/SET NO ERRORS
			/177 IF 8-BIT MODE
LOOP,	CAL
	RECEIV		/GET A MESSAGE
MADDR,	ERRFLG		/ADDRESS OF MESSAGE LEFT HERE
	DCA MSGFLD	/CDF TO FIELD OF MESSAGE LEFT IN AC
	STA
	TAD MADDR
	DCA MADDR	/RESET MADDR TO POINT BACK TO PARAM BLOCK -1
	JMS GET		/GET UNIT AND SPECIAL FUNCTIONS BIT
	DCA FNCTN
	JMS GET		/GET FUNCTION WORD
	DCA FN
	JMS GET		/GET BUFFER ADDRESS
	DCA BUFFER
	JMS GET		/GET BLOCK NUMBER
	DCA BLOCK
	CDF CUR
	TAD BLOCK
	CLL RTL
	DCA REC		/FIRST LOGICAL RECORD IS 4* OS/8 RECORD
	IFNZRO	HGHFLD	<
	TAD FN
	AND (70		/ISOLATE FIELD OF BUFFER
	>
	TAD (CDF
	DCA BUFCDF	/STORE AWAY IN-LINE
	TAD FN
	RAL		/MOVE # OF PAGES INTO AC 0-4
	AND L7600	/TURN PAGE COUNT INTO WORD COUNT
	CIA
	DCA WC		/STORE NEGATIVE OF WORD COUNT
	TAD FNCTN
	AND (100
	TAD (100-1
	DCA MSK
	TAD FNCTN
	SMA CLA		/LOOK AT CODE BIT
	JMP NOSPEC	/NOTHING SPECIAL
	TAD MSK
	CMA
	DCA WC		/STORE REVISED NEGATIVE OF WORD COUNT
	TAD BLOCK
	AND L37
	DCA I (SECTOR
	TAD BLOCK
	JMS I	(CVTRK
NOSPEC,	TAD FN		/GET RW BIT
	SPA CLA		/IF IT'S A READ, WE MUST PRE-READ
	JMP STWRIT	/OTHERWISE, START FILLING RX01 BUFFER
WORDLP,	TAD WC		/GET WORD COUNT
	AND MSK		/CHECK FOR MULTIPLE OF 64 (OR 128) WORDS
	SZA CLA		/AT SUCH A BOUNDARY, WE WANT TO DO I/O
	JMP BUFCDF	/OTHERWISE, JUST TRANSFER BETWEEN BUFFERS
	JMS I (DISKIO	/READ OR WRITE A BUFFER
	ISZ REC		/BUMP RECORD NUMBER
	TAD I (STATE
	DCA STATUS
STWRIT,	TAD FN
	RAL		/RW BIT TO LINK
	CLA CML RTL	/AC=2 IF READ, 0 IF WRITE
	JMS LDCMD	/AC=0 --> FILL SECTOR BUFFER
			/AC=2 --> EMPTY SECTOR BUFFER
BUFCDF,	HLT		/FIRST TIME THROUGH, DO CDF TO FIELD OF BUFFER
	TAD	FN	/GET RW BIT
	SPA CLA		/FIX 8-BIT READ BUG
	TAD I BUFFER	/GET CONTENTS OF BUFFER IN CASE WRITING
	JMS I (TRANS	/TRANSFER A WORD BETWEEN CORE AND RX01 BUFFER
	DCA I BUFFER	/STORE CONTENTS OF BUFFER IN CASE READING
	CDF CUR
	ISZ BUFFER	/BUMP BUFFER POINTER
L37,	37		/IN CASE IT SKIPS
	ISZ WC		/BUMP WORD COUNT
	JMP WORDLP	/REITERATE
	TAD FN		/LOOK AT RW BIT AGAIN
	SPA CLA
	JMS I (DISKIO	/IF WRITING, DUMP LAST RECORD.
	TAD FNCTN
	CMA RAL
	SZL SPA CLA	/RETURN STATUS IF CODE=1 AND DEL=1
RETRN,	DCA STATUS	/OTHERWISE ZERO STATUS
	JMS GET
L7600,	7600		/CLA
	TAD STATUS
	DCA I MADDR
	TAD MSGFLD
	DCA EFCDF
	TAD MADDR
	TAD (-7		/POINT TO MESSAGE EVENT FLAG
	CAL
	POST		/POST EVENT FLAG POINTED TO BY AC
EFCDF,	HLT		/FIELD OF EVENT FLAG
	JMP LOOP	/GET ANOTHER MESSAGE

GET,	0		/CHANGE DF TO FIELD OF MSG; GET NEXT ENTRY
MSGFLD,	HLT
	ISZ MADDR
	TAD I MADDR
	JMP I GET
LDCMD,	0		/WAIT FOR DONE FLAG AND LOAD COMMAND REGISTER
	TAD	MSK	/ADD IN MODE BIT
	TAD	(-77	/(MSK IS MODBIT+77)
	DCA CMD		/SAVE COMMAND
	JMS I (DWAIT	/WAIT FOR DONE FLAG
	TAD CMD
	IFZERO HGHFLD <IOF>
	IFNZRO HGHFLD <CIF CUR>
	LCD		/LOAD NEW COMMAND REGISTER CONTENTS
	ISZ DFLAG
	IFZERO HGHFLD <ION>
	JMP I LDCMD
	PAGE
Q,
TRANS,	0
	STR
	JMP .-1
	XDR
	JMP I TRANS

/NOTE: WHEN READING IN 8-BIT MODE,
/DATA IS OR'ED INTO AC 4-11 INSTEAD OF JAM TRANSFERRED IN.
INTRPT,	ZBLOCK 2	/RTS OVERHEAD
	SDN		/SKIP ON DONE AND CLEAR FLAG
	JMP I INTRPT	/IT AINT THIS FLAG
	CDF CUR
	XDR		/READ STATUS
	AND (377	/12-BIT MODE LEAVES GARBAGE IN AC 0-3
	DCA STATE
	TAD (4
	SER
	AND STATE
	DCA ERRFLG	/SET TO 0 IF NO ERROR AND NO INIT DONE
	TAD PDFLAG
	CIF 0
	POSTDS

ERRFLG,	0		/0 IF NO ERROR AND NO INIT DONE

DISKIO,	0		/READ OR WRITE RECORD
	TAD (-10
	DCA TRYCNT	/RETRY 8 TIMES
TRYAGN,	TAD I (FN
	RAL		/RW BIT TO LINK
	CLA CML RTL
	TAD (4
	DCA FNBITS
/	COULD HAVE DONE ABOVE VIA CLA IAC;CML RTL IF NEED ROOM
	TAD I (FNCTN
	CMA RAL
	SMA SNL CLA
	TAD I (FN
	SMA CLA
	JMP T2
	TAD (14		/DOING A WRITE IN SPECIAL MODE WITH DEL SET
	DCA FNBITS
T2,	TAD I (FNCTN
	RAR		/UNIT TO LINK
	CLA RTL
	RTL
	RAL		/UNIT TO BIT 7
	TAD FNBITS
	JMS I (LDCMD
	TAD I (FNCTN
	SPA CLA
	JMP SPECL	/ALREADY HAVE SECTOR AND TRACK

/ROUTINE TO DIVIDE N BY 13 GIVING QUOTIENT Q AND REMAINDER IN N.
	TAD I (REC
	DCA SECTOR
	TAD (200^15
	DCA D
	DCA Q
DLOOP,	TAD D
	CLL CIA
	TAD SECTOR
	SNL
	SKP CLA
	DCA SECTOR
	TAD Q
	RAL
	DCA Q
	TAD D
	CLL RAR
	DCA D
	SNL		/13 EVENTUALLY TRIES TO SHIFT INTO LINK
	JMP DLOOP
/	FINAL REMAINDER IS NOW IN N
	TAD Q
	CLL RAR		/QUOTIENT IS NEW TRACK-1
	IAC		/SINCE WE'RE OFFSETTING EVERYTHING UP ONE TRACK
	DCA TRACK	/SO THAT WE DON'T TOUCH PHYSICAL TRACK 0
	TAD SECTOR	/LINK IS NOW TO BE ADDED TO 2^N
	RAL
	IAC		/SECTORS BEGIN COUNTING AT 1
	DCA SECTOR
/DONE COULD COME UP DURING FOLLOWING CODE
SPECL,	TAD SECTOR
	JMS TRANS
	CLA
	TAD TRACK
	JMS TRANS
	CLA		/THIS CLA CAN BE REMOVED IF NEED ROOM
	JMS DWAIT	/WAIT FOR DONE
	JMP I DISKIO

D,
DWAIT,	0
	CAL		/AC MAY BE NON-0
	WAITE
PDFLAG,	DFLAG	/WAIT FOR DONE
	TAD ERRFLG	/ERROR OR INIT?
	SNA CLA
	JMP I DWAIT	/NO, RETURN
	IFZERO HGHFLD <IOF>	/YES
	IFNZRO HGHFLD <CIF CUR>
	INIT
	ISZ I (DFLAG
	CLA IAC
	INTR		/INIT DISABLES INTERRUPTS
	IFZERO HGHFLD <ION>
	CAL
	WAITE
	DFLAG
	DCA ERRFLG	/THROW AWAY EXPECTED ERROR
	ISZ TRYCNT
	JMP TRYAGN
	STL CLA RAR	/JAM ON AC BIT 0 MEANING 'HARD ERROR'
	TAD STATE
	JMP I (RETRN

CVTRK,	0
	RTR
	RTR
	AND	(377
	CLL RAR
	DCA	TRACK
	JMP I	CVTRK
TRYCNT,	-10		/NUMBER OF RETRIES
TRACK,	0
SECTOR,	0
FNBITS,	0
STATE,	0
	$