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