/20 RK8E DRIVER FOR RTS8 V3 / / EDITED 11/26/75 BY RL - INSERTED MISSING CIF / / #10 V2B CONVERSION TO MACREL / #11 .TASK MACRO, CDF,CIF / #12 PUT IN KT8A / #13 NAME TO RK8E / #15 BRING BACK LITERALS, LEVEL=0, CUR OUT / #16 TAKE OUT PAGE STATEMENT FROM FSECT / #17 REMOVE GENERATED LITERALS / #18 JR 27-SEP-78 ADD RL01 INTERLOCK / #19 RTFLD TO RTS8 / #20 MODIFY KT8A INIT, 1000 MODE / VERS=20. / / / / / / / / / / /COPYRIGHT (C) 1974,1975,1976,1977,1978,1979 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 / DON'T NEED TASK, INIWT EQUATES DSKP= 6741 DCLR= 6742 DLAG= 6743 DLCA= 6744 DRST= 6745 DLDC= 6746 DMAN= 6747 .RSECT RK8ET, LEVEL=0 .TASK RK8E IFNZRO KT8A <.EXTERNAL KTTAB> CR, START, CAL DONEFG, SKPINS TRYCT, INTRPT /USED TWICE: ERRORS, THEN IS IT OK IFNZRO KT8A < PAGCNT, JMS I ADDR /GO TO KTINIT BREAKR, 0 /MUST FOLLOW CALL TO KTINIT! > IFZERO KT8A < PAGCNT, 0 > RTRYFG, 0 NEWCR, 0 RUNNR, 0 /COPY OF PARAM POINTER REC, 0 GET, 0 /BEGINNING OF GET ROUTINE FLD, JMP LOOP /GO GET FIRST REQUEST ISZ RUNNR /MOVE TO NEXT ITEM TAD I RUNNR /FETCH IT JMP I GET LOOP, IFDEF RL01 < AC0002 /SIGNAL RL01 TASK IF COMPLETE JMS I (LOCK /THIS IS TO SOLVE RL01-RK8E DMA HARDWARE BUG > CAL L1, RECEIV /GET A MESSAGE IFZERO KT8A < ADDR, 0 > IFNZRO KT8A < ADDR, KTINIT > DCA FLD IFDEF RL01 < JMS I (LOCK /LOCK RL01 TASK IF WORK TO DO > AC7775 DCA TRYCT /TRY 3 TIMES INIT, STA /MAKE A COPY OF PARAM POINTER TAD ADDR /ORIGINAL DCA RUNNR /WORKING COPY TAD L5 /IN CASE SPECIAL, POINTS TO STATUS TAD RUNNR DCA CR /CR MUCH LATER GETS FILLED WITH ACTUAL STUFF JMS GET CLL CML RAL /REAL UNIT BITS IN CORRECT POSITION; 1 SETS EV! DCA DONEFG /SAVE SPECL, BSIDE, UNIT; ALL SHIFTED ONE, FOR LATER IFZERO KT8A IFNZRO KT8A AND DONEFG DCA NEWCR /KEEPING JUST THE UNIT BITS JMS GET DCA PAGCNT /SAVE WHOLE WORD JMS GET DLCA /PUT STARTING TRANSFER ADDRESS IN HARDWARE DCA I CR /CLEAR STATUS WORD, (DUMMY TAD LATER!) TAD DONEFG /BRING BACK UNIT, BSIDE, SPECIAL AND QL7010 /KEEP SPECIAL AT 2000, BSIDE AT 10 CLL RAL /PUT SPECIAL IN AC0, CLEAR LINK SPA /SKIP IF NOT SPECIAL ISZ CR /POINT POINTER TO EXTRA WORD SZA SMA CLA /"UNIT" = DISK*2+HALF - CHECK WHICH HALF TAD (6260 /SECOND HALF - ADD BLOCK NUMBER OFFSET JMS GET /TO BLOCK NUMBER DCA REC /SAVE LOW ORDER TAD PAGCNT AND (4070 /FIELD BITS AND READ/WRITE BIT TAD NEWCR /BRING IN THE TWO UNIIT BITS SZL IAC /ADD HIGH ORDER BLOCK NUMBER TAD (400 /ADD INTERRUPT ENABLE BIT TAD I CR /NASTY!! REGULAR, ADD IN 0, SPECIAL ADD IN 13TH ADDR BIT CDF .FLD /FURTHER PROCESSING TO OUR FIELD DCA CR /STORE AS SKELETON COMMAND REGISTER IFZERO KT8A < /DID NON-KT SYSTEM GO TO HIGH CORE?? CLA IAC /DEFAULT ERROR CODE FOR STATUS DCA STATUS /ERROR CODE, IF NEEDED, STATUS REG. SAYS THIS ERROR TAD PAGCNT /FIELD BITS HERE AND (6 /CHECK ONLY HIGH ONES SZA CLA /SKIP IF NOT ACCESSED JMP OOPS /HIGH CORE BITS ACCESSED, ERROR OUT > IFNZRO KT8A < /SET UP BANK FOR TRANSFER TAD PAGCNT /GET BACK BANK BITS CLL RTR /GET CDEBA0, MAKE IT 0000AB AND L1 /KEEP B IN AC, A IN LINK SZL TAD L2 /HOP A OVER B TAD BREAKR /BREAK MAP POINTER 6170 /LOAD BREAK MAP FOR OUR ENTRY > TAD PAGCNT AND (3700 /ISOLATE PAGE COUNT FIELD SNA AC4000 /ALLOW FULL FIELD TRANSFERS DCA PAGCNT TAD PAGCNT AND RK7600 /IF ENTIRE TRANSFER IS ONE PAGE, SNA CLA TAD PAGCNT /SET "ONE-PAGE TRANSFER" BIT IN COMMAND REG (100) IOF /INTERRUPTS OFF WHILE LOADING REGISTERS! JMS RKSETP /START TRANSFER AND SET UP NEXT ONE TAD (FSTINT DCA I (IDISP /INITIALIZE INTERRUPT DISPATCH CAL L2, WAITE PDONFG, DONEFG /WAIT FOR COMPLETION ISZ RTRYFG /DID EVENT FLAG SIGNIFY ERROR OR COMPLETION? JMP INIT /ERROR OR PWR FAIL - RETRY ENTIRE OPERATION OOPS, JMS GET /THIS JUST SETS THE DF AND ADDR P7600, 7600 TAD STATUS DCA I RUNNR TAD FLD DCA PFLD AC7775 /POINT BACK TO EVENT FLAG ADDRESS TAD ADDR CAL L5, POST STATUS, PFLD, HLT JMP LOOP /GET ANOTHER MESSAGE / ROUTINE TO SET UP A TRANSFER / / CALL WITH INTERRUPTS OFF! / RKSETP, 0 /ROUTINE TO START UP A TRANSFER TAD CR /AND PRECOMPUTE THE NEXT ONE. DLDC /LOAD THE RK8E COMMAND REGISTER TAD REC DLAG /LOAD BLOCK NUMBER AND GO TAD PAGCNT TAD RK7600 /WE PRECOMPUTE THE NEXT TRANSFER BECAUSE THE DCA PAGCNT /RK8E HAS A VERY NARROW WINDOW IN WHICH ISZ REC /TO INITIATE THAT TRANSFER ONCE THE FLAG POPS UP. SKP ISZ CR /HIGH-ORDER BLOCK NUMBER IN COMMAND REGISTER TAD REC AND (37 /IF WE ARE NOT GOING TO A NEW TRACK, CIA STL /WE DON'T HAVE TO CHECK HEADERS NEXT OPERATION. RK7600, 7600 TAD PAGCNT /IF NEXT TRANSFER IS HALF BLOCK, AND RK7600 /WE MUST SET THE HALF-BLOCK COMMAND BIT. SNA CLA TAD (1000 RTR /LINK HAS "DON'T CHECK HEADER" BIT QL7010, RAR DCA NEWCR /STORE SPECIAL COMMAND REGISTER BITS FOR NEXT TIME. JMP I RKSETP PAGE .FSECT RK8EF, LEVEL=0 FIELD RK8ET / /INTERRUPT SKIP CHAIN ENTRY / INTRPT, 0;0 /SKIP CHAINING GOES HERE DSKP JMP I INTRPT CDF CIF .FLD JMP I .+1 IDISP, IGNORE /IGNORE INITIAL INTERRUPTS CIF RTS8 /IDISP IS A COROUTINE WITH POSTDS /THE RTS-8 INTERRUPT SYSTEM TRYAGN, AND (401 /CHECK TO SEE IF WE SNA CLA /HAVE TO RECALIBRATE JMP NRECAL /NO DCLR /CLEAR DISK STATUS AC0002 /MYSTIC SEQUENCE OF INSTRUCTIONS WHICH DCLR /RECALIBRATES A DRIVE JMS IDISP /RECALIBRATE GENERATES A DONE FLAG ALMOST IMMEDIATELY, TAD I (CR /AND A SEEK DONE SIGNAL WHEN IT IS FINISHED AND (6 /THEREFORE WE MUST ENABLE THE SEEK DONE SIGNAL TAD (600 /TO SET THE DONE FLAG AND CAUSE AN INTERRUPT. DLDC /NO SOONER SAID THAN DONE! JMS IDISP /WAIT FOR THE FINAL FLAG DRST CLL RAL /IF THE RECALIBRATE GENERATED AN ERR0R, SZA CLA JMP RKERR /BOY ARE YOU IN TROUBLE! NRECAL, DCLR /CLEAR STATUS REGISTER SETEF, DCA I (RTRYFG /SET FLAG TO 0 OR -1 TAD (DONEFG JMS IDISP /DISMISS AND POST EVENT FLAG HALT, HLT /CANNOT GET HERE! RKERR, DRST /READ STATUS REGISTER ISZ I (TRYCT /HOW MANY TIMES HAVE WE BEEN THROUGH HERE? JMP TRYAGN /ROOM FOR ONE MORE. RKOVER, DCA I (STATUS /SET STATUS TO 0 OR STSTUS REGISTER DCLR /CLEAR NASTY FLAGS (IF ANY) STA /INDICATE FINAL RETURN JMP SETEF /AND ACTIVATE TASK FSTINT, DRST /READ STATUS REGISTER CLL RAL /4000 MEANS NO ERRORS, 0 IS "IMPOSSIBLE" HERE SZA CLA /ERROR? JMP RKERR /ERROR ROUTINE RKNEXT, TAD I (PAGCNT SPA SNA CLA /CHECK FOR LAST TRANSFER JMP RKOVER TAD I (NEWCR /GET PRECOMPUTED COMMAND REGISTER CHANGES JMS I (RKSETP /START NEXT TRANSFER AND SET UP THE ONE AFTER THAT CIF RTS8 POSTDS /EXIT INTERRUPT ROUTINE - IDISP STILL EQUALS "FSTINT" IGNORE, DCLR CIF RTS8 /**RL** SET I.F. FOR JUMP ** POSTDS /CLEAR FLAG AND DISMISS IFDEF RL01 < LOCK, 0 /RL01 INTERLOCK ROUTINE (CODE WOULDN'T FIT INLINE ABOVE) TAD (BLKARG /ENTRY AC=2 TO UNLOCK, 0 TO LOCK DCA .+3 TAD (RL01 CAL KTT, 0 USERWT /USER WAIT BIT WILL DO HERE JMP I LOCK > IFNZRO KT8A < /INIT BREAK MAP IFNDEF RL01 < KTT, 0 > KTINIT, 0 /INIT THE KT8A REINIT, AC4000 DMAN RAR DMAN RAL BSW /KT8A MACHINES MUST HAVE BYTE SWAP CDF CIF .FLD /HOLD OUT INTERRUPTS DMAN /CAUSES A BREAK CLA IAC /NOW CLEAR DEVICE 6742 6172 /NOW READ THE BREAK DCA I KTINIT /SAVE BREAK POINTER TAD I KTINIT /DID WE GET SOMEONE ELSE'S BREAK CLL RTR TAD (KTTAB /ADDR OF TABLE IN EXEC DCA KTT /STRAY TEMPORARY CDF RTS8 /IN USE MAP IN RTS8 FIELD TAD I KTT /THIS ONE OWNED SMA CLA /SKIP IF NOT JMP REINIT /OOPS, GOT AN OWNED ONE, TRY AGAIN DCA I KTT /CLEAR TO SHOW WE OWN IT JMP I KTINIT /GO BACK TO REGULAR PROCESSING > $$