Subversion Repositories Kolibri OS

Rev

Rev 5922 | Rev 6111 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5922 Rev 6108
Line -... Line 1...
-
 
1
;
-
 
2
; Макрос DRAW_LINE имеет параметр code, от которого зависит
-
 
3
; будет ли включен код или объявлены переменные.
-
 
4
; В версии на C++ параметра code нет, потому что там переменные
-
 
5
; можно ставить в любом месте функции, в asm версии такое не проходит.
-
 
6
;
Line 1... Line 7...
1
INTERP_Z equ 1
7
 
Line 2... Line 8...
2
 
8
INTERP_Z equ 1
3
macro DRAW_INIT
9
 
Line 109... Line 115...
109
	add [ob1],eax
115
	mov eax,[dbdx]
110
end if
116
	add [ob1],eax
111
}
117
end if
112
 
118
}
Line 113... Line -...
113
;;;DRAW_LINE_M equ 1
-
 
114
 
-
 
115
macro DRAW_LINE code
119
 
116
{
120
macro DRAW_LINE code
117
local .cycle_0
121
{
118
local .cycle_1
122
local .cycle_0
119
if TGL_FEATURE_RENDER_BITS eq 16
123
local .cycle_1
120
if code eq 0
124
if TGL_FEATURE_RENDER_BITS eq 16
121
	pz dd ? ;uint*
-
 
122
	tmp dd ? ;uint
125
if code eq 0
123
	z dd ? ;uint
-
 
124
	zz dd ? ;uint
-
 
125
	rgb dd ? ;uint
126
	tmp dd ? ;uint
126
	drgbdx dd ? ;uint
127
	rgb dd ? ;uint
127
	n dd ? ;int
-
 
128
end if
128
	drgbdx dd ? ;uint
129
if code eq 1
129
end if
130
	mov eax,[x2]
130
if code eq 1
131
	sar eax,16
131
	mov eax,[x2]
132
	sub eax,[x1]
132
	sar eax,16
133
	mov [n],eax ;n = (x2 >> 16) - x1
133
	sub eax,[x1]
-
 
134
	mov [n],eax ;n = (x2 >> 16) - x1
-
 
135
	mov edi,[pp1]
-
 
136
	add edi,[x1] ;pp = pp1 + x1
134
;  pp=pp1+x1;
137
	mov eax,[pz1]
-
 
138
	add eax,[x1]
-
 
139
	mov [pz],eax ;pz = pz1 + x1
-
 
140
	mov eax,[z1]
135
;  pz=pz1+x1;
141
	mov [z],eax ;z = z1
136
;  z=z1;
142
	mov eax,[r1]
-
 
143
	shl eax,16
137
;  rgb=(r1 << 16) & 0xFFC00000;
144
	and eax,0xFFC00000
-
 
145
	mov [rgb],eax ;rgb = (r1 << 16) & 0xFFC00000
-
 
146
	mov eax,[g1]
-
 
147
	shr eax,5
138
;  rgb|=(g1 >> 5) & 0x000007FF;
148
	and eax,0x000007FF
-
 
149
	or [rgb],eax ;rgb |= (g1 >> 5) & 0x000007FF
-
 
150
	mov eax,[b1]
-
 
151
	shl eax,5
139
;  rgb|=(b1 << 5) & 0x001FF000;
152
	and eax,0x001FF000
140
;  drgbdx=_drgbdx;
153
	or [rgb],eax ;rgb |= (b1 << 5) & 0x001FF000
-
 
154
	mov eax,[_drgbdx]
141
align 4
155
	mov [drgbdx],eax ;drgbdx = _drgbdx
142
	.cycle_0: ;while (n>=3)
156
align 4
143
	cmp dword[n],3
157
	.cycle_0: ;while (n>=3)
144
	jl .cycle_1
158
	cmp dword[n],3
145
		PUT_PIXEL 0
159
	jl .cycle_1
146
		PUT_PIXEL 1
160
		PUT_PIXEL 0
147
		PUT_PIXEL 2
161
		PUT_PIXEL 1
148
		PUT_PIXEL 3
162
		PUT_PIXEL 2
149
		add dword[pz],8
163
		PUT_PIXEL 3
150
		add edi,4
164
		add dword[pz],8
151
		sub [n],4
165
		add edi,4*3
152
	jmp .cycle_0
166
		sub [n],4
153
	.cycle_1: ;while (n>=0)
167
	jmp .cycle_0
154
	cmp dword[n],0
168
	.cycle_1: ;while (n>=0)
155
	jl .cycle_1_end
169
	cmp dword[n],0
156
		PUT_PIXEL 0
170
	jl .cycle_1_end
157
		add dword[pz],2
171
		PUT_PIXEL 0
158
		inc edi
172
		add dword[pz],2
159
		dec dword[n]
173
		add edi,3
160
		jmp .cycle_1
174
		dec dword[n]
161
	.cycle_1_end:
175
		jmp .cycle_1
162
end if
176
	.cycle_1_end:
163
end if
177
end if
Line 200... Line 214...
200
	jl .end_0
214
	cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a])
201
		;edi = pp
215
	jl .end_0
202
		mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
216
		;edi = pp
203
if TGL_FEATURE_RENDER_BITS eq 24
217
		mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
204
;   unsigned char *ptr;
218
if TGL_FEATURE_RENDER_BITS eq 24
-
 
219
		mov ebx,[t]
205
;       ptr = texture + (((t & 0x3FC00000) | s) >> 14) * 3;
220
		and ebx,0x3fc00000
-
 
221
		or ebx,[s]
-
 
222
		shr ebx,14
-
 
223
		imul ebx,3
206
;       pp[3 * _a]= ptr[0];
224
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
-
 
225
		mov ax,word[ebx]
207
;       pp[3 * _a + 1]= ptr[1];
226
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
208
;       pp[3 * _a + 2]= ptr[2];
227
		mov al,byte[ebx+2]
209
else
228
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
210
;       pp[_a]=texture[((t & 0x3FC00000) | s) >> 14];
229
else
211
end if
230
;       pp[_a]=texture[((t & 0x3FC00000) | s) >> 14];
212
	.end_0:
231
end if
213
	mov eax,[dzdx]
232
	.end_0:
214
	add [z],eax
233
	mov eax,[dzdx]
Line 240... Line 259...
240
{
259
macro DRAW_INIT
241
	mov eax,[zb]
260
{
242
	mov eax,[eax+offs_zbuf_current_texture]
261
	mov eax,[zb]
243
	mov [texture],eax
262
	mov eax,[eax+offs_zbuf_current_texture]
244
	fild dword[dzdx]
263
	mov [texture],eax
-
 
264
	mov dword[esp-4],NB_INTERP
-
 
265
	fild dword[esp-4]
245
	fstp dword[fdzdx]
266
	fild dword[dzdx]
-
 
267
	fst dword[fdzdx] ;fdzdx = (float)dzdx
-
 
268
	fmul st0,st1
-
 
269
	fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx
246
;  fndzdx=NB_INTERP * fdzdx;
270
	fld dword[fdzdx]
-
 
271
	fmul st0,st1
247
;  ndszdx=NB_INTERP * dszdx;
272
	fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx
248
;  ndtzdx=NB_INTERP * dtzdx;
273
	fmul dword[dtzdx]
249
}
274
	fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx
250
 
275
}
Line 251... Line 276...
251
macro PUT_PIXEL _a
276
 
252
{
277
macro PUT_PIXEL _a
253
local .end_0
278
{
Line 259... Line 284...
259
	jl .end_0
284
	cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a])
260
		;edi = pp
285
	jl .end_0
261
		mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
286
		;edi = pp
262
if TGL_FEATURE_RENDER_BITS eq 24
287
		mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
263
;   unsigned char *ptr;
288
if TGL_FEATURE_RENDER_BITS eq 24
-
 
289
		mov ebx,[t]
-
 
290
		and ebx,0x3fc00000
-
 
291
		mov eax,[s]
264
;       ptr = texture + (((t & 0x3FC00000) | (s & 0x003FC000)) >> 14) * 3;
292
		and eax,0x003fc000
-
 
293
		or ebx,eax
-
 
294
		shr ebx,14
-
 
295
		imul ebx,3
265
;       pp[3 * _a]= ptr[0];
296
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
-
 
297
		mov ax,word[ebx]
266
;       pp[3 * _a + 1]= ptr[1];
298
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
267
;       pp[3 * _a + 2]= ptr[2];
299
		mov al,byte[ebx+2]
268
else
300
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
269
;       pp[_a]=*(PIXEL *)((char *)texture+
301
else
270
;           (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
302
;       pp[_a]=*(PIXEL *)((char *)texture+
271
end if
303
;           (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
272
	.end_0:
304
end if
273
	mov eax,[dzdx]
305
	.end_0:
Line 283... Line 315...
283
macro DRAW_LINE code
315
 
284
{
316
macro DRAW_LINE code
285
if TGL_FEATURE_RENDER_BITS eq 24
317
{
286
if code eq 0
318
if TGL_FEATURE_RENDER_BITS eq 24
287
	pz dd ? ;uint *
-
 
288
	s dd ? ;uint
319
if code eq 0
289
	t dd ? ;uint
320
	s dd ? ;uint
290
	z dd ? ;uint
-
 
291
	zz dd ? ;uint
-
 
292
	n1 dd ? ;int - длинна горизонтальной линии в пикселях
321
	t dd ? ;uint
293
	dsdx dd ? ;int
322
	n1 dd ? ;int - длинна горизонтальной линии в пикселях
294
	dtdx dd ? ;int
323
	dsdx dd ? ;int
295
	s_z dd ? ;float
-
 
296
	t_z dd ? ;float
-
 
297
	fz dd ? ;float
324
	dtdx dd ? ;int
298
	zinv dd ? ;float
325
	fz dd ? ;float
299
end if
326
	zinv dd ? ;float
300
if code eq 1
327
end if
-
 
328
if code eq 1
-
 
329
	mov eax,[x2]
-
 
330
	sar eax,16
301
;  n1=(x2>>16)-x1;
331
	sub eax,[x1]
-
 
332
	mov [n1],eax ;n1 = (x2 >> 16) - x1
-
 
333
fld1
302
;  fz=(float)z1;
334
	fild dword[z1]
-
 
335
	fst dword[fz] ;fz = (float)z1
-
 
336
	;fld1
303
;  zinv=1.0 / fz;
337
	fdivp
-
 
338
	fstp dword[zinv] ;zinv = 1.0 / fz
-
 
339
	mov edi,[x1]
304
;  pp=(pp1 + x1 * PSZB);
340
	imul edi,PSZB
-
 
341
	add edi,[pp1] ;pp = (pp1 + x1 * PSZB)
305
;  pz=pz1+x1;
342
	mov eax,[pz1]
-
 
343
	add eax,[x1]
306
;  z=z1;
344
	mov [pz],eax ;pz = pz1 + x1
-
 
345
	mov eax,[z1]
307
;  sz=sz1;
346
	mov [z],eax ;z = z1
-
 
347
	mov eax,[sz1]
308
;  tz=tz1;
348
	mov [s_z],eax ;sz = sz1
-
 
349
	mov eax,[tz1]
-
 
350
	mov [t_z],eax ;tz = tz1
309
;  while (n1>=(NB_INTERP-1)) {
351
align 4
-
 
352
	.cycle_2: ;while (n1>=(NB_INTERP-1))
310
;    {
353
	cmp dword[n1],NB_INTERP-1
311
;      float ss,tt;
354
	jl .cycle_2_end
-
 
355
		fld dword[zinv]
312
;      ss=(sz * zinv);
356
		fld st0
313
;      tt=(tz * zinv);
357
		fmul dword[s_z] ;ss = (sz * zinv)
-
 
358
		fist dword[s] ;s = (int) ss
-
 
359
		fmul dword[fdzdx]
314
;      s=(int) ss;
360
		fchs
315
;      t=(int) tt;
361
		fadd dword[dszdx]
316
;      dsdx= (int)( (dszdx - ss*fdzdx)*zinv );
362
		fmul dword[zinv]
-
 
363
		fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
-
 
364
		fmul dword[t_z] ;tt = (tz * zinv)
-
 
365
		fist dword[t] ;t = (int) tt
-
 
366
		fmul dword[fdzdx]
-
 
367
		fchs
-
 
368
		fadd dword[dtzdx]
317
;      dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );
369
		fmul dword[zinv]
-
 
370
		fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
-
 
371
fld1
318
;      fz+=fndzdx;
372
		fld dword[fz]
319
;      zinv=1.0 / fz;
373
		fadd dword[fndzdx]
-
 
374
		fst dword[fz] ;fz += fndzdx
320
;    }
375
		;fld1
-
 
376
		fdivp
321
;    PUT_PIXEL(0);
377
		fstp dword[zinv] ;zinv = 1.0 / fz
322
;    PUT_PIXEL(1);
378
		PUT_PIXEL 0
323
;    PUT_PIXEL(2);
379
		PUT_PIXEL 1
324
;    PUT_PIXEL(3);
380
		PUT_PIXEL 2
325
;    PUT_PIXEL(4);
381
		PUT_PIXEL 3
326
;    PUT_PIXEL(5);
382
		PUT_PIXEL 4
327
;    PUT_PIXEL(6);
383
		PUT_PIXEL 5
328
;    PUT_PIXEL(7);
384
		PUT_PIXEL 6
329
;    pz+=NB_INTERP;
385
		PUT_PIXEL 7
330
;    pp=(pp + NB_INTERP * PSZB);
386
		add dword[pz],2*NB_INTERP ;pz += NB_INTERP
331
;    n1-=NB_INTERP;
387
		add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB
332
;    sz+=ndszdx;
388
		sub dword[n1],NB_INTERP ;n1 -= NB_INTERP
-
 
389
		fld dword[ndszdx]
-
 
390
		fadd dword[s_z]
333
;    tz+=ndtzdx;
391
		fstp dword[s_z] ;s_z += ndszdx
-
 
392
		fld dword[ndtzdx]
-
 
393
		fadd dword[t_z]
-
 
394
		fstp dword[t_z] ;tz += ndtzdx
-
 
395
		jmp .cycle_2
-
 
396
	.cycle_2_end:
334
;  }
397
	fld dword[zinv]
-
 
398
	fld st0
-
 
399
	fmul dword[s_z] ;ss = (sz * zinv)
-
 
400
	fist dword[s] ;s = (int) ss
335
;    {
401
	fmul dword[fdzdx]
336
;      float ss,tt;
402
	fchs
337
;      ss=(sz * zinv);
403
	fadd dword[dszdx]
-
 
404
	fmul dword[zinv]
338
;      tt=(tz * zinv);
405
	fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
339
;      s=(int) ss;
406
	fmul dword[t_z] ;tt = (tz * zinv)
340
;      t=(int) tt;
407
	fist dword[t] ;t = (int) tt
-
 
408
	fmul dword[fdzdx]
341
;      dsdx= (int)( (dszdx - ss*fdzdx)*zinv );
409
	fchs
-
 
410
	fadd dword[dtzdx]
342
;      dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );
411
	fmul dword[zinv]
343
;    }
412
	fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
344
;  while (n1>=0) {
413
align 4
-
 
414
	.cycle_3: ;while (n1>=0)
-
 
415
	cmp dword[n1],0
345
;;;		PUT_PIXEL 0
416
	jl .cycle_3_end
346
;    pz+=1;
417
		PUT_PIXEL 0
347
;    pp=(PIXEL *)((char *)pp + PSZB);
418
		add dword[pz],2 ;pz += 1
348
		dec dword[n1]
419
		add edi,PSZB ;pp += PSZB
349
;  }
420
		dec dword[n1]
-
 
421
		jmp .cycle_3
350
end if
422
	.cycle_3_end:
351
end if
423
end if
352
}
424
end if
Line 353... Line 425...
353
 
425
}