comment $ SCCSID = "@(#)cmacros.mas:1.9" cmacros - assembly macros for interfacing to hhls (C)Copyright Microsoft Corp. 1984-1987 $ .xcref .xcref ??_out ??_out macro t ifndef ?QUIET %out t endif endm outif macro name,defval,onmsg,offmsg ifndef name ifb name=0 else name=defval endif endif if name name=1 ifnb ??_out endif else ifnb ??_out 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 ASMpass .xcref memS,memM,memL,memC,memH,memMOD,sizec,sized,memS32,sizeI,wordI 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 ifdef ?SMALL32 memS32=1 endif ??_out ??_out outif memS,0, outif memM,0, outif memL,0, outif memC,0, outif memH,0, outif memS32,0,<32 Bit Small Model> memMOD= memS + memM + memL + memC + memH + memS32 if memMOD ne 1 if memMOD eq 0 memS = 1 outif memS,0, else ??error endif endif sizec= memM + memL + memH sized= memL + memC + (memH*2) if memS32 sizeI = 4 wordI equ asmdI equ
else sizeI = 2 wordI equ asmdI equ endif outif ?DF,0, outif ?DFDATA,0, outif ?TF,0, outif ?WIN,1, outif ?COW,0, outif ?PLM,1, outif ?NOATOMIC,0, outif ?NODATA,0, outif ?FORCEFRAME,0, outif ?RETFLAGS,0, ife ?NODATA ?nodata1=0 else ?nodata1=1 endif ifndef ?CHKSTK ?chkstk1=0 else ?chkstk1=1 ifdef ?CHKSTKPROC ??_out else ??_out endif endif ifndef DOS5 ?DOS5=0 else ?DOS5=1 ??_out endif ifdef ?PROFILE ??_out endif ifndef ?NO_BP ?no_bp1=0 else ?no_bp1=1 ??_out endif else ASMpass=2 endif if memS32 .386 IAX equ ICX equ IDX equ IBX equ ISP equ IBP equ ISI equ IDI equ IPUSHF equ pushfd IPOPF equ popfd IPUSHA equ pushad IPOPA equ popad IIRET equ iretd else IAX equ ICX equ IDX equ IBX equ ISP equ IBP equ ISI equ IDI equ IPUSHF equ pushf IPOPF equ popf IIRET equ iret 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 .xcref ?EAX,?EBX,?ECX,?EDX,?ESI,?EDI,?ESP,?EBP .xcref ?eax,?ebx,?ecx,?edx,?esi,?edi,?esp,?ebp .xcref ?IAX,?IBX,?ICX,?IDX,?ISI,?IDI,?ISP,?IBP .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 .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 .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 ?nx = 0 ?wfp = 0 ?ff = ?FORCEFRAME ?dd2 = 0 ?cCall1 = 0 ?pcc = ?PLM ?PLMPrevParm = 0 ?no_bp2 = ?no_bp1 ?cbe = 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 ?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 ?EAX = 0000000000000011b ?EBX = 0000000000001100b ?ECX = 0000000000110000b ?EDX = 0000000011000000b ?ESI = 0000000100000000b ?EDI = 0000001000000000b ?EBP = 0001000000000000b ?ESP = 0010000000000000b ?eax = 0000000000000011b ?ebx = 0000000000001100b ?ecx = 0000000000110000b ?edx = 0000000011000000b ?esi = 0000000100000000b ?edi = 0000001000000000b ?ebp = 0001000000000000b ?esp = 0010000000000000b ?IAX = 0000000000000011b ?IBX = 0000000000001100b ?ICX = 0000000000110000b ?IDX = 0000000011000000b ?ISI = 0000000100000000b ?IDI = 0000001000000000b ?IBP = 0001000000000000b ?ISP = 0010000000000000b .cref uconcat macro a,b,c,d,e,f,g a&b c&d e&f&g endm mpush macro r irp x, if (r and ?&&x) push x endif endm endm mpop macro r irp x, if (r and ?&&x) pop x endif endm endm save macro r ?rsl=0 ?ri ?rsl, endm ?ri macro n,r irp x, ifdef ?&&x n=n or ?&&x else ??error2 .err endif endm endm .xcref .xcref parmB,parmW,parmD,parmQ,parmT,parmCP,parmDP,parmH,parmI .cref parmB macro n ?pp ,,sizeI,1 endm parmW macro n ?pp ,,sizeI,2 endm parmI macro n ?pp ,wordI,sizeI,sizeI endm parmD macro n ife ?pcc irp x, ?pp <&&x>,,0,4 ?pp ,,2,2 ?pp ,,2,2 endm else irp x, ?pp ,,2,2 ?pp ,,2,2 ?pp <&&x>,,0,4 endm endif endm parmH macro n ?pp ,,4,2 endm parmQ macro n ?pp ,,8,8 endm parmT macro n ?pp ,,10,10 endm if sizec parmCP macro n parmD endm else parmCP macro n parmW endm endif if sized parmDP macro n parmD endm else parmDP macro n parmI endm endif ?pp macro n,t,l,s if ?cpd .xcref irp x, .xcref ?t&&x ?t&&x=s ife ?pcc ?pp1 x,,,,%(?po+?adj) ?po=?po+l else ?PLMPrevParm=?PLMPrevParm+1 ?po=?po+l ?pp1 x,,%?po,%?adj,,%?PLMPrevParm,%(?PLMPrevParm-1) endif endm .cref else ??error2 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 [IBP][+b]) endif else .xcref .xcref ?PLMParm&cpc .cref if ?no_bp2 ?PLMParm&cpc ¯o po uconcat ,,,,<(t ptr [+>,%(a+po-o),<])> ?PLMParm&ppc po purge ?PLMParm&cpc &endm else ?PLMParm&cpc ¯o po uconcat ,,,,<(t ptr [IBP][+>,%(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 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 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, 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,localI .cref localB macro n ?aloc ,,1,1,0 endm localW macro n ?aloc ,,2,2,1 endm localI macro n ?aloc ,&wordI&< ptr>,sizeI,sizeI,1 endm localD macro n irp x, ?aloc ,,2,2,1 ?aloc ,,2,2,1 ?aloc <&&x>,,0,4,1 endm endm localQ macro n ?aloc ,,8,8,1 endm localT macro n ?aloc ,,10,10,1 endm if sizec localCP macro n localD endm else localCP macro n localW endm endif if sized localDP macro n localD endm else localDP macro n localI endm endif localV macro n,a ?aloc ,,%(a),0,1 endm ?aloc macro n,t,l,s,a if ?cpd .xcref irp x, ???=???+l if a if memS32 and l GT 2 ???=((??? + 3) and 0fffffffch) else ???=((??? + 1) and 0fffeh) endif endif ?al1 x,,%(???+?ia) .xcref ?t&&x ?t&&x=s endm .cref else ??error2 endif endm ?al1 macro n,t,o if ?no_bp2 n equ (t [-o]) else n equ (t [IBP][-o]) endif endm ?gcc macro s,i,cc s = i ifnb ifidn , s=0 endif ifidn , s=1 endif ifidn , s=1 endif endif endm ifndef ?NOGLOBAL .xcref .xcref globalB,globalW,globalD,globalQ,globalT,globalCP,globalDP,globalI .cref globalB macro n,i,s,c ?ad ,1 ?dd n,1,,,,, endm globalW macro n,i,s,c ?ad ,2 ?dd n,1,,,,, endm globalI macro n,i,s,c ?ad ,2 ?dd n,1,wordI,%asmdI,,, endm globalD macro n,i,s,c ?ad ,4 ?dd n,1,,
,,, off_&n equ word ptr n[0] seg_&n equ word ptr n[2] endm globalQ macro n,i,s,c ?ad ,8 ?dd n,1,,,,, endm globalT macro n,i,s,c ?ad ,10 ?dd n,1,,
,,, endm if sizec globalCP macro n,i,s,c globalD n,,, endm else globalCP macro n,i,s,c globalW n,,, endm endif if sized globalDP macro n,i,s,c globalD n,,, endm else globalDP macro n,i,s,c globalI n,,, endm endif endif ifndef ?NOSTATIC .xcref .xcref staticB,staticW,staticD,staticQ,staticT,staticCP,staticDP,staticI .cref staticB macro n,i,s ?ad ,1 ?dd n,0,,,,, endm staticW macro n,i,s ?ad ,2 ?dd n,0,,,,, endm staticD macro n,i,s ?ad ,4 ?dd n,0,,
,,, endm staticI macro n,i,s ?ad ,sizeI ?dd n,0,wordI,%asmdI,,, endm staticQ macro n,i,s ?ad ,8 ?dd n,0,,,,, endm staticT macro n,i,s ?ad ,10 ?dd n,0,,
,,, endm if sizec staticCP macro n,i,s staticD n,, endm else staticCP macro n,i,s staticI n,, endm endif if sized staticDP macro n,i,s staticD n,, endm else staticDP macro n,i,s staticI n,, endm endif endif ?dd macro n,p,t,d,i,s,c ?gcc ?dd2,%?PLM, ife ?dd2 n label t ?dd1 _&n,p,,, else ?dd1 n,p,,, endif endm ?dd1 macro n,p,d,i,s if p public n endif ifb n d i else ifb n d s dup (?) else n d s dup (i) endif endif endm ifndef ?NOEXTERN .xcref .xcref ?ex1,?ex2,externB,externW,externI,externD,externQ,externT .xcref externNP,externFP,externP,externCP,externDP,externA .cref ?ex2 = 0 externA macro n,c ?ex1 ,40h,,,<> endm externB macro n,c ?ex1 ,1,,,<> endm externW macro n,c ?ex1 ,2,,,<> endm externI macro n,c ?ex1 ,sizeI,,,<> endm externD macro n,c ?ex1 ,4,,,<> endm externQ macro n,c ?ex1 ,8,,,<> endm externT macro n,c ?ex1 ,10,,,<> endm externNP macro n,c ?ex1 ,2,,, endm externFP macro n,c ?ex1 ,4,,, endm if sizec externP macro n,c ?ex1 ,4,,, endm else externP macro n,c ?ex1 ,2,,, endm endif if sizec externCP macro n,c ?ex1 ,4,,,<> endm else externCP macro n,c ?ex1 ,2,,,<> endm endif if sized externDP macro n,c ?ex1 ,4,,,<> endm else externDP macro n,c ?ex1 ,2,,,<> endm endif ?ex1 macro n,s,d,c,scv ?gcc ?ex2,%?PLM, irp x, .xcref .xcref ?t&&x .cref ?t&&x=s ife ?ex2 extrn _&&x:&d x equ _&&x else extrn x:&d endif ifidn , .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 ,1,, endm labelW macro n,c ?lb1 ,2,, endm labelD macro n,c ?lb1 ,4,, endm labelQ macro n,c ?lb1 ,8,, endm labelT macro n,c ?lb1 ,10,, endm labelNP macro n,c ?lb1 ,2,, endm labelFP macro n,c ?lb1 ,4,, endm if sizec labelP macro n,c ?lb1 ,4,, endm else labelP macro n,c ?lb1 ,2,, endm endif if sizec labelCP macro n,c ?lb1 ,4,, endm else labelCP macro n,c ?lb1 ,2,, endm endif if sized labelDP macro n,c ?lb1 ,4,, endm else labelDP macro n,c ?lb1 ,2,, endm endif ?lb1 macro n,s,d,c ?gcc ?lb2,%?PLM, ?lblpu=0 irp x, ifidn , ?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 ,1 endm defW macro n ?ad ,2 endm defD macro n ?ad ,4 endm defQ macro n ?ad ,8 endm defT macro n ?ad ,10 endm if sizec defCP macro n defD endm else defCP macro n defW endm endif if sized defDP macro n defD endm else defDP macro n defW endm endif endif ?ad macro n,s irp x, .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, ?argc=?argc+1 ?atal ,%?argc endm endm ?atal macro n,i .xcref .xcref ?ali&i .cref ?ali&i ¯o ?ap &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 arg endif mpush %?rsl ifdef ?CC&n ?cCall1=?CC&n else ?cCall1=?PLM endif ifnb ?gcc ?cCall1,%?cCall1, endif ?argl=0 ife ?cCall1 ?acb=?argc else ?acb=1 endif rept ?argc uconcat ,%?acb uconcat ,,,%?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=2*sizeI ?rp=0 ?uf=0 ?wfp=?WIN ?ff=?FORCEFRAME ?pas=0 ?pcc=?PLM ?no_bp2=?no_bp1 ifnb ?ri ?pas, endif ?pc=sizec ?nd=?nodata1 ?nx=0 irp x, ifdef ??_cproc_&&x ??_cproc_&&x else ??error2 .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 endif if ?pc if ?wfp ife ?nx ife ?COW ?ia=2 ?pas = ?pas and (not ?ds) endif endif endif ?adj=?adj+sizeI else ?wfp=0 endif ?pas = ?pas and (not (?sp+?cs+?ss)) if ?uf ?pas = ?pas and (not (?bp+?si+?di)) endif ife ?pcc ?pg <_&n>,%?pu,%?pc,%?pas,%?wfp,,%?pcc else ?pg ,%?pu,%?pc,%?pas,%?wfp,,%?pcc endif endm ?pg macro n,p,c,a,w,nnu,cc .xcref if ?uf if ?nd ??error2 ?uf=0 endif endif .xcref cBegin cBegin ¯o g .xcref if cc uconcat ,%?PLMPrevParm,%?po endif if ?uf if ?rp ??error2 ?uf=0 endif endif ?pg1 ,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 n proc far endif ife cc nnu equ n endif ?cbe = 0 ifnb ?pcbe ,, endif if ?cbe eq 1 if ???+a+?rp if2 ??_out endif endif else if ?uf ?mf c,%???,%?po mpush a else ife ?cbe if w ife ?nd mov IAX,ds nop endif ife ?nx ife ?DOS5 inc IBP endif push IBP mov IBP,ISP ife ?COW push ds endif else if ?ff+???+?po+?rp push IBP mov IBP,ISP endif endif ife ?nd mov ds,IAX endif else if ?ff+???+?po+?rp push IBP mov IBP,ISP 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 IAX,??? ife cc call _chkstk else call chkstk endif endif else sub ISP,??? endif endif else if ?rp ??error2 else if ??? lea ISP,[IBP][-???-?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 &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 ?pcbe ,, endif if ?cbe eq 1 if a+r+lc if2 ??_out endif endif else ifdef ?PROFILE if c call StopNMeas endif endif mpop a if f db 0c3h else if w ife ?nx ife ?COW if (?TF eq 0) or (???+r) lea sp,-2[bp] endif pop ds else if (?TF eq 0) or (???+r) mov sp,bp endif endif pop IBP ife ?DOS5 if ?RETFLAGS lea IBP,[IBP-1] else dec IBP endif endif else if memS32 leave else if (?TF eq 0) or (???+r) mov ISP,IBP endif if ???+?po+r pop IBP endif endif endif else if ?ff+???+?po+r if (?TF eq 0) or (???+r) mov ISP,IBP endif pop IBP endif 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 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 .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 .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_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_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_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_FORCEFRAME macro ?ff=1 endm ?pcbe macro g,nnu,mt ifidn , ?cbe = 1 else ifidn , ?cbe = 1 else ifidn , ifidn , ?cbe = 2 else ifidn , ?cbe = 2 else ifdif , ??error2 endif endif endif else ifidn , ?cbe = 4 else ifdif , ??error2 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 ifnb n segment a co '&cl' else n segment a co endif n ends ifnb addseg grp,n else ln&OFFSET equ offset n: ln&BASE equ n ?cs3 , endif ?cs1 , 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 ,s &endm .xcref .xcref grp&_in .cref grp&_in ¯o sl,s ifb grp group sl else grp&_add ¯o ns grp&_in ,ns &endm endif &endm grp&_def=ASMpass else grp&_add seg endif endm defgrp macro grp,ln addseg grp ifnb irp x, ?cs3 <&x>, 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 , 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,%wordI,public,CODE ife ?nodata1 createSeg _DATA,DATA,%wordI,public,DATA,DGROUP defgrp DGROUP,DATA else ife ?DFDATA createSeg _DATA,DATA,%wordI,public,DATA,DGROUP defgrp DGROUP,DATA endif endif if ?chkstk1 ifndef ?CHKSTKPROC externp endif endif endif errnz macro x if2 if x errnz1 ,%(x) endif endif endm errnz1 macro x1,x2 = *errnz* x1 = x2 .err endm errn$ macro l,x errnz endm ifdef ?PROFILE externFP endif