📄 macros.asm
字号:
EnableError =0 ;Uncomment to report error messages
RegStr TEXTEQU <eax,ebx,ecx,edx,edi,esi,ebp,esp>
Random TEXTEQU <GENERIC_READ or GENERIC_WRITE>
Input EQU <GENERIC_READ>
Ouput EQU <GENERIC_WRITE>
IFDEF EnableError
.DATA
Align 4
err2 DB "Error in "
err3 DB 15 DUP(0)
ENDIF
.DATA?
Align 4
CurrentDC DD ?
WindowH DD ?
String DB 256 DUP (?)
pxx DD ?
pyy DD ?
FindFileHnd DD ?
HeapHnd DD ?
IFDEF EnableError
err1 DD ?
ENDIF
BrRect RECT <?> ; BrRect:RECT
.CODE
;---------------------------------------------------------------------------------;
SetDC Macro hWindow:req,HanDC ;HanDC Optional
mov WindowH,eax
IFNB <HanDC>
mov CurrentDC,HanDC
ELSE
Invoke GetDC,hWindow
mov CurrentDC,eax
ENDIF
EndM
;---------------------------------------------------------------------------------;
DelDC Macro
Invoke ReleaseDC,WindowH,CurrentDC
EndM
;---------------------------------------------------------------------------------;
IsMMReg Macro reg1:req
Local reg2,reg3
reg3 TEXTEQU <0>
%FOR reg2,<MM0,MM1,MM2,MM3,MM4,MM5,MM6,MM7> ;RegStr
;%echo reg2,<reg1>
IFIDN <reg2>,<reg1>
reg3 TEXTEQU <1>
EXITM <1>
ENDIF
EndM
EXITM <reg3>
EndM
;---------------------------------------------------------------------------------;
IsReg Macro reg1:req
Local reg2,reg3
reg3 TEXTEQU <0>
%FOR reg2,<eax,ebx,ecx,edx,esi,edi,esp,ebp> ;RegStr
;%echo reg2,<reg1>
IFIDN <reg2>,<reg1>
reg3 TEXTEQU <1>
EXITM <1>
ENDIF
EndM
EXITM <reg3>
EndM
;---------------------------------------------------------------------------------;
Len Macro Stri:req,Lout ;out ebx=length
IF IsReg(Stri)
IFDIFI <Stri>, <edi>
mov edi,Stri
ENDIF
ELSE
mov edi,Offset Stri
ENDIF
xor ebx,ebx
xor ecx,ecx
xor eax,eax
dec ecx
sub ebx,2
repne scasb
sub ebx,ecx
IFNB <Lout>
IFDIFI <Lout>,<ebx>
mov Lout,ebx
ENDIF
ENDIF
EndM
;---------------------------------------------------------------------------------;
Print Macro xx:=<0>,yy:=<0>,pp,HDC:=<CurrentDC> ;:=<req>
Local pText
.DATA
IF IsReg(pp)
ELSE
pText DB pp,0
ENDIF
.CODE
IF IsReg(pp)
IFDIFI <pp>,<eax>
mov eax,pp
ENDIF
HexToStr
mov esi,edi
Len edi
Invoke TextOut,HDC,xx,yy,esi,ebx ;Sizeof pText-1
ELSE
Invoke TextOut,HDC,xx,yy,Addr pText, Sizeof pText-1
ENDIF
EndM
;---------------------------------------------------------------------------------;
PrintStr Macro xx:=<0>,yy:=<0>,pStr,Length,HDC:=<CurrentDC>
IFB <Length>
IFNB <pStr>
IF IsReg(pStr)
push pStr
Len pStr,ebx
pop pStr
Invoke TextOut,HDC ,xx,yy,pStr,ebx
ELSE
Len pStr,ebx
Invoke TextOut,HDC ,xx,yy,Addr pStr,ebx
ENDIF
ELSE
Len edi
Invoke TextOut,HDC,xx,yy,edi,ebx
ENDIF
ELSE
IFNB <pStr>
IF IsReg(pstr)
Invoke TextOut,HDC ,xx,yy,pStr,Length
ELSE
Invoke TextOut,HDC ,xx,yy,pStr,Length
ENDIF
ELSE
Invoke TextOut,HDC ,xx,yy,edi,Length
ENDIF
ENDIF
EndM
;---------------------------------------------------------------------------------;
PrintEM Macro mBoxStr
Local pem
.DATA
pem DB mBoxStr,0
.CODE
Invoke MessageBox,NULL,Addr pem,cStr("ERROR!"),MB_OK or MB_ICONERROR
EndM
;---------------------------------------------------------------------------------;
UpCurPos Macro ucp:REQ,HDC:=<CurrentDC> ; ucp 1=true , 0=false
IFIDNI <ucp>,<1>
Invoke GetTextAlign,HDC
test eax,1
jnz uup
or eax,1
Invoke SetTextAlign,HDC,eax
uup:
ELSE
Invoke GetTextAlign,HDC
test eax,1
jz uup2
and eax,0fffffffeh
Invoke SetTextAlign,HDC,eax
uup2:
ENDIF
EndM
;---------------------------------------------------------------------------------;
Line Macro lx1,ly1,lx2:req,ly2:req,HDC:=<CurrentDC> ;x1,y1 not req. or x1 & y1 both should be given
IFNB <lx1>
IFNB <ly1>
Invoke MoveToEx,HDC ,lx1,ly1,NULL
ENDIF
ENDIF
Invoke LineTo,HDC,lx2,ly2
EndM
;---------------------------------------------------------------------------------;
LinePoly Macro pPoints:req,pTypes:req,Count:req,HDC:=<CurrentDC> ;points,bytes,int
Invoke PolyDraw,HDC,pPoints,pTypes,Count
EndM
;---------------------------------------------------------------------------------;
LineToPoly Macro pPoints:req,Count:req,HDC:=<CurrentDC> ;points,int
Invoke Polyline,HDC ,pPoints,Count
EndM
;---------------------------------------------------------------------------------;
Circle Macro x:req,y:req,rad:req,y2,HDC:=<CurrentDC> ; ifnb y2 then x1,y1,x2,y2
IFNB <y2>
Invoke Ellipse,HDC,x,y,rad,y2
ELSE
Invoke Ellipse,HDC,x-rad,y-rad,x+rad,y+rad
ENDIF
EndM
;---------------------------------------------------------------------------------;
Box Macro x1:req,y1:req,x2:req,y2:req,col,hBrush,HDC:=<CurrentDC>;if hBrush --> no col
mov ebx,Offset BrRect
mov [ebx].RECT.left,x1
mov [ebx].RECT.top,y1
mov [ebx].RECT.right,x2
mov [ebx].RECT.bottom,y2
IFNB <hBrush>
Invoke FillRect,HDC,Addr BrRect,hBrush
ELSE
Invoke CreateSolidBrush,col
mov edi,eax
Invoke FillRect,HDC,Addr BrRect,eax
Invoke DeleteObject,edi
ENDIF
EndM
;---------------------------------------------------------------------------------;
ErrorCheck Macro ErrTitle:req
Local err4
.DATA
err4 DB ErrTitle,0
.CODE
IFDEF EnableError
.If eax==0
push eax
mov esi,Offset err4
mov ecx,Sizeof err4
call ErrorProc
pop eax
.EndIf
ENDIF
EndM
IFDEF EnableError
ErrorProc Proc
.CODE
mov edi,Offset err3
rep movsb
Invoke GetLastError
Invoke FormatMessage,FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS,NULL,\
eax,0,Addr err1,0,NULL
Invoke MessageBox,NULL,err1,Addr err2,MB_OK or MB_ICONERROR
ret
ErrorProc EndP
ENDIF
;---------------------------------------------------------------------------------;
cStr Macro CCstr:VARARG
Local CCstr2
.DATA
CCstr2 DB CCstr,0
.CODE
EXITM <Offset CCstr2>
EndM
;---------------------------------------------------------------------------------;
cStr2 Macro CCstr:VARARG
Local CCstr2
.DATA
CCstr2 DB CCstr,0
.CODE
EXITM <Offset CCstr2>
EndM
;---------------------------------------------------------------------------------;
Dim Macro VarName:req ;out 'dd' var
Local dvar
.DATA?
VarName DD ?
.CODE
EXITM <VarName>
EndM
;---------------------------------------------------------------------------------;
HexToStr Macro HTS2:=<eax> ;in eax=num
Local hts
IFNB <HTS2>
IFDIFI <HTS2>,<eax>
mov eax,HTS2
ENDIF
ENDIF
mov edi,Offset String ;out esi=offset string
mov ecx,10 ;modified regs edi
add edi,9 ; ecx
mov ebx,10 ; ebx
hts: mov edx,0 ; edx
div ebx ; esi
add dl,48 ; eax
mov [edi],dl
sub edi,1
loop hts
mov edi,Offset String
mov byte Ptr[edi+10],0
EndM
;---------------------------------------------------------------------------------;
Ddata Macro var:REQ,ddta:VARARG
IFNB <ddta>
.DATA
var DD ddta
ELSE
.DATA?
var DD ?
ENDIF
.CODE
EndM
;---------------------------------------------------------------------------------;
@var Macro var:REQ,ddta:VARARG
IFNB <ddta>
.DATA
var2 DD ddta
ELSE
.DATA?
var2 DD ?
ENDIF
.CODE
EXITM <var2>
EndM
;---------------------------------------------------------------------------------;
InkT Macro col,HandleDC:=<CurrentDC> ;HandleDC optional
Invoke SetTextColor,HandleDC,col
EndM
;---------------------------------------------------------------------------------;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -