nforth/macros.asm

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