⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macros.mac

📁 这是asm驱动的开发包
💻 MAC
字号:
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                         F U N C T I O N S   P R O T O T Y P E S                                   
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

proto00 TYPEDEF proto
proto01 TYPEDEF proto :DWORD
proto02 TYPEDEF proto :DWORD, :DWORD
proto03 TYPEDEF proto :DWORD, :DWORD, :DWORD
proto04 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD
proto05 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto06 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto07 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto08 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto09 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto10 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto11 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto12 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto13 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto14 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto15 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto16 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto17 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto18 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto19 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
proto20 TYPEDEF proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD

pproto00 TYPEDEF PTR proto00
pproto01 TYPEDEF PTR proto01
pproto02 TYPEDEF PTR proto02
pproto03 TYPEDEF PTR proto03
pproto04 TYPEDEF PTR proto04
pproto05 TYPEDEF PTR proto05
pproto06 TYPEDEF PTR proto06
pproto07 TYPEDEF PTR proto07
pproto08 TYPEDEF PTR proto08
pproto09 TYPEDEF PTR proto09
pproto10 TYPEDEF PTR proto10
pproto11 TYPEDEF PTR proto11
pproto12 TYPEDEF PTR proto12
pproto13 TYPEDEF PTR proto13
pproto14 TYPEDEF PTR proto14
pproto15 TYPEDEF PTR proto15
pproto16 TYPEDEF PTR proto16
pproto17 TYPEDEF PTR proto17
pproto18 TYPEDEF PTR proto18
pproto19 TYPEDEF PTR proto19
pproto20 TYPEDEF PTR proto20

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                             M A C R O   D E F I N I T I O N S                                     
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

$IsCodeLabel MACRO Operand:REQ
	IF (OPATTR (Operand)) AND 00000001y
		;; References a code label
		EXITM <-1>
	ELSE
		EXITM <0>
	ENDIF
ENDM

$IsMem MACRO Operand:REQ
	IF (OPATTR (Operand)) AND 00000010y
		;; Is a memory variable or has a relocatable data label
		EXITM <-1>              ;; True
	ELSE
		EXITM <0>               ;; False
	ENDIF
ENDM

$IsImm MACRO Operand:REQ
	IF (OPATTR (Operand)) AND 00000100y
		;; Is an immediate value
        EXITM <-1>
    ELSE
        EXITM <0>
    ENDIF
ENDM

$IsDirMemAddr MACRO Operand:REQ
	IF (OPATTR (Operand)) AND 00001000y
		;; Uses direct memory addressing
        EXITM <-1>
	ELSE
        EXITM <0>
	ENDIF
ENDM

$IsReg MACRO Operand:REQ
	IF (OPATTR (Operand)) AND 00010000y
		;; Is a register value
        EXITM <-1>
    ELSE
        EXITM <0>
    ENDIF
ENDM

$IsNoError MACRO Operand:REQ
	IF (OPATTR (Operand)) AND 00100000y
		;; References no undefined symbols and is without error
        EXITM <-1>
	ELSE
        EXITM <0>
	ENDIF
ENDM

$IsStack MACRO Operand:REQ
	IF (OPATTR (Operand)) AND 01000000y
		;; relative to SS
        EXITM <-1>
    ELSE
        EXITM <0>
    ENDIF
ENDM

$IsExtLabel MACRO Operand:REQ
	IF (OPATTR (Operand)) AND 10000000y
		;; References an external label
        EXITM <-1>
	ELSE
        EXITM <0>
	ENDIF
ENDM

$IsAddr MACRO Operand:REQ
local a
	a = 0

	IF @SizeStr(<Operand>) GT 5		
		IFIDNI <addr >, @SubStr(<Operand>, 1 , 5)
			a = 1
		ENDIF
	ENDIF

	IF a
        EXITM <-1>
    ELSE
        EXITM <0>
    ENDIF
ENDM

$IsByte MACRO Operand:REQ
local r, f
	f = 0
	IF (TYPE Operand) EQ 1
        EXITM <-1>
	ELSE			; dunno why, but (TYPE al, bl..) doesn't work
		FOR r, <al,ah,bl,bh,cl,ch,dl,dh,>
			IFIDNI <Operand>, <r>
				f = 1
				EXITM
			ENDIF
		ENDM
		IF f
			EXITM <-1>
		ELSE
			EXITM <0>
		ENDIF
	ENDIF
ENDM

$IsWord MACRO Operand:REQ
	IF (TYPE Operand) EQ 2
        EXITM <-1>
	ELSE
        EXITM <0>
	ENDIF
ENDM

$IsDword MACRO Operand:REQ
	IF (TYPE Operand) EQ 4
        EXITM <-1>
	ELSE
        EXITM <0>
	ENDIF
ENDM

ECHONUM MACRO n:REQ
	local tn
	tn TEXTEQU %n
	% ECHO tn
ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

return MACRO rv, flag

	IFNB <rv>
		IF $IsReg(rv)				;; register
			IFDIFI <rv>, <eax>		;; not eax
				mov eax, rv
			ENDIF
		ELSEIF $IsImm(rv)			;; immediate value
			IF rv EQ 0;;FALSE
				xor eax, eax
			ELSEIF rv EQ 1;;TRUE
				xor eax, eax
				inc eax
			ELSEIF rv EQ -1
				or eax, -1
				;;xor eax, eax
				;;dec eax
			ELSE
				mov eax, rv
			ENDIF
		ELSEIF $IsMem(rv)			;; memory varible
			mov eax, rv
		ELSE
			.ERR <return macro ERROR! Cant recognize type of return value>
		ENDIF
	ENDIF
    
	ret
    
ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

;; Return macro result
$RMR MACRO m:VARARG
	m
	EXITM <eax>
ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

m2m MACRO Des:REQ, Sor:REQ, Reg

	IFB <Reg>
	    push Sor					;; Default size optimization
		pop  Des		
	ELSE
		IF $IsReg(Reg)
			mov Reg, Sor
			mov Des, Reg
		ELSE
			.ERR <m2m macro ERROR! Specify register value as third param.>
		ENDIF
	ENDIF
        
ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@ArgCount MACRO arglist:VARARG
    LOCAL count, arg
    count = 0
    FOR arg, <arglist>
        count = count + 1
    ENDM  
    EXITM %count
ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@ArgRev MACRO arglist
    LOCAL txt, arg
    txt TEXTEQU <>
%   FOR arg, <arglist>
        txt CATSTR <arg>, <!,>, txt
    ENDM
    txt SUBSTR  txt, 1, @SizeStr(%txt) - 1
    txt CATSTR  <!<>, txt, <!>>
    EXITM txt
ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

_mov MACRO Des:REQ, Sor:REQ, Reg
local x, r

	;; *** Source is a register ***
	IF $IsReg(Sor)
		IFDIFI <Des>, <Sor>			;; source and destination are different
			mov Des, Sor
		ENDIF
	;; *** Source is constant ***
	ELSEIF $IsImm(Sor)
		IFE Sor						;; == 0
			IF $IsReg(Des)		;; Destination is register
				xor Des, Des
			ELSE			
				and Des, 0
			ENDIF
		ELSEIF Sor EQ 1
			IF $IsReg(Des)		;; Destination is register
				xor Des, Des
				inc Des
			ELSE
				mov Des, Sor
			ENDIF
		ELSEIF Sor EQ -1
			IF $IsReg(Des)		;; Destination is register
				or Des, -1
				;; xor Des, Des / dec Des
			ELSE
				or Des, -1
			ENDIF
		ELSEIF (Sor GT -129) AND (Sor LT 128)		;; -129 < Sor < 128
			IF $IsReg(Des)		;; Destination is register
				mov Des, Sor
			ELSE
				mov Des, Sor
			ENDIF    
		ELSE
			mov Des, Sor
		ENDIF
	ELSE
		;; *** Source is memory (NOT Reg AND NOT Imm) ***
		IF $IsReg(Des)			;; Destination is a register
			mov Des, Sor
		ELSE
			IFDIF <Des>, <Sor>		;; source and destination are different
				m2m <Des>, <Sor>, <Reg>
			ENDIF
		ENDIF
	ENDIF
ENDM


;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

set MACRO flag:REQ
	or flag, 1
ENDM

reset MACRO flag:REQ
local r
	IF $IsReg(flag)
		xor flag, flag
	ELSE
		and flag, 0
	ENDIF

ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

$invoke MACRO vars:VARARG
     invoke vars
     EXITM <eax>
ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       Fix helper macro                                            
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Fix MACRO txt:=<Fix this later!!!!>
	local pos, spos
IFDEF DEBUG
	pos = 0
	spos = 0

	% FORC chr, @FileCur		;; Don't display full path. Easier to read.
		pos = pos + 1
		IF "&chr" EQ 5Ch		;; "/"
			spos = pos
		ENDIF
	ENDM

	% ECHO @CatStr(<Fix: >, @SubStr(%@FileCur, spos+1,), <(%@Line) - txt>)
ENDIF
ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

date MACRO
local pos, month

	;; Day
	pos = 1
	% FORC chr, @Date
		IF (pos EQ 4) OR (pos EQ 5)
			db "&chr"
		ENDIF
		pos = pos + 1
	ENDM

	;; Month
	pos = 1
	% FORC chr, @Date
		IF (pos EQ 1)
			month TEXTEQU @SubStr(%@Date, 1 , 2)
			IF month EQ 01
				db " Jan "	
			ELSEIF month EQ 02
				db " Feb "	
			ELSEIF month EQ 03
				db " Mar "	
			ELSEIF month EQ 04
				db " Apr "	
			ELSEIF month EQ 05
				db " May "	
			ELSEIF month EQ 06
				db " Jun "	
			ELSEIF month EQ 07
				db " Jul "	
			ELSEIF month EQ 08
				db " Aug "	
			ELSEIF month EQ 09
				db " Sep "	
			ELSEIF month EQ 10
				db " Oct "	
			ELSEIF month EQ 11
				db " Nov "	
			ELSEIF month EQ 12
				db " Dec "	
			ENDIF
		ENDIF
		pos = pos + 1
	ENDM

	;; Year
	db "20"
	pos = 1
	% FORC chr, @Date
		IF (pos EQ 7) OR (pos EQ 8)
			db "&chr"
		ENDIF
		pos = pos + 1
	ENDM

ENDM

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -