📄 macros.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 + -