Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6107 → Rev 6108

/programs/develop/libraries/TinyGL/asm_fork/ztriangle.asm
1,3 → 1,9
;
; Макрос DRAW_LINE имеет параметр code, от которого зависит
; будет ли включен код или объявлены переменные.
; В версии на C++ параметра code нет, потому что там переменные
; можно ставить в любом месте функции, в asm версии такое не проходит.
;
 
INTERP_Z equ 1
 
111,8 → 117,6
end if
}
 
;;;DRAW_LINE_M equ 1
 
macro DRAW_LINE code
{
local .cycle_0
119,13 → 123,9
local .cycle_1
if TGL_FEATURE_RENDER_BITS eq 16
if code eq 0
pz dd ? ;uint*
tmp dd ? ;uint
z dd ? ;uint
zz dd ? ;uint
rgb dd ? ;uint
drgbdx dd ? ;uint
n dd ? ;int
end if
if code eq 1
mov eax,[x2]
132,13 → 132,27
sar eax,16
sub eax,[x1]
mov [n],eax ;n = (x2 >> 16) - x1
; pp=pp1+x1;
; pz=pz1+x1;
; z=z1;
; rgb=(r1 << 16) & 0xFFC00000;
; rgb|=(g1 >> 5) & 0x000007FF;
; rgb|=(b1 << 5) & 0x001FF000;
; drgbdx=_drgbdx;
mov edi,[pp1]
add edi,[x1] ;pp = pp1 + x1
mov eax,[pz1]
add eax,[x1]
mov [pz],eax ;pz = pz1 + x1
mov eax,[z1]
mov [z],eax ;z = z1
mov eax,[r1]
shl eax,16
and eax,0xFFC00000
mov [rgb],eax ;rgb = (r1 << 16) & 0xFFC00000
mov eax,[g1]
shr eax,5
and eax,0x000007FF
or [rgb],eax ;rgb |= (g1 >> 5) & 0x000007FF
mov eax,[b1]
shl eax,5
and eax,0x001FF000
or [rgb],eax ;rgb |= (b1 << 5) & 0x001FF000
mov eax,[_drgbdx]
mov [drgbdx],eax ;drgbdx = _drgbdx
align 4
.cycle_0: ;while (n>=3)
cmp dword[n],3
148,7 → 162,7
PUT_PIXEL 2
PUT_PIXEL 3
add dword[pz],8
add edi,4
add edi,4*3
sub [n],4
jmp .cycle_0
.cycle_1: ;while (n>=0)
156,7 → 170,7
jl .cycle_1_end
PUT_PIXEL 0
add dword[pz],2
inc edi
add edi,3
dec dword[n]
jmp .cycle_1
.cycle_1_end:
202,11 → 216,16
;edi = pp
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
if TGL_FEATURE_RENDER_BITS eq 24
; unsigned char *ptr;
; ptr = texture + (((t & 0x3FC00000) | s) >> 14) * 3;
; pp[3 * _a]= ptr[0];
; pp[3 * _a + 1]= ptr[1];
; pp[3 * _a + 2]= ptr[2];
mov ebx,[t]
and ebx,0x3fc00000
or ebx,[s]
shr ebx,14
imul ebx,3
add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
mov ax,word[ebx]
mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
mov al,byte[ebx+2]
mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
else
; pp[_a]=texture[((t & 0x3FC00000) | s) >> 14];
end if
242,11 → 261,17
mov eax,[zb]
mov eax,[eax+offs_zbuf_current_texture]
mov [texture],eax
mov dword[esp-4],NB_INTERP
fild dword[esp-4]
fild dword[dzdx]
fstp dword[fdzdx]
; fndzdx=NB_INTERP * fdzdx;
; ndszdx=NB_INTERP * dszdx;
; ndtzdx=NB_INTERP * dtzdx;
fst dword[fdzdx] ;fdzdx = (float)dzdx
fmul st0,st1
fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx
fld dword[fdzdx]
fmul st0,st1
fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx
fmul dword[dtzdx]
fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx
}
 
macro PUT_PIXEL _a
261,11 → 286,18
;edi = pp
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
if TGL_FEATURE_RENDER_BITS eq 24
; unsigned char *ptr;
; ptr = texture + (((t & 0x3FC00000) | (s & 0x003FC000)) >> 14) * 3;
; pp[3 * _a]= ptr[0];
; pp[3 * _a + 1]= ptr[1];
; pp[3 * _a + 2]= ptr[2];
mov ebx,[t]
and ebx,0x3fc00000
mov eax,[s]
and eax,0x003fc000
or ebx,eax
shr ebx,14
imul ebx,3
add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
mov ax,word[ebx]
mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
mov al,byte[ebx+2]
mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
else
; pp[_a]=*(PIXEL *)((char *)texture+
; (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
285,69 → 317,109
{
if TGL_FEATURE_RENDER_BITS eq 24
if code eq 0
pz dd ? ;uint *
s dd ? ;uint
t dd ? ;uint
z dd ? ;uint
zz dd ? ;uint
n1 dd ? ;int - длинна горизонтальной линии в пикселях
dsdx dd ? ;int
dtdx dd ? ;int
s_z dd ? ;float
t_z dd ? ;float
fz dd ? ;float
zinv dd ? ;float
end if
if code eq 1
; n1=(x2>>16)-x1;
; fz=(float)z1;
; zinv=1.0 / fz;
; pp=(pp1 + x1 * PSZB);
; pz=pz1+x1;
; z=z1;
; sz=sz1;
; tz=tz1;
; while (n1>=(NB_INTERP-1)) {
; {
; float ss,tt;
; ss=(sz * zinv);
; tt=(tz * zinv);
; s=(int) ss;
; t=(int) tt;
; dsdx= (int)( (dszdx - ss*fdzdx)*zinv );
; dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );
; fz+=fndzdx;
; zinv=1.0 / fz;
; }
; PUT_PIXEL(0);
; PUT_PIXEL(1);
; PUT_PIXEL(2);
; PUT_PIXEL(3);
; PUT_PIXEL(4);
; PUT_PIXEL(5);
; PUT_PIXEL(6);
; PUT_PIXEL(7);
; pz+=NB_INTERP;
; pp=(pp + NB_INTERP * PSZB);
; n1-=NB_INTERP;
; sz+=ndszdx;
; tz+=ndtzdx;
; }
; {
; float ss,tt;
; ss=(sz * zinv);
; tt=(tz * zinv);
; s=(int) ss;
; t=(int) tt;
; dsdx= (int)( (dszdx - ss*fdzdx)*zinv );
; dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );
; }
; while (n1>=0) {
;;; PUT_PIXEL 0
; pz+=1;
; pp=(PIXEL *)((char *)pp + PSZB);
mov eax,[x2]
sar eax,16
sub eax,[x1]
mov [n1],eax ;n1 = (x2 >> 16) - x1
fld1
fild dword[z1]
fst dword[fz] ;fz = (float)z1
;fld1
fdivp
fstp dword[zinv] ;zinv = 1.0 / fz
mov edi,[x1]
imul edi,PSZB
add edi,[pp1] ;pp = (pp1 + x1 * PSZB)
mov eax,[pz1]
add eax,[x1]
mov [pz],eax ;pz = pz1 + x1
mov eax,[z1]
mov [z],eax ;z = z1
mov eax,[sz1]
mov [s_z],eax ;sz = sz1
mov eax,[tz1]
mov [t_z],eax ;tz = tz1
align 4
.cycle_2: ;while (n1>=(NB_INTERP-1))
cmp dword[n1],NB_INTERP-1
jl .cycle_2_end
fld dword[zinv]
fld st0
fmul dword[s_z] ;ss = (sz * zinv)
fist dword[s] ;s = (int) ss
fmul dword[fdzdx]
fchs
fadd dword[dszdx]
fmul dword[zinv]
fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
fmul dword[t_z] ;tt = (tz * zinv)
fist dword[t] ;t = (int) tt
fmul dword[fdzdx]
fchs
fadd dword[dtzdx]
fmul dword[zinv]
fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
fld1
fld dword[fz]
fadd dword[fndzdx]
fst dword[fz] ;fz += fndzdx
;fld1
fdivp
fstp dword[zinv] ;zinv = 1.0 / fz
PUT_PIXEL 0
PUT_PIXEL 1
PUT_PIXEL 2
PUT_PIXEL 3
PUT_PIXEL 4
PUT_PIXEL 5
PUT_PIXEL 6
PUT_PIXEL 7
add dword[pz],2*NB_INTERP ;pz += NB_INTERP
add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB
sub dword[n1],NB_INTERP ;n1 -= NB_INTERP
fld dword[ndszdx]
fadd dword[s_z]
fstp dword[s_z] ;s_z += ndszdx
fld dword[ndtzdx]
fadd dword[t_z]
fstp dword[t_z] ;tz += ndtzdx
jmp .cycle_2
.cycle_2_end:
fld dword[zinv]
fld st0
fmul dword[s_z] ;ss = (sz * zinv)
fist dword[s] ;s = (int) ss
fmul dword[fdzdx]
fchs
fadd dword[dszdx]
fmul dword[zinv]
fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
fmul dword[t_z] ;tt = (tz * zinv)
fist dword[t] ;t = (int) tt
fmul dword[fdzdx]
fchs
fadd dword[dtzdx]
fmul dword[zinv]
fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
align 4
.cycle_3: ;while (n1>=0)
cmp dword[n1],0
jl .cycle_3_end
PUT_PIXEL 0
add dword[pz],2 ;pz += 1
add edi,PSZB ;pp += PSZB
dec dword[n1]
; }
jmp .cycle_3
.cycle_3_end:
end if
end if
}