ASMB,R,F,L,C
      HED ** TRAP TABLE MODULE **             92101-19010 REV.1710
      NAM TRAP,14  92101-16010 770208 
* 
*************************************************************** 
* 
**************************************************************
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1975.  ALL RIGHTS    *
* RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- *
* PRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH-  *
* OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.  *
**************************************************************
* 
* 
*     LISTING:   92101-19010
*     SOURCE:    92101-18010
*     RELOC:     92101-16010
* 
* 
**************************************************************
* 
* ENTRY POINTS: 
* 
      ENT TRAP,TIME 
      ENT TRPNT,FINDS,TRMAK,TRDEL 
      ENT TRPNO,SEKNO,PRINO 
      ENT TRTBL,TRPTR,TRNXT,TRFLG 
      ENT TRMSK,TRAP# 
      ENT TSEND,TSTIM,TSNXT,TSTBL,TSCNT,TSPTR 
      ENT SRQ.T 
* 
* 
* 
* EXTERNAL REFERENCES:
* 
      EXT $LIBR,$LIBX 
      EXT $TIME 
* 
* 
* 
* 
** TRAP ** DO VARIOUS TRAP NUMBER ORIENTED OPERATIONS 
* 
* THIS ROUTINE HAS FOUR CALLING SEQUENCES DEPENDING ON ITS FUNCTION.
* THE NOMINAL CALLING SEQUENCE, ASSOCIATED WITH EXECUTION OF THE
* BASIC TRAP STATEMENT, IS AS FOLLOWS:
* 
*     LDA MINUS THE TRAP NUMBER 
*     LDB SEQUENCE NUMBER (FROM TRAP STMT,MAY BE - )
*     JSB TRAP
*      JMP ERR1  (ERROR RETURN) 
*     RETURN
* 
****************************************************
* 
* THIS ROUTINE IS CALLED JUST 
* BEFORE EXECUTING EACH LINE OF BASIC CODE: 
* 
*     LDA MINUS 1000 DECIMAL  (USED TO FLAG THIS CASE)
*     LDB POINTER TO STATEMENT ABOUT TO BE EXECUTED 
*     JSB TRAP
*      JMP ERR    (ERROR RETURN)
*     RETURN   (SEE NOTE) 
* 
* NOTE: WHEN THIS CALL IS RECOGNIZED (.A.=-1000) THE
*       TRAP TABLE IS POLLED TO DETERMINE IF PROGRAM
*       SHOULD BE INTERRUPTED BY A TIME OR EVENT
*       SCHEDULED TASK. 
* 
*  RETURN VALUES IF PROGRAM IS TO BE INTERRUPTED
* 
*     .A.= SEQUENCE NUMBER FROM TRAP TABLE
*     .B.= SEQUENCE NBR THAT WOULD HAVE BEEN EXECUTED OTHERWISE 
* 
*  RETURN VALUES IF PROGRAM IS NOT TO BE INTERRUPTED
* 
*     .A.= -1  (SERVES AS FLAG FOR THIS CASE) 
*     .B.= ADDRESS OF STATEMENT TO BE EXECUTED NEXT 
* 
****************************************************
* 
* WHEN A TASK IS SCHEDULED IN THE ABOVE MANNER, ITS 
* RETURN STATEMENT RESULTS IN YET ANOTHER CALL: 
* 
*     LDA MINUS 256 DECIMAL (USED AS FLAG)
*     LDB MINUS SEQ NBR TO BE RETURNED TO 
*     JSB TRAP
*      JMP ERR    (ERROR RETURN)
*     RETURN    .A.= RETURN SEQUENCE NUMBER 
* 
****************************************************
* 
* FINALLY TRAP IS CALLED TO INITIALIZE OR FREE UP THE TRAP
*  TABLE AT THE BEGINNING OR END OF EXECUTION PHASE:
* 
*     LDA  1 DECIMAL   INDICATES AN INITIALIZE REQUEST
*      OR LDA 2 DECIMAL   INDICATES A TERMINATE REQUEST 
*     JSB TRAP
*      JMP ERR    (ERROR RETURN)
*     RETURN
* 
****************************************************
* 
TRAP  NOP 
      JSB $LIBR 
      NOP 
      STB LYNNO     SAVE INCOMING LINE NO.
      SSA,RSS       IS THIS AN INIT OR TERM REQUEST?
      JMP INIT      YES!
      CPA M1000     IS THIS THE POLLING CALL
      JMP LINE      YES 
      CPA M256      IS THIS THE TASK RETURN CALL? 
      JMP TRRET     YES 
      CMA,INA       MAKE TRAP NUMBER POSITIVE 
      ALF,ALF        POSITION IT, 
      STA TRPNO       AND SAVE IT 
      SSB      IF SEQ NBR IS NEGATIVE 
      CCA            SET TFLAG TO -1
      STA TFLAG       ELSE SET IT POSITIVE
      SSB 
      CMB,INB       MAKE SURE SEQ NBR IS POSITIVE 
      STB SEKNO      THEN SAVE IT 
      STB TRFLG     ENABLE TRAP TABLE SEARCH
      LDA 1 
      JSB FINDS     LOOK FOR ENTRY WITH THAT SEQ NBR
      JMP STRA1     NOT FOUND 
      LDA TRPTR     FOUND 
      STA BSCT2      SAVE ADDRESS OF ENTRY
      LDA TRPNO 
      JSB FINDT     LOOK FOR ENTRY WITH THIS TRAP NO
      JMP STRA2     NOT FOUND 
      LDB TRPTR     IS THIS THE SAME ENTRY WE FOUND 
      CPB BSCT2      WITH THE GIVEN SEQ NBR?
      JMP STRA4     YES, ENTRY IS ALREADY THERE 
      LDA .2        ILLEGAL 
      JMP RTRAP+1     COMBINATION ERROR 
STRA1 LDA TRPNO 
      JSB FINDT     LOOK FOR ENTRY WITH THIS TRAP NO
      JMP STRA3     NOT FOUND, MUST MAKE NEW ENTRY
* 
** HERE TO RESET TRAP BIT (IF POS IN TRAP STMT) 
* 
STRA4 LDB TRPTR 
      LDA 1,I       FOUND, REPLACE SEQ NBR IN ENTRY 
      AND BIT15     PRESERVE TRAP BIT 
      ISZ TFLAG     IF GIVEN SEQ NBR WAS POSITIVE,
      CLA            CLEAR TRAP BIT 
      IOR SEKNO     INSERT GIVEN SEQ NBR
      STA 1,I       AND STORE INTO ENTRY
* 
** COME HERE TO ENABLE TRAP AND RETURN
* 
      INB            GET SECOND 
      LDA 1,I         WORD OF ENTRY 
      IOR BIT15     SET ENABLE BIT
      STA 1,I        AND PUT BACK IN ENTRY
      JMP RTRAP     RETURN (P+2)
* 
** HERE TO CREATE A NEW ENTRY 
* 
STRA3 LDA .99       SET DEFAULT 
      STA PRINO      PRIORITY (99)
      JSB TRMAK       MAKE NEW ENTRY
      RSS           NO ROOM 
      JMP STRA4     DONE, RETURN
      CLA,INA       TRAP
      JMP RTRAP+1     TABLE FULL
* 
** HERE WHEN ENTRY WITH SEQ NBR BUT NOT TRAP # FOUND
* 
STRA2 LDB TRPTR 
      INB 
      LDA 1,I       GET SECOND WORD OF ENTRY
      AND PRMSK      SAVE PRIORITY
      IOR TRPNO       INSERT TRAP NBR 
      STA 1,I          PUT BACK IN ENTRY
      JMP STRA4     ENABLE IT AND RETURN
      SKP 
* 
** COME HERE TO INITIALIZE THE TRAP TABLE 
** FOR CALL INFO, SEE COMMENTS PRECEEDIND TRAP ENTRY POINT
* 
* 
** HERE TO INITIALIZE TABLES AT BEGINNING OF EXECUTION PHASE. 
* 
INIT  CPA .2        TERMINATE REQUEST?
      JMP TERM      YES!
     LDA CUPGM      USE ID SEG PTR AS 
      CPA XEQT      IS THIS THE RIGHT USER? 
      JMP *+5       YES!
      SZA           IS IT FIRST TIME THROUGH? 
      JMP INIT1     NO! SO IGNORE HIM, HE SHOULDN'T BE HERE 
      LDA XEQT      SET UP ID SEG ADDRS 
      STA CUPGM       AS IDENT NO.
      LDA TRTBL     INITIALIZE
      STA TRNXT      TRAP TABLE 
      STA TRPTR       POINTERS
      LDA TSTBL     INITIALIZE
      STA TSNXT      TIME SCHED TABLE 
      STA TSPTR        POINTERS 
      JSB TIME      INITIALIZE TIME OF LAST CHECK 
      DEF *+2 
      DEF TSTIM       OF TIME SCHD TABLE
      DLD MAXNG    MAX NEGATIVE FLOAT PT NBR
      DST TSCNT     INITIALIZE TIME TO EXECUTION CNT
      LDA PRSTK     INITIALIZE
      STA TRPRI      PRIORITY STACK 
      CLA           DONT NEED TO SEARCH FOR TRAP
      STA TRFLG      BITS UNTIL SOMETHING HAPPENS 
      JMP RTRAP 
* 
TERM  CLA           CLEAR OUT 
      STA CUPGM       USER IDENT NUMBER 
      JMP RTRAP     RETURN
* 
INIT1 LDB M1        SET FLAG SO BASIC  DOESN'T
      JMP RTRAP       COME DONE HERE THRU THE 'LINE' CALL 
*                       FOR EVERY STATEMENT 
      SKP 
* 
** HERE TO DO END OF LINE TRAP TABLE POLLING
* 
LINE JSB TIMCK
      LDB TRFLG     IS TRAP TABLE SEARCH NECESSARY? 
      SZB 
      JMP LINE8     YES 
LINE9 LDA M1        .A.=-1 MEANS DONT INTERRUPT PROG
      LDB LYNNO     RESTORE INCOMING VALUE OF B REG 
      JMP RTRAP     RETURN
* 
** HERE FOR RETURN IF TABLE SEARCHED BUT NO INTERRUPT NEEDED
* 
LINE3 CLA           NO NEED TO SEARCH AGAIN 
      STA TRFLG      UNTIL SOMETHING HAPPENS
      JMP LINE9     RETURN (NO INTERRUPT) 
* 
** HERE TO DO TRAP TABLE SEARCH 
* 
LINE8 LDB TRTBL     INITIALIZE .B. TO FRONT OF TABLE
LINE1 CPB TRNXT      END OF TABLE 
      JMP LINE3     YES 
      LDA 1,I       NO, GET FIRST WORD OF ENTRY 
      INB 
      AND 1,I        "AND" TRAP BIT WITH ENABLE BIT 
      SSA           ARE BOTH BITS SET?
      JMP LINE2     YES 
      INB           ADVANCE TO NEXT ENTRY 
      JMP LINE1      AND LOOP 
* 
** HERE IF BOTH TRAP AND ENABLE BITS SET
* 
LINE2 ADB M1
      LDA 1,I       GET FIRST WORD OF ENTRY 
      ELA,CLE,ERA   CLEAR TRAP BIT
      SZA           IS SEQ NBR ZEROED OUT?
      JMP LINE4     NO
      ADB .2        YES, ADVANCE TO NEXT ENTRY
      JMP LINE1      AND KEEP LOOKING 
LINE4 STB TRPTR     SAVE POINTER TO ENTRY 
      INB 
      LDA 1,I       GET SECOND WORD OF ENTRY
      AND PRMSK      EXTRACT PRIORITY 
      CMA,INA       IF PRIORITY OF THIS TASK IS 
      ADA TRPRI,I    EQUAL OR LESS THAN THE ONE 
      CMA,INA 
      SSA,RSS         BEING PROCESSED,
      JMP LINE3     EXIT (NO INTERRUPT) 
* 
** HERE TO DO INTERRUPT OF PROGRAM
* 
      LDA 1,I 
      AND PRMSK     GET PRIORITY AGAIN
      ISZ TRPRI     BUMP PRIORITY STACK POINTER 
      STA TRPRI,I    SET UP WITH CURRENT PRIORITY 
      LDB TRPTR 
      LDA 1,I       CLEAR TRAP BIT
      ELA,CLE,ERA    IN THIS
      STA 1,I         ENTRY 
      LDB LYNNO,I   ENTER SEQ NBR FOR RETURN
      CMB,INB        COMPLEMENT IT TO FLAG AS TASK
      JMP RTRAP     RETURN
* 
** COME HERE TO PROCESS RETURN FROM AN INTERRUPT
** STARTED TASK.  A NEGATIVE RETURN ADDRESS RESULTS 
** IN TRANSFER TO THE TRAP ROUTINE AND THEN TO THE
** FOLLOWING CODE.
* 
TRRET CMB,INB       MAKE SEQ NBR POSITIVE 
      LDA 1         MOVE IT TO A REG
      LDB TRPRI     POP THE 
      ADB M1         PRIORITY 
      STB TRPRI       STACK 
      STB TRFLG     AND ENABLE TRAP TABLE SEARCH
RTRAP ISZ TRAP
      JSB $LIBX     RETURN (P+1)
      DEF TRAP
* 
      SKP 
***** 
* 
** TIMCK ** ROUTINE TO CHECK TIME SCHED TABLE 
* 
*     JSB TIMCK 
*     RETURN
* 
***** 
* 
TIMCK NOP 
      JSB TIME      SAVE
      DEF *+2 
      DEF TIMT1     CURRENT TIME
TIMC3 FSB TSTIM     GET-TIME ELAPSED FROM LAST CHECK
      SSA,RSS      CORRECT
      JMP TIMC4    FOR CHANGE 
      FAD FLDAY      OF DAY 
TIMC4 FAD TSCNT    UPDATE SECONDS TO EXECUTION
      DST TSCNT 
      SSA,RSS       HAS THAT TIME ELAPSED?
      JMP TIMC1     YES 
      DLD TIMT1     NO, UPDATE TIME OF LAST CHECK 
      DST TSTIM 
      JMP TIMCK,I   AND RETURN
* 
** HERE IF TASK AT TOP IS TO BE SCHEDULED 
* 
TIMC1 LDB TSNXT 
      ADB M1
      LDA 1,I       GET SEQ NBR 
      ADB M2         BACK UP TSNXT TO 
      STB TSNXT       DELETE ENTRY
      JSB FINDS     LOOK FOR ENTRY WITH THAT SEQ NBR
       JMP TIMCE     NOT FOUND
      LDB TRPTR 
      LDA 1,I       FOUND,
      IOR BIT15      SET TRAP BIT 
      STA 1,I 
      STA TRFLG    SET UP TO POLL TABLE 
* 
** HERE TO SET UP NEXT ENTRY
* 
      LDB TSNXT     SET POINTER 
      ADB M3         TO NEXT
      STB TSPTR       ENTRY 
      DLD TSTIM     USE OLD VALUE OF CURRENT TIME 
      FSB TSPTR,I    SINCE THIS TASK MAY HAVE TO BE 
      SSA           EXECUTED NOW ALSO 
      JMP TIMC2 
      FSB FLDAY     IF POSITIVE, SET UP FOR TOMORROW
TIMC2 DST TSCNT      SET UP NEW COUNTER 
      DLD TIMT1     GET REAL CURRENT TIME VALUE 
      JMP TIMC3      AND TRY AGAIN
TIMCE LDA .6        CAN'T RUN BECAUSE 
      JMP RTRAP+1     ITS BEEN DELETED
      SKP 
****************************************************************
* 
* 
*      BASIC TIME STATEMENT 
* 
* 
****************************************************************
* 
* 
* 
*THIS ROUTINE IS A FORTRAN AND BASIC CALLABLE ROUTINE THAT
*RETURNS THE TIME OF DAY IN FLOATING POINT SECONDS TO THE 
*NEAREST 100 MS (OR TENTH OF A SECOND).THE VALUE OF ZERO
*REPRESENTS MIDNIGHT. 
* 
*      JSB TIME                    ASSEMBLY LANGUAGE
*      DEF *+2
*      DEF TI 
* 
*      100 TIME(T)                 BASIC
* 
*      ON RETURN A/B=TIME IN TENS OF MS 
* 
* 
* 
TM     BSS     1
TIME   NOP
       JSB $LIBR
       NOP
       ISZ TIME 
       LDA TIME,I   GET PTR 
       STA TM          TO TIME
       ISZ TIME 
       DLD $TIME                   GET TIME FROM SYSTEM 
       CLE                         CLEAR FOR ADD
       ADA PRS1                    CONVERT TO POSITIVE 24HRS
       SEZ
       INB
       ADB PRS2 
       DIV .6000                   A=MINS,B=SECS
       STA MINS 
       ASR 16                      POSITION FOR DIV 
       DIV .100                    A=SECS,B=10S OF MS 
       STB MS10 
       FLT
       DST TM,I                    TEMPORARY TIME 
       LDA MINS 
       FLT
       FMP F.60                     MINS IN SECONDS 
       FAD TM,I 
       DST TM,I 
       LDA MS10                    MS IN SECONDS
       FLT
       FDV F.100
       FAD TM,I 
       DST TM,I 
       JSB $LIBX                   RETURN 
       DEF TIME 
      SKP 
* 
.6000 DEC 6000
PRS1  OCT 153000
PRS2  OCT 203 
MS10  BSS 1 
MINS  BSS 1 
.100  DEC 100 
F.60  DEC 60. 
F.100 DEC 100.
*******************  PRIORITY STACK **************
* 
PRSTK DEF *+1       POINTER TO FIRST ENTRY
      DEC 100       FIRST ENTRY IS PRIORITY 100 
      BSS 21        ALLOW 21 ACTUAL ENTRIES 
PREND DEF *         POINTER TO END OF STACK AREA+1
TRPRI NOP           POINTER TO TOP ENTRY ON STACK 
* 
**************************************************
******************  TIME SCHED TABLE *************
* 
*     WORD 1&2:     FLOATING POINT TIME (SEC) 
* 
*     WORD 3        SEQUENCE NUMBER 
* 
TSTBL DEF *+1       POINTER TO BEGINNING OF TABLE 
      BSS 48        ALLOW 16 ENTRIES
TSEND DEF *         POINTER TO END+1 OF TABLE 
TSPTR NOP           GENERAL USE TABLE POINTER 
TSNXT NOP           POINTER TO NEXT FREE ENTRY
TSTIM BSS 2         TIME OF LAST UPDATE OF TIME SCHD
TSCNT BSS 2         -# SECONDS TILL SCHED NEXT TASK 
* 
* 
********************************************************* 
      SKP 
* 
.2    DEC 2 
.6    DEC 6 
.99   DEC 99
M1    DEC -1
M2    DEC -2
M3    DEC -3
M256 DEC -256 
M1000 DEC -1000 
MAXNG OCT 100000
      OCT 376 
FLDAY DEC 86400.    NO. OF SECONDS/DAY
LYNNO NOP 
TIMT1 BSS 2 
BSCT2 NOP 
TFLAG NOP 
CUPGM NOP 
XEQT  EQU 1717B 
      SKP 
***** 
* 
** FINDS ** FIND TRAP TABLE ENTRY WITH GIVEN SEQUENCE NUMBER
* 
*     LDA SEQUENCE NUMBER 
*     JSB FINDS 
*     RETURN1  NO SUCH ENTRY FOUND
*     RETURN2  ENTRY FOUND, TRPTR AND .B. POINT TO IT 
* 
*  NOTE:  TRPTR NOT ALTERED IF ENTRY NOT FOUND
* 
***** 
* 
FINDS NOP 
      JSB $LIBR 
      NOP 
      STA BSCT1     SAVE SEQUENCE NUMBER
      LDB TRNXT     USE .B. FOR TRAP TABLE POINTER
      CPB TRTBL     IS TABLE EMPTY? 
      JMP FNDS3     YES, RETURN (P+1) 
FNDS1 ADB M2        MOVE TO NEXT ENTRY
      LDA 1,I       GET SEQ NBR FROM ENTRY
      ELA,CLE,ERA   IGNORE TRAP BIT 
      CPA BSCT1     DO SEQ NBRS MATCH?
      JMP FNDS2     YES, FOUND IT 
      CPB TRTBL     NO, IS TABLE EXHAUSTED? 
      JMP FNDS3     TABLE EXHAUSTED, RETURN (P+1) 
      JMP FNDS1     MORE ENTRIES, CHECK THEM
* 
** COME HERE WHEN ENTRY FOUND 
* 
FNDS2 ISZ FINDS     SET UP SUCCESS RETURN 
      STB TRPTR     SET TRAP TABLE POINTER
FNDS3 JSB $LIBX    RRETURN
      DEF FINDS 
      SKP 
***** 
* 
** FINDT ** FIND TRAP TABLE ENTRY WITH GIVEN TRAP NBR 
* 
*     LDA TRAP NUMBER (POSITIONED IN WORD)
*     JSB FINDT 
*     RETURN1  ENTRY NOT FOUND WITH THAT TRAP NBR 
*     RETURN2  FOUND, TRPTR AND .B. POINT TO IT 
* 
*  NOTE:  TRPTR NOT ALTERED IF ENTRY NOT FOUND
* 
***** 
* 
FINDT NOP 
      JSB $LIBR 
      NOP 
      STA BSCT1      AND SAVE FOR LATER COMPARISON
      LDB TRNXT     VSE .B. FOR TRAP TABLE POINTER
      CPB TRTBL     IF TABLER IS EMPTY, 
      JMP FNDT3      RETURN (P+1) 
FNDT1 ADB M1        MOVE TO NEXT ENTRY
      LDA 1,I  GET WORD WITH TRAP NBR 
      AND TRMSK     EXTRACT TRAP NBR
      CPA BSCT1     DO THEN MATCH?
      JMP FNDT2     YES 
      ADB M1        NO, POINT TO BEGINNING OF ENTRY 
      CPB TRTBL      IS THE TABLE EXHAUSTED 
      JMP FNDT3     YES, RETURN (P+1) 
      JMP FNDT1     NO, CHECK NEXT ENTRY
FNDT2 ISZ FINDT     SET UP SUCCESS EXIT 
      ADB M1        MOVE TO FIRST WORD OF ENTRY 
      STB TRPTR     SET TRAP TABLE POINTER
FNDT3 JSB $LIBX    RETURN 
      DEF FINDT 
      SKP 
* 
***** 
* 
** TRDEL ** DELETE FROM TRAP TABLE THE ENTRY AT TRPTR 
* 
*     JSB TRDEL 
*     RETURN
* 
***** 
* 
TRDEL NOP 
      JSB $LIBR 
      NOP 
      LDB TRNXT     IF ENTRY TO BE DELETED
      CPB TRPTR      IS LAST+1 ENTRY, 
      JMP TRDE2       RETURN IMMEDIATELY
      ADB M2        DECREMENT END OF TABLE POINTER
      STB TRNXT      TO POINT TO NEW LAST+1 LOCATION
TRDE1 LDB TRPTR 
      CPB TRNXT     IF END OF TABLE 
      JMP TRDE2      RETURN  (P+1)
      ADB B2
      DLD 1,I       GET ENTRY AT TRPTR + 1 ENTRY
      DST TRPTR,I    STORE IT AS TRPIR ENTRY
      ISZ TRPTR     BUMP TRPTR TO NEXT ENTRY
      ISZ TRPTR 
      JMP TRDE1     LOOP
TRDE2 JSB $LIBX    RETURN 
      DEF TRDEL 
      SKP 
***** 
* 
** TRMAK ** MAKE A TRAP TABLE ENTRY, ORDERED BY PRIORITY
* 
*     SEKNO= SEQUENCE NBR (TRAP BIT MAY BE SET) 
*     PRINO= PRIORITY 
*     TRPNO= TRAP NUMBER (ALREADY POSITIONED IN WORD) 
*     JSB TRMAK 
*     RETURN1  NO ROOM FOR ENTRY
*     RETURN2  ENTRY MADE (TRPTR POINTS TO IT)
* 
* NOTE: NEW ENTRIES ARE AUTOMATICALLY ENABLED 
* 
***** 
* 
TRMAK NOP 
      JSB $LIBR 
      NOP 
      LDB TRNXT     IS THE TABLE
      CPB TREND      ALREADY FULL?
      JMP TRMK3     YES, RETURN (P+1) 
      ISZ TRMAK     NO, SET UP SUCCESS RETURN 
      STB TRPTR     SET POINTER TO END OF TABLE 
      ADB B2
      STB TRNXT     BUMP TRNXT TO REFLECT NEW ENTRY 
      LDB TRPTR 
TRMK1 CPB TRTBL     ARE WE TO OTHER END OF TABLE? 
      JMP TRMK2     YES, MAKE ENTRY HERE
      ADB M1        NO, MUST TEST FOR SORTING ORDER 
      LDA 1,I       GET SECOND WORD OF ENTRY
      AND PRMSK      EXTRACT PRIORITY 
      CMA,INA       IF PRIORITY OF
      ADA PRINO      ENTRY IS EQUAL OR HIGHER 
      SSA,RSS       THAN PRIORITY OF NEW ENTRY. 
      JMP TRMK2     MAKE ENTRY HERE 
      ADB M1         ELSE MOVE THIS ENTRY 
      DLD 1,I         DOWN ONE TO ALLOW PROPER
      DST TRPTR,I      ORDERING OF NEW ENTRY
      LDB TRPTR     MOVE
      ADB M2         POINTER TO 
      STB TRPTR       NEXT ENTRY
      JMP TRMK1        AND CONTINUE 
* 
** COME HERE TO ACTUALLY MAKE ENTRY 
* 
TRMK2 LDA SEKNO     STORE SEQUENCE NUMBER IN FIRST
      LDB TRPTR 
      STA 1,I       WORD OF ENTRY 
      LDA PRINO     GET PRIORITY (BITS 0-7) 
      IOR TRPNO      INCLUDE TRAP NUMBER (BITS 8-14)
      IOR BIT15       SET ENABLE BIT
      INB           STORE SECOND
      STA 1,I        WORD OF ENTRY
      STB TRFLG     ENABLE TRAP TABLE SEARCH
TRMK3 JSB $LIBX    RETURN 
      DEF TRMAK 
      SKP 
***** 
* 
** TRPNT ** SET A BIT IN THE TRAP TABLE 
* 
*     LDA TRAP NUMBER 
*     JSB TRPNT 
*     RETURN1       TRAP TABLE FULL & THIS ENTRY NOT THERE ALREADY
*     RETURN2       SUCCESS 
* 
* NOTE: IF NO ENTRY WITH THAT TRAP NBR EXISTS, THIS 
*       ROUTINE WILL MAKE ONE WITH PRIORITY 99 AND
*       WITH THE ENABLE BIT AND THE SEQ NBR CLEARED.
* 
******
* 
TRPNT NOP 
      JSB $LIBR 
      NOP 
      ALF,ALF 
      STA TRPNO     SAVE TRAP NBR 
      JSB FINDT     FIND ENTRY WITH THAT TRAP NBR 
      JMP TRPN1     NOT FOUND 
      LDA TRPTR,I   FOUND,
      IOR BIT15    SET TRAP BIT 
      STA TRPTR,I   AND UPDATE ENTRY
      STA TRFLG     ENABLE TRAP TABLE SEARCH
TRPN2 ISZ TRPNT 
TRPN3 JSB $LIBX    RETURN 
      DEF TRPNT 
* 
** HERE IF MUST CREATE NEW ENTRY
* 
TRPN1 CLA           DEFAULT 
      STA SEKNO      SEQUENCE NBR 
      LDA D99       DEFAULT 
      STA PRINO      PRIORITY 
      JSB TRMAK     MAKE ENTRY
      JMP TRPN3     NO ROOM, RETURN (P+1) 
      LDB TRPTR     GET 
      INB            SECOND WORD
      LDA 1,I         OF ENTRY
      ELA,CLE,ERA   CLEAR ENABLE BIT
      STA 1,I 
      JMP TRPN2     RETURN (P+2) (PONT CHANGE TRFLG)
      SKP 
****************************************************
* 
*******************  TRAP TABLE  *******************
* 
*     WORD 1:   BIT  15        TRAP BIT 
*               BITS 14-0      SEQUENCE NUMBER
* 
*     WORD 2:   BIT  15        ENABLE BIT 
*               BITS 14-8      TRAP NUMBER
*               BITS  7-0      PRIORITY 
* 
* 
TRTBL DEF *+1       POINTER TO BEGINNING OF TABLE 
      BSS 32        ALLOW FOR 16 ENTRIES
TREND DEF *         POINTER TO END+1 OF TABLE 
TRPTR NOP           GENERAL USE TABLE POINTER 
TRNXT NOP           POINTER TO NEXT FREE ENTRY
TRFLG NOP           FLAG, 0=DONT NEED TO EXAMINE TBL
* 
**************************************************
* 
BSCT1 NOP           TEMPORARY 
SEKNO NOP           SEQUENCE NUMBER 
PRINO NOP           PRIORITY
TRPNO NOP           TRAP NBR POSITIONED BITS 14-8 
TRMSK OCT 77400     MASK FOR TRAP NBR 
PRMSK OCT 377       MASK FOR PRIORITY 
TRAP# OCT 0         TRAP NO. USED BY TTY EVENT SENSE ROUTINE
D99   DEC 99
B2    OCT 2 
BIT15 EQU MAXNG 
* 
*     THE FOLLOWING TABLE IS PROVIDED FOR HPIB/TRAP INTERACTIONS. 
*     ENTRIES ARE ORDERED BY TRAP # AND CONTAIN INFO PERTAINING 
*     TO THE LU (DEVICE) ASSOCIATED WITH IT. FORMAT AS FOLLOWS: 
* 
*                   ***************************** 
*                   *     15-8    *     7-0     * 
*                   ***************************** 
*                   * SUB-CHANNEL * I/O CHANNEL * 
*                   ***************************** 
* 
SRQ.T DEF *+1 
      REP 16        # OF AVAIL.TRAPS
      NOP           * INITIALIZED TO 0 *  
      END 
                                                                                                                                                                                                                                                        