/6 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 / / V2B / / EDIT 01 SCR 11/77 FIX POWER FAIL, ERROR RECOVERY [01] / / 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 /[01] AC0=1 IF ERROR; LOW 8 BITS DEVICE STATUS IFDEF PWRF < /[01] FNCTN, CAL /CODE+DEL+MODE+UNIT /ONCE-ONLY CODE ZOT, SENDW /[01] DERAIL MESSAGE FOR POWERFAIL FN, PWRF /[01] RW+PAGES+FIELD MSK, TRACK /[01] TRACK SERVES AS MSG HEADER > /[01] IFNDEF PWRF < /[01] FNCTN, NOP /[01] ZOT, NOP /[01] A COPY OF ORIGINAL MADDR POINTER FN, NOP /[01] MSK, NOP /[01] 77 IF 12 BIT; 177 IF 8 BIT > /[01] LOOP, CAL RECEIV /GET A MESSAGE MADDR, 0 /[01] ADDR OF MESSAGE HERE GOTONE, DCA MSGFLD /[01] CDF TO FIELD OF MESSAGE LEFT IN AC REDO, STA /[01] MAKE WORKING COPY OF MESSAGE POINTER TAD MADDR / DCA ZOT /[01] 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 RTR /[01] RTR /[01] AND (377 /[01] CLL RAR /[01] DCA I (TRACK /[01] STORE TRACK VALUE FOR I/O ROUTINE NOSPEC, CDF CUR WORDLP, TAD WC TAD (77 BSW DCA LOOPC TAD FN /RW? RAL CLA TAD BUFFER DCA BUFFP TAD BUFCDF JMP NXTPAG L37, 37 /IN CASE IT SKIPS BUFCDF, 0 ZOTT, TAD FNCTN CMA RAL SZL SPA CLA /RETURN STATUS IF CODE=1 AND DEL=1 DCA STATUS /[01] OTHERWISE ZERO STATUS RETRN, JMS GET /[01] MOVE RETRN LABEL L7600, 7600 /CLA TAD STATUS DCA I ZOT /[01] USE RUNNING ADDR POINTER TAD MSGFLD DCA EFCDF AC7775 /[01] USE ORIGINAL COPY OF POINTER TAD MADDR /[01] CAL POST /POST EVENT FLAG POINTED TO BY AC EFCDF, HLT /FIELD OF EVENT FLAG JMP LOOP /GET ANOTHER MESSAGE BLOCK, 0 /[01] CAN BE SAME LOC AS GET GET, 0 /CHANGE DF TO FIELD OF MSG; GET NEXT ENTRY MSGFLD, HLT ISZ ZOT /[01] USE COPY OF MADDR, NOT ORIGNAL TAD I ZOT /[01] JMP I GET LDCMD, 0 /WAIT FOR DONE FLAG AND LOAD COMMAND REGISTER /[01] CHANGE BIT HANDLING FOR AN INSTRUCTION DCA CMD /[01] SAVE COMMAND; CMD COULD BE SAME AS GET JMS I (DWAIT /WAIT FOR DONE FLAG JMP RETRN /[01] ERROR ON NON-SKIP; CONTROLLER IN TROUBLE! TAD MSK /[01] PUT IN 100 BIT FROM MSK AND (100 /[01] TAD CMD ISZ DFLAG /[01] PLACE THIS BEFORE LCD! LCD /LOAD NEW COMMAND REGISTER CONTENTS 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 SER /[01] SKIP IF ERROR SKP /[01] SKIP IF NO ERROR TAD (4000 /[01] ON ERROR SET TOP AC BIT DCA I (STATUS /[01] TAD PDFLAG CIF LOWFLD POSTDS / /[01] ERRFLG GONE DISKIO, 0 /READ OR WRITE RECORD AC7775 /[01] THREE RETRIES PLENTY DCA TRYCNT /RETRY 3 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 SKP /[01] ERROR, CHECK RETRY COUNT JMP I DISKIO ISZ TRYCNT /[01] JMP TRYAGN /[01] I/O OPERATION AGAIN JMP I (RETRN /[01] ERROR STATUS RETURNED TO USER D, DWAIT, 0 /[01] REGULAR RETURN ERROR; SKIP NO ERROR CAL /AC MAY BE NON-0 WAITE PDFLAG, DFLAG /WAIT FOR DONE TAD I (STATUS /[01] WAS THERE AN ERROR SMA CLA /[01] ERROR ONLY IF MINUS BIT SET ISZ DWAIT /[01] SKIP RETURN ON NO ERROR JMP I DWAIT / RETURN TRYCNT, -3 /[01] NUMBER OF RETRIES TRACK, 0 /[01] TRACK MUST BE PWFSUB-3! SECTOR, 0 /[01] FNBITS, 0 / /[01] STATE NO LONGER NECESSARY / IFDEF PWRF < /[01] CHECK=-LOOP-1 /[01] DID WE DERAIL FROM RECEIVE? PWFSUB, . /[01] 1ST TIME: PART OF MSG TO PWRF CLA /[01] LINK AND AC DON'T MATTER DCA I PDFLAG /[01] HARDWARE FLAG CLEAR; CLEAR OUR FLAG CLA IAC /[01] TURN INTERRUPTS BACK ON AGAIN INTR /[01] DONE FLAG ALREADY CLEAR; NO IMMEDIATE INTERRUPT TAD PWFSUB /[01] WHERE DID WE DERAIL FROM TAD (CHECK /[01] FROM RECEIVE? SZA CLA /[01] SKIP IF YES JMP I (REDO /[01] NO, REDO AN EXISTING OPERATION JMP I PWFSUB /[01] GO ISSUE RECEIVE > /[01] PAGE *5400 /*** TEMPORARY NXTPAG, SZL JMP WRITLP DCA RDCDF READLP, JMS DISKIO ISZ REC TAD (7740 DCA ICOUNT TAD FN RAL CLA CML RTL JMS LDCMD RDCDF, 0 RDLOOP, STR JMP .-1 XDR DCA I BUFFP ISZ BUFFP STR JMP .-1 XDR DCA I BUFFP ISZ BUFFP NOP ISZ ICOUNT JMP RDLOOP CDF CUR ISZ LOOPC JMP READLP JMP ZOTT WRITLP, DCA WRTCDF OWLOOP, TAD (7740 DCA ICOUNT TAD FN RAL CLA CML RTL JMS LDCMD WRTCDF, 0 TAD I BUFFP ISZ BUFFP STR JMP .-1 XDR CLA TAD I BUFFP ISZ BUFFP STR JMP .-1 XDR CLA ISZ ICOUNT JMP WRTCDF+1 CDF CUR JMS DISKIO ISZ REC ISZ LOOPC JMP OWLOOP JMP ZOTT ICOUNT, 0 LOOPC, 0 BUFFP, 0 $