/FLOPPY DISK (RX01) NON-SYSTEM HANDLER FOR OS/8 / / / / / / / / / /COPYRIGHT (C) 1975 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. / / / / / / / / / / / THIS HANDLER DOES NOT SUPPORT READING AND WRITING OF TRACK 0. /DEFINITIONS OF RX8/E IOT'S RXVER= "B&77 IFNDEF DEVCOD /DEVICE CODE 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 *0 /ORIGIN FOR BUILD -2 /TWO ENTRY POINTS DEVICE RX01 /"RX01" IS THE GROUP NAME DEVICE RXA0 /"RXA0" IS THE ENTRY POINT NAME 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE RXA0&177 /ENTRY POINT OFFSET 0 /THIS WORD ALWAYS SEEMS TO BE 0 0 /UNUSED FOR NONSYSTEM DEVICE DEVICE RX01 /"RX01" IS THE GROUP NAME DEVICE RXA1 /"RXA1" IS THE ENTRY POINT NAME 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE RXA1&177 /ENTRY POINT OFFSET 0 /THIS WORD ALWAYS SEEMS TO BE 0 0 /UNUSED FOR NONSYSTEM DEVICE *200 /HANDLER CODE FN, 0 /COMMAND REGISTER FUNCTION - 0 IF WRITE, 2 IF READ BUF, 0 /USER BUFFER POINTER REC, 0 /RX01 RECORD NUMBER BEFORE INTERLEAVING WC, 0 /WORD COUNT OF TRANSFER LDCMD, 0 /WAIT FOR DONE FLAG AND LOAD CMD REG DCA TRANS /SAVE THE NEW COMMAND REG VALUE DONELP, TAD S7600 /SEE IF THE KEYBOARD BUFFER KRS /CONTAINS A CONTROL/C CHARACTER TAD (-7603 /(WITH OR WITHOUT PARITY) SNA CLA KSF /WITH THE FLAG UP. JMP NOTCTC /IF NOT, CONTINUE SCDIF0, CDF CIF 0 /IF SO, RETURN TO OS/8 JMP I S7600 NOTCTC, SDN /WAIT FOR THE DONE FLAG TO COME UP JMP DONELP /BEFORE YOU LOAD THE COMMAND REGISTER TAD TRANS /NOW GET THE NEW COMMAND REGISTER CONTENTS LCD /AND LOAD IT. JMP I LDCMD /AND RETURN TRANS, 0 /A SPACESAVING TIMEWASTER STR /WAIT FOR TRANSFER DONE FLAG O COME UP JMP .-1 XDR /WHEN IT DOES, TRANSFER A WORD JMP I TRANS /AND RETURN RXA0, RXVER /ENTRY POINT FOR UNIT 0 CLA /BE PROTECTIVE JMP RXCOMN /GO TO COMMON CODE UNIT, 0 /4 IF UNIT 0, 24 IF UNIT 1 RXA1, RXVER /ENTRY POINT FOR UNIT 1 CLA /CAREFUL, CAREFUL! TAD RXA1 DCA RXA0 /PUT CALLING ADDR IN KNOWN PLACE STL RTL /PUT A 2 IN THE AC RXCOMN, STL RTL /SET AC TO 10*UNIT+2 RAL /NOW SET IT TO 20*UNIT+4 DCA UNIT /SAVE UNIT NUMBER RDF TAD SCDIF0 /REMEMBER CALLING FIELD FOR RETURN DCA SRET CLA STL RAR /AC = 4000 TAD I RXA0 / READ/WRITE BIT INTO LINK, AND S70 /ISOLATE FIELD OF BUFFER TAD (CDF 0 /AND MAKE IT INTO A CDF INSTRUCTION DCA BUFCDF /STORE IT AWAY INLINE CML RTL /AC = 0 IF WRITE, 2 IF READ DCA FN /SAVE FUNCTION TAD I RXA0 /GET FIRST ARGUMENT AGAIN RAL /TURN THE PAGE COUNT INTO A WORD COUNT AND S7600 /AND REMOVE THE FIELD AND OTHER STUFF CIA DCA WC /STORE THE NEGATIVE WORD COUNT ISZ RXA0 TAD I RXA0 /GET ARGUMENT2 DCA BUF /WHICH IS THE BUFFER ADDRESS ISZ RXA0 TAD I RXA0 /AND ARGUMENT 3 IS THE STARTING BLOCK NUMBER CLL RTL /ONE OS/8 BLOCK EQUALS FOUR RX01 BLOCKS DCA REC /STORE INITIAL RECORD NUMBER ISZ RXA0 /BUMP ARG POINTER TO ERROR RETURN TAD FN /GET THE FUNCTION SNA CLA /IF IT'S READ, WE MUST PRE-READ JMP STWRIT /OTHERWISE START FILLING THE RX01 BUFFER WORDLP, TAD WC /GET WORD COUNT AND (77 /CHECK FOR A MULTIPLE OF 64 WORDS SZA CLA /IF WE ARE AT SUCH A BOUNDARY, WE WANT TO DO I/O JMP TRANWD /OTHERWISE JUST TRANSFER WORDS BETWEEN BUFFERS JMS DISKIO /READ OR WRITE A BUFFER ISZ REC /AND BUMP THE RECORD NUMBER STWRIT, TAD FN /PUT A 0 IF WRITE, OR A 2 IF READ, INTO THE AC JMS LDCMD /AC=0 --> "FILL SECTOR BUFFER", /AC=2 --> "EMPTY SECTOR BUFFER" BUFCDF, HLT /CDF TO FIELD OF BUFFER TRANWD, TAD I BUF /GET CONTENTS OF BUFFER IN CASE WE'RE WRITING JMS TRANS /TRANSFER A WORD BETWEEN CORE AND THE RX01 DCA I BUF /STORE CONTENTS OF BUFFER IN CASE WE'RE READING ISZ BUF /BUMP BUFFER POINTER S70, 70 /(JUST IN CASE IT SKIPS) ISZ WC /BUMP WORD COUNT JMP WORDLP /AND GO DO IT AGAIN TAD FN /IF WRITING, WE MUST DUMP LAST RECORD SNA CLA /** THIS LOC AND THE PREV LOC CAN BE REMOVED / IF WE ARE ABSOLUTELY DESPERATE ** JMS DISKIO ISZ RXA0 /BUMP ARGUMENT POINTER TO NORMAL RETURN SRET, HLT /RESTORE CALLING DATA AND INST FIELD JMP I RXA0 /AND RETURN DISKIO, 0 /ROUTINE TO READ OR WRITE AN RX01 RECORD STA CLL RTL /SET ERROR RETRY COUNT DCA TRYCNT /TO 3 TIMES TRYAGN, TAD FN /LOAD COMMAND REGISTER FUNCTION TAD UNIT /WITH A 4 ("WRITE SECTOR") OR A 6 ("READ SECTOR") /AND THE UNIT NUMBER TO READ OR WRITE ON JMS LDCMD /(NOTE AC 0-2 ARE IGNORED BY THE RX8/E) / SLOW BUT SMALL DIVIDE ROUTINE TO COMPUTE SECTOR AND TRACK NUMBER / FROM RECORD NUMBER, INCLUDING INTERLEAVE DCA QUO /INITIALIZE RESULT OF DIVIDE STL /INITIALIZE AC AND LINK TAD REC /TO RECORD NUMBER AND 1, RESPECTIVELY DIVLP, SZL /KEEP SUBTRACTING 13 (DECIMAL) FROM ISZ QUO /RECORD NUMBER, KEEPING QUOTIENT LOW-ORDER BIT TAD (-15 /(COMPLEMENTED) IN THE LINK AND THE REST OF SMA /THE QUOTIENT (+1) IN "QUO". JMP DIVLP /THIS CAN TAKE UP TO 155 ITERATIONS, BUT /INTERLEAVING SECTORS GIVES US PLENTY OF TIME. CML RAL /INTERLEAVING STEP - MULTIPLY REMAINDER BY /2 AND ADD LOW BIT OF QUOTIENT! TAD (33 /CONVERT REMAINDER TO SECTOR ADDRESS IN THE /RANGE 1-26 JMS TRANS /AND SEND TO THE RX8/E CLA /NOW GET THE TRACK NUMBER TAD QUO /NOTE THAT TRACK NUMBERS START AT ONE! JMS TRANS /SEND THE TRACK NUMBER - THIS STARTS THE I/O S7600, 7600 /CLEAR THE AC HERE SINCE TRANS DOES NOT TAD SLSTAT /WAIT FOR THE OPERATION TO COMPLETE AND LOAD JMS LDCMD /A "NOP" INTO THE COMMAND REGISTER - /THIS IS TO INSURE THAT "DONE" COMES UP AGAIN. SER /ANY ERRORS? JMP I DISKIO /NO - RETURN WITH I/O DONE INIT /VERY CRUDE ERROR RECOVERY - RECALIBRATE THE WORLD! ISZ TRYCNT /INCREMENT AND TEST ERROR COUNT JMP TRYAGN /ERROR STILL SOFT - KEEP TRYING SLSTAT, STL RAR /THREE STRIKES, YOU'RE OUT - REPORT HARD ERROR JMP SRET /BY RETURNING TO ERROR RETURN WITH AC .LT. 0 TRYCNT, 0 QUO, 0 /DIVIDE TEMPORARY $