ASMB,R,L,C,B
      HED EVENT SENSE INTERRUPT HANDLER FOR 6940   A-92413-16007-1
* 
* ALARM - EVENT SENSE INTERRUPT HANDLER FOR HP6940A 
* 
* SOURCE TAPE - 92413-18007  REV.B
* RELOC. TAPE - 92413-16007  REV.B
* 
*     BY  STEVE SCOVILL 
* ALARM IS SCHEDULED BY THE HP6940A RTE DRIVER DVR61 WHEN AN
* EVENT SENSE INTERRUPT OCCURS.  THE FIRST TWO PARAMETERS PASSED
* TO ALARM BY THE DRIVER CONTAIN THE SLOT NUMBER AND CONTENTS OF
* THE INTERRUPTING CARD.  ALARM THEN DETERMINES IF ANY OF THE BIT 
* CHANGES ARE CONNECTED TO PROGRAMS.  IF SO, THE CORRESPONDING
* PROGRAM IS SCHEDULED AND PASSED THE FOLLOWING PARAMETERS: THE LOG-
* ICAL CHANNEL THAT INTERRUPTED, THE DATA FROM THAT CHANNEL, AND
* WHICH BIT CAUSED THE INTERRUPT.  IF AN ERROR OCCURS 
* THE ERROR IS PRINTED AS "ALARM ERR XXNN", WHERE XX IS THE RTE ERROR 
* TYPE AND NN IS THE NUMBER.
* 
      NAM ALARM,1,2  92413-16007B 19SEP75 
      ENT ALARM 
      EXT EXEC,$LIBX,$LIBR,&6940,TRPNT
      SUP 
* 
ALARM NOP 
      STB HOLD1     SAVE PARAMETER ADDRESS
      DLD HOLD1,I    GET SLOT AND DATA
      DST SLOT      SAVE THEM 
      LDB HOLD1        GET ADDR BACK
      JSB EFF           GET EFFECTIVE ADDR
      ADB .4        MOVE TO OBTAIN ADDR OF 5TH PARAMETER
      LDA 1,I        AND GET IO SLOT
      AND M77         MASK OUT UPPER BITS 
      STA IOSLT        SAVE IT
* 
* 
*     FIND RIGHT 6940 
* 
      LDB TOP       GET BASE PAGE LINK
      JSB EFF       GET EFFECTIVE ADDR
      STB .6940     AND SAVE IT 
      LDB .6940,I   GET MINUS # OF CHANS IN 2313
*     (B) CONTAINS THE ACCUMULATED CHANNEL COUNT (MINUS)
AGAIN ISZ .6940      UNIT TABLE 
      LDA .6940,I     TO FIND SELECT
      SSA              CODE ADDR
* 
*     IF THE FOLLOWING ERROR HAPPENS
*      ITS PROBABLY DUE TO A CONFIGURATION PROBLEM
* 
      JMP ERR2      ERROR 
      INA           GET THE 
      LDA 0,I        I/O SLOT FROM
      CPA IOSLT       THE TABLE AND CHECK 
      JMP *+4       IF THE SAME, CONTINUE 
      LDA .6940,I   IF NOT, ACCUMULATE THE
      ADB 0,I        CHANNEL COUNT
      JMP AGAIN       AND TRY SOME MORE 
* 
*     (B) CONTAINS THE MINUS OF THE CHANNEL COUNT TO THIS POINT 
* 
      CMB,INB       MAKE CHANNEL COUNT
      INB            POSITIVE AND ADD 1 
      STB #CHAN       SAVE FOR LATER
* 
*     FETCH PARAMETERS
* 
      DLD SLOT      LOAD SLOT & INPUT WRD 
      STB IDATA      SAVE INPUT 
      ASL 12          SHIFT SLOT
      STA SLOTA         AND SAVE
      LDA SLOT      ADD SLOT
      ADA #CHAN      TO THE 
      STA #CHAN       ACCUMULATED CHANNEL COUNT 
* 
* CHECK TO DETERMINE IF EVENT SENSE 
*      OR DIGITAL INPUT CARD
* 
      LDB .6940,I   GET TOP OF
      ADB .2         UNIT TABLE, ADD
      LDA 1,I         TWO AND SAVE
      STA LU           LU 
* 
      CLA 
      STA NAM1
* 
      INB           BUMP POINTER AND
      LDA 1,I       GET # OF EVENT CARDS
      CMA,INA         MAKE NEG
      STA MEVNT     SAVE MINUS NUMBER OF EVENT CARDS
      ADA SLOT        ADD SLOT
      SSA              EVENT OR DIG?
      JMP EVENT 
      CMA,INA 
      ADB .2        BUMP PTR TO # DIG IN
      ADA 1,I        (A)= #EVENT+#DIGIN-SLOT
      SZA,RSS 
      JMP CANCL 
      SSA,RSS         DIG INPUT?
      JMP DIGIN 
      JMP CANCL     CANCL INTERRUPT 
      SKP 
* 
*     EVENT 
* 
EVENT ADA 1,I       ADD BACK #EVENT 
      INB            BUMP PTR TO EVENT BUFF 
      LDB 1,I         GET BUFFER POINTER
      STB HOLD2        SAVE FOR LATER 
      INB 
      ADB 0         FIND DATA ADDR &
      STB PATRN      SAVE (STATUS WORD ADDR)
      CLB 
*     A REG CONTAINS SLOT 
      MPY .12       FIND BIT/PROG 
      ADA HOLD2,I    ENTRY
      INA             IN TABLE
      STA TABLE         AND SAVE
RETRY JSB SCTBL     UPDATE BIT/PROG TABLE 
* 
      JSB EXEC      READ
      DEF *+6        AND
      DEF .1          RESET 
      DEF LU           INTERRUPTING 
      DEF POLBF         EVENT 
      DEF .6             SENSE
      DEF .7              CARD
      LDA DATA      GET DATA
      SSA            IF ANY TRANSFERRED 
      JMP RETRY       TRY AGAIN 
* 
EXIT  LDA LU        MAKE
      XOR =B2100     LU EQUAL 
      STA LU          LU + 2000B
* 
      JSB EXEC      SET 
      DEF *+3        SENSE
      DEF .3          MODE
      DEF LU           BIT
* 
* 
EXIT2 JSB EXEC      TERMINATE 
      DEF *+2 
      DEF .6
* 
      SKP 
* 
* SCTBL SCANS THE BIT/TRAP TABLE AND CALLS THE TRAP PROCESSER WHEN
* AN EVENT HAS OCCURED
* 
SCTBL NOP 
      JSB $LIBR     TURN OFF INTERRUPTS 
      NOP 
      LDA DATA      GET THE OLD 
      LDB PATRN,I    AND NEW DATA 
      STA PATRN,I     SAVE THE NEW
      JSB $LIBX     TURN ON INTERRUPTS
      DEF *+1 
      DEF *+1 
      XOR 1         FIND BIT CHANGES
      AND =B7777    IF NO CHANGES 
      SZA,RSS        FROM PREVIOUS PATTERN
      JMP SCTBL,I     RETURN
      LDB M12       INITIALIZE
      STB CNTR       BIT COUNTER
      CLB 
      STB BITNO     CLEAR BIT NUMBER
      LDB TABLE     FETCH ADDRESS OF BIT/PROG 
      STB PNTR       TABLE AND USE AS INDEX 
      LDB 0         PUT BIT CHANGES IN "B"
NXTBT CLA           MOVE NEXT BIT 
      ASR 1          INTO "A" 
      XOR PNTR,I    UPDATE BIT/PROG ENTRY 
      CPA PNTR,I    IF NO CHANGE SKIP 
      JMP CONT       UPDATE OF TABLE
      JSB $LIBR     *************************** 
      NOP           TURN OFF INTERRUPT SYSTEM 
      STA PNTR,I     TO UPDATE TABLE
      JSB $LIBX     TURN INTERRUPT SYSTEM 
      DEF *+1        BACK ON
      DEF *+1       *************************** 
      SSA,RSS       IF NEW STATUS IS 1 (EVENT)
      JMP CONT        SET TRAP, ELSE CONTINUE 
      ELA,CLE,ERA   SET SIGN BIT TO ZERO
      STB SAV.B     SAVE STATUS WORD
      SZA,RSS       IF NO TRAP NUMBER SKIP
      JMP CONT       SCHEDULE CALL
      JSB SKED
CONT. LDB SAV.B      RESTORE DATA WORD
CONT  ISZ PNTR      BUMP TABLE POINTER
      ISZ BITNO 
      ISZ CNTR      LAST BIT? 
      JMP NXTBT     NO, GO TO NEXT BIT
      JMP SCTBL,I 
      SKP 
* 
*     SCHEDULE PROGRAM
* 
SKED  NOP 
      STA NAM1
* 
* IF FIRST CHAR = 0, THEN BASIC TRAP NUMBER 
* 
      AND UPMSK     CHECK IF
      SZA,RSS        A BASIC
      JMP BASIC       TRAP NUMBER 
* 
      JSB EXEC      SCHEDULE
      DEF *+6        THE
      DEF B1011       PROGRAM 
      DEF NAM1
      DEF #CHAN     AND PASS IT THE CHANNEL NO, 
      DEF DATA       DATA,
      DEF BITNO       AND WHICH BIT PARAMETERS
      JMP WRITE     ERROR RETURN
      JMP SKED,I
* 
*     BASIC 
* 
BASIC LDA NAM1      GET THE TRAP NUMBER 
      JSB TRPNT      AND CALL THE 
      NOP             BASIC TRAP ROUNTINE 
      JMP CONT.        ANY MORE?
* 
*     DIGIN 
* 
DIGIN LDA 1,I 
      SZA 
      JMP DIG1       CHECK FOR ZERO DIG INPUT 
CANCL LDA =B170140
      JMP DEACT 
DIG1  INB            BUMP B TO DIGIN
      LDA MEVNT     GET MINUS NUMBER OF EVENT 
      ADA SLOT       ADD THE SLOT NUMBER
      ADA 1,I       GET THE PROGRAM ADDRESS 
      LDA 0,I       GET THE PROG ENTRY
* 
*     CHECK TO SEE IF BIT/PROG SET
* 
      ELA,CLE,ERA   STRIP OFF BIT 15
      SZA,RSS        IF ENTRY IS ZERO,
      JMP CANCL       IGNORE INTERRUPT
      STA NAM1      ELSE, SAVE NAME 
      CLB           CLEAR BIT NUMBER
      STB BITNO 
      LDA =B170240
      SKP 
* 
*     DEACTIVATE INPUT CARD 
* 
DEACT STA BUFF
      LDA SLOTA     PUT SLOT INTO 
      STA BUFF+1     THE BUFFER 
      JSB EXEC
      DEF *+6 
      DEF .2        WRITE A 
      DEF LU         WORD TO
      DEF BUFF        THE INPUT 
      DEF .2            CARD TO 
      DEF .0            DEACTIVATE IT 
* 
      AND =B204 
      SZA,RSS       CHECK FOR BAD STATUS BITS 
      SZB,RSS        OR ZERO XMISSION LOG 
      JMP ERR2      GIVE ERROR 2
* 
      LDA NAM1      PROGRAM TO
      SZA            BE SCHEDULED?
      JSB SKED      YES 
      JMP EXIT      RETURN
* 
*     ERRORS
* 
EMES2 ASC 2,MP02
* 
ERR2  DLD EMES2 
* 
WRITE DST ERRBF 
      JSB EXEC      WRITE THE 
      DEF *+5        ERROR MESSAGE
      DEF .2          TO THE
      DEF .1           CRT
      DEF ERRB
      DEF .7
* 
      LDA ERRBF     IF ERROR WAS
      CPA EMES2      ERROR TWO
      JMP EXIT2        DON'T RESET THE SENSE MODE 
      JMP EXIT      NORMAL EXIT 
* 
*     INPUT BUFFER
* 
POLBF OCT 170640    THESE 6 WORDS FORM
.1    DEC 1          THE POLE TO
SLOTA NOP             FIRST HIT BUFFER. 
.M1   DEC -1           THIS BUFFER CAUSES THE 
      NOP               INTERRUPTING CARD TO BE 
IDATA  NOP                READ AND ENABLED
      SKP 
* 
*     THIS ROUNTINE GETS THE EFFECTIVE ADDR 
* 
EFF   NOP 
      SSB,RSS       CHECK FOR INDIRECT
      JMP EFF,I      ITS THE TRUE ADDR, RETURN
      ELB,CLE,ERB   STRIP OF INDIRECT BIT 
      LDB 1,I        GET ADDR 
      JMP *-4         TRY AGAIN 
* 
*     CONSTANTS AND OTHER THINGS
* 
.0    NOP 
.2    DEC 2 
.3    DEC 3 
.4    DEC 4 
.6    DEC 6 
.7    DEC 7 
.12   DEC 12
M12   DEC -12 
M77   OCT 77
B1011 OCT 100011
UPMSK OCT 177400
TOP   DEF &6940 
* 
NAM1  ASC 3,XXXXX 
ERRB  ASC 5,ALARM ERR 
ERRBF BSS 2 
* 
*     TEMP STORAGE
* 
.6940 NOP 
BITNO NOP 
TABLE NOP 
SAV.B NOP 
PATRN NOP 
PNTR  NOP 
CNTR  NOP 
SLOT  NOP 
DATA  NOP 
LU    NOP 
#CHAN NOP 
IOSLT NOP 
MEVNT NOP 
* 
*     WHAT'S EQU TO WHAT
* 
HOLD1 EQU LU
HOLD2 EQU IOSLT 
BUFF  EQU ERRBF 
      END ALARM 
                                                                                                                                              