/RX78B /FLOPPY DISK (RX01,RX71) NON-SYSTEM HANDLER FOR OS/78 /FOR RXA2 AND RXA3 / / / / / / / / /COPYRIGHT (C) 1977 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. / / / / / / / / / / /FLOPPY DISK (RX01,RX71) NON-SYSTEM HANDLER FOR OS/78 /DEFINITIONS OF RX8/E IOT'S RXVER= "J&77 DEVCOD= 750 /DEVICECODE 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 /ONLY 6 BITS OF EVERY 8-BIT BYTE ARE USED. AN RX01 CARTRIDGE /CONTAINS 494 OS/8 BLOCKS UNDER THIS METHOD /TO MAXIMIZE SPEED ON THE DEVICE, THE HANDLER READS AND WRITES DATA /ON A TRACK WITH A TWO-WAY INTERLEAVE - I.E. RECORDS 1-26 ON A TRACK /ARE WRITTEN IN THE SEQUENCE: / 1,3,5,7,9,11,13,15,17,19,21,23,25,2,4,6,8,10,12,14,16,18,20,22,24,26 /IN THIS WAY THE HANDLER CAN TRANSFER DATA AT A 5KHZ WORD RATE /MODIFIED TO ALLOW ADDRESS CALCULATION DURING SECTOR BUFFER /LOAD-UNLOAD. / WARNING!! THIS HANDLER CONTAINS CODE THAT DEPENDS ON VT78 TIMING! / RUNNING THE CODE ON A !!FASTER!! PROCESSOR THAN THE VT78 WILL CAUSE / UNPREDICTABLE FAILURES. *0 /ORIGIN FOR BUILD -2 /TWO ENTRY POINTS DEVICE RX0B /"RX0B" IS THE GROUP NAME DEVICE RXA2 /"RXA2" IS THE ENTRY POINT NAME 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE RXA2&177 /ENTRY POINT OFFSET 0 /THIS WORD ALWAYS SEEMS TO BE 0 0 /UNUSED FOR NONSYSTEM DEVICE DEVICE RX0B /"RX0B" IS THE GROUP NAME DEVICE RXA3 /"RXA3" IS THE ENTRY POINT NAME 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE RXA3&177 /ENTRY POINT OFFSET 0 /THIS WORD ALWAYS SEEMS TO BE 0 0 /UNUSED FOR NONSYSTEM DEVICE *200 /HANDLER CODE / BUF, 0 /POINTER TO USER BUFFER REC, 0 /FLOPPY SECTOR NUMBER / / / / DIVSUB / / MUST ENTER WITH LINK AND AC 0 / COMPUTES TRACK IN 'QUO', SECTOR IN 'MQ', FROM # IN 'REC' / / REPEATED SUBTRACTS OF 13 DECIMAL LEAVE THE HIGH N-1 BITS OF / QUOTIENT IN QUO, THE LOW BIT OF QUOTIENT IN LINK, AND THE / REMAINDER IN AC. THE INTERLEAVE IS ACCOMPLISHED BY SHIFTING / LOW QUOTINET BIT INTO LOW REMAINDER BIT. / DIVSUB, 0 DCA QUO /INIT QUOTIENT FOR DIVIDE TAD REC /RECORD # MASSAGED IN AC DIVLP, SNL /LINK USAGE REVERSED FROM RICHIE'S CODE ISZ QUO /ISZ EVERY OTHER TIME, <=DIVIDE BY 26 TAD SM15 /THE -13 DECIMAL SMA /SKIP ON DONE JMP DIVLP /MORE DIVRAL, RAL /LINK USAGE REVERSED; INTERLEAVE!! TAD S33 /ADD 233 (200 IRREL) MAKING SECTOR DCA MQ JMP I DIVSUB /LEAVING LINK AND AC 0 QUO, 0 /DIVIDE TEMP / SELECT=.-1 /ENTRY POINT FOR DRIVES SELECT 6750 /SELECT APPROPRIATE DRIVES SER /CLEAR ANY HANGING ERROR FLAG S175, 175 /LITERAL, EXECUTES AS A NOP SDN /CLEAR RESIDUAL DONE FLAG FN, 0 /HAS 0 OR 2 AS VALUE, SAFE NO-OP STR /CLEAR HANGING TRANSFER FLAG S70, 70 /SAFE EXECUTABLE LITERAL TAD MAGIC /TURN DONE FLAG BACK ON! LCD /INITIALIZE THEM JMP I SELECT /DONE / TRANS=DIVSUB /TRANSFER COMMAND / RXA2, RXVER /ENTRY POINT FOR UNIT 2 SKP CLA /CLEAR AC FOR SAFETY, HOP OVER VARIABLE UNIT, 0 /UNIT NUMBER FOR I/O OPERATION JMP RXCOMN /GO TO COMMON CODE IFNZRO UNIT&177-33 <.ERROR> MQ, /DIVIDE TEMPORARY RXA3, RXVER /ENTRY POINT FOR UNIT 3 S7600, 7600 /AC=0 FOR SAFETY, USEFUL LITERAL TAD RXA3 DCA RXA2 /PUT CALLING ADDR IN KNOWN PLACE TAD DIVLP /GET "20" RXCOMN, TAD DIVRAL /SET AC TO 20*UNIT+4 DCA UNIT /SAVE UNIT NUMBER RDF TAD SCDIF0 /REMEMBER CALLING FIELD FOR RETURN DCA SRET IAC JMS SELECT /SELECT "B" DRIVES / OVERALL COMMENTS: / / OVERALL LOOP CONTROL THROUGH BC IS MILDLY ODD. / BC STARTS WITH MINUS COUNT OF THE # OF WORDS TO BE TRANSFERRED. / BC IS INCREMENTED 77 TIMES AT THE SILO CODE, AND 1 TIME AFTER / THE I/O OPERATION. / A READ OPERATION STARTS AND FINISHES AT THE MIDDLE OF THE LOOP. / A WRITE OEPRATION STARTS AT THE TOP, AND FINISHES AT BOTTOM. / THUS, A 1 BLOCK READ INCREMENTS 1, 77, 1, 77 AND EXITS FROM MIDDLE. / AND, A 1 BLOCK WRITE INCREMENTS 77, 1, 77, 1 AND EXITS FROM BOTTOM. / / DIVISION IS CARRIED OUT IN PARALLEL WITH I/O OPERATION BECAUSE OF / TIMING CONSIDERATIONS OF THE VT78. / / THERE IS NO ERROR RETRY, NOT PARTICULARLY CRITICAL FOR A FLOPPY. CLL CML CLA RAR /SET LINK=0, AC=4000 TAD I SYS /TO PUT READ-WRITE BIT TO LINK AND S70 /KEEP BITS FOR CDF TAD SCDF0 /ADDING IN CDF LITERAL DCA BUFCDF /CDF INSTRUCTION TO USER'S BUFFER CML RTL /FUNCTION CODE, 0=WRITE, 2=READ DCA FN TAD I SYS /MAKE CONTROL COUNT RAL AND S7600 /MAKE CONTROL COUNT FOR TOTAL CIA /NUMBER OF WORDS DCA BC ISZ SYS TAD I SYS /FETCH BUFFER ADDRESS DCA BUF ISZ SYS TAD I SYS /OS8 BLOCK # CLL RTL /TIMES 4 TO BE FLOPPY SECTOR # DCA REC /LINK NOW ZERO FOR DIVSUB ISZ SYS /ERROR EXIT FROM I/O CALL JMS DIVSUB /COMPUTE TRACK/SECTOR FOR FIRST I/O TAD FN /READ OR WRITE START DIFFERENTLY SZA CLA /SKIP ON WRITE JMP STREAD /GO TO READ / / WRITE FALLS THRU....... / / / / TOP OF MAIN PROCESSING LOOP / SETSLO, TAD FN /SET SILO TO LOAD-UNLOAD DEPENDING JMS LDCMD TAD S7700 /SILO CONTROL COUNT 100 OCTAL DCA FLPWC BUFCDF, HLT /CDF TO USER'S BUFFER PLACED HERE TRLOOP, TAD I BUF /FETCH A WORD IN CASE WRITE STR /VT78 IS SLOW ENOUGH SO WE KNOW WE ALWAYS SKIP!! SM15, -15 /NON-EXECUTABLE LITERAL XDR /AC TO SILO; OR; SILO TO AC DCA I BUF /PLACE A WORD IN CASE READ; WRITE REPLACES SAME. ISZ BUF /MOVE TO NEXT BUFFER LOCATION (MAY SKIP) S77, 77 /LITERAL 77, EXECUTES AS A NOP ISZ FLPWC /DONE WITH 100 OCTAL SILO OPERATION JMP TRLOOP /NO TAD BC /INCREMENT BC BY 77 HERE, 1 LATER TAD S77 /CHECKING FOR A READ EXIT MAGIC, SNA /IF BC HAS GONE TO ZERO, NO-OP FOR LDCMD JMP OKEX /READ EXIT. DCA BC /REPLACING BC FOR WRITE EXIT CHECK AT LOOP END / / MIDDLE OF MAIN PROCESSING LOOP / STREAD, TAD FN /READ STARTS HERE S33, TAD UNIT /SET UP DO DO READ OR WRITE I/O; SIX BITS OF LITERAL 33 JMS LDCMD SCDF0, CDF 0 /SLOW AND SAFE! NO-OP ISZ REC /MOVE FLOPPY SECTOR NUMBER TO NEXT TAD MQ /LOAD PRECOMPUTED SECTOR INFO STR /VT78 ALWAYS WILL SKIP HERE !! BC, 0 /NON EXECUTABLE VARIABLE XDR CLL CLA /AC HAS JUNK FROM LAST XDR, CLEAR LINK FOR DIVSUB TAD QUO /TRACK STR JMP .-1 /IN CASE NOT READY XDR S7700, 7700 /CLEAR AC, CAN'T SKIP (XDR LEAVES AC ALONE) JMS DIVSUB /COMPUTE NEXT TRACK AND SECTOR DURING THIS I/O TAD MAGIC /WAIT FOR I/O TO COMPLETE JMS LDCMD ISZ BC /CHECK FOR WRITE EXIT JMP SETSLO /NO, BACK TO TOP OKEX, ISZ SYS /BUMP TO REGULAR EXIT JMS SELECT /SELECT "A" DRIVES SRET, HLT /CDF CIF FOR USER'S CALLING FIELD JMP I SYS /GONE / SYS=RXA2 / FLPWC=. /100 COUNTER FOR SILO OK IN LDCMD ENTRY LDCMD, 0 /WAIT FOR DONE FLAG AND LOAD CMD REG DCA TRANS /SAVE THE NEW COMMAND REG VALUE SDN /WAIT FOR THE DONE FLAG TO COME UP JMP .-1 /BEFORE YOU LOAD THE COMMAND REGISTER DONELP, TAD S7600 /SEE IF THE KEYBOARD BUFFER KRS /CONTAINS A CONTROL/C CHARACTER TAD S175 /(WITH OR WITHOUT PARITY) 175=-7603 SNA CLA KSF /WITH THE FLAG UP. JMP NOTCTC /IF NOT, CONTINUE JMS SELECT /YES, SELECT "A" DRIVES SCDIF0, CDF CIF 0 / RETURN TO OS/8 JMP I S7600 NOTCTC, TAD TRANS /NOW GET THE NEW COMMAND REGISTER CONTENTS LCD /AND LOAD IT. SER /SKIP IF I/O ERROR JMP I LDCMD /AND RETURN JMS SELECT /FORCE BACK TO "A" DRIVES BEFORE RETURN CLL CML CLA RAR /TRADITIONAL ERROR VALUE OF 4000 TO AC JMP SRET /BACK TO SYSTEM $