analog to winversion(\ntddi or similar constants) in HLL SDKs
we not needed to correlate them with GetVersion & GetVersionEx outputs,
because checking allowed api set via LoadLibrary & GetProcAddr is much wiser.
so these constants only for design time and we can define them in any way as we want.
;======================================================
; SPECIFIC TO OSVERSION SET OF API & SYSCALL INTERFACES
;
; EACH CONSTANT SPECIFIES UNIQE SET OF ACCESIBLE
; FUNCTIONS WITH LIBRARIES THEY ARE IN (OUT OF THE BOX)
;
; MAKED ASSUMPTION THAT CONSTANT CAN BE SHARED
; BY COUPLE OF OSES, BUT IN THIS CASE -
;(SET OF ACCESIBLE FUNCTIONS WITH LIBRARIES THEY ARE IN)
; - SAME FOR THESE OSES
;======================================================
TARGET_MS_OS_ALL = $FFFFFFFF
; DOS:
TARGET_DOS = $00000001
TARGET_WIN16_WIN3_0_DOS = $00000002
TARGET_WIN16_WIN3_1_DOS = $00000004
TARGET_WIN32_WIN3_1_DOS = $0000000C
; WIN9x:
TARGET_WIN32_WIN4_0_WIN95 = $00000010
TARGET_WIN32_WIN4_1_WIN98 = $00000020
TARGET_WIN32_WIN4_1_WIN98SE = $00000040
TARGET_WIN32_WIN4_9_WINME = $00000080
; WINNT:
TARGET_WINNT_WIN3_1_WINNT31 = $00000100
TARGET_WINNT_WIN3_5_WINNT35 = $00000200
TARGET_WINNT_WIN3_5_WINNT351 = $00000400
TARGET_WINNT_WIN4_0_WINNT = $00000800
TARGET_WINNT_WIN4_0_WINNTSP1 = $00001000
TARGET_WINNT_WIN4_0_WINNTSP2 = $00002000
TARGET_WINNT_WIN4_0_WINNTSP3 = $00004000
TARGET_WINNT_WIN4_0_WINNTSP4 = $00008000
TARGET_WINNT_WIN5_0_WIN2K = $00010000
TARGET_WINNT_WIN5_1_WINXP = $00020000
TARGET_WINNT_WIN5_1_WINXPSP1 = $00040000
TARGET_WINNT_WIN5_1_WINXPSP2 = $00080000
TARGET_WINNT_WIN5_1_WINXPSP3 = $00100000
TARGET_WINNT_WIN5_2_WS03 = $00200000
TARGET_WINNT_WIN5_2_WS03SP1 = $00400000
TARGET_WINNT_WIN5_2_WS03SP2 = $00800000
TARGET_WINNT_WIN6_0_VISTA = $01000000
TARGET_WINNT_WIN6_0_VISTASP1 = $02000000
TARGET_WINNT_WIN6_0_WS08 = $04000000
TARGET_WINNT_WIN6_1_WIN7 = $08000000
TARGET_WINNT_WIN6_1_WIN7SP1 = $10000000
TARGET_WINNT_WIN6_2_WIN8 = $20000000
TARGET_WINNT_WIN6_3_WIN81 = $40000000
TARGET_WINNT_WINA_0_WIN10 = $80000000
; WINCE
;TARGET_WINCE_WINCE1_0 = $00000001
;TARGET_WINCE_WINCE2_0 = $00000002
;TARGET_WINCE_WINCE3_0 = $00000003
;TARGET_WINCE_WINCE4_0 = $00000004
;TARGET_WINCE_WINCE5_0 = $00000005
;TARGET_WINCE_WINCE6_0 = $00000006
; by default TARGET__OS = ALL = $FFFFFFFF
and fasm1 macros to operate on ranges (in fasmg they could operate much larger ranges)
macro TARGET__OS_XOR item* { TARGET__OS = TARGET__OS xor (item) }
macro TARGET__OS_ACCEPT item* { TARGET__OS = TARGET__OS or (item) }
macro TARGET__OS_EXTRACT item* { TARGET__OS = TARGET__OS and (not (item)) }
macro TARGET__OS_RANGE range& {
match begin+,range \{
assert bsf begin = bsr begin
TARGET__OS = $FFFFFFFF xor (begin-1) \}
match end-,range \{
assert bsf end = bsr end
TARGET__OS = (end shl 1)-1 \}
match begin=,end,range \{
assert end > begin
assert bsf begin = bsr begin
assert bsf end = bsr end
TARGET__OS = ((end shl 1)-1) xor (begin-1) \} }
macro TARGET__OS_EXTRACT_RANGE range& {
match begin+,range \{
assert bsf begin = bsr begin
TARGET__OS = TARGET__OS and (not ($FFFFFFFF xor (begin-1))) \}
match end-,range \{
assert bsf end = bsr end
TARGET__OS = TARGET__OS and (not ((end shl 1)-1)) \}
match begin=,end,range \{
assert end > begin
assert bsf begin = bsr begin
assert bsf end = bsr end
TARGET__OS = TARGET__OS and (not (((end shl 1)-1) xor (begin-1))) \} }
macro TARGET__OS_ACCEPT_RANGE range& {
match begin+,range \{
assert bsf begin = bsr begin
TARGET__OS = TARGET__OS or ($FFFFFFFF xor (begin-1)) \}
match end-,range \{
assert bsf end = bsr end
TARGET__OS = TARGET__OS or ((end shl 1)-1) \}
match begin=,end,range \{
assert end > begin
assert bsf begin = bsr begin
assert bsf end = bsr end
TARGET__OS = TARGET__OS or (((end shl 1)-1) xor (begin-1)) \} }
TARGET__OS = TARGET__OS or (((end shl 1)-1) xor (begin-1)) }
let suppose we targeted GUI 4.0
macro targetGUI4_0 {
TARGET__OS_RANGE TARGET_WINNT_WIN4_0_WINNT+
TARGET__OS_ACCEPT_RANGE TARGET_WIN32_WIN4_0_WIN95,TARGET_WIN32_WIN4_9_WINME }
and we got TARGET__OS=$FFFFF8F0