EuroAssembler Index Manual Download Source Macros


Sitemap Links Forum Tests Projects

winstime.htm
Constants
Structures
FILETIME
SYSTEMTIME
TIMESPEC
Macros
Time2SystemTime

This file can be included to program for Windows or Linux written in EuroAssembler.

It declares the most often used constant symbols and structures used for
time and date functions of MS Windows Application Programming Interface (WinAPI),
as they were derived from header files in [WindowsSDK].

winstime HEAD
↑ FILETIME
The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.
FILETIME STRUC
.dwLowDateTime  D DWORD
.dwHighDateTime D DWORD
  ENDSTRUC FILETIME
↑ TIMESPEC
The TIMESPEC structure specifies a sleep time.
Example
TimeSpec DS TIMESPEC, .tv_sec=3
LinABI nanosleep, TimeSpec, 0 ; Sleep for 3 seconds.
TIMESPEC STRUC
.tv_sec         D QWORD  ; Seconds.
.tv_nsec        D QWORD  ; Nanoseconds (0..999_999_999).
  ENDSTRUC TIMESPEC
↑ SYSTEMTIME
Calendary date and time.
SYSTEMTIME STRUC
.wYear                D WORD
.wMonth               D WORD ; 1..12
.wDayOfWeek           D WORD ; 0=Sunday, 1=Monday etc.
.wDay                 D WORD ; 1..31
.wHour                D WORD ; 0..23
.wMinute              D WORD ; 0..59
.wSecond              D WORD ; 0..59
.wMilliseconds        D WORD ; 0..999
 ENDSTRUC SYSTEMTIME
↑ Constants
Encoding of constant symbols used in WinAPI.

↑ Time2SystemTime aSystemTime, TZ=0
Convert the time as returned by LinABI time or WinABI GetSystemTime to the SystemTime memory variable.
This macro works in 32bit and 64bit mode.
Input
EAX or RAX is the number of seconds since since midnight 1.1.1970 UTC.
aSystemTime is a pointer to the target structured memory variable SYSTEMTIME.
TZ=0 is the number of seconds of the time zone, which will be added to the input number.
TZ=0 for UTC, TZ=1*86400 for Prague, TZ=2*86400 for Moscow etc.
Output
aSystemTime is filled with the current time..
Time2SystemTime %MACRO aSystemTime, TZ=0
     %IF %^WIDTH=64
       PUSHQ %TZ
       PUSH %aSystemTime
     %ELSE
       PUSHD %TZ
       PUSH %aSystemTime
     %ENDIF
     CALL Time2SystemTime@RT:
Time2SystemTime@RT: PROC1
     %IF %^WIDTH=64
       PUSH RAX,RBX,RCX,RDX,RSI,RDI,RBP
       MOV RBX,[RSP+9*8]   ; %TZ
       MOV RDI,[RSP+8*8]   ; %aSystemTime
     %ELSE
       PUSH EAX,EBX,ECX,EDX,ESI,EDI,EBP
       MOV EBX,[ESP+9*4]   ; %TZ
       MOV EDI,[ESP+8*4]   ; %aSystemTime
     %ENDIF
     ADD EAX,EBX
     MOV EBX,EAX
     MOV ECX,7*86400
     ADD EAX,4*86400       ; Compute day of the week.
     XOR EDX,EDX
     %IF %^WIDTH=64
       DIV RCX
     %ELSE
       DIV ECX
     %ENDIF
     MOV EAX,EDX
     MOV ECX,86400
     XOR EDX,EDX
     %IF %^WIDTH=64
       DIV RCX
     %ELSE
       DIV ECX
     %ENDIF
     MOV EBP,EAX           ; Save the day of the week.
     MOV EAX,EBX           ; Restore the number of seconds.
     MOV ECX,365*86400     ; Seconds in a nonleap year.
     MOV EDX,366*86400     ; Seconds in a leap year.
     MOV EBX,1970          ; 1970.
.10: SUB EAX,ECX
     JB .25:
     INC EBX               ; 1971,1975,1979,1983,1987,1991,1995,1999,2003,2007,2011,2015,2019,2023,2027,2031,,
     SUB EAX,ECX
     JB .25:
     INC EBX               ; 1972,1976,1980,1984,1988,1992,1996,2000,2004,2008,2012,2016,2020,2024,2028,2032,,
     SUB EAX,EDX
     JB .20:
     INC EBX               ; 1973,1977,1981,1985,1989,1993,1997,2001,2005,2009,2013,2017,2021,2025,2029,2033,,
     SUB EAX,ECX
     JB .25:
     INC EBX               ; 1974,1978,1982,1986,1990,1994,1998,2002,2006,2010,2014,2018,2022,2026,2030,2034,,
     JMPS .10:
.20: ADD EAX,EDX
     JMPS .30:
.25: ADD EAX,ECX
.30: XCHG EBX,EAX
     STOSW                 ; Year is computed in BX.
     XCHG EBX,EAX
     MOV ECX,31*86400      ; Days in a long month.
     MOV EDX,30*86400      ; Days in a short month.
     MOV ESI,28*86400      ; Days in February in a nonleap year.
     TEST BL,3
     JNZ .35:
     ADD ESI,86400         ; Days in February in a leap year.
.35: MOV EBX,1             ; January.
.40: SUB EAX,ECX
     JB .60:
     INC EBX               ; February.
     SUB EAX,ESI
     JB .55:
     INC EBX               ; March.
     SUB EAX,ECX
     JB .60:
     INC EBX               ; April.
     SUB EAX,EDX
     JB .50:
     INC EBX               ; May.
     SUB EAX,ECX
     JB .60:
     INC EBX               ; June.
     SUB EAX,EDX
     JB .50:
     INC EBX               ; July.
     SUB EAX,ECX
     JB .60:
     INC EBX               ; August.
     SUB EAX,ECX
     JB .60:
     INC EBX               ; September.
     SUB EAX,EDX
     JB .50:
     INC EBX               ; October.
     SUB EAX,ECX
     JB .60:
     INC EBX               ; November.
     SUB EAX,EDX
     JB .50:
     INC EBX               ; December.
     SUB EAX,ECX
     JB .60:
     JMP .65:
.50: ADD EAX,EDX
     JMP .65:
.55: ADD EAX,ESI
     JMP .65:
.60: ADD EAX,ECX
.65: XCHG EBX,EAX          ; Month is computed in BX (1..12).
     STOSW
     XCHG EAX,EBP          ; Restore the day of the week.
     STOSW
     XCHG EAX,EBX          ; Restore the rest to RAX.
     MOV ECX,86400         ; Seconds in a day.
     XOR EDX,EDX
     %IF %^WIDTH=64
       DIV RCX
     %ELSE
       DIV ECX
     %ENDIF
     INC EAX
     STOSW                 ; Day in the month.
     MOV EAX,EDX
     MOV ECX,3600          ; Seconds in an hour.
     XOR EDX,EDX
     %IF %^WIDTH=64
       DIV RCX
     %ELSE
       DIV ECX
     %ENDIF
     STOSW                 ; Hour.
     MOV EAX,EDX
     MOV ECX,60            ; Second in a minute.
     XOR EDX,EDX
     %IF %^WIDTH
       DIV RCX
     %ELSE
       DIV ECX
     %ENDIF
     STOSW                 ; Minute.
     MOV EAX,EDX
     STOSW                 ; Second.
     XOR EAX,EAX
     STOSW                 ; Miliseconds are not supported.
     %IF %^WIDTH=64
       POP RBP,RDI,RSI,RDX,RCX,RBX,RAX
       RET 2*8
     %ELSE
       POP EBP,EDI,ESI,EDX,ECX,EBX,EAX
       RET 2*4
     %ENDIF
    ENDPROC1 Time2SystemTime@RT
   %ENDMACRO Time2SystemTime
 ENDHEAD winstime

▲Back to the top▲