ASMB,R,F,L,C
      HED * BASIC SCHED AND TRAP ROUTINES *   92101-19013 REV. A
      NAM SCHD,7 92101-16013 750724 
* 
* 
**************************************************************
* (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.  *
**************************************************************
***************************************************************** 
* 
*      RTE BASIC SCHEDULER ROUTINES 
* 
*      REV A
* 
*      LISTING                  92101-19013 
*      SOURCE TAPE              92101-18013 
*      RELOC BINARY TAPE        92101-16013 
* 
****************************************************
* 
* THIS MODULE CONTAINS THOSE ROUTINES USED BY THE 
*  BASIC INTERPRETER TO PERFORM PRIORITY
*  SCHEDULING AND EXECUTION OF TASKS
* 
****************************************************
* 
* ENTRY POINTS: 
* 
      ENT TTYS,SSETP,ENABL,DSABL,TRNON,SSTRT
* 
* EXTERNAL REFERENCES:
* 
      EXT ERROR,TIME,EXEC 
      EXT $LIBR,$LIBX 
      EXT .ENTR,TRAP#,TSNXT,TSEND,TSTBL,TSTIM,TSCNT,TSPTR 
      EXT FINDS,TRMAK,TRDEL 
      EXT TRTBL,TRPTR,TRNXT,TRFLG 
      EXT TRMSK,TRPNO,SEKNO,PRINO 
* 
SEQNO EQU SEKNO 
* 
* 
      SUP PRESS MULTIPLE LISTING
****************************************************
      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
* 
* 
***** 
* 
BSERR NOP 
      STA BSER1 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
      JSB ERROR 
      DEF *+3 
BSER1 NOP          (ADDRESS OF ERROR NUMBER)
      DEF SCHED    (ADDRESS OF STRING "SCHED")
      JSB $LIBR 
      NOP 
      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 
      JSB $LIBR 
      NOP 
      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 SETP3     RETURN
SETPE LDA AD2     TRAP TABLE FULL 
      JSB BSERR 
SETP3 JSB $LIBX 
      DEF SSETP 
* 
* 
      SKP 
******
* 
**  TTYS ALLOWS THE USER TO SCHEDULE A TASK (GOSUB) WITH A
**   TRAP BY TYPING ANY KEY ON AN AUXILLIARY TELETYPE.
* 
* 
*      JSB TTYS 
*      DEF *+3
*      DEF <LOGICAL UNIT # OF THE AUXILLIARY TTY> 
*      DEF <TRAP # TO BE ACTIVATED> 
*      RETURN 
* 
* 
*      NOTE: IF LOGICAL UNIT # IS LESS THAN 7 THEN AN ERROR 
*            MESSAGE 'ERROR TTYS-1' IS PRINTED. 
* 
UNIT  NOP 
TRAPN NOP 
TTYS  NOP 
      JSB .ENTR 
      DEF UNIT
      LDA UNIT,I    GET UNIT#  AND GIVE ERROR IF LESS 
      ADA M7          THAN 7
      SSA 
      JMP ERR       ERROR 
      LDA UNIT,I    GET LU# 
      IOR B2000     MASK IN CONTROL CODE
      STA SNPAR 
      JSB EXEC      ENABLE
      DEF *+3         AUXILLIARY
      DEF .3            TERMINAL
      DEF SNPAR 
      LDA TRAPN,I   GET TRAP #
      JSB $LIBR     BREAK FENCE 
      NOP 
      STA TRAP#     STORE TRAP NUMBER 
      JSB $LIBX     SEW UP THE FENCE
      DEF TTYS
* 
ERR  JSB ERROR      ERROR RETURN
      DEF *+3 
      DEF .1
      DEF ERRM
      JMP TTYS,I
      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 
      JSB $LIBR 
      NOP 
      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 ENAB3     RETURN
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
ENAB3 JSB $LIBX 
      DEF ENABL 
      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 
      JSB $LIBR 
      NOP 
      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 DSAB4     RETURN
DSABE LDA AD4 
      JSB BSERR 
DSAB4 JSB $LIBX 
      DEF DSABL 
* 
** 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 DSAB4     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 DSAB4     RETURN
* 
*  CONSTANTS
* 
.1    DEC 1 
.2    DEC 2 
.3    DEC 3 
.4    DEC 4 
.6    DEC 6 
M1    DEC -1
M3    DEC -3
M5    DEC -5
M7    DEC -7
M256  DEC -256
MNEG  OCT 100000    MAXIMUM NEG FLOATING
      OCT 376        POINT NUMBER 
BIT15 EQU MNEG
      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 
      JSB $LIBR 
      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 BSCE1     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 BSCE1     DONE, RETURN
      LDA AD2 
      JSB BSERR 
      JMP BSCE1 
TRNOE LDA AD5     TIME SCHED TABLE FULL 
      JSB BSERR 
BSCE1 JSB $LIBX 
      DEF BSCED 
      SKP 
****************************************************
* 
**************** CONSTANTS *************************
SCHED DEC 5 
      ASC 3,SCHED 
ERRM  DEC 3 
      ASC  2,TTY
ENPTR NOP           POINTER TO NEXT ENTRY (IN TIMCK)
SNPAR NOP 
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 
B2    EQU .2
B3    EQU .3
B2000 OCT 2000
.5    DEC 5 
D99   DEC 99
AD2   DEF .2
AD4 DEF .4
AD5  DEF .5 
****************************************************
      END 
