Subversion Repositories Kolibri OS

Rev

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
>
278
 
279