ASMB,R
* 
*     NAME:   TM..
*     SOURCE: 92070-18105 
*     RELOC:  92070-1X105 
*     PGMR:   C.H.W.
* 
*  **************************************************************** 
*  * (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 TM..,7  92070-1X105  REV.1941  790918 
* 
* 
* 
*  ACTION SUBROUTINE TO EXECUTE THE "TM" OPERATOR COMMAND 
* 
*    COMMAND SYNTAX:
*        TM(,HR,MIN,SEC,MONTH,DAY,YEAR) 
*      RESPONSE IS: 
*            HR:MIN:SEC  MONTH,DAY,YEAR  WKDAY
* 
* 
* 
      ENT TM..
* 
      EXT EXEC,$LIBR,$LIBX,$TIME,CAM.O,$TMLS
      EXT CNOPT 
* 
* 
      SUP 
* 
TM..  NOP 
      LDA TM..
      INA 
      LDB 0,I 
      STB NUMBA     SAVE ADDR OF # PRAMS
      INA           2ND PARAMETER IS THE PARSE BUFFER ADDR
      LDB 0,I       GET IT
      ADB N3        PARAMETER POINTER 
      STB TMPAD 
      INA 
      LDA 0,I 
      STA ERRTN     SAVE ADDR OF ERROR PARAM
      LDA TM..,I
      STA TM..      SAVE RETURN ADDR
* 
      LDA PCHEK     INITIALIZE FOR MAX
      STA PCHKP      VALUE CHECK IN "CHECK" 
      CLA 
      CPA NUMBA,I   TEST # OF PARAMS
      JMP TM.50     JUST DISPLAY CURRENT TIME 
      CPA $TMLS     ANYTHING IN TIME-LIST?
      RSS            NO, PROCEED
      JMP ER34       YES, CAN'T CHANGE TIME 
      JSB CHECK     GET/CHECK ENTERED HOUR
      MPY .60       CONVERT TO MINUTES
      JSB CHECK     GET/CHECK ENTERED MINUTES 
      ADA VALX      ADD HRS*60
      JSB CHECK     GET/CHECK SECONDS 
      MPY .100      CONVERT TO 1O'S OF MSECS
      STA M.SEC 
      LDA VALX      GET 60*HR+MIN 
      MPY .6000     CONVERT TO 10'S OF MSECS
      ADA M.SEC     COMPUTE[(HR*60+MIN)*60+SEC]*100 
      SEZ           OVERFLOW? 
      INB            YES, CARRY INTO B
TM.20 CLE,SSB       IF POSITIVE 
      JMP TM.30 
      ADA RS1       SUBTRACT 24 HRS 
      SEZ           UNTIL 
      INB 
      ADB RS2       IT IS 
      JMP TM.20     NEGATIVE
* 
TM.30 DST M.MIN     SAVE FOR LATER
      JSB CHECK     GET/CHECK MONTH 
      SZA,RSS 
      JMP ER56      ZERO IS ILLEGAL 
      STA M.MON     SAVE IT 
      ADA M#DAY     COMPUTE POS IN CONVERSION TABLE 
      LDB 0,I       GET STARTING JULIAN DAY OF MONTH
      JSB CHECK     GET/CHECK DAY 
      SZA,RSS 
      JMP ER56      ZERO IS ILLEGAL 
      RBL,CLE,SLB,ERB SKIP UNLESS 31 DAY MONTH
      JMP *+3       31 DAY, SKIP BELOW CHECK
      CPA .31       DAY=31? 
      JMP ER56       YES, ERROR 
      STA M.DAY 
      ADB 0         ADD START OF MONTH
      JSB CHECK     GET/CHECK YEAR
      ADA N1976     BEGIN AT 1976 
      CLE,SSA       WAS YEAR < 1976?
      JMP ER56       YES, ERROR 
      STA VALX      SAVE YEAR-1976
      LDA .2
      CPA M.MON     FEBRUARY? 
      INA,RSS        YES
      JMP TM.40      NO 
      AND VALX      2 LSB'S OF YR 
      SZA           LEAP-YEAR?
      CLA,INA        NO 
      ADA N30       FORM -(MAX+1) FOR FEB. DAYS 
      ADA M.DAY 
      SSA,RSS       TOO MANY DAYS FOR FEB?
      JMP ER56       YES
TM.40 LDA VALX      GET YEAR
      AND .3        A IS NOW ZERO IFF LEAP-YEAR 
      STB M.DAY     SAVE JULIAN DAY 
      ADB N60       SET E-REG IF > FEB 28 
*  BELOW INSTRUCTION SKIPS IF:DAY<FEB29 OR LEAP-YEAR
      SEZ,SZA 
      ADB N1        NON-LEAP-YEAR, ADJUST TABLE VALUE 
      ADB N307      B=DAY-367 
      SSB,RSS       WAS DAY>366?
      JMP ER56       YES, ERROR 
      ADB .366      CONVERT TO RANGE 0-365
      STB M.DAY 
      LDA VALX      GET YEAR-1976 
      MPY .366      CONVERT TO DAYS 
      ADA M.DAY     ADD SPECIFIED DAYS
      JSB $LIBR     GO PRIVILEGED 
      NOP 
      STA $TIME+2   STORE IN SYSTEM TIME +2 
      DLD M.MIN 
      DST $TIME     STORE REST OF CURRENT TIME
      JSB $LIBX     GO UNPRIVILEGED 
      DEF *+1 
      DEF *+1 
* 
*  THIS SECTION FORMATS THE "TM" DISPLAY
* 
TM.50 LDA $TIME+2   GET DAY 
      CLB 
      STB M.MON     INITIALIZE MONTH
      DIV .366      A HAS YR, B HAS DAY OF YEAR 
      ADA .1976     ADD OFFSET
      STA M.YR      SAVE YEAR 
      STB M.DAY      & DAY
      STB M.DAY+1 
      AND .3        A=0 IF IT'S LEAP-YEAR 
      CLE,INB 
      ADB N60       E=1 IF IT'S PAST FEB 28 
      SEZ,SZA       SKP UNLESS PAST FEB 28 & NOT LEAP-YR
      ISZ M.DAY     BUMP JULIAN DAY 
* 
      LDA M.DAY 
      LDB M#DY2     PNTR TO TBLE OF START DAY OF MONTH
* 
TM.60 ISZ M.MON     BUMP MONTH
      INB           POINT TO NEXT MONTHS START DAY
      STA VALX      SAVE OFFSET FROM START OF MONTH 
      LDA 1,I       GET START OF MONTH
      RAL,CLE,ERA   GET START JULIAN DAY
      CMA,INA 
      ADA M.DAY     CURRENT DAY - START OF MONTH
      SSA,RSS       IS DAY < START OF NXT MONTH?
      JMP TM.60      NO, TRY NEXT MONTH 
      ISZ VALX      COMPENSATE FOR ZERO OFFSET
* 
** COMPUTE DAY OF WEEK HERE 
      CCA 
      ADA M.YR      YEAR-1
      ARS,ARS        /4 
      ADA M.YR          + YEAR
      ADA M.DAY+1          +DAY 
      CLB 
      DIV .7        DAY OFFSET MODULO 7 
      BLS 
      ADB DAYTB 
      DLD 1,I 
      DST M.WDY 
* 
      LDA VALX      GET DAY OF MONTH
      JSB DECIM     CONVERT TO ASCII
      LDB ASCCM ", "
      RRR 8         FORMAT= " XX,"
      DST M.DAY     STORE DAY IN MSG
      LDA M.MON 
      ALS           2*MONTH 
      ADA MCONA     ADDR OF 4 CHAR MONTH DESCR
      DLD 0,I       GET ASCII MONTH 
      DST M.MON     STORE IN MSG
      LDA M.YR
      CLB 
      DIV .100      SEPARATE 4 DIGITS OF YR 
      STB VALX
      JSB DECIM     CONVERT HIGH 2 DIGITS TO ASCII
      STA M.YR       & STORE IN MSG 
      LDA VALX
      JSB DECIM     CONVERT LOW 2 DIGITS TO ASCII 
      IOR .01B      DON'T SUPPRESS LEADING ZERO 
      STA M.YR+1     & STORE IN MSG 
* 
* $TIMV CODE
      DLD $TIME 
      ADA PRS1      ADD POSITIVE 24 HRS.
      SEZ           TO GET A POSITIVE 
      INB           TIME
      ADB PRS2
      DIV .6000     DIVIDE BY 6000
      STA VALX      SAVE MIN/HR 
      ASR 16        POSITION B (SEC/10MS) FOR DIVIDE
      DIV .100      DIVIDE BY 100 TO GET SEC/10MS 
      JSB DECIM     CONVERT SECONDS TO ASCII
      STA M.SEC      & STORE IN MSG 
      CLB           SET UP FOR DIVIDE 
      LDA VALX      FETCH MIN/HR
      DIV .60       SEPERATE
      STB M.MIN     SAVE MINUTES
      JSB DECIM     CONVERT HOURS TO ASCII
      STA M.HR       & SAVE IN MESSAGE
      LDA M.MIN     GET MINUTES 
      JSB DECIM     CONVERT TO ASCII
      LDB ASCCL     GET "::"
      RRR 8         FORMAT ":XX:" 
      DST M.MIN     STORE INTO MSG
* 
      JSB CNOPT     WRITE RESPONSE LINE 
      DEF *+5 
      DEF .2
      DEF CAM.O 
      DEF MSGBF 
      DEF MSGLN 
      JMP TM..,I    RETURN
* 
* 
ER56  LDA .56       56 = BAD PARAMETER
      RSS 
ER34  LDA .34       34 = TIME-LIST NOT EMPTY
      STA ERRTN,I   RETURN ERROR VALUE
      JMP TM..,I     AND RETURN 
      SPC 2 
* 
DECIM NOP 
      CLB 
      DIV .10 
      SZA,RSS 
      LDA B20       SUPPRESS LEADING ZERO 
      ALF,CLE,ALF 
      IOR 1         MERGE 2 DIGITS
      XOR ASC00     FORM ASCII NUMERICS 
      JMP DECIM,I 
      SPC 2 
* 
CHECK NOP 
      STA VALX      SAVE A FOR CALLER 
      LDA TMPAD     POINTER TO PARSE BUFR 
      ADA .4        ADVANCE TO NEXT PARAM 
      STA TMPAD 
      LDA 0,I       GET PARAMETER 
      SSA           POSITIVE? 
      JMP ER56       NO, ERROR
      ADA PCHKP,I   TEST AGAINST MAX VALUE
      CLE,SSA,RSS   TOO BIG?
      JMP ER56       YES
      ISZ PCHKP     ADVANCE FOR NEXT CHECK
      LDA TMPAD,I   GET PASSED PARAMETER
      JMP CHECK,I   RETURN WITH E=0 & B UNCHANGED 
* 
*  DATA AREA
* 
TMPAD NOP 
PCHKP NOP 
NUMBA NOP 
ERRTN NOP 
VALX  NOP 
* 
.2    DEC 2 
.3    DEC 3 
.4    DEC 4 
.7    DEC 7 
.10   DEC 10
.56   DEC 56
.60   DEC 60
.34   DEC 34
.100  DEC 100 
.366  DEC 366 
.1976 DEC 1976
.6000 DEC 6000
B20   OCT 20
RS1   OCT 25000 
RS2   OCT 177574
PRS1  OCT 153000
PRS2  OCT 203 
N1    DEC -1
N3    DEC -3
N30   DEC -30 
N307  DEC -307
N1976 DEC -1976 
ASC00 ASC 1,00
ASCCM ASC 1,, 
ASCCL ASC 1,::
* 
MCONA DEF MONTH-2 
M#DY2 DEF M#DAY+2 
DAYTB DEF WKDAY 
* 
MSGBF EQU * 
      ASC 1,
M.HR  NOP 
M.MIN DEC 0,0 
M.SEC NOP 
      ASC 1,
M.MON DEC 0,0 
M.DAY DEC 0,0 
M.YR  DEC 0,0 
      ASC 1,
M.WDY DEC 0,0 
MSGLN ABS *-MSGBF 
* 
*  FOLLOWING TABLE DEFINES STARTING JULIAN DAY-1 OF EACH MONTH
*  VALUES ARE FOR LEAP-YEARS.  BIT15=1 IF 31 DAY MONTH.  BITS 14-12 
*  ARE 1ST WEEKDAY OF MONTH (JAN OR FEB) OF WKDAY-1 OTHERWISE (YEAR 0). 
M#DAY DEF *+1 
      OCT 100000    MONTH=0 
      OCT 100000    JAN 
.31   OCT 000037    FEB 
      OCT 100074    MARCH 
      OCT 000133    APRIL 
      OCT 100171    MAY 
      OCT 000230    JUNE
      OCT 100266    JULY
      OCT 100325    AUGUST
      OCT 000364    SEPTEMBER 
      OCT 100422    OCTOBER 
      OCT 000461    NOVEMBER
      OCT 100517    DECEMBER
.01B  OCT 010000
* 
PCHEK DEF *+1       TBLE OF MAX ALLOWED +1 FOR PARAMS 
      DEC -24       HRS 
N60   DEC -60       MINUTES 
      DEC -60       SECONDS 
      DEC -13       MONTHS
      DEC -32       DAYS
      DEC -2145     YEARS 
* 
*  ROTATE WEEKDAYS ON MARCH 1,2000
WKDAY ASC 14, SAT SUN MONTUES WEDTHUR FRI 
MONTH ASC 24, JAN FEB MAR APR MAYJUNEJULY AUGSEPT OCT NOV DEC 
* 
* 
      END 
                                                                                                                                                                                                                                            