COMCVDT 
COMMON
          CTEXT  COMCVDT - VALIDATE AND CONVERT DATE AND TIME.
          SPACE  4,10 
          IF     -DEF,QUAL$ 
          QUAL   COMCVDT
          ENDIF 
          BASE   D
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 VDT      SPACE  4,10 
***       COMCVDT - VALIDATE AND CONVERT DATE AND TIME. 
* 
*         M. S. PESCHMAN.    82/09/20.
          SPACE  4,10 
***       *VDT* CONVERTS A DISPLAY CODED DATE OR TIME TO PACKED FORMAT. 
*         A STATUS IS RETURNED INDICATING WHETHER THE SPECIFIED DATE OR 
*         TIME IS BEFORE OR AFTER A DEFINED BASE DATE AND TIME. 
* 
*         THE BASE DATE AND TIME WILL BE SET TO THE CURRENT DATE AND
*         TIME ON THE FIRST CALL TO *VDT* IF NOT PRESET BY THE CALLER.
 VDT      SPACE  4,35 
**        VDT - CONVERT DATE AND TIME.
* 
*         ENTRY  (X1) = DATE YYMMDD OR TIME HHMMSS, LEFT JUSTIFIED. 
*                (X2) = 0 IF TO CONVERT DATE. 
*                (X2) = 1 IF TO CONVERT TIME. 
*                (VDTA) = 0 IF TO USE CURRENT SYSTEM DATE AND TIME AS 
*                           BASE. 
*                (VDTA) = PACKED FORMAT BASE DATE AND TIME IF .NE. 0. 
* 
*         EXIT   (X6) = DATE OR TIME IN 18 BIT PACKED FORMAT. 
*                (X6) .LT. 0 IF ERROR IN DATE OR TIME ENTRY.
*                (X1) .LT. 0 IF DATE OR TIME EARLIER THAN BASE DATE AND 
*                     TIME. 
*                (X1) .GE. 0 IF DATE OR TIME LATER THAN BASE DATE AND 
*                     TIME. 
*                (VDTA) = BASE DATE AND TIME. 
* 
*         USES   X - 1, 2, 3, 4, 5, 6, 7. 
*                A - 1, 2, 4, 6, 7. 
*                B - 6, 7.
* 
*         CALLS  DXB. 
* 
*         MACROS PDATE. 
* 
*         NOTES  THE FOLLOWING RULES ARE USED TO DETERMINE THE
*                VALIDITY OF THE ENTERED DATE OR TIME.
* 
*                1. YEAR MUST BE IN THE RANGE 1970 - 2033.  THE LAST
*                   TWO DIGITS ARE USED, I.E. *12* FOR 2012.
*                2. SIX DISPLAY CODE DIGITS MUST BE ENTERED.
*                3. THE YEAR 2000 IS A LEAP YEAR. 
* 
*         XREF   COMCDXB. 
  
  
 VDT      SUBR               ENTRY/EXIT 
  
*         SAVE INPUT PARAMETERS AND GET CURRENT PACKED DATE AND TIME IF 
*         REQUIRED. 
  
          BX7    X1          SAVE DATE OR TIME ENTRY
          BX6    X2          SAVE DATE/TIME FLAG
          SA7    VDTB 
          SA6    VDTC 
          SA1    VDTA 
          NZ     X1,VDT0.1   IF BASE DATE AND TIME PRESENT
          PDATE  VDTA        GET CURRENT PACKED DATE AND TIME 
 VDT0.1   BX6    X6-X6       CLEAR ASSEMBLY AREA
          SA6    VDTF 
          MX6    -24
          BX2    -X6*X7 
          NZ     X2,VDT2     IF NOT ZERO FILLED 
          MX6    6
          LX6    -30
          BX6    X6*X7
          ZR     X6,VDT2     IF SIXTH CHARACTER NOT PRESENT 
          SB6    VDTHL-1
  
*         CONVERT 2 DIGIT PORTION OF DATE OR TIME.
  
 VDT1     SA1    VDTH+B6     GET MASK 
          SA4    VDTB        GET DATE OR TIME 
          BX5    X1*X4
          SX2    12          FIGURE SHIFT COUNT 
          SX3    B6 
          IX3    X3*X2
          SB7    X3 
          LX5    B7,X5
          ZR     X5,VDT2     IF NO VALUE SPECIFIED
          SB7    B1          SET DECIMAL CONVERSION 
          RJ     DXB         CONVERT NUMBER 
          ZR     X4,VDT3     IF NO CONVERSION ERROR 
 VDT2     SX6    -B1         SET ERROR CONDITION
          EQ     VDTX        RETURN 
  
 VDT3     SA2    VDTC 
          NZ     X2,VDT5     IF PROCESSING TIME 
          NZ     B6,VDT5     IF NOT CONVERTING YEAR 
  
*         CALCULATE YEAR BIAS.
  
          SX6    X6-70
          PL     X6,VDT4     IF YEAR IN 1970-1999 RANGE 
          SX6    X6-34+70 
          PL     X6,VDT2     IF YEAR ABOVE 2033 
          SX6    X6+30+34 
  
*         CHECK FOR LEAP YEAR.
  
 VDT4     MX1    -2 
          SX7    X6+2 
          BX7    -X1*X7 
          SA7    VDTD        SAVE LEAP YEAR FLAG
          EQ     VDT6        ADD DIGITS TO ASSEMBLY 
  
*         VALIDATE VALUE IN LEGAL RANGE.
  
 VDT5     MX7    -30
          SA1    VDTG+B6     GET MAXIMUM VALUE WORD 
          SX3    30 
          IX2    X2*X3
          SB7    X2 
          LX1    B7          POSITION WORD FOR DATE OR TIME 
          BX1    -X7*X1      MAXIMUM VALUE
          IX4    X1-X6
          NG     X4,VDT2     IF ILLEGAL VALUE 
  
*         ADD CONVERTED DIGITS TO ASSEMBLY. 
  
 VDT6     SA1    VDTF        GET ASSEMBLY 
          LX1    54 
          BX6    X1+X6
          SA6    A1 
          SB6    B6-B1
          PL     B6,VDT1     IF MORE TO CONVERT 
          LX6    12          SAVE TOTAL ASSEMBLY
          SA6    VDTF 
          SA2    VDTC        GET TIME/DATE INDICATOR
          MX7    -6 
          NZ     X2,VDT7     IF PROCESSING TIME 
  
*         VALIDATE DATE.
  
          BX3    -X7*X6      DAY
          ZR     X3,VDT2     IF ZERO DAY ENTERED
          LX6    -6 
          BX1    -X7*X6      MONTH
          ZR     X1,VDT2     IF ZERO MONTH ENTERED
          SA4    VDTE+X1     GET DAYS FROM MONTH TABLE
          IX2    X4-X3
          PL     X2,VDT7     IF LEGAL DAY 
          SA4    VDTD        GET LEAP YEAR INDICATOR
          NZ     X4,VDT2     IF NOT LEAP YEAR 
          SX6    X1-2 
          NZ     X6,VDT2     IF MONTH NOT FEBRUARY
          SX1    X3-29
          NZ     X1,VDT2     IF ILLEGAL NUMBER OF DAYS
  
*         SET REPLY.
  
 VDT7     SA2    VDTA 
          SA1    VDTF        PACKED INPUT 
          MX7    -18
          SA4    VDTC 
          NZ     X4,VDT8     IF PROCESSING TIME 
          AX2    18 
 VDT8     BX2    -X7*X2 
          BX6    X1 
          IX1    X6-X2       SUBTRACT INPUT VALUE FROM CURRENT VALUE
          EQ     VDTX        RETURN 
  
  
 VDTA     CON    0           BASE PACKED DATE AND TIME
 VDTB     CON    0           DATE OR TIME ENTRY 
 VDTC     CON    0           DATE/TIME FLAG 
 VDTD     CON    0           LEAP YEAR INDICATOR
  
 VDTE     BSS    1           TABLE OF DAYS IN A MONTH 
          CON    31          JANUARY
          CON    28          FEBRUARY 
          CON    31          MARCH
          CON    30          APRIL
          CON    31          MAY
          CON    30          JUNE 
          CON    31          JULY 
          CON    31          AUGUST 
          CON    30          SEPTEMBER
          CON    31          OCTOBER
          CON    30          NOVEMBER 
          CON    31          DECEMBER 
  
 VDTF     CON    0           ASSEMBLY AREA
  
 VDTG     BSS    0           TABLE OF MAXIMUM VALUES
          VFD    30/23,30/99 HOUR/YEAR
          VFD    30/59,30/12 MINUTE/MONTH 
          VFD    30/59,30/31 SECOND/DAY 
  
 VDTH     BSS    0           MASK TABLE 
          VFD    12/7777B,48/0
          VFD    12/0,12/7777B,36/0 
          VFD    24/0,12/7777B,24/0 
 VDTHL    EQU    *-VDTH 
          SPACE  4,10 
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 VDT      EQU    /COMCVDT/VDT 
 VDTA     EQU    /COMCVDT/VDTA
 QUAL$    ENDIF 
 VDT      ENDX
