|
|
1.1 root 1: comment $
2: cmacros - assembly macros for interfacing to hhls
3: (C)Copyright Microsoft Corp. 1984-1989
4: $
5: .xcref
6: .xcref ??_out
7: ??_out macro t
8: ifndef ?QUIET
9: %out t
10: endif
11: endm
12: outif macro name,defval,onmsg,offmsg
13: ifndef name
14: ifb <defval>
15: name=0
16: else
17: name=defval
18: endif
19: endif
20: if name
21: name=1
22: ifnb <onmsg>
23: ??_out <! onmsg>
24: endif
25: else
26: ifnb <offmsg>
27: ??_out <! offmsg>
28: endif
29: endif
30: endm
31: .xcref ??error
32: ??error macro msg
33: %out e r r o r ----- msg
34: .err e r r o r ----- msg
35: endm
36: .xcref ??error2
37: ??error2 macro msg
38: if2
39: %out e r r o r ----- msg
40: .err e r r o r ----- msg
41: endif
42: endm
43: .xcref ASMpass
44: .xcref memS,memM,memL,memC,memH,memMOD,sizec,sized
45: if1
46: ASMpass=1
47: ifdef ?SMALL
48: memS=1
49: endif
50: ifdef ?MEDIUM
51: memM=1
52: endif
53: ifdef ?COMPACT
54: memC=1
55: endif
56: ifdef ?LARGE
57: memL=1
58: endif
59: ifdef ?HUGE
60: memH=1
61: endif
62: ??_out <cMacros Version 3.06 - 09/23/87>
63: ??_out <Copyright (C) Microsoft Corp. 1984-1987. All rights reserved.>
64: outif memS,0,<Small Model>
65: outif memM,0,<Medium model>
66: outif memL,0,<Large Model>
67: outif memC,0,<Compact Model>
68: outif memH,0,<Huge Model>
69: memMOD= memS + memM + memL + memC + memH
70: if memMOD ne 1
71: if memMOD eq 0
72: memS = 1
73: outif memS,0,<Small model>
74: else
75: ??error <must have only 1 memory model selected>
76: endif
77: endif
78: sizec= memM + memL + memH
79: sized= memL + memC + (memH*2)
80: outif ?DF,0,<No segments or groups will be defined>
81: outif ?TF,0,<Epilog sequences assume valid SP>
82: outif ?WIN,1,<Windows support>
83: outif ?PLM,1,<PL/M calling convention>
84: ifndef ?NODATA
85: ?nodata1=0
86: else
87: ?nodata1=1
88: ??_out <! NODATA module>
89: endif
90: ifndef ?CHKSTK
91: ?chkstk1=0
92: else
93: ?chkstk1=1
94: ifdef ?CHKSTKPROC
95: ??_out <! Private stack checking enabled>
96: else
97: ??_out <! Stack checking enabled>
98: endif
99: endif
100: ifndef DOS5
101: ?DOS5=0
102: else
103: ?DOS5=1
104: ??_out <! DOS5 module>
105: endif
106: ifdef ?PROFILE
107: ??_out <! Native profiling enabled>
108: endif
109: ifdef ATTRPROF
110: ??_out <! Attributed profiling enabled>
111: ?aprof1=1
112: else
113: ?aprof1=0
114: endif
115: ifndef ?NO_BP
116: ?no_bp1=0
117: else
118: ?no_bp1=1
119: ??_out <! NO_BP is default>
120: endif
121: else
122: ASMpass=2
123: endif
124: .xcref ?n,?ax,?ah,?al,?bx,?bh
125: .xcref ?bl,?cx,?ch,?cl,?dx,?dh
126: .xcref ?dl,?si,?di,?es,?ds,?bp
127: .xcref ?sp,?ss,?cs
128: .xcref ?n,?AX,?AH,?AL,?BX,?BH
129: .xcref ?BL,?CX,?CH,?CL,?DX,?DH
130: .xcref ?DL,?SI,?DI,?ES,?DS,?BP
131: .xcref ?SP,?SS,?CS
132: .xcref ?rsl,?cpd,?argl,?argc,?ba
133: .xcref ?acb,???,?po
134: .xcref ?pas,?pc
135: .xcref uconcat,mpush,mpop
136: .xcref ?ri,?pp,?pp1,?al1
137: .xcref ?ad,?ap,?atal,?dd,?dd1,?dd2
138: .xcref ?pg,?pg1,?aloc,?cs1,?cs2
139: .xcref ?DF,?TF,?ff,?PLM,?WIN,?ia,?pu,?adj
140: .xcref ?uf,?rp,?nx,?nd,?nodata1,?chkstk1,?aprof1,?aprof2,?DOS5
141: .xcref ?wfp,arg,cCall,cProc,assumes,?cs3,?cs2,?cs1
142: .xcref defgrp,addseg,createSeg
143: .xcref save,outif,errnz,errn$,errnz1
144: .xcref ?PLMPrevParm,?gcc
145: .xcref ?cCall1,?pcc,?no_bp1,?no_bp2
146: .xcref ?cbe,?pcbe
147: ?rsl = 0
148: ?cpd = 0
149: ?argl = 0
150: ?argc = 0
151: ?ba = 0
152: ?acb = 0
153: ??? = 0
154: ?po = 0
155: ?pas = 0
156: ?pc = 0
157: ?ia = 0
158: ?pu = 0
159: ?adj = 0
160: ?rp = 0
161: ?uf = 0
162: ?nd = 0
163: ?nx = 0
164: ?wfp = 0
165: ?ff = 0
166: ?dd2 = 0
167: ?cCall1 = 0
168: ?pcc = ?PLM
169: ?PLMPrevParm = 0
170: ?no_bp2 = ?no_bp1
171: ?cbe = 0
172: ?aprof2 = 0
173: .xcref ?casen
174: if1
175: ?casen = 0
176: endif
177: ?n = 0000000000000000b
178: ?ax = 0000000000000011b
179: ?ah = 0000000000000001b
180: ?al = 0000000000000010b
181: ?bx = 0000000000001100b
182: ?bh = 0000000000000100b
183: ?bl = 0000000000001000b
184: ?cx = 0000000000110000b
185: ?ch = 0000000000010000b
186: ?cl = 0000000000100000b
187: ?dx = 0000000011000000b
188: ?dh = 0000000001000000b
189: ?dl = 0000000010000000b
190: ?si = 0000000100000000b
191: ?di = 0000001000000000b
192: ?es = 0000010000000000b
193: ?ds = 0000100000000000b
194: ?bp = 0001000000000000b
195: ?sp = 0010000000000000b
196: ?ss = 0100000000000000b
197: ?cs = 1000000000000000b
198: ?AX = 0000000000000011b
199: ?AH = 0000000000000001b
200: ?AL = 0000000000000010b
201: ?BX = 0000000000001100b
202: ?BH = 0000000000000100b
203: ?BL = 0000000000001000b
204: ?CX = 0000000000110000b
205: ?CH = 0000000000010000b
206: ?CL = 0000000000100000b
207: ?DX = 0000000011000000b
208: ?DH = 0000000001000000b
209: ?DL = 0000000010000000b
210: ?SI = 0000000100000000b
211: ?DI = 0000001000000000b
212: ?ES = 0000010000000000b
213: ?DS = 0000100000000000b
214: ?BP = 0001000000000000b
215: ?SP = 0010000000000000b
216: ?SS = 0100000000000000b
217: ?CS = 1000000000000000b
218: .cref
219: uconcat macro a,b,c,d,e,f,g
220: a&b c&d e&f&g
221: endm
222: mpush macro r
223: irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
224: if (r and ?&&x)
225: push x
226: endif
227: endm
228: endm
229: mpop macro r
230: irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
231: if (r and ?&&x)
232: pop x
233: endif
234: endm
235: endm
236: save macro r
237: ?rsl=0
238: ?ri ?rsl,<r>
239: endm
240: ?ri macro n,r
241: irp x,<r>
242: ifdef ?&&x
243: n=n or ?&&x
244: else
245: ??error2 <unknown register x>
246: .err
247: endif
248: endm
249: endm
250: .xcref
251: .xcref parmB,parmW,parmD,parmQ,parmT,parmCP,parmDP,parmH
252: .cref
253: parmB macro n
254: ?pp <n>,<byte>,2,1
255: endm
256: parmW macro n
257: ?pp <n>,<word>,2,2
258: endm
259: parmD macro n
260: ife ?pcc
261: irp x,<n>
262: ?pp <&&x>,<dword>,0,4
263: ?pp <off_&&x>,<word>,2,2
264: ?pp <seg_&&x>,<word>,2,2
265: endm
266: else
267: irp x,<n>
268: ?pp <seg_&&x>,<word>,2,2
269: ?pp <off_&&x>,<word>,2,2
270: ?pp <&&x>,<dword>,0,4
271: endm
272: endif
273: endm
274: parmH macro n
275: ?pp <n>,<word>,4,2
276: endm
277: parmQ macro n
278: ?pp <n>,<qword>,8,8
279: endm
280: parmT macro n
281: ?pp <n>,<tbyte>,10,10
282: endm
283: if sizec
284: parmCP macro n
285: parmD <n>
286: endm
287: else
288: parmCP macro n
289: parmW <n>
290: endm
291: endif
292: if sized
293: parmDP macro n
294: parmD <n>
295: endm
296: else
297: parmDP macro n
298: parmW <n>
299: endm
300: endif
301: ?pp macro n,t,l,s
302: if ?cpd
303: .xcref
304: irp x,<n>
305: .xcref ?t_&&x
306: ?t_&&x=s
307: ife ?pcc
308: ?pp1 x,<t>,,,%(?po+?adj)
309: ?po=?po+l
310: else
311: ?PLMPrevParm=?PLMPrevParm+1
312: ?po=?po+l
313: ?pp1 x,<t>,%?po,%?adj,,%?PLMPrevParm,%(?PLMPrevParm-1)
314: endif
315: endm
316: .cref
317: else
318: ??error2 <parm(s) "&n" declared outside proc def>
319: endif
320: endm
321: ?pp1 macro n,t,o,a,b,cpc,ppc
322: ife ?pcc
323: if ?no_bp2
324: n equ (t ptr [+b])
325: else
326: n equ (t ptr [bp][+b])
327: endif
328: else
329: .xcref
330: .xcref ?PLMParm&cpc
331: .cref
332: if ?no_bp2
333: ?PLMParm&cpc ¯o po
334: uconcat <n>,,<equ>,,<(t ptr [+>,%(a+po-o),<])>
335: ?PLMParm&ppc po
336: purge ?PLMParm&cpc
337: &endm
338: else
339: ?PLMParm&cpc ¯o po
340: uconcat <n>,,<equ>,,<(t ptr [bp][+>,%(a+po-o),<])>
341: ?PLMParm&ppc po
342: purge ?PLMParm&cpc
343: &endm
344: endif
345: endif
346: endm
347: ifndef ?NOPARMR
348: .xcref
349: .xcref ?pr,parmR
350: .cref
351: parmR macro n,r,r2
352: ?pr n,r,r2,%?rp,%(?ia+2)
353: endm
354: ?pr macro n,r,r2,i,o
355: .xcref
356: ifnb <r2>
357: parmR seg_&n,r
358: parmR off_&n,r2
359: if ?no_bp2
360: n equ (dword ptr [-o-2])
361: else
362: n equ (dword ptr [bp][-o-2])
363: endif
364: .xcref ?t_&n
365: ?t_&n=4
366: else
367: .xcref ?rp&i
368: ?rp&i=0
369: ifdef ?&r
370: ?rp&i=?&r
371: endif
372: if ??? or (?cpd eq 0) or (?rp&i eq 0)
373: ??error2 <invalid parmR encountered: &n,&r>
374: exitm
375: endif
376: if ?no_bp2
377: n equ (word ptr [-o])
378: else
379: n equ (word ptr [bp][-o])
380: endif
381: .xcref ?t_&n
382: ?t_&n=2
383: irp x,<bh,ch,dh,bl,cl,dl,ah,al>
384: if ?&&x eq ?&r
385: if ?no_bp2
386: n equ (byte ptr [-o])
387: else
388: n equ (byte ptr [bp][-o])
389: endif
390: ?t_&n=1
391: exitm
392: endif
393: endm
394: ?ia=?ia+2
395: ?rp=?rp+1
396: endif
397: .cref
398: endm
399: endif
400: .xcref
401: .xcref localB,localW,localD,localQ,localT,localCP,localDP,localV
402: .cref
403: localB macro n
404: ?aloc <n>,<byte ptr>,1,1,0
405: endm
406: localW macro n
407: ?aloc <n>,<word ptr>,2,2,1
408: endm
409: localD macro n
410: irp x,<n>
411: ?aloc <seg_&&x>,<word ptr>,2,2,1
412: ?aloc <off_&&x>,<word ptr>,2,2,1
413: ?aloc <&&x>,<dword ptr>,0,4,1
414: endm
415: endm
416: localQ macro n
417: ?aloc <n>,<qword ptr>,8,8,1
418: endm
419: localT macro n
420: ?aloc <n>,<tbyte ptr>,10,10,1
421: endm
422: if sizec
423: localCP macro n
424: localD <n>
425: endm
426: else
427: localCP macro n
428: localW <n>
429: endm
430: endif
431: if sized
432: localDP macro n
433: localD <n>
434: endm
435: else
436: localDP macro n
437: localW <n>
438: endm
439: endif
440: localV macro n,a
441: ?aloc <n>,,%(a),0,1
442: endm
443: ?aloc macro n,t,l,s,a
444: if ?cpd
445: .xcref
446: irp x,<n>
447: ???=???+l
448: if a
449: ???=((??? + 1) and 0fffeh)
450: endif
451: ?al1 x,<t>,%(???+?ia)
452: .xcref ?t_&&x
453: ?t_&&x=s
454: endm
455: .cref
456: else
457: ??error2 <locals "&n" declared outside procedure def>
458: endif
459: endm
460: ?al1 macro n,t,o
461: if ?no_bp2
462: n equ (t [-o])
463: else
464: n equ (t [bp][-o])
465: endif
466: endm
467: ?gcc macro s,i,cc
468: s = i
469: ifnb <cc>
470: ifidn <cc>,<C>
471: s=0
472: endif
473: ifidn <cc>,<PLM>
474: s=1
475: endif
476: ifidn <cc>,<PASCAL>
477: s=1
478: endif
479: endif
480: endm
481: ifndef ?NOGLOBAL
482: .xcref
483: .xcref globalB,globalW,globalD,globalQ,globalT,globalCP,globalDP
484: .cref
485: globalB macro n,i,s,c
486: ?ad <n>,1
487: ?dd n,1,<byte>,<db>,<i>,<s>,<c>
488: endm
489: globalW macro n,i,s,c
490: ?ad <n>,2
491: ?dd n,1,<word>,<dw>,<i>,<s>,<c>
492: endm
493: globalD macro n,i,s,c
494: ?ad <n>,4
495: ?dd n,1,<dword>,<dd>,<i>,<s>,<c>
496: off_&n equ word ptr n[0]
497: seg_&n equ word ptr n[2]
498: endm
499: globalQ macro n,i,s,c
500: ?ad <n>,8
501: ?dd n,1,<qword>,<dq>,<i>,<s>,<c>
502: endm
503: globalT macro n,i,s,c
504: ?ad <n>,10
505: ?dd n,1,<tbyte>,<dt>,<i>,<s>,<c>
506: endm
507: if sizec
508: globalCP macro n,i,s,c
509: globalD n,<i>,<s>,<c>
510: endm
511: else
512: globalCP macro n,i,s,c
513: globalW n,<i>,<s>,<c>
514: endm
515: endif
516: if sized
517: globalDP macro n,i,s,c
518: globalD n,<i>,<s>,<c>
519: endm
520: else
521: globalDP macro n,i,s,c
522: globalW n,<i>,<s>,<c>
523: endm
524: endif
525: endif
526: ifndef ?NOSTATIC
527: .xcref
528: .xcref staticB,staticW,staticD,staticQ,staticT,staticCP,staticDP
529: .cref
530: staticB macro n,i,s
531: ?ad <n>,1
532: ?dd n,0,<byte>,<db>,<i>,<s>,<PLM>
533: endm
534: staticW macro n,i,s
535: ?ad <n>,2
536: ?dd n,0,<word>,<dw>,<i>,<s>,<PLM>
537: endm
538: staticD macro n,i,s
539: ?ad <n>,4
540: ?dd n,0,<dword>,<dd>,<i>,<s>,<PLM>
541: endm
542: staticQ macro n,i,s
543: ?ad <n>,8
544: ?dd n,0,<qword>,<dq>,<i>,<s>,<PLM>
545: endm
546: staticT macro n,i,s
547: ?ad <n>,10
548: ?dd n,0,<tbyte>,<dt>,<i>,<s>,<PLM>
549: endm
550: if sizec
551: staticCP macro n,i,s
552: staticD n,<i>,<s>
553: endm
554: else
555: staticCP macro n,i,s
556: staticW n,<i>,<s>
557: endm
558: endif
559: if sized
560: staticDP macro n,i,s
561: staticD n,<i>,<s>
562: endm
563: else
564: staticDP macro n,i,s
565: staticW n,<i>,<s>
566: endm
567: endif
568: endif
569: ?dd macro n,p,t,d,i,s,c
570: ?gcc ?dd2,%?PLM,<c>
571: ife ?dd2
572: n label t
573: ?dd1 _&n,p,<d>,<i>,<s>
574: else
575: ?dd1 n,p,<d>,<i>,<s>
576: endif
577: endm
578: ?dd1 macro n,p,d,i,s
579: if p
580: public n
581: endif
582: ifb <s>
583: n d i
584: else
585: ifb <i>
586: n d s dup (?)
587: else
588: n d s dup (i)
589: endif
590: endif
591: endm
592: ifndef ?NOEXTERN
593: .xcref
594: .xcref ?ex1,?ex2,externB,externW,externD,externQ,externT
595: .xcref externNP,externFP,externP,externCP,externDP,externA
596: .cref
597: ?ex2 = 0
598: externA macro n,c
599: ?ex1 <n>,40h,<abs>,<c>,<>
600: endm
601: externB macro n,c
602: ?ex1 <n>,1,<byte>,<c>,<>
603: endm
604: externW macro n,c
605: ?ex1 <n>,2,<word>,<c>,<>
606: endm
607: externD macro n,c
608: ?ex1 <n>,4,<dword>,<c>,<>
609: endm
610: externQ macro n,c
611: ?ex1 <n>,8,<qword>,<c>,<>
612: endm
613: externT macro n,c
614: ?ex1 <n>,10,<tbyte>,<c>,<>
615: endm
616: externNP macro n,c
617: ?ex1 <n>,2,<near>,<c>,<cc>
618: endm
619: externFP macro n,c
620: ?ex1 <n>,4,<far>,<c>,<cc>
621: endm
622: if sizec
623: externP macro n,c
624: ?ex1 <n>,4,<far>,<c>,<cc>
625: endm
626: else
627: externP macro n,c
628: ?ex1 <n>,2,<near>,<c>,<cc>
629: endm
630: endif
631: if sizec
632: externCP macro n,c
633: ?ex1 <n>,4,<dword>,<c>,<>
634: endm
635: else
636: externCP macro n,c
637: ?ex1 <n>,2,<word>,<c>,<>
638: endm
639: endif
640: if sized
641: externDP macro n,c
642: ?ex1 <n>,4,<dword>,<c>,<>
643: endm
644: else
645: externDP macro n,c
646: ?ex1 <n>,2,<word>,<c>,<>
647: endm
648: endif
649: ?ex1 macro n,s,d,c,scv
650: ?gcc ?ex2,%?PLM,<c>
651: irp x,<n>
652: .xcref
653: .xcref ?t_&&x
654: .cref
655: ?t_&&x=s
656: ife ?ex2
657: extrn _&&x:&d
658: x equ _&&x
659: else
660: extrn x:&d
661: endif
662: ifidn <scv>,<cc>
663: .xcref
664: .xcref ?CC&&x
665: .cref
666: ?CC&&x=?ex2
667: endif
668: endm
669: endm
670: endif
671: ifndef ?NOLABEL
672: .xcref
673: .xcref ?lb1,?lblpu,?lb2
674: .xcref labelB,labelW,labelD,labelQ,labelT
675: .xcref labelNP,labelFP,labelP,labelCP,labelDP
676: .cref
677: ?lblpu = 0
678: ?lb2 = 0
679: labelB macro n,c
680: ?lb1 <n>,1,<byte>,<c>
681: endm
682: labelW macro n,c
683: ?lb1 <n>,2,<word>,<c>
684: endm
685: labelD macro n,c
686: ?lb1 <n>,4,<dword>,<c>
687: endm
688: labelQ macro n,c
689: ?lb1 <n>,8,<qword>,<c>
690: endm
691: labelT macro n,c
692: ?lb1 <n>,10,<tbyte>,<c>
693: endm
694: labelNP macro n,c
695: ?lb1 <n>,2,<near>,<c>
696: endm
697: labelFP macro n,c
698: ?lb1 <n>,4,<far>,<c>
699: endm
700: if sizec
701: labelP macro n,c
702: ?lb1 <n>,4,<far>,<c>
703: endm
704: else
705: labelP macro n,c
706: ?lb1 <n>,2,<near>,<c>
707: endm
708: endif
709: if sizec
710: labelCP macro n,c
711: ?lb1 <n>,4,<dword>,<c>
712: endm
713: else
714: labelCP macro n,c
715: ?lb1 <n>,2,<word>,<c>
716: endm
717: endif
718: if sized
719: labelDP macro n,c
720: ?lb1 <n>,4,<dword>,<c>
721: endm
722: else
723: labelDP macro n,c
724: ?lb1 <n>,2,<word>,<c>
725: endm
726: endif
727: ?lb1 macro n,s,d,c
728: ?gcc ?lb2,%?PLM,<c>
729: ?lblpu=0
730: irp x,<n>
731: ifidn <x>,<PUBLIC>
732: ?lblpu=1
733: else
734: .xcref
735: .xcref ?t_&&x
736: .cref
737: ?t_&&x=s
738: ife ?lb2
739: if ?lblpu
740: public _&&x
741: endif
742: _&&x label &d
743: x equ _&&x
744: else
745: if ?lblpu
746: public x
747: endif
748: x label &d
749: endif
750: endif
751: endm
752: endm
753: endif
754: ifndef ?NODEF
755: .xcref
756: .xcref defB,defW,defD,defQ,defT,defCP,defDP
757: .cref
758: defB macro n
759: ?ad <n>,1
760: endm
761: defW macro n
762: ?ad <n>,2
763: endm
764: defD macro n
765: ?ad <n>,4
766: endm
767: defQ macro n
768: ?ad <n>,8
769: endm
770: defT macro n
771: ?ad <n>,10
772: endm
773: if sizec
774: defCP macro n
775: defD <n>
776: endm
777: else
778: defCP macro n
779: defW <n>
780: endm
781: endif
782: if sized
783: defDP macro n
784: defD <n>
785: endm
786: else
787: defDP macro n
788: defW <n>
789: endm
790: endif
791: endif
792: ?ad macro n,s
793: irp x,<n>
794: .xcref
795: .xcref ?t_&&x
796: .cref
797: ?t_&&x=s
798: endm
799: endm
800: ifndef ?NOPTR
801: .xcref
802: .xcref regPtr,farPtr
803: .cref
804: regPtr macro n,s,o
805: farPtr n,s,o
806: endm
807: farPtr macro n,s,o
808: .xcref
809: .xcref ?t_&n
810: .cref
811: n ¯o
812: push s
813: push o
814: &endm
815: ?t_&n=80h
816: endm
817: endif
818: arg macro a
819: irp x,<a>
820: ?argc=?argc+1
821: ?atal <x>,%?argc
822: endm
823: endm
824: ?atal macro n,i
825: .xcref
826: .xcref ?ali&i
827: .cref
828: ?ali&i ¯o
829: ?ap <n>
830: &endm
831: endm
832: ?ap macro n
833: ?argl=?argl+2
834: ifdef ?t_&n
835: ife ?t_&n-1
836: push word ptr (n)
837: exitm
838: endif
839: ife ?t_&n-2
840: push n
841: exitm
842: endif
843: ife ?t_&n-4
844: push word ptr (n)[2]
845: push word ptr (n)
846: ?argl=?argl+2
847: exitm
848: endif
849: ife ?t_&n-8
850: push word ptr (n)[6]
851: push word ptr (n)[4]
852: push word ptr (n)[2]
853: push word ptr (n)
854: ?argl=?argl+6
855: exitm
856: endif
857: if ?t_&n and 80h
858: n
859: ?argl=?argl+2
860: exitm
861: endif
862: ife ?t_&n
863: push word ptr (n)
864: exitm
865: endif
866: endif
867: push n
868: endm
869: cCall macro n,a,c
870: ifnb <a>
871: arg <a>
872: endif
873: mpush %?rsl
874: ifdef ?CC&n
875: ?cCall1=?CC&n
876: else
877: ?cCall1=?PLM
878: endif
879: ifnb <c>
880: ?gcc ?cCall1,%?cCall1,<c>
881: endif
882: ?argl=0
883: ife ?cCall1
884: ?acb=?argc
885: else
886: ?acb=1
887: endif
888: rept ?argc
889: uconcat <?ali>,%?acb
890: uconcat <purge>,,<?ali>,%?acb
891: ife ?cCall1
892: ?acb=?acb-1
893: else
894: ?acb=?acb+1
895: endif
896: endm
897: call n
898: if ((?cCall1 eq 0) and (?argl ne 0))
899: add sp,?argl
900: endif
901: mpop %?rsl
902: ?rsl=0
903: ?argc= 0
904: ?argl= 0
905: endm
906: cProc macro n,cf,a
907: if ?cpd
908: ?utpe
909: endif
910: ?cpd=1
911: ???=0
912: ?argc=0
913: ?ba=0
914: ?po=0
915: ?pu=0
916: ?ia=0
917: ?adj=4
918: ?rp=0
919: ?uf=0
920: ?wfp=?WIN
921: ?ff=0
922: ?pas=0
923: ?pcc=?PLM
924: ?no_bp2=?no_bp1
925: ?aprof2=?aprof1
926: ifnb <a>
927: ?ri ?pas,<a>
928: endif
929: ?pc=sizec
930: ?nd=?nodata1
931: ?nx=0
932: irp x,<cf>
933: ifdef ??_cproc_&&x
934: ??_cproc_&&x
935: else
936: ??error2 <e r r o r - unknown keyword x>
937: .err
938: endif
939: endm
940: if ?pcc
941: ?PLMPrevParm=0
942: .xcref
943: .xcref ?PLMParm0
944: .cref
945: ?PLMParm0 ¯o
946: purge ?PLMParm0
947: &endm
948: endif
949: .xcref
950: .xcref ?CC&n
951: .cref
952: ?CC&n=?pcc
953: if (?nx eq 1) and (?nd eq 0)
954: ?nx = 0
955: ??error2 <ATOMIC specified without NODATA - ATOMIC ignored>
956: endif
957: if ?pc
958: if ?wfp
959: ife ?nx
960: ?ia=2
961: ?pas = ?pas and (not ?ds)
962: endif
963: endif
964: ?adj=?adj+2
965: else
966: ?wfp=0
967: endif
968: ?pas = ?pas and (not (?sp+?cs+?ss))
969: if ?uf
970: ?pas = ?pas and (not (?bp+?si+?di))
971: endif
972: ife ?pcc
973: ?pg <_&n>,%?pu,%?pc,%?pas,%?wfp,<n>,%?pcc
974: else
975: ?pg <n>,%?pu,%?pc,%?pas,%?wfp,<n>,%?pcc
976: endif
977: endm
978: ?pg macro n,p,c,a,w,nnu,cc
979: .xcref
980: if ?uf
981: if ?nd
982: ??error2 <NODATA encountered in &n - user frame ignored>
983: ?uf=0
984: endif
985: endif
986: .xcref cBegin
987: cBegin ¯o g
988: .xcref
989: if cc
990: uconcat <?PLMParm>,%?PLMPrevParm,%?po
991: endif
992: if ?uf
993: if ?rp
994: ??error2 <parmR encountered in &n - user frame ignored>
995: ?uf=0
996: endif
997: endif
998: ?pg1 <n>,c,a,%?po,w,%?uf,%?nd,%?rp,cc,<nnu>,%???
999: ?cpd=0
1000: ?argc=0
1001: ?ba=1
1002: ???=(???+1) and 0fffeh
1003: if p
1004: public n
1005: endif
1006: ife c
1007: n proc near
1008: else
1009: n proc far
1010: endif
1011: ife cc
1012: nnu equ n
1013: endif
1014: ?cbe = 0
1015: ifnb <g>
1016: ?pcbe <g>,<nnu>,<cBegin>
1017: endif
1018: if ?cbe eq 1
1019: if ???+a+?rp
1020: if2
1021: ??_out <cBegin - possibly invalid use of nogen>
1022: endif
1023: endif
1024: else
1025: if ?uf
1026: ?mf c,%???,%?po
1027: mpush a
1028: else
1029: ife ?cbe
1030: if w
1031: ife ?nd
1032: ife ?DOS5
1033: mov ax,ds
1034: nop
1035: else
1036: mov ax,DataBASE
1037: endif
1038: endif
1039: if ?aprof2
1040: call AProfCall
1041: endif
1042: ife ?nx
1043: ife ?DOS5
1044: inc bp
1045: endif
1046: push bp
1047: mov bp,sp
1048: push ds
1049: else
1050: if ?ff+???+?po+?rp
1051: push bp
1052: mov bp,sp
1053: endif
1054: endif
1055: ife ?nd
1056: mov ds,ax
1057: endif
1058: else
1059: if ?aprof2
1060: call AProfCall
1061: endif
1062: if ?ff+???+?po+?rp
1063: push bp
1064: mov bp,sp
1065: endif
1066: endif
1067: if ?rp
1068: ?uf=0
1069: rept ?rp
1070: uconcat mpush,,?rp,%?uf
1071: ?uf=?uf+1
1072: endm
1073: endif
1074: if ???
1075: if ?chkstk1
1076: ifdef ?CHKSTKPROC
1077: ?CHKSTKPROC %???
1078: else
1079: mov ax,???
1080: ife cc
1081: call _chkstk
1082: else
1083: call chkstk
1084: endif
1085: endif
1086: else
1087: sub sp,???
1088: endif
1089: endif
1090: else
1091: if ?aprof2
1092: call AProfRet
1093: call AProfCall
1094: endif
1095: if ?rp
1096: ??error2 <cBegin - parmRs encountered with partial frame>
1097: else
1098: if ???
1099: lea sp,[bp][-???-?ia]
1100: endif
1101: endif
1102: endif
1103: mpush a
1104: endif
1105: ifdef ?PROFILE
1106: if c
1107: call StartNMeas
1108: endif
1109: endif
1110: endif
1111: .cref
1112: purge cBegin
1113: &endm
1114: .xcref ?utpe
1115: ?utpe ¯o
1116: ??error2 <unterminated procedure definition: "&n">
1117: &endm
1118: .cref
1119: endm
1120: ?pg1 macro n,c,a,o,w,f,d,r,cc,nnu,lc
1121: .xcref
1122: .xcref cEnd
1123: parm_bytes_&nnu = o
1124: cEnd ¯o g
1125: .xcref
1126: ?ba=0
1127: ?cbe = 0
1128: ifnb <g>
1129: ?pcbe <g>,<nnu>,<cEnd>
1130: endif
1131: if ?cbe eq 1
1132: if a+r+lc
1133: if2
1134: ??_out <cEnd - possibly invalid use of nogen>
1135: endif
1136: endif
1137: else
1138: ifdef ?PROFILE
1139: if c
1140: call StopNMeas
1141: endif
1142: endif
1143: mpop a
1144: if f
1145: db 0c3h
1146: else
1147: if w
1148: ife ?nx
1149: if (?TF eq 0) or (???+r)
1150: lea sp,-2[bp]
1151: endif
1152: pop ds
1153: pop bp
1154: ife ?DOS5
1155: dec bp
1156: endif
1157: else
1158: if (?TF eq 0) or (???+r)
1159: mov sp,bp
1160: endif
1161: if ???+?po+r
1162: pop bp
1163: endif
1164: endif
1165: else
1166: if ?ff+???+?po+r
1167: if (?TF eq 0) or (???+r)
1168: mov sp,bp
1169: endif
1170: pop bp
1171: endif
1172: endif
1173: if ?aprof2
1174: call AProfRet
1175: endif
1176: if ?cbe ne 4
1177: ife cc
1178: ret
1179: else
1180: ret o
1181: endif
1182: endif
1183: endif
1184: endif
1185: if ?cbe ne 4
1186: n endp
1187: .cref
1188: purge cEnd
1189: else
1190: .cref
1191: endif
1192: &endm
1193: .cref
1194: endm
1195: .xcref
1196: .xcref cleanframe
1197: cleanframe macro
1198: cEnd <??cleanframe??>
1199: endm
1200: .cref
1201: .xcref
1202: .xcref ??_cproc_FAR,??_cproc_NEAR,??_cproc_PUBLIC,??_cproc_SMALL
1203: .xcref ??_cproc_DATA,??_cproc_NODATA,??_cproc_ATOMIC,??_cproc_C
1204: .xcref ??_cproc_PLM,??_cproc_PASCAL,??_cproc_WIN,??_cproc_NONWIN
1205: .xcref ??_cproc_NO_BP,??_cproc_BP
1206: .xcref ??_cproc_NO_ATTRPROF,??_cproc_ATTRPROF
1207: .xcref ??_cproc_far,??_cproc_near,??_cproc_public,??_cproc_small
1208: .xcref ??_cproc_data,??_cproc_nodata,??_cproc_atomic,??_cproc_c
1209: .xcref ??_cproc_plm,??_cproc_pascal,??_cproc_win,??_cproc_nonwin
1210: .xcref ??_cproc_no_bp,??_cproc_bp
1211: .xcref ??_cproc_no_attrprof,??_cproc_attrprof
1212: .cref
1213: ??_cproc_FAR macro
1214: ?pc=1
1215: endm
1216: ??_cproc_NEAR macro
1217: ?pc=0
1218: endm
1219: ??_cproc_PUBLIC macro
1220: ?pu=1
1221: endm
1222: ??_cproc_SMALL macro
1223: ?uf=1
1224: endm
1225: ??_cproc_DATA macro
1226: ?nd=0
1227: endm
1228: ??_cproc_NODATA macro
1229: ?nd=1
1230: endm
1231: ??_cproc_ATOMIC macro
1232: ?nx=1
1233: endm
1234: ??_cproc_C macro
1235: ?pcc=0
1236: endm
1237: ??_cproc_PLM macro
1238: ?pcc=1
1239: endm
1240: ??_cproc_PASCAL macro
1241: ?pcc=1
1242: endm
1243: ??_cproc_WIN macro
1244: ?wfp=1
1245: endm
1246: ??_cproc_NONWIN macro
1247: ?wfp=0
1248: endm
1249: ??_cproc_NO_BP macro
1250: ?no_bp2=1
1251: endm
1252: ??_cproc_BP macro
1253: ?no_bp2=0
1254: endm
1255: ??_cproc_NO_ATTRPROF macro
1256: ?aprof2=0
1257: endm
1258: ??_cproc_ATTRPROF macro
1259: ?aprof2=1
1260: endm
1261: ??_cproc_far macro
1262: ?pc=1
1263: endm
1264: ??_cproc_near macro
1265: ?pc=0
1266: endm
1267: ??_cproc_public macro
1268: ?pu=1
1269: endm
1270: ??_cproc_small macro
1271: ?uf=1
1272: endm
1273: ??_cproc_data macro
1274: ?nd=0
1275: endm
1276: ??_cproc_nodata macro
1277: ?nd=1
1278: endm
1279: ??_cproc_atomic macro
1280: ?nx=1
1281: endm
1282: ??_cproc_c macro
1283: ?pcc=0
1284: endm
1285: ??_cproc_plm macro
1286: ?pcc=1
1287: endm
1288: ??_cproc_pascal macro
1289: ?pcc=1
1290: endm
1291: ??_cproc_win macro
1292: ?wfp=1
1293: endm
1294: ??_cproc_nonwin macro
1295: ?wfp=0
1296: endm
1297: ??_cproc_no_bp macro
1298: ?no_bp2=1
1299: endm
1300: ??_cproc_bp macro
1301: ?no_bp2=0
1302: endm
1303: ??_cproc_no_attrprof macro
1304: ?aprof2=0
1305: endm
1306: ??_cproc_attrprof macro
1307: ?aprof2=1
1308: endm
1309: ?pcbe macro g,nnu,mt
1310: ifidn <g>,<NOGEN>
1311: ?cbe = 1
1312: else
1313: ifidn <g>,<nogen>
1314: ?cbe = 1
1315: else
1316: ifidn <mt>,<cBegin>
1317: ifidn <g>,<PARTIAL>
1318: ?cbe = 2
1319: else
1320: ifidn <g>,<partial>
1321: ?cbe = 2
1322: else
1323: ifdif <g>,<nnu>
1324: ??error2 <mt - unknown keyword g>
1325: endif
1326: endif
1327: endif
1328: else
1329: ifidn <g>,<??cleanframe??>
1330: ?cbe = 4
1331: else
1332: ifdif <g>,<nnu>
1333: ??error2 <mt - unknown keyword g>
1334: endif
1335: endif
1336: endif
1337: endif
1338: endif
1339: endm
1340: assumes macro s,ln
1341: ifndef ln&_assumes
1342: assume s:ln
1343: else
1344: ln&_assumes s
1345: endif
1346: endm
1347: createSeg macro n,ln,a,co,cl,grp
1348: ifnb <cl>
1349: n segment a co '&cl'
1350: else
1351: n segment a co
1352: endif
1353: n ends
1354: ifnb <grp>
1355: addseg grp,n
1356: else
1357: ln&OFFSET equ offset n:
1358: ln&BASE equ n
1359: ?cs3 <ln>,<n>
1360: endif
1361: ?cs1 <ln>,<n>
1362: endm
1363: addseg macro grp,seg
1364: .xcref
1365: .xcref grp&_def
1366: .cref
1367: ifndef grp&_def
1368: grp&_def=0
1369: endif
1370: if grp&_def ne ASMpass
1371: .xcref
1372: .xcref grp&_add
1373: .cref
1374: grp&_add ¯o s
1375: grp&_in <seg>,s
1376: &endm
1377: .xcref
1378: .xcref grp&_in
1379: .cref
1380: grp&_in ¯o sl,s
1381: ifb <s>
1382: grp group sl
1383: else
1384: grp&_add ¯o ns
1385: grp&_in <sl,s>,ns
1386: &endm
1387: endif
1388: &endm
1389: grp&_def=ASMpass
1390: else
1391: grp&_add seg
1392: endif
1393: endm
1394: defgrp macro grp,ln
1395: addseg grp
1396: ifnb <ln>
1397: irp x,<ln>
1398: ?cs3 <&x>,<grp>
1399: x&&OFFSET equ offset grp:
1400: x&&BASE equ grp
1401: endm
1402: endif
1403: endm
1404: ?cs1 macro ln,n
1405: .xcref
1406: .xcref ln&_sbegin
1407: .cref
1408: ln&_sbegin ¯o
1409: .xcref
1410: .xcref ?mf
1411: .cref
1412: ?curseg equ <&ln>
1413: ?mf &¯o c,l,p
1414: if c
1415: extrn n&_FARFRAME:near
1416: call n&_FARFRAME
1417: else
1418: extrn n&_NEARFRAME:near
1419: call n&_NEARFRAME
1420: endif
1421: db l shr 1
1422: db p shr 1
1423: &&endm
1424: ?cs2 <ln>,<n>
1425: n segment
1426: &endm
1427: endm
1428: ?cs2 macro ln,n
1429: .xcref
1430: .xcref sEnd
1431: .cref
1432: sEnd ¯o
1433: n ends
1434: purge ?mf
1435: purge sEnd
1436: &endm
1437: endm
1438: ?cs3 macro ln,n
1439: .xcref
1440: .xcref ln&_assumes
1441: .cref
1442: ln&_assumes ¯o s
1443: assume s:&n
1444: &endm
1445: endm
1446: .xcref
1447: .xcref sBegin
1448: .cref
1449: sBegin macro ln
1450: ln&_sbegin
1451: endm
1452: ife ?DF
1453: createSeg _TEXT,Code,word,public,CODE
1454: ife ?nodata1
1455: createSeg _DATA,Data,word,public,DATA,DGROUP
1456: defgrp DGROUP,Data
1457: endif
1458: if ?chkstk1
1459: ifndef ?CHKSTKPROC
1460: externp <chkstk>
1461: endif
1462: endif
1463: endif
1464: errnz macro x
1465: if2
1466: if x
1467: errnz1 <x>,%(x)
1468: endif
1469: endif
1470: endm
1471: errnz1 macro x1,x2
1472: = *errnz* x1 = x2
1473: .err
1474: endm
1475: errn$ macro l,x
1476: errnz <offset $ - offset l x>
1477: endm
1478: ifdef ?PROFILE
1479: externFP <StartNMeas,StopNMeas>
1480: endif
1481: if ?aprof1
1482: externFP <AProfCall,AProfRet>,<PLM>
1483: endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.