ASMB,R,L,C     ** RTE-M TIME MODULE -SCHEDULING ****
*     NAME  : $MTS
*     SOURCE: 92064-18021 
*     RELOC:  92064-16009 
*_    PROGMR: E.J.W.  BASED ON RTE-III VERSIONS G.A.A.
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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 $MTS,0  92064-16009  REV.1901  781102 
* 
      SUP 
********************************************************************
* 
      ENT $TADD,$TREM,$TLST 
      ENT $ETTM,$TIMR 
      ENT $ITRQ,$TMRQ,$ONTM,$TIRQ,$CHTO,$STRQ 
* 
      EXT $LIST,$XEQ,$INER,$MSEX,$EQCK
      EXT $TIME,$TIMV,$WORK,$MSBF,$CVT1,$CVT3 
      SKP 
$TLST NOP           SUBROUTINE TO SEARCH TIME LIST
      LDB TLIST    TIME LIST
CL011 CLE,SZB,RSS   IF THRU PROCESSING IT, GO 
      JMP $TLST,I    RETURN TO PROCESS TIME-OUTS
      STB TEMP3     SAVE TIME LINK
      ADB D2        B NOW PTS TO IDSEG TIME VAULE 
      DLD B,I       GET THE SCHEDULE TIME 
      CPA $TIME     IF BOTH WORDS MATCH 
      CCE           THEN
      CPB $TIME+1   THE 
      SEZ,RSS       TIME IS 
      JMP CH010 
      LDB TEMP3 
      JSB $TMSC     NOW SO SCHEDULE THE PROG. 
* 
*     INCREMENT TO NEXT PROGRAM IN LIST 
* 
CH010 LDB TEMP3,I  GET ADDR OF NEXT PROG IN LIST
      JMP CL011    GO TO COMPARE NEXT PROG IN LIST
* 
* 
* 
* 
*     PROGRAM TO BE SCHEDULED 
* 
*     THE $TMSC ROUTINE SCHEDULES THE PROGRAM IF DORMANT
*     THEN COMPUTES ITS NEXT SCHEDULE TIME FROM ITS 
*     RES CODE AND MULT FACTOR IN ITS ID-SEGMENT. 
*     IF THE RES CODE IS ZERO THE PROGRAM IS REMOVED FROM 
*     THE TIME LIST.
* 
*     THE CALLING SEQUENCE IS:
*     (B) = POINTER TO ADDRESS OF THE TIME LINK WORD
*     JSB $TMSC 
* 
$TMSC NOP 
      STB TLINC     COMPUTE THE STATUS ADDRESS
      ADB N1
      LDA B,I       GET THE STATUS
      AND D15       GET THE LOW BITS
      CCE,SZA       IF NOT DORMANT
      JMP CH026     FORGIT IT 
* 
      ADB D13       INDEX TO WORD 29
      LDA B,I        AND SET NEW-RUN FLAG 
      RAL,ERA        PRESERVING CONSOLE LU INFO 
      STA B,I 
      ADB DM28      SET (B) TO ID SEG ADDR
      JSB $LIST    CALL LIST PROCESSOR TO SCHED PROG
      OCT 401       THE PROGRAM 
* 
*     CHECK IF NEXT SCHEDULE TIME TO BE COMPUTED
* 
CH026 LDB TLINC 
      INB 
      LDA B,I       RES CODE/MULT FACTOR
      AND B7777 
      SZA,RSS       IF ZERO, THEN NO NEW START TIME 
      JMP CH040     GO REMOVE PROG FROM LIST
      STA TEMP      SAVE MULTIPLICATION FACTOR
      JSB TUDAT     GO UPDATE THE SCHEDULE TIME 
      JMP $TMSC,I   RETURN
* 
*     REMOVE PROGRAM FROM TIME LIST 
* 
CH040 LDA B10K      CLEAR THE RESOLUTION TOO. 
      STA B,I       AND RESET IN THE ID-SEGMENT.
      LDB TLINC     VALUE OF TLINK
      JSB $TREM    GO TO REMOVE PROGRAM 
      JMP $TMSC,I   GO TO PROCESS NEXT PROGRAM
      HED REAL TIME CLOCK PROCESSING  ID-TIME UPDATE
*     TUDAT USES THE RES AND MULT FROM THE ID-SEGMENT TO
*     UPDATE THE EXECUTE TIME OF THE PROGRAM WHOSE ID-
*     SEGMENT RESOLUTION CODE ADDRESS IS IN B.
* 
*     CALLING SEQUENCE: 
* 
*     SET TEMP TO THE MULT FACTOR 
*     SET B    TO THE RES CODE ADDRESS
*     JSB TUDAT 
* 
TUDAT NOP           ENTRY POINT 
      LDA B,I       GET THE RES CODE TO A 
      INB           SET 
      STB TEMP1     TEMPS TO THE TIME 
      INB           ADDRESSES 
      STB TEMP2     IN THE ID-SEGMENT 
      RAL,CLE,SLA,RAL IF HOURS
      JMP HR        GO DO SPECIAL HOURS UPDATE
      RAL,CLE       ELSE SET UP 
      AND D7        FOR THE APPROPIATE
      ADA TTAB      BASE
      LDA A,I       AND MULTIPLY BY THE MULT. 
CH030 MPY TEMP
CH031 ADA TEMP1,I   ADD THE CURRENT VALUE 
      SEZ           IF OVERFLOW 
      INB           STEP B
      ADB TEMP2,I   ADD THE HIGH BITS.
      STA TEMP1,I   RESTORE THE NEW TIME
      STB TEMP2,I   TO THE ID-SEG.
      CLE,SSB       IF NEGATIVE RESULT THEN 
      JMP TUDAT,I   EXIT
* 
      LDA RS1       POSITIVE RESULT SO ADD NEG. OF
      LDB RS2       DAY TO MAKE NEGATIVE
      JMP CH031 
* 
HR    LDA TEMP      FOR HOURS FIRST 
      CLB           INSURE LESS THAN
      DIV D24       ONE DAY 
      LDA B         RESULT IS MODULO 24 
      MPY D15       NOW SET UP TO MULTIPLY BY 60,000
      STA TEMP      IN TWO STEPS TO PREVENT OVERFLOW
      LDA D24K      FIRST BY 15,
      JMP CH030     AND NEXT BY 24,000
* 
TLIST NOP          TOP OF TIME SCHEDULE LIST
TTAB  DEF * 
TTAB1 DEC 1 
TTAB2 DEC 100 
TTAB3 DEC 6000
D24K  DEC 24000 
D2    DEC 2 
D7    DEC 7 
D13   DEC 13
D15   DEC 15
D16   DEC 16
D24   DEC 24
DM28  DEC -28 
N1    DEC -1
B7777 OCT 7777
TCC   NOP           DO NOT REARRANGE THESE 6 WORDS !! 
TEMP  NOP 
TEMP1 NOP 
TEMP2 NOP 
TEMP3 NOP 
TEMP4 NOP 
DTCC DEF TCC
RS1   OCT 25000 
RS2   OCT 177574
D60   DEC 60
TLINC NOP 
      SPC 4 
      HED $TIMR ROUTINE SETS UP ID SEGMENT TIME VALUES
*        THE $TIMR ROUTINE WHICH ALLOWS USER TO ENTER TIME VALUES  *
*        INTO AN ID SEGMENT FUNCTIONS AS FOLLOWS:                  *
*              IF PROG VALUE IS ZERO, THEN CURRENT EXECUTING PROG. *
*                   AND IF NON-ZERO, THEN SEARCH FOR ID SEGMENT    *
*                   ADDRESS.                                       *
*              IF RESOLUTION CODE IS NON-ZERO, THEN RES/MULT WORD  *
*                   STORED. THE NEXT VALUE IS CHECKED FOR + OR -.  *
*                   IF PLUS, THEN NEXT START TIME VALUES GIVEN AND *
*                   ARE STORED AND PROGRAM ENTERED INTO TIME LIST. *
*                   IF MINUS, THEN THE COMPLEMENT OF VALUE IS ADDED*
*                   TO THE CURRENT TIME AND ENTERED INTO THE ID    *
*                   SEGMENT. IF PROG VALUE IS ZERO, THIS IS TO BE A*
*                   TIME DELAY OF CURRENT PROGRAM AND THUS PROGRAM *
*                   IS SET DORMANT VIA LINK PROCESSOR BUT POINT OF *
*                   SUSPENSION IS NOT CLEARED. IF PROG VALUE IS NON*
*                   ZERO, THEN PROGRAM IS ENTERED INTO TIME LIST.  *
*                   THIS IS METHOD FOR SPECIFYING AN INITIAL OFFSET*
*                   TIME.                                          *
* 
*     ROUTINE TO SET ID SEGMENT TIME VALUES 
*         CALLING SEQUENCE
*              JSB EXEC 
*              DEF *+6  OR DEF *+9
*              DEF  REQUEST CODE ADDRESS                   RQP1 
*              DEF  PROG                                   RQP2 
*              DEF  RES                                    RQP3 
*              DEF  MULT                                   RQP4 
*              DEF  OFFSET OR DEF HRS                      RQP5 
*                             DEF MINS                     RQP6 
*                             DEF SECS                     RQP7 
*                             DEF TENS OF MSEC             RQP8 
*         WHERE 
*              PROG = 0 IF CURRENTLY EXECUTING
*                   = ADDRESS OF PROGRAM NAME 
*              RES  = 1 FOR 10 MILLISECOND RESOLUTION 
*                   = 2 FOR SECONDS RESOLUTION LIST 
*                   = 3 FOR MINUTES RESOLUTION LIST 
*                   = 4 FOR HOURS RESOLUTION LIST 
*              MULT = 0 FOR N0 MULTIPLE VALUE 
*                   = N A POSITIVE INTEGER FOR COMPUTING
*                        NEXT SCHEDULE TIME 
*             OFFSET= M A NEGATIVE INTEGER FOR COMPUTING INITIAL
*                        OFFSET TIME
*                HRS= START TIME HOURS
*               MINS= START TIME MINUTES
*               SECS= START TIME SECONDS
*               TENS= START TIME TENS OF MILLISECONDS 
* 
*         EXEC PRE-PROCESSOR CHECKS FOR RESOLUTION CODE 
*         ERRORS AND FINDS THE ID-SEGMENT ADDRESS.
* 
*         CALLING SEQUENCE: 
* 
*         LDB ID-SEGMENT ADDRESS
*         JMP $TIMR 
      SKP 
$TIMR ADB D16       GET ADDRESS OF TIME LINK
      STB TCC       AND SAVE IT 
      INB           STEP TO RESOLUTION ADDRESS
      STB TEMP1     AND SAVE
      LDA B,I       GET RESOLUTION CODE/T/MULT
      INB           STEP TO TIME LOCATION 
      STB DSTAD     SAVE THE ADDRESS
* 
      ALF,ERA       SAVE BIT 12 SINCE PROGRAM MAY 
      LDA RQP4,I         ALREADY BE IN THE TIME LIST
      ALF,ERA       COMBINE MULT AND SAVED T-BIT
      LDB RQP3,I    RESOLUTION TO B 
      LSR 3         SHIFT RESULT TO A 
      STA TEMP1,I   SET IT IN THE ID-SEG. 
      LDA RQP5,I    NEGATIVE IF OFFSET
      SSA,RSS       POSITIVE IF START TIME
      JMP TI100 
      CMA,INA       SET POSITIVE AND
      STA TEMP      SAVE IN TEMP
      LDA RQP2,I   CHECK IF CURRENT XEQ PROGRAM 
      SZA 
      JMP TI012    NO 
* 
      LDB XEQT      YES, SET THE
      STB $WORK 
      STA XEQT
      ADB D15       SAVE RESOURCES
      LDA B,I       BIT IN THE
      IOR B200      PROGRAMS
      STA B,I       STATUS WORD 
      JSB $LIST     MAKE PROGRAM DORMANT
      OCT 300 
TI012 LDA $TIME     GET THE CURRENT TIME
      LDB $TIME+1   AND SET 
      DST DSTAD,I   IT IN THE ID-SEG
DSTAD EQU *-1 
      LDB TEMP1     GET THE RES. CODE ADDRESS TO B
      JSB TUDAT     UPDATE THE TIME 
* 
TI015 LDB TCC 
      JSB $TADD    ENTER PROG INTO TIME LIST
      JMP $XEQ       DONE - EXIT TO DISPATCHER
* 
*     GIVEN START TIME
* 
TI100 LDB DSTAD    SET B TO THE TIME ADDRESS AND
      JSB $ETTM    GO TO STORE VALUES IN ID SEGMENT 
      JMP TI015     GO PUT PROG IN TIME LIST
* 
B200  OCT 200 
      HED REAL TIME CLOCK PROCESSOR SET TIME IN ID-SEG
*     $ETTM SETS A TIME IN THE REFERENCED ID-SEGMENT. 
* 
*     CALLING SEQUENCE
* 
*     RQP5,I=HOURS
*     RQP6,I=MINUTES
*     RQP7,I=SECONDS
*     RQP8,I=TENS OF MS.
* 
*     B=TIME ADDRESS IN THE ID-SEG. 
* 
$ETTM NOP           ENTRY POINT 
      STB DSTA2     SAVE THE ID-SEG. ADDRESS
      LDA RQP7,I    GET SECONDS 
      MPY TTAB2     CONVERT TO MS (MPY D100)
      ADA RQP8,I    ADD THE MS VALUE AND
      STA RQP8      AND SAVE
      LDA RQP5,I    GET HOURS 
      MPY D60       CONVERT TO MINUTES
      ADA RQP6,I    ADD MINUTES 
      MPY TTAB3     CONVERT MINUTES TO MS (MPY D6000) 
      CLE           PREPARE FOR ADD 
      ADA RQP8      ADD MS VALUE
      SEZ           IF OVERFLOW 
      INB           STEP HIGH PART
SET01 CLE,SSB       IF POSITIVE 
      JMP SET02 
      ADA RS1       SUBTRACT 24 HRS 
      SEZ,CLE       UNTIL 
      INB 
      ADB RS2       IT IS 
      JMP SET01     NEGATIVE
SET02 DST DSTA2,I   SET THE VALUE IN THE ID-SEG.
DSTA2 EQU *-1 
      JMP $ETTM,I   RETURN
      HED ADDITION OF PROGRAM TO TIME RESOLUTION CODE LIST
*        THE $TADD ROUTINE FUNCTIONS AS FOLLOWS:                   *
*              IF RESOLUTION CODE IS ZERO, THEN EXIT               *
*              IF NON-ZERO RESOLUTION, AND PROGRAM NOT IN TIME LIST*
*                   (BIT 12 OF RES/T/MULT 0), THEN SET BIT 12 OF   *
*                   MULT WORD TO SIGNIFY THAT IT IS IN TIME LIST.  *
*                   IF TIME LIST IS NULL, THEN SET IT TO POINT TO  *
*                   PROGRAM TIME LINK AND SET TLINK TO ZERO.       *
*                   IF PROGRAM NOT IN LIST, THEN IT IS ADDED TO    *
*                        TOP OF TIME LIST AND ITS TLINK VALUE MADE *
*                        TO POINT TO THE PREVIOUS TOP OF LIST      *
*                        PROGRAM.                                  *
*                                                                  *
* 
*     ADDING A PROGRAM TO A TIME RESOLUTION CODE LIST 
*         CALLING SEQUENCE
*              LDB  ADDRESS OF ID SEGMENT TLINK VALUE 
*              JSB $TADD
* 
$TADD NOP 
      STB TLINC     SAVE TLINK ADDRESS
      INB           INCR TO RES CODE/MULT FACTOR ADD
      LDA B,I 
      ALF,CLE,ERA 
      AND D7
      SZA,RSS 
      JMP $TADD,I  EXIT 
      SEZ           PROG IN TIME LIST?
      JMP $TADD,I  YES, SO EXIT 
* 
      LDA B,I 
      IOR B10K     SET T BIT
      STA B,I 
      LDB TLIST     LOAD VALUE OF TOP OF LIST 
      LDA TLINC    SET LINK OF NEW PROG TO PREVIOUS 
      STB A,I           OF TIME LIST
      STA TLIST    SET TOP OF TIME LIST TO NEW PROG TLINK ADDRESS 
      JMP $TADD,I  RETURN 
      HED REMOVE A PROGRAM FROM TIME LIST 
*                                                                  *
*        THE $TREM ROUTINE FUNCTIONS AS FOLLOWS:                   *
*              IF PROGRAM NOT IN TIME LIST, THEN EXIT              *
*              IF PROGRAM IN TIME LIST, THEN CLEAR BIT 12 OF       *
*                   RES/T/MULT TO INDICATE NOT IN TIME LIST.       *
*                   A SEARCH IS MADE OF THE TIME LIST PROGRAMS     *
*                        UNTIL PROGRAM FOUND OR END OF LIST. THE   *
*                        TLINK VALUES ARE CHANGED AS NECESSARY.    *
*                                                                  *
* 
*         CALLING SEQUENCE
*              LDB  TLINK ADDRESS OF ID SEGMENT 
*              JSB $TREM
* 
$TREM NOP          ENTRY/EXIT 
      STB TLINC     COMPUTE LIST ADDRESS
      INB 
      LDA B,I      CHECK IF PROGRAM IS IN TIME LIST 
      AND B10K
      SZA,RSS 
      JMP $TREM,I  NO, SO EXIT
      XOR B,I       CLEAR T-BIT 
      STA B,I 
      LDA DTLST     GET ADDR OF TOP OF LIST PNTR
* 
TR010 LDB A,I       GET CURRENT TOP OF LIST 
      CPB TLINC     IS THIS THE PROG? 
      JMP TR030       YES 
      SZB,RSS       END OF LIST?
      JMP $TREM,I    YES, RETURN
      STB A         SAVE ADDR OF CURRENT LINKWORD 
      JMP TR010     GO CHECK NEXT PROG
* 
TR030 LDB B,I       LINK NEXT PROG
      STB A,I        TO PREV PROG TO REMOVE 
      JMP $TREM,I   RETURN
      SPC 1 
DTLST DEF TLIST 
B10K  OCT 10000 
      HED  TIMER OPERATOR COMMANDS
*     IT,XXXXX
*     IT,XXXXX,R,MMM
*     IT,XXXXX,R,MMM,HR,MN
*     IT,XXXXX,R,MMM,HR,MN,SC 
*     IT,XXXXX,R,MMM,HR,MN,SC,MS
* 
*        R=RESOLUTION CODE
*           1= TEN MILLISECOND CODE 
*           2= SECONDS CODE 
*           3= MINUTES CODE 
*           4= HOURS CODE 
*       MM= MULTIPLICATION FACTOR 
*       HR= START HOURS 
*       MN= START MINUTES 
*       SC= START SECONDS 
*       MS= START TENS OF MILLISECONDS
* 
$ITRQ LDA $WORK     SET 
      ADA D17        UP THE TIME PRAMETER 
      STA TEMP      STARTING ADDRESS. 
      LDB $MSBF+9   GET THE RESOLUTION
      ADB DM5        CODE AND TEST
      SSB,RSS         FOR MORE THAN 4.
      JMP $INER         GREATER THAN 4-ILLEGAL CODE 
      LDA $MSBF+13   GET THE MULT. FACTOR.
      LDB TEMP,I   GET THE OLD TIME PRAM. 
      BLF,ERB       IF IN TIME LIST 
      ALF,ERA       SET BIT IN NEW WORD.
      LDB $MSBF+9   GET RESOLUTION TO B 
      SZB,RSS       IF ZERO RESOLUTION
      JMP M0605     GO REMOVE FROM TIME LIST
      LSR 3         SHIFT THE WHOLE MESS TO A 
M0604 STA TEMP,I   SET NEW RESOLUTION MULT. 
      ISZ TEMP     INCR TO TMS ADDRESS
      LDA $MSBF+29   GET TENS OF MS.
      ADA DM100 
      SSA,RSS      MINUS, IF LEGAL VALUE
      JMP $INER    INPUT ERROR
      LDA $MSBF+25   GET SECONDS VALUE
      ADA DM60
      SSA,RSS      MINUS, IF LEGAL VALUE
      JMP $INER    INPUT ERROR
      LDA $MSBF+21   GET MINUTES. 
      ADA DM60
      SSA,RSS      YES, SO CONVERT TO DECIMAL 
      JMP $INER    INPUT ERROR
      LDA $MSBF+17   GET HOURS
      ADA DM24
      SSA,RSS      MINUS, IF LEGAL VALUE
      JMP $INER    INPUT ERROR
      LDA DP4       SET DEFS TO THE PRAMS 
      STA RQP5      ON THE BASE 
      LDA DP5       PAGE FOR
      STA RQP6      $ETTM 
      LDA DP6       THE SET TIME
      STA RQP7      SUBROUTINE
      LDA DP7       IN THE
      STA RQP8      RTIME MODULE
      LDB TEMP     GET ID-SEG ADDRESS AND 
      JSB $ETTM     GO SET VALUES IN ID-SEG 
      CLA 
      JMP $MSEX     EXIT $MESS
      SPC 2 
M0605 CCB           REMOVE PGM FROM TIME
      ADB TEMP     LIST 
      JSB $TREM 
      CLA           AND CONTINUE
      JMP M0604     SETTING UP THE ID-SEG 
     SPC 1
DP4   DEF $MSBF+17
DP5   DEF $MSBF+21
DP6   DEF $MSBF+25
DP7   DEF $MSBF+29
DM100 DEC -100
DM60  DEC -60 
DM24  DEC -24 
DM5   DEC -5
D17   DEC 17
* 
* 
*         CONTINUATION OF STATUS REQUEST
* 
$STRQ EQU * 
      ADB D11       RESOL CODE/MULT ADDRESS 
      STB TLINC 
      LDA B,I 
      ALF,RAR 
      AND D7
      JSB $CVT1    CONVERT RESOLUTION CODE TO ASCII 
      ALF,ALF       ROTATE TO HIGH HALF WORD
      STA $MSBF+5    STORE RESOLUTION CODE IN BUFFER
      LDA B,I 
      AND B7777 
      JSB $CVT3    CONVERT MULTIPLE TO ASCII
      INA 
      DLD A,I 
      DST $MSBF+6     STORE MULTIPLE IN BUFFER
      LDA TLINC,I  CHECK IF PROG IN TIME LIST 
      ALF,SLA       TEST BIT 12 (T) BIT 
      JMP M0510    YES
      LDA BLANK    PROGRAM NOT IN TIME LIST 
      RSS 
M0510 LDA TZERO    PROG IN TIME LIST
      STA $MSBF+14    STORE ASCII BLANK OR T IN BUFFER
      ISZ TLINC     SET B TO TIME ADDRESS 
      LDA DTEMP    SET UP TO GET TIME TO
      STA RQP2      TEMP AREA 
      CLA 
      STA RQP3
      DLD TLINC,I   GET TIME FROM ID-SEG
      JSB $TIMV     CONVERT THE TIME
      LDA TEMP3     GET HOURS 
      JSB $CVT1     CONVERT 
      LDB BLANK     GET VALUE 
      RRR 8         ROTATE TO BLANK ON EACH SIDE
      DST $MSBF+8     SET IN MESSAGE
      LDA TEMP2     GET MIN. VALUE
      JSB $CVT1     CONVERT 
      STA $MSBF+10     STUFF IN BUFFER
      LDA TEMP1     AND AGAIN FOR SEC 
      JSB $CVT1 
      LDB BLANK     VALUE TO A BLANK TO B 
      RRR 8         ROTATE
      DST $MSBF+11     SET IN BUFFER
      LDA TEMP      ONE MORE TIME FOR 10'S OF MS. 
      JSB $CVT1 
      STA $MSBF+13    STORE TENS OF MSEC IN BUFFER
      LDA BUFAD       LOAD A WITH OUTPUT BUFFER ADDRESS 
      JMP $MSEX    RETURN 
      SPC 1 
TZERO ASC 1, T
D11   DEC 11
DTEMP DEF TEMP
      SPC 2 
      SKP 
*         MESSAGE PROCESSOR--TI COMMAND 
* 
* 
*        THE REQUEST TO GET CURRENT SYSTEM TIME OUTPUTS CURRENT 
*        YEAR, DAY NUMBER, HOUR, MINUTES, AND SECONDS IN THE
*              FOLLOWING FORMAT:
*              YEAR.DAY..HR..MN..SC 
*          WHERE THE .'S ARE BLANKS 
* 
$TIRQ LDA DM20
      STA $MSBF     SET OUTPUT CHARACTER COUNT
      LDA DTCC     SET UP TO GET THE TIME 
      STA RQP3       SET YEAR WORD ADDR 
      INA 
      STA RQP2       SET 5 WORD TIME ADDR 
      DLD $TIME 
      JSB $TIMV     GO GET TIME 
      JSB $CVT3     CONVERT YEARS 
      INA 
      DLD A,I 
      DST $MSBF+1   SET LEAST 4 DIGITS
      LDA TEMP4     GET DAYS
      JSB $CVT3    CONVERT AND STORE DAYS 
      INA 
      DLD A,I 
      DST $MSBF+3   SET LEAST 4 DIGITS
      LDA BLANK     STUFF NECESSARY WORDS WITH
      STA $MSBF+5     BLANKS
      STA $MSBF+7 
      STA $MSBF+9 
      LDA TEMP3     GET HOURS 
      JSB $CVT1    CONVERT AND STORE HOURS
      STA $MSBF+6 
      LDA TEMP2 
      JSB $CVT1    CONVERT AND STORE MINUTES
      STA $MSBF+8 
      LDA TEMP1 
      JSB $CVT1    CONVERT AND STORE SECONDS
      STA $MSBF+10
      LDA BUFAD 
      JMP $MSEX     GO SET A AND EXIT 
      SPC 1 
BLANK ASC 1,
BUFAD DEF $MSBF 
DM20  DEC -20 
* 
*     ON REQUEST CONTINUATOR
* 
*     IF CURRENT TIME VALUES ARE ZERO OR NOW IS CODED THEN
*     THE CURRENT TIME IS PUT IN THE ID-SEG. AND R/M USED 
*     TO COMPUTE THE NEXT TIME. 
* 
*     IF CURRENT TIME VALUES ARE NOT ZERO THE PROGRAM IS
*     JUST PUT IN THE TIME LIST.
* 
*     CALLING SEQUENCE
* 
*     A=-1 IF NOW OPTION
*     A#-1 IF NOT NOW BUT PUT IN TIME LIST
*     B=ID-SEGMENT TIME ADDRESS.
* 
*     JMP $ONTM 
* 
$ONTM EQU * 
      LDB $WORK 
      ADB D17      COMPUTE RES/T/MULT ADDR
      LDA B,I 
      ALF,RAR 
      AND D7       CHECK RESOLUTION CODE
      SZA          NONE, SO GO TO SCHED NOW 
      JMP M0110 
* 
      JSB $LIST    SCHEDULE PROGRAM 
       OCT 301
      JMP $MSEX    RETURN 
* 
M0110 INB           SET B FOR $ONTM 
      LDA $MSBF+8   IF ASCII
      RAR,SLA       "NO" ENTERED
      LDA $MSBF+9   THEN
      CPA NO        GO PUT
      CCA           IN THE TIME LIST FOR NOW+10MS.
      STB DLDAD     SET LOAD ADDRESS
      STA TCC       SET NOW FLAG FOR LATER
      INA,SZA,RSS   IF NOW SKIP LOAD
      JMP NOW 
      DLD DLDAD,I   GET THE CURRENT TIME VALUES 
DLDAD EQU *-1 
      SZA,RSS       IF TIME NOT ZERO
      SZB           THEN
      JMP TIMIN     THEN GO PUT IN TIME LIST
NOW   DLD $TIME     GET CURRENT TIME
      DST DLDAD,I   AND SET IN THE ID-SEG 
TIMIN LDB DM2       COMPUTE TIME LIST ADDRESS 
      ADB DLDAD     AND 
      STB TEMP3     AND SET FOR LIST ROUTINE
      JSB $TADD     ADD PROG TO TIME LIST.
      LDB TEMP3     SET (B) FOR $TMSC CALL
      ISZ TCC       SKIP IF NOW 
      RSS 
      JSB $TMSC     SCHEDULE THE PROG. AND UPDATE 
MESEX CLA           SET A FOR NO ERROR
      JMP $MSEX     GET RETURN ADDRESS
* 
* 
NO    ASC 1,NO
      HED MESSAGE PROCESSOR TM REQUEST COMPLETION 
*     THIS ROUTINE COMPLETES THE SET TIME REQUEST 
* 
*     CALLING SEQUENCE: 
* 
*     LDB DEFP1     SET B TO ADDRESS OF PRAM LIST 
*     JMP $TMRQ 
* 
$TMRQ EQU * 
      LDB DEFP1 
      LDA DM6       SET UP PRAM ADDRESSES ON
      STA TEMP      THE BASE PAGE 
      LDA DRQP3 
TM1   STB A,I 
      ADB D4        PRAMS SEPERATED BY FOUR WORDS 
      INA 
      ISZ TEMP      DONE? 
      JMP TM1       NO
* 
      LDA RQP3,I    GET YEAR
      ADA DM197     SUBTRACT THE BASE 
      MPY D365      MULTIPLY BY DAYS PER YEAR 
      ADA RQP4,I    ADD THE DAY 
      CMB           SET B TO -1 IF LEGAL RESULT 
      ADA B         SUBRTACT ONE FROM DAY 
      INB,SZB       IF B WAS NOT ZERO AFTER MULT. THEN
      JMP $INER     INPUT ERROR 
      STA $TIME+2   SET DAY COUNTER 
* 
      LDB DTIME     GET TIME ADDRESS TO B 
      JSB $ETTM     SET THE TIME
      JMP MESEX     EXIT TO MESSAGE PROCESSOR 
      SPC 2 
DM2   DEC -2
DM6   DEC -6
DM197 DEC -1970     BASE YEAR 
D365  DEC 365 
DRQP3 DEF RQP3
D4    DEC 4 
DTIME DEF $TIME 
DEFP1 DEF $MSBF+5 
      SPC 4 
* 
*  ' DEVICE TIME-OUT PARAMETER ' STATEMENT   (OPTIONAL) 
* 
* FORMAT:   TO,N1,N2  WHERE 
*            N1 = EQT # 
*            N2 = TIME-OUT PARAMETER OR NOT SPECIFIED 
* ACTION:   IF N2 WASN'T SPECIFIED, PRINT CURRENT TIME-OUT OF DEVICE N1 
*           IF BOTH N1 AND N2 PRESENT, ASSIGN N2 AS THE 
*            NEW TIME-OUT PARAMETER FOR DEVICE N1.
* 
* CALL (FROM MESSAGE PROCESSOR):
*     (A) = N1
*   (P)  JMP $CHTO
*      - RETURN IS TO MESS,I WITH (A) = ADDRESS OF REPLY
*         OR ADDRESS OF ERROR MESSAGE IF N1 IS ILLEGAL. 
* 
$CHTO STA TEMP1     SAVE 'N1' 
      JSB $EQCK     CHECK VALIDITY OF 'N1'
      LDB $MSBF+8 
      SZB,RSS       JUST ONE PARAM? 
      CCB,RSS        YES, SET (B)=-1
      LDB $MSBF+9    NO, GET PARAM 'N2' 
      SZB,RSS        IF N2 ZERO, DISABLE
      JMP CHTO2       TIME-OUT FOR DEVICE 
* 
      INB,SZB        IF N2 = -1, OUTPUT T-O PARAMETER 
      JMP CHTO1      OTHERWISE, ENTER NEW T-O VALUE 
* 
      LDA EQT14,I    CONVERT T-O PARAMETER
      CCE,SZA         TO DECIMAL ASCII
B3000 CMA 
      JSB $CVT3 
      LDB A,I       GET THE HIGH WORD 
      ADB B164C     ADD '=' - 'BLANK' 
      STB TOMS1+1 
      CCE,INA 
      DLD A,I         STORE IN MESSAGE
      DST TOMS1+2 
* 
      LDA TEMP1      CONVERT EQT #
      JSB $CVT1       TO DECIMAL ASCII
      STA TOMS1      STORE INTO MESSAGE 
      LDA TOMSA 
      JMP $MSEX 
* 
TOMSA DEF *+1 
N12   DEC -12 
      ASC 2,TO# 
TOMS1 NOP 
      ASC 1, =
      NOP 
      NOP 
* 
.500  DEC 500 
B164C OCT 16400 
* 
CHTO1 CMB,INB        ERROR IF ATTEMPT 
      LDA EQT5,I      TO SET TYPE 0 OR 5
      AND B374C       DEVICE TIME-OUT 
      SZA             VALUE TO LESS THAN
      CPA B2400       FIVE SECONDS. 
      RSS 
      JMP CHTO2      OTHERWISE, STORE 
* 
      LDA .500        NEW TIME-OUT
      ADA B           VALUE.
      SSA,RSS 
      JMP $INER 
* 
CHTO2 STB EQT14,I 
      JMP $XEQ
* 
* 
B2400 OCT 2400
B374C OCT 37400 
* 
*         ** SYSTEM BASE PAGE COMMUNICATION AREA ** 
* 
.     EQU 1650B     ESTABLISH ORIGIN OF AREA
* 
RQP2  EQU .+25
RQP3  EQU .+26       OF REQUEST 
RQP4  EQU .+27
RQP5  EQU .+28       PARAMETERS 
RQP6  EQU .+29
RQP7  EQU .+30       (SET FOR MAXIMUM OF
RQP8  EQU .+31        8 PARAMETERS) 
* 
EQT5  EQU 1664B 
EQT14 EQU 1773B 
* 
XEQT  EQU .+39     ID SEGMENT ADDR. OF CURRENT PROG.
* 
A     EQU 0B        LOCATION OF A REGISTER
B     EQU 1B        LOCATION OF B REGISTER
* 
      ORG *         PROGRAM LENGTH
      END 
                                          