|
|
1.1 root 1: ; SCCSID = @(#)cmacros.inc 1.1 85/04/02
2: comment $
3: cmacros - assembly macros for interfacing to HHLs
4: (C)Copyright Microsoft Corp. 1984
5: $
6: if1
7: outif MACRO name,defval,onmsg,offmsg
8: ifndef name
9: ifb <defval>
10: name=0
11: else
12: name=defval
13: endif
14: endif
15: if name
16: name=1
17: ifnb <onmsg>
18: %out ! onmsg
19: endif
20: else
21: ifnb <offmsg>
22: %out ! offmsg
23: endif
24: endif
25: endm
26: error MACRO msg
27: bug
28: %out E r r o r ----- msg
29: ENDM
30: %out cMacros Version 1.06
31: outif memS,0,<Small Model>
32: outif memM,0,<Medium Model>
33: outif memL,0,<Large Model>
34: outif memC,0,<Compact Model>
35: outif memH,0,<Huge Model>
36: memMOD= memS + memM + memL + memC + memH
37: if memMOD ne 1
38: if memMOD eq 0
39: memS= 1
40: outif memS,0,<Small Model>
41: else
42: error <Must have only 1 memory model selected>
43: endif
44: endif
45: sizeC= memM + memL + memH
46: sizeD= memL + memC + (memH*2)
47: outif ?DF,0,<No segments or groups will be defined>
48: outif ?WIN,1,<Windows Support>
49: outif ?PLM,1,<PLM calling convention>
50: endif
51: .XCREF
52: .XCREF ?N,?AX,?AH,?AL,?BX,?BH
53: .XCREF ?BL,?CX,?CH,?CL,?DX,?DH
54: .XCREF ?DL,?SI,?DI,?ES,?DS,?BP
55: .XCREF ?SP,?SS,?CS
56: .XCREF ?RSL,?CPD,?argl,?argc,?BA
57: .XCREF ?ACB,???,?PO
58: .XCREF ?PAS,?PC
59: .XCREF Uconcat,mPush,mPop
60: .XCREF ?RI,?pp,?pp1,?al1
61: .XCREF ?aD,?AP,?Atal,?pd,?dd,?dd1,?ex1
62: .XCREF ?pg,?pg1,?aloc,?cs1,?cs2
63: .XCREF ?lb1,?lblpu
64: .XCREF ?DF,?PLM,?WIN,?IA,?PU,?ADJ
65: .CREF
66: ?RSL = 0
67: ?CPD = 0
68: ?ArgL = 0
69: ?ArgC = 0
70: ?BA = 0
71: ?ACB = 0
72: ??? = 0
73: ?PO = 0
74: ?PAS = 0
75: ?PC = 0
76: ?IA = 0
77: ?PU = 0
78: ?ADJ = 0
79: ?lblpu = 0
80: ?N = 0000000000000000B
81: ?AX = 0000000000000011B
82: ?AH = 0000000000000001B
83: ?AL = 0000000000000010B
84: ?BX = 0000000000001100B
85: ?BH = 0000000000000100B
86: ?BL = 0000000000001000B
87: ?CX = 0000000000110000B
88: ?CH = 0000000000010000B
89: ?CL = 0000000000100000B
90: ?DX = 0000000011000000B
91: ?DH = 0000000001000000B
92: ?DL = 0000000010000000B
93: ?SI = 0000000100000000B
94: ?DI = 0000001000000000B
95: ?ES = 0000010000000000B
96: ?DS = 0000100000000000B
97: ?BP = 0001000000000000B
98: ?SP = 0010000000000000B
99: ?SS = 0100000000000000B
100: ?CS = 1000000000000000B
101: uconcat macro n1,n2,o1,o2,p1,p2
102: n1&n2 o1&o2 p1&p2
103: endm
104: mpush macro rV
105: irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
106: if rV AND ?&&x
107: push x
108: endif
109: endm
110: endm
111: mpop macro rV
112: irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
113: if rV AND ?&&x
114: pop x
115: endif
116: endm
117: endm
118: SAVE macro rL
119: ?RSL = 0
120: ?RI ?RSL,<rL>
121: endm
122: smashes macro n,rL
123: .xcref
124: .xcref ?SM&n
125: .cref
126: ?SM&n = 0
127: ?RI ?SM&n,<rL>
128: endm
129: ?RI macro n,rL
130: irp x,<rL>
131: ifdef ?&&x
132: n = n or ?&&x
133: endif
134: endm
135: endm
136: parmB macro nl
137: ?pp <&nL>,<byte>,2,1
138: endm
139: parmW macro nl
140: ?pp <&nL>,<word>,2,2
141: endm
142: parmD macro nl
143: ife ?PLM
144: irp x,<nL>
145: ?pp <&&x>,<DWORD>,0,4
146: ?pp <Off_&&x>,<WORD>,2,2
147: ?pp <Seg_&&x>,<WORD>,2,2
148: endm
149: else
150: irp x,<nL>
151: ?pp <Seg_&&x>,<WORD>,2,2
152: ?pp <Off_&&x>,<WORD>,2,2
153: ?pp <&&x>,<DWORD>,0,4
154: endm
155: endif
156: endm
157: parmQ macro nl
158: ?pp <&nL>,<QWORD>,8,8
159: endm
160: parmT macro nl
161: ?pp <&nL>,<TBYTE>,10,10
162: endm
163: if sizeC
164: parmCP macro nl
165: parmD <nl>
166: endm
167: else
168: parmCP macro nl
169: parmW <nl>
170: endm
171: endif
172: if sizeD
173: parmDP macro nl
174: parmD <nl>
175: endm
176: else
177: parmDP macro nl
178: parmW <nl>
179: endm
180: endif
181: ?pp macro nL,t,l,s
182: if ?CPD
183: .xcref
184: ife ?PLM
185: irp x,<nL>
186: ?pp1 x,<t>,%?PO,%?adj,%(?PO+?adj)
187: ?PO = ?PO + l
188: .xcref ?T&&x
189: ?T&&x = s
190: endm
191: else
192: irp x,<nL>
193: ?PO = ?PO + l
194: ?pp1 x,<t>,%?PO,%?adj,%(?PO+?adj)
195: .xcref ?T&&x
196: ?T&&x = s
197: endm
198: endif
199: .cref
200: else
201: %out Parm(s) "&nl" declared outside proc def.
202: endif
203: endm
204: ?pp1 macro n,t,o,a,b
205: ife ?PLM
206: n equ t ptr [bp+b]
207: else
208: n equ t ptr [bp+a+?PO-o]
209: endif
210: endm
211: localB macro nL
212: ?aLoc <&nL>,<BYTE ptr>,1,1,0
213: endm
214: localW macro nL
215: ?aLoc <&nL>,<WORD PTR>,2,2,1
216: endm
217: localD macro nL
218: irp x,<nL>
219: ?aLoc <Seg_&&x>,<WORD PTR>,2,2,1
220: ?aLoc <Off_&&x>,<WORD PTR>,2,2,1
221: ?aLoc <&&x>,<DWORD PTR>,0,4,1
222: endm
223: endm
224: localQ macro nL
225: ?aLoc <&nL>,<QWORD PTR>,8,8,1
226: endm
227: localT macro nL
228: ?aLoc <&nL>,<TBYTE PTR>,10,10,1
229: endm
230: if sizeC
231: localCP macro nL
232: localD <nL>
233: endm
234: else
235: localCP macro nL
236: localW <nL>
237: endm
238: endif
239: if sizeD
240: localDP macro nL
241: localD <nL>
242: endm
243: else
244: localDP macro nL
245: localW <nL>
246: endm
247: endif
248: localV macro n,a
249: ?aLoc <&n>,<BYTE PTR>,%(&a),0,1
250: endm
251: ?aLoc macro nL,t,l,s,a
252: if ?CPD
253: .xcref
254: ??? = ??? + l
255: if a
256: ??? = ((??? + 1) AND 0FFFEH)
257: endif
258: irp x,<nL>
259: ?aL1 x,<t>,%???
260: .xcref ?T&&x
261: ?T&&x = s
262: endm
263: .cref
264: else
265: %out Locals "&nl" declared outside procedure def.
266: endif
267: endm
268: ?aL1 macro n,t,o
269: if ?IA
270: n equ t [bp-?IA-o]
271: else
272: n equ t [bp-o]
273: endif
274: endm
275: globalB macro n,i,s
276: ?aD <n>,1
277: ?dd n,1,<BYTE>,<DB>,<i>,<s>
278: endm
279: globalW macro n,i,s
280: ?aD <n>,2
281: ?dd n,1,<WORD>,<DW>,<i>,<s>
282: endm
283: globalD macro n,i,s
284: ?aD <n>,4
285: ?dd n,1,<DWORD>,<DD>,<i>,<s>
286: endm
287: globalQ macro n,i,s
288: ?aD <n>,8
289: ?dd n,1,<QWORD>,<DQ>,<i>,<s>
290: endm
291: globalT macro n,i,s
292: ?aD <n>,10
293: ?dd n,1,<TBYTE>,<DT>,<i>,<s>
294: endm
295: if sizeC
296: globalCP macro n,i,s
297: globalD n,<i>,<s>
298: endm
299: else
300: globalCP macro n,i,s
301: globalW n,<i>,<s>
302: endm
303: endif
304: if sizeD
305: globalDP macro n,i,s
306: globalD n,<i>,<s>
307: endm
308: else
309: globalDP macro n,i,s
310: globalW n,<i>,<s>
311: endm
312: endif
313: staticB macro n,i,s
314: ?aD <n>,1
315: ?dd n,0,<BYTE>,<DB>,<i>,<s>
316: endm
317: staticW macro n,i,s
318: ?aD <n>,2
319: ?dd n,0,<WORD>,<DW>,<i>,<s>
320: endm
321: staticD macro n,i,s
322: ?aD <n>,4
323: ?dd n,0,<DWORD>,<DD>,<i>,<s>
324: endm
325: staticQ macro n,i,s
326: ?aD <n>,8
327: ?dd n,0,<QWORD>,<DQ>,<i>,<s>
328: endm
329: staticT macro n,i,s
330: ?aD <n>,10
331: ?dd n,0,<TBYTE>,<DT>,<i>,<s>
332: endm
333: if sizeC
334: staticCP macro n,i,s
335: staticD n,<i>,<s>
336: endm
337: else
338: staticCP macro n,i,s
339: staticW n,<i>,<s>
340: endm
341: endif
342: if sizeD
343: staticDP macro n,i,s
344: staticD n,<i>,<s>
345: endm
346: else
347: staticDP macro n,i,s
348: staticW n,<i>,<s>
349: endm
350: endif
351: ?dd macro n,p,t,d,i,s
352: ife ?PLM
353: n label t
354: ?dd1 _&n,p,<d>,<i>,<s>
355: else
356: ?dd1 n,p,<d>,<i>,<s>
357: endif
358: endm
359: ?dd1 macro n,p,d,i,s
360: if p
361: PUBLIC n
362: endif
363: ifb <s>
364: n d i
365: else
366: ifb <i>
367: n d s DUP (?)
368: else
369: n d s DUP (i)
370: endif
371: endif
372: endm
373: externB macro nL
374: ?ex1 <&nL>,1,<BYTE>
375: endm
376: externW macro nL
377: ?ex1 <&nL>,2,<WORD>
378: endm
379: externD macro nL
380: ?ex1 <&nL>,4,<DWORD>
381: endm
382: externQ macro nL
383: ?ex1 <&nL>,8,<QWORD>
384: endm
385: externT macro nL
386: ?ex1 <&nL>,10,<TBYTE>
387: endm
388: externNP macro nL
389: ?ex1 <&nL>,2,<NEAR>
390: endm
391: externFP macro nL
392: ?ex1 <&nL>,4,<FAR>
393: endm
394: if sizeC
395: externP macro nL
396: ?ex1 <&nL>,4,<FAR>
397: endm
398: else
399: externP macro nL
400: ?ex1 <&nL>,2,<NEAR>
401: endm
402: endif
403: if sizeC
404: externCP macro nL
405: ?ex1 <&nL>,4,<DWORD>
406: endm
407: else
408: externCP macro nL
409: ?ex1 <&nL>,2,<WORD>
410: endm
411: endif
412: if sizeD
413: externDP macro nL
414: ?ex1 <&nL>,4,<DWORD>
415: endm
416: else
417: externDP macro nL
418: ?ex1 <&nL>,2,<WORD>
419: endm
420: endif
421: ?ex1 macro nL,s,d
422: irp x,<nL>
423: .xcref
424: .xcref ?T&&x
425: .cref
426: ?T&&x = s
427: ife ?PLM
428: extrn _&&x:&d
429: x equ _&&x
430: else
431: extrn x:&d
432: endif
433: endm
434: endm
435: labelB macro nL
436: ?lb1 <&nL>,1,<BYTE>
437: endm
438: labelW macro nL
439: ?lb1 <&nL>,2,<WORD>
440: endm
441: labelD macro nL
442: ?lb1 <&nL>,4,<DWORD>
443: endm
444: labelQ macro nL
445: ?lb1 <&nL>,8,<QWORD>
446: endm
447: labelT macro nL
448: ?lb1 <&nL>,10,<TBYTE>
449: endm
450: labelNP macro nL
451: ?lb1 <&nL>,2,<NEAR>
452: endm
453: labelFP macro nL
454: ?lb1 <&nL>,4,<FAR>
455: endm
456: if sizeC
457: labelP macro nL
458: ?lb1 <&nL>,4,<FAR>
459: endm
460: else
461: labelP macro nL
462: ?lb1 <&nL>,2,<NEAR>
463: endm
464: endif
465: if sizeC
466: labelCP macro nL
467: ?lb1 <&nL>,4,<DWORD>
468: endm
469: else
470: labelCP macro nL
471: ?lb1 <&nL>,2,<WORD>
472: endm
473: endif
474: if sizeD
475: labelDP macro nL
476: ?lb1 <&nL>,4,<DWORD>
477: endm
478: else
479: labelDP macro nL
480: ?lb1 <&nL>,2,<WORD>
481: endm
482: endif
483: ?lb1 macro nL,s,d
484: ?lblpu = 0
485: irp x,<nL>
486: ifidn <x>,<PUBLIC>
487: ?lblpu = 1
488: else
489: .xcref
490: .xcref ?T&&x
491: .cref
492: ?T&&x = s
493: ife ?PLM
494: if ?lblpu
495: public _&&x
496: endif
497: _&&x label &d
498: x equ _&&x
499: else
500: if ?lblpu
501: public x
502: endif
503: x label &d
504: endif
505: endif
506: endm
507: endm
508: defB macro nL
509: ?aD <&nL>,1
510: endm
511: defW macro nL
512: ?aD <&nL>,2
513: endm
514: defD macro nL
515: ?aD <&nL>,4
516: endm
517: defQ macro nL
518: ?aD <&nL>,8
519: endm
520: defT macro nL
521: ?aD <&nL>,10
522: endm
523: if sizeC
524: defCP macro nL
525: defD <nL>
526: endm
527: else
528: defCP macro nL
529: defW <nL>
530: endm
531: endif
532: if sizeD
533: defDP macro nL
534: defD <nL>
535: endm
536: else
537: defDP macro nL
538: defW <nL>
539: endm
540: endif
541: ?aD macro nL,s
542: irp x,<nL>
543: .xcref
544: .xcref ?T&&x
545: .cref
546: ?T&&x = s
547: endm
548: endm
549: regPtr macro n,S,O
550: .xcref
551: .xcref ?T&n,?SR&n,?OR&n
552: .cref
553: ?T&n = 0FFFFH
554: ?SR&n = 0
555: ?RI ?SR&n,<&S>
556: ?OR&n = 0
557: ?RI ?OR&n,<&O>
558: endm
559: arg macro aL
560: irp x,<aL>
561: ?argc = ?argc + 1
562: ?Atal <x>,%?argc
563: endm
564: endm
565: ?Atal macro n,i
566: .xcref
567: .xcref ?ALI&i
568: .cref
569: ?ALI&i ¯o
570: ?AP n
571: &endm
572: endm
573: ?AP macro n
574: ?argl = ?argl + 2
575: ifdef ?T&n
576: ife ?T&n-1
577: push word ptr (n)
578: exitm
579: endif
580: ife ?T&n-2
581: push n
582: exitm
583: endif
584: ife ?T&n-4
585: push word ptr (n)+2
586: push word ptr (n)
587: ?argl = ?argl + 2
588: exitm
589: endif
590: ife ?T&n-8
591: push word ptr (n)+6
592: push word ptr (n)+4
593: push word ptr (n)+2
594: push word ptr (n)
595: ?argl = ?argl + 6
596: exitm
597: endif
598: ife ?T&n-0FFFFH
599: mpush %(?SR&n),1
600: mpush %(?OR&n),1
601: ?argl = ?argl + 2
602: exitm
603: endif
604: ife ?T&n
605: push word ptr (n)
606: exitm
607: endif
608: endif
609: push n
610: endm
611: ife ?PLM
612: ccall macro n,a,sleaze
613: ifnb <a>
614: Arg <a>
615: endif
616: ifdef ?SM&n
617: ?RSL = ?RSL AND ?SM&n
618: endif
619: mpush %?RSL
620: ?argl = 0
621: ?ACB = ?argc
622: rept ?argc
623: uconcat <?ALI>,%?ACB
624: uconcat <purge>,,<?ALI>,%?ACB
625: ?ACB = ?ACB - 1
626: endm
627: ife ?PLM
628: ifb <sleaze>
629: call _&n
630: else
631: call n
632: endif
633: else
634: call n
635: endif
636: if ?argl
637: add sp,?argl
638: endif
639: mpop %?RSL
640: ?RSL = 0
641: ?argc = 0
642: ?argl = 0
643: endm
644: else
645: ccall macro n,a
646: ifnb <a>
647: Arg <a>
648: endif
649: ifdef ?SM&n
650: ?RSL = ?RSL AND ?SM&n
651: endif
652: mpush %?RSL
653: ?argl = 0
654: ?ACB = 1
655: rept ?argc
656: uconcat <?ALI>,%?ACB
657: uconcat <purge>,,<?ALI>,%?ACB
658: ?ACB = ?ACB + 1
659: endm
660: ife ?PLM
661: call _&n
662: else
663: call n
664: endif
665: mpop %?RSL
666: ?RSL = 0
667: ?argc = 0
668: ?argl = 0
669: endm
670: endif
671: cProc macro n,cl,s
672: ?pd n,<cl>,<s>,4
673: endm
674: ?pd macro n,c,a,i
675: if ?CPD
676: ?UTPE
677: endif
678: ?CPD = 1
679: ??? = 0
680: ?argc = 0
681: ?BA = 0
682: ?PO = 0
683: ?PU = 0
684: ?IA = 0
685: ?adj = i
686: ?PAS = 0
687: ifnb <a>
688: ?RI ?PAS,<a>
689: endif
690: ?PC = sizeC
691: irp x,<c>
692: ifidn <x>,<FAR>
693: ?PC = 1
694: endif
695: ifidn <x>,<NEAR>
696: ?PC = 0
697: endif
698: ifidn <x>,<PUBLIC>
699: ?PU = 1
700: endif
701: endm
702: if ?PC
703: if ?WIN
704: ?IA = 2
705: endif
706: ?adj = ?adj + 2
707: endif
708: ife ?PLM
709: ife ?PC
710: n label near
711: else
712: n label far
713: endif
714: ?pg <_&n>,%?PU,%?PC,%?PAS
715: else
716: ?pg <n>,%?PU,%?PC,%?PAS
717: endif
718: endm
719: ?pg macro n,p,c,a
720: .xcref
721: cBegin ¯o g
722: .xcref
723: ?pg1 <n>,c,a,%?PO
724: ?CPD = 0
725: ?argc = 0
726: ?BA = 1
727: ??? = (???+1) AND 0FFFEH
728: if p
729: PUBLIC n
730: endif
731: ife c
732: n proc NEAR
733: else
734: n proc FAR
735: endif
736: ifidn <g>,<nogen>
737: if ???+?PO+a
738: %out <cBegin - possible invalid use of nogen>
739: endif
740: else
741: if ?IA
742: mov ax,ds
743: nop
744: inc bp
745: push bp
746: mov bp,sp
747: push ds
748: mov ds,ax
749: else
750: push bp
751: mov bp,sp
752: endif
753: if ???
754: sub sp,???
755: endif
756: mPush a,1
757: endif
758: .cref
759: purge cBegin
760: &endm
761: ?UTPE ¯o
762: %out Unterminated Procedure Definition: "&n"
763: &endm
764: endm
765: ?pg1 macro n,c,a,o
766: .xcref
767: cEnd ¯o g
768: .xcref
769: ?BA = 0
770: ifidn <g>,<nogen>
771: if o+a
772: %out <cEnd - possible invalid use of nogen>
773: endif
774: else
775: mPop a,1
776: if ?IA
777: sub bp,2
778: mov sp,bp
779: pop ds
780: pop bp
781: dec bp
782: else
783: mov sp,bp
784: pop bp
785: endif
786: ife ?PLM
787: ret
788: else
789: ret o
790: endif
791: endif
792: n endp
793: .cref
794: purge cEnd
795: &endm
796: .cref
797: endm
798: assumes macro s,g
799: local assumed
800: assumed = 0
801: ifidn <code>,<g>
802: assume s&:_TEXT
803: assumed = 1
804: endif
805: ifidn <CODE>,<g>
806: assume s&:_TEXT
807: assumed = 1
808: endif
809: ifidn <data>,<g>
810: assume s&:dgroup
811: assumed = 1
812: endif
813: ifidn <DATA>,<g>
814: assume s&:dgroup
815: assumed = 1
816: endif
817: ife assumed
818: assume s&:&g
819: endif
820: endm
821: createSeg macro n,ln,a,co,cl,grp
822: ifnb <grp>
823: addSeg grp,n
824: endif
825: ifnb <cl>
826: n segment a co '&cl'
827: else
828: n segment a co
829: endif
830: n ends
831: ?cs1 <n>,<ln>
832: endm
833: if1
834: ASMpass=1
835: else
836: ASMpass=2
837: endif
838: addSeg macro grp,seg
839: ifndef def_&grp
840: def_&grp= 0
841: endif
842: if def_&grp ne ASMpass
843: add_&grp ¯o s
844: in_&grp <seg>,s
845: &endm
846: in_&grp ¯o sl,s
847: ifb <s>
848: grp group sl
849: else
850: add_&grp ¯o ns
851: in_&grp <sl,s>,ns
852: &endm
853: endif
854: &endm
855: def_&grp=ASMpass
856: else
857: add_&grp seg
858: endif
859: endm
860: defGrp macro nam
861: addSeg nam
862: endm
863: ?cs1 macro n,ln
864: begin&ln ¯o
865: ?cs2 <n>
866: n segment
867: &endm
868: endm
869: ?cs2 macro n
870: sEnd ¯o
871: n ends
872: &endm
873: endm
874: sBegin macro ln
875: begin&ln
876: endm
877: ife ?DF
878: createSeg _TEXT,code,byte,public,CODE
879: createSeg _DATA,data,word,public,DATA,DGROUP
880: defGrp DGROUP
881: codeOFFSET equ OFFSET _TEXT:
882: dataOFFSET equ OFFSET DGROUP:
883: endif
884: errnz macro x
885: if2
886: if x
887: errnz1 <x>,%(x)
888: endif
889: endif
890: endm
891: errnz1 macro x1,x2
892: = *ERRNZ* x1 = x2
893: endm
894: errn$ macro l,x
895: errnz <OFFSET $ - OFFSET l x>
896: ENDM
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.