use32
	org 0x0
	db 'MENUET01' ;¨¤¥­â¨ä. ¨á¯®«­ï¥¬®£® ä ©«  ¢á¥£¤  8 ¡ ©â
	dd 1,start,i_end,mem,stacktop,0,sys_path

ini_def_c_bkgnd equ 0
ini_def_c_border equ 0xff0000
color_s0 equ 0xff ;ᨣ­ « 0
color_s1 equ 0xffffff ;ᨣ­ « 1
color_s2 equ 0xff00 ;â®çª  ¡¥§ ¯¥à¥á¥ç¥­¨ï
color_s3 equ 0xff0000 ;¢à¥¬¥­­®¥ §­ ç¥­¨¥ ¤«ï á®åà ­¥­¨ï

color_border dd ini_def_c_border
opt_sign_moves dd 4
opt_fast_mode dd 0 ;¡ëáâàë© à¥¦¨¬

debug equ 0

;­®¬ à  ¨ª®­®ª:
el_icon_group equ 0 ;£à㯯®¢ ï
el_icon_points equ 1 ;â®çª¨
el_icon_sub_points equ 2 ;¨§®«ï樨
el_icon_elems equ 3 ;í«¥¬¥­â 
el_icon_captions equ 4 ;¯®¤¯¨á¨

size_el_opt equ 34 ;à §¬¥à áâàãªâãàë á ®¯æ¨ï¬¨ í«¥¬¥­â 
el_offs_nam equ 0 ;ᬥ饭¨¥ ¤«ï ­ ç «  ¨¬¥­¨ í«¥¬¥­â 
el_offs_col equ 16 ;梥â í«¥¬¥­â 
el_offs_box_x equ 20 ;è¨à¨­  ª®à®¡ª¨ í«¥¬¥­â 
el_offs_box_y equ 21 ;¢ëá®â  ª®à®¡ª¨ í«¥¬¥­â 
el_offs_table equ 22 ;㪠§ â¥«ì ­  â ¡«¨æã à ¡®âë í«¥¬¥­â 
el_offs_legs_inp equ 26 ;㪠§ â¥«ì ­  â ¡«¨æã ®¯¨á ­¨ï ¢å®¤­ëå ­®£
el_offs_legs_out equ 30 ;ᬥ饭¨¥ ­  ®¯¨á ­¨¥ ¢ë室­ëå ­®£

sp_offs_el_angle equ 8 ;ᬥ饭¨¥ ¤«ï 㣫  ¯®¢®à®â  í«¥¬¥­â  ¢ ᯨ᪥
sp_offs_el_type equ 9 ;ᬥ饭¨¥ ¤«ï ⨯  í«¥¬¥­â  ¢ ᯨ᪥

points_max equ 1000
capt_offs equ 10 ;ᬥ饭¨¥ ¤«ï ­ ç «  ¯®¤¯¨á¨ ¢ «¨á⥠tree1

include '../../../macros.inc'
include '../../../proc32.inc'
include '../../../KOSfuncs.inc'
include '../../../load_img.inc'
include '../../../develop/libraries/box_lib/trunk/box_lib.mac'
include 'le_pole.inc'
include 'le_signal.inc'

@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
caption db '‹®£¨ç¥áª¨¥ í«¥¬¥­âë 13.02.16',0 ;¯®¤¯¨áì ®ª­ 

panel_0_coord_top equ 5 ;¢¥àå­ïï ª®®à¤¨­ â  0-£® à鸞 ¯ ­¥«¨ ¨­áâà㬥­â®¢
panel_1_coord_top equ 35
panel_2_coord_top equ 60
panel_3_coord_top equ 85

;input:
; eax - coord x
; ebx - coord y
;output:
; eax - coord x + d_x * cos(angle)
; ebx - coord y + d_x * sin(angle)
align 4
proc move_rotate_x_n90 uses ecx edi, d_x:dword, angle:dword
	mov edi,[angle] ;㣮« ¯®¢®à®â  / 90 (®â 0-3)
	and edi,3
	shl edi,4 ;edi*=16
	add edi,mcs

	mov ecx,[d_x]
	imul ecx,dword[edi]
	add eax,ecx

	mov ecx,[d_x]
	imul ecx,dword[edi+8]
	add ebx,ecx
	ret
endp

macro elOpt nam,col,box_x,box_y,table, tbl_i_legs, ol0, ol1, ol2
{
	@@: db nam,0
	rb @b+el_offs_col-$
	dd col
	db box_x
	db box_y
	dd table+0 ;+el_offs_table
	dd tbl_i_legs+0 ;+26 ¢å®¤­ë¥ ­®£¨
;+30 ¢ë室­ë¥ ­®£¨
	db ol0+0, ol1+0, ol2+0, 0
}

align 4
el_opt_beg:
elOpt 'or[2]', 0xff00ff,5,5,tbl_or, tbl_il_2, 2
elOpt 'or[3]', 0xff00ff,5,7,tbl_or, tbl_il_3, 3
elOpt 'or[4]', 0xff00ff,5,9,tbl_or, tbl_il_4, 4
elOpt 'and[2]',0xffff00,5,5,tbl_and.2, tbl_il_2, 2
elOpt 'and[3]',0xffff00,5,7,tbl_and.3, tbl_il_3, 3
elOpt 'and[4]',0xffff00,5,9,tbl_and.4, tbl_il_4, 4
elOpt 'and[5]',0xffff00,5,11,tbl_and.5, tbl_il_5, 5
elOpt 'not',   0xffff,	3,3,tbl_not, tbl_il_1, 1
elOpt 'xor',   0x8000ff,5,5,tbl_xor, tbl_il_2, 2
elOpt 'sm[1]', 0x8080ff,7,7,tbl_sm,  tbl_il_3, 1,4
elOpt 'ms[2]', 0x8080ff,7,14,tbl_ms_2,  tbl_il_m2,6
elOpt 'ms[2]e',0x8080ff,7,17,tbl_ms_2_e,tbl_il_m2e,8
;elOpt 'cd[8]', 0x8000, 7,17,tbl_cd_8,tbl_il_8, 6,2,2 ;è¨äà â®à ­  8 ¢å®¤®¢
.end:
elOpt '???', 0x808080,3,3,tbl_and.3, tbl_il_1, 1 ;­¥ ®¯®§­ ­­ë© í«¥¬¥­â

;â ¡«¨æë ¯® ª®â®àë¬ § ¤ îâáï ¯à ¢¨«  à ¡®âë í«¥¬¥­â®¢
align 4
tbl_or db 0,1,1,1, 1,1,1,1 ;or2, or3
	db 1,1,1,1,1,1,1,1 ;or4
tbl_and:
.5: dq 0,0
.4: dq 0
.3: dd 0
.2: db 0,0,0,1
tbl_xor db 0,1,1,0
tbl_sm db 0,2,2,1, 2,1,1,3
tbl_not db 1,0 ;not

;¬ã«ì⨯«¥ªá®à ¤«ï 2-å à §à來®£® ᨣ­ « 
align 4
tbl_ms_2_e: ;á® ¢å®¤®¬ 'e'
dq 0,0,0,0,0,0,0,0
tbl_ms_2:
db 0,1,0,1,0,1,0,1
db 0,1,0,1,0,1,0,1
db 0,0,1,1,0,0,1,1
db 0,0,1,1,0,0,1,1
db 0,0,0,0,1,1,1,1
db 0,0,0,0,1,1,1,1
dq 0
db 1,1,1,1,1,1,1,1
;tbl_cd_8 db ;256=2^8

;â ¡«¨æë ¤«ï ¢å®¤­ëå ­®£
tbl_il_1 db 1,0   ;ª®à¯ãá ­  1 ­®£ã
tbl_il_2 db 1,2,0 ;ª®à¯ãá ­  2 ­®£¨
tbl_il_3 db 1,2,2,0
tbl_il_4 db 1,2,2,2,0
tbl_il_5 db 1,2,2,2,2,0
tbl_il_m2  db 1,2,2,2,3,2,0
tbl_il_m2e db 1,2,2,2,3,2,3,0
;tbl_il_8 db 1,2,2,2,2,2,2,2,0

time dd 0
tim_ch db 0
pen_mode dd 0 ;०¨¬ à¨á®¢ ­¨ï ¯à®¢®¤ 
pen_coord_x dd 0 ;ª®®à¤¨­ â  x ­ ç «ì­®© â®çª¨ à¨á®¢ ­¨ï
pen_coord_y dd 0

txt_set_0 db '0',0
txt_set_1 db '1',0
;txt_mov_l db 27,0 ;<-
;txt_mov_r db 26,0 ;->

txt_size db 'size',0
txt_elements db 'elements',0
txt_points db 'points',0
txt_sub_points db 'subpoints',0
txt_captions db 'captions',0

;¬ âà¨æ  ª®á¨­ãᮢ ¨ ᨭãᮢ, ¨á¯®«ì§ã¥¬ ï ¤«ï ¯®¢®à®â®¢ ᨣ­ «®¢ ¨ í«¥¬¥­â®¢
align 4
mcs dd 1, 0, 0, 1,\
	   0, 1,-1, 0,\
	  -1, 0, 0,-1,\
	   0,-1, 1, 0

IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
image_data_toolbar dd 0

icon_tl_sys dd 0 ;㪠§ â¥«ì ­  ¯ ¬ïâì ¤«ï åà ­¥­¨ï á¨á⥬­ëå ¨ª®­®ª
icon_toolbar dd 0 ;㪠§ â¥«ì ­  ¯ ¬ïâì ¤«ï åà ­¥­¨ï ¨ª®­®ª ®¡ê¥ªâ®¢

image_data_gray dd 0 ;¯ ¬ïâì á ¢à¥¬¥­­ë¬¨ á¥à묨 ¨§®¡à ¦¥­¨ï¬¨ ¢ ä®à¬ â¥ 24-bit, ¨§ ª®â®àëå ¡ã¤ãâ ᮧ¤ ¢ âìáï âà ä à¥âë

cursors_count equ 4

ini_name db 'log_el.ini',0 ;¨¬ï ä ©« 
ini_sec_color db 'Colors',0
key_color_bkgnd db 'background',0
key_color_border db 'border',0
key_color_s0 db 's0',0
key_color_s1 db 's1',0
key_color_s2 db 's2',0
key_color_captions db 'captions',0
ini_sec_options db 'Options',0
key_opt_sign_moves db 'signal_moves',0
key_opt_fast_mode db 'fast_mode',0

align 4
start:
	load_libraries l_libs_start,l_libs_end
	;¯à®¢¥àª  ­  ᪮«ìª® 㤠筮 § £ã§¨« áì ¡¨¡«¨®â¥ª 
	mov	ebp,lib_7
	cmp	dword [ebp+ll_struc_size-4],0
	jz	@f
		mcall SF_TERMINATE_PROCESS
	@@:
	mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
	mcall SF_SET_EVENTS_MASK,0x27

	;*** áç¨â뢠­¨¥ ­ áâ஥ª ¨§ *.ini ä ©« 
	copy_path ini_name,sys_path,file_name,0x0

	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_bkgnd,ini_def_c_bkgnd
	mov dword[buf_0.color],eax
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_border,ini_def_c_border
	mov dword[color_border],eax
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_s0,color_s0
	mov dword[shem_colors],eax
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_s1,color_s1
	mov dword[shem_colors+4],eax
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_s2,color_s2
	mov dword[shem_colors+8],eax
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_captions,[color_captions]
	mov dword[color_captions],eax

	mov ebx,el_opt_beg+el_offs_nam
	mov ecx,(el_opt_beg.end-el_opt_beg)/size_el_opt ;ª®««¨ç¥á⢮ ⨯®¢ í«¥¬¥­â®¢
	cld
	@@:
		push ecx
		stdcall dword[ini_get_color],file_name,ini_sec_color,ebx,[ebx+el_offs_col-el_offs_nam]
		pop ecx
		mov dword[ebx+el_offs_col-el_offs_nam],eax
		add ebx,size_el_opt
		loop @b

	stdcall dword[ini_get_int],file_name,ini_sec_options,key_opt_sign_moves,[opt_sign_moves]
	mov dword[opt_sign_moves],eax
	stdcall dword[ini_get_int],file_name,ini_sec_options,key_opt_fast_mode,[opt_fast_mode]
	mov dword[opt_fast_mode],eax

	;*** ¯®¤£®â®¢ª  ¤¨ «®£ 
	stdcall [OpenDialog_Init],OpenDialog_data
	stdcall [buf2d_create], buf_0 ;ᮧ¤ ­¨¥ ¡ãä¥à 
	load_image_file 'toolbar.png', image_data_toolbar

	stdcall pole_init, pole
	stdcall dword[tl_data_init], tree1
	stdcall dword[tl_data_init], tree2

	;á¨á⥬­ë¥ ¨ª®­ª¨ 16*16 ¤«ï tree_list
	load_image_file 'tl_sys_16.png', icon_tl_sys
	;¥á«¨ ¨§®¡à ¦¥­¨¥ ­¥ ®âªàë«®áì, â® ¢ icon_tl_sys ¡ã¤ãâ
	;­¥ ¨­¨æ¨ «¨§¨à®¢ ­­ë¥ ¤ ­­ë¥, ­® ®è¨¡ª¨ ­¥ ¡ã¤¥â, â. ª. ¡ãä¥à ­ã¦­®£® à §¬¥à 
	mov eax,dword[icon_tl_sys]
	mov dword[tree1.data_img_sys],eax
	mov dword[tree2.data_img_sys],eax

	load_image_file 'objects.png', icon_toolbar
	mov eax,dword[icon_toolbar]
	mov dword[tree1.data_img],eax
	mov dword[tree2.data_img],eax

	;*** § £à㧪  èà¨äâ 
	load_image_file 'font6x9.bmp', image_data_gray
	stdcall [buf2d_create_f_img], buf_font,[image_data_gray] ;ᮧ¤ ¥¬ ¡ãä¥à
	stdcall mem.Free,[image_data_gray] ;®á¢®¡®¦¤ ¥¬ ¯ ¬ïâì

	stdcall [buf2d_conv_24_to_8], buf_font,1 ;¤¥« ¥¬ ¡ãä¥à ¯à®§à ç­®á⨠8 ¡¨â
	stdcall [buf2d_convert_text_matrix], buf_font

	;*** § £à㧪  ªãàá®à®¢
	load_image_file 'cursors_gr.png',image_data_gray
	stdcall [buf2d_create_f_img], buf_curs_8,[image_data_gray] ;ᮧ¤ ¥¬ ¡ãä¥à
	stdcall mem.Free,[image_data_gray] ;®á¢®¡®¦¤ ¥¬ ¯ ¬ïâì

	load_image_file 'cursors.png',image_data_gray
	stdcall [buf2d_create_f_img], buf_curs,[image_data_gray] ;ᮧ¤ ¥¬ ¡ãä¥à
	stdcall mem.Free,[image_data_gray] ;®á¢®¡®¦¤ ¥¬ ¯ ¬ïâì

	stdcall [buf2d_conv_24_to_8], buf_curs_8,1 ;¤¥« ¥¬ ¡ãä¥à ¯à®§à ç­®á⨠8¡¨â
	stdcall [buf2d_conv_24_to_32],buf_curs,buf_curs_8 ;¤¥« ¥¬ ¡ãä¥à rgba 32¡¨â

	stdcall sign_init, 3000
	mov eax,el_opt_beg+el_offs_nam
	mov ecx,(el_opt_beg.end-el_opt_beg)/size_el_opt ;ª®««¨ç¥á⢮ ⨯®¢ í«¥¬¥­â®¢
	cld
	@@:
		stdcall [tl_node_add], tree2,el_icon_elems shl 16,eax
		stdcall [tl_cur_next], tree2
		add eax,size_el_opt
		loop @b
	stdcall [tl_cur_beg], tree2

	;*** ãáâ ­®¢ª  ¢à¥¬¥­¨ ¤«ï â ©¬¥à 
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
	mov [last_time],eax

align 4
red_win:
	call draw_window

align 4
still:
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
	mov ebx,[last_time]
	add ebx,10 ;§ ¤¥à¦ª 
	cmp ebx,eax
	jge @f
		mov ebx,eax
	@@:
	sub ebx,eax
	mcall SF_WAIT_EVENT_TIMEOUT
	cmp eax,0
	je timer_funct

	cmp al,1
	jz red_win
	cmp al,EV_KEY
	jz key
	cmp al,3
	jz button
	cmp al,EV_MOUSE
	jne @f
		call mouse
	@@:
	jmp still

align 4
timer_funct:
	pushad
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
	mov [last_time],eax

	cmp byte[tim_ch],0
	je @f
		inc dword[time]
	cmp dword[opt_fast_mode],0
	jne .fast_m
		call sign_move
		stdcall [buf2d_draw], buf_0
		mov eax,[time]
		xor edx,edx
		div dword[opt_sign_moves]
		cmp edx,0 ;¯à®¢¥à塞 ªà â­®áâì opt_sign_moves
		jnz @f
			call sign_from_elems
			call sign_from_captions
		jmp @f
	.fast_m:
		mov ecx,[opt_sign_moves]
		cld
		.cycle:
		call sign_move
		loop .cycle
		call sign_from_elems
		call sign_from_captions
		stdcall [buf2d_draw], buf_0
	@@:

	popad
	jmp still

align 4
mouse:
	stdcall [tl_mouse], tree1
	stdcall [tl_mouse], tree2

	pushad
	mcall SF_MOUSE_GET,SSF_BUTTON
	bt eax,0 ;«¥¢ ï ª­®¯ª  ­ ¦ â ?
	jc @f
	bt eax,1 ;¯à ¢ ï ª­®¯ª  ­ ¦ â ?
	jc @f
		xor eax,eax
		mov [pen_coord_x],eax
		mov [pen_coord_y],eax
		jmp .end_buf_wnd
	@@:
	mov esi,eax

	mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;eax = (x shl 16) + y
	cmp ax,word[buf_0.t]
	jl .end_buf_wnd ;­¥ ¯®¯ «¨ ¢ ®ª­® ¡ãä¥à  ¯® ®á¨ y

	mov ebx,eax
	shr ebx,16
	cmp bx,word[buf_0.l]
	jl .end_buf_wnd ;­¥ ¯®¯ «¨ ¢ ®ª­® ¡ãä¥à  ¯® ®á¨ x

		and eax,0xffff ;®áâ ¢«ï¥¬ ª®®à¤¨­ âã y
		sub ax,word[buf_0.t]
		sub bx,word[buf_0.l]
		;*** ¤¥«¥­¨¥ ­  zoom
		movzx ecx,byte[zoom]
		xor edx,edx
		div ecx
		xchg eax,ebx ;ebx ¤¥«¨¬ ­  ecx
		xor edx,edx
		div ecx

		sub eax,[Cor_x]
		sub ebx,[Cor_y]

		;*** ¯à®¢¥àª  ­  ¯®¯ ¤¥­¨¥ ¢ á奬ã
		bt eax,31
		jc .end_buf_wnd
		bt ebx,31
		jc .end_buf_wnd
		cmp eax,[shem_w]
		jge .end_buf_wnd
		cmp ebx,[shem_h]
		jge .end_buf_wnd

		cmp byte[pen_mode],0
		jne .end_mode_0
			bt esi,1
			jc .end_mode_0
			;०¨¬ ªãàá®à  (¢ë¡®à í«¥¬¥­â  ¯à¨ ­ ¦ â¨¨)
			stdcall element_is_click,eax,ebx
			test eax,eax
			jz .end_buf_wnd ;¯à¨ ­ ¦ â¨¨ ­¥ ¯®¯ «¨ ­¨ ­  ®¤¨­ ¨§ í«¥¬¥­â®¢
				push eax
					stdcall [tl_node_get_data], tree1
					mov ebx,eax
				pop eax
				cmp eax,ebx
				je .end_buf_wnd ;¥á«¨ 㦥 ªãàá®à á⮨â â ¬ £¤¥ ­ã¦­®
				
				stdcall [tl_cur_beg], tree1
				.cycle0:
				push eax
					stdcall [tl_node_get_data], tree1
					mov ebx,eax
				pop eax
				test ebx,ebx
				jz .end_buf_wnd
				cmp eax,ebx
				je @f
					stdcall [tl_cur_next], tree1
					jmp .cycle0
				@@:
				stdcall [tl_draw], tree1
			jmp .end_buf_wnd
		.end_mode_0:
		cmp byte[pen_mode],1
		jne .end_mode_1
			;०¨¬ à¨á®¢ ­¨ï ¯à®¢®¤ 
			cmp dword[pen_coord_x],0
			jne @f
			cmp dword[pen_coord_y],0
			jne @f
				mov [pen_coord_x],eax
				mov [pen_coord_y],ebx
			@@:

			cmp dword[pen_coord_x],eax
			je .beg_draw
			cmp dword[pen_coord_y],ebx
			je .beg_draw

			mov ecx,eax
			sub ecx,[pen_coord_x]
			bt ecx,31
			jnc @f
				neg ecx
				inc ecx
			@@:
			mov edx,ebx
			sub edx,[pen_coord_y]
			bt edx,31
			jnc @f
				neg edx
				inc edx
			@@:
			cmp ecx,edx
			jl @f
				mov ebx,[pen_coord_y] ;¯à¨¢ï§ª  ª ª®®à¤¨­ â¥ y
				jmp .beg_draw
			@@:
			mov eax,[pen_coord_x] ;¯à¨¢ï§ª  ª ª®®à¤¨­ â¥ x

			.beg_draw:
			bt esi,1
			jc @f
				stdcall pole_cell_creat, pole,eax,ebx,0
				;­¨ç¥£® ­¥ ã¡à «®áì redraw_pole ­¥ ¯®¤å®¤¨â, â. ª. ç¨áâ¨âì ¯®«¥ ­¥ ­ã¦­®
				stdcall pole_paint, pole
				stdcall [buf2d_draw], buf_0
				jmp .end_buf_wnd
			@@:
				stdcall pole_cell_delete, pole,eax,ebx
				call redraw_pole
				jmp .end_buf_wnd
		.end_mode_1:
		cmp byte[pen_mode],2
		jne @f
			;०¨¬ à¨á®¢ ­¨ï ¨§®«ï樨 ¤«ï ¯à®¢®¤ 
			bt esi,1
			jc .mode_2_del
				stdcall pole_cell_creat, pole,eax,ebx,2
				jmp .mode_2_draw
			.mode_2_del:
				;áâ¨à ­¨¥ ¨§®«ï樨
				mov ecx,eax
				stdcall pole_cell_find, pole,ecx,ebx
				test eax,eax
				jz .end_buf_wnd
				stdcall pole_cell_creat, pole,ecx,ebx,0
			.mode_2_draw:
			stdcall pole_paint, pole
			stdcall [buf2d_draw], buf_0
			jmp .end_buf_wnd
		@@:
		cmp byte[pen_mode],3
		jne @f
			bt esi,1
			jc @f
			;०¨¬ áâ¨à ­¨ï ¯à®¢®¤ 
			stdcall pole_cell_delete, pole,eax,ebx
			call redraw_pole
			jmp .end_buf_wnd
		@@:
		cmp byte[pen_mode],4
		jne @f
			bt esi,1
			jc .rotate
			;०¨¬ ᮧ¤ ­¨ï í«¥¬¥­â®¢
			stdcall shem_element_creat, eax,ebx
			stdcall pole_paint, pole
			stdcall [buf2d_draw], buf_0
			jmp .end_buf_wnd
			.rotate:
			;¯®¢®à®â í«¥¬¥­â®¢ ­  90 £à ¤ãᮢ
			stdcall element_is_click,eax,ebx
			test eax,eax
			jz .end_buf_wnd
				inc byte[eax+sp_offs_el_angle]
				and byte[eax+sp_offs_el_angle],3 ;¤«ï ª®­âà®«ï ­  ¯¥à¥¯®«­¥­¨¥
				call redraw_pole
			jmp .end_buf_wnd
		@@:

	.end_buf_wnd:
if debug
stdcall but_test_pole, pole
end if
	popad
	ret

;output:
; eax - pointer to element data
align 4
proc element_is_click uses ebx ecx edx esi edi, coord_x:dword, coord_y:dword
	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_p1
			stdcall [tl_node_poi_get_data], tree1,esi
			mov ecx,eax

			movzx edx,byte[ecx+sp_offs_el_type]
			imul edx,size_el_opt
			add edx,el_opt_beg ;­ å®¤¨¬ ®¯æ¨î ᮠ᢮©á⢠¬¨ ¤ ­­®£® í«¥¬¥­â 

			mov eax,[ecx] ;element coord x
			mov ebx,[ecx+4] ;element coord y
			movzx edi,byte[ecx+sp_offs_el_angle]
			push edi
			movzx edi,byte[edx+el_offs_box_y]
			dec edi
			push edi
			movzx edi,byte[edx+el_offs_box_x]
			dec edi
			push edi
			stdcall move_rotate_n90 ;,[edx+el_offs_box_x],[edx+el_offs_box_y],[ecx+sp_offs_el_angle]
			;Rect(eax,ebx,[ecx],[ecx+4])
			stdcall point_in_rect, [coord_x],[coord_y], eax,ebx,[ecx],[ecx+4]
			test eax,eax
			jz .end_add_p1
				mov eax,ecx
				jmp .end_f
		.end_add_p1:
		stdcall dword[tl_node_poi_get_next_info], tree1,esi
		mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
		jmp @b
	@@:
		xor eax,eax ;¥á«¨ ­¥ ­ è«¨
	.end_f:
	ret
endp

;¯à®¢¥àª  ¯®¯ ¤¥­¨ï â®çª¨ ¢ ¯àאַ㣮«ì­¨ª
;१ã«ìâ â:
; ¥á«¨ ­¥ ¯®¯ ¤ ¥â â® eax=0
; ¥á«¨ ¯®¯ ¤ ¥â â® eax=1
align 4
proc point_in_rect uses ebx ecx, px:dword, py:dword, rx0:dword, ry0:dword, rx1:dword, ry1:dword
	xor eax,eax

	;¯à®¢¥àª  ¯® ®á¨ x
	mov ebx,[rx0]
	mov ecx,[rx1]
	cmp ebx,ecx
	jle @f
		xchg ebx,ecx
	@@:
	cmp ebx,[px]
	jg .no_contains
	cmp ecx,[px]
	jl .no_contains

	;¯à®¢¥àª  ¯® ®á¨ y
	mov ebx,[ry0]
	mov ecx,[ry1]
	cmp ebx,ecx
	jle @f
		xchg ebx,ecx
	@@:
	cmp ebx,[py]
	jg .no_contains
	cmp ecx,[py]
	jl .no_contains

	;¥á«¨ ¯®¯ «¨ â® eax=1
		inc eax
		;stdcall draw_scaled_rect, [rx0],[ry0],[rx1],[ry1], 0xffffff
		;stdcall [buf2d_draw], buf_0
	.no_contains:
	ret
endp

align 4
draw_window:
pushad
	mcall SF_REDRAW,SSF_BEGIN_DRAW

	; *** à¨á®¢ ­¨¥ £« ¢­®£® ®ª­  (¢ë¯®«­ï¥âáï 1 à § ¯à¨ § ¯ã᪥) ***
	mov edx,[sc.work]
	or  edx,(3 shl 24)+0x10000000+0x20000000
	mov edi,caption
	mcall SF_CREATE_WINDOW, (20 shl 16)+580,(20 shl 16)+415

	; *** ᮧ¤ ­¨¥ ª­®¯®ª ­  ¯ ­¥«ì ***
	mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (panel_0_coord_top shl 16)+20, 3,, [sc.work_button]

	add ebx,25 shl 16
	mov edx,4
	int 0x40

	add ebx,25 shl 16
	mov edx,5
	int 0x40

	add ebx,30 shl 16
	mov edx,6 ;¯ã᪠| ®áâ ­®¢ª 
	int 0x40

	add ebx,25 shl 16
	mov edx,7
	int 0x40

	add ebx,25 shl 16
	mov edx,8
	int 0x40

	add ebx,25 shl 16
	mov edx,9
	int 0x40

	add ebx,25 shl 16
	mov edx,10
	int 0x40

	add ebx,25 shl 16
	mov edx,11
	int 0x40

	add ebx,25 shl 16
	mov edx,12
	int 0x40

	add ebx,30 shl 16
	mov edx,13 ;業â஢ª  á奬ë
	int 0x40

	add ebx,25 shl 16
	mov edx,14
	int 0x40

	add ebx,25 shl 16
	mov edx,15
	int 0x40

	add ebx,25 shl 16
	mov edx,16 ;ᤢ¨£ áå¥¬ë ¢¢¥àå
	int 0x40

	add ebx,25 shl 16
	mov edx,17 ;ᤢ¨£ áå¥¬ë ¢­¨§
	int 0x40

	; *** à¨á®¢ ­¨¥ ¨ª®­®ª ­  ª­®¯ª å ***
	mov edx,(7 shl 16)+panel_0_coord_top+2 ;icon new
	mcall SF_PUT_IMAGE, [image_data_toolbar],(16 shl 16)+16

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;icon open
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;icon save
	int 0x40

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(30 shl 16) ;+
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;-
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;m
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;m
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;m
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;m
	int 0x40

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(30 shl 16) ;center
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;m
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;m
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;m
	int 0x40
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;m
	int 0x40

	; *** à¨á®¢ ­¨¥ ¡ãä¥à  ***
	stdcall [buf2d_draw], buf_0
	mov dword[wScr1.all_redraw],1
	stdcall [tl_draw], tree1
	mov dword[wScr2.all_redraw],1
	stdcall [tl_draw], tree2
	stdcall pole_draw_pok, pole

	; *** ᮧ¤ ­¨¥ ª­®¯®ª ãáâ ­®¢ª¨ ᨣ­ «®¢ set_0 ¨ set_1 ***
	mov esi,[sc.work_button]
	mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (panel_1_coord_top shl 16)+20, 20

	add ebx,25 shl 16
	mov edx,21
	int 0x40

	add ebx,30 shl 16
	mov edx,22
	int 0x40

	add ebx,25 shl 16
	mov edx,23
	int 0x40

	add ebx,25 shl 16
	mov edx,24
	int 0x40

	add ebx,25 shl 16
	mov edx,25
	int 0x40

	mov ecx,[sc.work_text]
	or  ecx,0x80000000 ;or (1 shl 30)
	;mov edi,[sc.work]
	mcall SF_DRAW_TEXT, (12 shl 16)+panel_1_coord_top+6,, txt_set_0

	add ebx,25 shl 16
	mov edx,txt_set_1
	int 0x40

	; *** à¨á®¢ ­¨¥ ¨ª®­®ª ­  ª­®¯ª å ***
	mov ebx,[image_data_toolbar]
	add ebx,IMAGE_TOOLBAR_ICON_SIZE*15
	mcall SF_PUT_IMAGE,, (16 shl 16)+16, (62 shl 16)+panel_1_coord_top+2

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16)
	int 0x40

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16)
	int 0x40

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16)
	int 0x40

	; *** ᮧ¤ ­¨¥ ª­®¯®ª à¨á®¢ ­¨ï ¯à®¢®¤  ***
	mov esi,[sc.work_button]
	mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (panel_2_coord_top shl 16)+20, 30

	add ebx,30 shl 16
	mov edx,31
	int 0x40

	add ebx,25 shl 16
	mov edx,32
	int 0x40

	add ebx,25 shl 16
	mov edx,33
	int 0x40

	add ebx,25 shl 16
	mov edx,34
	int 0x40

	add ebx,25 shl 16
	mov edx,35
	int 0x40

	; *** à¨á®¢ ­¨¥ ¨ª®­®ª ­  ª­®¯ª å ***
	mov ebx,[image_data_toolbar]
	add ebx,IMAGE_TOOLBAR_ICON_SIZE*19
	mcall SF_PUT_IMAGE,, (16 shl 16)+16,(7 shl 16)+panel_2_coord_top+2 ;¨ª®­ª  áâ५ 

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(30 shl 16) ;icon - à¨á®¢ ­¨¥ ¯à®¢®¤ 
	int 0x40

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;icon - à¨á®¢ ­¨¥ ¯¥à¥á¥ç¥­¨© ¯à®¢®¤®¢
	int 0x40

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;icon - à¨á®¢ ­¨¥ «®£¨ç¥áª¨å í«¥¬¥­â®¢
	int 0x40

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;icon - à¨á®¢ ­¨¥ ¯®¤¯¨á¥©
	int 0x40

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	add edx,(25 shl 16) ;icon - § â¨à çª 
	int 0x40

	mcall SF_REDRAW,SSF_END_DRAW
popad
	ret

align 4
key:
	mcall SF_GET_KEY
	stdcall [tl_key], tree1
	stdcall [tl_key], tree2
	jmp still


align 4
button:
	mcall SF_GET_BUTTON
	cmp ah,3
	jne @f
		call but_new_file
		jmp still
	@@:
	cmp ah,4
	jne @f
		call but_open_file
		jmp still
	@@:
	cmp ah,5
	jne @f
		call but_save_file
		jmp still
	@@:
	cmp ah,6
	jne @f
		call but_run_stop
		jmp still
	@@:
	cmp ah,7
	jne @f
		call but_zoom_p
		jmp still
	@@:
	cmp ah,8
	jne @f
		call but_zoom_m
		jmp still
	@@:
	cmp ah,9
	jne @f
		call but_pole_left
		jmp still
	@@:
	cmp ah,10
	jne @f
		call but_pole_right
		jmp still
	@@:
	cmp ah,11
	jne @f
		call but_pole_up
		jmp still
	@@:
	cmp ah,12
	jne @f
		call but_pole_dn
		jmp still
	@@:
	cmp ah,13
	jne @f
		call but_center
		jmp still
	@@:

	;¯¥à¥¤¢¨¦¥­¨¥ ¢á¥å ®¡ê¥ªâ®¢ á奬ë
	cmp byte[tim_ch],0
	jne .no_move
	cmp ah,14
	jne @f
		stdcall pole_move_all, pole, -1, 0
		call redraw_pole
	@@:
	cmp ah,15
	jne @f
		stdcall pole_move_all, pole, 1, 0
		call redraw_pole
	@@:
	cmp ah,16 ;ᤢ¨£ áå¥¬ë ¢¢¥àå
	jne @f
		stdcall pole_move_all, pole, 0, -1
		call redraw_pole
	@@:
	cmp ah,17 ;ᤢ¨£ áå¥¬ë ¢­¨§
	jne @f
		stdcall pole_move_all, pole, 0, 1
		call redraw_pole
	@@:
	.no_move:

	cmp ah,20
	jne @f
		call but_set_0
	@@:
	cmp ah,21
	jne @f
		call but_set_1
	@@:
	cmp ah,22
	jne @f
		call but_mov_l
	@@:
	cmp ah,23
	jne @f
		call but_mov_r
	@@:
	cmp ah,24
	jne @f
		call but_mov_u
	@@:
	cmp ah,25
	jne @f
		call but_mov_d
	@@:
	cmp ah,30
	jne @f
		call but_set_none
	@@:
	cmp ah,31
	jne @f
		stdcall set_pen_mode,1,0,((9 shl 8)+9) shl 16 ;ãáâ ­®¢ª  ०¨¬  à¨á®¢ ­¨ï ¯à®¢®¤ 
	@@:
	cmp ah,32
	jne @f
		stdcall set_pen_mode,2,1,((9 shl 8)+9) shl 16
	@@:
	cmp ah,33
	jne @f
		stdcall set_pen_mode,4,3,((9 shl 8)+9) shl 16 ;ãáâ ­®¢ª  ०¨¬  ᮧ¤ ­¨ï í«¥¬¥­â®¢
	@@:
	cmp ah,35
	jne @f
		stdcall set_pen_mode,3,2,((15 shl 8)+9) shl 16 ;ãáâ ­®¢ª  ०¨¬  áâ¨à ­¨ï ¯à®¢®¤ 
	@@:
	cmp ah,1
	jne still
.exit:
	stdcall [buf2d_delete],buf_0
	stdcall [buf2d_delete],buf_font
	stdcall [buf2d_delete],buf_curs
	stdcall mem.Free,[image_data_toolbar]
	stdcall pole_delete, pole
	call sign_delete
	stdcall [tl_data_clear], tree1
	;ç¨á⨬ 㪠§ â¥«¨ ­  ¨§®¡à ¦¥­¨ï, ª®â®àë¥ ¡ë«¨ ®¡é¨¬¨ ¤«ï «¨á⮢ ¨ 㤠«¥­ë «¨á⮬ tree1
	mov dword[tree2.data_img_sys],0
	mov dword[tree2.data_img],0
	stdcall [tl_data_clear], tree2
	cmp [cursor_pointer],0
	je @f
		mcall SF_MOUSE_GET,SSF_DEL_CURSOR,[cursor_pointer]
	@@:
	mcall SF_TERMINATE_PROCESS

;ᮧ¤ ­¨¥ ­®¢®© á奬ë
align 4
proc but_new_file uses eax
	call but_set_none
	stdcall [tl_info_clear],tree1
	stdcall [tl_draw],tree1
	xor eax,eax
	mov [shem_elems],eax
	mov [shem_captions],eax
	stdcall pole_clear, pole
	call redraw_pole
	ret
endp

align 4
f_size dd 0 ;à §¬¥à ®âªà뢠¥¬®£® ä ©« 
shem_w dd 192 ;è¨à¨­  á奬ë
shem_h dd 128 ;¢ëá®â  á奬ë
shem_points dd 0 ;ª®««¨ç¥á⢮ 㧫®¢ ­  á奬¥
shem_sub_points dd 0 ;ª®««¨ç¥á⢮ ¨§®«¨à®¢ ­­ëå 㧫®¢ ­  á奬¥
shem_elems dd 0 ;ª®««¨ç¥á⢮ í«¥¬¥­â®¢ ­  á奬¥
shem_captions dd 0
shem_colors:
	dd color_s0, color_s1, color_s2, color_s3
color_captions dd 0x808080

align 4
open_file_lif:
	rb 2*4096 ;®¡« áâì ¤«ï ®âªàëâ¨ï ä ©«®¢
.end:

align 4
but_open_file:
	pushad
	copy_path open_dialog_name,communication_area_default_path,file_name,0
	mov [OpenDialog_data.type],0
	stdcall [OpenDialog_Start],OpenDialog_data
	cmp [OpenDialog_data.status],1 ;0 - Cancel 1 - Open 2 - Error open dialog
	jne .end_open_file
	;ª®¤ ¯à¨ 㤠筮¬ ®âªàë⨨ ¤¨ «®£ 

	mov [run_file_70.Function], SSF_READ_FILE
	mov [run_file_70.Position], 0
	mov [run_file_70.Flags], 0
	mov dword[run_file_70.Count], open_file_lif.end-open_file_lif
	m2m [run_file_70.Buffer], open_file_lif
	mov byte[run_file_70+20], 0
	mov dword[run_file_70.FileName], openfile_path
	mcall SF_FILE,run_file_70 ;§ £à㦠¥¬ ä ©«
	cmp ebx,0xffffffff
	je .end_open_file

		mov dword[f_size],ebx
		add ebx,open_file_lif
		mov byte[ebx],0 ;­  á«ãç © ¥á«¨ à ­¥¥ ¡ë« ®âªàëâ ä ©« ¡®«ì襣® à §¬¥à  ç¨á⨬ ª®­¥æ ¡ãä¥à  á ä ©«®¬
		mcall SF_SET_CAPTION,1,openfile_path
		;---

		;§ ¤ ¥¬ ¬¨­¨¬ «ì­ë¥ §­ ç¥­¨ï, ­  á«ãç © ¥á«¨ ¢ ä ©«¥ ¡ã¤ãâ ­¥ª®à¥ªâ­ë¥ à §¬¥àë
		mov dword[shem_w],5
		mov dword[shem_h],5

		mov esi,txt_size
		call str_analiz_r
		cmp edi,0
		je @f
			stdcall str_len,esi
			add edi,eax
			stdcall conv_str_to_int,edi
			cmp eax,5
			jl @f ;®è¨¡ª  ¢ ä ©«¥ (­  .end_open_file ­¥ ¯¥à¥å®¤¨¬, ¯ëâ ¥¬áï ¯à®ç¨â âì ¤àã£ãî ¨­ä®à¬ æ¨î)
			mov dword[shem_w],eax

			call str_next_val
			stdcall conv_str_to_int,edi
			cmp eax,5
			jl @f ;®è¨¡ª  ¢ ä ©«¥
			mov dword[shem_h],eax
		@@:

		stdcall [tl_info_clear],tree1

		;*** ¤®¡ ¢«¥­¨¥ ¢ ᯨ᮪ «®£¨ç¥áª¨å í«¥¬¥­â®¢ ***
		stdcall [tl_node_add], tree1,(el_icon_group shl 16),txt_elements-capt_offs
		stdcall [tl_cur_next], tree1

		mov esi,txt_elements
		call str_analiz_r
		cmp edi,0
		je .end_elems
			stdcall str_len,esi
			add edi,eax
			stdcall conv_str_to_int,edi
			cmp eax,0
			jle .end_elems ;¥á«¨ ç¨á«® í«¥¬¥­â®¢ = 0
			mov [shem_elems],eax
			mov ecx,eax
			.cycle_elem:
				call str_next_val
				stdcall conv_str_to_int,edi
				mov dword[txt_buf],eax ;ª®®à¤¨­ â  x
				call str_next_val
				stdcall conv_str_to_int,edi
				mov dword[txt_buf+4],eax ;ª®®à¤¨­ â  y
				call str_next_val
				stdcall conv_str_to_int,edi
				mov byte[txt_buf+sp_offs_el_angle],al ;­ ¯à ¢«¥­¨¥
				call str_next_val
				;¯®  ¤à¥áã edi ­ §¢ ­¨¥ í«¥¬¥­â 
				stdcall el_get_name, edi,13 ;13 - ascii code
				mov byte[txt_buf+sp_offs_el_type],al ;⨯ í«¥¬¥­â 

				stdcall make_list_capts,txt_buf,edi

				stdcall [tl_node_add], tree1,(el_icon_elems shl 16)+1,txt_buf
				stdcall [tl_cur_next], tree1
				dec ecx
				jnz .cycle_elem
		.end_elems:

		;*** ¤®¡ ¢«¥­¨¥ ¢ ᯨ᮪ ⥪á⮢ëå ¯®¤¯¨á¥© ***
		stdcall [tl_node_add], tree1,(el_icon_group shl 16),txt_captions-capt_offs
		stdcall [tl_cur_next], tree1

		mov esi,txt_captions
		call str_analiz_r
		cmp edi,0
		je .end_captions
			stdcall str_len,esi
			add edi,eax
			stdcall conv_str_to_int,edi
			cmp eax,0
			jle .end_captions ;¥á«¨ ç¨á«® ¯®¤¯¨á¥© = 0
			mov [shem_captions],eax
			mov ecx,eax
			.cycle_captions:
				call str_next_val
				stdcall conv_str_to_int,edi
				mov dword[txt_buf],eax ;ª®®à¤¨­ â  x
				call str_next_val
				stdcall conv_str_to_int,edi
				mov dword[txt_buf+4],eax ;ª®®à¤¨­ â  y
				call str_next_val
				mov al,byte[edi] 
				mov byte[txt_buf+8],al ;¢¨¤ ¯®¤¯¨á¨ ('z' - ᨣ­ « á 0, 'o' - ᨣ­ « á 1, 'n' - ­¥â ᨣ­ « )
				call str_next_val

				stdcall make_list_capts,txt_buf,edi

				stdcall [tl_node_add], tree1,(el_icon_captions shl 16)+1,txt_buf
				stdcall [tl_cur_next], tree1
				dec ecx
				jnz .cycle_captions
		.end_captions:

		mov byte[txt_buf+capt_offs],0 ;®¡­ã«¥­¨¥ ¯®¤¯¨á¥©

		;*** ¤®¡ ¢«¥­¨¥ ¢ ᯨ᮪ ª«î祢ëå â®ç¥ª ***
		stdcall [tl_node_add], tree1,(el_icon_group shl 16),txt_points-capt_offs
		stdcall [tl_cur_next], tree1

		mov dword[shem_points],0
		mov esi,txt_points
		call str_analiz_r
		cmp edi,0
		je .end_points ;¥á«¨ ®¯¨á ­¨ï â®ç¥ª ­¥â ¢ ä ©«¥
			stdcall str_len,esi
			add edi,eax
			stdcall conv_str_to_int,edi
			cmp eax,0
			jle .end_points ;¥á«¨ ç¨á«® â®ç¥ª = 0
			mov [shem_points],eax
			mov ecx,eax
			.cycle_poi:
				call str_next_val
				stdcall conv_str_to_int,edi
				mov dword[txt_buf],eax ;ª®®à¤¨­ â  x
				call str_next_val
				stdcall conv_str_to_int,edi
				mov dword[txt_buf+4],eax ;ª®®à¤¨­ â  y
				call str_next_val
				stdcall conv_str_to_int,edi
				mov byte[txt_buf+8],al ;­ ¯à ¢«¥­¨ï

				stdcall [tl_node_add], tree1,(el_icon_points shl 16)+1,txt_buf
				stdcall [tl_cur_next], tree1
				dec ecx
				jnz .cycle_poi
		.end_points:

		stdcall [tl_cur_beg], tree1

	;*** ¤®¡ ¢«¥­¨¥ â®ç¥ç­ëå ®¡ê¥ªâ®¢ ***
	stdcall pole_clear, pole
	stdcall dword[tl_node_poi_get_info], tree1,0
	mov esi,eax
	@@:
		cmp esi,0
		je @f
		cmp word[esi],el_icon_points ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨, ¨ ¯à®¯ã᪠­¥ â®ç¥ç­ëå ®¡ê¥ªâ®¢
		jne .end_add_p0
			stdcall [tl_node_poi_get_data], tree1,esi
			stdcall pole_cell_creat, pole,dword[eax],dword[eax+4],0
		.end_add_p0:
		stdcall dword[tl_node_poi_get_next_info], tree1,esi
		mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
		jmp @b
	@@:
	stdcall pole_sort, 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

			xor edx,edx ;edx - ­®¬¥à ¢å®¤­®© ­®£¨
			.add_p1:
				stdcall el_get_leg_coords, ecx,edx
				test eax,eax
				jnz .add_beg1
				test ebx,ebx
				jnz .add_beg1
					jmp .end_add_p1 ;¥á«¨ ª®®à¤¨­ âë ­¥ ¢§ï«¨áì (eax=0 && ebx=0), ¢ë室 ¨§ 横« 
				.add_beg1:
				stdcall pole_cell_creat, pole,eax,ebx,0
				inc edx
				jmp .add_p1
			.end_add_p1:

			mov edx,(1 shl 16) ;edx - ­®¬¥à ¢ë室­®© ­®£¨
			.add_p2:
				stdcall el_get_leg_coords, ecx,edx
				test eax,eax
				jnz .add_beg2
				test ebx,ebx
				jnz .add_beg2
					jmp .end_add_p2 ;¥á«¨ ª®®à¤¨­ âë ­¥ ¢§ï«¨áì (eax=0 && ebx=0), ¢ë室 ¨§ 横« 
				.add_beg2:
				stdcall pole_cell_creat, pole,eax,ebx,0
				inc edx
				jmp .add_p2
			.end_add_p2:

		.end_add_p3:
		stdcall dword[tl_node_poi_get_next_info], tree1,esi
		mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
		jmp @b
	@@:
	stdcall pole_sort, pole

	;*** ¤®¡ ¢«¥­¨¥ â®ç¥ç­ëå ®¡ê¥ªâ®¢ (­  ®á­®¢¥ ¯®¤¯¨á¥©) ***
	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_p6
			stdcall [tl_node_poi_get_data], tree1,esi
			mov ecx,eax
			cmp byte[ecx+8],'n'
			je .end_add_p6
				stdcall pole_cell_creat, pole,[ecx],[ecx+4],0
		.end_add_p6:
		stdcall dword[tl_node_poi_get_next_info], tree1,esi
		mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
		jmp @b
	@@:
	stdcall pole_sort, pole

	;*** à¨á®¢ ­¨¥ ¯à®¢®¤®¢ (­  ®á­®¢¥ â®ç¥ç­ëå ®¡ê¥ªâ®¢) ***
	stdcall dword[tl_node_poi_get_info], tree1,0
	mov esi,eax
	xor ecx,ecx
	@@:
		cmp esi,0
		je @f
		cmp word[esi],el_icon_points ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨, ¨ ¯à®¯ã᪠­¥ â®ç¥ç­ëå ®¡ê¥ªâ®¢
		jne .end_add_p4
			stdcall [tl_node_poi_get_data], tree1,esi
			movzx ebx,byte[eax+8]
			stdcall shem_create_line, dword[eax],dword[eax+4],ebx
			add ecx,edx
		.end_add_p4:
		stdcall dword[tl_node_poi_get_next_info], tree1,esi
		mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
		cmp ecx,250 ;ecx - ç¨á«® ¤®¡ ¢«¥­­ëå â®ç¥ª
		jl @b
		xor ecx,ecx
		stdcall pole_sort, pole ;á®àâ¨à㥬 ¤«ï ®¯â¨¬¨§ æ¨¨ ¡ëáâத¥©á⢨ï
		jmp @b
	@@:
	stdcall pole_sort, pole

		stdcall pole_reset_cells, pole ;ç¨á⪠ ¯à®¢®¤®¢

		;*** ¤®¡ ¢«¥­¨¥ ¨§®«ï樮­­ëå ®¡ê¥ªâ®¢ (¯àאַ ¨§ ä ©« , ¬¨­ãï § ¯¨áì ¢ ᯨ᮪) ***
		mov dword[shem_sub_points],0
		mov esi,txt_sub_points
		call str_analiz_r
		cmp edi,0
		je .end_sub_points ;¥á«¨ ®¯¨á ­¨ï â®ç¥ª ­¥â ¢ ä ©«¥
			stdcall str_len,esi
			add edi,eax
			stdcall conv_str_to_int,edi
			cmp eax,0
			jle .end_sub_points ;¥á«¨ ç¨á«® â®ç¥ª = 0
			mov [shem_sub_points],eax
			mov ecx,eax
			.cycle_sub_poi:
				call str_next_val
				stdcall conv_str_to_int,edi
				mov ebx,eax ;ª®®à¤¨­ â  x
				call str_next_val
				stdcall conv_str_to_int,edi ;ª®®à¤¨­ â  y
				stdcall pole_cell_creat, pole,ebx,eax,2

				dec ecx
				jnz .cycle_sub_poi
		.end_sub_points:

		stdcall pole_sort, pole

		;*** 㤠«¥­¨¥ ª«î祢ëå â®ç¥ª ᮠᯨ᪠ ***
		mov ecx,[shem_points]
		inc ecx
		cld
		@@:
			stdcall [tl_info_undo],tree1
		loop @b

		;*** ä®à¬¨à®¢ ­¨¥ ¯®¤¯¨á¥© ® ¯ à ¬¥âà å á奬ë ***
		mov dword[txt_info.size],0
		mov eax,dword[shem_w]
		mov edi,txt_info.size
		call convert_int_to_str
		stdcall str_cat, edi,txt_mull
		mov eax,dword[shem_h]
		mov edi,txt_buf
		call convert_int_to_str
		stdcall str_cat, txt_info.size,edi
		stdcall str_cat, txt_info.size,txt_space ;§ ¢¥àè î騩 ¯à®¡¥«

		;---
		call but_center ;業â஢ª  á奬ë á ãç¥â®¬ shem_w ¨ shem_h
		call but_set_none
	.end_open_file:
	popad
	ret

align 4
proc but_save_file
locals
	napr dd ?
	s_param dd ? ;¯ à ¬¥âà ¤«ï ªà á¨¢®£® á®åà ­¥­¨ï
endl
pushad
	;*** ¢ë§®¢ ¤¨ «®£®¢®£® ®ª­  ¤«ï á®åà ­¥­¨ï ä ©« 
	copy_path open_dialog_name,communication_area_default_path,file_name,0
	mov [OpenDialog_data.type],1
	stdcall [OpenDialog_Start],OpenDialog_data
	cmp [OpenDialog_data.status],1 ;if status==1 then save
	jne .end_save_file

	;*** ¯à®¢¥àª  ¥áâì «¨ ¯à®¢®¤  ­  á奬¥
	mov edi,pole
	mov esi,pole_index
	cmp dword[esi],0
	je .cycle1_beg ;.end_save_file ;¥á«¨ ­¥â ï祥ª (¯à®¢®¤®¢) â® ¢ë室

	;*** ãáâ ­ ¢«¨¢ ¥¬ ¬¥âª¨ ­  ª«îç¥¢ë¥ â®çª¨, ª®â®àë¥ ¡ã¤ãâ á®åà ­¥­ë ¢ ä ©«
	mov dword[shem_points],0 ;¤«ï ¯¥à¥®¯à¥¤¥«¥­¨ï â®ç¥ª
	mov dword[shem_sub_points],0
	mov ecx,dword[esi]
	.cycle0: ;横« ¯® ¢á¥¬ â®çª ¬
		add esi,4
		mov ebx,[esi]
		imul ebx,sizeof.Cell
		add ebx,pole_data

		cmp byte[ebx+offs_cell_liv],2
		jne @f
			inc dword[shem_sub_points]
			jmp .cycle0_next
		@@:

		mov dword[napr],0

		mov edx,[ebx+offs_cell_y]
		push edx
		mov edx,[ebx+offs_cell_x]
		inc edx
		push edx
		stdcall pole_cell_find, edi
		cmp eax,0
		je @f
			or dword[napr],1
		@@:

		mov edx,[ebx+offs_cell_y]
		inc edx
		push edx
		mov edx,[ebx+offs_cell_x]
		push edx
		stdcall pole_cell_find, edi
		cmp eax,0
		je @f
			or dword[napr],2
		@@:

		mov edx,[ebx+offs_cell_y]
		push edx
		mov edx,[ebx+offs_cell_x]
		dec edx
		push edx
		stdcall pole_cell_find, edi
		cmp eax,0
		je @f
			or dword[napr],4
		@@:

		mov edx,[ebx+offs_cell_y]
		dec edx
		push edx
		mov edx,[ebx+offs_cell_x]
		push edx
		stdcall pole_cell_find, edi
		cmp eax,0
		je @f
			or dword[napr],8
		@@:

		cmp dword[napr],5
		je @f
		cmp dword[napr],10
		je @f
		cmp dword[napr],15
		je @f
			mov eax,dword[napr]
			mov byte[ebx+offs_cell_liv],3 ;ãáâ ­®¢ª  ¬¥âª¨
			mov byte[ebx+offs_cell_napr],al ;ãáâ ­®¢ª  ­ ¯à ¢«¥­¨©
			inc dword[shem_points]
		@@:
		.cycle0_next:
		dec ecx
		jnz .cycle0

	;*** á­ï⨥ ¬¥âª¨ á â®ç¥ª, ª®â®àë¥ ­ å®¤ïâáï ­  ¢å®¤­ëå ­®£ å «®£¨ç¥áª¨å í«¥¬¥­â®¢
	.cycle1_beg:
	mov dword[shem_elems],0 ;¤«ï ¯¥¯¥®¯à¥¤¥«¥­¨ï ç¨á«  í«¥¬¥­â®¢
	stdcall dword[tl_node_poi_get_info], tree1,0
	mov esi,eax
	.cycle1:
		cmp esi,0
		je .cycle1_end
		cmp word[esi],el_icon_elems ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨
		jne .end_add_p1
			inc dword[shem_elems]
if 0
			xor edx,edx ;edx - ­®¬¥à ¢å®¤­®© ­®£¨
			@@:
				stdcall el_get_leg_coords, ecx,edx
				test eax,eax
				jz @f ;¥á«¨ ª®®à¤¨­ âë ­¥ ¢§ï«¨áì (eax=0 && ebx=0)
				test ebx,ebx
				jz @f ;¥á«¨ ª®®à¤¨­ âë ­¥ ¢§ï«¨áì (eax=0 && ebx=0)
				stdcall pole_cell_find, edi,eax,ebx
				test eax,eax
				jz .no_erase
					get_cell_offset ebx,eax
					mov byte[ebx+offs_cell_liv],0 ;á­ï⨥ ¬¥âª¨
					dec dword[shem_points]
				.no_erase:
				inc edx
				jmp @b
			@@:
			;mov edx,(1 shl 16) ;edx - ­®¬¥à ¢ë室­®© ­®£¨
end if
		.end_add_p1:
		stdcall dword[tl_node_poi_get_next_info], tree1,esi
		mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
		jmp .cycle1
	.cycle1_end:

	;*** ᮧ¤ ­¨¥ ¨­ä®à¬ æ¨¨ ¤«ï § ¯¨á¨ ¢ ä ©« ***
	mov edi,open_file_lif
	stdcall mem_copy,edi,txt_size,5
	stdcall str_cat,edi,txt_space
	mov eax,dword[shem_w]
	add edi,5
	stdcall convert_int_to_str
	stdcall str_cat,edi,txt_space
	stdcall str_len,edi
	add edi,eax
	mov eax,[shem_h]
	stdcall convert_int_to_str
	stdcall str_cat,edi,txt_nl

	;*** á®åà ­¥­¨¥ «®£¨ç¥áª¨å í«¥¬¥­â®¢ ***
	stdcall str_cat,edi,txt_elements
	stdcall str_cat,edi,txt_space
	stdcall str_len,edi
	add edi,eax
	mov eax,[shem_elems]
	stdcall convert_int_to_str
	stdcall str_cat,edi,txt_nl

	cmp eax,1
	jl .cycle2_end
	stdcall dword[tl_node_poi_get_info], tree1,0
	mov esi,eax
	.cycle2:
		cmp esi,0
		je .cycle2_end
		cmp word[esi],el_icon_elems ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨
		jne .end_add_p2
			stdcall [tl_node_poi_get_data], tree1,esi
			mov ecx,eax

			stdcall str_len,edi
			add edi,eax
			mov eax,[ecx] ;coord x
			stdcall convert_int_to_str
			stdcall str_cat,edi,txt_space
	
			stdcall str_len,edi
			add edi,eax
			mov eax,[ecx+4] ;coord y
			stdcall convert_int_to_str
			stdcall str_cat,edi,txt_space

			stdcall str_len,edi
			add edi,eax
			movzx eax,byte[ecx+sp_offs_el_angle] ;angle
			stdcall convert_int_to_str
			stdcall str_cat,edi,txt_space

			;¨¬ï í«¥¬¥­â 
			movzx eax,byte[ecx+sp_offs_el_type]
			imul eax,size_el_opt
			add eax,el_opt_beg+el_offs_nam
			stdcall str_cat,edi,eax

			stdcall str_cat,edi,txt_nl

		.end_add_p2:
		stdcall dword[tl_node_poi_get_next_info], tree1,esi
		mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
		jmp .cycle2
	.cycle2_end:

	;*** á®åà ­¥­¨¥ ¯®¤¯¨á¥© ***
	stdcall str_cat,edi,txt_captions
	stdcall str_cat,edi,txt_space
	stdcall str_len,edi
	add edi,eax
	mov eax,[shem_captions]
	stdcall convert_int_to_str
	stdcall str_cat,edi,txt_nl

	cmp eax,1
	jl .cycle3_end
	stdcall dword[tl_node_poi_get_info], tree1,0
	mov esi,eax
	.cycle3:
		cmp esi,0
		je .cycle3_end
		cmp word[esi],el_icon_captions ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨
		jne .end_add_p3
			stdcall [tl_node_poi_get_data], tree1,esi
			mov ecx,eax

			stdcall str_len,edi
			add edi,eax
			mov eax,[ecx] ;coord x
			stdcall convert_int_to_str
			stdcall str_cat,edi,txt_space
	
			stdcall str_len,edi
			add edi,eax
			mov eax,[ecx+4] ;coord y
			stdcall convert_int_to_str
			stdcall str_cat,edi,txt_space

			stdcall str_len,edi
			add edi,eax
			movzx eax,byte[ecx+8] ;n,z,o
			mov ah,' ' ;¯à®¡¥« ¯®á«¥ ¡ãª¢ë, çâ® ¡ë ­¥ ¤®¡ ¢«ïâì txt_space
			mov dword[edi],eax ;al

			;¨¬ï í«¥¬¥­â 
			mov ebx,edi
			mov edi,ecx
			add edi,capt_offs
			call str_next_val
			call str_next_val
			;call str_next_val
			xchg ebx,edi
			stdcall str_cat,edi,ebx

			stdcall str_cat,edi,txt_nl

		.end_add_p3:
		stdcall dword[tl_node_poi_get_next_info], tree1,esi
		mov esi,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
		jmp .cycle3
	.cycle3_end:

	;*** á®åà ­¥­¨¥ ª«î祢ëå â®ç¥ª ***
	stdcall str_cat,edi,txt_points
	stdcall str_cat,edi,txt_space
	stdcall str_len,edi
	add edi,eax
	mov eax,[shem_points]
	stdcall convert_int_to_str
	stdcall str_cat,edi,txt_nl

	mov eax,edi
	mov edi,pole
	mov esi,pole_index
	cmp dword[esi],0
	je .no_points ;¥á«¨ ­¥â ï祥ª (¯à®¢®¤®¢) â® ¯à®¯ãáª
	mov ebx,pole_data
	mov dword[napr],ebx
	mov edi,eax

	mov ecx,dword[esi]
	mov dword[s_param],0
	.cycle4: ;横« ¯® ¢á¥¬ â®çª ¬
		add esi,4
		mov ebx,[esi]
		imul ebx,sizeof.Cell
		add ebx,dword[napr] ;pole_data

		movzx edx,word[ebx+offs_cell_liv] ;also use offs_cell_napr
		cmp dl,3
		jne @f
			stdcall str_len,edi
			add edi,eax
			mov eax,dword[ebx+offs_cell_x]
			stdcall convert_int_to_str
			stdcall str_cat,edi,txt_space

			stdcall str_len,edi
			add edi,eax
			mov eax,dword[ebx+offs_cell_y]
			stdcall convert_int_to_str
			stdcall str_cat,edi,txt_space

			stdcall str_len,edi
			add edi,eax
			movzx eax,dh
			stdcall convert_int_to_str

			cmp dword[s_param],7 ;¤«ï ä®à¬ â  áâப¨
			je .new_line
				inc dword[s_param]
				stdcall str_cat,edi,txt_space
			jmp @f
			.new_line:
				mov dword[s_param],0
				stdcall str_cat,edi,txt_nl
		@@:
		dec ecx
		jnz .cycle4
		cmp dword[s_param],0
		je @f
			stdcall str_cat,edi,txt_nl
		@@:

	;*** á®åà ­¥­¨¥ ¨§®«ï樮­­ëå â®ç¥ª ***
	stdcall str_cat,edi,txt_sub_points
	stdcall str_cat,edi,txt_space
	stdcall str_len,edi
	add edi,eax
	mov eax,[shem_sub_points]
	stdcall convert_int_to_str
	stdcall str_cat,edi,txt_nl

	mov eax,edi
	mov edi,pole
	mov esi,pole_index
	;cmp dword[esi],0
	;je .no_points ;¥á«¨ ­¥â ï祥ª (¯à®¢®¤®¢) â® ¯à®¯ãáª
	;mov ebx,pole_data
	;mov dword[napr],ebx
	mov edi,eax

	mov ecx,dword[esi]
	.cycle5: ;横« ¯® ¢á¥¬ â®çª ¬
		add esi,4
		mov ebx,[esi]
		imul ebx,sizeof.Cell
		add ebx,dword[napr] ;pole_data

		movzx edx,byte[ebx+offs_cell_liv]
		cmp dl,2
		jne @f
			stdcall str_len,edi
			add edi,eax
			mov eax,dword[ebx+offs_cell_x]
			stdcall convert_int_to_str
			stdcall str_cat,edi,txt_space

			stdcall str_len,edi
			add edi,eax
			mov eax,dword[ebx+offs_cell_y]
			stdcall convert_int_to_str
			stdcall str_cat,edi,txt_space

			;stdcall str_cat,edi,txt_nl
		@@:
		dec ecx
		jnz .cycle5
		stdcall str_cat,edi,txt_nl

	.no_points:

	;*** ®¯à¥¤¥«¥­¨¥ ¯ à ¬¥â஢ ä ©« 
	mov edi,open_file_lif
	stdcall str_len,edi

	;*** § ¯¨áì ä ©« 
	mov [run_file_70.Function], SSF_CREATE_FILE
	mov [run_file_70.Position], 0
	mov [run_file_70.Flags], 0
	mov dword[run_file_70.Count], eax
	mov [run_file_70.Buffer], edi
	mov byte[run_file_70+20], 0
	mov dword[run_file_70.FileName], openfile_path
	mcall SF_FILE,run_file_70 ;á®å࠭塞 ä ©«

	call redraw_pole
	.end_save_file:
popad
	ret
endp

;ä®à¬¨à®¢ ­¨¥ ¯®¤¯¨á¨ ¤«ï ᯨ᪠
align 4
proc make_list_capts uses eax ebx ecx edi, buf:dword, txt:dword
	mov ebx,dword[buf]

	mov edi,ebx
	add edi,capt_offs
	mov dword[edi],'    ' ;¯à®¡¥«ë ¤«ï ¢ëà ¢­¨¢ ­¨ï ¬ «¥­ìª¨å ç¨á¥«

	mov eax,dword[ebx] ;+0 - offset coord x
	cmp eax,100
	jge @f
		inc edi
	@@:
	cmp eax,10
	jge @f
		inc edi
	@@:
	call convert_int_to_str ;ª®®à¤¨­ â  x (¤«ï ¯®¤¯¨á¨)
	stdcall str_cat,edi,txt_space
	stdcall str_len,edi
	add edi,eax
	mov eax,dword[ebx+4] ;+4 - offset coord y
	call convert_int_to_str ;ª®®à¤¨­ â  y (¤«ï ¯®¤¯¨á¨)
	stdcall str_cat,edi,txt_space

	mov edi,dword[txt]
	cmp edi,0
	je .end_f
		stdcall str_len,edi ;eax = strlen([edi])
		mov ecx,edi
		call str_next_spaces
		sub edi,ecx ;®¯à¥¤¥«ï¥¬ ¤«¨­­ã ¯®¤¯¨á¨

		cmp edi,eax
		jle @f
			mov edi,eax ;¥á«¨ áâப  § ª®­ç¨« áì ­¥ ¯à®¡¥«®¬
		@@:
		;cmp edi,1
		;jge @f
		;       mov edi,1 ;¬¨­¨¬ã¬ 1 ᨬ¢®«
		;@@:

		add ebx,capt_offs	
		stdcall str_n_cat, ebx,ecx,edi
	.end_f:
	ret
endp

;¤®¡ ¢«¥­¨¥ ­®¢®£® í«¥¬¥­â  ã¯à ¢«¥­¨ï ­  á奬ã
;¯à¨ ¤®¡ ¢«¥­¨¨ ¨á¯®«ì§ãîâáï áâ ­¤ àâ­ë¥ ­ áâனª¨
align 4
proc shem_element_creat uses eax ebx, coord_x:dword, coord_y:dword
	mov eax,dword[coord_x]
	mov dword[txt_buf],eax ;ª®®à¤¨­ â  x
	mov ebx,dword[coord_y]

	stdcall element_is_click,eax,ebx ;¯à®¢¥à塞 ¥áâì «¨ ¢ ¤ ­­®© â®çª¥ ¤à㣮© í«¥¬¥­â ᮧ¤ ­­ë© à ­ìè¥
	test eax,eax
	jnz .end_f ;¯à¨ ­ ¦ â¨¨ ¯®¯ «¨ ­  ®¤¨­ ¨§ í«¥¬¥­â®¢
	mov dword[txt_buf+4],ebx ;ª®®à¤¨­ â  y

	;xor eax,eax
	mov byte[txt_buf+sp_offs_el_angle],al ;­ ¯à ¢«¥­¨¥

	stdcall [tl_node_get_data], tree2
	mov ebx,eax
	test ebx,ebx
	jnz @f
		mov ebx,el_opt_beg+el_offs_nam ;¥á«¨ ­¥ ¢§ï«®áì ¨¬ï í«¥¬¥­â , â® ¯® 㬮«ç ­¨î ¡¥à¥¬ 1-© ¨§ ᯨ᪠
	@@:
	stdcall el_get_name, ebx,0
	mov byte[txt_buf+sp_offs_el_type],al ;⨯ í«¥¬¥­â 

	stdcall make_list_capts,txt_buf,ebx
	stdcall [tl_node_add], tree1,(el_icon_elems shl 16)+1,txt_buf
	stdcall [tl_cur_next], tree1
	stdcall [tl_draw], tree1
	.end_f:
	ret
endp

;description:
;  ­ «¨§¨àã¥â áâபã á ¨¬¥­¥¬ «®£. í«¥¬¥­â  ¨ ¢®§¢à é ¥â ­®¬¥à «®£. í«¥¬¥­â 
;input:
; str - 㪠§ â¥«ì ­  áâபã ᮤ¥à¦ éãî ¨¬ï «®£. í«¥¬¥­â 
; asciiz - ᨬ¢®« ª®â®àë© ¤®«¦¥­ ¡ëâì § ¬¥­¥­ ­  ascii 0
;output:
; eax - ⨯ í«¥¬¥­â 
align 4
proc el_get_name uses ebx ecx edi esi, str:dword, asciiz:dword
	mov edi,[str]
	cmp dword[asciiz],0
	je @f
		mov eax,dword[asciiz]
		mov ecx,el_offs_col ;à §¬¥à ⥪áâ  ¢ str ­¥ ¡®«ìè¥ el_offs_col
		cld
		repne scasb
		mov ebx,edi
		dec ebx
		mov byte[ebx],0 ;0 - ᨬ¢®« ª®­æ  áâப¨ ¤«ï ¯à ¢¨«ì­®© à ¡®âë str_cmp
	@@:

	mov edi,[str]
	mov esi,el_opt_beg+el_offs_nam
	xor ecx,ecx
	@@:
		stdcall str_cmp, edi,esi
		cmp eax,0
		je @f
		add esi,size_el_opt
		cmp esi,el_opt_beg.end
		jge @f
		inc ecx
		jmp @b
	@@:
	mov eax,ecx

	cmp dword[asciiz],0
	je @f
		mov ecx,dword[asciiz]
		mov byte[ebx],cl
	@@:
	ret
endp

;input:
; el_data - 㪠§ â¥«ì ­  ¤ ­­ë¥ í«¥¬¥­â 
; l_opt - ­®¬¥à ­®£¨, ¤«ï ª®â®à®© ¨éãâáï ª®®à¤¨­ âë, ¢å®¤­ ï/¢ë室­ ï ­®£ 
;output:
; eax - coord x (if not found eax=0)
; ebx - coord y (if not found ebx=0)
align 4
proc el_get_leg_coords uses ecx edx edi esi, el_data:dword, l_opt:dword
	mov edi,[el_data] ;¤ ­­ë¥ í«¥¬¥­â 
	movzx esi,byte[edi+sp_offs_el_type] ;⨯ í«¥¬¥­â 
	imul esi,size_el_opt
	add esi,el_opt_beg
	;esi+el_offs_legs_inp - 㪠§ â¥«ì ­  â ¡«¨æã á ¯ à ¬¥âà ¬¨ ¢å®¤­ëå ­®£

	mov eax,[edi+0]
	mov ebx,[edi+4]
	mov edx,[l_opt]
	movzx edi,byte[edi+sp_offs_el_angle] ;㣮« ¯®¢®à®â  / 90 (®â 0-3)

	btr edx,16 ;¢å®¤­ ï/¢ë室­ ï ­®£ 
	jc .output_leg

	;¥á«¨ ­®£  ¢å®¤­ ï
	inc edx ;­®¬¥à æ¨ï ­®£ ­ ç¨­ ¥âáï á ­ã«ï, ¯®â®¬ã ¤®¡ ¢«ï¥¬ 1
	stdcall move_rotate_x_n90, -2,edi
	mov esi,[esi+el_offs_legs_inp]
	@@:
		movzx ecx,byte[esi]
		cmp ecx,0
		je .not_found ;­®£¨ ª®­ç¨«¨áì à ­ìè¥, 祬 ®¦¨¤ «®áì
		stdcall move_rotate_n90, 0,ecx,edi
		inc esi
		dec edx
		jnz @b
		jmp .end_f

	;¥á«¨ ­®£  ¢ë室­ ï
	.output_leg:
	inc edx ;­®¬¥à æ¨ï ­®£ ­ ç¨­ ¥âáï á ­ã«ï, ¯®â®¬ã ¤®¡ ¢«ï¥¬ 1
	movzx ecx,byte[esi+el_offs_box_x]
	add ecx,2
	stdcall move_rotate_x_n90, ecx,edi
	add esi,el_offs_legs_out
	@@:
		movzx ecx,byte[esi]
		cmp ecx,0
		je .not_found ;­®£¨ ª®­ç¨«¨áì à ­ìè¥, 祬 ®¦¨¤ «®áì
		stdcall move_rotate_n90, 0,ecx,edi
		inc esi
		dec edx
		jnz @b
		jmp .end_f

	.not_found:
		xor eax,eax
		xor ebx,ebx
	.end_f:
	ret
endp

align 4
proc move_rotate_n90 uses ecx edi, d_x:dword, d_y:dword, angle:dword
	mov edi,[angle] ;㣮« ¯®¢®à®â  / 90 (®â 0-3)
	and edi,3
	shl edi,4 ;edi*=16
	add edi,mcs

	mov ecx,[d_x]
	imul ecx,dword[edi]
	add eax,ecx
	mov ecx,[d_y]
	imul ecx,dword[edi+4]
	add eax,ecx

	mov ecx,[d_x]
	imul ecx,dword[edi+8]
	add ebx,ecx
	mov ecx,[d_y]
	imul ecx,dword[edi+12]
	add ebx,ecx
	ret
endp

align 4
proc mem_copy, destination:dword, source:dword, len:dword
  push ecx esi edi
    cld
    mov esi, dword[source]
    mov edi, dword[destination]
    mov ecx, dword[len]
    rep movsb
  pop edi esi ecx
  ret
endp

;description:
; ”ã­ªæ¨ï ¯à®¯ã᪠¥â ®¤­® á«®¢® (¨«¨ ç¨á«®) á ãç¥â®¬ à §¤¥«¨â¥«ì­ëå ᨬ¢®«®¢:
; ¯à®¡¥« , â ¡ã«ï樨, ­®¢®© áâப¨. ã¦­  ¤«ï ¯®á«¥¤®¢ â¥«ì­®£® áç¨â뢠­¨ ç¨á¥« ¨§ áâப¨
;input:
; edi - 㪠§ â¥«ì ­  ¯à®¡¥« ¨«¨ á«®¢®
;output:
; edi - 㪠§ â¥«ì ­  á«¥¤ãî饥 á«®¢®
align 4
str_next_val:
	call str_skip_spaces
	@@:
		cmp byte[edi],0
		je @f

		cmp byte[edi],' '
		je @f
		cmp byte[edi],9
		je @f
		cmp byte[edi],10
		je @f
		cmp byte[edi],13
		je @f

		inc edi
		jmp @b
	@@:
	call str_skip_spaces
	ret

align 4
str_skip_spaces:
	dec edi
	@@:
		inc edi
		cmp byte[edi],' '
		je @b
		cmp byte[edi],9
		je @b
		cmp byte[edi],10
		je @b
		cmp byte[edi],13
		je @b
	ret

align 4
str_next_spaces:
	dec edi
	@@:
		inc edi
		cmp byte[edi],0
		je @f
		cmp byte[edi],' '
		je @f
		cmp byte[edi],9
		je @f
		cmp byte[edi],10
		je @f
		cmp byte[edi],13
		je @f
		jmp @b
	@@:	
	ret

;input:
; esi - 㪠§ â¥«ì ­  ¨áª®¬®¥ á«®¢®
;output:
; edi - 㪠§ â¥«ì ­  ¯®§¨æ¨î ¢ ª®â®à®© á«®¢® ­ ©¤¥­®, ¥á«¨ á«®¢® ­¥ ­ ©¤¥­® â® edi=0
;¯®àâïâáï ॣ¨áâàë:
; eax ecx
align 4
str_analiz_r:
	mov edi,open_file_lif
	mov ecx,dword[f_size]
	@@:
		mov al,byte[esi] ;ãáâ ­ ¢«¨¢ ¥¬ ¯¥à¢ë© ᨬ¢®« ¤«ï ¯®¨áª 
		cld
		repnz scasb
		cmp ecx,0
		je @f ;¥á«¨ § ª®­ç¨«áï ¢¥áì ⥪áâ, â® ¢ë室 ¨§ ä㭪樨
		;¯¥à¢ë© ᨬ¢®« ¯®  ¤à¥áã edi-1 ¤®«¦¥­ ¡ëâì ¨§ áâப¨ esi
		dec edi
		stdcall str_instr, edi,esi ;¯à®¢¥à塞 á«®¢® ­  ᮢ¯ ¤¥­¨¥
		inc edi
		cmp al,0
		jne @b ;¥á«¨ á«®¢® ­¥ ᮢ¯ «®, ¨é¥¬ ¢ áâப¥ á«¥¤ãî騩 ¯¥à¢ë© ᨬ¢®« ¤«ï áà ¢­¥­¨ï
		;á ¯®¯ ¤ ¥¬ ¥á«¨ ­ è«¨ á«®¢® esi ¯®  ¤à¥áã edi
		jmp .exit_f
	@@:
		;á ¯®¯ ¤ ¥¬ ¥á«¨ ­¥ ­ è«¨ á«®¢® esi ¯®  ¤à¥áã edi
		xor edi,edi
	.exit_f:
	ret

;description:
; ¯à®¢¥àï¥â ᮤ¥à¦¨âáï «¨ áâப  str1 ¢ áâப¥ str0
; ¯à®¢¥àª  ¤¥« ¥âáï ⮫쪮 ­ ç¨­ ï á ¯¥à¢ëå ᨬ¢®«®¢, 㪠§ ­­ëå ¢ str0 ¨ str1
; ¯à¨¬¥à 1: ¥á«¨ str0='aaabbbccc', str1='bbb' ᮢ¯ ¤¥­¨ï ­¥ ¡ã¤¥â
; ¯à¨¬¥à 2: ¥á«¨ str0='aaabbbccc', str1='aaa' ᮢ¯ ¤¥­¨¥ ¡ã¤¥â
;output:
; al = 0 ¥á«¨ áâப  str1 ᮤ¥à¦¨âáï ¢ str0
; al != 0 ¥á«¨ áâப  str1 ­¥ ᮤ¥à¦¨âáï ¢ str0
align 4
proc str_instr uses edi esi, str0:dword, str1:dword
	;xor eax,eax
	mov edi,[str0]
	mov esi,[str1]
	cld
	@@:
		mov al,[esi]
		cmp al,0
		je .e1
		inc esi
		scasb ;áà ¢­¨¢ ¥¬ ᨬ¢®«ë
	jz @b ;¥á«¨ ᮢ¯ «¨, â® ¯¥à¥å®¤¨¬ ª áà ¢­¥­¨î á«¥¤ãîé¨å
	;á ¯®¯ ¤ ¥¬ ¥á«¨ áâப¨ ­¥ ᮢ¯ «¨
	sub al,[edi-1]
	.e1: ;á ¯®¯ ¤ ¥¬ ¥á«¨ áâப  str1 (esi) § ª®­ç¨« áì
	ret
endp

;description:
; ¯à®¢¥àï¥â ᮢ¯ ¤¥­¨¥ áâப str0 ¨ str1
;output:
; eax = 0 ¥á«¨ str0 = str1
; eax = 1 ¥á«¨ str0 != str1
align 4
proc str_cmp uses ecx edi esi, str0:dword, str1:dword
	xor eax,eax
	mov edi,[str0]
	mov esi,[str1]
	mov ecx,0x8fffffff ;ecx - ®ç¥­ì ¡®«ì讥 ç¨á«®
	cld
	repne scasb
	;dec edi
	sub edi,[str0]
	mov ecx,edi ;ecx = strlen(str0)+1

	mov edi,[str0]
	repe cmpsb
	je @f
		inc eax
	@@:
	ret
endp

align 4
proc but_run_stop
	xor byte[tim_ch],1
	cmp byte[tim_ch],0
	jne @f
		;®áâ ­®¢ª  á奬ë
		stdcall pole_reset_cells, pole ;ç¨á⪠ ¯à®¢®¤®¢
		call redraw_pole
		jmp .end_f
	@@:
		;¯®¤£®â®¢ª  áå¥¬ë ª § ¯ãáªã
		call sign_clear
		call sign_set_captions_angles
	.end_f:
	ret
endp

align 4
proc but_set_0 uses eax
	stdcall [tl_node_get_data], tree1
	test eax,eax
	jz .end_f
;el_icon_captions
;       cmp byte[eax+8],'n'
;       je .end_f
	cmp byte[eax+8],'o' ;¢à¥¬¥­­®¥ ®âá¥ç¥­¨¥, ¯®ª  ­¥â ¯à®¢¥àª¨ ⨯  ⥪ã饩 ¨ª®­ª¨
	jne .end_f
		mov byte[eax+8],'z'
	.end_f:
	ret
endp

align 4
proc but_set_1 uses eax
	stdcall [tl_node_get_data], tree1
	test eax,eax
	jz .end_f
;el_icon_captions
;       cmp byte[eax+8],'n'
;       je .end_f
	cmp byte[eax+8],'z' ;¢à¥¬¥­­®¥ ®âá¥ç¥­¨¥, ¯®ª  ­¥â ¯à®¢¥àª¨ ⨯  ⥪ã饩 ¨ª®­ª¨
	jne .end_f
		mov byte[eax+8],'o'
	.end_f:
	ret
endp

;ᤢ¨£ ®¡ê¥ªâ  ¢«¥¢®
align 4
proc but_mov_l uses eax edi
	cmp byte[tim_ch],0
	jne .end_f
	stdcall [tl_node_get_data], tree1
	test eax,eax
	jz .end_f
		cmp dword[eax],1
		jle .end_f
		dec dword[eax]
		mov edi,eax
		stdcall mem_copy,txt_buf,eax,capt_offs
		add edi,capt_offs
		call str_next_val
		call str_next_val
		stdcall make_list_capts,txt_buf,edi
		stdcall mem_copy,eax,txt_buf,32 ;capt_offs
		call redraw_pole
		stdcall [tl_draw],tree1
	.end_f:
	ret
endp

;ᤢ¨£ ®¡ê¥ªâ  ¢¯à ¢®
align 4
proc but_mov_r uses eax edi
	cmp byte[tim_ch],0
	jne .end_f
	stdcall [tl_node_get_data], tree1
	test eax,eax
	jz .end_f
		inc dword[eax]
		mov edi,eax
		stdcall mem_copy,txt_buf,eax,capt_offs
		add edi,capt_offs
		call str_next_val
		call str_next_val
		stdcall make_list_capts,txt_buf,edi
		stdcall mem_copy,eax,txt_buf,32 ;capt_offs
		call redraw_pole
		stdcall [tl_draw],tree1
	.end_f:
	ret
endp

align 4
proc but_mov_u uses eax edi
	cmp byte[tim_ch],0
	jne .end_f
	stdcall [tl_node_get_data], tree1
	test eax,eax
	jz .end_f
		cmp dword[eax+4],1
		jle .end_f
		dec dword[eax+4]
		mov edi,eax
		stdcall mem_copy,txt_buf,eax,capt_offs
		add edi,capt_offs
		call str_next_val
		call str_next_val
		stdcall make_list_capts,txt_buf,edi
		stdcall mem_copy,eax,txt_buf,32 ;capt_offs
		call redraw_pole
		stdcall [tl_draw],tree1
	.end_f:
	ret
endp

align 4
proc but_mov_d uses eax edi
	cmp byte[tim_ch],0
	jne .end_f
	stdcall [tl_node_get_data], tree1
	test eax,eax
	jz .end_f
		inc dword[eax+4]
		mov edi,eax
		stdcall mem_copy,txt_buf,eax,capt_offs
		add edi,capt_offs
		call str_next_val
		call str_next_val
		stdcall make_list_capts,txt_buf,edi
		stdcall mem_copy,eax,txt_buf,32 ;capt_offs
		call redraw_pole
		stdcall [tl_draw],tree1
	.end_f:
	ret
endp

;ãáâ ­®¢ª  ®¡ëç­®£® ०¨¬ , ¡¥§ à¨á®¢ ­¨ï
align 4
proc but_set_none
	mov byte[pen_mode],0
	cmp [cursor_pointer],0
	je @f
		push eax ebx ecx
		mcall SF_MOUSE_GET,SSF_DEL_CURSOR,[cursor_pointer]
		pop ecx ebx eax
	@@:
	ret
endp

;hot_p - ª®®à¤¨­ âë £®àï祩 â®çª¨ ªãàá®à , ᬥ饭­ë¥ ­  ¡¨â 16 ((cx shl 8) + cy) shl 16
align 4
proc set_pen_mode uses eax ebx ecx edx, mode:dword, icon:dword, hot_p:dword
	mov eax,[mode]
	cmp byte[pen_mode],al
	je @f
		mov byte[pen_mode],al
		mov edx,[hot_p]
		mov dx,2 ;LOAD_INDIRECT
		mov ecx,[icon]
		shl ecx,12 ;㬭®¦ ¥¬ ­  4 ª¡
		add ecx,[buf_curs.data]
		mcall SF_MOUSE_GET,SSF_LOAD_CURSOR

		cmp eax,0
		je @f
			mov [cursor_pointer],eax
			mcall SF_MOUSE_GET,SSF_SET_CURSOR,[cursor_pointer]
	@@:
	ret
endp

;¤ ­­ë¥ ¤«ï ¤¨ «®£  ®âªàëâ¨ï ä ©«®¢
align 4
OpenDialog_data:
.type			dd 0 ;0 - ®âªàëâì, 1 - á®åà ­¨âì, 2 - ¢ë¡à âì ¤â४â®à¨î
.procinfo		dd procinfo	;+4
.com_area_name		dd communication_area_name	;+8
.com_area		dd 0	;+12
.opendir_path		dd plugin_path	;+16
.dir_default_path	dd default_dir ;+20
.start_path		dd file_name ;+24 ¯ãâì ª ¤¨ «®£ã ®âªàëâ¨ï ä ©«®¢
.draw_window		dd draw_window	;+28
.status 		dd 0	;+32
.openfile_path		dd openfile_path	;+36 ¯ãâì ª ®âªà뢠¥¬®¬ã ä ©«ã
.filename_area		dd filename_area	;+40
.filter_area		dd Filter
.x:
.x_size 		dw 420 ;+48 ; Window X size
.x_start		dw 10 ;+50 ; Window X position
.y:
.y_size 		dw 320 ;+52 ; Window y size
.y_start		dw 10 ;+54 ; Window Y position

default_dir db '/rd/1',0

communication_area_name:
	db 'FFFFFFFF_open_dialog',0
open_dialog_name:
	db 'opendial',0
communication_area_default_path:
	db '/rd/1/File managers/',0

Filter:
dd Filter.end - Filter ;.1
.1:
db 'TXT',0
db 'ASM',0
.end:
db 0

include 'le_libs.inc'

mouse_dd dd 0x0
sc system_colors
last_time dd 0



align 16
procinfo process_information

align 4
buf_0: dd 0 ;
.l: dw 170 ;+4 left
.t: dw panel_1_coord_top ;+6 top
.w: dd 395 ;+8 w
.h: dd 340 ;+12 h
.color: dd ini_def_c_bkgnd ;+16 color
	db 24 ;+20 bit in pixel

align 4
buf_font: ;¡ãä¥à á® èà¨ä⮬
	dd 0 ;㪠§ â¥«ì ­  ¡ãä¥à ¨§®¡à ¦¥­¨ï
	dw 25 ;+4 left
	dw 25 ;+6 top
	dd 96 ;+8 w
	dd 144 ;+12 h
	dd 0 ;+16 color
	db 24 ;+20 bit in pixel

align 4
buf_curs: ;¡ãä¥à á ªãàá®à ¬¨
.data: dd 0 ;㪠§ â¥«ì ­  ¡ãä¥à ¨§®¡à ¦¥­¨ï
	dw 0 ;+4 left
	dw 0 ;+6 top
	dd 32 ;+8 w
	dd 32*cursors_count ;+12 h
	dd 0 ;+16 color
	db 24 ;+20 bit in pixel

align 4
buf_curs_8: ;¡ãä¥à á ªãàá®à ¬¨
.data: dd 0 ;㪠§ â¥«ì ­  ¡ãä¥à ¨§®¡à ¦¥­¨ï
	dw 0 ;+4 left
	dw 0 ;+6 top
	dd 32 ;+8 w
	dd 32*cursors_count ;+12 h
	dd 0 ;+16 color
	db 24 ;+20 bit in pixel

cursor_pointer dd 0 ;㪠§ â¥«ì ­  ¤ ­­ë¥ ¤«ï ªãàá®à 

el_focus dd 0
tree1 tree_list 32,points_max+2, tl_key_no_edit, 16,16,\
    0x8080ff,0x0000ff,0xffffff, 5,panel_3_coord_top+85,145,170, 0,capt_offs,0,\
    el_focus, wScr1,0
tree2 tree_list el_offs_col-el_offs_nam,100+2, tl_key_no_edit+tl_list_box_mode, 16,16,\
    0x8080ff,0x0000ff,0xffffff, 5,panel_3_coord_top,145,80, 0,0,0,\
    el_focus, wScr2,0

align 4
wScr1:
.x:
.size_x     dw 16 ;+0
.start_x    dw 0 ;+2
.y:
.size_y     dw 150 ;+4
.start_y    dw 0 ;+6
.btn_high   dd 15 ;+8
.type	    dd 1  ;+12
.max_area   dd 100  ;+16
.cur_area   dd 30  ;+20
.position   dd 0  ;+24
.bckg_col   dd 0xeeeeee ;+28
.frnt_col   dd 0xbbddff ;+32
.line_col   dd 0  ;+36
.redraw     dd 0  ;+40
.delta	    dw 0  ;+44
.delta2     dw 0  ;+46
.run_x:
.r_size_x   dw 0  ;+48
.r_start_x  dw 0  ;+50
.run_y:
.r_size_y   dw 0 ;+52
.r_start_y  dw 0 ;+54
.m_pos	    dd 0 ;+56
.m_pos_2    dd 0 ;+60
.m_keys     dd 0 ;+64
.run_size   dd 0 ;+68
.position2  dd 0 ;+72
.work_size  dd 0 ;+76
.all_redraw dd 0 ;+80
.ar_offset  dd 1 ;+84

align 4
wScr2:
.x:
.size_x     dw 16 ;+0
.start_x    dw 0 ;+2
.y:
.size_y     dw 150 ;+4
.start_y    dw 0 ;+6
.btn_high   dd 15 ;+8
.type	    dd 1  ;+12
.max_area   dd 100  ;+16
.cur_area   dd 30  ;+20
.position   dd 0  ;+24
.bckg_col   dd 0xeeeeee ;+28
.frnt_col   dd 0xbbddff ;+32
.line_col   dd 0  ;+36
.redraw     dd 0  ;+40
.delta	    dw 0  ;+44
.delta2     dw 0  ;+46
.run_x:
.r_size_x   dw 0  ;+48
.r_start_x  dw 0  ;+50
.run_y:
.r_size_y   dw 0 ;+52
.r_start_y  dw 0 ;+54
.m_pos	    dd 0 ;+56
.m_pos_2    dd 0 ;+60
.m_keys     dd 0 ;+64
.run_size   dd 0 ;+68
.position2  dd 0 ;+72
.work_size  dd 0 ;+76
.all_redraw dd 0 ;+80
.ar_offset  dd 1 ;+84

align 4
proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n:dword
	mov esi,dword[str2]
	mov ecx,dword[n]
	mov edi,dword[str1]
	stdcall str_len,edi
	add edi,eax
	cld
	repne movsb
	mov byte[edi],0
	ret
endp

align 4
proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
	mov esi,dword[str2]
	stdcall str_len,esi
	mov ecx,eax
	inc ecx
	mov edi,dword[str1]
	stdcall str_len,edi
	add edi,eax
	cld
	repne movsb
	ret
endp

;output:
; eax = strlen
align 4
proc str_len, str1:dword
	mov eax,[str1]
	@@:
		cmp byte[eax],0
		je @f
		inc eax
		jmp @b
	@@:
	sub eax,[str1]
	ret
endp

;input:
; buf - 㪠§ â¥«ì ­  áâபã, ç¨á«® ¤®«¦­® ¡ëâì ¢ 10 ¨«¨ 16 à¨ç­®¬ ¢¨¤¥
;output:
; eax - ç¨á«®
align 4
proc conv_str_to_int uses ebx ecx esi, buf:dword
	xor eax,eax
	xor ebx,ebx
	mov esi,[buf]

	;­  á«ãç © ¥á«¨ ¯¥à¥¤ ç¨á«®¬ ­ å®¤ïâáï ¯à®¡¥«ë
	@@:
	cmp byte[esi],' '
	jne @f
		inc esi
		jmp @b
	@@:

	;®¯à¥¤¥«¥­¨¥ ®âà¨æ â¥«ì­ëå ç¨á¥«
	xor ecx,ecx
	inc ecx
	cmp byte[esi],'-'
	jne @f
		dec ecx
		inc esi
	@@:

	cmp word[esi],'0x'
	je .load_digit_16

	.load_digit_10: ;áç¨â뢠­¨¥ 10-â¨ç­ëå æ¨äà
		mov bl,byte[esi]
		cmp bl,'0'
		jl @f
		cmp bl,'9'
		jg @f
			sub bl,'0'
			imul eax,10
			add eax,ebx
			inc esi
			jmp .load_digit_10
	jmp @f

	.load_digit_16: ;áç¨â뢠­¨¥ 16-à¨ç­ëå æ¨äà
		add esi,2
	.cycle_16:
		mov bl,byte[esi]
		cmp bl,'0'
		jl @f
		cmp bl,'f'
		jg @f
		cmp bl,'9'
		jle .us1
			cmp bl,'A'
			jl @f ;®âᥨ¢ ¥¬ ᨬ¢®«ë >'9' ¨ <'A'
		.us1: ;á®áâ ¢­®¥ ãá«®¢¨¥
		cmp bl,'F'
		jle .us2
			cmp bl,'a'
			jl @f ;®âᥨ¢ ¥¬ ᨬ¢®«ë >'F' ¨ <'a'
			sub bl,32 ;¯¥à¥¢®¤¨¬ ᨬ¢®«ë ¢ ¢¥àå­¨© ॣ¨áâà, ¤«ï ã¯à®é¥­¨ï ¨å ¯®á«¥¤ã饩 ®¡à ¡®âª¨
		.us2: ;á®áâ ¢­®¥ ãá«®¢¨¥
			sub bl,'0'
			cmp bl,9
			jle .cor1
				sub bl,7 ;convert 'A' to '10'
			.cor1:
			shl eax,4
			add eax,ebx
			inc esi
			jmp .cycle_16
	@@:
	cmp ecx,0 ;¥á«¨ ç¨á«® ®âà¨æ â¥«ì­®¥
	jne @f
		sub ecx,eax
		mov eax,ecx
	@@:
	ret
endp

;íâ®â ª®¤ ­¥ ¬®©, ®­ ¯à¥®¡à §ã¥â ç¨á«® ¢ áâபã
;input:
; eax = value
; edi = string buffer
;output:
align 4
proc convert_int_to_str uses eax ecx edx edi
	mov dword[edi+1],0
	call .str
	ret
endp

align 4
.str:
	mov ecx,0x0a ;§ ¤ ¥âáï á¨á⥬  áç¨á«¥­¨ï ¨§¬¥­ïîâáï ॣ¨áâàë eax,ecx,edx ¢å®¤­ë¥ ¯ à ¬¥âàë eax - ç¨á«®
    ;¯à¥à¥¢®¤ ç¨á«  ¢ ASCII áâப㠢§®¤­ë¥ ¤ ­­ë¥ ecx=á¨á⥬  áç¨á«¥­ï edi  ¤à¥á ªã¤  § ¯¨á뢠âì, ¡ã¤¥¬ áâபã, ¯à¨ç¥¬ ª®­¥æ ¯¥à¥¬¥­­®©
	cmp eax,ecx  ;áà ¢­¨âì ¥á«¨ ¢ eax ¬¥­ìè¥ ç¥¬ ¢ ecx â® ¯¥à¥©â¨ ­  @@-1 â.¥. ­  pop eax
	jb @f
		xor edx,edx  ;®ç¨áâ¨âì edx
		div ecx      ;à §¤¥«¨âì - ®áâ â®ª ¢ edx
		push edx     ;¯®«®¦¨âì ¢ á⥪
		;dec edi             ;ᬥ饭¨¥ ­¥®¡å®¤¨¬®¥ ¤«ï § ¯¨á¨ á ª®­æ  áâப¨
		call .str ;¯¥à¥©â¨ ­  á ¬ã ᥡï â.¥. ¢ë§¢ âì á ¬ã á¥¡ï ¨ â ª ¤® ⮣® ¬®¬¥­â  ¯®ª  ¢ eax ­¥ áâ ­¥â ¬¥­ìè¥ ç¥¬ ¢ ecx
		pop eax
	@@: ;cmp al,10 ;¯à®¢¥à¨âì ­¥ ¬¥­ìè¥ «¨ §­ ç¥­¨¥ ¢ al 祬 10 (¤«ï á¨á⥬ë áç¨á«¥­ï 10 ¤ ­­ ï ª®¬ ­¤  - «¨è­ ï))
	or al,0x30  ;¤ ­­ ï ª®¬ ­¤  ª®à®ç¥ 祬 ¤¢¥ ¢ëè¥
	stosb	    ;§ ¯¨á âì í«¥¬¥­â ¨§ ॣ¨áâà  al ¢ ï祪㠯 ¬ï⨠es:edi
	ret	      ;¢¥à­ãâìáï ®ç¥­ì ¨­â¥à¥á­ë© 室 â.ª. ¯®ª  ¢ á⥪¥ åà ­¨âìáï ª®«-¢® ¢ë§®¢®¢ â® á⮫쪮 à § ¬ë ¨ ¡ã¤¥¬ ¢ë§ë¢ âìáï

align 16
i_end:
	run_file_70 FileInfoBlock
	rb 1024
stacktop:
	sys_path rb 1024
	file_name:
		rb 1024 ;4096
	library_path rb 1024
	plugin_path rb 4096
	openfile_path rb 4096
	filename_area rb 256
mem: