/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 /MAY BE EDITED TO 'RX8B', 'RX8C', OR 'RX8D' . /OR MAY INCLUDE AN RXCF INIWT=0 IFNDEF RXFLD IFNDEF RXLOC CUR= RXFLD LOC=RXLOC /LOAD ADDRESS IFNDEF RXDVCD /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 IFNZRO HGHFLD LCD /LOAD NEW COMMAND REGISTER CONTENTS ISZ DFLAG IFZERO HGHFLD 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 /YES IFNZRO HGHFLD INIT ISZ I (DFLAG CLA IAC INTR /INIT DISABLES INTERRUPTS IFZERO HGHFLD 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 $