/ DSD HIGH REL. 3 DRIVE FLOPPY NON-SYSTEM OS-8 DRIVER / S0:XHR21N.PA 9/8/76 / THIS IS A 2 PAGE HANDLER WITH ASCII DUMP TO CONSOLE DEVICE / OF COMPLETE ERROR STATUS WHENEVER ANY ERRORS ARE DETECTED. / PRINTS "UT= BK= ST= / "EC= / LOW DIGIT=FUNCTION, 2ND FROM RIGHT = UNIT# / SAME FORMAT AS DIRECTORY LISTINGS. / SEE XDR - BIT 10=>PARITY, BIT11 =>CRC ERROR / < SEE PAGE 2 TABLE FOR CODE INTERPRETATION. / STANDARD OS/8 CALL SEQUENCE USED BY DRIVER. / JMS ENTDX(0,1,2) / AC CLEARED ON ENTRANCE AND NORMAL RETURN / FUNCTION WORD / W P P P P P F F F X X X / / W = 1 FOR WRITE. / / PPPPP = #128. WD PAGES XFERRED. / / FFF = DATA TRANSFER MEMORY FIELD. / STARTING CORE TRANSFER ADDRESS. / STARTING LOGICAL DISK BLOCK (0-755) (2 PAGES/BLOCK) / ERROR RETURN / AC = 4000 / NORMAL RETURN / NO ERRORS DETECTED / DEFS FOR INTERFACE OPERATION. LCDR=6751 / LOAD COMMAND REG: CLEAR AC. / X X X X MA SZ DH DR FN FN FN X / MA = 1 FOR MAINTAINANCE MODE. / SZ = DATA WORD SIZE: 0=>12 BITS, 1=>8 BITS. / DH = HIGH DRIVE'S SELECT FOR DRIVE # 2. / DR = DRIVE SELECT. 0=>DRIVE 0, 1=>DRIVE 1 / FN = FUNCTION (0 - 7) / 0=FILL BUFFER: GET 64 12 BIT WDS OR 128 8 BIT WDS / 1=EMPTY BUFFER(VERIFIES DATA: DOESEN'T CHANGE BUF) / 2=WRITE SECTOR 3 = READ SECTOR / 4= NOP 5 = READ STATUS (250 MSEC.) SEE XDR DEFS / 6= WRITE DELETED DATA SECTOR / 7= READ ERROR REG: SEE PAGE 2 FOR ERROR CODES. XDR=6752 / TRANSFER DATA REGISTER: BIDIRECTIONAL. / IF READ JAMS DATA INTO AC / IF WRITE LOADS FROM AC, AC UNCHANGED. / NOTE: AFTER A LCD COMMAND FINISHED STATUS IS AVAILABLE / BY DOING AN XDR. / AC4= DRIVE READY / AC5= DELETED DATA MARK DETECTED IN ID / AC9= INITIALIZE COMPLETE. / AC10=PARITY ERROR ON CONTROL INF. / AC11=CRC ERROR DETECTED IN DATA. STRF=6753 / SKIP ON TRANSFER REQUEST. / AN XDR INSTRUCTION IS DESIRED. SERF=6754 / SKIP ON ERROR FLAGS SET. / DONE FLAG ALSO SET WHEN TRUE. SDNF=6755 / SKIP ON DONE FLAG SET AND CLEAR DONE. / ATTACHED TO INTERRUPT LINE. SINTR=6756 / SET INTERRUPT STATE / AC11=1 ENABLES INTERRUPT ON DONE FLAG SET. / AC11=0 DISABLES FLOPPY INTERRUPT. INIT=6757 / INIT THE FLOPPY CONTROLLER - INTERFACE. / ERROR CODES GIVEN BY READ ERROR STATUS FUNCT (MODE 7) / CODE LIGHT # MEANING / 10 2 DRIVE 0 FAILED TO HOME ON INIT, OR DIDN'T SELECT / 20 2 DRIVE 1 FAILED TO HOME ON INIT, OR DIDN'T SELECT / 30 2 FOUND HOME WHEN STEPPING OUT 10 TRACKS FOR INIT. / 40 2 TRACK GREATER THAN 77. OR UNIT SELECT ERROR. / 50 2 HOME BEFORE DESIRED TRACK FOUND. / 70 2 DESIRED SECTOR COULD NOT BE FOUND AFTER 2 REVS. / / 100 3 WRITE PROTECT ERROR. / 110 MORE THAN 40 USEC AND NO SEPERATED CLOCK FOUND. / 120 0 NO PREAMBLE WAS FOUND ( 24 BITS OF 0'S) / 130 0 PREAMBLE FOUND BUT NO I/O MARK WITHIN WINDOW / 140 0 CRC ERROR ON WHAT APPEARED TO BE HEADER. / 150 2 HEADER TRACK ADDRESS OF A GOOD HEADER DIDN'T / MATCH DESIRED TRACK. / 160 0 TOO MANY TRIES FOR AN I.D. ADDRESS MARK. / 170 0 DATA ADDRESS MARK NOT FOUND IN ALLOTED TIME. / 200 0 CRC ERROR ON READING SECTOR FROM DISK. / RXES STATUS BIT 11 ALSO SET. / 210 1 PARITY ERROR (INTERFACE <=> CONTROLLER) / RXES STATUS BIT 10 ALSO SET. / 220 2 DRIVE 2 FAILED TO HOME ON INIT. / 230 2 DRIVE 3 FAILED TO HOME ON INIT. / 240 3 FORMATTER ENABLE ERROR. / 250 0 EXPECTED HEADER NOT FOUND AFTER TRACK FORMAT / 260 0 INDEX MARK NOT FOUND IN EXPECTED RANGE. / (FORMAT NOT BEGUN) / 270 0 INDEX MARK NOT FOUND IN EXPECTED RANGE. / (FORMAT HAS OCCURED) / LIGHTS MEANING / 0 FRONT DATA TYPE ERROR / 1 FRONT PARITY ERROR BETWEEN CONTROLLER-INTERFACE. / 2 FRONT SEEK TYPE ERRORS / 3 FRONT SWITCH CONFLICT ERROR OR CONTROLLER ERROR. / INCLUDES WRITE PROTECT OR FORMAT INHIBIT ERRORS. / BOARD LIGHTS / 4 UP-LEFT CONTROLLER WAITING FOR BUS INTERFACE READY. / 5 UP-RGHT INIT IN PROGRESS. / 6 LW-LEFT READ IN PROGRESS / 7 LW-RGHT WRITE IN PROGRESS. / TABLE FORMAT FOR OS/8 BUILD ENTRIES. / WORD 1-2 DEVICE TYPE / WORD 3-4 OS/8 DEVICE NAME / WORD 5 DEVICE CONTROL BLOCK ENTRY / BIT 0 =1 FILE STRUCTURED DEVICE / BIT 1 =1 READ ONLY / BIT 2 =1 WRITE ONLY / BITS 3-8 DEVICE TYPE. SEE TABLE 2-12 OS/8 / BITS 9-11 USED BY MONITOR / WORD 6 ENTRY POINT WORD. / BIT 0 = 1 2 PAGE HANDLER / BIT 1 = 1 ENTRY POINT = SYS: / BIT 2 = 1 ENTRY POINT CORESIDENT WITH SYS: / BIT 5-11 ENTRY POINT OFFSET FROM PAGE BEG. / WORD 7 MUST BE 0 / WORD 8 MUST BE 0 UNLESS SYSTEM HANDLER. / THEN = BLOCK LENGTH OF DEVICE. *0 -3 / 3 ENTRY POINTS, DX0, DX1, DX2 DEVICE HN21; DEVICE DX0; 4250; 4000+ENTDX0-UNITCD; 0; 0 DEVICE HN21; DEVICE DX1; 4250; 4000+ENTDX1-UNITCD; 0; 0 DEVICE HN21; DEVICE DX2; 4250; 4000+ENTDX2-UNITCD; 0; 0 SAM3=CLL STA RAL / SET AC = -3 *200 / NON-SYSTEM HANDLER FOR RX01-RX8 FLOPPY SYSTEM. UNITCD, 0 DSKADR, 0 / 4 * OS/8 BLOCK #. JMP CDFRET / FATAL ERROR RETURN FROM XEQSUB FUNCT, 0 / 0 = WRITE, 2 = READ. / CMDSUB - WAITS FOR DONE THEN DOES LOAD COMMAND. CMDSUB, 0 DCA CALADR / ABORT KLUDGE. TAD B7600 KRS / OR IN LAST CHAR TYPED. TAD MCTRLC / 7603+175 = 0 SZA CLA / CTRL C TYPED? JMP .+3 / NO: NOT RECENT CTRL C CDIFZR, CDF CIF 0 / RESTORE DATA AND INSTRUCT FIELDS. JMP I B7600 / GO TO MONITOR. / START OF ACTUAL CMDSUB SDNF JMP CMDSUB+2 / INCLUDE CTRL C CHECKER. TAD CALADR / RESTORE COMMAND. LCDR / LOAD IT. JMP I CMDSUB / CALADR - CALCULATE PAGE ADDRESS AND OFFSETS. CALADR, 0 TAD CALADR; AND B7600 TAD (ERRCNT-200; DCA JXEQSUB JMP I CALADR / DRIVER ENTRANCE FOR DRIVE # 0. ENTDX0, 0 B7600, CLA+400 JMP DRV0ENT IFNZRO ENTDX0-230 MCTRLC, 175 / DRIVER ENTRANCE FOR DRIVE # 1. ENTDX1, 0 CLA TAD ENTDX1; DCA ENTDX0 STL RTL / AC = 2, L=0 JMP DRV0EN IFNZRO ENTDX1-234 /DRIVER ENTRANCE FOR DRIVE # 2. DSKADL, / OVERLAP THIS ENTRANCE WITH 4*BLOCK # ENTDX2, 0 CLA; TAD ENTDX2; DCA ENTDX0 CLA IAC CLL RTL / AC=4, L=0 DRV0EN, STL RTL / AC = 2, 12, 22 FOR DRV 0, 1, 2. RAL / DRIVE 0 = 4, DRIVE 1 = 24, DRIVE 3 = 44 DCA UNITCD / UNIT CODE RDF / GET CALLING FIELD. TAD CDIFZR DCA CDFRET / SET UP RETURN FIELD. CLA STL RAR / AC = 4000, L=0 TAD I ENTDX0 / FUNCTION WORD AND P70 / GET TRANSFER FIELD. TAD CDFDAT DCA XFRFLD / SET DATA TRANSFER FIELD. CML RTL / AC=0 IF WRITE, =2 IF READ. DCA FUNCT TAD FUNCT; TAD UNITCD; DCA UNITCD /SET UP FOR XEQSUB TAD I ENTDX0 / GET PAGE COUNT RAL / MAKE INTO WORD COUNT. AND B7600 CIA / MAKE INTO - WORD COUNT. DCA WRDCNT ISZ ENTDX0 TAD I ENTDX0 / GET TRANSFER ADDRESS. DCA TRNADR ISZ ENTDX0 TAD I ENTDX0 / GET FLOPPY BLOCK #. MQL / DISPLAY IT. TAD I ENTDX0 / SET UP FOR SECTOR MAPPING. CLL RTL / 4 * BLOCK #. DCA DSKADR ISZ ENTDX0 CDF 0 / INIT TO FIELD 0 FOR PTR LOAD JMS CALADR / CALCULATE PAGE ADDRESS. TAD RETRYC; DCA I JXEQSUB / SET RETRY COUNTER. ISZ JXEQSUB / BUMP TO SUBROUTINE ENT. / PRESERVE TRNADR, WRDCNT FOR RESTORE ON RETRY. TAD DSKADR; DCA DSKADL / DO TOTAL RETRY ON ERROR. TAD WRDCNT; DCA WRDCNL / SAVE INITIAL WRDCNT TAD TRNADR; DCA TRNADL / SAVE INITIAL TRANSFER ADDR. / DO THE READ OR WRITE. DORDWT, TAD FUNCT; SNA CLA; JMP RDWRITE / 2 => READ. TRNDTL, TAD WRDCNT; AND B77 / NEW SECTOR ? SZA CLA; JMP XFDTA / NO - TRANSFER DATA. CDFDAT, CDF 0 JMS I JXEQSUB JMP RETRY / RESTORE WRDCNT, TRNADR ISZ DSKADR RDWRIT, TAD FUNCT JMS CMDSUB / DO FILL OR EMPTY BUFFER CMD. XFRFLD, CDF 0 / LOADED IN CALL SEQ. DECODE. XFDTA, TAD I TRNADR STRF; JMP .-1 XDR / TRANSFER A WORD OF DATA. DCA I TRNADR ISZ TRNADR P70, 70 ISZ WRDCNT; JMP TRNDTL CDF 0 / DATA FIELD 0 FOR XEQSUB TAD FUNCT; SZA CLA; JMP .+3 JMS I JXEQSUB; JMP RETRY / DO FINAL WRITE. ISZ ENTDX0 / DO OK RETURN CDFRET, CDF CIF 0 JMP I ENTDX0 / RETRY - RESET PARAMS BACK TO BEGIN OF SECTOR AND DO-RD-WT RETRY, TAD DSKADL; DCA DSKADR / RE-INIT VARIABLES FOR RETRY TAD TRNADL; DCA TRNADR / TRANSFER ADDRESS. TAD WRDCNL; DCA WRDCNT / AND WORD COUNT JMP DORDWT / RELOAD SECTOR BUFF AND RETRY. TRNADL, 0 WRDCNL, 0 RETRYC, -6 / RETRY 5 TIMES AFTER INITIAL ERROR. B77, 77 TRNADR, 0 / CORE TRANSFER ADDRESS. WRDCNT, 0 / - # WORDS TO BE TRANSFERRED. JXEQSUB, XEQSUB / CALCULATED RUN-TIME PTR TO XEQSUB PAGE / XEQSUB - XEQUTE A READ OR WRITE SECTOR. ERRCNT, 0 / RETRY COUNTER SET BEFORE CALL. XEQSUB, 0 TAD XEQSUB; AND P7600 / GET CALLING PAGE DCA JFNCTU / POINTER TO FUNCTION WORD + UNIT TAD JFNCTU; IAC; DCA JDSKADR TAD I JFNCTU / 2=READ, 0=WRITE. JMS WLCDSB / WAIT TILL PREVIOUS OPERATION FIN. DCA TRACK STL TAD I JDSKADR CNVLP, SZL ISZ TRACK TAD M13D / SECTORS / TRACK REVOLUTION. SMA; JMP CNVLP CML RAL / 2*(-#SECTORS+LINK VAL) TAD P27 / MAKE INTO SECTOR OFFSET. STRF; JMP .-1 XDR / LOAD THE SECTOR CLA / AC UNCHANGED BY XDR IN TAD TRACK STRF; JMP .-1 XDR / LOAD THE TRACK P7600, CLA+400 TAD P7130 / DO A NOP COMMAND TO RAISE DONE AGAIN JMS WLCDSB SERF; JMP NOERRT / DO NORMAL SKIP RETURN / ERROR DETECTED - PRINT COMPLETE STATUS. PNTERR, TAD P155; JMS PCHAR / CR TAD P152; JMS PCHAR / LF JMS PRINTC; 6564 / "UT= " TAD I JFNCTU / 4, 24, 44 ( + 2 IF READ) CLL RAR / 0 0 0 0 0 0 0 U U 0 1 R JMS PNTOCT / UNIT+2 IF WRITE, UNIT+3 IF RD JMS PRINTC; 4253 / "BK= " TAD I JDSKAD / 4 * OS/8 BLK # CLL RAR; CLL RAR JMS PNTOCT JMS PRINTC; 6364 / "ST= " XDR / STATUS FLAGS JMS PNTOCT TAD CMDERF; JMS WLCDSB / DO A "READ DEFINITIVE STT JMS PRINTC; 4543 / "EC= " XDR JMS PNTOCT INIT ISZ ERRCNT; JMP I XEQSUB / DIRECT RETURN = ERROR P7130, STL RAR ISZ JFNCTU / BUMP FOR FATAL ERR RETURN JMP I JFNCTU / RETURN TO FATERR EXIT NOERRT, ISZ XEQSUB; JMP I XEQSUB / DO SKIP RETURN. JFNCTU, 0 / POINTER TO UNIT CODE + FUNCTION JDSKAD, 0 TRACK, 0 CMDERF, 116 / DEFINITIVE ERROR STATUS FUNCTION. (8 BIT MODE) P27, 33 M13D, -15 / WLCDSB - WAIT AND LOAD COMMAND SUB WLCDSB, 0 SDNF; JMP .-1 LCDR JMP I WLCDSB *525 PNTOCT, 0 DCA TEMPC P152, TAD M4; DCA TEMP1 JMS PRINTC; 3500 / PRINT "= " PNTOLP, TAD TEMPC; CLL RTL; RAL; DCA TEMPC TAD TEMPC; RAL; AND P7 / GET A DIGIT. TAD P20; JMS PCHAR ISZ TEMP1; JMP PNTOLP JMS PRINTC TEMP1, 0 / USE AS 0 FOR 2 SPACES JMP I PNTOCT TEMPC, 0 / OCTPNT TEMPORARY OFR NUMBER SAVE. M4, -4 P7, 7 P77, 77 P240, 240 P20, 20 PRINTC, 0 TAD I PRINTC; BSW / CAUTION ON NON 8-E MACHINES AND P77; JMS PCHAR TAD I PRINTC; AND P77; JMS PCHAR ISZ PRINTC JMP I PRINTC PCHAR, 0 P155, TAD P240 TLS TSF; JMP .-1 CLA JMP I PCHAR $ $ $ $ $ $ $