diff --git a/programs/develop/libraries/box_lib/trunk/tree_list.mac b/programs/develop/libraries/box_lib/trunk/tree_list.mac index 101bcb1f54..4c98b39d3d 100644 --- a/programs/develop/libraries/box_lib/trunk/tree_list.mac +++ b/programs/develop/libraries/box_lib/trunk/tree_list.mac @@ -1,6 +1,6 @@ ; ьръЁюё фы  ёшёЄхьэющ сшсышюЄхъш box_lib.obj ; ¤ыхьхэЄ TreeList фы  Kolibri OS -; Їрщы яюёыхфэшщ Ёрч шчьхэ ыё  05.02.2010 IgorA +; Їрщы яюёыхфэшщ Ёрч шчьхэ ыё  09.02.2010 IgorA ; эр ъюф яЁшьхэхэр GPL2 ышЎхэчш  @@ -16,8 +16,10 @@ sizeof.TreeList equ 20 ;ends tl_info_size equ word[edi +4] ;ЁрчьхЁ фрээ√ї т√фхы хь√ї фы  ърцфюую єчыр (яюы№чютрЄхы№ё№ъшх фрээ√х + ЄхъёЄ фы  яюфяшёш) +tl_info_max_count equ dword[edi+6] ;ьръёшьры№эюх ъюышўхёЄтю єчыют, ъюЄюЁ√х ьюцэю фюсртшЄ№ т ¤ыхьхэЄ tl_style equ dword[edi+10] ;ёЄшыш ¤ыхьхэЄр tl_data_nodes equ dword[edi+14] ;єърчрЄхы№ эр ёЄЁєъЄєЁ√ єчыют +tl_data_img equ dword[edi+18] ;єърчрЄхы№ эр шчюсЁрцхэш  ё шъюэърьш єчыют tl_img_cx equ word[edi+22] ;°шЁшэр шъюэюъ tl_img_cy equ word[edi+24] ;т√ёюЄр шъюэюъ tl_data_img_sys equ dword[edi+26] ;єърчрЄхы№ эр ёшёЄхьэ√х шчюсЁрцхэш  (ёЄЁхыъш, яы■ёшъш) @@ -51,8 +53,6 @@ tl_load_mode_add equ 0x20000 ; tl_save_load_heder_size equ 26 ;ЁрчьхЁ чруюыютър фы  чряшёш/ўЄхэш  ¤ыхьхэЄют ;data_info dd ? ;+ 0 єърчрЄхы№ эр юёэютэ√х фрэ√х -;info_max_count dd ? ;+ 6 ьръёшьры№эюх ъюыышўхёЄтю ёЄЁєъЄєЁ -;data_img dd ? ;+18 єърчрЄхы№ эр шчюсЁрцхэш  ;ls_tim dd ? ;+34 тЁхь  яюёыхфэхую ёюїЁрэхэш  ;on_activate dd ? ;+92 єърчрЄхы№ эр ЇєэъЎш■ яЁш ръЄштшЁютрэшш єчыр @@ -133,7 +133,7 @@ tl_data_init: ; imul ecx,dword[edi+6] call mem_Alloc mov dword[edi],eax ;ъюяшЁєхь єърчрЄхы№ эр яюыєўхэє■ ярь Є№ т ёЄЁєъЄєЁє - mov dword[edi+18],0 ;юсэєы хь єърчрЄхы№ 'data_img' + mov tl_data_img,0 ;юсэєы хь єърчрЄхы№ 'data_img' mov tl_data_img_sys,0 ;юсэєы хь єърчрЄхы№ 'data_img_sys' mov ecx,sizeof.TreeList @@ -174,7 +174,7 @@ tl_data_clear: ; mov ebp,esp push ecx edi mov edi,dword[ebp+8] - cmp dword[edi+18],0 ;data_img + cmp tl_data_img,0 je @f mov ecx,dword[edi+18] call mem_Free ;ўшёЄър ёшёЄхьэ√ї шъюэюъ @@ -327,7 +327,7 @@ tl_mouse: ; mov ebx,tl_box_left shl ebx,16 cmp eax,ebx ;ыхтр  уЁрэшЎр юъэр - jl .test_scroll + jl .no_in_wnd ;.test_scroll mov ebx,tl_box_left add ebx,tl_box_width @@ -573,7 +573,7 @@ align 4 tl_draw: ;т√тюф ёяшёър эр ¤ъЁрэ push ebp mov ebp,esp - push eax ebx ecx edx edi esi + pushad ;draw dir_list main rect mov edi,dword[ebp+8] mov ebx,tl_box_left @@ -670,7 +670,7 @@ tl_draw: ; call scroll_bar_vertical.draw .end_draw: - pop esi edi edx ecx ebx eax + popad pop ebp ret 4 @@ -755,13 +755,9 @@ tl_iterat_next_all: align 4 tl_iterat_perv: push eax - -; mov bl,byte[edx+2] - cmp tl_tim_undo,0 je .beg1 - push eax .beg0: call tl_move_perv cmp edx,ecx @@ -1028,7 +1024,7 @@ tl_get_display_cur_pos: ; ;input: ; eax = node position ; edx = pointer to some node struct -; edi = pointer to TreeInfo struct +; edi = pointer to 'TreeList' struct ; esi = coord of bottom border align 4 tl_draw_node: @@ -1067,7 +1063,7 @@ tl_draw_node: .crop: mov esi,ecx ;save ecx - cmp dword[edi+18],0 ;data_img + cmp tl_data_img,0 jne .draw_img_n push edx mov edx,tl_col_txt @@ -1088,7 +1084,7 @@ tl_draw_node: imul bx,tl_img_cx imul bx,tl_img_cy imul ebx,esi ;esi = icon index - add ebx,dword[edi+18] ;data_img + add ebx,tl_data_img mov eax,7 int 0x40 ;draw node icon '-' @@ -1116,6 +1112,7 @@ tl_draw_node: ;input: ; ecx = pointer to 1 node struct +; edx = pointer to some node struct ;... align 4 tl_draw_node_icon_opn_clo: ;ЁшёєхЄ шъюэъш юЄъЁ√Єюую шыш чръЁ√Єюую єчыр (юс√ўэю + шыш -) @@ -1158,6 +1155,8 @@ tl_draw_node_icon_opn_clo: ; ;input: ; al = єЁютхэ№ ¤ыхьхэЄр +; ecx = pointer to 1 node struct +; edx = pointer to some node struct ;... align 4 tl_draw_node_icon_par_lin: @@ -1213,30 +1212,32 @@ tl_draw_node_icon_par_lin: ret - -;icon: +;input: ; al = єЁютхэ№ ¤ыхьхэЄр -;... +; ecx = pointer to 1 node struct +; edx = pointer to some node struct +; edi = pointer to 'TreeList' struct align 4 tl_draw_node_icon_par_lin_up: - push eax ebx ecx edx esi + push eax ebx ecx edx + push esi cmp tl_data_img_sys,0 ;if not image je @f cmp al,0 je @f -;--------- xor esi,esi ;т si сєфхь эрёўшЄ√трЄ№ ъюы-тю шъюэюъ, эєцэ√ї фы  яЁюЁшёютъш ышэшш +;--- Ўшъы фы  т√ўшёыхэш  ъюыышўхёЄтр тхЁЄшъры№э√ї ышэшщ --- .cycle0: call tl_iterat_perv ;get perv visible item cmp edx,ecx jle .cycle1 ;if begin of list cmp byte[edx+2],al - jle .cycle1 ;єЁютхэ№ тхЁїэхую ¤ыхьхэЄр эх ЄЁхсєхЄ яЁюЁшёютъш + jle .cycle0end ;єЁютхэ№ тхЁїэхую ¤ыхьхэЄр эх ЄЁхсєхЄ яЁюЁшёютъш inc si jmp .cycle0 - .cycle1: + .cycle0end: cmp si,0 ;si = ъюы-тю шъюэюъ ышэшш ъюЄюЁ√х эєцэю эрЁшёютрЄ№ ётхЁїє je @f shl esi,16 @@ -1257,25 +1258,24 @@ tl_draw_node_icon_par_lin_up: mov ebx,3 ;rgb = 3 bytes imul bx,tl_img_cx imul bx,tl_img_cy - ;imul ebx,1 add ebx,tl_data_img_sys add esi,tl_box_top add si,tl_capt_cy ;si = тхЁїэ   уЁрэшЎр юъэр mov eax,7 -;--------- - .cycle2: +;--- Ўшъы фы  Ёшёютрэш  тхЁЄшъры№эющ ышэшш --- + .cycle1: sub dx,tl_img_cy ;яюфэшьрхь ъююЁфшэрЄє y ттхЁї cmp dx,si jl @f -; int 0x40 ;draw line icon cmp esi,0x10000 jl @f int 0x40 ;draw line icon sub esi,0x10000 ;єьхэ№°рхь ёўхЄўшъ шъюэюъ - jmp .cycle2 + jmp .cycle1 @@: - pop esi edx ecx ebx eax + pop esi + pop edx ecx ebx eax ret ;input: @@ -1470,7 +1470,7 @@ tl_node_add: ; pop dword [edx+8] call tl_get_node_index ;*** eax = i *** - cmp eax,dword[edi+6] ;info_max_count + cmp eax,tl_info_max_count jge .u0 mov [ecx],eax ;node[po_t].next=i; // ёё√ыъш яхЁхэряЁрты хь @@ -2008,19 +2008,26 @@ align 4 tl_node_lev_inc: ;єтхышўшЄ№ єЁютхэ№ push ebp mov ebp,esp - push eax edx edi + push eax ecx edx edi mov edi,dword[ebp+8] bt tl_style,2 ;tl_list_box_mode jc @f call tl_get_cur_node_index ;eax=po_t cmp eax,2 jl @f + mov ecx,tl_data_nodes imul eax,sizeof.TreeList - add eax,tl_data_nodes + add eax,ecx ;eax = pointer to some node struct + add ecx,sizeof.TreeList ;ecx = pointer to 1 node struct + mov edx,eax - inc word[edx+2] + call tl_iterat_perv ;яЁютхЁ хь хёЄ№ ыш тхЁїэшщ єчхы + cmp edx,ecx + jle @f ;хёыш тхЁїэхую єчыр эх Єю Єхъє∙шщ єчхы эх фтшурхь + + inc word[eax+2] @@: - pop edi edx eax + pop edi edx ecx eax pop ebp ret 4 @@ -2028,19 +2035,18 @@ align 4 tl_node_lev_dec: ;єьхэ№°шЄ№ єЁютхэ№ push ebp mov ebp,esp - push eax edx edi + push eax edi mov edi,dword[ebp+8] call tl_get_cur_node_index ;eax=po_t cmp eax,2 jl @f imul eax,sizeof.TreeList add eax,tl_data_nodes - mov edx,eax - cmp word[edx+2],0 + cmp word[eax+2],0 je @f - dec word[edx+2] + dec word[eax+2] @@: - pop edi edx eax + pop edi eax pop ebp ret 4 @@ -2464,8 +2470,6 @@ txt_capt_otm db ' ;input: ; eax = value ; edi = string buffer -;output: -; edi = align 4 tl_convert_to_str: pushad diff --git a/programs/other/planet_v/build.bat b/programs/other/planet_v/build.bat new file mode 100644 index 0000000000..7e60eab2d6 --- /dev/null +++ b/programs/other/planet_v/build.bat @@ -0,0 +1,10 @@ +if not exist bin mkdir bin +if not exist bin\tl_sys_16.png @copy tl_sys_16.png bin\tl_sys_16.png +if not exist bin\tl_nod_16.bmp @copy tl_nod_16.bmp bin\tl_nod_16.bmp +if not exist bin\planet_v.ini @copy planet_v.ini bin\planet_v.ini +if not exist bin\pl_metki.lst @copy pl_metki.lst bin\pl_metki.lst +if not exist bin\str.obj @copy str.obj bin\str.obj + +@fasm.exe -m 16384 planet_v.asm bin\planet_v.kex +@kpack bin\planet_v.kex +pause \ No newline at end of file diff --git a/programs/other/planet_v/dll.inc b/programs/other/planet_v/dll.inc new file mode 100644 index 0000000000..5f13fbbc16 --- /dev/null +++ b/programs/other/planet_v/dll.inc @@ -0,0 +1,99 @@ + +proc dll.Load, import_table:dword + mov esi,[import_table] + .next_lib: mov edx,[esi] + or edx,edx + jz .exit + push esi + mov esi,[esi+4] + mov edi,s_libdir.fname + @@: lodsb + stosb + or al,al + jnz @b + mcall 68,19,s_libdir + or eax,eax + jz .fail + stdcall dll.Link,eax,edx + push eax + mov eax, [eax] + cmp dword [eax], 'lib_' + pop eax + jnz @f + stdcall dll.Init,[eax+4] + @@: + pop esi + add esi,8 + jmp .next_lib + .exit: xor eax,eax + ret + .fail: add esp,4 + xor eax,eax + inc eax + ret +endp + +proc dll.Link, exp:dword,imp:dword + push eax + mov esi,[imp] + test esi,esi + jz .done + .next: lodsd + test eax,eax + jz .done + stdcall dll.GetProcAddress,[exp],eax + or eax,eax + jz @f + mov [esi-4],eax + jmp .next + @@: mov dword[esp],0 + .done: pop eax + ret +endp + +proc dll.Init, dllentry:dword + pushad + mov eax,mem.Alloc + mov ebx,mem.Free + mov ecx,mem.ReAlloc + mov edx,dll.Load + stdcall [dllentry] + popad + ret +endp + +proc dll.GetProcAddress, exp:dword,sz_name:dword + mov edx,[exp] + xor eax,eax + .next: or edx,edx + jz .end + cmp dword[edx],0 + jz .end + stdcall strcmp,[edx],[sz_name] + test eax,eax + jz .ok + add edx,8 + jmp .next + .ok: mov eax,[edx+4] + .end: ret +endp + +proc strcmp, str1:dword,str2:dword + push esi edi + mov esi,[str1] + mov edi,[str2] + xor eax,eax + @@: lodsb + scasb + jne .fail + or al,al + jnz @b + jmp .ok + .fail: or eax,-1 + .ok: pop edi esi + ret +endp + +s_libdir: + db '/sys/lib/' + .fname rb 32 diff --git a/programs/other/planet_v/mem.inc b/programs/other/planet_v/mem.inc new file mode 100644 index 0000000000..ec78fbf7f6 --- /dev/null +++ b/programs/other/planet_v/mem.inc @@ -0,0 +1,48 @@ +;----------------------------------------------------------------------------- +proc mem.Alloc,size ;///////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx + mov ecx,[size] + ;*** add ecx,4 + mcall 68,12 + ;*** add ecx,-4 + ;*** mov [eax],ecx + ;*** add eax,4 + pop ecx ebx + ret +endp + +;----------------------------------------------------------------------------- +proc mem.ReAlloc,mptr,size ;////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx edx + mov ecx,[size] + or ecx,ecx + jz @f + ;*** add ecx,4 + @@: mov edx,[mptr] + or edx,edx + jz @f + ;*** add edx,-4 + @@: mcall 68,20 + or eax,eax + jz @f + ;*** add ecx,-4 + ;*** mov [eax],ecx + ;*** add eax,4 + @@: pop edx ecx ebx + ret +endp + +;----------------------------------------------------------------------------- +proc mem.Free,mptr ;////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx + mov ecx,[mptr] + or ecx,ecx + jz @f + ;*** add ecx,-4 + @@: mcall 68,13 + pop ecx ebx + ret +endp diff --git a/programs/other/planet_v/pl_import.inc b/programs/other/planet_v/pl_import.inc new file mode 100644 index 0000000000..e5965fc605 --- /dev/null +++ b/programs/other/planet_v/pl_import.inc @@ -0,0 +1,175 @@ +align 4 +boxlib_import: + edit_box_draw dd aEdit_box_draw + edit_box_key dd aEdit_box_key + edit_box_mouse dd aEdit_box_mouse +; version_ed dd aVersion_ed + + check_box_draw dd aCheck_box_draw + check_box_mouse dd aCheck_box_mouse +; version_ch dd aVersion_ch + +; option_box_draw dd aOption_box_draw +; option_box_mouse dd aOption_box_mouse +; version_op dd aVersion_op + + scrollbar_ver_draw dd aScrollbar_ver_draw +; scrollbar_ver_mouse dd aScrollbar_ver_mouse + scrollbar_hor_draw dd aScrollbar_hor_draw +; scrollbar_hor_mouse dd aScrollbar_hor_mouse +; version_scrollbar dd aVersion_scrollbar + + tl_data_init dd sz_tl_data_init + tl_data_clear dd sz_tl_data_clear + tl_info_clear dd sz_tl_info_clear + tl_key dd sz_tl_key + tl_mouse dd sz_tl_mouse + tl_draw dd sz_tl_draw + tl_info_undo dd sz_tl_info_undo + tl_info_redo dd sz_tl_info_redo + tl_node_add dd sz_tl_node_add + tl_node_set_data dd sz_tl_node_set_data + tl_node_get_data dd sz_tl_node_get_data + tl_node_delete dd sz_tl_node_delete + tl_cur_beg dd sz_tl_cur_beg + tl_cur_next dd sz_tl_cur_next + tl_cur_perv dd sz_tl_cur_perv + tl_node_close_open dd sz_tl_node_close_open + tl_node_lev_inc dd sz_tl_node_lev_inc + tl_node_lev_dec dd sz_tl_node_lev_dec + tl_node_move_up dd sz_tl_node_move_up + tl_node_move_down dd sz_tl_node_move_down + tl_save_mem dd sz_tl_save_mem + tl_load_mem dd sz_tl_load_mem + tl_get_mem_size dd sz_tl_get_mem_size + + dd 0,0 + + aEdit_box_draw db 'edit_box',0 + aEdit_box_key db 'edit_box_key',0 + aEdit_box_mouse db 'edit_box_mouse',0 +; aVersion_ed db 'version_ed',0 + + aCheck_box_draw db 'check_box_draw',0 + aCheck_box_mouse db 'check_box_mouse',0 +; aVersion_ch db 'version_ch',0 + +; aOption_box_draw db 'option_box_draw',0 +; aOption_box_mouse db 'option_box_mouse',0 +; aVersion_op db 'version_op',0 + + aScrollbar_ver_draw db 'scrollbar_v_draw',0 +; aScrollbar_ver_mouse db 'scrollbar_v_mouse',0 + aScrollbar_hor_draw db 'scrollbar_h_draw',0 +; aScrollbar_hor_mouse db 'scrollbar_h_mouse',0 +; aVersion_scrollbar db 'version_scrollbar',0 + + sz_tl_data_init db 'tl_data_init',0 + sz_tl_data_clear db 'tl_data_clear',0 + sz_tl_info_clear db 'tl_info_clear',0 + sz_tl_key db 'tl_key',0 + sz_tl_mouse db 'tl_mouse',0 + sz_tl_draw db 'tl_draw',0 + sz_tl_info_undo db 'tl_info_undo',0 + sz_tl_info_redo db 'tl_info_redo',0 + sz_tl_node_add db 'tl_node_add',0 + sz_tl_node_set_data db 'tl_node_set_data',0 + sz_tl_node_get_data db 'tl_node_get_data',0 + sz_tl_node_delete db 'tl_node_delete',0 + sz_tl_cur_beg db 'tl_cur_beg',0 + sz_tl_cur_next db 'tl_cur_next',0 + sz_tl_cur_perv db 'tl_cur_perv',0 + sz_tl_node_close_open db 'tl_node_close_open',0 + sz_tl_node_lev_inc db 'tl_node_lev_inc',0 + sz_tl_node_lev_dec db 'tl_node_lev_dec',0 + sz_tl_node_move_up db 'tl_node_move_up',0 + sz_tl_node_move_down db 'tl_node_move_down',0 + sz_tl_save_mem db 'tl_save_mem',0 + sz_tl_load_mem db 'tl_load_mem',0 + sz_tl_get_mem_size db 'tl_get_mem_size',0 + +align 4 +libini_import: + lib_init_ini dd alib_init0 + ini_get_str dd aini_get_str +dd 0,0 + alib_init0 db 'lib_init',0 + aini_get_str db 'ini_get_str',0 + +align 4 +libimg_import: + lib_init dd alib_init1 + img_is_img dd aimg_is_img + img_info dd aimg_info + img_from_file dd aimg_from_file + img_to_file dd aimg_to_file + img_from_rgb dd aimg_from_rgb + img_to_rgb dd aimg_to_rgb + img_to_rgb2 dd aimg_to_rgb2 + img_decode dd aimg_decode + img_encode dd aimg_encode + img_create dd aimg_create + img_destroy dd aimg_destroy + img_destroy_layer dd aimg_destroy_layer + img_count dd aimg_count + img_lock_bits dd aimg_lock_bits + img_unlock_bits dd aimg_unlock_bits + img_flip dd aimg_flip + img_flip_layer dd aimg_flip_layer + img_rotate dd aimg_rotate + img_rotate_layer dd aimg_rotate_layer + img_draw dd aimg_draw + + dd 0,0 + + alib_init1 db 'lib_init',0 + aimg_is_img db 'img_is_img',0 ;юяЁхфхы хЄ яю фрээ√ь, ьюцхЄ ыш сшсышюЄхър ёфхырЄ№ шч эшї шчюсЁрцхэшх + aimg_info db 'img_info',0 + aimg_from_file db 'img_from_file',0 + aimg_to_file db 'img_to_file',0 + aimg_from_rgb db 'img_from_rgb',0 + aimg_to_rgb db 'img_to_rgb',0 ;яЁхюсЁрчютрэшх шчюсЁрцхэш  т фрээ√х RGB + aimg_to_rgb2 db 'img_to_rgb2',0 + aimg_decode db 'img_decode',0 ;ртЄюьрЄшўхёъш юяЁхфхы хЄ ЇюЁьрЄ уЁрЇшўхёъшї фрээ√ї + aimg_encode db 'img_encode',0 + aimg_create db 'img_create',0 + aimg_destroy db 'img_destroy',0 + aimg_destroy_layer db 'img_destroy_layer',0 + aimg_count db 'img_count',0 + aimg_lock_bits db 'img_lock_bits',0 + aimg_unlock_bits db 'img_unlock_bits',0 + aimg_flip db 'img_flip',0 + aimg_flip_layer db 'img_flip_layer',0 + aimg_rotate db 'img_rotate',0 + aimg_rotate_layer db 'img_rotate_layer',0 + aimg_draw db 'img_draw',0 + +align 4 +strlib_import: + str_copy dd astr_copy + str_cat dd astr_cat + str_catchar dd astr_catchar + str_inschar dd astr_inschar + str_lowcase dd astr_lowcase + str_upcase dd astr_upcase + + str_len dd astr_len + str_cmp dd astr_cmp + str_cmpi dd astr_cmpi + str_poschar dd astr_poschar + + dd 0,0 + astr_copy db 'str_copy',0 + astr_cat db 'str_cat',0 + astr_catchar db 'str_catchar',0 +; str_ins db 'str_ins',0 + astr_inschar db 'str_inschar',0 +; str_sub db 'str_sub',0 + astr_lowcase db 'str_lowcase',0 + astr_upcase db 'str_upcase',0 + + astr_len db 'str_len',0 + astr_cmp db 'str_cmp',0 + astr_cmpi db 'str_cmpi',0 +; str_pos db 'str_pos',0 + astr_poschar db 'str_poschar',0 \ No newline at end of file diff --git a/programs/other/planet_v/pl_metki.lst b/programs/other/planet_v/pl_metki.lst new file mode 100644 index 0000000000..7be69f5da5 Binary files /dev/null and b/programs/other/planet_v/pl_metki.lst differ diff --git a/programs/other/planet_v/planet_v.asm b/programs/other/planet_v/planet_v.asm new file mode 100644 index 0000000000..f609b810a4 --- /dev/null +++ b/programs/other/planet_v/planet_v.asm @@ -0,0 +1,979 @@ +;Огромная благодарность Maxxxx32, Diamond, Heavyiron +;и другим программистам, а также +;Теплову Алексею ( 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 'mem.inc' +include 'dll.inc' + +include '../../develop/libraries/box_lib/load_lib.mac' +include '../../develop/libraries/box_lib/trunk/tree_list.mac' +include '../../develop/libraries/box_lib/trunk/editbox.mac' +include '../../develop/libraries/box_lib/trunk/checkbox.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 + +struct f70 + func_n dd ? + param1 dd ? + param2 dd ? + param3 dd ? + param4 dd ? + rezerv db ? + name 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 +@@: + + stdcall dll.Init,dword[lib_init] + stdcall dll.Init,dword[lib_init_ini] + + 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 + push dword RGB_TILE_SIZE+300 ;300 - запасные байты с учетом заголовка bmp файла + call mem.Alloc + 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 + + push dword TREE_ICON_SYS16_BMP_SIZE + call mem.Alloc + mov [tree_sys_icon],eax + + push dword TREE_ICON_NOD16_BMP_SIZE + call mem.Alloc + mov [tree_nod_icon],eax + + copy_path fn_icon1,sys_path,file_name,0x0 + mov eax,70 ;load icon file + mov [run_file_70.func_n], 0 + mov [run_file_70.param1], 0 + mov [run_file_70.param2], 0 + mov [run_file_70.param3], TREE_ICON_SYS16_BMP_SIZE + m2m [run_file_70.param4], [tree_sys_icon] + mov [run_file_70.rezerv], 0 + mov [run_file_70.name], 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.param3], TREE_ICON_NOD16_BMP_SIZE + m2m [run_file_70.param4], [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 + + mcall 48,3,sc,sizeof.system_colors + ;установка системных цветов + edit_boxes_set_sys_color edit1,editboxes_end,sc + check_boxes_set_sys_color ch1,checkboxes_end,sc + + mov byte[file_name],0 + +red_win: + call draw_win + call but_MetLoad + +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 + +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_win: +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 + push dword wScrMetki + call [scrollbar_ver_draw] + + 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 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 ecx,[sc.work_text] + or ecx,0x80000000 + + mov ebx,175*65536+13 + mov edx,txt_cache + int 0x40 + + 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 + + push dword ch2 + call [check_box_draw] + push dword ch1 + call [check_box_draw] + + 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 + +system_dir0 db '/sys/lib/' +boxlib_name db 'box_lib.obj',0 + +system_dir1 db '/sys/lib/' +libimg_name db 'libimg.obj',0 + +system_dir2 db '/sys/lib/' +strlib_name db 'str.obj',0 + +system_dir3 db '/sys/lib/' +libini_name db 'libini.obj',0 + +;library structures +l_libs_start: + lib0 l_libs boxlib_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 libimg_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 strlib_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 libini_name, sys_path, file_name, system_dir3, err_message_found_lib3, head_f_l, libini_import, err_message_import3, 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,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 + + 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_box 5, 5, 6, 12, 0xffffd0, 0x800000, 0, ch_text1, 12,ch_flag_en +ch2 check_box 5, 20, 6, 12, 0xffffd0, 0x800000, 0, ch_text2, 11,ch_flag_en +checkboxes_end: + +ch_text1 db 'брать сверху' +ch_text2 db 'брать снизу' + +edit1 edit_box 190, 215, 10, 0xd0ffff, 0xff, 0x80ff, 0, 0xa000, 500, ed_buffer.1, 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 + .1: rb 502 + .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 f70 + + +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 +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 09.02.10',0 ;подпись окна + +sc system_colors ;системные цвета +mouse_dd dd 0 ;нужно для Shift-а в editbox + sys_path rb 4096 + file_name: + rb 4096 +i_end: + procinfo process_information + rb 1024 +stacktop: +mem: + diff --git a/programs/other/planet_v/planet_v.ini b/programs/other/planet_v/planet_v.ini new file mode 100644 index 0000000000..a54d1ebd7e --- /dev/null +++ b/programs/other/planet_v/planet_v.ini @@ -0,0 +1,5 @@ +[Map] +Cache=/hd0/1/Planet_v/Cache/Sat +ext0=.jpg +ext1=.png +ext2=.gif diff --git a/programs/other/planet_v/readme.htm b/programs/other/planet_v/readme.htm new file mode 100644 index 0000000000..9ea6004a46 --- /dev/null +++ b/programs/other/planet_v/readme.htm @@ -0,0 +1,98 @@ + + +Planet viewer + + + + +

Planet viewer 08.02.10

+

╧ЁюуЁрььр яЁхфэрчэрўхэр фы  яЁюёьюЄЁр ърЁЄ, чруЁєцрхь√ї ё Ёрчэ√ї + ърЁЄюуЁрЇшўхёъшї ёхЁтшёют.

+ +

╙яЁртыхэшх

+

┬ ЄхъёЄютюх яюых 'Cache:' ттхфшЄх яєЄ№ ъ яряъх ё шэЄхЁхёє■∙шьш ┬рё ърЁЄрьш. (╧рЁрьхЄЁ Cache шч *.ini Їрщыр чрфрхЄ яєЄ№ яю єьюыўрэш■)

+

┬ ёяшёъх '┬шф ърЁЄ√' т√схЁшЄх Ёрё°шЁхэш  яЁюёьрЄЁштрхь√ї Їрщыют. (╧рЁрьхЄЁ ext0 шч *.ini Їрщыр чрфрхЄ Ёрё°шЁхэшх яю єьюыўрэш■)

+

╩эюяър '╬сэютшЄ№' яхЁхЁшёют√трхЄ юъэю.

+

╩эюяър ёю чэръюь 'ьшэєё' єьхэ№°рхЄ ьрё°Єрс. ╥юцх фхщёЄтшх эр ъыртшрЄєЁх т√ч√трхЄё  ъэюяъющ '-'.

+

╩эюяър ёю чэръюь 'яы■ё' єтхышўштрхЄ ьрё°Єрс. ╥юцх фхщёЄтшх эр ъыртшрЄєЁх т√ч√трхЄё  ъэюяъющ '+'.

+

╩єЁёюЁрьш ьюцэю фтшурЄё  яю ърЁЄх (эр тёхї ьрё°Єрсрї ъЁюьх 1-ую уфх тёхую 1 + ърЁЄшэър).

+ +

╩эюяъющ '─юсртшЄ№ ьхЄъє' фюсрты хЄё  ьхЄър, эр ъюЄюЁє■ ьюцэю тхЁэєЄё  яЁш + эхюсїюфшьюёЄш.

+

╧Ёш эрцрЄшш 'Del' (ъюуфр юъэю ё ьхЄърьш т Їюъєёх) т√сЁрэр  ьхЄър єфры хЄё .

+

╧Ёш эрцрЄшш 'Enter' (ъюуфр юъэю ё ьхЄърьш т Їюъєёх) яЁюуЁрььр юЄъЁ√трхЄ ърЁЄє + эр т√сЁрээющ ьхЄъх. ╥ръ цх фы  яхЁхїюфр ьюцэю эрцрЄ№ эр ъэюяъх ёю чт╕чфюўъющ '*'.

+

╩эюяър '╤юїЁрэшЄ№ ьхЄъш' ёюїЁрэ хЄ тёх ьхЄъш (ё шї ёЄЁєъЄєЁющ) т Їрщы + 'pl_metki.lst'.

+

┬ ърцфющ ьхЄъх ёюїЁрэ хЄё  ъююЁфшэрЄр ърЁЄшэъш яю юёш x ш y, р Єръцх ьрё°Єрс + z. ╠хЄъш эх яЁшт чрэ√ ъ ухюуЁрЇшўхёъшь ъююЁфшэрЄрь, яюЄюьє эр Ёрчэ√ї ърЁЄрї + ьюцхЄ шЄш ёьх∙хэшх яЁюёьрЄЁштрхьющ юсырёЄш.

+ +

├фх тч Є№ ърЁЄ√?

+

╩рЁЄ√   чруЁєцры ўхЁхч яЁюуЁрььє SAS.Planet ( х╕ ёрщЄ http://sasgis.ru/sasplaneta/ ). + ┬ ¤Єющ яЁюуЁрььх хёЄ№ яряър 'Cache' т ъюЄюЁє■ юэр ёюїЁрэ хЄ Їрщы√, чруЁєцрхь√х шч + шэЄхЁэхЄр. ┬ ЄхъёЄютюх яюых 'Cache:' эєцэю ттюфшЄ№ яєЄ№ ъ ¤Єющ яряъх ш ъ юфэющ + шч х╕ яюфяряюъ.

+ +

╚ёЄюЁш  тхЁёшщ:

+

08.02.10 - ╧ю тшышё№ эют√х ярЁрьхЄЁ√ фы  *.ini Їрщыр юЄ ext0 фю ext9, ъюЄюЁ√х чрфр■Є тючьюцэ√х Ёрё°шЁхэш  фы  ърЁЄ.

+

29.01.10 - ╧Ёш чряєёъх яЁюуЁрьь√ т ЄхъёЄютюх яюых 'Cache:' ттюфшЄё  яєЄ№ яЁюяшёрээ√щ т Їрщых 'planet_v.ini'. + ╙ёЄЁрэхэ эхсюы№°ющ уы■ъ яЁш ЁрёЄ уштрэшш Єрщыют (эх ЁрёЄ уштрырё№ 1-  ёЄЁюър яшъёхыхщ ттхЁїє ърЁЄшэъш, с√ыю чрьхЄэю эр ъЁєяэ√ї єтхышўхэш ї), эхьэюую єёъюЁхэю ЁрёЄ уштрэшх. + ╚чьхэхэ Їрщы шъюэюъ tl_sys_16.bmp эр tl_sys_16.png фы  ¤ъюэюьшш ьхёЄр. ╧хЁхэюё шьхэ эх эрщфхэ√ї Їрщыют, хёыш юэш эх тырч Є т ёЄЁюъє. ╙ёЄЁрэхэ уы■ъ ъюуфр чр эрцэшь ъЁрхь ърЁЄ√ Ёшёютрышё№ тхЁїэшх ърЁЄшэъш.

+

25.01.10 - 1) ╬яЄшьшчшЁютрэю юсЁр∙хэшх ъ фшёъє яЁш яхЁхьх∙хэшш яю ърЁЄх + ъєЁёюЁрьш. ╟руЁєцрхЄё  шыш ёЄЁюър шыш ёЄюысхЎ Єрщыют, ъюЄюЁ√х ёЄрыш тшфэ√ яЁш + яЁюъЁєЄъх, Ёрэ№°х уЁєчшырё№ тё  юсырёЄ№. + 2) ╨рёЄ уштрэшх тхЁїэшї Єрщыют ёфхырэю т Ўшъых. ▌Єю чэрўшЄ ўЄю ЄхяхЁ№ тхЁїэшх + ърЁЄшэъш ьюуєЄ с√Є№ ЁрёЄ эєЄ√ т 32 Ёрчр (2 т 5-щ ёЄхяхэш). + 3) ╨рёўхЄ т√ёюЄ√ Єрщыют, ЄхяхЁ№ сюыхх Єюўэ√щ (яю т√ёюЄх юъэр). ╬ъэю сюы№°х + чряюыэ хЄё  ърЁЄющ ўхь Ёрэ№°х. + 4) ┬ ЄхъёЄютюх яюых 'Cache:' ьюцэю эх ттюфшЄ№ ёых° тъюэЎх. (яюфёърчры Albom)

+

23.01.10 - ╚ёяЁртыхэю эхёъюы№ъю ьхыъшї уы■ъют. ╠юцэю яЁюёьрЄЁштрЄ№ сюы№°ющ ъєёюъ ърЁЄ√, + Є. ъ. ёфхырэ√ ЇєэъЎшш фы  ЁрсюЄ√ ё ьрёёштюь Єрщыют.

+

21.01.10 - ╨рсюЄрхЄ юяЎш  'сЁрЄ№ ётхЁїє' (тхЁїэ   ърЁЄшэър ЁрёЄ уштрхЄё  т 2 Ёрчр). + ╓тхЄр ъэюяюъ чрьхэхэ√ эр ёшёЄхьэ√х. ┬ юъэю яЁюуЁрьь√ фюсртыхэр ЎшЇЁр Єхъє∙хую ьрё°Єрср.

+

16.01.10 - ╙ёЄЁрэхэ уы■ъ яЁш ЇюЁьшЁютрэшш шьхэ Їрщыют эр ъЁєяэ√ї ьрё°Єрсрї. + ─юсртыхэр ЁрсюЄр ё ьхЄърьш. ╧юыэюёЄ№■ ЁрсюЄрхЄ юяЎш  'сЁрЄ№ ёэшчє'.

+

14.01.10 - ┬√їюф яЁюуЁрьь√

+ +

└тЄюЁ√:

+ + + \ No newline at end of file diff --git a/programs/other/planet_v/str.obj b/programs/other/planet_v/str.obj new file mode 100644 index 0000000000..da09cbdd38 Binary files /dev/null and b/programs/other/planet_v/str.obj differ diff --git a/programs/other/planet_v/tile_fun.inc b/programs/other/planet_v/tile_fun.inc new file mode 100644 index 0000000000..be7e92d3eb --- /dev/null +++ b/programs/other/planet_v/tile_fun.inc @@ -0,0 +1,921 @@ +TILE_LEN equ 256 +TILE_LEN_W equ TILE_LEN +TILE_LEN_H equ TILE_LEN +RGB_TILE_SIZE_1N4 equ (TILE_LEN*TILE_LEN*3/4) ;1/4 часть памяти картинки +RGB_TILE_SIZE_1N2 equ (TILE_LEN*TILE_LEN*3/2) ;1/2 часть памяти картинки +RGB_TILE_SIZE equ TILE_LEN*TILE_LEN*3 ;размер 1-й картинки +TREE_ICON_SYS16_BMP_SIZE equ 256*3*11+54 ;размер bmp файла с системными иконками +TREE_ICON_NOD16_BMP_SIZE equ 256*3* 1+54 +TILE_TEXT_MAX_LEN equ 40 ;максимальная длинна текста для вывода имени файла + +FRACT_TILE_00 equ 1 ;дробный файл, 1/4 - верхний левый угол +FRACT_TILE_01 equ 2 ;дробный файл, 1/4 - нижний левый угол +FRACT_TILE_10 equ 4 ;дробный файл, 1/4 - верхний правый угол +FRACT_TILE_11 equ 8 ;дробный файл, 1/4 - нижний правый угол +FRACT_TILE_ALL equ 15 ;15=1+2+4+8 +FRACT_TILE_BIT00 equ 0 +FRACT_TILE_BIT01 equ 1 +FRACT_TILE_BIT10 equ 2 +FRACT_TILE_BIT11 equ 3 + +;флаги, нужные при растягивании: +SCALE_0BIT_USE equ 8 +SCALE_1BIT_USE equ 9 +SCALE_0_USE equ 0x100 ;флаг открытия картинки текущего уровня +SCALE_1_USE equ 0x200 ;флаг открытия картинки высшего уровня (будет растягиватся в проприсовке) + +met_fr_opn db 0 ;флаг открытия файла с метками + +size_tile_struc equ 32 ;размер структуры тайла +max_tiles_cols equ 4 ;максимальное число тайлов по ширине окна +max_tiles_rows equ 3 ;максимальное число тайлов по высоте окна +max_tiles_count equ (max_tiles_cols*max_tiles_rows) ;максимальное число тайлов в программе + +tile_coord_x equ dword[edi] ;координата x (как параметр для загрузки) +tile_coord_y equ dword[edi+ 4] ;координата y (как параметр для загрузки) +tile_zoom equ byte[edi+ 8] ;масштаб загружаемого тайла +tile_err_f equ byte[edi+ 9] ;код ошибки при открытии изображения +tile_drobn equ word[edi+10] ;поле для сохранения результатов открытия дробных картинок +tile_offs_l_load equ 12 ;offset params last load tile +tile_key_coord_x equ dword[edi+12] ;координата x (как ключ последней загрузки) +tile_key_coord_y equ dword[edi+16] ;координата y (как ключ последней загрузки) +tile_key_path_len equ byte[edi+21] ;длинна текста в поле Cache +tile_rgb_icon equ dword[edi+22] ;указатель на буфер для хранения основной или растянутой картинки +tile_drobn_icon equ dword[edi+26] ;указатель на буфер для хранения 4-х дробных картинок +tile_delta_x equ byte[edi+30] ;сдвиг тайла относительно курсора по оси x +tile_delta_y equ byte[edi+31] ;сдвиг тайла относительно курсора по оси y + + +;??? +align 4 +CursorMoveRight: ;передвигаем координату курсора вправо + push ebx ecx + xor ebx,ebx + xor ecx,ecx + mov cl,byte[map.zoom] + dec ecx + cmp cx,0 + jle .no_move ;при 0-м масштабе не двигаемся + @@: + rol ebx,1 + or ebx,1 ;накапливаем максимальную координату, при даном масштабе + loop @b + cmp dword[map.coord_x],ebx + jge .no_move ;если координата крайняя, не двигаемся + inc dword[map.coord_x] + ;сдвигаем сетку тайлов влево, что-бы часть тайлов совпали и пришлось меньше загружать новых + stdcall tiles_grid_move_left, tile_00,max_tiles_count,max_tiles_cols + call but_Refresh + .no_move: + pop ecx ebx + ret + +;??? +align 4 +CursorMoveDown: ;передвигаем координату курсора вниз + push ebx ecx + xor ebx,ebx + xor ecx,ecx + mov cl,byte[map.zoom] + dec ecx + cmp cx,0 + jle .no_move ;при 0-м масштабе не двигаемся + @@: + rol ebx,1 + or ebx,1 ;накапливаем максимальную координату, при даном масштабе + loop @b + cmp dword[map.coord_y],ebx + jge .no_move ;если координата крайняя, не двигаемся + inc dword[map.coord_y] + ;сдвигаем сетку тайлов вверх + stdcall tiles_grid_move_up, tile_00,max_tiles_count,max_tiles_rows + call but_Refresh + .no_move: + pop ecx ebx + ret + +;??? +align 4 +but_met_up: ;перемещение метки вверх, по списку + stdcall dword[tl_node_move_up], tree2 + ret + +;??? +align 4 +but_met_dn: ;перемещение метки вниз, по списку + stdcall dword[tl_node_move_down], tree2 + ret + +;??? +align 4 +fun_new_map_type: ;меняем расширение для карты + push eax + stdcall dword[tl_node_get_data], tree1 + pop eax + cmp eax,0 + je @f + mov dword[txt_tile_type],eax + @@: + pop eax + ret + +;задаем расположение тайлов по сетке +align 4 +proc tiles_init_grid, beg_tiles:dword, count:dword, cols:dword + push eax ebx ecx edx edi + xor eax,eax + xor ebx,ebx + mov edi,[beg_tiles] + mov ecx,[count] + mov edx,[cols] + @@: + mov tile_delta_x,al + mov tile_delta_y,bl + add edi,size_tile_struc + inc ax + cmp eax,edx + jl .old_lin + xor eax,eax + inc bx + .old_lin: + loop @b + pop edi edx ecx ebx eax + ret +endp + +;сдвигаем сетку влево, вылезшие столбцы будут перекинуты на правую сторону +;функция нужна для оптимизации обращения к диску, при движении курсора мы двигаем +;тайлы в противоположную сторону, в результате координаты большинства тайлов не меняются +;а значит программа не будет перечитывать их заново, чем и достигается оптимизация +align 4 +proc tiles_grid_move_left, beg_tiles:dword, count:dword, cols:dword + push eax ebx ecx edx edi + xor eax,eax + xor ebx,ebx + mov edi,[beg_tiles] + mov ecx,[count] + mov edx,[cols] + @@: + cmp tile_delta_x,0 + jne .no_jump + add tile_delta_x,dl ;если столбец = 0, то добавляем 'cols' что-бы не вылазил влево + .no_jump: + dec tile_delta_x + add edi,size_tile_struc + loop @b + pop edi edx ecx ebx eax + ret +endp + +;сдвигаем сетку вправо, вылезшие столбцы будут перекинуты на левую сторону +;делает тоже что и tiles_grid_move_left только двигает координаты в другую сторону +align 4 +proc tiles_grid_move_right, beg_tiles:dword, count:dword, cols:dword + push eax ebx ecx edx edi + xor eax,eax + xor ebx,ebx + mov edi,[beg_tiles] + mov ecx,[count] + mov edx,[cols] + @@: + inc tile_delta_x + cmp tile_delta_x,dl + jl .no_jump + mov tile_delta_x,0 ;если столбец = 'cols', то ставим ему 0 что-бы не вылазил вправо + .no_jump: + add edi,size_tile_struc + loop @b + pop edi edx ecx ebx eax + ret +endp + +align 4 +proc tiles_grid_move_up, beg_tiles:dword, count:dword, rows:dword + push eax ebx ecx edx edi + xor eax,eax + xor ebx,ebx + mov edi,[beg_tiles] + mov ecx,[count] + mov edx,[rows] + @@: + cmp tile_delta_y,0 + jne .no_jump + add tile_delta_y,dl ;если строка = 0, то добавляем 'rows' что-бы не вылазила вниз + .no_jump: + dec tile_delta_y + add edi,size_tile_struc + loop @b + pop edi edx ecx ebx eax + ret +endp + +align 4 +proc tiles_grid_move_down, beg_tiles:dword, count:dword, rows:dword + push eax ebx ecx edx edi + xor eax,eax + xor ebx,ebx + mov edi,[beg_tiles] + mov ecx,[count] + mov edx,[rows] + @@: + inc tile_delta_y + cmp tile_delta_y,dl + jl .no_jump + mov tile_delta_y,0 ;если строка = 'rows', то ставим ей 0 что-бы не вылазила вверх + .no_jump: + add edi,size_tile_struc + loop @b + pop edi edx ecx ebx eax + ret +endp + +align 4 +proc array_tile_function, beg_tiles:dword, count:dword, funct:dword + push ecx edi + mov edi,[beg_tiles] + mov ecx,[count] + @@: + stdcall [funct],edi + add edi,size_tile_struc + loop @b + pop edi ecx + ret +endp + +align 4 +draw_tiles: +pushad + mov eax,47 + mov ebx,0x20000 + xor ecx,ecx + mov cl,byte[map.zoom] + mov edx,128*65536+13 + mov esi,[sc.work_text] + or esi,0x40000000 + mov edi,[sc.work] + int 0x40 + + stdcall array_tile_function, tile_00,max_tiles_count,draw_tile +popad + ret + +; edi - pointer tile struct +;output: +; eax - 7 +; edx - coordinates to tile draw + +align 4 +proc tile_clear_area, height:dword + pushad + mov eax,13 ;draw rect + + mov cx,dx + shl ecx,16 + mov cx,word[height] + + shr edx,16 + mov bx,dx + shl ebx,16 + mov bx,TILE_LEN_W + + mov edx,0xffffd0 + int 0x40 + popad + ret +endp + +;??? +align 4 +proc draw_tile, tile:dword + pushad + mov edi,[tile] + +;*** set base point *** + mov edx,5*65536+35 + xor eax,eax + mov al,tile_delta_y + shl ax,8 ;*256 + add edx,eax + xor eax,eax + mov al,tile_delta_x + shl eax,8+16 + add edx,eax +;*** set base point *** + + mov ebx,dword[procinfo.box.width] ;проверяем влазит ли картинка по оси x + sub ebx,min_window_w-5 ;5 - отступ слева для 1-й картинки + shl ebx,16 + mov bx,dx ;нижняя координата пока не учитывается, потому делаем их равными + cmp edx,ebx + jg .end_f + + ;проверяем влазит ли картинка по оси y + mcall 48,4 ;eax = высота скина + mov ecx,dword[procinfo.box.height] + mov ebx,edx + and ebx,0xffff ;ebx = координата 'y' для вывода тайла + add eax,ebx + add eax,5+5 ;5-рамка + + cmp ecx,eax + jle .end_f + + sub ecx,eax + cmp ecx,TILE_LEN_H + jle @f + mov ecx,TILE_LEN_H + @@: + + mov eax,7 + bt tile_drobn,SCALE_0BIT_USE + jc .draw + bt tile_drobn,SCALE_1BIT_USE + jc .draw + jmp @f + .draw: + mov ebx,tile_rgb_icon + or ecx,TILE_LEN_W*65536 ;задание ширины для целой картинки + int 0x40 ;вывод на экран целой или увеличиной картинки + jmp .end_clear_tile + @@: + cmp tile_drobn,FRACT_TILE_ALL + je .end_clear_tile + stdcall tile_clear_area, ecx ;чистка области тайла + .end_clear_tile: + + cmp tile_drobn,0 + je .info ;если нет ни одной дробной картинки + +mov si,cx ;si - высота нижней дробной картинки +sub si,TILE_LEN_H/2 ;si - высота нижней дробной картинки +cmp cx,TILE_LEN_H/2 +jl @f + mov cx,TILE_LEN_H/2 ;задание высоты для верхней дробной картинки +@@: + + and ecx,0xffff ;стирание старой ширины + or ecx,(TILE_LEN_W/2)*65536 ;задание ширины для дробной картинки + mov ebx,tile_drobn_icon + bt tile_drobn,FRACT_TILE_BIT00 + jae @f + int 0x40 + @@: + add dx,TILE_LEN_H/2 + add ebx,RGB_TILE_SIZE_1N4 + bt tile_drobn,FRACT_TILE_BIT01 + jae @f + xchg cx,si + int 0x40 + xchg cx,si + @@: + + sub dx,TILE_LEN_H/2 + ror edx,16 + add dx,TILE_LEN_W/2 + ror edx,16 + add ebx,RGB_TILE_SIZE_1N4 + bt tile_drobn,FRACT_TILE_BIT10 + jae @f + int 0x40 + @@: + + add dx,TILE_LEN_H/2 + add ebx,RGB_TILE_SIZE_1N4 + bt tile_drobn,FRACT_TILE_BIT11 + jae @f + xchg cx,si + int 0x40 + @@: + + jmp .end_f + .info: ;вывод информации, при не удачном открытии картинок + + bt tile_drobn,SCALE_0BIT_USE + jc .end_f + bt tile_drobn,SCALE_1BIT_USE + jc .end_f + + mov ebx,edx + add ebx,0x30003 + mov edx,tile_rgb_icon ;при неудачном открытии в tile_rgb_icon путь к файлу + stdcall [str_len],tile_rgb_icon,RGB_TILE_SIZE_1N4 + mov edi,eax + + mov eax,4 ;draw text + mov ecx,0xff +;or ecx,0x80000000 + mov esi,TILE_TEXT_MAX_LEN + + @@: + cmp edi,TILE_TEXT_MAX_LEN + jg .no_line_last + mov esi,edi + int 0x40 + jmp .end_f + .no_line_last: + int 0x40 + add edx,esi + sub edi,esi + add ebx,10 ;опускаемся на нижнюю строку + jmp @b + .end_f: + popad + ret +endp + +;увеличение масштаба +align 4 +but_ZoomP: + cmp byte[map.zoom],24 + jge @f + inc byte[map.zoom] + shl dword[map.coord_x],1 + shl dword[map.coord_y],1 + call but_Refresh + @@: + ret + +;уменьшение масштаба +align 4 +but_ZoomM: + cmp byte[map.zoom],1 + jle @f + dec byte[map.zoom] + shr dword[map.coord_x],1 + shr dword[map.coord_y],1 + call but_Refresh + @@: + ret + +;??? +align 4 +but_MetSave: ;сохранение файла с метками + stdcall dword[tl_save_mem], TREE_ICON_SYS16_BMP_SIZE,[bmp_icon],0,tree2 + + push eax ebx ecx edi + copy_path fn_metki,sys_path,file_name,0x0 + + stdcall dword[tl_get_mem_size], [bmp_icon],tree2 + pop ecx + inc ecx ;для записи в файл завершающего нуля + + mov eax,70 + m2m [run_file_70.param4], [bmp_icon] + mov [run_file_70.func_n], 2 + mov [run_file_70.param1], 0 + mov [run_file_70.param2], 0 + mov [run_file_70.param3], ecx + mov [run_file_70.rezerv], 0 + mov [run_file_70.name], file_name + mov ebx,run_file_70 + int 0x40 + pop edi ecx ebx eax + jmp still + +;??? +align 4 +but_MetLoad: ;считываем файл с метками + cmp byte[met_fr_opn],0 + jne .end_f + pushad + mov byte[met_fr_opn],1 + copy_path fn_metki,sys_path,file_name,0x0 + mov eax,70 ;load icon file + mov [run_file_70.func_n], 0 + mov [run_file_70.param1], 0 + mov [run_file_70.param2], 0 + mov [run_file_70.param3], TREE_ICON_SYS16_BMP_SIZE + mov [run_file_70.rezerv], 0 + mov [run_file_70.name], file_name + m2m [run_file_70.param4], [bmp_icon] + mov eax,70 + mov ebx,run_file_70 + int 0x40 + cmp ebx,0xffffffff + je @f + stdcall [tl_load_mem], TREE_ICON_SYS16_BMP_SIZE,dword[bmp_icon],0,tree2 + stdcall [tl_cur_beg], tree2 ;? + stdcall [tl_draw], tree2 ;? + pop eax + @@: + mov byte[file_name],0 ;clear file name + popad + .end_f: + ret + +;??? +align 4 +but_MetAdd: ;добавление метки + push eax + mov eax,dword[bmp_icon] + m2m dword[eax], dword[map.coord_x] + m2m dword[eax+4],dword[map.coord_y] + m2m word[eax+8], word[map.zoom] + add eax,12 + stdcall dword[str_copy], eax,30,dword[edit2.text],30 + stdcall dword[tl_node_add], dword[bmp_icon], 0, tree2 + stdcall dword[tl_draw], tree2 + pop eax + jmp still + +;??? +align 4 +fun_goto_met: ;переход к выбранной метке + push eax + stdcall dword[tl_node_get_data], tree2 + pop eax + cmp eax,0 + je @f ;курсор не стоит на метке + m2m dword[map.coord_x],dword[eax] + m2m dword[map.coord_y],dword[eax+4] + m2m word[map.zoom],word[eax+8] + call but_Refresh + @@: + pop eax + ret + +;??? +align 4 +but_Refresh: + call fun_new_map_type ;проверяем не поменялся ли тип просматриваемых файлов + + stdcall array_tile_function, tile_00,max_tiles_count,load_tile + stdcall draw_tiles + ret + +align 4 +proc tile_init, tile:dword + push eax edi + mov edi,[tile] + + push dword RGB_TILE_SIZE+300 + call mem.Alloc + mov tile_rgb_icon,eax + + push dword RGB_TILE_SIZE + call mem.Alloc + mov tile_drobn_icon,eax + pop edi eax + ret +endp + +align 4 +proc tile_destroy, tile:dword + push edi + mov edi,[tile] + push tile_rgb_icon + call mem.Free + push tile_drobn_icon + call mem.Free + pop edi + ret +endp + + +;??? +align 4 ;загружает тайлы, в определенной области +proc load_tile, tile:dword + push eax ebx ecx edi + mov edi,dword[tile] ;копируем указатель на структуру тайла, что-бы работали константы + + stdcall mem_copy, map,edi, 9 ;копируем координаты курсора в структуру тайла + xor eax,eax + mov al,tile_delta_x + add tile_coord_x,eax ;сдвигаем координаты тайла, относительно курсора + mov al,tile_delta_y + add tile_coord_y,eax + stdcall get_tile_path,edi ;берем путь к тайлу + +;*** + ; проверка координат последней загруженной картинки + mov eax,edi + mov ecx,9 + @@: + mov bl,byte[eax+tile_offs_l_load] + cmp byte[eax],bl + jne .st_load + inc eax + loop @b + mov ebx,dword[edit1.size];проверяем также тип карт, который был ранее загружен + cmp tile_key_path_len,bl ;при изменении типа карты нужно также перечитывать файлы + jne .st_load + + jmp @f ;если координаты совпали то уже не загружаем + .st_load: ;start load tile + + ; установка новых координат для последней загруженной картинки + mov eax,edi + add eax,tile_offs_l_load + stdcall mem_copy, edi,eax,9 + mov ebx,dword[edit1.size] + mov tile_key_path_len,bl +;*** + + ;mov tile_drobn,0 + mov tile_drobn,SCALE_0_USE ;ставим флаг открытия картинки текущего уровня + stdcall load_new_tile,edi + cmp tile_err_f,5 + jne @f + mov tile_drobn,0 + mov eax,ch2 ;проверяем опцию 'брать снизу' + bt dword[eax+32],1 ;ch_flags equ [edi+32] ;флаги + jae .opt_drobn_false + + ;если файл не найден, попадаем сюда + inc tile_zoom + shl tile_coord_y,1 + shl tile_coord_x,1 + stdcall get_tile_path,edi + stdcall load_new_tile,edi + + cmp tile_err_f,5 + je .no_tile_00 + or tile_drobn,FRACT_TILE_00 +; 1 сжатие картинки по высоте + stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN +; 2 сжатие картинки по ширине + stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2 +; 3 копирование 1-й картинки в резервный буфер + stdcall mem_copy, tile_rgb_icon, tile_drobn_icon, RGB_TILE_SIZE_1N4 + .no_tile_00: + + ;если файл не найден, попадаем сюда + inc tile_coord_y + stdcall get_tile_path,edi + stdcall load_new_tile,edi + + cmp tile_err_f,5 + je .no_tile_01 +; mov byte[map.drobn],0 + or tile_drobn,FRACT_TILE_01 +; 1 сжатие картинки по высоте + stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN +; 2 сжатие картинки по ширине + stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2 +; 3 копирование 2-й картинки в резервный буфер + mov eax,tile_drobn_icon + add eax,RGB_TILE_SIZE_1N4 ; сдвиг картинки вниз (т. к. она нижняя) + stdcall mem_copy, tile_rgb_icon, eax, RGB_TILE_SIZE_1N4 + .no_tile_01: + + ;если файл не найден, попадаем сюда + dec tile_coord_y + inc tile_coord_x + stdcall get_tile_path,edi + stdcall load_new_tile,edi + + cmp tile_err_f,5 + je .no_tile_10 +; mov byte[map.drobn],0 + or tile_drobn,FRACT_TILE_10 +; 1 сжатие картинки по высоте + stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN +; 2 сжатие картинки по ширине + stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2 +; 3 копирование 3-й картинки в резервный буфер + mov eax,tile_drobn_icon + add eax,RGB_TILE_SIZE_1N2 ; сдвиг картинки вниз (т. к. она нижняя) + stdcall mem_copy, tile_rgb_icon, eax, RGB_TILE_SIZE_1N4 + .no_tile_10: + + ;если файл не найден, попадаем сюда + inc tile_coord_y + stdcall get_tile_path,edi + stdcall load_new_tile,edi + + cmp tile_err_f,5 + je .no_tile_11 +; mov byte[map.drobn],0 + or tile_drobn,FRACT_TILE_11 +; 1 сжатие картинки по высоте + stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN +; 2 сжатие картинки по ширине + stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2 +; 3 сдвиг картинки вниз без копирования (т. к. она нижняя) + stdcall img_rgb_hoffs, tile_rgb_icon, TILE_LEN*TILE_LEN/4, TILE_LEN/2, TILE_LEN*3/2 + + ;копируем последнюю дробную картинку в буфер drobn_icon + ;в котором уже были сформированы 3 другие + mov eax,tile_drobn_icon + add eax,RGB_TILE_SIZE_1N4*3 + stdcall mem_copy, tile_rgb_icon, eax, RGB_TILE_SIZE_1N4 + .no_tile_11: + .opt_drobn_false: + + + mov eax,ch1 ;проверяем опцию 'брать сверху' + bt dword[eax+32],1 ;ch_flags equ [edi+32] ;флаги + jae @f + cmp tile_drobn,FRACT_TILE_ALL ;если собрана вся картинка, то сверху уже не берем + je @f + ;не знаем была-ли включена опция 'брать снизу', для которой изменялись координаты + ;потому опять копируем координаты курсора в структуру тайла + stdcall mem_copy, map,edi, 9 + xor eax,eax + mov al,tile_delta_x + add tile_coord_x,eax ;сдвигаем координаты тайла, относительно курсора + mov al,tile_delta_y + add tile_coord_y,eax + + xor ecx,ecx + .zoom: + cmp tile_zoom,0 + je @f ;просматривается самая верхняя картинка, выходим + call get_parent_tiles ;циклический просмотр родительских тайлов + bt tile_drobn,SCALE_1BIT_USE + jc @f + cmp ecx,5 ;5 - ограничение на степень растягивания картинки + je @f + jmp .zoom + @@: + + pop edi ecx ebx eax + ret +endp + +;output: +;ecx - if not file = count parent levels else = 0 +align 4 +proc get_parent_tiles + dec tile_zoom + shr tile_coord_y,1 + shr tile_coord_x,1 + inc ecx + + stdcall get_tile_path,edi ;берем путь к тайлу + stdcall load_new_tile,edi + cmp tile_err_f,5 + je @f + or tile_drobn,SCALE_1_USE + mov ebx,ecx + .zoom_cycle: + xor eax,eax + dec ebx + bt tile_key_coord_y,ebx + jae .scale_bot_l + add eax,RGB_TILE_SIZE_1N2 + .scale_bot_l: + bt tile_key_coord_x,ebx + jae .scale_rig_l + add eax,TILE_LEN_W*3/2 + .scale_rig_l: + cmp eax,0 + je .scale_top_left + add eax,tile_rgb_icon + stdcall mem_copy, eax, tile_rgb_icon, RGB_TILE_SIZE_1N2 + .scale_top_left: + + ;растягивание верхней картинки + stdcall img_rgb_wcrop, tile_rgb_icon,TILE_LEN_W,TILE_LEN_W/2,TILE_LEN_H ;отрезаем лишнее + stdcall img_rgb_wmul2, tile_rgb_icon,RGB_TILE_SIZE_1N4/3 ;растигиваем по ширине + stdcall img_rgb_hmul2, tile_rgb_icon,RGB_TILE_SIZE_1N2/3,TILE_LEN_W ;растягиваем по высоте + loop .zoom_cycle + @@: + ret +endp + +;tile - указатель на структуру тайла +align 4 ;загружает определенный тайл +proc load_new_tile, tile:dword + pushad + + mov eax,70 ;load icon file + mov [run_file_70.func_n], 0 + mov [run_file_70.param1], 0 + mov [run_file_70.param2], 0 + mov [run_file_70.param3], RGB_TILE_SIZE+300 ;+54 + m2m [run_file_70.param4], [bmp_icon] + mov [run_file_70.rezerv], 0 + mov [run_file_70.name], file_name + mov ebx,run_file_70 + int 0x40 + mov edi,[tile] + mov tile_err_f,al + cmp ebx,0xffffffff + je .no_load + + stdcall dword[img_decode], dword[bmp_icon],ebx,0 + mov dword[data_icon],eax + stdcall dword[img_to_rgb2], dword[data_icon],tile_rgb_icon + stdcall dword[img_destroy], dword[data_icon] + jmp @f + .no_load: + +; mov edi,[tile] + mov al,byte[map.zoom] + cmp tile_zoom,al + jne @f + stdcall mem_copy, file_name,tile_rgb_icon,150 + @@: + popad + ret +endp + +;функция генерирует часть пути к файлу в виде: \z?\?\x?\?\y? +align 4 +proc get_tile_path, tile:dword + push eax ecx edi esi + mov ecx,300 + mov edi,txt_tile_path + @@: + mov byte[edi],0 ;чистим строку + inc edi + loop @b + + mov esi,dword[tile] ;берем указатель + + mov ecx,0x80000000 ;rol 0x80000000,1 = 1 + xor eax,eax + mov al,byte[esi+8] ;+8 = zoom + .calc_coord: + rol ecx,1 ;ecx = maximum coord + dec ax + cmp ax,0 + jg .calc_coord + + mov byte[txt_tile_path],'z' + mov edi,txt_tile_path + inc edi + xor eax,eax + mov al,byte[esi+8] ;+8 = zoom + call tl_convert_to_str + + inc edi + cmp byte[esi+8],9 ;+8 = zoom + jle @f + inc edi + @@: + mov byte[edi],'/' + inc edi + + mov eax,[esi] ;coord_x +cmp eax,ecx +jge .out_of_rang ;coord_x больше допустимого значения при заданном масштабе + shr eax,10 + call tl_convert_to_str + + @@: + inc edi + cmp byte[edi],'0' + jge @b + mov byte[edi],'/' + inc edi + mov byte[edi],'x' + inc edi + + mov eax,[esi] ;coord_x + call tl_convert_to_str + + @@: + inc edi + cmp byte[edi],'0' + jl @f + cmp byte[edi],'9' + jg @f + jmp @b + @@: + + ;coord y + mov byte[edi],'/' + inc edi + + mov eax,[esi+4] ;coord_y +cmp eax,ecx +jge .out_of_rang ;coord_y больше допустимого значения при заданном масштабе + shr eax,10 + call tl_convert_to_str + + @@: + inc edi + cmp byte[edi],'0' + jge @b + mov byte[edi],'/' + inc edi + mov byte[edi],'y' + inc edi + + mov eax,[esi+4] ;coord_y] + call tl_convert_to_str + +.out_of_rang: + call get_all_path + pop esi edi ecx eax + ret +endp + +align 4 +get_all_path: ;функция для собирания полного пути из всех кусков + mov ecx,dword[edit1.text] + add ecx,dword[edit1.size] + dec ecx + + stdcall [str_copy], file_name,4096-1, dword[edit1.text],dword[edit1.max] + + cmp byte[ecx],'/' + je @f + stdcall [str_catchar],file_name,4096-1, dword '/' + @@: + + stdcall [str_cat], file_name,4096-1, txt_tile_path,300 + stdcall [str_cat], file_name,4096-1, dword [txt_tile_type],10 +ret \ No newline at end of file diff --git a/programs/other/planet_v/tl_nod_16.bmp b/programs/other/planet_v/tl_nod_16.bmp new file mode 100644 index 0000000000..1b2491bd2d Binary files /dev/null and b/programs/other/planet_v/tl_nod_16.bmp differ diff --git a/programs/other/planet_v/tl_sys_16.png b/programs/other/planet_v/tl_sys_16.png new file mode 100644 index 0000000000..be49251882 Binary files /dev/null and b/programs/other/planet_v/tl_sys_16.png differ