ASMB,R,L,C HED DVR32 RTE MOVING HEAD DRIVER * NAME: DVR32 * SOURCE: 92060-18031 * RELOC: 92060-16031 * PGMR: G.A.A.,JSW,JJC * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1975. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** NAM DVR32,0 92060-16031 REV.2013 800130 ENT I.32,C.32 EXT .MVW,$UPIO,$CGRN,$OPSY EXT $TB32 TBXX EQU $TB32 SUP SPC 3 * THIS DRIVER OPERATES UNDER THE CONTROL OF * THE I/O CONTROL MODULE OF THE REAL-TIME EXECUTIVE. * THIS DRIVER IS RESPONSIBLE FOR CONTROLLING DATA * TRANSMISSION WITH A MOVING HEAD TYPE DISC FILE. * * THIS DRIVER MAKES THE MOVING HEAD DISC APPEAR TO * HAVE 64 WORD SECTORS, HOWEVER SPEED IS IMPROVED * IF THE DRIVER DOES NOT HAVE TO DO THIS PROCESSING. * * THIS IS DONE BY ALWAYS STARTING A READ REQUEST ON AN * EVEN SECTOR AND BY ENDING WRITE REQUESTS WITHIN. * ODD SECTORS. * * * ALL DATA TRANSFER IS DONE UNDER DMA CONTROL. * THE USER SPECIFIES TRACK AND SECTOR AND * LENGTH OF EACH REQUEST. * * THE USER MAY SPECIFY * CYCLIC CHECKING BE DONE ON WRITE REQUESTS * BY SETING SUBFUNCTION BIT 8 IN THE WRITE REQUEST. * A FAILED CYCLIC CHECK WILL CAUSE THE WRITE TO BE * RETRIED UP TO TEN TIMES. * * * SPECIAL SYSTEM REQUESTS: A GROUP OF TRANSFERS * MAY BE SPECIFIED BY AN INTERNAL SYSTEM * REQUEST (VIA ). THIS REQUEST HAS THE * SPECIAL FORMAT: * * (EQ T7,I) 'CONTAINS A POINTER TO A GROUP OF * 3 OR 4 WORDS CONTAINING THE BUFFER ADDRESS(WORD 1), * LENGTH(WORD 2) AND TRACK/SECTOR(WORD 3 OR IF SIGN * BIT IS SET ON WORD 3 THEN IT IS THE SECTOR (THE SIGN * IS STRIPED) AND WORD FOUR IS THE TRACK) ADDRESS FOR * EACH TRANSFER. THE GROUP OF TRANSFER VECTORS IS * OPEN-ENDED AND IS TERMINATED BY A ZERO-WORD. * ALL TRANSFERS ARE MADE BEFORE A COMPLETION * RETURN TO IS MADE. * * ******** WARNING ***************************************************** * * THIS DRIVER WILL CORRECTLY HANDLE MULTI-CPU, MULTI-DRIVE CONDITIONS * ONLY WITH THE LATEST FIRMWARE IN THE DISC CONTROLLER. IT WILL ALSO * HANDLE MULTI-DRIVE CONDITIONS WITH OLD FIRMWARE IN THE CONTROLLER. * HOWEVER, IF USED WITH OLD FIRMWARE IN A MULTI-CPU ENVIROMENT IT WILL * LIKELY PUT THE SYSTEM INTO A TIGHT INTERRUPT DRIVEN LOOP. * * THIS IS INTENDED AS THERE IS NO CORRECT ANSWER TO THE PROBLEM WITH OLD * FIRMWARE. THE TIGHT LOOP WILL OCCUR ON FIRST CONTENTION FOR THE LOCK * REQUEST AND WILL "HEAL" ON REMOVAL OF THE CONTENTION (OTHER CPU * UNLOCKS), SOLUTION: * GET NEW FIRMWARE!!! * ************************************************************************* SPC 4 ******* WARNING ******************************************************** * THIS DRIVER CONTAINS A SECTION OF CODE THAT TEMPORARILY MODIFIES * THE ALTERNATE MAP FOR THE ECC SCHEME (ERR CORRECTION) * OF THE 13037 CONTROLLER. * THE SECTION OF CODE AT LIMST SHOULD BE REVIEWED * WHEN THIS DRIVER IS PUT IN A NEW OP SYSTEM, TO VERIFY THAT * THE ASSUMPTIONS MADE IN THE CODE ARE STILL VALID. 800129 ************************************************************************** SKP RWSUB NOP READ/WRITE ROUTINE ENTRY * E = 0 WRITE * E = 1 READ * * B = BUFFER ADDRESS * A = -LENGTH IN WORDS SPC 3 STB UBUF SAVE BUFFER ADDRESS. STA LN.N SAVE LENGTH LDB TRACK GET THE TRACK AND BLF COMBINE WITH ADB UNIT THE UNIT CPB LTRK SAME AS IN LOCAL BUFFER? LDB BM10 YES; B_-8. LDA HDSC CHECK THE HEAD/SECT CPA LHDSC SAME AS IN LOCAL BUFFER? INB YES; B_B+1 LDA LN.N UNDER 129 WORDS SEZ,RSS IF WRITE JMP WRT1 GO DO WRITE TESTS * ADA D128 REQUESTED? CPB BM7 ALL CONDITIONS MET? SSA MET? JMP RD2 NO; GO READ * LDA LBUFA YES; SET FOR MOVE CPA UBUF IF DATA IS WANTED IN LOCAL JMP CLE BUFFER CLE AND RETURN * STA LBUFP SET UP FOR LDA LN.N MOVE LDB UBUF JSB MOVE AND MOVE DATA CLE CLE SET E FOR CONTINUATION JMP RWSUB,I RETURN B40 EQU CLE SPC 3 RD2 LDB UBUF READ; TO LOCAL CPB LBUFA BUFFER? STB LTRK SHOW LOCAL SECTOR BUFFER ENPTY WRT1 SSB,RSS IF SAME TRACK JMP WRIT DIFFERENT TRACK SKIP * ADA D128 AND REQUEST TO WRITE MORE THAN 128 CLE,SSA,RSS WORDS OR CPB BM7 TO WRITE ON LOCAL SECTOR STB LTRK YES; SET TO SHOW NONE IN WRIT JSB SEEK SEEK RECORD LDA DMAC GET THE DMA CONTROL WORD OTAD OTA 6 SEND TO THE DMA LDA RDCM GET THE READ COMMAND SEZ,CME,RSS READ? LDA WRCM NO - USE WRITE COMMAND STA SEEK SAVE THE COMMAND LDA UBUF GET BUFFER ADDRESS SEZ,RSS ADA MSIGN AND SET DIRECTION BIT CLCD2 CLC 2 SET FOR BUFFER OTAD2 OTA 2 SEND BUFFER ADDRESS LDA LN.N GET LENGTH STCD2 STC 2 SET FOR LENGTH OTAD3 OTA 2 SEND IT. CON LDA SEEK GET THE COMMAND JSB OUTCC AND SEND IT STCDC STC 6,C START DMA CLCD CLC 6 INHIBIT DMA INTERRUPT JSB WAITS GO WAIT FOR INTERRUPT STFD STF 6 FOURCE DMA COMPLETION LIAD2 LIA 2 GET RESIDUE FOR CORRECTION ALG. JSB STATS DO STATUS JMP WRIT ERROR; RETRY * JMP CON CONTINUE THE XFER AFTER CORRECTION * LDA UBUF WAS XFER TO LOCAL BUFFER CPA LBUFA ? RSS JMP RWSUB,I NO; RETURN * LDA TRACK UPDATE THE ALF ADA UNIT STA LTRK LOCAL BUFFER LDA HDSC GET THE CURRENT HEAD /SECTOR STA LHDSC SET HD/SECT WORD JMP RWSUB,I RETURN * TRACK NOP DMAC NOP DMA CONTROL WORD (SELECT CODE ONLY) HDSC NOP LTRK OCT -1 LHDSC NOP LN.N NOP UBUF NOP RDCM ABS READC READ COMMAND WRCM ABS WRITC WRITE COMMAND D128 DEC 128 BM7 OCT -7 SKP SPC 3 SEEK NOP SEEK ROUTINE * 1. SEEK RECORD WHOSE TRACK IS * IN TRACK, UNIT HDSC * 2. DO ADDRESS RECORD * 3. SEND THE FILE MASK SK2 JSB SEAD SEND THE SEEK COMMAND AND DATA ABS SEEKC+HOLD JSB WAITI WAIT FOR ATTENTION SK1 RAR,RAR MOVE SEEK CHECK BIT RAR,SLA,RAL TO LEAST A AND SKIP IF OK SLA IF NOT READY OR NO SEEK CHECK JMP SK3 CONTINUE THE PROCESS (GET NOT READY LATER) * JMP SK2 GO REISSUE THIS SEEK * SK3 JSB SEAD SEND ADDRESS RECORD ABS ADREC LDA FILM GET THE FILE MASK XOR UNIT CHEAT OUTC JSB OUTC AND SEND THE IT JMP SEEK,I RETURN * FILM OCT 7404 FILE MASK SPARING ONLY * * * SEAD NOP * SEAD SEND THE SEEK/ADDRESS RECORD * COMMANDS TO THE CONTROLLER * CALLING SEQUENCE: * * JSB SEAD * OCT COMMAND EITHER SEEK OR ADDRESS RECORD * * ASSUMES CYL = CYLINDER ADDRESS * HDSC= HEAD AND SECTOR * UNIT= UNIT ADDRESS * SEK2 LDA SEAD,I GET THE COMMAND JSB OUTC SEND IT TO THE CONTROLLER SFC1 SFC DC ACCEPTED? JMP SKOK YES CONTINUE * JMP NRERR ELSE TAKE NOT READY EXIT * * SKOK LDA TRACK GET THE CYLINDER ADDRESS OTA1 OTA DC,C AND SEND IT ISZ SEAD STEP TO RETURN ADDRESS JSB WAFLG WAIT FOR FLAG JMP NRERR IF NONE THEN NOT READY LDA HDSC NOW THE HEAD/SECTOR OTA2 OTA DC,C SEND IT JMP SEAD,I RETURN * B27 OCT 27 * * * OUTC SEND COMMAND TO THE CONTROLLER AND * WAIT FOR ACCEPTANCE * OUTC NOP JSB OUTCC SEND THE COMMAND JSB WFLS WAIT FOR THE FLAG JMP OUTC,I RETURN * * OUTCC SEND COMMAND TO INTERFACE DO NOT WAIT FOR FLAG. * OUTCC NOP CLC1 CLC DC SET 'HERE-COME-DE-WORD' XOR UNIT ADD/SUBTRACT THE UNIT OTA3 OTA DC,C SEND THE WORD JMP OUTCC,I RETURN * * * INWD WAITS FOR A FLAG AND THEN INPUTS ONE WORD TO A. * INWD NOP JSB WAFLG WAIT FOR THE FLAG JMP NRERR IF NO RESPONCE TAKE NOT READY EXIT * LIA1 LIA DC,C GET THE WORD JMP INWD,I RETURN * * * WAITI WAIT FOR INTERRUPT AND ANNALIZE REASON FOR INTERRUPT * IF NO STATUS BIT SET EXIT TO CALLER * ELSE DO STATUS AND: * 1. IF UNIT 10 GO TO HOL10 (TO COMPLETE HOLD) * 2. IF CURRENT UNIT RESTORE E AND RETURN * 3. IF NOT CURRENT UNIT IGNOR THE INTERRUPT AND * POSSIBLY CALL SYSTEM UP PROCESSOR * * WAITI DEF IGNOR INTERRUPT BEFORE EXPECTED IGNOR ELB SAVE THE E REG STB MOVE IN MOVE ENTRY POINT CLA CLEAR THE RETURN ADDRESS STA RTNCD SWITCH IGNO2 ISZ C.XX TAKE CONTINUATION INTERRUPT STC1 STC DC SET FOR INTERRUPT JMP C.XX,I RETURN * C.XX NOP INTERRUPT RETURNS TO HERE ISZ STACT IF TO IGNOR STATUS RSS THEN JMP WAIER JUST GO RETURN * JSB STATW THIS CALL ASSUMES WE HAVE CONTROLLER CPB D10 UNIT 10 WAKE UP? JMP HOL10 YES GO PROCESS IT * CPB UNIT THIS THE CURRENT UNIT? RSS YES SKIP JMP IGNOR NO GO PROCESS ATTENTION INTERRUPT * WAIER LDB MOVE RESTORE ERB THE E REG. JMP WAITI,I AND RETURN * * THIS WILL PUT A SYSTEM WITH * THE OLD CONTROLLER INTO A TIGHT LOOP- * USE NEW FIRMWARE WITH MULT-CPU * HOL10 LDA S1CD IF NOT SUCCESSFUL CPA B27 THEN JMP LOKEX GO EXIT * LDA EQT13,I ELSE JSB $CGRN CLEAR THE RN CLA AND THE STA EQT13,I LOCK 10 FLAG LOKEX LDB D10 * IGNOR CLA MUST BE ATTENTION STA EQT15,I OF SOME KIND CPB D10 IF UNIT 10 JMP WAK SKIP THE CORE SECTOR CLEAR * LDB WAITI IF WE DO NOT EXPECT AN CPB DIGNO INTERRUPT STB LTRK CLEAR IN CORE FLAGS. WAK JSB WAKEN SET UP WAKE UP OR END LDA EQT# GO TO SYSTEM LDB I.XX $IOUP IF SZB WE DID A JMP IGNO2 NOT READY * STC2 STC DC SET CONTROL FIRST JMP $UPIO NOW GO UP THE DEVICE * * * WAITS DOES WAITI WITHOUT STATUS * WAITS NOP CCA SET THE NO STATUS STA STACT FLAG JSB WAITI WAIT FOR THE INTERRUPT JMP WAITS,I RETURN * * RTNCD OCT 4 STACT NOP D10 DEC 10 HLD10 ABS RECAC+HOLD+10 USE RECALABRATE COMMAND TO HOLD UNIT NOP * * * * * * WAKEN CALLED BEFORE ANY EXIT FOR COMPLETION OR * AFTER AND UNEXPECTED INTERRUPT * * WAKEN NOP STB XOR SAVE B LDA ENDC PRESET TO SEND THE END COMMAND LDB WAITI IF WAITING FOR CPB DSK1 A SEEK TO COMPLETE JMP WAKX JUST END * LDB EQT13,I GET THE WAKE UP FLAG SZB IF NOT WAITING FOR 10 LDA HLD10 SKIP ELSE LOAD WAKE 10 COMMAND XOR UNIT FOOL OUTC WAKX JSB OUTCC SEND THE COMMAND LDB XOR RESTORE B JMP WAKEN,I RETURN * * ENDC ABS ENDCC DSK1 DEF SK1 DIGNO DEF IGNOR RETURN FOR IGNOR INTERRUPT * STATUS CHECK SECTION * STATUS MAY REQUIRE AND INTERRUPT IF CONTROLLER * IS NOT CONNECTED TO THIS CPU. * THE ERROR COUNTER IS RESET FOR EACH CORRECT * STATUS. * THE STATUS WORD IN THE EQT IS SET AS FOLLOWS * 0 - ANY ERROR * 1 - DRIVE BUSY (HEADS NOT OVER A TRACK) * 2 - DRIVE NOT READY (HEADS NOT LOADED => 1 ALSO) * 3 - SEEK CHECK (BAD ADDRESS-USUALLY WIPES SYSTEM) * 4 - FIRST STATUS * 5 - DRIVE FAULT * 6 - FORMAT SWITCH IS ON * 7 - PROTECT SWITCH IS ON * * * A WRITE TO A PROTECTED CYLINDER WILL * FOURCE A PARITY ERROR RETURN * UNLESS THE FORMAT SWITCH IS ON, IN WHICH * CASE THE WRITE IS RETRIED WITH A WRITE * INITIALIZE. * NOT READY WILL FOURCE A NOT READY RETURN * * * STATS NOP * * STATS CALLING SEQUENCE: * * LIA DMAWC/CLA,INA SET DMA RESIDUE IF DMA XFER ELSE 1 * JSB STATS * JMP RETRY RETRY THE TRANSFER (E= NOT E) * JMP CONT CONTINUE THE TRANSFER (E=E) * OK EXIT (E=E) * * THE FOLLOWING ACTIONS ARE TAKEN ON THE STATUS-1 WORD: * * STATS PROBLEM ACTION * * 00 NO ERROR OK - IF DMA RESIDUE = 0 EXIT ELSE RETRY * 07 CLY. COMP. ERR RECALIBRATE - RETRY EXIT * 10 DATA ERROR RETRY EXIT (UP TO 10 TIMES) * 11 HEAD/SECT COMP. RECALIBRATE - RETRY EXIT * 16 OVERRUN RETRY EXIT (UP TO 10 TIMES) * 17 CORR. DATA ERR TRY TO CORRECT THEN: * 1. IF FAIL RETRY EXIT (UP TO 10 TIMES) * 2. IF SUCCESS AND DMA RESIDUE = 0 * TAKE OK EXIT, ELSE IF RESIDUE = 1 * UPDATE VERIFY COUNTERS AND TAKE * CONTINUE EXIT, IF RESIDUE # 0 OR 1 * CONTINUE EXIT. * 20 ILLEGAL TRACK PARITY ERROR ABORT * 22 NOT READY RETRY EXIT * 23 STATUS-2 IF PROTECT THEN PARITY ERROR ABORT * ELSE NOT READY ABORT * 26 WRITE PROTECT IF FORMAT SWITCH ON RESET COMMAND * TO INITIALIZE WITH SPD BITS AND * TAKE CONTINUE EXIT, ELSE PARITY * ERROR ABORT * -- ALL OTHERS NOT READY ABORT * * STA WAKEN SAVE THE DMA RESIDUE JSB STATW DO THE STATUS REQUEST LDB S1CD GET THE STATUS-1 CODE SZB,RSS IF NO ERROR JMP OKEX THEN JUST EXIT * CPB B20 ILLEGAL TRACK? JMP PARER GO GIVE PARITY ERROR * CPB B26 WRITE PROTECT? JMP PARER GO CHECK THE SWITCH * CPB B23 STATUS-2 ERROR? JMP NR? GO CHECK FOR NOT READY * CPB B16 RETRY OVER RUNS JMP REXIT FOR EVER * ISZ ERCTR STEP ERROR COUNT RSS STILL OK SO CONTINUE JMP PARER TOO MANY ERROR - ABORT * CPB B7 FOR CYL. ERROR RSS * CPB B11 AND HEAD/SECT. COMP JMP RECAL TRY RECALABRATE * CPB B17 LAST CHANCE RSS RSS POSSIBLY CORRECTABLE ERROR * JMP REXIT NONE OF THE ABOVE TRY IT AGAIN * * POSSIBLY CORRECTABLE DATA ERROR. GET SYNDROME FROM CONTROLER * AND GIVE IT A TRY. * LDA RQSYN SEND THE COMMAND JSB OUTCC TO THE CONTROLLER JSB WAITS WAIT FOR INTERRUPT - NO STATUS LIA2 LIA DC,C GET UPDATED STATUS ALF,ALF AND STA SU SAVE IT JSB INWD BURN THE CYL. ADDRESS JSB INWD GET THE SECTOR STA WAITS SAVE IT JSB INWD GET THE DISPLACEMENT STA STATW AND SAVE JSB INWD NOW GET STA PAT1 AND JSB INWD SAVE STA PAT2 THE JSB INWD THREE STA PAT3 CORRECTION WORDS LDA SU GET THE UPDATED STATUS SLA,RSS IF NOT CORRECTABLE JMP REXIT TAKE RETRY EXIT * * CORRECTION ROUTINE USES THE FOLLOWING: * UBUF = BUFFER ADDRESS * -LN.N = ORIGIONAL TRANSFER WORD COUNT * WAITI = REMAINING WORD COUNT * * IF WAITI = 1 THEN ENTRY IS FROM VERIFY SO CORRECTION IS * NOT NEEDED. * LDB WAKEN GET THE DMA RESIDUE CPB B1 IF ONE JMP CKCNT GO SET UP TO CONTINUE VERIFY * LDA LN.N GET ORGIONAL LENGTH CMA,INA TO A SZB,RSS IF END OF TRANSFER JMP ZRORS DO SPECIAL * * * COMPUTE LOWER AND UPPER LIMITS IN BUFFER FOR FIXUP. * ADB DMABT RESTORE THE MISSING RESIDUE BITS ADA B GET UPPER LIMIT STA B SAVE IT LIMST ADA DM128 NOW LOWER LIMIT ADA UBUF ADD IN THE BUFFER ADDRESS ADB UBUF AND STA S1 SET THE LOW STB SU AND HIGH LIMITS XECC1 JMP CRECT /NOP (CNFG'D TO NOP FOR SYS W/ DMS) * CLB GET LOW PAGE# OF CORRECTION LSR 10 ADDRESS. STA INWD SAVE LOW PAGE IN TEMP(SUBR ENT PT) RSB WHICH MAP ARE WE EXECUTING IN?? BLF (MEM ST REG(BIT12)=0/1=SYS/USR) SLB,RSS CURR MAP=SYS?? IOR B40 YES-SET POINTER TO USR MAP STA OUTCC SAVE MAP REG# OF ALT MAP IN TEMP(SUBR) SPC 1 * SAVE 2 REGS OF ALTERNATE MAP CUZ WE'RE GONNA OVERLAY 'EM SPC 1 LDB BM2 GET 2 REGS: MAPS>TO>MEM CBX SIGN OF X SAYS DIRECTION LDB ABSS1 SAVE AREA FOR 2 ALT MAP REGS. XMM MOVE 2 FROM ALT MAP TO ABSS1 SPC 1 * SAVE 2 REGS OF CURRENT PORTMAP TO ABSS2 SAVE AREA SPC 1 LDA INWD GET PAGE# OF CORRECTION ADDR IOR B100 ADD OFFSET TO PORT A MAPS LDB OTAD3 GET CNFG'D I/O INSTRUCTION SLB USING PORT B CURRENTLY?? IOR B40 YES-ADJUST OFFSET TO PORT B LDB BM2 MOVE 2 REGS: PORTMAP>TO>MEM CBX INTO SAVE AREA AT ABSS2 LDB ABSS2 XMM MOVE 'EM SPC 1 * STUFF 2 REGS. OF CURRENT PORT MAP INTO ALTERNATE MAP FOR XOR SPC 1 LDA OUTCC GET MAP REG# OF ALT MAP LDB B2 LOAD 2 MAP REGS: MEM>TO>MAPS CBX FROM PORT MAP SAVE AREA LDB ABSS2 AT ABSS2 XMM MOVE 'EM * CRECT LDB S1 ADD LOW LIMIT+DISPLACEMENT & GET ADB STATW THE CORRECTION ADDR IN B REG. JSB XOR CORRECT PAT1 NOP THE JSB XOR DATA PAT2 NOP IN THE JSB XOR BUFFER PAT3 NOP * XECC2 JMP DONE? /NOP (CNFG'D TO NOP IF DMS SYSTEM) SPC 1 * RESTORE ALTERNATE MAP FROM ABSS1 SAVE AREA SPC 1 LDA OUTCC GET POINTER TO ALT MAP REGS. LDB B2 SET TO MOVE 2 REGS: MEM>TO>MAPS CBX FROM THE 2 WORD SAVE LDB ABSS1 AREA AT ABSS1. XMM RESTORE MAPS AS BEFORE * DONE? LDA WAKEN IF TRANSMISSION COMPLETE SZA,RSS THEN JMP OKEX TAKE OK EXIT * JMP CONEX ELSE TAKE CONTINUE EXIT * * ZRORS LDB A RESIDUE IS ZERO ADA B177 B GET UPPER LIMIT OFFSET AND DM128 ROUND A UP TO NEXT 128 WD. JMP LIMST CONTINUE CORRECTION. * * CKCNT LDA HDSC VERIFY IN PROGESS CMA,INA GET THE ORGIONAL HEAD ADDRESS ADA WAITS AND COMPUTE THE NUMBER CHECKED AND B377 INA STA HDSC SET THE NEW ORG. CMA,INA SUBTRACT ADA TVCNT FROM VERIFY COUNT JMP DONE? AND GO TEST IF DONE. * * RECAL LDA RECLC RECALABRATE JSB OUTCC THE DISC JSB WAITI WAIT FOR ATT. REXIT CME SET E TO NOT E FOR RETRY JMP STATS,I TAKE RETRY EXIT * RECLC ABS RECAC+HOLD * NR? ALF,ALF IF PROTECTED SEZ,SSA IF SWITCH OFF AND WRITE JMP PARER TAKE PARITY ERROR EXIT * JMP NRERR ELSE TAKE NOT READY EXIT * * OKEX LDA WAKEN IF DMA DISAGREES SSA JMP REXIT RETRY THE TRANSFER * LDB BM12 RESET THE ERROR STB ERCTR ON OK EXITS ISZ STATS STEP RETURN ADDRESS CONEX ISZ STATS LDB MOVE RESTORE ERB THE E REG. JMP STATS,I RETURN * * B1 OCT 1 B11 OCT 11 B16 OCT 16 B17 OCT 17 B20 OCT 20 B22 OCT 22 B23 OCT 23 B26 OCT 26 B160K OCT 160000 BM2 OCT -2 DMABT NOP HIGH DMA WORD COUNT BITS NOT RETURNED RQSYN ABS RQSYC TVCNT NOP INIAC ABS INITC * * XOR THIS ROUTINE DOES THE CORRECTION FOR CORRECTABLE * DATA ERRORS. * * CALLING SEQUENCE: * * SET S1 TO THE LOWER LIMIT * SU TO THE UPPER LIMIT * B TO THE BUFFER ADDRESS * JSB XOR * OCT PATTERN * RETURN B_B+1 * * THE PATTERN WILL BE XORED WITH THE WORD AT AND RESTORED TO * B,I IF AND ONLY IF S1<= B < SU. B IS ALWAYS INCREMENTED. * THE FIXUP IS ALWAYS DONE THRU THE ALTERNATE MAP IN * SYSTEMS WITH DMS (RTE-III/IV). (RTE-II CORRECTS IN CUR MAP.) * TWO REGISTERS OF THE ALTERNATE MAP ARE TEMPORARILY SET UP * FROM THE PORT MAP WHICH WAS USED FOR THE DMA XFER. TWO REGS * MUST BE SET UP INCASE THE 3 WORD XOR PATTERN CROSSES A PG BOUNDARY. * THE CURRENT MAP IS NOT USED FOR XOR BECAUSE WE MAY MAP OURSELF * OUT OF EXISTENCE WHEN THE PORT MAP IS COPIED IN. * XOR NOP LDA S1 GET LOWER LIMIT CMA,CLE,INA WATCH 'E' IT DOES ALL THE WORK ADA B SET 'E' IF S1<= B. LDA B NOW TEST UPPER LIMIT CMA,SEZ,CLE = IS BAD / SKIP IF LOW FAILED ADA SU SET 'E' IF B< SU SEZ,RSS IF OUSIDE LIMITS JMP EXXOR GO BUMP B AND EXIT * XECC3 JMP XORD /NOP (CNFG'D TO NOP IF DMS SYSTEM) * XLA B,I GET THE DATA XOR XOR,I FIX IT AND XSA B,I RESTORE IT TO DATA BUFFER. JMP EXXOR EXIT * XORD LDA B,I GET THE DATA(IT'S IN CUR MAP) XOR XOR,I FIX IT AND STA B,I RESTORE IT TO DATA BUFFER. * EXXOR INB STEP ADDRESS ISZ XOR STEP RETURN ADDRESS JMP XOR,I AND RETURN * * STATW NOP CORE STATUS ROUTINE GETS THE STATUS ONLY * LEAVES STATUS IN: * S1 STATUS WORD ONE * SU AND B STATUS UNIT RETURNED * S1CD ERROR CODE FROM S1 IN LOW PART * EQT5 AND A STATUS 2 ROTATED 1 BIT * LEFT LOW 8 BITS ONLY * CCA SET THE STATUS COMMAND IN PROGESS STA STACT FLAG TO PREVENT WAITI PROBLEMS LDA STC GET THE STATUS COMMAND JSB OUTCC SEND THE COMMAND (MUST NOT USE OUTC JSB WAFLG OR WFLS HERE SINCE THEY MAY JSB WAITI BE WAITING. LIA3 LIA DC,C GET THE FIRST STATUS WORD STA S1 SAVE IT AND B377 GET UNIT STA SU SAVE IT XOR S1 GET BACK HIGH PART ALF,ALF ROTATE TO LOW A AND B37 KEEP THE STATUS STA S1CD JSB INWD GET STATUS-2 WORD RAL ROTATE XOR EQT5,I PUT IN LOW EQT5 AND B377 UNDER THE RULES XOR EQT5,I OF WOO LDB S1 IF PROTECTED RBL SET SSB BIT IOR B20 4 STA EQT5,I LDB SU GET THE UNIT BACK TO B STB STACT CLEAR THE STATUS IN PROGESS FLAG JMP STATW,I AND RETURN * STC ABS STATC SU NOP S1 NOP S1CD NOP B37 OCT 37 * * * WAFLG WAITS FOR A FLAG FOR A TIME AND THEN RETURNS * P+1 IF NO FLAG IN TIME * P+2 IF A FLAG MADE IT IN TIME * WAFLG NOP LDB WCOUN PICK A TIME SFS1 SFS DC FLAG HERE YET? JMP WAFTB NO GO TEST TIMER * ISZ WAFLG YES STEP RETURN TO P+2 JMP WAFLG,I AND DO IT * WAFTB ISZ B TIME HERE YET? (ISZ FOR TO SAVE E REG.) JMP SFS1 NO TRY THE FLAG AGAIN * JMP WAFLG,I YES TAKE P+1 EXIT * * * WFLS WAIT FOR FLAG, IF NONE WAIT FOR INTERRUPT * * WFLS NOP JSB WAFLG FLAG WITHOUT INTERRUPT? JSB WAITS NO WAIT FOR INTERRUPT JMP WFLS,I RETURN * B377 OCT 377 BM12 OCT -12 WCOUN DEC -35 ERCTR OCT -12