ASMB,R,L,C,F
      HED * RTE-B SCHED AND TRAP ROUTINES *   29102-60003 REV.B   
* 
*************************************************************** 
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1975.  ALL RIGHTS     * 
* RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      * 
* REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* 
* THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       * 
*************************************************************** 
* 
      NAM BSCHD,7 29102-60003 REV. B
***************************************************************** 
*      RTE-B BASIC SCHEDULER ROUTINES 
* 
*      REV.B  D.L.S.  11MAR75  COPYRIGHT
* 
*      LISTING                A-29102-60003-1 
*      SOURCE TAPE              29102-80003 
*      RELOC BINARY TAPE        29102-60003 
* 
****************************************************
* 
* THIS MODULE CONTAINS THOSE ROUTINES USED BY THE 
*  ATS-BASIC INTERPRETER TO PERFORM PRIORITY
*  SCHEDULING AND EXECUTION OF TASKS
* 
****************************************************
* 
* ENTRY POINTS: 
* 
      ENT SSETP,TRAP,ENABL,DSABL,TRNON,SSTRT,TIME 
      ENT TRPRI,TSNXT,TSTBL,TSEND,PREND,PRSTK 
* 
* EXTERNAL REFERENCES:
* 
      EXT ERROR,.STOP 
      EXT .ENTR,$TIME 
      EXT FINDS,FINDT,TRMAK,TRDEL 
      EXT TRTBL,TRPTR,TRNXT,TRFLG 
      EXT BIT15,TRMSK,PRMSK 
      EXT TRPNO,SEKNO,PRINO 
      EXT .2,.3,.4,.6,M1,M2,M3,M5,M256,M1000
      EXT MNEG
* 
SEQNO EQU SEKNO 
* 
* 
****************************************************
      SKP 
***** 
* 
** CNVRT ** CONVERT TIME FROM FLOATING POINT HHMMSS FORM
*           TO FLOATING POINT SECONDS 
* 
*     DLD TIME IN FLOATING POINT HHMMSS FORM
*     JSB CNVRT 
*     RETURN  .A.&.B.= FLOATING POINT SECONDS 
* 
* EXTERNALS REQUIRED: 
* 
      EXT ..FCM 
* 
***** 
* 
CNVRT NOP 
      DST WHOLE    SAVE INCOMING VALUE (HHMMSS) 
      FDV F.100 
      FIX 
      FLT 
      DST HHMM     HHMM= INT(HHMMSS/100)
      FDV F.100 
      FIX 
      FLT 
      DST HH       HH= INT(HHMM/100)
      FMP F.100 
      JSB ..FCM 
      FAD HHMM
      DST MM       MM=HHMM-HH00 
      DLD HHMM
      FMP F.100 
      JSB ..FCM 
      FAD WHOLE 
      DST SS       SS=HHMMSS-HHMM00 
      DLD HH
      FMP F.60
      FAD MM
      FMP F.60
      FAD SS       .A.&.B.= (HH*60+MM)*60+SS SECONDS
      JMP CNVRT,I 
* 
      SKP 
***** 
* 
** BSERR ** BASIC SCHEDULER ERROR ROUTINE 
* 
*     LDA ADDRESS OF ERROR NUMBER 
*     JSB BSERR 
*     RETURN
* 
*  NOTE:  TRANSFERS CONTROL TO .STOP, DOES NOT RETURN.
*         RESTARTS BASIC AT THE READY POINT 
* 
***** 
* 
BSERR NOP 
      STA BSER1 
      JSB ERROR 
      DEF *+3 
BSER1 NOP          (ADDRESS OF ERROR NUMBER)
      DEF SCHED    (ADDRESS OF STRING "SCHED")
      JMP BSERR,I  RETURN 
* 
      SKP 
***** 
* 
** SSETP ** MAKE TRAP TABLE ENTRY WITH GIVEN SEQ NBR AND PRIORITY 
* 
*     JSB SSETP 
*     DEF *+3 
*     DEF SEQUENCE NUMBER 
*     DEF PRIORITY
*     RETURN
* 
***** 
* 
SETPA NOP 
SETPB NOP 
SSETP NOP 
      JSB .ENTR     RETRIEVE
      DEF SETPA      PARAMETERS 
      LDA SETPA,I 
      STA SEQNO     SEQUENCE NUMBER 
      LDB SETPB,I 
      STB PRINO     PRIORITY
      CLA           ZERO IS DEFAULT VALUE FOR 
      STA TRPNO     TRAP NUMBER OF ENTRY
      LDA SEQNO     GET SEQ NBR 
      JSB FINDS     LOOK FOR ENTRY WITH THAT SEQ NBR
      JMP SETP2      NONE FOUND, MAKE NEW ENTRY 
      LDB TRPTR     FOUND,
      LDA 1,I       SAVE ENTIRE FIRST WORD
      STA SEQNO      SINCE TRAP BIT MAN BE SET
      INB 
      LDA 1,I       GET SECOND WORD OF ENTRY, 
      AND TRMSK      EXTRACT TRAP NBR 
      STA TRPNO       AND SAVE FOR MAKING NEW ENTRY 
      JSB TRDEL        THEN REMOVE THIS ENTRY 
SETP2 JSB TRMAK     MAKE NEW ENTRY
       JMP SETPE     NO ROOM
      JMP SSETP,I   RETURN
SETPE LDA AD2     TRAP TABLE FULL 
      JSB BSERR 
      JMP SSETP,I 
      SKP 
***** 
* 
** 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 ALSO CALLED (VIA TRACE) 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 TTRAP 
*     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
*     RETURN    .A.= RETURN SEQUENCE NUMBER 
* 
****************************************************
* 
* FINALLY TRAP IS CALLED TO INITIALIZE THE TRAP 
*  TABLE AT THE BEGINNING OF EXECUTION PHASE: 
* 
*     LDA POSITIVE, NON-ZERO INTEGER (ACTS AS FLAG) 
*     JSB TRAP
*     RETURN
* 
****************************************************
* 
TRAP  NOP 
      STB LYNNO     SAVE INCOMING LINE NUMBER 
      CPA M1000     IS THIS THE POLLING CALL
      JMP LINE      YES 
      CPA M256      IS THIS THE TASK RETURN CALL? 
      JMP TRRET     YES 
      SSA,RSS       IS THIS AN INITIALIZE TABLE CALL
      JMP INIT      YES, (NOTE HERE ALSO FOR TRAP 0)
      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 SEQNO      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 AD3 
      JSB BSERR 
      JSB .STOP 
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 SEQNO     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
      ISZ TRAP
      JMP TRAP,I    RETURN (P+2)
* 
** HERE TO CREATE A NEW ENTRY 
* 
STRA3 LDA D99       SET DEFAULT 
      STA PRINO      PRIORITY (99)
      JSB TRMAK       MAKE NEW ENTRY
      RSS           NO ROOM 
      JMP STRA4     DONE, RETURN
      LDA AD2 
      JSB BSERR 
      JSB .STOP 
* 
** 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  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 TRAP,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 TRAP,I    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 B2        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 TRAP,I    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
      JMP TRAP,I    RETURN (P+1)
      SKP 
***** 
* 
** ENABLE ** ENABLE TRAP TABLE ENTRY ASSOC. WITH GIVEN SEQ NBR
* 
*     JSB ENABL 
*     DEF *+2 
*     DEF SEQUENCE NBR
*     RETURN
* 
* NOTE: ATTEMPT TO ENABLE NON-EXISTENT TRAP TABLE ENTRY 
*       RESULTS IN TRANSFER TO ERROR ROUTINE. 
*       IF SEQ NBR IS ZERO, ALL ENTRIES ARE ENABLED 
***** 
* 
ENABA NOP 
ENABL NOP 
      JSB .ENTR 
      DEF ENABA 
      LDA ENABA,I   RETRIEVE SEQUENCE NUMBER
      SZA,RSS       ZERO MEANS ENABLE ALL ENTRIES 
      JMP ENAB1 
      JSB FINDS     LOOK FOR IT IN TRAP TABLE 
      JMP ENABE     NOT FOUND 
      LDB TRPTR     FOUND 
      INB 
      LDA 1,I       GET SECOND WORD OF ENTRY
      IOR BIT15    SET ENABLE BIT 
      STA 1,I 
      JMP ENAB4     RETURN
ENABE LDA AD4 
      JSB BSERR 
      JMP ENABL,I 
ENAB1 LDB TRTBL 
ENAB2 CPB TRNXT     END OF TABLE
      JMP ENAB4     YES, RETURN 
      INB 
      LDA 1,I       GET SECOND WORD OF ENTRY
      IOR BIT15    SET ENABLE BIT 
      STA 1,I 
      INB           GO TO NEXT ENTRY
      JMP ENAB2     LOOP
ENAB4 STB TRFLG     ENABLE TRAP TABLE SEARCH
      JMP ENABL,I 
      SKP 
***** 
* 
** DSABL  ** DISABLE TRAP TABLE ENTRY ASSOC WITH GIVEN SEQ NBR
* 
*     JSB DSABL 
*     DEF *+2 
*     DEF SEQUENCE NUMBER 
*     RETURN
* 
* NOTE: SEQ NBR=0 MEANS DISABLE ALL ENTRIES 
*       SEQ NBR POSITIVE MEANS DISABLE ASSOC ENTRY
*       SEQ NBR NEGATIVE MEANS DELETE ASSOC. ENTRY FROM TABLE 
* 
* NOTE: ENTRY NOT FOUND CAUSES TRANSFER TO ERROR ROUTINE
* 
***** 
DSABA NOP 
DSABL NOP 
      JSB .ENTR 
      DEF DSABA 
      LDA DSABA,I 
      SZA,RSS       ZERO MEANS ENABLE ALL ENTRIES 
      JMP DSAB1 
      SSA           NEG MEANS DELETE ENTRY
      JMP DSAB2 
      JSB FINDS     LOOK FOR ENTRY IN TRAP TABLE
       JMP DSABE    NOT FOUND 
      LDB TRPTR     FOUND 
      INB 
      LDA 1,I       GET SECOND WORD OF ENTRY
      ELA,CLE,ERA    CLEAR ENABLE BIT 
      STA 1,I 
      JMP DSABL,I   RETURN
DSABE LDA AD4 
      JSB BSERR 
      JMP DSABL,I 
* 
** HERE TO DISABLE WHOLE TABLE
* 
DSAB1 CLA            DONT NEED TO SEARCH TRAP TABLE 
      STA TRFLG      UNTIL SOMETHING HAPPENS
      LDB TRTBL 
DSAB3 CPB TRNXT     END OF TABLE? 
      JMP DSABL,I   YES 
      INB 
      LDA 1,I       GET SECOND WORD OF ENTRY
      ELA,CLE,ERA   CLEAR ENABLE BIT
      STA 1,I 
      INB           ADVANCE TO NEXT ENTRY 
      JMP DSAB3     LOOP
* 
** HERE TO DELETE ENTRY 
* 
DSAB2 CMA,INA       MAKE SEQ NBR POSITIVE 
      JSB FINDS     LOOK FOR ASSOC ENTRY
       JMP DSABE    NOT FOUND 
      JSB TRDEL     DELETE ENTRY
      JMP DSABL,I   RETURN
      SKP 
***** 
* 
** TRNON ** ROUTINE TO START TASK AT GIVEN TIME 
* 
*     JSB TRNON 
*     DEF *+3 
*     DEF SEQUENCE NUMBER 
*     DEF TIME TO START (FLOATING POINT VALUE HHMMSS) 
*     RETURN
* 
* NOTE: IF THE TIME SCHEDULING TABLE IS FULL, CONTROL 
*       WILL BE TRANSFERRED TO ERROR
* 
***** 
* 
TRNOB NOP 
TRNOA NOP 
TRNON NOP 
      JSB .ENTR 
      DEF TRNOB 
      DLD TRNOA,I 
      JSB CNVRT    GET TIME IN FLOAT PT SECONDS 
      DST TMPAR     THEN SET UP FOR PROCESSING
      LDA TRNOB,I  GET SEQ NBR TO PASS TO BSCED 
      JSB BSCED    SET UP TRAP & TIME SCHED TABLES
      JMP TRNON,I   THEN RETURN 
* 
      SKP 
***** 
* 
** SSTRT ** ROUTINE TO START TASK AFTER GIVEN DELAY 
* 
*     JSB SSTRT 
*     JSB SSTRT 
*     DEF *+3 
*     DEF SEQUENCE NUMBER 
*     DEF DELAY (FLOAT POINT SECONDS) 
*     RETURN
* 
***** 
* 
SSTRB NOP 
SSTRA NOP 
SSTRT NOP 
      JSB .ENTR 
      DEF SSTRB 
      JSB TIME      GET CURRENT TIME
      DEF *+2 
      DEF TMPAR 
      FAD SSTRA,I    THEN ADD DELAY 
      DST TMPAR       TO SET UP AS TIME OF DAY CALL 
      FSB FLDAY     IF GREATER THAN 2400 HOURS, 
      SSA          SUBTRACT ONE DAY 
      JMP SSTR1 
      DST TMPAR 
SSTR1 LDA SSTRB,I 
      JSB BSCED    SET UP TRAP & TIME SCHED TABLES
      JMP SSTRT,I 
* 
      SKP 
***** 
* 
** BSCED ** ROUTINE TO SET UP TRAP & TIME SCHED TABLES
*           FOR TRNON AND START ROUTINES
* 
*     DLD  TIME IN FLOATING POINT SECONDS 
*     DST TMPAR    IS PASSED IN TMPAR 
*     LDA SEQ NUMBER
*     JSB BSCED 
*     RETURN
* 
* NOTE: TABLE OVERFLOWS WILL CAUSE TRANSFER TO ERROR
* 
***** 
* 
BSCED NOP 
      STA SNPAR    SAVE SEQ NUMBER
      LDB TSNXT     IS TABLE
      CPB TSEND      ALREADY FULL ? 
      JMP TRNOE     YES 
      STB TSPTR     NO, INITIALIZE POINTER
      JMP NEXT1 
* 
** HERE TO EXAMINE NEXT ENTRY 
* 
NEXT  LDB TSPTR 
      ADB M1        MOVE
      LDA 1,I   LAST
      ADB B3          WORD
      STA 1,I          OF ENTRY 
      ADB M5        THEN MOVE 
      DLD 1,I        FIRST TWO WORDS
      DST TSPTR,I     OF ENTRY
      LDB TSPTR     MOVE POINTER
      ADB M3         TO NEXT ENTRY
      STB TSPTR 
NEXT1 CPB TSTBL     ARE WE AT OTHER END OF TABLE? 
      JMP INSRT     YES, MAKE ENTRY HERE
      ADB M3        NO, SET UP POINTER
      STB ENPTR      TO NEXT ENTRY TO BE CONSIDERED 
* 
** HERE TO TEST FOR TIME ORDERING 
* 
      DLD TMPAR     COMPARE GIVEN TIME
      FSB TSTIM      TO CURRENT TIME
      SSA 
      JMP ORDR1     GIVEN TIME < CURRENT TIME 
      DLD ENPTR,I   GIVEN TIME > OR = CURRENT TIME
      FSB TSTIM 
      SSA 
      JMP INSRT     ENTRY TIME < CURRENT TIME 
ORDR2 DLD TMPAR     ENTRY TIME > CURRENT TIME 
      FSB ENPTR,I 
      SSA 
      JMP INSRT     GIVEN TIME < ENTRY TIME 
      JMP NEXT      GIVEN TIME > OR = ENTRY TIME
ORDR1 DLD ENPTR,I 
      FSB TSTIM 
      SSA 
      JMP ORDR2     ENTRY TIME < CURRENT TIME 
      JMP NEXT      GIVEN TIME > CURRENT TIME 
* 
** HERE TO INSERT NEW ENTRY AT TSPTR
* 
INSRT DLD TMPAR     SET UP
      DST TSPTR,I    TIME PART OF ENTRY 
      LDB TSPTR 
      ADB B2        SET UP
      LDA SNPAR     SEQUENCE NUMBER 
      STA 1,I         PART OF ENTRY 
      LDA TSNXT     UPDATE
      STA 1          TSNXT POINTER
      ADA B3
      STA TSNXT 
      CPB TSPTR     CHECK IF NEW ENTRY NEXT TO EXEC 
      RSS           YES 
      JMP INSR1     NOS MAKE TRAP ENTRY NOW 
* 
** HERE IF NEW ENTRY WILL EXECUTE NEXT
* 
      DLD TSTIM     GET NEW 
      FSB TSPTR,I    MINUS TIME TILL NEXT EXECUTION 
      SZA,RSS      IF TO GO NOW,
      JMP INSR3     ALLOW TSCNT TO BE ZERO
      SSA          IF POSITIVE
      JMP INSR3 
      FSB FLDAY      SUBTRACT ONE DAY 
INSR3 DST TSCNT     THEN SET UP COUNTER WITH NEW VAL
* 
** HERE TO MAKE TRAP TABLE ENTRY
* 
INSR1 LDA SNPAR 
      JSB FINDS     DOES A TRAP ENTRY ALREADY EXIST 
      JMP INSR2      NO, MAKE ONE 
      LDB TRPTR     YES, SET ENABLE BIT 
      INB 
      LDA 1,I 
      IOR BIT15 
      STA 1,I 
      JMP BSCED,I   RETURN
INSR2 LDA SNPAR     SET UP
      STA SEQNO      SEQUENCE NUMBER
      CLA 
      STA TRPNO      TRAP NUMBER (DEFAULT = 0)
      LDA D99 
      STA PRINO      PRIORITY (DEFAULT = 99)
      JSB TRMAK     MAKE TRAP TABLE ENTRY 
       RSS           NO ROOM
      JMP BSCED,I   DONE, RETURN
      LDA AD2 
      JSB BSERR 
      JMP BSCED,I 
TRNOE LDA AD5     TIME SCHED TABLE FULL 
      JSB BSERR 
      JMP BSCED,I 
      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 AD6 
      JSB BSERR 
      JSB .STOP 
      SKP 
*******************  PRIORITY STACK **************
* 
PRSTK DEF *+1       POINTER TO FIRST ENTRY
D100  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 
****************************************************
* 
**************** CONSTANTS *************************
SCHED DEC 5 
      ASC 3,SCHED 
BSCT2 NOP           TEMPORARY 
LYNNO NOP           CONTENT OF .B. IN TRAP CALLS
TFLAG NOP           =-1 IF GIVEN SEQ NBR NEGATIVE 
ENPTR NOP           POINTER TO NEXT ENTRY (IN TIMCK)
SNPAR NOP 
TIMT1 BSS 2         TEMPORARY 
FLDAY DEC 86400.    FLOATIN POINT # SEC IN DAY
F.100 DEC 100.
F.60  DEC 60. 
TMPAR BSS 2 
WHOLE BSS 2 
HHMM  BSS 2 
HH    BSS 2 
MM    BSS 2 
SS    BSS 2 
MAXNG EQU MNEG     MAXIMUM NEG FLOAT PT NBR 
B2    EQU .2
B3    EQU .3
.5    DEC 5 
D99   DEC 99
AD2   DEF .2
AD3 DEF .3
AD4 DEF .4
AD5  DEF .5 
AD6  DEF .6 
****************************************************
      SKP 
****************************************************************
* 
* 
*      RTE-B 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     .ENTR
       DEF     TM 
       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 D100                    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 
       JMP TIME,I                  RETURN 
* 
.6000 DEC 6000
PRS1  OCT 153000
PRS2  OCT 203 
MS10  BSS 1 
MINS  BSS 1 
      END 
                                                                                                                                                            