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 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