ASMB,R
* 
*     NAME:   ID.43 
*     SOURCE: 92070-18096 
*     RELOC:  92070-16096 
*     PGMR:   C.H.W.
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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  92070-16096  REV.1941  800324
* 
      ENT PI.43,ID.43,$PIFT 
      ENT $$POW,$.POW 
* 
      EXT $IOTI,$LIST,$POWF 
      EXT $NAME,$MESS,$IOCX 
      EXT $IFTA,$IFT#,$DVTA,$DVT# 
      EXT $MPTF,$MPFN,$Q.PV,$TIME 
      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 4         DISABLE LEVEL 2 & 3 INTERRUPTS
      SFC 4         UP? 
      JMP UP         YES, GO RESTORE MACHINE STATE
* 
*     DOWN ROUTINE
* 
      STA ASAVE     SAVE A-REG. 
      LIA 0 
      STA IMASK     SAVE INTERRUPT MASK 
      LIA 2 
      SFS 2         SKIP IF GLOBAL REG DISABLED 
      IOR BIT15     BIT15=1 WHEN ENABLED
      CLC 0,C       DO CRS, INITIALIZE/STOP ALL I/O 
      CLC 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 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 6         START TBG 
      LDA STC7      INSTRUCTION TO ENABLE M.P.
      LDB $MPTF     GET SYSTEM MEMORY PROTECT FLAG
      CCE,SZB       DID P.F. COME WHILE IN THE SYSTEM 
      LDA STC4       YES, LEAVE MEMORY PROTECT DISABLED 
      STA SWTCH 
* 
*  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 1,I 
      ADB N1        POINT TO IFT7 
      LDA 1,I 
      RAL,ERA       SET BIT 15
      STA 1,I        FORCING CONTINUATION RETURN
* 
REGUP LDA EOSAV     RESTORE THE REGISTERS 
      CLO 
      SLA,ELA 
      STO 
* 
      LDA IMASK 
      OTA 0         RESTORE INTERRUPT MASK
      LDA GLOBL 
      OTA 2,C       RESTORE/ENABLE GLOBAL REG 
      SSA,RSS       WAS IT DISABLED?
      STF 2          YES
      LDA $MPFN 
      OTA 7         RESTORE THE FENCE 
      LDA ASAVE 
      LDB BSAVE 
      STF 0 
STC4  STC 4         ENABLE LEVEL 2 & 3 INTERRUPTS 
SWTCH STC 7         ENABLE M.P. UNLESS IN SYSTEM
      JMP PSAVE,I   RETURN TO POINT OF INTERRUPT
* 
      SPC 3 
STC7  STC 7 
ASAVE NOP 
BSAVE NOP 
EOSAV NOP 
IMASK NOP 
GLOBL 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 
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 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 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 1,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 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 
      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 4         DISABLE LEVEL 2&3 INTERRUPTS
      JSB ONPRV     SEE IF ANOTHER P.F. OCCURRED
      JMP RENBL     IT HAS! GET OUT IMMEDIATELY 
      STC 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 1,I       GET LENGTH OF CONTIGUOUS AUX. AREA
      AND B777       IN BITS 8-0
      ADB 0         ADD TO POINTER
      CCE,INB 
      JMP DVRNX     ITERATE 
* 
DCAL5 JSB $POWF     DO DEVICE DRIVER POWER-FAIL 
      LDB NXADR 
      ADB .20 
      LDB 1,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 1         IS THIS THE P.F. IFT? 
      JMP ONPRV,I    YES, ON QUEUE, DO RTN+1
      LDA 0,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 
                                                                                                                                                                                  