home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-06-20 | 20.6 KB | 1,484 lines |
- ?386regs=1
- PMODE=1
- ?WIN=0
- ?SMALL=1
-
- ifndef ?auto32
- ?auto32 = 1
- endif
-
- comment $
- cmacros - assembly macros for interfacing to hlls
- (C) Copyright 1984-1994 Microsoft Corp. All rights reserved.
- $
- .xcref
- .xcref ??_out
- ??_out macro t
- ifndef ?QUIET
- %out t
- endif
- endm
- outif macro name,defval,onmsg,offmsg
- ifndef name
- ifb <defval>
- name=0
- else
- name=defval
- endif
- endif
- if name
- name=1
- ifnb <onmsg>
- ??_out <! onmsg>
- endif
- else
- ifnb <offmsg>
- ??_out <! offmsg>
- endif
- endif
- endm
- .xcref ??error
- ??error macro msg
- e r r o r ----- msg
- .err
- endm
- .xcref ASMpass
- .xcref memS,memM,memL,memC,memH,memMOD,sizec,sized
- if1
- ASMpass=1
- ifdef ?SMALL
- memS=1
- endif
- ifdef ?MEDIUM
- memM=1
- endif
- ifdef ?COMPACT
- memC=1
- endif
- ifdef ?LARGE
- memL=1
- endif
- ifdef ?HUGE
- memH=1
- endif
- ??_out <cMacros WinG 32-bit Version - Copyright (C) 1994 Microsoft Corp.>
- outif memS,0,<Small model>
- outif memM,0,<Medium model>
- outif memL,0,<Large model>
- outif memC,0,<Compact model>
- outif memH,0,<Huge model>
- outif ?auto32,0,<Discardable 32bit code segment hack enabled>
- memMOD= memS + memM + memL + memC + memH
- if memMOD ne 1
- if memMOD eq 0
- memS = 1
- else
- ??error <more than 1 memory model selected>
- endif
- endif
- sizec= memM + memL + memH
- sized= memL + memC + (memH*2)
- outif ?DF,0,<No segments or groups will be defined>
- outif ?TF,0,<Epilog sequences assume valid SP>
- outif ?WIN,1,<Windows support>
- ifdef PMODE
- ?pmd=1
- ??_out <! 386 protect mode use32>
- else
- ?pmd=0
- endif
- ifdef ?386regs
- if ?386regs
- ??_out <! 386 registers enabled>
- endif
- else
- ?386regs=0
- endif
- if ?WIN eq 1
- outif ?PLM,1,<>
- else
- outif ?PLM,1,<Pascal calling convention>
- endif
- ifndef ?NODATA
- ?nodata1=0
- else
- ?nodata1=1
- ??_out <! NODATA module>
- endif
- ifndef ?CHKSTK
- ?chkstk1=0
- else
- ?chkstk1=1
- ifdef ?CHKSTKPROC
- ??_out <! Private stack checking enabled>
- else
- ??_out <! Stack checking enabled>
- endif
- endif
- ifndef DOS5
- ?DOS5=0
- else
- ?DOS5=1
- ??_out <! DOS5 module>
- endif
- ifdef ?PROFILE
- ??_out <! Native profiling enabled>
- endif
- else
- ASMpass=2
- endif
- ifdef ?pmd
- ;.286p
- .386p
- endif
- if ?386regs
- .xcref ?n,?ax,?eax,?bx,?ebx
- .xcref ?cx,?ecx,?dx,?edx
- .xcref ?si,?esi,?di,?edi,?es,?ds,?fs
- .xcref ?gs
- else
- .xcref ?n,?ax,?ah,?al,?bx,?bh
- .xcref ?bl,?cx,?ch,?cl,?dx,?dh
- .xcref ?dl,?si,?di,?es,?ds,?bp
- .xcref ?sp,?ss,?cs
- endif
- .xcref ?rsl,?cpd,?argl,?argc,?ba
- .xcref ?acb,???,?po
- .xcref ?pas,?pc
- .xcref uconcat,mpush,mpop
- .xcref ?ri,?pp,?pp1,?al1
- .xcref ?ad,?ap,?atal,?dd,?dd1,?dd2
- .xcref ?pg,?pg1,?aloc,?cs1,?cs2
- .xcref ?DF,?TF,?ff,?PLM,?WIN,?ia,?pu,?adj
- .xcref ?uf,?rp,?nx,?nd,?nodata1,?chkstk1,?DOS5,?pmd,?lds,?exp
- .xcref ?wfp,arg,cCall,cProc,assumes,?cs3,?cs2,?cs1
- .xcref defgrp,addseg,createSeg
- .xcref save,outif,errnz,errn$,errnz1
- .xcref ?PLMPrevParm,?gcc
- .xcref ?cCall1,?pcc
- ?rsl = 0
- ?cpd = 0
- ?argl = 0
- ?argc = 0
- ?ba = 0
- ?acb = 0
- ??? = 0
- ?po = 0
- ?pas = 0
- ?pc = 0
- ?ia = 0
- ?pu = 0
- ?adj = 0
- ?rp = 0
- ?uf = 0
- ?nd = 0
- ?nx = 0
- ?wfp = 0
- ?lds = 0
- ?exp = 0
- ?ff = 0
- ?dd2 = 0
- ?cCall1 = 0
- ?pcc = 0
- ?PLMPrevParm = 0
- .xcref ?casen
- if1
- ?casen = 0
- endif
- if ?386regs
- ?n = 0000000000000000b
- ?ax = 0000000000000001b
- ?eax = 0000000000000010b
- ?bx = 0000000000000100b
- ?ebx = 0000000000001000b
- ?cx = 0000000000010000b
- ?ecx = 0000000000100000b
- ?dx = 0000000001000000b
- ?edx = 0000000010000000b
- ?si = 0000000100000000b
- ?esi = 0000001000000000b
- ?di = 0000010000000000b
- ?edi = 0000100000000000b
- ?ds = 0001000000000000b
- ?es = 0010000000000000b
- ?fs = 0100000000000000b
- ?gs = 1000000000000000b
- else
- ?n = 0000000000000000b
- ?ax = 0000000000000011b
- ?ah = 0000000000000001b
- ?al = 0000000000000010b
- ?bx = 0000000000001100b
- ?bh = 0000000000000100b
- ?bl = 0000000000001000b
- ?cx = 0000000000110000b
- ?ch = 0000000000010000b
- ?cl = 0000000000100000b
- ?dx = 0000000011000000b
- ?dh = 0000000001000000b
- ?dl = 0000000010000000b
- ?si = 0000000100000000b
- ?di = 0000001000000000b
- ?es = 0000010000000000b
- ?ds = 0000100000000000b
- ?bp = 0001000000000000b
- ?sp = 0010000000000000b
- ?ss = 0100000000000000b
- ?cs = 1000000000000000b
- endif
- .cref
- uconcat macro a,b,c,d,e,f,g
- a&b c&d e&f&g
- endm
- if ?386regs
- mpush macro r
- irp x,<ax,eax,bx,ebx,cx,ecx,dx,edx,si,esi,di,edi,ds,es,fs,gs>
- if (r and ?&&x)
- push x
- endif
- endm
- endm
- else
- mpush macro r
- irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
- if (r and ?&&x)
- push x
- endif
- endm
- endm
- endif
- if ?386regs
- mpop macro r
- irp x,<gs,fs,es,ds,edi,di,esi,si,edx,dx,ecx,cx,ebx,bx,eax,ax>
- if (r and ?&&x)
- pop x
- endif
- endm
- endm
- else
- mpop macro r
- irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
- if (r and ?&&x)
- pop x
- endif
- endm
- endm
- endif
- save macro r
- ?rsl=0
- ?ri ?rsl,<r>
- endm
- ?ri macro n,r
- irp x,<r>
- .ERRNDEF ?&&x
- n=n or ?&&x
- endm
- endm
- .xcref
- .xcref parmB,parmW,parmD,parmQ,parmT,parmCP,parmDP
- .cref
- parmB macro n
- ?pp <n>,<byte>,2,1
- endm
- parmW macro n
- ?pp <n>,<word>,2,2
- endm
- parmD macro n
- ife ?PLM
- irp x,<n>
- ?pp <&&x>,<dword>,0,4
- ?pp <off_&&x>,<word>,2,2
- ?pp <seg_&&x>,<word>,2,2
- endm
- else
- irp x,<n>
- ?pp <seg_&&x>,<word>,2,2
- ?pp <off_&&x>,<word>,2,2
- ?pp <&&x>,<dword>,0,4
- endm
- endif
- endm
- parmQ macro n
- ?pp <n>,<qword>,8,8
- endm
- parmT macro n
- ?pp <n>,<tbyte>,10,10
- endm
- if sizec
- parmCP macro n
- parmD <n>
- endm
- else
- parmCP macro n
- parmW <n>
- endm
- endif
- if sized
- parmDP macro n
- parmD <n>
- endm
- else
- parmDP macro n
- parmW <n>
- endm
- endif
- ?pp macro n,t,l,s
- if ?cpd
- .xcref
- irp x,<n>
- .xcref ?t&&x
- ?t&&x=s
- ife ?PLM
- ?pp1 x,<t>,,,%(?po+?adj)
- ?po=?po+l
- else
- ?PLMPrevParm=?PLMPrevParm+1
- ?po=?po+l
- ?pp1 x,<t>,%?po,%?adj,,%?PLMPrevParm,%(?PLMPrevParm-1)
- endif
- endm
- .cref
- else
- ??error <parm(s) "&n" declared outside proc def>
- endif
- endm
- ?pp1 macro n,t,o,a,b,cpc,ppc
- ife ?PLM
- n equ (t ptr [ebp+b])
- else
- .xcref
- .xcref ?PLMParm&cpc
- .cref
- ?PLMParm&cpc ¯o po
- uconcat <n>,,<equ>,,<(t ptr [ebp+>,%(a+po-o),<])>
- ?PLMParm&ppc po
- purge ?PLMParm&cpc
- &endm
- endif
- endm
- ifndef ?NOPARMR
- if ?pmd
- parmR macro n,r,r2
- ??error <Sorry: ParmR can't be used with PMODE=1>
- endm
- else
- .xcref
- .xcref ?pr,parmR
- .cref
- parmR macro n,r,r2
- ?pr n,r,r2,%?rp,%(?ia+2)
- endm
- ?pr macro n,r,r2,i,o
- .xcref
- ifnb <r2>
- parmR seg_&n,r
- parmR off_&n,r2
- n equ (dword ptr [ebp-o-2])
- .xcref ?t&n
- ?t&n=4
- else
- .xcref ?rp&i
- ?rp&i=0
- ifdef ?&r
- ?rp&i=?&r
- endif
- if ??? or (?cpd eq 0) or (?rp&i eq 0)
- ??error <invalid parmR encountered: &n,&r>
- exitm
- endif
- n equ (word ptr [ebp-o])
- ?t&n=2
- irp x,<bh,ch,dh,bl,cl,dl,ah,al>
- if ?&&x eq ?&r
- n equ (byte ptr [ebp-o])
- ?t&n=1
- exitm
- endif
- endm
- ?ia=?ia+2
- ?rp=?rp+1
- endif
- .cref
- endm
- endif
- endif
- .xcref
- .xcref localB,localW,localD,localQ,localT,localCP,localDP,localV
- .cref
- localB macro n
- ?aloc <n>,<byte ptr>,1,1,0
- endm
- localW macro n
- ?aloc <n>,<word ptr>,2,2,1
- endm
- localD macro n
- irp x,<n>
- ?aloc <seg_&&x>,<word ptr>,2,2,1
- ?aloc <off_&&x>,<word ptr>,2,2,1
- ?aloc <&&x>,<dword ptr>,0,4,1
- endm
- endm
- localQ macro n
- ?aloc <n>,<qword ptr>,8,8,1
- endm
- localT macro n
- ?aloc <n>,<tbyte ptr>,10,10,1
- endm
- if sizec
- localCP macro n
- localD <n>
- endm
- else
- localCP macro n
- localW <n>
- endm
- endif
- if sized
- localDP macro n
- localD <n>
- endm
- else
- localDP macro n
- localW <n>
- endm
- endif
- localV macro n,a
- ?aloc <n>,,%(a),0,1
- endm
- ?aloc macro n,t,l,s,a
- if ?cpd
- .xcref
- irp x,<n>
- ???=???+l
- if a
- ???=((??? + 1) and 0fffeh)
- endif
- ?al1 x,<t>,%(???+?ia)
- .xcref ?t&&x
- ?t&&x=s
- endm
- .cref
- else
- ??error <locals "&n" declared outside procedure def>
- endif
- endm
- ?al1 macro n,t,o
- n equ (t [ebp-o])
- endm
- ?gcc macro s,i,cc
- s = i
- ifnb <cc>
- ifidn <cc>,<C>
- s=0
- endif
- ifidn <cc>,<PLM>
- s=1
- endif
- ifidn <cc>,<PASCAL>
- s=1
- endif
- endif
- endm
- ifndef ?NOGLOBAL
- .xcref
- .xcref globalB,globalW,globalD,globalQ,globalT,globalCP,globalDP
- .cref
- globalB macro n,i,s,c
- ?ad <n>,1
- ?dd n,1,<byte>,<db>,<i>,<s>,<c>
- endm
- globalW macro n,i,s,c
- ?ad <n>,2
- ?dd n,1,<word>,<dw>,<i>,<s>,<c>
- endm
- globalD macro n,i,s,c
- ?ad <n>,4
- ?dd n,1,<dword>,<dd>,<i>,<s>,<c>
- off_&n equ n
- seg_&n equ n[2]
- endm
- globalQ macro n,i,s,c
- ?ad <n>,8
- ?dd n,1,<qword>,<dq>,<i>,<s>,<c>
- endm
- globalT macro n,i,s,c
- ?ad <n>,10
- ?dd n,1,<tbyte>,<dt>,<i>,<s>,<c>
- endm
- if sizec
- globalCP macro n,i,s,c
- globalD n,<i>,<s>,<c>
- endm
- else
- globalCP macro n,i,s,c
- globalW n,<i>,<s>,<c>
- endm
- endif
- if sized
- globalDP macro n,i,s,c
- globalD n,<i>,<s>,<c>
- endm
- else
- globalDP macro n,i,s,c
- globalW n,<i>,<s>,<c>
- endm
- endif
- endif
- ifndef ?NOSTATIC
- .xcref
- .xcref staticB,staticW,staticD,staticQ,staticT,staticCP,staticDP
- .cref
- staticB macro n,i,s
- ?ad <n>,1
- ?dd n,0,<byte>,<db>,<i>,<s>,<PLM>
- endm
- staticW macro n,i,s
- ?ad <n>,2
- ?dd n,0,<word>,<dw>,<i>,<s>,<PLM>
- endm
- staticD macro n,i,s
- ?ad <n>,4
- ?dd n,0,<dword>,<dd>,<i>,<s>,<PLM>
- endm
- staticQ macro n,i,s
- ?ad <n>,8
- ?dd n,0,<qword>,<dq>,<i>,<s>,<PLM>
- endm
- staticT macro n,i,s
- ?ad <n>,10
- ?dd n,0,<tbyte>,<dt>,<i>,<s>,<PLM>
- endm
- if sizec
- staticCP macro n,i,s
- staticD n,<i>,<s>
- endm
- else
- staticCP macro n,i,s
- staticW n,<i>,<s>
- endm
- endif
- if sized
- staticDP macro n,i,s
- staticD n,<i>,<s>
- endm
- else
- staticDP macro n,i,s
- staticW n,<i>,<s>
- endm
- endif
- endif
- ?dd macro n,p,t,d,i,s,c
- ?gcc ?dd2,%?PLM,<c>
- ife ?dd2
- n label t
- ?dd1 _&n,p,<d>,<i>,<s>
- else
- ?dd1 n,p,<d>,<i>,<s>
- endif
- endm
- ?dd1 macro n,p,d,i,s
- if p
- public n
- endif
- ifb <s>
- n d i
- else
- ifb <i>
- n d s dup (?)
- else
- n d s dup (i)
- endif
- endif
- endm
- ifndef ?NOEXTERN
- .xcref
- .xcref ?ex1,?ex2,externB,externW,externD,externQ,externT
- .xcref externNP,externFP,externP,externCP,externDP,externA
- .cref
- ?ex2 = 0
- externA macro n,c
- ?ex1 <n>,40h,<abs>,<c>,<>
- endm
- externB macro n,c
- ?ex1 <n>,1,<byte>,<c>,<>
- endm
- externW macro n,c
- ?ex1 <n>,2,<word>,<c>,<>
- endm
- externD macro n,c
- ?ex1 <n>,4,<dword>,<c>,<>
- endm
- externQ macro n,c
- ?ex1 <n>,8,<qword>,<c>,<>
- endm
- externT macro n,c
- ?ex1 <n>,10,<tbyte>,<c>,<>
- endm
- externNP macro n,c
- ?ex1 <n>,2,<near>,<c>,<cc>
- endm
- externFP macro n,c
- ?ex1 <n>,4,<far>,<c>,<cc>
- endm
- if sizec
- externP macro n,c
- ?ex1 <n>,4,<far>,<c>,<cc>
- endm
- else
- externP macro n,c
- ?ex1 <n>,2,<near>,<c>,<cc>
- endm
- endif
- if sizec
- externCP macro n,c
- ?ex1 <n>,4,<dword>,<c>,<>
- endm
- else
- externCP macro n,c
- ?ex1 <n>,2,<word>,<c>,<>
- endm
- endif
- if sized
- externDP macro n,c
- ?ex1 <n>,4,<dword>,<c>,<>
- endm
- else
- externDP macro n,c
- ?ex1 <n>,2,<word>,<c>,<>
- endm
- endif
- ?ex1 macro n,s,d,c,scv
- ?gcc ?ex2,%?PLM,<c>
- irp x,<n>
- .xcref
- .xcref ?t&&x
- .cref
- ?t&&x=s
- ife ?ex2
- extrn _&&x:&d
- x equ _&&x
- else
- extrn x:&d
- endif
- ifidn <scv>,<cc>
- .xcref
- .xcref ?CC&&x
- .cref
- ?CC&&x=?ex2
- endif
- endm
- endm
- endif
- ifndef ?NOLABEL
- .xcref
- .xcref ?lb1,?lblpu,?lb2
- .xcref labelB,labelW,labelD,labelQ,labelT
- .xcref labelNP,labelFP,labelP,labelCP,labelDP
- .cref
- ?lblpu = 0
- ?lb2 = 0
- labelB macro n,c
- ?lb1 <n>,1,<byte>,<c>
- endm
- labelW macro n,c
- ?lb1 <n>,2,<word>,<c>
- endm
- labelD macro n,c
- ?lb1 <n>,4,<dword>,<c>
- endm
- labelQ macro n,c
- ?lb1 <n>,8,<qword>,<c>
- endm
- labelT macro n,c
- ?lb1 <n>,10,<tbyte>,<c>
- endm
- labelNP macro n,c
- ?lb1 <n>,2,<near>,<c>
- endm
- labelFP macro n,c
- ?lb1 <n>,4,<far>,<c>
- endm
- if sizec
- labelP macro n,c
- ?lb1 <n>,4,<far>,<c>
- endm
- else
- labelP macro n,c
- ?lb1 <n>,2,<near>,<c>
- endm
- endif
- if sizec
- labelCP macro n,c
- ?lb1 <n>,4,<dword>,<c>
- endm
- else
- labelCP macro n,c
- ?lb1 <n>,2,<word>,<c>
- endm
- endif
- if sized
- labelDP macro n,c
- ?lb1 <n>,4,<dword>,<c>
- endm
- else
- labelDP macro n,c
- ?lb1 <n>,2,<word>,<c>
- endm
- endif
- ?lb1 macro n,s,d,c
- ?gcc ?lb2,%?PLM,<c>
- ?lblpu=0
- irp x,<n>
- ifidn <x>,<PUBLIC>
- ?lblpu=1
- else
- .xcref
- .xcref ?t&&x
- .cref
- ?t&&x=s
- ife ?lb2
- if ?lblpu
- public _&&x
- endif
- _&&x label &d
- x equ _&&x
- else
- if ?lblpu
- public x
- endif
- x label &d
- endif
- endif
- endm
- endm
- endif
- ifndef ?NODEF
- .xcref
- .xcref defB,defW,defD,defQ,defT,defCP,defDP
- .cref
- defB macro n
- ?ad <n>,1
- endm
- defW macro n
- ?ad <n>,2
- endm
- defD macro n
- ?ad <n>,4
- endm
- defQ macro n
- ?ad <n>,8
- endm
- defT macro n
- ?ad <n>,10
- endm
- if sizec
- defCP macro n
- defD <n>
- endm
- else
- defCP macro n
- defW <n>
- endm
- endif
- if sized
- defDP macro n
- defD <n>
- endm
- else
- defDP macro n
- defW <n>
- endm
- endif
- endif
- ?ad macro n,s
- irp x,<n>
- .xcref
- .xcref ?t&&x
- .cref
- ?t&&x=s
- endm
- endm
- ifndef ?NOPTR
- .xcref
- .xcref regPtr,farPtr
- .cref
- regPtr macro n,s,o
- farPtr n,s,o
- endm
- farPtr macro n,s,o
- .xcref
- .xcref ?t&n
- .cref
- n ¯o
- push s
- push o
- &endm
- ?t&n=80h
- endm
- endif
- arg macro a
- irp x,<a>
- ?argc=?argc+1
- ?atal <x>,%?argc
- endm
- endm
- ?atal macro n,i
- .xcref
- .xcref ?ali&i
- .cref
- ?ali&i ¯o
- ?ap n
- &endm
- endm
- ?ap macro n
- ?argl=?argl+2
- ifdef ?t&n
- ife ?t&n-1
- push word ptr (n)
- exitm
- endif
- ife ?t&n-2
- push n
- exitm
- endif
- ife ?t&n-4
- push word ptr (n)[2]
- push word ptr (n)
- ?argl=?argl+2
- exitm
- endif
- ife ?t&n-8
- push word ptr (n)[6]
- push word ptr (n)[4]
- push word ptr (n)[2]
- push word ptr (n)
- ?argl=?argl+6
- exitm
- endif
- if ?t&n and 80h
- n
- ?argl=?argl+2
- exitm
- endif
- ife ?t&n
- push word ptr (n)
- exitm
- endif
- endif
- push n
- endm
- cCall macro n,a,c
- ifnb <a>
- arg <a>
- endif
- mpush %?rsl
- ifdef ?CC&n
- ?cCall1=?CC&n
- else
- ?cCall1=?PLM
- endif
- ifnb <c>
- ?gcc ?cCall1,%?cCall1,<c>
- endif
- ?argl=0
- ife ?cCall1
- ?acb=?argc
- else
- ?acb=1
- endif
- rept ?argc
- uconcat <?ali>,%?acb
- uconcat <purge>,,<?ali>,%?acb
- ife ?cCall1
- ?acb=?acb-1
- else
- ?acb=?acb+1
- endif
- endm
- call n
- if ((?cCall1 eq 0) and (?argl ne 0))
- add sp,?argl
- endif
- mpop %?rsl
- ?rsl=0
- ?argc= 0
- ?argl= 0
- endm
- cProc macro n,cf,a
- if ?cpd
- ?utpe
- endif
- ?cpd=1
- ???=0
- ?argc=0
- ?ba=0
- ?po=0
- ?pu=0
- ?ia=0
- ?adj=4
- ?rp=0
- ?uf=0
- ?wfp=?WIN
- ?ff=0
- ?pas=0
- ?pcc=?PLM
- ?lds=0
- ?exp=0
- ifnb <a>
- ?ri ?pas,<a>
- endif
- ?pc=sizec
- ?nd=?nodata1
- ?nx=0
- irp x,<cf>
- ifidn <x>,<FAR>
- ?pc=1
- endif
- ifidn <x>,<NEAR>
- ?pc=0
- endif
- ifidn <x>,<PUBLIC>
- ?pu=1
- endif
- ifidn <x>,<SMALL>
- ?uf=1
- endif
- ifidn <x>,<DATA>
- ?nd=0
- endif
- ifidn <x>,<NODATA>
- ?nd=1
- endif
- ifidn <x>,<ATOMIC>
- ?nx=1
- endif
- ifidn <x>,<C>
- ?pcc=0
- endif
- ifidn <x>,<PLM>
- ?pcc=1
- endif
- ifidn <x>,<PASCAL>
- ?pcc=1
- endif
- ifidn <x>,<WIN>
- ?wfp=1
- endif
- ifidn <x>,<NONWIN>
- ?wfp=0
- endif
- ifidn <x>,<LOADDS>
- ?lds=1
- endif
- ifidn <x>,<EXPORTED>
- ?exp=1
- endif
- endm
- if ?pcc
- ?PLMPrevParm=0
- .xcref
- .xcref ?PLMParm0
- .cref
- ?PLMParm0 ¯o
- purge ?PLMParm0
- &endm
- endif
- .xcref
- .xcref ?CC&n
- .cref
- ?CC&n=?pcc
- if (?nx eq 1) and (?nd eq 0)
- ?nx = 0
- ??error <ATOMIC specified without NODATA - ATOMIC ignored>
- endif
- if ?pc
- if ?wfp+?exp+?lds
- ife ?nx
- ife ?pmd
- ?ia=2
- endif
- ?pas = ?pas and (not ?ds)
- endif
- endif
- ?adj=?adj+2
- else
- ?wfp=0
- endif
- ife ?386regs
- ?pas = ?pas and (not (?sp+?cs+?ss))
- endif
- if ?uf
- if ?386regs
- ?pas = ?pas and (not (?si+?di))
- else
- ?pas = ?pas and (not (?bp+?si+?di))
- endif
- endif
- ife ?pcc
- ?pg <_&n>,%?pu,%?pc,%?pas,%?wfp,<n>,%?pcc
- else
- ?pg <n>,%?pu,%?pc,%?pas,%?wfp,<n>,%?pcc
- endif
- endm
- ?pg macro n,p,c,a,w,nnu,cc
- .xcref
- if ?uf
- if ?nd
- ??error <NODATA encountered in &n - user frame ignored>
- ?uf=0
- endif
- endif
- .xcref cBegin
- cBegin ¯o g
- .xcref
- if cc
- uconcat <?PLMParm>,%?PLMPrevParm,%?po
- endif
- if ?uf
- if ?rp
- ??error <parmR encountered in &n - user frame ignored>
- ?uf=0
- endif
- endif
- ?pg1 <n>,c,a,%?po,w,%?uf,%?nd,%?rp,cc
- ?cpd=0
- ?argc=0
- ?ba=1
- ???=(???+1) and 0fffeh
- if p
- public n
- endif
-
- ife c
- n proc near
- else
- if ?auto32
- &n&_fix_cs:
- db 057h ; push di
- db 083h,0ECh,008h ; sub sp,8
- db 08Ch,0CBh ; mov bx,cs
- db 08Ch,0D0h ; mov ax,ss
- db 08Eh,0C0h ; mov es,ax
- db 08Bh,0FCh ; mov di,sp
- db 0B8h,00Bh,000h ; mov ax,000Bh
- db 0CDh,031h ; int 31h
- db 026h,080h,04Dh,006h,040h ; or byte ptr es:[di+6],40h
- db 0B8h,00Ch,000h ; mov ax,000Ch
- db 0CDh,031h ; int 31h
- add sp,8 ; db 083h,0C4h,008h
- pop di ; db 05Fh
- align 4
- n proc far
- xor eax,eax
- mov ah,80h
- add eax,eax
- jc short &n&_fix_cs
- else
- n proc far
- endif
- endif
-
- ife cc
- nnu equ n
- endif
- ifidn <g>,<nogen>
- if ???+?po+a+?rp
- ??_out <cBegin - possible invalid use of nogen>
- endif
- else
- if ?uf
- ?mf c,%???,%?po
- mpush a
- else
- if w+?exp+?lds
- if ?pmd
- ife ?nd
- if ?lds
- mov ax,_DATA
- else
- if ?exp
- mov ax,ds
- nop
- endif
- endif
- endif
- ife ?nx
- if ???+?po
- if ?chkstk1
- push bp
- movzx ebp,sp
- else
- if ???
- push bp
- movzx ebp, sp
- sub sp, ???
-
- ;;;;;enter ???,0
- ;;;;;movzx bp,bp
-
- else
- push bp
- movzx ebp,sp
- endif
- endif
- endif
- push ds
- if ?lds+?exp
- mov ds,ax
- endif
- else
- if ?ff+???+?po+?rp
- push bp
- movzx ebp,sp
- endif
- endif
- else
- ife ?nd
- mov ax,ds
- nop
- endif
- ife ?nx
- ife ?DOS5
- inc bp
- endif
- push bp
- movzx ebp,sp
- push ds
- else
- if ?ff+???+?po+?rp
- push bp
- movzx ebp,sp
- endif
- endif
- ife ?nd
- mov ds,ax
- endif
- endif
- else
- if ?pmd
- if ?exp
- mov ax,ds
- nop
- else
- if ?lds
- mov ax,_DATA
- endif
- endif
- if ?ff+???+?po+?rp
- if ?chkstk1
- push bp
- movzx ebp,sp
- else
- if ???
-
- push bp
- movzx ebp, sp
- sub sp, ???
-
- ;;;;enter ???,0
- ;;;;movzx ebp,bp
- else
- push bp
- movzx ebp,sp
- endif
- endif
- endif
- if ?exp+?lds
- push ds
- mov ds,ax
- endif
- else
- if ?ff+???+?po+?rp
- push bp
- movzx ebp,sp
- endif
- endif
- endif
- if ?rp
- ?uf=0
- rept ?rp
- uconcat mpush,,?rp,%?uf
- ?uf=?uf+1
- endm
- endif
- if ???
- if ?chkstk1
- ifdef ?CHKSTKPROC
- ?CHKSTKPROC %???
- else
- mov ax,???
- ife cc
- call _chkstk
- else
- call chkstk
- endif
- endif
- else
- ife ?pmd
- sub sp,???
- endif
- endif
- endif
- mpush a
- endif
- ifdef ?PROFILE
- if c
- call StartNMeas
- endif
- endif
- endif
- .cref
- purge cBegin
- &endm
- .xcref ?utpe
- ?utpe ¯o
- ??error <unterminated procedure definition: "&n">
- &endm
- .cref
- endm
- ?pg1 macro n,c,a,o,w,f,d,r,cc
- .xcref
- .xcref cEnd
- cEnd ¯o g
- .xcref
- ?ba=0
- ifidn <g>,<nogen>
- if o+a+r
- ??_out <cEnd - possible invalid use of nogen>
- endif
- else
- ifdef ?PROFILE
- if c
- call StopNMeas
- endif
- endif
- mpop a
- if f
- db 0c3h
- else
- if w+?exp+?lds
- if ?pmd
- ife ?nx
- pop ds
- endif
- ife ?nx
- if ?chkstk1+???+?po
- ;;;;lea sp,-4[bp]
- if ???
- add sp, ???
- endif
- pop bp
- ;;;;leave
- endif
- else
- if ?ff+???+?po+?rp
-
- ;;;;lea sp,-4[bp]
- if ???
- add sp, ???
- endif
- pop bp
-
-
- ;;;;;;;;;;;;;;;;;;;leave
- endif
- endif
- else
- ife ?nx
- if (?TF eq 0) or (???+?rp)
- lea sp,-2[bp]
- endif
- pop ds
- pop bp
- ife ?DOS5
- dec bp
- endif
- else
- if (?TF eq 0) or (???+?rp)
- mov sp,bp
- endif
- if ???+?po+?rp
- pop bp
- endif
- endif
- endif
- else
- if ?pmd
- if ?ff+???+?po+?rp
- ;;;;lea sp,-4[bp]
- if ???
- add sp, ???
- endif
- pop bp
- ;;;;;;;;;;;;;;;;;;;;;;;;leave
- endif
- else
- if ?ff+???+?po+?rp
- if (?TF eq 0) or (???+?rp)
- mov sp,bp
- endif
- pop bp
- endif
- endif
- endif
- ife cc
- db 66h
- retf
- else
- db 66h
- retf o
- endif
- endif
- endif
- n endp
- .cref
- purge cEnd
- &endm
- .cref
- endm
- assumes macro s,ln
- ifndef ln&_assumes
- assume s:ln
- else
- ln&_assumes s
- endif
- endm
- createSeg macro n,ln,a,co,cl,grp
- ifnb <grp>
- addseg grp,n
- else
- ln&OFFSET equ offset n:
- ln&BASE equ n
- ?cs3 <ln>,<n>
- endif
- ifnb <cl>
- n segment a co '&cl'
- else
- n segment a co
- endif
- n ends
- ?cs1 <ln>,<n>
- endm
- addseg macro grp,seg
- .xcref
- .xcref grp&_def
- .cref
- ifndef grp&_def
- grp&_def=0
- endif
- if grp&_def ne ASMpass
- .xcref
- .xcref grp&_add
- .cref
- grp&_add ¯o s
- grp&_in <seg>,s
- &endm
- .xcref
- .xcref grp&_in
- .cref
- grp&_in ¯o sl,s
- ifb <s>
- grp group sl
- else
- grp&_add ¯o ns
- grp&_in <sl,s>,ns
- &endm
- endif
- &endm
- grp&_def=ASMpass
- else
- grp&_add seg
- endif
- endm
- defgrp macro grp,ln
- addseg grp
- ifnb <ln>
- irp x,<ln>
- ?cs3 <&x>,<grp>
- x&&OFFSET equ offset grp:
- x&&BASE equ grp
- endm
- endif
- endm
- ?cs1 macro ln,n
- .xcref
- .xcref ln&_sbegin
- .cref
- ln&_sbegin ¯o
- .xcref
- .xcref ?mf
- .cref
- ?mf &¯o c,l,p
- if c
- extrn n&_FARFRAME:near
- call n&_FARFRAME
- else
- extrn n&_NEARFRAME:near
- call n&_NEARFRAME
- endif
- db l shr 1
- db p shr 1
- &&endm
- ?cs2 <ln>,<n>
- n segment
- &endm
- endm
- ?cs2 macro ln,n
- .xcref
- .xcref sEnd
- .cref
- sEnd ¯o
- n ends
- purge ?mf
- purge sEnd
- &endm
- endm
- ?cs3 macro ln,n
- .xcref
- .xcref ln&_assumes
- .cref
- ln&_assumes ¯o s
- assume s:&n
- &endm
- endm
- .xcref
- .xcref sBegin
- .cref
- sBegin macro ln
- ln&_sbegin
- endm
- ife ?DF
- ;.286p
- ;createSeg _TEXT,Code,word,public,CODE
- ;.386p
- ;createSeg _TEXT32,Code32,word,use32,CODE
- ife ?nodata1
- .286p
- createSeg _DATA,Data,word,public,DATA,DGROUP
- .386p
- defgrp DGROUP,Data
- endif
- if ?chkstk1
- ifndef ?CHKSTKPROC
- externp <chkstk>
- endif
- endif
- endif
- errnz macro x
- if2
- if x
- errnz1 <x>,%(x)
- endif
- endif
- endm
- errnz1 macro x1,x2
- = *errnz* x1 = x2
- .err
- endm
- errn$ macro l,x
- errnz <offset $ - offset l x>
- endm
- ifdef ?PROFILE
- externFP <StartNMeas,StopNMeas>
- endif
-