Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6446 | GerdtR | 1 | #define _POINTER_ |
2 | |||
3 | |||
4 | |||
5 | void dopointerproc() |
||
6 | |||
7 | |||
8 | |||
9 | ITOK wtok; |
||
10 | |||
11 | SINFO wstr; |
||
12 | |||
13 | itok.rm=itok.sib; |
||
14 | |||
15 | if((FixUp) |
||
16 | |||
17 | &&((itok.rm==rm_d32&&am32)||(itok.rm==rm_d16&&am32==0)))//16.07.04 16:01 |
||
18 | |||
19 | |||
20 | |||
21 | else compressoffset(&itok); |
||
22 | |||
23 | strinf.bufstr=NULL; |
||
24 | |||
25 | wbuf=bufrm; |
||
26 | |||
27 | unsigned int oaddESP=addESP; |
||
28 | |||
29 | itok.flag&=~f_far; |
||
30 | |||
31 | |||
32 | |||
33 | outseg(&wtok,2); |
||
34 | |||
35 | outaddress(&wtok); |
||
36 | |||
37 | |||
38 | |||
39 | getpointeradr(&wtok,wbuf,&wstr,wtok.npointr-1,am32==0?r16:r32,reg); |
||
40 | |||
41 | op66(razr); |
||
42 | |||
43 | op(0xD0+reg); /* CALL reg with stack params */ |
||
44 | |||
45 | if((wtok.flag&f_typeproc)==tp_cdecl)CorrectStack(snum); |
||
46 | |||
47 | clearregstat(0); |
||
48 | |||
49 | |||
50 | |||
51 | { |
||
52 | |||
53 | if(tok2==tk_openbracket){ |
||
54 | |||
55 | nexttok(); |
||
56 | |||
57 | } |
||
58 | |||
59 | itok.sib=am32==0?CODE16:CODE32; |
||
60 | |||
61 | } |
||
62 | |||
63 | if(am32||(itok.flag&f_far))razr=r32; |
||
64 | |||
65 | } |
||
66 | |||
67 | void getpointeradr(ITOK *gstok,char *&gbuf,SINFO *gstr,int numpointer,int razr, int reg) |
||
68 | |||
69 | if(gstok->flag&f_far){ |
||
70 | |||
71 | outseg(gstok,2); |
||
72 | |||
73 | op(gstok->rm+8*reg); |
||
74 | |||
75 | itok.segm=ES; |
||
76 | |||
77 | if(reg==BX)itok.rm=rm_BX; |
||
78 | |||
79 | else if(reg==DI)itok.rm=rm_DI; |
||
80 | |||
81 | } |
||
82 | |||
83 | int retreg; |
||
84 | |||
85 | if(am32==0&&retreg!=BX&&retreg!=SI&&retreg!=DI){ |
||
86 | |||
87 | IDZToReg(gstok->name,reg,razr); |
||
88 | |||
89 | else if(retreg!=SKIPREG)reg=retreg; |
||
90 | |||
91 | free(gbuf); |
||
92 | |||
93 | } |
||
94 | |||
95 | free(gstr->bufstr); |
||
96 | |||
97 | |||
98 | |||
99 | } |
||
100 | |||
101 | CheckAllMassiv(gbuf,razr,gstr,gstok); |
||
102 | |||
103 | op(0x8B); |
||
104 | |||
105 | outaddress(gstok); |
||
106 | |||
107 | itok.segm=DS; |
||
108 | |||
109 | itok.sib=CODE16; |
||
110 | |||
111 | else if(reg==SI)itok.rm=rm_SI; |
||
112 | |||
113 | } |
||
114 | |||
115 | itok.sib=CODE32; |
||
116 | |||
117 | } |
||
118 | |||
119 | itok.post=0; |
||
120 | |||
121 | itok.flag=gstok->flag&(!f_reloc); |
||
122 | |||
123 | while(numpointer){ |
||
124 | |||
125 | op(0x8B); |
||
126 | |||
127 | outaddress(&itok); |
||
128 | |||
129 | } |
||
130 | |||
131 | |||
132 | |||
133 | { |
||
134 | |||
135 | int rrettype; |
||
136 | |||
137 | int hnumber=0; |
||
138 | |||
139 | int reg=BX; |
||
140 | |||
141 | do{ |
||
142 | |||
143 | numpointer++; |
||
144 | |||
145 | ITOK wtok; |
||
146 | |||
147 | SINFO wstr; |
||
148 | |||
149 | unsigned int oinptr; |
||
150 | |||
151 | int otok2; |
||
152 | |||
153 | strinf.bufstr=NULL; |
||
154 | |||
155 | wbuf=bufrm; |
||
156 | |||
157 | if(numpointer==itok.npointr){ |
||
158 | |||
159 | case tk_qword: |
||
160 | |||
161 | razr+=4; |
||
162 | |||
163 | case tk_float: |
||
164 | |||
165 | case tk_word: |
||
166 | |||
167 | break; |
||
168 | |||
169 | razr+=2; |
||
170 | |||
171 | razr++; |
||
172 | |||
173 | sign=1; |
||
174 | |||
175 | } |
||
176 | |||
177 | oinptr=inptr2; |
||
178 | |||
179 | olinenum=linenumber; |
||
180 | |||
181 | nexttok(); |
||
182 | |||
183 | nexttok(); |
||
184 | |||
185 | while(tok==tk_mult){ |
||
186 | |||
187 | npointr++; |
||
188 | |||
189 | if(npointr>itok.npointr)unuseableinput(); |
||
190 | |||
191 | hnumber=MultiAssign(razr,USEALLREG,npointr); |
||
192 | |||
193 | goto getfromax; |
||
194 | |||
195 | } |
||
196 | |||
197 | cha2=ocha; |
||
198 | |||
199 | tok2=otok2; |
||
200 | |||
201 | if(itok.type==tk_proc){ |
||
202 | |||
203 | return; |
||
204 | |||
205 | getpointeradr(&itok,wbuf,&wstr,numpointer-1,razr,reg); |
||
206 | |||
207 | switch(itok.type){ |
||
208 | |||
209 | case tk_dword: |
||
210 | |||
211 | case tk_word: |
||
212 | |||
213 | return; |
||
214 | |||
215 | case tk_byte: |
||
216 | |||
217 | return; |
||
218 | |||
219 | dofloatvar(); |
||
220 | |||
221 | case tk_qword: |
||
222 | |||
223 | return; |
||
224 | |||
225 | // dodoublevar(); |
||
226 | |||
227 | } |
||
228 | |||
229 | convert_returnvalue(rrettype,rettype); |
||
230 | |||
231 | getpointeradr(&wtok,wbuf,&wstr,numpointer-1,razr,reg); |
||
232 | |||
233 | case tk_char: |
||
234 | |||
235 | outseg(&itok,2); |
||
236 | |||
237 | op(itok.rm+hnumber*8); //[reg]=AL |
||
238 | |||
239 | case tk_int: |
||
240 | |||
241 | case tk_long: |
||
242 | |||
243 | case tk_qword: |
||
244 | |||
245 | outseg(&itok,2); |
||
246 | |||
247 | op(itok.rm+hnumber*8); // MOV [rmword],AX |
||
248 | |||
249 | case tk_float: |
||
250 | |||
251 | op(0xd9); |
||
252 | |||
253 | fwait3(); |
||
254 | |||
255 | case tk_double: |
||
256 | |||
257 | op(0xdd); |
||
258 | |||
259 | fwait3(); |
||
260 | |||
261 | |||
262 | |||
263 | } |
||
264 | |||
265 | razr=r16; |
||
266 | |||
267 | if(am32||(itok.flag&f_far)){ |
||
268 | |||
269 | rettype=tk_dword; |
||
270 | |||
271 | rrettype=rettype; |
||
272 | |||
273 | goto getfromax; |
||
274 | |||
275 | else unuseableinput(); |
||
276 | |||
277 | >2){ |
||
278 | |||
279 |