File RX00.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/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 $



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search