ASMB,R,L,C * * NAME: ID.43 * SOURCE: 92071-18096 * RELOC: 92071-16096 * PGMR: C.H.W.,N.J.S. * * **************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. 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 ID.43,0 92071-16096 REV.2041 800613 * ENT PI.43,ID.43,$PIFT ENT $$POW,$.POW * EXT $DB,$IOTI,$LIST,$MAP,$POWF,$XQT EXT $NAME,$MESS,$IOCX EXT $IFTA,$IFT#,$DVTA,$DVT# EXT $MAPF,$MAPS,$MPTF,$Q.PV,$TIME,$MPFN * * A EQU 0 B EQU 1 SC.0 EQU 0 SC.2 EQU 2 SC.4 EQU 4 SC.6 EQU 6 SC.7 EQU 7 SC.11 EQU 11 SC.15 EQU 15 SUP * * * * THIS IS THE RTE-L POWER FAIL AUTO RESTART ROUTINE. * * ID.43 REQUIRES AN IFT ENTRY: * 04,ID.43 * * ID.43 REQUIRES AN INTERRUPT ENTRY: * 04,ENT,PI.43 * * * * IT WORKS AS FOLLOWS: * * ON POWER FAILURE: * 1. LEVEL 2 (POWER-FAIL) & LEVEL 3 INTERRUPTS ARE DISABLED * 2. ALL REGISTERS ARE SAVED, ALSO RETURN ADDRESS * 3. THE DRIVER WAITS FOR POWER TO BE RESTORED (HLT 4). * * ON POWER UP: * 1. THE CURRENT SYSTEM TIME IS SAVED (THIS WILL BE THE * TIME OF POWER FAILURE). * 2. THE CLOCK IS RESTARTED * 3. THE IFT FOR THE POWER-FAIL DRIVER IS QUEUED ON THE * SYSTEM "PRIVILEGED DONE QUEUE" AND IFT7(15) IS SET * SO ID.43 WILL BE REENTERED FROM THE SYSTEM ON A * CONTINUATION. * 4. LEVEL 2 & 3 INTERRUPTS ARE REENABLED AND A RETURN WITH * REGISTERS RESTORED IS MADE TO THE POINT OF THE * POWER FAIL INTERRUPT. * * * ON THE FOLLOWING CONTINUATION ENTRY THE FOLLOWING ACTION IS * TAKEN: * * 1. THE PHYSICAL DRIVER FOR EACH IFT ENTRY IS CALLED (USING * "$POWF" IN IOC) FOR A POWER-FAILURE. * 2. EACH DVT ENTRY WHICH IS BUSY WITH A REQUEST HAS IT'S * "P"-BIT CHECKED. IF SET, AND A LOGICAL DRIVER EXISTS, * IT IS CALLED FOR A POWER-FAIL. * * SOME DEVICES WILL BE REPORTED DOWN IF THEIR POWER * WAS ALSO CUT E.G. MAGTAPE, DISC. THESE DEVICES * MAY BE UPPED BY THEIR DRIVERS WHEN THEY * COME BACK ON LINE E.G. THE DISC. * * 3. IF THE DEVICE IS DOWN THE SYSTEM UP PROCESSOR WILL * BE CALLED TO UP THE DEVICE. THIS WILL CAUSE * THE DOWNED DEVICES TO HAVE NEW MESSAGES POSTED * ON THE SYSTEM TTY. * * 4. THE PROGRAM "AUTOR" IS CHECKED, AND IF DORMANT, IT IS * SCHEDULED AND PASSED THE TIME OF THE LATEST POWER-FAIL. * IF IT IS NON-DORMANT, IT IS ABORTED WITH A "$MESS" CALL * AND ID.43 PUTS ITSELF IN THE TIME LIST FOR 100 MSECS. * WHEN ID.43 IS REENTERED ON A TIMEOUT, IT RETRIES TO * SCHEDULE AUTOR (UP TO 100 TIMES). * (THE ABORT IS TO ALLOW FOR MOMENTARY POWER UPS.) * AUTOR SHOULD TAKE WHATEVER ACTION IS NEEDED TO * BRING UP THE SYSTEM IN TERMS OF ENABLING TERMINALS - * COMMUNICATION LINES ETC. * * * NOTE THE FOLLOWING: * THE 21-L PROCESSOR ALLOWS 10 MILLISECONDS OF POWER-DOWN * PROCESSING FOLLOWING THE DOWN INTERRUPT, THEREFORE THIS * DRIVER ACTUALLY DISABLES THE P.F. INTERRUPT DURING CRITICAL * PORTIONS OF PROCESSING TO SIMPLIFY P.F. REENTRANCE AVOIDANCE * TECHNIQUES WHICH WERE PREVALENT IN PREVIOUS RTE P.F. DRIVERS * * THE POWER-FAIL IFT IS ALWAYS CREATED WITH "M" SET SO THAT * ONLY ID.43 ITSELF WILL PLACE THE IFT IN THE TIME-LIST USING * THE IOC "IOTI" ROUTINE. HED POWER UP/DOWN ENTRY POINT/ DOWN CODE. PI.43 NOP POWER UP/DOWN ENTRY CLC SC.4 DISABLE LEVEL 2 & 3 INTERRUPTS SFC SC.4 UP? JMP UP YES, GO RESTORE MACHINE STATE * * DOWN ROUTINE * STA ASAVE SAVE A-REG LIA SC.0 STA IMASK SAVE INTERRUPT MASK LIA SC.2 SFS SC.2 SKIP IF GLOBAL REG DISABLED IOR BIT15 BIT15=1 WHEN ENABLED CLC SC.0,C DO CRS, INITIALIZE/STOP ALL I/O CLC SC.4 & LEAVE P.F. INTERRUPT OFF STA GLOBL SAVE GLOBAL REGISTER STB BSAVE SAVE B-REG ERA,ALS SOC SET LEAST BIT OF A IF OVERFLOW INA WAS SET, SIGN = E REG STA EOSAV SAVE E/O LDA PI.43 SAVE INTERRUPT STA PSAVE LOCATION CLA CPA SWTCH LAST A DOWN? JMP HALT YES! 2 SUCCESSIVE DOWNS BUY THE FARM STA SWTCH INDICATE LAST WAS SUCCESSFUL DOWN * * WAIT FOR POWER-UP, IF POWER GOES ALL THE WAY DOWN, "UP" * WILL BE REENTERED BY INTERRUPT. WAIT SFS SC.4 JMP *-1 HED POWER UP ROUTINE UP LDA SWTCH SZA LAST A DOWN? JMP HALT NO! 2 SUCCESSIVE UP'S * LDA TIME+2 IF TIME IN HAND SZA THEN DO NOT JMP NIXTM SAVE IT AGAIN * DLD $TIME GET THE TIME OF DAY DST TIME AND SAVE IT LDA $TIME+2 GET ADDRESS STA TIME+2 * NIXTM STC SC.6 START TBG LDA STC7 INSTRUCTION TO ENABLE M.P. LDB $MPTF GET SYSTEM MEMORY PROTECT FLAG SZB DID P.F. COME WHILE IN THE SYSTEM LDA STC4 YES, LEAVE MEMORY PROTECT DISABLED STA SWTCH * LDA STC11 INSTRUCTION TO ENABLE MAPPING LDB $MAPF GET SYSTEM MAPPING FLAG CCE,SZB DID POWER FAIL WHILE MAPPED? LDA STC4 NO - LEAVE MAPPING OFF STA SWTMA * * NOW ENTER THE POWER-FAIL IFT ON THE PRIVILEGED DONE QUEUE * SO THAT THE SYSTEM WILL REENTER ID.43 ON A NORMAL CONTINUATION * JSB ONPRV SEE IF ALREADY ON PRIV QUEUE JMP REGUP IT IS, DON'T LINK IT TO ITSELF LDA $Q.PV HEAD OF PRIVILEGED DONE QUEUE STB $Q.PV PUT P.F. IFT AT HEAD (LIFO) STA B,I ADB N1 POINT TO IFT7 LDA B,I RAL,ERA SET BIT 15 STA B,I FORCING CONTINUATION RETURN * LDA N64 HAVE TO RESTORE THE HARDWARE STA COUNT MAP AND RELOCATION REGISTERS LDB $MAP (MEMORY VALUES WERE SAVED WITH RSTR LDA B,I BATTERY BACKUP) STA B,I INB ISZ COUNT JMP RSTR * REGUP LDA EOSAV RESTORE THE REGISTERS CLO SLA,ELA STO * LDA IMASK OTA SC.0 RESTORE INTERRUPT MASK LDA GLOBL OTA SC.2,C RESTORE/ENABLE GLOBAL REG SSA,RSS WAS IT DISABLED? STF SC.2 YES LDA $MPFN OTA 7 RESTORE MEMORY PROTECT FENCE LDB BSAVE CLC SC.15 TURN OFF ANALYZER LDA $DB GET DEBUG FLAG SSA,RSS DEBUGGING ALL OR CPA $XQT DEBUGGING THE CURRENT PROGRAM? STC SC.15 YES - TURN THE ANALYZER ON LDA ASAVE RESTORE A-REGISTER STF SC.0 STC4 STC SC.4 ENABLE LEVEL 2 & 3 INTERRUPTS SWTMA STC SC.11 ENABLE MAPPING UNLESS IN SYSTEM SWTCH STC SC.7 ENABLE M.P. UNLESS IN SYSTEM JMP PSAVE,I RETURN TO POINT OF INTERRUPT * SPC 3 STC7 STC SC.7 STC11 STC SC.11 ASAVE NOP BSAVE NOP EOSAV NOP IMASK NOP GLOBL NOP COUNT NOP * .2 DEC 2 .3 DEC 3 .6 DEC 6 .7 DEC 7 .12 DEC 12 .20 DEC 20 .22 DEC 22 BIT15 OCT 100000 N1 DEC -1 N10 DEC -10 N64 DEC -64 N100 DEC -100 B177 OCT 177 B777 OCT 777 * IDSGA NOP NCNT NOP TRIES NOP ABFLG NOP PSAVE DEF HALT P-REG SAVE (HLT DEF IF HALTED) TIME DEC 0,0,0 TIME SAVE LOCATION ON UP ATIME DEC 0,0,0 TIME TO PASS TO "AUTOR" $PIFT NOP * HALT HLT SC.4,C JMP *-1 HED NON-PRIVILEGED POWERFAIL PHYSICAL DRIVER * ID.43 NOP CPA .3 ENTERED ON TIMEOUT? JMP SCHED YES, RETRY AUTOR SCHEDULE CPA .2 CONTINUE? JMP CONT YES CLA ISZ ID.43 GET OUT IMMEDIATELY JMP ID.43,I PHY CONTINUE EXIT * * JUST POWER-UP'ED, PERFORM POWER-FAIL ENTRY TO DRIVERS * CONT LDA $IFT# # OF IFTS IN SYSTEM LDB $IFTA ADDRESS OF IFTS CMA,CCE,RSS DVRPF CMA,CLE STA NCNT - # OF TABLE ENTRIES -1 * DVRNX ISZ NCNT MORE ENTRIES? JMP DCALL YES * LDA $DVT# # OF DVTS LDB $DVTA ADDR OF DVTS SEZ ALREADY DID DVTS? JMP DVRPF NO, GO DO THEM * * ALL I/O REQUEST RECOVERY IS COMPLETED * LDA N100 STA TRIES TRY UP TO 100 TIMES TO SCHED AUTOR * SCHED JSB $NAME GET ID SEG ADDR OF "AUTOR" DEF AUTOR SZB,RSS IS IT IN SYSTEM? JMP $IOCX NO, DONE CCE,SZA IS IT DORMANT? JMP AUTBZ NO STB IDSGA SAVE AUTOR ID SEG ADDR * DISABLE ANY P.F. INTERRUPT TIL AUTOR IS SCHEDULED CLC SC.4 LDB ABFLG STA ABFLG FLG THAT AUTOR WAS DORMANT SZB DID LAST AUTOR RUN FINISH? JMP TPASS NO, KEEP TIME IN HAND * LAST AUTOR SCHEDULE COMPLETED, SO LATEST TIME OF * POWER-FAIL ("TIME") CAN NOW BE PASSED LDA TIME STA ATIME LDA TIME+1 STA ATIME+1 LDA TIME+2 STA ATIME+2 STB TIME+2 "UP" CAN NOW SAVE TIME OF NEXT P.F. * * NOW SCHEDULE AUTOR & PASS THE TIME OF POWER-FAIL TPASS LDB IDSGA LDA ATIME INB STA B,I INB STB NXADR DLD ATIME+1 DST * PASS 2ND & 3RD TIME WORDS NXADR EQU *-1 * LDB IDSGA JSB $LIST SCHEDULE AUTOR OCT 60 RENBL STC SC.4 REENABLE POWER-FAIL INTERRUPTS JMP $IOCX EXIT * * AUTOR NON-DORMANT, ABORT IT ONCE & KEEP TRYING TO SCHEDULE * IT FOR 10 SECONDS AT 100 MILLISECOND INTERVALS. AUTBZ ISZ TRIES CCE,RSS * TRIED 100 TIMES WITHOUT SUCCESS, SO LEAVE JMP $IOCX * LDA N10 100 MSEC DELAY LDB $PIFT P.F. IFT ADDR JSB $IOTI PUT IFT IN TIME-LIST * CCA CPA ABFLG ALREADY ABORTED IT? JMP $IOCX YES STA ABFLG NO, SET FLAG THAT WE DID ABORT LDB $XQT SET UP MAPS FOR CURRENT PROGRAM JSB $MAPS LDA DOF LDB .12 JSB $MESS "OFF,AUTOR,FL" JMP $IOCX SHOULDN'T GET HERE * * PROCESS IFTS/DVTS FOR POWER-FAIL * DCALL STB NXADR SAVE ADDR OF NEXT IFT CLC SC.4 DISABLE LEVEL 2&3 INTERRUPTS JSB ONPRV SEE IF ANOTHER P.F. OCCURRED JMP RENBL IT HAS! GET OUT IMMEDIATELY STC SC.4 REENABLE LEVEL 2 & 3 INTERRUPTS LDB NXADR SEZ,RSS DOING DVT'S? JMP DCAL5 YES CPB $PIFT IS THIS THE P.F. IFT? RSS YES, DON'T CALL OURSELF * CALL I/O SYSTEM TO DO DRIVER POWER-FAIL ENTRY JSB $POWF E=1 IF IFTS, 0 IF DVTS LDB NXADR ADB .6 POINT TO IFT 7 LDA B,I GET LENGTH OF CONTIGUOUS AUX. AREA AND B777 IN BITS 8-0 ADB A ADD TO POINTER CCE,INB JMP DVRNX ITERATE * DCAL5 JSB $POWF DO DEVICE DRIVER POWER-FAIL LDB NXADR ADB .20 LDB B,I LSR 9 RIGHT JUSTIFY DVTP SIZE ADB .22 ADD DVT SIZE ADB NXADR POINT TO NEXT DVT CLE JMP DVRNX * * SUBROUTINE TO DETERMINE IF POWER-FAIL IFT IS ON THE * "PRIVILEGED DONE QUEUE". IF IT IS, A POWER-FAILURE * HAS OCCURED SINCE THE LAST ENTRY INTO THE ID.43 NON- * PRIVILEGED CONTINUATOR SECTION. * ONPRV NOP LDB $PIFT ADDR OF P.F. IFT SZB,RSS DOES IFT EXIST? JMP HALT NO, WE'RE OUT OF LUCK ADB .7 POINT TO IFT EXTENSION * CHECK TO SEE IF POWER-FAIL IFT ALREADY ON PRIV. DONE QUEUE LDA $Q.PV HEAD OF PRIVILEGED DONE QUEUE CPA B IS THIS THE P.F. IFT? JMP ONPRV,I YES, ON QUEUE, DO RTN+1 LDA A,I GET NEXT SZA MORE? JMP *-4 YES ISZ ONPRV DO RTN+2 JMP ONPRV,I * DOF DEF *+1 ASC 2,OFF, AUTOR ASC 4,AUTOR,FL * $$POW EQU * $.POW DEC 0 * END