1
0
kolibrios/programs/network/icq/trunk/STDCALL.INC

151 lines
3.1 KiB
Plaintext
Raw Normal View History

..Open = 0
; When some procedure is not finished with 'endp' macro,
; "Unexpected end of file" error, occur without any info, where is error.
; in this case, comment followind 2 rows and uncomment next two.
; proc_used and endp_used are optimized versions of the macroses.
; proc_debug and endp_debug are debug versions. When you use debug
; versions, error message will show you where is missing 'endp'.
;
; Don't forget to recompile with *_used versions, to get optimised
; binary with all not used procedure excluded.
macro RestoreEx [name]
{
macro rstr#name _% RESTORE name %_
macro rstr _% %_
rstr#name
purge rstr,rstr#name
}
_% fix {
%_ fix }
restore fix RestoreEx
proc fix proc_used
endp fix endp_used
;proc fix proc_debug
;endp fix endp_debug
macro proc_used name,[arg] { ; define procedure
common
proc_args fix arg
; if ~ used name
; if ~..ShowSkipped eq OFF
; display 1,'Procedure skiped: ',`name, $0d, $0a
; end if
; else
if used name
name:
virtual at ebp+8
if ~ arg eq
forward
local ..arg
..arg dd ?
arg equ ..arg
common
end if
..ret = $ - (ebp+8)
end virtual
local ..dynamic_data,..dynamic_size
dynamic_data equ ..dynamic_data
dynamic_size equ ..dynamic_size
virtual at ebp - dynamic_size
dynamic_data:
}
macro proc_debug name,[arg] { ; define procedure
common
proc_args fix arg
if ..Open > 0
Error! Missing 'endp' before procedure `name
end if
..Open = ..Open+1
name:
virtual at ebp+8
if ~ arg eq
forward
local ..arg
..arg dd ?
arg equ ..arg
common
end if
..ret = $ - (ebp+8)
end virtual
local ..dynamic_data,..dynamic_size
dynamic_data equ ..dynamic_data
dynamic_size equ ..dynamic_size
virtual at ebp - dynamic_size
dynamic_data:
}
macro begin { ; begin procedure instructions
; continue from "proc" macro.
; align 4
rb (4 - ($ - dynamic_data) and 11b) and 11b ; align the stack at dword.
dynamic_size = $ - dynamic_data
end virtual
if (dynamic_size = 0)
if ..ret <> 0
push ebp ; smaller is dynamic_size = 0
mov ebp, esp
end if
else
enter dynamic_size, 0
end if
}
macro return { ; return from procedure
; continue from "enter" macro.
if ..ret <> 0
leave
ret ..ret
else
if dynamic_size <> 0
leave
end if
ret
end if
}
macro endp_used {
restore proc_args
end if
}
macro endp_debug {
restore proc_args
..Open = ..Open - 1
}
macro _reversepusharg [arg] {
reverse
pushd arg
}
macro stdcall proc,[arg] { ; call procedure
common
if ~ arg eq
_reversepusharg arg
end if
call proc
}
macro invoke proc,[arg] { ; invoke procedure (indirect)
common
stdcall [proc],arg
}
;end of file