summaryrefslogtreecommitdiff
path: root/v4.0/src/INC/CMACROS.INC
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/INC/CMACROS.INC')
-rw-r--r--v4.0/src/INC/CMACROS.INC932
1 files changed, 932 insertions, 0 deletions
diff --git a/v4.0/src/INC/CMACROS.INC b/v4.0/src/INC/CMACROS.INC
new file mode 100644
index 0000000..d81960c
--- /dev/null
+++ b/v4.0/src/INC/CMACROS.INC
@@ -0,0 +1,932 @@
1comment $
2cmacros - assembly macros for interfacing to HHLs
3(C)Copyright 1984, 1988 Microsoft Corporation
4$
5if1
6outif 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
24endm
25
26error MACRO msg
27bug
28%out E r r o r ----- msg
29ENDM
30%out cMacros Version 1.04
31outif memS,0,<Small Model>
32outif memM,0,<Medium Model>
33outif memL,0,<Large Model>
34outif memC,0,<Compact Model>
35outif memH,0,<Huge Model>
36memMOD= memS + memM + memL + memC + memH
37if memMOD ne 1
38if memMOD eq 0
39memS= 1
40outif memS,0,<Small Model>
41else
42error <Must have only 1 memory model selected>
43endif
44endif
45sizeC= memM + memL + memH
46sizeD= memL + memC + (memH*2)
47outif ?DF,0,<No segments or groups will be defined>
48outif ?WIN,0,<Windows Support>
49outif ?PLM,0,<PLM calling convention>
50endif
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,?cas
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
101uconcat macro n1,n2,o1,o2,p1,p2
102n1&n2 o1&o2 p1&p2
103endm
104mpush macro rV
105irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
106if rV AND ?&&x
107push x
108endif
109endm
110endm
111mpop macro rV
112irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
113if rV AND ?&&x
114pop x
115endif
116endm
117endm
118SAVE macro rL
119?RSL = 0
120?RI ?RSL,<rL>
121endm
122smashes macro n,rL
123 .xcref
124 .xcref ?SM&n
125 .cref
126?SM&n = 0
127?RI ?SM&n,<rL>
128endm
129?RI macro n,rL
130irp x,<rL>
131ifdef ?&&x
132n = n or ?&&x
133endif
134endm
135endm
136parmB macro nl
137?pp <&nL>,<byte>,2,1
138endm
139parmW macro nl
140?pp <&nL>,<word>,2,2
141endm
142parmD macro nl
143ife ?PLM
144irp x,<nL>
145?pp <&&x>,<DWORD>,0,4
146?pp <Off_&&x>,<WORD>,2,2
147?pp <Seg_&&x>,<WORD>,2,2
148endm
149else
150irp x,<nL>
151?pp <Seg_&&x>,<WORD>,2,2
152?pp <Off_&&x>,<WORD>,2,2
153?pp <&&x>,<DWORD>,0,4
154endm
155endif
156endm
157parmQ macro nl
158?pp <&nL>,<QWORD>,8,8
159endm
160parmT macro nl
161?pp <&nL>,<TBYTE>,10,10
162endm
163if sizeC
164parmCP macro nl
165parmD <nl>
166endm
167else
168parmCP macro nl
169parmW <nl>
170endm
171endif
172if sizeD
173parmDP macro nl
174parmD <nl>
175endm
176else
177parmDP macro nl
178parmW <nl>
179endm
180endif
181?pp macro nL,t,l,s
182if ?CPD
183 .xcref
184ife ?PLM
185irp x,<nL>
186?pp1 x,<t>,%?PO,%?adj,%(?PO+?adj)
187?PO = ?PO + l
188 .xcref ?T&&x
189?T&&x = s
190endm
191else
192irp x,<nL>
193?PO = ?PO + l
194?pp1 x,<t>,%?PO,%?adj,%(?PO+?adj)
195 .xcref ?T&&x
196?T&&x = s
197endm
198endif
199 .cref
200else
201%out Parm(s) "&nl" declared outside proc def.
202endif
203endm
204?pp1 macro n,t,o,a,b
205ife ?PLM
206n equ t ptr [bp+b]
207else
208n equ t ptr [bp+a+?PO-o]
209endif
210endm
211localB macro nL
212?aLoc <&nL>,<BYTE ptr>,1,1,0
213endm
214localW macro nL
215?aLoc <&nL>,<WORD PTR>,2,2,1
216endm
217localD macro nL
218irp 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
222endm
223endm
224localQ macro nL
225?aLoc <&nL>,<QWORD PTR>,8,8,1
226endm
227localT macro nL
228?aLoc <&nL>,<TBYTE PTR>,10,10,1
229endm
230if sizeC
231localCP macro nL
232localD <nL>
233endm
234else
235localCP macro nL
236localW <nL>
237endm
238endif
239if sizeD
240localDP macro nL
241localD <nL>
242endm
243else
244localDP macro nL
245localW <nL>
246endm
247endif
248localV macro n,a
249?aLoc <&n>,,%(&a),0,1
250endm
251?aLoc macro nL,t,l,s,a
252if ?CPD
253 .xcref
254??? = ??? + l
255if a
256??? = ((??? + 1) AND 0FFFEH)
257endif
258irp x,<nL>
259?aL1 x,<t>,%???
260 .xcref ?T&&x
261?T&&x = s
262endm
263 .cref
264else
265%out Locals "&nl" declared outside procedure def.
266endif
267endm
268?aL1 macro n,t,o
269if ?IA
270n equ t [bp-?IA-o]
271else
272n equ t [bp-o]
273endif
274endm
275globalB macro n,i,s
276?aD <n>,1
277?dd n,1,<BYTE>,<DB>,<i>,<s>
278endm
279globalW macro n,i,s
280?aD <n>,2
281?dd n,1,<WORD>,<DW>,<i>,<s>
282endm
283globalD macro n,i,s
284?aD <n>,4
285?dd n,1,<DWORD>,<DD>,<i>,<s>
286endm
287globalQ macro n,i,s
288?aD <n>,8
289?dd n,1,<QWORD>,<DQ>,<i>,<s>
290endm
291globalT macro n,i,s
292?aD <n>,10
293?dd n,1,<TBYTE>,<DT>,<i>,<s>
294endm
295if sizeC
296globalCP macro n,i,s
297globalD n,<i>,<s>
298endm
299else
300globalCP macro n,i,s
301globalW n,<i>,<s>
302endm
303endif
304if sizeD
305globalDP macro n,i,s
306globalD n,<i>,<s>
307endm
308else
309globalDP macro n,i,s
310globalW n,<i>,<s>
311endm
312endif
313staticB macro n,i,s
314?aD <n>,1
315?dd n,0,<BYTE>,<DB>,<i>,<s>
316endm
317staticW macro n,i,s
318?aD <n>,2
319?dd n,0,<WORD>,<DW>,<i>,<s>
320endm
321staticD macro n,i,s
322?aD <n>,4
323?dd n,0,<DWORD>,<DD>,<i>,<s>
324endm
325staticQ macro n,i,s
326?aD <n>,8
327?dd n,0,<QWORD>,<DQ>,<i>,<s>
328endm
329staticT macro n,i,s
330?aD <n>,10
331?dd n,0,<TBYTE>,<DT>,<i>,<s>
332endm
333if sizeC
334staticCP macro n,i,s
335staticD n,<i>,<s>
336endm
337else
338staticCP macro n,i,s
339staticW n,<i>,<s>
340endm
341endif
342if sizeD
343staticDP macro n,i,s
344staticD n,<i>,<s>
345endm
346else
347staticDP macro n,i,s
348staticW n,<i>,<s>
349endm
350endif
351?dd macro n,p,t,d,i,s
352ife ?PLM
353n label t
354?dd1 _&n,p,<d>,<i>,<s>
355else
356?dd1 n,p,<d>,<i>,<s>
357endif
358endm
359?dd1 macro n,p,d,i,s
360if p
361PUBLIC n
362endif
363ifb <s>
364n d i
365else
366ifb <i>
367n d s DUP (?)
368else
369n d s DUP (i)
370endif
371endif
372endm
373externB macro nL
374?ex1 <&nL>,1,<BYTE>
375endm
376externW macro nL
377?ex1 <&nL>,2,<WORD>
378endm
379externD macro nL
380?ex1 <&nL>,4,<DWORD>
381endm
382externQ macro nL
383?ex1 <&nL>,8,<QWORD>
384endm
385externT macro nL
386?ex1 <&nL>,10,<TBYTE>
387endm
388externNP macro nL
389?ex1 <&nL>,2,<NEAR>
390endm
391externFP macro nL
392?ex1 <&nL>,4,<FAR>
393endm
394if sizeC
395externP macro nL
396?ex1 <&nL>,4,<FAR>
397endm
398else
399externP macro nL
400?ex1 <&nL>,2,<NEAR>
401endm
402endif
403if sizeC
404externCP macro nL
405?ex1 <&nL>,4,<DWORD>
406endm
407else
408externCP macro nL
409?ex1 <&nL>,2,<WORD>
410endm
411endif
412if sizeD
413externDP macro nL
414?ex1 <&nL>,4,<DWORD>
415endm
416else
417externDP macro nL
418?ex1 <&nL>,2,<WORD>
419endm
420endif
421?ex1 macro nL,s,d
422irp x,<nL>
423 .xcref
424 .xcref ?T&&x
425 .cref
426?T&&x = s
427ife ?PLM
428extrn _&&x:&d
429x equ _&&x
430else
431extrn x:&d
432endif
433endm
434endm
435labelB macro nL
436?lb1 <&nL>,1,<BYTE>
437endm
438labelW macro nL
439?lb1 <&nL>,2,<WORD>
440endm
441labelD macro nL
442?lb1 <&nL>,4,<DWORD>
443endm
444labelQ macro nL
445?lb1 <&nL>,8,<QWORD>
446endm
447labelT macro nL
448?lb1 <&nL>,10,<TBYTE>
449endm
450labelNP macro nL
451?lb1 <&nL>,2,<NEAR>
452endm
453labelFP macro nL
454?lb1 <&nL>,4,<FAR>
455endm
456if sizeC
457labelP macro nL
458?lb1 <&nL>,4,<FAR>
459endm
460else
461labelP macro nL
462?lb1 <&nL>,2,<NEAR>
463endm
464endif
465if sizeC
466labelCP macro nL
467?lb1 <&nL>,4,<DWORD>
468endm
469else
470labelCP macro nL
471?lb1 <&nL>,2,<WORD>
472endm
473endif
474if sizeD
475labelDP macro nL
476?lb1 <&nL>,4,<DWORD>
477endm
478else
479labelDP macro nL
480?lb1 <&nL>,2,<WORD>
481endm
482endif
483?lb1 macro nL,s,d
484?lblpu = 0
485irp x,<nL>
486ifidn <x>,<PUBLIC>
487?lblpu = 1
488else
489 .xcref
490 .xcref ?T&&x
491 .cref
492?T&&x = s
493ife ?PLM
494if ?lblpu
495public _&&x
496endif
497_&&x label &d
498x equ _&&x
499else
500if ?lblpu
501public x
502endif
503x label &d
504endif
505endif
506endm
507endm
508defB macro nL
509?aD <&nL>,1
510endm
511defW macro nL
512?aD <&nL>,2
513endm
514defD macro nL
515?aD <&nL>,4
516endm
517defQ macro nL
518?aD <&nL>,8
519endm
520defT macro nL
521?aD <&nL>,10
522endm
523if sizeC
524defCP macro nL
525defD <nL>
526endm
527else
528defCP macro nL
529defW <nL>
530endm
531endif
532if sizeD
533defDP macro nL
534defD <nL>
535endm
536else
537defDP macro nL
538defW <nL>
539endm
540endif
541?aD macro nL,s
542irp x,<nL>
543 .xcref
544 .xcref ?T&&x
545 .cref
546?T&&x = s
547endm
548endm
549regPtr 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>
558endm
559arg macro aL
560irp x,<aL>
561?argc = ?argc + 1
562?Atal <x>,%?argc
563endm
564endm
565?Atal macro n,i
566 .xcref
567 .xcref ?ALI&i
568 .cref
569?ALI&i &macro
570?AP n
571&endm
572endm
573?AP macro n
574?argl = ?argl + 2
575ifdef ?T&n
576ife ?T&n-1
577push word ptr (n)
578exitm
579endif
580ife ?T&n-2
581push n
582exitm
583endif
584ife ?T&n-4
585push word ptr (n)+2
586push word ptr (n)
587?argl = ?argl + 2
588exitm
589endif
590ife ?T&n-8
591push word ptr (n)+6
592push word ptr (n)+4
593push word ptr (n)+2
594push word ptr (n)
595?argl = ?argl + 6
596exitm
597endif
598ife ?T&n-0FFFFH
599mpush %(?SR&n),1
600mpush %(?OR&n),1
601?argl = ?argl + 2
602exitm
603endif
604ife ?T&n
605push word ptr (n)
606exitm
607endif
608endif
609push n
610endm
611ife ?PLM
612ccall macro n,a,sleaze
613ifnb <a>
614Arg <a>
615endif
616ifdef ?SM&n
617?RSL = ?RSL AND ?SM&n
618endif
619mpush %?RSL
620?argl = 0
621?ACB = ?argc
622rept ?argc
623uconcat <?ALI>,%?ACB
624uconcat <purge>,,<?ALI>,%?ACB
625?ACB = ?ACB - 1
626endm
627ife ?PLM
628ifb <sleaze>
629call _&n
630else
631call n
632endif
633else
634call n
635endif
636if ?argl
637add sp,?argl
638endif
639mpop %?RSL
640?RSL = 0
641?argc = 0
642?argl = 0
643endm
644else
645ccall macro n,a
646ifnb <a>
647Arg <a>
648endif
649ifdef ?SM&n
650?RSL = ?RSL AND ?SM&n
651endif
652mpush %?RSL
653?argl = 0
654?ACB = 1
655rept ?argc
656uconcat <?ALI>,%?ACB
657uconcat <purge>,,<?ALI>,%?ACB
658?ACB = ?ACB + 1
659endm
660ife ?PLM
661call _&n
662else
663call n
664endif
665mpop %?RSL
666?RSL = 0
667?argc = 0
668?argl = 0
669endm
670endif
671cProc macro n,cl,s
672?pd n,<cl>,<s>,4
673endm
674?pd macro n,c,a,i
675if ?CPD
676?UTPE
677endif
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
687ifnb <a>
688?RI ?PAS,<a>
689endif
690?PC = sizeC
691irp x,<c>
692ifidn <x>,<FAR>
693?PC = 1
694endif
695ifidn <x>,<NEAR>
696?PC = 0
697endif
698ifidn <x>,<PUBLIC>
699?PU = 1
700endif
701endm
702if ?PC
703if ?WIN
704?IA = 2
705endif
706?adj = ?adj + 2
707endif
708ife ?PLM
709ife ?PC
710n label near
711else
712n label far
713endif
714?pg <_&n>,%?PU,%?PC,%?PAS
715else
716?pg <n>,%?PU,%?PC,%?PAS
717endif
718endm
719?pg macro n,p,c,a
720 .xcref
721 cBegin &macro 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 &macro
762 %out Unterminated Procedure Definition: "&n"
763 &endm
764endm
765
766?pg1 macro n,c,a,o
767 .xcref
768 cEnd &macro g
769 .xcref
770 ?BA = 0
771 ifidn <g>,<nogen>
772 if o+a
773 %out <cEnd - possible invalid use of nogen>
774 endif
775 else
776 mPop a,1
777 if ?IA
778 sub bp,2
779 mov sp,bp
780 pop ds
781 pop bp
782 dec bp
783 else
784 mov sp,bp
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
798endm
799
800assumes macro s,g
801local assumed
802assumed = 0
803ifidn <code>,<g>
804?cas <s>
805assumed = 1
806endif
807ifidn <CODE>,<g>
808?cas <s>
809assumed = 1
810endif
811ifidn <data>,<g>
812assume s&:dgroup
813assumed = 1
814endif
815ifidn <DATA>,<g>
816assume s&:dgroup
817assumed = 1
818endif
819ife assumed
820assume s&:&g
821endif
822endm
823if sizeC
824?cas macro s
825assume s&:_TEXT
826endm
827else
828?cas macro s
829assume s&:IGROUP
830endm
831endif
832createSeg macro n,ln,a,co,cl,grp
833ifnb <grp>
834ifidn <grp>,<IGROUP>
835ife sizeC
836addSeg IGROUP,n
837endif
838else
839addSeg grp,n
840endif
841endif
842ifnb <cl>
843n segment a co '&cl'
844else
845n segment a co
846endif
847n ends
848?cs1 <n>,<ln>
849endm
850if1
851ASMpass=1
852else
853ASMpass=2
854endif
855addSeg macro grp,seg
856ifndef def_&grp
857def_&grp= 0
858endif
859if def_&grp ne ASMpass
860add_&grp &macro s
861in_&grp <seg>,s
862&endm
863in_&grp &macro sl,s
864ifb <s>
865grp group sl
866else
867add_&grp &macro ns
868in_&grp <sl,s>,ns
869&endm
870endif
871&endm
872def_&grp=ASMpass
873else
874add_&grp seg
875endif
876endm
877defGrp macro nam
878addSeg nam
879endm
880?cs1 macro n,ln
881begin&ln &macro
882?cs2 <n>
883n segment
884&endm
885endm
886
887?cs2 macro n
888 sEnd &macro
889 n ends
890 &endm
891endm
892
893sBegin macro ln
894 begin&ln
895endm
896
897ife ?DF
898 createSeg _TEXT,code,byte,public,CODE,IGROUP
899 createSeg _DATA,data,word,public,DATA,DGROUP
900 if ?WIN
901 ife sizeC
902 createSeg _INITTEXT,initcode,byte,public,CODE,IGROUP
903 createSeg _INITDATA,initdata,word,public,DATA,DGROUP
904 endif
905 endif
906 ife sizeC
907 defGrp IGROUP
908 endif
909 defGrp DGROUP
910 if sizeC
911 codeOFFSET equ OFFSET _TEXT:
912 else
913 codeOFFSET equ OFFSET IGROUP:
914 endif
915 dataOFFSET equ OFFSET DGROUP:
916endif
917
918errnz macro x
919 if2
920 if x
921 errnz1 <x>,%(x)
922 endif
923 endif
924endm
925
926errnz1 macro x1,x2
927 = *ERRNZ* x1 = x2
928endm
929
930errn$ macro l,x
931 errnz <OFFSET $ - OFFSET l x>
932endm