ASMB,R,Q,X
      HED << 09580 MULTI-STATION TRAP ROUTINE >>  09580-16060  790426 
      NAM TRAP,7 09580-16060 REV.1926 790426
* 
*---------------------------------------------------------------
* 
*     RELOC.     09580-16060
*     SOURCE     09580-18060
* 
* 
*     HP 92425A TEST SYSTEM SOFTWARE IS THE PROPRIETARY 
*     MATERIAL OF THE HEWLETT-PACKARD COMPANY.  USE AND 
*     DISCLOSURE THEREOF ARE RESTRICTED BY WRITTEN AGREEMENT. 
* 
*     (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977. 
*     ALL RIGHTS RESERVED.  NO PART OF THIS PROGRAM 
*     MAY BE PHOTOCOPIED, REPRODUCED OR TRANSLATED
*     TO ANOTHER PROGRAM LANGUAGE WITHOUT THE PRIOR 
*     WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY. 
* 
*---------------------------------------------------------------
* 
* ENTRY POINTS: 
* 
      ENT TRAP
* 
* 
* 
* EXTERNAL REFERENCES:
* 
      EXT $LIBR,$LIBX 
      EXT TABL$,STN$,TRTBL,TREND,ISN
* 
* 
* 
* 
** 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, NOT USED WITH THIS CALL) 
*     RETURN    .A.= RETURN SEQUENCE NUMBER 
* 
****************************************************
* 
* WHEN TRAP IS CALLED TO INITIALIZE THE TRAP
*  TABLE AT THE BEGINNING OF EXECUTION PHASE: 
* 
*     LDA  1 DECIMAL   INDICATES AN INITIALIZE REQUEST
*     JSB TRAP
*      JMP ERR    (ERROR RETURN, NOT USED WITH THIS CALL) 
*     RETURN      IF .B.= -1, THEN TRAP TABLE NOT AVAILABLE 
* 
****************************************************
* 
* WHEN TRAP IS CALLED TO FREE UP A TRAP TABLE AT THE END OF 
*  EXECUTION PHASE: 
* 
*     LDA 2  DECIMAL INDICATES A TERMINATE REQUEST
*     JSB TRAP
*     JMP ERROR  (ERROR RETURN NOT USED WITH THIS CALL) 
*     RETURN
* 
********************************************************* 
      SKP 
****************************************************
* 
* PCO 1926
* 1. ENHANCED INIT FUNCTION TO CLEAR ALL TABLES FOR CURRENT 
*    STATION BEFORE SETTING UP NEW TABLE. PREVIOUS VERSION
*    OF THIS ROUTINE ASSUMED THAT NO TABLE WAS SET UP. AS A 
*    RESULT MULTIPLE TABLES WERE SETUP DUE TO "CHAIN" COMMANDS
*    (WHICH "INIT"'S A TABLE WITHOUT "TERM"ING PREVIOUS TABLE) AND
*    "OF,BASIC,1" (WHICH ENDS BASIC WITHOUT CLEARING THE TABLE).
* 2. ENHANCED TERM (CASE 5) TO CLEAR ALL TABLES FOR CURRENT 
*    STATION INSTEAD OF JUST FIRST TABLE FOUND. THIS WAS DONE 
*    TO TAKE CARE OF ANY EXTRA TABLES THAT MIGHT BE SETUP 
*    INSPITE OF THE ENHANCEMENTS TO "INIT" (CASE 4).
* 3. NOTE: SERIOUS PROBLEMS MAY OCCUR FOR FOLLOWING CASES:
*    -THE LENGTH OF A TRAP TABLE IS LESS THAN THE MINIMUM 
*     NEEDED FOR ONE TRAP (CURRENTLY FIVE WORDS). 
*    -THIS ROUTINE IS CALLED FROM OTHER THAN SESSION MODE.
*     IE. THE VALUE RETURNED BY "ISN" IS ZERO.
*     A CHECK WAS PUT IN THE "CLTBL" SUBROUTINE TO CHECK
*     FOR THIS CASE 
* 
********************************************************* 
      SKP 
TRAP  NOP 
      JSB $LIBR     TURN OFF INTERRUPTS 
      NOP             NOW 
      STA .X.       SAVE A REG
      STB SEQ       SAVE B REG
      JSB ISN       GET STATION # 
      DEF *+1 
      STA STN 
* 
      JSB FNDTB     FIND TABLE FOR CURRENT STATAION.
      JMP TER1      TABLE FOR THIS STATION NOT FOUND. 
* 
      LDA .X.       RETRIEVE CALL PARAMETER.
      CPA M1000     TEST IF THIS IS POLL REQUEST. 
      JMP POLL      YES. (CASE 2) 
* 
      CPA M256      TEST IF RETURN FROM TRAP PROCESSING.
      JMP TRRET     YES. (CASE 3) 
* 
      CPA D1        INITIALIZATION REQUEST? 
      JMP INIT      YES. (CASE 4) 
* 
      CPA D2        BASIC TERMINATION REQUEST?
      JMP TERM      YES. (CASE 5) 
* 
      JMP CASE1     IF NONE OF ABOVE, ASSUME CREATE TRAP. 
* 
TER1  LDA .X.       ERROR IN SEARCH FOR TABLE OK IF INIT
      CPA D1        REQUEST.
      JMP INIT      OK. (CASE 4)
* 
      JMP ERR1      NOT INIT. MAKE ERROR EXIT.
      SKP 
*          CASE 1  CREATE TRAP ENTRY
* 
*                  TEST FOR LEGAL TRAP NUMBER   TABL$>=TRAP#>0
* 
CASE1 CMA           MAKE TRAP NUMBER POSITIVE - 1 
      SSA           TEST TRAP # NOT >= 0
      JMP ERR1        ERROR, TRAP >= 0
      INA           ADD 1 TO FINISH COMPLEMENTING 
      LDB TABL$     CREATE THE COMPLEMENT OF THE
      CMB             EXPRS (TABLE SIZE + 1)
      ADB .A. 
      SSB,RSS       TRAP # > TABL$? 
      JMP ERR1        YES, EXIT 
      STA ADFLG,I     NO, ITS OK. STORE IN FLG TO ENABLE SEARCH 
      SPC 2 
*               INSURE SEQ NUMBER >0.  IF NOT, SET .X. = -1 
* 
      CLB           USE .X. AS FLAG FOR NEG SEQ 
      LDA SEQ       \ 
      SSA,RSS        \  SET E IF SEQ # IS NEG.
      JMP FINDS       >  IF NEG THEN COMPLEMENT 
      CMB            /
      CMA,INA       / 
      STA SEQ 
      SPC 2 
*               TEST IF SEQ # ALREADY USED => ILLEGAL 
* 
FINDS STB .X.       STORE FLAG FOR NEG SEQ IN .X. 
      LDA ADTBL     SET ADDRESS TO ACTUAL TRAP
      STA .Y.       STORE ADDRESS IN Y REG
      CLB           USE .B. AS TRAP INDEX 
FIND1 INB           INCREMENT INDEX 
      LDA .Y.,I     LOAD TRAP CELL CONTENTS 
      AND MASK      LOOK AT SEQUENCE # ONLY 
      CPA SEQ       SAME AS NEW SEQ # ? 
      JMP FIND2       YES, CHECK FOR TRAP # 
      ISZ .Y.         NO TRY AGAIN
      CPB TABL$     END OF TABLE ?
      JMP CRTRP       PHEW, YES, CREATE TRAP CELL 
      JMP FIND1       NO, ONE MORE TIME!
      SPC 2 
FIND2 CPB ADFLG,I   SEQ # AT SAME TRAP? 
      JMP CRTRP       YES, OK, CREATE IT AGAIN
ERR2  LDA D2          NO ERROR 2
      JMP RTRAP+1   EXIT
      SPC 2 
*               CREATE NEW TRAP CELL
* 
CRTRP LDB ADTBL     GET ADDRESS TRAP TABLE - 1
      ADB M1
      ADB ADFLG,I   ADD IN TRAP # 
      CLA 
      ISZ .X.       PRESERVE OLD TRAPS? 
      JMP CRTR1       NO
      LDA .B.,I       YES 
      AND BITS      PRESERVE PROCESS & TRAP BITS
CRTR1 IOR SEQ       ADD IN SEQ #
      STA .B.,I     STORE IN  TABLE 
      JMP RTRAP     EXIT
      SKP 
*          CASE 2   CHECK TRAP TABLE
*                   PRIOR TO EACH BASIC LINE
* 
POLL  LDB ADFLG,I   SEARCH TRAP TABLE?
      SZB,RSS 
      JMP POLEX     NO,EXIT 
      SPC 2 
*               SEARCH TRAP TABLE 
* 
      LDB ADPRI,I   LOAD CURRENT PRIORITY LEVEL 
      CMB,INB 
POL1  INB 
      SZB,RSS       DONE? 
      JMP NOPOL       YES, EXIT!
      LDA ADTBL,I     NO, GET TRAP CELL 
      SSA           TRAP SET? 
      JMP POL3        YES 
POL2  ISZ ADTBL       NO, LOOP AGAIN
      JMP POL1
      SPC 2 
*               TRAP SET, TEST SEQ # > 0
* 
POL3  AND MASK
      SZA,RSS       IS SEQ# > 0?
      JMP POL2       NO, KEEP SEARCHING 
      STA .X.         YES, KEEP NEW SEQ#
      IOR BIT14     SET 'IN PROCESS' BIT
      STA ADTBL,I   STORE TRAP CELL IN TABLE (CLEAR TRAP) 
      ADB ADPRI,I   CALCULATE NEW PRIORITY
      STB ADPRI,I 
      SPC 2 
*               SET UP FOR RETURN 
* 
      LDA .X.       RETURN WITH NEW TRAP
      LDB SEQ,I 
      CMB,INB 
      JMP RTRAP 
      SPC 2 
NOPOL CLA           NO TRAPS SET
      STA ADFLG,I   EXIT
POLEX LDA M1        NO SEARCH 
      LDB SEQ       EXIT
      JMP RTRAP 
      SKP 
*          CASE 3   RETURN FROM INTERRUPT STARTED TASK
* 
TRRET LDA ADTBL 
      ADA M1
      ADA ADPRI,I 
      STA ADTBL 
      LDA ADTBL,I 
      AND MASK2     CLEAR 'IN PROCESS' BIT
      STA ADTBL,I 
      LDB TABL$     CREATE LOOP INDEX 
      CMB,INB 
      ADB ADPRI,I 
TRRT1 ISZ ADTBL     SEARCH TRAP TABLE 
      SZB,RSS         FOR 
      JMP SETPR       NEXT
      LDA ADTBL,I     CELL
      AND BIT14       WITH
      SZA             'IN PROCESS'
      JMP SETPR       BIT 
      INB             SET 
      JMP TRRT1 
      SPC 2 
SETPR LDA TABL$     THEN UPDATE CURRENT 
      ADA .B.        PRIORITY 
      INA 
      STA ADPRI,I 
      LDA SEQ       MAKE SEQ# 
      CMA,INA        POSITIVE 
      STA ADFLG,I   FLG # 0, SO SEARCH TABLE
      JMP RTRAP     EXIT
      SKP 
*          CASE 4   INITIALIZE TRAP TABLES
* 
INIT  JSB CLTBL     CLEAR ALL TABLES FOR THIS STATION.
* 
      CLA           OLD TABLES HAVE BEEN DESTROYED. 
      JSB FNDTB     NOW FIND EMPTY TABLE. 
* 
      JMP ERR1      OOPS. NO EMPTY TABLE. 
* 
      LDA STN       EMPTY TABLE FOUND.
      STA PTR,I     MARK TABLES FOR STN 
      LDB STN$      LOAD B WITH STATION'S SIZE
      ADB M1
      CLA 
INIT1 ISZ PTR       CLEAR ALL CELLS IN STATION'S TABLE
      STA PTR,I 
      ADB M1
      SZB 
      JMP INIT1 
      SPC 2 
*               SET MINIMUM PRIORITY
* 
      LDA TABL$     SET PRIORITY TO TABLE 
      INA            SIZE + 1 
      STA ADPRI,I 
      JMP RTRAP 
      SKP 
*          CASE 5   BASIC TERMINATION 
TERM  JSB CLTBL     CLEAR ALL TABLES FOR THIS STATION.
* 
RTRAP ISZ TRAP      NORMAL EXIT 
      JSB $LIBX     ERROR EXIT
      DEF TRAP
      SPC 5 
ERR1  CLB           IF THIS IS THE INITIALIZATION CASE
      LDA D1        SEND .B.= -1 TO DISABLE LINE POLLING
      CPA .X. 
      LDB M1
      JMP RTRAP+1 
      SKP 
*          SUBROUTINE TO SEARCH FOR TABLE FOR CURRENT  STATION. 
FNDTB NOP 
      STA .Y.         SAVE STATION NUMBER TO BE LOOKED FOR. 
* 
      LDA TRTBL 
FINDC STA PTR 
      LDB TREND       CHECK IF AT END OF TABLE. 
      CMB,INB 
      ADB .A. 
      SSB,RSS 
* 
      JMP FNDTB,I     END OF TABLE. STATION NOT FOUND.
* 
      LDB .A.,I       CHECK IF CURRENT TABLE IS 
      CPB .Y.         RIGHT ONE.
* 
      JMP ENDSU       YES! SET UP POINTERS
* 
      ADA STN$        NO. GO TO NEXT TABLE AND TRY
      JMP FINDC       AGAIN.
* 
ENDSU ADA D2        CREATE ADDRESS FOR
      STA ADPRI       'CURRENT PRIORITY'
* 
      INA           CREATE ADDRESS FOR
      STA ADFLG       'SEARCH TABLE FLAG' 
* 
      INA           CREATE ADDRESS FOR
      STA ADTBL       'FIRST ENTRY IN TABLE'
* 
      ISZ FNDTB     SET SUCCESSFUL RETURN.
      JMP FNDTB,I 
      SKP 
*     SUBROUTINE TO CLEAR ALL TABLES FOR GIVEN STATION. 
*       "STN" CONTAINS NUMBER OF STAION TO BE CLEARED.
* 
CLTBL NOP 
CLTB1 LDA STN 
      JSB FNDTB     SEARCH FOR TABLE FOR CURRENT STATION. 
* 
      JMP CLTBL,I   TABLE NOT FOUND. END OF SEARCH. 
* 
      CLB           CLEAR TABLE OF PREVIOUS ENTRIES.
      STB PTR,I     SET STN# TO ZERO. 
* 
      ISZ PTR 
      STB PTR,I     SET CRT# TO ZERO. 
* 
      CPB STN      CHECK FOR NONE SESSION MODE. 
      JMP CLTBL,I  RETURN AFTER "CLEARING" FIRST UNUSED TABLE.
* 
      JMP CLTB1     SEARCH FOR NEXT TABLE.
      SKP 
*          CONSTANTS AND VARIBLES 
* 
PTR   NOP 
ADPRI NOP 
ADFLG NOP 
ADTBL NOP 
SEQ   NOP 
STN   NOP 
.X.   NOP 
.Y.   NOP 
.A.   EQU 0 
.B.   EQU 1 
      SPC 5 
D1    DEC 1 
D2    DEC 2 
M1    DEC -1
M256  DEC -256
M1000 DEC -1000 
      SPC 5 
MASK  OCT 37777 
MASK2 OCT 137777
BITS  OCT 140000
BIT14 OCT 40000 
      END 
                                                                              