ASMB,R,Q,C
      HED ** TRAP TABLE MODULE FOR RTE-L **   92076-1X026 REV.2040
      NAM TRAP,6   92076-1X026 REV. 2040 800730 92076-12002 
* 
* 
**************************************************************
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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.  *
**************************************************************
* 
* ADDED REV. CODE TO NAM 791228 
* 
*     NAME:  TRAPPING MODULE FOR BASIC/L.  MUST BE GENERATED IN 
*            MEMORY RESIDENT LIBRARY PHASE. 
*     SOURCE:    92076-18026
*     RELOC:     PART OF 92076-12002
*     PGMR:      B.J.L. 
* 
* 
**************************************************************
* 
* 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,IXGET 
      EXT $TIME,$XQT,$CON 
      EXT .FMP,.FLT,.FAD,.FSB,.FDV
* 
* ADDED CALLS TO RTE-L ROUTINES $XQT,$CON  791022***
* ADDED CALLS TO .FMP,.FLT,.FAD,.FSB,.FDV  791022***
* ADDED CALL TO IXGET FOR L20   800627******
* 
* 
** 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 
      OCT 177777     **791022** 
      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. 
* 
* THE FOLLOWING CODE WAS REDONE TO HAVE TRAP FUNCTION 
* CORRECTLY (800730)
* 
INIT  CPA .2        TERMINATE REQUEST?
      ISZ TERMC     YES, SET TERMINATE FLAG 
* 
      JSB IXGET     ROUTINE DUE TO L20
      DEF INI1
      DEF @CON      GET ADDRESS OF $CON 
INI1  STA TEMP1     AND CALL AGAIN BECAUSE
      JSB IXGET     OF INDIRECT 
      DEF INI2
      DEF TEMP1     RUN # ADDRESS 
INI2  STA .CON      HAVE VALUE IN $CON
      JSB IXGET     NOW GET VALUE FOR $XQT
      DEF INI3
      DEF @XQT
INI3  STA .XQT
* 
      JSB IXGET     GO CHECK FOR CALLING PROG 
      DEF INI4      BEING CURRENT OWNER AND 
      DEF OSEQA     ACTIVE  
INI4  AND B170
      CPA SEQ#      CURRENT RUN # 
      JMP INI5      YES, GO ON THEN 
      CLB           NO, THEN MAKE SO NEW CALLER CAN 
      STB CUPGM     BECOME OWNER
* 
INI5  LDA CUPGM      USE ID SEG PTR OF CURRENT PRG. 
      SZA,RSS        IS THERE AN OWNER? 
      JMP INITA      NO, MAKE CURRENT CALLER OWNER
      CPA .XQT       IS THIS RIGHT PROGRAM
      JMP INITB      YES, GO ON THEN                    
      JSB CTERM      NO, CHECK FOR TERM. TYPE CALL        
      JMP RTRAP      YES, JUST RETURN WITHOUT ERROR 
      JMP INIT1      NO, SEND TRAP BUSY MESSAGE TO CALLER 
* 
INITA LDA .XQT       GET CALLING PROGRAM ID SEG PTR.
      STA CUPGM      AND SAVE FOR LATER ID
      LDA .CON       GET SEQ# OF CALLER 
      AND B170       AND MASK OFF # 
      STA SEQ#       FOR LATER REFERENCE
      LDA TEMP1      SAVE CURRENT OWNER'S RUN#
      STA OSEQA      ADDRESS FOR LATER CHECK
* 
* HERE IF CURRENT PROG. IS CALLING PROGRAM AND ACTIVE 
* AS WELL AS NEW OWNER. 
* 
INITB JSB CTERM      CHECK FOR TERM. TYPE CALL
      JMP TERM       YES, ALLOW TO TERMINATE
      LDA TRTBL     NO 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 
* 
@CON  DEF $CON
@XQT  DEF $XQT
TEMP  NOP 
TEMP1 NOP 
.XQT  NOP 
.CON  NOP 
OSEQA NOP 
TERMC NOP 
* 
TERM  CLA           CLEAR OUT 
      STA CUPGM       USER IDENT NUMBER 
      STA SEQ#        AND USER SEQ#  **791022** 
      JMP RTRAP     RETURN
* 
INIT1 LDB M1        SET FLAG SO BASIC  DOESN'T
      JMP RTRAP       COME DONE HERE THRU THE 'LINE' CALL 
*                       FOR EVERY STATEMENT 
*                             
CTERM NOP           CHECK FOR TERM. TYPE CALL 
      LDB TERMC 
      SZB,RSS       IF IT IS, FLAG >0 THEN
      JMP CTEX      RETURN TO P+1 
      CLB 
      STB TERMC     AND CLEAR THE FLAG
      RSS 
CTEX  ISZ CTERM     ELSE, RETURN TO P+2 
      JMP CTERM,I 
* 
      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,I    **791022*** 
* 
      SKP 
***** 
* 
** TIMCK ** ROUTINE TO CHECK TIME SCHED TABLE 
* 
*     JSB TIMCK 
*     RETURN
* 
***** 
* 
TIMCK NOP 
      JSB TIME      SAVE
      DEF *+2 
      DEF TIMT1     CURRENT TIME
TIMC3 JSB .FSB      GET-TIME ELAPSED FROM LAST CHECK**791022**
      DEF TSTIM     **791022**
      SSA,RSS      CORRECT
      JMP TIMC4    FOR CHANGE 
      JSB .FAD    **791022**
      DEF FLDAY    OF DAY  **791022** 
TIMC4 JSB .FAD     UPDATE SECONDS TO EXECUTION **791022** 
      DEF TSCNT    **791022** 
      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 
      JSB .FSB       SINCE THIS TASK MAY HAVE TO BE **791022**
      DEF TSPTR,I    **791022** 
      SSA           EXECUTED NOW ALSO 
      JMP TIMC2 
      JSB .FSB      IF POSITIVE, SET UP FOR TOMORROW **791022** 
      DEF FLDAY     **791022**
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 
* 
* 
*****************************ADDED 800627*********************************
TIM$   DEF $TIME
       DEF $TIME+1
******************************800627**************************************
TM     BSS     1
TIME   NOP
       JSB $LIBR
       OCT 0        MUST GO COMPLETE PRIVILEGE TO FREEZE  
       ISZ TIME     CLOCK 800627
       LDA TIME,I   GET PTR 
       STA TM          TO TIME
       ISZ TIME 
*******************************ADDED 800627*******************************
       JSB IXGET     RECREATE THE DLD FUNCTION OF GETTING 
       DEF RTIM1     TIME FROM $TIME IN THE L20.
       DEF TIM$+1 
RTIM1  STA TEMP     GET MINS AND SECONDS FIRST
       JSB IXGET
       DEF RTIM2
       DEF TIM$ 
RTIM2  LDB TEMP 
*******************************800627*****************************
       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 
       JSB .FLT     **791022**
       DST TM,I                    TEMPORARY TIME 
       LDA MINS 
       JSB .FLT     **791022**
      JSB .FMP     MINS IN SECONDS **791022** 
      DEF F.60     **791022** 
      JSB .FAD     **791022** 
      DEF TM,I     **791022** 
       DST TM,I 
       LDA MS10                    MS IN SECONDS
       JSB .FLT     **791022**
       JSB .FDV     **791022**
       DEF F.100    **791022**
      JSB .FAD     **791022** 
      DEF TM,I     **791022** 
       DST TM,I 
       JSB $LIBX                   RETURN 
       DEF TIME    **800627** 
      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   **791022** 
B170   OCT 170000  **791022** 
SEQ#   NOP         **791022** 
      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 
      OCT 177777    **791022**
      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     RETURN
      DEF FINDS,I  **791022** 
      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 
      OCT 177777  **791022**
      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,I  **791022** 
      SKP 
* 
***** 
* 
** TRDEL ** DELETE FROM TRAP TABLE THE ENTRY AT TRPTR 
* 
*     JSB TRDEL 
*     RETURN
* 
***** 
* 
TRDEL NOP 
      JSB $LIBR 
      OCT 177777  **791022**
      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,I  **791022** 
      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 
      OCT 177777   **791022***
      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,I  **791022**** 
      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 
      OCT 177777   **791022** 
      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,I  **791022** 
* 
** 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 48        # OF AVAIL.TRAPS  **791022**
      NOP           * INITIALIZED TO 0 *
      END 
                                                                