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 
                                                                                                                          