forked from KolibriOS/kolibrios
127 lines
2.2 KiB
PHP
127 lines
2.2 KiB
PHP
|
macro reg_props type,size,[reg]
|
||
|
{
|
||
|
typeof.#reg = type
|
||
|
sizeof.#reg = size
|
||
|
}
|
||
|
?isReg32 equ in <eax,ebx,ecx,edx,esi,edi,ebp,esp>
|
||
|
?isReg32w8 equ in <eax,ebx,ecx,edx>
|
||
|
?isReg equ eqtype eax
|
||
|
?isInteger equ eqtype 0
|
||
|
?isFlatMem equ eqtype []
|
||
|
?isSegMem equ eqtype fs:[]
|
||
|
?isString equ eqtype ''
|
||
|
|
||
|
macro madd reg,a1,a2 { add reg,(a1) shl 16 + (a2) }
|
||
|
macro msub reg,a1,a2 { sub reg,(a1) shl 16 + (a2) }
|
||
|
|
||
|
macro mcr_mov arg1*,arg2*
|
||
|
{
|
||
|
if (arg1 ?isReg32) & ((arg2 ?isInteger) | (arg2 ?isString))
|
||
|
if ~(arg2)
|
||
|
xor arg1,arg1
|
||
|
else if (arg2) = 1
|
||
|
xor arg1,arg1
|
||
|
inc arg1
|
||
|
else if (arg2) = -1
|
||
|
or arg1,-1
|
||
|
else
|
||
|
mov arg1,arg2
|
||
|
end if
|
||
|
else
|
||
|
mov arg1,arg2
|
||
|
end if
|
||
|
}
|
||
|
|
||
|
macro mpack dest, hsrc, lsrc
|
||
|
{
|
||
|
if (hsrc ?isInteger)
|
||
|
if (lsrc ?isReg32)
|
||
|
lea dest, [(hsrc) shl 16 + lsrc]
|
||
|
else if (+lsrc ?isInteger) ;everething except memory opnd
|
||
|
mov dest, (hsrc) shl 16 + lsrc
|
||
|
else ;if (lsrc ?isFlatMem) | (lsrc ?isSegMem)
|
||
|
mov dest, lsrc
|
||
|
add dest, (hsrc) shl 16
|
||
|
end if
|
||
|
else
|
||
|
mov dest, hsrc
|
||
|
shl dest, 16
|
||
|
add dest, lsrc
|
||
|
end if
|
||
|
}
|
||
|
|
||
|
macro __mov reg,a,b { ; mike.dld
|
||
|
match any,a \{
|
||
|
if (~b eq)
|
||
|
mpack reg,a,b
|
||
|
else if ~(a eq reg)
|
||
|
mcr_mov reg,a
|
||
|
end if \}
|
||
|
}
|
||
|
|
||
|
macro regcall proc,a,b,c,d,e,f,g {
|
||
|
__mov eax,a
|
||
|
__mov ebx,b
|
||
|
__mov ecx,c
|
||
|
__mov edx,d
|
||
|
__mov esi,e
|
||
|
__mov edi,f
|
||
|
__mov ebp,g
|
||
|
call proc
|
||
|
}
|
||
|
|
||
|
macro reginvk proc,a,b,c,d,e,f,g {
|
||
|
__mov eax,a
|
||
|
__mov ebx,b
|
||
|
__mov ecx,c
|
||
|
__mov edx,d
|
||
|
__mov esi,e
|
||
|
__mov edi,f
|
||
|
__mov ebp,g
|
||
|
call [proc]
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
include 'config.inc'
|
||
|
;__CPU_type equ p5
|
||
|
SYSENTER_VAR equ 0
|
||
|
|
||
|
macro mcallb a,b,c,d,e,f { ; mike.dld, updated by Ghost for Fast System Calls
|
||
|
local ..ret_point
|
||
|
__mov ebx,b
|
||
|
__mov ecx,c
|
||
|
__mov edx,d
|
||
|
__mov esi,e
|
||
|
__mov edi,f
|
||
|
|
||
|
if __CPU_type eq p5
|
||
|
int 0x40
|
||
|
else
|
||
|
if __CPU_type eq p6
|
||
|
push ebp
|
||
|
mov ebp, esp
|
||
|
push ..ret_point ; it may be 2 or 5 byte
|
||
|
sysenter
|
||
|
..ret_point:
|
||
|
pop edx
|
||
|
pop ecx
|
||
|
|
||
|
else
|
||
|
if __CPU_type eq k6
|
||
|
push ecx
|
||
|
syscall
|
||
|
pop ecx
|
||
|
else
|
||
|
display 'ERROR : unknown CPU type (set to p5)', 10, 13
|
||
|
__CPU_type equ p5
|
||
|
int 0x40
|
||
|
end if
|
||
|
end if
|
||
|
end if
|
||
|
}
|
||
|
|
||
|
macro mcall a,b& { ; mike.dld, updated by Ghost for Fast System Calls
|
||
|
__mov eax,a
|
||
|
mcallb ,b
|
||
|
}
|