Get DOS Date
From CometWiki
Get DOS Date
Syntax:
DOSMS(AX-value,BX-value,CX-value,DX-value) EXCP=statement-label
Entry:
AX-value = "@2A00@" BX-value = "@0000@" CX-value = "@0000@" DX-value = "@0000@"
Return:
The CX register contains the year (1980 to 2099; in hex -- see conversion note below).
.
Byte 2 of the DX register (i.e., the DH byte) contains the month (1 to 12; in hex).
.
Byte 1 of the DX register (i.e., the DL byte) contains the day (1 to 31; in hex).
.
Byte 1 of the AX register (i.e., the AL byte) contains the weekday number (0 = Sunday, 1 = Monday, 2 = Tuesday, etc.; in
hex).
Discussion:
The DOSMS function call can be used to get the DOS system date. This function requires that the AX-value be set to "@2A00@", and that the other entry values be set to null.
After the function is executed, the DOS date is returned in the registers as described above. Note that the values are returned in hex and must be converted to decimal for meaningful use.
Special note:
The CX register returns the year portion of the DOS system date. In order to get the correct year, you must first reverse the order of the bytes in the CX register, and then convert to decimal. This is demonstrated in the following sample program.
Example:
! S SDATE,DSK
! O DATE,DSK
! L T00,E
! R QMONITOR
!
!========== GET DOS DATE =======================================
!
LENGTH 2 & LOCAL AX$,BX$,CX$,DX$ ! Define registers
LOCAL MONTH$,DAYNUM$,WEEKDAY$ ! Define date variables
LENGTH 4 & LOCAL YEAR$ ! Define year
LENGTH 1 & LOCAL AL$,CH$,CL$,DH$,DL$ ! Define sub-registers
LENGTH 4.0 & LOCAL YEAR ! Define numeric year
LENGTH 2.0 & LOCAL MONTH,DAYNUM,WEEKDAY ! Define numeric dates
!
100 FORMAT (ET) ! Screen format
!
CLEAR ! Initialize all variables
!
AX$="@2A00@" ! Set AX register for "GET DATE"
BX$="@0000@" ! Set BX register to null
CX$="@0000@" ! Set CX register to null
DX$="@0000@" ! Set DX register to null
!
DOSMS(AX$,BX$,CX$,DX$) ! Perform DOSMS system call
!
YEAR$ = CX$ ! Year (hex) = CX register
MONTH$= SUB(DX$,2,1) ! Month (hex) = DH byte of DX
DAYNUM$= SUB(DX$,1,1) ! Day (hex) = DL byte of DX register
WEEKDAY$=SUB(AX$,1,1) ! Weekday (hex) = AL byte of AX
!
CH$ = SUB(CX$,2,1) ! Get CH byte from CX (year)
CL$ = SUB(CX$,1,1) ! Get CL byte from CX (year)
YEAR$ = CH$ + CL$ ! Recombine CH and CL bytes
!
MONTH$ = "@00@" + MONTH$ ! Add leading null byte to MONTH$
DAYNUM$ = "@00@" + DAYNUM$ ! Add leading null byte to DAYNUM$
WEEKDAY$ = "@00@" + WEEKDAY$ ! Add leading null byte to WEEKDAY$
!
YEAR = HEXDEC(YEAR$) ! Convert hex YEAR$ to decimal YEAR
MONTH= HEXDEC(MONTH$) ! Convert hex MONTH$ to decimal
DAYNUM = HEXDEC(DAYNUM$) ! Convert hex DAYNUM$ to decimal
WEEKDAY= HEXDEC(WEEKDAY$) ! Convert hex WEEKDAY$ to decimal
!
PRINT (0,100) ! Set typewriter mode
!
PRINT (0) "YEAR: ";YEAR
PRINT (0) "MONTH: ";MONTH
PRINT (0) "DAY ";DAYNUM
PRINT (0) "WEEKDAY # :";WEEKDAY
INPUT (0) ""
RUN "QMONITOR"
END