?? macros.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
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -