115 lines
2.5 KiB
NASM
115 lines
2.5 KiB
NASM
|
|
MACRO PRINT val,bits=32 {
|
|
repeat bits/4
|
|
d = '0' + val shr (bits-%*4) and 0Fh
|
|
if d > '9'
|
|
d = d + 'A'-'9'-1
|
|
end if
|
|
display d
|
|
end repeat
|
|
}
|
|
|
|
MACRO PRINT64 val {
|
|
PRINT val,64
|
|
}
|
|
|
|
FNV_PRIME equ 16777619; $01000193
|
|
FNV_OFFSET_BASIS equ 2166136261; $811C9DC5
|
|
macro HASH xname {
|
|
common local .idx,.hash,.ptr,.temp,.len
|
|
|
|
virtual at 0
|
|
db xname
|
|
.len = $
|
|
.idx = 0 ;index to pull characters
|
|
.hash = FNV_OFFSET_BASIS
|
|
repeat .len
|
|
load .temp byte from $$ + .idx
|
|
.hash = (.hash xor .temp)
|
|
.hash = (.hash * FNV_PRIME) and $FFFFFFFF
|
|
.idx = .idx+1
|
|
end repeat
|
|
end virtual
|
|
dd .hash
|
|
if CFG_PRINT_SYMTAB
|
|
PRINT $
|
|
display $20
|
|
PRINT .hash
|
|
display $20,xname,$A
|
|
end if
|
|
}
|
|
|
|
|
|
MACRO DSTACK{
|
|
xchg ebp,esp
|
|
}
|
|
MACRO RSTACK {
|
|
xchg ebp,esp
|
|
}
|
|
|
|
MACRO NEXT {
|
|
lodsd ;load next token
|
|
jmp dword[eax]
|
|
|
|
}
|
|
ALIGNMENT equ 2
|
|
ALIGN_NONCE equ 1
|
|
ALIGN_MASK equ $FFFFFFFE
|
|
;=============================================================================
|
|
; Header format Size: 8 bytes Alignment: 2
|
|
;-----------------------------------------------------------------------------
|
|
; offset size description
|
|
;-----------------------------------------------------------------------------
|
|
; -8 4 Link/flags | AND $FFFFFFFE = pointer to prev head
|
|
; --------------------------------------
|
|
; | AND 1 = flags.
|
|
; | 0: normal
|
|
; | 1: immediatiate
|
|
;-----------------------------------------------------------------------------
|
|
; -4 4 Hash 32-bit FNV1a of name
|
|
;-----------------------------------------------------------------------------
|
|
; 0 4 Code field
|
|
; ... ... ...
|
|
;-----------------------------------------------------------------------------
|
|
; ...
|
|
IMMEDIATE equ 1
|
|
|
|
MACRO HEAD name,type, immediate=0 {
|
|
align 2
|
|
dd LASTHEAD or immediate
|
|
HASH `name
|
|
name: dd type
|
|
LASTHEAD = name
|
|
}
|
|
|
|
|
|
MACRO HEADN name,hashname,type,immediate=0 {
|
|
align ALIGNMENT
|
|
dd LASTHEAD or immediate
|
|
HASH hashname
|
|
name: dd type
|
|
LASTHEAD = name
|
|
}
|
|
|
|
MACRO ANON name,type {
|
|
align ALIGNMENT
|
|
name: dd type
|
|
}
|
|
|
|
MACRO mstring args {
|
|
LOCAL .end
|
|
db .end-$-1
|
|
db args
|
|
.end:
|
|
align ALIGNMENT
|
|
}
|
|
; Set C flag if bytereg is whitespace
|
|
;
|
|
MACRO _IS_WS reg {
|
|
cmp reg,' '+1
|
|
}
|
|
|
|
ERRNUM_PARSE = -1
|
|
ERRNUM_EOF = -2
|
|
ERRNUM_RANGE = -3
|