|
|
1.1 ! root 1: ! 2: ;****************************Public Macro************************************ ! 3: ; ! 4: ; ComposeInst Inst,p1,p2,p3,p4,p5,p6,p7,p8,p9 ! 5: ; ! 6: ; This macro simply concatenates all arguments into one string. ! 7: ; ! 8: ; History: ! 9: ; Thu 15-Aug-1991 16:21:14 -by- Viroon Touranachun [viroont] ! 10: ; Created ! 11: ; ! 12: ;**************************************************************************** ! 13: ! 14: ComposeInst macro Inst,p1,p2,p3,p4,p5,p6,p7,p8,p9 ! 15: &Inst &p1&p2&p3&p4&p5&p6&p7&p8&p9 ! 16: endm ! 17: ! 18: ;****************************Public Macro************************************ ! 19: ; ! 20: ; CountArg cCount,ArgList ! 21: ; ! 22: ; This macro count the number of arguments in the ArgList and returns ! 23: ; the value in cCount. ! 24: ; ! 25: ; History: ! 26: ; Thu 15-Aug-1991 16:21:14 -by- Viroon Touranachun [viroont] ! 27: ; Created ! 28: ; ! 29: ;**************************************************************************** ! 30: ! 31: CountArg macro cCount,ArgList ! 32: ! 33: cCount = 0 ! 34: ! 35: irp arg,<ArgList> ! 36: cCount = cCount+1 ! 37: endm ! 38: endm ! 39: ! 40: ;****************************Public Macro************************************ ! 41: ; ! 42: ; RevPush ArgList,cCount ! 43: ; ! 44: ; This macro pushes the arguments in ArgList in the reverse order ! 45: ; and returns the number of arguments in cCount. ! 46: ; ! 47: ; History: ! 48: ; Thu 15-Aug-1991 16:21:14 -by- Viroon Touranachun [viroont] ! 49: ; Created ! 50: ; ! 51: ;**************************************************************************** ! 52: ! 53: RevPush macro ArgList,cCount ! 54: Local index,x ! 55: ! 56: CountArg cCount,<ArgList> ! 57: ! 58: index = cCount ! 59: rept cCount ! 60: x = 0 ! 61: irp arg,<ArgList> ! 62: x = x+1 ! 63: ife index-x ! 64: push arg ! 65: exitm ! 66: endif ! 67: endm ! 68: index = index-1 ! 69: endm ! 70: endm ! 71: ! 72: ;****************************Public Macro************************************ ! 73: ; ! 74: ; The following sections contain calling-convention related macros for: ! 75: ; ! 76: ; PUBLICP Func,N ! 77: ; to define a public label ! 78: ; ! 79: ; EXTRNP Func,N,Thunk ! 80: ; to define a external near label ! 81: ; ! 82: ; LABELP Func,N ! 83: ; to label an address as a routine entry point ! 84: ; ! 85: ; stdPROC Func,N,ArgList ! 86: ; to declare a routine header ! 87: ; ! 88: ; ProcName Name,Func,N ! 89: ; to rename a function Func to Name. Using it in conjunction with ! 90: ; normal function declaration (with the new name) will solve an error ! 91: ; caused by a long parameter list routine that exhausts page width. ! 92: ; ! 93: ; stdRET Func ! 94: ; to return from Func routines (declared with stdPROC or ProcName.) ! 95: ; ! 96: ; stdENDP Func ! 97: ; to declare the end of routine (declared with stdPROC or ProcName.) ! 98: ; ! 99: ; endMod Func ! 100: ; to declare the end of module with an entry point at Func (declared ! 101: ; with stdPROC or ProcName.) ! 102: ; ! 103: ; stdCall Func,ArgList ! 104: ; to call to a routine--Func--with the arguments pushed on the stack ! 105: ; ! 106: ; MovAddr dest,Func,n ! 107: ; to move the address of the routine--Func--into dest. ! 108: ; ! 109: ; Note that for the standard calling convention all the function names, ! 110: ; Func, are automatically converted to Func@N where N is the number of ! 111: ; bytes (decimal) in the argument list. ! 112: ; ! 113: ; History: ! 114: ; Thu 15-Aug-1991 16:21:14 -by- Viroon Touranachun [viroont] ! 115: ; Created ! 116: ; ! 117: ; John Vert (jvert) 3-Aug-1992 ! 118: ; Stolen from GDI and modified for use in the kernel ! 119: ; ! 120: ;**************************************************************************** ! 121: ! 122: IFNDEF STD_CALL ! 123: ! 124: ;**************************************************************************** ! 125: ; ! 126: ; This section is used exclusively for C calling convention. ! 127: ; ! 128: ;**************************************************************************** ! 129: ! 130: PUBLICP macro Func,N ! 131: ! 132: public &Func ! 133: endm ! 134: ! 135: EXTRNP macro Func,N,Thunk ! 136: ! 137: extrn &Func:NEAR ! 138: endm ! 139: ! 140: LABELP macro Func,N ! 141: ! 142: &Func LABEL NEAR ! 143: endm ! 144: ! 145: ProcName macro Name,Func,N ! 146: ! 147: &Name EQU <&Func> ! 148: endm ! 149: ! 150: stdPROC macro Func,N,ArgList ! 151: ! 152: &Func proc &ArgList ! 153: endm ! 154: ! 155: cPublicProc macro Func,N,ArgList ! 156: align dword ! 157: PUBLICP Func,N ! 158: stdPROC Func,N,&ArgList ! 159: endm ! 160: ! 161: cPublicFpo macro FpoLocals, FpoParams ! 162: ! 163: endm ! 164: ! 165: stdRET macro Func ! 166: ! 167: ret ! 168: endm ! 169: ! 170: stdENDP macro Func ! 171: ! 172: &Func endp ! 173: endm ! 174: ! 175: endMod macro Func ! 176: ! 177: end xxx&Func ! 178: ! 179: endm ! 180: ! 181: stdCall macro Func,ArgList ! 182: Local Bytes ! 183: ! 184: RevPush <ArgList>,Bytes ! 185: Bytes = Bytes*4 ! 186: ! 187: call &Func ! 188: ! 189: if Bytes GT 0 ! 190: add esp,Bytes ! 191: endif ! 192: ! 193: endm ! 194: ! 195: MovAddr macro dest,addr,n ! 196: ! 197: mov dest,offset FLAT:&addr ! 198: endm ! 199: ! 200: ELSE ! 201: ! 202: ;**************************************************************************** ! 203: ; ! 204: ; This section is used exclusively for the standard calling convention. ! 205: ; ! 206: ;**************************************************************************** ! 207: ! 208: PUBLICP macro Func,N ! 209: ! 210: ifb <N> ! 211: public &Func&@0 ! 212: else ! 213: PUBLICP2 Func,%(N*4) ! 214: endif ! 215: endm ! 216: ! 217: PUBLICP2 macro Func,N ! 218: ! 219: public &Func&@&N ! 220: endm ! 221: ! 222: EXTRNP macro Func,N,Thunk ! 223: ifb <N> ! 224: IFNDEF &Func&@0 ! 225: extrn &Func&@0:NEAR ! 226: ENDIF ! 227: else ! 228: ifb <Thunk> ! 229: EXTRNP2 Func,%(N*4) ! 230: else ! 231: EXTRNTHUNK Func,%(N*4) ! 232: endif ! 233: endif ! 234: endm ! 235: ! 236: EXTRNP2 macro Func,N ! 237: IFNDEF &Func&@&N ! 238: extrn &Func&@&N:NEAR ! 239: ENDIF ! 240: endm ! 241: ! 242: EXTRNTHUNK macro Func,N ! 243: IFNDEF __imp_&Func&@&N ! 244: extrn __imp_&Func&@&N:DWORD ! 245: ENDIF ! 246: endm ! 247: ! 248: LABELP macro Func,N ! 249: ! 250: ifb <N> ! 251: &Func&@0 LABEL NEAR ! 252: else ! 253: &Func&@&N LABEL NEAR ! 254: endif ! 255: endm ! 256: ! 257: ProcName macro Name,Func,N ! 258: ! 259: ifb <N> ! 260: cByte&Func EQU 0 ! 261: &Name EQU <&Func&@0> ! 262: else ! 263: cByte&Func EQU N ! 264: &Name EQU <&Func&@&N> ! 265: endif ! 266: endm ! 267: ! 268: stdPROC macro Func,N,ArgList ! 269: ! 270: ProcName &Func,Func,%(N*4) ! 271: ! 272: &Func proc &ArgList ! 273: endm ! 274: ! 275: cPublicProc macro Func,N,ArgList ! 276: align dword ! 277: PUBLICP Func,N ! 278: ifb <N> ! 279: stdPROC Func,0,<&ArgList> ! 280: else ! 281: stdPROC Func,N,<&ArgList> ! 282: endif ! 283: endm ! 284: ! 285: stdRET macro Func ! 286: ! 287: ret cByte&Func ! 288: ! 289: endm ! 290: ! 291: cPublicFpo macro FpoLocals, FpoParams ! 292: ! 293: .FPO ( FpoParams, FpoLocals, 0, 0, 0, 0 ) ! 294: ! 295: endm ! 296: ! 297: ! 298: stdENDP macro Func ! 299: ! 300: &Func endp ! 301: ! 302: endm ! 303: ! 304: endMod macro Func ! 305: ! 306: end &Func ! 307: ! 308: endm ! 309: ! 310: stdCallCall macro Func,N ! 311: IFDEF __imp_&Func&@&N ! 312: call dword ptr [ __imp_&Func&@&N ] ! 313: ELSE ! 314: call &Func&@&N ! 315: ENDIF ! 316: endm stdCallThunk ! 317: ! 318: ! 319: stdCall macro Func,ArgList ! 320: Local Bytes ! 321: ! 322: RevPush <ArgList>,Bytes ! 323: Bytes = Bytes*4 ! 324: ! 325: stdCallCall Func,%(Bytes) ! 326: endm ! 327: ! 328: ! 329: MovAddr macro dest,addr,n ! 330: ! 331: ComposeInst <mov >,dest,<,offset FLAT:>,addr,<@>,n ! 332: endm ! 333: ! 334: ENDIF ;STD_CALL
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.