/programs/demos/3DS/A_PROCS.INC |
---|
1,3 → 1,104 |
do_sinus: |
.x equ [ebp-8] |
.y equ [ebp-12] |
.new_y equ [ebp-16] |
.temp equ [ebp-20] |
push ebp |
mov ebp,esp |
sub esp,64 |
mov dword .x,0 |
mov dword .y,0 |
mov esi,[screen_ptr] |
mov edi,[Zbuffer_ptr] |
push edi |
; clear Zbuffer temporally used as image buffer |
mov ecx,SIZE_X*SIZE_Y |
xor eax,eax |
cld |
rep stosd |
pop edi |
; movzx eax,[sinus_flag] |
; mov edx,10 |
; mul edx |
; mov [sin_amplitude],eax |
; mov [sin_frq],eax |
fninit |
;if Ext = SSE2 |
; movups xmm1,[const0123] ; xmm1 - init values |
; mov eax,0x000000ff |
; movd xmm2,eax |
; shufps xmm2,xmm2,0 ; xmm2 - mask value |
; mov eax,4 |
; movd xmm3,eax |
; shufps xmm3,xmm3,0 |
.again: |
if 0 |
fild dword .x |
fidiv [sin_frq] |
fsin |
fimul [sin_amplitude] |
fiadd dword .y |
fistp dword .new_y |
else |
fild dword .x |
fmul [sin_frq] |
fistp dword .temp |
mov eax, .temp |
; mov bx, [angle_x] |
; add bx, [angle_y] |
; movzx ebx,bx |
; shr ebx,1 ; change phase |
; add eax,ebx |
and eax, 0x000000ff |
; cdq |
; mul [sin_frq] |
; and eax,0x000000ff |
; and ax,0x00ff |
; cwde |
fld dword [sin_tab+eax*4] |
fimul dword [sin_amplitude] |
fiadd dword .y |
fistp dword .new_y |
end if |
mov eax,.new_y |
or eax,eax |
jl .skip |
cmp eax,SIZE_Y |
jg .skip |
; mov edx,SIZE_X |
; mul edx |
shl eax,9 |
add eax,dword .x |
lea ebx,[eax*3] |
mov eax,[esi] |
mov [edi+ebx],eax |
.skip: |
add esi,3 |
inc dword .x |
cmp dword .x,SIZE_X |
jl .again |
mov dword .x,0 |
inc dword .y |
cmp dword .y,SIZE_Y |
jl .again |
; copy from temporary buffer -> Zbuffer to screen |
mov esi,[Zbuffer_ptr] |
mov edi,[screen_ptr] |
mov ecx,SIZE_X*SIZE_Y*3/4 |
cld |
rep movsd |
mov esp,ebp |
pop ebp |
ret |
draw_dots: |
mov esi,[points_translated_ptr] |
movzx ecx,[points_count_var] |
/programs/demos/3DS/BUMP_CAT.INC |
---|
954,6 → 954,19 |
movq mm2,.dby |
movq mm3,.dey |
end if |
if Ext >= SSE2 |
mov eax,TEXTURE_SIZE |
movd xmm1,eax |
shufps xmm1,xmm1,0 |
push dword TEX_X |
push dword -TEX_X |
push dword 1 |
push dword -1 |
movups xmm2,[esp] |
movd xmm3,.bmap |
shufps xmm3,xmm3,0 |
end if |
;align 16 |
.draw: |
; if TEX = SHIFTING ;bump drawing only in shifting mode |
977,6 → 990,35 |
shl eax,TEX_SHIFT ;- |
add esi,eax ;- ; esi - current bump map index |
if Ext = SSE2 |
movd xmm0,esi |
shufps xmm0,xmm0,0 |
paddd xmm0,xmm2 |
pand xmm0,xmm1 |
paddd xmm0,xmm3 |
movd ebx,xmm0 |
movzx eax,byte[ebx] |
; |
; shufps xmm0,xmm0,11100001b |
psrldq xmm0,4 |
movd ebx,xmm0 |
movzx ebx,byte[ebx] |
sub eax,ebx |
; |
; shufps xmm0,xmm0,11111110b |
psrldq xmm0,4 |
movd ebx,xmm0 |
movzx edx, byte [ebx] |
; |
; shufps xmm0,xmm0,11111111b |
psrldq xmm0,4 |
movd ebx,xmm0 |
movzx ebx, byte [ebx] |
sub edx,ebx |
; |
else |
mov ebx,esi |
dec ebx |
and ebx,TEXTURE_SIZE |
1004,6 → 1046,7 |
movzx ebx,byte [ebx] |
sub edx,ebx |
end if |
; eax - horizontal sub |
; edx - vertical sub |
if Ext = NON |
/programs/demos/3DS/BUMP_TEX.INC |
---|
1559,18 → 1559,18 |
push dword .tx1 ; .ctx |
push dword .ty1 ; .cty |
push edi ; .c_scr |
;if Ext = SSE2 |
; mov eax,TEXTURE_SIZE |
; movd xmm1,eax |
; shufps xmm1,xmm1,0 |
; push dword TEX_X |
; push dword -TEX_X |
; push dword 1 |
; push dword -1 |
; movups xmm2,[esp] |
; movd xmm3,.bmap |
; shufps xmm3,xmm3,0 |
;end if |
if Ext = SSE2 |
mov eax,TEXTURE_SIZE |
movd xmm1,eax |
shufps xmm1,xmm1,0 |
push dword TEX_X |
push dword -TEX_X |
push dword 1 |
push dword -1 |
movups xmm2,[esp] |
movd xmm3,.bmap |
shufps xmm3,xmm3,0 |
end if |
if Ext>=MMX |
movq mm7,.cty |
1602,58 → 1602,65 |
shl eax,TEX_SHIFT |
add esi,eax ;- ; esi - current bump map index |
;if Ext = SSE2 |
if Ext = SSE2 |
movd xmm0,esi |
shufps xmm0,xmm0,0 |
paddd xmm0,xmm2 |
pand xmm0,xmm1 |
paddd xmm0,xmm3 |
movd ebx,xmm0 |
movzx eax,byte[ebx] |
; |
; movd xmm0,esi |
; shufps xmm0,xmm0,0 |
; paddd xmm0,xmm2 |
; pand xmm0,xmm1 |
; paddd xmm0,xmm3 |
; |
; movd ebx,xmm0 |
; movzx eax,byte[ebx] |
; |
; shufps xmm0,xmm0,11100001b |
; movd ebx,xmm0 |
; movzx ebx,byte[ebx] |
; sub eax,ebx |
psrldq xmm0,4 |
movd ebx,xmm0 |
movzx ebx,byte[ebx] |
sub eax,ebx |
; |
; shufps xmm0,xmm0,11111110b |
; movd ebx,xmm0 |
; movzx edx, byte [ebx] |
psrldq xmm0,4 |
movd ebx,xmm0 |
movzx edx, byte [ebx] |
; |
; shufps xmm0,xmm0,11111111b |
; movd ebx,xmm0 |
; movzx ebx, byte [ebx] |
; sub edx,ebx |
psrldq xmm0,4 |
movd ebx,xmm0 |
movzx ebx, byte [ebx] |
sub edx,ebx |
; |
;else |
mov ebx,esi |
dec ebx |
else |
; mov ebx,esi |
; dec ebx |
lea ebx,[esi-1] |
and ebx,TEXTURE_SIZE |
add ebx,.bmap |
movzx eax,byte [ebx] |
mov ebx,esi |
inc ebx |
; mov ebx,esi |
; inc ebx |
lea ebx,[esi+1] |
and ebx,TEXTURE_SIZE |
add ebx,.bmap |
movzx ebx,byte [ebx] |
sub eax,ebx |
mov ebx,esi |
sub ebx,TEX_X |
; mov ebx,esi |
; sub ebx,TEX_X |
lea ebx,[esi-TEX_X] |
and ebx,TEXTURE_SIZE |
add ebx,.bmap |
movzx edx,byte [ebx] |
mov ebx,esi |
add ebx,TEX_X |
; mov ebx,esi |
; add ebx,TEX_X |
lea ebx,[esi+TEX_X] |
and ebx,TEXTURE_SIZE |
add ebx,.bmap |
movzx ebx,byte [ebx] |
sub edx,ebx |
;end if |
end if |
; eax - horizontal sub modificated x coord |
; edx - vertical sub modificated y coord |
/programs/demos/3DS/DATA.INC |
---|
30,6 → 30,9 |
angle_x dw 0 |
angle_y dw 0 |
angle_z dw 0 |
sin_amplitude dd 50 |
sin_frq dd 0.7 |
sin_delta dd 0.07 ; wave frequency granularity |
menu: |
125,7 → 128,7 |
db 17 |
db 'move ' |
db 2 |
db 3 |
move_flag db 0 |
dd move_f |
165,6 → 168,12 |
dec_bright_flag db 0 ;1 |
dd blur_f |
db 24 |
db 'wav effect' |
db 2 |
sinus_flag db 0 |
dd onoff_f |
; db 24 |
; db 'max ' |
; db 2 |
251,6 → 260,7 |
move_f: |
db 'obj ' |
db 'camr' |
db 'wave' |
; db 'lght' |
bumps_f: |
db 'rand' |
/programs/demos/3DS/GRD_LINE.INC |
---|
61,23 → 61,23 |
movq [.cz],mm0 |
movq [.cg],mm1 |
elseif Ext >= SSE2 |
movups xmm1,[.cz] |
; movups xmm1,[.cz] |
paddd xmm1,xmm0 |
movups [.cz],xmm1 |
; movups [.cz],xmm1 |
end if |
} |
macro .draw_pixel |
{ |
mov [esi],ebx ; actualize Z buffer |
;if Ext=SSE2 |
; movups xmm2,[.cb] |
; shufps xmm1,xmm1,11000110b |
; pand xmm1,[.mask] |
; psrld xmm2,ROUND |
; packssdw xmm2,xmm2 |
; packuswb xmm2,xmm2 |
; movss [edi],xmm2 |
;else |
if Ext=SSE2 |
movaps xmm7,xmm1 ;[.cb] ;;xmm1 |
shufps xmm7,xmm7,00111001b |
psrld xmm7,ROUND |
packssdw xmm7,xmm7 |
packuswb xmm7,xmm7 |
pand xmm7,xmm6 ;[.mask] |
movd [edi],xmm7 |
else |
mov eax,[.cb] |
sar eax,ROUND |
90,7 → 90,7 |
mov edx,[.cr] |
sar edx,ROUND |
mov [edi+2],dl |
;end if |
end if |
; shl ebx,16 |
; or eax,ebx |
; mov [edi],eax |
208,8 → 208,15 |
movsx ebx,word[.z1] |
shl ebx,ROUND |
mov [.cz],ebx |
if Ext = SSE2 |
movups xmm1,[.cz] |
end if |
.hdraw: |
if Ext = SSE2 |
movd ebx,xmm1 |
else |
mov ebx,[.cz] |
end if |
cmp [esi],ebx |
jle .skip |
267,8 → 274,16 |
movsx ebx,word[.z1] |
shl ebx,ROUND |
mov [.cz],ebx |
if Ext = SSE2 |
movups xmm1,[.cz] |
end if |
.v_draw: |
if Ext = SSE2 |
movd ebx,xmm1 |
else |
mov ebx,[.cz] |
end if |
cmp [esi],ebx |
jle @f |
331,7 → 346,11 |
shl ebx,ROUND |
mov [.cz],ebx |
.d45_draw: |
if Ext = SSE2 |
movd ebx,xmm1 |
else |
mov ebx,[.cz] |
end if |
cmp [esi],ebx |
jle @f |
400,6 → 419,9 |
movsx ebx,word[.z1] |
shl ebx,ROUND |
mov [.cz],ebx |
if Ext = SSE2 |
movups xmm1,[.cz] |
end if |
movsx ebx,word[.x1] |
shl ebx,ROUND |
mov [.ccoord],ebx ; .ccoord -> x coordinate |
412,7 → 434,11 |
add edi,ebx |
add esi,ebx |
add esi,eax |
if Ext = SSE2 |
movd ebx,xmm1 |
else |
mov ebx,[.cz] |
end if |
cmp [esi],ebx |
jle @f |
480,6 → 506,9 |
movsx ebx,word[.z1] |
shl ebx,ROUND |
mov [.cz],ebx |
if Ext = SSE2 |
movups xmm1,[.cz] |
end if |
movsx ebx,word[.y1] |
shl ebx,ROUND |
mov [.ccoord],ebx ; .ccoord -> y coordinate |
495,7 → 524,11 |
lea eax,[eax*3] |
add esi,eax |
add edi,eax |
if Ext = SSE2 |
movd ebx,xmm1 |
else |
mov ebx,[.cz] |
end if |
cmp [esi],ebx |
jle @f |
553,12 → 586,12 |
movq mm3,[.dg] |
else if Ext >= SSE2 |
movups xmm0,[.dz] |
movups xmm6,[.mask] |
end if |
ret |
;align 16 |
;.mask: |
; dq 0xffffffffffffffff |
; dq 0xffffffff00000000 |
.mask: |
dq 0xffffffff00ffffff |
dq 0xffffffffffffffff |
/programs/demos/3DS/VIEW3DS.ASM |
---|
1,5 → 1,5 |
; application : View3ds ver. 0.062 - tiny .3ds files viewer. |
; application : View3ds ver. 0.063 - tiny .3ds files viewer. |
; compiler : FASM |
; system : KolibriOS |
; author : Macgub aka Maciej Guba |
265,16 → 265,19 |
; |
cmp ah,30 |
jne .next |
cmp [move_flag],1 |
je @f |
cmp [move_flag],0 |
jne @f |
; cmp [move_flag],2 |
; je .set_light1 |
sub [vect_y],10 |
jmp .next |
@@: |
cmp [move_flag],1 |
jne @f |
sub [yobs],10 ; observator = camera position |
jmp .next |
@@: |
sub [sin_amplitude],10 |
;-------------------------------------------------- |
; .set_light1: ; r - |
; movzx ebx,[light_no_flag] ; * 22 |
296,7 → 299,6 |
jne .next1 |
cmp [move_flag],1 |
je @f |
add [vect_z],10 |
jmp .next1 |
@@: |
304,23 → 306,37 |
.next1: |
cmp ah,33 |
jne .next2 |
cmp [move_flag],1 |
je @f |
cmp [move_flag],0 |
jne @f |
sub [vect_x],10 |
jmp .next2 |
@@: |
cmp [move_flag],1 |
jne @f |
sub [xobs],10 ; observator = camera position |
jmp .next2 |
@@: |
fninit |
fld [sin_frq] |
fsub [sin_delta] |
fstp [sin_frq] |
.next2: |
cmp ah,32 |
jne .next3 |
cmp [move_flag],1 |
je @f |
cmp [move_flag],0 |
jne @f |
add [vect_x],10 |
jmp .next3 |
@@: |
cmp [move_flag],1 |
jne @f |
add [xobs],10 ; observator = camera position |
jmp .next3 |
@@: |
fninit |
fld [sin_frq] ; change wave effect frequency |
fadd [sin_delta] |
fstp [sin_frq] |
.next3: |
cmp ah,34 |
jne .next4 |
334,14 → 350,18 |
.next4: |
cmp ah,35 |
jne .next5 |
cmp [move_flag],1 |
je @f |
cmp [move_flag],0 |
jne @f |
; call add_vector |
add [vect_y],10 |
jmp .next5 |
@@: |
cmp [move_flag],1 |
jne @f |
add [yobs],10 ; observator = camera position |
jmp .next5 |
@@: |
add [sin_amplitude],10 |
.next5: |
435,6 → 455,10 |
@@: |
call draw_triangles ; draw all triangles from the list |
.blurrr: |
cmp [sinus_flag],0 |
je @f |
call do_sinus |
@@: |
cmp [fire_flag],0 |
jne @f |
cmp [blur_flag],0 |
629,7 → 653,7 |
end if |
.no_min: |
end if |
;========================commented===================================== |
RDTSC |
sub eax,[esp] |
sub eax,41 |
648,7 → 672,7 |
mov eax,7 ; put image |
mov ebx,screen |
mov ecx,SIZE_X shl 16 + SIZE_Y |
mov edx,5 shl 16 + 23 |
mov edx,5 shl 16 + 25 |
int 0x40 |
mov eax,13 |
2789,7 → 2813,15 |
int 0x40 ; -> allocate memory to edges |
mov [edges_ptr], eax ; -> eax = pointer to allocated mem |
mov eax,-1 ; fill edges list |
movzx ecx,[triangles_count_var] ; importand if object generated |
shr ecx,2 |
inc ecx |
mov edi,[edges_ptr] |
cld |
rep stosd |
; mov eax, 68 |
; mov ebx, 12 |
; movzx ecx, [triangles_count_var] |
2978,7 → 3010,7 |
mov ebx,100*65536;+SIZE_X;+80+30 ; [x start] *65536 + [x size] |
mov ecx,100*65536;+SIZE_Y;+30 ; [y start] *65536 + [y size] |
mov bx,[size_x] |
add bx,114 |
add bx,115 |
mov cx,[size_y] |
add cx,30 |
mov edx,0x14000000 ; color of work area RRGGBB,8->color gl |