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