/ DSDH HANDLER FOR HIGH DENSITY FLOPPY 11/2/76 / X21HDN.PA 2/7/77 / USES 8 BIT MODE PACKING SCHEME FOR MAXIMUM EFFICIENCY. / THUS AVAILABLE SPACE = 658(10) =1222(8) BLKS INSTEAD OF / OS/8 SPACE = 494(10) = 756(8) BLKS. / IF TRACK 0 USED THEN = 667(8) = 1233(8) BLKS. (+ 35% ) / HARDWARE ASSUMPTIONS MADE. ASSUMES EITHER DONE OR TRREQ WILL / BECOME SET, AND DOESN'T COUNT BYTES TRANSFERRED. / CAUTION: THIS HANDLER WILL MODIFY THE 2ND PAGE OF A BLOCK / IF ONLY THE FIRST PAGE IS SPECIFIED TO BE WRITTEN. / ENTRANCE POINT REFERS TO LOGICAL DRIVE 1 ONLY. / THIS IS A 2 PAGE HANDLER WITH ASCII DUMP TO CONSOLE DEVICE / OF COMPLETE ERROR STATUS WHENEVER ANY ERRORS ARE DETECTED. / PRINTS "CM= BK=<3*OS/8 BLK#> ST= / "EC= / 24 = WRITE DRIVE 1, 26 = READ DRIVE 1 / 3 * VALUE IN DIRECTORY LISTING. / SEE XDR - BIT 10=>PARITY, BIT11 =>CRC ERROR / < > SEE PAGE 2 TABLE FOR CODE INTERPRETATION. / STANDARD OS/8 CALL SEQUENCE USED BY DRIVER. / JMS DSDHEN / 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 12 BIT MODE READ, JAMS DATA INTO AC / IF 8 BIT MODE READ, OR'S 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. SAM2=STA CLL RAL / 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. / NOTE - THE USER OF THIS HANDLER MUST PATCH - THE DEVICE / LENGTH IN OCTAL INTO PIP AT LOCATION 13600 + DEVICE TYPE# / FOR DEVICE TYPE 55 PATCH 13655 TO 6556 ( = -1222) / NOTE: THIS HANDLER DOES NOT WRITE COMPATABLE FILES WITH THE / NORMAL NON-SYSTEM FLOPPY HANDLER / 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 -1 / ONLY ONE ENTRANCE POINT. DEVICE DSDH; DEVICE HDX; 4550; 4000+DSDHEN-DRVBEG; 0; 0 *200 DRVBEG, / BEGINNING FOR RELOCATION PURPOSES TRNADR, 0 / CORE TRANSFER ADDRESS. LOADPT, 0 / WORKING POINTER. WRDCNT, 0 / - # WORDS TO BE TRANSFERRED. WRDPCT, 0 / - # WORD PAIRS TO BE TRANSFERRED. / ENTRANCE FOR RETURN TO CALLER. RETOK, ISZ DSDHEN / DO OK RETURN. TAD P7130; LCDR / INSURE DONE UP FOR EXIT. CDFRET, CDF CIF 0 JMP I DSDHEN / DO RETURN FUNCT, 0 / 2 = READ, 0 = WRITE. LODMOD, 0 / SET -1 TO LOAD HIGH 4 BYTES 400 WDS / SET =0 TO LOAD LOW 8 BITS FIRST 200 WDS / SET =1 TO LOAD LOW 8 BITS LAST 200 WDS. / SUBROUTINE TO PACK HIGH 4 BITS OF A WORD INTO LOW 4 TMPWDR, / TEMP WORD FOR READING. GTHG4S, 0 TAD I LOADPT; ISZ LOADPT / GET S WORD AND M7400 / HIGH 4 BITS TAD TMPWDW; RTL; RTL / PUT INTO LOW ORDER JMP I GTHG4S / PUT ENTRANCE POINT AT RKA3 POSITION. / MUST MOVE IF THIS HANDLER IS TO BE OPERATED WITH AN RKA3: /********************************************************** DSDHEN, 0 CLA STL RAR / AC = 4000, L=0 TAD I DSDHEN / GET FUNCTION WORD AND P70 / EXTRACT TRANSFER DATA FIELD. TAD CDFDAT; DCA XFRFLD / SET UP FOR TRANSFER CML RTL; DCA FUNCT / 0 = WRITE, 2 = READ. TAD I DSDHEN; RAL / GET PAGE COUNT AND B7600; CIA; DCA WRDCNT / MAKE INTO WORD COUNT. TAD WRDCNT P7130, STL RAR; DCA WRDPCT / WORD PAIR COUNTER. ISZ DSDHEN RDF; TAD WRTFIN; DCA CDFRET / SET UP RETURN DATA FIELD TAD I DSDHEN; DCA TRNADR ISZ DSDHEN TAD I DSDHEN; CLL RAL TAD I DSDHEN; MQL / DISPLAY 3 * OS/8 BLOCK # / DISK BLOCK # TAKEN FROM MQ ON 2ND PAGE. ISZ DSDHEN SDNF; JMP .-1 CDFDAT, CDF 0 / SET TO 0 FOR DISK DRIVER. BLKLP, CLL STA; DCA LODMOD / SET LOADING MODE TO HIGH 4 BITS SCTRLP, TAD FUNCT; SZA; JMS RWSUB / READ PRIOR TO EMPTY BUF. / FILL OR EMPTY (100 OR 102) BUFFER IN 8 BIT MODE. TAD FUNCT; TAD RXFL8 / FILL/EMPTY BUF CMMD. LCDR TAD LODMOD; SMA SZA CLA / SET = -1 TO XFER HIGH 4 BITS (256) JMP .+3 / SET = 0 TO LOAD LOW 8 BITS (128 WDS) TAD TRNADR; DCA LOADPT / RESET POINTER IF MODE -1 OR 0 XFRFLD, 0 / LOADED WITH CDF TRANSFER FIELD FOR DATA XFER. ISZ LODMOD / BUMP TO NEXT MODE JMP LDLW8 / DO LOW 8 BIT LOAD IF MODE NOT -1 TAD FUNCT; SNA CLA; JMP WTHG4B / DO FILL MODE. / IF MODE WAS -1 THEN READ HIGH 4 BITS OF 400 WORDS. RDHG4B, JMS XDRSUB / GET A BYTE JMS RDHG4S / LOAD HIGH 4 BITS INTO CORE. TAD TMPWDR / GET SHIFTED WORD BACK JMS RDHG4S / AND LOAD IN NEXT SEQ. ADDR (HIGH NIBBLE) ISZ WRDPCT; JMP RDHG4B / LOOP TILL DONE FLAG COMES UP / DOES DISPATCH FROM INSIDE XDRSUB JMS XDRSUB; JMP .-1 / DON'T XFER ON WRDCNT OVERFLOW. TMPWDW, / TEMP WORD FOR WRITING. RDHG4S, 0 RTL; RTL / SHIFT 4 BITS LEFT DCA TMPWDR; TAD TMPWDR AND M7400; DCA I LOADPT / LOAD HIGH 4, ZERO LOW 8 BITS ISZ LOADPT RXFL8, 100 / FILL BUFF IN 8 BIT MODE. JMP I RDHG4S / SECTION TO WRITE HIGH NIBBLE. WTHG4B, CLA CLL; DCA TMPWDW / ZERO IT EVERY WRD PAIR. JMS GTHG4S; DCA TMPWDW / MODE -1, WRITE HIGH 4 BITS. JMS GTHG4S; RAL / PUT INTO LOW BYTE POSITION. JMS XDRSUB JMP WTHG4B / LOOP TO MERGE IN LOW 8 BITS IN MODE 0 AND 1. / USED IN BOTH READ AND WRITE MODES. LDLW8, TAD I LOADPT / GET ORIGINAL CONTENTS FOR ORING JMS XDRSUB / DOES LOGICAL OR IN 8 BIT MODE. DCA I LOADPT ISZ LOADPT P70, 70 / MASK FOR DATA FIELD EXTRACTION ISZ WRDCNT; M7400, 7400 JMP LDLW8 / SDNF; HLT / SHOULD BE UP / JMP WRTFIN / DO FINAL WRITE. / ROUTINE TO DO BYTE TRANSFER. / DOES FINAL WRITE IF WRITE COMMAND AND / EXITS TO BLKLP WHEN BUFFER XFER COMPLETE. XDRSUB, 0 STRF; JMP NOTYET / DATA NOT AVAILABLE YET OR DONE. XDR JMP I XDRSUB NOTYET, SDNF; JMP XDRSUB+1 / CONTINUE WAITING. WRTFIN, CDF CIF 0 / RESET DATA FIELD TO 0 B7600, CLA+400; TAD FUNCT / SKIP IF READ FUNCTION. SNA CLA; JMS RWSUB / DO THE WRITE / NOTE THAT WRDPCT IS USED IN MODE 0 SO EXIT ONLY ON MODE 1 OR 2 / EXIT ON MODE 1 OR 2 IF WRDCNT = 0. TAD WRDCNT; SNA CLA; JMP RETOK / DO DONE EXIT. / FINISHED MODE 2 AND WRDCNT NOT ZERO? SAM2; TAD LODMOD / RECYCLE ON MODE 2? SZA CLA; JMP SCTRLP / NO - DO NEXT MODE = 1,2 TAD LOADPT; DCA TRNADR / YES - UPDATE FOR NEXT TRANSFER JMP BLKLP *DRVBEG+175 / CALLED WITH 0 OR 2 IN AC FOR FUNCTION CODE. / MQ CONTAINS OS/8 BLOCK #. RWSUB, 0 / PUT THE BURDEN ON PAGE 2. CLL RTR / PUT RW FLAG INTO LINK TAD RWSUB / PASS RET ADDR IN AC. / COS BLK MAPPING USES 3 WAY INTERLEAVE / BLK 10 = T1 S25, T1 S30, T2 S1 / BLK 11 = T2 S4, T2 S7, T2 S12 / BLK 12 = T2 S15, T2 S20, T2 S23 / BLK 13 = T2 S26, T2 S31, T2 S2 DCA RWSUBR / STORE RETURN ADDRESS. RTL / LINK INTO 0 OR 2 FUNCTION. TAD UNITCD; DCA RWFUNC / AC = 0 ON CALL FOR WRITE, 2 = READ. TAD M4; DCA RETRYC / SET RETRY COUNTER. MQA; DCA DSKADR / 'OR' IN DISK ADDRESS MQA; IAC; MQL / INCREMENT IT BY 1 IN MQ RWRETR, TAD RWFUNC; LCDR / LOAD THE OPERATION. DCA TRACK / CLEAR FOR CONVERSION. TAD DSKADR BLKCNV, TAD M26D / DIVIDE BY 26 SECTORS / TRACK. SNL; JMP .+4 / CONTINUE TILL OVERFLOW OCCURS. ISZ TRACK CLL; JMP BLKCNV DCA TMPSCT / NEGATIVE REMAINDER. TAD TMPSCT; CLL RAL / 2 * REMAINDER. TAD TMPSCT / 3 * REMAINDER TAD P26D; SPA; JMP .-2 / GET A SECTOR # MOD 26 IAC / PUT IN 1 - 26. RANGE STRF; JMP .-1 / WAIT FOR TRNREQ XDR / LOAD IT AS SECTOR #. CLA IAC; TAD TRACK / GET TRACK # (1 - 77) STRF; JMP .-1 / WAIT FOR TRNREQ. XDR / LOAD TRACK VALUE. SDNF; JMP .-1 / WAIT FOR READ COMPLETE. P7600, CLA+400 SERF; JMP I RWSUBR / RETURN IF NO ERROR. / ERROR DETECTED - PRINT COMPLETE STATUS. PNTERR, TAD P155; JMS PCHAR / CR TAD P152; JMS PCHAR / LF JMS PRINTC; 4355 / "CM= " TAD RWFUNC / 24 ( + 2 IF READ) JMS PNTOCT / 24 = WRITE, 26 = READ. JMS PRINTC; 4253 / "BK= " MQA / 'OR' IN OS/8 BLOCK #. JMS PNTOCT JMS PRINTC; 6364 / "ST= " XDR / STATUS FLAGS JMS PNTOCT TAD CMDERF / DO A "READ DEFINITIVE STT LCDR SDNF; JMP .-1 JMS PRINTC; 4543 / "EC= " XDR JMS PNTOCT ISZ RETRYC; JMP RWRETRY / RETRY IT . INIT TAD RWSUBR; AND P7600 / GET CALLING PAGE TAD P7; DCA RWSUBR / RETURN ADDR FOR FAT ERR CLA STL RAR / SET AC = 4000 JMP I RWSUBR IFNZRO CDFRET&177-7 RWSUBR, 0 RETRYC, 0 / RETRY COUNTER. CMDERF, 116 / DEFINITIVE ERROR STATUS FUNCTION. (8 BIT MODE) DSKADR, 0 / 3* BLOCK # AS INCREMENTED. UNITCD, 24 / WRITE DRIVE 1. RWFUNC, 0 / 26 = READ DRIVE 1, 24 = WRITE DRIVE 1. M26D, -32 / # SECTORS / TRACK. P26D, 32 / + 26. SECTORS / TRACK. *DRVBEG+325 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 TRACK, / USED AS TEMPORARY FOR TRACK CALCULATION 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 TMPSCT, / USED AS TEMPORARY IN SECTOR # CALCULATION. PCHAR, 0 P155, TAD P240 TLS TSF; JMP .-1 CLA JMP I PCHAR $ $ $ $ $ $ $