summaryrefslogtreecommitdiff
path: root/misc/myC32.mac
blob: 2088e8597747f5c93c7ee9564a260e1bfbf435a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
; NASM macro set to make interfacing to 32-bit programs easier
; Also cool little macros to make NASM emulate some MASM things.
;
; Originally included in NASM.  Modifications by Peter Johnson, 1999.
;
; $Id$

%imacro proc 1                  ; begin a procedure definition
%push proc
          global %1
%1:       push  ebp
          mov   ebp, esp
%assign %$arg 8
;%assign %$argnum 0
%define %$procname %1
%endmacro

%imacro arg 0-1 4               ; used with the argument name as a label
%00       equ %$arg
;%assign %$argnum %$argnum+1
;.arg%$argnum   equ     %1
%assign %$arg %1+%$arg
%endmacro

%imacro endproc 0
%ifnctx proc
%error Mismatched `endproc'/`proc'
%else
;        mov     esp, ebp
;        pop     ebp
%ifdef LEGACY_ENDPROC
        ret
%endif
;__end_%$procname:               ; useful for calculating function size
;          global %{$procname}_arglen
;%{$procname}_arglen    equ     %$arg-8
;%assign %$i 1
;%rep %$argnum
;          global %{$procname}_arg%$i
;%{$procname}_arg%$i    equ     %{$procname}.arg%$i
;%assign %$i %$i+1
;%endrep
%pop
%endif
%endmacro

; redefine ret instructions for in-proc cases
%imacro ret 0-1
%ifnctx proc
	ret	%1
%else
	mov	esp, ebp
	pop	ebp
	ret	%1
%endif
%endmacro

%imacro retf 0-1
%ifnctx proc
	retf	%1
%else
	mov	esp, ebp
	pop	ebp
	retf	%1
%endif
%endmacro

%imacro retn 0-1
%ifnctx proc
	retn	%1
%else
	mov	esp, ebp
	pop	ebp
	retn	%1
%endif
%endmacro

; invoke calls a C function
; defaults to word (16 bit) size parameters
%macro invoke 1-*
%rotate -1
;%define invoketype word
%rep (%0-1)
;       %ifidni %1,dword
;               %define invoketype dword
;       %elifidni %1,word
;               %define invoketype word
;       %elifidni %1,byte
;               %define invoketype byte
;       %else
        %ifidni %1, cs
                o16 push %1
        %elifidni %1, ds
                o16 push %1
        %elifidni %1, es
                o16 push %1
        %elifidni %1, fs
                o16 push %1
        %elifidni %1, gs
                o16 push %1
        %elifidni %1, word cs
                o16 push %1
        %elifidni %1, word ds
                o16 push %1
        %elifidni %1, word es
                o16 push %1
        %elifidni %1, word fs
                o16 push %1
        %elifidni %1, word gs
                o16 push %1
        %else
                push %1
        %endif
;       %endif
        %rotate -1
%endrep
call %1
%if (%0!=1)
        add esp, byte %{1}_arglen
%endif
%endmacro