Subversion Repositories Kolibri OS

Rev

Rev 617 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 617 Rev 4039
Line 53... Line 53...
53
 
53
 
Line 54... Line 54...
54
prologue@proc equ prologuedef
54
prologue@proc equ prologuedef
Line 55... Line 55...
55
 
55
 
-
 
56
macro prologuedef procname,flag,parmbytes,localbytes,reglist
-
 
57
 { local loc
-
 
58
   loc = (localbytes+3) and (not 3)
-
 
59
   parmbase@proc equ ebp+8
56
macro prologuedef procname,flag,parmbytes,localbytes,reglist
60
   localbase@proc equ ebp-loc
57
 { if parmbytes | localbytes
61
   if parmbytes | localbytes
58
    push ebp
62
    push ebp
59
    mov ebp,esp
63
    mov ebp,esp
60
    if localbytes
64
    if localbytes
61
     sub esp,localbytes
65
     sub esp,loc
62
    end if
66
    end if
63
   end if
67
   end if
Line 64... Line 68...
64
   irps reg, reglist \{ push reg \} }
68
   irps reg, reglist \{ push reg \} }
Line 75... Line 79...
75
   else
79
   else
76
    retn parmbytes
80
    retn parmbytes
77
   end if }
81
   end if }
78
 
82
 
Line -... Line 83...
-
 
83
close@proc equ
-
 
84
 
79
macro define@proc name,statement
85
macro define@proc name,statement
80
 { local params,flag,regs,parmbytes,localbytes,current
86
 { local params,flag,regs,parmbytes,localbytes,current
81
   if used name
87
   if used name
82
   name:
88
   name:
83
   match =stdcall args, statement \{ params equ args
89
   match =stdcall args, statement \{ params equ args
Line 89... Line 95...
89
   match =c, statement \{ params equ
95
   match =c, statement \{ params equ
90
			  flag = 10001b \}
96
			  flag = 10001b \}
91
   match =params, params \{ params equ statement
97
   match =params, params \{ params equ statement
92
			    flag = 0 \}
98
			    flag = 0 \}
93
   virtual at ebp+8
99
   match =uses reglist=,args, params \{ regs equ reglist
94
   match =uses reglist=,args, params \{ regs equ reglist
-
 
95
					params equ args \}
100
					params equ args \}
96
   match =regs =uses reglist, regs params \{ regs equ reglist
101
   match =regs =uses reglist, regs params \{ regs equ reglist
97
					     params equ \}
102
					     params equ \}
98
   match =regs, regs \{ regs equ \}
103
   match =regs, regs \{ regs equ \}
99
   match =,args, params \{ defargs@proc args \}
104
   match prologue:reglist, prologue@proc: \{ prologue name,flag,parmbytes,localbytes,reglist \}
-
 
105
   virtual at parmbase@proc
-
 
106
   match =,args, params \{ defargs@proc args \}
100
   match =args@proc args, args@proc params \{ defargs@proc args \}
107
   match =args@proc args, args@proc params \{ defargs@proc args \}
101
   parmbytes = $ - (ebp+8)
108
   parmbytes = $-(parmbase@proc)
102
   end virtual
109
   end virtual
103
   name # % = parmbytes/4
110
   name # % = parmbytes/4
104
   all@vars equ
111
   all@vars equ
105
   current = 0
112
   current = 0
106
   match prologue:reglist, prologue@proc: \{ prologue name,flag,parmbytes,localbytes,reglist \}
113
   macro locals
107
   macro locals
-
 
108
   \{ virtual at ebp-localbytes+current
114
   \{ virtual at localbase@proc+current
109
      macro label def \\{ match . type,def> \\\{ deflocal@proc .,label,
115
      macro label def \\{ match . type,def> \\\{ deflocal@proc .,label,
110
      struc db [val] \\{ \common deflocal@proc .,db,val \\}
116
      struc db [val] \\{ \common deflocal@proc .,db,val \\}
111
      struc du [val] \\{ \common deflocal@proc .,du,val \\}
117
      struc du [val] \\{ \common deflocal@proc .,du,val \\}
112
      struc dw [val] \\{ \common deflocal@proc .,dw,val \\}
118
      struc dw [val] \\{ \common deflocal@proc .,dw,val \\}
113
      struc dp [val] \\{ \common deflocal@proc .,dp,val \\}
119
      struc dp [val] \\{ \common deflocal@proc .,dp,val \\}
114
      struc dd [val] \\{ \common deflocal@proc .,dd,val \\}
120
      struc dd [val] \\{ \common deflocal@proc .,dd,val \\}
Line 123... Line 129...
123
   macro endl
129
   macro endl
124
   \{ purge label
130
   \{ purge label
125
      restruc db,du,dw,dp,dd,dt,dq
131
      restruc db,du,dw,dp,dd,dt,dq
126
      restruc rb,rw,rp,rd,rt,rq
132
      restruc rb,rw,rp,rd,rt,rq
127
      current = $-(ebp-localbytes)
133
      current = $-(localbase@proc)
128
      end virtual \}
134
      end virtual \}
129
   macro ret operand
135
   macro ret operand
130
   \{ match any, operand \\{ retn operand \\}
136
   \{ match any, operand \\{ retn operand \\}
131
      match , operand \\{ match epilogue:reglist, epilogue@proc:
137
      match , operand \\{ match epilogue:reglist, epilogue@proc: \\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \}
132
			  \\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \}
138
   macro finish@proc
-
 
139
   \{ localbytes = current
133
   macro finish@proc \{ localbytes = (((current-1) shr 2)+1) shl 2
140
      match close:reglist, close@proc: \\{ close name,flag,parmbytes,localbytes,reglist \\}
134
			end if \} }
141
      end if \} }
135
 
142
 
Line 136... Line 143...
136
macro defargs@proc [arg]
143
macro defargs@proc [arg]
137
 { common
144
 { common
138
    if ~ arg eq
145
    if ~ arg eq
Line 141... Line 148...
141
     match argname:type, arg
148
     match argname:type, arg
142
      \{ current@arg equ argname
149
      \{ current@arg equ argname
143
	 label ..arg type
150
	 label ..arg type
144
	 argname equ ..arg
151
	 argname equ ..arg
145
	 if dqword eq type
152
	 if qqword eq type
146
	   dd ?,?,?,?
153
	   dd ?,?,?,?,?,?,?,?
-
 
154
	 else if dqword eq type
-
 
155
	   dd ?,?,?,?
147
	 else if tbyte eq type
156
	 else if tbyte eq type
148
	   dd ?,?,?
157
	   dd ?,?,?
149
	 else if qword eq type | pword eq type
158
	 else if qword eq type | pword eq type
150
	   dd ?,?
159
	   dd ?,?
151
	 else
160
	 else
Line 161... Line 170...
161
     restore current@arg
170
     restore current@arg
162
   common
171
   common
163
    end if }
172
    end if }
164
 
173
 
Line -... Line 174...
-
 
174
macro deflocal@proc name,def,[val] { name def val }
-
 
175
 
165
macro deflocal@proc name,def,[val]
176
macro deflocal@proc name,def,[val]
166
 { common
177
 { common
167
    match vars, all@vars \{ all@vars equ all@vars, \}
178
    match vars, all@vars \{ all@vars equ all@vars, \}
168
    all@vars equ all@vars name
179
    all@vars equ all@vars name
169
   forward
180
   forward
170
    local ..var,..tmp
181
    local ..var,..tmp
171
    match =label,def \{ ..tmp equ \}
-
 
172
    match tmp,..tmp \{ ..var def val \}
182
    ..var def val
173
    match ,..tmp \{ label ..var val \}
-
 
174
    match =?, val \{ ..tmp equ \}
183
    match =?, val \{ ..tmp equ \}
-
 
184
    match any =?, val \{ ..tmp equ \}
175
    match any =dup (=?), val \{ ..tmp equ \}
185
    match any (=?), val \{ ..tmp equ \}
-
 
186
    match =label, def \{ ..tmp equ \}
176
    match tmp : value, ..tmp : val
187
    match tmp : value, ..tmp : val
177
     \{ tmp: end virtual
188
     \{ tmp: end virtual
178
	initlocal@proc ..var,def value
189
	initlocal@proc ..var,def value
179
	virtual at tmp\}
190
	virtual at tmp\}
180
   common
191
   common
181
    match first rest, ..var, \{ name equ first \} }
192
    match first rest, ..var, \{ name equ first \} }
Line -... Line 193...
-
 
193
 
-
 
194
struc label type { label . type }
182
 
195
 
183
macro initlocal@proc name,def
196
macro initlocal@proc name,def
184
 { virtual at name
197
 { virtual at name
185
    def
198
    def
186
    size@initlocal = $ - name
199
    size@initlocal = $ - name
Line 236... Line 249...
236
				 restore done@local \\}
249
				 restore done@local \\}
237
       match =TBYTE, vartype \\{ varname rt count
250
       match =TBYTE, vartype \\{ varname rt count
238
				 restore done@local \\}
251
				 restore done@local \\}
239
       match =DQWORD, vartype \\{ label varname dqword
252
       match =DQWORD, vartype \\{ label varname dqword
240
				  rq count+count
253
				  rq count*2
241
				  restore done@local \\}
254
				  restore done@local \\}
-
 
255
       match =QQWORD, vartype \\{ label varname qqword
-
 
256
				  rq count*4
-
 
257
				  restore done@local \\}
-
 
258
       match =XWORD, vartype \\{ label varname xword
-
 
259
				 rq count*2
-
 
260
				 restore done@local \\}
-
 
261
       match =YWORD, vartype \\{ label varname yword
-
 
262
				 rq count*4
-
 
263
				 restore done@local \\}
242
       match , done@local \\{ virtual
264
       match , done@local \\{ virtual
243
			       varname vartype
265
			       varname vartype
244
			      end virtual
266
			      end virtual
245
			      rb count*sizeof.\#vartype
267
			      rb count*sizeof.\#vartype
246
			      restore done@local \\} \}
268
			      restore done@local \\} \}
Line 259... Line 281...
259
				 restore done@local \\}
281
				 restore done@local \\}
260
       match =DQWORD, vartype \\{ label varname dqword
282
       match =DQWORD, vartype \\{ label varname dqword
261
				  dq ?,?
283
				  dq ?,?
262
				  restore done@local \\}
284
				  restore done@local \\}
263
       match , done@local \\{ varname vartype
285
       match =QQWORD, vartype \\{ label varname qqword
-
 
286
				  dq ?,?,?,?
-
 
287
				  restore done@local \\}
-
 
288
       match =XWORD, vartype \\{ label varname xword
-
 
289
				 dq ?,?
-
 
290
				 restore done@local \\}
-
 
291
       match =YWORD, vartype \\{ label varname yword
-
 
292
				 dq ?,?,?,?
-
 
293
				 restore done@local \\}
-
 
294
       match , done@local \\{ varname vartype
264
			      restore done@local \\} \}
295
			      restore done@local \\} \}
265
    match ,done@local
296
    match ,done@local
266
    \{ var
297
    \{ var
267
       restore done@local \}
298
       restore done@local \}
268
   common
299
   common