/FLOPPY DISK (RX01) 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. / / / / / / / / / / /RICHARD LARY, AUTUMN 1974 /DEFINITIONS OF RX8/E IOT'S RXSVER= "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 ONLY HANDLES DRIVE 0 OF A DUAL RX01 SYSTEM; IT /IS MODIFIED AT BOOTSTRAP TIME TO HANDLE ONLY DRIVE 1 BY SETTING /LOCATION "S4UNIT" TO AN OCTAL 7024. /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 (TRACK 0 IS UNUSED). /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 / THIS HANDLER IS T I G H T ON SPACE! *0 /ORIGIN FOR BUILD -1 /ONE ENTRY POINT DEVICE RX8E /"RX8E" IS THE GROUP NAME DEVICE SYS /"SYS" IS THE ENTRY POINT NAME 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE 2007 /2000 MEANS SYS HANDLER, 7 IS ENTRY PT OFFSET 0 /THIS WORD ALWAYS SEEMS TO BE 0 DECIMAL 76^26%4 /THE NUMBER OF OS/8 BLOCKS ON THE DEVICE OCTAL BOOTST-BOOTND /LENGTH OF THE BOOTSTRAP /SECONDARY BOOTSTRAP FOR RX8E FLOPPY DISK /ALLOWS BOOTSTRAPPING FROM DRIVES 0 OR 1 RELOC 2 /BOOTSTRAP STARTS LOADING AT LOCATION 2 BOOTST, X7577, 7577 SECT, 1 /SECTOR NUMBER FAKRET, JMS GET1 /THIS READS THE SECOND HALF OF PAGE 17600 DCA CDF10 /SET UP TO LOAD FIELD 0 CDF 0 TAD X7577 DCA XR /INTO PAGE 7600 JMS GET1 /LOAD FIRST HALF OF THE PAGE JMS GET1 /LOAD SECOND HALF OF THE PAGE TAD UNIT /GET THE UNIT NUMBER WE BOOTED FROM DCA I PUNIT /STORE INTO "S4UNIT" SO SYS WILL BE THAT UNIT INIT /RECALIBRATE JUST TO MAKE THE FLAG COME UP JMS I X7577 /GO TO 7600 TO LOAD OS/8 XR, 7600+BOOTND-BOOTST-1 /THIS SHOULD BE AT LOCATION 17! IFNZRO XR-17 <__ERROR__> PUNIT, S4UNIT GET1, FAKRET /FAKE RETURN - GET1 IS JUMPED INTO BY PRIMARY BOOT STL RTL /GET A READ COMMAND TAD UNIT /ON THE PROPER UNIT LCD /LOAD FLOPPY COMMAND REGISTER CLA STL RTL /BUMP SECTOR NUMBER BY 2 FOR INTERLEAVING TAD SECT JMS LOAD /LOAD SECTOR NUMBER DCA SECT CLA IAC JMS LOAD /LOAD TRACK NUMBER 1 HANGGG, SDN /** THIS MUST LINE UP WITH SDN IN PRIMARY BOOT! JMP LOAD+1 /COMPLETE THE FIGURE-8 JUMP PATTERN SER /IF ANY ERRORS, SKP HLT /HALT NOW. SNA /LOOPING ON READ OR EMPTY? JMP I GET1 /EMPTY OVER - RETURN FROM GET1 CLA STL RTL /GET COMMAND TO EMPTY BUFFER LCD /AND LOAD THE COMMAND REGISTER WITH IT CDF10, CDF 10 /SET FIELD 10 - THIS GETS WIPED LATER JMS LOAD /GET A DATA WORD DCA I XR /STORE THE WORD LP, JMP CDF10 /LOOP "INFINITELY" ("LOAD" TAKES US OUT) /(THIS WORD LOADS OVER PRIMARY BOOT LOOP) BOOTND, RELOC /THIS IS THE PRIMARY BOOTSTRAP WHICH SHOULD BE USED WITH THE /PRECEDING SECONDARY BOOTSTRAP. IT BOOTSTRAPS THE FIRST DRIVE /WHICH WILL READ WITHOUT ERROR, TRYING DRIVE 0 FIRST. NOPUNCH *24 /ORIGIN OF BOOTSTRAP BOOT, STL RTL TAD UNIT /GET A READ COMMAND ON THE PROPER LCD /UNIT AND LOAD IT INTO THE COMMAND REGISTER CLA IAC JMS LOAD /READ SECTOR ONE JMS LOAD /OF TRACK ONE. CLL RAL /SET AC = 2 AS FLAG SAYING WE READ TRACK 1 START, /** BOOTSTRAP START ADDR ** HANGGG, SDN /DO A FIGURE-8 SKIP - JMP LOAD+1 /ONLY THE DONE FLAG WILL COME UP SER /ANY ERRORS? SNA /OR IS THIS THE INITIAL DUMMY WAIT? SKP CLA /IF EITHER ONE, TRY OTHER DRIVE JMP GOODRD /IF ALL IS WELL, GO READ THE SECTOR BUFFER TAD UNIT /COME HERE ON READ ERRORS - CIA /FLIP THE UNIT NUMBER TAD X6030 /IN "UNIT" DCA UNIT JMP BOOT GOODRD, LCD /LOAD THE EMPTY SECTOR BUFFER COMMAND ( A CONVENIENT 2) LP, JMS LOAD /GET A WORD FROM THE SECTOR BUFFER DCA BOOTST /SECONDARY BOOT LOADS INTO LOCATIONS 3-51 ISZ .-1 /BUMP STORE ADDRESS JMP LP LOAD, 0 STR /DO A FIGURE-8 LOOP WAITING FOR THE TRANSFER JMP HANGGG /OR DONE FLAGS TO COME UP. XDR /TRANSFER FLAG CAME UP - TRANSFER A WORD JMP I LOAD UNIT, 7024 /7004 = DRIVE 0, 7024 = DRIVE 1 X6030, 6030 /CONSTANT NEEDED TO FLIP UNIT - 7004+7024. ENPUNCH *200 /SYSTEM HANDLER CODE RELOC 7600 ZBLOCK 7 /WASTE SPACE BEFORE ENTRY POINT SYS, RXSVER /ENTRY POINT CLA STL RAR /AC = 4000 TAD I SYS / READ/WRITE BIT INTO LINK, AND S70 /ISOLATE FIELD OF BUFFER TAD SCDF0 /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 RDF TAD SCDIF0 /REMEMBER CALLING FIELD FOR RETURN DCA SRET TAD I SYS /GET FIRST ARGUMENT AGAIN S4UNIT, RAL /TURN THE PAGE COUNT INTO A WORD COUNT /** THIS INSTRUCTION IS TURNED INTO A /"CML RAL" (7024) IF WE ARE RUNNING /FROM DRIVE 1 AS THE SYSTEM DEVICE AND S7600 /AND REMOVE THE FIELD AND OTHER STUFF CIA DCA WC /STORE THE NEGATIVE WORD COUNT ISZ SYS TAD I SYS /GET ARGUMENT2 DCA BUF /WHICH IS THE BUFFER ADDRESS ISZ SYS S77, 77 /** THIS LITERAL MUST BE AT 33 IN THE PAGE IFNZRO S77&177-33 <_ERROR_ S77 MUST BE AT 7633> TAD I SYS /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 SYS /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 S33, AND S77 /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 /INCREMENT 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 SYS /BUMP ARGUMENT POINTER TO NORMAL RETURN SRET, HLT /RESTORE CALLING DATA AND INST FIELD JMP I SYS /AND RETURN SCDF0, CDF 0 SCDIF0, CDF CIF 0 LDCMD, 0 SDN /WAIT FOR THE DONE FLAG TO COME UP JMP .-1 /BEFORE YOU LOAD THE COMMAND REGISTER LCD /THEN LOAD IT. JMP I LDCMD /AND RETURN /** IT WOULD BE NICE IF THIS ROUTINE WAS AT 7700, BUT NOT ESSENTIAL 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 SM15, -15 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 S4UNIT /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 SM15 /(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 S33 /CONVERT REMAINDER TO SECTOR ADDRESS IN THE /RANGE 1-26 JMS TRANS /AND SEND TO THE RX8/E S7600, 7600 /CLEAR THE AC HERE SINCE TRANS DOES NOT TAD QUO /NOTE THAT TRACK NUMBERS START AT ONE! JMS TRANS /SEND THE TRACK NUMBER - THIS STARTS THE I/O CLA STL /CLEAR THE AC AGAIN, SET THE LINK TO 1 TAD SLSTAT /WAIT FOR THE OPERATION TO COMPLETE AND LOAD JMS LDCMD /A "READ STATUS" 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 FN= 7750 /USE THE THREE-CYCLE DATA BREAK LOCATIONS BUF= 7751 /AS TEMPORARIES, SINCE THEY ARE NOT BEING USED REC= 7752 /BY ANYONE ELSE WHILE WE ARE EXECUTING QUO= 7753 /(AH, THE ADVANTAGES OF UNOVERLAPPED I/O!) TRYCNT= 7754 WC= 7755 RELOC $