File: RX.TK of Disk: Disks/MyPDP/m8-blue-rka1-rkb1
(Source file text)
/RX.TK 15-MAR-80 /THIS IS THE NEW FLOPPY DISK HANDLER FOR MULTI8. /IT HANDLES RX01, RX02 AND RX03 DRIVES /IN SINGLE AND DOUBLE DENSITY MODES. /THE MAIN LOGIC IS FROM THE DEC OS8 HANDLER /TAKEN FROM THE OS8 V3X PACKAGE. IFDEF RX01 <RXDEVC=RX01> IFDEF RX02 <RXDEVC=RX02> LCD=RXDEVC+6001 XDR=RXDEVC+6002 STR=RXDEVC+6003 SER=RXDEVC+6004 SDN=RXDEVC+6005 INTR=RXDEVC+6006 INIT=RXDEVC+6007 /TASK HEADER: RXDTV, "R^100+"X&3777 /NAME IS RX 400 /A TWO PAGE TASK /PAGE HEADER: XTRYCN, TRYCNT XBLOCK, BLOCK XSECTR, SECTR XRFUNC, RFUNC XCOUNT, COUNT XTRAN, TRANSF XSLOT, RXSLOT XCLOSE, RXCLOSE XWAIT, RXWAIT UNIT, 0 /TASK BODY RX, SNA /CLOSE CALL ? JMP I XCLOSE /YES, QUIT DCA RXDTV /NO, STORE POINTER TO PARAMETERS TAD I ZMYCDF /GET CDF TO PARAMETER FIELD DCA RXCDF /AND SETUP FOR PARAMETER FETCHING AC0001 AND I RXDTV /GET FUNCTION WORD SNA CLA /IF UNIT 1 SKIP RXA0, JMS RXINIT /COMMON ENTRY ROUTINE 0402 /UNIT 0, 402 FOR CONVENIENCE NOP /MINUS SAYS WE STILL HAVE TO INIT RXA1, JMS RXINIT C422, 0422 /20 SAYS UNIT 1, 402 FOR CONVENIENCE -1 RXINIT, 0 CDTOIF ACM3 /CLEAR AC DCA I XTRYCN /SET RETRY COUNTER FOR THREE TIMES JMS MONITOR RESERV RETURN CONTINUE DCA I XSLOT /THE SLOT THE USER IS WAITING FOR TAD I RXINIT /GET UNIT #*20+402 DCA UNIT /SAVE IT ISZ RXINIT TAD I RXINIT SMA CLA /DO WE KNOW THIS FLOPPY ? JMP DENSOK /YES, NO NEED TO TEST DENSITY RXRSTR, JMS I XWAIT /CLEAR LAST EVENT IF ANY AND AC TAD UNIT /PICK UP UNIT , DOUBLE DENSITY+2 TAD C10 /MAKE READ STATUS ON PROPER UNIT LCD /IT WILL CHECK THE DENSITY JMS I XWAIT /WAIT FOR DONE (SECTOR TIME) XDR /GET STATUS WORD AND C33 /KEEP DENSITY ERROR, RX02, QUAD TAD C10 /SNGL=10, SNGL/DBL=40, DBL=20, QUAD=22 AND C422 /SNGL=0, SNGL/DBL=0, DBL=20, QUAD=22 DCA I RXINIT /TYPE CODE FOR EACH DRIVE SER C10, 10 /IGNORE ERRORS WE PROBABLY GET TAD (416 LCD /RESET FLAG DENSOK, TAD I RXINIT /GET TYPE CODE AGAIN SZA CLA /SKIP IF SNGL TAD M100 TAD M100 /SNGL=-100, DBL=-200 DCA I XCOUNT /PLACE FOR LOOP CONTROL TAD I RXINIT CLL RTR /PUT QUAD BIT IN LINK SNA CLA /SKIP IF DOUBLE OR QUAD TAD SNGLMD /SNGL: 6044-4110 TAD DBLQUA /DBL&QUAD=4110 SNL /WAS IT QUAD? STL RAR /NO, SNGL=7022, DBL=6044 MQL /YES, QUAD=4110 (STORE IN MQ A WHILE) TAD I XCOUNT /WAS IT DOUBLE DENSITY? CLL CMA RTL /SNGL=375, DBL=775 AND UNIT /MAKES 400*DBL + 20*UNIT DCA I XRFUNC /TO FUNCTION WORD TAD RXDTV /GET POINTER TO USER PARAMETERS RXCDF, HLT /AND SET FIELD JMP I XTRAN CALC, 0000 /SETUP TRACK, SECTOR FROM LOG. RECORD TAD C7700 MQL /CLEAR DIVIDE QUOTIENT, SET COUNTER MASK TAD I RXINIT /IS IT RX03? RTR SNL CLA JMP SINGLE /NO, ONLY 1 HEAD TAD I XBLOCK /WHICH LOGICAL RECORD DO WE WANT? TAD DBLQUA /IS IT ON FIRST SIDE? SZL CLA JMP SINGLE /NO, AS IF 1 HEAD TAD I XRFUNC /GET FUNCTION BACK AND C422 /KEEP DBL, UNIT ,R/W TAD C7000 /FORCE HEAD ON (USE ONLY 1000 OF 7000) DCA I XRFUNC TAD DBLQUA /AND DECREASE LOGICAL RECORD SINGLE, TAD I XBLOCK /MAIN DIVIDE LOOP DCA RXREMD /SET INITIAL DIVIDEND TAD RX1400 /FALL IN LOOP WITH INITIAL DIVISOR/2 DCA RXDIVS RXDLUP, TAD RXDIVS /MAIN DIVIDE LOOP STL RAR /NEXT DIVISOR DCA RXDIVS TAD RXDIVS /LINK IS NOW = 0 TAD RXREMD SZL /OVERFLOW DCA RXREMD /YES UPDATE REMAINDER CLA MQA /GET QUOTIENT WITH COUNT MASK RAL /SHIFT IN DIVIDE BIT MQL /SHIFT BUSY BIT OUT AND RELOAD SZL /SKIP IF DONE JMP RXDLUP TAD I RXINIT /WAS IT DBL DENSITY? SZA CLA TAD RXREMD /YES, INTERLEAVE 3 TAD RXREMD TAD RXREMD /NO, INTERLEAVE 2 TAD RXDIVS /SHIFT AT -26, SO WE CAN SMA /REDUCE AGAIN MODULO TRACK JMP .-2 TAD C33 /FIRST TRACK IS 1 DCA I XSECTR /THAT'S IT (ALMOST) RAL /IF L=0, SECOND INTERLEAVE TAD I RXINIT /=0 IF SNGL SNA CLA /WAS IT BOTH? ISZ I XSECTR /YES, MAKE 2,4,6,8,.. SERIES MQA /GET TRACK IN AC (TRACK-1 THAT IS) JMP I CALC /CONSTANTS: RX1400, 1400 C33, 33 SNGLMD, 6044-4110 DBLQUA, 4110 RXREMD, 0 RXDIVS, 0 PAGE /PAGE HEADER: XRSTR, RXRSTR XCALC, CALC TEMP2, 0 TRANSF, /MAIN TRANSFER ROUTINE DCA RXARGS /POINTER TO TV MQA DCA LENGTH /KEEP FOR ERROR AC4000 TAD I RXARGS /CARRY R/W TO LINK AND C70 TAD C6201 DCA CDFBUF /PLACE CDF BUFFER IN I/O LOOP CML RTL TAD RFUNC /ADD READ=2 TO FUNCTION DCA RFUNC TAD I RXARGS /MAKE LOOP CONTROL COUNT RAL AND C7600 CIA DCA RXWC /0 FOR WHOLE FIELD ISZ RXARGS TAD I RXARGS DCA RXCA /SET BUFFER ADDRESS ISZ RXARGS TAD C100 /NOW CONVERT BLOCK# TO LOG. SECTOR TAD COUNT /WAS IT SINGLE DENSITY? SMA CLA TAD I RXARGS /YES, MULTIPLY BY 4 SMA /NEG. BLOCK #: FORCE LINK ON TAD I RXARGS /IF DOUBLE MULTIPLY BY 2 CLL RAL DCA BLOCK /SAVE LOGICAL SECTOR SZL /LEGAL BLOCK #? /NO, SET STATUS TO LENGTH FOR PIP JMP RXTPIP /TRY 3 TIMES IF FLOPPIES HAVE CHANGED CDTOIF JMS I XCALC /DIVIDE A FIRST TIME DCA RXTRCK /TRACK FROM AC TAD RFUNC RTR /IS IT READ? SZL CLA JMP READ /YES, TO MIDDLE OF LOOP TOP, TAD RFUNC /GET SILO TO LOAD-UNLOAD JMS RXCOMM TAD COUNT DCA RXWAIT CDFBUF, HLT SILOOP, TAD I RXCA /FOR WRITE FETCH WORD STR JMP .-1 /WAIT FOR INTERFACE READY XDR /TO OR FROM AC DCA I RXCA /PLACE FOR READ, REPLACE FOR WRITE ISZ RXCA SECTR, 0 ISZ RXWAIT /SILO FULL/EMPTY? JMP SILOOP TAD COUNT CMA /ADD 77 (SNGL), 177 (DOUBLE) TAD RXWC SNA JMP RXDONE /DONE FOR READ DCA RXWC /REPLACE AND GO ON READ, AC0004 /TURN SILO- INTO READ/WRITE COMMAND TAD RFUNC JMS RXCOMM TAD SECTR /LOAD SECTOR # STR JMP .-1 XDR AC0001 /START AT TRACK 1! TAD RXTRCK STR JMP .-1 XDR CLA ISZ BLOCK /NEXT LOGICAL RECORD JMS I XCALC /CALC TRACK/SECTOR DCA RXTRCK /TRACK FROM AC TAD (16 /READ STATUS JMS RXCOMM /FOR WAIT ISZ RXWC /IS WRITE FINISHED? JMP TOP /NO RXDONE, AND (3777 /SAFETY FIRST, EMULATOR WILL RESTORE 4000 JMS MONITOR SIGNAL HALT CLEAR RELEASE RXSLOT, 0 RXCOMM, 0 DCA TEMP2 /KEEP COMMAND A WHILE JMS RXWAIT /SYNC WITH FLAG TAD TEMP2 LCD /LOAD COMMAND NOW SER /ANY ERRORS? JMP I RXCOMM /NO, OK RXEROR, ACM1 /YES, SIGNAL ERROR WITH -1 SKP RXTPIP, TAD LENGTH /COME HERE FOR ILLEGAL BLOCK (PIP) ISZ TRYCNT /MORE TRIES? JMP I XRSTR /YES, RESTART ALL JMP RXDONE /NO, FATAL ERROR RXCLOSE,ACM1 /-1 FOR NULL WAIT JMS MONITOR EXIT SWPOUT /SOMEBODY MAY CHANGE FLOPPIES, NOT REALLY /NECESSARY: SEE COMMENT ELSEWHERE RXWAIT, 0 CDTOIF CLA /CLEAR RANDOM AC INTR /INTERRUPT OFF FOR SDN TEST SDN /QUICK FLAG? SKP /NO, GO WAIT JMP I RXWAIT /YES, RETURN AC0001 INTR /ENABLE INTERRUPT FOR SECTOR WAIT TAD (-DGNTICK^12/10 SECONDS TIMOUT JMS MONITOR WAIT RXA CLA INTR /TURN INTERRUPT OFF JMP I RXWAIT RXCA, 0 TRYCNT, 0 LENGTH, 0 RXARGS, 0 BLOCK, 0 RXWC, 0 RFUNC, 0 COUNT, 0 RXTRCK, 0 PAGE $-$-$