home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cset21v5.zip
/
TOOLKT21
/
ASM
/
OS2INC
/
CMACROS.INC
< prev
next >
Wrap
Text File
|
1993-03-12
|
25KB
|
1,737 lines
; SCCSID = @(#)cmacros.inc 6.1 90/11/16
comment $
cmacros - assembly macros for interfacing to hhls
(C)Copyright Microsoft Corp. 1984-1990
$
.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
%out e r r o r ----- msg
.err e r r o r ----- msg
endm
.xcref ??error2
??error2 macro msg
if2
%out e r r o r ----- msg
.err e r r o r ----- msg
endif
endm
.xcref ?sps,?ps,?rps
?ps=0
?sps macro
?ps=@Cpu
endm
?rps macro
if ?ps and 80h
if ?ps and 08h
.386P
else
if ?ps and 04h
.286P
else
??error2 <Internal error -- illegal CpuMode>
endif
endif
else
if ?ps and 08h
.386
else
if ?ps and 04h
.286
else
if ?ps and 02h
.186
else
if ?ps and 01h
.8086
else
??error2 <Internal error -- illegal CpuMode>
endif
endif
endif
endif
endif
if ?ps and 800h
.387
else
if ?ps and 400h
.287
else
if ?ps and 100h
.8087
else
??error2 <Internal error -- illegal CpuMode>
endif
endif
endif
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 Version 3.08 - 01/15/90>
??_out <Copyright (C) Microsoft Corp. 1984-1990. All rights reserved.>
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>
memMOD= memS + memM + memL + memC + memH
if memMOD ne 1
if memMOD eq 0
memS = 1
outif memS,0,<Small model>
else
??error <must have only 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>
outif ?PLM,1,<PL/M calling convention>
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
ifdef ATTRPROF
??_out <! Attributed profiling enabled>
?aprof1=1
else
?aprof1=0
endif
ifndef ?NO_BP
?no_bp1=0
else
?no_bp1=1
??_out <! NO_BP is default>
endif
ifndef ?REG32
?bigreg=0
else
?bigreg=1
??_out <! 32-bit registers recognized.>
endif
ifndef ?ENTER
?enter1=0
else
?enter1=1
??_out <! ENTER/LEAVE module>
endif
ifdef ?USE32
?u32=1
.xcref ?u32
endif
ifdef ?USE16
?u32=0
.xcref ?u32
endif
else
ASMpass=2
endif
.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
.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
if ?bigreg
.xcref ?eax,?ebx,?ecx,?edx,?esi,?edi
.xcref ?ebp,?esp,?fs,?gs
.xcref ?EAX,?EBX,?ECX,?EDX,?ESI,?EDI
.xcref ?EBP,?ESP,?FS,?GS
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,?aprof1,?aprof2,?DOS5
.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,?no_bp1,?no_bp2,?bigreg,?enter1
.xcref ?cbe,?pcbe
?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
?ent = 0
?nx = 0
?wfp = 0
?ff = 0
?dd2 = 0
?cCall1 = 0
?pcc = ?PLM
?PLMPrevParm = 0
?no_bp2 = ?no_bp1
?cbe = 0
?aprof2 = 0
.xcref ?casen
if1
?casen = 0
endif
?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
if ?bigreg
?sps
.386p
?eax = 10000000000000000b
?ebx = 100000000000000000b
?ecx = 1000000000000000000b
?edx = 10000000000000000000b
?esi = 100000000000000000000b
?edi = 1000000000000000000000b
?ebp = 10000000000000000000000b
?esp = 100000000000000000000000b
?fs = 1000000000000000000000000b
?gs = 10000000000000000000000000b
?rps
endif
?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
if ?bigreg
?sps
.386p
?EAX = 10000000000000000b
?EBX = 100000000000000000b
?ECX = 1000000000000000000b
?EDX = 10000000000000000000b
?ESI = 100000000000000000000b
?EDI = 1000000000000000000000b
?EBP = 10000000000000000000000b
?ESP = 100000000000000000000000b
?FS = 1000000000000000000000000b
?GS = 10000000000000000000000000b
?rps
endif
.cref
uconcat macro a,b,c,d,e,f,g
a&b c&d e&f&g
endm
mpush macro r
if ?bigreg
?sps
.386p
irp x,<ax,bx,cx,dx,si,di,bp,sp>
if (r and ?e&&x)
push e&&x
else
if (r and ?&&x)
push x
endif
endif
endm
irp x,<es,ds,ss,cs,fs,gs>
if (r and ?&&x)
push x
endif
endm
?rps
else
irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
if (r and ?&&x)
push x
endif
endm
endif
endm
mpop macro r
if ?bigreg
?sps
.386p
irp x,<gs,fs,cs,ss,ds,es>
if (r and ?&&x)
pop x
endif
endm
irp x,<sp,bp,di,si,dx,cx,bx,ax>
if (r and ?e&&x)
pop e&&x
else
if (r and ?&&x)
pop x
endif
endif
endm
?rps
else
irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
if (r and ?&&x)
pop x
endif
endm
endif
endm
save macro r
?rsl=0
?ri ?rsl,<r>
endm
?ri macro n,r
irp x,<r>
ifdef ?&&x
n=n or ?&&x
else
??error2 <unknown register x>
.err
endif
endm
endm
.xcref
.xcref parmB,parmW,parmD,parmQ,parmT,parmCP,parmDP,parmH
.cref
parmB macro n
?pp <n>,<byte>,2,1
endm
parmW macro n
?pp <n>,<word>,2,2
endm
parmD macro n
ife ?pcc
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
parmH macro n
?pp <n>,<word>,4,2
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 ?pcc
?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
??error2 <parm(s) "&n" declared outside proc def>
endif
endm
?pp1 macro n,t,o,a,b,cpc,ppc
ife ?pcc
if ?no_bp2
n equ (t ptr [+b])
else
n equ (t ptr [bp][+b])
endif
else
.xcref
.xcref ?PLMParm&cpc
.cref
if ?no_bp2
?PLMParm&cpc ¯o po
uconcat <n>,,<equ>,,<(t ptr [+>,%(a+po-o),<])>
?PLMParm&ppc po
purge ?PLMParm&cpc
&endm
else
?PLMParm&cpc ¯o po
uconcat <n>,,<equ>,,<(t ptr [bp][+>,%(a+po-o),<])>
?PLMParm&ppc po
purge ?PLMParm&cpc
&endm
endif
endif
endm
ifndef ?NOPARMR
.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
if ?no_bp2
n equ (dword ptr [-o-2])
else
n equ (dword ptr [bp][-o-2])
endif
.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)
??error2 <invalid parmR encountered: &n,&r>
exitm
endif
if ?no_bp2
n equ (word ptr [-o])
else
n equ (word ptr [bp][-o])
endif
.xcref ?t_&n
?t_&n=2
irp x,<bh,ch,dh,bl,cl,dl,ah,al>
if ?&&x eq ?&r
if ?no_bp2
n equ (byte ptr [-o])
else
n equ (byte ptr [bp][-o])
endif
?t_&n=1
exitm
endif
endm
?ia=?ia+2
?rp=?rp+1
endif
.cref
endm
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
??error2 <locals "&n" declared outside procedure def>
endif
endm
?al1 macro n,t,o
if ?no_bp2
n equ (t [-o])
else
n equ (t [bp][-o])
endif
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 word ptr n[0]
seg_&n equ word ptr 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
if ?bigreg
?sps
.386p
push dword ptr (n)
?rps
else
push word ptr (n)[2]
push word ptr (n)
endif
?argl=?argl+2
exitm
endif
ife ?t_&n-8
if ?bigreg
?sps
.386p
push dword ptr (n)[4]
push dword ptr (n)
?rps
else
push word ptr (n)[6]
push word ptr (n)[4]
push word ptr (n)[2]
push word ptr (n)
endif
?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
?no_bp2=?no_bp1
?aprof2=?aprof1
ifnb <a>
?ri ?pas,<a>
endif
?pc=sizec
?nd=?nodata1
?ent=?enter1
?nx=0
irp x,<cf>
ifdef ??_cproc_&&x
??_cproc_&&x
else
??error2 <e r r o r - unknown keyword x>
.err
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
??error2 <ATOMIC specified without NODATA - ATOMIC ignored>
endif
if ?ent
if ?wfp
?ent = 0
??error2 <ENTER specified without NONWIN - ENTER ignored>
endif
if ?uf
?ent = 0
??error2 <ENTER specified with user frame - ENTER ignored>
endif
if ?chkstk1
?ent = 0
??error2 <ENTER specified with stack checking - ENTER ignored>
endif
endif
if ?pc
if ?wfp
ife ?nx
?ia=2
?pas = ?pas and (not ?ds)
endif
endif
?adj=?adj+2
else
?wfp=0
endif
?pas = ?pas and (not (?sp+?cs+?ss))
if ?bigreg
?pas = ?pas and (not (?esp))
endif
if ?uf
?pas = ?pas and (not (?bp+?si+?di))
if ?bigreg
?pas = ?pas and (not (?ebp+?esi+?edi))
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
??error2 <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 ?rp
if ?uf
??error2 <parmR encountered in &n - user frame ignored>
?uf=0
endif
if ?ent
??error2 <parmR encountered in &n - ENTER ignored>
?ent=0
endif
endif
?pg1 <n>,c,a,%?po,w,%?uf,%?nd,%?rp,cc,<nnu>,%???
?cpd=0
?argc=0
?ba=1
???=(???+1) and 0fffeh
if p
public n
endif
ife c
n proc near
else
n proc far
endif
ife cc
nnu equ n
endif
?cbe = 0
ifnb <g>
?pcbe <g>,<nnu>,<cBegin>
endif
if ?cbe eq 1
if ???+a+?rp
if2
??_out <cBegin - possibly invalid use of nogen>
endif
endif
else
if ?uf
?mf c,%???,%?po
mpush a
else
ife ?cbe
if w
ife ?nd
ife ?DOS5
mov ax,ds
nop
else
mov ax,DataBASE
endif
endif
if ?aprof2
call AProfCall
endif
ife ?nx
ife ?DOS5
inc bp
endif
push bp
mov bp,sp
push ds
else
if ?ff+???+?po+?rp
push bp
mov bp,sp
endif
endif
ife ?nd
mov ds,ax
endif
else
if ?aprof2
call AProfCall
endif
if ?ff+???+?po+?rp
ife ?ent
push bp
mov bp,sp
endif
endif
endif
if ?rp
?uf=0
rept ?rp
uconcat mpush,,?rp,%?uf
?uf=?uf+1
endm
endif
ife ?ent
if ???
if ?chkstk1
ifdef ?CHKSTKPROC
?CHKSTKPROC %???
else
mov ax,???
ife cc
call _chkstk
else
call chkstk
endif
endif
else
sub sp,???
endif
endif
else
if ???
enter ???,0
else
push bp
mov bp,sp
endif
endif
else
if ?aprof2
call AProfRet
call AProfCall
endif
if ?rp
??error2 <cBegin - parmRs encountered with partial frame>
else
if ???
lea sp,[bp][-???-?ia]
endif
endif
endif
mpush a
endif
ifdef ?PROFILE
if c
call StartNMeas
endif
endif
endif
.cref
purge cBegin
&endm
.xcref ?utpe
?utpe ¯o
??error2 <unterminated procedure definition: "&n">
&endm
.cref
endm
?pg1 macro n,c,a,o,w,f,d,r,cc,nnu,lc
.xcref
.xcref cEnd
parm_bytes_&nnu = o
cEnd ¯o g
.xcref
?ba=0
?cbe = 0
ifnb <g>
?pcbe <g>,<nnu>,<cEnd>
endif
if ?cbe eq 1
if a+r+lc
if2
??_out <cEnd - possibly invalid use of nogen>
endif
endif
else
ifdef ?PROFILE
if c
call StopNMeas
endif
endif
mpop a
if f
db 0c3h
else
if w
ife ?nx
if (?TF eq 0) or (???+r)
lea sp,-2[bp]
endif
pop ds
pop bp
ife ?DOS5
dec bp
endif
else
if (?TF eq 0) or (???+r)
if ???+?po+r
if ?ent
leave
else
mov sp,bp
pop bp
endif
else
mov sp,bp
endif
else
if ???+?po+r
pop bp
endif
endif
endif
else
if ?ff+???+?po+r
if (?TF eq 0) or (???+r)
if ?ent
leave
else
mov sp,bp
pop bp
endif
else
pop bp
endif
endif
endif
if ?aprof2
call AProfRet
endif
if ?cbe ne 4
ife cc
ret
else
ret o
endif
endif
endif
endif
if ?cbe ne 4
n endp
.cref
purge cEnd
else
.cref
endif
&endm
.cref
endm
.xcref
.xcref cleanframe
cleanframe macro
cEnd <??cleanframe??>
endm
.cref
.xcref
.xcref ??_cproc_FAR,??_cproc_NEAR,??_cproc_PUBLIC,??_cproc_SMALL
.xcref ??_cproc_DATA,??_cproc_NODATA,??_cproc_ATOMIC,??_cproc_C
.xcref ??_cproc_PLM,??_cproc_PASCAL,??_cproc_WIN,??_cproc_NONWIN
.xcref ??_cproc_NO_BP,??_cproc_BP,??_cproc_ENTER,??_cproc_NOENTER
.xcref ??_cproc_NO_ATTRPROF,??_cproc_ATTRPROF
.xcref ??_cproc_far,??_cproc_near,??_cproc_public,??_cproc_small
.xcref ??_cproc_data,??_cproc_nodata,??_cproc_atomic,??_cproc_c
.xcref ??_cproc_plm,??_cproc_pascal,??_cproc_win,??_cproc_nonwin
.xcref ??_cproc_no_bp,??_cproc_bp,??_cproc_enter,??_cproc_noenter
.xcref ??_cproc_no_attrprof,??_cproc_attrprof
.cref
??_cproc_FAR macro
?pc=1
endm
??_cproc_NEAR macro
?pc=0
endm
??_cproc_PUBLIC macro
?pu=1
endm
??_cproc_SMALL macro
?uf=1
endm
??_cproc_DATA macro
?nd=0
endm
??_cproc_NODATA macro
?nd=1
endm
??_cproc_ENTER macro
?ent=1
endm
??_cproc_NOENTER macro
?ent=0
endm
??_cproc_ATOMIC macro
?nx=1
endm
??_cproc_C macro
?pcc=0
endm
??_cproc_PLM macro
?pcc=1
endm
??_cproc_PASCAL macro
?pcc=1
endm
??_cproc_WIN macro
?wfp=1
endm
??_cproc_NONWIN macro
?wfp=0
endm
??_cproc_NO_BP macro
?no_bp2=1
endm
??_cproc_BP macro
?no_bp2=0
endm
??_cproc_NO_ATTRPROF macro
?aprof2=0
endm
??_cproc_ATTRPROF macro
?aprof2=1
endm
??_cproc_far macro
?pc=1
endm
??_cproc_near macro
?pc=0
endm
??_cproc_public macro
?pu=1
endm
??_cproc_small macro
?uf=1
endm
??_cproc_data macro
?nd=0
endm
??_cproc_nodata macro
?nd=1
endm
??_cproc_enter macro
?ent=1
endm
??_cproc_noenter macro
?ent=0
endm
??_cproc_atomic macro
?nx=1
endm
??_cproc_c macro
?pcc=0
endm
??_cproc_plm macro
?pcc=1
endm
??_cproc_pascal macro
?pcc=1
endm
??_cproc_win macro
?wfp=1
endm
??_cproc_nonwin macro
?wfp=0
endm
??_cproc_no_bp macro
?no_bp2=1
endm
??_cproc_bp macro
?no_bp2=0
endm
??_cproc_no_attrprof macro
?aprof2=0
endm
??_cproc_attrprof macro
?aprof2=1
endm
?pcbe macro g,nnu,mt
ifidn <g>,<NOGEN>
?cbe = 1
else
ifidn <g>,<nogen>
?cbe = 1
else
ifidn <mt>,<cBegin>
ifidn <g>,<PARTIAL>
?cbe = 2
else
ifidn <g>,<partial>
?cbe = 2
else
ifdif <g>,<nnu>
??error2 <mt - unknown keyword g>
endif
endif
endif
else
ifidn <g>,<??cleanframe??>
?cbe = 4
else
ifdif <g>,<nnu>
??error2 <mt - unknown keyword g>
endif
endif
endif
endif
endif
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,u
ifnb <u>
ifnb <cl>
n segment a co u '&cl'
else
n segment a co u
endif
else
ifdef ?u32
if ?u32
?sps
.386p
ifnb <cl>
n segment a co use32 '&cl'
else
n segment a co use32
endif
?rps
else
ifnb <cl>
n segment a co use16 '&cl'
else
n segment a co use16
endif
endif
else
ifnb <cl>
n segment a co '&cl'
else
n segment a co
endif
endif
endif
n ends
ifnb <grp>
addseg grp,n
else
ln&OFFSET equ offset n:
ln&BASE equ n
?cs3 <ln>,<n>
endif
?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
?curseg equ <&ln>
?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
createSeg _TEXT,Code,word,public,CODE
ife ?nodata1
createSeg _DATA,Data,word,public,DATA,DGROUP
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
if ?aprof1
externFP <AProfCall,AProfRet>,<PLM>
endif