ASMB,R,Q,C
*     NAME:   TIME
*     SOURCE: 92070-18139 
*     RELOC:  92070-16139 
*     PGMR:   HLC 
* 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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 TIME,0  92070-16139  REV.1941  791105 
      ENT $EX11,$EX12,$TADD 
      ENT $TLST,$TMSC,$TREM,$TIMV 
      ENT $TMLS,$$TIM,$.TIM 
* 
      EXT $RQCT,$SCXX,$TIME,$TMP1 
      EXT $RQP2,$RQP3 
      EXT $RQP4,$RQP5,$RQP6 
      EXT $RQP7,$RQP8 
      EXT $EXEX,$NAME,$WORK,$TM 
      EXT $LIST,$IOTO,$XQT
* 
A     EQU 0 
B     EQU 1 
* 
$EX11 EQU * 
      LDA $RQCT 
      CLB,CLE,INB 
      SZA,RSS 
      JMP $SCXX     NOT ENOUGH PARAMETERS 
      DLD $TIME     SET CURRENT TIME AS BASE
      JSB $TIMV     DIVIDE INTO HOURS, MINUTES, SECONDS, & MS 
      ADA =D1976    ADD BASE YEAR 
      STA $RQP3,I 
      JMP $EXEX 
* 
* 
$TIMV NOP           CONVERT DOUBLE INTEGER TO TIME VALUES 
      CLE 
      ADA PRS1      ADD 24 HOURS TO MAKE TIME POSITIVE
      SEZ 
      INB 
      ADB PRS2
* 
      DIV TTAB3     (=6000D)
      STA $RQP4     SAVE MINUTES AND HOURS
      ASR 16
      DIV TTAB2     (=100D) 
      STB $RQP2,I   TEN'S OF MILLISECONDS 
      ISZ $RQP2 
      STA $RQP2,I   SECONDS 
      ISZ $RQP2 
      CLB 
      LDA $RQP4 
      DIV =D60
      STB $RQP2,I   MINUTES 
      ISZ $RQP2 
      CPA =D24
      CLA 
      STA $RQP2,I   HOURS 
      ISZ $RQP2 
      LDA $TIME+2 
      CLB 
      DIV =D366 
      INB 
      STB $RQP2,I   DAY 
      JMP $TIMV,I 
* 
* 
* 
PRS1  OCT 153000
PRS2  OCT 203 
* 
* 
* 
$EX12 EQU * 
      CLA 
      LDB $RQP8,I 
      STB $RQP8     IF DEFAULT, FORCE TO ZERO 
      LDB $RQP6,I 
      STB $RQP6 
      LDB $RQP5,I 
      STB $RQP5 
      LDB $RQP3,I 
      STB $RQP3 
      SSB 
      JMP SC02      ILLEGAL RESOLUTION CODE (SC02)
      ADB =D-5
      SSB,RSS 
      JMP SC02      ILLEGAL RESOLUTION CODE 
      LDB $RQP2,I 
      SZB,RSS 
      JMP SUSP      NO NAME, TIME SUSPEND 
* 
      JSB $NAME     SEARCH FOR GIVEN NAME 
      DEF $RQP2,I 
      SZB,RSS 
      JMP SC05      NAME NOT FOUND
      LDA $RQP3 
      SZA,RSS 
      JMP TOFF      REMOVE FROM TIME LIST 
      ADB =D17
      LDA B,I       GET PREVIOUS 'T' BIT IN E-REG 
      ALF,ERA 
      CLA 
      LDA $RQP4,I   MULTIPLE
      ALF,ERA 
      JSB TMSUB     MOVE TIME VALUES INTO ID SEGMENT
      LDB $WORK 
      JSB $TADD     ADD PROGRAM TO TIME LIST
      JMP $EXEX 
* 
SUSP  LDB $XQT
      LDA $RQP3 
      SZA,RSS 
      JMP TOFF      REMOVE FROM TIME LIST 
      JSB $LIST     TIME SUSPEND THE CALLER 
      OCT 47
      LDB $TMP1     A-REG (MULTIPLE) MEANINGLESS
      JSB TMSUB     MOVE TIME VALUES INTO ID SEGMENT
      JMP $EXEX     DONE
* 
* 
TOFF  JSB $TREM     REMOVE FROM TIME LIST 
      JMP $EXEX 
* 
* 
SC02  LDB =D2 
      JMP $SCXX     ILLEGAL RESOLUTION CODE 
* 
SC05  LDB =D5 
      JMP $SCXX 
* 
RES   NOP 
TIM1  NOP 
TIM2  NOP 
TLNK  NOP 
* 
* 
* 
TMSUB NOP           MOVE TIME VALUES INTO ID SEGMENT
      STB RES 
      INB 
      STB TIM1
      INB 
      STB TIM2
* 
      LDB $RQP3     RES 
      LSR 3         COMBINE RES, T, AND MULTIPLE
      STA RES,I 
* 
      LDA $RQP5 
      SSA,RSS 
      JMP ABS       ABSOLUTE START TIME 
      DLD $TIME     SET CURRENT TIME AS BASE
      DST TIM1,I
      LDA $RQP5 
      CMA,INA 
      JSB TUDAT     ADD OFFSET
      JMP TMSUB,I 
* 
* 
ABS   CLA 
      LDA $RQP7,I   SECONDS 
      MPY TTAB2     (=100D) 
      ADA $RQP8     ADD MILLISECONDS
      STA $RQP8 
      LDA $RQP5     HOURS 
      MPY =D60
      ADA $RQP6     ADD MINUTES 
      MPY TTAB3     MINUTES TO MILLISECONDS 
      CLE 
      ADA $RQP8 
      SEZ 
      INB 
SET01 CLE,SSB 
      JMP STORE 
      ADA RS1       SUBTRACT 24 HOURS UNTIL NEGATIVE
      SEZ 
      CLE,INB 
      ADB RS2 
      JMP SET01 
* 
STORE DST TIM1,I
      JMP TMSUB,I 
* 
* 
* 
* 
* 
      SKP 
* 
TUDAT NOP           UPDATE EXECUTION TIME 
      STA TEMP
      LDA RES,I     RESOLUTION
      RAL,CLE,SLA,RAL 
      JMP HR        HOURS 
      RAL 
      AND =B7 
      ADA TTAB      GET APPROPRIATE BASE FOR MULTIPLE 
      LDA A,I 
CH030 MPY TEMP
CH031 ADA TIM1,I    ADD TO CURRENT VALUE
      SEZ 
      INB 
      ADB TIM2,I
      DST TIM1,I
      CLE,SSB 
      JMP TUDAT,I   NEGATIVE, DONE
* 
      LDA RS1       SUBTRACT 24 HOURS UNTIL NEGATIVE
      LDB RS2 
      JMP CH031 
* 
* 
HR    LDA TEMP
      CLB 
      DIV =D24      MAXIMUM OF 24 HOURS 
      LDA B 
      MPY =D60      MULTIPLY BY 360,000D
      STA TEMP        IN TWO STEPS TO PREVENT OVERFLOW
      LDA TTAB3         FIRST BY 60,
      JMP CH030           AND NEXT BY 6000
* 
* 
TEMP  NOP 
RS1   OCT 25000 
RS2   OCT 177574
* 
TTAB  DEF * 
TTAB1 DEC 1 
TTAB2 DEC 100 
TTAB3 DEC 6000
* 
* 
      SKP 
* 
$TADD NOP           ADD PROGRAM TO TIME LIST
      ADB =D16
      STB TLNK
      INB 
      LDA B,I 
      IOR =B10000   SET 'T' BIT 
      CPA B,I 
      JMP $TADD,I   ALREADY SET 
      STA B,I 
      LDA TLNK      LINK INTO TIME LIST 
      LDB $TMLS 
      STB A,I 
      STA $TMLS 
      JMP $TADD,I 
* 
* 
* 
      SKP 
* 
$TREM NOP           REMOVE FROM TIME LIST 
      ADB =D16
      STB TLNK
      INB 
      LDA B,I 
      AND =B167777  CLEAR 'T' BIT 
      CPA B,I 
      JMP $TREM,I   ALREADY CLEAR 
      STA B,I 
      INB 
      STB TIM1
* 
      LDB DTLST     ADDRESS OF TIME LIST HEADER 
TR010 STB $TADD 
      LDB B,I 
      CPB TLNK
      CLA,RSS 
      JMP TR010     TRY NEXT PROGRAM
      LDB B,I 
      STB $TADD,I   REMOVE FROM LIST
* 
      CLB 
      DST TIM1,I    CLEAR TIME VALUES 
      JMP $TREM,I 
* 
DTLST DEF $TMLS 
* 
* 
      SKP 
* 
$TLST EQU *         CHECK THE TIME SCHEDULE LIST
      LDB $TMLS 
TLP   CLE,SZB,RSS 
      JMP TSLST     CHECK THE TIME SUSPEND LIST 
      STB TLINK 
      ADB =D2 
      DLD B,I 
      CPB $TIME+1 
      CCE 
      LDB TLINK,I   GET LINK TO NEXT PROGRAM
      CPA $TIME 
      SEZ,RSS 
      JMP TLP       CHECK NEXT VALUE
* 
      LDB TLINK     NOW IS THE TIME 
      ADB =D-16 
      JSB $TMSC     SCHEDULE THE PROGRAM IF DORMANT 
      LDB TLINK,I 
      JMP TLP       CHECK NEXT VALUE
* 
TLINK NOP 
$TMLS NOP 
* 
* 
TSLST EQU * 
      LDB $TM 
TSLP  CLE,SZB,RSS 
      JMP $IOTO     PROCESS I/O TIME OUTS 
      STB TLINK 
      ADB =D2 
      DLD B,I       DESIRED TIME
      CPB $TIME+1 
      CCE 
      LDB TLINK,I 
      CPA $TIME     NOW?
      SEZ,RSS 
      JMP TSLP      NO, CHECK THE NEXT
* 
      STB TEMP
      LDB TLINK 
      JSB $LIST     TIME SUSPEND COMPLETE 
      OCT 60
      LDB TEMP
      JMP TSLP      CONTINUE TO END OF LIST 
* 
* 
      SKP 
* 
$TMSC NOP           SCHEDULE THE PROGRAM IF DORMANT 
      STB $WORK 
      ADB =D15
      LDA B,I 
      ADB =D2 
      STB RES 
      AND =B77
      SZA           SKIP IF DORMANT 
      JMP UPDAT     NOT DORMANT, UPDATE NEXT TIME 
* 
      LDB $WORK 
      JSB $LIST     SCHEDULE IT 
      OCT 60
* 
UPDAT LDB $WORK 
      LDA RES,I 
      AND =B7777
      SZA,RSS 
      JMP TREM      MULT=0, REMOVE FROM LIST
      ADB =D18
      STB TIM1      SET UP POINTERS TO ID SEGMENT 
      INB 
      STB TIM2
      JSB TUDAT     UPDATE NEXT TIME
      JMP $TMSC,I 
* 
TREM  JSB $TREM     REMOVE FROM TIME LIST 
      JMP $TMSC,I 
* 
$$TIM EQU *         STANDARD MODULE 
$.TIM DEC 0         STANDARD MODULE 
* 
      END 
                                                                                                                                                                                                          