mirror of
https://github.com/holub/mame
synced 2025-04-22 00:11:58 +03:00
290 lines
4.5 KiB
NASM
290 lines
4.5 KiB
NASM
; 7zAsm.asm -- ASM macros
|
|
; 2022-05-16 : Igor Pavlov : Public domain
|
|
|
|
|
|
; UASM can require these changes
|
|
; OPTION FRAMEPRESERVEFLAGS:ON
|
|
; OPTION PROLOGUE:NONE
|
|
; OPTION EPILOGUE:NONE
|
|
|
|
ifdef @wordsize
|
|
; @wordsize is defined only in JWASM and ASMC and is not defined in MASM
|
|
; @wordsize eq 8 for 64-bit x64
|
|
; @wordsize eq 2 for 32-bit x86
|
|
if @wordsize eq 8
|
|
x64 equ 1
|
|
endif
|
|
else
|
|
ifdef RAX
|
|
x64 equ 1
|
|
endif
|
|
endif
|
|
|
|
|
|
ifdef x64
|
|
IS_X64 equ 1
|
|
else
|
|
IS_X64 equ 0
|
|
endif
|
|
|
|
ifdef ABI_LINUX
|
|
IS_LINUX equ 1
|
|
else
|
|
IS_LINUX equ 0
|
|
endif
|
|
|
|
ifndef x64
|
|
; Use ABI_CDECL for x86 (32-bit) only
|
|
; if ABI_CDECL is not defined, we use fastcall abi
|
|
ifdef ABI_CDECL
|
|
IS_CDECL equ 1
|
|
else
|
|
IS_CDECL equ 0
|
|
endif
|
|
endif
|
|
|
|
OPTION PROLOGUE:NONE
|
|
OPTION EPILOGUE:NONE
|
|
|
|
MY_ASM_START macro
|
|
ifdef x64
|
|
.code
|
|
else
|
|
.386
|
|
.model flat
|
|
_TEXT$00 SEGMENT PARA PUBLIC 'CODE'
|
|
endif
|
|
endm
|
|
|
|
MY_PROC macro name:req, numParams:req
|
|
align 16
|
|
proc_numParams = numParams
|
|
if (IS_X64 gt 0)
|
|
proc_name equ name
|
|
elseif (IS_LINUX gt 0)
|
|
proc_name equ name
|
|
elseif (IS_CDECL gt 0)
|
|
proc_name equ @CatStr(_,name)
|
|
else
|
|
proc_name equ @CatStr(@,name,@, %numParams * 4)
|
|
endif
|
|
proc_name PROC
|
|
endm
|
|
|
|
MY_ENDP macro
|
|
if (IS_X64 gt 0)
|
|
ret
|
|
elseif (IS_CDECL gt 0)
|
|
ret
|
|
elseif (proc_numParams LT 3)
|
|
ret
|
|
else
|
|
ret (proc_numParams - 2) * 4
|
|
endif
|
|
proc_name ENDP
|
|
endm
|
|
|
|
|
|
ifdef x64
|
|
REG_SIZE equ 8
|
|
REG_LOGAR_SIZE equ 3
|
|
else
|
|
REG_SIZE equ 4
|
|
REG_LOGAR_SIZE equ 2
|
|
endif
|
|
|
|
x0 equ EAX
|
|
x1 equ ECX
|
|
x2 equ EDX
|
|
x3 equ EBX
|
|
x4 equ ESP
|
|
x5 equ EBP
|
|
x6 equ ESI
|
|
x7 equ EDI
|
|
|
|
x0_W equ AX
|
|
x1_W equ CX
|
|
x2_W equ DX
|
|
x3_W equ BX
|
|
|
|
x5_W equ BP
|
|
x6_W equ SI
|
|
x7_W equ DI
|
|
|
|
x0_L equ AL
|
|
x1_L equ CL
|
|
x2_L equ DL
|
|
x3_L equ BL
|
|
|
|
x0_H equ AH
|
|
x1_H equ CH
|
|
x2_H equ DH
|
|
x3_H equ BH
|
|
|
|
ifdef x64
|
|
x5_L equ BPL
|
|
x6_L equ SIL
|
|
x7_L equ DIL
|
|
|
|
r0 equ RAX
|
|
r1 equ RCX
|
|
r2 equ RDX
|
|
r3 equ RBX
|
|
r4 equ RSP
|
|
r5 equ RBP
|
|
r6 equ RSI
|
|
r7 equ RDI
|
|
x8 equ r8d
|
|
x9 equ r9d
|
|
x10 equ r10d
|
|
x11 equ r11d
|
|
x12 equ r12d
|
|
x13 equ r13d
|
|
x14 equ r14d
|
|
x15 equ r15d
|
|
else
|
|
r0 equ x0
|
|
r1 equ x1
|
|
r2 equ x2
|
|
r3 equ x3
|
|
r4 equ x4
|
|
r5 equ x5
|
|
r6 equ x6
|
|
r7 equ x7
|
|
endif
|
|
|
|
|
|
ifdef x64
|
|
ifdef ABI_LINUX
|
|
|
|
MY_PUSH_2_REGS macro
|
|
push r3
|
|
push r5
|
|
endm
|
|
|
|
MY_POP_2_REGS macro
|
|
pop r5
|
|
pop r3
|
|
endm
|
|
|
|
endif
|
|
endif
|
|
|
|
|
|
MY_PUSH_4_REGS macro
|
|
push r3
|
|
push r5
|
|
push r6
|
|
push r7
|
|
endm
|
|
|
|
MY_POP_4_REGS macro
|
|
pop r7
|
|
pop r6
|
|
pop r5
|
|
pop r3
|
|
endm
|
|
|
|
|
|
; for fastcall and for WIN-x64
|
|
REG_PARAM_0_x equ x1
|
|
REG_PARAM_0 equ r1
|
|
REG_PARAM_1_x equ x2
|
|
REG_PARAM_1 equ r2
|
|
|
|
ifndef x64
|
|
; for x86-fastcall
|
|
|
|
REG_ABI_PARAM_0_x equ REG_PARAM_0_x
|
|
REG_ABI_PARAM_0 equ REG_PARAM_0
|
|
REG_ABI_PARAM_1_x equ REG_PARAM_1_x
|
|
REG_ABI_PARAM_1 equ REG_PARAM_1
|
|
|
|
else
|
|
; x64
|
|
|
|
if (IS_LINUX eq 0)
|
|
|
|
; for WIN-x64:
|
|
REG_PARAM_2_x equ x8
|
|
REG_PARAM_2 equ r8
|
|
REG_PARAM_3 equ r9
|
|
|
|
REG_ABI_PARAM_0_x equ REG_PARAM_0_x
|
|
REG_ABI_PARAM_0 equ REG_PARAM_0
|
|
REG_ABI_PARAM_1_x equ REG_PARAM_1_x
|
|
REG_ABI_PARAM_1 equ REG_PARAM_1
|
|
REG_ABI_PARAM_2_x equ REG_PARAM_2_x
|
|
REG_ABI_PARAM_2 equ REG_PARAM_2
|
|
REG_ABI_PARAM_3 equ REG_PARAM_3
|
|
|
|
else
|
|
; for LINUX-x64:
|
|
REG_LINUX_PARAM_0_x equ x7
|
|
REG_LINUX_PARAM_0 equ r7
|
|
REG_LINUX_PARAM_1_x equ x6
|
|
REG_LINUX_PARAM_1 equ r6
|
|
REG_LINUX_PARAM_2 equ r2
|
|
REG_LINUX_PARAM_3 equ r1
|
|
REG_LINUX_PARAM_4_x equ x8
|
|
REG_LINUX_PARAM_4 equ r8
|
|
REG_LINUX_PARAM_5 equ r9
|
|
|
|
REG_ABI_PARAM_0_x equ REG_LINUX_PARAM_0_x
|
|
REG_ABI_PARAM_0 equ REG_LINUX_PARAM_0
|
|
REG_ABI_PARAM_1_x equ REG_LINUX_PARAM_1_x
|
|
REG_ABI_PARAM_1 equ REG_LINUX_PARAM_1
|
|
REG_ABI_PARAM_2 equ REG_LINUX_PARAM_2
|
|
REG_ABI_PARAM_3 equ REG_LINUX_PARAM_3
|
|
REG_ABI_PARAM_4_x equ REG_LINUX_PARAM_4_x
|
|
REG_ABI_PARAM_4 equ REG_LINUX_PARAM_4
|
|
REG_ABI_PARAM_5 equ REG_LINUX_PARAM_5
|
|
|
|
MY_ABI_LINUX_TO_WIN_2 macro
|
|
mov r2, r6
|
|
mov r1, r7
|
|
endm
|
|
|
|
MY_ABI_LINUX_TO_WIN_3 macro
|
|
mov r8, r2
|
|
mov r2, r6
|
|
mov r1, r7
|
|
endm
|
|
|
|
MY_ABI_LINUX_TO_WIN_4 macro
|
|
mov r9, r1
|
|
mov r8, r2
|
|
mov r2, r6
|
|
mov r1, r7
|
|
endm
|
|
|
|
endif ; IS_LINUX
|
|
|
|
|
|
MY_PUSH_PRESERVED_ABI_REGS macro
|
|
if (IS_LINUX gt 0)
|
|
MY_PUSH_2_REGS
|
|
else
|
|
MY_PUSH_4_REGS
|
|
endif
|
|
push r12
|
|
push r13
|
|
push r14
|
|
push r15
|
|
endm
|
|
|
|
|
|
MY_POP_PRESERVED_ABI_REGS macro
|
|
pop r15
|
|
pop r14
|
|
pop r13
|
|
pop r12
|
|
if (IS_LINUX gt 0)
|
|
MY_POP_2_REGS
|
|
else
|
|
MY_POP_4_REGS
|
|
endif
|
|
endm
|
|
|
|
endif ; x64
|