kolibrios-fun/programs/media/log_el/trunk/le_signal.inc
IgorA e016ecafca update 'log_el' work with new 'tree_list'
git-svn-id: svn://kolibrios.org@5916 a494cfbc-eb01-0410-851d-a64ba20cac60
2015-11-15 21:02:34 +00:00

1 line
7.5 KiB
PHP
Raw Permalink 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.

;
; äã­ªæ¨ ¤«ï ᮧ¤ ­¨ï ᨣ­ «®¢
;
;color_s0 - ᨣ­ « 0
;color_s1 - ᨣ­ « 1
;color_s2 - â®çª  ¡¥§ ¯¥à¥á¥ç¥­¨ï
;color_s3 - ¢à¥¬¥­­®¥ §­ ç¥­¨¥ ¤«ï á®åà ­¥­¨ï
size_sign equ 10
sign_x equ 0
sign_y equ 4
sign_a equ 8
sign_z equ 9
sign_data dd 0 ;㪠§ â¥«ì ­  ¬ áᨢ á® áâàãªâãà ¬¨ ᨣ­ «®¢
sign_count dd 0 ;⥪ãé. ª®«. ᨣ­ «®¢
sign_max dd 0 ;¬ ªá. ª®«. ᨣ­ «®¢
align 4
proc sign_init uses eax ecx, m_count:dword
mov ecx,[m_count]
mov [sign_max],ecx
imul ecx,size_sign
stdcall mem.Alloc, ecx
mov [sign_data],eax
call sign_clear
ret
endp
;®ç¨á⪠ ¢á¥å ᨣ­ «®¢
align 4
proc sign_clear uses eax ecx edi
xor eax,eax
mov dword[time],eax
mov dword[sign_count],eax
mov ecx,[sign_max]
imul ecx,size_sign
mov edi,[sign_data]
cld
rep stosb
ret
endp
;®ç¨á⪠ ®¤­®£® ᨣ­ « 
align 4
proc sign_clear_one uses ecx edi esi, p_sign:dword
mov ecx,size_sign
mov esi,[sign_count]
dec esi
imul esi,ecx
add esi,[sign_data]
mov edi,[p_sign]
cld
rep movsb
dec dword[sign_count]
ret
endp
;®á¢®¡®¦¤¥­¨¥ ¯ ¬ï⨠§ ­ï⮩ ¬ áᨢ ¬¨ ¤«ï ᨣ­ «®¢
align 4
proc sign_delete
stdcall mem.Free, dword[sign_data]
ret
endp
;äã­ªæ¨ï ¤«ï ¯¥à¥¬¥é¥­¨ï ᨣ­ «®¢
align 4
proc sign_move
pushad
mov ecx,[sign_count]
cmp ecx,1
jl .end_f
mov esi,ecx
dec esi
imul esi,size_sign
add esi,[sign_data]
;cld
.cycle_beg:
mov eax,[esi+sign_x]
mov ebx,[esi+sign_y]
movzx edi,byte[esi+sign_a]
movzx edx,byte[esi+sign_z]
cmp edx,0
je @f
or edi,0x100
@@:
;¯ëâ ¥¬áï ᮧ¤ âì à §¢¥â¢«¥­¨¥ ᨣ­ « 
stdcall move_rotate_n90, 0,-1,edi
inc edi
stdcall sign_creat,eax,ebx,edi
stdcall move_rotate_n90, -2,0,edi
add edi,2
stdcall sign_creat,eax,ebx,edi
mov eax,[esi+sign_x]
mov ebx,[esi+sign_y]
inc edi
mov eax,[esi+sign_x]
mov ebx,[esi+sign_y]
shl edx,2
add edx,shem_colors
stdcall draw_signal_rect, eax,ebx, dword[edx] ;à¨á㥬 ᨣ­ « ­  ¯®«¥
.move_1:
stdcall move_rotate_x_n90, 1,edi
mov edi,eax
stdcall pole_cell_find, pole, edi,ebx
cmp eax,0
jne @f
stdcall sign_clear_one,esi ;㤠«¥­¨¥ ᨣ­ « , ¥á«¨ ®­ § è¥« ¢ â㯨ª
jmp .cycle_next
@@:
imul eax,sizeof.Cell
add eax,dword[cell]
movzx edx,byte[esi+sign_z]
cmp byte[eax+offs_cell_liv],2
jne @f
;¥á«¨ á⮨⠯¥à¥á¥ç¥­¨¥ ¯à®¢®¤®¢
mov eax,edi
movzx edi,byte[esi+sign_a]
jmp .move_1
@@:
cmp byte[eax+offs_cell_liv],dl
jne @f
stdcall sign_clear_one,esi ;㤠«¥­¨¥ ᨣ­ « , ¥á«¨ ®­ ¯®¯ « ­  ®¡« áâì § ªà è¥­ãî ¤ ­­ë¬ 梥⮬
jmp .cycle_next
@@:
mov byte[eax+offs_cell_liv],dl ;áâ ¢¨¬ ­  ¯®«¥ §­ ª ᨣ­ « 
mov [esi+sign_x],edi
mov [esi+sign_y],ebx
.cycle_next:
sub esi,size_sign
;loop .cycle_beg
dec ecx
jnz .cycle_beg
;stdcall [buf2d_draw], buf_0
.end_f:
popad
ret
endp
align 4
proc sign_creat coord_x:dword, coord_y:dword, opt:dword
pushad
mov edi,[sign_count]
cmp edi,[sign_max]
jge .end_f
mov esi,[coord_x]
mov ebx,[coord_y]
.found:
stdcall pole_cell_find, pole, esi,ebx
cmp eax,0
je .end_f
mov ecx,[opt]
get_cell_offset edx,eax
cmp byte[edx+offs_cell_liv],2
jne @f
mov eax,esi
stdcall move_rotate_x_n90,1,ecx
mov esi,eax
jmp .found
@@:
cmp ch,byte[edx+offs_cell_liv] ;¯à®¢¥à塞 ­  ¯®«¥ §­ ª ᨣ­ « 
je .end_f
;¤®¤¥« âì ãáâ ­®¢ªã ¬¥âª¨ ¢ ¯à®¢®¤, çâ®-¡ë ¨§¡¥¦ âì ¤ã¡«¨à®¢ ­¨ï ᨣ­ «®¢ ­  è¨à®ª¨å ¯à®¢®¤ å
imul edi,size_sign
add edi,[sign_data]
mov [edi+sign_x],esi
mov [edi+sign_y],ebx
mov [edi+sign_a],cl
mov [edi+sign_z],ch
inc dword[sign_count]
mov [edx+offs_cell_liv],ch ;áâ ¢¨¬ ­  ¯®«¥ §­ ª ᨣ­ « 
;stdcall draw_signal_rect, [coord_x],[coord_y], 0x800080
.end_f:
popad
ret
endp
;description:
; ¯®¤äã­ªæ¨ï ¤«ï à¨á®¢ ­¨ï ᨣ­ «®¢ ­  á奬¥
align 4
proc draw_signal_rect uses eax ebx edi, x0:dword,y0:dword, color:dword
movzx edi,byte[zoom]
mov ebx,[y0]
mov eax,[x0]
add ebx,[Cor_y]
imul ebx,edi
add eax,[Cor_x]
imul eax,edi
stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx,edi,edi, dword[color]
ret
endp
align 4
proc sign_from_elems
locals
s_inp dd ?
n_leg dd ?
endl
pushad
mov edi,pole
;*** ᮧ¤ ­¨¥ ᨣ­ «®¢ ¨§ «®£¨ç¥áª¨å í«¥¬¥­â®¢ ***
stdcall dword[tl_node_poi_get_info], tree1,0
mov esi,eax
@@:
cmp esi,0
je @f
cmp word[esi],el_icon_elems ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨
jne .end_add_p3
stdcall [tl_node_poi_get_data], tree1,esi
mov ecx,eax
;*** ¯à®¢¥àª  ᨣ­ «®¢ ­  ¢å®¤­ëå ­®£ å
mov dword[s_inp],0
mov dword[n_leg],0 ;word[n_leg] - ­®¬¥à ¢å®¤­®© ­®£¨
mov edx,1
.add_p1:
stdcall el_get_leg_coords, ecx,dword[n_leg]
test eax,eax
jnz .get1
test ebx,ebx
jnz .get1
jmp .end_add_p1 ;¥á«¨ ª®®à¤¨­ âë ­¥ ¢§ï«¨áì (eax=0 && ebx=0), ¢ë室 ¨§ 横« 
.get1:
stdcall pole_cell_find, pole, eax,ebx
cmp eax,0
je .get2
imul eax,sizeof.Cell
add eax,pole_data
cmp byte[eax+offs_cell_liv],1
jne .get2
or dword[s_inp],edx
.get2:
inc dword[n_leg]
shl edx,1
jmp .add_p1
.end_add_p1:
;*** ®¯à¥¤¥«ï¥¬ ¢ë室­ãî ª®¬¡¨­ æ¨î ¡¨â®¢ ­  ®á­®¢¥ § ¤ ­­®© â ¡«¨æë à ¡®âë í«¥¬¥­â 
movzx eax,byte[ecx+sp_offs_el_type]
imul eax,size_el_opt
add eax,el_opt_beg+el_offs_table
mov ebx,[eax]
add ebx,dword[s_inp]
mov ebx,[ebx]
mov dword[s_inp],ebx
;*** ãáâ ­®¢ª  ᨣ­ «®¢ ­  ¢ë室­ëå ­®£ å
mov dword[n_leg],(1 shl 16) ;word[n_leg] - ­®¬¥à ¢ë室­®© ­®£¨
.add_p2:
stdcall el_get_leg_coords, ecx,dword[n_leg]
test eax,eax
jnz .get3
test ebx,ebx
jnz .get3
jmp .end_add_p2 ;¥á«¨ ª®®à¤¨­ âë ­¥ ¢§ï«¨áì (eax=0 && ebx=0), ¢ë室 ¨§ 横« 
.get3:
movzx edx,byte[ecx+8] ;dl - ­ ¯à ¢«¥­¨¥ ᨣ­ « 
bt dword[s_inp],0
jnc .set1
or edx,0x100 ;dh - §­ ç¥­¨¥ ᨣ­ «  0 ¨«¨ 1
.set1:
stdcall sign_creat,eax,ebx,edx
inc dword[n_leg]
shr dword[s_inp],1
jmp .add_p2
.end_add_p2:
.end_add_p3:
stdcall dword[tl_node_poi_get_next_info], tree1,esi
mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
jmp @b
@@:
popad
ret
endp
;ᮧ¤ ­¨¥ ᨣ­ «®¢ ­  ®á­®¢¥ ¯®¤¯¨á¥©
align 4
proc sign_from_captions
pushad
;*** ᮧ¤ ­¨¥ ᨣ­ «®¢ ¨§ ¯®¤¯¨á¥© ***
stdcall dword[tl_node_poi_get_info], tree1,0
mov esi,eax
@@:
cmp esi,0
je @f
cmp word[esi],el_icon_captions ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨
jne .end_add_p3
stdcall [tl_node_poi_get_data], tree1,esi
mov ecx,eax
cmp byte[ecx+8],'n'
je .end_add_p3 ;¥á«¨ ­ ¤¯¨áì ¨­ä®à¬ æ¨®­­ ï, â® ­¥ ᮧ¤ ¥¬ ᨣ­ « 
;xor edx,edx
movzx edx,byte[ecx+9] ;¯¥à¢®­ ç «ì­®¥ ­ ¯à¢«¥­¨¥ ¢ë室­®£® ᨣ­ « 
;*** ®¯à¥¤¥«ï¥¬ ¢ë室®© ¡¨â,
;ª®â®àë© ¡ë« ãáâ ­®¢«¥­ ¢ but_set_0 ¨ but_set_1
cmp byte[ecx+8],'o'
jne .end_add_p1
or edx,0x100
.end_add_p1:
stdcall sign_creat,dword[ecx],dword[ecx+4],edx
.end_add_p3:
stdcall dword[tl_node_poi_get_next_info], tree1,esi
mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
jmp @b
@@:
popad
ret
endp
; ¨§¬¥­ï¥¬ ¯¥à¢®­ ç «ì­®¥ ­ ¯à¢«¥­¨¥ ¢ë室­®£® ᨣ­ « 
; ¢ëáâ ¢«ïîâáï 2 ­ ¯à ¢«¥­¨ï: á«¥¢  ­  ¯à ¢®, á¯à ¢  ­  «¥¢®
; ®áâ «ì­ë¥ 2 ¢®§¬®¦­ëå ­ ¯à ¢«¥­¨ï ­¥ ãç¨â뢠îâáï,
; â. ª. ¯®¢®à®âë ᨣ­ «®¢ ¢®§¬®¦­ë ¨ ¡¥§ ­¨å
align 4
proc sign_set_captions_angles
pushad
mov edi,pole
stdcall dword[tl_node_poi_get_info],tree1,0
mov esi,eax
.cycle0:
cmp esi,0
je .cycle0_end
cmp word[esi],el_icon_captions ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨
jne .end_p0
stdcall [tl_node_poi_get_data], tree1,esi
mov ecx,eax
mov ebx,[ecx] ;ebx = coord x
xor edx,edx
dec ebx
stdcall pole_cell_find, edi, ebx,dword[ecx+4]
cmp eax,0
je @f
mov edx,2
;jmp .set_angle
@@:
;.set_angle:
mov byte[ecx+9],dl ;¯¥à¢®­ ç «ì­®¥ ­ ¯à¢«¥­¨¥ ¢ë室­®£® ᨣ­ « 
.end_p0:
stdcall dword[tl_node_poi_get_next_info], tree1,esi
mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
jmp .cycle0
.cycle0_end:
popad
ret
endp