/RX5A.PA NON-SYSTEM HANDLER FOR RX50 DRIVE PAIR A / / / / / / / / /COPYRIGHT (C) 1982, 1984 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. / / / / / / / / / / /DEFINITIONS OF RX8/E IOT'S RXVER= 0262 /VERSION = B2 NOCHK= 0 / 0 = NO CTRL C CHECK, 1 = CTRL C CHECK DEVCOD= 750 /DEVICECODE SEL= 6000+DEVCOD /SELECT DRIVE PAIR A OR B WITH AC<11> LCD= 6001+DEVCOD /LOAD COMMAND REGISTER XDR= 6002+DEVCOD /TRANSFER DATA REGISTER STR= 6003+DEVCOD /SKIP ON TRANSFER REQUEST FLAG, CLEAR FLAG SER= 6004+DEVCOD /SKIP ON ERROR FLAG, CLEAR FLAG SDN= 6005+DEVCOD /SKIP ON DONE FLAG, CLEAR FLAG INTR= 6006+DEVCOD /INTERRUPT ENABLE/DISABLE INIT= 6007+DEVCOD /INITIALIZE CONTROLLER AND RECALIBRATE DRIVES /NOTES ON THIS HANDLER: /THIS HANDLER READS AND WRITES THE DISK IN "12-BIT" MODE, IN WHICH / ONE RX50 SECTOR CONTAINS 256 WORDS. THIS INVOLVES SOME COMPLICATION /TO SUPPORT THE ABILITY OF OS/8 TO READ AND WRITE AN ODD NUMBER OF PAGES /( 256*N + 128 WORDS ). IN THE CASE OF AN ODD PAGE COUNT, THE HANDLER /FILLS THE SECOND HALF OF THE LAST SECTOR WITH THE LAST DATA WORD ON WRITE /AND DISCARDS THE SECOND HALF OF THE LAST SECTOR ON READING. /THE ENTIRE DISK CONTAINS 800 OS/8 BLOCKS. /ONLY 770 OF THE BLOCKS ARE USED. THE REMAINING 30 BLOCKS HAVE BEEN ALOCATED /TO DECMATE II FIRMWARE. /TO MAXIMIZE SPEED ON THE DEVICE, THE HANDLER READS AND WRITES /ON A TRACK WITH A TWO-WAY INTERLEAVE. /TRACK-SECTOR COMPUTATION IS DONE DURING I/O TO/FROM THE SILO AC4000=CLL CLA CML RAR /SET AC TO 4000 AC7776=CLL CLA CMA RAL /SET AC TO 7776 AC0002=CLL CLA CML RTL /SET AC TO 0002 AC7775=CLL CLA CMA RTL /SET AC TO 7775 /BUILD DATA *0 -2 /TWO ENTRY POINTS DEVICE RX5A /DEVICE GROUP NAME DEVICE RX50 /ENTRY POINT NAME 4300 /CODE FOR MULTI-RX RX50&177+4000 /ENTRY POINT OFFSET 0 0 DEVICE RX5A /DEVICE GROUP NAME DEVICE RX51 /ENTRY POINT NAME 4300 RX51&177+4000 /ENTRY POINT OFFSET 0 0 *200 / / / INIT CODE / POINT, HLT /ADDR OF SECOND PAGE AT INIT TIME UNIT, JMS I POINT /GO TO SECOND PAGE TO INIT / / LIST OF VECTORS TO SECOND PAGE / LQUO, QUO-. /LQUO MUST LEAD OFF LIST LRETRY, RETRY-. LREC, REC-. LREMD, REMD-. LFN, FN-. LDENSW, DENSW-. LENTRY, ENTRY-. LWAIT, WAIT-. LERROR, ERRSET-. VCOUNT=LQUO-. JMP WHICH L6, 6 LM6, -6 DECIMAL L79, 79 SEEK, 79 OCTAL / ENTRY POINTS ARE AT 30, 34 / *.&7600+30 RX50, RXVER JMS ZOO /COMMON ENTRY ROUTINE 0 /UNIT 0 -1 /MINUS SAYS STILL HAVE TO INIT IT; RX51, 0 JMS ZOO 20 /DRIVE 1 DOOR, JMP WHICH /INIT TIME LITERAL (MUST BE MINUS) /GETS SAME TYPE CODE AS OTHER ENTRY POINT / / COME HERE FROM ZOO / / PROCESS ENTRY POINT, DEVICE TYPE / WHICH, CLL CLA TAD LM6 /INIT RETRY COUNT DCA I LRETRY TAD I ZOO /GET DRIVE # (0 OR 1) DCA UNIT /HOLD FOR LATER ISZ ZOO /MOVE TO TYPE CODE TAD I ZOO /HAS THIS DRIVE BEED INIT'ED SMA CLA /SKIP IF NO JMP NORMAL /GO TO NORMAL PATH RSTART, SKP CLA 20 TAD .-1 DCA I ZOO /PLACE TYPE CODE, THREE LOC.'S AFTER ENTRY POINT L12, 12 /MAY SKIP NORMAL, TAD L7400 / 256 WORDS PER SECTOR DCA I LDENSW /PLACE FOR LOOP CONTROL TAD UNIT /RX50 DCA I LFN /PLACE INTO FUNCTION CONTROL WORD AC7775 /BACK UP ZOO TO FETCH CALLING ADDR TAD ZOO DCA T1 /HOLD TEMPORARY TAD I T1 /HERE IS CALLING ADDR CLLFLD, HLT /PUT CDF TO CALLING FIELD HERE JMS I LENTRY /GO TO SECOND PAGE, LEAVING POINTER TO DIVSUB / / DIVSUB SUBROUTINE !!MUST!! FOLLOW IMMEDIATELY / / DIVSUB / / CALL TO SET UP TRACK, SECTOR, FROM OVERALL SECTOR # / ALSO, SET UNIT WITH HEAD COMMAND IF WE ARE ON TO SECOND SIDE / / CALL WITH AC <0 IF IT IS REALLY AN ERROR RETRY / CALL WITH AC >=0 IF CALL TO DIVSUB DIVSUB, 0 CDF 0 /AND DATA FIELD MUST BE TO HERE SPA CLA /SKIP IF REALLY A DIVIDE REQUEST JMP RECOVR /NO, IT WAS AN ERROR RETRY!! DCA I LQUO /CLEAR DIVIDE QUOTIENT RAR DCA SAVL /SAVE THE CONTENTS OF THE LINK TAD I LREC /THIS FOR TRACK-SECTOR DIVLOO, ISZ I LQUO /MAIN DIIVIDIE LOOP TAD LM12 /DIVIDE BY 10 TO GET TRACK SMA /SKIP IF DONE JMP DIVLOO TAD L12 /REMAINDER 0-9 DCA T1 /HOLD IT IN TEMPORARY TAD T1 /CALCULATE BLOCK NUMBER FOR AN TAD T1 /INTERLEAVE OF 2 CLL IAC /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0 TAD LM12 /DIVIDE BY 10 TO GET SECTOR SMA SZA /SKIP IF DONE JMP .-2 TAD L12 /RESTORE POSITIVE VALUE TO BE SECTOR DCA I LREMD SNL CLA ISZ I LREMD /COMPENSATE FOR ODD SECTOR TAD SAVL CLL RAL /RESTORE LINK JMP I DIVSUB /OUT SAVL, 0 /TEMPORARY SO WE CAN SAVE LINK THROUGH ALL THE /EVIL ARITHMETIC RECOVR, TAD SEEK /ERROR RETRY ROUTINE SNA CLA /THIS WILL ALTERNATE BETWEEN TRACKS 1 AND 79 TAD L79 DCA SEEK TAD UNIT /GET UNIT NUMBER TAD L6 LCD /AND LOAD IT JMS I LWAIT /WAIT FOR OPERATION TO COMPLETE SKP /STR NORMAL RETURN JMP I LERROR /DONE ERROR RETURN IAC /SELECT SECTOR 1 XDR JMS I LWAIT /WAIT FOR OPERATION TO FINISH SKP JMP I LERROR TAD SEEK /SEEK TO TRACK 1 OR 79 XDR JMS I LWAIT /WAIT FOR OPERATION TO COMPLETE JMP I LERROR JMP RSTART LM12, -12 L7400, 7400 / / / *.&7600+167 /FORCE TO END OF PAGE / ZOO SUBROUTINE / / TO SET UP ENTRY POINT PROCESSING, AND INIT CODE / ZOO, 0 /ADDR OF 'HIT' ENTRY POINT +2 COMES HERE CLA /FOR SAFETY RDF /SAVE CALLERS FIELD SETTING TAD LCDF0 /ADD IN CDF 0 DCA CLLFLD /RESET WHEN GOING TO I/O SUB LCDF0, CDF 0 /DATA FIELD HERE FOR INDIRECTS CLOSE, TAD DOOR /CLOSE DOOR TO ONCE ONLY CODE (JMP WHICH T1, DCA CLOSE /USE ONCE-ONLY FOR TEMPORARY LOCATION JMS POINT /LEAVE ADDR OF SECOND PAGE / / / VARIABLES, ALSO INIT CODE LIVES HERE / / BUF, 0 /POINTER TO CALLER'S BUFFER RETRY, 0 /RETRY COUNT SYS, 0 /POINTER TO CALL QUO, 0 /DIVIDE QUOTIENT, WHICH IS TRACK NUMBER REC, 0 /SECTOR NUMBER OF FLOPPY BC, 0 /CONTROL COUNT, WORDS TO TRANSFER FN, 0 /0 FOR WRITE; 2 FOR READ; HEAD, DENSITY, UNIT DENSW, 0 /GETS SET TO 7400 FOR SILO COUNT ENTRY, 0 /ENTRY POINT, LEAVE ADDR OF DIVSUB HERE / IFNZRO .&177-10&4000 <_ERROR> /ENOUGH ROOM FOR INIT? / *.&7600 / / INIT TIME: FILL VECTOR TABLE / THERE, 0 /FILLED BY JMS, POINTS TO VECTOR ILOOP, TAD THERE /POINTER IS ALSO OFFSET! TAD I THERE /MAKING VECTOR DCA I THERE ISZ THERE /MOVE TO NEXT VECTOR ISZ FLPWC /CONTROL COUNT ON THIS PAGE JMP ILOOP JMP I THERE /BACK TO FIRST PAGE / / IO SUBROUTINE / / ENTRY POINT AT END OF LAST LISTING PAGE / / *ENTRY+1 /RESUME RUNTIME CODE / DCA SYS /POINTER TO ARG'S, EXIT RDF /DATA FIELD OF USER CALL TAD (CDF CIF 0 /MAKE CDF CIF TO CALLER'S FIELD DCA EXFLD /SET UP FOR CALL AC4000 /SET LINK=0, AC=4000 TAD I SYS /CARRY READ-WRITE BIT TO LINK AND L70 /KEEP FIELD FOR BUFFER TAD LLCDF0 /MAKE CDF TO BUFFER FIELD DCA BUFCDF /PLACE INTO I/O LOOP CML RTL /MAKE FUNCTION CODE, 0=WRITE, 2=READ TAD FN /START-UP CODE HAS SET HEAD, DENSITY, UNIT ETC. DCA FN TAD I SYS /MAKE LOOP CONTROL COUNT RAL AND L7600 CIA /0 FOR WHOLE FIELD DCA BC /MINUS TOTAL NUMBER OF WORDS ISZ SYS TAD I SYS /BUFFER ADDRESS DCA BUF ISZ SYS TAD I SYS /STARTING BLOCK NUMBER DCA REC ISZ SYS /MOVE POINTER TO ERROR EXIT JMS I ENTRY /CALL DIVISION SUBROUTINE OTHER PAGE AC0002 /MASK OUT READ WRITE BIT AND FN /SPLIT READ AND WRITE SZA CLA /SKIP IF WRITE JMP STREAD /READ GOES TO START IN MIDDLE OF LOOP /WRITE FALLS THRU TO NEXT LISTING PAGE /WRITE FALLS THRU TO THIS LOOP / / TOP OF MAIN LOOP / TOP, TAD FN /SET SILO TO LOAD-UNLOAD LCD /COMMAND TO CONTROLLER TAD DENSW /MAKE SILO LOOP COUNT, 7400 FOR RX50 DCA FLPWC /LDCMD ENTRY SAFE TEMPORARY CLL /FLAG FOR BC OVERFLOW BUFCDF, HLT /CDF TO BUFFER FIELD PLACED HERE TRLOOP, JMS WAIT /WAIT FOR STR SKP JMP ERRSET TAD I BUF /IN CASE WRITE, FETCH A WORD XDR /TO OR FROM AC SZL /LINK SET IF BLOCK COUNT EXPIRED, ODD PAGE THING JMP INCWC /THROUGH AWAY DATA, JUST COUNT TRANSFERS DCA I BUF /STILL WORDS TO GET ISZ BUF REMD, 0 /HOME FOR SECTOR NUMBER, ALWAYS 00XY, HENCE NOP ISZ BC /TEST FOR END OF TRANSFER SKP /NO, GO ON STL /YES INCWC, CLA ISZ FLPWC /256 WORD COUNTER JMP TRLOOP JMS WAIT /WAIT FOR SDN JMP ERRSET TAD BC /WENT TO ZERO IF TRANSFER COMPLETE SZA CLA JMP STREAD AC0002 /SET AC = 2 AND FN /IF BC=0 AND DOING A READ THEN WERE DONE SZA CLA JMP EXIT STL /INDICATES THAT BLOCK COUNT HAS EXPIRED / / MIDDLE OF MAIN LOOP / STREAD, TAD K4 /LEAVE THE LINK ALONE TAD FN /TURNING SILO COMMAND INTO READ-WRITE COMMAND LCD /I/O COMMAND TO CONTROLLER JMS WAIT /WAIT FOR STR SKP JMP ERRSET TAD REMD /PRECOMPUTED SECTOR # XDR L7600, 7600 /CLEAR AC, AND IS LITERAL JMS WAIT /WAIT FOR STR SKP JMP ERRSET TAD QUO /TRACK # XDR /TRACK # IS ALWAYS NON0 !! ISZ REC /MOVE TO NEXT RECORD NUMBER JMS I ENTRY /DO TRACK SECTOR FOR NEXT OPERATION JMS WAIT /WAIT FOR SDN JMP ERRSET SNL CLA /EXIT IF LINK SET, DIVIDE ROUTINE MUST PRESERVE !! JMP TOP /STILL MORE EXIT, ISZ SYS /KICK TO OK EXIT EXFLD, HLT /CDF CIF TO CALLER JMP I SYS /OUT K4, 4 /MAKES 0 GO TO 4 AND 2 GO TO 6 WAIT, 0 CLA STR /TEST FOR XFER FLAG SKP JMP I WAIT /IF XFER FLAG SET RETURN TO CALLER +1 SDN /TEST DONE FLAG JMP WAIT+2 /LOOP UNTIL STR OR SDN HAS SET ISZ WAIT /DONE SET, SET UP RETURN TO CALLER +2 SER /IS THERE AN ERROR JMP MONCHK /NO, CHECK KEYBOARD ERRSET, AC4000 /ERROR CODE FOR HARD ERROR ISZ RETRY JMS I ENTRY /NO, -AC SAYS TO RETRY NOT DIVIDE!!! JMP EXFLD /ERROR RETURN OUT MONCHK, RAR /SAVE THE LINK DCA SAVLNK IFNZRO NOCHK < KSF /IS K.B. FLAG SET > / Test for ctrl c IFZERO NOCHK < NOP > / Don't test for ctrl c JMP MONLEV /NO KRB /YES TAD M3 /LOOK FOR CTRL C SZA CLA JMP MONLEV /NOT CTRL C LLCDF0, CDF 0 /CTRL C FOUND JMP I L7600 /RETURN TO SYSTEM MONLEV, TAD SAVLNK /RESTORE LINK RAL JMP I WAIT /RETURN TO CALLER SAVLNK, 0 FLPWC, VCOUNT L70, 70 M3, -3 PAGE