kolibrios/programs/develop/libraries/buf2d/trunk/fun_voxel.inc
IgorA 1c3a46e4d1 modify function 'buf2d_resize',
split file 'buf2d.asm'

git-svn-id: svn://kolibrios.org@6175 a494cfbc-eb01-0410-851d-a64ba20cac60
2016-02-08 22:26:02 +00:00

1330 lines
27 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
;*** ä㭪樨 ¤«ï à ¡®âë á ¢®ªá¥«ì­®© £à ä¨ª®© ***
;
vox_offs_tree_table equ 4
vox_offs_data equ 12
;ᮧ¤ ­¨¥ ¢®ªá¥«ì­ëå ª¨á⥩
align 4
proc vox_brush_create uses eax ebx ecx edi, h_br:dword, buf_z:dword
mov edi,[h_br]
movzx ecx,byte[edi+3]
add edi,4
; *** ᮧ¤ ­¨¥ ¥¤¨­¨ç­®© ª¨á⨠***
mov eax,[buf_z]
mov buf2d_data,eax
movzx eax,byte[edi-4] ;è¨à¨­  ¥¤¨­¨ç­®© ª¨áâ¨
mov buf2d_w,eax ;è¨à¨­  ¡ãä¥à 
movzx eax,byte[edi-4+1] ;¢ëá®â  ¥¤¨­¨ç­®© ª¨áâ¨
mov buf2d_h,eax ;¢ëá®â  ¡ãä¥à 
mov buf2d_size_lt,0 ;®âáâ㯠᫥¢  ¨ á¯à ¢  ¤«ï ¡ãä¥à 
mov buf2d_color,0 ;梥â ä®­  ¡ãä¥à 
mov buf2d_bits,32 ;ª®«¨ç¥á⢮ ¡¨â ¢ 1-© â®çª¥ ¨§®¡à ¦¥­¨ï
; *** ᮧ¤ ­¨¥ á«¥¤ãîé¨å ª¨á⥩ ***
cmp ecx,1
jl .end_creat
movzx ebx,byte[edi-4+2] ;¢ëá®â  ®á­®¢ ­¨ï ¥¤¨­¨ç­®© ª¨áâ¨
shr ebx,1
cld
@@:
mov eax,edi
add edi,BUF_STRUCT_SIZE
stdcall vox_create_next_brush, eax, edi, ebx
shl ebx,1
loop @b
.end_creat:
ret
endp
;㤠«¥­¨¥ ¢®ªá¥«ì­ëå ª¨á⥩
align 4
proc vox_brush_delete uses ecx edi, h_br:dword
mov edi,[h_br]
movzx ecx,byte[edi+3]
add edi,4
; *** 㤠«¥­¨¥ ª¨á⥩ ***
cmp ecx,1
jl .end_delete
cld
@@:
add edi,BUF_STRUCT_SIZE
stdcall buf_delete, edi
loop @b
.end_delete:
ret
endp
;äã­ªæ¨ï ¤«ï ᮧ¤ ­¨ï ¢®ªá¥«ï á«¥¤ãî饣® ¯®à浪 
; buf_v1 - ¡ãä¥à á ¨á室­ë¬ ¢®ªá¥«¥¬
; buf_v2 - ¡ãä¥à á 㢥«¨ç¥­ë¬ ¢®ªá¥«¥¬
; h - ¢ëá®â  ®á­®¢ ­¨ï ¨á室­®£® ¢®ªá¥«ï : 2
align 4
proc vox_create_next_brush uses eax ebx ecx edx edi, buf_v1:dword, buf_v2:dword, h:dword
mov edi,[buf_v1]
mov ebx,buf2d_h
mov ecx,buf2d_w
mov edi,[buf_v2]
mov buf2d_h,ebx
shl buf2d_h,1
mov buf2d_w,ecx
shl buf2d_w,1
mov buf2d_color,0
mov buf2d_bits,32
stdcall buf_create, [buf_v2] ;ᮧ¤ ­¨¥ ¡ãä¥à  £«ã¡¨­ë
shr ecx,1
mov edx,[h]
shl edx,1
sub ebx,edx
;ecx - è¨à¨­  ¨á室­®£® ¢®ªá¥«ï : 2
;ebx - ¢ëá®â  ¨á室­®£® ¢®ªá¥«ï (¡¥§ ®á­®¢ ­¨ï)
;edx - ¢ëá®â  ®á­®¢ ­¨ï ¨á室­®£® ¢®ªá¥«ï
mov eax,[h]
cmp eax,0
je @f
stdcall vox_add, [buf_v2], [buf_v1], ecx,0,0
stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,0
stdcall vox_add, [buf_v2], [buf_v1], 0,eax,eax
push eax ;stdcall ...
add eax,ebx
stdcall vox_add, [buf_v2], [buf_v1], 0,eax ;,...
sub eax,ebx
shl ecx,1
;ecx - è¨à¨­  ¨á室­®£® ¢®ªá¥«ï
stdcall vox_add, [buf_v2], [buf_v1], ecx,eax,eax
push eax ;stdcall ...,[h]
add eax,ebx
stdcall vox_add, [buf_v2], [buf_v1], ecx,eax;,[h]
;sub eax,ebx
shr ecx,1
;ecx - è¨à¨­  ¨á室­®£® ¢®ªá¥«ï : 2
stdcall vox_add, [buf_v2], [buf_v1], ecx,edx,edx
add ebx,edx
stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,edx
jmp .end_0
@@:
;¥á«¨ h = 0, ⮣¤  ¯®«ãç ¥¬ ª¨áâì ­  2 £à ­¨
;¢ â ª®¬ á«ãç ¥ ¤«ï ¯®«ã祭¨ï £«ã¡¨­ë ¡¥à¥¬ è¨à¨­ã / 2
mov eax,ecx
;2 «¥¢ëå ¢®ªá¥«ï
stdcall vox_add, [buf_v2], [buf_v1], 0,0,eax
stdcall vox_add, [buf_v2], [buf_v1], 0,ebx,eax
shl eax,1
;2 業âà «ì­ëå ¯¥à¥¤­¨å ¢®ªá¥«ï (§ ¤­¨¥ 業âà «ì­ë¥ ­¥ ¢ë¢®¤¨¬)
stdcall vox_add, [buf_v2], [buf_v1], ecx,0,eax
stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,eax
shr eax,1
shl ecx,1
;2 ¯à ¢ëå ¢®ªá¥«ï
stdcall vox_add, [buf_v2], [buf_v1], ecx,0,eax
stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,eax
.end_0:
ret
endp
;
align 4
proc vox_add, buf_v1:dword, buf_v2:dword, coord_x:dword, coord_y:dword, coord_z:dword
pushad
mov ebx,[coord_x]
mov eax,[coord_y]
mov edi,[buf_v2]
mov ecx,buf2d_h
mov esi,buf2d_w
imul ecx,esi
add esi,ebx
mov edx,buf2d_data
cld
;ecx - count pixels in voxel
;edx - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢ ¢®ªá¥«ì­®¬ ¡ãä¥à¥
;edi - 㪠§ â¥«ì ­  ¢®ªá¥«ì­ë© ¡ãä¥à
;esi - width voxel buffer add coord x
.cycle:
cmp dword[edx],0
je @f
;¯à®¢¥à塞 ¡ãä¥à £«ã¡¨­ë
push eax ecx edi esi
mov ecx,eax
mov edi,[buf_v1]
call get_pixel_32 ;stdcall buf_get_pixel, [buf_v1],ebx,ecx
mov esi,[edx]
add esi,[coord_z]
cmp eax,esi
jge .end_draw
stdcall buf_set_pixel, [buf_v1],ebx,ecx,esi ;esi = new coord z
.end_draw:
pop esi edi ecx eax
@@:
add edx,4
inc ebx
cmp ebx,esi
jl @f
inc eax
sub ebx,buf2d_w
@@:
loop .cycle
popad
ret
endp
;description:
; ¢®§¢à è ¥â è¨à¨­ã ¢®ªá¥«ì­®£® ¨§®¡à ¦¥­¨ï á 3-¬ï £à ­ï¬¨
; ¯à¨­¨¬ ¥â 㪠§ â¥«ì ­  ª¨áâì ¨ ¬ áèâ ¡
align 4
proc buf_vox_obj_get_img_w_3g uses ecx, h_br:dword,k_scale:dword
mov ecx,[h_br]
movzx eax,byte[ecx]
cmp dword[k_scale],1
jl .end_c0
mov ecx,[k_scale]
shl eax,cl
.end_c0:
ret
endp
;description:
; ¢®§¢à è ¥â ¢ëá®âã ¢®ªá¥«ì­®£® ¨§®¡à ¦¥­¨ï á 3-¬ï £à ­ï¬¨
; ¯à¨­¨¬ ¥â 㪠§ â¥«ì ­  ª¨áâì ¨ ¬ áèâ ¡
align 4
proc buf_vox_obj_get_img_h_3g uses ecx, h_br:dword,k_scale:dword
mov ecx,[h_br]
movzx eax,byte[ecx+1]
cmp dword[k_scale],1
jl .end_c0
mov ecx,[k_scale]
shl eax,cl
.end_c0:
ret
endp
;description:
; äã­ªæ¨ï à¨áãîé ï ¢®ªá¥«ì­ë© ®¡ê¥ªâ (¢¨¤­  1 £à ­ì)
;input:
; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â )
; buf_z - ¡ãä¥à £«ã¡¨­ë (32 ¡¨â  ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥­ ᮢ¯ ¤ âì á buf_i)
align 4
proc buf_vox_obj_draw_1g, buf_i:dword, buf_z:dword, v_obj:dword, coord_x:dword,\
coord_y:dword, k_scale:dword
cmp [k_scale],0
jl .end_f
pushad
mov edi,[buf_i]
cmp buf2d_bits,24
jne .error1
mov edi,[buf_z]
cmp buf2d_bits,32
jne .error2
mov ecx,[k_scale]
mov ebx,[coord_x]
mov edx,[coord_y]
mov edi,[v_obj]
add edi,vox_offs_data
xor esi,esi
stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj]
jmp .end_0
.error1:
stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n24b
jmp .end_0
.error2:
stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n32b
.end_0:
popad
.end_f:
ret
endp
;input:
; ebx - coord_x
; edx - coord_y
; esi - coord_z
; ecx - ã஢¥­ì ⥪ã襣® 㧫 
; edi - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
align 4
proc draw_sub_vox_obj_1g, buf_i:dword, buf_z:dword, v_obj:dword
cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï
je .sub_trees
;¯à®à¨á®¢ª  à ¬ª¨ ¥á«¨ à §¬¥à 㧫  = 1
cmp ecx,0
jne @f
;¯à®¢¥àª  £«ã¡¨­ë esi
stdcall buf_get_pixel, [buf_z], ebx,edx, esi
cmp eax,esi
jge @f
push ecx
mov ecx,dword[edi]
and ecx,0xffffff
stdcall buf_set_pixel, [buf_i], ebx,edx, ecx
stdcall buf_set_pixel, [buf_z], ebx,edx, esi
pop ecx
@@:
;४ãàᨢ­ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢
push edx
;¢å®¤ ¢­ãâàì 㧫 
dec ecx
mov eax,1
cmp ecx,1
jl @f
shl eax,cl
@@:
add edx,eax ;ª®à¥ªâ¨à®¢ª  ¢ëá®âë ¯®¤ ¢®ªá¥«ì ­¨¦­¥£® ã஢­ï
mov ah,byte[edi+3]
add edi,4
mov al,8
.cycle:
bt ax,8 ;â¥áâ¨à㥬 ⮫쪮 ah
jnc .c_next
push eax ebx edx esi
stdcall vox_corect_coords_pl, [v_obj],1
stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj]
pop esi edx ebx eax
.c_next:
shr ah,1
dec al
jnz .cycle
;¢ë室 ¨§ 㧫 
inc ecx
pop edx
jmp .end_f
.sub_trees:
cmp ecx,0
jl .end_0 ;­¥ à¨á㥬 ®ç¥­ì ¬ «¥­ìª¨¥ ¢®ªá¥«¨
;à¨á㥬 㧥«
mov eax,[edi]
and eax,0xffffff
cmp ecx,1
jl @f
;ª¢ ¤à â ¡®«ìè¥ â¥ªã饣® ¬ áèâ ¡ 
stdcall vox_draw_square_1g, [buf_i],[buf_z],eax
jmp .end_0
@@:
;ª¢ ¤à â ⥪ã饣® ¬ áèâ ¡ 
push ecx
mov ecx,eax
stdcall buf_get_pixel, [buf_z], ebx,edx
cmp eax,esi
jge .end_1
stdcall buf_set_pixel, [buf_i], ebx,edx,ecx
stdcall buf_set_pixel, [buf_z], ebx,edx,esi
.end_1:
pop ecx
.end_0:
add edi,4
.end_f:
ret
endp
;output:
; eax - à §àãè ¥âáï
align 4
proc vox_draw_square_1g uses ecx edx edi, buf_i:dword, buf_z:dword, color:dword
locals
img_size dd ?
coord_y dd ?
endl
mov edi,[buf_z]
xor eax,eax
inc eax
shl eax,cl
mov [img_size],eax
mov [coord_y],eax
.cycle_0:
push ebx
mov ecx,[img_size]
cld
.cycle_1:
push ecx
mov ecx,edx
call get_pixel_32
pop ecx
cmp eax,esi
jge @f
stdcall buf_set_pixel, [buf_i], ebx,edx, [color]
stdcall buf_set_pixel, edi, ebx,edx, esi
@@:
inc ebx
loop .cycle_1
pop ebx
inc edx
dec dword[coord_y]
jnz .cycle_0
ret
endp
;description:
; äã­ªæ¨ï à¨áãîé ï ¢®ªá¥«ì­ë© ®¡ê¥ªâ (¢¨¤­® 3 £à ­¨)
;input:
; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â )
; buf_z - ¡ãä¥à £«ã¡¨­ë (32 ¡¨â  ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥­ ᮢ¯ ¤ âì á buf_i)
; h_br - ª¨áâì á ¨§®¡à ¦¥­¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â )
; v_obj - ¢®ªá¥«ì­ë© ®¡ê¥ªâ
; k_scale - ª®íä. ¤«ï ¬ áèâ ¡¨à®¢ ­¨ï ¨§®¡à ¦¥­¨ï
align 4
proc buf_vox_obj_draw_3g, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\
coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword
pushad
mov edi,[v_obj]
mov ecx,[k_scale]
mov ebx,[coord_x]
mov edx,[coord_y]
add edi,vox_offs_data
mov esi,[coord_z]
stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj]
popad
ret
endp
;description:
; äã­ªæ¨ï à¨áãîé ï ç áâì ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
;input:
; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â )
; buf_z - ¡ãä¥à £«ã¡¨­ë (32 ¡¨â  ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥­ ᮢ¯ ¤ âì á buf_i)
; h_br - ª¨áâì á ¨§®¡à ¦¥­¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â )
; v_obj - ¢®ªá¥«ì­ë© ®¡ê¥ªâ
; k_scale - ª®íä. ¤«ï ¬ áèâ ¡¨à®¢ ­¨ï ¨§®¡à ¦¥­¨ï
align 4
proc buf_vox_obj_draw_3g_scaled, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\
coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword,\
s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword,b_color:dword
pushad
locals
p_node dd 0 ;த¨â¥«ì᪨© 㧥«
endl
mov edi,[v_obj]
add edi,vox_offs_data
mov ecx,[k_scale]
mov ebx,[coord_x]
;â¥á⮢ ï à ¬ª 
mov eax,[h_br]
movzx edx,byte[eax]
movzx esi,byte[eax+1]
cmp ecx,1
jl .end_c0
shl edx,cl
shl esi,cl
.end_c0:
;stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color]
;¢¥à⨪ «ì­ ï ¯®«®á 
add ebx,edx
shr edx,cl
stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color]
mov ecx,[s_k_scale]
shr esi,cl
xor eax,eax
inc eax
shl eax,cl
dec eax
sub eax,[s_c_z] ;§­ ç¥­¨ï ¯® ®á¨ z ¢®§à áâ îâ á ­¨§ã ¢¢¥àå
imul eax,esi
add eax,[coord_y]
stdcall buf_filled_rect_by_size, [buf_i], ebx,eax,edx,esi, [b_color]
mov ebx,[coord_y]
shl esi,cl
add ebx,esi
stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale]
shr eax,1
mov esi,[h_br]
movzx esi,byte[esi+1]
;¯®«§ã­®ª
stdcall draw_polz_hor, [buf_i], [coord_x],ebx,eax,esi, [s_c_x], [s_k_scale], [b_color]
mov edx,[coord_x]
add edx,eax
;¯®«§ã­®ª
stdcall draw_polz_hor, [buf_i], edx,ebx,eax,esi, [s_c_y], [s_k_scale], [b_color]
;---
mov esi,[s_k_scale]
cmp esi,1
jl .end_2
; *** (1) ***
.found:
stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi
movzx bx,byte[edi+3]
mov [p_node],edi
add edi,4
cmp eax,0
je .end_1
mov ecx,eax
cld
@@: ;横« ¤«ï ¯à®¯ã᪠ ¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥
bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à­¨¥ 㧫ë
jnc .end_0
xor eax,eax
stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à­¨å 㧫®¢, ¢ ¤ ­­®© ¢¥â¢¨
.end_0:
shr bx,1
loop @b
.end_1:
bt bx,0
jnc .end_2 ;¥á«¨ ¯®¤¤¥à¥¢  ­¥ áãé¥áâ¢ã¥â
dec esi
cmp esi,0
jg .found
; *** (2) ***
;à¨á®¢ ­¨¥ ç á⨠®¡ê¥ªâ 
mov ecx,[k_scale]
mov ebx,[coord_x]
mov edx,[coord_y]
mov esi,[coord_z]
stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj]
.end_2:
popad
ret
endp
;input:
; h_br - ª¨áâì á ¨§®¡à ¦¥­¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â )
; ebx - coord_x
; edx - coord_y
; esi - coord_z
; ecx - ã஢¥­ì ⥪ã襣® 㧫 
; edi - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
align 4
proc vox_go_in_node, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword
cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï
je .sub_trees
;४ãàᨢ­ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢
push eax edx
;¯à®à¨á®¢ª  à ¬ª¨ ¥á«¨ à §¬¥à 㧫  = 1
cmp ecx,0
jne .end_2
push eax
stdcall vox_get_sub_brush,[h_br],0 ;®¯à¥¤¥«ï¥¬ ª¨áâì ¤«ï à¨á®¢ ­¨ï
cmp eax,0 ;¥á«¨ ª¨áâì ­¥ ­ ©¤¥­ 
je @f
stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi]
@@:
pop eax
.end_2:
;¢å®¤ ¢­ãâàì 㧫 
dec ecx
;---
push ebx
;mov eax,(h-h_osn/2)
mov ebx,[h_br]
movzx eax,byte[ebx+1]
cmp byte[ebx+2],0
je @f
;¥á«¨ ª¨áâì á 3-¬ï £à ­ï¬¨
movzx ebx,byte[ebx+2]
shr ebx,1
sub eax,ebx
jmp .end_0
@@:
;¥á«¨ ª¨áâì á 2-¬ï £à ­ï¬¨
movzx ebx,byte[ebx]
shr ebx,1
.end_0:
cmp ecx,1
jl @f
shl eax,cl
shl ebx,cl
@@:
add esi,ebx
pop ebx
add edx,eax ;ª®à¥ªâ¨à®¢ª  ¢ëá®âë ¯®¤ ¢®ªá¥«ì ­¨¦­¥£® ã஢­ï
;---
mov ah,byte[edi+3]
add edi,4
mov al,8
.cycle:
bt ax,8 ;â¥áâ¨à㥬 ⮫쪮 ah
jnc .c_next
push ebx edx esi
stdcall vox_corect_coords, [h_br], [v_obj]
stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj]
pop esi edx ebx
.c_next:
shr ah,1
dec al
jnz .cycle
;¢ë室 ¨§ 㧫 
inc ecx
pop edx eax
jmp .end_f
.sub_trees:
;à¨á㥬 㧥«
push eax
stdcall vox_get_sub_brush,[h_br],ecx ;®¯à¥¤¥«ï¥¬ ª¨áâì ¤«ï à¨á®¢ ­¨ï
cmp eax,0 ;¥á«¨ ª¨áâì ­¥ ­ ©¤¥­ 
je @f
stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi]
@@:
pop eax
add edi,4
.end_f:
ret
endp
;description:
; äã­ªæ¨ï à¨áãîé ï ®¤¨­®ç­ë© ¢®ªá¥«
;input:
; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â )
; buf_z - ¡ãä¥à £«ã¡¨­ë (32 ¡¨â  ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥­ ᮢ¯ ¤ âì á buf_i)
; buf_v - ¡ãä¥à á ¨§®¡à ¦¥­¨¥¬ ¢®ªá¥«ï (32 ¡¨â )
; v_color - 梥â
align 4
proc draw_vox, buf_i:dword, buf_z:dword, buf_v:dword,\
coord_x:dword, coord_y:dword, coord_z:dword, v_color:dword
pushad
mov eax,[coord_x]
mov ebx,[coord_y]
mov edi,[buf_v]
mov ecx,buf2d_h
mov esi,buf2d_w
imul ecx,esi
add esi,eax
mov edx,buf2d_data
cld
;ecx - count pixels in voxel
;edx - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢ ¢®ªá¥«ì­®¬ ¡ãä¥à¥
;edi - 㪠§ â¥«ì ­  ¢®ªá¥«ì­ë© ¡ãä¥à
;esi - width voxel buffer add coord x
.cycle:
cmp dword[edx],0
je @f
;¯à®¢¥à塞 ¡ãä¥à £«ã¡¨­ë
push eax
stdcall buf_get_pixel, [buf_z],eax,ebx
sub eax,[coord_z]
cmp eax,[edx]
jl .dr_pixel
pop eax
jmp @f
.dr_pixel:
;à¨á㥬 â®çªã
pop eax
stdcall buf_set_pixel, [buf_i],eax,ebx,[v_color]
push ecx
mov ecx,[coord_z]
add ecx,[edx]
stdcall buf_set_pixel, [buf_z],eax,ebx,ecx
pop ecx
@@:
add edx,4
inc eax
cmp eax,esi
jl @f
inc ebx
sub eax,buf2d_w
@@:
loop .cycle
popad
ret
endp
;description:
;äã­ªæ¨ï ¤«ï ª®à¥ªâ¨à®¢ª¨ ª®®à¤¨­ â
;­ ¯à ¢«¥­¨ï ®á¥© ª®®à¤¨­ â ¢ ¢®ªá¥«¥:
;*z
;|
;+
; * y
; /
;+
; \
; * x
;input:
; al - ­®¬¥à 㧫  ¢ ¤¥à¥¢¥ (®â 1 ¤® 8)
; ebx - ª®®à¤¨­ â  x
; edx - ª®®à¤¨­ â  y
; esi - ª®®à¤¨­ â  z
; ecx - ã஢¥­ì ⥪ã襣® 㧫 
;output:
; ebx - ­®¢ ï ª®®à¤¨­ â  x
; edx - ­®¢ ï ª®®à¤¨­ â  y
; esi - ­®¢ ï ª®®à¤¨­ â  z
align 4
proc vox_corect_coords, h_br:dword, v_obj:dword
locals
osn_w_2 dd ? ;è¨à¨­  ®á­®¢ ­¨ï ¥¤¨­¨ç­®£® ¢®ªá¥«ï : 2
vox_h dd ? ;¢ëá®â  ¥¤¨­¨ç­®£® ¢®ªá¥«ï
endl
cmp ecx,0
jl .end_f ;¤«ï ã᪮७¨ï ®âà¨á®¢ª¨
push eax edi
and eax,15 ;¢ë¤¥«ï¥¬ ­®¬¥à 㧫  ¢ ¤¥à¥¢¥
mov edi,[v_obj]
add edi,vox_offs_tree_table
add edi,8
sub edi,eax
push ebx ecx
mov ebx,[h_br]
movzx ecx,byte[ebx]
shr ecx,1
mov dword[osn_w_2],ecx
movzx ecx,byte[ebx+2]
movzx ebx,byte[ebx+1]
sub ebx,ecx
mov dword[vox_h],ebx
shr ecx,1
mov eax,ecx ;eax - ¢ëá®â  ®á­®¢ ­¨ï ¥¤¨­¨ç­®£® ¢®ªá¥«ï : 2
pop ecx ebx
cmp ecx,1
jl @f ;¢® ¨§¡¥¦ ­¨¥ § æ¨ª«¨¢ ­¨ï
shl eax,cl
shl dword[osn_w_2],cl
shl dword[vox_h],cl
@@:
; add esi,eax ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z (ª®¬¯¥­á æ¨ï ¤«ï ª®®à¤¨­ âë y)
bt word[edi],0 ;test voxel coord x
jnc @f
add ebx,[osn_w_2]
cmp eax,0
jne .end_0
add esi,[osn_w_2] ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z
jmp @f
.end_0:
add edx,eax
add esi,eax ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z
@@:
bt word[edi],1 ;test voxel coord y
jnc @f
add ebx,[osn_w_2]
cmp eax,0
jne .end_1
sub esi,[osn_w_2] ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z
jmp @f
.end_1:
sub edx,eax
sub esi,eax ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z
@@:
bt word[edi],2 ;test voxel coord z
jnc @f
sub edx,[vox_h]
@@:
pop edi eax
.end_f:
ret
endp
;¨§¢«¥ª ¥¬ ¨§ h_br 㪠§ â¥«ì ­  ¡ãä¥à á ¨§®¡à ¦¥­¨¥¬ ¢®ªá¥«ï, 㪠§ ­­®£® ¯®à浪  n
align 4
proc vox_get_sub_brush uses ebx ecx, h_br:dword, n:dword
xor eax,eax
mov ebx,[n]
cmp ebx,0
jl @f
mov ecx,[h_br]
cmp bl,byte[ecx+3]
jg @f
add ecx,4
imul ebx,BUF_STRUCT_SIZE
mov eax,ebx
add eax,ecx
@@:
ret
endp
;description:
; äã­ªæ¨ï à¨áãîé ï á१ ¢®ªá¥«ì­®£® ®¡ì¥ªâ 
;input:
; v_size - à §¬¥à ª¢ ¤à â  á ¢®ªá¥«¥¬
; k_scale - á⥯¥­ì ¤¥â «¨§ æ¨¨ ¨§®¡à ¦¥­¨ï
; n_plane - ­®¬¥à ¯«®áª®á⨠á¥ç­¨ï (¢ ¯à¥¤¥« å ®â 0 ¤® 2^k_scale - 1)
; b_color - 梥⠣࠭¨æë
align 4
proc buf_vox_obj_draw_pl, buf_i:dword, v_obj:dword, coord_x:dword,\
coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword
cmp [k_scale],0
jl .end_f
pushad
mov eax,[v_size]
mov ecx,[k_scale]
mov ebx,eax
cmp ecx,1
jl @f
shl ebx,cl
@@:
;ebx - ¯®«­ë© à §¬¥à ¨§®¡à ¦¥­¨ï
stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;à ¬ª  ­  à¨áã­®ª
mov edx,ebx
add ebx,[coord_y]
stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;¯®«§ã­®ª, ¯®ª §ë¢ î騩 ­®¬¥à á¥ç¥­¨ï
;à¨á®¢ ­¨¥ â®ç¥ª ¤«ï á¥âª¨
push ecx
mov edi,1
cmp ecx,1
jl @f
shl edi,cl
@@:
dec edi
cmp edi,1
jl .end_0
mov ecx,edi
imul ecx,edi
mov ebx,[coord_x]
mov edx,[coord_y]
add edx,eax
xor esi,esi
cld
@@:
add ebx,eax
inc esi
stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color]
cmp esi,edi
jl .end_1
;¯¥à¥å®¤ â®ç¥ª ­  ­®¢ãî áâபã
xor esi,esi
mov ebx,[coord_x]
add edx,eax
.end_1:
loop @b
.end_0:
pop ecx
;eax - à §¬¥à ®¤­®£® ª¢ ¤à â 
;edi - 㪠§ â¥«ì ­  à¨áã¥¬ë¥ ¤ ­­ë¥ ¨§ ®¡ê¥ªâ 
mov ebx,[coord_x]
mov edx,[coord_y]
mov edi,[v_obj]
add edi,vox_offs_data
xor esi,esi
push eax
mov eax,1
shl eax,cl
dec eax
sub eax,[n_plane]
stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],eax
popad
.end_f:
ret
endp
;description:
; äã­ªæ¨ï à¨áãîé ï á१ ç á⨠¢®ªá¥«ì­®£® ®¡ì¥ªâ 
;input:
; s_c_x, s_c_y, s_c_z, s_k_scale - ¯ à ¬¥âàë ®¯à¥¤¥«ïî騥 ç áâì ¢®ªá¥«ì­®£® ®¡ê¥ªâ , ª®â®à ï ¡ã¤¥â à¨á®¢ âìáï
align 4
proc buf_vox_obj_draw_pl_scaled, buf_i:dword, v_obj:dword, coord_x:dword,\
coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword,\
s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword
cmp [k_scale],0
jl .end_f
pushad
locals
p_node dd 0 ;த¨â¥«ì᪨© 㧥«
endl
mov eax,[v_size]
mov ecx,[k_scale]
mov ebx,eax
cmp ecx,1
jl @f
shl ebx,cl
@@:
;ebx - ¯®«­ë© à §¬¥à ¨§®¡à ¦¥­¨ï
stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;à ¬ª  ­  à¨áã­®ª
mov edx,ebx
add ebx,[coord_y]
stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;¯®«§ã­®ª, ¯®ª §ë¢ î騩 ­®¬¥à á¥ç¥­¨ï
;à¨á®¢ ­¨¥ â®ç¥ª ¤«ï á¥âª¨
push ecx
mov edi,1
cmp ecx,1
jl @f
shl edi,cl
@@:
dec edi
cmp edi,1
jl .end_3
mov ecx,edi
imul ecx,edi
mov ebx,[coord_x]
mov edx,[coord_y]
add edx,eax
xor esi,esi
cld
@@:
add ebx,eax
inc esi
stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color]
cmp esi,edi
jl .end_4
;¯¥à¥å®¤ â®ç¥ª ­  ­®¢ãî áâபã
xor esi,esi
mov ebx,[coord_x]
add edx,eax
.end_4:
loop @b
.end_3:
pop ecx
mov esi,[s_k_scale]
cmp esi,1
jl .end_2
mov edi,[v_obj]
add edi,vox_offs_data
; *** (1) ***
.found:
stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi
movzx bx,byte[edi+3]
mov [p_node],edi
add edi,4
cmp eax,0
je .end_1
mov ecx,eax
cld
@@: ;横« ¤«ï ¯à®¯ã᪠ ¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥
bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à­¨¥ 㧫ë
jnc .end_0
xor eax,eax
stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à­¨å 㧫®¢, ¢ ¤ ­­®© ¢¥â¢¨
.end_0:
shr bx,1
loop @b
.end_1:
bt bx,0
jnc .end_2 ;¥á«¨ ¯®¤¤¥à¥¢  ­¥ áãé¥áâ¢ã¥â
dec esi
cmp esi,0
jg .found
mov eax,[v_size]
;eax - à §¬¥à ®¤­®£® ª¢ ¤à â 
;edi - 㪠§ â¥«ì ­  à¨áã¥¬ë¥ ¤ ­­ë¥ ¨§ ®¡ê¥ªâ 
mov ecx,[k_scale]
mov ebx,[coord_x]
mov edx,[coord_y]
xor esi,esi
push eax
mov eax,1
shl eax,cl
dec eax
sub eax,[n_plane]
stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], eax
.end_2:
popad
.end_f:
ret
endp
;description:
; ®¯à¥¤¥«¥­¨¥ ¯®§¨æ¨¨ 㧫  ¢ ¤¥à¥¢¥ (®â 0 ¤® 7)
align 4
proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
mov ecx,[k_scale]
dec ecx
mov eax,[coord_x]
mov ebx,[coord_y]
mov edi,[coord_z]
cmp ecx,1
jl .end_0
shr eax,cl
shr ebx,cl
shr edi,cl
.end_0:
and eax,1
bt ebx,0
jnc @f
bts eax,1
@@:
bt edi,0
jnc @f
bts eax,2
@@:
mov edi,[v_obj]
add edi,vox_offs_tree_table
@@:
cmp al,byte[edi]
je @f
inc edi
jmp @b
@@:
sub edi,[v_obj]
sub edi,vox_offs_tree_table
mov eax,edi
ret
endp
;input:
; edi - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
;output:
; eax - eax + ç¨á«® 㧫®¢ ¢ ¤ ­­ëå ¢®ªá. ®¡ê¥ªâ 
; edi - 㪠§ â¥«ì ­  ᬥ饭­ë¥ ¤ ­­ë¥ ¢®ªá. ®¡ê¥ªâ 
align 4
proc vox_obj_rec0
inc eax
cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï
je .sub_trees
;४ãàᨢ­ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢
push ebx ecx
mov bh,byte[edi+3]
add edi,4
mov bl,8
.cycle:
bt bx,8 ;â¥áâ¨à㥬 ⮫쪮 bh
jnc .c_next
stdcall vox_obj_rec0
.c_next:
shr bh,1
dec bl
jnz .cycle
pop ecx ebx
jmp .end_f
.sub_trees:
add edi,4
.end_f:
ret
endp
;description:
; äã­ªæ¨ï à¨áãîé ï £®à¨§®­â «ì­ãî ¯®«®áã á ¯®«§ã­ª®¬
align 4
proc draw_polz_hor uses eax ebx ecx, buf:dword, coord_x:dword, coord_y:dword,\
size_x:dword, size_y:dword, pos:dword, k_scale:dword, color:dword
mov ebx,[size_x]
stdcall buf_rect_by_size, [buf], [coord_x],[coord_y],ebx,[size_y], [color]
mov ecx,[k_scale]
shr ebx,cl
mov eax,[pos]
imul eax,ebx
add eax,[coord_x]
stdcall buf_filled_rect_by_size, [buf], eax,[coord_y],ebx,[size_y], [color]
ret
endp
;input:
; ebx - coord_x
; edx - coord_y
; esi - coord_z
; ecx - ã஢¥­ì ⥪ã襣® 㧫 
; edi - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
align 4
proc draw_sub_vox_obj_pl, buf_i:dword, v_obj:dword, clip_z:dword,\
v_size:dword
cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï
je .sub_trees
;¯à®à¨á®¢ª  à ¬ª¨ ¥á«¨ à §¬¥à 㧫  = 1
cmp ecx,0
jne @f
;¯à®¢¥àª  £«ã¡¨­ë esi
;clip_z=n_plane
stdcall vox_is_clip, [clip_z];,[v_size]
cmp eax,0
je @f
push ecx
mov ecx,dword[edi]
and ecx,0xffffff
stdcall buf_rect_by_size, [buf_i], ebx,edx, [v_size],[v_size],ecx
pop ecx
@@:
;४ãàᨢ­ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢
push edx
;¢å®¤ ¢­ãâàì 㧫 
dec ecx
mov eax,[v_size]
cmp ecx,1
jl @f
shl eax,cl
@@:
add edx,eax ;ª®à¥ªâ¨à®¢ª  ¢ëá®âë ¯®¤ ¢®ªá¥«ì ­¨¦­¥£® ã஢­ï
mov ah,byte[edi+3]
add edi,4
mov al,8
.cycle:
bt ax,8 ;â¥áâ¨à㥬 ⮫쪮 ah
jnc .c_next
push eax ebx edx esi
stdcall vox_corect_coords_pl, [v_obj],[v_size]
stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],[clip_z],[v_size]
pop esi edx ebx eax
.c_next:
shr ah,1
dec al
jnz .cycle
;¢ë室 ¨§ 㧫 
inc ecx
pop edx
jmp .end_f
.sub_trees:
cmp ecx,0
jl .end_0 ;­¥ à¨á㥬 ®ç¥­ì ¬ «¥­ìª¨¥ ¢®ªá¥«¨
;¯à®¢¥àª  £«ã¡¨­ë esi
;clip_z=n_plane
stdcall vox_is_clip, [clip_z]
cmp eax,0
je .end_0
;à¨á㥬 㧥«
mov eax,[edi]
and eax,0xffffff
push eax ;梥â 㧫 
mov eax,[v_size]
cmp ecx,1
jl @f
;ª¢ ¤à â ¡®«ìè¥ â¥ªã饣® ¬ áèâ ¡ 
shl eax,cl ;à §¬¥à 㧫 
stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax
push ebx edx esi
mov esi,eax
inc ebx
inc edx
sub esi,2
mov eax,[buf_i]
push dword 128
push dword[eax+16] ;+16 - b_color
stdcall combine_colors_3,[edi]
stdcall buf_rect_by_size, [buf_i], ebx,edx, esi,esi,eax
pop esi edx ebx
jmp .end_0
@@:
;ª¢ ¤à â ⥪ã饣® ¬ áèâ ¡ 
stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax
.end_0:
add edi,4
.end_f:
ret
endp
;description:
; ¢á¯®¬®£ â¥«ì­ ï äã­ªæ¨ï ¤«ï ¯à®¢¥àª¨ £«ã¡¨­ë esi
;input:
; ecx - ã஢¥­ì ⥪ã襣® 㧫 
; esi - coord z
; clip_z - n_plane
;output:
; eax - 0 if no draw, 1 if draw
align 4
proc vox_is_clip uses ebx edi, clip_z:dword
xor eax,eax
mov ebx,[clip_z]
mov edi,1
cmp ecx,1
jl @f
shl edi,cl
@@:
;edi = 2^ecx
add edi,esi
cmp edi,ebx ;if (esi+2^ecx <= n_plane) no draw
jle @f
inc ebx
cmp esi,ebx ;if (esi >= (n_plane+1)) no draw
jge @f
inc eax
@@:
ret
endp
;äã­ªæ¨ï ¤«ï ª®à¥ªâ¨à®¢ª¨ ª®®à¤¨­ â
;­ ¯à ¢«¥­¨ï ®á¥© ª®®à¤¨­ â ¢ ¢®ªá¥«¥:
;*z
;|
;+-* x
;input:
; al - ­®¬¥à 㧫  ¢ ¤¥à¥¢¥ (®â 1 ¤® 8)
; ebx - ª®®à¤¨­ â  x
; edx - ª®®à¤¨­ â  y
; esi - ª®®à¤¨­ â  z
; ecx - ã஢¥­ì ⥪ã襣® 㧫 
;output:
; ebx - ­®¢ ï ª®®à¤¨­ â  x
; edx - ­®¢ ï ª®®à¤¨­ â  y
; esi - ­®¢ ï ª®®à¤¨­ â  z
align 4
proc vox_corect_coords_pl, v_obj:dword, v_size:dword
cmp ecx,0
jl .end_f ;¤«ï ã᪮७¨ï ®âà¨á®¢ª¨
push eax edi
and eax,15 ;¢ë¤¥«ï¥¬ ­®¬¥à 㧫  ¢ ¤¥à¥¢¥
mov edi,[v_obj]
add edi,vox_offs_tree_table
add edi,8
sub edi,eax
mov eax,[v_size]
cmp ecx,1
jl @f
shl eax,cl
@@:
bt word[edi],0 ;test voxel coord x
jnc @f
add ebx,eax
@@:
bt word[edi],2 ;test voxel coord z
jnc @f
sub edx,eax
@@:
bt word[edi],1 ;test voxel coord y
jc @f
mov eax,1
cmp ecx,1
jl .end_0
shl eax,cl
.end_0:
add esi,eax ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z
@@:
pop edi eax
.end_f:
ret
endp
;description:
; äã­ªæ¨ï à¨áãîé ï ⥭¨
;input:
; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â )
; buf_z - ¡ãä¥à £«ã¡¨­ë (32 ¡¨â  ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥­ ᮢ¯ ¤ âì á buf_i)
; h_br - ª¨áâì á ¨§®¡à ¦¥­¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â )
; k_scale - ª®íä. ¤«ï ¬ áèâ ¡¨à®¢ ­¨ï ¨§®¡à ¦¥­¨ï
align 4
proc buf_vox_obj_draw_3g_shadows, buf_i:dword, buf_z:dword, h_br:dword, \
coord_x:dword, coord_y:dword, color:dword, k_scale:dword, prop:dword
locals
correct_z dd 0 ;ª®à¥ªâ¨à®¢ª  ¤«ï ¡ãä¥à  £«ã¡¨­ë
endl
pushad
mov eax,[k_scale]
add eax,[prop]
mov dword[correct_z],8
sub [correct_z],eax
mov ebx,[coord_x]
;correct_z = 8-k_scale-prop
stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale]
mov edx,eax ;edx - è¨à¨­  ¨§®¡à ¦¥­¨ï
stdcall buf_vox_obj_get_img_h_3g, [h_br],[k_scale]
mov esi,eax
mov edi,[coord_y]
mov ecx,edx
add edx,ebx ;è¨à¨­  + ®âáâ㯠᫥¢ 
imul ecx,esi
cld
.cycle_0:
stdcall buf_get_pixel, [buf_z],ebx,edi
cmp eax,0
je @f
stdcall vox_correct_z, [correct_z]
push eax
stdcall buf_get_pixel, [buf_i],ebx,edi
stdcall combine_colors_3,eax,[color] ;,eax
stdcall buf_set_pixel, [buf_i],ebx,edi,eax
@@:
inc ebx
cmp ebx,edx
jl @f
mov ebx,[coord_x]
inc edi
@@:
loop .cycle_0
popad
ret
endp
;output:
; eax - scaled coord z
align 4
proc vox_correct_z uses ecx, correct_z:dword
mov ecx,[correct_z]
cmp ecx,0
je .end_f
jl .end_0
shl eax,cl
jmp .end_f
.end_0:
neg ecx
inc ecx
shr eax,cl
.end_f:
ret
endp
;output:
; eax - color
align 4
proc combine_colors_3 uses ebx ecx edx edi esi, col_0:dword, col_1:dword, alpha:dword
mov ebx,[col_0]
mov ecx,[col_1]
movzx di,byte[alpha] ;pro
mov si,0x00ff ;---get transparent---
sub si,di ;256-pro
;---blye---
movzx ax,bl
imul ax,si
movzx dx,cl
imul dx,di
add ax,dx
mov cl,ah
;---green---
movzx ax,bh
imul ax,si
movzx dx,ch
imul dx,di
add ax,dx
mov ch,ah
shr ebx,16
ror ecx,16
;---red---
movzx ax,bl
imul ax,si
movzx dx,cl
imul dx,di
add ax,dx
shl eax,8
ror ecx,16
mov ax,cx
and eax,0xffffff
ret
endp