;Ž£à®¬­ ï ¡« £®¤ à­®áâì Maxxxx32, Diamond, Heavyiron
;¨ ¤à㣨¬ ¯à®£à ¬¬¨áâ ¬,   â ª¦¥
;’¥¯«®¢ã €«¥ªá¥î (<Lrz> www.lrz.land.ru)
use32
  org 0x0
  db 'MENUET01' ;¨¤¥­â¨ä. ¨á¯®«­ï¥¬®£® ä ©«  ¢á¥£¤  8 ¡ ©â
  dd 0x1
  dd start
  dd i_end ; à §¬¥à ¯à¨«®¦¥­¨ï
  dd mem
  dd stacktop
  dd 0x0
  dd sys_path

include '../../proc32.inc'
include '../../macros.inc'
include '../../dll.inc'

include '../../develop/libraries/box_lib/load_lib.mac'
include '../../develop/libraries/box_lib/trunk/box_lib.mac'

min_window_w equ 485 ;¬¨­¨¬ «ì­ ï è¨à¨­  ®ª­ 
min_window_h equ 325 ;¬¨­¨¬ «ì­ ï ¢ëá®â  ®ª­ 
otst_panel_left equ 265

include 'tile_fun.inc'
include 'pl_import.inc'

  @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load

struct FileInfoBlock
	Function dd ?
	Position dd ?
	Flags	 dd ?
	Count	 dd ?
	Buffer	 dd ?
		db ?
	FileName dd ?
ends

fn_metki db 'pl_metki.lst',0
fn_icon1 db 'tl_sys_16.png',0
fn_icon2 db 'tl_nod_16.bmp',0

ini_name db 'planet_v.ini',0
ini_sec  db 'Map',0
ini_k_cache db 'Cache',0
ini_def_cache db '/cache/sat',0
ini_ext  db 'ext'
.number  db '?'
.def db 0 ;à áè¨à¥­¨¥ ¯® 㬮«ç ­¨î


align 4
start:
  load_libraries l_libs_start,load_lib_end

;¯à®¢¥àª  ­  ᪮«ìª® 㤠筮 § £ã§¨« áì ­ è  «¨¡ 
	mov	ebp,lib0
	cmp	dword [ebp+ll_struc_size-4],0
	jz	@f
	mcall	-1	;exit not correct
@@:
	mov	ebp,lib1
	cmp	dword [ebp+ll_struc_size-4],0
	jz	@f
	mcall	-1	;exit not correct
@@:
	mov	ebp,lib2
	cmp	dword [ebp+ll_struc_size-4],0
	jz	@f
	mcall	-1	;exit not correct
@@:
	mov	ebp,lib3
	cmp	dword [ebp+ll_struc_size-4],0
	jz	@f
	mcall	-1	;exit not correct
@@:

  copy_path ini_name,sys_path,file_name,0x0
  stdcall dword[ini_get_str],file_name,ini_sec,ini_k_cache,dword[edit1.text],dword[edit1.max],ini_def_cache
  stdcall [str_len],dword[edit1.text],dword[edit1.max]
  mov dword[edit1.size],eax
  mov dword[edit1.pos],eax

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

;áç¨â뢠¥¬ à áè¨à¥­¨ï ª àâ ¨§ *.ini ä ©« 
  mov byte[ini_ext.number],'0'
@@: ;áç¨â뢠¥¬ ¯ à ¬¥âàë ®â ext1 ¤® ext9
  inc byte[ini_ext.number]
  stdcall dword[ini_get_str],file_name,ini_sec,ini_ext,txt_tile_type_0,dword[tree1.info_capt_len],ini_ext.def
  cmp byte[txt_tile_type_0],0
  je @f
    stdcall dword[tl_node_add], txt_tile_type_0, 0, tree1
  jmp @b
@@:
  mov byte[ini_ext.number],'0' ;áç¨â뢠¥¬ ¯ à ¬¥âà ®â ext0 ª®â®àë© ¡ã¤¥â ¢ë¡à ­ ¢ ᯨ᪥
  stdcall dword[ini_get_str],file_name,ini_sec,ini_ext,txt_tile_type_0,dword[tree1.info_capt_len],ini_ext.def
  cmp byte[txt_tile_type_0],0
  jne @f
    mov dword[txt_tile_type_0],'.bmp' ;¥á«¨ ¢ *.ini ä ©«¥ ­¨ç¥£® ­¥â ¤®¡ ¢«ï¥¬ à áè¨à¥­¨¥ .bmp
  @@:
  stdcall dword[tl_node_add], txt_tile_type_0, 0, tree1

; init bmp file
  stdcall mem.Alloc, dword RGB_TILE_SIZE+300 ;300 - § ¯ á­ë¥ ¡ ©âë á ãç¥â®¬ § £®«®¢ª  bmp ä ©« 
  mov [bmp_icon],eax

  stdcall array_tile_function, tile_00,max_tiles_count,tile_init
  stdcall tiles_init_grid, tile_00,max_tiles_count,max_tiles_cols

  stdcall mem.Alloc, dword TREE_ICON_SYS16_BMP_SIZE
  mov [tree_sys_icon],eax

  stdcall mem.Alloc, dword TREE_ICON_NOD16_BMP_SIZE
  mov [tree_nod_icon],eax

  copy_path fn_icon1,sys_path,file_name,0x0
  mov eax,70 ;load icon file
  mov [run_file_70.Function], 0
  mov [run_file_70.Position], 0
  mov [run_file_70.Flags], 0
  mov [run_file_70.Count], TREE_ICON_SYS16_BMP_SIZE
  m2m [run_file_70.Buffer], [tree_sys_icon]
  mov byte[run_file_70+20], 0
  mov [run_file_70.FileName], file_name
  mov ebx,run_file_70
  int 0x40
  cmp ebx,0xffffffff
  je @f
    stdcall dword[img_decode], dword[tree_sys_icon],ebx,0
    mov dword[data_icon],eax
    stdcall dword[img_to_rgb2], dword[data_icon],dword[tree_sys_icon]
    stdcall dword[img_destroy], dword[data_icon]

    m2m dword[tree1.data_img_sys],dword[tree_sys_icon]
    m2m dword[tree2.data_img_sys],dword[tree_sys_icon]
  @@:


  copy_path fn_icon2,sys_path,file_name,0x0
  mov eax,70 ;load icon file
  mov [run_file_70.Count], TREE_ICON_NOD16_BMP_SIZE
  m2m [run_file_70.Buffer], [tree_nod_icon]
  mov ebx,run_file_70
  int 0x40
  cmp ebx,0xffffffff
  je @f
    stdcall dword[img_decode], dword[tree_nod_icon],ebx,0
    mov dword[data_icon],eax
    stdcall dword[img_to_rgb2], dword[data_icon],dword[tree_nod_icon]
    stdcall dword[img_destroy], dword[data_icon]

    m2m dword[tree1.data_img],dword[tree_nod_icon]
    m2m dword[tree2.data_img],dword[tree_nod_icon]
  @@:

  mcall 40,0x27 ;¬ áª  á¨á⥬­ëå ᮡë⨩
  init_checkboxes2 ch1,checkboxes_end

  mcall 48,3,sc,sizeof.system_colors
  ;ãáâ ­®¢ª  á¨á⥬­ëå 梥⮢
  edit_boxes_set_sys_color edit1,editboxes_end,sc
  check_boxes_set_sys_color2 ch1,checkboxes_end,sc

  mov byte[file_name],0

  ; OpenDialog initialisation
  stdcall [OpenDialog_Init],OpenDialog_data

align 4
red_win:
  call draw_window
  call but_MetLoad
  call but_Refresh ; Auto Refresh after program start

align 4
still:
  mov eax,10
  mcall

  cmp al,0x1 ;¨§¬. ¯®«®¦¥­¨¥ ®ª­ 
  jz red_win
  cmp al,0x2
  jz key
  cmp al,0x3
  jz button

  push dword ch2
  call [check_box_mouse]
  push dword ch1
  call [check_box_mouse]

  stdcall [edit_box_mouse], edit1
  stdcall [edit_box_mouse], edit2

  stdcall [tl_mouse], tree1
  stdcall [tl_mouse], tree2

  jmp still

align 4
key:
  push eax ebx
  mcall 2
  stdcall [edit_box_key], edit1
  stdcall [edit_box_key], edit2

  push dword tree1
  call [tl_key]
  push dword tree2
  call [tl_key]

  mov ebx,dword[el_focus] ;çâ®-¡ë ª àâ  ­¥ ¤¢¨£ « áì ¥á«¨ ®ª­  treelist ¢ 䮪ãá¥
  cmp ebx, dword tree1
  je .end_f
  cmp ebx, dword tree2
  je .end_f

  ;çâ®-¡ë ª àâ  ­¥ ¤¢¨£ « áì ¥á«¨ ⥪áâ®¢ë¥ ¯®«ï ¢ 䮪ãá¥
  test word[edit1.flags],10b ;ed_focus
  jne .end_f
  test word[edit2.flags],10b ;ed_focus
  jne .end_f

    cmp ah,179 ;Right
    jne @f
      call CursorMoveRight
    @@:
    cmp ah,176 ;Left
    jne @f
    cmp dword[map.coord_x],0
    je @f
      dec dword[map.coord_x]
      ;ᤢ¨£ ¥¬ á¥âªã â ©«®¢ ¢¯à ¢®, çâ®-¡ë ç áâì â ©«®¢ ᮢ¯ «¨ ¨ ¯à¨è«®áì ¬¥­ìè¥ § £à㦠âì ­®¢ëå
      stdcall tiles_grid_move_right, tile_00,max_tiles_count,max_tiles_cols
      call but_Refresh
    @@:
    cmp ah,177 ;Down
    jne @f
      call CursorMoveDown
    @@:
    cmp ah,178 ;Up
    jne @f
    cmp dword[map.coord_y],0
    je @f
      dec dword[map.coord_y]
      ;ᤢ¨£ ¥¬ á¥âªã â ©«®¢ ¢­¨§
      stdcall tiles_grid_move_down, tile_00,max_tiles_count,max_tiles_rows
      call but_Refresh
    @@:

    cmp ah,45 ;-
    jne @f
      call but_ZoomM
    @@:
    cmp ah,61 ;+
    jne @f
      call but_ZoomP
    @@:

  .end_f:
  pop ebx eax
  jmp still


align 4
draw_window:
pushad
  mcall 12,1

  xor eax,eax
  mov ebx,20*65536+min_window_w
  mov ecx,20*65536+min_window_h
  mov edx,[sc.work]
  or  edx,0x33000000
  mov edi,hed
  mcall

  mcall 9,procinfo,-1

  cmp dword[procinfo.box.width],min_window_w ; ¯à®¢¥à塞 è¨à¨­ã ®ª­ 
  jge @f
    mov dword[procinfo.box.width],min_window_w ; ¥á«¨ ®ª­® ®ç¥­ì 㧪®¥, 㢥«¨ç¨¢ ¥¬ è¨à¨­ã ¤«ï ¨§¡¥¦ ­¨ï £«îª®¢
  @@:

  mov edi,dword[procinfo.box.width]
  sub edi,min_window_w-otst_panel_left
  mov dword[tree1.box_left],edi
  mov dword[tree2.box_left],edi

  mov eax,dword[tree2.box_left] ;¤¢¨£ ¥¬ áªà®««¨­£
  add eax,dword[tree2.box_width]
  mov ebx,dword[tree2.p_scrol]
  mov word[ebx+2],ax

  mov dword[edit2.left],edi
  add dword[edit2.left],370-otst_panel_left

  stdcall dword[tl_draw],dword tree1
  stdcall dword[tl_draw],dword tree2
  mov dword[wScrMetki.all_redraw],1
  stdcall [scrollbar_ver_draw], dword wScrMetki

  mov eax,8 ;ª­®¯ª 
  mov ebx,145*65536+20
  mov ecx,5*65536+25
  mov edx,6
  mov esi,[sc.work_button]
  int 0x40

  mov ebx,100*65536+20
  mov ecx,5*65536+25
  mov edx,5
  int 0x40

  mov ebx,170*65536+40 ;ª­®¯ª  ¢ë§®¢  ¤¨ «®£  OpenDial
  ;mov ecx,5*65536+25
  mov edx,13
  int 0x40

  mov bx,di
  shl ebx,16
  mov bx,100
  mov ecx,265*65536+25
  mov edx,9
  int 0x40

  ;ebx ...
  mov ecx,235*65536+25
  mov edx,8
  int 0x40

  mov bx,di
  add bx,410-otst_panel_left
  shl ebx,16
  mov bx,55
  ;mov ebx,410*65536+55
  mov ecx,5*65536+25
  mov edx,7
  int 0x40

  mov bx,di
  add bx,440-otst_panel_left
  shl ebx,16
  mov bx,30
  ;mov ebx,440*65536+30
  mov ecx,265*65536+25
  mov edx,12
  int 0x40

  mov bx,di
  add bx,405-otst_panel_left
  shl ebx,16
  mov bx,30
  ;mov ebx,405*65536+30
  ;mov ecx,265*65536+25
  mov edx,11
  int 0x40

  mov bx,di
  add bx,370-otst_panel_left
  shl ebx,16
  mov bx,30
  ;mov ebx,370*65536+30
  ;mov ecx,265*65536+25
  mov edx,10
  int 0x40

  mov eax,4 ;à¨á®¢ ­¨¥ ⥪áâ 
  mov ebx,152*65536+13
  mov ecx,[sc.work_button_text]
  or  ecx,0x80000000
  mov edx,txt_zoom_p
  mcall

  mov ebx,107*65536+13
  mov edx,txt_zoom_m
  int 0x40

  mov bx,di
  add bx,270-otst_panel_left
  shl ebx,16
  mov bx,243
  ;mov ebx,270*65536+243
  mov edx,txt151
  int 0x40

  mov bx,di
  add bx,270-otst_panel_left
  shl ebx,16
  mov bx,273
  ;mov ebx,270*65536+273
  mov edx,txt152
  int 0x40

  mov bx,di
  add bx,415-otst_panel_left
  shl ebx,16
  mov bx,13
  ;mov ebx,415*65536+13
  mov edx,txt_but_refresh
  int 0x40

  mov bx,di
  add bx,380-otst_panel_left
  shl ebx,16
  mov bx,275
  ;mov ebx,380*65536+275
  mov edx,txt_met_up
  int 0x40

  mov bx,di
  add bx,415-otst_panel_left
  shl ebx,16
  mov bx,275
  ;mov ebx,415*65536+275
  mov edx,txt_met_dn
  int 0x40


  mov bx,di
  add bx,450-otst_panel_left
  shl ebx,16
  mov bx,275
  ;mov ebx,450*65536+275
  mov edx,txt_met_sh
  int 0x40

  mov ebx,175*65536+13
  mov edx,txt_cache
  int 0x40

  mov ecx,[sc.work_text]
  or  ecx,0x80000000

  mov bx,di
  ;add bx,450-otst_panel_left
  shl ebx,16
  mov bx,35
  ;mov ebx,265*65536+35
  mov edx,txt141
  int 0x40

  mov bx,135
  ;mov ebx,265*65536+135
  mov edx,txt142
  int 0x40

  call draw_tiles

  stdcall [check_box_draw], dword ch1
  stdcall [check_box_draw], dword ch2
  stdcall [edit_box_draw], edit1
  stdcall [edit_box_draw], edit2

  mcall 12,2
popad
  ret

  head_f_i:
  head_f_l  db '‘¨á⥬­ ï ®è¨¡ª ',0
  err_message_found_lib0 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  box_lib.obj',0
  err_message_import0 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ box_lib.obj',0
  err_message_found_lib1 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  libimg.obj',0
  err_message_import1 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ libimg.obj',0
  err_message_found_lib2 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  str.obj',0
  err_message_import2 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ str.obj',0
  err_message_found_lib3 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  libini.obj',0
  err_message_import3 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ libini.obj',0
  err_message_found_lib4 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  proc_lib.obj',0
  err_message_import4 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ proc_lib.obj',0

system_dir0 db '/sys/lib/'
lib0_name db 'box_lib.obj',0

system_dir1 db '/sys/lib/'
lib1_name db 'libimg.obj',0

system_dir2 db '/sys/lib/'
lib2_name db 'str.obj',0

system_dir3 db '/sys/lib/'
lib3_name db 'libini.obj',0

system_dir4 db '/sys/lib/'
lib4_name db 'proc_lib.obj',0

;library structures
l_libs_start:
  lib0 l_libs lib0_name, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, boxlib_import,err_message_import0, head_f_i
  lib1 l_libs lib1_name, sys_path, file_name, system_dir1, err_message_found_lib1, head_f_l, libimg_import, err_message_import1, head_f_i
  lib2 l_libs lib2_name, sys_path, file_name, system_dir2, err_message_found_lib2, head_f_l, strlib_import, err_message_import2, head_f_i
  lib3 l_libs lib3_name, sys_path, file_name, system_dir3, err_message_found_lib3, head_f_l, libini_import, err_message_import3, head_f_i
  lib4 l_libs lib4_name, sys_path, file_name, system_dir4, err_message_found_lib4, head_f_l, proclib_import, err_message_import4, head_f_i
load_lib_end:

align 4
button:
  mcall 17 ;¯®«ãç¨âì ª®¤ ­ ¦ â®© ª­®¯ª¨
  cmp ah,5
  jne @f
    call but_ZoomM
  @@:
  cmp ah,6
  jne @f
    call but_ZoomP
  @@:
  cmp ah,7
  jne @f
    call but_Refresh
  @@:

  cmp ah,9
  jz  but_MetSave
  cmp ah,8
  jz  but_MetAdd

  cmp ah,10
  jne @f
    call but_met_up
  @@:
  cmp ah,11
  jne @f
    call but_met_dn
  @@:
  cmp ah,12
  jne @f
    call fun_goto_met
  @@:
  cmp ah,13 ;¤¨ «®£ OpenDialog ¤«ï ¯®¨áª  ¯ ¯ª¨
  jne @f
    call fun_opn_dlg
  @@:
  cmp ah,1
  jne still

.exit:
  push dword[bmp_icon]
  call mem.Free
  stdcall array_tile_function, tile_00,max_tiles_count,tile_destroy

  stdcall dword[tl_data_clear], tree1
  mov dword[tree2.data_img_sys],0 ;ç¨á⨬ 㪠§ â¥«ì ­  á¨á⥬­ë¥ ¨ª®­ª¨,
    ;â. ª. ®­¨ ¡ë«¨ 㤠«¥­ë ¢¥àå­¥© ä㭪樥© tl_data_clear
    ;¯®¢â®à­ë© ¢ë§®¢ tl_data_clear ¡¥§ ç¨á⪨ 㪠§ â¥«ï ¢ë§¢¥â ®è¨¡ªã
  mov dword[tree2.data_img],0 ;ç¨á⨬ 㪠§ â¥«ì ­  ¨ª®­ª¨ 㧫®¢
  stdcall dword[tl_data_clear], tree2

;  stdcall dword[img_destroy], dword[data_icon]
  mcall -1 ;¢ë室 ¨§ ¯à®£à ¬¬ë


;input:
;data_rgb - pointer to rgb data
;size - count img pixels (size img data / 3(rgb) )
align 4
proc img_rgb_wdiv2 data_rgb:dword, size:dword
  push eax ebx ecx edx
  mov eax,dword[data_rgb]
  mov ecx,dword[size] ;ecx = size
  imul ecx,3
  @@: ;§ â¥¬­¥­¨¥ æ¢¥â  ¯¨ªá¥«¥©
    shr byte[eax],1
    and byte[eax],0x7f
    inc eax
    loop @b

  mov eax,dword[data_rgb]
  mov ecx,dword[size] ;ecx = size
  shr ecx,1
  @@: ;á«®¦¥­¨¥ 梥⮢ ¯¨ªá¥«¥©
    mov ebx,dword[eax+3] ;ª®¯¨à㥬 梥â á®á¥¤­¥£® ¯¨ªá¥«ï
    add word[eax],bx
    shr ebx,16
    add byte[eax+2],bl

    add eax,6 ;=2*3
    loop @b

  mov eax,dword[data_rgb]
  add eax,3
  mov ebx,eax
  add ebx,3
  mov ecx,dword[size] ;ecx = size
  shr ecx,1
  dec ecx ;«¨è­¨© ¯¨ªá¥«ì
  @@: ;¯®¤¦ â¨¥ ¯¨ªá¥«¥©
    mov edx,dword[ebx]
    mov word[eax],dx
    shr edx,16
    mov byte[eax+2],dl

    add eax,3
    add ebx,6
    loop @b

  pop edx ecx ebx eax
  ret
endp

;input:
;data_rgb - pointer to rgb data
;size - count img pixels (size img data / 3(rgb) )
;size_w - width img in pixels
align 4
proc img_rgb_hdiv2, data_rgb:dword, size:dword, size_w:dword
  pushad

  mov eax,dword[data_rgb] ;eax =
  mov ecx,dword[size]	  ;ecx = size
  imul ecx,3
  @@: ;§ â¥¬­¥­¨¥ æ¢¥â  ¯¨ªá¥«¥©
    shr byte[eax],1
    and byte[eax],0x7f
    inc eax
    loop @b

  mov eax,dword[data_rgb] ;eax =
  mov edi,dword[size_w]
  lea esi,[edi+edi*2] ;esi = width*3(rgb)
  mov ebx,esi
  add ebx,eax
  mov ecx,dword[size]  ;ecx = size
  shr ecx,1
  xor edi,edi
  @@: ;á«®¦¥­¨¥ 梥⮢ ¯¨ªá¥«¥©
    mov edx,dword[ebx] ;ª®¯¨à㥬 梥⠭¨¦­¥£® ¯¨ªá¥«ï
    add word[eax],dx
    shr edx,16
    add byte[eax+2],dl

    add eax,3
    add ebx,3
    inc edi
    cmp edi,dword[size_w]
    jl .old_line
      add eax,esi
      add ebx,esi
      xor edi,edi
    .old_line:
    loop @b


  mov eax,dword[data_rgb] ;eax =
  add eax,esi ;esi = width*3(rgb)
  mov ebx,esi
  add ebx,eax
  mov ecx,dword[size] ;ecx = size
  shr ecx,1
  sub ecx,dword[size_w] ;«¨è­ïï áâப  ¯¨ªá¥«¥©
  xor edi,edi
  @@: ;¯®¤¦ â¨¥ ¯¨ªá¥«¥©
    mov edx,dword[ebx] ;ª®¯¨à㥬 梥⠭¨¦­¥£® ¯¨ªá¥«ï
    mov word[eax],dx
    shr edx,16
    mov byte[eax+2],dl

    add eax,3
    add ebx,3
    inc edi
    cmp edi,dword[size_w]
    jl .old_line_2
      add ebx,esi
      xor edi,edi
    .old_line_2:
    loop @b

  popad
  ret
endp

;input:
;data_rgb - pointer to rgb data
;size - count img pixels (size img data / 3(rgb) )
align 4
proc img_rgb_wmul2, data_rgb:dword, size:dword
  push eax ebx ecx edx
  ;eax - source
  ;ebx - destination
  mov ecx,dword[size] ;ecx = size
  mov eax,ecx
  dec eax
  lea eax,[eax+eax*2] ;eax = (size-1)*3
  mov ebx,eax ;ebx = size*3
  add eax,dword[data_rgb] ;eax = pointer + size*3
  add ebx,eax ;ebx = pointer + 2*size*3
  @@:
    mov edx,dword[eax] ;edx = pixel color
    mov word[ebx],dx
    mov word[ebx+3],dx
    shr edx,16
    mov byte[ebx+2],dl
    mov byte[ebx+3+2],dl
    sub eax,3
    sub ebx,6
    loop @b
  pop edx ecx ebx eax
  ret
endp

;äã­ªæ¨ï ¤«ï à áâ¢ ­¨ï ¨§®¡à ¦¥­¨ï ¯® ¢ëá®â¥ ¢ 2 à § 
;¢ 㪠§ â¥«¥ data_rgb ¯ ¬ï⨠¤®«¦­® ¡ëâì ¢ 2 à §  ¡®«ìè¥ ç¥¬ size*3
;¨­ ç¥ ¯à¨ à áâ¢ ­¨¨ ¡ã¤¥â ®è¨¡ª , ¢ë室  ­  çã¦ãî ¯ ¬ïâì
;input:
;data_rgb - pointer to rgb data
;size - count img pixels (size img data / 3(rgb) )
;size_w - width img in pixels
align 4
proc img_rgb_hmul2, data_rgb:dword, size:dword, size_w:dword
  pushad

  mov esi,dword[size_w]
  lea esi,[esi+esi*2] ;esi = width * 3(rgb)
  mov eax,dword[size]
  lea eax,[eax+eax*2]
  mov edi,eax
  shl edi,1
  add eax,dword[data_rgb] ;eax = pointer to end pixel (old image) + 1
  add edi,dword[data_rgb] ;edi = pointer to end pixel (new image) + 1
  mov ebx,edi
  sub ebx,esi

  .beg_line:
  mov ecx,dword[size_w]
  @@:
    sub eax,3
    sub ebx,3
    sub edi,3

    mov edx,dword[eax] ;edx = pixel color
    mov word[ebx],dx
    mov word[edi],dx
    shr edx,16
    mov byte[ebx+2],dl
    mov byte[edi+2],dl

    loop @b

  sub ebx,esi
  sub edi,esi

  cmp eax,dword[data_rgb]
  jg .beg_line

  popad
  ret
endp

;input:
;data_rgb - pointer to rgb data
;size - count img pixels (size img data / 3(rgb) )
;size_w - width img in pixels
align 4
proc img_rgb_hoffs, data_rgb:dword, size:dword, size_w:dword, hoffs:dword
  push eax ebx ecx edx esi

  mov esi,dword[size_w]
  lea esi,[esi+esi*2] ;esi = width * 3(rgb)
  imul esi,dword[hoffs]

  mov eax,dword[size]
  lea eax,[eax+eax*2]
  add eax,dword[data_rgb] ;eax = pointer to end pixel + 1
  sub eax,3
  mov ebx,eax
  add ebx,esi

  mov ecx,dword[size]
  dec ecx
  @@:
    mov edx,dword[eax] ;edx = pixel color
    mov word[ebx],dx
    shr edx,16
    mov byte[ebx+2],dl

    sub eax,3
    sub ebx,3
    loop @b
  pop esi edx ecx ebx eax
  ret
endp


;input:
;data_rgb - pointer to rgb data
;size_w_old - width img in pixels
;size_w_new - new width img in pixels
;size_h - height img in pixels
align 4
proc img_rgb_wcrop, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
  pushad
    mov eax, dword[size_w_old]
    lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb)
    mov ebx, dword[size_w_new]
    lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb)
    mov edx, dword[size_h]
    ;dec edx
    mov edi, dword[data_rgb] ;edi - ¯®«ã砥⠤ ­­ë¥
    mov esi, edi
    add edi, ebx
    add esi, eax
    cld
  @@:
    dec edx ;㬥­ìè ¥¬ áç¥â稪 ®áâ ¢è¨åáï áâப ­  1
    cmp edx,0
    jle @f

    mov ecx, ebx
    rep movsb ;¯¥à¥­®á (ª®¯¨à®¢ ­¨¥) áâப¨ ¯¨ªá¥«¥©
;stdcall mem_copy,esi,edi,ebx

    add esi,eax ;¯¥à¥å®¤ ­  ­®¢ãî áâà®çªã ¨§®¡à ¦¥­¨ï
    sub esi,ebx
;add esi,eax
;add edi,ebx
    jmp @b
  @@:

  popad
  ret
endp

align 4
proc mem_copy, source:dword, destination: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

align 4
proc mem_clear, mem:dword, len:dword
  push eax ecx edi
    cld
    xor al,al
    mov edi, dword[mem]
    mov ecx, dword[len]
    repne stosb
  pop edi ecx eax
  ret
endp

align 4
fun_opn_dlg: ;äã­ªæ¨ï ¤«ï ¢ë§®¢  OpenFile ¤¨ «®£ 
	pushad
	copy_path open_dialog_name,communication_area_default_path,file_name,0
	mov [OpenDialog_data.type],2
	mov dword[plugin_path],0 ;çâ®-¡ë ¯à¨ ®âªàë⨨ ¤¨ «®£®¢®£® ®ª­  ¯ãâì ¢á¥£¤  ¡à «áï ¨§ OpenDialog_data.dir_default_path

	stdcall [OpenDialog_Start],OpenDialog_data
	cmp [OpenDialog_data.status],2
	je @f
		stdcall [str_len],dword[edit1.text],dword[edit1.max]
		mov [edit1.size],eax
		mov [edit1.pos],eax
		stdcall [edit_box_draw], edit1
	@@:
	popad
	ret

  txt_met_up db 24,0
  txt_met_dn db 25,0
  txt_met_sh db '*',0
  txt_zoom_m db '-',0
  txt_zoom_p db '+',0
  txt151 db '„®¡ ¢¨âì ¬¥âªã',0
  txt152 db '‘®åà ­¨âì ¬¥âª¨',0
  txt_but_refresh db 'Ž¡­®¢¨âì',0
  txt_cache db 'Cache:',0
  txt141 db '‚¨¤ ª àâë',0
  txt142 db '‚ë¡®à ¬¥âª¨',0

; check_boxes
ch1 check_box2 (5 shl 16)+12,  (5 shl 16)+12, 6, 0xffffd0, 0x800000, 0, ch_text1, ch_flag_en
ch2 check_box2 (5 shl 16)+12, (20 shl 16)+12, 6, 0xffffd0, 0x800000, 0, ch_text2, ch_flag_en
checkboxes_end:

ch_text1 db '¡à âì ᢥàåã',0
ch_text2 db '¡à âì á­¨§ã',0

edit1 edit_box 190, 215,  10, 0xd0ffff, 0xff, 0x80ff, 0, 0xa000, 4090, openfile_path, mouse_dd, 0
edit2 edit_box 100, 370, 240, 0xd0ffff, 0xff, 0x80ff, 0, 0xa000,  30, ed_buffer.2, mouse_dd, 0
editboxes_end:

tree1 tree_list 10,10, tl_list_box_mode+tl_key_no_edit, 16,16,\
    0x8080ff,0x0000ff,0xffffff, 265,45,90,85, 0,0,0,\
    el_focus, 0,fun_new_map_type
tree2 tree_list 32,300, tl_draw_par_line, 16,16,\
    0x8080ff,0x0000ff,0xffffff, 265,145,190,85, 0,12,0,\
    el_focus, wScrMetki,fun_goto_met

align 4
wScrMetki:
.x:
.size_x     dw 16 ;+0
.start_x    dw 0 ;+2
.y:
.size_y     dw 100 ;+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

ed_buffer: ;òåêñò äëÿ edit
  .2: rb 32

el_focus dd tree1

tree_sys_icon dd 0
tree_nod_icon dd 0

bmp_icon   dd 0 ;¯ ¬ïâì ¤«ï § £à㧪¨ ¨§®¡à ¦¥­¨ï
data_icon  dd 0 ;¯ ¬ïâì ¤«ï ¯à¥®¡à §®¢ ­¨ï ª à⨭ª¨ äã­ªæ¨ï¬¨ libimg

run_file_70 FileInfoBlock


txt_tile_path db 'tile path',0
  rb 300
txt_tile_type dd txt_tile_type_0 ;㪠§ â¥«ì ­  ¢ë¡à ­­ë© ⨯ ä ©«®¢
txt_tile_type_0 db 0
  rb 10

;---------------------------------------------------------------------
align 4
OpenDialog_data:
.type			dd 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
.end:
db 0

align 4
map: ;ª®®à¤¨­ âë ª àâë
  .coord_x dd 0 ;ª®®à¤¨­ â  x
  .coord_y dd 0 ;ª®®à¤¨­ â  y
  .zoom    db 1 ;¬ áèâ ¡

align 4
tile_00 rb size_tile_struc * max_tiles_count

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

align 4
.str:
  mov ecx,0x0a ;§ ¤ ¥âáï á¨á⥬  áç¨á«¥­¨ï ¨§¬¥­ïîâáï ॣ¨áâàë ebx,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	      ;¢¥à­ãâìáï ç¥­ì ¨­â¥à¥á­ë© 室 â.ª. ¯®ª  ¢ á⥪¥ åà ­¨âìáï ª®«-¢® ¢ë§®¢®¢ â® á⮫쪮 à § ¬ë ¨ ¡ã¤¥¬ ¢ë§ë¢ âìáï


hed db 'Planet viewer 16.01.13',0 ;¯®¤¯¨áì ®ª­ 

sc system_colors  ;á¨á⥬­ë¥ 梥â 
mouse_dd dd 0 ;­ã¦­® ¤«ï Shift-  ¢ editbox
i_end:
	rb 1024
	align 16
	procinfo process_information
stacktop:
	sys_path rb 4096
	file_name:
		rb 4096
	plugin_path:
		rb 4096
	openfile_path:
		rb 4096
	filename_area:
		rb 256
mem: