mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
6.4 KiB
225 lines
6.4 KiB
;---------------------------Module-Header------------------------------;
|
|
; Module Name: cmacflat.inc
|
|
;
|
|
; Copyright (c) 1992 Microsoft Corporation
|
|
;-----------------------------------------------------------------------;
|
|
;-----------------------------------macro-----------------------------------
|
|
;
|
|
; errnz exp - generate error message if expression isn't zero
|
|
;
|
|
; The errnz will generate an error message if the expression "exp"
|
|
; does not evaluate to zero. This macro is very useful for testing
|
|
; relationships between items, labels, and data that was coded into
|
|
; an application.
|
|
;
|
|
; errnz <offset $ - offset label> ;error if not at "label"
|
|
; errnz <eofflag and 00000001b> ;eofflag must be bit 0
|
|
;
|
|
; For expressions involving more than one token, the angle brackets
|
|
; must be used.
|
|
;
|
|
; The macro is only evaluated on pass 2, so forward references may be
|
|
; used in the expression.
|
|
;---------------------------------------------------------------------------
|
|
|
|
if @Version GE 600
|
|
|
|
errnz macro x ;;display error if expression is <>0
|
|
if2
|
|
.errnz (x),<x>
|
|
endif
|
|
endm
|
|
|
|
else ;!(@Version GE 600)
|
|
|
|
errnz macro x ;;display error if expression is <>0
|
|
if2
|
|
if x ;;if expression is non-zero,
|
|
errnz1 <x>,%(x)
|
|
endif
|
|
endif
|
|
endm
|
|
|
|
errnz1 macro x1,x2
|
|
= *errnz* x1 = x2
|
|
.err
|
|
endm
|
|
|
|
endif ;!(@Version GE 600)
|
|
|
|
|
|
;-----------------------------------macro-----------------------------------
|
|
;
|
|
; errn$ label,exp - generate error message if label (exp) <> $
|
|
;
|
|
; The errnz will generate an error message if the label and "exp"
|
|
; does not evaluate to the current value of the location counter.
|
|
; This macro is very useful for testing relationships between
|
|
; labels and the location counter that was coded into an application.
|
|
;
|
|
; examples: errn$ label ;error if not at "label"
|
|
; errn$ label,+3 ;error if not three bytes from "label"
|
|
; errn$ label,-3 ;error if not three bytes past "label"
|
|
;
|
|
; If no "exp" is given, it is the same as specifying 0
|
|
;
|
|
; The macro is only evaluated on pass 2, so forward references may be
|
|
; used in the expression.
|
|
;---------------------------------------------------------------------------
|
|
|
|
errn$ macro l,x ;;error if <$-label1 (exp2)> <>0
|
|
errnz <offset $ - offset l x>
|
|
endm
|
|
|
|
|
|
;-----------------------------------macro-----------------------------------
|
|
;
|
|
; useframe - generate "loc" and arg macros for accessing locals on the frame
|
|
;
|
|
; usage: useframe name
|
|
;
|
|
; name: name of the frame to be used
|
|
;
|
|
; useloc generates text equates which are used for accessing locals and
|
|
; parameters on the current frame, based off of EBP.
|
|
;
|
|
; The locals and parameters are each defined as a structure with the name
|
|
; parm_<name> and loc_<name>. What is generated is text equates of the form
|
|
;
|
|
; parm equ <([ebp + 8])>
|
|
; and
|
|
; loc equ <([ebp + sizof(loc_name))>
|
|
;
|
|
; This implies some things of interest:
|
|
;
|
|
; 1) The calling convention is implied to be that of C. For PASCAL calling
|
|
; convention, the parm_ structure must be reordered. This can be
|
|
; accomplished by using the create_parm macro which will define the
|
|
; structure in the correct order for the calling convention
|
|
;
|
|
; 2) The loc_name structure should have the most commonly accessed variables
|
|
; listed last in the structure so that the end up with the smalled offset,
|
|
; and possibly a single byte displacement in the instruction.
|
|
;
|
|
; 3) A frame which looks like
|
|
;
|
|
; ---------------------
|
|
; | |
|
|
; | parameters |
|
|
; | |
|
|
; --------------------- <--- EBP + 8
|
|
; | |
|
|
; | ret addr |
|
|
; | |
|
|
; ---------------------
|
|
; | |
|
|
; | old EBP |
|
|
; | |
|
|
; --------------------- <--- EBP
|
|
; | |
|
|
; | locals |
|
|
; | |
|
|
; ---------------------
|
|
; | |
|
|
; | saved regs |
|
|
; | |
|
|
; ---------------------
|
|
;
|
|
; Once defined, frame variables can be accessed simply by parm.strucname or
|
|
; loc.strucname.
|
|
;---------------------------------------------------------------------------
|
|
|
|
|
|
useframe macro name
|
|
ifdef parm_&name
|
|
parm equ <([ebp + 8])>
|
|
else
|
|
parm equ <>
|
|
endif
|
|
ifdef loc_&name
|
|
useframe1 %(((size loc_&name) + 3) and (not 3))
|
|
else
|
|
loc equ <>
|
|
endif
|
|
endm
|
|
|
|
useframe1 macro size
|
|
loc equ <([ebp - size])>
|
|
endm
|
|
|
|
|
|
|
|
;-----------------------------------macro-----------------------------------
|
|
;
|
|
; enterframe - builds the given frame
|
|
;
|
|
; usage: enterframe name,<save list>
|
|
;
|
|
; name: name of the frame to generate
|
|
; save list: a list of 32 bit registers to be saved upon entry and
|
|
; restored upon exit (when leaveframe is encountered)
|
|
;
|
|
;
|
|
; enterframe builds the given frame upon the stack at the point it is
|
|
; encountered. What is generated is the following:
|
|
;
|
|
; enter sizeof(loc_&name);
|
|
; push <save list>
|
|
;
|
|
; Once created, frame variables can be accessed simply by parm.strucname or
|
|
; loc.strucname.
|
|
;---------------------------------------------------------------------------
|
|
|
|
|
|
enterframe macro name,savelist
|
|
useframe name
|
|
?cjFrame = 0
|
|
ifdef ?PASCALConventions
|
|
ifdef parm_&name
|
|
?cjFrame = size parm_&name
|
|
endif
|
|
endif
|
|
ifdef loc_&name
|
|
enter (((size loc_&name) + 3) and (not 3)),0
|
|
else
|
|
enter 0,0
|
|
endif
|
|
?regpoplist equ <>
|
|
ifnb <&savelist>
|
|
irp reg,<&savelist>
|
|
ifnb <&®>
|
|
push &®
|
|
?regpoplist catstr <&®>,<,>,?regpoplist
|
|
endif
|
|
endm
|
|
endif
|
|
endm
|
|
|
|
|
|
|
|
;-----------------------------------macro-----------------------------------
|
|
;
|
|
; leaveframe - removes the frame created by enterframe.
|
|
;
|
|
; usage: leaveframe
|
|
;
|
|
;
|
|
; leaveframe restores saved registers, removes locals from the frame, and
|
|
; restores BP, and returns to the caller, optionally popping parameters
|
|
; from the stack.
|
|
;
|
|
; No invalidation of the loc and parm equates is performed.
|
|
;---------------------------------------------------------------------------
|
|
|
|
|
|
leaveframe macro
|
|
% irp reg,<?regpoplist>
|
|
ifnb <®>
|
|
pop reg
|
|
endif
|
|
endm
|
|
leave
|
|
ret ?cjFrame
|
|
endm
|
|
|
|
|