Annotation of ntddk/src/video/displays/vga/i386/cmacflat.inc, revision 1.1.1.1

1.1       root        1: ;---------------------------Module-Header------------------------------;
                      2: ; Module Name: cmacflat.inc
                      3: ;
                      4: ; Copyright (c) 1992 Microsoft Corporation
                      5: ;-----------------------------------------------------------------------;
                      6: ;-----------------------------------macro-----------------------------------
                      7: ;
                      8: ; errnz exp - generate error message if expression isn't zero
                      9: ;
                     10: ; The errnz will generate an error message if the expression "exp"
                     11: ; does not evaluate to zero.  This macro is very useful for testing
                     12: ; relationships between items, labels, and data that was coded into
                     13: ; an application.
                     14: ;
                     15: ;       errnz   <offset $ - offset label>   ;error if not at "label"
                     16: ;       errnz   <eofflag and 00000001b>     ;eofflag must be bit 0
                     17: ;
                     18: ; For expressions involving more than one token, the angle brackets
                     19: ; must be used.
                     20: ;
                     21: ; The macro is only evaluated on pass 2, so forward references may be
                     22: ; used in the expression.
                     23: ;---------------------------------------------------------------------------
                     24: 
                     25: errnz macro x                           ;;display error if expression is <>0
                     26:   if2
                     27:     if x                                ;;if expression is non-zero,
                     28:       errnz1  <x>,%(x)
                     29:     endif
                     30:   endif
                     31: endm
                     32: 
                     33: errnz1 macro x1,x2
                     34:   = *errnz* x1 = x2
                     35:   .err
                     36: endm
                     37: 
                     38: 
                     39: ;-----------------------------------macro-----------------------------------
                     40: ;
                     41: ; errn$ label,exp - generate error message if label (exp) <> $
                     42: ;
                     43: ; The errnz will generate an error message if the label and "exp"
                     44: ; does not evaluate to the current value of the location counter.
                     45: ; This macro is very useful for testing relationships between
                     46: ; labels and the location counter that was coded into an application.
                     47: ;
                     48: ; examples:  errn$   label        ;error if not at "label"
                     49: ;            errn$   label,+3     ;error if not three bytes from "label"
                     50: ;            errn$   label,-3     ;error if not three bytes past "label"
                     51: ;
                     52: ; If no "exp" is given, it is the same as specifying 0
                     53: ;
                     54: ; The macro is only evaluated on pass 2, so forward references may be
                     55: ; used in the expression.
                     56: ;---------------------------------------------------------------------------
                     57: 
                     58: errn$ macro l,x                         ;;error if <$-label1 (exp2)> <>0
                     59:   errnz   <offset $ - offset l x>
                     60: endm
                     61: 
                     62: 
                     63: ;-----------------------------------macro-----------------------------------
                     64: ;
                     65: ; useframe - generate "loc" and arg macros for accessing locals on the frame
                     66: ;
                     67: ; usage:    useframe name
                     68: ;
                     69: ;           name: name of the frame to be used
                     70: ;
                     71: ; useloc generates text equates which are used for accessing locals and
                     72: ; parameters on the current frame, based off of EBP.
                     73: ;
                     74: ; The locals and parameters are each defined as a structure with the name
                     75: ; parm_<name> and loc_<name>.  What is generated is text equates of the form
                     76: ;
                     77: ;       parm    equ <([ebp + 8])>
                     78: ;   and
                     79: ;       loc     equ <([ebp + sizof(loc_name))>
                     80: ;
                     81: ; This implies some things of interest:
                     82: ;
                     83: ;   1)  The calling convention is implied to be that of C.  For PASCAL calling
                     84: ;       convention, the parm_ structure must be reordered.  This can be
                     85: ;       accomplished by using the create_parm macro which will define the
                     86: ;       structure in the correct order for the calling convention
                     87: ;
                     88: ;   2)  The loc_name structure should have the most commonly accessed variables
                     89: ;       listed last in the structure so that the end up with the smalled offset,
                     90: ;       and possibly a single byte displacement in the instruction.
                     91: ;
                     92: ;   3)  A frame which looks like
                     93: ;
                     94: ;           ---------------------
                     95: ;           |                   |
                     96: ;           |   parameters      |
                     97: ;           |                   |
                     98: ;           ---------------------   <--- EBP + 8
                     99: ;           |                   |
                    100: ;           |   ret addr        |
                    101: ;           |                   |
                    102: ;           ---------------------
                    103: ;           |                   |
                    104: ;           |   old EBP         |
                    105: ;           |                   |
                    106: ;           ---------------------   <--- EBP
                    107: ;           |                   |
                    108: ;           |   locals          |
                    109: ;           |                   |
                    110: ;           ---------------------
                    111: ;           |                   |
                    112: ;           |   saved regs      |
                    113: ;           |                   |
                    114: ;           ---------------------
                    115: ;
                    116: ; Once defined, frame variables can be accessed simply by parm.strucname or
                    117: ; loc.strucname.
                    118: ;---------------------------------------------------------------------------
                    119: 
                    120: 
                    121: useframe macro name
                    122:   ifdef parm_&name
                    123:     parm equ <([ebp + 8])>
                    124:   else
                    125:     parm equ <>
                    126:   endif
                    127:   ifdef loc_&name
                    128:     useframe1 %(((size loc_&name) + 3) and (not 3))
                    129:   else
                    130:     loc equ <>
                    131:   endif
                    132: endm
                    133: 
                    134: useframe1 macro size
                    135:   loc equ <([ebp - size])>
                    136: endm
                    137: 
                    138: 
                    139: 
                    140: ;-----------------------------------macro-----------------------------------
                    141: ;
                    142: ; enterframe - builds the given frame
                    143: ;
                    144: ; usage:    enterframe name,<save list>
                    145: ;
                    146: ;           name:       name of the frame to generate
                    147: ;           save list:  a list of 32 bit registers to be saved upon entry and
                    148: ;                       restored upon exit (when leaveframe is encountered)
                    149: ;
                    150: ;
                    151: ; enterframe builds the given frame upon the stack at the point it is
                    152: ; encountered.  What is generated is the following:
                    153: ;
                    154: ;       enter   sizeof(loc_&name);
                    155: ;       push    <save list>
                    156: ;
                    157: ; Once created, frame variables can be accessed simply by parm.strucname or
                    158: ; loc.strucname.
                    159: ;---------------------------------------------------------------------------
                    160: 
                    161: 
                    162: enterframe macro name,savelist
                    163:   useframe name
                    164:   ?cjFrame = 0
                    165:   ifdef ?PASCALConventions
                    166:     ifdef parm_&name
                    167:           ?cjFrame = size parm_&name
                    168:     endif
                    169:   endif
                    170:   ifdef loc_&name
                    171:         enter  (((size loc_&name) + 3) and (not 3)),0
                    172:   else
                    173:         enter   0,0
                    174:   endif
                    175:   ?regpoplist equ <>
                    176:   ifnb <&savelist>
                    177:     irp reg,<&savelist>
                    178:       ifnb <&&reg>
                    179:         push    &&reg
                    180:         ?regpoplist catstr <&&reg>,<,>,?regpoplist
                    181:       endif
                    182:     endm
                    183:   endif
                    184: endm
                    185: 
                    186: 
                    187: 
                    188: ;-----------------------------------macro-----------------------------------
                    189: ;
                    190: ; leaveframe - removes the frame created by enterframe.
                    191: ;
                    192: ; usage:    leaveframe
                    193: ;
                    194: ;
                    195: ; leaveframe restores saved registers, removes locals from the frame, and
                    196: ; restores BP, and returns to the caller, optionally popping parameters
                    197: ; from the stack.
                    198: ;
                    199: ; No invalidation of the loc and parm equates is performed.
                    200: ;---------------------------------------------------------------------------
                    201: 
                    202: 
                    203: leaveframe macro
                    204: % irp reg,<?regpoplist>
                    205:     ifnb <&reg>
                    206:         pop     reg
                    207:     endif
                    208:   endm
                    209:         leave
                    210:         ret     ?cjFrame
                    211: endm
                    212: 
                    213: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.