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

📄 macros.mac

📁 符号链接名查看器
💻 MAC
字号:

; Here are some of my macros
; Four-F, four-f@mail.ru

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                         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

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

$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

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

IF_MSG MACRO msg:REQ, do:REQ
      cmp eax, msg
      jz  do
ENDM

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

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

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

;; Retrieves low word from double word argument in eax

_LOWORD MACRO dwVar:REQ
	IFDIFI <dwVar>, <eax>	;; don't move eax onto itself
		mov eax, dwVar
	ENDIF
	and eax, 0FFFFh
ENDM

$LOWORD MACRO dwVar:REQ
	IF $IsImm(dwVar)
		EXITM <dwVar AND 0FFFFh>
	ELSE
		EXITM $RMR(_LOWORD dwVar)
	ENDIF
ENDM

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

;; Retrieves hi word from double word argument in eax

_HIWORD MACRO dwVar:REQ
	IFDIFI <dwVar>, <eax>	;; don't move eax onto itself
		mov eax, dwVar
	ENDIF
	shr eax, 16
ENDM

$HIWORD MACRO dwVar:REQ
	IF $IsImm(dwVar)
		EXITM <dwVar SHR 16>
	ELSE
		EXITM $RMR(_HIWORD dwVar)
	ENDIF
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

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

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

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                *_PROC_LOCALS                                                    
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DLG_PROC_LOCALS	= 0

DLG_PROC_LOCAL MACRO lcl_lst:VARARG
local cnt, l, a

	IFNB <lcl_lst>
	    FOR l, <lcl_lst>
			% @CatStr(<DLGLOCAL>, %DLG_PROC_LOCALS) MACRO
				;local a
				a CATSTR <LOCAL >, <l>
				;; START * Next string only for reporting by assembly time
				@CatStr(<DlgLocalReport>, %DLG_PROC_LOCALS) TEXTEQU a
				;; END * Next string only for reporting by assembly time
				a	
			ENDM
			DLG_PROC_LOCALS = DLG_PROC_LOCALS + 1
	    ENDM  
	ENDIF

	IF DLG_PROC_LOCALS NE 0
		cnt = 0
		REPEAT DLG_PROC_LOCALS
			% @CatStr(<DLGLOCAL>, %cnt)
			cnt = cnt + 1
		ENDM
	ENDIF

	;; START * Next string only for reporting by assembly time
	IFB <lcl_lst>
		cnt = 0
		ECHO ======   Dialog Procedure Locals   ======
		REPEAT DLG_PROC_LOCALS
		% ECHO @CatStr(<DlgLocalReport>, %cnt)
		cnt = cnt + 1
		ENDM
	ENDIF
	;; END * Next string only for reporting by assembly time

ENDM

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

WND_PROC_LOCALS	= 0

WND_PROC_LOCAL MACRO lcl_lst:VARARG
local cnt, l, a, b

	IFNB <lcl_lst>
	    FOR l, <lcl_lst>
			% @CatStr(<WNDLOCAL>, %WND_PROC_LOCALS) MACRO
				;local a
				a CATSTR <LOCAL >, <l>
				a	
			ENDM
			WND_PROC_LOCALS = WND_PROC_LOCALS + 1
	    ENDM  
	ENDIF

	IF WND_PROC_LOCALS NE 0
		cnt = 0
		REPEAT WND_PROC_LOCALS
			% @CatStr(<WNDLOCAL>, %cnt)
			cnt = cnt + 1
		ENDM
	ENDIF

	;; START * Next string only for reporting by assembly time
	IFB <lcl_lst>
		cnt = 0
		ECHO ======   Window Procedure Locals   ======
		REPEAT WND_PROC_LOCALS
		% ECHO @CatStr(<WndLocalReport>, %cnt)
		cnt = cnt + 1
		ENDM
	ENDIF
	;; END * Next string only for reporting by assembly time

ENDM

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

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

	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>)
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 + -