diff --git a/contrib/C_Layer/ASM/loadboxlib.asm b/contrib/C_Layer/ASM/loadboxlib.asm index 11d76363f..4c1759705 100644 --- a/contrib/C_Layer/ASM/loadboxlib.asm +++ b/contrib/C_Layer/ASM/loadboxlib.asm @@ -1,3 +1,7 @@ +; SPDX-License-Identifier: NOASSERTION +; + + format coff use32 ; Tell compiler to use 32 bit instructions @@ -7,7 +11,7 @@ include '../../../programs/proc32.inc' include '../../../programs/macros.inc' purge section,mov,add,sub -include '../../../programs/develop/libraries/box_lib/trunk/box_lib.mac' +include '../../../programs/develop/libraries/box_lib/box_lib.mac' include '../../../programs/system/run/trunk/txtbut.inc' include '../../../programs/dll.inc' @@ -159,8 +163,8 @@ public path_show_draw as '_path_show_draw' public fb_draw_panel as '_filebrowse_draw' public fb_mouse as '_filebrowse_mouse' -public fb_key as '_filebrowse_key' - +public fb_key as '_filebrowse_key' + public ted_but_sumb_upper as '_ted_but_sumb_upper' public ted_but_sumb_lover as '_ted_but_sumb_lover' public ted_but_convert_by_table as '_ted_but_convert_by_table' diff --git a/programs/develop/fasm/tags/1.71/fasm.asm b/programs/develop/fasm/tags/1.71/fasm.asm index ba9f1f89c..5bb280f82 100644 --- a/programs/develop/fasm/tags/1.71/fasm.asm +++ b/programs/develop/fasm/tags/1.71/fasm.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; flat assembler source ;; @@ -41,7 +47,7 @@ include '../../../../macros.inc' purge add,sub ; macros.inc does incorrect substitution include 'fasm.inc' -include '../../../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../../../develop/libraries/box_lib/box_lib.mac' include '../../../../KOSfuncs.inc' include '../../../../load_lib.mac' @use_library @@ -61,9 +67,9 @@ START: ; Start of execution cmp [params],0 jz start_1 - + ;---------GerdtR - or ecx,-1 + or ecx,-1 mov esi,params cmp byte[esi],' ' jne @f @@ -118,7 +124,7 @@ NoOutDebugInfo: pop ecx mov edi,path rep stosd - + mov esi,params ; DEBUGF "params: %s\n",esi mov edi,infile @@ -164,17 +170,17 @@ init_checkboxes2 ch1_dbg,ch1_dbg+ch_struc_size red: ; Redraw call draw_window -still: +still: mcall 10 ; Wait here for event cmp al,6 je call_mouse - dec eax + dec eax je red ; Redraw request - dec eax + dec eax jne button ; Button in buffer key: ; Key mcall 2 ; Read it and ignore - + push dword edit1 call [edit_box_key] push dword edit2 @@ -194,7 +200,7 @@ button: ; Button in Window or eax,-1 mcall ;--------------------------------------------------------------------- -noclose: +noclose: cmp ah,5 ;press button for OpenDialog jne @f call fun_opn_dlg @@ -203,7 +209,7 @@ noclose: je start cmp ah,3 ; Start compiled file jnz norunout - + mov edx,outfile call make_fullpaths mcall 70,file_info_start @@ -213,7 +219,7 @@ noclose: norunout: cmp ah,4 jnz norundebug - + mov edx,outfile call make_fullpaths mcall 70,file_info_debug @@ -236,7 +242,7 @@ mouse: draw_window: pusha mcall 12,1 ; Start of draw - + get_sys_colors 1,0 edit_boxes_set_sys_color edit1,editboxes_end,sc ;check_boxes_set_sys_color2 ch1_dbg,ch1_dbg+ch_struc_size,sc @@ -275,7 +281,7 @@ draw_window: mcall 8,ebx,,ID_COMPILE_BTN,[sc.work_button] mcall ,ebx,,ID_EXECUTE_BTN mcall ,ebx,,ID_EXECDBG_BTN - + mcall ,<5,62>,,ID_OPENDLG_BTN mov ecx, [sc.work_text] @@ -297,10 +303,10 @@ draw_window: mcall ,ebx,ecx,s_run add ebx,LINE_H mcall ,ebx,ecx,s_debug - + mpack ebx,MAGIC1+6,1+ 14/2-3+ 14*0 mov esi,[pinfo.client_box.width] - sub esi,MAGIC1*2+6+3 + sub esi,MAGIC1*2+6+3 mov eax,esi mov cl,6 div cl @@ -311,14 +317,14 @@ draw_window: movzx esi,al call draw_messages - + mov eax,dword [pinfo.client_box.width] sub eax,[edit1.left] sub eax,RIGHT_BTN_W+6 mov dword[edit1.width],eax ; єёЄрэртыштрхь °шЁшэє ЄхъёЄют√ї яюыхщ mov dword[edit2.width],eax mov dword[edit3.width],eax - + push dword edit1 call [edit_box_draw] push dword edit2 @@ -327,7 +333,7 @@ draw_window: call [edit_box_draw] push dword ch1_dbg call [check_box_draw] -.end: +.end: mcall 12,2 ; End of Draw popa ret @@ -362,7 +368,7 @@ fun_opn_dlg: ; repne scasb cmp byte[edi-2],'/' jne .no_slash - + dec edi ;если в конце пути есть слеш, то путь укорачиваем на 1 символ .no_slash: mov byte[edi-1],'/' ;ставим в конце пути слеш @@ -390,7 +396,7 @@ fun_opn_dlg: ; sub esi,5 cmp esi,[edit2.text] jle .short_fn - + mov byte[esi],0 sub dword [edit2.size],4 sub dword [edit2.pos],4 @@ -416,20 +422,20 @@ draw_messages: msub [bottom_right],7,11 add [bottom_right],7 shl 16 + 53 mcall 13,,,0xFeFefe ; clear work area - + ; draw top shadow push ecx mov cx,1 mov edx,0xDADEDA mcall - + ; draw left shadow pop ecx push ebx mov bx,1 mcall pop ebx - + _cy = 0 _sy = 2 _cx = 4 @@ -621,12 +627,12 @@ start: ;--------------------------------------------------------------------- mov [input_file],infile mov [output_file],outfile - + call init_memory - + call make_timestamp mov [start_time],eax - + call preprocessor call parser call assembler @@ -635,7 +641,7 @@ start: call symbol_dump @@: call formatter - + call display_user_messages movzx eax,[current_pass] inc eax @@ -666,7 +672,7 @@ display_bytes_count: mov esi,_bytes_suffix call display_string xor al,al - + cmp [_run_outfile],0 je @f mov edx,outfile diff --git a/programs/develop/h2d2b/h2d2b.asm b/programs/develop/h2d2b/h2d2b.asm index 44ba594d6..c42f0f365 100644 --- a/programs/develop/h2d2b/h2d2b.asm +++ b/programs/develop/h2d2b/h2d2b.asm @@ -27,7 +27,7 @@ include '../../proc32.inc' include '../../macros.inc' ; макросы облегчают жизнь ассемблерщиков! include '../../KOSfuncs.inc' include '../../load_lib.mac' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US. @use_library diff --git a/programs/develop/heed/heed.asm b/programs/develop/heed/heed.asm index 1e3962f55..d88212eaa 100644 --- a/programs/develop/heed/heed.asm +++ b/programs/develop/heed/heed.asm @@ -69,7 +69,7 @@ include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US. include '../../KOSfuncs.inc' include '../../config.inc' ; for nightbuild include '../../macros.inc' -include '../libraries/box_lib/trunk/box_lib.mac' +include '../libraries/box_lib/box_lib.mac' include '../../load_lib.mac' @use_library diff --git a/programs/develop/info3ds/info3ds.asm b/programs/develop/info3ds/info3ds.asm index 107b28a17..056ee86f3 100644 --- a/programs/develop/info3ds/info3ds.asm +++ b/programs/develop/info3ds/info3ds.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + use32 org 0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт @@ -11,7 +17,7 @@ include '../../KOSfuncs.inc' include '../../develop/libraries/libs-dev/libimg/libimg.inc' include '../../load_img.inc' include '../../load_lib.mac' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' include '../../develop/libraries/TinyGL/asm_fork/kosgl.inc' include '../../develop/libraries/TinyGL/asm_fork/opengl_const.inc' include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US. diff --git a/programs/develop/info3ds/info3ds_u.asm b/programs/develop/info3ds/info3ds_u.asm index 29fdff4f5..6d4811fec 100644 --- a/programs/develop/info3ds/info3ds_u.asm +++ b/programs/develop/info3ds/info3ds_u.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + use32 org 0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт @@ -11,7 +17,7 @@ include '../../KOSfuncs.inc' include '../../develop/libraries/libs-dev/libimg/libimg.inc' include '../../load_img.inc' include '../../load_lib.mac' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' include '../../develop/libraries/TinyGL/asm_fork/opengl_const.inc' include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US. include 'info_fun_float.inc' diff --git a/programs/develop/kol_f_edit/kol_f_edit.asm b/programs/develop/kol_f_edit/kol_f_edit.asm index 63d912a20..fca95e73b 100644 --- a/programs/develop/kol_f_edit/kol_f_edit.asm +++ b/programs/develop/kol_f_edit/kol_f_edit.asm @@ -1,1625 +1,1631 @@ -use32 - org 0 - db 'MENUET01' - dd 1,start,i_end,mem,stacktop,buf_cmd_lin,sys_path - -include '../../KOSfuncs.inc' -include '../../macros.inc' -include '../../proc32.inc' -include '../../load_lib.mac' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' -include '../../dll.inc' -include '../../system/skincfg/trunk/kglobals.inc' -include '../../system/skincfg/trunk/unpacker.inc' -include 'strlen.inc' -include 'obj_codes.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc, dll.Load - -hed db 'kol_f_edit 29.09.20',0 - -sizeof.TreeList equ 20 ;need for element 'tree_list' - -BUF_STRUCT_SIZE equ 21 -buf2d_data equ dword[edi] ;данные буфера изображения -buf2d_w equ dword[edi+8] ;ширина буфера -buf2d_h equ dword[edi+12] ;высота буфера -buf2d_l equ word[edi+4] ;отступ слева -buf2d_t equ word[edi+6] ;отступ сверху -buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера -buf2d_color equ dword[edi+16] ;цвет фона буфера -buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения - - -MAX_CED_OBJECTS equ 200 -MAX_OPT_FIELDS equ 11 -MAX_OBJ_TYPES equ 17 ;максимальное число объектов -MAX_OBJ_CAPTIONS equ 1000 ;размер дополнительных подписей подписей -WND_CAPT_COLOR equ 0xb0d0ff -BUF_SIZE equ 1000 - -;modif -BIT_MOD_ACI equ 0 ;первоначальные настройки элементов -BIT_MOD_ACM equ 1 ;события от мыши -BIT_MOD_ACD equ 2 ;данные объектов -BIT_MOD_ABU equ 3 ;связывание кнопок -BIT_MOD_WI_CAPT equ 0 ;стиль окна подпись -BIT_MOD_WI_CORD_OTN_CL_OBL equ 1 ;стиль окна координаты относительно клиентской области -BIT_MOD_WI_REDR equ 2 ;стиль окна перерисовка окна -BIT_MOD_WI_GRAD equ 3 ;стиль окна градиент -BIT_MOD_CHE equ 0 ; ch_flag_en - выбран CheckBox -BIT_MOD_CHE_T equ 1 ;сверху -BIT_MOD_CHE_M equ 2 ;по центру -BIT_MOD_CHE_B equ 3 ;снизу -BIT_MOD_TXT_ASCII_0 equ 0 ;текст заканчив. 0 -BIT_MOD_TXT_NO_TRAN equ 1 ;текст прозрачный -BIT_MOD_TXT_CHAR2 equ 2 ;текст 2-м шрифтом -BIT_MOD_EDIT_FOC equ 0 ;EditBox в фокусе -BIT_MOD_EDIT_FIO equ 1 ; -;CPP_MOD_RE_GR equ 1 ;градиентный прямоугольник -BIT_MOD_BUT_NFON equ 0 ;стиль Button не рисовать кнопку -BIT_MOD_BUT_NBORD equ 1 ;стиль Button не рисовать границу -BIT_MOD_IMPORT_FUNCT_COMMENT equ 0 ;коментировать функцию - -macro load_image_file path,buf,size { ;макрос для загрузки изображений - ;path - может быть переменной или строковым параметром - if path eqtype '' ;проверяем задан ли строкой параметр path - jmp @f - local .path_str - .path_str db path ;формируем локальную переменную - db 0 - @@: - ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0 - else - copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой - end if - - stdcall mem.Alloc, dword size ;выделяем память для изображения - mov [buf],eax - - mov [run_file_70.Function], 0 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], dword size - m2m [run_file_70.Buffer], eax - mov byte[run_file_70+20], 0 - mov [run_file_70.FileName], file_name - mcall 70,run_file_70 ;загружаем файл изображения - cmp ebx,0xffffffff - je @f - ;определяем вид изображения и переводим его во временный буфер image_data - stdcall [img_decode], [buf],ebx,0 - mov [image_data],eax - ;преобразуем изображение к формату rgb - stdcall [img_to_rgb2], [image_data],[buf] - ;удаляем временный буфер image_data - stdcall [img_destroy], [image_data] - @@: -} - -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - rezerv db ? - FileName dd ? -ends - -struct object - id dd ? ;идентификатор объекта - txt rb MAX_LEN_OBJ_TXT ;текстовые свойства - lvl db 0 - clo db 0 - typid dd ? ;номер объекта определяющего тип переменной - modif dd ? ;битовые свойства -ends - -struct ObjOpt - dd ? - bl_type db ? - graph db ? - info rb 30 - caption rb MAX_OPT_CAPTION - Col rw MAX_OPT_FIELDS - img rw MAX_OPT_FIELDS ;индексы картинок (в файле 'icon.bmp') - bit_prop dd 0 ;битовые свойства (подписи, названия) - bit_val dd 0 ;битовые свойства (значения, константы) -ends - -SKIN_H equ 22 -SKIN_W1 equ 5 -SKIN_W2 equ 7 -SKIN_W3 equ 23 -fn_skin_1 db 'left.bmp',0 -fn_skin_2 db 'base.bmp',0 -fn_skin_3 db 'oper.bmp',0 -IMAGE_FILE_SKIN1_SIZE equ 3*(SKIN_W1+3)*SKIN_H+54 -IMAGE_FILE_SKIN2_SIZE equ 3*(SKIN_W2+3)*SKIN_H+54 -IMAGE_FILE_SKIN3_SIZE equ 3*(SKIN_W3+3)*SKIN_H+54 - -IMAGE_FILE_FONT1_SIZE equ 96*144*3 ;размер файла с 1-м системным шрифтом - -fn_icon db 'icon.bmp',0 -count_main_icons equ 35 ;число иконок в файле icon.bmp -bmp_icon rb 0x300*count_main_icons - -TREE_ICON_SYS16_BMP_SIZE equ 256*3*11+54 ;размер bmp файла с системными иконками -icon_tl_sys dd 0 ;указатеель на память для хранения системных иконок -icon_font_s1 dd 0 ;указатель на временную память для загрузки шрифта - -fn_syntax db 'asm.syn',0 ;имя загружаемого файла синтаксиса - -;макрос для проверки битового свойства -macro test_bool_prop obj_reg,n_prop -{ - bt dword[obj_reg+u_object.modif-u_object],n_prop -} - -include 'ced_wnd_m.inc' -include 'ced_wnd_prop.inc' ;файл с функциями окна свойств объекта -include 'ced_constr.inc' ;файл с функциями окна конструктора -include 'ced_code_g.inc' ;файл с функциями генерирования кодов - -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 - @@: - - ;задание размеров полей со свойствами - mov eax,prop_edits_top - mov ebx,16+6 ;ширина иконки + отступы - mov edi,edit2 - @@: - mov ed_top,eax ;отступ сверху - mov ed_left,ebx ;отступ слева - add edi,ed_struc_size - add eax,prop_edits_height - cmp edi,prop_wnd_edits_end - jl @b - - stdcall [buf2d_create], buf_fon - - mcall 48,3,sc,sizeof.system_colors - mcall 40,0x27 - - stdcall [tl_data_init], tree1 - stdcall [tl_data_init], tree2 - - copy_path fn_icon,sys_path,file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой - mov [run_file_70.Function], 0 - mov [run_file_70.Position], 54 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], 0x300*count_main_icons - mov [run_file_70.Buffer], bmp_icon - mov [run_file_70.rezerv], 0 - mov [run_file_70.FileName], file_name - mcall 70,run_file_70 - - cmp ebx,-1 - mov [err_ini0],1 - je @f ;if open file - mov [err_ini0],0 - mov dword[tree1.data_img],bmp_icon - mov dword[tree2.data_img],bmp_icon - @@: - - ;системные иконки 16*16 для tree_list - load_image_file 'tl_sys_16.png', icon_tl_sys,TREE_ICON_SYS16_BMP_SIZE - ;если изображение не открылось, то в icon_tl_sys будут - ;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера - mov eax,dword[icon_tl_sys] - mov dword[tree1.data_img_sys],eax - mov dword[tree2.data_img_sys],eax - - ;1-й файл скина - load_image_file fn_skin_1, icon_font_s1,IMAGE_FILE_SKIN1_SIZE - stdcall [buf2d_create_f_img], buf_skin1,[icon_font_s1] ;создаем буфер - stdcall mem.Free,[icon_font_s1] ;освобождаем память - ;2-й файл скина - load_image_file fn_skin_2, icon_font_s1,IMAGE_FILE_SKIN2_SIZE - stdcall [buf2d_create_f_img], buf_skin2,[icon_font_s1] ;создаем буфер - stdcall mem.Free,[icon_font_s1] ;освобождаем память - ;3-й файл скина - load_image_file fn_skin_3, icon_font_s1,IMAGE_FILE_SKIN3_SIZE - stdcall [buf2d_create_f_img], buf_skin3,[icon_font_s1] ;создаем буфер - stdcall mem.Free,[icon_font_s1] ;освобождаем память - - ;символы 1-го системного шрифта - load_image_file 'font6x9.bmp', icon_font_s1,IMAGE_FILE_FONT1_SIZE - stdcall [buf2d_create_f_img], buf_font,[icon_font_s1] ;создаем буфер - stdcall mem.Free,[icon_font_s1] ;освобождаем память - stdcall [buf2d_conv_24_to_8], buf_font,1 ;делаем буфер прозрачности 8 бит - stdcall [buf2d_convert_text_matrix], buf_font - - - copy_path fn_obj_opt,sys_path,fp_obj_opt,0 - ;load options file - mov [run_file_70.Position], 0 - mov [run_file_70.Count], sizeof.ObjOpt*MAX_OBJ_TYPES+MAX_OBJ_CAPTIONS - mov [run_file_70.Buffer], obj_opt - mov [run_file_70.FileName], fp_obj_opt - mcall 70,run_file_70 - - cmp ebx,-1 - mov [err_ini1],1 - je .open_end ;jmp if not open file - mov [err_ini1],0 - - mov eax,obj_opt ;добавляем объекты - @@: - mov ebx,dword[eax] - cmp ebx,0 - je @f - ;xor ecx,ecx ;в ecx будет индекс иконки - mov cx,word[eax+obj_opt.img-obj_opt] - cmp cx,0 - jge .zero - xor cx,cx ;что-бы не глючило с отрицательным индексом - .zero: - shl ecx,16 - stdcall dword[tl_node_add], tree1,ecx,eax ;добавляем название объекта - stdcall dword[tl_cur_next], tree1 ;переносим курсор вниз, что-бы не поменялся порядок - add eax,sizeof.ObjOpt ;переход на следующий объект - jmp @b - @@: - stdcall dword[tl_cur_beg], tree1 ;переносим курсор вверх - - .open_end: - - stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога - stdcall [ted_init], tedit0 - copy_path fn_syntax,sys_path,file_name,0 - - ; *** init syntax file *** - ; проверяем размер файла синтаксиса - mov [run_file_70.Function], 5 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], 0 - mov dword[run_file_70.Buffer], open_b - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], file_name - mcall 70,run_file_70 - cmp eax,0 - jne @f - - mov edi,tedit0 - mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах - mov ted_syntax_file_size,ecx - - stdcall mem.Alloc,ecx ;выделяем память для файла синтаксиса - mov ted_syntax_file,eax - - ;пробуем открыть файл синтаксиса - call open_unpac_synt_file - jmp .end_0 - @@: - notify_window_run txt_not_syntax_file - .end_0: - - ;get cmd line - cmp [buf_cmd_lin],0 - je @f ;if file names exist - mov esi,buf_cmd_lin - call strlen ;eax=strlen - mov edi,[edit1.text] - mov [edit1.size],eax - mov ecx,eax - rep movsb - call but_open_proj - @@: - - - -align 4 -red_win: - call draw_window - -align 4 -still: - mcall 10 - - cmp al,1 - jne @f - call draw_window - @@: - cmp al,2 - jz key - cmp al,3 - jz button - cmp al,6 - jne @f - call mouse - @@: - - jmp still - -align 4 -draw_window: -pushad - mcall 12,1 - - xor eax,eax - mov ebx,20*65536+670 - mov ecx,20*65536+370 - mov edx,[sc.work] - or edx,0x33000000 - mov edi,hed - int 0x40 - - mov eax,8 ;button 'Open Project' - mov esi,0x80ff - mov ebx,230*65536+18 - mov ecx,5*65536+18 - mov edx,5 - int 0x40 - stdcall draw_icon, 22,231,6 ;22 - open - - ;button 'Save Project' - mov ebx,250*65536+18 - mov ecx,5*65536+18 - mov edx,6 - int 0x40 - stdcall draw_icon, 17,251,6 ;17 - save - - ;button 'Show Constructor' - mov ebx,310*65536+18 - mov ecx,5*65536+18 - mov edx,11 - int 0x40 - stdcall draw_icon, 12,311,6 ;12 - window - - ;button 'Show Code' - mov ebx,330*65536+18 - mov edx,12 - int 0x40 - stdcall draw_icon, 11,331,6 ;11 - text - - ;button 'Update: Code, Constructor' - mov ebx,350*65536+18 - mov edx,13 - int 0x40 - stdcall draw_icon, 32,351,6 ;32 - update - - ;button 'Save Code' - mov ebx,370*65536+18 - mov edx,14 - int 0x40 - stdcall draw_icon, 17,371,6 ;17 - save - - ;button ']P' - mov ebx,390*65536+18 - mov edx,15 - int 0x40 - stdcall draw_icon, 18,391,6 ;18 - знак конца абзаца - - ;button 'Show color text' - mov ebx,410*65536+18 - mov edx,16 - int 0x40 - stdcall draw_icon, 19,411,6 - - ;button 'Add Object' - mov ebx,125*65536+18 - mov ecx,30*65536+18 - mov edx,31 - int 0x40 - stdcall draw_icon, 14,126,31 ;14 - add object - - ;button 'Move Up' - mov ebx,155*65536+18 - mov edx,21 - int 0x40 - stdcall draw_icon, 23,156,31 ;23 - move up - - ;button 'Move Down' - mov ebx,175*65536+18 - mov edx,22 - int 0x40 - stdcall draw_icon, 24,176,31 ;24 - move down - - ;button 'Copy' - mov ebx,195*65536+18 - mov edx,23 - int 0x40 - stdcall draw_icon, 30,196,31 ;30 - copy - - ;button 'Paste' - mov ebx,215*65536+18 - mov edx,24 - int 0x40 - stdcall draw_icon, 31,216,31 ;31 - paste - - ;button 'Property' - mov ebx,235*65536+18 - mov edx,25 - int 0x40 - stdcall draw_icon, 7,236,31 ;7 - property - - ;button 'Undo' - mov ebx,255*65536+18 - mov edx,26 - int 0x40 - stdcall draw_icon, 33,256,31 ;33 - undo - - ;button 'Redo' - mov ebx,275*65536+18 - mov edx,27 - int 0x40 - stdcall draw_icon, 34,276,31 ;34 - redo - -; 10 30 50 70 90 - - cmp [err_opn],1 - jne @f - mcall 4,10*65536+35,0x80ff0000,txtErrOpen - @@: - - stdcall [edit_box_draw], edit1 - stdcall [edit_box_draw], edit_sav - - mov dword[w_scr_t1.all_redraw],1 - ;stdcall [scrollbar_ver_draw], w_scr_t1 - stdcall [tl_draw], tree1 - mov dword[w_scr_t2.all_redraw],1 - ;stdcall [scrollbar_ver_draw], w_scr_t2 - stdcall [tl_draw], tree2 - - cmp byte[show_mode],0 ;условие видимости окна конструктора - jne @f - stdcall [buf2d_draw], buf_fon - @@: - cmp byte[show_mode],1 ;условие видимости текстового окна - jne @f - stdcall [ted_draw], tedit0 - @@: - mcall 12,2 -popad - ret - -align 4 -mouse: - stdcall [edit_box_mouse], edit1 - stdcall [edit_box_mouse], edit_sav - stdcall [tl_mouse], tree1 - stdcall [tl_mouse], tree2 - cmp byte[show_mode],1 ;условие видимости текстового окна - jne @f - stdcall [ted_mouse], tedit0 - @@: - ret - - -align 4 -key: - mcall 2 - stdcall [edit_box_key], edit1 - stdcall [edit_box_key], edit_sav - stdcall [tl_key], tree1 - stdcall [tl_key], tree2 - - jmp still - -align 4 -button: - mcall 17 - cmp ah,5 - jne @f - call but_open_proj - jmp still - @@: - cmp ah,6 - jne @f - call but_save_proj - jmp still - @@: - ;cmp ah,10 - ;jne @f - ;call but_element_change - ;@@: - cmp ah,11 - jne @f - call but_show_constructor - jmp still - @@: - cmp ah,12 - jne @f - call but_show_code - jmp still - @@: - cmp ah,13 - jne @f - call but_update - jmp still - @@: - cmp ah,14 - jne @f - call but_save_asm - jmp still - @@: - cmp ah,15 - jne @f - call but_show_invis - jmp still - @@: - cmp ah,16 - jne @f - call but_show_syntax - jmp still - @@: - cmp ah,21 - jne @f - call but_obj_move_up - jmp still - @@: - cmp ah,22 - jne @f - call but_obj_move_down - jmp still - @@: - cmp ah,23 - jne @f - call but_obj_copy - jmp still - @@: - cmp ah,24 - jne @f - call but_obj_paste - jmp still - @@: - cmp ah,25 - jne @f - call on_file_object_select - jmp still - @@: - cmp ah,26 - jne @f - stdcall [tl_info_undo], tree2 - stdcall [tl_draw], tree2 - jmp still - @@: - cmp ah,27 - jne @f - stdcall [tl_info_redo], tree2 - stdcall [tl_draw], tree2 - jmp still - @@: - cmp ah,31 - jne @f - call on_add_object - jmp still - @@: - cmp ah,1 - jne still -.exit: - stdcall mem.Free,[icon_tl_sys] - mov dword[tree1.data_img],0 - mov dword[tree2.data_img],0 - mov dword[tree1.data_img_sys],0 - mov dword[tree2.data_img_sys],0 - stdcall dword[tl_data_clear], tree1 - stdcall dword[tl_data_clear], tree2 - stdcall [buf2d_delete],buf_fon ;удаляем буфер - stdcall [buf2d_delete],buf_font ;удаляем буфер - stdcall [buf2d_delete],buf_skin1 - stdcall [buf2d_delete],buf_skin2 - stdcall [buf2d_delete],buf_skin3 - stdcall [ted_delete], tedit0 - cmp dword[unpac_mem],0 - je @f - stdcall mem.Free,[unpac_mem] - @@: - mcall -1 - -align 4 -open_file_data dd 0 ;указатель на память для открытия файлов -open_file_size dd 0 ;размер открытого файла - -align 4 -but_open_proj: - copy_path open_dialog_name,communication_area_default_path,file_name,0 - pushad - mov [OpenDialog_data.type],0 - stdcall [OpenDialog_Start],OpenDialog_data - cmp [OpenDialog_data.status],2 - je .open_end - ;код при удачном открытии диалога - - mov [run_file_70.Function], 5 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], 0 - mov dword[run_file_70.Buffer], open_b - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], openfile_path - mcall 70,run_file_70 - - mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах - mov [open_file_size],ecx - stdcall mem.ReAlloc,[open_file_data],ecx - mov [open_file_data],eax - - mov [run_file_70.Function], 0 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], ecx - m2m dword[run_file_70.Buffer], eax - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], openfile_path - mcall 70,run_file_70 ;загружаем файл - cmp ebx,0xffffffff - mov [err_opn],1 - je .open_end ;if open file - mov [err_opn],0 - stdcall [edit_box_set_text], edit1,openfile_path - - stdcall dword[tl_info_clear], tree2 - mov eax,[open_file_data] ;добавляем объекты - @@: - mov ebx,dword[eax] - cmp ebx,0 - je @f - - call find_obj_in_opt ;edi = pointer to ObjOpt struct - - mov cx,word[edi+obj_opt.img-obj_opt] - cmp cx,0 - jge .zero - xor cx,cx ;что-бы не глючило с отрицательным индексом - .zero: - shl ecx,16 ;в ecx индекс иконки - mov cl,byte[eax+u_object.lvl-u_object] ;уровень объекта - - ;tl_node_close_open - не подходит, т.к. действует на узлы имеющие дочерние - mov ch,byte[eax+u_object.clo-u_object] ;закрытый/открытый - - stdcall dword[tl_node_add], tree2,ecx,eax ;добавляем объект - - stdcall dword[tl_cur_next], tree2 ;переносим курсор вниз, что-бы не поменялся порядок - add eax,sizeof.object ;переход на следующий объект - jmp @b - @@: - stdcall dword[tl_cur_beg], tree2 ;переносим курсор вверх - - mov [foc_obj],0 - call draw_constructor - call code_gen - .open_end: - call draw_window ;перерисовка окна идет в любом случае, даже если файл не открылся - popad - ret - -;сохранение файла проэкта на диск -align 4 -but_save_proj: - copy_path open_dialog_name,communication_area_default_path,file_name,0 - pushad - mov [OpenDialog_data.type],1 - stdcall [OpenDialog_Start],OpenDialog_data - cmp [OpenDialog_data.status],2 - je .end_save_file - ;код при удачном открытии диалога - - ;берем размер памяти, необходимой для сохранения файла - xor ecx,ecx - stdcall [tl_node_poi_get_info], tree2,0 - @@: - cmp eax,0 - je @f - inc ecx - stdcall [tl_node_poi_get_next_info], tree2,eax ;переходим к следущему узлу - jmp @b - @@: - ;movzx eax,word[tree2.info_size] - imul ecx,sizeof.object ;eax - add ecx,4 ;метка конца файла - mov [open_file_size],ecx - stdcall mem.ReAlloc,[open_file_data],ecx - mov [open_file_data],eax - - mov edi,[open_file_data] - stdcall [tl_node_poi_get_info], tree2,0 - mov edx,eax - @@: - cmp edx,0 - je @f - stdcall [tl_node_poi_get_data], tree2,edx - mov esi,eax ;получаем данные узла - - mov bl,byte[edx+2] ;bl - уровень объекта - mov byte[esi+u_object.lvl-u_object],bl - mov bl,byte[edx+3] ;bl - открытие/закрытие объекта - mov byte[esi+u_object.clo-u_object],bl - - ;вычисляем новый индекс для типа объекта - mov ebx,[esi+u_object.typid-u_object] ;ebx - тип объекта - ;сохраняем тип объекта - push ebx - imul ebx,sizeof.TreeList - add ebx,[tree2.data_nodes] ;ebx - указатель объект указывающий тип - stdcall get_obj_npp,ebx - mov [esi+u_object.typid-u_object],eax - mov eax,esi - ;копируем объект в память для сохранения - movzx ecx,word[tree2.info_size] - cld - rep movsb - ;восстанавливаем тип объекта - pop dword[eax+u_object.typid-u_object] - - stdcall [tl_node_poi_get_next_info], tree2,edx - mov edx,eax ;переходим к следущему узлу - jmp @b - @@: - mov dword[edi],0 ;метка конца файла - add edi,4 - - stdcall [edit_box_set_text], edit1,openfile_path - mov ecx,[open_file_size] ;ecx - размер сохраняемого файла - mov [run_file_70.Function], 2 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], ecx - m2m [run_file_70.Buffer], [open_file_data] - mov [run_file_70.rezerv], 0 - mov dword[run_file_70.FileName], openfile_path - mcall 70,run_file_70 - - .end_save_file: - popad - ret - -;берет номер по порядку по указателю на структуру объекта -;output: -; eax - номер объекта -align 4 -proc get_obj_npp uses ebx ecx, p_obj_str:dword - mov ecx,2 - mov ebx,[p_obj_str] - - stdcall [tl_node_poi_get_info], tree2,0 - @@: - cmp eax,0 - je .no_exist - cmp eax,ebx - je @f - - inc ecx - stdcall [tl_node_poi_get_next_info], tree2,eax ;переходим к следущему узлу - jmp @b - .no_exist: ;когда идет ссылка на не существующий объект - xor ecx,ecx ;обнуляем указатель, что-бы не сохранять в файл мусор - @@: - mov eax,ecx - ret -endp - -;функция для сохранения созданного asm файла -align 4 -but_save_asm: - push edi - mov edi, tedit0 - - stdcall [ted_save_file],edi,run_file_70,[edit_sav.text] - cmp ted_err_save,0 - jne @f - stdcall [mb_create],msgbox_1,thread ;message: Файл был сохранен - @@: - pop edi - ret - -;функция для показа/скрытия невидимых символов -align 4 -but_show_invis: - push edi - mov edi,tedit0 - - xor ted_mode_invis,1 - cmp byte[show_mode],1 ;условие видимости текстового окна - jne @f - stdcall [ted_draw],edi - @@: - pop edi - ret - -; -align 4 -but_show_syntax: - push edi - mov edi,tedit0 - - xor ted_mode_color,1 - cmp byte[show_mode],1 ;условие видимости текстового окна - jne @f - stdcall [ted_draw],edi - @@: - pop edi - ret - -align 4 -ted_save_err_msg: - mov byte[msgbox_0.err],al - stdcall [mb_create],msgbox_0,thread ;message: Can-t save text file! - ret - -;функция вызываемая при нажатии Enter в окне tree2 -;обновляет текстовые поля значениями параметров взятых из объектов -;функция обратная к данной but_element_change -align 4 -on_file_object_select: - cmp byte[prop_wnd_run],0 - jne @f - mov byte[prop_wnd_run],1 - stdcall [tl_node_get_data], tree2 - mov dword[foc_obj],eax - cmp eax,0 - je @f - pushad - ;все действия по настройке элементов управления выполняются в окне со свойствами - mcall 51,1,prop_start,prop_thread - popad - @@: - ;call draw_window - ret - -;функция вызываемая при нажатии Enter в окне tree1 -;добавляет новый объект в окно tree2 -align 4 -on_add_object: -push eax ebx ecx - stdcall [tl_node_get_data], tree1 - cmp eax,0 - je @f - xor ecx,ecx - mov cx,word[eax+obj_opt.img-obj_opt] ;cx - индекс главной иконки добавляемого объекта - - cmp ecx,count_main_icons ;в старших битах ecx будут 0, потому отрицательные числа тоже проверяются - jl .end_0 - ;если иконки нет, по умолчанию берем 0-ю - xor cx,cx - .end_0: - - shl ecx,16 - stdcall mem_clear, u_object,sizeof.object - mov ebx,dword[eax] - mov dword[u_object.id],ebx - stdcall dword[tl_node_add], tree2,ecx,u_object ;добавляем объект - @@: -pop ecx ebx eax - call draw_window - ret - -align 4 -but_ctrl_o: - ret -align 4 -but_ctrl_n: - ret -align 4 -but_ctrl_s: - ret - -;открытие и распаковка файла подсветки синтаксиса -;input: -; ted_syntax_file - буфер для открываемого файла синтаксиса -; ted_syntax_file_size - размер открываемого файла синтаксиса -;output: -; ebx - число прочитанных байт из файла -align 4 -open_unpac_synt_file: -push eax edi esi - mov edi, tedit0 - mov [run_file_70.Function], 0 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov ecx, ted_syntax_file_size - mov dword[run_file_70.Count], ecx - m2m dword[run_file_70.Buffer], ted_syntax_file - mov byte[run_file_70+20], 0 - mov [run_file_70.FileName], file_name - mcall 70, run_file_70 - cmp ebx,-1 - jne .end_0 - ;если возникли ошибки при открытии файла синтаксиса - mov byte[txt_not_syntax_file.err],'0' - add byte[txt_not_syntax_file.err],al - notify_window_run txt_not_syntax_file ;Can-t open color options file! - jmp @f - .end_0: - - mov eax,ted_syntax_file - cmp dword[eax],'KPCK' - jne .end_unpack - - mov ecx,dword[eax+4] ;ecx - размер файла синтаксиса после распаковки - cmp dword[unpac_mem],0 - jne .end_1 - ;первоначальное выделение временной памяти для распаковки файла - stdcall mem.Alloc,ecx - mov [unpac_mem],eax - mov [unpac_mem_size],ecx - .end_1: - cmp dword[unpac_mem_size],ecx - jge .end_2 - ;если для распакованого файла не хватает временной памяти - stdcall mem.ReAlloc,[unpac_mem],ecx ;заново выделяем временную память - mov [unpac_mem],eax - mov [unpac_mem_size],ecx - .end_2: - - ;распаковка файла во временную память - stdcall unpack,ted_syntax_file,[unpac_mem] - - cmp ted_syntax_file_size,ecx - jge .end_3 - ;если для распакованого файла не хватает памяти - stdcall mem.ReAlloc,ted_syntax_file,ecx ;заново выделяем память - mov ted_syntax_file,eax - mov ted_syntax_file_size,ecx - .end_3: - - ;копирование распакованного файла из временной памяти в память элемента - mov edi,ted_syntax_file - mov esi,[unpac_mem] - cld - rep movsb - - .end_unpack: - ;применение файла подсветки - stdcall [ted_init_syntax_file], tedit0 - @@: -pop esi edi eax - ret - -align 4 -txt_not_syntax_file: - db 'Ошибка при открытии файла с цветовыми настройками! (Код ошибки =' - .err: db '?' - db ')',0 - -align 4 -buf_fon: ;фоновый буфер - dd 0 ;указатель на буфер изображения - dw 310 ;+4 left - dw 50 ;+6 top - dd 340 ;+8 w - dd 280 ;+12 h - dd 0xffffff ;+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_skin1: - dd 0 ;указатель на буфер изображения - dw 0 ;+4 left - dw 0 ;+6 top - dd SKIN_W1 ;+8 w - dd SKIN_H ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel -align 4 -buf_skin2: - dd 0 ;указатель на буфер изображения - dw 0 ;+4 left - dw 0 ;+6 top - dd SKIN_W2 ;+8 w - dd SKIN_H ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel -align 4 -buf_skin3: - dd 0 ;указатель на буфер изображения - dw 0 ;+4 left - dw 0 ;+6 top - dd SKIN_W3 ;+8 w - dd SKIN_H ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -show_mode db 0 ;режим для показа определенного окна -txtErrOpen db 'Не найден файл, проверьте правильность имени',0 -txtErrIni1 db 'Не открылся файл с опциями',0 -err_opn db 0 ;рез. открытия файла проэкта -err_ini0 db 0 ;рез. открытия файла с иконками -err_ini1 db 0 ;рез. открытия файла с опциями -unpac_mem dd 0 -unpac_mem_size dd 0 - -edit1 edit_box 210, 10, 5, 0xffffff, 0xff80, 0xff, 0xff0000, 0x4080, 300, ed_text1, mouse_dd, 0, 7, 7 - -edit2 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text2, mouse_dd, 0 -edit3 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text3, mouse_dd, 0 -edit4 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text4, mouse_dd, 0 -edit5 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text5, mouse_dd, 0 -edit6 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text6, mouse_dd, 0 -edit7 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text7, mouse_dd, 0 -edit8 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text8, mouse_dd, 0 -edit9 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text9, mouse_dd, 0 -edit10 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text10, mouse_dd, 0 -edit11 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text11, mouse_dd, 0 -edit12 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text12, mouse_dd, 0 -prop_wnd_edits_end: ;конец текстовых полей, отвечающих за свойства - -edit_sav edit_box 210, 310, 30, 0xffffff, 0xff80, 0xff, 0xff0000, 0x4080, 300, ed_text_sav, mouse_dd, 0 - - -ed_text1 db '/hd0/1/',0 - rb 295 -ed_text2 rb MAX_LEN_OBJ_TXT+2 -ed_text3 rb MAX_LEN_OBJ_TXT+2 -ed_text4 rb MAX_LEN_OBJ_TXT+2 -ed_text5 rb MAX_LEN_OBJ_TXT+2 -ed_text6 rb MAX_LEN_OBJ_TXT+2 -ed_text7 rb MAX_LEN_OBJ_TXT+2 -ed_text8 rb MAX_LEN_OBJ_TXT+2 -ed_text9 rb MAX_LEN_OBJ_TXT+2 -ed_text10 rb MAX_LEN_OBJ_TXT+2 -ed_text11 rb MAX_LEN_OBJ_TXT+2 -ed_text12 rb MAX_LEN_OBJ_TXT+2 -ed_text_sav rb 302 - -txt_null db 'null',0 -mouse_dd dd ? - -el_focus dd tree1 -;дерево со списком возможных типов объектов -tree1 tree_list sizeof.ObjOpt,20+2, tl_key_no_edit+tl_draw_par_line+tl_list_box_mode,\ - 16,16, 0xffffff,0xb0d0ff,0xd000ff, 5,50,125,280, 0,obj_opt.info-obj_opt,0, el_focus,\ - w_scr_t1,on_add_object -;дерево с объектами в пользовательском файле -tree2 tree_list sizeof.object,MAX_CED_OBJECTS+2, tl_draw_par_line,\ - 16,16, 0xffffff,0xb0d0ff,0xd000ff, 155,50,130,280, 13,u_object.txt-u_object,MAX_LEN_OBJ_TXT, el_focus,\ - w_scr_t2,on_file_object_select - -msgbox_0: - db 1,0 - db 'Warning',0 - db 'Error saving file!',13,\ - 'Maybe the file name is not entered correctly.',13,\ - ' (error code =' - .err: db '?' - db ')',0 - db 'Close',0 - db 0 - -msgbox_1: - db 1,0 - db ':)',0 - db 'File was saved',0 - db 'Ok',0 - db 0 - -struct TexSelect - x0 dd ? - y0 dd ? - x1 dd ? - y1 dd ? -ends -;------------------------------------------------------------------------------ -align 4 -tedit0: ;структура текстового редактора - .wnd BOX 310,50,325,260 ;+ 0 - .rec BOX 30,13,7,10 ;+16 - .drag_m db 0 ;+32 выделение от мыши - .drag_k db 0 ;+33 выделение от клавиатуры - .sel TexSelect 0,0,0,0 ;+34 структура выделения - .seln TexSelect ;+50 дополнительная структура выделения - .tex dd 0 ;+66 text memory pointer - .tex_1 dd 0 ;+70 text first symbol pointer - .tex_end dd 0 ;+74 text end memory pointer - .cur_x dd 0 ;+78 координата x курсора - .cur_y dd 0 ;+82 координата y курсора - .max_chars dd 25002 ;+86 максимальное число символов в одном документе - .count_colors_text dd 1 ;+90 колличество цветов текста - .count_key_words dd 0 ;+94 колличество ключевых слов - .color_cursor dd 0xff0000 ;+98 цвет курсора - .color_wnd_capt dd 0x0080c0 ;+102 цвет полей вокруг окна - .color_wnd_work dd 0x0 ;+106 цвет фона окна - .color_wnd_bord dd 0xffffff ;+110 цвет текста на полях - .color_select dd 0x0000ff ;+114 цвет выделения - .color_cur_text dd 0xffff00 ;+118 цвет символа под курсором - .color_wnd_text dd 0x80ffff ;+122 цвет текста в окне - .syntax_file dd 0 ;+126 указатель на начало файла синтаксиса - .syntax_file_size dd 55*1024 ;+130 максимальный размер файла синтаксиса - .text_colors dd 0 ;+134 указатель на массив цветов текста - .help_text_f1 dd 0 ;+138 указатель на текст справки (по нажатии F1) - .help_id dd -1 ;+142 идентификатор для справки - .key_words_data dd 0 ;+146 указатель на структуры ключевых слов TexColViv - .tim_ch dd ? ;+150 количество изменений в файле - .tim_undo dd ? ;+154 количество отмененных действий - .tim_ls dd ? ;+158 время последнего сохранения - .tim_co dd ? ;+162 время последней цветовой разметки - .el_focus dd el_focus ;+166 указатель на переменную элемента в фокусе - .err_save db 0 ;+170 ошибка сохранения файла - .panel_id db 0 ;+171 номер открытой панели - .key_new db 0 ;+172 символ, который будет добавлятся с клавиатуры - .symbol_new_line db 20 ;+173 символ завершения строки - .scr_w dd scrol_w1 ;+174 вертикальный скроллинг - .scr_h dd scrol_h1 ;+178 горизонтальный скроллинг - .arr_key_pos dd 0 ;+182 указатель на массив позиций ключевых слов - .buffer dd text_buffer ;+186 указатель на буфер копирования/вставки - .buffer_find dd 0 ;+190 указатель на буфер для поиска - .cur_ins db 1 ;+194 режим работы курсора (обычный или замена) - .mode_color db 1 ;+195 режим выделения слов цветом (0-выкл. 1-вкл.) - .mode_invis db 0 ;+196 режим показа непечатаемых символов - .gp_opt db 0 ;+197 опции возвращаемые функцией ted_get_pos_by_cursor - .fun_on_key_ctrl_o dd but_ctrl_o ;+198 указатель на функцию вызываемую при нажатии Ctrl+O (открытие файла) - .fun_on_key_ctrl_f dd 0 ;+202 ... Ctrl+F (вызова/скрытия панели поиска) - .fun_on_key_ctrl_n dd but_ctrl_n ;+206 ... Ctrl+N (создание нового документа) - .fun_on_key_ctrl_s dd 0 ;+210 ... Ctrl+S - .buffer_size dd BUF_SIZE ;+214 размер буфера копирования/вставки - .fun_find_err dd 0 ;+218 указатель на функцию вызываемую если поиск закончился неудачно - .fun_init_synt_err dd 0 ;+222 указатель на функцию вызываемую при ошибочном открытии файла синтаксиса - .fun_draw_panel_buttons dd 0 ;+226 указатель на функцию рисования панели с кнопками - .fun_draw_panel_find dd 0 ;+230 указатель на функцию рисования панели поиска - .fun_draw_panel_syntax dd 0 ;+234 указатель на функцию рисования панели синтаксиса - .fun_save_err dd ted_save_err_msg ;+238 указатель на функцию вызываемую если сохранение файла закончилось неудачно - .increase_size dd 1000 ;+242 число символов на которые будет увечиваться память при нехватке - .ptr_free_symb dd ? ;+246 указатель на свободную память, в которую можно добавлять символ (используется внутри элемента для ускорения вставки текста) -;------------------------------------------------------------------------------ -align 4 -scrol_w1: -.x: -.size_x dw 16 ;+0 -.start_x dw 85 ;+2 -.y: -.size_y dw 100 ; +4 -.start_y dw 15 ; +6 -.btn_high dd 15 ; +8 -.type dd 1 ;+12 -.max_area dd 100 ;+16 -rb 4+4 -.bckg_col dd 0xeeeeee ;+28 -.frnt_col dd 0xbbddff ;+32 -.line_col dd 0x808080 ;+36 -.redraw dd 0 ;+40 -.delta dw 0 ;+44 -.delta2 dw 0 ;+46 -.run_x: -rb 32 -.all_redraw dd 0 ;+80 -.ar_offset dd 1 ;+84 -;--------------------------------------------------------------------- -align 4 -scrol_h1: -.x: -.size_x dw 85 ;+0 -.start_x dw 30 ;+2 -.y: -.size_y dw 16 ;+4 -.start_y dw 100 ;+6 -.btn_high dd 15 ;+8 -.type dd 1 ;+12 -.max_area dd 100 ;+16 -rb 4+4 -.bckg_col dd 0xeeeeee ;+28 -.frnt_col dd 0xbbddff ;+32 -.line_col dd 0x808080 ;+36 -.redraw dd 0 ;+40 -.delta dw 0 ;+44 -.delta2 dw 0 ;+46 -.run_x: -rb 32 -.all_redraw dd 0 ;+80 -.ar_offset dd 1 ;+84 - - - -align 4 -w_scr_t1: -.size_x dw 16 ;+0 -rb 2+2+2 -.btn_high dd 15 ;+8 -.type dd 1 ;+12 -.max_area dd 100 ;+16 -rb 4+4 -.bckg_col dd 0xeeeeee ;+28 -.frnt_col dd 0xbbddff ;+32 -.line_col dd 0 ;+36 -rb 4+2+2 -.run_x: -rb 32 -.all_redraw dd 0 ;+80 -.ar_offset dd 1 ;+84 - -align 4 -w_scr_t2: -.size_x dw 16 ;+0 -rb 2+2+2 -.btn_high dd 15 ;+8 -.type dd 1 ;+12 -.max_area dd 100 ;+16 -rb 4+4 -.bckg_col dd 0xeeeeee ;+28 -.frnt_col dd 0xbbddff ;+32 -.line_col dd 0 ;+36 -rb 4+2+2 -.run_x: -rb 32 -.all_redraw dd 0 ;+80 -.ar_offset dd 1 ;+84 - -;данные для диалога открытия файлов -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 '/sys',0 - -communication_area_name: - db 'FFFFFFFF_open_dialog',0 -open_dialog_name: - db 'opendial',0 -communication_area_default_path: - db '/sys/File managers/',0 - -Filter: -dd Filter.end - Filter ;.1 -.1: -db 'CED',0 -db 'ASM',0 -.end: -db 0 - - -data_of_code dd 0 -sc system_colors - -image_data dd 0 ;память для преобразования картинки функциями libimg - -text_buffer db BUF_SIZE dup(0) -fn_obj_opt db 'ob_o.opt',0 -obj_opt ObjOpt - rb sizeof.ObjOpt*(MAX_OBJ_TYPES-1)+MAX_OBJ_CAPTIONS - db 0 ;eof options - -cur_x dd 0 -cur_y dd 0 -foc_obj dd 0 ;объект в фокусе -obj_count_txt_props dd 0 ;количество используемых текстовых свойств -obj_m_win dd 0 ;структура главного окна - - system_dir0 db '/sys/lib/' - lib0_name db 'box_lib.obj',0 - - system_dir1 db '/sys/lib/' - lib1_name db 'proc_lib.obj',0 - - system_dir2 db '/sys/lib/' - lib2_name db 'buf2d.obj',0 - - system_dir3 db '/sys/lib/' - lib3_name db 'libimg.obj',0 - - system_dir4 db '/sys/lib/' - lib4_name db 'msgbox.obj',0 - -align 4 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_line dd sz_buf2d_line - buf2d_rect_by_size dd sz_buf2d_rect_by_size - buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size - ;buf2d_circle dd sz_buf2d_circle - buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - ;buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - ;buf2d_crop_color dd sz_buf2d_crop_color - buf2d_offset_h dd sz_buf2d_offset_h -dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_line db 'buf2d_line',0 - sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 ;рисование прямоугольника, 2-я координата задана по размеру - sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 - ;sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - ;sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - ;sz_buf2d_crop_color db 'buf2d_crop_color',0 - sz_buf2d_offset_h db 'buf2d_offset_h',0 - -align 4 -import_box_lib: - dd alib_init2 - - edit_box_draw dd aEdit_box_draw - edit_box_key dd aEdit_box_key - edit_box_mouse dd aEdit_box_mouse - edit_box_set_text dd aEdit_box_set_text - - init_checkbox dd aInit_checkbox - check_box_draw dd aCheck_box_draw - check_box_mouse dd aCheck_box_mouse - - scrollbar_ver_draw dd aScrollbar_ver_draw - scrollbar_hor_draw dd aScrollbar_hor_draw - - 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_node_move_up dd sz_tl_node_move_up - tl_node_move_down dd sz_tl_node_move_down - 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_poi_get_info dd sz_tl_node_poi_get_info - tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info - tl_node_poi_get_data dd sz_tl_node_poi_get_data - - ted_but_sumb_upper dd sz_ted_but_sumb_upper - ted_but_sumb_lover dd sz_ted_but_sumb_lover - ted_can_save dd sz_ted_can_save - ted_clear dd sz_ted_clear - ted_delete dd sz_ted_delete - ted_draw dd sz_ted_draw - ted_init dd sz_ted_init - ted_init_scroll_bars dd sz_ted_init_scroll_bars - ted_init_syntax_file dd sz_ted_init_syntax_file - ted_is_select dd sz_ted_is_select - ted_key dd sz_ted_key - ted_mouse dd sz_ted_mouse - ted_open_file dd sz_ted_open_file - ted_save_file dd sz_ted_save_file - ted_text_add dd sz_ted_text_add - ted_but_select_word dd sz_ted_but_select_word - ted_but_cut dd sz_ted_but_cut - ted_but_copy dd sz_ted_but_copy - ted_but_paste dd sz_ted_but_paste - ted_but_undo dd sz_ted_but_undo - ted_but_redo dd sz_ted_but_redo - ted_but_reverse dd sz_ted_but_reverse - ted_but_find dd sz_ted_but_find - ted_text_colored dd sz_ted_text_colored - ;version_text_edit dd sz_ted_version - -dd 0,0 - - alib_init2 db 'lib_init',0 - - aEdit_box_draw db 'edit_box_draw',0 - aEdit_box_key db 'edit_box_key',0 - aEdit_box_mouse db 'edit_box_mouse',0 - aEdit_box_set_text db 'edit_box_set_text',0 - - aInit_checkbox db 'init_checkbox2',0 - aCheck_box_draw db 'check_box_draw2',0 - aCheck_box_mouse db 'check_box_mouse2',0 - - aScrollbar_ver_draw db 'scrollbar_v_draw',0 - aScrollbar_hor_draw db 'scrollbar_h_draw',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_node_move_up db 'tl_node_move_up',0 - sz_tl_node_move_down db 'tl_node_move_down',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_poi_get_info db 'tl_node_poi_get_info',0 - sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0 - sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0 - - sz_ted_but_sumb_upper db 'ted_but_sumb_upper',0 - sz_ted_but_sumb_lover db 'ted_but_sumb_lover',0 - sz_ted_can_save db 'ted_can_save',0 - sz_ted_clear db 'ted_clear',0 - sz_ted_delete db 'ted_delete',0 - sz_ted_draw db 'ted_draw',0 - sz_ted_init db 'ted_init',0 - sz_ted_init_scroll_bars db 'ted_init_scroll_bars',0 - sz_ted_init_syntax_file db 'ted_init_syntax_file',0 - sz_ted_is_select db 'ted_is_select',0 - sz_ted_key db 'ted_key',0 - sz_ted_mouse db 'ted_mouse',0 - sz_ted_open_file db 'ted_open_file',0 - sz_ted_save_file db 'ted_save_file',0 - sz_ted_text_add db 'ted_text_add',0 - sz_ted_but_select_word db 'ted_but_select_word',0 - sz_ted_but_cut db 'ted_but_cut',0 - sz_ted_but_copy db 'ted_but_copy',0 - sz_ted_but_paste db 'ted_but_paste',0 - sz_ted_but_undo db 'ted_but_undo',0 - sz_ted_but_redo db 'ted_but_redo',0 - sz_ted_but_reverse db 'ted_but_reverse',0 - sz_ted_but_find db 'ted_but_find',0 - sz_ted_text_colored db 'ted_text_colored',0 - ;sz_ted_version db 'version_text_edit',0 - -align 4 -import_proc_lib: - OpenDialog_Init dd aOpenDialog_Init - OpenDialog_Start dd aOpenDialog_Start -dd 0,0 - aOpenDialog_Init db 'OpenDialog_init',0 - aOpenDialog_Start db 'OpenDialog_start',0 - -align 4 -import_libimg: - 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 -import_msgbox_lib: - mb_create dd amb_create - mb_reinit dd amb_reinit - mb_setfunctions dd amb_setfunctions -dd 0,0 - amb_create db 'mb_create',0 - amb_reinit db 'mb_reinit',0 - amb_setfunctions db 'mb_setfunctions',0 - -;library structures -l_libs_start: - lib0 l_libs lib0_name, library_path, system_dir0, import_box_lib - lib1 l_libs lib1_name, library_path, system_dir1, import_proc_lib - lib2 l_libs lib2_name, library_path, system_dir2, import_buf2d_lib - lib3 l_libs lib3_name, library_path, system_dir3, import_libimg - lib4 l_libs lib4_name, library_path, system_dir4, import_msgbox_lib -load_lib_end: - - -align 16 -run_file_70 FileInfoBlock -open_b rb 560 - -IncludeIGlobals -i_end: -IncludeUGlobals - procinfo process_information - buf_cmd_lin rb 1024 - file_name rb 1024 ;icon file path - fp_obj_opt rb 1024 ;obj options file patch - rb 1024 - prop_thread: - rb 1024 - thread: ;вверху дочерний стек для окна сообщения - rb 1024 -stacktop: ;вверху стек основной программы - sys_path rb 1024 - library_path rb 1024 - plugin_path rb 4096 - openfile_path rb 4096 - filename_area rb 256 -mem: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' + dd 1,start,i_end,mem,stacktop,buf_cmd_lin,sys_path + +include '../../KOSfuncs.inc' +include '../../macros.inc' +include '../../proc32.inc' +include '../../load_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' +include '../../dll.inc' +include '../../system/skincfg/trunk/kglobals.inc' +include '../../system/skincfg/trunk/unpacker.inc' +include 'strlen.inc' +include 'obj_codes.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, dll.Load + +hed db 'kol_f_edit 29.09.20',0 + +sizeof.TreeList equ 20 ;need for element 'tree_list' + +BUF_STRUCT_SIZE equ 21 +buf2d_data equ dword[edi] ;данные буфера изображения +buf2d_w equ dword[edi+8] ;ширина буфера +buf2d_h equ dword[edi+12] ;высота буфера +buf2d_l equ word[edi+4] ;отступ слева +buf2d_t equ word[edi+6] ;отступ сверху +buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера +buf2d_color equ dword[edi+16] ;цвет фона буфера +buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения + + +MAX_CED_OBJECTS equ 200 +MAX_OPT_FIELDS equ 11 +MAX_OBJ_TYPES equ 17 ;максимальное число объектов +MAX_OBJ_CAPTIONS equ 1000 ;размер дополнительных подписей подписей +WND_CAPT_COLOR equ 0xb0d0ff +BUF_SIZE equ 1000 + +;modif +BIT_MOD_ACI equ 0 ;первоначальные настройки элементов +BIT_MOD_ACM equ 1 ;события от мыши +BIT_MOD_ACD equ 2 ;данные объектов +BIT_MOD_ABU equ 3 ;связывание кнопок +BIT_MOD_WI_CAPT equ 0 ;стиль окна подпись +BIT_MOD_WI_CORD_OTN_CL_OBL equ 1 ;стиль окна координаты относительно клиентской области +BIT_MOD_WI_REDR equ 2 ;стиль окна перерисовка окна +BIT_MOD_WI_GRAD equ 3 ;стиль окна градиент +BIT_MOD_CHE equ 0 ; ch_flag_en - выбран CheckBox +BIT_MOD_CHE_T equ 1 ;сверху +BIT_MOD_CHE_M equ 2 ;по центру +BIT_MOD_CHE_B equ 3 ;снизу +BIT_MOD_TXT_ASCII_0 equ 0 ;текст заканчив. 0 +BIT_MOD_TXT_NO_TRAN equ 1 ;текст прозрачный +BIT_MOD_TXT_CHAR2 equ 2 ;текст 2-м шрифтом +BIT_MOD_EDIT_FOC equ 0 ;EditBox в фокусе +BIT_MOD_EDIT_FIO equ 1 ; +;CPP_MOD_RE_GR equ 1 ;градиентный прямоугольник +BIT_MOD_BUT_NFON equ 0 ;стиль Button не рисовать кнопку +BIT_MOD_BUT_NBORD equ 1 ;стиль Button не рисовать границу +BIT_MOD_IMPORT_FUNCT_COMMENT equ 0 ;коментировать функцию + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + ;path - может быть переменной или строковым параметром + if path eqtype '' ;проверяем задан ли строкой параметр path + jmp @f + local .path_str + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0 + else + copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + end if + + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], eax + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mcall 70,run_file_70 ;загружаем файл изображения + cmp ebx,0xffffffff + je @f + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall [img_decode], [buf],ebx,0 + mov [image_data],eax + ;преобразуем изображение к формату rgb + stdcall [img_to_rgb2], [image_data],[buf] + ;удаляем временный буфер image_data + stdcall [img_destroy], [image_data] + @@: +} + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + rezerv db ? + FileName dd ? +ends + +struct object + id dd ? ;идентификатор объекта + txt rb MAX_LEN_OBJ_TXT ;текстовые свойства + lvl db 0 + clo db 0 + typid dd ? ;номер объекта определяющего тип переменной + modif dd ? ;битовые свойства +ends + +struct ObjOpt + dd ? + bl_type db ? + graph db ? + info rb 30 + caption rb MAX_OPT_CAPTION + Col rw MAX_OPT_FIELDS + img rw MAX_OPT_FIELDS ;индексы картинок (в файле 'icon.bmp') + bit_prop dd 0 ;битовые свойства (подписи, названия) + bit_val dd 0 ;битовые свойства (значения, константы) +ends + +SKIN_H equ 22 +SKIN_W1 equ 5 +SKIN_W2 equ 7 +SKIN_W3 equ 23 +fn_skin_1 db 'left.bmp',0 +fn_skin_2 db 'base.bmp',0 +fn_skin_3 db 'oper.bmp',0 +IMAGE_FILE_SKIN1_SIZE equ 3*(SKIN_W1+3)*SKIN_H+54 +IMAGE_FILE_SKIN2_SIZE equ 3*(SKIN_W2+3)*SKIN_H+54 +IMAGE_FILE_SKIN3_SIZE equ 3*(SKIN_W3+3)*SKIN_H+54 + +IMAGE_FILE_FONT1_SIZE equ 96*144*3 ;размер файла с 1-м системным шрифтом + +fn_icon db 'icon.bmp',0 +count_main_icons equ 35 ;число иконок в файле icon.bmp +bmp_icon rb 0x300*count_main_icons + +TREE_ICON_SYS16_BMP_SIZE equ 256*3*11+54 ;размер bmp файла с системными иконками +icon_tl_sys dd 0 ;указатеель на память для хранения системных иконок +icon_font_s1 dd 0 ;указатель на временную память для загрузки шрифта + +fn_syntax db 'asm.syn',0 ;имя загружаемого файла синтаксиса + +;макрос для проверки битового свойства +macro test_bool_prop obj_reg,n_prop +{ + bt dword[obj_reg+u_object.modif-u_object],n_prop +} + +include 'ced_wnd_m.inc' +include 'ced_wnd_prop.inc' ;файл с функциями окна свойств объекта +include 'ced_constr.inc' ;файл с функциями окна конструктора +include 'ced_code_g.inc' ;файл с функциями генерирования кодов + +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 + @@: + + ;задание размеров полей со свойствами + mov eax,prop_edits_top + mov ebx,16+6 ;ширина иконки + отступы + mov edi,edit2 + @@: + mov ed_top,eax ;отступ сверху + mov ed_left,ebx ;отступ слева + add edi,ed_struc_size + add eax,prop_edits_height + cmp edi,prop_wnd_edits_end + jl @b + + stdcall [buf2d_create], buf_fon + + mcall 48,3,sc,sizeof.system_colors + mcall 40,0x27 + + stdcall [tl_data_init], tree1 + stdcall [tl_data_init], tree2 + + copy_path fn_icon,sys_path,file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 54 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], 0x300*count_main_icons + mov [run_file_70.Buffer], bmp_icon + mov [run_file_70.rezerv], 0 + mov [run_file_70.FileName], file_name + mcall 70,run_file_70 + + cmp ebx,-1 + mov [err_ini0],1 + je @f ;if open file + mov [err_ini0],0 + mov dword[tree1.data_img],bmp_icon + mov dword[tree2.data_img],bmp_icon + @@: + + ;системные иконки 16*16 для tree_list + load_image_file 'tl_sys_16.png', icon_tl_sys,TREE_ICON_SYS16_BMP_SIZE + ;если изображение не открылось, то в icon_tl_sys будут + ;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера + mov eax,dword[icon_tl_sys] + mov dword[tree1.data_img_sys],eax + mov dword[tree2.data_img_sys],eax + + ;1-й файл скина + load_image_file fn_skin_1, icon_font_s1,IMAGE_FILE_SKIN1_SIZE + stdcall [buf2d_create_f_img], buf_skin1,[icon_font_s1] ;создаем буфер + stdcall mem.Free,[icon_font_s1] ;освобождаем память + ;2-й файл скина + load_image_file fn_skin_2, icon_font_s1,IMAGE_FILE_SKIN2_SIZE + stdcall [buf2d_create_f_img], buf_skin2,[icon_font_s1] ;создаем буфер + stdcall mem.Free,[icon_font_s1] ;освобождаем память + ;3-й файл скина + load_image_file fn_skin_3, icon_font_s1,IMAGE_FILE_SKIN3_SIZE + stdcall [buf2d_create_f_img], buf_skin3,[icon_font_s1] ;создаем буфер + stdcall mem.Free,[icon_font_s1] ;освобождаем память + + ;символы 1-го системного шрифта + load_image_file 'font6x9.bmp', icon_font_s1,IMAGE_FILE_FONT1_SIZE + stdcall [buf2d_create_f_img], buf_font,[icon_font_s1] ;создаем буфер + stdcall mem.Free,[icon_font_s1] ;освобождаем память + stdcall [buf2d_conv_24_to_8], buf_font,1 ;делаем буфер прозрачности 8 бит + stdcall [buf2d_convert_text_matrix], buf_font + + + copy_path fn_obj_opt,sys_path,fp_obj_opt,0 + ;load options file + mov [run_file_70.Position], 0 + mov [run_file_70.Count], sizeof.ObjOpt*MAX_OBJ_TYPES+MAX_OBJ_CAPTIONS + mov [run_file_70.Buffer], obj_opt + mov [run_file_70.FileName], fp_obj_opt + mcall 70,run_file_70 + + cmp ebx,-1 + mov [err_ini1],1 + je .open_end ;jmp if not open file + mov [err_ini1],0 + + mov eax,obj_opt ;добавляем объекты + @@: + mov ebx,dword[eax] + cmp ebx,0 + je @f + ;xor ecx,ecx ;в ecx будет индекс иконки + mov cx,word[eax+obj_opt.img-obj_opt] + cmp cx,0 + jge .zero + xor cx,cx ;что-бы не глючило с отрицательным индексом + .zero: + shl ecx,16 + stdcall dword[tl_node_add], tree1,ecx,eax ;добавляем название объекта + stdcall dword[tl_cur_next], tree1 ;переносим курсор вниз, что-бы не поменялся порядок + add eax,sizeof.ObjOpt ;переход на следующий объект + jmp @b + @@: + stdcall dword[tl_cur_beg], tree1 ;переносим курсор вверх + + .open_end: + + stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога + stdcall [ted_init], tedit0 + copy_path fn_syntax,sys_path,file_name,0 + + ; *** init syntax file *** + ; проверяем размер файла синтаксиса + mov [run_file_70.Function], 5 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], 0 + mov dword[run_file_70.Buffer], open_b + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], file_name + mcall 70,run_file_70 + cmp eax,0 + jne @f + + mov edi,tedit0 + mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах + mov ted_syntax_file_size,ecx + + stdcall mem.Alloc,ecx ;выделяем память для файла синтаксиса + mov ted_syntax_file,eax + + ;пробуем открыть файл синтаксиса + call open_unpac_synt_file + jmp .end_0 + @@: + notify_window_run txt_not_syntax_file + .end_0: + + ;get cmd line + cmp [buf_cmd_lin],0 + je @f ;if file names exist + mov esi,buf_cmd_lin + call strlen ;eax=strlen + mov edi,[edit1.text] + mov [edit1.size],eax + mov ecx,eax + rep movsb + call but_open_proj + @@: + + + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall 10 + + cmp al,1 + jne @f + call draw_window + @@: + cmp al,2 + jz key + cmp al,3 + jz button + cmp al,6 + jne @f + call mouse + @@: + + jmp still + +align 4 +draw_window: +pushad + mcall 12,1 + + xor eax,eax + mov ebx,20*65536+670 + mov ecx,20*65536+370 + mov edx,[sc.work] + or edx,0x33000000 + mov edi,hed + int 0x40 + + mov eax,8 ;button 'Open Project' + mov esi,0x80ff + mov ebx,230*65536+18 + mov ecx,5*65536+18 + mov edx,5 + int 0x40 + stdcall draw_icon, 22,231,6 ;22 - open + + ;button 'Save Project' + mov ebx,250*65536+18 + mov ecx,5*65536+18 + mov edx,6 + int 0x40 + stdcall draw_icon, 17,251,6 ;17 - save + + ;button 'Show Constructor' + mov ebx,310*65536+18 + mov ecx,5*65536+18 + mov edx,11 + int 0x40 + stdcall draw_icon, 12,311,6 ;12 - window + + ;button 'Show Code' + mov ebx,330*65536+18 + mov edx,12 + int 0x40 + stdcall draw_icon, 11,331,6 ;11 - text + + ;button 'Update: Code, Constructor' + mov ebx,350*65536+18 + mov edx,13 + int 0x40 + stdcall draw_icon, 32,351,6 ;32 - update + + ;button 'Save Code' + mov ebx,370*65536+18 + mov edx,14 + int 0x40 + stdcall draw_icon, 17,371,6 ;17 - save + + ;button ']P' + mov ebx,390*65536+18 + mov edx,15 + int 0x40 + stdcall draw_icon, 18,391,6 ;18 - знак конца абзаца + + ;button 'Show color text' + mov ebx,410*65536+18 + mov edx,16 + int 0x40 + stdcall draw_icon, 19,411,6 + + ;button 'Add Object' + mov ebx,125*65536+18 + mov ecx,30*65536+18 + mov edx,31 + int 0x40 + stdcall draw_icon, 14,126,31 ;14 - add object + + ;button 'Move Up' + mov ebx,155*65536+18 + mov edx,21 + int 0x40 + stdcall draw_icon, 23,156,31 ;23 - move up + + ;button 'Move Down' + mov ebx,175*65536+18 + mov edx,22 + int 0x40 + stdcall draw_icon, 24,176,31 ;24 - move down + + ;button 'Copy' + mov ebx,195*65536+18 + mov edx,23 + int 0x40 + stdcall draw_icon, 30,196,31 ;30 - copy + + ;button 'Paste' + mov ebx,215*65536+18 + mov edx,24 + int 0x40 + stdcall draw_icon, 31,216,31 ;31 - paste + + ;button 'Property' + mov ebx,235*65536+18 + mov edx,25 + int 0x40 + stdcall draw_icon, 7,236,31 ;7 - property + + ;button 'Undo' + mov ebx,255*65536+18 + mov edx,26 + int 0x40 + stdcall draw_icon, 33,256,31 ;33 - undo + + ;button 'Redo' + mov ebx,275*65536+18 + mov edx,27 + int 0x40 + stdcall draw_icon, 34,276,31 ;34 - redo + +; 10 30 50 70 90 + + cmp [err_opn],1 + jne @f + mcall 4,10*65536+35,0x80ff0000,txtErrOpen + @@: + + stdcall [edit_box_draw], edit1 + stdcall [edit_box_draw], edit_sav + + mov dword[w_scr_t1.all_redraw],1 + ;stdcall [scrollbar_ver_draw], w_scr_t1 + stdcall [tl_draw], tree1 + mov dword[w_scr_t2.all_redraw],1 + ;stdcall [scrollbar_ver_draw], w_scr_t2 + stdcall [tl_draw], tree2 + + cmp byte[show_mode],0 ;условие видимости окна конструктора + jne @f + stdcall [buf2d_draw], buf_fon + @@: + cmp byte[show_mode],1 ;условие видимости текстового окна + jne @f + stdcall [ted_draw], tedit0 + @@: + mcall 12,2 +popad + ret + +align 4 +mouse: + stdcall [edit_box_mouse], edit1 + stdcall [edit_box_mouse], edit_sav + stdcall [tl_mouse], tree1 + stdcall [tl_mouse], tree2 + cmp byte[show_mode],1 ;условие видимости текстового окна + jne @f + stdcall [ted_mouse], tedit0 + @@: + ret + + +align 4 +key: + mcall 2 + stdcall [edit_box_key], edit1 + stdcall [edit_box_key], edit_sav + stdcall [tl_key], tree1 + stdcall [tl_key], tree2 + + jmp still + +align 4 +button: + mcall 17 + cmp ah,5 + jne @f + call but_open_proj + jmp still + @@: + cmp ah,6 + jne @f + call but_save_proj + jmp still + @@: + ;cmp ah,10 + ;jne @f + ;call but_element_change + ;@@: + cmp ah,11 + jne @f + call but_show_constructor + jmp still + @@: + cmp ah,12 + jne @f + call but_show_code + jmp still + @@: + cmp ah,13 + jne @f + call but_update + jmp still + @@: + cmp ah,14 + jne @f + call but_save_asm + jmp still + @@: + cmp ah,15 + jne @f + call but_show_invis + jmp still + @@: + cmp ah,16 + jne @f + call but_show_syntax + jmp still + @@: + cmp ah,21 + jne @f + call but_obj_move_up + jmp still + @@: + cmp ah,22 + jne @f + call but_obj_move_down + jmp still + @@: + cmp ah,23 + jne @f + call but_obj_copy + jmp still + @@: + cmp ah,24 + jne @f + call but_obj_paste + jmp still + @@: + cmp ah,25 + jne @f + call on_file_object_select + jmp still + @@: + cmp ah,26 + jne @f + stdcall [tl_info_undo], tree2 + stdcall [tl_draw], tree2 + jmp still + @@: + cmp ah,27 + jne @f + stdcall [tl_info_redo], tree2 + stdcall [tl_draw], tree2 + jmp still + @@: + cmp ah,31 + jne @f + call on_add_object + jmp still + @@: + cmp ah,1 + jne still +.exit: + stdcall mem.Free,[icon_tl_sys] + mov dword[tree1.data_img],0 + mov dword[tree2.data_img],0 + mov dword[tree1.data_img_sys],0 + mov dword[tree2.data_img_sys],0 + stdcall dword[tl_data_clear], tree1 + stdcall dword[tl_data_clear], tree2 + stdcall [buf2d_delete],buf_fon ;удаляем буфер + stdcall [buf2d_delete],buf_font ;удаляем буфер + stdcall [buf2d_delete],buf_skin1 + stdcall [buf2d_delete],buf_skin2 + stdcall [buf2d_delete],buf_skin3 + stdcall [ted_delete], tedit0 + cmp dword[unpac_mem],0 + je @f + stdcall mem.Free,[unpac_mem] + @@: + mcall -1 + +align 4 +open_file_data dd 0 ;указатель на память для открытия файлов +open_file_size dd 0 ;размер открытого файла + +align 4 +but_open_proj: + copy_path open_dialog_name,communication_area_default_path,file_name,0 + pushad + mov [OpenDialog_data.type],0 + stdcall [OpenDialog_Start],OpenDialog_data + cmp [OpenDialog_data.status],2 + je .open_end + ;код при удачном открытии диалога + + mov [run_file_70.Function], 5 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], 0 + mov dword[run_file_70.Buffer], open_b + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mcall 70,run_file_70 + + mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах + mov [open_file_size],ecx + stdcall mem.ReAlloc,[open_file_data],ecx + mov [open_file_data],eax + + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], ecx + m2m dword[run_file_70.Buffer], eax + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mcall 70,run_file_70 ;загружаем файл + cmp ebx,0xffffffff + mov [err_opn],1 + je .open_end ;if open file + mov [err_opn],0 + stdcall [edit_box_set_text], edit1,openfile_path + + stdcall dword[tl_info_clear], tree2 + mov eax,[open_file_data] ;добавляем объекты + @@: + mov ebx,dword[eax] + cmp ebx,0 + je @f + + call find_obj_in_opt ;edi = pointer to ObjOpt struct + + mov cx,word[edi+obj_opt.img-obj_opt] + cmp cx,0 + jge .zero + xor cx,cx ;что-бы не глючило с отрицательным индексом + .zero: + shl ecx,16 ;в ecx индекс иконки + mov cl,byte[eax+u_object.lvl-u_object] ;уровень объекта + + ;tl_node_close_open - не подходит, т.к. действует на узлы имеющие дочерние + mov ch,byte[eax+u_object.clo-u_object] ;закрытый/открытый + + stdcall dword[tl_node_add], tree2,ecx,eax ;добавляем объект + + stdcall dword[tl_cur_next], tree2 ;переносим курсор вниз, что-бы не поменялся порядок + add eax,sizeof.object ;переход на следующий объект + jmp @b + @@: + stdcall dword[tl_cur_beg], tree2 ;переносим курсор вверх + + mov [foc_obj],0 + call draw_constructor + call code_gen + .open_end: + call draw_window ;перерисовка окна идет в любом случае, даже если файл не открылся + popad + ret + +;сохранение файла проэкта на диск +align 4 +but_save_proj: + copy_path open_dialog_name,communication_area_default_path,file_name,0 + pushad + mov [OpenDialog_data.type],1 + stdcall [OpenDialog_Start],OpenDialog_data + cmp [OpenDialog_data.status],2 + je .end_save_file + ;код при удачном открытии диалога + + ;берем размер памяти, необходимой для сохранения файла + xor ecx,ecx + stdcall [tl_node_poi_get_info], tree2,0 + @@: + cmp eax,0 + je @f + inc ecx + stdcall [tl_node_poi_get_next_info], tree2,eax ;переходим к следущему узлу + jmp @b + @@: + ;movzx eax,word[tree2.info_size] + imul ecx,sizeof.object ;eax + add ecx,4 ;метка конца файла + mov [open_file_size],ecx + stdcall mem.ReAlloc,[open_file_data],ecx + mov [open_file_data],eax + + mov edi,[open_file_data] + stdcall [tl_node_poi_get_info], tree2,0 + mov edx,eax + @@: + cmp edx,0 + je @f + stdcall [tl_node_poi_get_data], tree2,edx + mov esi,eax ;получаем данные узла + + mov bl,byte[edx+2] ;bl - уровень объекта + mov byte[esi+u_object.lvl-u_object],bl + mov bl,byte[edx+3] ;bl - открытие/закрытие объекта + mov byte[esi+u_object.clo-u_object],bl + + ;вычисляем новый индекс для типа объекта + mov ebx,[esi+u_object.typid-u_object] ;ebx - тип объекта + ;сохраняем тип объекта + push ebx + imul ebx,sizeof.TreeList + add ebx,[tree2.data_nodes] ;ebx - указатель объект указывающий тип + stdcall get_obj_npp,ebx + mov [esi+u_object.typid-u_object],eax + mov eax,esi + ;копируем объект в память для сохранения + movzx ecx,word[tree2.info_size] + cld + rep movsb + ;восстанавливаем тип объекта + pop dword[eax+u_object.typid-u_object] + + stdcall [tl_node_poi_get_next_info], tree2,edx + mov edx,eax ;переходим к следущему узлу + jmp @b + @@: + mov dword[edi],0 ;метка конца файла + add edi,4 + + stdcall [edit_box_set_text], edit1,openfile_path + mov ecx,[open_file_size] ;ecx - размер сохраняемого файла + mov [run_file_70.Function], 2 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], ecx + m2m [run_file_70.Buffer], [open_file_data] + mov [run_file_70.rezerv], 0 + mov dword[run_file_70.FileName], openfile_path + mcall 70,run_file_70 + + .end_save_file: + popad + ret + +;берет номер по порядку по указателю на структуру объекта +;output: +; eax - номер объекта +align 4 +proc get_obj_npp uses ebx ecx, p_obj_str:dword + mov ecx,2 + mov ebx,[p_obj_str] + + stdcall [tl_node_poi_get_info], tree2,0 + @@: + cmp eax,0 + je .no_exist + cmp eax,ebx + je @f + + inc ecx + stdcall [tl_node_poi_get_next_info], tree2,eax ;переходим к следущему узлу + jmp @b + .no_exist: ;когда идет ссылка на не существующий объект + xor ecx,ecx ;обнуляем указатель, что-бы не сохранять в файл мусор + @@: + mov eax,ecx + ret +endp + +;функция для сохранения созданного asm файла +align 4 +but_save_asm: + push edi + mov edi, tedit0 + + stdcall [ted_save_file],edi,run_file_70,[edit_sav.text] + cmp ted_err_save,0 + jne @f + stdcall [mb_create],msgbox_1,thread ;message: Файл был сохранен + @@: + pop edi + ret + +;функция для показа/скрытия невидимых символов +align 4 +but_show_invis: + push edi + mov edi,tedit0 + + xor ted_mode_invis,1 + cmp byte[show_mode],1 ;условие видимости текстового окна + jne @f + stdcall [ted_draw],edi + @@: + pop edi + ret + +; +align 4 +but_show_syntax: + push edi + mov edi,tedit0 + + xor ted_mode_color,1 + cmp byte[show_mode],1 ;условие видимости текстового окна + jne @f + stdcall [ted_draw],edi + @@: + pop edi + ret + +align 4 +ted_save_err_msg: + mov byte[msgbox_0.err],al + stdcall [mb_create],msgbox_0,thread ;message: Can-t save text file! + ret + +;функция вызываемая при нажатии Enter в окне tree2 +;обновляет текстовые поля значениями параметров взятых из объектов +;функция обратная к данной but_element_change +align 4 +on_file_object_select: + cmp byte[prop_wnd_run],0 + jne @f + mov byte[prop_wnd_run],1 + stdcall [tl_node_get_data], tree2 + mov dword[foc_obj],eax + cmp eax,0 + je @f + pushad + ;все действия по настройке элементов управления выполняются в окне со свойствами + mcall 51,1,prop_start,prop_thread + popad + @@: + ;call draw_window + ret + +;функция вызываемая при нажатии Enter в окне tree1 +;добавляет новый объект в окно tree2 +align 4 +on_add_object: +push eax ebx ecx + stdcall [tl_node_get_data], tree1 + cmp eax,0 + je @f + xor ecx,ecx + mov cx,word[eax+obj_opt.img-obj_opt] ;cx - индекс главной иконки добавляемого объекта + + cmp ecx,count_main_icons ;в старших битах ecx будут 0, потому отрицательные числа тоже проверяются + jl .end_0 + ;если иконки нет, по умолчанию берем 0-ю + xor cx,cx + .end_0: + + shl ecx,16 + stdcall mem_clear, u_object,sizeof.object + mov ebx,dword[eax] + mov dword[u_object.id],ebx + stdcall dword[tl_node_add], tree2,ecx,u_object ;добавляем объект + @@: +pop ecx ebx eax + call draw_window + ret + +align 4 +but_ctrl_o: + ret +align 4 +but_ctrl_n: + ret +align 4 +but_ctrl_s: + ret + +;открытие и распаковка файла подсветки синтаксиса +;input: +; ted_syntax_file - буфер для открываемого файла синтаксиса +; ted_syntax_file_size - размер открываемого файла синтаксиса +;output: +; ebx - число прочитанных байт из файла +align 4 +open_unpac_synt_file: +push eax edi esi + mov edi, tedit0 + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov ecx, ted_syntax_file_size + mov dword[run_file_70.Count], ecx + m2m dword[run_file_70.Buffer], ted_syntax_file + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mcall 70, run_file_70 + cmp ebx,-1 + jne .end_0 + ;если возникли ошибки при открытии файла синтаксиса + mov byte[txt_not_syntax_file.err],'0' + add byte[txt_not_syntax_file.err],al + notify_window_run txt_not_syntax_file ;Can-t open color options file! + jmp @f + .end_0: + + mov eax,ted_syntax_file + cmp dword[eax],'KPCK' + jne .end_unpack + + mov ecx,dword[eax+4] ;ecx - размер файла синтаксиса после распаковки + cmp dword[unpac_mem],0 + jne .end_1 + ;первоначальное выделение временной памяти для распаковки файла + stdcall mem.Alloc,ecx + mov [unpac_mem],eax + mov [unpac_mem_size],ecx + .end_1: + cmp dword[unpac_mem_size],ecx + jge .end_2 + ;если для распакованого файла не хватает временной памяти + stdcall mem.ReAlloc,[unpac_mem],ecx ;заново выделяем временную память + mov [unpac_mem],eax + mov [unpac_mem_size],ecx + .end_2: + + ;распаковка файла во временную память + stdcall unpack,ted_syntax_file,[unpac_mem] + + cmp ted_syntax_file_size,ecx + jge .end_3 + ;если для распакованого файла не хватает памяти + stdcall mem.ReAlloc,ted_syntax_file,ecx ;заново выделяем память + mov ted_syntax_file,eax + mov ted_syntax_file_size,ecx + .end_3: + + ;копирование распакованного файла из временной памяти в память элемента + mov edi,ted_syntax_file + mov esi,[unpac_mem] + cld + rep movsb + + .end_unpack: + ;применение файла подсветки + stdcall [ted_init_syntax_file], tedit0 + @@: +pop esi edi eax + ret + +align 4 +txt_not_syntax_file: + db 'Ошибка при открытии файла с цветовыми настройками! (Код ошибки =' + .err: db '?' + db ')',0 + +align 4 +buf_fon: ;фоновый буфер + dd 0 ;указатель на буфер изображения + dw 310 ;+4 left + dw 50 ;+6 top + dd 340 ;+8 w + dd 280 ;+12 h + dd 0xffffff ;+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_skin1: + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd SKIN_W1 ;+8 w + dd SKIN_H ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel +align 4 +buf_skin2: + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd SKIN_W2 ;+8 w + dd SKIN_H ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel +align 4 +buf_skin3: + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd SKIN_W3 ;+8 w + dd SKIN_H ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +show_mode db 0 ;режим для показа определенного окна +txtErrOpen db 'Не найден файл, проверьте правильность имени',0 +txtErrIni1 db 'Не открылся файл с опциями',0 +err_opn db 0 ;рез. открытия файла проэкта +err_ini0 db 0 ;рез. открытия файла с иконками +err_ini1 db 0 ;рез. открытия файла с опциями +unpac_mem dd 0 +unpac_mem_size dd 0 + +edit1 edit_box 210, 10, 5, 0xffffff, 0xff80, 0xff, 0xff0000, 0x4080, 300, ed_text1, mouse_dd, 0, 7, 7 + +edit2 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text2, mouse_dd, 0 +edit3 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text3, mouse_dd, 0 +edit4 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text4, mouse_dd, 0 +edit5 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text5, mouse_dd, 0 +edit6 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text6, mouse_dd, 0 +edit7 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text7, mouse_dd, 0 +edit8 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text8, mouse_dd, 0 +edit9 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text9, mouse_dd, 0 +edit10 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text10, mouse_dd, 0 +edit11 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text11, mouse_dd, 0 +edit12 edit_box 115, 32, 20, 0xffffff, 0x80ff, 0xff, 0x808080, 0, MAX_LEN_OBJ_TXT, ed_text12, mouse_dd, 0 +prop_wnd_edits_end: ;конец текстовых полей, отвечающих за свойства + +edit_sav edit_box 210, 310, 30, 0xffffff, 0xff80, 0xff, 0xff0000, 0x4080, 300, ed_text_sav, mouse_dd, 0 + + +ed_text1 db '/hd0/1/',0 + rb 295 +ed_text2 rb MAX_LEN_OBJ_TXT+2 +ed_text3 rb MAX_LEN_OBJ_TXT+2 +ed_text4 rb MAX_LEN_OBJ_TXT+2 +ed_text5 rb MAX_LEN_OBJ_TXT+2 +ed_text6 rb MAX_LEN_OBJ_TXT+2 +ed_text7 rb MAX_LEN_OBJ_TXT+2 +ed_text8 rb MAX_LEN_OBJ_TXT+2 +ed_text9 rb MAX_LEN_OBJ_TXT+2 +ed_text10 rb MAX_LEN_OBJ_TXT+2 +ed_text11 rb MAX_LEN_OBJ_TXT+2 +ed_text12 rb MAX_LEN_OBJ_TXT+2 +ed_text_sav rb 302 + +txt_null db 'null',0 +mouse_dd dd ? + +el_focus dd tree1 +;дерево со списком возможных типов объектов +tree1 tree_list sizeof.ObjOpt,20+2, tl_key_no_edit+tl_draw_par_line+tl_list_box_mode,\ + 16,16, 0xffffff,0xb0d0ff,0xd000ff, 5,50,125,280, 0,obj_opt.info-obj_opt,0, el_focus,\ + w_scr_t1,on_add_object +;дерево с объектами в пользовательском файле +tree2 tree_list sizeof.object,MAX_CED_OBJECTS+2, tl_draw_par_line,\ + 16,16, 0xffffff,0xb0d0ff,0xd000ff, 155,50,130,280, 13,u_object.txt-u_object,MAX_LEN_OBJ_TXT, el_focus,\ + w_scr_t2,on_file_object_select + +msgbox_0: + db 1,0 + db 'Warning',0 + db 'Error saving file!',13,\ + 'Maybe the file name is not entered correctly.',13,\ + ' (error code =' + .err: db '?' + db ')',0 + db 'Close',0 + db 0 + +msgbox_1: + db 1,0 + db ':)',0 + db 'File was saved',0 + db 'Ok',0 + db 0 + +struct TexSelect + x0 dd ? + y0 dd ? + x1 dd ? + y1 dd ? +ends +;------------------------------------------------------------------------------ +align 4 +tedit0: ;структура текстового редактора + .wnd BOX 310,50,325,260 ;+ 0 + .rec BOX 30,13,7,10 ;+16 + .drag_m db 0 ;+32 выделение от мыши + .drag_k db 0 ;+33 выделение от клавиатуры + .sel TexSelect 0,0,0,0 ;+34 структура выделения + .seln TexSelect ;+50 дополнительная структура выделения + .tex dd 0 ;+66 text memory pointer + .tex_1 dd 0 ;+70 text first symbol pointer + .tex_end dd 0 ;+74 text end memory pointer + .cur_x dd 0 ;+78 координата x курсора + .cur_y dd 0 ;+82 координата y курсора + .max_chars dd 25002 ;+86 максимальное число символов в одном документе + .count_colors_text dd 1 ;+90 колличество цветов текста + .count_key_words dd 0 ;+94 колличество ключевых слов + .color_cursor dd 0xff0000 ;+98 цвет курсора + .color_wnd_capt dd 0x0080c0 ;+102 цвет полей вокруг окна + .color_wnd_work dd 0x0 ;+106 цвет фона окна + .color_wnd_bord dd 0xffffff ;+110 цвет текста на полях + .color_select dd 0x0000ff ;+114 цвет выделения + .color_cur_text dd 0xffff00 ;+118 цвет символа под курсором + .color_wnd_text dd 0x80ffff ;+122 цвет текста в окне + .syntax_file dd 0 ;+126 указатель на начало файла синтаксиса + .syntax_file_size dd 55*1024 ;+130 максимальный размер файла синтаксиса + .text_colors dd 0 ;+134 указатель на массив цветов текста + .help_text_f1 dd 0 ;+138 указатель на текст справки (по нажатии F1) + .help_id dd -1 ;+142 идентификатор для справки + .key_words_data dd 0 ;+146 указатель на структуры ключевых слов TexColViv + .tim_ch dd ? ;+150 количество изменений в файле + .tim_undo dd ? ;+154 количество отмененных действий + .tim_ls dd ? ;+158 время последнего сохранения + .tim_co dd ? ;+162 время последней цветовой разметки + .el_focus dd el_focus ;+166 указатель на переменную элемента в фокусе + .err_save db 0 ;+170 ошибка сохранения файла + .panel_id db 0 ;+171 номер открытой панели + .key_new db 0 ;+172 символ, который будет добавлятся с клавиатуры + .symbol_new_line db 20 ;+173 символ завершения строки + .scr_w dd scrol_w1 ;+174 вертикальный скроллинг + .scr_h dd scrol_h1 ;+178 горизонтальный скроллинг + .arr_key_pos dd 0 ;+182 указатель на массив позиций ключевых слов + .buffer dd text_buffer ;+186 указатель на буфер копирования/вставки + .buffer_find dd 0 ;+190 указатель на буфер для поиска + .cur_ins db 1 ;+194 режим работы курсора (обычный или замена) + .mode_color db 1 ;+195 режим выделения слов цветом (0-выкл. 1-вкл.) + .mode_invis db 0 ;+196 режим показа непечатаемых символов + .gp_opt db 0 ;+197 опции возвращаемые функцией ted_get_pos_by_cursor + .fun_on_key_ctrl_o dd but_ctrl_o ;+198 указатель на функцию вызываемую при нажатии Ctrl+O (открытие файла) + .fun_on_key_ctrl_f dd 0 ;+202 ... Ctrl+F (вызова/скрытия панели поиска) + .fun_on_key_ctrl_n dd but_ctrl_n ;+206 ... Ctrl+N (создание нового документа) + .fun_on_key_ctrl_s dd 0 ;+210 ... Ctrl+S + .buffer_size dd BUF_SIZE ;+214 размер буфера копирования/вставки + .fun_find_err dd 0 ;+218 указатель на функцию вызываемую если поиск закончился неудачно + .fun_init_synt_err dd 0 ;+222 указатель на функцию вызываемую при ошибочном открытии файла синтаксиса + .fun_draw_panel_buttons dd 0 ;+226 указатель на функцию рисования панели с кнопками + .fun_draw_panel_find dd 0 ;+230 указатель на функцию рисования панели поиска + .fun_draw_panel_syntax dd 0 ;+234 указатель на функцию рисования панели синтаксиса + .fun_save_err dd ted_save_err_msg ;+238 указатель на функцию вызываемую если сохранение файла закончилось неудачно + .increase_size dd 1000 ;+242 число символов на которые будет увечиваться память при нехватке + .ptr_free_symb dd ? ;+246 указатель на свободную память, в которую можно добавлять символ (используется внутри элемента для ускорения вставки текста) +;------------------------------------------------------------------------------ +align 4 +scrol_w1: +.x: +.size_x dw 16 ;+0 +.start_x dw 85 ;+2 +.y: +.size_y dw 100 ; +4 +.start_y dw 15 ; +6 +.btn_high dd 15 ; +8 +.type dd 1 ;+12 +.max_area dd 100 ;+16 +rb 4+4 +.bckg_col dd 0xeeeeee ;+28 +.frnt_col dd 0xbbddff ;+32 +.line_col dd 0x808080 ;+36 +.redraw dd 0 ;+40 +.delta dw 0 ;+44 +.delta2 dw 0 ;+46 +.run_x: +rb 32 +.all_redraw dd 0 ;+80 +.ar_offset dd 1 ;+84 +;--------------------------------------------------------------------- +align 4 +scrol_h1: +.x: +.size_x dw 85 ;+0 +.start_x dw 30 ;+2 +.y: +.size_y dw 16 ;+4 +.start_y dw 100 ;+6 +.btn_high dd 15 ;+8 +.type dd 1 ;+12 +.max_area dd 100 ;+16 +rb 4+4 +.bckg_col dd 0xeeeeee ;+28 +.frnt_col dd 0xbbddff ;+32 +.line_col dd 0x808080 ;+36 +.redraw dd 0 ;+40 +.delta dw 0 ;+44 +.delta2 dw 0 ;+46 +.run_x: +rb 32 +.all_redraw dd 0 ;+80 +.ar_offset dd 1 ;+84 + + + +align 4 +w_scr_t1: +.size_x dw 16 ;+0 +rb 2+2+2 +.btn_high dd 15 ;+8 +.type dd 1 ;+12 +.max_area dd 100 ;+16 +rb 4+4 +.bckg_col dd 0xeeeeee ;+28 +.frnt_col dd 0xbbddff ;+32 +.line_col dd 0 ;+36 +rb 4+2+2 +.run_x: +rb 32 +.all_redraw dd 0 ;+80 +.ar_offset dd 1 ;+84 + +align 4 +w_scr_t2: +.size_x dw 16 ;+0 +rb 2+2+2 +.btn_high dd 15 ;+8 +.type dd 1 ;+12 +.max_area dd 100 ;+16 +rb 4+4 +.bckg_col dd 0xeeeeee ;+28 +.frnt_col dd 0xbbddff ;+32 +.line_col dd 0 ;+36 +rb 4+2+2 +.run_x: +rb 32 +.all_redraw dd 0 ;+80 +.ar_offset dd 1 ;+84 + +;данные для диалога открытия файлов +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 '/sys',0 + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_name: + db 'opendial',0 +communication_area_default_path: + db '/sys/File managers/',0 + +Filter: +dd Filter.end - Filter ;.1 +.1: +db 'CED',0 +db 'ASM',0 +.end: +db 0 + + +data_of_code dd 0 +sc system_colors + +image_data dd 0 ;память для преобразования картинки функциями libimg + +text_buffer db BUF_SIZE dup(0) +fn_obj_opt db 'ob_o.opt',0 +obj_opt ObjOpt + rb sizeof.ObjOpt*(MAX_OBJ_TYPES-1)+MAX_OBJ_CAPTIONS + db 0 ;eof options + +cur_x dd 0 +cur_y dd 0 +foc_obj dd 0 ;объект в фокусе +obj_count_txt_props dd 0 ;количество используемых текстовых свойств +obj_m_win dd 0 ;структура главного окна + + system_dir0 db '/sys/lib/' + lib0_name db 'box_lib.obj',0 + + system_dir1 db '/sys/lib/' + lib1_name db 'proc_lib.obj',0 + + system_dir2 db '/sys/lib/' + lib2_name db 'buf2d.obj',0 + + system_dir3 db '/sys/lib/' + lib3_name db 'libimg.obj',0 + + system_dir4 db '/sys/lib/' + lib4_name db 'msgbox.obj',0 + +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_rect_by_size dd sz_buf2d_rect_by_size + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + ;buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + ;buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + ;buf2d_crop_color dd sz_buf2d_crop_color + buf2d_offset_h dd sz_buf2d_offset_h +dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 ;рисование прямоугольника, 2-я координата задана по размеру + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + ;sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + ;sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + ;sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + +align 4 +import_box_lib: + dd alib_init2 + + edit_box_draw dd aEdit_box_draw + edit_box_key dd aEdit_box_key + edit_box_mouse dd aEdit_box_mouse + edit_box_set_text dd aEdit_box_set_text + + init_checkbox dd aInit_checkbox + check_box_draw dd aCheck_box_draw + check_box_mouse dd aCheck_box_mouse + + scrollbar_ver_draw dd aScrollbar_ver_draw + scrollbar_hor_draw dd aScrollbar_hor_draw + + 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_node_move_up dd sz_tl_node_move_up + tl_node_move_down dd sz_tl_node_move_down + 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_poi_get_info dd sz_tl_node_poi_get_info + tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info + tl_node_poi_get_data dd sz_tl_node_poi_get_data + + ted_but_sumb_upper dd sz_ted_but_sumb_upper + ted_but_sumb_lover dd sz_ted_but_sumb_lover + ted_can_save dd sz_ted_can_save + ted_clear dd sz_ted_clear + ted_delete dd sz_ted_delete + ted_draw dd sz_ted_draw + ted_init dd sz_ted_init + ted_init_scroll_bars dd sz_ted_init_scroll_bars + ted_init_syntax_file dd sz_ted_init_syntax_file + ted_is_select dd sz_ted_is_select + ted_key dd sz_ted_key + ted_mouse dd sz_ted_mouse + ted_open_file dd sz_ted_open_file + ted_save_file dd sz_ted_save_file + ted_text_add dd sz_ted_text_add + ted_but_select_word dd sz_ted_but_select_word + ted_but_cut dd sz_ted_but_cut + ted_but_copy dd sz_ted_but_copy + ted_but_paste dd sz_ted_but_paste + ted_but_undo dd sz_ted_but_undo + ted_but_redo dd sz_ted_but_redo + ted_but_reverse dd sz_ted_but_reverse + ted_but_find dd sz_ted_but_find + ted_text_colored dd sz_ted_text_colored + ;version_text_edit dd sz_ted_version + +dd 0,0 + + alib_init2 db 'lib_init',0 + + aEdit_box_draw db 'edit_box_draw',0 + aEdit_box_key db 'edit_box_key',0 + aEdit_box_mouse db 'edit_box_mouse',0 + aEdit_box_set_text db 'edit_box_set_text',0 + + aInit_checkbox db 'init_checkbox2',0 + aCheck_box_draw db 'check_box_draw2',0 + aCheck_box_mouse db 'check_box_mouse2',0 + + aScrollbar_ver_draw db 'scrollbar_v_draw',0 + aScrollbar_hor_draw db 'scrollbar_h_draw',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_node_move_up db 'tl_node_move_up',0 + sz_tl_node_move_down db 'tl_node_move_down',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_poi_get_info db 'tl_node_poi_get_info',0 + sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0 + sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0 + + sz_ted_but_sumb_upper db 'ted_but_sumb_upper',0 + sz_ted_but_sumb_lover db 'ted_but_sumb_lover',0 + sz_ted_can_save db 'ted_can_save',0 + sz_ted_clear db 'ted_clear',0 + sz_ted_delete db 'ted_delete',0 + sz_ted_draw db 'ted_draw',0 + sz_ted_init db 'ted_init',0 + sz_ted_init_scroll_bars db 'ted_init_scroll_bars',0 + sz_ted_init_syntax_file db 'ted_init_syntax_file',0 + sz_ted_is_select db 'ted_is_select',0 + sz_ted_key db 'ted_key',0 + sz_ted_mouse db 'ted_mouse',0 + sz_ted_open_file db 'ted_open_file',0 + sz_ted_save_file db 'ted_save_file',0 + sz_ted_text_add db 'ted_text_add',0 + sz_ted_but_select_word db 'ted_but_select_word',0 + sz_ted_but_cut db 'ted_but_cut',0 + sz_ted_but_copy db 'ted_but_copy',0 + sz_ted_but_paste db 'ted_but_paste',0 + sz_ted_but_undo db 'ted_but_undo',0 + sz_ted_but_redo db 'ted_but_redo',0 + sz_ted_but_reverse db 'ted_but_reverse',0 + sz_ted_but_find db 'ted_but_find',0 + sz_ted_text_colored db 'ted_text_colored',0 + ;sz_ted_version db 'version_text_edit',0 + +align 4 +import_proc_lib: + OpenDialog_Init dd aOpenDialog_Init + OpenDialog_Start dd aOpenDialog_Start +dd 0,0 + aOpenDialog_Init db 'OpenDialog_init',0 + aOpenDialog_Start db 'OpenDialog_start',0 + +align 4 +import_libimg: + 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 +import_msgbox_lib: + mb_create dd amb_create + mb_reinit dd amb_reinit + mb_setfunctions dd amb_setfunctions +dd 0,0 + amb_create db 'mb_create',0 + amb_reinit db 'mb_reinit',0 + amb_setfunctions db 'mb_setfunctions',0 + +;library structures +l_libs_start: + lib0 l_libs lib0_name, library_path, system_dir0, import_box_lib + lib1 l_libs lib1_name, library_path, system_dir1, import_proc_lib + lib2 l_libs lib2_name, library_path, system_dir2, import_buf2d_lib + lib3 l_libs lib3_name, library_path, system_dir3, import_libimg + lib4 l_libs lib4_name, library_path, system_dir4, import_msgbox_lib +load_lib_end: + + +align 16 +run_file_70 FileInfoBlock +open_b rb 560 + +IncludeIGlobals +i_end: +IncludeUGlobals + procinfo process_information + buf_cmd_lin rb 1024 + file_name rb 1024 ;icon file path + fp_obj_opt rb 1024 ;obj options file patch + rb 1024 + prop_thread: + rb 1024 + thread: ;вверху дочерний стек для окна сообщения + rb 1024 +stacktop: ;вверху стек основной программы + sys_path rb 1024 + library_path rb 1024 + plugin_path rb 4096 + openfile_path rb 4096 + filename_area rb 256 +mem: diff --git a/programs/develop/libraries/box_lib/trunk/Tupfile.lua b/programs/develop/libraries/box_lib/Tupfile.lua similarity index 100% rename from programs/develop/libraries/box_lib/trunk/Tupfile.lua rename to programs/develop/libraries/box_lib/Tupfile.lua diff --git a/programs/develop/libraries/box_lib/asm/trunk/Tupfile.lua b/programs/develop/libraries/box_lib/asm/Tupfile.lua similarity index 100% rename from programs/develop/libraries/box_lib/asm/trunk/Tupfile.lua rename to programs/develop/libraries/box_lib/asm/Tupfile.lua diff --git a/programs/develop/libraries/box_lib/asm/trunk/build.bat b/programs/develop/libraries/box_lib/asm/build.bat similarity index 100% rename from programs/develop/libraries/box_lib/asm/trunk/build.bat rename to programs/develop/libraries/box_lib/asm/build.bat diff --git a/programs/develop/libraries/box_lib/asm/trunk/build.sh b/programs/develop/libraries/box_lib/asm/build.sh similarity index 100% rename from programs/develop/libraries/box_lib/asm/trunk/build.sh rename to programs/develop/libraries/box_lib/asm/build.sh diff --git a/programs/develop/libraries/box_lib/asm/trunk/ctrldemo.asm b/programs/develop/libraries/box_lib/asm/ctrldemo.asm similarity index 94% rename from programs/develop/libraries/box_lib/asm/trunk/ctrldemo.asm rename to programs/develop/libraries/box_lib/asm/ctrldemo.asm index 062a457fd..66ddf5177 100644 --- a/programs/develop/libraries/box_lib/asm/trunk/ctrldemo.asm +++ b/programs/develop/libraries/box_lib/asm/ctrldemo.asm @@ -1,422 +1,424 @@ -;***************************************************************************** -; Example for Box_lib: scrollbar, menubar, dinamic_button -; Copyright (c) 2009, Marat Zakiyanov aka Mario79, aka Mario -; All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in the -; documentation and/or other materials provided with the distribution. -; * Neither the name of the nor the -; names of its contributors may be used to endorse or promote products -; derived from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY -; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;****************************************************************************** -; import_boxlib procedure written by -;--------------------------------------------------------------------- - - use32 - org 0 - - db 'MENUET01' - dd 1 - dd START - dd IM_END - dd I_END - dd stacktop - dd 0 - dd path - -include '../../../../../macros.inc' -include '../../../../../KOSfuncs.inc' -include '../../../../../load_lib.mac' -@use_library - -;--------------------------------------------------------------------- -;--- Start of program ---------------------------------------------- -;--------------------------------------------------------------------- -START: - mcall 68,11 - mcall 66,1,1 - mcall 40,0x27 -;--------------------------------------------------------------------- - -load_libraries l_libs_start,end_l_libs - - test eax,eax - jnz button.exit - -; unpack deflate - mov eax,[unpack_DeflateUnpack2] - mov [deflate_unpack],eax - -; OpenDialog initialisation - push dword OpenDialog_data - call [OpenDialog_Init] - - mov edi,filename_area - mov esi,start_temp_file_name - xor eax,eax - cld -@@: - lodsb - stosb - test eax,eax - jnz @b - - -; mov ebx,icons_file_name -; mov esi,path -; mov edi,file_name - - copy_path icons_file_name,path,library_path,0 - - mcall 70,fileinfo - - mov [fileinfo+0],dword 0 - - mov ecx,[file_info+32] - mov [fileinfo+12],ecx - mov [img_size],ecx - - - mcall 68,12 - - - mov [fileinfo+16],eax - mov [image_file],eax - - - mcall 70,fileinfo - - xor eax,eax - mov [return_code],eax -; mov eax,image_file - push image_file - call [cnv_png_import.Start] - - mov ecx,[image_file] - mcall 68,13, - - cmp [return_code],dword 0 - jne button.exit - - mov ebx,[raw_pointer] - mov eax,[ebx+4] -; set of button size - mov [dinamic_button_data_1.size_x],ax - mov [dinamic_button_data_1.size_y],ax - mov [dinamic_button_data_2.size_x],ax - mov [dinamic_button_data_2.size_y],ax - mov eax,[ebx+12] -; set of RAW resolution to pixel - mov [dinamic_button_data_1.resolution_raw],eax - mov [dinamic_button_data_2.resolution_raw],eax - mov eax,[ebx+20] - add eax,ebx -; set RAW palette, use else resolution 8bit or less - mov [dinamic_button_data_1.palette_raw],eax - mov [dinamic_button_data_2.palette_raw],eax - mov eax,[ebx+28] - add eax,ebx -; set RAW area for passive button - mov [dinamic_button_data_1.passive_raw],eax - mov [dinamic_button_data_2.passive_raw],eax - mov ecx,[ebx+4] - imul ecx,[ebx+4] - imul ecx,[ebx+12] - shr ecx,3 - add eax,ecx -; set RAW area for active button - mov [dinamic_button_data_1.active_raw],eax - mov [dinamic_button_data_2.active_raw],eax - add eax,ecx -; RAW area for click button - mov [dinamic_button_data_1.click_raw],eax - mov [dinamic_button_data_2.click_raw],eax -;--------------------------------------------------------------------- -red: - call draw_window -still: - mcall 10 - - cmp eax,1 - je red - cmp eax,2 - je key - cmp eax,3 - je button - cmp eax,6 - je mouse - jmp still -;--------------------------------------------------------------------- - key: - mcall 2 - jmp still -;--------------------------------------------------------------------- - button: - mcall 17 - cmp ah,1 - jne still - .exit: - mcall -1 -;--------------------------------------------------------------------- -mouse: -;----------------------------------------------- - cmp [scroll_bar_data_horizontal.delta2],0 - jne .horizontal -.vertical: - mov eax,[scroll_bar_data_vertical.max_area] - cmp eax,[scroll_bar_data_vertical.cur_area] - jbe .horizontal -; mouse event for Vertical ScrollBar - push dword scroll_bar_data_vertical - call [scrollbar_ver_mouse] - mov eax,scroll_bar_data_vertical.redraw - xor ebx,ebx - cmp [eax],ebx - je @f - mov [eax],ebx - jmp .draw_cube -@@: - cmp [scroll_bar_data_vertical.delta2],0 - jne still -.horizontal: - mov eax,[scroll_bar_data_horizontal.max_area] - cmp eax,[scroll_bar_data_horizontal.cur_area] - jbe .other -; mouse event for Horizontal ScrollBar - push dword scroll_bar_data_horizontal - call [scrollbar_hor_mouse] - mov eax,scroll_bar_data_horizontal.redraw - xor ebx,ebx - cmp [eax],ebx - je .other - mov [eax],ebx -.draw_cube: - call draw_cube - jmp still -.other: - cmp [scroll_bar_data_vertical.delta2],0 - jne still - cmp [scroll_bar_data_horizontal.delta2],0 - jne still -;----------------------------------------------- -.menu_bar_1: - call .set_mouse_flag -@@: -; mouse event for Menu 1 - push dword menu_data_1 - call [menu_bar_mouse] - cmp [menu_data_1.click],dword 1 - jne .menu_bar_2 - cmp [menu_data_1.cursor_out],dword 0 - jne analyse_out_menu_1 - jmp .menu_bar_1 -;-------------------------------------------- -.menu_bar_2: -; mouse event for Menu 2 - push dword menu_data_2 - call [menu_bar_mouse] - cmp [menu_data_2.click],dword 1 - jne .mouse_dinamic_button - cmp [menu_data_2.cursor_out],dword 0 - jne analyse_out_menu_2 - jmp .menu_bar_1 -;-------------------------------------------- -.mouse_dinamic_button: -; mouse event for Dinamic Button 1 - push dword dinamic_button_data_1 - call [dinamic_button_mouse] - mov eax,dinamic_button_data_1.click - cmp [eax],dword 1 - jne @f - mov [eax],dword 0 - jmp about -@@: -; mouse event for Dinamic Button 2 - push dword dinamic_button_data_2 - call [dinamic_button_mouse] - mov eax,dinamic_button_data_2.click - cmp [eax],dword 1 - jne still ;@f - mov [eax],dword 0 - jmp button.exit -;--------------------------------------------------------------------- -.set_mouse_flag: - xor eax,eax - inc eax - mov [menu_data_1.get_mouse_flag],eax - mov [menu_data_2.get_mouse_flag],eax - ret -;--------------------------------------------------------------------- -analyse_out_menu_1: -; analyse result of Menu 1 - mov eax,[menu_data_1.cursor_out] - cmp eax,dword 1 - je OpenDialog_start_0 - cmp eax,dword 2 - je OpenDialog_start_1 - cmp eax,dword 3 - je OpenDialog_start_2 - cmp eax,dword 4 - je button.exit - jmp still -;--------------------------------------------------------------------- -analyse_out_menu_2: -; analyse result of Menu 2 - cmp [menu_data_2.cursor_out],dword 2 - je about - jmp still -;--------------------------------------------------------------------- - about: - mcall 51,1,thread3,thread - jmp still -;--------------------------------------------------------------------- -OpenDialog_start_0: - mov [OpenDialog_data.type],0 - jmp OpenDialog_start -OpenDialog_start_1: - mov [OpenDialog_data.type],1 - jmp OpenDialog_start -OpenDialog_start_2: - mov [OpenDialog_data.type],2 -OpenDialog_start: -; mov ebx,open_dialog_name -; mov esi,path -; mov edi,library_path -; call copy_file_path - -; copy_path open_dialog_name,path,library_path,0 - - push dword OpenDialog_data - call [OpenDialog_Start] - - cmp [OpenDialog_data.status],2 ; OpenDialog does not start - je still ; some kind of alternative, instead OpenDialog - cmp [OpenDialog_data.status],1 - jne still ; OpenDialog user say cancel -; copy path -; prepare path - PathShow - push dword PathShow_data_1 - call [PathShow_prepare] - - call draw_window - jmp still ; OpenDialog user selected the target file -; [OpenDialog_data.openfile_pach] pointer of area the target file -;--------------------------------------------------------------------- -;--------------------------------------------------------------------- -draw_window: - mcall 12,1 - mcall 0,<0,400>,<0,400>,0x03AABBCC,0x805080D0,0x005080D0 - mcall 71,1,header_1 -;--------------------------------------------- -; draw for Menu 1 - push dword menu_data_1 - call [menu_bar_draw] -; draw for Menu 2 - push dword menu_data_2 - call [menu_bar_draw] -;--------------------------------------------- -; draw for Dinamic Button 1 - push dword dinamic_button_data_1 - call [dinamic_button_draw] -; draw for Dinamic Button 2 - push dword dinamic_button_data_2 - call [dinamic_button_draw] -;--------------------------------------------- - mcall 13,<170,200>,<25,15>,0xffffb0 -; mov bx,28 -; add ebx,2 shl 16 -; mcall 4,,0xC0000000,text_work_area,,0xffffb0 -; draw for PathShow - push dword PathShow_data_1 - call [PathShow_draw] -;--------------------------------------------- -; set all_redraw flag for draw all ScrollBar -; In some cases it is necessity to draw only the area -; of moving of a "runner", for acceleration of output - -; in this case the flag needs to be reset to 0 (zero). - xor eax,eax - inc eax - mov [scroll_bar_data_vertical.all_redraw],eax - mov [scroll_bar_data_horizontal.all_redraw],eax - -; draw for Vertical ScrollBar - push dword scroll_bar_data_vertical - call [scrollbar_ver_draw] -; draw for Horizontal ScrollBar - push dword scroll_bar_data_horizontal - call [scrollbar_hor_draw] -; reset all_redraw flag - xor eax,eax - mov [scroll_bar_data_vertical.all_redraw],eax - mov [scroll_bar_data_horizontal.all_redraw],eax -;--------------------------------------------- - call draw_cube - mcall 12,2 - ret -;--------------------------------------------------------------------- -draw_cube: - mcall 13,<30,301>,<50,301>,0xafafaf - mov ecx,[scroll_bar_data_vertical.position] - add ecx,50 - shl ecx,16 - mov cx,30 - mov ebx,[scroll_bar_data_horizontal.position] - add ebx,30 - shl ebx,16 - mov bx,30 - mcall 13,,,0x0 - ret -;--------------------------------------------------------------------- -include 'data.inc' -include 'w_about.inc' -;--------------------------------------------------------------------- -IM_END: - rb 1024 -thread: -;--------------------------------------------------------------------- - rb 1024 -stacktop: -;--------------------------------------------------------------------- -path: - rb 4096 -;--------------------------------------------------------------------- -openfile_pach: - rb 4096 -;--------------------------------------------------------------------- -file_name: -library_path: - rb 4096 -;--------------------------------------------------------------------- -plugin_pach: - rb 4096 -;--------------------------------------------------------------------- -text_work_area: - rb 4096 -;--------------------------------------------------------------------- -filename_area: - rb 256 -;--------------------------------------------------------------------- -file_info: - rb 40 -;--------------------------------------------------------------------- -procinfo: - rb 1024 -;--------------------------------------------------------------------- -I_END: - +; SPDX-License-Identifier: NOASSERTION +; + +;***************************************************************************** +; Example for Box_lib: scrollbar, menubar, dinamic_button +; Copyright (c) 2009, Marat Zakiyanov aka Mario79, aka Mario +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; * Neither the name of the nor the +; names of its contributors may be used to endorse or promote products +; derived from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY +; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +;****************************************************************************** +; import_boxlib procedure written by +;--------------------------------------------------------------------- + + use32 + org 0 + + db 'MENUET01' + dd 1 + dd START + dd IM_END + dd I_END + dd stacktop + dd 0 + dd path + +include '../../../../macros.inc' +include '../../../../KOSfuncs.inc' +include '../../../../load_lib.mac' +@use_library + +;--------------------------------------------------------------------- +;--- Start of program ---------------------------------------------- +;--------------------------------------------------------------------- +START: + mcall 68,11 + mcall 66,1,1 + mcall 40,0x27 +;--------------------------------------------------------------------- + +load_libraries l_libs_start,end_l_libs + + test eax,eax + jnz button.exit + +; unpack deflate + mov eax,[unpack_DeflateUnpack2] + mov [deflate_unpack],eax + +; OpenDialog initialisation + push dword OpenDialog_data + call [OpenDialog_Init] + + mov edi,filename_area + mov esi,start_temp_file_name + xor eax,eax + cld +@@: + lodsb + stosb + test eax,eax + jnz @b + + +; mov ebx,icons_file_name +; mov esi,path +; mov edi,file_name + + copy_path icons_file_name,path,library_path,0 + + mcall 70,fileinfo + + mov [fileinfo+0],dword 0 + + mov ecx,[file_info+32] + mov [fileinfo+12],ecx + mov [img_size],ecx + + + mcall 68,12 + + + mov [fileinfo+16],eax + mov [image_file],eax + + + mcall 70,fileinfo + + xor eax,eax + mov [return_code],eax +; mov eax,image_file + push image_file + call [cnv_png_import.Start] + + mov ecx,[image_file] + mcall 68,13, + + cmp [return_code],dword 0 + jne button.exit + + mov ebx,[raw_pointer] + mov eax,[ebx+4] +; set of button size + mov [dinamic_button_data_1.size_x],ax + mov [dinamic_button_data_1.size_y],ax + mov [dinamic_button_data_2.size_x],ax + mov [dinamic_button_data_2.size_y],ax + mov eax,[ebx+12] +; set of RAW resolution to pixel + mov [dinamic_button_data_1.resolution_raw],eax + mov [dinamic_button_data_2.resolution_raw],eax + mov eax,[ebx+20] + add eax,ebx +; set RAW palette, use else resolution 8bit or less + mov [dinamic_button_data_1.palette_raw],eax + mov [dinamic_button_data_2.palette_raw],eax + mov eax,[ebx+28] + add eax,ebx +; set RAW area for passive button + mov [dinamic_button_data_1.passive_raw],eax + mov [dinamic_button_data_2.passive_raw],eax + mov ecx,[ebx+4] + imul ecx,[ebx+4] + imul ecx,[ebx+12] + shr ecx,3 + add eax,ecx +; set RAW area for active button + mov [dinamic_button_data_1.active_raw],eax + mov [dinamic_button_data_2.active_raw],eax + add eax,ecx +; RAW area for click button + mov [dinamic_button_data_1.click_raw],eax + mov [dinamic_button_data_2.click_raw],eax +;--------------------------------------------------------------------- +red: + call draw_window +still: + mcall 10 + + cmp eax,1 + je red + cmp eax,2 + je key + cmp eax,3 + je button + cmp eax,6 + je mouse + jmp still +;--------------------------------------------------------------------- + key: + mcall 2 + jmp still +;--------------------------------------------------------------------- + button: + mcall 17 + cmp ah,1 + jne still + .exit: + mcall -1 +;--------------------------------------------------------------------- +mouse: +;----------------------------------------------- + cmp [scroll_bar_data_horizontal.delta2],0 + jne .horizontal +.vertical: + mov eax,[scroll_bar_data_vertical.max_area] + cmp eax,[scroll_bar_data_vertical.cur_area] + jbe .horizontal +; mouse event for Vertical ScrollBar + push dword scroll_bar_data_vertical + call [scrollbar_ver_mouse] + mov eax,scroll_bar_data_vertical.redraw + xor ebx,ebx + cmp [eax],ebx + je @f + mov [eax],ebx + jmp .draw_cube +@@: + cmp [scroll_bar_data_vertical.delta2],0 + jne still +.horizontal: + mov eax,[scroll_bar_data_horizontal.max_area] + cmp eax,[scroll_bar_data_horizontal.cur_area] + jbe .other +; mouse event for Horizontal ScrollBar + push dword scroll_bar_data_horizontal + call [scrollbar_hor_mouse] + mov eax,scroll_bar_data_horizontal.redraw + xor ebx,ebx + cmp [eax],ebx + je .other + mov [eax],ebx +.draw_cube: + call draw_cube + jmp still +.other: + cmp [scroll_bar_data_vertical.delta2],0 + jne still + cmp [scroll_bar_data_horizontal.delta2],0 + jne still +;----------------------------------------------- +.menu_bar_1: + call .set_mouse_flag +@@: +; mouse event for Menu 1 + push dword menu_data_1 + call [menu_bar_mouse] + cmp [menu_data_1.click],dword 1 + jne .menu_bar_2 + cmp [menu_data_1.cursor_out],dword 0 + jne analyse_out_menu_1 + jmp .menu_bar_1 +;-------------------------------------------- +.menu_bar_2: +; mouse event for Menu 2 + push dword menu_data_2 + call [menu_bar_mouse] + cmp [menu_data_2.click],dword 1 + jne .mouse_dinamic_button + cmp [menu_data_2.cursor_out],dword 0 + jne analyse_out_menu_2 + jmp .menu_bar_1 +;-------------------------------------------- +.mouse_dinamic_button: +; mouse event for Dinamic Button 1 + push dword dinamic_button_data_1 + call [dinamic_button_mouse] + mov eax,dinamic_button_data_1.click + cmp [eax],dword 1 + jne @f + mov [eax],dword 0 + jmp about +@@: +; mouse event for Dinamic Button 2 + push dword dinamic_button_data_2 + call [dinamic_button_mouse] + mov eax,dinamic_button_data_2.click + cmp [eax],dword 1 + jne still ;@f + mov [eax],dword 0 + jmp button.exit +;--------------------------------------------------------------------- +.set_mouse_flag: + xor eax,eax + inc eax + mov [menu_data_1.get_mouse_flag],eax + mov [menu_data_2.get_mouse_flag],eax + ret +;--------------------------------------------------------------------- +analyse_out_menu_1: +; analyse result of Menu 1 + mov eax,[menu_data_1.cursor_out] + cmp eax,dword 1 + je OpenDialog_start_0 + cmp eax,dword 2 + je OpenDialog_start_1 + cmp eax,dword 3 + je OpenDialog_start_2 + cmp eax,dword 4 + je button.exit + jmp still +;--------------------------------------------------------------------- +analyse_out_menu_2: +; analyse result of Menu 2 + cmp [menu_data_2.cursor_out],dword 2 + je about + jmp still +;--------------------------------------------------------------------- + about: + mcall 51,1,thread3,thread + jmp still +;--------------------------------------------------------------------- +OpenDialog_start_0: + mov [OpenDialog_data.type],0 + jmp OpenDialog_start +OpenDialog_start_1: + mov [OpenDialog_data.type],1 + jmp OpenDialog_start +OpenDialog_start_2: + mov [OpenDialog_data.type],2 +OpenDialog_start: +; mov ebx,open_dialog_name +; mov esi,path +; mov edi,library_path +; call copy_file_path + +; copy_path open_dialog_name,path,library_path,0 + + push dword OpenDialog_data + call [OpenDialog_Start] + + cmp [OpenDialog_data.status],2 ; OpenDialog does not start + je still ; some kind of alternative, instead OpenDialog + cmp [OpenDialog_data.status],1 + jne still ; OpenDialog user say cancel +; copy path +; prepare path - PathShow + push dword PathShow_data_1 + call [PathShow_prepare] + + call draw_window + jmp still ; OpenDialog user selected the target file +; [OpenDialog_data.openfile_pach] pointer of area the target file +;--------------------------------------------------------------------- +;--------------------------------------------------------------------- +draw_window: + mcall 12,1 + mcall 0,<0,400>,<0,400>,0x03AABBCC,0x805080D0,0x005080D0 + mcall 71,1,header_1 +;--------------------------------------------- +; draw for Menu 1 + push dword menu_data_1 + call [menu_bar_draw] +; draw for Menu 2 + push dword menu_data_2 + call [menu_bar_draw] +;--------------------------------------------- +; draw for Dinamic Button 1 + push dword dinamic_button_data_1 + call [dinamic_button_draw] +; draw for Dinamic Button 2 + push dword dinamic_button_data_2 + call [dinamic_button_draw] +;--------------------------------------------- + mcall 13,<170,200>,<25,15>,0xffffb0 +; mov bx,28 +; add ebx,2 shl 16 +; mcall 4,,0xC0000000,text_work_area,,0xffffb0 +; draw for PathShow + push dword PathShow_data_1 + call [PathShow_draw] +;--------------------------------------------- +; set all_redraw flag for draw all ScrollBar +; In some cases it is necessity to draw only the area +; of moving of a "runner", for acceleration of output - +; in this case the flag needs to be reset to 0 (zero). + xor eax,eax + inc eax + mov [scroll_bar_data_vertical.all_redraw],eax + mov [scroll_bar_data_horizontal.all_redraw],eax + +; draw for Vertical ScrollBar + push dword scroll_bar_data_vertical + call [scrollbar_ver_draw] +; draw for Horizontal ScrollBar + push dword scroll_bar_data_horizontal + call [scrollbar_hor_draw] +; reset all_redraw flag + xor eax,eax + mov [scroll_bar_data_vertical.all_redraw],eax + mov [scroll_bar_data_horizontal.all_redraw],eax +;--------------------------------------------- + call draw_cube + mcall 12,2 + ret +;--------------------------------------------------------------------- +draw_cube: + mcall 13,<30,301>,<50,301>,0xafafaf + mov ecx,[scroll_bar_data_vertical.position] + add ecx,50 + shl ecx,16 + mov cx,30 + mov ebx,[scroll_bar_data_horizontal.position] + add ebx,30 + shl ebx,16 + mov bx,30 + mcall 13,,,0x0 + ret +;--------------------------------------------------------------------- +include 'data.inc' +include 'w_about.inc' +;--------------------------------------------------------------------- +IM_END: + rb 1024 +thread: +;--------------------------------------------------------------------- + rb 1024 +stacktop: +;--------------------------------------------------------------------- +path: + rb 4096 +;--------------------------------------------------------------------- +openfile_pach: + rb 4096 +;--------------------------------------------------------------------- +file_name: +library_path: + rb 4096 +;--------------------------------------------------------------------- +plugin_pach: + rb 4096 +;--------------------------------------------------------------------- +text_work_area: + rb 4096 +;--------------------------------------------------------------------- +filename_area: + rb 256 +;--------------------------------------------------------------------- +file_info: + rb 40 +;--------------------------------------------------------------------- +procinfo: + rb 1024 +;--------------------------------------------------------------------- +I_END: diff --git a/programs/develop/libraries/box_lib/asm/trunk/data.inc b/programs/develop/libraries/box_lib/asm/data.inc similarity index 100% rename from programs/develop/libraries/box_lib/asm/trunk/data.inc rename to programs/develop/libraries/box_lib/asm/data.inc diff --git a/programs/develop/libraries/box_lib/asm/trunk/editbox_ex.asm b/programs/develop/libraries/box_lib/asm/editbox_ex.asm similarity index 94% rename from programs/develop/libraries/box_lib/asm/trunk/editbox_ex.asm rename to programs/develop/libraries/box_lib/asm/editbox_ex.asm index 50942dd7d..0305f454f 100644 --- a/programs/develop/libraries/box_lib/asm/trunk/editbox_ex.asm +++ b/programs/develop/libraries/box_lib/asm/editbox_ex.asm @@ -1,194 +1,200 @@ -;заголовок приложения -use32 ; транслятор, использующий 32 разрядных команды - org 0 ; базовый адрес кода, всегда 0 - db 'MENUET01' ; идентификатор исполняемого файла (8 байт) - dd 1 ; версия формата заголовка исполняемого файла - dd start ; адрес, на который система передаёт управление - ; после загрузки приложения в память - dd i_end ; размер приложения - dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта - dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше - dd 0 ; указатель на строку с параметрами. - dd cur_dir_path ; указатель на адрес, куда помещается строка, содержащая путь до программы в момент запуска. - -include '../../../../../macros.inc' -include '../../trunk/box_lib.mac' -include '../../../../../KOSfuncs.inc' -include '../../../../../load_lib.mac' - @use_library ;use load lib macros -start: -;universal load library/librarys -sys_load_library library_name, library_path, system_path, myimport -;if return code =-1 then exit, else nornary work - cmp eax,-1 - jz exit - mcall SF_SET_EVENTS_MASK,0x80000027 ;установить маску для ожидаемых событий - - push dword check1 ;подсчёт дины текста для Checkbox'ов - call [init_checkbox] - - push dword check2 - call [init_checkbox] - -red_win: - call draw_window ;первоначально необходимо нарисовать окно -align 4 -still: ;основной обработчик - mcall SF_WAIT_EVENT - dec eax - jz red_win - dec eax - jz key - dec eax - jz button - - push dword edit1 - call [edit_box_mouse] - - push dword edit2 - call [edit_box_mouse] - - push dword check1 - call [check_box_mouse] - - push dword check2 - call [check_box_mouse] - - push dword Option_boxs - call [option_box_mouse] - - push dword Option_boxs2 - call [option_box_mouse] - - jmp still ;если ничего из перечисленного то снова в цикл -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -button: - mcall SF_GET_BUTTON - test ah,ah ;если в ah 0, то перейти на обработчик событий still - jz still -exit: - mcall SF_TERMINATE_PROCESS -key: - mcall SF_GET_KEY - - push dword edit1 - call [edit_box_key] - - push dword edit2 - call [edit_box_key] - - jmp still - -;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -align 4 -draw_window: ;рисование окна приложения - mcall SF_REDRAW, SSF_BEGIN_DRAW - mcall SF_CREATE_WINDOW,(50*65536+390),(30*65536+200),0x33AABBCC,0x805080DD,hed - - push dword edit1 - call [edit_box_draw] - - push dword edit2 - call [edit_box_draw] - - push dword check1 - call [check_box_draw] - - push dword check2 - call [check_box_draw] - - push dword Option_boxs - call [option_box_draw] - - push dword Option_boxs2 - call [option_box_draw] - - mcall SF_REDRAW, SSF_END_DRAW - ret -;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -;DATA данные -;Всегда соблюдать последовательность в имени. -system_path db '/sys/lib/' -library_name db 'box_lib.obj',0 -; Если есть желание разъединить, то нужно использовать следующию конструкцию -;system_path db '/sys/lib/box_lib.obj',0 -;... любая последовательность других команд и определений. -;library_name db 'box_lib.obj',0 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -myimport: - -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 - -init_checkbox dd aInit_checkbox -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 - - dd 0,0 - -aEdit_box_draw db 'edit_box_draw',0 -aEdit_box_key db 'edit_box_key',0 -aEdit_box_mouse db 'edit_box_mouse',0 -aVersion_ed db 'version_ed',0 - -aInit_checkbox db 'init_checkbox2',0 -aCheck_box_draw db 'check_box_draw2',0 -aCheck_box_mouse db 'check_box_mouse2',0 -aVersion_ch db 'version_ch2',0 - -aOption_box_draw db 'option_box_draw',0 -aOption_box_mouse db 'option_box_mouse',0 -aVersion_op db 'version_op',0 - - -check1 check_box2 (10 shl 16 + 12),(45 shl 16 + 12),5,0x80AABBCC,0,0,check_text1,ch_flag_en -check2 check_box2 (10 shl 16 + 12),(60 shl 16 + 12),6,0x80AABBCC,0,0,check_text2 - -edit1 edit_box 350,3,5,0xffffff,0x6f9480,0,0xAABBCC,0,308,hed,mouse_dd,ed_focus,hed_end-hed-1,hed_end-hed-1 -edit2 edit_box 350,3,25,0xffffff,0x6a9480,0,0,0,99,ed_buffer,mouse_dd,ed_figure_only - -op1 option_box option_group1,10,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1 -op2 option_box option_group1,10,105,6,12,0xFFFFFF,0,0,op_text.2,op_text.e2-op_text.2 -op3 option_box option_group1,10,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3 -op11 option_box option_group2,120,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1 -op12 option_box option_group2,120,105,6,12,0xffffff,0,0,op_text.2,op_text.e2-op_text.2 -op13 option_box option_group2,120,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3 - -option_group1 dd op1 ;указатели, они отображаются по умолчанию, когда выводится -option_group2 dd op12 ;приложение -Option_boxs dd op1,op2,op3,0 -Option_boxs2 dd op11,op12,op13,0 - -hed db 'BOXs load from lib date 27.04.2009',0 -hed_end: - -rb 256 -check_text1 db 'First checkbox',0 -check_text2 db 'Second checkbox',0 - -op_text: ; Сопровождающий текст для Optionbox'а -.1 db 'Option_Box #1' -.e1: -.2 db 'Option_Box #2' -.e2: -.3 db 'Option_Box #3' -.e3: -ed_buffer rb 100 -;----------------------- -;sc system_colors - -mouse_dd rd 1 -p_info process_information -cur_dir_path rb 4096 -library_path rb 4096 -i_end: -rb 1024 -mem: \ No newline at end of file +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +;заголовок приложения +use32 ; транслятор, использующий 32 разрядных команды + org 0 ; базовый адрес кода, всегда 0 + db 'MENUET01' ; идентификатор исполняемого файла (8 байт) + dd 1 ; версия формата заголовка исполняемого файла + dd start ; адрес, на который система передаёт управление + ; после загрузки приложения в память + dd i_end ; размер приложения + dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта + dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше + dd 0 ; указатель на строку с параметрами. + dd cur_dir_path ; указатель на адрес, куда помещается строка, содержащая путь до программы в момент запуска. + +include '../../../../macros.inc' +include '../box_lib.mac' +include '../../../../KOSfuncs.inc' +include '../../../../load_lib.mac' + @use_library ;use load lib macros +start: +;universal load library/librarys +sys_load_library library_name, library_path, system_path, myimport +;if return code =-1 then exit, else nornary work + cmp eax,-1 + jz exit + mcall SF_SET_EVENTS_MASK,0x80000027 ;установить маску для ожидаемых событий + + push dword check1 ;подсчёт дины текста для Checkbox'ов + call [init_checkbox] + + push dword check2 + call [init_checkbox] + +red_win: + call draw_window ;первоначально необходимо нарисовать окно +align 4 +still: ;основной обработчик + mcall SF_WAIT_EVENT + dec eax + jz red_win + dec eax + jz key + dec eax + jz button + + push dword edit1 + call [edit_box_mouse] + + push dword edit2 + call [edit_box_mouse] + + push dword check1 + call [check_box_mouse] + + push dword check2 + call [check_box_mouse] + + push dword Option_boxs + call [option_box_mouse] + + push dword Option_boxs2 + call [option_box_mouse] + + jmp still ;если ничего из перечисленного то снова в цикл +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +button: + mcall SF_GET_BUTTON + test ah,ah ;если в ah 0, то перейти на обработчик событий still + jz still +exit: + mcall SF_TERMINATE_PROCESS +key: + mcall SF_GET_KEY + + push dword edit1 + call [edit_box_key] + + push dword edit2 + call [edit_box_key] + + jmp still + +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +align 4 +draw_window: ;рисование окна приложения + mcall SF_REDRAW, SSF_BEGIN_DRAW + mcall SF_CREATE_WINDOW,(50*65536+390),(30*65536+200),0x33AABBCC,0x805080DD,hed + + push dword edit1 + call [edit_box_draw] + + push dword edit2 + call [edit_box_draw] + + push dword check1 + call [check_box_draw] + + push dword check2 + call [check_box_draw] + + push dword Option_boxs + call [option_box_draw] + + push dword Option_boxs2 + call [option_box_draw] + + mcall SF_REDRAW, SSF_END_DRAW + ret +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +;DATA данные +;Всегда соблюдать последовательность в имени. +system_path db '/sys/lib/' +library_name db 'box_lib.obj',0 +; Если есть желание разъединить, то нужно использовать следующию конструкцию +;system_path db '/sys/lib/box_lib.obj',0 +;... любая последовательность других команд и определений. +;library_name db 'box_lib.obj',0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +myimport: + +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 + +init_checkbox dd aInit_checkbox +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 + + dd 0,0 + +aEdit_box_draw db 'edit_box_draw',0 +aEdit_box_key db 'edit_box_key',0 +aEdit_box_mouse db 'edit_box_mouse',0 +aVersion_ed db 'version_ed',0 + +aInit_checkbox db 'init_checkbox2',0 +aCheck_box_draw db 'check_box_draw2',0 +aCheck_box_mouse db 'check_box_mouse2',0 +aVersion_ch db 'version_ch2',0 + +aOption_box_draw db 'option_box_draw',0 +aOption_box_mouse db 'option_box_mouse',0 +aVersion_op db 'version_op',0 + + +check1 check_box2 (10 shl 16 + 12),(45 shl 16 + 12),5,0x80AABBCC,0,0,check_text1,ch_flag_en +check2 check_box2 (10 shl 16 + 12),(60 shl 16 + 12),6,0x80AABBCC,0,0,check_text2 + +edit1 edit_box 350,3,5,0xffffff,0x6f9480,0,0xAABBCC,0,308,hed,mouse_dd,ed_focus,hed_end-hed-1,hed_end-hed-1 +edit2 edit_box 350,3,25,0xffffff,0x6a9480,0,0,0,99,ed_buffer,mouse_dd,ed_figure_only + +op1 option_box option_group1,10,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1 +op2 option_box option_group1,10,105,6,12,0xFFFFFF,0,0,op_text.2,op_text.e2-op_text.2 +op3 option_box option_group1,10,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3 +op11 option_box option_group2,120,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1 +op12 option_box option_group2,120,105,6,12,0xffffff,0,0,op_text.2,op_text.e2-op_text.2 +op13 option_box option_group2,120,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3 + +option_group1 dd op1 ;указатели, они отображаются по умолчанию, когда выводится +option_group2 dd op12 ;приложение +Option_boxs dd op1,op2,op3,0 +Option_boxs2 dd op11,op12,op13,0 + +hed db 'BOXs load from lib date 27.04.2009',0 +hed_end: + +rb 256 +check_text1 db 'First checkbox',0 +check_text2 db 'Second checkbox',0 + +op_text: ; Сопровождающий текст для Optionbox'а +.1 db 'Option_Box #1' +.e1: +.2 db 'Option_Box #2' +.e2: +.3 db 'Option_Box #3' +.e3: +ed_buffer rb 100 +;----------------------- +;sc system_colors + +mouse_dd rd 1 +p_info process_information +cur_dir_path rb 4096 +library_path rb 4096 +i_end: +rb 1024 +mem: diff --git a/programs/develop/libraries/box_lib/asm/trunk/opendial.mac b/programs/develop/libraries/box_lib/asm/opendial.mac similarity index 100% rename from programs/develop/libraries/box_lib/asm/trunk/opendial.mac rename to programs/develop/libraries/box_lib/asm/opendial.mac diff --git a/programs/develop/libraries/box_lib/asm/trunk/reload_16x16_8b.png b/programs/develop/libraries/box_lib/asm/reload_16x16_8b.png similarity index 100% rename from programs/develop/libraries/box_lib/asm/trunk/reload_16x16_8b.png rename to programs/develop/libraries/box_lib/asm/reload_16x16_8b.png diff --git a/programs/develop/libraries/box_lib/asm/trunk/tooltip_demo.asm b/programs/develop/libraries/box_lib/asm/tooltip_demo.asm similarity index 92% rename from programs/develop/libraries/box_lib/asm/trunk/tooltip_demo.asm rename to programs/develop/libraries/box_lib/asm/tooltip_demo.asm index cfaac8dba..a0441d6f2 100644 --- a/programs/develop/libraries/box_lib/asm/trunk/tooltip_demo.asm +++ b/programs/develop/libraries/box_lib/asm/tooltip_demo.asm @@ -1,171 +1,177 @@ -; Простой пример программы для KolibriOS -; озвучивает код нажатой клавиши -; - переделан как пример использования tooltip - -use32 ; включить 32-битный режим ассемблера -org 0 ; адресация с нуля - -db 'MENUET01' ; 8-байтный идентификатор MenuetOS -dd 1 ; версия заголовка (всегда 1) -dd START ; адрес первой команды -dd CODE_END ; размер программы -dd DATA_END ; количество памяти -dd STACK_END ; адрес вершины стэка -dd 0 ; адрес буфера для параметров -dd cur_dir_path ; указатель на адрес, куда помещается строка, содержащая путь до программы в момент запуска. - -include '../../../../../proc32.inc' -include '../../../../../macros.inc' -include '../../../../../KOSfuncs.inc' -include '../../../../../dll.inc' ; malloc fn -include '../../trunk/box_lib.mac' -include '../../../../../load_lib.mac' - - -;--------------------------------------------------------------------- -;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- -;--------------------------------------------------------------------- -; этот макрос обязателен для всех компонетов, использующих heap -; кроме того, обязательно имортировать lib_init - при импорте определяются -; функции хипа для библиотеки -@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load - -START: -;--------------------------------------------------------------------- -;--- ИНИЦИАЛИЗАЦИЯ ---------------------------------------- -;--------------------------------------------------------------------- -mcall 68, 11 - -mcall 40, $C0000027 ; маска событий - мышь только в активном окне - -sys_load_library lib_name, lib_path, sys_path, myimport -test eax,eax -jz @f - mcall -1 ; alarm exit -@@: - - -invoke tooltip_init, redbox_tt ; only begin of list - -red: ; перерисовать окно - -call draw_window ; вызываем процедуру отрисовки окна - -;--------------------------------------------------------------------- -;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- -;--------------------------------------------------------------------- - -still: -mcall 23, 5 ; функция 23 - ждать события Не более чем 0.05с -test eax, eax ; нет событий - проверить рисование тултипов по таймеру -je yield -cmp eax,1 ; перерисовать окно ? -je red ; если да - на метку red -cmp eax,2 ; нажата клавиша ? -je key ; если да - на key -cmp eax,3 ; нажата кнопка ? -je button ; если да - на button -cmp eax,6 ; событие мыши -je mouse ; если да - на mouse - -jmp still ; если другое событие - в начало цикла - - -;--------------------------------------------------------------------- -yield: -invoke tooltip_test_show, redbox_tt -jmp still ; вернуться к началу цикла - -mouse: -invoke tooltip_mouse, redbox_tt -jmp still ; вернуться к началу цикла - -key: ; нажата клавиша на клавиатуре -mcall 2 ; функция 2 - считать код символа (в ah) - -jmp still ; вернуться к началу цикла - -;--------------------------------------------------------------------- - -button: -mcall 17 ; 17 - получить идентификатор нажатой кнопки - -cmp ah, 1 ; если НЕ нажата кнопка с номером 1, -jne still ; вернуться - -pexit: -invoke tooltip_delete, redbox_tt ; освобождаем память -mcall -1 ; иначе конец программы - - -;--------------------------------------------------------------------- -;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ---------------------------------- -;--------------------------------------------------------------------- - -draw_window: - -mcall 12, 1 ; функция 12: сообщить ОС о начале отрисовки - -mcall 48, 3, sc,sizeof.system_colors - -mov edx, [sc.work] ; цвет фона -or edx, 0x33000000 ; и тип окна 3 -mcall 0, <200,300>, <200,150>, , ,title - -; вывод квадратиков -mcall 13, <60,50>, <50,50>, $FF0000 -mcall 13, <140,50>, <50,50>, $FF - - -mcall 12, 2 ; функция 12.2, закончили рисовать - -ret ; выходим из процедуры - - -CODE_END: ; метка конца программы; --------------------------------------------; - -; ---------------------------------------------------------------------------- ; -;--------------------------------------------------------------------- -;--- ДАННЫЕ ПРОГРАММЫ ---------------------------------------------- -;--------------------------------------------------------------------- - -sys_path db '/sys/lib/' -;sys_path db '/tmp0/1/' -lib_name db 'box_lib.obj',0 -cur_dir_path rb 4096 -lib_path rb 4096 - -myimport: - dd sz_lib_init ;функция запускается макросом 1 раз при подключении -;библиотеки, потому в программе метка на нее не нужна -tooltip_init dd sz_tooltip_init -tooltip_delete dd sz_tooltip_delete -tooltip_test_show dd sz_tooltip_test_show -tooltip_mouse dd sz_tooltip_mouse -get_font_size dd sz_get_font_size - dd 0,0 - -sz_lib_init db 'lib_init',0 -sz_tooltip_init db 'tooltip_init', 0 -sz_tooltip_delete db 'tooltip_delete', 0 -sz_tooltip_test_show db 'tooltip_test_show', 0 -sz_tooltip_mouse db 'tooltip_mouse', 0 -sz_get_font_size db 'get_font_size', 0 - - -;tooltip txt, next, zone_x, zone_w, zone_y, zone_h, col_txt, col_bkg, tm_wait -redbox_tt tooltip redboxtxt, blubox_tt, 60, 50, 50, 50, 0, $FFF473, 100 -blubox_tt tooltip bluboxtxt, 0, 140, 50, 50, 50, $110000FF, $FFF473, 100 - -redboxtxt db 'Red Box Tooltip', 13, 'May be multilined', 13, 13, 'Even with empty lines', 0 -bluboxtxt db 'Blue Box Tooltip', 0 - -sc system_colors - -title db 'Toooltip demo',0 - -; stack----------------------------------------------------------------------- ; - rb 4096 -STACK_END dd ? - -DATA_END: ; метка конца данных программы; ------------------------------------ ; +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +; Простой пример программы для KolibriOS +; озвучивает код нажатой клавиши +; - переделан как пример использования tooltip + +use32 ; включить 32-битный режим ассемблера +org 0 ; адресация с нуля + +db 'MENUET01' ; 8-байтный идентификатор MenuetOS +dd 1 ; версия заголовка (всегда 1) +dd START ; адрес первой команды +dd CODE_END ; размер программы +dd DATA_END ; количество памяти +dd STACK_END ; адрес вершины стэка +dd 0 ; адрес буфера для параметров +dd cur_dir_path ; указатель на адрес, куда помещается строка, содержащая путь до программы в момент запуска. + +include '../../../../proc32.inc' +include '../../../../macros.inc' +include '../../../../KOSfuncs.inc' +include '../../../../dll.inc' ; malloc fn +include '../box_lib.mac' +include '../../../../load_lib.mac' + + +;--------------------------------------------------------------------- +;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- +;--------------------------------------------------------------------- +; этот макрос обязателен для всех компонетов, использующих heap +; кроме того, обязательно имортировать lib_init - при импорте определяются +; функции хипа для библиотеки +@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load + +START: +;--------------------------------------------------------------------- +;--- ИНИЦИАЛИЗАЦИЯ ---------------------------------------- +;--------------------------------------------------------------------- +mcall 68, 11 + +mcall 40, $C0000027 ; маска событий - мышь только в активном окне + +sys_load_library lib_name, lib_path, sys_path, myimport +test eax,eax +jz @f + mcall -1 ; alarm exit +@@: + + +invoke tooltip_init, redbox_tt ; only begin of list + +red: ; перерисовать окно + +call draw_window ; вызываем процедуру отрисовки окна + +;--------------------------------------------------------------------- +;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- +;--------------------------------------------------------------------- + +still: +mcall 23, 5 ; функция 23 - ждать события Не более чем 0.05с +test eax, eax ; нет событий - проверить рисование тултипов по таймеру +je yield +cmp eax,1 ; перерисовать окно ? +je red ; если да - на метку red +cmp eax,2 ; нажата клавиша ? +je key ; если да - на key +cmp eax,3 ; нажата кнопка ? +je button ; если да - на button +cmp eax,6 ; событие мыши +je mouse ; если да - на mouse + +jmp still ; если другое событие - в начало цикла + + +;--------------------------------------------------------------------- +yield: +invoke tooltip_test_show, redbox_tt +jmp still ; вернуться к началу цикла + +mouse: +invoke tooltip_mouse, redbox_tt +jmp still ; вернуться к началу цикла + +key: ; нажата клавиша на клавиатуре +mcall 2 ; функция 2 - считать код символа (в ah) + +jmp still ; вернуться к началу цикла + +;--------------------------------------------------------------------- + +button: +mcall 17 ; 17 - получить идентификатор нажатой кнопки + +cmp ah, 1 ; если НЕ нажата кнопка с номером 1, +jne still ; вернуться + +pexit: +invoke tooltip_delete, redbox_tt ; освобождаем память +mcall -1 ; иначе конец программы + + +;--------------------------------------------------------------------- +;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ---------------------------------- +;--------------------------------------------------------------------- + +draw_window: + +mcall 12, 1 ; функция 12: сообщить ОС о начале отрисовки + +mcall 48, 3, sc,sizeof.system_colors + +mov edx, [sc.work] ; цвет фона +or edx, 0x33000000 ; и тип окна 3 +mcall 0, <200,300>, <200,150>, , ,title + +; вывод квадратиков +mcall 13, <60,50>, <50,50>, $FF0000 +mcall 13, <140,50>, <50,50>, $FF + + +mcall 12, 2 ; функция 12.2, закончили рисовать + +ret ; выходим из процедуры + + +CODE_END: ; метка конца программы; --------------------------------------------; + +; ---------------------------------------------------------------------------- ; +;--------------------------------------------------------------------- +;--- ДАННЫЕ ПРОГРАММЫ ---------------------------------------------- +;--------------------------------------------------------------------- + +sys_path db '/sys/lib/' +;sys_path db '/tmp0/1/' +lib_name db 'box_lib.obj',0 +cur_dir_path rb 4096 +lib_path rb 4096 + +myimport: + dd sz_lib_init ;функция запускается макросом 1 раз при подключении +;библиотеки, потому в программе метка на нее не нужна +tooltip_init dd sz_tooltip_init +tooltip_delete dd sz_tooltip_delete +tooltip_test_show dd sz_tooltip_test_show +tooltip_mouse dd sz_tooltip_mouse +get_font_size dd sz_get_font_size + dd 0,0 + +sz_lib_init db 'lib_init',0 +sz_tooltip_init db 'tooltip_init', 0 +sz_tooltip_delete db 'tooltip_delete', 0 +sz_tooltip_test_show db 'tooltip_test_show', 0 +sz_tooltip_mouse db 'tooltip_mouse', 0 +sz_get_font_size db 'get_font_size', 0 + + +;tooltip txt, next, zone_x, zone_w, zone_y, zone_h, col_txt, col_bkg, tm_wait +redbox_tt tooltip redboxtxt, blubox_tt, 60, 50, 50, 50, 0, $FFF473, 100 +blubox_tt tooltip bluboxtxt, 0, 140, 50, 50, 50, $110000FF, $FFF473, 100 + +redboxtxt db 'Red Box Tooltip', 13, 'May be multilined', 13, 13, 'Even with empty lines', 0 +bluboxtxt db 'Blue Box Tooltip', 0 + +sc system_colors + +title db 'Toooltip demo',0 + +; stack----------------------------------------------------------------------- ; + rb 4096 +STACK_END dd ? + +DATA_END: ; метка конца данных программы; ------------------------------------ ; diff --git a/programs/develop/libraries/box_lib/asm/trunk/w_about.inc b/programs/develop/libraries/box_lib/asm/w_about.inc similarity index 100% rename from programs/develop/libraries/box_lib/asm/trunk/w_about.inc rename to programs/develop/libraries/box_lib/asm/w_about.inc diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.asm b/programs/develop/libraries/box_lib/box_lib.asm similarity index 94% rename from programs/develop/libraries/box_lib/trunk/box_lib.asm rename to programs/develop/libraries/box_lib/box_lib.asm index 265fe11fa..76d50e21d 100644 --- a/programs/develop/libraries/box_lib/trunk/box_lib.asm +++ b/programs/develop/libraries/box_lib/box_lib.asm @@ -1,410 +1,416 @@ -;***************************************************************************** -; Box_Lib - library of graphical components -; Copyright (C) KolibriOS team 2008-2020. All rights reserved. -; -; Authors: -; Alexey Teplov aka -; Marat Zakiyanov aka Mario79, aka Mario -; Evtikhov Maxim aka Maxxxx32 -; Eugene Grechnikov aka Diamond -; hidnplayr -; Igor Afanasiev aka IgorA -;***************************************************************************** - -format MS COFF - -public EXPORTS - -section '.flat' code readable align 16 -include '../../../../macros.inc' -include '../../../../proc32.inc' -include '../../../../KOSfuncs.inc' -include 'box_lib.mac' ;macro which should make life easier :) -;include '../../../../debug.inc' -include 'keys.inc' -include '../../../../system/skincfg/trunk/kglobals.inc' -include '../../../../system/skincfg/trunk/unpacker.inc' - -;----------------------------------------------------------------------------- -mem.alloc dd ? ;ЇєэъЎш  фы  т√фхыхэш  ярь Єш -mem.free dd ? ;ЇєэъЎш  фы  юётюсюцфхэш  ярь Єш -mem.realloc dd ? ;ЇєэъЎш  фы  яхЁхЁрёяЁхфхыхэш  ярь Єш -dll.load dd ? - -;---------------------------------------------------- -include 'editbox.asm' ;editbox -include 'checkbox.asm' ;checkbox -include 'optionbox.asm' ;optionbox -include 'scrollbar.asm' ;scrollbar -include 'd_button.asm' ;dinamic_button -include 'menubar.asm' ;menubar -include 'filebrowser.asm' ;filebrowser -include 'tree_list.asm' ;tree_list, list_box -include 'pathshow.asm' ;pathshow -include 't_edit.asm' ;text_editor -include 'frame.asm' ;frame -include 'progressbar.asm' ;progressbar -include 'tooltip.asm' ;tooltip -;-------------------------------------------------- - -;input: -; eax = єърчрЄхы№ эр ЇєэъЎш■ т√фхыхэш  ярь Єш -; ebx = ... юётюсюцфхэш  ярь Єш -; ecx = ... яхЁхЁрёяЁхфхыхэш  ярь Єш -; edx = ... чруЁєчъш сшсышюЄхъш (яюър эх шёяюы№чєхЄё ) -align 16 -lib_init: - mov [mem.alloc], eax - mov [mem.free], ebx - mov [mem.realloc], ecx - mov [dll.load], edx -ret - - -align 4 -proc draw_edge uses eax ebx ecx edx edi esi, box_l:dword, box_t:dword, box_w:dword, box_h:dword,\ - col_0:dword, col_1:dword, col_2:dword - - mov esi,[col_1] - and esi,111111101111111011111110b - - mov eax,SF_DRAW_RECT - ;bottom line - mov edx,[col_2] - mov ebx,[box_l] - shl ebx,16 - add ebx,[box_w] - inc ebx ;фы  чрыштъш фшруюэры№э√ї яшъёхыхщ - mov ecx,[box_t] - add ecx,[box_h] - shl ecx,16 - inc ecx - - mov edi,3 ;for cycle - @@: - ;calculate colors - and edx,111111101111111011111110b - add edx,esi - shr edx,1 - ;line move up and ->...<- - sub ecx,1 shl 16 ;move up - add ebx,1 shl 16 ;->... - sub ebx,2 ;...<- - ;draw line - int 0x40 - dec edi - jnz @b - - ;right line - mov edx,[col_2] - mov ebx,[box_l] - add ebx,[box_w] - shl ebx,16 - inc ebx - mov ecx,[box_t] - shl ecx,16 - add ecx,[box_h] - - mov edi,3 ;for cycle - @@: - ;calculate colors - and edx,111111101111111011111110b - add edx,esi - shr edx,1 - ;line move left and ... - sub ebx,1 shl 16 ;move left - add ecx,1 shl 16 - sub ecx,2 - ;draw line - int 0x40 - dec edi - jnz @b - - ;top line - mov edx,[col_0] - mov ebx,[box_l] - shl ebx,16 - add ebx,[box_w] - mov ecx,[box_t] - shl ecx,16 - inc ecx - - mov edi,3 ;for cycle - @@: - ;calculate colors - and edx,111111101111111011111110b - add edx,esi - shr edx,1 - ;line move down and ->...<- - add ecx,1 shl 16 ;move down - add ebx,1 shl 16 ;->... - sub ebx,2 ;...<- - ;draw line - int 0x40 - dec edi - jnz @b - - ;left line - mov edx,[col_0] - mov ebx,[box_l] - shl ebx,16 - inc ebx - mov ecx,[box_t] - shl ecx,16 - add ecx,[box_h] - - mov edi,3 ;for cycle - @@: - ;calculate colors - and edx,111111101111111011111110b - add edx,esi - shr edx,1 - ;line move left and ... - add ebx,1 shl 16 ;move left - add ecx,1 shl 16 - sub ecx,2 - ;draw line - int 0x40 - dec edi - jnz @b - - ret -endp - - -;фы  ЁрсюЄ√ ё KPCK -IncludeIGlobals -IncludeUGlobals - -align 16 -EXPORTS: - - -dd sz_init, lib_init -dd sz_version, 0x00000001 - -dd sz_edit_box, edit_box_draw ;old function name -dd sz_edit_box_draw, edit_box_draw -dd sz_edit_box_key, edit_box_key -dd sz_edit_box_key_safe, edit_box_key_safe -dd sz_edit_box_mouse, edit_box_mouse -dd sz_edit_box_set_text, edit_box_set_text -dd szVersion_ed, 0x00000001 - -dd sz_init_checkbox, init_checkbox -dd sz_check_box_draw, check_box_draw -dd sz_check_box_mouse, check_box_mouse -dd szVersion_ch2, 0x00000002 - -dd sz_option_box_draw, option_box_draw -dd sz_option_box_mouse, option_box_mouse -dd szVersion_op, 0x00000001 - -dd sz_Scrollbar_ver_draw, scroll_bar_vertical.draw -dd sz_Scrollbar_ver_mouse, scroll_bar_vertical.mouse -dd sz_Scrollbar_hor_draw, scroll_bar_horizontal.draw -dd sz_Scrollbar_hor_mouse, scroll_bar_horizontal.mouse -dd szVersion_scrollbar, 0x00010001 - -dd sz_Dbutton_draw, dinamic_button.draw -dd sz_Dbutton_mouse, dinamic_button.mouse -dd szVersion_dbutton, 0x00010001 - -dd sz_Menu_bar_draw, menu_bar.draw -dd sz_Menu_bar_mouse, menu_bar.mouse -dd sz_Menu_bar_activate, menu_bar.activate -dd szVersion_menu_bar, 0x00010002 - -dd sz_FileBrowser_draw, fb_draw_panel -dd sz_FileBrowser_mouse, fb_mouse -dd sz_FileBrowser_key, fb_key -dd szVersion_FileBrowser, 0x00010001 - -dd sz_tl_data_init, tl_data_init -dd sz_tl_data_clear, tl_data_clear -dd sz_tl_info_clear, tl_info_clear -dd sz_tl_key, tl_key -dd sz_tl_mouse, tl_mouse -dd sz_tl_draw, tl_draw -dd sz_tl_info_undo, tl_info_undo -dd sz_tl_info_redo, tl_info_redo -dd sz_tl_node_add, tl_node_add -dd sz_tl_node_set_data, tl_node_set_data -dd sz_tl_node_get_data, tl_node_get_data -dd sz_tl_node_delete, tl_node_delete -dd sz_tl_cur_beg, tl_cur_beg -dd sz_tl_cur_next, tl_cur_next -dd sz_tl_cur_perv, tl_cur_perv -dd sz_tl_node_close_open, tl_node_close_open -dd sz_tl_node_lev_inc, tl_node_lev_inc -dd sz_tl_node_lev_dec, tl_node_lev_dec -dd sz_tl_node_move_up, tl_node_move_up -dd sz_tl_node_move_down, tl_node_move_down -dd sz_tl_node_poi_get_info, tl_node_poi_get_info -dd sz_tl_node_poi_get_next_info, tl_node_poi_get_next_info -dd sz_tl_node_poi_get_data, tl_node_poi_get_data -dd sz_tl_save_mem, tl_save_mem -dd sz_tl_load_mem, tl_load_mem -dd sz_tl_get_mem_size, tl_get_mem_size -dd sz_tl_version_tree_list, 0x00000001 - -dd sz_PathShow_prepare, path_show.prepare -dd sz_PathShow_draw, path_show.draw -dd szVersion_path_show, 0x00010001 - -dd sz_ted_but_sumb_upper, ted_but_sumb_upper -dd sz_ted_but_sumb_lover, ted_but_sumb_lover -dd sz_ted_but_convert_by_table, ted_but_convert_by_table -dd sz_ted_can_save, ted_can_save -dd sz_ted_clear, ted_clear -dd sz_ted_delete, ted_delete -dd sz_ted_draw, ted_draw -dd sz_ted_init, ted_init -dd sz_ted_init_scroll_bars, ted_init_scroll_bars -dd sz_ted_init_syntax_file, ted_init_syntax_file -dd sz_ted_is_select, ted_is_select -dd sz_ted_key, ted_key -dd sz_ted_mouse, ted_mouse -dd sz_ted_open_file, ted_open_file -dd sz_ted_save_file, ted_save_file -dd sz_ted_text_add, ted_text_add -dd sz_ted_but_select_word, ted_but_select_word -dd sz_ted_but_cut, ted_but_cut -dd sz_ted_but_copy, ted_but_copy -dd sz_ted_but_paste, ted_but_paste -dd sz_ted_but_undo, ted_but_undo -dd sz_ted_but_redo, ted_but_redo -dd sz_ted_but_reverse, ted_but_reverse -dd sz_ted_but_find, ted_but_find -dd sz_ted_but_replace, ted_but_replace -dd sz_ted_text_colored, ted_text_colored -dd sz_ted_go_to_position, ted_go_to_position -dd sz_ted_version, 6 - -dd sz_Frame_draw, frame.draw -dd szVersion_frame, 0x00010001 - -dd sz_progressbar_draw, progressbar_draw -dd sz_progressbar_progress, progressbar_progress - -dd sz_tooltip_init, tooltip_init -dd sz_tooltip_delete, tooltip_delete -dd sz_tooltip_test_show, tooltip_test_show -dd sz_tooltip_mouse, tooltip_mouse -dd sz_get_font_size, get_font_size - -dd 0,0 - - -sz_init db 'lib_init',0 -sz_version db 'version',0 - -sz_edit_box db 'edit_box',0 -sz_edit_box_draw db 'edit_box_draw',0 -sz_edit_box_key db 'edit_box_key',0 -sz_edit_box_key_safe db 'edit_box_key_safe',0 -sz_edit_box_mouse db 'edit_box_mouse',0 -sz_edit_box_set_text db 'edit_box_set_text',0 -szVersion_ed db 'version_ed',0 - -sz_init_checkbox db 'init_checkbox2',0 -sz_check_box_draw db 'check_box_draw2',0 -sz_check_box_mouse db 'check_box_mouse2',0 -szVersion_ch2 db 'version_ch2',0 - -sz_option_box_draw db 'option_box_draw',0 -sz_option_box_mouse db 'option_box_mouse',0 -szVersion_op db 'version_op',0 - -sz_Scrollbar_ver_draw db 'scrollbar_v_draw',0 -sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0 -sz_Scrollbar_hor_draw db 'scrollbar_h_draw',0 -sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0 -szVersion_scrollbar db 'version_scrollbar',0 - -sz_Dbutton_draw db 'dbutton_draw',0 -sz_Dbutton_mouse db 'dbutton_mouse',0 -szVersion_dbutton db 'version_dbutton',0 - -sz_Menu_bar_draw db 'menu_bar_draw',0 -sz_Menu_bar_mouse db 'menu_bar_mouse',0 -sz_Menu_bar_activate db 'menu_bar_activate',0 -szVersion_menu_bar db 'version_menu_bar',0 - -sz_FileBrowser_draw db 'FileBrowser_draw',0 -sz_FileBrowser_mouse db 'FileBrowser_mouse',0 -sz_FileBrowser_key db 'FileBrowser_key',0 -szVersion_FileBrowser db 'version_FileBrowser',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_node_poi_get_info db 'tl_node_poi_get_info',0 -sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0 -sz_tl_node_poi_get_data db 'tl_node_poi_get_data',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 -sz_tl_version_tree_list db 'version_tree_list',0 - -sz_PathShow_prepare db 'PathShow_prepare',0 -sz_PathShow_draw db 'PathShow_draw',0 -szVersion_path_show db 'version_PathShow',0 - -sz_ted_but_sumb_upper db 'ted_but_sumb_upper',0 -sz_ted_but_sumb_lover db 'ted_but_sumb_lover',0 -sz_ted_but_convert_by_table db 'ted_but_convert_by_table',0 -sz_ted_can_save db 'ted_can_save',0 -sz_ted_clear db 'ted_clear',0 -sz_ted_delete db 'ted_delete',0 -sz_ted_draw db 'ted_draw',0 -sz_ted_init db 'ted_init',0 -sz_ted_init_scroll_bars db 'ted_init_scroll_bars',0 -sz_ted_init_syntax_file db 'ted_init_syntax_file',0 -sz_ted_is_select db 'ted_is_select',0 -sz_ted_key db 'ted_key',0 -sz_ted_mouse db 'ted_mouse',0 -sz_ted_open_file db 'ted_open_file',0 -sz_ted_save_file db 'ted_save_file',0 -sz_ted_text_add db 'ted_text_add',0 -sz_ted_but_select_word db 'ted_but_select_word',0 -sz_ted_but_cut db 'ted_but_cut',0 -sz_ted_but_copy db 'ted_but_copy',0 -sz_ted_but_paste db 'ted_but_paste',0 -sz_ted_but_undo db 'ted_but_undo',0 -sz_ted_but_redo db 'ted_but_redo',0 -sz_ted_but_reverse db 'ted_but_reverse',0 -sz_ted_but_find db 'ted_but_find',0 -sz_ted_but_replace db 'ted_but_replace',0 -sz_ted_text_colored db 'ted_text_colored',0 -sz_ted_go_to_position db 'ted_go_to_position',0 -sz_ted_version db 'version_text_edit',0 - -sz_Frame_draw db 'frame_draw',0 -szVersion_frame db 'version_frame',0 - -sz_progressbar_draw db 'progressbar_draw', 0 -sz_progressbar_progress db 'progressbar_progress', 0 - -sz_tooltip_init db 'tooltip_init', 0 -sz_tooltip_delete db 'tooltip_delete', 0 -sz_tooltip_test_show db 'tooltip_test_show', 0 -sz_tooltip_mouse db 'tooltip_mouse', 0 -sz_get_font_size db 'get_font_size', 0 +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page Windows 1251 - Cyrillic + + +;***************************************************************************** +; Box_Lib - library of graphical components +; Copyright (C) KolibriOS team 2008-2020. All rights reserved. +; +; Authors: +; Alexey Teplov aka +; Marat Zakiyanov aka Mario79, aka Mario +; Evtikhov Maxim aka Maxxxx32 +; Eugene Grechnikov aka Diamond +; hidnplayr +; Igor Afanasiev aka IgorA +;***************************************************************************** + +format MS COFF + +public EXPORTS + +section '.flat' code readable align 16 +include '../../../macros.inc' +include '../../../proc32.inc' +include '../../../KOSfuncs.inc' +include 'box_lib.mac' ;macro which should make life easier :) +;include '../../../debug.inc' +include 'keys.inc' +include '../../../system/skincfg/trunk/kglobals.inc' +include '../../../system/skincfg/trunk/unpacker.inc' + +;----------------------------------------------------------------------------- +mem.alloc dd ? ;ЇєэъЎш  фы  т√фхыхэш  ярь Єш +mem.free dd ? ;ЇєэъЎш  фы  юётюсюцфхэш  ярь Єш +mem.realloc dd ? ;ЇєэъЎш  фы  яхЁхЁрёяЁхфхыхэш  ярь Єш +dll.load dd ? + +;---------------------------------------------------- +include 'editbox.asm' ;editbox +include 'checkbox.asm' ;checkbox +include 'optionbox.asm' ;optionbox +include 'scrollbar.asm' ;scrollbar +include 'd_button.asm' ;dinamic_button +include 'menubar.asm' ;menubar +include 'filebrowser.asm' ;filebrowser +include 'tree_list.asm' ;tree_list, list_box +include 'pathshow.asm' ;pathshow +include 't_edit.asm' ;text_editor +include 'frame.asm' ;frame +include 'progressbar.asm' ;progressbar +include 'tooltip.asm' ;tooltip +;-------------------------------------------------- + +;input: +; eax = єърчрЄхы№ эр ЇєэъЎш■ т√фхыхэш  ярь Єш +; ebx = ... юётюсюцфхэш  ярь Єш +; ecx = ... яхЁхЁрёяЁхфхыхэш  ярь Єш +; edx = ... чруЁєчъш сшсышюЄхъш (яюър эх шёяюы№чєхЄё ) +align 16 +lib_init: + mov [mem.alloc], eax + mov [mem.free], ebx + mov [mem.realloc], ecx + mov [dll.load], edx +ret + + +align 4 +proc draw_edge uses eax ebx ecx edx edi esi, box_l:dword, box_t:dword, box_w:dword, box_h:dword,\ + col_0:dword, col_1:dword, col_2:dword + + mov esi,[col_1] + and esi,111111101111111011111110b + + mov eax,SF_DRAW_RECT + ;bottom line + mov edx,[col_2] + mov ebx,[box_l] + shl ebx,16 + add ebx,[box_w] + inc ebx ;фы  чрыштъш фшруюэры№э√ї яшъёхыхщ + mov ecx,[box_t] + add ecx,[box_h] + shl ecx,16 + inc ecx + + mov edi,3 ;for cycle + @@: + ;calculate colors + and edx,111111101111111011111110b + add edx,esi + shr edx,1 + ;line move up and ->...<- + sub ecx,1 shl 16 ;move up + add ebx,1 shl 16 ;->... + sub ebx,2 ;...<- + ;draw line + int 0x40 + dec edi + jnz @b + + ;right line + mov edx,[col_2] + mov ebx,[box_l] + add ebx,[box_w] + shl ebx,16 + inc ebx + mov ecx,[box_t] + shl ecx,16 + add ecx,[box_h] + + mov edi,3 ;for cycle + @@: + ;calculate colors + and edx,111111101111111011111110b + add edx,esi + shr edx,1 + ;line move left and ... + sub ebx,1 shl 16 ;move left + add ecx,1 shl 16 + sub ecx,2 + ;draw line + int 0x40 + dec edi + jnz @b + + ;top line + mov edx,[col_0] + mov ebx,[box_l] + shl ebx,16 + add ebx,[box_w] + mov ecx,[box_t] + shl ecx,16 + inc ecx + + mov edi,3 ;for cycle + @@: + ;calculate colors + and edx,111111101111111011111110b + add edx,esi + shr edx,1 + ;line move down and ->...<- + add ecx,1 shl 16 ;move down + add ebx,1 shl 16 ;->... + sub ebx,2 ;...<- + ;draw line + int 0x40 + dec edi + jnz @b + + ;left line + mov edx,[col_0] + mov ebx,[box_l] + shl ebx,16 + inc ebx + mov ecx,[box_t] + shl ecx,16 + add ecx,[box_h] + + mov edi,3 ;for cycle + @@: + ;calculate colors + and edx,111111101111111011111110b + add edx,esi + shr edx,1 + ;line move left and ... + add ebx,1 shl 16 ;move left + add ecx,1 shl 16 + sub ecx,2 + ;draw line + int 0x40 + dec edi + jnz @b + + ret +endp + + +;фы  ЁрсюЄ√ ё KPCK +IncludeIGlobals +IncludeUGlobals + +align 16 +EXPORTS: + + +dd sz_init, lib_init +dd sz_version, 0x00000001 + +dd sz_edit_box, edit_box_draw ;old function name +dd sz_edit_box_draw, edit_box_draw +dd sz_edit_box_key, edit_box_key +dd sz_edit_box_key_safe, edit_box_key_safe +dd sz_edit_box_mouse, edit_box_mouse +dd sz_edit_box_set_text, edit_box_set_text +dd szVersion_ed, 0x00000001 + +dd sz_init_checkbox, init_checkbox +dd sz_check_box_draw, check_box_draw +dd sz_check_box_mouse, check_box_mouse +dd szVersion_ch2, 0x00000002 + +dd sz_option_box_draw, option_box_draw +dd sz_option_box_mouse, option_box_mouse +dd szVersion_op, 0x00000001 + +dd sz_Scrollbar_ver_draw, scroll_bar_vertical.draw +dd sz_Scrollbar_ver_mouse, scroll_bar_vertical.mouse +dd sz_Scrollbar_hor_draw, scroll_bar_horizontal.draw +dd sz_Scrollbar_hor_mouse, scroll_bar_horizontal.mouse +dd szVersion_scrollbar, 0x00010001 + +dd sz_Dbutton_draw, dinamic_button.draw +dd sz_Dbutton_mouse, dinamic_button.mouse +dd szVersion_dbutton, 0x00010001 + +dd sz_Menu_bar_draw, menu_bar.draw +dd sz_Menu_bar_mouse, menu_bar.mouse +dd sz_Menu_bar_activate, menu_bar.activate +dd szVersion_menu_bar, 0x00010002 + +dd sz_FileBrowser_draw, fb_draw_panel +dd sz_FileBrowser_mouse, fb_mouse +dd sz_FileBrowser_key, fb_key +dd szVersion_FileBrowser, 0x00010001 + +dd sz_tl_data_init, tl_data_init +dd sz_tl_data_clear, tl_data_clear +dd sz_tl_info_clear, tl_info_clear +dd sz_tl_key, tl_key +dd sz_tl_mouse, tl_mouse +dd sz_tl_draw, tl_draw +dd sz_tl_info_undo, tl_info_undo +dd sz_tl_info_redo, tl_info_redo +dd sz_tl_node_add, tl_node_add +dd sz_tl_node_set_data, tl_node_set_data +dd sz_tl_node_get_data, tl_node_get_data +dd sz_tl_node_delete, tl_node_delete +dd sz_tl_cur_beg, tl_cur_beg +dd sz_tl_cur_next, tl_cur_next +dd sz_tl_cur_perv, tl_cur_perv +dd sz_tl_node_close_open, tl_node_close_open +dd sz_tl_node_lev_inc, tl_node_lev_inc +dd sz_tl_node_lev_dec, tl_node_lev_dec +dd sz_tl_node_move_up, tl_node_move_up +dd sz_tl_node_move_down, tl_node_move_down +dd sz_tl_node_poi_get_info, tl_node_poi_get_info +dd sz_tl_node_poi_get_next_info, tl_node_poi_get_next_info +dd sz_tl_node_poi_get_data, tl_node_poi_get_data +dd sz_tl_save_mem, tl_save_mem +dd sz_tl_load_mem, tl_load_mem +dd sz_tl_get_mem_size, tl_get_mem_size +dd sz_tl_version_tree_list, 0x00000001 + +dd sz_PathShow_prepare, path_show.prepare +dd sz_PathShow_draw, path_show.draw +dd szVersion_path_show, 0x00010001 + +dd sz_ted_but_sumb_upper, ted_but_sumb_upper +dd sz_ted_but_sumb_lover, ted_but_sumb_lover +dd sz_ted_but_convert_by_table, ted_but_convert_by_table +dd sz_ted_can_save, ted_can_save +dd sz_ted_clear, ted_clear +dd sz_ted_delete, ted_delete +dd sz_ted_draw, ted_draw +dd sz_ted_init, ted_init +dd sz_ted_init_scroll_bars, ted_init_scroll_bars +dd sz_ted_init_syntax_file, ted_init_syntax_file +dd sz_ted_is_select, ted_is_select +dd sz_ted_key, ted_key +dd sz_ted_mouse, ted_mouse +dd sz_ted_open_file, ted_open_file +dd sz_ted_save_file, ted_save_file +dd sz_ted_text_add, ted_text_add +dd sz_ted_but_select_word, ted_but_select_word +dd sz_ted_but_cut, ted_but_cut +dd sz_ted_but_copy, ted_but_copy +dd sz_ted_but_paste, ted_but_paste +dd sz_ted_but_undo, ted_but_undo +dd sz_ted_but_redo, ted_but_redo +dd sz_ted_but_reverse, ted_but_reverse +dd sz_ted_but_find, ted_but_find +dd sz_ted_but_replace, ted_but_replace +dd sz_ted_text_colored, ted_text_colored +dd sz_ted_go_to_position, ted_go_to_position +dd sz_ted_version, 6 + +dd sz_Frame_draw, frame.draw +dd szVersion_frame, 0x00010001 + +dd sz_progressbar_draw, progressbar_draw +dd sz_progressbar_progress, progressbar_progress + +dd sz_tooltip_init, tooltip_init +dd sz_tooltip_delete, tooltip_delete +dd sz_tooltip_test_show, tooltip_test_show +dd sz_tooltip_mouse, tooltip_mouse +dd sz_get_font_size, get_font_size + +dd 0,0 + + +sz_init db 'lib_init',0 +sz_version db 'version',0 + +sz_edit_box db 'edit_box',0 +sz_edit_box_draw db 'edit_box_draw',0 +sz_edit_box_key db 'edit_box_key',0 +sz_edit_box_key_safe db 'edit_box_key_safe',0 +sz_edit_box_mouse db 'edit_box_mouse',0 +sz_edit_box_set_text db 'edit_box_set_text',0 +szVersion_ed db 'version_ed',0 + +sz_init_checkbox db 'init_checkbox2',0 +sz_check_box_draw db 'check_box_draw2',0 +sz_check_box_mouse db 'check_box_mouse2',0 +szVersion_ch2 db 'version_ch2',0 + +sz_option_box_draw db 'option_box_draw',0 +sz_option_box_mouse db 'option_box_mouse',0 +szVersion_op db 'version_op',0 + +sz_Scrollbar_ver_draw db 'scrollbar_v_draw',0 +sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0 +sz_Scrollbar_hor_draw db 'scrollbar_h_draw',0 +sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0 +szVersion_scrollbar db 'version_scrollbar',0 + +sz_Dbutton_draw db 'dbutton_draw',0 +sz_Dbutton_mouse db 'dbutton_mouse',0 +szVersion_dbutton db 'version_dbutton',0 + +sz_Menu_bar_draw db 'menu_bar_draw',0 +sz_Menu_bar_mouse db 'menu_bar_mouse',0 +sz_Menu_bar_activate db 'menu_bar_activate',0 +szVersion_menu_bar db 'version_menu_bar',0 + +sz_FileBrowser_draw db 'FileBrowser_draw',0 +sz_FileBrowser_mouse db 'FileBrowser_mouse',0 +sz_FileBrowser_key db 'FileBrowser_key',0 +szVersion_FileBrowser db 'version_FileBrowser',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_node_poi_get_info db 'tl_node_poi_get_info',0 +sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0 +sz_tl_node_poi_get_data db 'tl_node_poi_get_data',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 +sz_tl_version_tree_list db 'version_tree_list',0 + +sz_PathShow_prepare db 'PathShow_prepare',0 +sz_PathShow_draw db 'PathShow_draw',0 +szVersion_path_show db 'version_PathShow',0 + +sz_ted_but_sumb_upper db 'ted_but_sumb_upper',0 +sz_ted_but_sumb_lover db 'ted_but_sumb_lover',0 +sz_ted_but_convert_by_table db 'ted_but_convert_by_table',0 +sz_ted_can_save db 'ted_can_save',0 +sz_ted_clear db 'ted_clear',0 +sz_ted_delete db 'ted_delete',0 +sz_ted_draw db 'ted_draw',0 +sz_ted_init db 'ted_init',0 +sz_ted_init_scroll_bars db 'ted_init_scroll_bars',0 +sz_ted_init_syntax_file db 'ted_init_syntax_file',0 +sz_ted_is_select db 'ted_is_select',0 +sz_ted_key db 'ted_key',0 +sz_ted_mouse db 'ted_mouse',0 +sz_ted_open_file db 'ted_open_file',0 +sz_ted_save_file db 'ted_save_file',0 +sz_ted_text_add db 'ted_text_add',0 +sz_ted_but_select_word db 'ted_but_select_word',0 +sz_ted_but_cut db 'ted_but_cut',0 +sz_ted_but_copy db 'ted_but_copy',0 +sz_ted_but_paste db 'ted_but_paste',0 +sz_ted_but_undo db 'ted_but_undo',0 +sz_ted_but_redo db 'ted_but_redo',0 +sz_ted_but_reverse db 'ted_but_reverse',0 +sz_ted_but_find db 'ted_but_find',0 +sz_ted_but_replace db 'ted_but_replace',0 +sz_ted_text_colored db 'ted_text_colored',0 +sz_ted_go_to_position db 'ted_go_to_position',0 +sz_ted_version db 'version_text_edit',0 + +sz_Frame_draw db 'frame_draw',0 +szVersion_frame db 'version_frame',0 + +sz_progressbar_draw db 'progressbar_draw', 0 +sz_progressbar_progress db 'progressbar_progress', 0 + +sz_tooltip_init db 'tooltip_init', 0 +sz_tooltip_delete db 'tooltip_delete', 0 +sz_tooltip_test_show db 'tooltip_test_show', 0 +sz_tooltip_mouse db 'tooltip_mouse', 0 +sz_get_font_size db 'get_font_size', 0 diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.mac b/programs/develop/libraries/box_lib/box_lib.mac similarity index 100% rename from programs/develop/libraries/box_lib/trunk/box_lib.mac rename to programs/develop/libraries/box_lib/box_lib.mac diff --git a/programs/develop/libraries/box_lib/trunk/build.sh b/programs/develop/libraries/box_lib/build.sh similarity index 100% rename from programs/develop/libraries/box_lib/trunk/build.sh rename to programs/develop/libraries/box_lib/build.sh diff --git a/programs/develop/libraries/box_lib/trunk/checkbox.asm b/programs/develop/libraries/box_lib/checkbox.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/checkbox.asm rename to programs/develop/libraries/box_lib/checkbox.asm diff --git a/programs/develop/libraries/box_lib/trunk/d_button.asm b/programs/develop/libraries/box_lib/d_button.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/d_button.asm rename to programs/develop/libraries/box_lib/d_button.asm diff --git a/programs/develop/libraries/box_lib/trunk/doc/box_lib.htm b/programs/develop/libraries/box_lib/doc/box_lib.htm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/box_lib.htm rename to programs/develop/libraries/box_lib/doc/box_lib.htm diff --git a/programs/develop/libraries/box_lib/trunk/doc/checkbox/info_checkbox.htm b/programs/develop/libraries/box_lib/doc/checkbox/info_checkbox.htm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/checkbox/info_checkbox.htm rename to programs/develop/libraries/box_lib/doc/checkbox/info_checkbox.htm diff --git a/programs/develop/libraries/box_lib/trunk/doc/editbox/info_editbox.htm b/programs/develop/libraries/box_lib/doc/editbox/info_editbox.htm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/editbox/info_editbox.htm rename to programs/develop/libraries/box_lib/doc/editbox/info_editbox.htm diff --git a/programs/develop/libraries/box_lib/trunk/doc/editbox/window_fasm.png b/programs/develop/libraries/box_lib/doc/editbox/window_fasm.png similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/editbox/window_fasm.png rename to programs/develop/libraries/box_lib/doc/editbox/window_fasm.png diff --git a/programs/develop/libraries/box_lib/trunk/doc/frame/SCR_1.PNG b/programs/develop/libraries/box_lib/doc/frame/SCR_1.PNG similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/frame/SCR_1.PNG rename to programs/develop/libraries/box_lib/doc/frame/SCR_1.PNG diff --git a/programs/develop/libraries/box_lib/trunk/doc/frame/SCR_2.PNG b/programs/develop/libraries/box_lib/doc/frame/SCR_2.PNG similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/frame/SCR_2.PNG rename to programs/develop/libraries/box_lib/doc/frame/SCR_2.PNG diff --git a/programs/develop/libraries/box_lib/trunk/doc/frame/SCR_3.PNG b/programs/develop/libraries/box_lib/doc/frame/SCR_3.PNG similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/frame/SCR_3.PNG rename to programs/develop/libraries/box_lib/doc/frame/SCR_3.PNG diff --git a/programs/develop/libraries/box_lib/trunk/doc/frame/SCR_4.PNG b/programs/develop/libraries/box_lib/doc/frame/SCR_4.PNG similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/frame/SCR_4.PNG rename to programs/develop/libraries/box_lib/doc/frame/SCR_4.PNG diff --git a/programs/develop/libraries/box_lib/trunk/doc/frame/SCR_5.PNG b/programs/develop/libraries/box_lib/doc/frame/SCR_5.PNG similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/frame/SCR_5.PNG rename to programs/develop/libraries/box_lib/doc/frame/SCR_5.PNG diff --git a/programs/develop/libraries/box_lib/trunk/doc/frame/info_frame.htm b/programs/develop/libraries/box_lib/doc/frame/info_frame.htm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/frame/info_frame.htm rename to programs/develop/libraries/box_lib/doc/frame/info_frame.htm diff --git a/programs/develop/libraries/box_lib/trunk/doc/pathshow/pathshow.htm b/programs/develop/libraries/box_lib/doc/pathshow/pathshow.htm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/pathshow/pathshow.htm rename to programs/develop/libraries/box_lib/doc/pathshow/pathshow.htm diff --git a/programs/develop/libraries/box_lib/trunk/doc/scrollbar/scrollbar.htm b/programs/develop/libraries/box_lib/doc/scrollbar/scrollbar.htm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/scrollbar/scrollbar.htm rename to programs/develop/libraries/box_lib/doc/scrollbar/scrollbar.htm diff --git a/programs/develop/libraries/box_lib/trunk/doc/style.css b/programs/develop/libraries/box_lib/doc/style.css similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/style.css rename to programs/develop/libraries/box_lib/doc/style.css diff --git a/programs/develop/libraries/box_lib/trunk/doc/t_edit/t_edit.htm b/programs/develop/libraries/box_lib/doc/t_edit/t_edit.htm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/t_edit/t_edit.htm rename to programs/develop/libraries/box_lib/doc/t_edit/t_edit.htm diff --git a/programs/develop/libraries/box_lib/trunk/doc/tooltip/tooltip.htm b/programs/develop/libraries/box_lib/doc/tooltip/tooltip.htm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/tooltip/tooltip.htm rename to programs/develop/libraries/box_lib/doc/tooltip/tooltip.htm diff --git a/programs/develop/libraries/box_lib/trunk/doc/tree_list/info_size.png b/programs/develop/libraries/box_lib/doc/tree_list/info_size.png similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/tree_list/info_size.png rename to programs/develop/libraries/box_lib/doc/tree_list/info_size.png diff --git a/programs/develop/libraries/box_lib/trunk/doc/tree_list/info_treelist.htm b/programs/develop/libraries/box_lib/doc/tree_list/info_treelist.htm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/tree_list/info_treelist.htm rename to programs/develop/libraries/box_lib/doc/tree_list/info_treelist.htm diff --git a/programs/develop/libraries/box_lib/trunk/doc/tree_list/window_tree_list.png b/programs/develop/libraries/box_lib/doc/tree_list/window_tree_list.png similarity index 100% rename from programs/develop/libraries/box_lib/trunk/doc/tree_list/window_tree_list.png rename to programs/develop/libraries/box_lib/doc/tree_list/window_tree_list.png diff --git a/programs/develop/libraries/box_lib/trunk/editbox.asm b/programs/develop/libraries/box_lib/editbox.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/editbox.asm rename to programs/develop/libraries/box_lib/editbox.asm diff --git a/programs/develop/libraries/box_lib/trunk/filebrowser.asm b/programs/develop/libraries/box_lib/filebrowser.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/filebrowser.asm rename to programs/develop/libraries/box_lib/filebrowser.asm diff --git a/programs/develop/libraries/box_lib/trunk/frame.asm b/programs/develop/libraries/box_lib/frame.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/frame.asm rename to programs/develop/libraries/box_lib/frame.asm diff --git a/programs/develop/libraries/box_lib/trunk/keys.inc b/programs/develop/libraries/box_lib/keys.inc similarity index 100% rename from programs/develop/libraries/box_lib/trunk/keys.inc rename to programs/develop/libraries/box_lib/keys.inc diff --git a/programs/develop/libraries/box_lib/trunk/menubar.asm b/programs/develop/libraries/box_lib/menubar.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/menubar.asm rename to programs/develop/libraries/box_lib/menubar.asm diff --git a/programs/develop/libraries/box_lib/trunk/optionbox.asm b/programs/develop/libraries/box_lib/optionbox.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/optionbox.asm rename to programs/develop/libraries/box_lib/optionbox.asm diff --git a/programs/develop/libraries/box_lib/trunk/pathshow.asm b/programs/develop/libraries/box_lib/pathshow.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/pathshow.asm rename to programs/develop/libraries/box_lib/pathshow.asm diff --git a/programs/develop/libraries/box_lib/trunk/progressbar.asm b/programs/develop/libraries/box_lib/progressbar.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/progressbar.asm rename to programs/develop/libraries/box_lib/progressbar.asm diff --git a/programs/develop/libraries/box_lib/trunk/readme.txt b/programs/develop/libraries/box_lib/readme.txt similarity index 100% rename from programs/develop/libraries/box_lib/trunk/readme.txt rename to programs/develop/libraries/box_lib/readme.txt diff --git a/programs/develop/libraries/box_lib/trunk/run.bat b/programs/develop/libraries/box_lib/run.bat similarity index 100% rename from programs/develop/libraries/box_lib/trunk/run.bat rename to programs/develop/libraries/box_lib/run.bat diff --git a/programs/develop/libraries/box_lib/trunk/scrollbar.asm b/programs/develop/libraries/box_lib/scrollbar.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/scrollbar.asm rename to programs/develop/libraries/box_lib/scrollbar.asm diff --git a/programs/develop/libraries/box_lib/trunk/t_edit.asm b/programs/develop/libraries/box_lib/t_edit.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/t_edit.asm rename to programs/develop/libraries/box_lib/t_edit.asm diff --git a/programs/develop/libraries/box_lib/trunk/tl_nod_16.bmp b/programs/develop/libraries/box_lib/tl_nod_16.bmp similarity index 100% rename from programs/develop/libraries/box_lib/trunk/tl_nod_16.bmp rename to programs/develop/libraries/box_lib/tl_nod_16.bmp diff --git a/programs/develop/libraries/box_lib/trunk/tl_nod_16_w.bmp b/programs/develop/libraries/box_lib/tl_nod_16_w.bmp similarity index 100% rename from programs/develop/libraries/box_lib/trunk/tl_nod_16_w.bmp rename to programs/develop/libraries/box_lib/tl_nod_16_w.bmp diff --git a/programs/develop/libraries/box_lib/trunk/tl_sys_16.bmp b/programs/develop/libraries/box_lib/tl_sys_16.bmp similarity index 100% rename from programs/develop/libraries/box_lib/trunk/tl_sys_16.bmp rename to programs/develop/libraries/box_lib/tl_sys_16.bmp diff --git a/programs/develop/libraries/box_lib/trunk/tl_sys_16_w.bmp b/programs/develop/libraries/box_lib/tl_sys_16_w.bmp similarity index 100% rename from programs/develop/libraries/box_lib/trunk/tl_sys_16_w.bmp rename to programs/develop/libraries/box_lib/tl_sys_16_w.bmp diff --git a/programs/develop/libraries/box_lib/trunk/tooltip.asm b/programs/develop/libraries/box_lib/tooltip.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/tooltip.asm rename to programs/develop/libraries/box_lib/tooltip.asm diff --git a/programs/develop/libraries/box_lib/trunk/tree_list.asm b/programs/develop/libraries/box_lib/tree_list.asm similarity index 100% rename from programs/develop/libraries/box_lib/trunk/tree_list.asm rename to programs/develop/libraries/box_lib/tree_list.asm diff --git a/programs/develop/libraries/crypt_des/example/crypt_files.asm b/programs/develop/libraries/crypt_des/example/crypt_files.asm index 294df7d60..be8e45f75 100644 --- a/programs/develop/libraries/crypt_des/example/crypt_files.asm +++ b/programs/develop/libraries/crypt_des/example/crypt_files.asm @@ -1,583 +1,589 @@ -use32 - org 0 - db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт - dd 1, start, i_end, mem, stacktop, 0, sys_path - -include '../../../../macros.inc' -include '../../../../proc32.inc' -include '../../../../KOSfuncs.inc' -include '../../../../load_lib.mac' -include '../../../../develop/libraries/box_lib/trunk/box_lib.mac' -include '../../../../dll.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Шифрование алгоритмом DES 05.03.13',0 ;подпись окна - -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - db ? - FileName dd ? -ends - -run_file_70 FileInfoBlock -image_data dd 0 ;указатель на временную память. для нужен преобразования изображения - -fn_toolbar db 'toolbar.png',0 -IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 -IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*5 -image_data_toolbar dd 0 - -IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением - -max_open_file_size equ 64*1024 ;64 Kb - -macro load_image_file path,buf,size { ;макрос для загрузки изображений - ;path - может быть переменной или строковым параметром - if path eqtype '' ;проверяем задан ли строкой параметр path - jmp @f - local .path_str - .path_str db path ;формируем локальную переменную - db 0 - @@: - ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0x0 - else - copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой - end if - - stdcall mem.Alloc, dword size ;выделяем память для изображения - mov [buf],eax - - mov eax,SF_FILE - mov [run_file_70.Function], SSF_READ_FILE - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], dword size - m2m [run_file_70.Buffer], [buf] - 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 - ;определяем вид изображения и переводим его во временный буфер image_data - stdcall [img_decode], [buf],ebx,0 - mov [image_data],eax - ;преобразуем изображение к формату rgb - stdcall [img_to_rgb2], [image_data],[buf] - ;удаляем временный буфер image_data - stdcall [img_destroy], [image_data] - @@: -} - - - -align 4 -start: - load_libraries l_libs_start,l_libs_end - ;проверка на сколько удачно загузилась библиотека - mov ebp,lib_0 - 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,0xC0000027 - stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога - - stdcall [buf2d_create], buf_0 ;создание буфера - - load_image_file 'font8x9.bmp', image_data_toolbar,IMAGE_FILE1_SIZE - stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер - stdcall mem.Free,[image_data_toolbar] ;освобождаем память - stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит - stdcall [buf2d_convert_text_matrix], buf_1 - - load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE - - stdcall mem.Alloc,max_open_file_size - mov dword[open_file],eax - - call but_new_file - -align 4 -red_win: - call draw_window - -align 4 -still: - mcall SF_WAIT_EVENT - - cmp al,1 - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - cmp al,6 ;мышь - jne @f - jmp mouse - @@: - jmp still - -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)+480, (20 shl 16)+410 - - ; *** создание кнопок на панель *** - mov esi,[sc.work_button] - mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (5 shl 16)+20, 3 - mcall ,(30 shl 16)+20,,4 - mcall ,(55 shl 16)+20,,5 - mcall ,(85 shl 16)+20,,6 - mcall ,(110 shl 16)+20,,7 - - ; *** рисование иконок на кнопках *** - mcall SF_PUT_IMAGE, [image_data_toolbar], (16 shl 16)+16, (7 shl 16)+7 ;icon new - - 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 - - stdcall [edit_box_draw], edit1 - - ; *** рисование буфера *** - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW,SSF_END_DRAW -popad - ret - -align 4 -key: - mcall SF_GET_KEY - stdcall [edit_box_key], dword edit1 - jmp still - -align 4 -mouse: - stdcall [edit_box_mouse], edit1 - jmp still - -align 4 -button: - mcall SF_GET_BUTTON - cmp ah,3 - jne @f - call but_new_file - @@: - cmp ah,4 - jne @f - call but_open_file - @@: - cmp ah,5 - jne @f - call but_save_file - @@: - cmp ah,6 - jne @f - call but_1 - @@: - cmp ah,7 - jne @f - call but_2 - @@: - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 - stdcall [buf2d_delete],buf_1 ;удаляем буфер - stdcall mem.Free,[image_data_toolbar] - stdcall mem.Free,[open_file] - mcall SF_TERMINATE_PROCESS - - -align 4 -but_new_file: - mov dword[open_file_size],0 - call draw_file - ret - -align 4 -open_file dd 0 ;указатель на память для открытия файлов -open_file_size dd 0 ;размер открытого файла (должен быть не больше max_open_file_size) - -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],2 - je .end_open_file - ;код при удачном открытии диалога - - mov eax,SF_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], max_open_file_size - m2m [run_file_70.Buffer], [open_file] - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], openfile_path - mov ebx,run_file_70 - int 0x40 ;загружаем файл изображения - cmp ebx,0xffffffff - je .end_open_file - - mov [open_file_size],ebx - add ebx,[open_file] - mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом - mcall SF_SET_CAPTION,1,openfile_path - - call draw_file - .end_open_file: - popad - ret - -align 4 -draw_file: -pushad - stdcall [buf2d_clear], buf_0, [buf_0.color] - cmp dword[open_file_size],0 - je .open_file - mov eax,[open_file] - mov ebx,3 - mov edx,[open_file_size] - .cycle_0: - mov edi,txt_buf - mov esi,eax - mov ecx,56 - ;cld - rep movsb - mov byte[edi],0 - mov edi,txt_buf - mov ecx,56 - .cycle_1: - cmp byte[edi],0 - je @f - cmp byte[edi],13 - je @f - jmp .ok - @@: - mov byte[edi],' ' ;непечатные символы заменяем на пробел - .ok: - inc edi - loop .cycle_1 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,4,ebx,0xb0 - sub edx,56 - cmp edx,1 - jl @f - add eax,56 - add ebx,10 - cmp ebx,[buf_0.h] - jl .cycle_0 - jmp @f - .open_file: - stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000 - @@: - stdcall [buf2d_draw], buf_0 -popad - ret - -align 4 -but_save_file: - 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],2 - je .end_save_file - ;код при удачном открытии диалога - - mov eax,SF_FILE - mov [run_file_70.Function], SSF_CREATE_FILE - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov ebx, dword[open_file] - mov [run_file_70.Buffer], ebx - mov ebx,[open_file_size] - mov dword[run_file_70.Count], ebx ;размер файла - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], openfile_path - mov ebx,run_file_70 - int 0x40 ;сохраняем файл изображения - ;cmp ebx,0xffffffff - ;je .end_save_file - ; ... сообщение о неудачном сохранении ... - - .end_save_file: - popad - ret - -align 4 -but_1: -push eax - mov eax,[open_file_size] - shr eax,3 - stdcall [des_encryption], txt_key,mem_key,[open_file],eax -pop eax - call draw_file - ret - -align 4 -but_2: -push eax - mov eax,[open_file_size] - shr eax,3 - stdcall [des_decryption], txt_key,mem_key,[open_file],eax -pop eax - call draw_file - ret - -;данные для диалога открытия файлов -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 '/sys',0 - -communication_area_name: - db 'FFFFFFFF_open_dialog',0 -open_dialog_name: - db 'opendial',0 -communication_area_default_path: - db '/sys/File managers/',0 - -Filter: -dd Filter.end - Filter ;.1 -.1: -db 'TXT',0 -db 'ASM',0 -.end: -db 0 - - -system_dir_0 db '/sys/lib/' -lib_name_0 db 'proc_lib.obj',0 -system_dir_1 db '/sys/lib/' -lib_name_1 db 'libimg.obj',0 -system_dir_2 db '/sys/lib/' -lib_name_2 db 'buf2d.obj',0 -system_dir_3 db '/sys/lib/' -lib_name_3 db 'crypt_des.obj',0 -system_dir_4 db '/sys/lib/' -lib_name_4 db 'box_lib.obj',0 - -l_libs_start: - lib_0 l_libs lib_name_0, file_name, system_dir_0, import_proclib - lib_1 l_libs lib_name_1, file_name, system_dir_1, import_libimg - lib_2 l_libs lib_name_2, library_path, system_dir_2, import_buf2d - lib_3 l_libs lib_name_3, library_path, system_dir_3, import_des - lib_4 l_libs lib_name_4, library_path, system_dir_4, import_box_lib -l_libs_end: - -align 4 -import_libimg: - 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 -import_proclib: ;описание экспортируемых функций - OpenDialog_Init dd aOpenDialog_Init - OpenDialog_Start dd aOpenDialog_Start -dd 0,0 - aOpenDialog_Init db 'OpenDialog_init',0 - aOpenDialog_Start db 'OpenDialog_start',0 - -align 4 -import_buf2d: - init dd sz_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - ;buf2d_line dd sz_buf2d_line - ;buf2d_rect_by_size dd sz_buf2d_rect_by_size - ;buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size - ;buf2d_circle dd sz_buf2d_circle - ;buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - ;buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - ;buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - ;buf2d_bit_blt dd sz_buf2d_bit_blt - ;buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - ;buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - ;buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - ;buf2d_crop_color dd sz_buf2d_crop_color - ;buf2d_offset_h dd sz_buf2d_offset_h - ;buf2d_flood_fill dd sz_buf2d_flood_fill - ;buf2d_set_pixel dd sz_buf2d_set_pixel - dd 0,0 - sz_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - ;sz_buf2d_line db 'buf2d_line',0 - ;sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 - ;sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 - ;sz_buf2d_circle db 'buf2d_circle',0 - ;sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - ;sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - ;sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - ;sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - ;sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - ;sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - ;sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - ;sz_buf2d_crop_color db 'buf2d_crop_color',0 - ;sz_buf2d_offset_h db 'buf2d_offset_h',0 - ;sz_buf2d_flood_fill db 'buf2d_flood_fill',0 - ;sz_buf2d_set_pixel db 'buf2d_set_pixel',0 - -align 4 -import_des: ;описание экспортируемых функций - des_encryption dd sz_des_encryption - des_decryption dd sz_des_decryption -dd 0,0 - sz_des_encryption db 'des_encryption',0 - sz_des_decryption db 'des_decryption',0 - -align 4 -import_box_lib: - ;dd sz_init1 - edit_box_draw dd sz_edit_box_draw - edit_box_key dd sz_edit_box_key - edit_box_mouse dd sz_edit_box_mouse - ;edit_box_set_text dd sz_edit_box_set_text - - dd 0,0 - ;sz_init1 db 'lib_init',0 - sz_edit_box_draw db 'edit_box_draw',0 - sz_edit_box_key db 'edit_box_key',0 - sz_edit_box_mouse db 'edit_box_mouse',0 - ;sz_edit_box_set_text db 'edit_box_set_text',0 - -mouse_dd dd 0x0 - -align 4 -buf_0: dd 0 ;указатель на буфер изображения - dw 5 ;+4 left - dw 31 ;+6 top -.w: dd 456 ;+8 w -.h: dd 350 ;+12 h -.color: dd 0xffffd0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_1: - dd 0 ;указатель на буфер изображения - dw 25 ;+4 left - dw 25 ;+6 top - dd 128 ;+8 w - dd 144 ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -edit1 edit_box 58, 140,8, 0xffffff, 0xff, 0x80ff, 0, 0x8000, 8, txt_key, mouse_dd, ed_focus+ed_always_focus,8,8 - -txt_openfile db 'Откройте файл для шифрования или дешифрования.',0 -txt_buf rb 80 -txt_key db 'des_0123',0 -mem_key rb 120 - -align 16 -i_end: - procinfo process_information - sc system_colors - rb 2048 -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: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 1, start, i_end, mem, stacktop, 0, sys_path + +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../KOSfuncs.inc' +include '../../../../load_lib.mac' +include '../../../../develop/libraries/box_lib/box_lib.mac' +include '../../../../dll.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +caption db 'Шифрование алгоритмом DES 05.03.13',0 ;подпись окна + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +run_file_70 FileInfoBlock +image_data dd 0 ;указатель на временную память. для нужен преобразования изображения + +fn_toolbar db 'toolbar.png',0 +IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*5 +image_data_toolbar dd 0 + +IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением + +max_open_file_size equ 64*1024 ;64 Kb + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + ;path - может быть переменной или строковым параметром + if path eqtype '' ;проверяем задан ли строкой параметр path + jmp @f + local .path_str + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0x0 + else + copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + end if + + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + mov eax,SF_FILE + mov [run_file_70.Function], SSF_READ_FILE + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], [buf] + 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 + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall [img_decode], [buf],ebx,0 + mov [image_data],eax + ;преобразуем изображение к формату rgb + stdcall [img_to_rgb2], [image_data],[buf] + ;удаляем временный буфер image_data + stdcall [img_destroy], [image_data] + @@: +} + + + +align 4 +start: + load_libraries l_libs_start,l_libs_end + ;проверка на сколько удачно загузилась библиотека + mov ebp,lib_0 + 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,0xC0000027 + stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога + + stdcall [buf2d_create], buf_0 ;создание буфера + + load_image_file 'font8x9.bmp', image_data_toolbar,IMAGE_FILE1_SIZE + stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер + stdcall mem.Free,[image_data_toolbar] ;освобождаем память + stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит + stdcall [buf2d_convert_text_matrix], buf_1 + + load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE + + stdcall mem.Alloc,max_open_file_size + mov dword[open_file],eax + + call but_new_file + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall SF_WAIT_EVENT + + cmp al,1 + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + cmp al,6 ;мышь + jne @f + jmp mouse + @@: + jmp still + +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)+480, (20 shl 16)+410 + + ; *** создание кнопок на панель *** + mov esi,[sc.work_button] + mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (5 shl 16)+20, 3 + mcall ,(30 shl 16)+20,,4 + mcall ,(55 shl 16)+20,,5 + mcall ,(85 shl 16)+20,,6 + mcall ,(110 shl 16)+20,,7 + + ; *** рисование иконок на кнопках *** + mcall SF_PUT_IMAGE, [image_data_toolbar], (16 shl 16)+16, (7 shl 16)+7 ;icon new + + 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 + + stdcall [edit_box_draw], edit1 + + ; *** рисование буфера *** + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW,SSF_END_DRAW +popad + ret + +align 4 +key: + mcall SF_GET_KEY + stdcall [edit_box_key], dword edit1 + jmp still + +align 4 +mouse: + stdcall [edit_box_mouse], edit1 + jmp still + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,3 + jne @f + call but_new_file + @@: + cmp ah,4 + jne @f + call but_open_file + @@: + cmp ah,5 + jne @f + call but_save_file + @@: + cmp ah,6 + jne @f + call but_1 + @@: + cmp ah,7 + jne @f + call but_2 + @@: + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 + stdcall [buf2d_delete],buf_1 ;удаляем буфер + stdcall mem.Free,[image_data_toolbar] + stdcall mem.Free,[open_file] + mcall SF_TERMINATE_PROCESS + + +align 4 +but_new_file: + mov dword[open_file_size],0 + call draw_file + ret + +align 4 +open_file dd 0 ;указатель на память для открытия файлов +open_file_size dd 0 ;размер открытого файла (должен быть не больше max_open_file_size) + +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],2 + je .end_open_file + ;код при удачном открытии диалога + + mov eax,SF_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], max_open_file_size + m2m [run_file_70.Buffer], [open_file] + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je .end_open_file + + mov [open_file_size],ebx + add ebx,[open_file] + mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом + mcall SF_SET_CAPTION,1,openfile_path + + call draw_file + .end_open_file: + popad + ret + +align 4 +draw_file: +pushad + stdcall [buf2d_clear], buf_0, [buf_0.color] + cmp dword[open_file_size],0 + je .open_file + mov eax,[open_file] + mov ebx,3 + mov edx,[open_file_size] + .cycle_0: + mov edi,txt_buf + mov esi,eax + mov ecx,56 + ;cld + rep movsb + mov byte[edi],0 + mov edi,txt_buf + mov ecx,56 + .cycle_1: + cmp byte[edi],0 + je @f + cmp byte[edi],13 + je @f + jmp .ok + @@: + mov byte[edi],' ' ;непечатные символы заменяем на пробел + .ok: + inc edi + loop .cycle_1 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,4,ebx,0xb0 + sub edx,56 + cmp edx,1 + jl @f + add eax,56 + add ebx,10 + cmp ebx,[buf_0.h] + jl .cycle_0 + jmp @f + .open_file: + stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000 + @@: + stdcall [buf2d_draw], buf_0 +popad + ret + +align 4 +but_save_file: + 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],2 + je .end_save_file + ;код при удачном открытии диалога + + mov eax,SF_FILE + mov [run_file_70.Function], SSF_CREATE_FILE + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov ebx, dword[open_file] + mov [run_file_70.Buffer], ebx + mov ebx,[open_file_size] + mov dword[run_file_70.Count], ebx ;размер файла + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mov ebx,run_file_70 + int 0x40 ;сохраняем файл изображения + ;cmp ebx,0xffffffff + ;je .end_save_file + ; ... сообщение о неудачном сохранении ... + + .end_save_file: + popad + ret + +align 4 +but_1: +push eax + mov eax,[open_file_size] + shr eax,3 + stdcall [des_encryption], txt_key,mem_key,[open_file],eax +pop eax + call draw_file + ret + +align 4 +but_2: +push eax + mov eax,[open_file_size] + shr eax,3 + stdcall [des_decryption], txt_key,mem_key,[open_file],eax +pop eax + call draw_file + ret + +;данные для диалога открытия файлов +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 '/sys',0 + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_name: + db 'opendial',0 +communication_area_default_path: + db '/sys/File managers/',0 + +Filter: +dd Filter.end - Filter ;.1 +.1: +db 'TXT',0 +db 'ASM',0 +.end: +db 0 + + +system_dir_0 db '/sys/lib/' +lib_name_0 db 'proc_lib.obj',0 +system_dir_1 db '/sys/lib/' +lib_name_1 db 'libimg.obj',0 +system_dir_2 db '/sys/lib/' +lib_name_2 db 'buf2d.obj',0 +system_dir_3 db '/sys/lib/' +lib_name_3 db 'crypt_des.obj',0 +system_dir_4 db '/sys/lib/' +lib_name_4 db 'box_lib.obj',0 + +l_libs_start: + lib_0 l_libs lib_name_0, file_name, system_dir_0, import_proclib + lib_1 l_libs lib_name_1, file_name, system_dir_1, import_libimg + lib_2 l_libs lib_name_2, library_path, system_dir_2, import_buf2d + lib_3 l_libs lib_name_3, library_path, system_dir_3, import_des + lib_4 l_libs lib_name_4, library_path, system_dir_4, import_box_lib +l_libs_end: + +align 4 +import_libimg: + 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 +import_proclib: ;описание экспортируемых функций + OpenDialog_Init dd aOpenDialog_Init + OpenDialog_Start dd aOpenDialog_Start +dd 0,0 + aOpenDialog_Init db 'OpenDialog_init',0 + aOpenDialog_Start db 'OpenDialog_start',0 + +align 4 +import_buf2d: + init dd sz_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + ;buf2d_line dd sz_buf2d_line + ;buf2d_rect_by_size dd sz_buf2d_rect_by_size + ;buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + ;buf2d_circle dd sz_buf2d_circle + ;buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + ;buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + ;buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + ;buf2d_bit_blt dd sz_buf2d_bit_blt + ;buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + ;buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + ;buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + ;buf2d_crop_color dd sz_buf2d_crop_color + ;buf2d_offset_h dd sz_buf2d_offset_h + ;buf2d_flood_fill dd sz_buf2d_flood_fill + ;buf2d_set_pixel dd sz_buf2d_set_pixel + dd 0,0 + sz_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + ;sz_buf2d_line db 'buf2d_line',0 + ;sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 + ;sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + ;sz_buf2d_circle db 'buf2d_circle',0 + ;sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + ;sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + ;sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + ;sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + ;sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + ;sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + ;sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + ;sz_buf2d_crop_color db 'buf2d_crop_color',0 + ;sz_buf2d_offset_h db 'buf2d_offset_h',0 + ;sz_buf2d_flood_fill db 'buf2d_flood_fill',0 + ;sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + +align 4 +import_des: ;описание экспортируемых функций + des_encryption dd sz_des_encryption + des_decryption dd sz_des_decryption +dd 0,0 + sz_des_encryption db 'des_encryption',0 + sz_des_decryption db 'des_decryption',0 + +align 4 +import_box_lib: + ;dd sz_init1 + edit_box_draw dd sz_edit_box_draw + edit_box_key dd sz_edit_box_key + edit_box_mouse dd sz_edit_box_mouse + ;edit_box_set_text dd sz_edit_box_set_text + + dd 0,0 + ;sz_init1 db 'lib_init',0 + sz_edit_box_draw db 'edit_box_draw',0 + sz_edit_box_key db 'edit_box_key',0 + sz_edit_box_mouse db 'edit_box_mouse',0 + ;sz_edit_box_set_text db 'edit_box_set_text',0 + +mouse_dd dd 0x0 + +align 4 +buf_0: dd 0 ;указатель на буфер изображения + dw 5 ;+4 left + dw 31 ;+6 top +.w: dd 456 ;+8 w +.h: dd 350 ;+12 h +.color: dd 0xffffd0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: + dd 0 ;указатель на буфер изображения + dw 25 ;+4 left + dw 25 ;+6 top + dd 128 ;+8 w + dd 144 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +edit1 edit_box 58, 140,8, 0xffffff, 0xff, 0x80ff, 0, 0x8000, 8, txt_key, mouse_dd, ed_focus+ed_always_focus,8,8 + +txt_openfile db 'Откройте файл для шифрования или дешифрования.',0 +txt_buf rb 80 +txt_key db 'des_0123',0 +mem_key rb 120 + +align 16 +i_end: + procinfo process_information + sc system_colors + rb 2048 +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: diff --git a/programs/develop/libraries/fontslib/trunk/font_ex.asm b/programs/develop/libraries/fontslib/trunk/font_ex.asm index 623e7ae72..98853e172 100644 --- a/programs/develop/libraries/fontslib/trunk/font_ex.asm +++ b/programs/develop/libraries/fontslib/trunk/font_ex.asm @@ -1,206 +1,212 @@ -; Copyright (c) 2009, -; All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in the -; documentation and/or other materials provided with the distribution. -; * Neither the name of the nor the -; names of its contributors may be used to endorse or promote products -; derived from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname ''AS IS'' AND ANY -; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;***************************************************************************** - -;заголовок приложения -use32 ; транслятор, использующий 32 разрядных команды - org 0x0 ; базовый адрес кода, всегда 0x0 - db 'MENUET01' ; идентификатор исполняемого файла (8 байт) - dd 0x1 ; версия формата заголовка исполняемого файла - dd start ; адрес, на который система передаёт управление - ; после загрузки приложения в память - dd mem ; размер приложения - dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта - dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше - dd 0x0 ; указатель на строку с параметрами. - dd way_of_ini -include '../../../../macros.inc' -include '../../../../KOSfuncs.inc' -include '../../../../load_lib.mac' -include '../../box_lib/trunk/box_lib.mac' - @use_library ;use load lib macros -start: -;universal load library/librarys -sys_load_libraries l_libs_start,end_l_libs -;if return code =-1 then exit, else nornary work - cmp eax,-1 - jz exit - mcall 40,0x27 ;установить маску для ожидаемых событий - - mov eax,48 - mov ebx,3 - mov ecx,sc - mov edx,sizeof.system_colors - mcall - mov eax,dword [sc.work] - mov dword [con_colors+4],eax - -; mcall 66,1,0 - call [initialization_font] ; инициализация списка шрифтов - push dword (8 shl 16 +16) ; поиск нужного шрифта в наборе шрифтов (пока доступен только 8х16) - call [get_font] - test eax,eax ;нашли ? - jnz exit -;;;;;;;;;;;;;;;;;;;; - mcall 40,0x27 ;установить маску для ожидаемых событий -red_win: - call draw_window ;первоначально необходимо нарисовать окно -align 4 -still: ;основной обработчик - mcall 10 ;Ожидать события - dec eax - jz red_win - dec eax - jz key - dec eax - jz button - - push dword edit1 - call [edit_box_mouse] - - jmp still ;если ничего из перечисленного то снова в цикл -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -button: - mcall 17 ;получить идентификатор нажатой клавиши - test ah,ah ;если в ah 0, то перейти на обработчик событий still - jz still -exit: - call [free_fulder_info] - call [free_font] - mcall -1 -key: - mcall 2 ;загрузим значение 2 в регистор eax и получим код нажатой клавиши - - push dword edit1 - call [edit_box_key] - - - mcall 13,<20,650>,<40,16>, dword[con_colors+4] - - - push dword 20 shl 16 + 40 ; esp+12= dd x shl 16 + y x- координата по Х, y - координата по Y - push dword con_colors ; esp+8 = dd point to color of background and font - push dword text ; esp+4 = dd point to ASCIIZ -; esp+0 = dd back - call [font_draw_on_string] ; вывести по глифам строчку - - - jmp still - -;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -align 4 -draw_window: ;рисование окна приложения - mcall 12,1 - xor eax,eax ;обнулить eax - mov ebx,50*65536+680 ;[координата по оси x]*65536 + [размер по оси x] - mov ecx,30*65536+200 ;[координата по оси y]*65536 + [размер по оси y] - mov edx,[sc.work] ; color of work area RRGGBB,8->color gl - or edx,0x34000000 - mov edi,hed - mcall ;нарисовать окно приложения - - push dword edit1 - call [edit_box_draw] -; - push dword 20 shl 16 + 40 ; esp+12= dd x shl 16 + y x- координата по Х, y - координата по Y - push dword con_colors ; esp+8 = dd point to color of background and font - push dword text; esp+4 = dd point to ASCIIZ -; esp+0 = dd back - call [font_draw_on_string] ; вывести по глифам строчку - mov eax,12 ;Функция 12 - начать/закончить перерисовку окна. - mov ebx,2 ;Подфункция 2 - закончить перерисовку окна. - mcall - ret -;;;;;;;;;;;; -;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -;DATA данные -l_libs_start: -library01 l_libs library_name, library_path, system_path, font_import -library02 l_libs library_name1, library_path, system_path1, import_box_lib -end_l_libs: - -; -system_path db '/sys/lib/' -library_name db 'fonts_lib.obj',0 - -system_path1 db '/sys/lib/' -library_name1 db 'box_lib.obj',0 - -align 4 -import_box_lib: - -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 - - dd 0,0 - -aEdit_box_draw db 'edit_box_draw',0 -aEdit_box_key db 'edit_box_key',0 -aEdit_box_mouse db 'edit_box_mouse',0 -aVersion_ed db 'version_ed',0 - -font_import: -initialization_font dd a_initialization_font -get_font dd a_get_font -free_fulder_info dd a_free_fulder_info -free_font dd a_free_font -font_draw_on_string dd a_font_draw_on_string -show_all_glif dd a_show_all_glif -Version_fn dd a_Version_fn - dd 0,0 - -a_initialization_font db 'initialization_font',0 -a_get_font db 'get_font',0 -a_free_fulder_info db 'free_fulder_info',0 -a_free_font db 'free_font',0 -a_font_draw_on_string db 'font_draw_on_string',0 -a_show_all_glif db 'show_all_glif',0 -a_Version_fn db 'version_fn',0 - - - -edit1 edit_box 350,175,5,0xffffff,0x6f9480,0,0xAABBCC,0,test_leght,text,ed_focus,text_end-text-1,text_end-text-1 - -text db 'Пример использования библиотеки шрифтов fonts_lib.obj',0 -text_end: -rb 256 -test_leght = ($-text)-1 - -hed db "Font's demo ",0 -align 4 -con_colors dd 0x1E1EFF, 0x96FFCF - -align 4 -sc system_colors -way_of_ini rb 4096 -library_path rb 4096 - -align 4 -i_end: -rb 1024 -mem: - ;конец кода \ No newline at end of file +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +; Copyright (c) 2009, +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; * Neither the name of the nor the +; names of its contributors may be used to endorse or promote products +; derived from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname ''AS IS'' AND ANY +; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +;***************************************************************************** + +;заголовок приложения +use32 ; транслятор, использующий 32 разрядных команды + org 0x0 ; базовый адрес кода, всегда 0x0 + db 'MENUET01' ; идентификатор исполняемого файла (8 байт) + dd 0x1 ; версия формата заголовка исполняемого файла + dd start ; адрес, на который система передаёт управление + ; после загрузки приложения в память + dd mem ; размер приложения + dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта + dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше + dd 0x0 ; указатель на строку с параметрами. + dd way_of_ini +include '../../../../macros.inc' +include '../../../../KOSfuncs.inc' +include '../../../../load_lib.mac' +include '../../box_lib/box_lib.mac' + @use_library ;use load lib macros +start: +;universal load library/librarys +sys_load_libraries l_libs_start,end_l_libs +;if return code =-1 then exit, else nornary work + cmp eax,-1 + jz exit + mcall 40,0x27 ;установить маску для ожидаемых событий + + mov eax,48 + mov ebx,3 + mov ecx,sc + mov edx,sizeof.system_colors + mcall + mov eax,dword [sc.work] + mov dword [con_colors+4],eax + +; mcall 66,1,0 + call [initialization_font] ; инициализация списка шрифтов + push dword (8 shl 16 +16) ; поиск нужного шрифта в наборе шрифтов (пока доступен только 8х16) + call [get_font] + test eax,eax ;нашли ? + jnz exit +;;;;;;;;;;;;;;;;;;;; + mcall 40,0x27 ;установить маску для ожидаемых событий +red_win: + call draw_window ;первоначально необходимо нарисовать окно +align 4 +still: ;основной обработчик + mcall 10 ;Ожидать события + dec eax + jz red_win + dec eax + jz key + dec eax + jz button + + push dword edit1 + call [edit_box_mouse] + + jmp still ;если ничего из перечисленного то снова в цикл +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +button: + mcall 17 ;получить идентификатор нажатой клавиши + test ah,ah ;если в ah 0, то перейти на обработчик событий still + jz still +exit: + call [free_fulder_info] + call [free_font] + mcall -1 +key: + mcall 2 ;загрузим значение 2 в регистор eax и получим код нажатой клавиши + + push dword edit1 + call [edit_box_key] + + + mcall 13,<20,650>,<40,16>, dword[con_colors+4] + + + push dword 20 shl 16 + 40 ; esp+12= dd x shl 16 + y x- координата по Х, y - координата по Y + push dword con_colors ; esp+8 = dd point to color of background and font + push dword text ; esp+4 = dd point to ASCIIZ +; esp+0 = dd back + call [font_draw_on_string] ; вывести по глифам строчку + + + jmp still + +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +align 4 +draw_window: ;рисование окна приложения + mcall 12,1 + xor eax,eax ;обнулить eax + mov ebx,50*65536+680 ;[координата по оси x]*65536 + [размер по оси x] + mov ecx,30*65536+200 ;[координата по оси y]*65536 + [размер по оси y] + mov edx,[sc.work] ; color of work area RRGGBB,8->color gl + or edx,0x34000000 + mov edi,hed + mcall ;нарисовать окно приложения + + push dword edit1 + call [edit_box_draw] +; + push dword 20 shl 16 + 40 ; esp+12= dd x shl 16 + y x- координата по Х, y - координата по Y + push dword con_colors ; esp+8 = dd point to color of background and font + push dword text; esp+4 = dd point to ASCIIZ +; esp+0 = dd back + call [font_draw_on_string] ; вывести по глифам строчку + mov eax,12 ;Функция 12 - начать/закончить перерисовку окна. + mov ebx,2 ;Подфункция 2 - закончить перерисовку окна. + mcall + ret +;;;;;;;;;;;; +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +;DATA данные +l_libs_start: +library01 l_libs library_name, library_path, system_path, font_import +library02 l_libs library_name1, library_path, system_path1, import_box_lib +end_l_libs: + +; +system_path db '/sys/lib/' +library_name db 'fonts_lib.obj',0 + +system_path1 db '/sys/lib/' +library_name1 db 'box_lib.obj',0 + +align 4 +import_box_lib: + +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 + + dd 0,0 + +aEdit_box_draw db 'edit_box_draw',0 +aEdit_box_key db 'edit_box_key',0 +aEdit_box_mouse db 'edit_box_mouse',0 +aVersion_ed db 'version_ed',0 + +font_import: +initialization_font dd a_initialization_font +get_font dd a_get_font +free_fulder_info dd a_free_fulder_info +free_font dd a_free_font +font_draw_on_string dd a_font_draw_on_string +show_all_glif dd a_show_all_glif +Version_fn dd a_Version_fn + dd 0,0 + +a_initialization_font db 'initialization_font',0 +a_get_font db 'get_font',0 +a_free_fulder_info db 'free_fulder_info',0 +a_free_font db 'free_font',0 +a_font_draw_on_string db 'font_draw_on_string',0 +a_show_all_glif db 'show_all_glif',0 +a_Version_fn db 'version_fn',0 + + + +edit1 edit_box 350,175,5,0xffffff,0x6f9480,0,0xAABBCC,0,test_leght,text,ed_focus,text_end-text-1,text_end-text-1 + +text db 'Пример использования библиотеки шрифтов fonts_lib.obj',0 +text_end: +rb 256 +test_leght = ($-text)-1 + +hed db "Font's demo ",0 +align 4 +con_colors dd 0x1E1EFF, 0x96FFCF + +align 4 +sc system_colors +way_of_ini rb 4096 +library_path rb 4096 + +align 4 +i_end: +rb 1024 +mem: + ;конец кода diff --git a/programs/develop/libraries/nnp/examples/nnp_points.asm b/programs/develop/libraries/nnp/examples/nnp_points.asm index 2a8edac0a..42d880879 100644 --- a/programs/develop/libraries/nnp/examples/nnp_points.asm +++ b/programs/develop/libraries/nnp/examples/nnp_points.asm @@ -1,747 +1,753 @@ -use32 - org 0 - db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт - dd 1, start, i_end, mem, stacktop, 0, sys_path - -include '../../../../macros.inc' -include '../../../../proc32.inc' -include '../../../../KOSfuncs.inc' -include '../../../../load_img.inc' -include '../../../../load_lib.mac' -include '../../../../develop/libraries/box_lib/trunk/box_lib.mac' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'NNP example 28.05.22',0 ;подпись окна - -run_file_70 FileInfoBlock - -IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 -image_data_toolbar dd 0 - -memory_file_size dd 512*1024 ;размер памяти для открытия файлов (в начале 512 Kb, но может увеличиватся при необходимости) - -NNP_FF_BIN equ 0x6e6962 -NNP_FF_JSON equ 0x6e6f736a - -struct NeuralNetwork - learningRate dq ? ;+ 0 скорость обучения - layers dd ? ;+ 8 [] слои - layers_length dd ? ;+12 число слоев - activation dd ? ;+16 указатель на функцию активации - derivative dd ? ;+20 указатель на функцию - errors dd ? ;+24 массив для вычислений - errorsNext dd ? ;+28 - gradients dd ? ;+32 - deltas dd ? ;+36 -ends - -struct Point - x dq ? ;double - y dq ? - t dd ? ;long -ends - -align 4 -NNLOPT_LEN equ 4 -nnlopt dd 2,3,3,2 -_nn NeuralNetwork -lea_rate dq 0.01 - -POINTS_COUNT equ 8 ;число точек -_p rb sizeof.Point*POINTS_COUNT - -_cycles_st dd 0 -_r_op rb 128 -txt_error db '"Error open: ',39,'%s',39,'" -tE',0 -txt_cycles db 'Cycles = %i000',0 - -;Макрос для параметров типа double (8 байт) -macro glpush double_v { - push dword[double_v+4] - push dword[double_v] -} - -align 8 -proc __ftol - sub esp,12 - wait - fstcw word[esp+8] - wait - mov al,[esp+9] - or byte[esp+9],0x0c - fldcw word[esp+8] - fistp qword[esp] - mov [esp+9],al - fldcw word[esp+8] - mov eax,[esp] - mov edx,[esp+4] - add esp,12 - ret -endp - -align 16 -Math_random: - imul eax,dword[_rand_x],22695477 - inc eax - push ecx - mov dword[_rand_x],eax - and eax,65535 - mov dword[esp],eax - fild dword[esp] - fmul dword[@f] - pop edx - ret -align 4 -@@: - db 0,0,128,55 ;dd 1.0/65536.0 -_rand_x dd 0 - - -align 8 -start: - load_libraries l_libs_start,l_libs_end - ;проверка на сколько удачно загузилась библиотека - mov ebp,lib_0 - 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,0xC0000027 - stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога - stdcall [buf2d_create], buf_0 ;создание буфера - - include_image_file 'toolbar.png', image_data_toolbar - - stdcall mem.Alloc,[memory_file_size] - mov dword[open_file],eax - - push NNLOPT_LEN - push nnlopt - push 0 - push 0 - glpush lea_rate - stdcall [NNP_Create], _nn - call but_update - -align 8 -red_win: - call draw_window - -align 16 -still: - mcall SF_WAIT_EVENT - - cmp al,1 - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - cmp al,6 ;мышь - jne @f - jmp mouse - @@: - jmp still - -align 8 -draw_window: -pushad - mcall SF_REDRAW,SSF_BEGIN_DRAW - - ; *** рисование главного окна (выполняется 1 раз при запуске) *** - mov edx,[sc.work] - or edx,(3 shl 24)+0x30000000 - mov edi,caption - mcall SF_CREATE_WINDOW, (20 shl 16)+590, (20 shl 16)+540 - - ; *** создание кнопок на панель *** - mov esi,[sc.work_button] - mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (5 shl 16)+20, 3 - - 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 - - ; *** рисование иконок на кнопках *** - mcall SF_PUT_IMAGE, [image_data_toolbar], (16 shl 16)+16, (7 shl 16)+7 ;icon new - - 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) ;icon update points - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;icon calculate - int 0x40 - - call PointsDraw - ; *** рисование буфера *** - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW,SSF_END_DRAW -popad - ret - -align 8 -key: - mcall SF_GET_KEY - jmp still - -align 8 -mouse: - - jmp still - -align 8 -button: - mcall SF_GET_BUTTON - cmp ah,3 - jne @f - call but_new_file - jmp red_win - @@: - cmp ah,4 - jne @f - call but_open_file - jmp red_win - @@: - cmp ah,5 - jne @f - call but_save_file - jmp red_win - @@: - cmp ah,6 - jne @f - call but_update - jmp red_win - @@: - cmp ah,7 - jne @f - call but_calc - jmp red_win - @@: - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 - stdcall mem.Free,[image_data_toolbar] - stdcall mem.Free,[open_file] - stdcall [NNP_Destroy], _nn - mcall SF_TERMINATE_PROCESS - -align 8 -but_calc: - push esi edi ebp - add esp,-32 - mov ebp,_p - xor edi,edi ;i=0 -.cycle_0: ;for(i=0;i<50000;i++) - call Math_random - fimul dword[.172] - call __ftol - mov esi,eax ;k=(long)(Math_random()*POINTS_COUNT) - imul esi,sizeof.Point - fld qword[ebp+esi+Point.x] - fsub dword[f_0_5] - fstp qword[esp] ;v[0]=p[k].x-.5 - fld qword[ebp+esi+Point.y] - fsub dword[f_0_5] - fstp qword[esp+8] ;v[1]=p[k].y-.5 - stdcall [NNP_FeedForward], _nn,esp ;r=NNP_FeedForward(&nn,v) - - xor eax,eax - mov dword[esp+16],eax - mov dword[esp+20],eax ;t[0]=0.0 - mov dword[esp+24],eax - mov dword[esp+28],eax ;t[1]=0.0 - cmp dword[ebp+esi+Point.t],eax - je .173 - mov dword[esp+16],eax - mov dword[esp+20],1072693248 ;if(p[k].t) t[0]=1.0 - jmp .174 -.173: - mov dword[esp+24],eax - mov dword[esp+28],1072693248 ;else t[1]=1.0 -.174: - lea edx,dword[esp+16] - stdcall [NNP_BackPropagation], _nn,edx ;NNP_BackPropagation(&nn,t) - inc edi ;i++ - cmp edi,50000 - jl .cycle_0 - add dword[_cycles_st],50 - stdcall [sprintf], _r_op,txt_cycles,[_cycles_st] - add esp,12 - call NNP_DrawInBuf - call PointsDraw -; SaveNN("/tmp0/1/nnp_end.txt") - ;push s@+835 - ;call @@SaveNN$qpxc - ;pop ecx - mcall SF_SET_CAPTION,1,_r_op - add esp,32 - pop ebp edi esi - ret -align 4 -.172: - dd POINTS_COUNT - -align 8 -but_new_file: - mov dword[_cycles_st],0 - stdcall [NNP_Reset], _nn - call NNP_DrawInBuf - call PointsDraw - ret - -align 8 -but_update: - mov dword[_cycles_st],0 - call PointsInit - call NNP_DrawInBuf - call PointsDraw - ret - -align 8 -PointsInit: - push ebx esi - xor esi,esi ;i=0 - mov ebx,_p -.cycle_0: ;for(i=0;i user_box -align 4 -proc draw_rect_border, client_rect:dword, user_box:dword - pushad - mov esi,[user_box] - cmp esi,0 - je @f - mov edi,[client_rect] - mov ebx,dword[edi+8] ;+8 = width - inc bx - mov ecx,dword[esi+4] ;+4 = top - mov edx,[sc.work] - mcall SF_DRAW_RECT ;top - - mov eax,dword[esi+4] ;+4 = top - add eax,dword[esi+12] ;+12 = height - cmp eax,dword[edi+12] - jge .no_bottom - mov ecx,eax - shl ecx,16 - mov cx,word[edi+12] ;+12 = bottom - inc cx - sub cx,ax - mcall SF_DRAW_RECT ;bottom - .no_bottom: - - mov ebx,dword[esi] ;+0 left - mov ecx,dword[esi+4] ;+4 = top - shl ecx,16 - mov cx,word[esi+12] ;+12 = height - inc cx - mcall SF_DRAW_RECT ;left - - mov eax,dword[esi] ;+0 left - add eax,dword[esi+8] ;+8 = width - mov ebx,eax - shl ebx,16 - mov bx,word[edi+8] ;+8 = right - sub bx,ax - inc bx - mcall SF_DRAW_RECT ;right - @@: - popad - ret -endp - -align 4 -draw_display: - - stdcall mem_copy, [buf_fon],[buf_displ],[displ_bytes] ;копирование изображения из фонового буфера - call DrawZaac ;рисуем зайца - call DrawWolf ;рисуем волка - call DrawEggs ;рисуем яйца - -push eax - mov eax,[displ_w] - shr eax,1 - stdcall [buf2d_draw_text], buf_displ, buf_font,game_text,eax,[offs_shadow_x],[color_wolf] ;рисуем строку с текстом -pop eax - stdcall [buf2d_draw], buf_displ - ret - -align 4 -button: - mcall SF_GET_BUTTON - - cmp ah,5 - jne @f - stdcall InitGame,0 - @@: - cmp ah,6 - jne @f - stdcall InitGame,1 - @@: - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_fon ;удаляем буфер - stdcall [buf2d_delete],buf_displ ;удаляем буфер - - stdcall [buf2d_delete],buf_tree_sys - stdcall [buf2d_delete],buf_font - - cld - mov ecx,3 - mov edi,buf_decor - @@: ;удаляем 3 буфера - stdcall [buf2d_delete],edi - add edi,BUF_STRUCT_SIZE - loop @b - mov ecx,9 - mov edi,buf_wolf - @@: ;удаляем 9 буферов с волком и зайцем - stdcall [buf2d_delete],edi - add edi,BUF_STRUCT_SIZE - loop @b - mov ecx,13 - mov edi,buf_chi - @@: ;удаляем 13 буферов - stdcall [buf2d_delete],edi - add edi,BUF_STRUCT_SIZE - loop @b - mov ecx,22 - mov edi,buf_egg - @@: ;удаляем 22 буфера - stdcall [buf2d_delete],edi - add edi,BUF_STRUCT_SIZE - loop @b - - mov dword[tree1.data_img_sys],0 ;чистим указатель на изображение - stdcall dword[tl_data_clear], tree1 - mcall SF_TERMINATE_PROCESS - -system_dir0 db '/sys/lib/' -lib0_name db 'buf2d.obj',0 -system_dir1 db '/sys/lib/' -lib1_name db 'libimg.obj',0 -system_dir2 db '/sys/lib/' -lib2_name db 'libini.obj',0 -system_dir3 db '/sys/lib/' -lib3_name db 'box_lib.obj',0 - -;library structures -l_libs_start: - lib0 l_libs lib0_name, file_name, system_dir0, import_buf2d_lib - lib1 l_libs lib1_name, file_name, system_dir1, import_libimg - lib2 l_libs lib2_name, file_name, system_dir2, import_libini - lib3 l_libs lib3_name, file_name, system_dir3, import_box_lib -load_lib_end: - -align 4 -proc mem_copy uses ecx esi edi, source:dword, destination:dword, len:dword - cld - mov esi, [source] - mov edi, [destination] - mov ecx, [len] - rep movsb - ret -endp - -;input: -; eax - число -; edi - буфер для строки -align 4 -convert_to_str: - pushad - lea esi,[edi+8] ;8 - длинна буфера -1 - call .str - popad - ret - -align 4 -.str: - mov ecx,10 - cmp eax,ecx - jb @f - xor edx,edx - div ecx - push edx - ;dec edi ;смещение необходимое для записи с конца строки - call .str - pop eax - @@: - cmp edi,esi - jge @f - or al,0x30 - stosb - mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор - @@: - ret - - -last_time dd 0 -image_data dd 0 ;память для преобразования картинки функциями libimg -image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты - -run_file_70 FileInfoBlock -hed db 'Nu pogodi 10.12.20',0 ;подпись окна -sc system_colors ;системные цвета - -count_of_dir_list_files equ 10 -el_focus dd tree1 -tree1 tree_list FILE_NAME_MAX,count_of_dir_list_files+2, tl_key_no_edit+tl_draw_par_line+tl_list_box_mode,\ - 16,16, 0x8080ff,0x0000ff,0xffffff, 10,10,140,100, 0,0,0, el_focus,\ - 0,user_is_select - -align 4 -buf_tree_sys: - dd 0 ;указатель на буфер изображения - dw 0 ;+4 left - dw 0 ;+6 top - dd 16 ;+8 w - dd 16*11 ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_font: ;буфер со шрифтом - dd 0 ;указатель на буфер изображения - dw 25 ;+4 left - dw 25 ;+6 top - dd 128 ;+8 w - dd 144 ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_displ: - dd 0 ;указатель на буфер изображения - dw 25,0 - dd ? ;+8 w - dd ? ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_fon: ;фоновый буфер - dd 0 ;указатель на буфер изображения - dw 0 ;+4 left - dw 0 ;+6 top - dd ? ;+8 w - dd ? ;+12 h - dd 0xffffff ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_decor: ;буфера с декорациями: домиками и рейками; с курицами; с растениями - rb 3*BUF_STRUCT_SIZE - -align 4 -buf_wolf: - rb 9*BUF_STRUCT_SIZE - -align 4 -buf_egg: - rb 22*BUF_STRUCT_SIZE - -align 4 -buf_chi: - rb 13*BUF_STRUCT_SIZE - - - -align 4 -import_libini: - dd alib_init0 - ini_get_str dd aini_get_str - ini_get_int dd aini_get_int - ini_get_color dd aini_get_color -dd 0,0 - alib_init0 db 'lib_init',0 - aini_get_str db 'ini_get_str',0 - aini_get_int db 'ini_get_int',0 - aini_get_color db 'ini_get_color',0 - -align 4 -import_libimg: - 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 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_line dd sz_buf2d_line - buf2d_circle dd sz_buf2d_circle - buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - buf2d_crop_color dd sz_buf2d_crop_color - buf2d_offset_h dd sz_buf2d_offset_h - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_line db 'buf2d_line',0 - sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - sz_buf2d_crop_color db 'buf2d_crop_color',0 - sz_buf2d_offset_h db 'buf2d_offset_h',0 - -align 4 -import_box_lib: - dd alib_init2 - - ;scrollbar_ver_draw dd aScrollbar_ver_draw - - 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 - -dd 0,0 - alib_init2 db 'lib_init',0 - - ;aScrollbar_ver_draw db 'scrollbar_v_draw',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 - - -align 16 -i_end: - procinfo process_information - rb 1024 -stacktop: - sys_path rb 4096 - file_name: - rb 4096 - openfile_path: - rb 4096 - filename_area: - rb 256 -mem: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 1, start, i_end, mem, stacktop, 0, sys_path + +include '../../macros.inc' +include '../../proc32.inc' +include '../../KOSfuncs.inc' +include '../../load_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' ;макросы для задания элементов box_lib +include '../../dll.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, dll.Load + +;флаги, для функции обрезания буфера +BUF2D_OPT_CROP_TOP equ 1 ;обрезка сверху +BUF2D_OPT_CROP_LEFT equ 2 ;обрезка слева +BUF2D_OPT_CROP_BOTTOM equ 4 ;обрезка снизу +BUF2D_OPT_CROP_RIGHT equ 8 ;обрезка справа +BUF2D_BIT_OPT_CROP_TOP equ 0 +BUF2D_BIT_OPT_CROP_LEFT equ 1 +BUF2D_BIT_OPT_CROP_BOTTOM equ 2 +BUF2D_BIT_OPT_CROP_RIGHT equ 3 + +BUF_STRUCT_SIZE equ 21 +buf2d_data equ dword[edi] ;данные буфера изображения +buf2d_w equ dword[edi+8] ;ширина буфера +buf2d_h equ dword[edi+12] ;высота буфера +buf2d_l equ word[edi+4] ;отступ слева +buf2d_t equ word[edi+6] ;отступ сверху +buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера +buf2d_color equ dword[edi+16] ;цвет фона буфера +buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +displ_w dd ? ;ширина поля +displ_h dd ? ;высота поля +displ_bytes dd ? ;размер 1-го файла с изображением +offs_shadow_x dd ? ;сдвиг теней по оси 'x' +offs_shadow_y dd ? ;сдвиг теней по оси 'y' + +IMAGE_FONT_SIZE equ 128*144*3 + +BUT1_T equ 10 ;отступ сверху +BUT1_L equ 15 ;отступ слева +BUT1_W equ 50 ;ширина +BUT1_H equ 20 ;высота +BUT1_NEXT_TOP equ (BUT1_T+BUT1_H)*65536 + +game_select_mode db 1 ;режим выбора игры + +FILE_NAME_MAX equ 20 ;максимальная длинна имени файла (без папок, относительно текущей) +;значения имен по умолчанию +ini_def_decorat_file db 'curici.png',0 +ini_def_unit_file db 'wolf.png',0 +ini_def_objects_file db 'eggs.png',0 +ini_def_lost_file db 'chi.png',0 +;имена файлов +fn_icon0 rb FILE_NAME_MAX ;имя файла с декорациями +fn_icon1 rb FILE_NAME_MAX ;имя файла с волком и зайцем +fn_icon2 rb FILE_NAME_MAX ;имя файла с яйцами +fn_icon3 rb FILE_NAME_MAX ;имя файла с циплятами + +TREE_ICON_SYS16_BMP_SIZE equ 256*3*11+54 ;размер bmp файла с системными иконками + +ini_m_name db 'main.ini',0 +key_count db 'count',0 +key_game db 'g' + key_game_ind db 0,0,0 + +ini_name rb FILE_NAME_MAX ;имя ini файла c выбранной игрой +ini_sec_files db 'Files',0 +key_file_decorat db 'file_decorat',0 +key_file_unit db 'file_unit',0 +key_file_objects db 'file_objects',0 +key_file_lost db 'file_lost',0 +key_displ_w db 'displ_w',0 +key_displ_h db 'displ_h',0 +key_shadow_x db 'offs_shadow_x',0 +key_shadow_y db 'offs_shadow_y',0 + +ini_sec_game db 'Game',0 +key_delay_a db 'delay_a',0 +key_delay_b db 'delay_b',0 +key_delay_min db 'delay_min',0 + +ini_sec_color db 'Colors',0 +;ключи для считывания цветов из *.ini файла +key_color_fon db 'background',0 +key_color_shadows db 'shadows',0 +key_color_egg db 'objects',0 +key_color_chick db 'lost',0 +key_color_decorat: db 'dec' + .ind: db '?',0 +key_color_unit db 'unit',0 + +;цвета в игре +color_fon dd ? ;цвет фона +color_shadows dd ? ;цвет теней +color_wolf dd ? ;цвет волка и зайца +color_egg dd ? ;цвет яйца +color_chick dd ? ;цвет ципленка +color_decorat dd ?,?,? ;цвета декораций (курицы, перила, ...) + +;цвета интерфейса +color_but_sm dd 0x808080 ;цвет маленьких кнопок +color_but_te dd 0xffffff ;цвет текста на кнопках + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + ;path - может быть переменной или строковым параметром + if path eqtype '' ;проверяем задан ли строкой параметр path + jmp @f + local .path_str + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0 + else + copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + end if + + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + mov eax,SF_FILE + mov [run_file_70.Function], SSF_READ_FILE + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], [buf] + 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 + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall [img_decode], [buf],ebx,0 + mov [image_data],eax + ;преобразуем изображение к формату rgb + stdcall [img_to_rgb2], [image_data],[buf] + ;удаляем временный буфер image_data + stdcall [img_destroy], [image_data] + @@: +} + +;данные игры +bit_zaac equ 2 ;бит зайца +val_zaac equ 4 ;цифра отвечающая за бит зайца +bit_mig equ 3 ;бит мигания +val_mig equ 8 ;цифра отвечающая за бит мигания +mask_lot_lu equ 1b ;маска для левого верхнего лотка +mask_lot_ld equ 100000b ;маска для левого нижнего лотка +mask_lot_ru equ 10000000000b ;маска для правого верхнего лотка +mask_lot_rd equ 1000000000000000b ;маска для правого нижнего лотка +mask_clear_all equ 11111011111011110111101111011110b ;маска для очистки падающих яиц и прибежавших циплят +mask_move_eggs equ 11111111111111111111b ;маска движущихся яиц +mask_fail_eggs equ 100001000010000100000b ;маска падающих яиц +mask_chi_left equ 11111000000000000000000000b ;маска левых циплят +mask_chi_right equ 11111000000000000000000000000000b ;маска правых циплят +mask_chi_cr_l equ 1000000000000000000000b ;маска для создания левого +mask_chi_cr_r equ 1000000000000000000000000000b ;маска для создания правого +bit_chi_left equ 21 ;1-й бит который отвечает за бегущего слева +bit_chi_right equ 27 ;1-й бит который отвечает за бегущего права +val_zaac_time_y equ 5 ;колличество тактов, которое обязательно должен провисеть заяц +val_zaac_time_n equ 7 ;колличество тактов, которое обязательно должен быть спрятанным заяц + +txt_game_a db 'Игра А',0 +txt_game_b db 'Игра Б',0 + +zaac_status db 0 ;число тактов, которое заяц не должен менять свое положение +pos_wolf db 0 ;позиция волка 0-й бит слева/справа, 1-й бит сверху/вниз +;rb 1 +pos_eggs dd 0 ;позиции расположения яиц и циплят +eggs_count dw 0 ;колличество пойманых яиц +game_text db 'Игра _',13 +some_text db '0' + rb 8 ;текст с числом пойманных яиц +count_last db 0 ;счетчик пропущенных яиц +game_spd dd 0 ;задержка игры +game_delay_a dd ? ;первоначальная задержка для игры А +game_delay_b dd ? ;первоначальная задержка для игры Б +game_delay_min dd ? ;минимальная задержка + +;для генерации случайных чисел +rand_x dd 0 + +align 4 +rand_next: +;x(k+1) = (a*x(k)+c) mod m +; a=22695477, c=1, m=2^32 +push eax + mov eax,[rand_x] + imul eax,22695477 + inc eax + mov [rand_x],eax +pop eax + ret + +;создаем прозрачные буфера по 8 бит (трафареты), для рисования +;где buf - буфер на основе которого будет создан трафарет +;фоновый цвет буфера должен быть 0xffffff, иначе не произойдет обрезка +;по фоновому цвету и трафарет будет занимат ьмного места в памяти +align 4 +proc CreateTrapharetBuffer uses eax edi, buf:dword, img_data:dword + mov edi,[buf] + + ;заполнение данных буфера + mov buf2d_size_lt,0 + mov eax,[displ_w] + mov buf2d_w,eax + mov eax,[displ_h] + mov buf2d_h,eax + mov buf2d_color,0xffffff + mov buf2d_bits,24 + + stdcall [buf2d_create_f_img], edi,[img_data] ;создаем буфер + stdcall [buf2d_conv_24_to_8], edi,1 ;делаем буфер прозрачности 8бит + ;обрезаем лишние края буфера, для более быстрого рисования + stdcall [buf2d_crop_color], edi,buf2d_color,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM+BUF2D_OPT_CROP_RIGHT+BUF2D_OPT_CROP_LEFT + ret +endp + +align 4 +InitBackgroundBuffer: ;создание фонового изображения + pushad + mov edi,buf_fon + mov eax,[color_fon] + mov buf2d_color,eax + stdcall [buf2d_clear], edi,eax + mov esi,edi + + xor eax,eax + cld + cmp dword[offs_shadow_x],0 + jne @f + cmp dword[offs_shadow_y],0 + jne @f + jmp .end_shadows + @@: + mov edi,buf_decor + xor ebx,ebx + mov ecx,3 + @@: + mov ax,buf2d_t + add eax,[offs_shadow_y] + mov bx,buf2d_l + add ebx,[offs_shadow_x] + stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени декораций + add edi,BUF_STRUCT_SIZE + loop @b + .end_shadows: + + mov edi,buf_decor + mov ebx,color_decorat + mov ecx,3 + @@: + mov ax,buf2d_t + stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[ebx] ;рисуем декорации + add edi,BUF_STRUCT_SIZE + add ebx,4 + loop @b + popad + ret + +;рисует картинку в буфере buf из массива буферов buf_img с индексом ind +;т. е. buf <- buf_img[ind] +align 4 +proc DrawArrayImg, buf:dword, buf_img:dword, ind:dword, color:dword + pushad + mov edi,dword[ind] + imul edi,BUF_STRUCT_SIZE + add edi,dword[buf_img] + + mov esi,dword[buf] + xor eax,eax + mov ax,buf2d_t + xor ebx,ebx + mov bx,buf2d_l + stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color] + popad + ret +endp + +align 4 +DrawZaac: ;рисование зайца + push eax + bt word[pos_wolf],bit_zaac + jae .end_mig + + stdcall DrawArrayImg, buf_displ,buf_wolf,6,[color_wolf] ;рисуем тело зайца + mov eax,dword[pos_eggs] + and eax,mask_chi_right+mask_chi_left + cmp eax,0 + je .end_mig ;если нет бегающих циплят, то заяц рукой не машет + bt word[pos_wolf],bit_mig + jc @f + stdcall DrawArrayImg, buf_displ,buf_wolf,7,[color_wolf] ;рисуем руку зайца вверху + jmp .end_mig + @@: + stdcall DrawArrayImg, buf_displ,buf_wolf,8,[color_wolf] ;рисуем руку зайца внизу + .end_mig: + pop eax + ret + +align 4 +DrawWolf: ;рисует волка с корзинами + bt word[pos_wolf],0 + jc @f + stdcall DrawArrayImg, buf_displ,buf_wolf,0,[color_wolf] + bt word[pos_wolf],1 + jc .corz_ldn + stdcall DrawArrayImg, buf_displ,buf_wolf,1,[color_wolf] + jmp .corz_lend + .corz_ldn: + stdcall DrawArrayImg, buf_displ,buf_wolf,2,[color_wolf] + .corz_lend: + jmp .wolf_b + @@: + stdcall DrawArrayImg, buf_displ,buf_wolf,3,[color_wolf] + bt word[pos_wolf],1 + jc .corz_rdn + stdcall DrawArrayImg, buf_displ,buf_wolf,4,[color_wolf] + jmp .corz_rend + .corz_rdn: + stdcall DrawArrayImg, buf_displ,buf_wolf,5,[color_wolf] + .corz_rend: + .wolf_b: + ret + +align 4 +DrawEggs: ;рисует яйца + pushad + cld + + mov eax,dword[pos_eggs] + xor ebx,ebx + mov ecx,20 ;цикл для рисования котящихся яиц + @@: + bt eax,ebx + jae .draw_egg + stdcall DrawArrayImg, buf_displ,buf_egg,ebx,[color_egg] + .draw_egg: + inc ebx + loop @b + + ;mov eax,dword[pos_eggs] + and eax,mask_chi_left + cmp eax,0 + je @f + stdcall DrawArrayImg, buf_displ,buf_egg,20,[color_egg] ;разбитое яйцо слева + @@: + mov eax,dword[pos_eggs] + and eax,mask_chi_right + cmp eax,0 + je @f + stdcall DrawArrayImg, buf_displ,buf_egg,21,[color_egg] ;разбитое яйцо справа + @@: + + mov eax,dword[pos_eggs] + xor edx,edx + mov ebx,bit_chi_left + mov ecx,5 ;цикл для рисования левых циплят + @@: + bt eax,ebx + jae .draw_chick_l + stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] + .draw_chick_l: + inc ebx + inc edx + loop @b + mov ebx,bit_chi_right + mov ecx,5 ;цикл для рисования правых циплят + @@: + bt eax,ebx + jae .draw_chick_r + stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] + .draw_chick_r: + inc ebx + inc edx + loop @b + + xor eax,eax + mov al,byte[count_last] + mov ecx,eax ;цикл для рисования штрафных очков + shr ecx,1 + mov edx,10 ;индекс начала штрафных иконок в буфере buf_chi + cmp ecx,0 + je .no_unit_last + @@: + stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] + inc edx + loop @b + .no_unit_last: + + bt ax,0 ;проверяем мигающее не четное очко + jae @f + bt word[pos_wolf],bit_mig + jc @f + stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] ;мигающее штрафное очко + @@: + + popad + ret + +align 4 +CountEggsInc: ;увеличиваем счетчик яиц на 1 + push eax edi + xor eax,eax + inc word[eggs_count] ;увеличиваем счетчик яиц + cmp word[eggs_count],200 ;бонусные очки + je @f + cmp word[eggs_count],500 ;бонусные очки + je @f + jmp .no_bonus + @@: + mov byte[count_last],0 + .no_bonus: + + mov ax,word[eggs_count] + mov edi,some_text + call convert_to_str ;обновляем текстовую строку + and ax,0xf ;через каждые 16 яиц уменьшаем время + cmp ax,0 + jne @f + mov edi,[game_delay_min] ;минимальная задержка + cmp dword[game_spd],edi + jle @f + dec dword[game_spd] + @@: + pop edi eax + ret + +;input: +; eax - маска, указывающая с какой строны упало яйцо +align 4 +CountLastInc: ;начисление штрафных очков + inc byte[count_last] ;половинао штрафного очка + bt word[pos_wolf],bit_zaac + jc @f + inc byte[count_last] ;если нет зайца то еще 1-на половина штрафного очка + @@: + cmp byte[count_last],6 + jle @f + mov byte[count_last],6 ;ставим ограничени на число штрафных очков + @@: + or dword[pos_eggs],eax ;создаем бегущего ципленка + ret + +align 4 +MoveEggs: + pushad + xor byte[pos_wolf],val_mig ;бит для мигания + + cmp byte[count_last],6 ;максимальное число штрафных очков + je .end_fun + + rol dword[pos_eggs],1 + mov ecx,dword[pos_eggs] + and ecx,mask_fail_eggs + cmp ecx,0 + je .no_fail ;нет падающих яиц + ;начисление яиц попавших в корзину + ;или начисление штрафных очков + xor ebx,ebx + mov bl,byte[pos_wolf] ;берем параметры (позицию) волка + and bl,3 ;на всякий случай + + bt ecx,5 ;проверяем верхнее левое перило + jae .perilo_lu + cmp bx,0 ;проверяем наличие корзины + jne @f + call CountEggsInc + jmp .perilo_lu + @@: + mov eax,mask_chi_cr_l + call CountLastInc + .perilo_lu: + bt ecx,10 ;проверяем нижнее левое перило + jae .perilo_ld + cmp bx,2 ;проверяем наличие корзины + jne @f + call CountEggsInc + jmp .perilo_ld + @@: + mov eax,mask_chi_cr_l + call CountLastInc + .perilo_ld: + bt ecx,15 ;проверяем верхнее правое перило + jae .perilo_ru + cmp bx,1 ;проверяем наличие корзины + jne @f + call CountEggsInc + jmp .perilo_ru + @@: + mov eax,mask_chi_cr_r + call CountLastInc + .perilo_ru: + bt ecx,20 ;проверяем нижнее правое перило + jae .perilo_rd + cmp bx,3 ;проверяем наличие корзины + jne @f + call CountEggsInc + jmp .perilo_rd + @@: + mov eax,mask_chi_cr_r + call CountLastInc + .perilo_rd: + .no_fail: + + and dword[pos_eggs],mask_clear_all ;очистка упавших яиц и добежавших курей + + call rand_next + cmp byte[zaac_status],0 + jle @f + dec byte[zaac_status] + jmp .no_zaac_move ;заяц пока не двигается + @@: + + bt dword[rand_x],6 ;заяц от фонаря меняет статус + jc @f + xor byte[pos_wolf],val_zaac ;высовываем/засовываем зайца + bt word[pos_wolf],val_zaac + jc .zaac_n + mov byte[zaac_status],val_zaac_time_y ;ставим минимальное время для смены статуса + jmp @f + .zaac_n: + mov byte[zaac_status],val_zaac_time_n ;ставим минимальное время для смены статуса + @@: + .no_zaac_move: + + ;создание новых яиц + cmp word[eggs_count],5 ;первые 5 яиц катятся по 1-му + jge @f + mov ecx,dword[pos_eggs] + and ecx,mask_move_eggs + ;cmp ecx,0 + jnz .end_creat + @@: + + bt dword[rand_x],4 ;проверяем будем ли создавать новое яйцо + jc .end_creat + bt dword[rand_x],5 ;проверяем с какой стороны будем создавать новое яйцо + jc .creat_r + bt dword[rand_x],7 + jc @f + or dword[pos_eggs],mask_lot_lu + jmp .end_creat + @@: + or dword[pos_eggs],mask_lot_ld + jmp .end_creat + .creat_r: + bt dword[rand_x],7 + jc @f + or dword[pos_eggs],mask_lot_ru + jmp .end_creat + @@: + or dword[pos_eggs],mask_lot_rd + ;jmp .end_creat + .end_creat: + + .end_fun: + popad + ret + +align 4 +proc InitGame, b:dword ;первоначальные настройки игры + mov word[eggs_count],0 ;колличество пойманых яиц + mov byte[some_text],'0' + mov byte[some_text+1],0 ;текст с числом пойманных яиц + mov byte[count_last],0 ;штрафные очки + mov dword[pos_eggs],0 + mov byte[zaac_status],0 + + push eax ebx + cmp dword[b],0 + jne @f + mov byte[game_text+5],'А' + mov eax,dword[game_delay_a] + mov dword[game_spd],eax ;задержка игры + jmp .end_init + @@: + mov byte[game_text+5],'Б' + mov eax,dword[game_delay_b] + mov dword[game_spd],eax ;задержка игры + .end_init: + + mcall SF_SYSTEM_GET,SSF_TIME_COUNT + mov [rand_x],eax ;заполняем 1-е случайное число + pop ebx eax + + ret +endp + +align 4 +proc LoadArrayBuffer, f_name:dword, buf_start:dword, count:dword + pushad + mov edx,[displ_bytes] + mov ecx,edx + imul ecx,[count] + mov eax,[f_name] + load_image_file eax,image_data_gray,ecx + mov edx,[displ_bytes] + mov eax,[image_data_gray] + mov edi,[buf_start] + mov ecx,[count] + cld + @@: ;считываем 3 буфера с декорациями + stdcall CreateTrapharetBuffer,edi,eax + add eax,edx + add edi,BUF_STRUCT_SIZE + loop @b + stdcall mem.Free,[image_data_gray] ;освобождаем память + popad + ret +endp + +txt_tile_type_0 rb FILE_NAME_MAX + +align 4 +user_is_select: + push eax ecx esi edi + stdcall [tl_node_get_data], tree1 + or eax,eax ;если имя игры пустое + jz @f + mov esi,eax + mov edi,ini_name + mov ecx,FILE_NAME_MAX + cld + rep movsb + + mov byte[game_select_mode],0 + call InitAll + @@: + pop edi esi ecx eax + + call draw_window + ret + +;****************************************************************************** +; функция, которая 1 раз делает все настройки нужные для игры +;****************************************************************************** +align 4 +InitAll: + pushad + ;работа с файлом настроек + copy_path ini_name,sys_path,file_name,0 + stdcall [ini_get_int],file_name,ini_sec_files,key_displ_w,210 + mov [displ_w],eax + stdcall [ini_get_int],file_name,ini_sec_files,key_displ_h,140 + mov [displ_h],eax + stdcall [ini_get_str],file_name,ini_sec_files,key_file_decorat,fn_icon0,FILE_NAME_MAX,ini_def_decorat_file + stdcall [ini_get_str],file_name,ini_sec_files,key_file_unit,fn_icon1,FILE_NAME_MAX,ini_def_unit_file + stdcall [ini_get_str],file_name,ini_sec_files,key_file_objects,fn_icon2,FILE_NAME_MAX,ini_def_objects_file + stdcall [ini_get_str],file_name,ini_sec_files,key_file_lost,fn_icon3,FILE_NAME_MAX,ini_def_lost_file + + stdcall [ini_get_int],file_name,ini_sec_files,key_shadow_x,2 + mov [offs_shadow_x],eax + stdcall [ini_get_int],file_name,ini_sec_files,key_shadow_y,2 + mov [offs_shadow_y],eax + + ;считывание настроек влияющих на скорсть игры + stdcall [ini_get_int],file_name,ini_sec_game,key_delay_a,65 + mov [game_delay_a],eax + stdcall [ini_get_int],file_name,ini_sec_game,key_delay_b,35 + mov [game_delay_b],eax + stdcall [ini_get_int],file_name,ini_sec_game,key_delay_min,15 + mov [game_delay_min],eax + + stdcall [ini_get_color],file_name,ini_sec_color,key_color_fon,0xffffff + mov [color_fon],eax + stdcall [ini_get_color],file_name,ini_sec_color,key_color_shadows,0xd0d0d0 + mov [color_shadows],eax + stdcall [ini_get_color],file_name,ini_sec_color,key_color_unit,0 + mov [color_wolf],eax + stdcall [ini_get_color],file_name,ini_sec_color,key_color_egg,0x404080 + mov [color_egg],eax + stdcall [ini_get_color],file_name,ini_sec_color,key_color_chick,0x00d0d0 + mov [color_chick],eax + + mov ebx,color_decorat + mov byte[key_color_decorat.ind],'0' + mov ecx,3 + cld + @@: + push ecx ;функция ini_get_color имеет право манять регистр ecx + stdcall [ini_get_color],file_name,ini_sec_color,key_color_decorat,0x000080 + pop ecx + mov [ebx],eax + add ebx,4 + inc byte[key_color_decorat.ind] + loop @b + + mov edx,[displ_w] + imul edx,[displ_h] + lea edx,[edx+edx*2] + mov [displ_bytes],edx ;вычисляем размер игрового поля + + stdcall LoadArrayBuffer, fn_icon0, buf_decor,3 ;считываем 3 буфера с декорациями + stdcall LoadArrayBuffer, fn_icon1, buf_wolf,9 ;считываем 9 буферов с волком и зайцем + stdcall LoadArrayBuffer, fn_icon2, buf_egg,22 ;считываем 22 буферов с яйцами + stdcall LoadArrayBuffer, fn_icon3, buf_chi,13 ;считываем 13 буферов с циплятами + + load_image_file 'font8x9.bmp', image_data_gray,IMAGE_FONT_SIZE + 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 + +;проверка занимаемого буфером места +;mov edi,buf_wolf +;add edi,BUF_STRUCT_SIZE ;переходим на буфер корзины +;stdcall [buf2d_clear],edi,0x808080 ;заливаем его серым цветом + + mov ebx,dword[displ_w] + mov edx,dword[displ_h] + + mov edi,buf_displ + mov buf2d_w,ebx + mov buf2d_h,edx + stdcall [buf2d_create], buf_displ ;создаем буфер для вывода на экран + + mov edi,buf_fon + mov buf2d_w,ebx + mov buf2d_h,edx + stdcall [buf2d_create], buf_fon ;создаем буфер с фоновыми декорациями + + call InitBackgroundBuffer ;заполняем буфер с фоновыми декорациями + stdcall InitGame,0 + popad + ret + +align 4 +start: + load_libraries l_libs_start,load_lib_end + + ;проверка на сколько удачно загузились библиотеки + cmp dword [lib0+ll_struc_size-4],0 + jnz @f + cmp dword [lib1+ll_struc_size-4],0 + jnz @f + cmp dword [lib2+ll_struc_size-4],0 + jnz @f + cmp dword [lib3+ll_struc_size-4],0 + jnz @f + jmp .lib + @@: + mcall SF_TERMINATE_PROCESS + .lib: + + mcall SF_SET_EVENTS_MASK,0x27 + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors + +;****************************************************************************** +; подготовка списка игр +;****************************************************************************** + stdcall dword[tl_data_init], tree1 + + load_image_file 'tl_sys_16.png', image_data_gray,TREE_ICON_SYS16_BMP_SIZE + stdcall [buf2d_create_f_img], buf_tree_sys,[image_data_gray] ;создаем буфер + stdcall mem.Free,[image_data_gray] ;освобождаем память + + mov edi,buf_tree_sys + m2m dword[tree1.data_img_sys],buf2d_data + + ;работа с главным файлом настроек + copy_path ini_m_name,sys_path,file_name,0 + + stdcall [ini_get_int],file_name,ini_sec_files,key_count,1 + mov ecx,eax + mov dl,'0' + cld + @@: + mov byte[key_game_ind],dl + inc dl + push ecx edx + stdcall [ini_get_str],file_name,ini_sec_files,key_game,txt_tile_type_0,FILE_NAME_MAX,ini_def_decorat_file + stdcall [tl_node_add], tree1, 0, txt_tile_type_0 ;добавляем название игры + stdcall [tl_cur_next], tree1 ;переносим курсор вниз, что-бы не поменялся порядок игр + pop edx ecx + loop @b + stdcall [tl_cur_beg], tree1 ;переносим курсор вверх + + mcall SF_SYSTEM_GET,SSF_TIME_COUNT + mov [last_time],eax + + + +align 4 +red_win: + call draw_window + +align 4 +still: ;главный цикл + + cmp byte[game_select_mode],0 + jne .select_mode + + mcall SF_SYSTEM_GET,SSF_TIME_COUNT + mov ebx,[last_time] + add ebx,[game_spd] ;delay + sub ebx,eax + cmp ebx,[game_spd] ;delay + ja it_is_time_now + test ebx,ebx + jz it_is_time_now + mcall SF_WAIT_EVENT_TIMEOUT + or eax,eax + jz it_is_time_now + + jmp @f + .select_mode: + mcall SF_WAIT_EVENT + @@: + + cmp al,1 ;изменилось положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + cmp al,6 + jz mouse + + jmp still + +align 4 +mouse: + cmp byte[game_select_mode],0 + je @f + stdcall [tl_mouse], tree1 ;если игра еще не выбрана + @@: + jmp still + +align 4 +it_is_time_now: + mcall SF_SYSTEM_GET,SSF_TIME_COUNT + mov [last_time],eax + + ;cmp byte[game_select_mode],0 + ;jne still + + ;...здесь идут действия, вызываемые каждые delay сотых долей секунд... + call MoveEggs + call draw_display + jmp still + +align 4 +key: + push eax ebx + mcall SF_GET_KEY + + cmp byte[game_select_mode],0 + je @f + stdcall [tl_key], tree1 + @@: + + cmp ah,176 ;Left + jne @f + and byte[pos_wolf],0xfe + @@: + cmp ah,179 ;Right + jne @f + or byte[pos_wolf],1 + @@: + cmp ah,178 ;Up + jne @f + and byte[pos_wolf],0xff-2 + @@: + cmp ah,177 ;Down + jne @f + or byte[pos_wolf],2 + @@: + + cmp ah,97 ;a + jne @f + and byte[pos_wolf],0xff-3 ;00 + @@: + cmp ah,122 ;z + jne @f + and byte[pos_wolf],0xff-1 + or byte[pos_wolf],2 ;10 + @@: + cmp ah,39 ;' + jne @f + and byte[pos_wolf],0xff-2 + or byte[pos_wolf],1 ;01 + @@: + cmp ah,47 ;/ + jne @f + or byte[pos_wolf],3 ;11 + @@: + + pop ebx eax + jmp still + + +align 4 +draw_window: + pushad + mcall SF_REDRAW,SSF_BEGIN_DRAW + + xor eax,eax + mov ebx,20*65536+480 + mov ecx,20*65536+270 + mov edx,[sc.work] + ;or edx,0x33000000 + or edx,0x73000000 + mov edi,hed + mcall ;создание окна + mcall SF_THREAD_INFO,procinfo,-1 + + cmp byte[game_select_mode],0 + jne .select_mode + + mov edi,buf_displ + mov eax,[procinfo.client_box.width] + cmp eax,[displ_w] + jle @f + sub eax,[displ_w] + shr eax,1 + mov buf2d_l,ax ;выправниваем буфер по центру окна + @@: + + call draw_display + + mov eax,SF_DRAW_RECT + mov edx,[sc.work] + xor esi,esi + mov si,buf2d_l + add esi,[displ_w] + mov ebx,[procinfo.client_box.width] + inc ebx + cmp esi,ebx + jge @f + sub ebx,esi + rol ebx,16 + mov bx,si + rol ebx,16 + mov ecx,[procinfo.client_box.height] + inc ecx + int 0x40 ;рисование правого бокового поля + jmp .draw_s + @@: + mov esi,[procinfo.client_box.width] ;когда по ширине не влазит + inc esi + .draw_s: + + ; *** рисование кнопок *** +push esi + movzx ebx,buf2d_l + add ebx,buf2d_w + add ebx,BUT1_L + shl ebx,16 + mov bx,BUT1_W + mov ecx,BUT1_T*65536+BUT1_H + mov esi,[color_but_sm] + mcall SF_DEFINE_BUTTON,,,5 + + inc edx + add ecx,BUT1_NEXT_TOP + int 0x40 +pop esi + + mov bx,BUT1_H-4 + add ebx,8 shl 16 + mov ecx,[color_but_te] + or ecx,0x80000000 + mov edx,txt_game_a + mcall SF_DRAW_TEXT + + ror ebx,16 + add ebx,BUT1_NEXT_TOP + ror ebx,16 + mov edx,txt_game_b + int 0x40 + + ; *** восстановление параметров *** + mov eax,SF_DRAW_RECT + mov edx,[sc.work] + + mov ebx,esi + mov ecx,[procinfo.client_box.height] + inc ecx + mov esi,[displ_h] + cmp esi,ebx + jge @f + sub ecx,esi + rol ecx,16 + mov cx,si + rol ecx,16 + int 0x40 ;рисование нижнего поля + @@: + + xor ebx,ebx + mov bx,buf2d_l + mov ecx,[displ_h] + int 0x40 ;рисование левого бокового поля + + jmp @f + .select_mode: + stdcall [tl_draw], tree1 + mov edi,tree1 + add edi,tl_offs_box + stdcall draw_rect_border, procinfo.client_box, edi + @@: + + mcall SF_REDRAW,SSF_END_DRAW + popad + ret + +; функция рисует поля вокруг прямоугольника user_box +; размер полей вычисляется исходя из размеров client_rect +; предполагается, что в большинстве случаев client_rect > user_box +align 4 +proc draw_rect_border, client_rect:dword, user_box:dword + pushad + mov esi,[user_box] + cmp esi,0 + je @f + mov edi,[client_rect] + mov ebx,dword[edi+8] ;+8 = width + inc bx + mov ecx,dword[esi+4] ;+4 = top + mov edx,[sc.work] + mcall SF_DRAW_RECT ;top + + mov eax,dword[esi+4] ;+4 = top + add eax,dword[esi+12] ;+12 = height + cmp eax,dword[edi+12] + jge .no_bottom + mov ecx,eax + shl ecx,16 + mov cx,word[edi+12] ;+12 = bottom + inc cx + sub cx,ax + mcall SF_DRAW_RECT ;bottom + .no_bottom: + + mov ebx,dword[esi] ;+0 left + mov ecx,dword[esi+4] ;+4 = top + shl ecx,16 + mov cx,word[esi+12] ;+12 = height + inc cx + mcall SF_DRAW_RECT ;left + + mov eax,dword[esi] ;+0 left + add eax,dword[esi+8] ;+8 = width + mov ebx,eax + shl ebx,16 + mov bx,word[edi+8] ;+8 = right + sub bx,ax + inc bx + mcall SF_DRAW_RECT ;right + @@: + popad + ret +endp + +align 4 +draw_display: + + stdcall mem_copy, [buf_fon],[buf_displ],[displ_bytes] ;копирование изображения из фонового буфера + call DrawZaac ;рисуем зайца + call DrawWolf ;рисуем волка + call DrawEggs ;рисуем яйца + +push eax + mov eax,[displ_w] + shr eax,1 + stdcall [buf2d_draw_text], buf_displ, buf_font,game_text,eax,[offs_shadow_x],[color_wolf] ;рисуем строку с текстом +pop eax + stdcall [buf2d_draw], buf_displ + ret + +align 4 +button: + mcall SF_GET_BUTTON + + cmp ah,5 + jne @f + stdcall InitGame,0 + @@: + cmp ah,6 + jne @f + stdcall InitGame,1 + @@: + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_fon ;удаляем буфер + stdcall [buf2d_delete],buf_displ ;удаляем буфер + + stdcall [buf2d_delete],buf_tree_sys + stdcall [buf2d_delete],buf_font + + cld + mov ecx,3 + mov edi,buf_decor + @@: ;удаляем 3 буфера + stdcall [buf2d_delete],edi + add edi,BUF_STRUCT_SIZE + loop @b + mov ecx,9 + mov edi,buf_wolf + @@: ;удаляем 9 буферов с волком и зайцем + stdcall [buf2d_delete],edi + add edi,BUF_STRUCT_SIZE + loop @b + mov ecx,13 + mov edi,buf_chi + @@: ;удаляем 13 буферов + stdcall [buf2d_delete],edi + add edi,BUF_STRUCT_SIZE + loop @b + mov ecx,22 + mov edi,buf_egg + @@: ;удаляем 22 буфера + stdcall [buf2d_delete],edi + add edi,BUF_STRUCT_SIZE + loop @b + + mov dword[tree1.data_img_sys],0 ;чистим указатель на изображение + stdcall dword[tl_data_clear], tree1 + mcall SF_TERMINATE_PROCESS + +system_dir0 db '/sys/lib/' +lib0_name db 'buf2d.obj',0 +system_dir1 db '/sys/lib/' +lib1_name db 'libimg.obj',0 +system_dir2 db '/sys/lib/' +lib2_name db 'libini.obj',0 +system_dir3 db '/sys/lib/' +lib3_name db 'box_lib.obj',0 + +;library structures +l_libs_start: + lib0 l_libs lib0_name, file_name, system_dir0, import_buf2d_lib + lib1 l_libs lib1_name, file_name, system_dir1, import_libimg + lib2 l_libs lib2_name, file_name, system_dir2, import_libini + lib3 l_libs lib3_name, file_name, system_dir3, import_box_lib +load_lib_end: + +align 4 +proc mem_copy uses ecx esi edi, source:dword, destination:dword, len:dword + cld + mov esi, [source] + mov edi, [destination] + mov ecx, [len] + rep movsb + ret +endp + +;input: +; eax - число +; edi - буфер для строки +align 4 +convert_to_str: + pushad + lea esi,[edi+8] ;8 - длинна буфера -1 + call .str + popad + ret + +align 4 +.str: + mov ecx,10 + cmp eax,ecx + jb @f + xor edx,edx + div ecx + push edx + ;dec edi ;смещение необходимое для записи с конца строки + call .str + pop eax + @@: + cmp edi,esi + jge @f + or al,0x30 + stosb + mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор + @@: + ret + + +last_time dd 0 +image_data dd 0 ;память для преобразования картинки функциями libimg +image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты + +run_file_70 FileInfoBlock +hed db 'Nu pogodi 10.12.20',0 ;подпись окна +sc system_colors ;системные цвета + +count_of_dir_list_files equ 10 +el_focus dd tree1 +tree1 tree_list FILE_NAME_MAX,count_of_dir_list_files+2, tl_key_no_edit+tl_draw_par_line+tl_list_box_mode,\ + 16,16, 0x8080ff,0x0000ff,0xffffff, 10,10,140,100, 0,0,0, el_focus,\ + 0,user_is_select + +align 4 +buf_tree_sys: + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd 16 ;+8 w + dd 16*11 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_font: ;буфер со шрифтом + dd 0 ;указатель на буфер изображения + dw 25 ;+4 left + dw 25 ;+6 top + dd 128 ;+8 w + dd 144 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_displ: + dd 0 ;указатель на буфер изображения + dw 25,0 + dd ? ;+8 w + dd ? ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_fon: ;фоновый буфер + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd ? ;+8 w + dd ? ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_decor: ;буфера с декорациями: домиками и рейками; с курицами; с растениями + rb 3*BUF_STRUCT_SIZE + +align 4 +buf_wolf: + rb 9*BUF_STRUCT_SIZE + +align 4 +buf_egg: + rb 22*BUF_STRUCT_SIZE + +align 4 +buf_chi: + rb 13*BUF_STRUCT_SIZE + + + +align 4 +import_libini: + dd alib_init0 + ini_get_str dd aini_get_str + ini_get_int dd aini_get_int + ini_get_color dd aini_get_color +dd 0,0 + alib_init0 db 'lib_init',0 + aini_get_str db 'ini_get_str',0 + aini_get_int db 'ini_get_int',0 + aini_get_color db 'ini_get_color',0 + +align 4 +import_libimg: + 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 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_offset_h dd sz_buf2d_offset_h + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + +align 4 +import_box_lib: + dd alib_init2 + + ;scrollbar_ver_draw dd aScrollbar_ver_draw + + 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 + +dd 0,0 + alib_init2 db 'lib_init',0 + + ;aScrollbar_ver_draw db 'scrollbar_v_draw',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 + + +align 16 +i_end: + procinfo process_information + rb 1024 +stacktop: + sys_path rb 4096 + file_name: + rb 4096 + openfile_path: + rb 4096 + filename_area: + rb 256 +mem: diff --git a/programs/games/snake/snake.asm b/programs/games/snake/snake.asm index bd46ce0fa..6120110a4 100644 --- a/programs/games/snake/snake.asm +++ b/programs/games/snake/snake.asm @@ -1,2550 +1,2553 @@ -;;===HEADER==================================================================================================================== - -use32 - org 0x0 - db 'MENUET01' - dd 0x01,start,i_end,d_end,stacktop,0x0,cur_dir_path - -;;---HEADER-------------------------------------------------------------------------------------------------------------------- - -include '../../proc32.inc' -include '../../macros.inc' -include '../../dll.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' -;include '../../system/board/trunk/debug.inc' - -;;===Define_chapter============================================================================================================ - -WINDOW_MODE_WINDOWED equ 0 -WINDOW_MODE_FULLSCREEN equ 1 - -GRID_WIDTH equ 28 -GRID_HEIGHT equ 14 - -MIN_SQUARE_SIDE_LENGTH equ 9 - -SCORE_EAT equ 100 - -LEFT equ 0 -DOWN equ 1 -UP equ 2 -RIGHT equ 3 - -struct LEVEL - field db 4*GRID_HEIGHT dup (?) - snake_dots db 6 dup (?) - snake_direction dd ? - snake_direction_next dd ? - number_of_stones dd ? - name dd ? -ends - -CLASSIC_MODE equ 0 -LEVELS_MODE equ 1 - -CLASSIC_MODE_FIRST_LEVEL equ 0 -LEVELS_MODE_FIRST_LEVEL equ 1 - -EAT_TO_END_LEVEL equ 7 -PAUSE_BETWEEN_LEVELS equ 200 -PAUSE_WHILE_DRAWING_SPLASH equ 3 - -CHAMPION_NAME_LENGTH equ 15 -LAST_LEVEL_NUMBER equ 36 - -START_LIVES equ 3 - -;;---Define_chapter------------------------------------------------------------------------------------------------------------ - -start: - -stdcall dll.Load,@IMPORT - or eax, eax - jnz Exit - -align 4 - - mov edi, cur_dir_path - mov al, 0 - mov ecx, 4096 - repne scasb - mov dword[edi-1], '.ini' - - invoke ini.get_int, cur_dir_path, aPreferences, aSpeed, 80 - neg eax - add [time_wait_limit], eax - mov ebx, [time_wait_limit] - mov [time_wait_limit_const], ebx - sub ebx, 4 - mov eax, 200 - div bl - mov byte[speed_up_counter], al - mov byte[speed_up_counter+1], al - invoke ini.get_str, cur_dir_path, aPreferences, aTheme, aTheme_name, 31, aTheme_name - invoke ini.get_int, cur_dir_path, aPreferences, aSmart_reverse, 0 - mov [smart_reverse], eax - invoke ini.get_int, cur_dir_path, aPreferences, aShow_lives_style, 2 - mov [show_lives_style], eax - invoke ini.get_int, cur_dir_path, aPreferences, aDraw_level_name_in_window_title, 1 - mov [draw_level_name_in_window_title], eax - invoke ini.get_str, cur_dir_path, aPreferences, aSeparating_symbol, separating_symbol, 3, default_separating_symbol - - invoke ini.get_shortcut, cur_dir_path, aShortcuts, aMove_left, 0x23, 0 - mov [shortcut_move_left], al - invoke ini.get_shortcut, cur_dir_path, aShortcuts, aMove_down, 0x24, 0 - mov [shortcut_move_down], al - invoke ini.get_shortcut, cur_dir_path, aShortcuts, aMove_up, 0x25, 0 - mov [shortcut_move_up], al - invoke ini.get_shortcut, cur_dir_path, aShortcuts, aMove_right, 0x26, 0 - mov [shortcut_move_right], al - invoke ini.get_shortcut, cur_dir_path, aShortcuts, aReverse, 0x0F, 0 - mov [shortcut_reverse], al - invoke ini.get_shortcut, cur_dir_path, aShortcuts, aIncrease, 0x16, 0 - mov [shortcut_increase], al - invoke ini.get_shortcut, cur_dir_path, aShortcuts, aDecrease, 0x17, 0 - mov [shortcut_decrease], al - - invoke ini.get_int, cur_dir_path, aTheme_name, aDecorations, 3 - mov [decorations], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aBackground_color, 0x000000 - or [background_color], eax - or [window_style_windowed], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aDecorations_color, 0x232300 - or [decorations_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aSnake_color, 0x1111ff - or [snake_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aSnake_head_color, 0x6B6Bff - or [snake_head_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aLives_in_head_number_color, 0xff8800 - or [lives_in_head_number_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aSnake_picture_color, 0x4488ff - or [snake_picture_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aVersion_picture_color, 0x55ff55 - or [version_picture_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aPause_picture_color, 0x11ff11 - or [pause_picture_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aGame_over_picture_color, 0xff1111 - or [game_over_picture_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aYou_win_picture_color, 0xffff11 - or [you_win_picture_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aEat_color, 0xffff11 - or [eat_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aNavigation_strings_color, 0x80ff7777 - or [navigation_strings_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aGame_over_strings_color, 0x80ff9900 - or [game_over_strings_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aScore_string_color, 0x80ffffff - or [score_string_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aLevel_string_color, 0xffffff - or [level_string_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aHiscore_string_color, 0x80ffffff - or [hiscore_string_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aChampion_string_color, 0x80ffffff - or [champion_string_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aGame_over_hiscore_color, 0x80ffdd44 - or [game_over_hiscore_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aScore_number_color, 0xffffff - or [score_number_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aLevel_number_color, 0xffffff - or [level_number_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aHiscore_number_color, 0x00ffffff - or [hiscore_number_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aChampion_name_color, 0x80ffffff - or [champion_name_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aEdit_box_selection_color, 0x00aa00 - or [edit1.shift_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aButton_color, 0xDDDDDD - or [button_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aButton_text_color, 0x000000 - or [button_text_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aStone_color, 0x5f8700 - or [stone_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aSplash_background_color, 0xAAAA00 - or [splash_background_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aSplash_level_number_color, 0x000000 - or [splash_level_number_color], eax - invoke ini.get_color, cur_dir_path, aTheme_name, aSplash_level_string_color, 0x000000 - or [splash_level_string_color], eax - - invoke ini.get_int, cur_dir_path, aReserved, aSquare_side_length, 19 - mov [square_side_length], eax - invoke ini.get_str, cur_dir_path, aReserved, aChampion_name_classic, champion_name_classic, CHAMPION_NAME_LENGTH, champion_name_classic - invoke ini.get_int, cur_dir_path, aReserved, aHiscore_classic, 777 - or [hi_score_classic], eax - invoke ini.get_str, cur_dir_path, aReserved, aChampion_name_levels, champion_name_levels, CHAMPION_NAME_LENGTH, champion_name_levels - invoke ini.get_int, cur_dir_path, aReserved, aHiscore_levels, 777 - or [hi_score_levels], eax - - mov eax, [background_color] - mov [edit1.color], eax - mov [edit1.focus_border_color], eax - mov [edit1.blur_border_color], eax - mov eax, [game_over_hiscore_color] - mov [edit1.text_color], eax - - mcall 37,4,cursor_data,2 ; load empty cursor (for "hiding" cursor while level_mode) - mov [cursor_handle], eax - - mov eax, WINDOW_MODE_WINDOWED - call Set_window_mode - mcall 0,0,0,[window_style_windowed] ; create empty window. Set_geometry will set all parameters - call Set_geometry.by_hotkey - mcall 71,1,window_title - -include 'first_menu.asm' ; First menu body and functions -include 'level.asm' ; Level body and functions (game process) -include 'pause.asm' ; Pause body and functions -include 'game_over.asm' ; Game_over body and functions - -;;===Some_functions============================================================================================================ - - -Save_do_smth_else_and_exit: - ;;===Save_do_smth_else_and_exit============================================================================================ - - mcall 37,6,[cursor_handle] ; delete cursor - - invoke ini.set_int, cur_dir_path, aReserved, aSquare_side_length, [square_side_length] - - mov edi, champion_name_classic - xor al, al - mov ecx, CHAMPION_NAME_LENGTH+1 - cld - repne scasb - neg ecx - add ecx, CHAMPION_NAME_LENGTH - invoke ini.set_str, cur_dir_path, aReserved, aChampion_name_classic, champion_name_classic, ecx - invoke ini.set_int, cur_dir_path, aReserved, aHiscore_classic, [hi_score_classic] - - mov edi, champion_name_levels - xor al, al - mov ecx, CHAMPION_NAME_LENGTH+1 - cld - repne scasb - neg ecx - add ecx, CHAMPION_NAME_LENGTH - invoke ini.set_str, cur_dir_path, aReserved, aChampion_name_levels, champion_name_levels, ecx - invoke ini.set_int, cur_dir_path, aReserved, aHiscore_levels, [hi_score_levels] - - ;;---Save_do_smth_else_and_exit-------------------------------------------------------------------------------------------- - - -Exit: - ;;===Exit================================================================================================================== - - or eax, -1 - int 0x40 - - ;;---Exit------------------------------------------------------------------------------------------------------------------ - - -Set_geometry: - ;;===Set_geometry========================================================================================================== - - cmp [resized_by_hotkey], 1 - je .by_hotkey - - test [proc_info.wnd_state], 0x01 - jnz .by_hotkey - - mcall 9,proc_info,-1 - test [proc_info.wnd_state], 0x04 ; is rolled up? - jz @f - mov eax, [proc_info.box.width] - mov [window_width], eax - mov eax, [proc_info.box.height] - mov [window_height], eax - jmp .quit - @@: - mov eax, [proc_info.box.width] - cmp eax, [window_width] - jne @f - mov eax, [proc_info.box.height] - cmp eax, [window_height] - jne @f - jmp .quit - @@: - mov eax, [proc_info.box.width] - mov [window_width], eax - mov eax, [proc_info.box.height] - mov [window_height], eax - - .by_mouse: ; or any other kind of resizing. for example, double click on window title - - test [proc_info.wnd_state], 0x01 - jnz .by_hotkey - - - cmp [window_width], 250 - jnl @f - mov [window_width], 250 - @@: - cmp [window_height], 150 - jnl @f - mov [window_height], 150 - @@: - - mcall 48,4 - mov ecx, [window_height] - sub ecx, eax - sub ecx, 5 - sub ecx, [g_e] - sub ecx, [g_e] - sub ecx, 25+30 - mov esi, ecx - - mov eax, [window_width] - sub eax, 5+5 - sub eax, [g_e] - sub eax, [g_e] - sub eax, [g_s] - sub eax, [g_s] - mov edi, eax - - mov dx, 0 - div cx - cmp ax, 2 - jl .fit_to_width - - .fit_to_height: - mov eax, esi - mov ebx, GRID_HEIGHT - div bl - cmp al, MIN_SQUARE_SIDE_LENGTH - jnl @f - mov al, MIN_SQUARE_SIDE_LENGTH - @@: - dec al - mov byte[square_side_length], al - jmp .by_hotkey - - .fit_to_width: - mov eax, edi - mov ebx, GRID_WIDTH - div bl - cmp al, MIN_SQUARE_SIDE_LENGTH - jnl @f - mov al, MIN_SQUARE_SIDE_LENGTH - @@: - dec al - mov byte[square_side_length], al - jmp .by_hotkey - -; jmp .done - - .by_hotkey: - mcall 9,proc_info,-1 - mov [resized_by_hotkey], 0 - test [proc_info.wnd_state], 0x04 ; is rolled up? - jz @f - mov eax, [proc_info.box.width] - mov [window_width], eax - mov eax, [proc_info.box.height] - mov [window_height], eax - jmp .quit - @@: - mov eax, [square_side_length] - inc eax ; space between squares - mov [g_s], eax - - mov eax, [g_s] - shr eax, 1 - mov ebx, eax - shr ebx, 1 - add eax, ebx - mov [g_e], eax - - mov edx, GRID_WIDTH - mov eax, [g_s] - mul dx - mov [gw_mul_gs], eax - - mov edx, GRID_HEIGHT - mov eax, [g_s] - mul dx - mov [gh_mul_gs], eax - - mov eax, [gw_mul_gs] - add eax, [g_s] - add eax, [g_s] - add eax, [g_e] - add eax, [g_e] - add eax, 5*2 ; skin width - mov esi, eax - test [proc_info.wnd_state], 0x01 - jz @f - mov eax, [proc_info.box.width] - @@: - mov [window_width], eax - - sub eax, [gw_mul_gs] - sub eax, 5*2 - shr eax, 1 - mov [gbxm1], eax - - mcall 48,4 ; get skin header height - mov ebx, eax - add eax, [gh_mul_gs] - add eax, [g_e] - add eax, 25 - add eax, [g_e] - add eax, 30 - add eax, 5 ; skin height (bottom part) - mov edi, eax - test [proc_info.wnd_state], 0x01 - jz @f - mov eax, [proc_info.box.height] - @@: - mov [window_height], eax - - sub eax, [gh_mul_gs] - sub eax, ebx - sub eax, 5 - sub eax, 5 - - shr eax, 1 - mov [gbym1], eax - - mov eax, [g_s] - shl eax, 16 - add eax, [g_s] - mov [gs_shl16_gs], eax - - mov eax, [gbxm1] - shl eax, 16 - add eax, [gbxm1] - mov [gbxm1_shl16_gbxm1], eax - - mov eax, [gbym1] - shl eax, 16 - add eax, [gbym1] - mov [gbym1_shl16_gbym1], eax - - mov eax, [gbxm1] - add eax, [gw_mul_gs] - mov [gbxm1_plus_gw_mul_gs], eax - - mov eax, [gbym1] - add eax, [gh_mul_gs] - mov [gbym1_plus_gh_mul_gs], eax - - mcall 48, 5 - mov dx, ax - shr eax, 16 - sub dx, ax - cmp dx, si ; does window fit to work area width? - jnl @f - dec [square_side_length] - jmp Set_geometry.by_hotkey - @@: - - mov cx, bx - shr ebx, 16 - sub cx, bx - cmp cx, di ; does window fit to work area height? - jnl @f - dec [square_side_length] - jmp Set_geometry.by_hotkey - @@: - - sub dx, si - shr dx, 1 - mov word[wp_x], dx - sub cx, word[window_height] - shr cx, 1 - mov dx, cx - shr cx, 1 - add cx, dx - mov word[wp_y], cx - - mov [top_strings], 8 - mov eax, [window_height] - sub eax, 50 - mov [bottom_top_strings], eax - add eax, 6 - mov [bottom_middle_strings], eax - add eax, 6 - mov [bottom_bottom_strings], eax - - sub eax, 4 - mov [edit1.top], eax - - - mov eax, [g_s] - shl eax, 2 - sub eax, 2 - mov [button_width_short], eax - mov eax, [g_s] - shl eax, 3 - add eax, [g_s] - sub eax, 2 - mov [button_width_long], eax - mov eax, [g_s] - sub eax, 2 - mov [button_height], eax - - mov bl, 0x10 - mov cl, 0x08 - - mov al, byte[g_s] - mul bl - mov bx, ax - add bx, word[gbxm1] - inc bx - - mov al, byte[g_s] - mul cl - mov cx, ax - add cx, word[gbym1] - inc cx - - mov [button_x_left], ebx - mov [button_y_top], ecx - - add ebx, [g_s] - add ebx, [g_s] - add ebx, [g_s] - add ebx, [g_s] - add ebx, [g_s] - - mov [button_x_right], ebx - - add ecx, [g_s] - add ecx, [g_s] - - mov [button_y_middle], ecx - - add ecx, [g_s] - add ecx, [g_s] - - mov [button_y_bottom], ecx - - .done: - mcall 67,[wp_x],[wp_y],[window_width],[window_height] - - .quit: - ret - - ;;---Set_geometry------------------------------------------------------------------------------------------------------ - - -Increase_geometry: - ;;===Increase_geometry================================================================================================= - - inc [square_side_length] - mov [resized_by_hotkey], 1 - - ret - - ;;---Increase_geometry------------------------------------------------------------------------------------------------- - - -Decrease_geometry: - ;;===Decrease_geometry================================================================================================= - - cmp [square_side_length], MIN_SQUARE_SIDE_LENGTH - je @f - dec [square_side_length] - mov [resized_by_hotkey], 1 - - @@: - ret - - ;;---Decrease_geometry------------------------------------------------------------------------------------------------- - - -Draw_decorations: - ;;===Draw_decorations================================================================================================== - - mov al, byte[decorations] - dec al - jz grid_lines - dec al - jz grid_lines_with_ends - dec al - jz grid_lines_with_corners - dec al - jz grid_dots - dec al - jz borders_lines - dec al - jz borders_lines_with_corners - dec al - jz borders_dots - dec al - jz corners_dots - dec al - jz corners_inner - dec al - jz corners_outer - dec al - jz corners_crosses - ret - - - grid_lines: - - mov eax, 38 -;mov ebx, (GRID_BEGIN_X-1)*65536+(GRID_BEGIN_X-1) - mov ebx, [gbxm1_shl16_gbxm1] -;mov ecx, (GRID_BEGIN_Y-1)*65536+(GRID_BEGIN_Y-1+GRID_HEIGHT*GRID_STEP) - mov ecx, [gbym1_shl16_gbym1] - add ecx, [gh_mul_gs] - mov edx, [decorations_color] - mov esi, GRID_WIDTH - add esi, 1 - - @@: - mcall - add ebx, [gs_shl16_gs] - dec esi - jnz @b - -;mov ebx, (GRID_BEGIN_X-1)*65536+(GRID_BEGIN_X-1+GRID_WIDTH*GRID_STEP) - mov ebx, [gbxm1_shl16_gbxm1] - add ebx, [gw_mul_gs] - mov ecx, [gbym1_shl16_gbym1] - mov esi, GRID_HEIGHT - add esi, 1 - - @@: - mcall - add ecx, [gs_shl16_gs] - dec esi - jnz @b - - ret - - - grid_lines_with_ends: - - mov eax, 38 - mov ebx, [gbxm1_shl16_gbxm1] - mov ecx, [gbym1] - sub ecx, [g_e] - shl ecx, 16 - add ecx, [gbym1_plus_gh_mul_gs] - add ecx, [g_e] - mov edx, [decorations_color] - mov esi, GRID_WIDTH - add esi, 1 - - @@: - mcall - add ebx, [gs_shl16_gs] - dec esi - jnz @b - - mov ebx, [gbxm1] - sub ebx, [g_e] - shl ebx, 16 - add ebx, [gbxm1_plus_gw_mul_gs] - add ebx, [g_e] - mov ecx, [gbym1_shl16_gbym1] - mov esi, GRID_HEIGHT - add esi, 1 - - @@: - mcall - add ecx, [gs_shl16_gs] - dec esi - jnz @b - - ret - - - grid_lines_with_corners: - - call grid_lines - call corners_outer - - ret - - - grid_dots: - - mov eax, 1 - mov ebx, [gbxm1] - mov ecx, [gbym1] - mov edx, [decorations_color] - - @@: - mcall - add ebx, [g_s] - cmp ebx, [gbxm1_plus_gw_mul_gs] - jng @b - add ecx, [g_s] - cmp ecx, [gbym1_plus_gh_mul_gs] - jg @f - mov ebx, [gbxm1] - jmp @b - - @@: - ret - - - borders_lines: - - mov eax, 38 - mov ebx, [gbxm1_shl16_gbxm1] - mov ecx, [gbym1_shl16_gbym1] - add ecx, [gh_mul_gs] - mov edx, [decorations_color] - mcall - - mov ebx, [gbxm1_plus_gw_mul_gs] - shl ebx, 16 - add ebx, [gbxm1_plus_gw_mul_gs] - mcall - - mov ebx, [gbxm1_shl16_gbxm1] - add ebx, [gw_mul_gs] - mov ecx, [gbym1_shl16_gbym1] - mcall - - mov ecx, [gbym1_plus_gh_mul_gs] - shl ecx, 16 - add ecx, [gbym1_plus_gh_mul_gs] - mcall - - ret - - - borders_lines_with_corners: - - call borders_lines - call corners_outer - - ret - - - borders_dots: - - mov eax, 1 - mov ebx, [gbxm1] - mov ecx, [gbym1] - mov edx, [decorations_color] - @@: - mcall - add ebx, [g_s] - cmp ebx, [gbxm1_plus_gw_mul_gs] - jng @b - - mov ebx, [gbxm1] - mov ecx, [gbym1_plus_gh_mul_gs] - @@: - mcall - add ebx, [g_s] - cmp ebx, [gbxm1_plus_gw_mul_gs] - jng @b - - mov ebx, [gbxm1] - mov ecx, [gbym1] - @@: - mcall - add ecx, [g_s] - cmp ecx, [gbym1_plus_gh_mul_gs] - jng @b - - mov ebx, [gbxm1_plus_gw_mul_gs] - mov ecx, [gbym1] - @@: - mcall - add ecx, [g_s] - cmp ecx, [gbym1_plus_gh_mul_gs] - jng @b - - ret - - - corners_dots: - - mov eax, 13 - mov ebx, [gbxm1] - dec ebx - shl ebx, 16 - add ebx, 2 - mov ecx, [gbym1] - dec ecx - shl ecx, 16 - add ecx, 2 - mov edx, [decorations_color] - mcall - - mov ebx, [gbxm1_plus_gw_mul_gs] - shl ebx, 16 - add ebx, 2 - mcall - - mov ebx, [gbxm1] - dec ebx - shl ebx, 16 - add ebx, 2 - mov ecx, [gbym1_plus_gh_mul_gs] - shl ecx, 16 - add ecx, 2 - mcall - - mov ebx, [gbxm1_plus_gw_mul_gs] - shl ebx, 16 - add ebx, 2 - mcall - - ret - - - corners_inner: - - mov eax, 38 - mov ebx, [gbxm1_shl16_gbxm1] - add ebx, [g_e] - mov ecx, [gbym1_shl16_gbym1] - mov edx, [decorations_color] - mcall - - mov ecx, [gbym1_plus_gh_mul_gs] - shl ecx, 16 - add ecx, [gbym1_plus_gh_mul_gs] - mcall - - mov ebx, [gbxm1_plus_gw_mul_gs] - sub ebx, [g_e] - shl ebx, 16 - add ebx, [gbxm1_plus_gw_mul_gs] - mcall - - mov ecx, [gbym1_shl16_gbym1] - mcall - - mov ebx, [gbxm1_shl16_gbxm1] - mov ecx, [gbym1_shl16_gbym1] - add ecx, [g_e] - mcall - - mov ebx, [gbxm1_plus_gw_mul_gs] - shl ebx, 16 - add ebx, [gbxm1_plus_gw_mul_gs] - mcall - - mov ecx, [gbym1_plus_gh_mul_gs] - sub ecx, [g_e] - shl ecx, 16 - add ecx, [gbym1_plus_gh_mul_gs] - mcall - - mov ebx, [gbxm1_shl16_gbxm1] - mcall - - ret - - - corners_outer: - - mov eax, 38 - mov ebx, [gbxm1_shl16_gbxm1] - sub ebx, [g_e] - mov ecx, [gbym1_shl16_gbym1] - mov edx, [decorations_color] - mcall - - mov ecx, [gbym1_plus_gh_mul_gs] - shl ecx, 16 - add ecx, [gbym1_plus_gh_mul_gs] - mcall - - mov ebx, [gbxm1_plus_gw_mul_gs] - shl ebx, 16 - add ebx, [gbxm1_plus_gw_mul_gs] - add ebx, [g_e] - mcall - - mov ecx, [gbym1_shl16_gbym1] - mcall - - mov ebx, [gbxm1_shl16_gbxm1] - mov ecx, [gbym1_shl16_gbym1] - sub ecx, [g_e] - mcall - - mov ebx, [gbxm1_plus_gw_mul_gs] - shl ebx, 16 - add ebx, [gbxm1_plus_gw_mul_gs] - mcall - - mov ecx, [gbym1_plus_gh_mul_gs] - shl ecx, 16 - add ecx, [gbym1_plus_gh_mul_gs] - add ecx, [g_e] - mcall - - mov ebx, [gbxm1_shl16_gbxm1] - mcall - - ret - - - corners_crosses: - - call corners_inner - call corners_outer - - ret - - - ;;---Draw_decorations-------------------------------------------------------------------------------------------------- - - -Draw_square: - ;;===Draw_square======================================================================================================= - ;; bl - x_coord - ;; bh - y_coord - ;; edx - color - - push eax ebx ecx edx - - mov cl, bh - - mov al, byte[g_s] - mul bl - mov bx, ax - add bx, word[gbxm1] - inc bx - shl ebx, 16 - add ebx, [g_s] - dec ebx - - mov al, byte[g_s] - mul cl - mov cx, ax - add cx, word[gbym1] - inc cx - shl ecx, 16 - add ecx, [g_s] - dec ecx - - mcall 13 - - pop edx ecx ebx eax - - ret - - ;;---Draw_square------------------------------------------------------------------------------------------------------- - - -Draw_menu_esc: - ;;===Draw_menu_esc===================================================================================================== - - mov ebx, [window_width] - shr ebx, 1 - sub ebx, string_menu_esc.size*3+6 - shl ebx, 16 - add ebx, dword[top_strings] - mcall 4, ,[navigation_strings_color],string_menu_esc - - ret - - ;;---Draw_menu_esc----------------------------------------------------------------------------------------------------- - - -Draw_score_string: - ;;===Draw_score_string================================================================================================= - - mov ebx, [window_width] - shr ebx, 3 - sub ebx, 5 - shl ebx, 16 - add ebx, dword[bottom_top_strings] - mcall 4, ,[score_string_color],string_score - - ret - - ;;---Draw_score_string------------------------------------------------------------------------------------------------- - - -Draw_score_number: - ;;===Draw_score_number================================================================================================= - - mov edx, [window_width] - shr edx, 3 - sub edx, 5+1 - add edx, string_score.size*6 - shl edx, 16 - add edx, dword[bottom_top_strings] - mcall 47,0x00070000,[score], ,[score_number_color],[background_color] - - ret - - ;;---Draw_score_number------------------------------------------------------------------------------------------------- - - -Draw_hiscore_string: - ;;===Draw_hiscore_string=============================================================================================== - - mov ebx, [window_width] - shr ebx, 3 - neg ebx - add ebx, [window_width] - sub ebx, string_hi_score.size*6+7*6+5 - shl ebx, 16 - add ebx, dword[bottom_top_strings] - mcall 4, ,[hiscore_string_color],string_hi_score - - ret - - ;;---Draw_hiscore_string----------------------------------------------------------------------------------------------- - - -Draw_hiscore_number: - ;;===Draw_hiscore_number=================================================================================================== - - mov edx, [window_width] - shr edx, 3 - neg edx - add edx, [window_width] - sub edx, 7*6+6 - shl edx, 16 - add edx, dword[bottom_top_strings] - - cmp [play_mode], CLASSIC_MODE - jne @f - mov ecx, [hi_score_classic] - jmp .done - @@: - mov ecx, [hi_score_levels] - - .done: - mcall 47,0x00070000, , ,[hiscore_number_color] - - ret - - ;;---Draw_hiscore_number--------------------------------------------------------------------------------------------------- - - -Draw_champion_string: - ;;===Draw_champion_string================================================================================================== - - mov ebx, [window_width] - shr ebx, 3 - neg ebx - add ebx, [window_width] - sub ebx, string_champion.size*6+7*6+5 - shl ebx, 16 - add ebx, dword[bottom_bottom_strings] - mcall 4, ,[champion_string_color],string_champion - - ret - - ;;---Draw_champion_string---------------------------------------------------------------------------------------------- - - -Draw_champion_name: - ;;===Draw_champion_name================================================================================================ - - mov ebx, [window_width] - shr ebx, 3 - neg ebx - add ebx, [window_width] - sub ebx, CHAMPION_NAME_LENGTH/2*6+7*6+6 ; there is no difference between length of champion names for other play_modes - add ebx, CHAMPION_NAME_LENGTH/2*6 - shl ebx, 16 - add ebx, dword[bottom_bottom_strings] - - cmp [play_mode], CLASSIC_MODE - jne @f - mov edx, champion_name_classic - jmp .done - @@: - mov edx, champion_name_levels - - .done: - mcall 4, ,[champion_name_color], - - ret - - ;;---Draw_champion_name------------------------------------------------------------------------------------------------ - - -Draw_picture: - ;;===Draw_picture====================================================================================================== - ;; in : - ;; ax = number of left square *0x100+ picture width (in squares) - ;; cx = number of top square *0x100+ picture height (in squares) - ;; edx = picture color - ;; esi = pointer to picture data - ;; - - add al, ah - add cl, ch - mov bh, ch - - .draw: - mov bl, ah - mov di, 7 - - .loop: - bt word[esi], di - jnc @f - push eax ebx ecx esi edi - call Draw_square - pop edi esi ecx ebx eax - - @@: - dec di - jns @f - mov di, 7 - inc esi - @@: - inc bl - cmp bl, al - jne .loop - - inc bh - cmp di, 7 - jz @f - inc esi - @@: - cmp bh, cl - jne .draw - - ret - - ;;---Draw_picture------------------------------------------------------------------------------------------------------ - - -Draw_on_map: - ;;===Draw_on_map======================================================================================================= - ;; in : - ;; al = x coord - ;; ah = y coord - ;; cl = value to draw - ;; - - and eax, 0x0000ffff - xor bx, bx - mov bl, al - shr ax, 8 - mov dx, GRID_WIDTH - mul dx - add ax, bx - mov edi, field_map - add edi, eax - mov [edi], cl - - ret - - ;;---Draw_on_map------------------------------------------------------------------------------------------------------- - - -Get_from_map: - ;;===Get_from_map====================================================================================================== - ;; in : - ;; al = x coord - ;; ah = y coord - ;; out : - ;; bl = value on map - ;; - - push eax - - and eax, 0x0000ffff - xor bx, bx - mov bl, al - shr ax, 8 - mov dx, GRID_WIDTH - mul dx - add ax, bx - mov edi, field_map - add edi, eax - mov bl, [edi] - - pop eax - - ret - - ;;---Get_from_map----------------------------------------------------------------------------------------------------------- - - -Load_level: - ;;===Load_level============================================================================================================= - ;; in : - ;; cur_level_number = level number to load - ;; - - mov eax, [cur_level_number] - mov edx, stage_00 - @@: - test al, al - jz @f - add edx, stage_01-stage_00 - dec al - jmp @b - @@: - - mov esi, window_title_with_lives - mov edi, window_title+5 - - .lives_in_title: - cmp [play_mode], LEVELS_MODE - jne .level_name_in_title - test [show_lives_style], 1 - jz .level_name_in_title - mov [edi], byte ' ' - mov al, byte[separating_symbol] - mov [edi+1], byte al - mov [edi+2], byte ' ' - add edi, 3 - mov eax, [lives] - add al, 0x30 - mov [window_title_with_lives], al - mov ecx, 10 - rep movsb - dec edi - - .level_name_in_title: - cmp [draw_level_name_in_window_title], 1 - jne @f - mov [edi], byte ' ' - mov al, byte[separating_symbol] - mov [edi+1], byte al - mov [edi+2], byte ' ' - add edi, 3 - mov esi, edx - add esi, LEVEL.name - mov esi, [esi] - mov ecx, 16 - rep movsd - - @@: - mcall 71,1,window_title - - mov [cur_level], edx - - mov esi, edx - add esi, LEVEL.field - mov edi, field_map - mov ecx, 2 - mov ah, GRID_HEIGHT - .begin: - mov ebx, 7 - mov al, GRID_WIDTH - .loop: - bt [esi], ebx - jnc @f - mov byte[edi], cl - jmp .skip - @@: - mov byte[edi], 0 - .skip: - dec ebx - jns @f - mov ebx, 7 - inc esi - @@: - inc edi - dec al - jnz .loop - inc esi - dec ah - jnz .begin - - - mov esi, edx - add esi, LEVEL.snake_dots - mov edi, snake_dots - mov ecx, 3 - rep movsw - - mov esi, edx - add esi, LEVEL.snake_direction - mov eax, [esi] - mov [snake_direction], eax - - mov esi, edx - add esi, LEVEL.snake_direction_next - mov eax, [esi] - mov [snake_direction_next], eax - - mov esi, edx - add esi, LEVEL.number_of_stones - mov eax, [esi] - mov [number_of_free_dots], GRID_WIDTH*GRID_HEIGHT-3 - sub [number_of_free_dots], eax - - mov ax, word[snake_dots] - mov cl, 1 - call Draw_on_map - mov ax, word[snake_dots+2] - mov cl, 1 - call Draw_on_map - mov ax, word[snake_dots+4] - mov cl, 1 - call Draw_on_map - - mov [action], 0 - mov [snake_length_x2], 6 - - ret - - ;;---Load_level------------------------------------------------------------------------------------------------------------- - - -Draw_stones: - ;;===Draw_stones============================================================================================================ - - mov ax, 0*0x100+GRID_WIDTH - mov cx, 0*0x100+GRID_HEIGHT - mov edx, [stone_color] - mov esi, [cur_level] - add esi, LEVEL.field - call Draw_picture - - ret - - ;;---Draw_stones------------------------------------------------------------------------------------------------------------ - - -Hide_cursor: - ;;===Hide_cursor=========================================================================================================== - - mcall 37,5,[cursor_handle] - - ret - - ;;---Show_cursor----------------------------------------------------------------------------------------------------------- - - -Show_cursor: - ;;===Hide_cursor=========================================================================================================== - - mcall 37,5,0 - - ret - - ;;---Show_cursor----------------------------------------------------------------------------------------------------------- - - -Set_window_mode: - ;;===Set_window_mode======================================================================================================= - - test al, al - jnz .fullscreen - mov eax, [window_style_windowed] - jmp .quit - - .fullscreen: - mov eax, [window_style_fullscreen] - - .quit: - mov [window_style], eax - ret - -;;---Some_functions------------------------------------------------------------------------------------------------------------ - - -Reverse_snake: - ;;===Reverse_snake========================================================================================================= - - cmp [snake_direction], LEFT - jne @f - mov [snake_direction_next], RIGHT - jmp .quit - @@: - cmp [snake_direction], RIGHT - jne @f - mov [snake_direction_next], LEFT - jmp .quit - @@: - cmp [snake_direction], UP - jne @f - mov [snake_direction_next], DOWN - jmp .quit - @@: - cmp [snake_direction], DOWN - jne @f - mov [snake_direction_next], UP -; jmp .quit - @@: - - .quit: - ret - - ;;---Reverse_snake--------------------------------------------------------------------------------------------------------- - - -;;===Variables================================================================================================================== - -window_title db 'Snake',64+15 dup (0) -window_title_with_lives db '_ live(s)',0 -default_separating_symbol db '|',0 -window_style_windowed dd 0x33000000 ; scalable skinned window -window_style_fullscreen dd 0x00000000 -time_before_waiting dd 0x0 -time_to_wait dd 0x0 -time_wait_limit dd 101 -time_wait_limit_const dd 0x0 - -play_mode dd 0x0 -lives dd START_LIVES -acceleration_mask dd 0x0 - -resized_by_hotkey dd 0x0 -fullscreen dd 0x0 - -szZ string_score ,'SCORE : ' -szZ string_hi_score ,'HI-SCORE : ' -szZ string_champion ,'CHAMPION : ' -szZ string_level ,'LEVEL : ' -szZ string_pause_space ,'PAUSE - ',0x27,'SPACE',0x27 -szZ string_resume_space ,'RESUME - ',0x27,'SPACE',0x27 -szZ string_menu_esc ,'MENU - ',0x27,'ESC',0x27 -szZ string_apply_name_enter ,'APPLY NAME - ',0x27,'ENTER',0x27 -szZ press_to_start ,'PRESS ',0x27,'ENTER',0x27,' TO START' -szZ press_esc_to_exit ,'PRESS ',0x27,'ESC',0x27,' TO EXIT' -;press_F2_to_options db 'PRESS ',0x27,'F2',0x27,' TO OPTIONS',0 - -szZ string_congratulations ,' Congratulations!!! New hi-score is : ' -szZ string_enter_your_name ,'You are the champion! Enter your name : ' - -szZ string_button_play ,'PLAY' -szZ string_button_exit ,'EXIT' -szZ string_button_inc ,'+INC+' -szZ string_button_dec ,'-dec-' -szZ string_button_pm_classic,'CLASSIC mode' -szZ string_button_pm_levels ,'LEVELS mode' - -is_new_record dd 0 - -action dd 0 - -picture_first_menu_snake db 0xf4,0x99,0x2f,\ - 0x86,0xa5,0x49,\ - 0xf5,0xa5,0x8f,\ - 0x15,0xbd,0x48,\ - 0xf4,0xa5,0x2f - -picture_first_menu_version db 0xf1,0xe0,\ - 0x90,0x20,\ - 0x90,0x20,\ - 0x90,0x20,\ - 0xf4,0x20 - -picture_pause db 11100011b,00100101b,11101111b,\ - 10010100b,10100101b,00001000b,\ - 10010100b,10100101b,00001000b,\ - 11100111b,10100101b,11101111b,\ - 10000100b,10100100b,00101000b,\ - 10000100b,10011001b,11101111b - -picture_game_over db 00110000b,00000000b,00000000b,00000000b,\ - 01001001b,11001000b,10111100b,00000000b,\ - 10000010b,00101101b,10100000b,00000000b,\ - 10011010b,00101010b,10111000b,00000000b,\ - 10001011b,11101000b,10100000b,00000000b,\ - 01110010b,00101000b,10111100b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000111b,00000000b,00000000b,00000000b,\ - 00001000b,10100010b,11110111b,10000000b,\ - 00001000b,10100010b,10000100b,01000000b,\ - 00001000b,10100010b,11100100b,01000000b,\ - 00001000b,10010100b,10000111b,10000000b,\ - 00000111b,00001000b,11110100b,01000000b - -;picture_you_win db 10001001b,11001000b,10000000b,\ -; 10001010b,00101000b,10000000b,\ -; 01010010b,00101000b,10000000b,\ -; 00100010b,00101000b,10000000b,\ -; 00100001b,11000111b,00000000b,\ -; 00000000b,00000000b,00000000b,\ -; 00000000b,00000000b,00000000b,\ -; 01000100b,10010001b,00000000b,\ -; 01010100b,10011001b,00000000b,\ -; 01010100b,10010101b,00000000b,\ -; 01010100b,10010011b,00000000b,\ -; 00101000b,10010001b,00000000b - -picture_you_win db 01000100b,01000011b,10001000b,10000000b,\ - 01000100b,01000100b,01001000b,10000000b,\ - 01000100b,01000100b,00001000b,10000000b,\ - 01111100b,01000100b,11001111b,10000000b,\ - 01000100b,01000100b,01001000b,10000000b,\ - 01000100b,01000011b,10001000b,10000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 11110011b,10011100b,11110011b,11000000b,\ - 10000100b,00100010b,10001010b,00000000b,\ - 11110100b,00100010b,10001011b,10000000b,\ - 00010100b,00100010b,11110010b,00000000b,\ - 11110011b,10011100b,10001011b,11000000b - -picture_level db 10000111b,10100101b,11101000b,\ - 10000100b,00100101b,00001000b,\ - 10000111b,00100101b,11001000b,\ - 10000100b,00101001b,00001000b,\ - 11110111b,10110001b,11101111b - -digits_font db 0xf0,0x90,0x90,0x90,0xf0,\ - 0x20,0x60,0x20,0x20,0x20,\ - 0xf0,0x10,0xf0,0x80,0xf0,\ - 0xf0,0x10,0x70,0x10,0xf0,\ - 0x90,0x90,0xf0,0x10,0x10,\ - 0xf0,0x80,0xf0,0x10,0xf0,\ - 0xf0,0x80,0xf0,0x90,0xf0,\ - 0xf0,0x10,0x10,0x10,0x10,\ - 0xf0,0x90,0xf0,0x90,0xf0,\ - 0xf0,0x90,0xf0,0x10,0xf0 - -stage_00: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 3,3, 4,3, 5,3 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 0 -.name dd stage_00_name - -stage_01: -.field db 11111000b,00000000b,00000001b,11110000b,\ - 10000000b,00000000b,00000000b,00010000b,\ - 10000000b,00000000b,00000000b,00010000b,\ - 10000000b,00000000b,00000000b,00010000b,\ - 10000000b,00000000b,00000000b,00010000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 10000000b,00000000b,00000000b,00010000b,\ - 10000000b,00000000b,00000000b,00010000b,\ - 10000000b,00000000b,00000000b,00010000b,\ - 10000000b,00000000b,00000000b,00010000b,\ - 11111000b,00000000b,00000001b,11110000b - -.snake_dots db 3,3, 4,3, 5,3 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 36 -.name dd stage_01_name - -stage_02: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00011111b,11000000b,00111111b,10000000b,\ - 00010000b,00000000b,00000000b,10000000b,\ - 00010000b,00000000b,00000000b,10000000b,\ - 00010000b,00000000b,00000000b,10000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00010000b,00000000b,00000000b,10000000b,\ - 00010000b,00000000b,00000000b,10000000b,\ - 00010000b,00000000b,00000000b,10000000b,\ - 00011111b,11000000b,00111111b,10000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 7,5, 8,5, 9,5 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 40 -.name dd stage_02_name - -stage_03: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00001001b,00000000b,00000000b,\ - 00000000b,00001001b,00000000b,00000000b,\ - 00000000b,00001001b,00000000b,00000000b,\ - 00001111b,11111001b,11111111b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00001111b,11111001b,11111111b,00000000b,\ - 00000000b,00001001b,00000000b,00000000b,\ - 00000000b,00001001b,00000000b,00000000b,\ - 00000000b,00001001b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 23,0, 22,0, 21,0 -.snake_direction dd LEFT -.snake_direction_next dd LEFT -.number_of_stones dd 48 -.name dd stage_03_name - -stage_04: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00100000b,01000000b,00000000b,\ - 00000010b,00100000b,01000100b,00000000b,\ - 00000010b,00000000b,00000100b,00000000b,\ - 00010000b,00100000b,01000000b,10000000b,\ - 00000010b,00100000b,01000100b,00000000b,\ - 00010010b,00000000b,00000100b,10000000b,\ - 00010010b,00000000b,00000100b,10000000b,\ - 00000010b,00100000b,01000000b,00000000b,\ - 00010000b,00100000b,01000000b,10000000b,\ - 00000010b,00000000b,00000100b,00000000b,\ - 00000010b,00100000b,01000100b,00000000b,\ - 00000000b,00100000b,01000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 19,6, 19,7, 19,8 -.snake_napravlenie dd DOWN -.snake_napravlenie_next dd DOWN -.number_of_stones dd 39 -.name dd stage_04_name - -stage_05: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000001b,11111111b,11111000b,00000000b,\ - 00000001b,11111111b,11111000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000111b,11111111b,11111110b,00000000b,\ - 00000111b,11111111b,11111110b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00111111b,11111111b,11111111b,11000000b,\ - 00111111b,11111111b,11111111b,11000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 0,0, 0,1, 1,1 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 112 -.name dd stage_05_name - -stage_06: -.field db 00000001b,10000000b,00000000b,00000000b,\ - 00000001b,11111111b,11111000b,00000000b,\ - 00000001b,11111111b,11111000b,00000000b,\ - 00000000b,00000000b,00011000b,00000000b,\ - 00000000b,00000000b,00011000b,00000000b,\ - 00011111b,11111111b,11111000b,00000000b,\ - 00011111b,11111111b,11111000b,00000000b,\ - 00011000b,00000000b,00000000b,00000000b,\ - 00011000b,00000000b,00000000b,00000000b,\ - 00011111b,11111111b,11111111b,11100000b,\ - 00011111b,11111111b,11111111b,11100000b,\ - 00000000b,00000000b,00000000b,01100000b,\ - 00000000b,00000000b,00000000b,01100000b,\ - 00000000b,00000000b,00000000b,01100000b - -.snake_dots db 0,0, 0,1, 1,1 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 128 -.name dd stage_06_name - -stage_07: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000011b,11111111b,11111100b,00000000b,\ - 00000000b,00000000b,00000100b,00000000b,\ - 00000011b,11111111b,11110100b,00000000b,\ - 00000010b,00000000b,00010100b,00000000b,\ - 00000010b,11111111b,11010100b,00000000b,\ - 00000010b,00000000b,00010100b,00000000b,\ - 00000010b,11111111b,11110100b,00000000b,\ - 00000010b,00000000b,00000100b,00000000b,\ - 00000011b,11111111b,11111100b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 8,1, 9,1, 10,1 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 83 -.name dd stage_07_name - -stage_08: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00010000b,00000000b,\ - 00001001b,00000001b,00000000b,00000000b,\ - 00000001b,01001001b,00000101b,00000000b,\ - 00000000b,01000000b,00000100b,00000000b,\ - 00001111b,00000000b,11100000b,00000000b,\ - 00000000b,00000000b,00001000b,10000000b,\ - 00000111b,00100000b,10000010b,10000000b,\ - 00010000b,00000000b,00000010b,00000000b,\ - 00010000b,11000000b,01110010b,00000000b,\ - 00010010b,00000000b,00000010b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 0,0, 1,0, 2,0 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 40 -.name dd stage_08_name - -stage_09: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00111101b,00100110b,01001011b,11000000b,\ - 00100001b,10101001b,01010010b,00000000b,\ - 00111101b,01100001b,01100011b,10000000b,\ - 00000101b,01100111b,01010010b,00000000b,\ - 00111101b,00100001b,01001011b,11000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 12,6, 12,7, 12,8 -.snake_direction dd DOWN -.snake_direction_next dd DOWN -.number_of_stones dd 59 -.name dd stage_09_name - -stage_10: -.field db 11101110b,11101110b,11101110b,11100000b,\ - 11101110b,11101110b,11101110b,11100000b,\ - 11101110b,11101110b,11101110b,11100000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 11101110b,11101110b,11101110b,11100000b,\ - 11101110b,11101110b,11101110b,11100000b,\ - 11101110b,11101110b,11101110b,11100000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 11101110b,11101110b,11101110b,11100000b,\ - 11101110b,11101110b,11101110b,11100000b,\ - 11101110b,11101110b,11101110b,11100000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 11101110b,11101110b,11101110b,11100000b,\ - 11101110b,11101110b,11101110b,11100000b - -.snake_dots db 3,2, 3,3, 4,3 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 231 -.name dd stage_10_name - -stage_11: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000111b,00000111b,00000111b,00000000b,\ - 00001101b,10001101b,10001101b,10000000b,\ - 00011000b,11011000b,11011000b,11000000b,\ - 00000000b,01000000b,01000000b,01000000b,\ - 00011000b,11011000b,11011000b,11000000b,\ - 00001101b,10001101b,10001101b,10000000b,\ - 00000111b,00000111b,00000111b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 3,12, 4,12, 5,12 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 69 -.name dd stage_11_name - -stage_12: -.field db 00000000b,00011000b,00001110b,00000000b,\ - 01101110b,00010000b,00001010b,01010000b,\ - 01001011b,11011001b,11000000b,01110000b,\ - 01100001b,01000001b,01000000b,00000000b,\ - 00000000b,00000000b,00000011b,10000000b,\ - 00000000b,00000000b,00000010b,10000000b,\ - 01010011b,00001100b,10100110b,00110000b,\ - 01110010b,00001000b,11100100b,00010000b,\ - 00000011b,00001100b,00000110b,00110000b,\ - 00000000b,11100000b,00000000b,00000000b,\ - 00010100b,10100000b,00000110b,00000000b,\ - 11011100b,00000110b,10100100b,00000000b,\ - 01000011b,10000010b,11100110b,10100000b,\ - 11000010b,10000110b,00000000b,11100000b - -.snake_dots db 27,0, 26,0, 25,0 -.snake_direction dd LEFT -.snake_direction_next dd LEFT -.number_of_stones dd 110 -.name dd stage_12_name - -stage_13: -.field db 00111000b,00100000b,00000000b,00000000b,\ - 01111100b,11110011b,11000011b,10000000b,\ - 11111100b,01110011b,10000001b,11000000b,\ - 11110000b,00000011b,11000000b,00000000b,\ - 00000000b,00000010b,00000000b,00000000b,\ - 00000000b,00000010b,00000001b,00000000b,\ - 00011110b,00000111b,00000111b,00000000b,\ - 00000111b,10001111b,11111110b,00000000b,\ - 00000011b,11111111b,11111100b,00000000b,\ - 00110001b,11111111b,11111001b,01100000b,\ - 00001110b,11101011b,00100111b,10000000b,\ - 01111000b,10000011b,10000010b,00000000b,\ - 00000011b,11100110b,00011010b,11000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 0,5, 0,6, 0,7 -.snake_direction dd DOWN -.snake_direction_next dd DOWN -.number_of_stones dd 141 -.name dd stage_13_name - -stage_14: -.field db 00000110b,00000000b,00000000b,00000000b,\ - 00001000b,00000000b,00011000b,00000000b,\ - 00010000b,00000000b,00000100b,00000000b,\ - 00100001b,10000000b,11000010b,00000000b,\ - 01000010b,01000001b,00100001b,00000000b,\ - 10000100b,00000010b,00010000b,10000000b,\ - 10001000b,00000100b,00001000b,01000000b,\ - 10010000b,00001000b,00000100b,01000000b,\ - 01001000b,00010000b,00001000b,10000000b,\ - 00100100b,00100000b,00010001b,00000000b,\ - 00010010b,01000001b,00100010b,00000000b,\ - 00001001b,10000000b,11000100b,00000000b,\ - 00000100b,00000000b,00001000b,00000000b,\ - 00000000b,00000000b,00110000b,00000000b - -.snake_dots db 8,0, 9,0, 10,0 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 60 -.name dd stage_14_name - -stage_15: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,01110000b,00110000b,00000000b,\ - 00000000b,10000000b,00001010b,00000000b,\ - 00100001b,00000000b,00110010b,00000000b,\ - 00010001b,00111111b,10011100b,00000000b,\ - 00001001b,00100000b,11000000b,00000000b,\ - 00010000b,00000010b,01000000b,00000000b,\ - 00100000b,00000010b,00100001b,10000000b,\ - 00010000b,00000010b,00110010b,01000000b,\ - 00001000b,01000100b,00011100b,01000000b,\ - 00010000b,00111000b,00010000b,01000000b,\ - 00100000b,00000000b,00010000b,01000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 13,3, 13,2, 14,2 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 60 -.name dd stage_15_name - -stage_16: -.field db 00000000b,10000010b,00000000b,00000000b,\ - 00000000b,01001010b,10000010b,10100000b,\ - 01111111b,11100111b,00000001b,11000000b,\ - 00000000b,01000010b,00000000b,10000000b,\ - 00000100b,10000000b,01000000b,00000001b,\ - 00000100b,00100000b,10000000b,00000010b,\ - 11000100b,00010001b,11111000b,00000111b,\ - 00010101b,00001000b,10000000b,00000010b,\ - 00001110b,00010000b,01000000b,00000001b,\ - 00000100b,00100010b,00000000b,10000000b,\ - 00000000b,00000010b,00000000b,01000000b,\ - 00111111b,11111111b,11111111b,11100000b,\ - 00000000b,00000010b,00000000b,01000000b,\ - 00000000b,00000010b,00000000b,10000000b - -.snake_dots db 11,7, 10,7, 9,7 -.snake_direction dd LEFT -.snake_direction_next dd LEFT -.number_of_stones dd 96 -.name dd stage_16_name - -stage_17: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000111b,10000001b,11100000b,00000000b,\ - 00001000b,01000010b,00010000b,00000000b,\ - 00010001b,00100100b,01001000b,00000000b,\ - 00010001b,00000000b,01001000b,00000000b,\ - 00001000b,01000010b,00010000b,00000000b,\ - 00000111b,10000001b,11100000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,01000000b,00000000b,00000000b,\ - 00000000b,00111110b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 11,7, 11,8, 12,8 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 40 -.name dd stage_17_name - -stage_18: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 01000100b,01000100b,01000100b,01000000b,\ - 00101010b,10101010b,10101010b,10100000b,\ - 00010001b,00010001b,00010001b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 01000100b,01000100b,01000100b,01000000b,\ - 00101010b,10101010b,10101010b,10100000b,\ - 00010001b,00010001b,00010001b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 01000100b,01000100b,01000100b,01000000b,\ - 00101010b,10101010b,10101010b,10100000b,\ - 00010001b,00010001b,00010001b,00000000b - -.snake_dots db 2,5, 3,5, 4,5 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 78 -.name dd stage_18_name - -stage_19: -.field db 01000010b,00100100b,10000101b,00000000b,\ - 00010000b,00010000b,00100000b,10000000b,\ - 00111001b,00000010b,00010000b,00100000b,\ - 01000100b,00001000b,00000010b,00000000b,\ - 01010101b,01000000b,01000000b,01000000b,\ - 01010100b,00010000b,00001000b,11100000b,\ - 00000100b,10001001b,00100001b,00000000b,\ - 01111100b,00100000b,00000001b,01010000b,\ - 00111001b,00000100b,00010001b,01010000b,\ - 00010000b,00000000b,10000001b,00010000b,\ - 11010111b,11100000b,00011101b,11110000b,\ - 00010000b,01000000b,00100000b,11100000b,\ - 00010000b,10000000b,00100000b,01000000b,\ - 00000001b,00000000b,00010000b,01000000b - -.snake_dots db 27,6, 0,6, 1,6 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 95 -.name dd stage_19_name - -stage_20: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,10001000b,00000000b,\ - 00000000b,00011100b,10000100b,00000000b,\ - 00000000b,01100100b,10000010b,00000000b,\ - 00000011b,10000100b,10000100b,00000000b,\ - 00000010b,00000100b,10001000b,00000000b,\ - 00000010b,00000100b,10000100b,00000000b,\ - 00000010b,00000100b,10000010b,00000000b,\ - 00000010b,00111100b,10010010b,00000000b,\ - 00011110b,00111100b,10010100b,00000000b,\ - 00011110b,00111100b,10001000b,00000000b,\ - 00011110b,00000000b,10000000b,00000000b,\ - 00000000b,00000000b,10000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 17,2, 17,3, 17,4 -.snake_direction dd DOWN -.snake_direction_next dd DOWN -.number_of_stones dd 65 -.name dd stage_20_name - -stage_21: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000011b,11111111b,11111110b,00000000b,\ - 00000001b,01000100b,01000100b,00000000b,\ - 00000010b,01000100b,01000100b,00000000b,\ - 00001100b,01000100b,01000100b,00000000b,\ - 01110000b,01000100b,01000100b,00000000b,\ - 01110000b,01000100b,01000100b,00000000b,\ - 01110000b,11101110b,11101110b,00000000b,\ - 00000000b,11101110b,11101110b,00000000b,\ - 00000000b,11101110b,11101110b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 10,1, 11,1, 12,1 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 86 -.name dd stage_21_name - -stage_22: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000011b,10000000b,00000000b,00000000b,\ - 00000111b,11100000b,00000000b,00000000b,\ - 00001111b,11110000b,00000000b,00000000b,\ - 00011111b,11100000b,00000000b,00000000b,\ - 00011111b,11000011b,00001100b,00110000b,\ - 00011111b,10000111b,10011110b,01110000b,\ - 00011111b,11000111b,10011110b,01110000b,\ - 00011111b,11100011b,00001100b,00110000b,\ - 00001111b,11110000b,00000000b,00000000b,\ - 00000111b,11100000b,00000000b,00000000b,\ - 00000011b,10000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 1,7, 1,6, 1,5 -.snake_direction dd UP -.snake_direction_next dd UP -.number_of_stones dd 104 -.name dd stage_22_name - -stage_23: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00100000b,01000101b,00010000b,00100000b,\ - 00011010b,00100101b,00100010b,11000000b,\ - 00000100b,10101000b,10101001b,00000000b,\ - 00000100b,10010010b,01001001b,00000000b,\ - 00001011b,00110000b,01100110b,10000000b,\ - 00000000b,11001010b,10011000b,00000000b,\ - 00000001b,00000111b,00000100b,00000000b,\ - 00001110b,01001010b,10010011b,10000000b,\ - 00000010b,00110000b,01100010b,00000000b,\ - 00000101b,00010010b,01000101b,00000000b,\ - 00001001b,00001000b,10000100b,10000000b,\ - 00000000b,00001000b,10000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 15,0, 14,0, 13,0 -.snake_direction dd LEFT -.snake_direction_next dd LEFT -.number_of_stones dd 85 -.name dd stage_23_name - -stage_24: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00111111b,11111111b,11111111b,10000000b,\ - 00100000b,00000000b,00000000b,10000000b,\ - 00100011b,11111111b,11111000b,10000000b,\ - 00100010b,00000000b,00001000b,10000000b,\ - 00100010b,00111111b,10001000b,10000000b,\ - 00100010b,00100000b,10001000b,10000000b,\ - 00101010b,10101010b,10101010b,10000000b,\ - 00001000b,10001110b,00100010b,00000000b,\ - 00001000b,10000000b,00100010b,00000000b,\ - 00001000b,11111111b,11100010b,00000000b,\ - 00001000b,00000000b,00000010b,00000000b,\ - 00001111b,11111111b,11111110b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 1,0, 0,0, 0,1 -.snake_direction dd DOWN -.snake_direction_next dd DOWN -.number_of_stones dd 120 -.name dd stage_24_name - -stage_25: -.field db 00000100b,11000000b,00000000b,00000000b,\ - 00000011b,10000000b,00110010b,00000000b,\ - 10011010b,10000000b,00011100b,00000000b,\ - 01110000b,00000000b,00010101b,10010000b,\ - 01010000b,00000111b,00000000b,11100000b,\ - 00000100b,00000101b,00000000b,10100000b,\ - 00000100b,00000100b,00000000b,00000000b,\ - 00000011b,11111100b,00011001b,00000000b,\ - 00000010b,10010100b,00001110b,00000000b,\ - 00000010b,10010100b,00001010b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000011b,00100001b,10010011b,00100000b,\ - 00000001b,11000000b,11100001b,11000000b,\ - 00000001b,01000000b,10100001b,01000000b - -.snake_dots db 11,2, 12,2, 13,2 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 88 -.name dd stage_25_name - -stage_26: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00111100b,01001111b,01111010b,01000000b,\ - 00100000b,01000001b,00001010b,01000000b,\ - 00100100b,01001111b,01111011b,11000000b,\ - 00000100b,01001000b,00001000b,01000000b,\ - 00111100b,01001111b,01111000b,01000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00111101b,11101111b,01111011b,11000000b,\ - 00100001b,00000001b,00000000b,00000000b,\ - 00111101b,11100001b,01111011b,11000000b,\ - 00000100b,00000001b,00000000b,01000000b,\ - 00111101b,11100001b,01111011b,11000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 1,5, 0,5, 0,6 -.snake_direction dd DOWN -.snake_direction_next dd DOWN -.number_of_stones dd 115 -.name dd stage_26_name - -stage_27: -.field db 00000000b,10000000b,00000000b,01000000b,\ - 00000000b,10000000b,01000000b,11100000b,\ - 00100011b,11100000b,01000000b,01000000b,\ - 01110000b,10000001b,11110000b,00000000b,\ - 00100000b,10000000b,01000000b,00000000b,\ - 00000000b,00000000b,01000010b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000010b,00000000b,00000000b,00000000b,\ - 00000111b,00000000b,00000000b,10000000b,\ - 00000010b,00001000b,00000001b,11000000b,\ - 00000000b,00000000b,10000000b,10000000b,\ - 00000000b,01000001b,11000000b,00000000b,\ - 01000000b,11100000b,10000000b,00000000b,\ - 00000000b,01000000b,00000000b,00000000b - -.snake_dots db 12,8, 12,7, 12,6 -.snake_direction dd UP -.snake_direction_next dd UP -.number_of_stones dd 51 -.name dd stage_27_name - -stage_28: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000100b,00000000b,00000010b,00000000b,\ - 00010100b,00000000b,00000010b,10000000b,\ - 01010100b,00000000b,00000010b,10100000b,\ - 01010101b,11111111b,11111010b,10100000b,\ - 01010100b,00000000b,00000010b,10100000b,\ - 00010100b,00000000b,00000010b,10000000b,\ - 00000100b,00000000b,00000010b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 13,8, 12,8, 11,8 -.snake_direction dd LEFT -.snake_direction_next dd LEFT -.number_of_stones dd 44 -.name dd stage_28_name - -stage_29: -.field db 00000000b,01110000b,00000000b,00000000b,\ - 00000100b,01000110b,00000001b,10000000b,\ - 01001110b,00001100b,01100000b,11000000b,\ - 01000000b,00000000b,01100000b,00000000b,\ - 01100000b,01111000b,00000001b,10010000b,\ - 00000000b,00000010b,10000101b,10110000b,\ - 00110000b,00110010b,10001100b,00100000b,\ - 00011011b,00110110b,10000100b,00000000b,\ - 00000001b,00000000b,10010000b,10000000b,\ - 00100001b,00000000b,00111000b,10000000b,\ - 00111001b,00110011b,00000011b,10000000b,\ - 01111111b,11111111b,00011011b,11010000b,\ - 11111111b,11111111b,00011111b,11110000b,\ - 11111111b,11111111b,00111111b,11110000b - -.snake_dots db 0,0, 1,0, 2,0 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 151 -.name dd stage_29_name - -stage_30: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000001b,01011100b,00000000b,\ - 00000000b,00000001b,11001000b,00000000b,\ - 00000100b,00000001b,01001000b,00000000b,\ - 00000100b,00000100b,00000000b,00000000b,\ - 00000100b,00000100b,00000100b,00000000b,\ - 00000100b,00000100b,00000100b,00000000b,\ - 00000100b,00000100b,00000100b,00000000b,\ - 01111111b,11000100b,11111111b,11100000b,\ - 00000100b,00000100b,00000100b,00000000b,\ - 00011111b,00111111b,10001110b,00000000b,\ - 00000100b,00000100b,00000100b,00000000b,\ - 00011111b,00011111b,00011111b,00000000b,\ - 11111111b,11111111b,11111111b,11110000b - -.snake_dots db 8,2, 9,2, 10,2 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 109 -.name dd stage_30_name - -stage_31: -.field db 00000101b,00010000b,00000100b,01000000b,\ - 01000100b,01010101b,00010100b,01000000b,\ - 01000101b,01010101b,01000101b,00010000b,\ - 01010000b,00010100b,01000000b,01010000b,\ - 00010101b,01000101b,01010100b,01000000b,\ - 01000001b,00010000b,01010101b,01000000b,\ - 01010101b,00010100b,00000101b,00010000b,\ - 00000101b,01010000b,01000101b,01010000b,\ - 01010000b,01000100b,00000000b,01010000b,\ - 00010101b,00000101b,00010100b,00010000b,\ - 01010001b,00010001b,01000001b,01000000b,\ - 01000100b,00000101b,01010100b,01010000b,\ - 00010001b,01010100b,00010001b,00010000b,\ - 00000100b,01000001b,00010001b,00000000b - -.snake_dots db 18,8, 17,8, 16,8 -.snake_direction dd LEFT -.snake_direction_next dd LEFT -.number_of_stones dd 112 -.name dd stage_31_name - -stage_32: -.field db 11111111b,11111111b,11111111b,11110000b,\ - 10010010b,01001001b,00100100b,10010000b,\ - 10010000b,01000001b,00000100b,00010000b,\ - 10010010b,01001001b,00100100b,10010000b,\ - 10010010b,01001001b,00100100b,10010000b,\ - 10010010b,01001001b,00100100b,10010000b,\ - 10010010b,01001001b,00100100b,10010000b,\ - 10010010b,01001001b,00100100b,10010000b,\ - 10010010b,01001001b,00100100b,10010000b,\ - 10010010b,01001001b,00100100b,10010000b,\ - 10010010b,01001001b,00100100b,10010000b,\ - 10000010b,00001000b,00100000b,10010000b,\ - 10010010b,01001001b,00100100b,10010000b,\ - 11111111b,11111111b,11111111b,11110000b - -.snake_dots db 1,1, 1,2, 1,3 -.snake_direction dd DOWN -.snake_direction_next dd DOWN -.number_of_stones dd 168 -.name dd stage_32_name - -stage_33: -.field db 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 01111111b,11001111b,11111111b,11100000b,\ - 01000100b,01001000b,01000000b,00100000b,\ - 01000100b,01001000b,01000001b,10100000b,\ - 01000100b,01001000b,01001101b,10100000b,\ - 00000000b,00000000b,00000110b,00000000b,\ - 01000100b,01001000b,01000010b,00100000b,\ - 01000100b,01001000b,01001111b,00100000b,\ - 01000100b,01001000b,01001111b,00100000b,\ - 01000100b,01001000b,01000110b,00100000b,\ - 01111111b,11001111b,11111111b,11100000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 6,6, 7,6, 8,6 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 109 -.name dd stage_33_name - -stage_34: -.field db 01110000b,00000000b,00000011b,10000000b,\ - 00010010b,00010000b,01111100b,00000000b,\ - 00011110b,00010000b,00100100b,00000000b,\ - 00000100b,00011001b,00100111b,00000000b,\ - 00001111b,10001001b,00100000b,00110000b,\ - 00000001b,00001011b,00101000b,00100000b,\ - 00000001b,00011110b,01111000b,00100000b,\ - 00111000b,00000010b,00001100b,10100000b,\ - 00001110b,00100010b,00000000b,10100000b,\ - 01100011b,11111110b,01000011b,11100000b,\ - 00111110b,00100010b,01000000b,10000000b,\ - 00000000b,01100011b,11000010b,10000000b,\ - 00000000b,01000000b,01100111b,10000000b,\ - 00000000b,00000000b,00000010b,00000000b - -.snake_dots db 7,0, 8,0, 9,0 -.snake_direction dd RIGHT -.snake_direction_next dd RIGHT -.number_of_stones dd 113 -.name dd stage_34_name - -stage_35: -.field db 00000100b,00000000b,00001010b,00000000b,\ - 00010100b,01000000b,00101010b,00000000b,\ - 00010100b,10000010b,00010010b,10000000b,\ - 00010001b,00000000b,00010010b,10000000b,\ - 00010001b,00000010b,00001010b,10000000b,\ - 01010010b,00000010b,00001000b,10100000b,\ - 01000100b,00000000b,00001000b,10100000b,\ - 01000100b,00000010b,00000100b,10100000b,\ - 01001000b,00000010b,00000100b,00100000b,\ - 01001000b,00000000b,00000010b,00100000b,\ - 00010000b,00000010b,00000010b,00100000b,\ - 00110000b,00000010b,00000010b,00100000b,\ - 00100000b,00000010b,00000001b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b - -.snake_dots db 13,11, 13,10, 13,9 -.snake_direction dd UP -.snake_direction_next dd UP -.number_of_stones dd 66 -.name dd stage_35_name - -stage_36: -.field db 10101110b,10001110b,00110100b,11100000b,\ - 11101000b,10001110b,00101010b,10000000b,\ - 10101110b,11101000b,00101010b,11100000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00000000b,10110010b,01000100b,00000000b,\ - 00000001b,10100101b,01010100b,00000000b,\ - 00000001b,10100101b,00101000b,00000000b,\ - 00000000b,00000000b,00000000b,00000000b,\ - 00010001b,11010101b,11010001b,11000000b,\ - 00010001b,11010101b,11010001b,00000000b,\ - 00010001b,00010101b,00010000b,10000000b,\ - 00011101b,11001001b,11011100b,01000000b,\ - 00000000b,00000000b,00000001b,11010000b - -.snake_dots db 27,11, 27,10, 27,9 -.snake_direction dd UP -.snake_direction_next dd UP -.number_of_stones dd 112 -.name dd stage_36_name - - -stage_00_name db 'Classic mode',0 -stage_01_name db 'Begin',0 -stage_02_name db 'Frame',0 -stage_03_name db 'Sight',0 -stage_04_name db 'Dashed',0 -stage_05_name db 'Beams',0 -stage_06_name db 'Pipe',0 -stage_07_name db 'Labyrinth',0 -stage_08_name db 'Sea battle',0 -stage_09_name db 'Recursion',0 -stage_10_name db 'Narrow corridors',0 -stage_11_name db 'CCC',0 -stage_12_name db 'Deadlocks',0 -stage_13_name db 'Boat',0 -stage_14_name db 'Pattern',0 -stage_15_name db 'Guernica',0 -stage_16_name db 'Goto',0 -stage_17_name db 'Smiling face',0 -stage_18_name db 'Waves',0 -stage_19_name db 'First snow',0 -stage_20_name db 'Music and silence',0 -stage_21_name db 'Experiment',0 -stage_22_name db 'Pacman',0 -stage_23_name db 'Intricate pattern',0 -stage_24_name db 'Square arcs',0 -stage_25_name db 'In the animal world',0 -stage_26_name db 'Digits',0 -stage_27_name db 'Pluses',0 -stage_28_name db 'Rod',0 -stage_29_name db 'Tetris',0 -stage_30_name db 'Towers of Hanoi',0 -stage_31_name db 'Ruins',0 -stage_32_name db 'Walls of Akendora',0 -stage_33_name db 'Geranium in the window',0 -stage_34_name db 'Algae',0 -stage_35_name db 'The road ahead',0 -stage_36_name db 'Help me draw levels!',0 - - -background_color dd 0x000000 -decorations_color dd 0x00000000 -snake_color dd 0x000000 -snake_head_color dd 0x000000 -lives_in_head_number_color dd 0x000000 -snake_picture_color dd 0x000000 -version_picture_color dd 0x000000 -pause_picture_color dd 0x000000 -game_over_picture_color dd 0x000000 -you_win_picture_color dd 0x000000 -eat_color dd 0x000000 -navigation_strings_color dd 0x80000000 -game_over_strings_color dd 0x80000000 -score_string_color dd 0x80000000 -hiscore_string_color dd 0x80000000 -champion_string_color dd 0x80000000 -game_over_hiscore_color dd 0x80000000 -score_number_color dd 0x40000000 -hiscore_number_color dd 0x00000000 -champion_name_color dd 0x80000000 -button_color dd 0x000000 -button_text_color dd 0x80000000 -stone_color dd 0x000000 -splash_background_color dd 0x000000 -splash_level_string_color dd 0x000000 -splash_level_number_color dd 0x000000 -level_string_color dd 0x80000000 -level_number_color dd 0x00000000 - - -align 4 -@IMPORT: - -library \ - libini , 'libini.obj' ,\ - box_lib , 'box_lib.obj' - -import libini,\ - ini.get_str , 'ini_get_str' ,\ - ini.get_int , 'ini_get_int' ,\ - ini.set_str , 'ini_set_str' ,\ - ini.set_int , 'ini_set_int' ,\ - ini.get_color , 'ini_get_color' ,\ - ini.get_shortcut, 'ini_get_shortcut' - -import box_lib,\ - edit_box.draw , 'edit_box' ,\ - edit_box.key , 'edit_box_key' ,\ - edit_box.mouse , 'edit_box_mouse' - -bFirstDraw db 0 - -aPreferences db 'Preferences',0 -aSpeed db 'Speed',0 -aTheme db 'Theme',0 -aSmart_reverse db 'Smart_reverse',0 -aShow_lives_style db 'Show_lives_style',0 -aDraw_level_name_in_window_title db 'Draw_level_name_in_window_title',0 -aSeparating_symbol db 'Separating_symbol',0 - -aShortcuts db 'Shortcuts',0 -aMove_left db 'Move_left',0 -aMove_down db 'Move_down',0 -aMove_up db 'Move_up',0 -aMove_right db 'Move_right',0 -aReverse db 'Reverse',0 -aIncrease db 'Increase',0 -aDecrease db 'Decrease',0 - -aTheme_name db 32 dup (0) -aDecorations db 'Decorations',0 -aBackground_color db 'Background_color',0 -aDecorations_color db 'Decorations_color',0 -aSnake_color db 'Snake_color',0 -aSnake_head_color db 'Snake_head_color',0 -aLives_in_head_number_color db 'Lives_in_head_number_color',0 -aSnake_picture_color db 'Snake_picture_color',0 -aVersion_picture_color db 'Version_picture_color',0 -aPause_picture_color db 'Pause_picture_color',0 -aGame_over_picture_color db 'Game_over_picture_color',0 -aYou_win_picture_color db 'You_win_picture_color',0 -aEat_color db 'Eat_color',0 -aNavigation_strings_color db 'Navigation_string_color',0 -aGame_over_strings_color db 'Game_over_string_color',0 -aScore_string_color db 'Score_string_color',0 -aHiscore_string_color db 'Hiscore_string_color',0 -aChampion_string_color db 'Champion_string_color',0 -aGame_over_hiscore_color db 'Game_over_hiscore_color',0 -aScore_number_color db 'Score_number_color',0 -aHiscore_number_color db 'Hiscore_number_color',0 -aChampion_name_color db 'Champion_name_color',0 -aEdit_box_selection_color db 'Edit_box_selection_color',0 -aButton_color db 'Button_color',0 -aButton_text_color db 'Button_text_color',0 -aStone_color db 'Stone_color',0 -aSplash_background_color db 'Splash_background_color',0 -aSplash_level_string_color db 'Splash_level_string_color',0 -aSplash_level_number_color db 'Splash_level_number_color',0 -aLevel_string_color db 'Level_string_color',0 -aLevel_number_color db 'Level_number_color',0 - -aReserved db 'Reserved',0 -aSquare_side_length db 'Square_side_length',0 -aHiscore_classic db 'Hiscore_classic',0 -aChampion_name_classic db 'Champion_name_classic',0 -aHiscore_levels db 'Hiscore_levels',0 -aChampion_name_levels db 'Champion_name_levels',0 - -edit1 edit_box 65,397,0x0,0x000000,0x000000,0x000000,0x000000,0x80000000,15,hed,mouse_dd,ed_focus,hed_end-hed-1,hed_end-hed-1 - -hed db '',0 -;;---Variables------------------------------------------------------------------------------------------------------------- -i_end: -hed_end: -rb 256 -mouse_dd rd 1 - -window_style rd 1 - -cur_level rd 1 -cur_level_number rd 1 -hi_level rd 1 - -score rd 1 -hi_score_classic rd 1 -hi_score_levels rd 1 - -champion_name_classic rb CHAMPION_NAME_LENGTH -champion_name_levels rb CHAMPION_NAME_LENGTH - -snake_dots rb GRID_WIDTH*GRID_HEIGHT*2+3 ; +3 bytes for faster dword copying -snake_direction rd 1 -snake_direction_next rd 1 -snake_length_x2 rd 1 - -decorations rd 1 -number_of_free_dots rd 1 - -eat rw 1 - -g_s rd 1 -g_e rd 1 - -window_width rd 1 -window_height rd 1 -wp_x rd 1 -wp_y rd 1 - -gw_mul_gs rd 1 -gh_mul_gs rd 1 -gbxm1_plus_gw_mul_gs rd 1 -gbym1_plus_gh_mul_gs rd 1 -gs_shl16_gs rd 1 -gbxm1_shl16_gbxm1 rd 1 -gbym1_shl16_gbym1 rd 1 - -bottom_top_strings rd 1 -bottom_middle_strings rd 1 -bottom_bottom_strings rd 1 -top_strings rd 1 - -button_x_left rd 1 -button_x_right rd 1 -button_y_top rd 1 -button_y_middle rd 1 -button_y_bottom rd 1 -button_width_short rd 1 -button_width_long rd 1 -button_height rd 1 - -cursor_data rb 32*32*4 -cursor_handle rd 1 - -cur_dir_path rb 4096 -@PARAMS rb 4096 - -field_map rb GRID_WIDTH*GRID_HEIGHT*2 - -proc_info process_information - -smart_reverse rd 1 -show_lives_style rd 1 -draw_level_name_in_window_title rd 1 -separating_symbol rd 1 - -shortcut_move_left rb 1 -shortcut_move_down rb 1 -shortcut_move_up rb 1 -shortcut_move_right rb 1 -shortcut_reverse rb 1 -shortcut_increase rb 1 -shortcut_decrease rb 1 - -square_side_length rd 1 - -gbxm1 rd 1 -gbym1 rd 1 -speed_up_counter rw 1 - -rb 4096 -stacktop: -d_end: +; SPDX-License-Identifier: NOASSERTION +; + +;;===HEADER==================================================================================================================== + +use32 + org 0x0 + db 'MENUET01' + dd 0x01,start,i_end,d_end,stacktop,0x0,cur_dir_path + +;;---HEADER-------------------------------------------------------------------------------------------------------------------- + +include '../../proc32.inc' +include '../../macros.inc' +include '../../dll.inc' +include '../../develop/libraries/box_lib/box_lib.mac' +;include '../../system/board/trunk/debug.inc' + +;;===Define_chapter============================================================================================================ + +WINDOW_MODE_WINDOWED equ 0 +WINDOW_MODE_FULLSCREEN equ 1 + +GRID_WIDTH equ 28 +GRID_HEIGHT equ 14 + +MIN_SQUARE_SIDE_LENGTH equ 9 + +SCORE_EAT equ 100 + +LEFT equ 0 +DOWN equ 1 +UP equ 2 +RIGHT equ 3 + +struct LEVEL + field db 4*GRID_HEIGHT dup (?) + snake_dots db 6 dup (?) + snake_direction dd ? + snake_direction_next dd ? + number_of_stones dd ? + name dd ? +ends + +CLASSIC_MODE equ 0 +LEVELS_MODE equ 1 + +CLASSIC_MODE_FIRST_LEVEL equ 0 +LEVELS_MODE_FIRST_LEVEL equ 1 + +EAT_TO_END_LEVEL equ 7 +PAUSE_BETWEEN_LEVELS equ 200 +PAUSE_WHILE_DRAWING_SPLASH equ 3 + +CHAMPION_NAME_LENGTH equ 15 +LAST_LEVEL_NUMBER equ 36 + +START_LIVES equ 3 + +;;---Define_chapter------------------------------------------------------------------------------------------------------------ + +start: + +stdcall dll.Load,@IMPORT + or eax, eax + jnz Exit + +align 4 + + mov edi, cur_dir_path + mov al, 0 + mov ecx, 4096 + repne scasb + mov dword[edi-1], '.ini' + + invoke ini.get_int, cur_dir_path, aPreferences, aSpeed, 80 + neg eax + add [time_wait_limit], eax + mov ebx, [time_wait_limit] + mov [time_wait_limit_const], ebx + sub ebx, 4 + mov eax, 200 + div bl + mov byte[speed_up_counter], al + mov byte[speed_up_counter+1], al + invoke ini.get_str, cur_dir_path, aPreferences, aTheme, aTheme_name, 31, aTheme_name + invoke ini.get_int, cur_dir_path, aPreferences, aSmart_reverse, 0 + mov [smart_reverse], eax + invoke ini.get_int, cur_dir_path, aPreferences, aShow_lives_style, 2 + mov [show_lives_style], eax + invoke ini.get_int, cur_dir_path, aPreferences, aDraw_level_name_in_window_title, 1 + mov [draw_level_name_in_window_title], eax + invoke ini.get_str, cur_dir_path, aPreferences, aSeparating_symbol, separating_symbol, 3, default_separating_symbol + + invoke ini.get_shortcut, cur_dir_path, aShortcuts, aMove_left, 0x23, 0 + mov [shortcut_move_left], al + invoke ini.get_shortcut, cur_dir_path, aShortcuts, aMove_down, 0x24, 0 + mov [shortcut_move_down], al + invoke ini.get_shortcut, cur_dir_path, aShortcuts, aMove_up, 0x25, 0 + mov [shortcut_move_up], al + invoke ini.get_shortcut, cur_dir_path, aShortcuts, aMove_right, 0x26, 0 + mov [shortcut_move_right], al + invoke ini.get_shortcut, cur_dir_path, aShortcuts, aReverse, 0x0F, 0 + mov [shortcut_reverse], al + invoke ini.get_shortcut, cur_dir_path, aShortcuts, aIncrease, 0x16, 0 + mov [shortcut_increase], al + invoke ini.get_shortcut, cur_dir_path, aShortcuts, aDecrease, 0x17, 0 + mov [shortcut_decrease], al + + invoke ini.get_int, cur_dir_path, aTheme_name, aDecorations, 3 + mov [decorations], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aBackground_color, 0x000000 + or [background_color], eax + or [window_style_windowed], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aDecorations_color, 0x232300 + or [decorations_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aSnake_color, 0x1111ff + or [snake_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aSnake_head_color, 0x6B6Bff + or [snake_head_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aLives_in_head_number_color, 0xff8800 + or [lives_in_head_number_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aSnake_picture_color, 0x4488ff + or [snake_picture_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aVersion_picture_color, 0x55ff55 + or [version_picture_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aPause_picture_color, 0x11ff11 + or [pause_picture_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aGame_over_picture_color, 0xff1111 + or [game_over_picture_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aYou_win_picture_color, 0xffff11 + or [you_win_picture_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aEat_color, 0xffff11 + or [eat_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aNavigation_strings_color, 0x80ff7777 + or [navigation_strings_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aGame_over_strings_color, 0x80ff9900 + or [game_over_strings_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aScore_string_color, 0x80ffffff + or [score_string_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aLevel_string_color, 0xffffff + or [level_string_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aHiscore_string_color, 0x80ffffff + or [hiscore_string_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aChampion_string_color, 0x80ffffff + or [champion_string_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aGame_over_hiscore_color, 0x80ffdd44 + or [game_over_hiscore_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aScore_number_color, 0xffffff + or [score_number_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aLevel_number_color, 0xffffff + or [level_number_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aHiscore_number_color, 0x00ffffff + or [hiscore_number_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aChampion_name_color, 0x80ffffff + or [champion_name_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aEdit_box_selection_color, 0x00aa00 + or [edit1.shift_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aButton_color, 0xDDDDDD + or [button_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aButton_text_color, 0x000000 + or [button_text_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aStone_color, 0x5f8700 + or [stone_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aSplash_background_color, 0xAAAA00 + or [splash_background_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aSplash_level_number_color, 0x000000 + or [splash_level_number_color], eax + invoke ini.get_color, cur_dir_path, aTheme_name, aSplash_level_string_color, 0x000000 + or [splash_level_string_color], eax + + invoke ini.get_int, cur_dir_path, aReserved, aSquare_side_length, 19 + mov [square_side_length], eax + invoke ini.get_str, cur_dir_path, aReserved, aChampion_name_classic, champion_name_classic, CHAMPION_NAME_LENGTH, champion_name_classic + invoke ini.get_int, cur_dir_path, aReserved, aHiscore_classic, 777 + or [hi_score_classic], eax + invoke ini.get_str, cur_dir_path, aReserved, aChampion_name_levels, champion_name_levels, CHAMPION_NAME_LENGTH, champion_name_levels + invoke ini.get_int, cur_dir_path, aReserved, aHiscore_levels, 777 + or [hi_score_levels], eax + + mov eax, [background_color] + mov [edit1.color], eax + mov [edit1.focus_border_color], eax + mov [edit1.blur_border_color], eax + mov eax, [game_over_hiscore_color] + mov [edit1.text_color], eax + + mcall 37,4,cursor_data,2 ; load empty cursor (for "hiding" cursor while level_mode) + mov [cursor_handle], eax + + mov eax, WINDOW_MODE_WINDOWED + call Set_window_mode + mcall 0,0,0,[window_style_windowed] ; create empty window. Set_geometry will set all parameters + call Set_geometry.by_hotkey + mcall 71,1,window_title + +include 'first_menu.asm' ; First menu body and functions +include 'level.asm' ; Level body and functions (game process) +include 'pause.asm' ; Pause body and functions +include 'game_over.asm' ; Game_over body and functions + +;;===Some_functions============================================================================================================ + + +Save_do_smth_else_and_exit: + ;;===Save_do_smth_else_and_exit============================================================================================ + + mcall 37,6,[cursor_handle] ; delete cursor + + invoke ini.set_int, cur_dir_path, aReserved, aSquare_side_length, [square_side_length] + + mov edi, champion_name_classic + xor al, al + mov ecx, CHAMPION_NAME_LENGTH+1 + cld + repne scasb + neg ecx + add ecx, CHAMPION_NAME_LENGTH + invoke ini.set_str, cur_dir_path, aReserved, aChampion_name_classic, champion_name_classic, ecx + invoke ini.set_int, cur_dir_path, aReserved, aHiscore_classic, [hi_score_classic] + + mov edi, champion_name_levels + xor al, al + mov ecx, CHAMPION_NAME_LENGTH+1 + cld + repne scasb + neg ecx + add ecx, CHAMPION_NAME_LENGTH + invoke ini.set_str, cur_dir_path, aReserved, aChampion_name_levels, champion_name_levels, ecx + invoke ini.set_int, cur_dir_path, aReserved, aHiscore_levels, [hi_score_levels] + + ;;---Save_do_smth_else_and_exit-------------------------------------------------------------------------------------------- + + +Exit: + ;;===Exit================================================================================================================== + + or eax, -1 + int 0x40 + + ;;---Exit------------------------------------------------------------------------------------------------------------------ + + +Set_geometry: + ;;===Set_geometry========================================================================================================== + + cmp [resized_by_hotkey], 1 + je .by_hotkey + + test [proc_info.wnd_state], 0x01 + jnz .by_hotkey + + mcall 9,proc_info,-1 + test [proc_info.wnd_state], 0x04 ; is rolled up? + jz @f + mov eax, [proc_info.box.width] + mov [window_width], eax + mov eax, [proc_info.box.height] + mov [window_height], eax + jmp .quit + @@: + mov eax, [proc_info.box.width] + cmp eax, [window_width] + jne @f + mov eax, [proc_info.box.height] + cmp eax, [window_height] + jne @f + jmp .quit + @@: + mov eax, [proc_info.box.width] + mov [window_width], eax + mov eax, [proc_info.box.height] + mov [window_height], eax + + .by_mouse: ; or any other kind of resizing. for example, double click on window title + + test [proc_info.wnd_state], 0x01 + jnz .by_hotkey + + + cmp [window_width], 250 + jnl @f + mov [window_width], 250 + @@: + cmp [window_height], 150 + jnl @f + mov [window_height], 150 + @@: + + mcall 48,4 + mov ecx, [window_height] + sub ecx, eax + sub ecx, 5 + sub ecx, [g_e] + sub ecx, [g_e] + sub ecx, 25+30 + mov esi, ecx + + mov eax, [window_width] + sub eax, 5+5 + sub eax, [g_e] + sub eax, [g_e] + sub eax, [g_s] + sub eax, [g_s] + mov edi, eax + + mov dx, 0 + div cx + cmp ax, 2 + jl .fit_to_width + + .fit_to_height: + mov eax, esi + mov ebx, GRID_HEIGHT + div bl + cmp al, MIN_SQUARE_SIDE_LENGTH + jnl @f + mov al, MIN_SQUARE_SIDE_LENGTH + @@: + dec al + mov byte[square_side_length], al + jmp .by_hotkey + + .fit_to_width: + mov eax, edi + mov ebx, GRID_WIDTH + div bl + cmp al, MIN_SQUARE_SIDE_LENGTH + jnl @f + mov al, MIN_SQUARE_SIDE_LENGTH + @@: + dec al + mov byte[square_side_length], al + jmp .by_hotkey + +; jmp .done + + .by_hotkey: + mcall 9,proc_info,-1 + mov [resized_by_hotkey], 0 + test [proc_info.wnd_state], 0x04 ; is rolled up? + jz @f + mov eax, [proc_info.box.width] + mov [window_width], eax + mov eax, [proc_info.box.height] + mov [window_height], eax + jmp .quit + @@: + mov eax, [square_side_length] + inc eax ; space between squares + mov [g_s], eax + + mov eax, [g_s] + shr eax, 1 + mov ebx, eax + shr ebx, 1 + add eax, ebx + mov [g_e], eax + + mov edx, GRID_WIDTH + mov eax, [g_s] + mul dx + mov [gw_mul_gs], eax + + mov edx, GRID_HEIGHT + mov eax, [g_s] + mul dx + mov [gh_mul_gs], eax + + mov eax, [gw_mul_gs] + add eax, [g_s] + add eax, [g_s] + add eax, [g_e] + add eax, [g_e] + add eax, 5*2 ; skin width + mov esi, eax + test [proc_info.wnd_state], 0x01 + jz @f + mov eax, [proc_info.box.width] + @@: + mov [window_width], eax + + sub eax, [gw_mul_gs] + sub eax, 5*2 + shr eax, 1 + mov [gbxm1], eax + + mcall 48,4 ; get skin header height + mov ebx, eax + add eax, [gh_mul_gs] + add eax, [g_e] + add eax, 25 + add eax, [g_e] + add eax, 30 + add eax, 5 ; skin height (bottom part) + mov edi, eax + test [proc_info.wnd_state], 0x01 + jz @f + mov eax, [proc_info.box.height] + @@: + mov [window_height], eax + + sub eax, [gh_mul_gs] + sub eax, ebx + sub eax, 5 + sub eax, 5 + + shr eax, 1 + mov [gbym1], eax + + mov eax, [g_s] + shl eax, 16 + add eax, [g_s] + mov [gs_shl16_gs], eax + + mov eax, [gbxm1] + shl eax, 16 + add eax, [gbxm1] + mov [gbxm1_shl16_gbxm1], eax + + mov eax, [gbym1] + shl eax, 16 + add eax, [gbym1] + mov [gbym1_shl16_gbym1], eax + + mov eax, [gbxm1] + add eax, [gw_mul_gs] + mov [gbxm1_plus_gw_mul_gs], eax + + mov eax, [gbym1] + add eax, [gh_mul_gs] + mov [gbym1_plus_gh_mul_gs], eax + + mcall 48, 5 + mov dx, ax + shr eax, 16 + sub dx, ax + cmp dx, si ; does window fit to work area width? + jnl @f + dec [square_side_length] + jmp Set_geometry.by_hotkey + @@: + + mov cx, bx + shr ebx, 16 + sub cx, bx + cmp cx, di ; does window fit to work area height? + jnl @f + dec [square_side_length] + jmp Set_geometry.by_hotkey + @@: + + sub dx, si + shr dx, 1 + mov word[wp_x], dx + sub cx, word[window_height] + shr cx, 1 + mov dx, cx + shr cx, 1 + add cx, dx + mov word[wp_y], cx + + mov [top_strings], 8 + mov eax, [window_height] + sub eax, 50 + mov [bottom_top_strings], eax + add eax, 6 + mov [bottom_middle_strings], eax + add eax, 6 + mov [bottom_bottom_strings], eax + + sub eax, 4 + mov [edit1.top], eax + + + mov eax, [g_s] + shl eax, 2 + sub eax, 2 + mov [button_width_short], eax + mov eax, [g_s] + shl eax, 3 + add eax, [g_s] + sub eax, 2 + mov [button_width_long], eax + mov eax, [g_s] + sub eax, 2 + mov [button_height], eax + + mov bl, 0x10 + mov cl, 0x08 + + mov al, byte[g_s] + mul bl + mov bx, ax + add bx, word[gbxm1] + inc bx + + mov al, byte[g_s] + mul cl + mov cx, ax + add cx, word[gbym1] + inc cx + + mov [button_x_left], ebx + mov [button_y_top], ecx + + add ebx, [g_s] + add ebx, [g_s] + add ebx, [g_s] + add ebx, [g_s] + add ebx, [g_s] + + mov [button_x_right], ebx + + add ecx, [g_s] + add ecx, [g_s] + + mov [button_y_middle], ecx + + add ecx, [g_s] + add ecx, [g_s] + + mov [button_y_bottom], ecx + + .done: + mcall 67,[wp_x],[wp_y],[window_width],[window_height] + + .quit: + ret + + ;;---Set_geometry------------------------------------------------------------------------------------------------------ + + +Increase_geometry: + ;;===Increase_geometry================================================================================================= + + inc [square_side_length] + mov [resized_by_hotkey], 1 + + ret + + ;;---Increase_geometry------------------------------------------------------------------------------------------------- + + +Decrease_geometry: + ;;===Decrease_geometry================================================================================================= + + cmp [square_side_length], MIN_SQUARE_SIDE_LENGTH + je @f + dec [square_side_length] + mov [resized_by_hotkey], 1 + + @@: + ret + + ;;---Decrease_geometry------------------------------------------------------------------------------------------------- + + +Draw_decorations: + ;;===Draw_decorations================================================================================================== + + mov al, byte[decorations] + dec al + jz grid_lines + dec al + jz grid_lines_with_ends + dec al + jz grid_lines_with_corners + dec al + jz grid_dots + dec al + jz borders_lines + dec al + jz borders_lines_with_corners + dec al + jz borders_dots + dec al + jz corners_dots + dec al + jz corners_inner + dec al + jz corners_outer + dec al + jz corners_crosses + ret + + + grid_lines: + + mov eax, 38 +;mov ebx, (GRID_BEGIN_X-1)*65536+(GRID_BEGIN_X-1) + mov ebx, [gbxm1_shl16_gbxm1] +;mov ecx, (GRID_BEGIN_Y-1)*65536+(GRID_BEGIN_Y-1+GRID_HEIGHT*GRID_STEP) + mov ecx, [gbym1_shl16_gbym1] + add ecx, [gh_mul_gs] + mov edx, [decorations_color] + mov esi, GRID_WIDTH + add esi, 1 + + @@: + mcall + add ebx, [gs_shl16_gs] + dec esi + jnz @b + +;mov ebx, (GRID_BEGIN_X-1)*65536+(GRID_BEGIN_X-1+GRID_WIDTH*GRID_STEP) + mov ebx, [gbxm1_shl16_gbxm1] + add ebx, [gw_mul_gs] + mov ecx, [gbym1_shl16_gbym1] + mov esi, GRID_HEIGHT + add esi, 1 + + @@: + mcall + add ecx, [gs_shl16_gs] + dec esi + jnz @b + + ret + + + grid_lines_with_ends: + + mov eax, 38 + mov ebx, [gbxm1_shl16_gbxm1] + mov ecx, [gbym1] + sub ecx, [g_e] + shl ecx, 16 + add ecx, [gbym1_plus_gh_mul_gs] + add ecx, [g_e] + mov edx, [decorations_color] + mov esi, GRID_WIDTH + add esi, 1 + + @@: + mcall + add ebx, [gs_shl16_gs] + dec esi + jnz @b + + mov ebx, [gbxm1] + sub ebx, [g_e] + shl ebx, 16 + add ebx, [gbxm1_plus_gw_mul_gs] + add ebx, [g_e] + mov ecx, [gbym1_shl16_gbym1] + mov esi, GRID_HEIGHT + add esi, 1 + + @@: + mcall + add ecx, [gs_shl16_gs] + dec esi + jnz @b + + ret + + + grid_lines_with_corners: + + call grid_lines + call corners_outer + + ret + + + grid_dots: + + mov eax, 1 + mov ebx, [gbxm1] + mov ecx, [gbym1] + mov edx, [decorations_color] + + @@: + mcall + add ebx, [g_s] + cmp ebx, [gbxm1_plus_gw_mul_gs] + jng @b + add ecx, [g_s] + cmp ecx, [gbym1_plus_gh_mul_gs] + jg @f + mov ebx, [gbxm1] + jmp @b + + @@: + ret + + + borders_lines: + + mov eax, 38 + mov ebx, [gbxm1_shl16_gbxm1] + mov ecx, [gbym1_shl16_gbym1] + add ecx, [gh_mul_gs] + mov edx, [decorations_color] + mcall + + mov ebx, [gbxm1_plus_gw_mul_gs] + shl ebx, 16 + add ebx, [gbxm1_plus_gw_mul_gs] + mcall + + mov ebx, [gbxm1_shl16_gbxm1] + add ebx, [gw_mul_gs] + mov ecx, [gbym1_shl16_gbym1] + mcall + + mov ecx, [gbym1_plus_gh_mul_gs] + shl ecx, 16 + add ecx, [gbym1_plus_gh_mul_gs] + mcall + + ret + + + borders_lines_with_corners: + + call borders_lines + call corners_outer + + ret + + + borders_dots: + + mov eax, 1 + mov ebx, [gbxm1] + mov ecx, [gbym1] + mov edx, [decorations_color] + @@: + mcall + add ebx, [g_s] + cmp ebx, [gbxm1_plus_gw_mul_gs] + jng @b + + mov ebx, [gbxm1] + mov ecx, [gbym1_plus_gh_mul_gs] + @@: + mcall + add ebx, [g_s] + cmp ebx, [gbxm1_plus_gw_mul_gs] + jng @b + + mov ebx, [gbxm1] + mov ecx, [gbym1] + @@: + mcall + add ecx, [g_s] + cmp ecx, [gbym1_plus_gh_mul_gs] + jng @b + + mov ebx, [gbxm1_plus_gw_mul_gs] + mov ecx, [gbym1] + @@: + mcall + add ecx, [g_s] + cmp ecx, [gbym1_plus_gh_mul_gs] + jng @b + + ret + + + corners_dots: + + mov eax, 13 + mov ebx, [gbxm1] + dec ebx + shl ebx, 16 + add ebx, 2 + mov ecx, [gbym1] + dec ecx + shl ecx, 16 + add ecx, 2 + mov edx, [decorations_color] + mcall + + mov ebx, [gbxm1_plus_gw_mul_gs] + shl ebx, 16 + add ebx, 2 + mcall + + mov ebx, [gbxm1] + dec ebx + shl ebx, 16 + add ebx, 2 + mov ecx, [gbym1_plus_gh_mul_gs] + shl ecx, 16 + add ecx, 2 + mcall + + mov ebx, [gbxm1_plus_gw_mul_gs] + shl ebx, 16 + add ebx, 2 + mcall + + ret + + + corners_inner: + + mov eax, 38 + mov ebx, [gbxm1_shl16_gbxm1] + add ebx, [g_e] + mov ecx, [gbym1_shl16_gbym1] + mov edx, [decorations_color] + mcall + + mov ecx, [gbym1_plus_gh_mul_gs] + shl ecx, 16 + add ecx, [gbym1_plus_gh_mul_gs] + mcall + + mov ebx, [gbxm1_plus_gw_mul_gs] + sub ebx, [g_e] + shl ebx, 16 + add ebx, [gbxm1_plus_gw_mul_gs] + mcall + + mov ecx, [gbym1_shl16_gbym1] + mcall + + mov ebx, [gbxm1_shl16_gbxm1] + mov ecx, [gbym1_shl16_gbym1] + add ecx, [g_e] + mcall + + mov ebx, [gbxm1_plus_gw_mul_gs] + shl ebx, 16 + add ebx, [gbxm1_plus_gw_mul_gs] + mcall + + mov ecx, [gbym1_plus_gh_mul_gs] + sub ecx, [g_e] + shl ecx, 16 + add ecx, [gbym1_plus_gh_mul_gs] + mcall + + mov ebx, [gbxm1_shl16_gbxm1] + mcall + + ret + + + corners_outer: + + mov eax, 38 + mov ebx, [gbxm1_shl16_gbxm1] + sub ebx, [g_e] + mov ecx, [gbym1_shl16_gbym1] + mov edx, [decorations_color] + mcall + + mov ecx, [gbym1_plus_gh_mul_gs] + shl ecx, 16 + add ecx, [gbym1_plus_gh_mul_gs] + mcall + + mov ebx, [gbxm1_plus_gw_mul_gs] + shl ebx, 16 + add ebx, [gbxm1_plus_gw_mul_gs] + add ebx, [g_e] + mcall + + mov ecx, [gbym1_shl16_gbym1] + mcall + + mov ebx, [gbxm1_shl16_gbxm1] + mov ecx, [gbym1_shl16_gbym1] + sub ecx, [g_e] + mcall + + mov ebx, [gbxm1_plus_gw_mul_gs] + shl ebx, 16 + add ebx, [gbxm1_plus_gw_mul_gs] + mcall + + mov ecx, [gbym1_plus_gh_mul_gs] + shl ecx, 16 + add ecx, [gbym1_plus_gh_mul_gs] + add ecx, [g_e] + mcall + + mov ebx, [gbxm1_shl16_gbxm1] + mcall + + ret + + + corners_crosses: + + call corners_inner + call corners_outer + + ret + + + ;;---Draw_decorations-------------------------------------------------------------------------------------------------- + + +Draw_square: + ;;===Draw_square======================================================================================================= + ;; bl - x_coord + ;; bh - y_coord + ;; edx - color + + push eax ebx ecx edx + + mov cl, bh + + mov al, byte[g_s] + mul bl + mov bx, ax + add bx, word[gbxm1] + inc bx + shl ebx, 16 + add ebx, [g_s] + dec ebx + + mov al, byte[g_s] + mul cl + mov cx, ax + add cx, word[gbym1] + inc cx + shl ecx, 16 + add ecx, [g_s] + dec ecx + + mcall 13 + + pop edx ecx ebx eax + + ret + + ;;---Draw_square------------------------------------------------------------------------------------------------------- + + +Draw_menu_esc: + ;;===Draw_menu_esc===================================================================================================== + + mov ebx, [window_width] + shr ebx, 1 + sub ebx, string_menu_esc.size*3+6 + shl ebx, 16 + add ebx, dword[top_strings] + mcall 4, ,[navigation_strings_color],string_menu_esc + + ret + + ;;---Draw_menu_esc----------------------------------------------------------------------------------------------------- + + +Draw_score_string: + ;;===Draw_score_string================================================================================================= + + mov ebx, [window_width] + shr ebx, 3 + sub ebx, 5 + shl ebx, 16 + add ebx, dword[bottom_top_strings] + mcall 4, ,[score_string_color],string_score + + ret + + ;;---Draw_score_string------------------------------------------------------------------------------------------------- + + +Draw_score_number: + ;;===Draw_score_number================================================================================================= + + mov edx, [window_width] + shr edx, 3 + sub edx, 5+1 + add edx, string_score.size*6 + shl edx, 16 + add edx, dword[bottom_top_strings] + mcall 47,0x00070000,[score], ,[score_number_color],[background_color] + + ret + + ;;---Draw_score_number------------------------------------------------------------------------------------------------- + + +Draw_hiscore_string: + ;;===Draw_hiscore_string=============================================================================================== + + mov ebx, [window_width] + shr ebx, 3 + neg ebx + add ebx, [window_width] + sub ebx, string_hi_score.size*6+7*6+5 + shl ebx, 16 + add ebx, dword[bottom_top_strings] + mcall 4, ,[hiscore_string_color],string_hi_score + + ret + + ;;---Draw_hiscore_string----------------------------------------------------------------------------------------------- + + +Draw_hiscore_number: + ;;===Draw_hiscore_number=================================================================================================== + + mov edx, [window_width] + shr edx, 3 + neg edx + add edx, [window_width] + sub edx, 7*6+6 + shl edx, 16 + add edx, dword[bottom_top_strings] + + cmp [play_mode], CLASSIC_MODE + jne @f + mov ecx, [hi_score_classic] + jmp .done + @@: + mov ecx, [hi_score_levels] + + .done: + mcall 47,0x00070000, , ,[hiscore_number_color] + + ret + + ;;---Draw_hiscore_number--------------------------------------------------------------------------------------------------- + + +Draw_champion_string: + ;;===Draw_champion_string================================================================================================== + + mov ebx, [window_width] + shr ebx, 3 + neg ebx + add ebx, [window_width] + sub ebx, string_champion.size*6+7*6+5 + shl ebx, 16 + add ebx, dword[bottom_bottom_strings] + mcall 4, ,[champion_string_color],string_champion + + ret + + ;;---Draw_champion_string---------------------------------------------------------------------------------------------- + + +Draw_champion_name: + ;;===Draw_champion_name================================================================================================ + + mov ebx, [window_width] + shr ebx, 3 + neg ebx + add ebx, [window_width] + sub ebx, CHAMPION_NAME_LENGTH/2*6+7*6+6 ; there is no difference between length of champion names for other play_modes + add ebx, CHAMPION_NAME_LENGTH/2*6 + shl ebx, 16 + add ebx, dword[bottom_bottom_strings] + + cmp [play_mode], CLASSIC_MODE + jne @f + mov edx, champion_name_classic + jmp .done + @@: + mov edx, champion_name_levels + + .done: + mcall 4, ,[champion_name_color], + + ret + + ;;---Draw_champion_name------------------------------------------------------------------------------------------------ + + +Draw_picture: + ;;===Draw_picture====================================================================================================== + ;; in : + ;; ax = number of left square *0x100+ picture width (in squares) + ;; cx = number of top square *0x100+ picture height (in squares) + ;; edx = picture color + ;; esi = pointer to picture data + ;; + + add al, ah + add cl, ch + mov bh, ch + + .draw: + mov bl, ah + mov di, 7 + + .loop: + bt word[esi], di + jnc @f + push eax ebx ecx esi edi + call Draw_square + pop edi esi ecx ebx eax + + @@: + dec di + jns @f + mov di, 7 + inc esi + @@: + inc bl + cmp bl, al + jne .loop + + inc bh + cmp di, 7 + jz @f + inc esi + @@: + cmp bh, cl + jne .draw + + ret + + ;;---Draw_picture------------------------------------------------------------------------------------------------------ + + +Draw_on_map: + ;;===Draw_on_map======================================================================================================= + ;; in : + ;; al = x coord + ;; ah = y coord + ;; cl = value to draw + ;; + + and eax, 0x0000ffff + xor bx, bx + mov bl, al + shr ax, 8 + mov dx, GRID_WIDTH + mul dx + add ax, bx + mov edi, field_map + add edi, eax + mov [edi], cl + + ret + + ;;---Draw_on_map------------------------------------------------------------------------------------------------------- + + +Get_from_map: + ;;===Get_from_map====================================================================================================== + ;; in : + ;; al = x coord + ;; ah = y coord + ;; out : + ;; bl = value on map + ;; + + push eax + + and eax, 0x0000ffff + xor bx, bx + mov bl, al + shr ax, 8 + mov dx, GRID_WIDTH + mul dx + add ax, bx + mov edi, field_map + add edi, eax + mov bl, [edi] + + pop eax + + ret + + ;;---Get_from_map----------------------------------------------------------------------------------------------------------- + + +Load_level: + ;;===Load_level============================================================================================================= + ;; in : + ;; cur_level_number = level number to load + ;; + + mov eax, [cur_level_number] + mov edx, stage_00 + @@: + test al, al + jz @f + add edx, stage_01-stage_00 + dec al + jmp @b + @@: + + mov esi, window_title_with_lives + mov edi, window_title+5 + + .lives_in_title: + cmp [play_mode], LEVELS_MODE + jne .level_name_in_title + test [show_lives_style], 1 + jz .level_name_in_title + mov [edi], byte ' ' + mov al, byte[separating_symbol] + mov [edi+1], byte al + mov [edi+2], byte ' ' + add edi, 3 + mov eax, [lives] + add al, 0x30 + mov [window_title_with_lives], al + mov ecx, 10 + rep movsb + dec edi + + .level_name_in_title: + cmp [draw_level_name_in_window_title], 1 + jne @f + mov [edi], byte ' ' + mov al, byte[separating_symbol] + mov [edi+1], byte al + mov [edi+2], byte ' ' + add edi, 3 + mov esi, edx + add esi, LEVEL.name + mov esi, [esi] + mov ecx, 16 + rep movsd + + @@: + mcall 71,1,window_title + + mov [cur_level], edx + + mov esi, edx + add esi, LEVEL.field + mov edi, field_map + mov ecx, 2 + mov ah, GRID_HEIGHT + .begin: + mov ebx, 7 + mov al, GRID_WIDTH + .loop: + bt [esi], ebx + jnc @f + mov byte[edi], cl + jmp .skip + @@: + mov byte[edi], 0 + .skip: + dec ebx + jns @f + mov ebx, 7 + inc esi + @@: + inc edi + dec al + jnz .loop + inc esi + dec ah + jnz .begin + + + mov esi, edx + add esi, LEVEL.snake_dots + mov edi, snake_dots + mov ecx, 3 + rep movsw + + mov esi, edx + add esi, LEVEL.snake_direction + mov eax, [esi] + mov [snake_direction], eax + + mov esi, edx + add esi, LEVEL.snake_direction_next + mov eax, [esi] + mov [snake_direction_next], eax + + mov esi, edx + add esi, LEVEL.number_of_stones + mov eax, [esi] + mov [number_of_free_dots], GRID_WIDTH*GRID_HEIGHT-3 + sub [number_of_free_dots], eax + + mov ax, word[snake_dots] + mov cl, 1 + call Draw_on_map + mov ax, word[snake_dots+2] + mov cl, 1 + call Draw_on_map + mov ax, word[snake_dots+4] + mov cl, 1 + call Draw_on_map + + mov [action], 0 + mov [snake_length_x2], 6 + + ret + + ;;---Load_level------------------------------------------------------------------------------------------------------------- + + +Draw_stones: + ;;===Draw_stones============================================================================================================ + + mov ax, 0*0x100+GRID_WIDTH + mov cx, 0*0x100+GRID_HEIGHT + mov edx, [stone_color] + mov esi, [cur_level] + add esi, LEVEL.field + call Draw_picture + + ret + + ;;---Draw_stones------------------------------------------------------------------------------------------------------------ + + +Hide_cursor: + ;;===Hide_cursor=========================================================================================================== + + mcall 37,5,[cursor_handle] + + ret + + ;;---Show_cursor----------------------------------------------------------------------------------------------------------- + + +Show_cursor: + ;;===Hide_cursor=========================================================================================================== + + mcall 37,5,0 + + ret + + ;;---Show_cursor----------------------------------------------------------------------------------------------------------- + + +Set_window_mode: + ;;===Set_window_mode======================================================================================================= + + test al, al + jnz .fullscreen + mov eax, [window_style_windowed] + jmp .quit + + .fullscreen: + mov eax, [window_style_fullscreen] + + .quit: + mov [window_style], eax + ret + +;;---Some_functions------------------------------------------------------------------------------------------------------------ + + +Reverse_snake: + ;;===Reverse_snake========================================================================================================= + + cmp [snake_direction], LEFT + jne @f + mov [snake_direction_next], RIGHT + jmp .quit + @@: + cmp [snake_direction], RIGHT + jne @f + mov [snake_direction_next], LEFT + jmp .quit + @@: + cmp [snake_direction], UP + jne @f + mov [snake_direction_next], DOWN + jmp .quit + @@: + cmp [snake_direction], DOWN + jne @f + mov [snake_direction_next], UP +; jmp .quit + @@: + + .quit: + ret + + ;;---Reverse_snake--------------------------------------------------------------------------------------------------------- + + +;;===Variables================================================================================================================== + +window_title db 'Snake',64+15 dup (0) +window_title_with_lives db '_ live(s)',0 +default_separating_symbol db '|',0 +window_style_windowed dd 0x33000000 ; scalable skinned window +window_style_fullscreen dd 0x00000000 +time_before_waiting dd 0x0 +time_to_wait dd 0x0 +time_wait_limit dd 101 +time_wait_limit_const dd 0x0 + +play_mode dd 0x0 +lives dd START_LIVES +acceleration_mask dd 0x0 + +resized_by_hotkey dd 0x0 +fullscreen dd 0x0 + +szZ string_score ,'SCORE : ' +szZ string_hi_score ,'HI-SCORE : ' +szZ string_champion ,'CHAMPION : ' +szZ string_level ,'LEVEL : ' +szZ string_pause_space ,'PAUSE - ',0x27,'SPACE',0x27 +szZ string_resume_space ,'RESUME - ',0x27,'SPACE',0x27 +szZ string_menu_esc ,'MENU - ',0x27,'ESC',0x27 +szZ string_apply_name_enter ,'APPLY NAME - ',0x27,'ENTER',0x27 +szZ press_to_start ,'PRESS ',0x27,'ENTER',0x27,' TO START' +szZ press_esc_to_exit ,'PRESS ',0x27,'ESC',0x27,' TO EXIT' +;press_F2_to_options db 'PRESS ',0x27,'F2',0x27,' TO OPTIONS',0 + +szZ string_congratulations ,' Congratulations!!! New hi-score is : ' +szZ string_enter_your_name ,'You are the champion! Enter your name : ' + +szZ string_button_play ,'PLAY' +szZ string_button_exit ,'EXIT' +szZ string_button_inc ,'+INC+' +szZ string_button_dec ,'-dec-' +szZ string_button_pm_classic,'CLASSIC mode' +szZ string_button_pm_levels ,'LEVELS mode' + +is_new_record dd 0 + +action dd 0 + +picture_first_menu_snake db 0xf4,0x99,0x2f,\ + 0x86,0xa5,0x49,\ + 0xf5,0xa5,0x8f,\ + 0x15,0xbd,0x48,\ + 0xf4,0xa5,0x2f + +picture_first_menu_version db 0xf1,0xe0,\ + 0x90,0x20,\ + 0x90,0x20,\ + 0x90,0x20,\ + 0xf4,0x20 + +picture_pause db 11100011b,00100101b,11101111b,\ + 10010100b,10100101b,00001000b,\ + 10010100b,10100101b,00001000b,\ + 11100111b,10100101b,11101111b,\ + 10000100b,10100100b,00101000b,\ + 10000100b,10011001b,11101111b + +picture_game_over db 00110000b,00000000b,00000000b,00000000b,\ + 01001001b,11001000b,10111100b,00000000b,\ + 10000010b,00101101b,10100000b,00000000b,\ + 10011010b,00101010b,10111000b,00000000b,\ + 10001011b,11101000b,10100000b,00000000b,\ + 01110010b,00101000b,10111100b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000111b,00000000b,00000000b,00000000b,\ + 00001000b,10100010b,11110111b,10000000b,\ + 00001000b,10100010b,10000100b,01000000b,\ + 00001000b,10100010b,11100100b,01000000b,\ + 00001000b,10010100b,10000111b,10000000b,\ + 00000111b,00001000b,11110100b,01000000b + +;picture_you_win db 10001001b,11001000b,10000000b,\ +; 10001010b,00101000b,10000000b,\ +; 01010010b,00101000b,10000000b,\ +; 00100010b,00101000b,10000000b,\ +; 00100001b,11000111b,00000000b,\ +; 00000000b,00000000b,00000000b,\ +; 00000000b,00000000b,00000000b,\ +; 01000100b,10010001b,00000000b,\ +; 01010100b,10011001b,00000000b,\ +; 01010100b,10010101b,00000000b,\ +; 01010100b,10010011b,00000000b,\ +; 00101000b,10010001b,00000000b + +picture_you_win db 01000100b,01000011b,10001000b,10000000b,\ + 01000100b,01000100b,01001000b,10000000b,\ + 01000100b,01000100b,00001000b,10000000b,\ + 01111100b,01000100b,11001111b,10000000b,\ + 01000100b,01000100b,01001000b,10000000b,\ + 01000100b,01000011b,10001000b,10000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 11110011b,10011100b,11110011b,11000000b,\ + 10000100b,00100010b,10001010b,00000000b,\ + 11110100b,00100010b,10001011b,10000000b,\ + 00010100b,00100010b,11110010b,00000000b,\ + 11110011b,10011100b,10001011b,11000000b + +picture_level db 10000111b,10100101b,11101000b,\ + 10000100b,00100101b,00001000b,\ + 10000111b,00100101b,11001000b,\ + 10000100b,00101001b,00001000b,\ + 11110111b,10110001b,11101111b + +digits_font db 0xf0,0x90,0x90,0x90,0xf0,\ + 0x20,0x60,0x20,0x20,0x20,\ + 0xf0,0x10,0xf0,0x80,0xf0,\ + 0xf0,0x10,0x70,0x10,0xf0,\ + 0x90,0x90,0xf0,0x10,0x10,\ + 0xf0,0x80,0xf0,0x10,0xf0,\ + 0xf0,0x80,0xf0,0x90,0xf0,\ + 0xf0,0x10,0x10,0x10,0x10,\ + 0xf0,0x90,0xf0,0x90,0xf0,\ + 0xf0,0x90,0xf0,0x10,0xf0 + +stage_00: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 3,3, 4,3, 5,3 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 0 +.name dd stage_00_name + +stage_01: +.field db 11111000b,00000000b,00000001b,11110000b,\ + 10000000b,00000000b,00000000b,00010000b,\ + 10000000b,00000000b,00000000b,00010000b,\ + 10000000b,00000000b,00000000b,00010000b,\ + 10000000b,00000000b,00000000b,00010000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 10000000b,00000000b,00000000b,00010000b,\ + 10000000b,00000000b,00000000b,00010000b,\ + 10000000b,00000000b,00000000b,00010000b,\ + 10000000b,00000000b,00000000b,00010000b,\ + 11111000b,00000000b,00000001b,11110000b + +.snake_dots db 3,3, 4,3, 5,3 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 36 +.name dd stage_01_name + +stage_02: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00011111b,11000000b,00111111b,10000000b,\ + 00010000b,00000000b,00000000b,10000000b,\ + 00010000b,00000000b,00000000b,10000000b,\ + 00010000b,00000000b,00000000b,10000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00010000b,00000000b,00000000b,10000000b,\ + 00010000b,00000000b,00000000b,10000000b,\ + 00010000b,00000000b,00000000b,10000000b,\ + 00011111b,11000000b,00111111b,10000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 7,5, 8,5, 9,5 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 40 +.name dd stage_02_name + +stage_03: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00001001b,00000000b,00000000b,\ + 00000000b,00001001b,00000000b,00000000b,\ + 00000000b,00001001b,00000000b,00000000b,\ + 00001111b,11111001b,11111111b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00001111b,11111001b,11111111b,00000000b,\ + 00000000b,00001001b,00000000b,00000000b,\ + 00000000b,00001001b,00000000b,00000000b,\ + 00000000b,00001001b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 23,0, 22,0, 21,0 +.snake_direction dd LEFT +.snake_direction_next dd LEFT +.number_of_stones dd 48 +.name dd stage_03_name + +stage_04: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00100000b,01000000b,00000000b,\ + 00000010b,00100000b,01000100b,00000000b,\ + 00000010b,00000000b,00000100b,00000000b,\ + 00010000b,00100000b,01000000b,10000000b,\ + 00000010b,00100000b,01000100b,00000000b,\ + 00010010b,00000000b,00000100b,10000000b,\ + 00010010b,00000000b,00000100b,10000000b,\ + 00000010b,00100000b,01000000b,00000000b,\ + 00010000b,00100000b,01000000b,10000000b,\ + 00000010b,00000000b,00000100b,00000000b,\ + 00000010b,00100000b,01000100b,00000000b,\ + 00000000b,00100000b,01000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 19,6, 19,7, 19,8 +.snake_napravlenie dd DOWN +.snake_napravlenie_next dd DOWN +.number_of_stones dd 39 +.name dd stage_04_name + +stage_05: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000001b,11111111b,11111000b,00000000b,\ + 00000001b,11111111b,11111000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000111b,11111111b,11111110b,00000000b,\ + 00000111b,11111111b,11111110b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00111111b,11111111b,11111111b,11000000b,\ + 00111111b,11111111b,11111111b,11000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 0,0, 0,1, 1,1 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 112 +.name dd stage_05_name + +stage_06: +.field db 00000001b,10000000b,00000000b,00000000b,\ + 00000001b,11111111b,11111000b,00000000b,\ + 00000001b,11111111b,11111000b,00000000b,\ + 00000000b,00000000b,00011000b,00000000b,\ + 00000000b,00000000b,00011000b,00000000b,\ + 00011111b,11111111b,11111000b,00000000b,\ + 00011111b,11111111b,11111000b,00000000b,\ + 00011000b,00000000b,00000000b,00000000b,\ + 00011000b,00000000b,00000000b,00000000b,\ + 00011111b,11111111b,11111111b,11100000b,\ + 00011111b,11111111b,11111111b,11100000b,\ + 00000000b,00000000b,00000000b,01100000b,\ + 00000000b,00000000b,00000000b,01100000b,\ + 00000000b,00000000b,00000000b,01100000b + +.snake_dots db 0,0, 0,1, 1,1 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 128 +.name dd stage_06_name + +stage_07: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000011b,11111111b,11111100b,00000000b,\ + 00000000b,00000000b,00000100b,00000000b,\ + 00000011b,11111111b,11110100b,00000000b,\ + 00000010b,00000000b,00010100b,00000000b,\ + 00000010b,11111111b,11010100b,00000000b,\ + 00000010b,00000000b,00010100b,00000000b,\ + 00000010b,11111111b,11110100b,00000000b,\ + 00000010b,00000000b,00000100b,00000000b,\ + 00000011b,11111111b,11111100b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 8,1, 9,1, 10,1 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 83 +.name dd stage_07_name + +stage_08: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00010000b,00000000b,\ + 00001001b,00000001b,00000000b,00000000b,\ + 00000001b,01001001b,00000101b,00000000b,\ + 00000000b,01000000b,00000100b,00000000b,\ + 00001111b,00000000b,11100000b,00000000b,\ + 00000000b,00000000b,00001000b,10000000b,\ + 00000111b,00100000b,10000010b,10000000b,\ + 00010000b,00000000b,00000010b,00000000b,\ + 00010000b,11000000b,01110010b,00000000b,\ + 00010010b,00000000b,00000010b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 0,0, 1,0, 2,0 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 40 +.name dd stage_08_name + +stage_09: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00111101b,00100110b,01001011b,11000000b,\ + 00100001b,10101001b,01010010b,00000000b,\ + 00111101b,01100001b,01100011b,10000000b,\ + 00000101b,01100111b,01010010b,00000000b,\ + 00111101b,00100001b,01001011b,11000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 12,6, 12,7, 12,8 +.snake_direction dd DOWN +.snake_direction_next dd DOWN +.number_of_stones dd 59 +.name dd stage_09_name + +stage_10: +.field db 11101110b,11101110b,11101110b,11100000b,\ + 11101110b,11101110b,11101110b,11100000b,\ + 11101110b,11101110b,11101110b,11100000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 11101110b,11101110b,11101110b,11100000b,\ + 11101110b,11101110b,11101110b,11100000b,\ + 11101110b,11101110b,11101110b,11100000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 11101110b,11101110b,11101110b,11100000b,\ + 11101110b,11101110b,11101110b,11100000b,\ + 11101110b,11101110b,11101110b,11100000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 11101110b,11101110b,11101110b,11100000b,\ + 11101110b,11101110b,11101110b,11100000b + +.snake_dots db 3,2, 3,3, 4,3 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 231 +.name dd stage_10_name + +stage_11: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000111b,00000111b,00000111b,00000000b,\ + 00001101b,10001101b,10001101b,10000000b,\ + 00011000b,11011000b,11011000b,11000000b,\ + 00000000b,01000000b,01000000b,01000000b,\ + 00011000b,11011000b,11011000b,11000000b,\ + 00001101b,10001101b,10001101b,10000000b,\ + 00000111b,00000111b,00000111b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 3,12, 4,12, 5,12 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 69 +.name dd stage_11_name + +stage_12: +.field db 00000000b,00011000b,00001110b,00000000b,\ + 01101110b,00010000b,00001010b,01010000b,\ + 01001011b,11011001b,11000000b,01110000b,\ + 01100001b,01000001b,01000000b,00000000b,\ + 00000000b,00000000b,00000011b,10000000b,\ + 00000000b,00000000b,00000010b,10000000b,\ + 01010011b,00001100b,10100110b,00110000b,\ + 01110010b,00001000b,11100100b,00010000b,\ + 00000011b,00001100b,00000110b,00110000b,\ + 00000000b,11100000b,00000000b,00000000b,\ + 00010100b,10100000b,00000110b,00000000b,\ + 11011100b,00000110b,10100100b,00000000b,\ + 01000011b,10000010b,11100110b,10100000b,\ + 11000010b,10000110b,00000000b,11100000b + +.snake_dots db 27,0, 26,0, 25,0 +.snake_direction dd LEFT +.snake_direction_next dd LEFT +.number_of_stones dd 110 +.name dd stage_12_name + +stage_13: +.field db 00111000b,00100000b,00000000b,00000000b,\ + 01111100b,11110011b,11000011b,10000000b,\ + 11111100b,01110011b,10000001b,11000000b,\ + 11110000b,00000011b,11000000b,00000000b,\ + 00000000b,00000010b,00000000b,00000000b,\ + 00000000b,00000010b,00000001b,00000000b,\ + 00011110b,00000111b,00000111b,00000000b,\ + 00000111b,10001111b,11111110b,00000000b,\ + 00000011b,11111111b,11111100b,00000000b,\ + 00110001b,11111111b,11111001b,01100000b,\ + 00001110b,11101011b,00100111b,10000000b,\ + 01111000b,10000011b,10000010b,00000000b,\ + 00000011b,11100110b,00011010b,11000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 0,5, 0,6, 0,7 +.snake_direction dd DOWN +.snake_direction_next dd DOWN +.number_of_stones dd 141 +.name dd stage_13_name + +stage_14: +.field db 00000110b,00000000b,00000000b,00000000b,\ + 00001000b,00000000b,00011000b,00000000b,\ + 00010000b,00000000b,00000100b,00000000b,\ + 00100001b,10000000b,11000010b,00000000b,\ + 01000010b,01000001b,00100001b,00000000b,\ + 10000100b,00000010b,00010000b,10000000b,\ + 10001000b,00000100b,00001000b,01000000b,\ + 10010000b,00001000b,00000100b,01000000b,\ + 01001000b,00010000b,00001000b,10000000b,\ + 00100100b,00100000b,00010001b,00000000b,\ + 00010010b,01000001b,00100010b,00000000b,\ + 00001001b,10000000b,11000100b,00000000b,\ + 00000100b,00000000b,00001000b,00000000b,\ + 00000000b,00000000b,00110000b,00000000b + +.snake_dots db 8,0, 9,0, 10,0 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 60 +.name dd stage_14_name + +stage_15: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,01110000b,00110000b,00000000b,\ + 00000000b,10000000b,00001010b,00000000b,\ + 00100001b,00000000b,00110010b,00000000b,\ + 00010001b,00111111b,10011100b,00000000b,\ + 00001001b,00100000b,11000000b,00000000b,\ + 00010000b,00000010b,01000000b,00000000b,\ + 00100000b,00000010b,00100001b,10000000b,\ + 00010000b,00000010b,00110010b,01000000b,\ + 00001000b,01000100b,00011100b,01000000b,\ + 00010000b,00111000b,00010000b,01000000b,\ + 00100000b,00000000b,00010000b,01000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 13,3, 13,2, 14,2 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 60 +.name dd stage_15_name + +stage_16: +.field db 00000000b,10000010b,00000000b,00000000b,\ + 00000000b,01001010b,10000010b,10100000b,\ + 01111111b,11100111b,00000001b,11000000b,\ + 00000000b,01000010b,00000000b,10000000b,\ + 00000100b,10000000b,01000000b,00000001b,\ + 00000100b,00100000b,10000000b,00000010b,\ + 11000100b,00010001b,11111000b,00000111b,\ + 00010101b,00001000b,10000000b,00000010b,\ + 00001110b,00010000b,01000000b,00000001b,\ + 00000100b,00100010b,00000000b,10000000b,\ + 00000000b,00000010b,00000000b,01000000b,\ + 00111111b,11111111b,11111111b,11100000b,\ + 00000000b,00000010b,00000000b,01000000b,\ + 00000000b,00000010b,00000000b,10000000b + +.snake_dots db 11,7, 10,7, 9,7 +.snake_direction dd LEFT +.snake_direction_next dd LEFT +.number_of_stones dd 96 +.name dd stage_16_name + +stage_17: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000111b,10000001b,11100000b,00000000b,\ + 00001000b,01000010b,00010000b,00000000b,\ + 00010001b,00100100b,01001000b,00000000b,\ + 00010001b,00000000b,01001000b,00000000b,\ + 00001000b,01000010b,00010000b,00000000b,\ + 00000111b,10000001b,11100000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,01000000b,00000000b,00000000b,\ + 00000000b,00111110b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 11,7, 11,8, 12,8 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 40 +.name dd stage_17_name + +stage_18: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 01000100b,01000100b,01000100b,01000000b,\ + 00101010b,10101010b,10101010b,10100000b,\ + 00010001b,00010001b,00010001b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 01000100b,01000100b,01000100b,01000000b,\ + 00101010b,10101010b,10101010b,10100000b,\ + 00010001b,00010001b,00010001b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 01000100b,01000100b,01000100b,01000000b,\ + 00101010b,10101010b,10101010b,10100000b,\ + 00010001b,00010001b,00010001b,00000000b + +.snake_dots db 2,5, 3,5, 4,5 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 78 +.name dd stage_18_name + +stage_19: +.field db 01000010b,00100100b,10000101b,00000000b,\ + 00010000b,00010000b,00100000b,10000000b,\ + 00111001b,00000010b,00010000b,00100000b,\ + 01000100b,00001000b,00000010b,00000000b,\ + 01010101b,01000000b,01000000b,01000000b,\ + 01010100b,00010000b,00001000b,11100000b,\ + 00000100b,10001001b,00100001b,00000000b,\ + 01111100b,00100000b,00000001b,01010000b,\ + 00111001b,00000100b,00010001b,01010000b,\ + 00010000b,00000000b,10000001b,00010000b,\ + 11010111b,11100000b,00011101b,11110000b,\ + 00010000b,01000000b,00100000b,11100000b,\ + 00010000b,10000000b,00100000b,01000000b,\ + 00000001b,00000000b,00010000b,01000000b + +.snake_dots db 27,6, 0,6, 1,6 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 95 +.name dd stage_19_name + +stage_20: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,10001000b,00000000b,\ + 00000000b,00011100b,10000100b,00000000b,\ + 00000000b,01100100b,10000010b,00000000b,\ + 00000011b,10000100b,10000100b,00000000b,\ + 00000010b,00000100b,10001000b,00000000b,\ + 00000010b,00000100b,10000100b,00000000b,\ + 00000010b,00000100b,10000010b,00000000b,\ + 00000010b,00111100b,10010010b,00000000b,\ + 00011110b,00111100b,10010100b,00000000b,\ + 00011110b,00111100b,10001000b,00000000b,\ + 00011110b,00000000b,10000000b,00000000b,\ + 00000000b,00000000b,10000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 17,2, 17,3, 17,4 +.snake_direction dd DOWN +.snake_direction_next dd DOWN +.number_of_stones dd 65 +.name dd stage_20_name + +stage_21: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000011b,11111111b,11111110b,00000000b,\ + 00000001b,01000100b,01000100b,00000000b,\ + 00000010b,01000100b,01000100b,00000000b,\ + 00001100b,01000100b,01000100b,00000000b,\ + 01110000b,01000100b,01000100b,00000000b,\ + 01110000b,01000100b,01000100b,00000000b,\ + 01110000b,11101110b,11101110b,00000000b,\ + 00000000b,11101110b,11101110b,00000000b,\ + 00000000b,11101110b,11101110b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 10,1, 11,1, 12,1 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 86 +.name dd stage_21_name + +stage_22: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000011b,10000000b,00000000b,00000000b,\ + 00000111b,11100000b,00000000b,00000000b,\ + 00001111b,11110000b,00000000b,00000000b,\ + 00011111b,11100000b,00000000b,00000000b,\ + 00011111b,11000011b,00001100b,00110000b,\ + 00011111b,10000111b,10011110b,01110000b,\ + 00011111b,11000111b,10011110b,01110000b,\ + 00011111b,11100011b,00001100b,00110000b,\ + 00001111b,11110000b,00000000b,00000000b,\ + 00000111b,11100000b,00000000b,00000000b,\ + 00000011b,10000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 1,7, 1,6, 1,5 +.snake_direction dd UP +.snake_direction_next dd UP +.number_of_stones dd 104 +.name dd stage_22_name + +stage_23: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00100000b,01000101b,00010000b,00100000b,\ + 00011010b,00100101b,00100010b,11000000b,\ + 00000100b,10101000b,10101001b,00000000b,\ + 00000100b,10010010b,01001001b,00000000b,\ + 00001011b,00110000b,01100110b,10000000b,\ + 00000000b,11001010b,10011000b,00000000b,\ + 00000001b,00000111b,00000100b,00000000b,\ + 00001110b,01001010b,10010011b,10000000b,\ + 00000010b,00110000b,01100010b,00000000b,\ + 00000101b,00010010b,01000101b,00000000b,\ + 00001001b,00001000b,10000100b,10000000b,\ + 00000000b,00001000b,10000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 15,0, 14,0, 13,0 +.snake_direction dd LEFT +.snake_direction_next dd LEFT +.number_of_stones dd 85 +.name dd stage_23_name + +stage_24: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00111111b,11111111b,11111111b,10000000b,\ + 00100000b,00000000b,00000000b,10000000b,\ + 00100011b,11111111b,11111000b,10000000b,\ + 00100010b,00000000b,00001000b,10000000b,\ + 00100010b,00111111b,10001000b,10000000b,\ + 00100010b,00100000b,10001000b,10000000b,\ + 00101010b,10101010b,10101010b,10000000b,\ + 00001000b,10001110b,00100010b,00000000b,\ + 00001000b,10000000b,00100010b,00000000b,\ + 00001000b,11111111b,11100010b,00000000b,\ + 00001000b,00000000b,00000010b,00000000b,\ + 00001111b,11111111b,11111110b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 1,0, 0,0, 0,1 +.snake_direction dd DOWN +.snake_direction_next dd DOWN +.number_of_stones dd 120 +.name dd stage_24_name + +stage_25: +.field db 00000100b,11000000b,00000000b,00000000b,\ + 00000011b,10000000b,00110010b,00000000b,\ + 10011010b,10000000b,00011100b,00000000b,\ + 01110000b,00000000b,00010101b,10010000b,\ + 01010000b,00000111b,00000000b,11100000b,\ + 00000100b,00000101b,00000000b,10100000b,\ + 00000100b,00000100b,00000000b,00000000b,\ + 00000011b,11111100b,00011001b,00000000b,\ + 00000010b,10010100b,00001110b,00000000b,\ + 00000010b,10010100b,00001010b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000011b,00100001b,10010011b,00100000b,\ + 00000001b,11000000b,11100001b,11000000b,\ + 00000001b,01000000b,10100001b,01000000b + +.snake_dots db 11,2, 12,2, 13,2 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 88 +.name dd stage_25_name + +stage_26: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00111100b,01001111b,01111010b,01000000b,\ + 00100000b,01000001b,00001010b,01000000b,\ + 00100100b,01001111b,01111011b,11000000b,\ + 00000100b,01001000b,00001000b,01000000b,\ + 00111100b,01001111b,01111000b,01000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00111101b,11101111b,01111011b,11000000b,\ + 00100001b,00000001b,00000000b,00000000b,\ + 00111101b,11100001b,01111011b,11000000b,\ + 00000100b,00000001b,00000000b,01000000b,\ + 00111101b,11100001b,01111011b,11000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 1,5, 0,5, 0,6 +.snake_direction dd DOWN +.snake_direction_next dd DOWN +.number_of_stones dd 115 +.name dd stage_26_name + +stage_27: +.field db 00000000b,10000000b,00000000b,01000000b,\ + 00000000b,10000000b,01000000b,11100000b,\ + 00100011b,11100000b,01000000b,01000000b,\ + 01110000b,10000001b,11110000b,00000000b,\ + 00100000b,10000000b,01000000b,00000000b,\ + 00000000b,00000000b,01000010b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000010b,00000000b,00000000b,00000000b,\ + 00000111b,00000000b,00000000b,10000000b,\ + 00000010b,00001000b,00000001b,11000000b,\ + 00000000b,00000000b,10000000b,10000000b,\ + 00000000b,01000001b,11000000b,00000000b,\ + 01000000b,11100000b,10000000b,00000000b,\ + 00000000b,01000000b,00000000b,00000000b + +.snake_dots db 12,8, 12,7, 12,6 +.snake_direction dd UP +.snake_direction_next dd UP +.number_of_stones dd 51 +.name dd stage_27_name + +stage_28: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000100b,00000000b,00000010b,00000000b,\ + 00010100b,00000000b,00000010b,10000000b,\ + 01010100b,00000000b,00000010b,10100000b,\ + 01010101b,11111111b,11111010b,10100000b,\ + 01010100b,00000000b,00000010b,10100000b,\ + 00010100b,00000000b,00000010b,10000000b,\ + 00000100b,00000000b,00000010b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 13,8, 12,8, 11,8 +.snake_direction dd LEFT +.snake_direction_next dd LEFT +.number_of_stones dd 44 +.name dd stage_28_name + +stage_29: +.field db 00000000b,01110000b,00000000b,00000000b,\ + 00000100b,01000110b,00000001b,10000000b,\ + 01001110b,00001100b,01100000b,11000000b,\ + 01000000b,00000000b,01100000b,00000000b,\ + 01100000b,01111000b,00000001b,10010000b,\ + 00000000b,00000010b,10000101b,10110000b,\ + 00110000b,00110010b,10001100b,00100000b,\ + 00011011b,00110110b,10000100b,00000000b,\ + 00000001b,00000000b,10010000b,10000000b,\ + 00100001b,00000000b,00111000b,10000000b,\ + 00111001b,00110011b,00000011b,10000000b,\ + 01111111b,11111111b,00011011b,11010000b,\ + 11111111b,11111111b,00011111b,11110000b,\ + 11111111b,11111111b,00111111b,11110000b + +.snake_dots db 0,0, 1,0, 2,0 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 151 +.name dd stage_29_name + +stage_30: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000001b,01011100b,00000000b,\ + 00000000b,00000001b,11001000b,00000000b,\ + 00000100b,00000001b,01001000b,00000000b,\ + 00000100b,00000100b,00000000b,00000000b,\ + 00000100b,00000100b,00000100b,00000000b,\ + 00000100b,00000100b,00000100b,00000000b,\ + 00000100b,00000100b,00000100b,00000000b,\ + 01111111b,11000100b,11111111b,11100000b,\ + 00000100b,00000100b,00000100b,00000000b,\ + 00011111b,00111111b,10001110b,00000000b,\ + 00000100b,00000100b,00000100b,00000000b,\ + 00011111b,00011111b,00011111b,00000000b,\ + 11111111b,11111111b,11111111b,11110000b + +.snake_dots db 8,2, 9,2, 10,2 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 109 +.name dd stage_30_name + +stage_31: +.field db 00000101b,00010000b,00000100b,01000000b,\ + 01000100b,01010101b,00010100b,01000000b,\ + 01000101b,01010101b,01000101b,00010000b,\ + 01010000b,00010100b,01000000b,01010000b,\ + 00010101b,01000101b,01010100b,01000000b,\ + 01000001b,00010000b,01010101b,01000000b,\ + 01010101b,00010100b,00000101b,00010000b,\ + 00000101b,01010000b,01000101b,01010000b,\ + 01010000b,01000100b,00000000b,01010000b,\ + 00010101b,00000101b,00010100b,00010000b,\ + 01010001b,00010001b,01000001b,01000000b,\ + 01000100b,00000101b,01010100b,01010000b,\ + 00010001b,01010100b,00010001b,00010000b,\ + 00000100b,01000001b,00010001b,00000000b + +.snake_dots db 18,8, 17,8, 16,8 +.snake_direction dd LEFT +.snake_direction_next dd LEFT +.number_of_stones dd 112 +.name dd stage_31_name + +stage_32: +.field db 11111111b,11111111b,11111111b,11110000b,\ + 10010010b,01001001b,00100100b,10010000b,\ + 10010000b,01000001b,00000100b,00010000b,\ + 10010010b,01001001b,00100100b,10010000b,\ + 10010010b,01001001b,00100100b,10010000b,\ + 10010010b,01001001b,00100100b,10010000b,\ + 10010010b,01001001b,00100100b,10010000b,\ + 10010010b,01001001b,00100100b,10010000b,\ + 10010010b,01001001b,00100100b,10010000b,\ + 10010010b,01001001b,00100100b,10010000b,\ + 10010010b,01001001b,00100100b,10010000b,\ + 10000010b,00001000b,00100000b,10010000b,\ + 10010010b,01001001b,00100100b,10010000b,\ + 11111111b,11111111b,11111111b,11110000b + +.snake_dots db 1,1, 1,2, 1,3 +.snake_direction dd DOWN +.snake_direction_next dd DOWN +.number_of_stones dd 168 +.name dd stage_32_name + +stage_33: +.field db 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 01111111b,11001111b,11111111b,11100000b,\ + 01000100b,01001000b,01000000b,00100000b,\ + 01000100b,01001000b,01000001b,10100000b,\ + 01000100b,01001000b,01001101b,10100000b,\ + 00000000b,00000000b,00000110b,00000000b,\ + 01000100b,01001000b,01000010b,00100000b,\ + 01000100b,01001000b,01001111b,00100000b,\ + 01000100b,01001000b,01001111b,00100000b,\ + 01000100b,01001000b,01000110b,00100000b,\ + 01111111b,11001111b,11111111b,11100000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 6,6, 7,6, 8,6 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 109 +.name dd stage_33_name + +stage_34: +.field db 01110000b,00000000b,00000011b,10000000b,\ + 00010010b,00010000b,01111100b,00000000b,\ + 00011110b,00010000b,00100100b,00000000b,\ + 00000100b,00011001b,00100111b,00000000b,\ + 00001111b,10001001b,00100000b,00110000b,\ + 00000001b,00001011b,00101000b,00100000b,\ + 00000001b,00011110b,01111000b,00100000b,\ + 00111000b,00000010b,00001100b,10100000b,\ + 00001110b,00100010b,00000000b,10100000b,\ + 01100011b,11111110b,01000011b,11100000b,\ + 00111110b,00100010b,01000000b,10000000b,\ + 00000000b,01100011b,11000010b,10000000b,\ + 00000000b,01000000b,01100111b,10000000b,\ + 00000000b,00000000b,00000010b,00000000b + +.snake_dots db 7,0, 8,0, 9,0 +.snake_direction dd RIGHT +.snake_direction_next dd RIGHT +.number_of_stones dd 113 +.name dd stage_34_name + +stage_35: +.field db 00000100b,00000000b,00001010b,00000000b,\ + 00010100b,01000000b,00101010b,00000000b,\ + 00010100b,10000010b,00010010b,10000000b,\ + 00010001b,00000000b,00010010b,10000000b,\ + 00010001b,00000010b,00001010b,10000000b,\ + 01010010b,00000010b,00001000b,10100000b,\ + 01000100b,00000000b,00001000b,10100000b,\ + 01000100b,00000010b,00000100b,10100000b,\ + 01001000b,00000010b,00000100b,00100000b,\ + 01001000b,00000000b,00000010b,00100000b,\ + 00010000b,00000010b,00000010b,00100000b,\ + 00110000b,00000010b,00000010b,00100000b,\ + 00100000b,00000010b,00000001b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b + +.snake_dots db 13,11, 13,10, 13,9 +.snake_direction dd UP +.snake_direction_next dd UP +.number_of_stones dd 66 +.name dd stage_35_name + +stage_36: +.field db 10101110b,10001110b,00110100b,11100000b,\ + 11101000b,10001110b,00101010b,10000000b,\ + 10101110b,11101000b,00101010b,11100000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00000000b,10110010b,01000100b,00000000b,\ + 00000001b,10100101b,01010100b,00000000b,\ + 00000001b,10100101b,00101000b,00000000b,\ + 00000000b,00000000b,00000000b,00000000b,\ + 00010001b,11010101b,11010001b,11000000b,\ + 00010001b,11010101b,11010001b,00000000b,\ + 00010001b,00010101b,00010000b,10000000b,\ + 00011101b,11001001b,11011100b,01000000b,\ + 00000000b,00000000b,00000001b,11010000b + +.snake_dots db 27,11, 27,10, 27,9 +.snake_direction dd UP +.snake_direction_next dd UP +.number_of_stones dd 112 +.name dd stage_36_name + + +stage_00_name db 'Classic mode',0 +stage_01_name db 'Begin',0 +stage_02_name db 'Frame',0 +stage_03_name db 'Sight',0 +stage_04_name db 'Dashed',0 +stage_05_name db 'Beams',0 +stage_06_name db 'Pipe',0 +stage_07_name db 'Labyrinth',0 +stage_08_name db 'Sea battle',0 +stage_09_name db 'Recursion',0 +stage_10_name db 'Narrow corridors',0 +stage_11_name db 'CCC',0 +stage_12_name db 'Deadlocks',0 +stage_13_name db 'Boat',0 +stage_14_name db 'Pattern',0 +stage_15_name db 'Guernica',0 +stage_16_name db 'Goto',0 +stage_17_name db 'Smiling face',0 +stage_18_name db 'Waves',0 +stage_19_name db 'First snow',0 +stage_20_name db 'Music and silence',0 +stage_21_name db 'Experiment',0 +stage_22_name db 'Pacman',0 +stage_23_name db 'Intricate pattern',0 +stage_24_name db 'Square arcs',0 +stage_25_name db 'In the animal world',0 +stage_26_name db 'Digits',0 +stage_27_name db 'Pluses',0 +stage_28_name db 'Rod',0 +stage_29_name db 'Tetris',0 +stage_30_name db 'Towers of Hanoi',0 +stage_31_name db 'Ruins',0 +stage_32_name db 'Walls of Akendora',0 +stage_33_name db 'Geranium in the window',0 +stage_34_name db 'Algae',0 +stage_35_name db 'The road ahead',0 +stage_36_name db 'Help me draw levels!',0 + + +background_color dd 0x000000 +decorations_color dd 0x00000000 +snake_color dd 0x000000 +snake_head_color dd 0x000000 +lives_in_head_number_color dd 0x000000 +snake_picture_color dd 0x000000 +version_picture_color dd 0x000000 +pause_picture_color dd 0x000000 +game_over_picture_color dd 0x000000 +you_win_picture_color dd 0x000000 +eat_color dd 0x000000 +navigation_strings_color dd 0x80000000 +game_over_strings_color dd 0x80000000 +score_string_color dd 0x80000000 +hiscore_string_color dd 0x80000000 +champion_string_color dd 0x80000000 +game_over_hiscore_color dd 0x80000000 +score_number_color dd 0x40000000 +hiscore_number_color dd 0x00000000 +champion_name_color dd 0x80000000 +button_color dd 0x000000 +button_text_color dd 0x80000000 +stone_color dd 0x000000 +splash_background_color dd 0x000000 +splash_level_string_color dd 0x000000 +splash_level_number_color dd 0x000000 +level_string_color dd 0x80000000 +level_number_color dd 0x00000000 + + +align 4 +@IMPORT: + +library \ + libini , 'libini.obj' ,\ + box_lib , 'box_lib.obj' + +import libini,\ + ini.get_str , 'ini_get_str' ,\ + ini.get_int , 'ini_get_int' ,\ + ini.set_str , 'ini_set_str' ,\ + ini.set_int , 'ini_set_int' ,\ + ini.get_color , 'ini_get_color' ,\ + ini.get_shortcut, 'ini_get_shortcut' + +import box_lib,\ + edit_box.draw , 'edit_box' ,\ + edit_box.key , 'edit_box_key' ,\ + edit_box.mouse , 'edit_box_mouse' + +bFirstDraw db 0 + +aPreferences db 'Preferences',0 +aSpeed db 'Speed',0 +aTheme db 'Theme',0 +aSmart_reverse db 'Smart_reverse',0 +aShow_lives_style db 'Show_lives_style',0 +aDraw_level_name_in_window_title db 'Draw_level_name_in_window_title',0 +aSeparating_symbol db 'Separating_symbol',0 + +aShortcuts db 'Shortcuts',0 +aMove_left db 'Move_left',0 +aMove_down db 'Move_down',0 +aMove_up db 'Move_up',0 +aMove_right db 'Move_right',0 +aReverse db 'Reverse',0 +aIncrease db 'Increase',0 +aDecrease db 'Decrease',0 + +aTheme_name db 32 dup (0) +aDecorations db 'Decorations',0 +aBackground_color db 'Background_color',0 +aDecorations_color db 'Decorations_color',0 +aSnake_color db 'Snake_color',0 +aSnake_head_color db 'Snake_head_color',0 +aLives_in_head_number_color db 'Lives_in_head_number_color',0 +aSnake_picture_color db 'Snake_picture_color',0 +aVersion_picture_color db 'Version_picture_color',0 +aPause_picture_color db 'Pause_picture_color',0 +aGame_over_picture_color db 'Game_over_picture_color',0 +aYou_win_picture_color db 'You_win_picture_color',0 +aEat_color db 'Eat_color',0 +aNavigation_strings_color db 'Navigation_string_color',0 +aGame_over_strings_color db 'Game_over_string_color',0 +aScore_string_color db 'Score_string_color',0 +aHiscore_string_color db 'Hiscore_string_color',0 +aChampion_string_color db 'Champion_string_color',0 +aGame_over_hiscore_color db 'Game_over_hiscore_color',0 +aScore_number_color db 'Score_number_color',0 +aHiscore_number_color db 'Hiscore_number_color',0 +aChampion_name_color db 'Champion_name_color',0 +aEdit_box_selection_color db 'Edit_box_selection_color',0 +aButton_color db 'Button_color',0 +aButton_text_color db 'Button_text_color',0 +aStone_color db 'Stone_color',0 +aSplash_background_color db 'Splash_background_color',0 +aSplash_level_string_color db 'Splash_level_string_color',0 +aSplash_level_number_color db 'Splash_level_number_color',0 +aLevel_string_color db 'Level_string_color',0 +aLevel_number_color db 'Level_number_color',0 + +aReserved db 'Reserved',0 +aSquare_side_length db 'Square_side_length',0 +aHiscore_classic db 'Hiscore_classic',0 +aChampion_name_classic db 'Champion_name_classic',0 +aHiscore_levels db 'Hiscore_levels',0 +aChampion_name_levels db 'Champion_name_levels',0 + +edit1 edit_box 65,397,0x0,0x000000,0x000000,0x000000,0x000000,0x80000000,15,hed,mouse_dd,ed_focus,hed_end-hed-1,hed_end-hed-1 + +hed db '',0 +;;---Variables------------------------------------------------------------------------------------------------------------- +i_end: +hed_end: +rb 256 +mouse_dd rd 1 + +window_style rd 1 + +cur_level rd 1 +cur_level_number rd 1 +hi_level rd 1 + +score rd 1 +hi_score_classic rd 1 +hi_score_levels rd 1 + +champion_name_classic rb CHAMPION_NAME_LENGTH +champion_name_levels rb CHAMPION_NAME_LENGTH + +snake_dots rb GRID_WIDTH*GRID_HEIGHT*2+3 ; +3 bytes for faster dword copying +snake_direction rd 1 +snake_direction_next rd 1 +snake_length_x2 rd 1 + +decorations rd 1 +number_of_free_dots rd 1 + +eat rw 1 + +g_s rd 1 +g_e rd 1 + +window_width rd 1 +window_height rd 1 +wp_x rd 1 +wp_y rd 1 + +gw_mul_gs rd 1 +gh_mul_gs rd 1 +gbxm1_plus_gw_mul_gs rd 1 +gbym1_plus_gh_mul_gs rd 1 +gs_shl16_gs rd 1 +gbxm1_shl16_gbxm1 rd 1 +gbym1_shl16_gbym1 rd 1 + +bottom_top_strings rd 1 +bottom_middle_strings rd 1 +bottom_bottom_strings rd 1 +top_strings rd 1 + +button_x_left rd 1 +button_x_right rd 1 +button_y_top rd 1 +button_y_middle rd 1 +button_y_bottom rd 1 +button_width_short rd 1 +button_width_long rd 1 +button_height rd 1 + +cursor_data rb 32*32*4 +cursor_handle rd 1 + +cur_dir_path rb 4096 +@PARAMS rb 4096 + +field_map rb GRID_WIDTH*GRID_HEIGHT*2 + +proc_info process_information + +smart_reverse rd 1 +show_lives_style rd 1 +draw_level_name_in_window_title rd 1 +separating_symbol rd 1 + +shortcut_move_left rb 1 +shortcut_move_down rb 1 +shortcut_move_up rb 1 +shortcut_move_right rb 1 +shortcut_reverse rb 1 +shortcut_increase rb 1 +shortcut_decrease rb 1 + +square_side_length rd 1 + +gbxm1 rd 1 +gbym1 rd 1 +speed_up_counter rw 1 + +rb 4096 +stacktop: +d_end: diff --git a/programs/media/log_el/trunk/log_el.asm b/programs/media/log_el/trunk/log_el.asm index 7873ced2b..150ea6603 100644 --- a/programs/media/log_el/trunk/log_el.asm +++ b/programs/media/log_el/trunk/log_el.asm @@ -1,2614 +1,2620 @@ -use32 - org 0 - 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 '../../../load_lib.mac' -include '../../../develop/libraries/box_lib/trunk/box_lib.mac' -include 'le_pole.inc' -include 'le_signal.inc' - -@use_library 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 - -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,lib4 - 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,0 - - 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 *** - mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (panel_1_coord_top shl 16)+20, 20, [sc.work_button] - - add ebx,25 shl 16 - inc edx - int 0x40 - - add ebx,30 shl 16 - inc edx - int 0x40 - - add ebx,25 shl 16 - inc edx - int 0x40 - - add ebx,25 shl 16 - inc edx - int 0x40 - - add ebx,25 shl 16 - inc edx - 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 - - ; *** создание кнопок рисования провода *** - mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (panel_2_coord_top shl 16)+20, 30, [sc.work_button] - - 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 -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 - or edi,edi - jz @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 - or edi,edi - jz .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 - or eax,eax - jz @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 - or eax,eax - jz @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 - or eax,eax - jz @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 - or eax,eax - jz @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 uses ecx esi edi, destination:dword, source:dword, len:dword - cld - mov edi,[destination] - mov esi,[source] - mov ecx,[len] - rep movsb - 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 - - or eax,eax - jz @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 '/sys',0 - -communication_area_name: - db 'FFFFFFFF_open_dialog',0 -open_dialog_name: - db 'opendial',0 -communication_area_default_path: - db '/sys/File managers/',0 - -Filter: -dd Filter.end - Filter ;.1 -.1: -db 'TXT',0 -db 'ASM',0 -.end: -db 0 - -include 'le_libs.inc' - -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,25 ;+4 left,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,0 ;+4 left,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,0 ;+4 left,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: - image_data_toolbar dd 0 - icon_tl_sys dd 0 ;указатель на память для хранения системных иконок - icon_toolbar dd 0 ;указатель на память для хранения иконок объектов - image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты - mouse_dd dd 0 - last_time dd 0 - sc system_colors - procinfo process_information - run_file_70 FileInfoBlock - open_file_lif: - rb 2*4096 ;область для открытия файлов - .end: - rb 1024 -stacktop: - sys_path rb 1024 - file_name rb 2048 ;4096 - plugin_path rb 4096 - openfile_path rb 4096 - filename_area rb 256 -mem: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + 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 '../../../load_lib.mac' +include '../../../develop/libraries/box_lib/box_lib.mac' +include 'le_pole.inc' +include 'le_signal.inc' + +@use_library 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 + +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,lib4 + 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,0 + + 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 *** + mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (panel_1_coord_top shl 16)+20, 20, [sc.work_button] + + add ebx,25 shl 16 + inc edx + int 0x40 + + add ebx,30 shl 16 + inc edx + int 0x40 + + add ebx,25 shl 16 + inc edx + int 0x40 + + add ebx,25 shl 16 + inc edx + int 0x40 + + add ebx,25 shl 16 + inc edx + 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 + + ; *** создание кнопок рисования провода *** + mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (panel_2_coord_top shl 16)+20, 30, [sc.work_button] + + 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 +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 + or edi,edi + jz @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 + or edi,edi + jz .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 + or eax,eax + jz @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 + or eax,eax + jz @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 + or eax,eax + jz @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 + or eax,eax + jz @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 uses ecx esi edi, destination:dword, source:dword, len:dword + cld + mov edi,[destination] + mov esi,[source] + mov ecx,[len] + rep movsb + 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 + + or eax,eax + jz @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 '/sys',0 + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_name: + db 'opendial',0 +communication_area_default_path: + db '/sys/File managers/',0 + +Filter: +dd Filter.end - Filter ;.1 +.1: +db 'TXT',0 +db 'ASM',0 +.end: +db 0 + +include 'le_libs.inc' + +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,25 ;+4 left,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,0 ;+4 left,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,0 ;+4 left,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: + image_data_toolbar dd 0 + icon_tl_sys dd 0 ;указатель на память для хранения системных иконок + icon_toolbar dd 0 ;указатель на память для хранения иконок объектов + image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты + mouse_dd dd 0 + last_time dd 0 + sc system_colors + procinfo process_information + run_file_70 FileInfoBlock + open_file_lif: + rb 2*4096 ;область для открытия файлов + .end: + rb 1024 +stacktop: + sys_path rb 1024 + file_name rb 2048 ;4096 + plugin_path rb 4096 + openfile_path rb 4096 + filename_area rb 256 +mem: diff --git a/programs/media/scrshoot/scrshoot.asm b/programs/media/scrshoot/scrshoot.asm index 4e3771172..b569ee6c6 100644 --- a/programs/media/scrshoot/scrshoot.asm +++ b/programs/media/scrshoot/scrshoot.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + ; ; Screenshooter for Kolibri ; @@ -22,7 +28,7 @@ format binary as "" title equ 'Screenshooter v1.21' ; Заголовок окна include '../../load_lib.mac' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' include '../../config.inc' ;for nightbuild include '../../proc32.inc' include '../../macros.inc' diff --git a/programs/network/downloader/downloader.asm b/programs/network/downloader/downloader.asm index ab5544cd9..5961191e7 100644 --- a/programs/network/downloader/downloader.asm +++ b/programs/network/downloader/downloader.asm @@ -1,454 +1,454 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2014-2017. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;; downloader.asm - HTTP client for KolibriOS ;; -;; ;; -;; hidnplayr@kolibrios.org ;; -;; ;; -;; GNU GENERAL PUBLIC LICENSE ;; -;; Version 2, June 1991 ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -URLMAXLEN = 65535 - -__DEBUG__ = 1 -__DEBUG_LEVEL__ = 1 - - -format binary as "" -use32 - org 0x0 - - db 'MENUET01' ; header - dd 0x01 ; header version - dd START ; entry point - dd IM_END ; image size - dd I_END+0x1000 ; required memory - dd I_END+0x1000 ; esp - dd url - dd 0x0 ; I_Path - - -include '../../macros.inc' -include '../../proc32.inc' -include '../../dll.inc' -include '../../debug-fdo.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' -include '../../develop/libraries/http/http.inc' - -virtual at 0 - http_msg http_msg -end virtual - - -START: - mcall 68, 11 ; init heap so we can allocate memory dynamically - -; load libraries - stdcall dll.Load, @IMPORT - test eax, eax - jnz mainloop.exit - -; wanted events - mcall 40, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER - -; prepare filename buffers - mov edi, fname_buf - mov esi, download_file_path - @@: - lodsb - stosb - test al, al - jnz @r - -; Initialise OpenDialog - invoke OpenDialog_Init, OpenDialog_data - -; If user provided parameters, start download right away! - cmp byte[url], 0 - jne display_url_and_download - - mov [OpenDialog_data.draw_window], draw_window - -redraw: - call draw_window - -mainloop: - mcall 10 ; wait here for event - cmp eax, EV_REDRAW - je redraw - cmp eax, EV_KEY - je .key - cmp eax, EV_BUTTON - je .button - cmp eax, EV_MOUSE - je .mouse - jmp mainloop - - .key: - mcall 2 ; read key - invoke edit_box_key, edit1 - cmp ax, 13 shl 8 - je download - jmp mainloop - - .button: - mcall 17 ; get id - cmp ah, 1 ; button id=1 ? - je .exit - - cmp [btn_text], sz_download - je download - - cmp [btn_text], sz_open - je open_file - - .exit: - mcall -1 ; exit - - .mouse: - invoke edit_box_mouse, edit1 - jmp mainloop - - -open_file: - mcall 70, fileopen - jmp mainloop - -display_url_and_download: - xor al, al - mov ecx, 4096 - mov edi, url - repne scasb - sub edi, url+1 - mov [edit1.size], edi - -download: -; Extract the filename from URL - mov edi, url - xor al, al - mov ecx, URLMAXLEN - repne scasb - mov esi, edi - dec esi - dec esi - std - .loop: - lodsb - cmp al, '/' - je .done - test al, al - jnz .loop - .done: - cld - mov ecx, edi - sub ecx, esi - inc esi - inc esi - mov edi, filename_area - rep movsb - -; invoke OpenDialog - invoke OpenDialog_Start, OpenDialog_data - mcall 40, EVM_REDRAW + EVM_BUTTON + EVM_STACK - call draw_window - -; Create the local file - mov [fileinfo], 2 ; create/write to file - xor eax, eax - mov [fileinfo.offset], eax - mov [fileinfo.offset+4], eax - mov [fileinfo.size], eax - mcall 70, fileinfo - test eax, eax - jnz create_error - -; Start the download - invoke HTTP_get, url, 0, FLAG_STREAM or FLAG_REUSE_BUFFER, 0 - test eax, eax - jz get_error - - mov [identifier], eax - mov [offset], 0 - mov [btn_text], sz_cancel - mov [status], sz_downloading - or [edit1.flags], ed_figure_only - and [edit1.flags], not ed_focus - push [sc.work] - pop [edit1.color] - call draw_window - - jmp download_loop - -get_error: - mov [btn_text], sz_exit - mov [status], sz_err_http - jmp redraw - -create_error: - mov [btn_text], sz_exit - mov [status], sz_err_create - jmp redraw - -download_loop: - mcall 10 - cmp eax, EV_REDRAW - je .redraw - cmp eax, EV_BUTTON - je .button - - invoke HTTP_receive, [identifier] - test eax, eax - jz got_data - jmp download_loop - - .redraw: - call draw_window - jmp download_loop - - .button: - jmp http_free - -got_data: - mov ebp, [identifier] - test [ebp + http_msg.flags], 0xffff0000 ; error? - jnz http_error - - cmp [fileinfo], 3 ; Did we write before? - je .write - - test [ebp + http_msg.flags], FLAG_CONTENT_LENGTH - jz .first_write - - mov eax, [ebp + http_msg.content_length] - mov [pb.max], eax - - DEBUGF 1, "new file size=%u\n", eax - mov [fileinfo], 4 ; set end of file - mov [fileinfo.offset], eax ; new file size - mcall 70, fileinfo - test eax, eax - jnz write_error - - - .first_write: - mov [fileinfo], 3 ; write to existing file - .write: - mov ecx, [ebp + http_msg.content_received] - sub ecx, [offset] - jz .no_data ; more then 0 data bytes? - - mov [fileinfo.size], ecx - mov eax, [ebp + http_msg.content_ptr] - mov [fileinfo.buffer], eax - mov ebx, [offset] - mov [fileinfo.offset], ebx - DEBUGF 1, "Writing to disk: size=%u offset=%u\n", ecx, ebx - mcall 70, fileinfo - test eax, eax ; check error code - jnz write_error - cmp ebx, ecx ; check if all bytes were written to disk - jne write_error - - mov eax, [ebp + http_msg.content_received] - mov [offset], eax - mov [pb.value], eax - - invoke progressbar_draw, pb - - .no_data: - test [ebp + http_msg.flags], FLAG_GOT_ALL_DATA - jz download_loop - -; Download completed successfully - mov [status], sz_complete - mov [pb.progress_color], 0x0000c800 ; green - mov [btn_text], sz_open - jmp http_free - -write_error: - mov [status], sz_err_full - mov [pb.progress_color], 0x00c80000 ; red - mov [btn_text], sz_exit - jmp http_free - -http_error: - mov [status], sz_err_http - mov [pb.progress_color], 0x00c80000 ; red - mov [btn_text], sz_exit -; jmp http_free - -http_free: - mcall 40, EVM_REDRAW + EVM_BUTTON - push [ebp + http_msg.content_received] - pop [pb.value] - - mov ecx, [ebp + http_msg.content_ptr] - test ecx, ecx - jz @f - mcall 68, 13 ; free the buffer - @@: - invoke HTTP_free, [identifier] ; free headers and connection - jmp redraw - -draw_window: - mcall 12, 1 ; start window draw - -; get system colors - mcall 48, 3, sc, 40 - -; draw window - mov edx, [sc.work] - or edx, 0x34000000 - mcall 0, <50, 420>, <350, 120>, , 0, title - -; draw button - mcall 8, <320,75>, <50,24>, 22, [sc.work_button] - -; draw button text - mov ecx, [sc.work_button_text] - or ecx, 90000000h - mcall 4, <325,56>, , [btn_text] - -; draw status text - mov ecx, [sc.work_text] - or ecx, 90000000h - mcall 4, <10,70>, , [status] - -; draw editbox - edit_boxes_set_sys_color edit1, editboxes_end, sc - invoke edit_box_draw, edit1 - - cmp [identifier], 0 - je @f -; draw progressbar - invoke progressbar_draw, pb - @@: - mcall 12, 2 ; end window draw - -dont_draw: - ret - -;--------------------------------------------------------------------- -; Data area -;----------------------------------------------------------------------------- -align 4 -@IMPORT: - -library lib_http, 'http.obj', \ - box_lib, 'box_lib.obj', \ - proc_lib, 'proc_lib.obj' - -import lib_http, \ - HTTP_get, 'get', \ - HTTP_receive, 'receive', \ - HTTP_free, 'free' - -import box_lib, \ - edit_box_draw, 'edit_box_draw', \ - edit_box_key, 'edit_box_key', \ - edit_box_mouse, 'edit_box_mouse', \ - progressbar_draw, 'progressbar_draw', \ - progressbar_prog, 'progressbar_progress' - -import proc_lib, \ - OpenDialog_Init, 'OpenDialog_init', \ - OpenDialog_Start, 'OpenDialog_start' - - -fileinfo dd 2 - .offset dd 0, 0 - .size dd 0 - .buffer dd 0 - db 0 - dd fname_buf - -fileopen dd 7 - dd 0 ; flags - dd fname_buf ; parameters - dd 0 ; reserved - dd 0 ; reserved - db "/sys/@open", 0 ; path - -edit1 edit_box 400, 5, 10, 0xffffff, 0x0000ff, 0x0080ff, 0x000000, 0x90000000, URLMAXLEN, url, mouse_dd, ed_focus+ed_always_focus, 0, 0 -editboxes_end: - -identifier dd 0 -btn_text dd sz_download -status dd sz_null -sz_download db 'Download', 0 -sz_cancel db ' Cancel ', 0 -sz_open db ' Open ', 0 -sz_exit db ' Exit ', 0 - -sz_null db 0 -sz_downloading db 'Downloading..', 0 -sz_complete db 'Download completed', 0 -sz_err_create db 'Could not create the local file!', 0 -sz_err_full db 'Disk full!', 0 -sz_err_http db 'HTTP error!', 0 -title db 'HTTP Downloader', 0 - -OpenDialog_data: -.type dd 1 ; Save -.procinfo dd procinfo -.com_area_name dd communication_area_name -.com_area dd 0 -.opendir_path dd temp_dir_path -.dir_default_path dd communication_area_default_path -.start_path dd open_dialog_path -.draw_window dd dont_draw -.status dd 0 -.openfile_patch dd fname_buf -.filename_area dd filename_area -.filter_area dd filter -.x: -.x_size dw 420 ; Window X size -.x_start dw 200 ; Window X position -.y: -.y_size dw 320 ; Window y size -.y_start dw 140 ; Window Y position - -communication_area_name db 'FFFFFFFF_open_dialog',0 -open_dialog_path db '/sys/File Managers/opendial',0 -communication_area_default_path db '/sys',0 - -filter: -dd 0 -db 0 - -pb: -.value dd 0 -.left dd 5 -.top dd 45 -.width dd 300 -.height dd 16 -.style dd 1 -.min dd 0 -.max dd 0 -.back_color dd 0xefefef -.progress_color dd 0xc8c8c8 -.frame_color dd 0x94aece -.frame_color2 dd 0xffffff - -include_debug_strings - -download_file_path db '/tmp0/1/', 0 - -IM_END: - -url rb URLMAXLEN -sc system_colors -offset dd ? -mouse_dd dd ? - -filename_area rb 256 -temp_dir_path rb 4096 -procinfo rb 1024 -fname_buf rb 4096 -text_work_area rb 1024 - -I_END: \ No newline at end of file +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2014-2017. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; downloader.asm - HTTP client for KolibriOS ;; +;; ;; +;; hidnplayr@kolibrios.org ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +URLMAXLEN = 65535 + +__DEBUG__ = 1 +__DEBUG_LEVEL__ = 1 + + +format binary as "" +use32 + org 0x0 + + db 'MENUET01' ; header + dd 0x01 ; header version + dd START ; entry point + dd IM_END ; image size + dd I_END+0x1000 ; required memory + dd I_END+0x1000 ; esp + dd url + dd 0x0 ; I_Path + + +include '../../macros.inc' +include '../../proc32.inc' +include '../../dll.inc' +include '../../debug-fdo.inc' +include '../../develop/libraries/box_lib/box_lib.mac' +include '../../develop/libraries/http/http.inc' + +virtual at 0 + http_msg http_msg +end virtual + + +START: + mcall 68, 11 ; init heap so we can allocate memory dynamically + +; load libraries + stdcall dll.Load, @IMPORT + test eax, eax + jnz mainloop.exit + +; wanted events + mcall 40, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER + +; prepare filename buffers + mov edi, fname_buf + mov esi, download_file_path + @@: + lodsb + stosb + test al, al + jnz @r + +; Initialise OpenDialog + invoke OpenDialog_Init, OpenDialog_data + +; If user provided parameters, start download right away! + cmp byte[url], 0 + jne display_url_and_download + + mov [OpenDialog_data.draw_window], draw_window + +redraw: + call draw_window + +mainloop: + mcall 10 ; wait here for event + cmp eax, EV_REDRAW + je redraw + cmp eax, EV_KEY + je .key + cmp eax, EV_BUTTON + je .button + cmp eax, EV_MOUSE + je .mouse + jmp mainloop + + .key: + mcall 2 ; read key + invoke edit_box_key, edit1 + cmp ax, 13 shl 8 + je download + jmp mainloop + + .button: + mcall 17 ; get id + cmp ah, 1 ; button id=1 ? + je .exit + + cmp [btn_text], sz_download + je download + + cmp [btn_text], sz_open + je open_file + + .exit: + mcall -1 ; exit + + .mouse: + invoke edit_box_mouse, edit1 + jmp mainloop + + +open_file: + mcall 70, fileopen + jmp mainloop + +display_url_and_download: + xor al, al + mov ecx, 4096 + mov edi, url + repne scasb + sub edi, url+1 + mov [edit1.size], edi + +download: +; Extract the filename from URL + mov edi, url + xor al, al + mov ecx, URLMAXLEN + repne scasb + mov esi, edi + dec esi + dec esi + std + .loop: + lodsb + cmp al, '/' + je .done + test al, al + jnz .loop + .done: + cld + mov ecx, edi + sub ecx, esi + inc esi + inc esi + mov edi, filename_area + rep movsb + +; invoke OpenDialog + invoke OpenDialog_Start, OpenDialog_data + mcall 40, EVM_REDRAW + EVM_BUTTON + EVM_STACK + call draw_window + +; Create the local file + mov [fileinfo], 2 ; create/write to file + xor eax, eax + mov [fileinfo.offset], eax + mov [fileinfo.offset+4], eax + mov [fileinfo.size], eax + mcall 70, fileinfo + test eax, eax + jnz create_error + +; Start the download + invoke HTTP_get, url, 0, FLAG_STREAM or FLAG_REUSE_BUFFER, 0 + test eax, eax + jz get_error + + mov [identifier], eax + mov [offset], 0 + mov [btn_text], sz_cancel + mov [status], sz_downloading + or [edit1.flags], ed_figure_only + and [edit1.flags], not ed_focus + push [sc.work] + pop [edit1.color] + call draw_window + + jmp download_loop + +get_error: + mov [btn_text], sz_exit + mov [status], sz_err_http + jmp redraw + +create_error: + mov [btn_text], sz_exit + mov [status], sz_err_create + jmp redraw + +download_loop: + mcall 10 + cmp eax, EV_REDRAW + je .redraw + cmp eax, EV_BUTTON + je .button + + invoke HTTP_receive, [identifier] + test eax, eax + jz got_data + jmp download_loop + + .redraw: + call draw_window + jmp download_loop + + .button: + jmp http_free + +got_data: + mov ebp, [identifier] + test [ebp + http_msg.flags], 0xffff0000 ; error? + jnz http_error + + cmp [fileinfo], 3 ; Did we write before? + je .write + + test [ebp + http_msg.flags], FLAG_CONTENT_LENGTH + jz .first_write + + mov eax, [ebp + http_msg.content_length] + mov [pb.max], eax + + DEBUGF 1, "new file size=%u\n", eax + mov [fileinfo], 4 ; set end of file + mov [fileinfo.offset], eax ; new file size + mcall 70, fileinfo + test eax, eax + jnz write_error + + + .first_write: + mov [fileinfo], 3 ; write to existing file + .write: + mov ecx, [ebp + http_msg.content_received] + sub ecx, [offset] + jz .no_data ; more then 0 data bytes? + + mov [fileinfo.size], ecx + mov eax, [ebp + http_msg.content_ptr] + mov [fileinfo.buffer], eax + mov ebx, [offset] + mov [fileinfo.offset], ebx + DEBUGF 1, "Writing to disk: size=%u offset=%u\n", ecx, ebx + mcall 70, fileinfo + test eax, eax ; check error code + jnz write_error + cmp ebx, ecx ; check if all bytes were written to disk + jne write_error + + mov eax, [ebp + http_msg.content_received] + mov [offset], eax + mov [pb.value], eax + + invoke progressbar_draw, pb + + .no_data: + test [ebp + http_msg.flags], FLAG_GOT_ALL_DATA + jz download_loop + +; Download completed successfully + mov [status], sz_complete + mov [pb.progress_color], 0x0000c800 ; green + mov [btn_text], sz_open + jmp http_free + +write_error: + mov [status], sz_err_full + mov [pb.progress_color], 0x00c80000 ; red + mov [btn_text], sz_exit + jmp http_free + +http_error: + mov [status], sz_err_http + mov [pb.progress_color], 0x00c80000 ; red + mov [btn_text], sz_exit +; jmp http_free + +http_free: + mcall 40, EVM_REDRAW + EVM_BUTTON + push [ebp + http_msg.content_received] + pop [pb.value] + + mov ecx, [ebp + http_msg.content_ptr] + test ecx, ecx + jz @f + mcall 68, 13 ; free the buffer + @@: + invoke HTTP_free, [identifier] ; free headers and connection + jmp redraw + +draw_window: + mcall 12, 1 ; start window draw + +; get system colors + mcall 48, 3, sc, 40 + +; draw window + mov edx, [sc.work] + or edx, 0x34000000 + mcall 0, <50, 420>, <350, 120>, , 0, title + +; draw button + mcall 8, <320,75>, <50,24>, 22, [sc.work_button] + +; draw button text + mov ecx, [sc.work_button_text] + or ecx, 90000000h + mcall 4, <325,56>, , [btn_text] + +; draw status text + mov ecx, [sc.work_text] + or ecx, 90000000h + mcall 4, <10,70>, , [status] + +; draw editbox + edit_boxes_set_sys_color edit1, editboxes_end, sc + invoke edit_box_draw, edit1 + + cmp [identifier], 0 + je @f +; draw progressbar + invoke progressbar_draw, pb + @@: + mcall 12, 2 ; end window draw + +dont_draw: + ret + +;--------------------------------------------------------------------- +; Data area +;----------------------------------------------------------------------------- +align 4 +@IMPORT: + +library lib_http, 'http.obj', \ + box_lib, 'box_lib.obj', \ + proc_lib, 'proc_lib.obj' + +import lib_http, \ + HTTP_get, 'get', \ + HTTP_receive, 'receive', \ + HTTP_free, 'free' + +import box_lib, \ + edit_box_draw, 'edit_box_draw', \ + edit_box_key, 'edit_box_key', \ + edit_box_mouse, 'edit_box_mouse', \ + progressbar_draw, 'progressbar_draw', \ + progressbar_prog, 'progressbar_progress' + +import proc_lib, \ + OpenDialog_Init, 'OpenDialog_init', \ + OpenDialog_Start, 'OpenDialog_start' + + +fileinfo dd 2 + .offset dd 0, 0 + .size dd 0 + .buffer dd 0 + db 0 + dd fname_buf + +fileopen dd 7 + dd 0 ; flags + dd fname_buf ; parameters + dd 0 ; reserved + dd 0 ; reserved + db "/sys/@open", 0 ; path + +edit1 edit_box 400, 5, 10, 0xffffff, 0x0000ff, 0x0080ff, 0x000000, 0x90000000, URLMAXLEN, url, mouse_dd, ed_focus+ed_always_focus, 0, 0 +editboxes_end: + +identifier dd 0 +btn_text dd sz_download +status dd sz_null +sz_download db 'Download', 0 +sz_cancel db ' Cancel ', 0 +sz_open db ' Open ', 0 +sz_exit db ' Exit ', 0 + +sz_null db 0 +sz_downloading db 'Downloading..', 0 +sz_complete db 'Download completed', 0 +sz_err_create db 'Could not create the local file!', 0 +sz_err_full db 'Disk full!', 0 +sz_err_http db 'HTTP error!', 0 +title db 'HTTP Downloader', 0 + +OpenDialog_data: +.type dd 1 ; Save +.procinfo dd procinfo +.com_area_name dd communication_area_name +.com_area dd 0 +.opendir_path dd temp_dir_path +.dir_default_path dd communication_area_default_path +.start_path dd open_dialog_path +.draw_window dd dont_draw +.status dd 0 +.openfile_patch dd fname_buf +.filename_area dd filename_area +.filter_area dd filter +.x: +.x_size dw 420 ; Window X size +.x_start dw 200 ; Window X position +.y: +.y_size dw 320 ; Window y size +.y_start dw 140 ; Window Y position + +communication_area_name db 'FFFFFFFF_open_dialog',0 +open_dialog_path db '/sys/File Managers/opendial',0 +communication_area_default_path db '/sys',0 + +filter: +dd 0 +db 0 + +pb: +.value dd 0 +.left dd 5 +.top dd 45 +.width dd 300 +.height dd 16 +.style dd 1 +.min dd 0 +.max dd 0 +.back_color dd 0xefefef +.progress_color dd 0xc8c8c8 +.frame_color dd 0x94aece +.frame_color2 dd 0xffffff + +include_debug_strings + +download_file_path db '/tmp0/1/', 0 + +IM_END: + +url rb URLMAXLEN +sc system_colors +offset dd ? +mouse_dd dd ? + +filename_area rb 256 +temp_dir_path rb 4096 +procinfo rb 1024 +fname_buf rb 4096 +text_work_area rb 1024 + +I_END: diff --git a/programs/network/ftpc/gui.inc b/programs/network/ftpc/gui.inc index f686d058d..2cc5dd1ea 100755 --- a/programs/network/ftpc/gui.inc +++ b/programs/network/ftpc/gui.inc @@ -1,10 +1,13 @@ +; SPDX-License-Identifier: NOASSERTION +; + include '../../load_img.inc' include '../../develop/libraries/libs-dev/libimg/libimg.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' include '../../load_lib.mac' @use_library - + icon_tl_sys dd 0 icon_tl_nod dd 0 icon_buttons dd 0 @@ -82,7 +85,7 @@ gui: ;////////////////////////////////////////////////////////////////////////// or dword[tree1.style], 8 ;tl_cursor_pos_limited - restrict cursor move to existing nodes or dword[tree2.style], 8 ;tl_cursor_pos_limited - + ; read icons mcall SF_SYS_MISC, SSF_MEM_OPEN, str_icon_18,, 0 or eax, eax @@ -228,7 +231,7 @@ gui: ;////////////////////////////////////////////////////////////////////////// mcall SF_DEFINE_BUTTON, , <80,20>, 6, BT_COL ; string "mkd" mcall SF_DRAW_TEXT, , 0xb0000000+STR_COL, str_mkd - + ; draw "cancel" button ;mcall SF_DEFINE_BUTTON, <555,55>, <308,25>, 10, BT_COL ; string "Cancel" @@ -243,7 +246,7 @@ gui: ;////////////////////////////////////////////////////////////////////////// ;-------------------------- stdcall [tl_draw], tree1 stdcall [tl_draw], tree2 - + mov dword[wScr.all_redraw], 1 stdcall [scrollbar_ver_draw], wScr @@ -360,7 +363,7 @@ gui: ;////////////////////////////////////////////////////////////////////////// @@: cmp ah, 1 je .exit - + jmp .still .print: @@ -456,7 +459,7 @@ gui: ;////////////////////////////////////////////////////////////////////////// mov ecx, [esp] add ecx, buf_buffer2 sub ecx, edi - + repne scasb ; check if the (last) entry is incomplete @@ -466,7 +469,7 @@ gui: ;////////////////////////////////////////////////////////////////////////// rep scasb test ecx, ecx jz .store_last_entry - + dec edx jnz @b @@ -772,7 +775,7 @@ populate_local_tree_list: ;///////////////////////////////////////////////////// je .outer ; more BDFEs to come .done: - ret + ret MIN_M_WND_H equ 500 ; @@ -890,7 +893,7 @@ search: ;/////////////////////////////////////////////////////////////////////// ;;------------------------------------------------------------------------------------------------;; ;< al = 0 (not found) / 1 (found) ;; ;;================================================================================================;; - + push ebx ecx edx esi edi ; if length of haystack < length of needle cmp ecx, edx @@ -1073,7 +1076,7 @@ edit_volume edit_box TLIST_SZ-60, TLIST1_X, 80, 0xffffff, 0x94AECE, 0, \ ; editbox for search edit_search edit_box TLIST_SZ-30, TLIST2_X, 22, 0xffffff, 0x94AECE, 0, \ 0xAABBCC, 0x10000000, 99, filter,mouse_dd, 0 - + ; A subsidiary structure for scrolling align 4 wScr: @@ -1196,7 +1199,7 @@ tedit0: .mode_color db 1 ;+195 .mode_invis db 0 ;+196 .gp_opt db 0 ;+197 - dd 0 ;.fun_on_key_ctrl_all dd but_ctrl_all ;+198 + dd 0 ;.fun_on_key_ctrl_all dd but_ctrl_all ;+198 dd 0,0,0 ;reserved .buffer_size dd 4096 ;+214 .fun_find_err dd 0 ;+218 diff --git a/programs/network/ircc/ircc.asm b/programs/network/ircc/ircc.asm index 32a26d9e6..d0182b9dc 100644 --- a/programs/network/ircc/ircc.asm +++ b/programs/network/ircc/ircc.asm @@ -1,642 +1,642 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2004-2024. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;; IRC client for KolibriOS ;; -;; ;; -;; Written by hidnplayr@kolibrios.org, ;; -;; text encoder/decoder by Clevermouse. ;; -;; ;; -;; GNU GENERAL PUBLIC LICENSE ;; -;; Version 2, June 1991 ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -version equ '0.36b' - -; connection status -STATUS_DISCONNECTED = 0 -STATUS_RESOLVING = 1 -STATUS_CONNECTING = 2 -STATUS_CONNECTED = 3 -STATUS_LOGGED_IN = 4 - -; window flags -FLAG_UPDATED = 1 shl 0 -FLAG_RECEIVING_NAMES = 1 shl 1 -FLAG_SCROLL_LOW = 1 shl 2 - -; window types -WINDOWTYPE_NONE = 0 -WINDOWTYPE_SERVER = 1 -WINDOWTYPE_CHANNEL = 2 -WINDOWTYPE_CHAT = 3 -WINDOWTYPE_LIST = 4 -WINDOWTYPE_DCC = 5 - -; supported encodings -CP866 = 0 -CP1251 = 1 -UTF8 = 2 - -; settings -USERCMD_MAX_SIZE = 400 - -WIN_MIN_X = 600 -WIN_MIN_Y = 183 - -TEXT_X = 2 -TEXT_Y = TOP_Y + 2 - -TOP_SPACE = 2 -TAB_HEIGHT = 14 -TAB_WIDTH = 120 -TAB_SPACE = 5 -TOP_Y = TOP_SPACE+ TAB_HEIGHT -INPUTBOX_HEIGHT = 13 - -MAX_WINDOWS = 20 -MAX_USERS = 4096 -TEXT_BUFFERSIZE = 1024*1024 - -MAX_NICK_LEN = 32 -MAX_REAL_LEN = 32 ; realname -QUIT_MSG_LEN = 250 -MAX_SERVER_NAME = 256 - -MAX_CHANNEL_LEN = 40 -MAX_CHANNELS = 37 - -MAX_COMMAND_LEN = 512 - -PACKETBUF_SIZE = 1024 -PATH_SIZE = 1024 -PARAM_SIZE = 1024 -SERVERCOMMAND_SIZE = 600 - -TIMESTAMP = 3 ; 3 = hh:mm:ss, 2 = hh:mm, 0 = no timestamp - -MAX_WINDOWNAME_LEN = 256 - -WINDOW_BTN_START = 100 -WINDOW_BTN_CLOSE = 2 -WINDOW_BTN_LIST = 3 - -SCROLLBAR_WIDTH = 14 -USERLIST_WIDTH = 160 - -FONT_WIDTH = 8 -FONT_HEIGHT = 16 - -format binary as "" - -use32 - - org 0x0 - - db 'MENUET01' ; 8 byte id - dd 1 ; header version - dd START ; program start - dd I_END ; program image size - dd IM_END+2048 ; required amount of memory - dd IM_END+2048 - dd param - dd path - -include "../../macros.inc" -include "../../proc32.inc" -include "../../dll.inc" -include "../../network.inc" -include "../../struct.inc" -include "../../develop/libraries/box_lib/trunk/box_lib.mac" - -struct window - data_ptr dd ? - flags db ? - type db ? - name rb MAX_WINDOWNAME_LEN - users dd ? - users_scroll dd ? - selected dd ? ; selected user, 0 if none selected - - text_start dd ? ; pointer to current textbox data - text_end dd ? - text_print dd ? ; pointer to first character to print on screen - text_line_print dd ? ; line number of that character - text_write dd ? ; write pointer - text_lines dd ? ; total number of lines - text_scanned dd ? ; pointer to beginning of unscanned data (we still need to count number of lines, insert newline characters,..) - -ends - -struct window_data - text rb TEXT_BUFFERSIZE - names rb MAX_NICK_LEN * MAX_USERS -ends - -include "encodings.inc" -include "window.inc" -include "serverparser.inc" -include "userparser.inc" -include "socket.inc" -include "gui.inc" -include "users.inc" -include "textbox.inc" - - -START: - - mcall 68, 11 ; init heap so we can allocate memory dynamically - -; wanted events - mcall 40, EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_STACK+EVM_MOUSE+EVM_MOUSE_FILTER - -; load libraries - stdcall dll.Load, @IMPORT - test eax, eax - jnz exit - -; find path to main settings file (ircc.ini) - mov edi, path ; Calculate the length of zero-terminated string - xor al, al - mov ecx, PATH_SIZE - repne scasb - dec edi - mov eax, '.ini' - stosd - xor al, al - stosb - -; Fill the window buffer with zeros - mov edi, windows - mov ecx, (sizeof.window*MAX_WINDOWS+3)/4 - xor eax, eax - rep stosd - -; clear command area too - mov edi, servercommand - mov ecx, SERVERCOMMAND_SIZE/4 - rep stosd - -; allocate window data block - mov ebx, windows - call window_create_textbox - test eax, eax - jz exit - mov [ebx + window.type], WINDOWTYPE_SERVER - -; get settings from ini - invoke ini.get_str, path, str_user, str_nick, user_nick, MAX_NICK_LEN, default_nick - invoke ini.get_str, path, str_user, str_real, user_real_name, MAX_REAL_LEN, default_real - invoke ini.get_str, path, str_user, str_quitmsg, quit_msg, 250, default_quit - -; Welcome user - mov esi, str_welcome - call print_asciiz - -; Check if parameter contains an URL - cmp byte[param], 0 - je @f - mov esi, param - mov ecx, PARAM_SIZE - call cmd_usr_server.now - @@: - -redraw: - call draw_window - -mainloop: - mcall 10 ; wait for event - - dec eax - jz redraw - - dec eax - jz main_window_key - - dec eax - jz button - - cmp al, 3 - je mouse - - call process_network_event - - mov edi, [window_active] - test [edi + window.flags], FLAG_UPDATED - jz .no_update - call draw_channel_text - mov edi, [window_active] - cmp [edi + window.type], WINDOWTYPE_CHANNEL - jne .no_update - call draw_user_list - .no_update: - call highlight_updated_tabs - - jmp mainloop - -button: - - mcall 17 ; get id - ror eax, 8 - - cmp ax, 1 ; close program - je quit - - cmp ax, WINDOW_BTN_CLOSE - jne @f - call cmd_usr_close_window - jmp mainloop - - @@: - cmp ax, WINDOW_BTN_LIST - jne @f - - push eax - - mcall 37, 1 ; Get mouse position - sub ax, TEXT_Y - mov bl, FONT_HEIGHT - div bl - and eax, 0x000000ff - inc eax - add eax, [scroll1.position] - mov ebx, [window_active] - mov [ebx + window.selected], eax - - call draw_user_list - - pop eax - test eax, 1 shl 25 ; Right mouse button pressed? - jz mainloop - -; TODO: check if selected nick is my nick! - -; Right mouse BTN was pressed, open chat window - mov ebx, [window_active] - mov eax, [ebx + window.selected] - dec eax - imul eax, MAX_NICK_LEN - mov ebx, [ebx + window.data_ptr] - lea esi, [ebx + window_data.names + eax] -; Strip user prefixes - cmp byte[esi], '~' - je .inc - cmp byte[esi], '&' - je .inc - cmp byte[esi], '@' - je .inc - cmp byte[esi], '%' - je .inc - cmp byte[esi], '+' - je .inc - .open: - call window_open - test ebx, ebx - jz mainloop - mov [window_active], ebx - call redraw - - jmp mainloop - .inc: - inc esi - jmp .open - - @@: - sub ax, WINDOW_BTN_START - jb quit - - cmp ax, MAX_WINDOWS - ja quit - -; Save users scrollbar position - push [scroll1.position] - mov edx, [window_active] - pop [edx + window.users_scroll] - -; OK, time to switch to another window. - mov dx, sizeof.window - mul dx - shl edx, 16 - mov dx, ax - add edx, windows - cmp [edx + window.type], WINDOWTYPE_NONE - je quit - mov [window_active], edx - - push [edx + window.text_line_print] - pop [scroll2.position] - - push [edx + window.users_scroll] - pop [scroll1.position] - - call draw_window - jmp mainloop - -quit: - cmp [socketnum], 0 - je @f - mov esi, quit_msg - call quit_server - @@: - -exit: - -; Close all open windows - call window_close_all - -; Erase RAM areas which could contain the connection details - xor eax, eax - mov edi, irc_server_name - mov ecx, MAX_SERVER_NAME - rep stosb - - mov edi, user_nick - mov ecx, MAX_NICK_LEN - rep stosb - - mov edi, user_real_name - mov ecx, MAX_REAL_LEN - rep stosb - - mov edi, sockaddr1 - mov ecx, SOCKADDR1_SIZE - rep stosb - - mcall -1 - - - -main_window_key: - - mcall 2 - - push dword edit1 - call [edit_box_key] - -; cmp ah, 178 -; jne .no_up -; -; jmp mainloop -; -; -; .no_up: -; cmp ah, 177 -; jne .no_down -; -; jmp mainloop -; -; .no_down: - cmp ah, 13 ; enter - jne no_send2 - - call user_parser - - mov eax, [edit1.size] - - mov [edit1.size], 0 - mov [edit1.pos], 0 - - invoke edit_box_draw, edit1 - - call draw_channel_text - - jmp mainloop - no_send2: - - jmp mainloop - -mouse: - invoke edit_box_mouse, edit1 - -; mcall 37, 7 -; movsx eax, ax -; add [scroll2.position], eax - -; TODO: check if scrollbar is active? - mov edi, [window_active] - cmp [edi + window.type], WINDOWTYPE_CHANNEL - jne @f - push [scroll1.position] - invoke scrollbar_mouse, scroll1 - pop eax - cmp eax, [scroll1.position] ; did the scrollbar move? - je @f - call draw_user_list - @@: - -; TODO: check if scrollbar is active? - mov edi, [window_active] - mov eax, [edi + window.text_lines] - cmp eax, [textbox_height] - jbe @f - invoke scrollbar_mouse, scroll2 - mov edi, [window_active] - and [edi+window.flags], not FLAG_SCROLL_LOW - mov edx, [scroll2.position] - add edx, [scroll2.cur_area] - sub edx, [scroll2.max_area] - jne .not_low - or [edi+window.flags], FLAG_SCROLL_LOW - .not_low: - mov edx, [scroll2.position] - sub edx, [edi + window.text_line_print] - je @f - call draw_channel_text.scroll_to_pos - @@: - - jmp mainloop - - -; DATA AREA - -encoding_text: -db 'CP866 ' -db 'CP1251' -db 'UTF-8 ' -encoding_text_len = 6 - -join_header db 3, '3* ', 0 -quit_header db 3, '5* ', 0 -nick_header db 3, '2* ', 0 -kick_header db 3, '5* ', 0 -mode_header db 3, '2* ', 0 -part_header db 3, '5* ', 0 -topic_header db 3, '3* ', 0 -action_header db 3, '6* ', 0 -ctcp_header db 3, '13-> [', 0 -ctcp_header_recv db 3, '13', 0 -msg_header db 3, '7-> *', 0 -ctcp_version db '] VERSION', 10, 0 -ctcp_ping db '] PING', 10, 0 -ctcp_time db '] TIME', 10, 0 - -has_left_channel db ' has left ', 0 -joins_channel db ' has joined ', 0 -is_now_known_as db ' is now known as ', 0 -has_quit_irc db ' has quit IRC', 10, 0 - -sets_mode db ' sets mode ', 0 -str_kicked db ' is kicked from ', 0 -str_by db ' by ', 0 -str_nickchange db 'Nickname is now ', 0 -str_realchange db 'Real name is now ', 0 -str_talking db 'Now talking in ', 0 -str_topic db 'Topic is "', 0 -str_topic_end db '"', 10, 0 -str_setby db 'Set by ', 0 - -str_connecting db 3, '3* Connecting to ', 0 -str_sockerr db 3, '5* Socket error', 10, 0 -str_dnserr db 3, '5* Unable to resolve hostname', 10, 0 -str_refused db 3, '5* Connection refused', 10, 0 -str_srv_disconnected db 3, '5* Server disconnected', 10, 0 -str_disconnected db 3, '5* Disconnected', 10, 0 -str_reconnect db 3, '5* Connection reset by user', 10, 0 -str_notconnected db 3, '5* You are not connected', 10, 0 -str_notchannel db 3, '5* You are not on a channel', 10, 0 -str_notloggedin db 3, '5* You are not logged in to the server', 10, 0 - -str_1 db 3, '13 -', 0 -str_2 db '- ', 0 - -str_list db 'list', 0 - -str_help db 'The following commands are available:', 10 - db 10 - db '/nick : change nickname', 10 - db '/real : change real name', 10 - db '/server
: connect to server', 10 - db '/code : change codepage (cp866, cp1251, or utf8)', 10 - db '/join : join a channel', 10 - db '/part : part from a channel', 10 - db '/quit : quit server', 10 - db '/msg : send a private message', 10 - db '/ctcp : send a message using client-to-client protocol', 10 - db 10 - db 'Other commands are sent straight to a server', 10 - db 10, 0 - -str_welcome db 3, '3 ___', 3, '7__________', 3, '6_________ ', 3, '4 __ __ __', 10 - db 3, '3| \', 3, '7______ \', 3, '6_ ___ \ ', 3, '4 ____ | | |__| ____ _____/ |_', 10 - db 3, '3| |', 3, '7| _/', 3, '6 \ \/ ', 3, '4 _/ ___\| | | |/ __ \ / \ __\', 10 - db 3, '3| |', 3, '7| | \', 3, '6 \____', 3, '4 \ \___| |_| \ ___/| | \ |', 10 - db 3, '3|___|', 3, '7|____|_ /', 3, '6\______ /', 3, '4 \___ >____/__|\___ >___| /__|', 10 - db 3, '3 ', 3, '7 \/ ', 3, '6 \/ ', 3, '4 \/ \/ \/', 10 - db 'Welcome to KolibriOS IRC client ', version, 10 - db 'Type /help for help', 10, 0 - -str_version db 'VERSION KolibriOS ' -str_programname db 'IRC client ', version, 0 - -str_user db 'user', 0 -str_nick db 'nick', 0 -str_real db 'realname', 0 -str_email db 'email', 0 -str_quitmsg db 'quitmsg', 0 - -default_nick db 'kolibri_user', 0 -default_real db 'Kolibri User', 0 -default_quit db 'KolibriOS forever', 0 - -closing_cross db 'x',0 - -irc_colors dd 0xffffff ; 0 white - dd 0x000000 ; 1 black - dd 0x00007f ; 2 blue (navy) - dd 0x009300 ; 3 green - dd 0xff0000 ; 4 red - dd 0x7f0000 ; 5 brown (maroon) - dd 0x9c009c ; 6 purple - dd 0xfc7f00 ; 7 olive - dd 0xffff00 ; 8 yellow - dd 0x00fc00 ; 9 light green - dd 0x009393 ; 10 teal - dd 0x00ffff ; 11 cyan - dd 0x0000fc ; 12 royal blue - dd 0xff00ff ; 13 pink - dd 0x7f7f7f ; 14 grey - dd 0xd4d0c4 ; 15 light grey (silver) - -sockaddr1: - dw AF_INET4 -.port dw 0x0b1a ; 6667 FIXMEEEEEE -.ip dd 0 - rb 10 - -SOCKADDR1_SIZE = 18 - -status dd STATUS_DISCONNECTED - -window_active dd windows -window_print dd windows - -cmd_remaining dd 0 - -align 4 -@IMPORT: - -library network, 'network.obj',\ - libini, 'libini.obj',\ - boxlib, 'box_lib.obj' - -import network,\ - getaddrinfo, 'getaddrinfo',\ - freeaddrinfo, 'freeaddrinfo',\ - inet_ntoa, 'inet_ntoa' - -import libini,\ - ini.get_str, 'ini_get_str',\ - ini.get_int, 'ini_get_int' - -import boxlib,\ - edit_box_draw, 'edit_box_draw',\ - edit_box_key, 'edit_box_key',\ - edit_box_mouse, 'edit_box_mouse',\ - scrollbar_draw, 'scrollbar_v_draw',\ - scrollbar_mouse,'scrollbar_v_mouse' - - ; width, left, top -edit1 edit_box 0, 0, 0, 0xffffff, 0x6f9480, 0, 0, 0x000000, USERCMD_MAX_SIZE, input_text, mouse_dd, ed_always_focus, 25, 25 - ; xsize, xpos, ysize, ypos, btn_height, max, cur, pos, bgcol, frcol, linecol -scroll1 scrollbar SCROLLBAR_WIDTH, 0, 0, TOP_Y, SCROLLBAR_WIDTH, 0, 0, 0, 0, 0, 0, 1 -scroll2 scrollbar SCROLLBAR_WIDTH, 0, 0, TOP_Y, SCROLLBAR_WIDTH, 0, 0, 0, 0, 0, 0, 1 - -input_text db '/server irc.libera.chat', 0 - rb MAX_COMMAND_LEN - -I_END: - -user_command rb MAX_COMMAND_LEN*4 -.size dd ? - -utf8_bytes_rest dd ? ; bytes rest in current UTF8 sequence -utf8_char dd ? ; first bits of current UTF8 character - -packetbuf rb PACKETBUF_SIZE ; buffer for packets to server -path rb PATH_SIZE -param rb PARAM_SIZE - -servercommand rb SERVERCOMMAND_SIZE - -thread_info process_information -xsize dd ? -ysize dd ? -mouse_dd dd ? - -textbox_height dd ? ; in characters -textbox_width dd ? ; in characters, not pixels ;) - -colors system_colors - -irc_server_name rb MAX_SERVER_NAME ; TODO: move this server URL into window struct -socketnum dd ? ; TODO: same for socket - -user_nick rb MAX_NICK_LEN -user_real_name rb MAX_REAL_LEN -quit_msg rb QUIT_MSG_LEN - -windows rb MAX_WINDOWS*sizeof.window - -IM_END: \ No newline at end of file +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2004-2024. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; IRC client for KolibriOS ;; +;; ;; +;; Written by hidnplayr@kolibrios.org, ;; +;; text encoder/decoder by Clevermouse. ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +version equ '0.36b' + +; connection status +STATUS_DISCONNECTED = 0 +STATUS_RESOLVING = 1 +STATUS_CONNECTING = 2 +STATUS_CONNECTED = 3 +STATUS_LOGGED_IN = 4 + +; window flags +FLAG_UPDATED = 1 shl 0 +FLAG_RECEIVING_NAMES = 1 shl 1 +FLAG_SCROLL_LOW = 1 shl 2 + +; window types +WINDOWTYPE_NONE = 0 +WINDOWTYPE_SERVER = 1 +WINDOWTYPE_CHANNEL = 2 +WINDOWTYPE_CHAT = 3 +WINDOWTYPE_LIST = 4 +WINDOWTYPE_DCC = 5 + +; supported encodings +CP866 = 0 +CP1251 = 1 +UTF8 = 2 + +; settings +USERCMD_MAX_SIZE = 400 + +WIN_MIN_X = 600 +WIN_MIN_Y = 183 + +TEXT_X = 2 +TEXT_Y = TOP_Y + 2 + +TOP_SPACE = 2 +TAB_HEIGHT = 14 +TAB_WIDTH = 120 +TAB_SPACE = 5 +TOP_Y = TOP_SPACE+ TAB_HEIGHT +INPUTBOX_HEIGHT = 13 + +MAX_WINDOWS = 20 +MAX_USERS = 4096 +TEXT_BUFFERSIZE = 1024*1024 + +MAX_NICK_LEN = 32 +MAX_REAL_LEN = 32 ; realname +QUIT_MSG_LEN = 250 +MAX_SERVER_NAME = 256 + +MAX_CHANNEL_LEN = 40 +MAX_CHANNELS = 37 + +MAX_COMMAND_LEN = 512 + +PACKETBUF_SIZE = 1024 +PATH_SIZE = 1024 +PARAM_SIZE = 1024 +SERVERCOMMAND_SIZE = 600 + +TIMESTAMP = 3 ; 3 = hh:mm:ss, 2 = hh:mm, 0 = no timestamp + +MAX_WINDOWNAME_LEN = 256 + +WINDOW_BTN_START = 100 +WINDOW_BTN_CLOSE = 2 +WINDOW_BTN_LIST = 3 + +SCROLLBAR_WIDTH = 14 +USERLIST_WIDTH = 160 + +FONT_WIDTH = 8 +FONT_HEIGHT = 16 + +format binary as "" + +use32 + + org 0x0 + + db 'MENUET01' ; 8 byte id + dd 1 ; header version + dd START ; program start + dd I_END ; program image size + dd IM_END+2048 ; required amount of memory + dd IM_END+2048 + dd param + dd path + +include "../../macros.inc" +include "../../proc32.inc" +include "../../dll.inc" +include "../../network.inc" +include "../../struct.inc" +include "../../develop/libraries/box_lib/box_lib.mac" + +struct window + data_ptr dd ? + flags db ? + type db ? + name rb MAX_WINDOWNAME_LEN + users dd ? + users_scroll dd ? + selected dd ? ; selected user, 0 if none selected + + text_start dd ? ; pointer to current textbox data + text_end dd ? + text_print dd ? ; pointer to first character to print on screen + text_line_print dd ? ; line number of that character + text_write dd ? ; write pointer + text_lines dd ? ; total number of lines + text_scanned dd ? ; pointer to beginning of unscanned data (we still need to count number of lines, insert newline characters,..) + +ends + +struct window_data + text rb TEXT_BUFFERSIZE + names rb MAX_NICK_LEN * MAX_USERS +ends + +include "encodings.inc" +include "window.inc" +include "serverparser.inc" +include "userparser.inc" +include "socket.inc" +include "gui.inc" +include "users.inc" +include "textbox.inc" + + +START: + + mcall 68, 11 ; init heap so we can allocate memory dynamically + +; wanted events + mcall 40, EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_STACK+EVM_MOUSE+EVM_MOUSE_FILTER + +; load libraries + stdcall dll.Load, @IMPORT + test eax, eax + jnz exit + +; find path to main settings file (ircc.ini) + mov edi, path ; Calculate the length of zero-terminated string + xor al, al + mov ecx, PATH_SIZE + repne scasb + dec edi + mov eax, '.ini' + stosd + xor al, al + stosb + +; Fill the window buffer with zeros + mov edi, windows + mov ecx, (sizeof.window*MAX_WINDOWS+3)/4 + xor eax, eax + rep stosd + +; clear command area too + mov edi, servercommand + mov ecx, SERVERCOMMAND_SIZE/4 + rep stosd + +; allocate window data block + mov ebx, windows + call window_create_textbox + test eax, eax + jz exit + mov [ebx + window.type], WINDOWTYPE_SERVER + +; get settings from ini + invoke ini.get_str, path, str_user, str_nick, user_nick, MAX_NICK_LEN, default_nick + invoke ini.get_str, path, str_user, str_real, user_real_name, MAX_REAL_LEN, default_real + invoke ini.get_str, path, str_user, str_quitmsg, quit_msg, 250, default_quit + +; Welcome user + mov esi, str_welcome + call print_asciiz + +; Check if parameter contains an URL + cmp byte[param], 0 + je @f + mov esi, param + mov ecx, PARAM_SIZE + call cmd_usr_server.now + @@: + +redraw: + call draw_window + +mainloop: + mcall 10 ; wait for event + + dec eax + jz redraw + + dec eax + jz main_window_key + + dec eax + jz button + + cmp al, 3 + je mouse + + call process_network_event + + mov edi, [window_active] + test [edi + window.flags], FLAG_UPDATED + jz .no_update + call draw_channel_text + mov edi, [window_active] + cmp [edi + window.type], WINDOWTYPE_CHANNEL + jne .no_update + call draw_user_list + .no_update: + call highlight_updated_tabs + + jmp mainloop + +button: + + mcall 17 ; get id + ror eax, 8 + + cmp ax, 1 ; close program + je quit + + cmp ax, WINDOW_BTN_CLOSE + jne @f + call cmd_usr_close_window + jmp mainloop + + @@: + cmp ax, WINDOW_BTN_LIST + jne @f + + push eax + + mcall 37, 1 ; Get mouse position + sub ax, TEXT_Y + mov bl, FONT_HEIGHT + div bl + and eax, 0x000000ff + inc eax + add eax, [scroll1.position] + mov ebx, [window_active] + mov [ebx + window.selected], eax + + call draw_user_list + + pop eax + test eax, 1 shl 25 ; Right mouse button pressed? + jz mainloop + +; TODO: check if selected nick is my nick! + +; Right mouse BTN was pressed, open chat window + mov ebx, [window_active] + mov eax, [ebx + window.selected] + dec eax + imul eax, MAX_NICK_LEN + mov ebx, [ebx + window.data_ptr] + lea esi, [ebx + window_data.names + eax] +; Strip user prefixes + cmp byte[esi], '~' + je .inc + cmp byte[esi], '&' + je .inc + cmp byte[esi], '@' + je .inc + cmp byte[esi], '%' + je .inc + cmp byte[esi], '+' + je .inc + .open: + call window_open + test ebx, ebx + jz mainloop + mov [window_active], ebx + call redraw + + jmp mainloop + .inc: + inc esi + jmp .open + + @@: + sub ax, WINDOW_BTN_START + jb quit + + cmp ax, MAX_WINDOWS + ja quit + +; Save users scrollbar position + push [scroll1.position] + mov edx, [window_active] + pop [edx + window.users_scroll] + +; OK, time to switch to another window. + mov dx, sizeof.window + mul dx + shl edx, 16 + mov dx, ax + add edx, windows + cmp [edx + window.type], WINDOWTYPE_NONE + je quit + mov [window_active], edx + + push [edx + window.text_line_print] + pop [scroll2.position] + + push [edx + window.users_scroll] + pop [scroll1.position] + + call draw_window + jmp mainloop + +quit: + cmp [socketnum], 0 + je @f + mov esi, quit_msg + call quit_server + @@: + +exit: + +; Close all open windows + call window_close_all + +; Erase RAM areas which could contain the connection details + xor eax, eax + mov edi, irc_server_name + mov ecx, MAX_SERVER_NAME + rep stosb + + mov edi, user_nick + mov ecx, MAX_NICK_LEN + rep stosb + + mov edi, user_real_name + mov ecx, MAX_REAL_LEN + rep stosb + + mov edi, sockaddr1 + mov ecx, SOCKADDR1_SIZE + rep stosb + + mcall -1 + + + +main_window_key: + + mcall 2 + + push dword edit1 + call [edit_box_key] + +; cmp ah, 178 +; jne .no_up +; +; jmp mainloop +; +; +; .no_up: +; cmp ah, 177 +; jne .no_down +; +; jmp mainloop +; +; .no_down: + cmp ah, 13 ; enter + jne no_send2 + + call user_parser + + mov eax, [edit1.size] + + mov [edit1.size], 0 + mov [edit1.pos], 0 + + invoke edit_box_draw, edit1 + + call draw_channel_text + + jmp mainloop + no_send2: + + jmp mainloop + +mouse: + invoke edit_box_mouse, edit1 + +; mcall 37, 7 +; movsx eax, ax +; add [scroll2.position], eax + +; TODO: check if scrollbar is active? + mov edi, [window_active] + cmp [edi + window.type], WINDOWTYPE_CHANNEL + jne @f + push [scroll1.position] + invoke scrollbar_mouse, scroll1 + pop eax + cmp eax, [scroll1.position] ; did the scrollbar move? + je @f + call draw_user_list + @@: + +; TODO: check if scrollbar is active? + mov edi, [window_active] + mov eax, [edi + window.text_lines] + cmp eax, [textbox_height] + jbe @f + invoke scrollbar_mouse, scroll2 + mov edi, [window_active] + and [edi+window.flags], not FLAG_SCROLL_LOW + mov edx, [scroll2.position] + add edx, [scroll2.cur_area] + sub edx, [scroll2.max_area] + jne .not_low + or [edi+window.flags], FLAG_SCROLL_LOW + .not_low: + mov edx, [scroll2.position] + sub edx, [edi + window.text_line_print] + je @f + call draw_channel_text.scroll_to_pos + @@: + + jmp mainloop + + +; DATA AREA + +encoding_text: +db 'CP866 ' +db 'CP1251' +db 'UTF-8 ' +encoding_text_len = 6 + +join_header db 3, '3* ', 0 +quit_header db 3, '5* ', 0 +nick_header db 3, '2* ', 0 +kick_header db 3, '5* ', 0 +mode_header db 3, '2* ', 0 +part_header db 3, '5* ', 0 +topic_header db 3, '3* ', 0 +action_header db 3, '6* ', 0 +ctcp_header db 3, '13-> [', 0 +ctcp_header_recv db 3, '13', 0 +msg_header db 3, '7-> *', 0 +ctcp_version db '] VERSION', 10, 0 +ctcp_ping db '] PING', 10, 0 +ctcp_time db '] TIME', 10, 0 + +has_left_channel db ' has left ', 0 +joins_channel db ' has joined ', 0 +is_now_known_as db ' is now known as ', 0 +has_quit_irc db ' has quit IRC', 10, 0 + +sets_mode db ' sets mode ', 0 +str_kicked db ' is kicked from ', 0 +str_by db ' by ', 0 +str_nickchange db 'Nickname is now ', 0 +str_realchange db 'Real name is now ', 0 +str_talking db 'Now talking in ', 0 +str_topic db 'Topic is "', 0 +str_topic_end db '"', 10, 0 +str_setby db 'Set by ', 0 + +str_connecting db 3, '3* Connecting to ', 0 +str_sockerr db 3, '5* Socket error', 10, 0 +str_dnserr db 3, '5* Unable to resolve hostname', 10, 0 +str_refused db 3, '5* Connection refused', 10, 0 +str_srv_disconnected db 3, '5* Server disconnected', 10, 0 +str_disconnected db 3, '5* Disconnected', 10, 0 +str_reconnect db 3, '5* Connection reset by user', 10, 0 +str_notconnected db 3, '5* You are not connected', 10, 0 +str_notchannel db 3, '5* You are not on a channel', 10, 0 +str_notloggedin db 3, '5* You are not logged in to the server', 10, 0 + +str_1 db 3, '13 -', 0 +str_2 db '- ', 0 + +str_list db 'list', 0 + +str_help db 'The following commands are available:', 10 + db 10 + db '/nick : change nickname', 10 + db '/real : change real name', 10 + db '/server
: connect to server', 10 + db '/code : change codepage (cp866, cp1251, or utf8)', 10 + db '/join : join a channel', 10 + db '/part : part from a channel', 10 + db '/quit : quit server', 10 + db '/msg : send a private message', 10 + db '/ctcp : send a message using client-to-client protocol', 10 + db 10 + db 'Other commands are sent straight to a server', 10 + db 10, 0 + +str_welcome db 3, '3 ___', 3, '7__________', 3, '6_________ ', 3, '4 __ __ __', 10 + db 3, '3| \', 3, '7______ \', 3, '6_ ___ \ ', 3, '4 ____ | | |__| ____ _____/ |_', 10 + db 3, '3| |', 3, '7| _/', 3, '6 \ \/ ', 3, '4 _/ ___\| | | |/ __ \ / \ __\', 10 + db 3, '3| |', 3, '7| | \', 3, '6 \____', 3, '4 \ \___| |_| \ ___/| | \ |', 10 + db 3, '3|___|', 3, '7|____|_ /', 3, '6\______ /', 3, '4 \___ >____/__|\___ >___| /__|', 10 + db 3, '3 ', 3, '7 \/ ', 3, '6 \/ ', 3, '4 \/ \/ \/', 10 + db 'Welcome to KolibriOS IRC client ', version, 10 + db 'Type /help for help', 10, 0 + +str_version db 'VERSION KolibriOS ' +str_programname db 'IRC client ', version, 0 + +str_user db 'user', 0 +str_nick db 'nick', 0 +str_real db 'realname', 0 +str_email db 'email', 0 +str_quitmsg db 'quitmsg', 0 + +default_nick db 'kolibri_user', 0 +default_real db 'Kolibri User', 0 +default_quit db 'KolibriOS forever', 0 + +closing_cross db 'x',0 + +irc_colors dd 0xffffff ; 0 white + dd 0x000000 ; 1 black + dd 0x00007f ; 2 blue (navy) + dd 0x009300 ; 3 green + dd 0xff0000 ; 4 red + dd 0x7f0000 ; 5 brown (maroon) + dd 0x9c009c ; 6 purple + dd 0xfc7f00 ; 7 olive + dd 0xffff00 ; 8 yellow + dd 0x00fc00 ; 9 light green + dd 0x009393 ; 10 teal + dd 0x00ffff ; 11 cyan + dd 0x0000fc ; 12 royal blue + dd 0xff00ff ; 13 pink + dd 0x7f7f7f ; 14 grey + dd 0xd4d0c4 ; 15 light grey (silver) + +sockaddr1: + dw AF_INET4 +.port dw 0x0b1a ; 6667 FIXMEEEEEE +.ip dd 0 + rb 10 + +SOCKADDR1_SIZE = 18 + +status dd STATUS_DISCONNECTED + +window_active dd windows +window_print dd windows + +cmd_remaining dd 0 + +align 4 +@IMPORT: + +library network, 'network.obj',\ + libini, 'libini.obj',\ + boxlib, 'box_lib.obj' + +import network,\ + getaddrinfo, 'getaddrinfo',\ + freeaddrinfo, 'freeaddrinfo',\ + inet_ntoa, 'inet_ntoa' + +import libini,\ + ini.get_str, 'ini_get_str',\ + ini.get_int, 'ini_get_int' + +import boxlib,\ + edit_box_draw, 'edit_box_draw',\ + edit_box_key, 'edit_box_key',\ + edit_box_mouse, 'edit_box_mouse',\ + scrollbar_draw, 'scrollbar_v_draw',\ + scrollbar_mouse,'scrollbar_v_mouse' + + ; width, left, top +edit1 edit_box 0, 0, 0, 0xffffff, 0x6f9480, 0, 0, 0x000000, USERCMD_MAX_SIZE, input_text, mouse_dd, ed_always_focus, 25, 25 + ; xsize, xpos, ysize, ypos, btn_height, max, cur, pos, bgcol, frcol, linecol +scroll1 scrollbar SCROLLBAR_WIDTH, 0, 0, TOP_Y, SCROLLBAR_WIDTH, 0, 0, 0, 0, 0, 0, 1 +scroll2 scrollbar SCROLLBAR_WIDTH, 0, 0, TOP_Y, SCROLLBAR_WIDTH, 0, 0, 0, 0, 0, 0, 1 + +input_text db '/server irc.libera.chat', 0 + rb MAX_COMMAND_LEN + +I_END: + +user_command rb MAX_COMMAND_LEN*4 +.size dd ? + +utf8_bytes_rest dd ? ; bytes rest in current UTF8 sequence +utf8_char dd ? ; first bits of current UTF8 character + +packetbuf rb PACKETBUF_SIZE ; buffer for packets to server +path rb PATH_SIZE +param rb PARAM_SIZE + +servercommand rb SERVERCOMMAND_SIZE + +thread_info process_information +xsize dd ? +ysize dd ? +mouse_dd dd ? + +textbox_height dd ? ; in characters +textbox_width dd ? ; in characters, not pixels ;) + +colors system_colors + +irc_server_name rb MAX_SERVER_NAME ; TODO: move this server URL into window struct +socketnum dd ? ; TODO: same for socket + +user_nick rb MAX_NICK_LEN +user_real_name rb MAX_REAL_LEN +quit_msg rb QUIT_MSG_LEN + +windows rb MAX_WINDOWS*sizeof.window + +IM_END: diff --git a/programs/other/calcplus/calcplus.asm b/programs/other/calcplus/calcplus.asm index 87e6652f9..e15907da1 100644 --- a/programs/other/calcplus/calcplus.asm +++ b/programs/other/calcplus/calcplus.asm @@ -1,734 +1,734 @@ -; SPDX-License-Identifier: GPL-2.0-only -; -; Calc+ - Multifunctional calculator -; Copyright (C) 2014-2025 KolibriOS team -; -; Contributor eAndrew - Main code -; Contributor Leency - Code refactoring and UX/UI update -; Contributor Burer - Code refactoring and UI update - -; ==================================================================== - -use32 -org 0 - -db 'MENUET01' -dd 1 -dd START -dd I_END -dd MEM -dd STACKTOP -dd 0, 0 - -; ==================================================================== - -include "../../proc32.inc" -include "../../macros.inc" -include "../../KOSfuncs.inc" -include "../../encoding.inc" -include "../../dll.inc" -include "../../develop/libraries/box_lib/trunk/box_lib.mac" -include "parser.inc" - -imports: - - library gui, "box_lib.obj" - import gui, editbox.draw, "edit_box", \ - editbox.key, "edit_box_key", \ - editbox.mouse, "edit_box_mouse" - -; ==================================================================== - -LIST_X = 8 -LIST_Y = 47 -LIST_ITEM_H = 26 -LIST_ITEM_W = 295 -LIST_ITEM_COUNT = 8 -LIST_H = LIST_ITEM_H * LIST_ITEM_COUNT -LIST_TEXT_Y = LIST_ITEM_H / 2 - 8 - -KEYB_BTN_W = 37 -KEYB_BTN_H = 37 -GAP = 5 - -KEYBOARD_X = LIST_ITEM_W + 16 -KEYBOARD_Y = LIST_Y -KEYBOARD_W = 190 - -LIST_ITEM_TEXT1 equ dword [sc.work_text] -LIST_ITEM_TEXT2 equ dword [sc.work_text] - -WIN_X = 200 -WIN_Y = 200 -WIN_W = LIST_ITEM_W + KEYBOARD_W + 7 -WIN_H = LIST_H + 60 - -sz_head db "Calc+", 0 -btn_clr db "" ; "Enter" symbol, curved arrow in input area -buttons db "|%^*/-+)(=7894561230" -edb1 edit_box 0, 14, 12, 0xFFFFFF, 0x94AECE, 0xFFC90E, 0xCACACA, 0x10000000, \ - 480, exp, group, ed_always_focus + ed_focus, 0, 0 - -; ==================================================================== - -START: - mov [ans.buffer], dword " = 0" - mov [ans.size], 4 * 8 + 9 - - mcall SF_SET_EVENTS_MASK, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE - - m2m [edb1.color], [scn.gui_face] - - mcall SF_SYS_MISC, SSF_HEAP_INIT - stdcall dll.Load, imports - -; ==================================================================== - -update: - mcall SF_WAIT_EVENT_TIMEOUT, 5 - - cmp eax, EV_REDRAW - je ev_redraw - - cmp eax, EV_KEY - je ev_key - - cmp eax, EV_BUTTON - je ev_button - - cmp eax, EV_MOUSE - je ev_mouse - - jmp update - -; ==================================================================== - -ev_redraw: - mcall SF_REDRAW, SSF_BEGIN_DRAW - mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, sc, sizeof.system_colors - - ; WINDOW - mov edx, [sc.work] - or edx, 0x34 shl 24 - - mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT - mov ecx, WIN_Y shl 16 + WIN_H - add ecx, eax - - mcall SF_GET_SCREEN_SIZE - shr eax, 16 - mov ebx, eax - sub ebx, WIN_W - shr ebx, 1 - - mcall 0, , , , , sz_head - - ; CONTENT - call draw_textbox - call draw_keyb - call draw_list - - mcall SF_REDRAW, SSF_END_DRAW - - jmp update - -; ==================================================================== - -ev_key: - mcall SF_GET_KEY - - cmp ah, 27 - je exit - - cmp ah, 13 - je calc - - invoke editbox.key, edb1 - - jmp update - -; ==================================================================== - -ev_button: - mcall SF_GET_BUTTON - - ; EXIT - cmp ah, 1 - je exit - - cmp ah, 250 - jne @f - mcall SF_FILE, f70_calc - jmp update - - ; DELETE - @@: - cmp ah, 4 - jne .not_del - - cmp [edb1.pos], 0 - je update - mov eax, exp - add eax, [edb1.pos] - dec eax - mov ebx, exp - add ebx, [edb1.size] - inc ebx - - @@: - cmp eax, ebx - je @f - mov cl, [eax + 1] - mov [eax], cl - inc eax - jmp @b - - @@: - dec [edb1.pos] - dec [edb1.size] - m2m [edb1.shift], [edb1.pos] - jmp .redraw - - .not_del: - - ; CALCULATE - cmp ah, 19 - je calc - - ; LIST - cmp ah, 0x60 - jl .not_list - - sub ah, 0x60 - movzx ebx, ah - imul ebx, 512 - add ebx, history - add ebx, 482 - stdcall str_len, ebx - - ; skip first (space) character - test eax, eax - jz .redraw - dec eax - inc ebx - - mov edx, exp - add edx, [edb1.size] - add edx, eax - mov edi, exp - add edi, [edb1.pos] - - @@: - cmp edx, edi - je @f - mov esi, edx - sub esi, eax - push eax - mov al, [esi] - mov [edx], al - pop eax - dec edx - jmp @b - - @@: - add [edb1.size], eax - - @@: - cmp eax, 0 - je @f - mov cl, [ebx] - mov [edi], cl - inc edi - inc ebx - dec eax - inc [edb1.pos] - jmp @b - - @@: - jmp .redraw - - .not_list: - - ; KEYBOARD - cmp ah, 10 - jl update - cmp ah, 50 - jg update - mov dh, ah - - mov ebx, exp - add ebx, [edb1.size] - mov ecx, exp - add ecx, [edb1.pos] - cmp dh, 30 - jl @f - add ebx, 2 - - @@: - cmp ebx, ecx - je @f - mov dl, [ebx - 1] - mov [ebx], dl - dec ebx - jmp @b - - @@: - movzx eax, dh - add eax, buttons - sub eax, 10 - mov al, [eax] - - mov [ebx], al - inc [edb1.size] - inc [edb1.pos] - cmp dh, 30 - jl @f - add [edb1.size], 2 - add [edb1.pos], 2 - - @@: - .redraw: - call draw_textbox - jmp update - -; ==================================================================== - -ev_mouse: - mcall SF_GET_KEY - - invoke editbox.mouse, edb1 - jmp update - -; ==================================================================== - -exit: - mcall SF_TERMINATE_PROCESS - -; ==================================================================== - -calc: - stdcall parse - cmp [error_n], 0 - jne .error - - mov [ans.buffer], dword " = " - - stdcall convert_to_str, eax, ans.buffer + 3 - add eax, 3 - mov edi, eax - imul eax, 8 ; char_w - add eax, 9 - mov [ans.size], eax - - ; HISTORY - mov ecx, LIST_ITEM_COUNT - 1 - mov eax, history - add eax, (LIST_ITEM_COUNT - 1) * 512 - - @@: - mov ebx, eax - sub ebx, 512 - stdcall str_cpy, ebx, eax - add ebx, 480 - add eax, 480 - stdcall str_cpy, ebx, eax - sub ebx, 480 - sub eax, 480 - mov esi, [ebx + 508] - mov [eax + 508], esi - sub eax, 512 - loop @b - - stdcall str_cpy, exp, history - stdcall str_cpy, ans.buffer, history + 480 - mov esi, [ans.size] - mov dword[history + 508], esi - - ; Check length - mov esi, 37 - sub esi, edi - stdcall str_len, exp - sub esi, eax - cmp esi, 0 - jg .redraw - - mov ebx, history - add ebx, eax - add ebx, esi - mov [ebx], dword ".." - - jmp .redraw - - ; ERRORS - .error: - cmp [error_n], 1 - je .err_1 - cmp [error_n], 4 - je .err_4 - - mov [ans.buffer + 0], dword "Expe" - mov [ans.buffer + 4], dword "cted" - mov [ans.buffer + 8], dword " ')'" - mov [ans.buffer + 12], byte 0 - mov [ans.size], 105 - - cmp [error_n], 2 - je .redraw - cmp [error_n], 3 - je .err_3 - cmp [error_n], 5 - je .err_5 - - .err_1: - mov [ans.buffer + 0], dword "Div." - mov [ans.buffer + 4], dword " by " - mov [ans.buffer + 8], byte "0" - mov [ans.buffer + 9], byte 0 - mov [ans.size], 81 - jmp .redraw - - .err_4: - mov [ans.buffer + 0], dword "Inpu" - mov [ans.buffer + 4], dword "t er" - mov [ans.buffer + 8], dword "rror" - mov [ans.buffer + 12], byte 0 - mov [ans.size], 105 - jmp .redraw - - .err_3: - mov [ans.buffer + 10], byte "(" - jmp .redraw - - .err_5: - mov [ans.buffer + 10], byte "|" - jmp .redraw - - .redraw: - - call draw_textbox - call draw_list - jmp update - -; ==================================================================== - -proc draw_textbox - - ; border - mcall SF_DRAW_RECT, , < 8, 30>, [sc.work_graph] - - ; background - mov edx, [scn.gui_face] - cmp [error_n], 0 - je @f - mov edx, 0xFFAAAA - - @@: - mcall SF_DRAW_RECT, , < 9, 28> - mcall , , < 9, 1>, [scn.gui_tb_in_shd] - mcall , , < 10, 27> - - mov ebx, LIST_X + LIST_ITEM_W - 12 - sub ebx, [ans.size] - shl ebx, 16 - add ebx, 16 - mov ecx, [scn.gui_intext] - add ecx, 0x10000000 - or ecx, 1 shl 31 - mcall SF_DRAW_TEXT, , , ans.buffer - - mcall , , [scn.gui_intext], btn_clr, 1 - add ebx, 1 shl 16 - mcall - - mcall SF_DEFINE_BUTTON, , <9, 27>, 4 + BT_HIDE - - mov ebx, LIST_ITEM_W - 18 - sub ebx, [ans.size] - cmp ebx, 24 - jg @f - mov ebx, 24 - - @@: - mov [edb1.width], ebx - m2m [edb1.color] , [scn.gui_face] - m2m [edb1.focus_border_color], [scn.gui_face] - cmp [error_n], 0 - je @f - mov [edb1.color] , 0x00FFAAAA - mov [edb1.focus_border_color], 0x00FFAAAA - - @@: - invoke editbox.draw, edb1 - ret - -endp - -; ==================================================================== - -proc draw_button, x, y - - mcall SF_DEFINE_BUTTON, <[x], KEYB_BTN_W>, <[y], KEYB_BTN_H>, [but_id], [but_c] - - mov ebx, [x] - add ebx, KEYB_BTN_W/2-4 - - shl ebx, 16 - add ebx, [y] - add ebx, KEYB_BTN_H/2 - 6 - or [but_tc], 0x01000000 ; use bigger font - mcall SF_DRAW_TEXT, , [but_tc], [txt_id], [txt_size] - - mov eax, [txt_size] - add [txt_id], eax - inc dword [but_id] - - ret - -endp - -; ==================================================================== - -proc draw_keyb - - mcall SF_DEFINE_BUTTON, , <8, 29>, 250, [sc.work_light] - mov ecx, [sc.work_text] - or ecx, 0x10000000 - mcall SF_DRAW_TEXT, <(KEYB_BTN_W + GAP - engineering_len*2)*2 - GAP/2 + KEYBOARD_X, KEYB_BTN_H / 2 - 10 + 8>, , engineering_str, engineering_len - - mov [txt_size], 1 - mov [but_id], 0x0000000A - mov [txt_id], buttons - - m2m [but_c], [sc.work] - m2m [but_tc], [sc.work_text] - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + (KEYB_BTN_H + GAP)*1 - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + (KEYB_BTN_H + GAP)*4 - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + (KEYB_BTN_H + GAP)*4 - - mov [but_c] , 0x00F0969D - mov [but_tc], 0x00FFFFFF - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y +(KEYB_BTN_H + GAP)*4 - - m2m [but_c] , [sc.work_button] - m2m [but_tc], [sc.work_button_text] - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + KEYB_BTN_H + GAP - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + KEYB_BTN_H + GAP - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + KEYB_BTN_H + GAP - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 - stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + (KEYB_BTN_H + GAP)*4 - - ret - -endp - -; ==================================================================== - -proc draw_list - - ; BACKGROUND - mov eax, SF_DRAW_RECT - mov ebx, LIST_X shl 16 + LIST_ITEM_W - mov ecx, LIST_Y shl 16 + LIST_ITEM_H - mov edx, [sc.work_light] - mov edi, LIST_ITEM_COUNT - - @@: - mcall - ; draw separator { - push ecx edx - sub ecx, LIST_ITEM_H - 1 - mov edx, [sc.work_dark] - mcall - ; } - pop edx ecx - add ecx, LIST_ITEM_H shl 16 - - .next: - dec edi - cmp edi, 0 - jne @b - - mcall , , , [sc.work_dark] - mcall , , - mcall , , - - ; BUTTONS - mov eax, SF_DEFINE_BUTTON - mov ebx, LIST_X shl 16 + (LIST_ITEM_W - 1) - mov ecx, LIST_Y shl 16 + LIST_ITEM_H - mov edx, 0x60 + BT_HIDE - mov edi, LIST_ITEM_COUNT - - @@: - mcall - add ecx, LIST_ITEM_H shl 16 - inc edx - dec edi - cmp edi, 0 - jne @b - - ; TEXT - mov eax, SF_DRAW_TEXT - mov ebx, (LIST_X + LIST_X) shl 16 + LIST_Y + LIST_TEXT_Y + 1 - mov ecx, [sc.work_text] - mov edi, LIST_ITEM_COUNT - - @@: - or ecx, 1 shl 31 - mov edx, history - - @@: - add ecx, 0x10000000 - mcall - - push ebx - add ebx, (LIST_ITEM_W - 8) shl 16 - mov esi, [edx + 508] - shl esi, 16 - sub ebx, esi - add edx, 480 - mcall - pop ebx - - add edx, 32 - add ebx, LIST_ITEM_H - - and ecx, 0xFFFFFF - cmp ecx, LIST_ITEM_TEXT2 - je .set_color_to_2_txt - mov ecx, LIST_ITEM_TEXT2 - jmp .next_txt - - .set_color_to_2_txt: - mov ecx, LIST_ITEM_TEXT1 - - .next_txt: - or ecx, 1 shl 31 - - dec edi - cmp edi, 0 - jne @b - - ret - -endp - -; ==================================================================== - -proc str_len uses ebx, str - - xor eax, eax - mov ebx, [str] - - @@: - cmp [ebx], byte 0 - je @f - inc eax - inc ebx - jmp @b - - @@: - ret - -endp - -; ==================================================================== - -proc str_cpy uses eax ebx ecx, from, to - - mov eax, [from] - mov ebx, [to] - - @@: - cmp [eax], byte 0 - je @f - mov cl, [eax] - mov [ebx], cl - inc eax - inc ebx - jmp @b - - @@: - mov [ebx], byte 0 - ret - -endp - -; ==================================================================== - -if lang eq ru_RU - - engineering_str cp866 "╨Ш╨╜╨╢╨╡╨╜╨╡╤А╨╜╤Л╨╣ ╤А╨╡╨╢╨╕╨╝" - engineering_len = $ - engineering_str - -else if lang eq es_ES - - engineering_str db " Modo ingeniero " - engineering_len = $ - engineering_str -else - - engineering_str db "Engineering calc" - engineering_len = $ - engineering_str - -endf - -; ==================================================================== - -f70_calc: - dd SSF_START_APP - dd 0 - dd 0 - dd 0 - dd 0 - db '/sys/calc', 0 - -; system colors internal -scn: - .gui_tb_in_shd dd 0x00CED0D0 - .gui_face dd 0x00FAF8FA - .gui_text dd 0x10373C42 - .gui_intext dd 0x005F5F5F - .gui_select dd 0x00C7C9C9 - -; ==================================================================== - -I_END: - -rb 2048 - -STACKTOP: - -exp rb 480 -exp_pos rd 1 -exp_lvl rd 1 -abs_lvl rd 1 -group rd 1 - -ans.buffer: rb 480 -ans.size rd 1 -error_n rd 1 - -timer rd 1 -but_id rd 1 -but_c rd 1 -but_tc rd 1 -txt_id rd 1 -txt_size rd 1 - -history rb 512 * LIST_ITEM_COUNT - rb 512 - -sc system_colors - -MEM: +; SPDX-License-Identifier: GPL-2.0-only +; +; Calc+ - Multifunctional calculator +; Copyright (C) 2014-2025 KolibriOS team +; +; Contributor eAndrew - Main code +; Contributor Leency - Code refactoring and UX/UI update +; Contributor Burer - Code refactoring and UI update + +; ==================================================================== + +use32 +org 0 + +db 'MENUET01' +dd 1 +dd START +dd I_END +dd MEM +dd STACKTOP +dd 0, 0 + +; ==================================================================== + +include "../../proc32.inc" +include "../../macros.inc" +include "../../KOSfuncs.inc" +include "../../encoding.inc" +include "../../dll.inc" +include "../../develop/libraries/box_lib/box_lib.mac" +include "parser.inc" + +imports: + + library gui, "box_lib.obj" + import gui, editbox.draw, "edit_box", \ + editbox.key, "edit_box_key", \ + editbox.mouse, "edit_box_mouse" + +; ==================================================================== + +LIST_X = 8 +LIST_Y = 47 +LIST_ITEM_H = 26 +LIST_ITEM_W = 295 +LIST_ITEM_COUNT = 8 +LIST_H = LIST_ITEM_H * LIST_ITEM_COUNT +LIST_TEXT_Y = LIST_ITEM_H / 2 - 8 + +KEYB_BTN_W = 37 +KEYB_BTN_H = 37 +GAP = 5 + +KEYBOARD_X = LIST_ITEM_W + 16 +KEYBOARD_Y = LIST_Y +KEYBOARD_W = 190 + +LIST_ITEM_TEXT1 equ dword [sc.work_text] +LIST_ITEM_TEXT2 equ dword [sc.work_text] + +WIN_X = 200 +WIN_Y = 200 +WIN_W = LIST_ITEM_W + KEYBOARD_W + 7 +WIN_H = LIST_H + 60 + +sz_head db "Calc+", 0 +btn_clr db "" ; "Enter" symbol, curved arrow in input area +buttons db "|%^*/-+)(=7894561230" +edb1 edit_box 0, 14, 12, 0xFFFFFF, 0x94AECE, 0xFFC90E, 0xCACACA, 0x10000000, \ + 480, exp, group, ed_always_focus + ed_focus, 0, 0 + +; ==================================================================== + +START: + mov [ans.buffer], dword " = 0" + mov [ans.size], 4 * 8 + 9 + + mcall SF_SET_EVENTS_MASK, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + + m2m [edb1.color], [scn.gui_face] + + mcall SF_SYS_MISC, SSF_HEAP_INIT + stdcall dll.Load, imports + +; ==================================================================== + +update: + mcall SF_WAIT_EVENT_TIMEOUT, 5 + + cmp eax, EV_REDRAW + je ev_redraw + + cmp eax, EV_KEY + je ev_key + + cmp eax, EV_BUTTON + je ev_button + + cmp eax, EV_MOUSE + je ev_mouse + + jmp update + +; ==================================================================== + +ev_redraw: + mcall SF_REDRAW, SSF_BEGIN_DRAW + mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, sc, sizeof.system_colors + + ; WINDOW + mov edx, [sc.work] + or edx, 0x34 shl 24 + + mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT + mov ecx, WIN_Y shl 16 + WIN_H + add ecx, eax + + mcall SF_GET_SCREEN_SIZE + shr eax, 16 + mov ebx, eax + sub ebx, WIN_W + shr ebx, 1 + + mcall 0, , , , , sz_head + + ; CONTENT + call draw_textbox + call draw_keyb + call draw_list + + mcall SF_REDRAW, SSF_END_DRAW + + jmp update + +; ==================================================================== + +ev_key: + mcall SF_GET_KEY + + cmp ah, 27 + je exit + + cmp ah, 13 + je calc + + invoke editbox.key, edb1 + + jmp update + +; ==================================================================== + +ev_button: + mcall SF_GET_BUTTON + + ; EXIT + cmp ah, 1 + je exit + + cmp ah, 250 + jne @f + mcall SF_FILE, f70_calc + jmp update + + ; DELETE + @@: + cmp ah, 4 + jne .not_del + + cmp [edb1.pos], 0 + je update + mov eax, exp + add eax, [edb1.pos] + dec eax + mov ebx, exp + add ebx, [edb1.size] + inc ebx + + @@: + cmp eax, ebx + je @f + mov cl, [eax + 1] + mov [eax], cl + inc eax + jmp @b + + @@: + dec [edb1.pos] + dec [edb1.size] + m2m [edb1.shift], [edb1.pos] + jmp .redraw + + .not_del: + + ; CALCULATE + cmp ah, 19 + je calc + + ; LIST + cmp ah, 0x60 + jl .not_list + + sub ah, 0x60 + movzx ebx, ah + imul ebx, 512 + add ebx, history + add ebx, 482 + stdcall str_len, ebx + + ; skip first (space) character + test eax, eax + jz .redraw + dec eax + inc ebx + + mov edx, exp + add edx, [edb1.size] + add edx, eax + mov edi, exp + add edi, [edb1.pos] + + @@: + cmp edx, edi + je @f + mov esi, edx + sub esi, eax + push eax + mov al, [esi] + mov [edx], al + pop eax + dec edx + jmp @b + + @@: + add [edb1.size], eax + + @@: + cmp eax, 0 + je @f + mov cl, [ebx] + mov [edi], cl + inc edi + inc ebx + dec eax + inc [edb1.pos] + jmp @b + + @@: + jmp .redraw + + .not_list: + + ; KEYBOARD + cmp ah, 10 + jl update + cmp ah, 50 + jg update + mov dh, ah + + mov ebx, exp + add ebx, [edb1.size] + mov ecx, exp + add ecx, [edb1.pos] + cmp dh, 30 + jl @f + add ebx, 2 + + @@: + cmp ebx, ecx + je @f + mov dl, [ebx - 1] + mov [ebx], dl + dec ebx + jmp @b + + @@: + movzx eax, dh + add eax, buttons + sub eax, 10 + mov al, [eax] + + mov [ebx], al + inc [edb1.size] + inc [edb1.pos] + cmp dh, 30 + jl @f + add [edb1.size], 2 + add [edb1.pos], 2 + + @@: + .redraw: + call draw_textbox + jmp update + +; ==================================================================== + +ev_mouse: + mcall SF_GET_KEY + + invoke editbox.mouse, edb1 + jmp update + +; ==================================================================== + +exit: + mcall SF_TERMINATE_PROCESS + +; ==================================================================== + +calc: + stdcall parse + cmp [error_n], 0 + jne .error + + mov [ans.buffer], dword " = " + + stdcall convert_to_str, eax, ans.buffer + 3 + add eax, 3 + mov edi, eax + imul eax, 8 ; char_w + add eax, 9 + mov [ans.size], eax + + ; HISTORY + mov ecx, LIST_ITEM_COUNT - 1 + mov eax, history + add eax, (LIST_ITEM_COUNT - 1) * 512 + + @@: + mov ebx, eax + sub ebx, 512 + stdcall str_cpy, ebx, eax + add ebx, 480 + add eax, 480 + stdcall str_cpy, ebx, eax + sub ebx, 480 + sub eax, 480 + mov esi, [ebx + 508] + mov [eax + 508], esi + sub eax, 512 + loop @b + + stdcall str_cpy, exp, history + stdcall str_cpy, ans.buffer, history + 480 + mov esi, [ans.size] + mov dword[history + 508], esi + + ; Check length + mov esi, 37 + sub esi, edi + stdcall str_len, exp + sub esi, eax + cmp esi, 0 + jg .redraw + + mov ebx, history + add ebx, eax + add ebx, esi + mov [ebx], dword ".." + + jmp .redraw + + ; ERRORS + .error: + cmp [error_n], 1 + je .err_1 + cmp [error_n], 4 + je .err_4 + + mov [ans.buffer + 0], dword "Expe" + mov [ans.buffer + 4], dword "cted" + mov [ans.buffer + 8], dword " ')'" + mov [ans.buffer + 12], byte 0 + mov [ans.size], 105 + + cmp [error_n], 2 + je .redraw + cmp [error_n], 3 + je .err_3 + cmp [error_n], 5 + je .err_5 + + .err_1: + mov [ans.buffer + 0], dword "Div." + mov [ans.buffer + 4], dword " by " + mov [ans.buffer + 8], byte "0" + mov [ans.buffer + 9], byte 0 + mov [ans.size], 81 + jmp .redraw + + .err_4: + mov [ans.buffer + 0], dword "Inpu" + mov [ans.buffer + 4], dword "t er" + mov [ans.buffer + 8], dword "rror" + mov [ans.buffer + 12], byte 0 + mov [ans.size], 105 + jmp .redraw + + .err_3: + mov [ans.buffer + 10], byte "(" + jmp .redraw + + .err_5: + mov [ans.buffer + 10], byte "|" + jmp .redraw + + .redraw: + + call draw_textbox + call draw_list + jmp update + +; ==================================================================== + +proc draw_textbox + + ; border + mcall SF_DRAW_RECT, , < 8, 30>, [sc.work_graph] + + ; background + mov edx, [scn.gui_face] + cmp [error_n], 0 + je @f + mov edx, 0xFFAAAA + + @@: + mcall SF_DRAW_RECT, , < 9, 28> + mcall , , < 9, 1>, [scn.gui_tb_in_shd] + mcall , , < 10, 27> + + mov ebx, LIST_X + LIST_ITEM_W - 12 + sub ebx, [ans.size] + shl ebx, 16 + add ebx, 16 + mov ecx, [scn.gui_intext] + add ecx, 0x10000000 + or ecx, 1 shl 31 + mcall SF_DRAW_TEXT, , , ans.buffer + + mcall , , [scn.gui_intext], btn_clr, 1 + add ebx, 1 shl 16 + mcall + + mcall SF_DEFINE_BUTTON, , <9, 27>, 4 + BT_HIDE + + mov ebx, LIST_ITEM_W - 18 + sub ebx, [ans.size] + cmp ebx, 24 + jg @f + mov ebx, 24 + + @@: + mov [edb1.width], ebx + m2m [edb1.color] , [scn.gui_face] + m2m [edb1.focus_border_color], [scn.gui_face] + cmp [error_n], 0 + je @f + mov [edb1.color] , 0x00FFAAAA + mov [edb1.focus_border_color], 0x00FFAAAA + + @@: + invoke editbox.draw, edb1 + ret + +endp + +; ==================================================================== + +proc draw_button, x, y + + mcall SF_DEFINE_BUTTON, <[x], KEYB_BTN_W>, <[y], KEYB_BTN_H>, [but_id], [but_c] + + mov ebx, [x] + add ebx, KEYB_BTN_W/2-4 + + shl ebx, 16 + add ebx, [y] + add ebx, KEYB_BTN_H/2 - 6 + or [but_tc], 0x01000000 ; use bigger font + mcall SF_DRAW_TEXT, , [but_tc], [txt_id], [txt_size] + + mov eax, [txt_size] + add [txt_id], eax + inc dword [but_id] + + ret + +endp + +; ==================================================================== + +proc draw_keyb + + mcall SF_DEFINE_BUTTON, , <8, 29>, 250, [sc.work_light] + mov ecx, [sc.work_text] + or ecx, 0x10000000 + mcall SF_DRAW_TEXT, <(KEYB_BTN_W + GAP - engineering_len*2)*2 - GAP/2 + KEYBOARD_X, KEYB_BTN_H / 2 - 10 + 8>, , engineering_str, engineering_len + + mov [txt_size], 1 + mov [but_id], 0x0000000A + mov [txt_id], buttons + + m2m [but_c], [sc.work] + m2m [but_tc], [sc.work_text] + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + (KEYB_BTN_H + GAP)*1 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + (KEYB_BTN_H + GAP)*4 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + (KEYB_BTN_H + GAP)*4 + + mov [but_c] , 0x00F0969D + mov [but_tc], 0x00FFFFFF + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y +(KEYB_BTN_H + GAP)*4 + + m2m [but_c] , [sc.work_button] + m2m [but_tc], [sc.work_button_text] + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + KEYB_BTN_H + GAP + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + KEYB_BTN_H + GAP + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + KEYB_BTN_H + GAP + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + (KEYB_BTN_H + GAP)*4 + + ret + +endp + +; ==================================================================== + +proc draw_list + + ; BACKGROUND + mov eax, SF_DRAW_RECT + mov ebx, LIST_X shl 16 + LIST_ITEM_W + mov ecx, LIST_Y shl 16 + LIST_ITEM_H + mov edx, [sc.work_light] + mov edi, LIST_ITEM_COUNT + + @@: + mcall + ; draw separator { + push ecx edx + sub ecx, LIST_ITEM_H - 1 + mov edx, [sc.work_dark] + mcall + ; } + pop edx ecx + add ecx, LIST_ITEM_H shl 16 + + .next: + dec edi + cmp edi, 0 + jne @b + + mcall , , , [sc.work_dark] + mcall , , + mcall , , + + ; BUTTONS + mov eax, SF_DEFINE_BUTTON + mov ebx, LIST_X shl 16 + (LIST_ITEM_W - 1) + mov ecx, LIST_Y shl 16 + LIST_ITEM_H + mov edx, 0x60 + BT_HIDE + mov edi, LIST_ITEM_COUNT + + @@: + mcall + add ecx, LIST_ITEM_H shl 16 + inc edx + dec edi + cmp edi, 0 + jne @b + + ; TEXT + mov eax, SF_DRAW_TEXT + mov ebx, (LIST_X + LIST_X) shl 16 + LIST_Y + LIST_TEXT_Y + 1 + mov ecx, [sc.work_text] + mov edi, LIST_ITEM_COUNT + + @@: + or ecx, 1 shl 31 + mov edx, history + + @@: + add ecx, 0x10000000 + mcall + + push ebx + add ebx, (LIST_ITEM_W - 8) shl 16 + mov esi, [edx + 508] + shl esi, 16 + sub ebx, esi + add edx, 480 + mcall + pop ebx + + add edx, 32 + add ebx, LIST_ITEM_H + + and ecx, 0xFFFFFF + cmp ecx, LIST_ITEM_TEXT2 + je .set_color_to_2_txt + mov ecx, LIST_ITEM_TEXT2 + jmp .next_txt + + .set_color_to_2_txt: + mov ecx, LIST_ITEM_TEXT1 + + .next_txt: + or ecx, 1 shl 31 + + dec edi + cmp edi, 0 + jne @b + + ret + +endp + +; ==================================================================== + +proc str_len uses ebx, str + + xor eax, eax + mov ebx, [str] + + @@: + cmp [ebx], byte 0 + je @f + inc eax + inc ebx + jmp @b + + @@: + ret + +endp + +; ==================================================================== + +proc str_cpy uses eax ebx ecx, from, to + + mov eax, [from] + mov ebx, [to] + + @@: + cmp [eax], byte 0 + je @f + mov cl, [eax] + mov [ebx], cl + inc eax + inc ebx + jmp @b + + @@: + mov [ebx], byte 0 + ret + +endp + +; ==================================================================== + +if lang eq ru_RU + + engineering_str cp866 "╨Ш╨╜╨╢╨╡╨╜╨╡╤А╨╜╤Л╨╣ ╤А╨╡╨╢╨╕╨╝" + engineering_len = $ - engineering_str + +else if lang eq es_ES + + engineering_str db " Modo ingeniero " + engineering_len = $ - engineering_str +else + + engineering_str db "Engineering calc" + engineering_len = $ - engineering_str + +endf + +; ==================================================================== + +f70_calc: + dd SSF_START_APP + dd 0 + dd 0 + dd 0 + dd 0 + db '/sys/calc', 0 + +; system colors internal +scn: + .gui_tb_in_shd dd 0x00CED0D0 + .gui_face dd 0x00FAF8FA + .gui_text dd 0x10373C42 + .gui_intext dd 0x005F5F5F + .gui_select dd 0x00C7C9C9 + +; ==================================================================== + +I_END: + +rb 2048 + +STACKTOP: + +exp rb 480 +exp_pos rd 1 +exp_lvl rd 1 +abs_lvl rd 1 +group rd 1 + +ans.buffer: rb 480 +ans.size rd 1 +error_n rd 1 + +timer rd 1 +but_id rd 1 +but_c rd 1 +but_tc rd 1 +txt_id rd 1 +txt_size rd 1 + +history rb 512 * LIST_ITEM_COUNT + rb 512 + +sc system_colors + +MEM: diff --git a/programs/other/cnc_control/cnc_control.asm b/programs/other/cnc_control/cnc_control.asm index 0f4f9fbb8..38d4631ff 100644 --- a/programs/other/cnc_control/cnc_control.asm +++ b/programs/other/cnc_control/cnc_control.asm @@ -1,1075 +1,1080 @@ -;CNC CONTROL -;Igor Afanasyev (aka IgorA) and Sergey Efremenkov (aka theonlymirage), 2020 - -;02.10.18 - Only prototype UI -;08.10.18 - Add ComboBox (Button + KMenu), small text - -format binary as "" -use32 - org 0 - db 'MENUET01' - dd 1,start,i_end,mem,stacktop,file_name,sys_path - -include '../../macros.inc' -include '../../proc32.inc' -include '../../KOSfuncs.inc' -include '../../load_img.inc' -include '../../load_lib.mac' -include '../../develop/libraries/libs-dev/libimg/libimg.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' -include 'lang.inc' -include 'cnc_control.inc' -include '../../develop/info3ds/info_fun_float.inc' - -KMENUITEM_NORMAL equ 0 -KMENUITEM_SUBMENU equ 1 -KMENUITEM_SEPARATOR equ 2 - -@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'CNC Control 18.12.20',0 ;подпись окна - -run_file_70 FileInfoBlock - -offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера - -IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 -image_data_toolbar dd 0 ;указатель на временную память. для нужен преобразования изображения -icon_tl_sys dd 0 ;указатель на память для хранения системных иконок -icon_toolbar dd 0 ;указатель на память для хранения иконок объектов - -align 4 -start: - ;--- copy cmd line --- - mov esi,file_name - mov edi,openfile_path -@@: - lodsd - or eax,eax - jz @f ;выход, если 0 - stosd - jmp @b -@@: - stosd - - load_libraries l_libs_start,l_libs_end - ;проверка на сколько удачно загузилась библиотека - mov ebp,lib_0 - 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,0xC0000027 - stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога - - stdcall [buf2d_create], buf_0 ;создание буфера - - ;шрифт делаем до создания панели (для экономии указателя image_data_toolbar) - include_image_file '..\..\fs\kfar\trunk\font6x9.bmp', image_data_toolbar, buf_1.w,buf_1.h - stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер - stdcall mem.Free,[image_data_toolbar] ;освобождаем память - stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит - stdcall [buf2d_convert_text_matrix], buf_1 - mov eax,[buf_1.h] - shr eax,8 - mov [font_h],eax - - include_image_file 'toolbar.png', image_data_toolbar - - ;*** установка времени для таймера - mcall SF_SYSTEM_GET,SSF_TIME_COUNT - mov [last_time],eax - - ;call but_new_file - option_boxes_set_sys_color sc,opt_grlist1 - - ;progress bar - mov [pb.left], dword 50 - mov [pb.top], dword 30 - mov [pb.width], dword 350 - mov [pb.height], dword 17 - mov [pb.max], dword 100;599 - mov [pb.min], dword 0 ;-397 - mov [pb.value], dword 0 ;-397 - mov [pb.back_color], dword 00C8D0D4h - mov [pb.progress_color], dword 8072B7EBh - mov [pb.frame_color], dword 00406175h - - ;port menu - stdcall [kmenu_init], sc ;kmenu initialisation - ;stdcall [ksubmenu_new] - ;mov [main_menu], eax - - stdcall [ksubmenu_new] - mov [port_menu], eax - stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_COMport, 110 - stdcall [ksubmenu_add], [port_menu], eax - stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_USBport, 111 - stdcall [ksubmenu_add], [port_menu], eax - ;stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0 - ;stdcall [ksubmenu_add], [port_menu], eax - ;stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_OTHERport, 112 - ;stdcall [ksubmenu_add], [port_menu], eax - stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_PortMenu, [port_menu] - ;stdcall [ksubmenu_add], [main_menu], eax - - ;open file from cmd line - cmp dword[openfile_path],0 - je @f - call but_open_file.no_dlg - @@: - -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 - jne @f - call timer_funct - jmp still - @@: - - cmp al,1 - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - cmp al,6 - jne @f - mcall SF_THREAD_INFO,procinfo,-1 - cmp ax,word[procinfo.window_stack_position] - jne @f ;окно не активно - call mouse - @@: - jmp still - -align 4 -mouse: - stdcall [option_box_mouse], opt_grlist1 - stdcall [edit_box_mouse], editFileName - stdcall [edit_box_mouse], editCommand - stdcall [kmainmenu_dispatch_cursorevent], [port_menu] ;[main_menu] - - push eax ebx ecx - mcall SF_MOUSE_GET,SSF_BUTTON_EXT - bt eax,8 - jnc @f - ;mouse l. but. press - call mouse_left_d - jmp .end_l - @@: - bt eax,16 - jnc .end_l - ;mouse l. but. up - call mouse_left_u - ;jmp .end_l - .end_l: - - - call buf_get_mouse_coord - cmp eax,-1 - je .end0 - shl eax,1 - sub eax,[buf_0.w] - sar eax,1 - mov [mouse_prop_x],eax - mov ecx,ObjData - shl ebx,1 - sub ebx,[buf_0.h] - sar ebx,1 - mov [mouse_prop_y],ebx - - mcall SF_MOUSE_GET,SSF_SCROLL_DATA - test ax,ax - jz .end0 - finit - fld qword[zoom_plus] - fld1 - fsubp - fld st0 ;for Y coord - - ;for X coord - fild dword[mouse_prop_x] - fmulp st1,st0 - - mov ebx,eax - test ax,0x8000 - jnz .decr - ;увеличение масштаба - fchs - fild dword[ecx+Figure.MCentrX] ;add old value - fmul qword[zoom_plus] - faddp - - fld qword[ecx+Figure.MScale] - fmul qword[zoom_plus] - ;if (Figure.MScale>16.0) - ;... - jmp @f - .decr: - ;уменьшение масштаба - fild dword[ecx+Figure.MCentrX] ;add old value - fdiv qword[zoom_plus] - faddp - - fld qword[ecx+Figure.MScale] - fdiv qword[zoom_plus] - fld1 - fcomp - fstsw ax - sahf - jbe @f - ;if (Figure.MScale<1.0) - ffree st0 - fincstp - ffree st0 - fincstp - fldz ;default Figure.MCentrX - fld1 ;default Figure.MScale - mov dword[ecx+Figure.MCentrY],0 - @@: - fstp qword[ecx+Figure.MScale] - fistp dword[ecx+Figure.MCentrX] - - ;for Y coord - fild dword[mouse_prop_y] - fmulp st1,st0 - test bx,0x8000 - jnz .decr_y - ;увеличение масштаба - fild dword[ecx+Figure.MCentrY] ;add old value - fmul qword[zoom_plus] - faddp - jmp @f - .decr_y: - ;уменьшение масштаба - fchs - fild dword[ecx+Figure.MCentrY] ;add old value - fdiv qword[zoom_plus] - faddp - @@: - fistp dword[ecx+Figure.MCentrY] - - mov dword[offs_last_timer],0 - .end0: - - pop ecx ebx eax - ret - -;output: -; eax - buffer coord X (если курсор за буфером -1) -; ebx - buffer coord Y (если курсор за буфером -1) -align 4 -proc buf_get_mouse_coord - mcall SF_MOUSE_GET,SSF_WINDOW_POSITION - cmp ax,word[buf_0.t] - jl .no_buf ;не попали в окно буфера по оси y - mov ebx,eax - shr ebx,16 - cmp bx,word[buf_0.l] - jl .no_buf ;не попали в окно буфера по оси x - - and eax,0xffff ;оставляем координату y - sub ax,word[buf_0.t] - cmp eax,[buf_0.h] - jg .no_buf - sub bx,word[buf_0.l] - cmp ebx,[buf_0.w] - jg .no_buf - xchg eax,ebx - jmp .end_f - .no_buf: - xor eax,eax - not eax - xor ebx,ebx - not ebx - .end_f: - ret -endp - -align 4 -proc timer_funct uses eax ebx - mcall SF_SYSTEM_GET,SSF_TIME_COUNT - mov [last_time],eax - - cmp dword[offs_last_timer],ObjData - je @f - mov dword[offs_last_timer],ObjData - stdcall draw_obj2d,ObjData - stdcall [buf2d_draw], buf_0 - @@: - ret -endp - -WINDOW_WIDTH = 775 -WINDOW_HEIGHT = 445 - -align 4 -draw_window: -pushad - mcall SF_REDRAW,SSF_BEGIN_DRAW - - ; *** рисование главного окна (выполняется 1 раз при запуске) *** - mov edx,[sc.work] - or edx,0x33000000 - mov edi,caption - mcall SF_CREATE_WINDOW,(20 shl 16)+WINDOW_WIDTH,(20 shl 16)+WINDOW_HEIGHT - - mov ecx,[ObjData.FigCount] - or ecx,ecx - jz .end0 - mov eax,[ObjData.FigData] - xor edx,edx - .cycle0: - stdcall FigCalculateSizes,[eax+4*edx],0 - inc edx - loop .cycle0 - stdcall ObjCalculateScale,ObjData - mov dword[offs_last_timer],0 - call timer_funct - .end0: - - stdcall [edit_box_draw], editFileName - stdcall [edit_box_draw], editCommand - - stdcall [option_box_draw], opt_grlist1 - push pb - call [progressbar_draw] - - ; *** создание кнопок на панель *** - mcall SF_DEFINE_BUTTON,(731 shl 16)+20,(75 shl 16)+20,3, [sc.work_button] - mcall , (15 shl 16)+20,(27 shl 16)+20,4 ;restore - mcall ,(538 shl 16)+20,,5 ;connect - mcall ,(563 shl 16)+20,,6 ;close connect - mcall ,(437 shl 16)+86,(378 shl 16)+20,7 ;cancel - mcall ,(616 shl 16)+136,(378 shl 16)+20,8 ;run - - ; *** - mov ecx,[sc.work_text] - or ecx,0x80000000 ;0x81000000 - textYcoord = 13;5 - mcall SF_DRAW_TEXT,(15 shl 16)+textYcoord,,txt_preview - mcall ,(424 shl 16)+textYcoord,,txt_port - mov ecx,[sc.work_button_text] - or ecx,0x81000000 - mcall ,(440 shl 16)+381,,txt_but_cancel - mcall ,(619 shl 16)+381,,txt_but_run - - ; *** рисование иконок на кнопках *** - mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16,(733 shl 16)+77 ;icon open - - add ebx,IMAGE_TOOLBAR_ICON_SIZE - mcall ,,,(17 shl 16)+29 ;restore scale - add ebx,IMAGE_TOOLBAR_ICON_SIZE - mcall ,,,(540 shl 16)+29 ;connect - add ebx,IMAGE_TOOLBAR_ICON_SIZE - mcall ,,,(565 shl 16)+29 ;close connect - ;;add ebx,IMAGE_TOOLBAR_ICON_SIZE - ;;mcall ,,,(439 shl 16)+380 ;cancel - add ebx,IMAGE_TOOLBAR_ICON_SIZE - mcall ,,,((638+97) shl 16)+380 ;run - - stdcall [buf2d_draw], buf_0 - - ;delete port button, if it exist - mov edx, 0x80000008 - mcall SF_DEFINE_BUTTON - ;draw button PORT - buttonPortX = 433 - buttonPortY = 27 ;50 - buttonPortTextXoffset = 5 - mov esi, 0x00AABBCC ;color button - mcall SF_DEFINE_BUTTON, buttonPortX*65536 + 95, buttonPortY*65536 + 20, 8 - ;draw text for button PORT - mov ebx, (buttonPortX+buttonPortTextXoffset) * 65536 + (buttonPortY+6) ;(x, y) - mov esi, 11 - mcall SF_DRAW_TEXT,, 0xFFFFFF, sz_PortMenu - ;stdcall [kmainmenu_draw], [main_menu] - ;mov word[coord.x], 0 - ;mov word[coord.y], 0 - ;stdcall [ksubmenu_draw], [port_menu], coord - - mcall SF_REDRAW,SSF_END_DRAW -popad - ret - -align 4 -key: - mcall SF_GET_KEY - - stdcall [edit_box_key], editFileName - stdcall [edit_box_key], editCommand - - mov ecx,eax - mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS - bt eax,2 ;left Ctrl - jc .key_Ctrl - bt eax,3 ;right Ctrl - jc .key_Ctrl - jmp .end0 - .key_Ctrl: - cmp ch,15 ;111 ;Ctrl+O - jne @f - call but_open_file - @@: - .end0: - jmp still - -align 4 -button: - mcall SF_GET_BUTTON - - cmp ah,3 - jne @f - call but_open_file - jmp still - @@: - cmp ah,4 - jne @f - call but_restore_zoom - jmp still - @@: - cmp ah, 8 - jne @f - push eax ebx ecx - mcall SF_THREAD_INFO, pi, -1 ;get window coord - - mov eax, dword[pi+34] - add eax, buttonPortX + 5 - mov word[coord.x], ax - - mov eax, dword[pi+38] - add eax, buttonPortY + 42 - mov word[coord.y], ax - - stdcall [ksubmenu_draw], [port_menu], coord - pop ecx ebx eax - @@: - ;cmp ah,5 - ;jne @f - ;call but_... - ;jmp still - ;@@: - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 - stdcall mem.Free,[image_data_toolbar] - stdcall mem.Free,[open_file_data] - mcall SF_TERMINATE_PROCESS - - - -align 4 -open_file_data dd 0 ;указатель на память для открытия файлов -open_file_size dd 0 ;размер открытого файла - -align 4 -but_open_file: - copy_path open_dialog_name,communication_area_default_path,file_name,0 - pushad - mov [OpenDialog_data.type],0 - stdcall [OpenDialog_Start],OpenDialog_data - cmp [OpenDialog_data.status],2 - je .end_open_file - ;код при удачном открытии диалога - jmp .end0 -.no_dlg: ;если минуем диалог открытия файла - pushad - mov esi,openfile_path - stdcall str_len,esi - add esi,eax - @@: ;цикл для поиска начала имени файла - dec esi - cmp byte[esi],'/' - je @f - cmp byte[esi],0x5c ;'\' - je @f - cmp esi,openfile_path - jg @b - @@: - inc esi - stdcall [OpenDialog_Set_file_name],OpenDialog_data,esi ;копируем имя файла в диалог сохранения - .end0: - push eax ebx ecx edx ;copy file name path from OpenDialog - mov eax, openfile_path - mov ebx, fileNameBuffer ;.data - mov ecx, 0 - @@: - mov dl, byte[eax] - cmp dl, 0 ;byte[eax], 0 - je @f - mov byte[ebx], dl - inc eax - inc ebx - inc ecx - jmp @b - @@: - mov byte[ebx], 0 - mov dword[fileNameBuffer.size], ecx - mov dword[editFileName.size], ecx - mov dword[editFileName.pos], ecx - pop edx ecx ebx eax - - mov [run_file_70.Function], SSF_GET_INFO - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], 0 - mov dword[run_file_70.Buffer], open_b - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], openfile_path - mcall SF_FILE,run_file_70 - - mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах - inc ecx ;for text files - stdcall mem.ReAlloc,[open_file_data],ecx - mov [open_file_data],eax - dec ecx ;for text files - mov byte[eax+ecx],0 ;for text files - - 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], ecx - m2m dword[run_file_70.Buffer], dword[open_file_data] - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], openfile_path - mcall SF_FILE,run_file_70 ;загружаем файл изображения - test eax,eax - jnz .end_open_file - cmp ebx,0xffffffff - je .end_open_file - mov [open_file_size],ebx - mcall SF_SET_CAPTION,1,openfile_path - - stdcall FileInit,[open_file_data],[open_file_size] - stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер - stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране - .end_open_file: - popad - ret - -;output: -; ecx - memory size for save file -align 4 -proc get_file_save_size uses eax ebx edx esi - mov ecx,100 ;title - mov ebx,ObjData - add ecx,50 ;object - mov edx,[ebx+Object.FigCount] - or edx,edx - jz .cycle1end - mov esi,[ebx+Object.FigData] -align 4 - .cycle1: ; цикл по фигурам - add ecx,80 ;figure - mov eax,[esi] - or eax,eax - jz @f - mov eax,[eax+Figure.PoiCount] - imul eax,70 - add ecx,eax ;points - @@: - add esi,4 - dec edx - jnz .cycle1 - .cycle1end: - ret -endp - -align 4 -proc but_restore_zoom - finit - fld1 - fstp qword[ObjData.MScale] - mov dword[ObjData.MCentrX],0 - mov dword[ObjData.MCentrY],0 - mov dword[offs_last_timer],0 - 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 - @@: - or ecx,ecx ;если число отрицательное - jnz @f - sub ecx,eax - mov eax,ecx - @@: - 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 '/sys',0 - -communication_area_name: - db 'FFFFFFFF_open_dialog',0 -open_dialog_name: - db 'opendial',0 -communication_area_default_path: - db '/sys/File managers/',0 - -Filter: -dd Filter.end - Filter ;.1 -.1: -db 'NC',0 -db 'PNG',0 -.end: -db 0 - - -;[ -;for test -main_menu dd 0 -port_menu dd 0 - -sz_PortMenu db 'COM 12 ',0 -sz_COMport db 'COM port 12',0 -sz_USBport db 'USB port ',0 -sz_OTHERport db 'Other port ',0 - -coord: - .x dw 100 - .y dw 200 -;] - -align 4 -system_dir_0 db '/sys/lib/' -lib_name_0 db 'proc_lib.obj',0 -system_dir_1 db '/sys/lib/' -lib_name_1 db 'libimg.obj',0 -system_dir_2 db '/sys/lib/' -lib_name_2 db 'buf2d.obj',0 -system_dir_3 db '/sys/lib/' -lib_name_3 db 'box_lib.obj',0 -system_dir_4 db '/sys/lib/' -lib_name_4 db 'kmenu.obj',0 - -align 4 -l_libs_start: - lib_0 l_libs lib_name_0, file_name, system_dir_0, import_proclib - lib_1 l_libs lib_name_1, file_name, system_dir_1, import_libimg - lib_2 l_libs lib_name_2, file_name, system_dir_2, import_buf2d - lib_3 l_libs lib_name_3, file_name, system_dir_3, import_box_lib - lib_4 l_libs lib_name_4, file_name, system_dir_4, import_libkmenu -l_libs_end: - -align 4 -import_libimg: - 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 -import_proclib: - OpenDialog_Init dd aOpenDialog_Init - OpenDialog_Start dd aOpenDialog_Start - OpenDialog_Set_file_name dd aOpenDialog_Set_file_name - ;OpenDialog_Set_file_ext dd aOpenDialog_Set_file_ext -dd 0,0 - aOpenDialog_Init db 'OpenDialog_init',0 - aOpenDialog_Start db 'OpenDialog_start',0 - aOpenDialog_Set_file_name db 'OpenDialog_set_file_name',0 - ;aOpenDialog_Set_file_ext db 'OpenDialog_set_file_ext',0 - -align 4 -import_buf2d: - init dd sz_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_resize dd sz_buf2d_resize - buf2d_line dd sz_buf2d_line - buf2d_line_sm dd sz_buf2d_line_sm - buf2d_rect_by_size dd sz_buf2d_rect_by_size - buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size - buf2d_circle dd sz_buf2d_circle - buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - buf2d_crop_color dd sz_buf2d_crop_color - buf2d_flip_h dd sz_buf2d_flip_h - buf2d_flip_v dd sz_buf2d_flip_v - buf2d_offset_h dd sz_buf2d_offset_h - buf2d_flood_fill dd sz_buf2d_flood_fill - buf2d_set_pixel dd sz_buf2d_set_pixel - dd 0,0 - sz_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_resize db 'buf2d_resize',0 - sz_buf2d_line db 'buf2d_line',0 - sz_buf2d_line_sm db 'buf2d_line_sm',0 - sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 - sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 - sz_buf2d_circle db 'buf2d_circle',0 - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - sz_buf2d_crop_color db 'buf2d_crop_color',0 - sz_buf2d_flip_h db 'buf2d_flip_h',0 - sz_buf2d_flip_v db 'buf2d_flip_v',0 - sz_buf2d_offset_h db 'buf2d_offset_h',0 - sz_buf2d_flood_fill db 'buf2d_flood_fill',0 - sz_buf2d_set_pixel db 'buf2d_set_pixel',0 - -align 4 -import_box_lib: - dd sz_init1 - - init_checkbox dd sz_Init_checkbox - check_box_draw dd sz_Check_box_draw - check_box_mouse dd sz_Check_box_mouse - ;version_ch dd sz_Version_ch - - option_box_draw dd sz_Option_box_draw - option_box_mouse dd sz_Option_box_mouse - ;version_op dd sz_Version_op - - edit_box_draw dd sz_edit_box_draw - edit_box_key dd sz_edit_box_key - edit_box_mouse dd sz_edit_box_mouse - edit_box_set_text dd sz_edit_box_set_text - scrollbar_ver_draw dd sz_scrollbar_ver_draw - scrollbar_hor_draw dd sz_scrollbar_hor_draw - - progressbar_draw dd sz_progressbar_draw - progressbar_progress dd sz_progressbar_progress - - dd 0,0 - sz_init1 db 'lib_init',0 - - sz_Init_checkbox db 'init_checkbox2',0 - sz_Check_box_draw db 'check_box_draw2',0 - sz_Check_box_mouse db 'check_box_mouse2',0 - ;sz_Version_ch db 'version_ch2',0 - - sz_Option_box_draw db 'option_box_draw',0 - sz_Option_box_mouse db 'option_box_mouse',0 - ;sz_Version_op db 'version_op',0 - - sz_edit_box_draw db 'edit_box_draw',0 - sz_edit_box_key db 'edit_box_key',0 - sz_edit_box_mouse db 'edit_box_mouse',0 - sz_edit_box_set_text db 'edit_box_set_text',0 - sz_scrollbar_ver_draw db 'scrollbar_v_draw',0 - sz_scrollbar_hor_draw db 'scrollbar_h_draw',0 - - sz_progressbar_draw db 'progressbar_draw', 0 - sz_progressbar_progress db 'progressbar_progress', 0 - -align 4 -import_libkmenu: - kmenu_init dd akmenu_init - kmainmenu_draw dd akmainmenu_draw - kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent - ksubmenu_new dd aksubmenu_new - ksubmenu_delete dd aksubmenu_delete - ksubmenu_draw dd aksubmenu_draw - ksubmenu_add dd aksubmenu_add - kmenuitem_new dd akmenuitem_new - kmenuitem_delete dd akmenuitem_delete - kmenuitem_draw dd akmenuitem_draw -dd 0,0 - akmenu_init db 'kmenu_init',0 - akmainmenu_draw db 'kmainmenu_draw',0 - akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0 - aksubmenu_new db 'ksubmenu_new',0 - aksubmenu_delete db 'ksubmenu_delete',0 - aksubmenu_draw db 'ksubmenu_draw',0 - aksubmenu_add db 'ksubmenu_add',0 - akmenuitem_new db 'kmenuitem_new',0 - akmenuitem_delete db 'kmenuitem_delete',0 - akmenuitem_draw db 'kmenuitem_draw',0 - -button_press dd 0 ;for kmenu - -align 4 -mouse_dd dd 0 -last_time dd 0 - -align 16 -sc system_colors - -align 16 -procinfo process_information - -align 4 -buf_0: dd 0 ;указатель на буфер изображения -.l: dw 15 ;+4 left -.t: dw 50 ;+6 top -.w: dd 384 ;+8 w -.h: dd 350 ;+12 h -.color: dd 0xffffd0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_1: - dd 0 ;указатель на буфер изображения - dd 0 ;+4 left,top -.w: dd 0 -.h: dd 0,0,24 ;+12 color,bit in pixel - -font_h dd 0 ;высота шрифта - -;input: -; eax - число -; edi - буфер для строки -; len - длинна буфера -;output: -align 4 -proc convert_int_to_str uses eax ecx edx edi esi, len:dword - mov esi,[len] - add esi,edi - dec esi - call .str - ret -endp - -align 4 -.str: - mov ecx,10 - cmp eax,ecx - jb @f - xor edx,edx - div ecx - push edx - ;dec edi ;смещение необходимое для записи с конца строки - call .str - pop eax - @@: - cmp edi,esi - jge @f - or al,0x30 - stosb - mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор - @@: - ret - -align 4 -proc mem_copy uses ecx esi edi, destination:dword, source:dword, len:dword - cld - mov esi, [source] - mov edi, [destination] - mov ecx, [len] - rep movsb - ret -endp - -edMaxSize = 511 -edMax = 0 ;max, size, pos - -align 4 -editFileName edit_box 270,450,78, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, fileNameBuffer.data, mouse_dd, 0, edMax, edMax -editCommand edit_box 150,450,121, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, commandBuffer.data, mouse_dd, 0, edMax, edMax - -opt1 option_box opt_gr1, 433,64, 6,12,0xd0d0ff, 0xff, 0x80ff,txt_filename,txt_filename.end-txt_filename -opt2 option_box opt_gr1, 433,107,6,12,0xd0d0ff, 0xff, 0x80ff,txt_command,txt_command.end-txt_command -opt_gr1 dd opt1 -align 4 -opt_grlist1 dd opt1,opt2,0 ;end option group - -pb: -.value dd 0 -.left dd 0 -.top dd 0 -.width dd 0 -.height dd 0 -.style dd 0 -.min dd 0 -.max dd 0 -.back_color dd 0 -.progress_color dd 0 -.frame_color dd 0 - -fileNameBuffer: -.data: rb 512 -.size: rd 1 -fileNameBufferEnd: - -commandBuffer: -.data: rb 512 -.size: rd 1 -commandBufferEnd: - -align 16 -i_end: - rb 2048 -thread_coords: - rb 2048 -thread_scale: - rb 2048 -thread_n_file: - rb 2048 -stacktop: - sys_path rb 1024 - file_name rb 2048 - plugin_path rb 4096 - openfile_path rb 4096 - filename_area rb 256 - pi rb 1024 -mem: - +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +;CNC CONTROL +;Igor Afanasyev (aka IgorA) and Sergey Efremenkov (aka theonlymirage), 2020 + +;02.10.18 - Only prototype UI +;08.10.18 - Add ComboBox (Button + KMenu), small text + +format binary as "" +use32 + org 0 + db 'MENUET01' + dd 1,start,i_end,mem,stacktop,file_name,sys_path + +include '../../macros.inc' +include '../../proc32.inc' +include '../../KOSfuncs.inc' +include '../../load_img.inc' +include '../../load_lib.mac' +include '../../develop/libraries/libs-dev/libimg/libimg.inc' +include '../../develop/libraries/box_lib/box_lib.mac' +include 'lang.inc' +include 'cnc_control.inc' +include '../../develop/info3ds/info_fun_float.inc' + +KMENUITEM_NORMAL equ 0 +KMENUITEM_SUBMENU equ 1 +KMENUITEM_SEPARATOR equ 2 + +@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +caption db 'CNC Control 18.12.20',0 ;подпись окна + +run_file_70 FileInfoBlock + +offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера + +IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +image_data_toolbar dd 0 ;указатель на временную память. для нужен преобразования изображения +icon_tl_sys dd 0 ;указатель на память для хранения системных иконок +icon_toolbar dd 0 ;указатель на память для хранения иконок объектов + +align 4 +start: + ;--- copy cmd line --- + mov esi,file_name + mov edi,openfile_path +@@: + lodsd + or eax,eax + jz @f ;выход, если 0 + stosd + jmp @b +@@: + stosd + + load_libraries l_libs_start,l_libs_end + ;проверка на сколько удачно загузилась библиотека + mov ebp,lib_0 + 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,0xC0000027 + stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога + + stdcall [buf2d_create], buf_0 ;создание буфера + + ;шрифт делаем до создания панели (для экономии указателя image_data_toolbar) + include_image_file '..\..\fs\kfar\trunk\font6x9.bmp', image_data_toolbar, buf_1.w,buf_1.h + stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер + stdcall mem.Free,[image_data_toolbar] ;освобождаем память + stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит + stdcall [buf2d_convert_text_matrix], buf_1 + mov eax,[buf_1.h] + shr eax,8 + mov [font_h],eax + + include_image_file 'toolbar.png', image_data_toolbar + + ;*** установка времени для таймера + mcall SF_SYSTEM_GET,SSF_TIME_COUNT + mov [last_time],eax + + ;call but_new_file + option_boxes_set_sys_color sc,opt_grlist1 + + ;progress bar + mov [pb.left], dword 50 + mov [pb.top], dword 30 + mov [pb.width], dword 350 + mov [pb.height], dword 17 + mov [pb.max], dword 100;599 + mov [pb.min], dword 0 ;-397 + mov [pb.value], dword 0 ;-397 + mov [pb.back_color], dword 00C8D0D4h + mov [pb.progress_color], dword 8072B7EBh + mov [pb.frame_color], dword 00406175h + + ;port menu + stdcall [kmenu_init], sc ;kmenu initialisation + ;stdcall [ksubmenu_new] + ;mov [main_menu], eax + + stdcall [ksubmenu_new] + mov [port_menu], eax + stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_COMport, 110 + stdcall [ksubmenu_add], [port_menu], eax + stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_USBport, 111 + stdcall [ksubmenu_add], [port_menu], eax + ;stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0 + ;stdcall [ksubmenu_add], [port_menu], eax + ;stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_OTHERport, 112 + ;stdcall [ksubmenu_add], [port_menu], eax + stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_PortMenu, [port_menu] + ;stdcall [ksubmenu_add], [main_menu], eax + + ;open file from cmd line + cmp dword[openfile_path],0 + je @f + call but_open_file.no_dlg + @@: + +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 + jne @f + call timer_funct + jmp still + @@: + + cmp al,1 + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + cmp al,6 + jne @f + mcall SF_THREAD_INFO,procinfo,-1 + cmp ax,word[procinfo.window_stack_position] + jne @f ;окно не активно + call mouse + @@: + jmp still + +align 4 +mouse: + stdcall [option_box_mouse], opt_grlist1 + stdcall [edit_box_mouse], editFileName + stdcall [edit_box_mouse], editCommand + stdcall [kmainmenu_dispatch_cursorevent], [port_menu] ;[main_menu] + + push eax ebx ecx + mcall SF_MOUSE_GET,SSF_BUTTON_EXT + bt eax,8 + jnc @f + ;mouse l. but. press + call mouse_left_d + jmp .end_l + @@: + bt eax,16 + jnc .end_l + ;mouse l. but. up + call mouse_left_u + ;jmp .end_l + .end_l: + + + call buf_get_mouse_coord + cmp eax,-1 + je .end0 + shl eax,1 + sub eax,[buf_0.w] + sar eax,1 + mov [mouse_prop_x],eax + mov ecx,ObjData + shl ebx,1 + sub ebx,[buf_0.h] + sar ebx,1 + mov [mouse_prop_y],ebx + + mcall SF_MOUSE_GET,SSF_SCROLL_DATA + test ax,ax + jz .end0 + finit + fld qword[zoom_plus] + fld1 + fsubp + fld st0 ;for Y coord + + ;for X coord + fild dword[mouse_prop_x] + fmulp st1,st0 + + mov ebx,eax + test ax,0x8000 + jnz .decr + ;увеличение масштаба + fchs + fild dword[ecx+Figure.MCentrX] ;add old value + fmul qword[zoom_plus] + faddp + + fld qword[ecx+Figure.MScale] + fmul qword[zoom_plus] + ;if (Figure.MScale>16.0) + ;... + jmp @f + .decr: + ;уменьшение масштаба + fild dword[ecx+Figure.MCentrX] ;add old value + fdiv qword[zoom_plus] + faddp + + fld qword[ecx+Figure.MScale] + fdiv qword[zoom_plus] + fld1 + fcomp + fstsw ax + sahf + jbe @f + ;if (Figure.MScale<1.0) + ffree st0 + fincstp + ffree st0 + fincstp + fldz ;default Figure.MCentrX + fld1 ;default Figure.MScale + mov dword[ecx+Figure.MCentrY],0 + @@: + fstp qword[ecx+Figure.MScale] + fistp dword[ecx+Figure.MCentrX] + + ;for Y coord + fild dword[mouse_prop_y] + fmulp st1,st0 + test bx,0x8000 + jnz .decr_y + ;увеличение масштаба + fild dword[ecx+Figure.MCentrY] ;add old value + fmul qword[zoom_plus] + faddp + jmp @f + .decr_y: + ;уменьшение масштаба + fchs + fild dword[ecx+Figure.MCentrY] ;add old value + fdiv qword[zoom_plus] + faddp + @@: + fistp dword[ecx+Figure.MCentrY] + + mov dword[offs_last_timer],0 + .end0: + + pop ecx ebx eax + ret + +;output: +; eax - buffer coord X (если курсор за буфером -1) +; ebx - buffer coord Y (если курсор за буфером -1) +align 4 +proc buf_get_mouse_coord + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION + cmp ax,word[buf_0.t] + jl .no_buf ;не попали в окно буфера по оси y + mov ebx,eax + shr ebx,16 + cmp bx,word[buf_0.l] + jl .no_buf ;не попали в окно буфера по оси x + + and eax,0xffff ;оставляем координату y + sub ax,word[buf_0.t] + cmp eax,[buf_0.h] + jg .no_buf + sub bx,word[buf_0.l] + cmp ebx,[buf_0.w] + jg .no_buf + xchg eax,ebx + jmp .end_f + .no_buf: + xor eax,eax + not eax + xor ebx,ebx + not ebx + .end_f: + ret +endp + +align 4 +proc timer_funct uses eax ebx + mcall SF_SYSTEM_GET,SSF_TIME_COUNT + mov [last_time],eax + + cmp dword[offs_last_timer],ObjData + je @f + mov dword[offs_last_timer],ObjData + stdcall draw_obj2d,ObjData + stdcall [buf2d_draw], buf_0 + @@: + ret +endp + +WINDOW_WIDTH = 775 +WINDOW_HEIGHT = 445 + +align 4 +draw_window: +pushad + mcall SF_REDRAW,SSF_BEGIN_DRAW + + ; *** рисование главного окна (выполняется 1 раз при запуске) *** + mov edx,[sc.work] + or edx,0x33000000 + mov edi,caption + mcall SF_CREATE_WINDOW,(20 shl 16)+WINDOW_WIDTH,(20 shl 16)+WINDOW_HEIGHT + + mov ecx,[ObjData.FigCount] + or ecx,ecx + jz .end0 + mov eax,[ObjData.FigData] + xor edx,edx + .cycle0: + stdcall FigCalculateSizes,[eax+4*edx],0 + inc edx + loop .cycle0 + stdcall ObjCalculateScale,ObjData + mov dword[offs_last_timer],0 + call timer_funct + .end0: + + stdcall [edit_box_draw], editFileName + stdcall [edit_box_draw], editCommand + + stdcall [option_box_draw], opt_grlist1 + push pb + call [progressbar_draw] + + ; *** создание кнопок на панель *** + mcall SF_DEFINE_BUTTON,(731 shl 16)+20,(75 shl 16)+20,3, [sc.work_button] + mcall , (15 shl 16)+20,(27 shl 16)+20,4 ;restore + mcall ,(538 shl 16)+20,,5 ;connect + mcall ,(563 shl 16)+20,,6 ;close connect + mcall ,(437 shl 16)+86,(378 shl 16)+20,7 ;cancel + mcall ,(616 shl 16)+136,(378 shl 16)+20,8 ;run + + ; *** + mov ecx,[sc.work_text] + or ecx,0x80000000 ;0x81000000 + textYcoord = 13;5 + mcall SF_DRAW_TEXT,(15 shl 16)+textYcoord,,txt_preview + mcall ,(424 shl 16)+textYcoord,,txt_port + mov ecx,[sc.work_button_text] + or ecx,0x81000000 + mcall ,(440 shl 16)+381,,txt_but_cancel + mcall ,(619 shl 16)+381,,txt_but_run + + ; *** рисование иконок на кнопках *** + mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16,(733 shl 16)+77 ;icon open + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mcall ,,,(17 shl 16)+29 ;restore scale + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mcall ,,,(540 shl 16)+29 ;connect + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mcall ,,,(565 shl 16)+29 ;close connect + ;;add ebx,IMAGE_TOOLBAR_ICON_SIZE + ;;mcall ,,,(439 shl 16)+380 ;cancel + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mcall ,,,((638+97) shl 16)+380 ;run + + stdcall [buf2d_draw], buf_0 + + ;delete port button, if it exist + mov edx, 0x80000008 + mcall SF_DEFINE_BUTTON + ;draw button PORT + buttonPortX = 433 + buttonPortY = 27 ;50 + buttonPortTextXoffset = 5 + mov esi, 0x00AABBCC ;color button + mcall SF_DEFINE_BUTTON, buttonPortX*65536 + 95, buttonPortY*65536 + 20, 8 + ;draw text for button PORT + mov ebx, (buttonPortX+buttonPortTextXoffset) * 65536 + (buttonPortY+6) ;(x, y) + mov esi, 11 + mcall SF_DRAW_TEXT,, 0xFFFFFF, sz_PortMenu + ;stdcall [kmainmenu_draw], [main_menu] + ;mov word[coord.x], 0 + ;mov word[coord.y], 0 + ;stdcall [ksubmenu_draw], [port_menu], coord + + mcall SF_REDRAW,SSF_END_DRAW +popad + ret + +align 4 +key: + mcall SF_GET_KEY + + stdcall [edit_box_key], editFileName + stdcall [edit_box_key], editCommand + + mov ecx,eax + mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS + bt eax,2 ;left Ctrl + jc .key_Ctrl + bt eax,3 ;right Ctrl + jc .key_Ctrl + jmp .end0 + .key_Ctrl: + cmp ch,15 ;111 ;Ctrl+O + jne @f + call but_open_file + @@: + .end0: + jmp still + +align 4 +button: + mcall SF_GET_BUTTON + + cmp ah,3 + jne @f + call but_open_file + jmp still + @@: + cmp ah,4 + jne @f + call but_restore_zoom + jmp still + @@: + cmp ah, 8 + jne @f + push eax ebx ecx + mcall SF_THREAD_INFO, pi, -1 ;get window coord + + mov eax, dword[pi+34] + add eax, buttonPortX + 5 + mov word[coord.x], ax + + mov eax, dword[pi+38] + add eax, buttonPortY + 42 + mov word[coord.y], ax + + stdcall [ksubmenu_draw], [port_menu], coord + pop ecx ebx eax + @@: + ;cmp ah,5 + ;jne @f + ;call but_... + ;jmp still + ;@@: + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 + stdcall mem.Free,[image_data_toolbar] + stdcall mem.Free,[open_file_data] + mcall SF_TERMINATE_PROCESS + + + +align 4 +open_file_data dd 0 ;указатель на память для открытия файлов +open_file_size dd 0 ;размер открытого файла + +align 4 +but_open_file: + copy_path open_dialog_name,communication_area_default_path,file_name,0 + pushad + mov [OpenDialog_data.type],0 + stdcall [OpenDialog_Start],OpenDialog_data + cmp [OpenDialog_data.status],2 + je .end_open_file + ;код при удачном открытии диалога + jmp .end0 +.no_dlg: ;если минуем диалог открытия файла + pushad + mov esi,openfile_path + stdcall str_len,esi + add esi,eax + @@: ;цикл для поиска начала имени файла + dec esi + cmp byte[esi],'/' + je @f + cmp byte[esi],0x5c ;'\' + je @f + cmp esi,openfile_path + jg @b + @@: + inc esi + stdcall [OpenDialog_Set_file_name],OpenDialog_data,esi ;копируем имя файла в диалог сохранения + .end0: + push eax ebx ecx edx ;copy file name path from OpenDialog + mov eax, openfile_path + mov ebx, fileNameBuffer ;.data + mov ecx, 0 + @@: + mov dl, byte[eax] + cmp dl, 0 ;byte[eax], 0 + je @f + mov byte[ebx], dl + inc eax + inc ebx + inc ecx + jmp @b + @@: + mov byte[ebx], 0 + mov dword[fileNameBuffer.size], ecx + mov dword[editFileName.size], ecx + mov dword[editFileName.pos], ecx + pop edx ecx ebx eax + + mov [run_file_70.Function], SSF_GET_INFO + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], 0 + mov dword[run_file_70.Buffer], open_b + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mcall SF_FILE,run_file_70 + + mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах + inc ecx ;for text files + stdcall mem.ReAlloc,[open_file_data],ecx + mov [open_file_data],eax + dec ecx ;for text files + mov byte[eax+ecx],0 ;for text files + + 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], ecx + m2m dword[run_file_70.Buffer], dword[open_file_data] + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mcall SF_FILE,run_file_70 ;загружаем файл изображения + test eax,eax + jnz .end_open_file + cmp ebx,0xffffffff + je .end_open_file + mov [open_file_size],ebx + mcall SF_SET_CAPTION,1,openfile_path + + stdcall FileInit,[open_file_data],[open_file_size] + stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + .end_open_file: + popad + ret + +;output: +; ecx - memory size for save file +align 4 +proc get_file_save_size uses eax ebx edx esi + mov ecx,100 ;title + mov ebx,ObjData + add ecx,50 ;object + mov edx,[ebx+Object.FigCount] + or edx,edx + jz .cycle1end + mov esi,[ebx+Object.FigData] +align 4 + .cycle1: ; цикл по фигурам + add ecx,80 ;figure + mov eax,[esi] + or eax,eax + jz @f + mov eax,[eax+Figure.PoiCount] + imul eax,70 + add ecx,eax ;points + @@: + add esi,4 + dec edx + jnz .cycle1 + .cycle1end: + ret +endp + +align 4 +proc but_restore_zoom + finit + fld1 + fstp qword[ObjData.MScale] + mov dword[ObjData.MCentrX],0 + mov dword[ObjData.MCentrY],0 + mov dword[offs_last_timer],0 + 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 + @@: + or ecx,ecx ;если число отрицательное + jnz @f + sub ecx,eax + mov eax,ecx + @@: + 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 '/sys',0 + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_name: + db 'opendial',0 +communication_area_default_path: + db '/sys/File managers/',0 + +Filter: +dd Filter.end - Filter ;.1 +.1: +db 'NC',0 +db 'PNG',0 +.end: +db 0 + + +;[ +;for test +main_menu dd 0 +port_menu dd 0 + +sz_PortMenu db 'COM 12 ',0 +sz_COMport db 'COM port 12',0 +sz_USBport db 'USB port ',0 +sz_OTHERport db 'Other port ',0 + +coord: + .x dw 100 + .y dw 200 +;] + +align 4 +system_dir_0 db '/sys/lib/' +lib_name_0 db 'proc_lib.obj',0 +system_dir_1 db '/sys/lib/' +lib_name_1 db 'libimg.obj',0 +system_dir_2 db '/sys/lib/' +lib_name_2 db 'buf2d.obj',0 +system_dir_3 db '/sys/lib/' +lib_name_3 db 'box_lib.obj',0 +system_dir_4 db '/sys/lib/' +lib_name_4 db 'kmenu.obj',0 + +align 4 +l_libs_start: + lib_0 l_libs lib_name_0, file_name, system_dir_0, import_proclib + lib_1 l_libs lib_name_1, file_name, system_dir_1, import_libimg + lib_2 l_libs lib_name_2, file_name, system_dir_2, import_buf2d + lib_3 l_libs lib_name_3, file_name, system_dir_3, import_box_lib + lib_4 l_libs lib_name_4, file_name, system_dir_4, import_libkmenu +l_libs_end: + +align 4 +import_libimg: + 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 +import_proclib: + OpenDialog_Init dd aOpenDialog_Init + OpenDialog_Start dd aOpenDialog_Start + OpenDialog_Set_file_name dd aOpenDialog_Set_file_name + ;OpenDialog_Set_file_ext dd aOpenDialog_Set_file_ext +dd 0,0 + aOpenDialog_Init db 'OpenDialog_init',0 + aOpenDialog_Start db 'OpenDialog_start',0 + aOpenDialog_Set_file_name db 'OpenDialog_set_file_name',0 + ;aOpenDialog_Set_file_ext db 'OpenDialog_set_file_ext',0 + +align 4 +import_buf2d: + init dd sz_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_resize dd sz_buf2d_resize + buf2d_line dd sz_buf2d_line + buf2d_line_sm dd sz_buf2d_line_sm + buf2d_rect_by_size dd sz_buf2d_rect_by_size + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_flip_h dd sz_buf2d_flip_h + buf2d_flip_v dd sz_buf2d_flip_v + buf2d_offset_h dd sz_buf2d_offset_h + buf2d_flood_fill dd sz_buf2d_flood_fill + buf2d_set_pixel dd sz_buf2d_set_pixel + dd 0,0 + sz_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_resize db 'buf2d_resize',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_line_sm db 'buf2d_line_sm',0 + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + sz_buf2d_circle db 'buf2d_circle',0 + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_flip_h db 'buf2d_flip_h',0 + sz_buf2d_flip_v db 'buf2d_flip_v',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + sz_buf2d_flood_fill db 'buf2d_flood_fill',0 + sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + +align 4 +import_box_lib: + dd sz_init1 + + init_checkbox dd sz_Init_checkbox + check_box_draw dd sz_Check_box_draw + check_box_mouse dd sz_Check_box_mouse + ;version_ch dd sz_Version_ch + + option_box_draw dd sz_Option_box_draw + option_box_mouse dd sz_Option_box_mouse + ;version_op dd sz_Version_op + + edit_box_draw dd sz_edit_box_draw + edit_box_key dd sz_edit_box_key + edit_box_mouse dd sz_edit_box_mouse + edit_box_set_text dd sz_edit_box_set_text + scrollbar_ver_draw dd sz_scrollbar_ver_draw + scrollbar_hor_draw dd sz_scrollbar_hor_draw + + progressbar_draw dd sz_progressbar_draw + progressbar_progress dd sz_progressbar_progress + + dd 0,0 + sz_init1 db 'lib_init',0 + + sz_Init_checkbox db 'init_checkbox2',0 + sz_Check_box_draw db 'check_box_draw2',0 + sz_Check_box_mouse db 'check_box_mouse2',0 + ;sz_Version_ch db 'version_ch2',0 + + sz_Option_box_draw db 'option_box_draw',0 + sz_Option_box_mouse db 'option_box_mouse',0 + ;sz_Version_op db 'version_op',0 + + sz_edit_box_draw db 'edit_box_draw',0 + sz_edit_box_key db 'edit_box_key',0 + sz_edit_box_mouse db 'edit_box_mouse',0 + sz_edit_box_set_text db 'edit_box_set_text',0 + sz_scrollbar_ver_draw db 'scrollbar_v_draw',0 + sz_scrollbar_hor_draw db 'scrollbar_h_draw',0 + + sz_progressbar_draw db 'progressbar_draw', 0 + sz_progressbar_progress db 'progressbar_progress', 0 + +align 4 +import_libkmenu: + kmenu_init dd akmenu_init + kmainmenu_draw dd akmainmenu_draw + kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent + ksubmenu_new dd aksubmenu_new + ksubmenu_delete dd aksubmenu_delete + ksubmenu_draw dd aksubmenu_draw + ksubmenu_add dd aksubmenu_add + kmenuitem_new dd akmenuitem_new + kmenuitem_delete dd akmenuitem_delete + kmenuitem_draw dd akmenuitem_draw +dd 0,0 + akmenu_init db 'kmenu_init',0 + akmainmenu_draw db 'kmainmenu_draw',0 + akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0 + aksubmenu_new db 'ksubmenu_new',0 + aksubmenu_delete db 'ksubmenu_delete',0 + aksubmenu_draw db 'ksubmenu_draw',0 + aksubmenu_add db 'ksubmenu_add',0 + akmenuitem_new db 'kmenuitem_new',0 + akmenuitem_delete db 'kmenuitem_delete',0 + akmenuitem_draw db 'kmenuitem_draw',0 + +button_press dd 0 ;for kmenu + +align 4 +mouse_dd dd 0 +last_time dd 0 + +align 16 +sc system_colors + +align 16 +procinfo process_information + +align 4 +buf_0: dd 0 ;указатель на буфер изображения +.l: dw 15 ;+4 left +.t: dw 50 ;+6 top +.w: dd 384 ;+8 w +.h: dd 350 ;+12 h +.color: dd 0xffffd0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: + dd 0 ;указатель на буфер изображения + dd 0 ;+4 left,top +.w: dd 0 +.h: dd 0,0,24 ;+12 color,bit in pixel + +font_h dd 0 ;высота шрифта + +;input: +; eax - число +; edi - буфер для строки +; len - длинна буфера +;output: +align 4 +proc convert_int_to_str uses eax ecx edx edi esi, len:dword + mov esi,[len] + add esi,edi + dec esi + call .str + ret +endp + +align 4 +.str: + mov ecx,10 + cmp eax,ecx + jb @f + xor edx,edx + div ecx + push edx + ;dec edi ;смещение необходимое для записи с конца строки + call .str + pop eax + @@: + cmp edi,esi + jge @f + or al,0x30 + stosb + mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор + @@: + ret + +align 4 +proc mem_copy uses ecx esi edi, destination:dword, source:dword, len:dword + cld + mov esi, [source] + mov edi, [destination] + mov ecx, [len] + rep movsb + ret +endp + +edMaxSize = 511 +edMax = 0 ;max, size, pos + +align 4 +editFileName edit_box 270,450,78, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, fileNameBuffer.data, mouse_dd, 0, edMax, edMax +editCommand edit_box 150,450,121, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, commandBuffer.data, mouse_dd, 0, edMax, edMax + +opt1 option_box opt_gr1, 433,64, 6,12,0xd0d0ff, 0xff, 0x80ff,txt_filename,txt_filename.end-txt_filename +opt2 option_box opt_gr1, 433,107,6,12,0xd0d0ff, 0xff, 0x80ff,txt_command,txt_command.end-txt_command +opt_gr1 dd opt1 +align 4 +opt_grlist1 dd opt1,opt2,0 ;end option group + +pb: +.value dd 0 +.left dd 0 +.top dd 0 +.width dd 0 +.height dd 0 +.style dd 0 +.min dd 0 +.max dd 0 +.back_color dd 0 +.progress_color dd 0 +.frame_color dd 0 + +fileNameBuffer: +.data: rb 512 +.size: rd 1 +fileNameBufferEnd: + +commandBuffer: +.data: rb 512 +.size: rd 1 +commandBufferEnd: + +align 16 +i_end: + rb 2048 +thread_coords: + rb 2048 +thread_scale: + rb 2048 +thread_n_file: + rb 2048 +stacktop: + sys_path rb 1024 + file_name rb 2048 + plugin_path rb 4096 + openfile_path rb 4096 + filename_area rb 256 + pi rb 1024 +mem: diff --git a/programs/other/cnc_editor/cnc_editor.asm b/programs/other/cnc_editor/cnc_editor.asm index b7184f0e2..4d6f25ca8 100644 --- a/programs/other/cnc_editor/cnc_editor.asm +++ b/programs/other/cnc_editor/cnc_editor.asm @@ -1,2419 +1,2424 @@ -use32 - org 0 - db 'MENUET01' - dd 1,start,i_end,mem,stacktop,file_name,sys_path - -include '../../macros.inc' -include '../../proc32.inc' -include '../../KOSfuncs.inc' -include '../../load_img.inc' -include '../../load_lib.mac' -include '../../develop/libraries/libs-dev/libimg/libimg.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' -include 'lang.inc' -include 'cnc_editor.inc' -include '../../develop/info3ds/info_fun_float.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'CNC editor 23.05.19',0 ;подпись окна - -run_file_70 FileInfoBlock - -offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера - -IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 -image_data_toolbar dd 0 ;указатель на временную память. для нужен преобразования изображения -icon_tl_sys dd 0 ;указатель на память для хранения системных иконок -icon_toolbar dd 0 ;указатель на память для хранения иконок объектов - -include 'wnd_point_coords.inc' -include 'wnd_scale.inc' -include 'wnd_new_file.inc' - -align 4 -start: - ;--- copy cmd line --- - mov esi,file_name - mov edi,openfile_path -@@: - lodsd - or eax,eax - jz @f ;выход, если 0 - stosd - jmp @b -@@: - stosd - - load_libraries l_libs_start,l_libs_end - ;проверка на сколько удачно загузилась библиотека - mov ebp,lib_0 - 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,0xC0000027 - stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога - - stdcall [buf2d_create], buf_0 ;создание буфера - - ;шрифт делаем до создания панели (для экономии указателя image_data_toolbar) - include_image_file '..\..\fs\kfar\trunk\font6x9.bmp', image_data_toolbar, buf_1.w,buf_1.h - stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер - stdcall mem.Free,[image_data_toolbar] ;освобождаем память - stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит - stdcall [buf2d_convert_text_matrix], buf_1 - mov eax,[buf_1.h] - shr eax,8 - mov [font_h],eax - - include_image_file 'toolbar.png', image_data_toolbar - - mov dword[w_scr_t1.type],1 - stdcall dword[tl_data_init], tree1 - ;системные иконки 16*16 для tree_list - include_image_file 'tl_sys_16.png', icon_tl_sys - mov eax,dword[icon_tl_sys] - mov dword[tree1.data_img_sys],eax - - include_image_file 'objects.png', icon_toolbar - mov eax,dword[icon_toolbar] - mov dword[tree1.data_img],eax - - ;*** установка времени для таймера - mcall SF_SYSTEM_GET,SSF_TIME_COUNT - mov [last_time],eax - - ;open file from cmd line - cmp dword[openfile_path],0 - je @f - call but_open_file.no_dlg - @@: - -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 - jne @f - call timer_funct - jmp still - @@: - - cmp al,1 - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - cmp al,6 - jne @f - mcall SF_THREAD_INFO,procinfo,-1 - cmp ax,word[procinfo.window_stack_position] - jne @f ;окно не активно - call mouse - @@: - jmp still - -align 4 -mouse: - push eax ebx ecx - mcall SF_MOUSE_GET,SSF_BUTTON_EXT - bt eax,8 - jnc @f - ;mouse l. but. press - call mouse_left_d - jmp .end_l - @@: - ;bt eax,0 - ;jnc @f - ;mouse l. but. move - ;call mouse_left_m - ;jmp .end_l - ;@@: - bt eax,16 - jnc .end_l - ;mouse l. but. up - call mouse_left_u - ;jmp .end_l - .end_l: - bt eax,9 - jnc @f - ;mouse r. but. press - call mouse_right_d - ;jmp .end_r - @@: - ;bt eax,1 - ;jnc @f - ;mouse r. but. move - ;call mouse_right_m - ;jmp .end_r - ;@@: - ;.end_r: - - call buf_get_mouse_coord - cmp eax,-1 - je .end0 - shl eax,1 - sub eax,[buf_0.w] - sar eax,1 - mov [mouse_prop_x],eax - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .end0 - cmp [eax+Figure.OType],'Fig' - je @f - cmp [eax+Figure.OType],'Obj' - je .end1 - jmp .end0 - .end1: - mov eax,ObjData - @@: - mov ecx,eax - shl ebx,1 - sub ebx,[buf_0.h] - sar ebx,1 - mov [mouse_prop_y],ebx - - mcall SF_MOUSE_GET,SSF_SCROLL_DATA - test ax,ax - jz .end0 - finit - fld qword[zoom_plus] - fld1 - fsubp - fld st0 ;for Y coord - - ;for X coord - fild dword[mouse_prop_x] - fmulp st1,st0 - - mov ebx,eax - test ax,0x8000 - jnz .decr - ;увеличение масштаба - fchs - fild dword[ecx+Figure.MCentrX] ;add old value - fmul qword[zoom_plus] - faddp - - fld qword[ecx+Figure.MScale] - fmul qword[zoom_plus] - ;if (Figure.MScale>16.0) - ;... - jmp @f - .decr: - ;уменьшение масштаба - fild dword[ecx+Figure.MCentrX] ;add old value - fdiv qword[zoom_plus] - faddp - - fld qword[ecx+Figure.MScale] - fdiv qword[zoom_plus] - fld1 - fcomp - fstsw ax - sahf - jbe @f - ;if (Figure.MScale<1.0) - ffree st0 - fincstp - ffree st0 - fincstp - fldz ;default Figure.MCentrX - fld1 ;default Figure.MScale - mov dword[ecx+Figure.MCentrY],0 - @@: - fstp qword[ecx+Figure.MScale] - fistp dword[ecx+Figure.MCentrX] - - ;for Y coord - fild dword[mouse_prop_y] - fmulp st1,st0 - test bx,0x8000 - jnz .decr_y - ;увеличение масштаба - fild dword[ecx+Figure.MCentrY] ;add old value - fmul qword[zoom_plus] - faddp - jmp @f - .decr_y: - ;уменьшение масштаба - fchs - fild dword[ecx+Figure.MCentrY] ;add old value - fdiv qword[zoom_plus] - faddp - @@: - fistp dword[ecx+Figure.MCentrY] - - mov dword[offs_last_timer],0 - .end0: - - stdcall [tl_mouse], tree1 - pop ecx ebx eax - ret - -;output: -; eax - buffer coord X (если курсор за буфером -1) -; ebx - buffer coord Y (если курсор за буфером -1) -align 4 -proc buf_get_mouse_coord - mcall SF_MOUSE_GET,SSF_WINDOW_POSITION - cmp ax,word[buf_0.t] - jl .no_buf ;не попали в окно буфера по оси y - mov ebx,eax - shr ebx,16 - cmp bx,word[buf_0.l] - jl .no_buf ;не попали в окно буфера по оси x - - and eax,0xffff ;оставляем координату y - sub ax,word[buf_0.t] - cmp eax,[buf_0.h] - jg .no_buf - sub bx,word[buf_0.l] - cmp ebx,[buf_0.w] - jg .no_buf - xchg eax,ebx - jmp .end_f - .no_buf: - xor eax,eax - not eax - xor ebx,ebx - not ebx - .end_f: - ret -endp - -align 4 -proc timer_funct - pushad - mcall SF_SYSTEM_GET,SSF_TIME_COUNT - mov [last_time],eax - - ;просматриваем выделенный блок данных - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .end_f - cmp dword[offs_last_timer],eax - je .end_f - ;если выделенный блок данных не совпадает с последним запомненным - mov dword[offs_last_timer],eax - - stdcall get_object_data,eax - or ecx,ecx - jz .end_oblo - stdcall draw_obj2d,ecx - stdcall [buf2d_draw], buf_0 - jmp .end_f - .end_oblo: - - cmp [eax+Figure.OType],'Fig' - jne .end_fblo - stdcall draw_fig2d,eax - stdcall [buf2d_draw], buf_0 - jmp .end_f - .end_fblo: - - .end_f: - - popad - ret -endp - -align 4 -draw_window: -pushad - mcall SF_REDRAW,SSF_BEGIN_DRAW - - ; *** рисование главного окна (выполняется 1 раз при запуске) *** - mov edx,[sc.work] - or edx,0x33000000 - mov edi,caption - mcall SF_CREATE_WINDOW,(20 shl 16)+599,(20 shl 16)+415 - - mcall SF_THREAD_INFO,procinfo,-1 - mov eax,dword[procinfo.box.height] - cmp eax,120 - jge @f - mov eax,120 ;min size - @@: - sub eax,65 - mov dword[tree1.box_height],eax - mov word[w_scr_t1.y_size],ax ;новые размеры скроллинга - mov ebx,dword[procinfo.box.width] - cmp ebx,270 - jge @f - mov ebx,270 - @@: - sub ebx,215 - cmp eax,dword[buf_0.h] ;смотрим размер буфера - jne @f - cmp ebx,dword[buf_0.w] - jne @f - jmp .end0 - @@: - stdcall [buf2d_resize],buf_0,ebx,eax,1 - mov eax,ObjData - mov ecx,[eax+Object.FigCount] - or ecx,ecx - jz .end0 - mov eax,[eax+Object.FigData] - xor edx,edx - .cycle0: - stdcall FigCalculateSizes,[eax+4*edx],0 - inc edx - loop .cycle0 - stdcall ObjCalculateScale,ObjData - mov dword[offs_last_timer],0 - call timer_funct - .end0: - - ; *** создание кнопок на панель *** - mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,3, [sc.work_button] - - add ebx,25 shl 16 - mcall ,,,4 ;open - add ebx,25 shl 16 - mcall ,,,5 ;save - - add ebx,30 shl 16 - mcall ,,,6 ;captions on off - - add ebx,25 shl 16 - mcall ,,,7 ;figure move up - add ebx,25 shl 16 - mcall ,,,8 ;figure move down - - add ebx,25 shl 16 - mcall ,,,9 ;sel points dlg - - add ebx,25 shl 16 - mcall ,,,10 ;sel points move up - add ebx,25 shl 16 - mcall ,,,11 ;sel points move down - - add ebx,25 shl 16 - mcall ,,,12 ;align sel points left - add ebx,25 shl 16 - mcall ,,,13 ;align sel points right - add ebx,25 shl 16 - mcall ,,,14 ;align sel points top - add ebx,25 shl 16 - mcall ,,,15 ;align sel points bottom - add ebx,25 shl 16 - mcall ,,,16 ;optimize figure - - add ebx,30 shl 16 - mcall ,,,17 ;copy to clipboard - add ebx,25 shl 16 - mcall ,,,18 ;paste from clipboard - - add ebx,25 shl 16 - mcall ,,,19 ;sel points del - - add ebx,30 shl 16 - mcall ,,,20 ;restore zoom - - add ebx,30 shl 16 - mcall ,,,21 ;.png - - add ebx,25 shl 16 - mcall ,,,22 ;options scale - - ; *** рисование иконок на кнопках *** - mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16,(7 shl 16)+7 ;icon new - - 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) ;captions on off - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;figure move up - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;figure move down - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;sel points dlg - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;sel points move up - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;sel points move down - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;aling sel points left - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;aling sel points right - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;aling sel points top - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;aling sel points bottom - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;optimize figure - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(30 shl 16) ;copy to clipboard - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;paste from clipboard - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;sel points del - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(30 shl 16) ;restore zoom - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(30 shl 16) ;.png - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;options scale - int 0x40 - - mov dword[w_scr_t1.all_redraw],1 - stdcall [tl_draw], tree1 - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW,SSF_END_DRAW -popad - ret - -align 4 -key: - mcall SF_GET_KEY - cmp dword[el_focus], tree1 - jne @f - stdcall [tl_key], tree1 - jmp .end0 - @@: - - cmp ah,178 ;Up - jne @f - call but_selection_move_up - jmp .end0 - @@: - cmp ah,177 ;Down - jne @f - call but_selection_move_down - jmp .end0 - @@: - cmp ah,176 ;Left - jne @f - call but_selection_move_up - jmp .end0 - @@: - cmp ah,179 ;Right - jne @f - call but_selection_move_down - jmp .end0 - @@: - cmp ah,182 ;Delete - jne @f - call but_sel_points_del - jmp .end0 - @@: - - mov ecx,eax - mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS - bt eax,2 ;left Ctrl - jc .key_Ctrl - bt eax,3 ;right Ctrl - jc .key_Ctrl - jmp .end0 - .key_Ctrl: - cmp ch,15 ;111 ;Ctrl+O - jne @f - call but_open_file - @@: - cmp ch,19 ;115 ;Ctrl+S - jne @f - call but_save_file - @@: - cmp ch,14 ;110 ;Ctrl+N - jne @f - call but_new_file - @@: - cmp ch,1 ;97 ;Ctrl+A - jne @f - call but_sel_points_all - @@: - .end0: - 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_captions_on_off - jmp still - @@: - cmp ah,7 - jne @f - call but_sel_figure_move_up - jmp still - @@: - cmp ah,8 - jne @f - call but_sel_figure_move_down - jmp still - @@: - cmp ah,9 - jne @f - call but_dlg_point_coords - jmp still - @@: - cmp ah,10 - jne @f - call but_sel_points_move_up - jmp still - @@: - cmp ah,11 - jne @f - call but_sel_points_move_down - jmp still - @@: - cmp ah,12 - jne @f - call but_sel_points_align_coord_xmin - jmp still - @@: - cmp ah,13 - jne @f - call but_sel_points_align_coord_xmax - jmp still - @@: - cmp ah,14 - jne @f - call but_sel_points_align_coord_ymax - jmp still - @@: - cmp ah,15 - jne @f - call but_sel_points_align_coord_ymin - @@: - cmp ah,16 - jne @f - call but_points_optimize - jmp still - @@: - cmp ah,17 - jne @f - call but_clipboard_copy_points - jmp still - @@: - cmp ah,18 - jne @f - call but_clipboard_paste_points - jmp still - @@: - cmp ah,19 - jne @f - call but_sel_points_del - jmp still - @@: - cmp ah,20 - jne @f - call but_restore_zoom - jmp still - @@: - cmp ah,21 - jne @f - call but_save_png - jmp still - @@: - cmp ah,22 - jne @f - call but_dlg_opt_scale - jmp still - @@: - - ;cmp ah,23 - ;jne @f - ;call but_... - ;jmp still - ;@@: - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 - stdcall mem.Free,[image_data_toolbar] - stdcall mem.Free,[open_file_data] - mcall SF_TERMINATE_PROCESS - - -align 4 -but_new_file: - cmp byte[wnd_n_file],0 - jne .end_f -pushad - mcall SF_CREATE_THREAD,1,start_n_file,thread_n_file -popad - .end_f: - ret - -align 4 -open_file_data dd 0 ;указатель на память для открытия файлов -open_file_size dd 0 ;размер открытого файла - -align 4 -but_open_file: - copy_path open_dialog_name,communication_area_default_path,file_name,0 - pushad - mov [OpenDialog_data.type],0 - stdcall [OpenDialog_Start],OpenDialog_data - cmp [OpenDialog_data.status],2 - je .end_open_file - ;код при удачном открытии диалога - jmp .end0 -.no_dlg: ;если минуем диалог открытия файла - pushad - mov esi,openfile_path - stdcall str_len,esi - add esi,eax - @@: ;цикл для поиска начала имени файла - dec esi - cmp byte[esi],'/' - je @f - cmp byte[esi],0x5c ;'\' - je @f - cmp esi,openfile_path - jg @b - @@: - inc esi - stdcall [OpenDialog_Set_file_name],OpenDialog_data,esi ;копируем имя файла в диалог сохранения - .end0: - - mov [run_file_70.Function], SSF_GET_INFO - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], 0 - mov dword[run_file_70.Buffer], open_b - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], openfile_path - mcall SF_FILE,run_file_70 - - mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах - inc ecx ;for text files - stdcall mem.ReAlloc,[open_file_data],ecx - mov [open_file_data],eax - dec ecx ;for text files - mov byte[eax+ecx],0 ;for text files - - 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], ecx - m2m dword[run_file_70.Buffer], dword[open_file_data] - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], openfile_path - mcall SF_FILE,run_file_70 ;загружаем файл изображения - test eax,eax - jnz .end_open_file - cmp ebx,0xffffffff - je .end_open_file - - mov [open_file_size],ebx - mcall SF_SET_CAPTION,1,openfile_path - - ;--- - and dword[tree1.style],not tl_cursor_pos_limited - stdcall FileInit,[open_file_data],[open_file_size] - or dword[tree1.style], tl_cursor_pos_limited - stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер - stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране - .end_open_file: - popad - ret - -align 4 -proc but_save_file -locals - pCou dd ? - pData dd ? -endl - pushad - copy_path open_dialog_name,communication_area_default_path,file_name,0 - mov [OpenDialog_data.type],1 - stdcall [OpenDialog_Set_file_ext],OpenDialog_data,Filter.1 ;.nc - stdcall [OpenDialog_Start],OpenDialog_data - cmp [OpenDialog_data.status],2 - je .end_save_file - ;код при удачном открытии диалога - - ;*** определение примерного размера файла - call get_file_save_size - stdcall mem.ReAlloc,[open_file_data],ecx - mov [open_file_data],eax - mov [open_file_size],ecx - - ;clear memory - mov edi,eax - xor eax,eax - shr ecx,2 - rep stosd - - ;*** пишем информацию в память - mov edi,[open_file_data] - mov ebx,ObjData - mov edx,[ebx+Object.FigCount] - or edx,edx - jz .cycle1end - mov esi,[ebx+Object.FigData] -align 4 - .cycle1: ;цикл по фигурам - ;param 1 - mov eax,[esi] - or eax,eax - jz .err_save - mov eax,[eax+Figure.PoiCount] - mov [pCou],eax - or eax,eax - jnz @f - mov eax,[esi] - lea eax,[eax+Figure.Caption] - stdcall str_cat,edi,eax - stdcall str_len,edi - add edi,eax - stdcall str_cat,edi,txt_nl - @@: - cmp dword[pCou],0 - je .cycle2end - mov eax,[esi] - mov eax,[eax+Figure.PoiData] - mov [pData],eax - mov word[NumberSymbolsAD],8 -align 4 - .cycle2: ;цикл по точкам - stdcall str_cat,edi,txt_s_poi - ;param 1 - push edi esi - mov esi,[pData] - lea esi,[esi+Point.CoordX] - mov edi,Data_Double - movsd - movsd - pop esi edi - call DoubleFloat_to_String - call String_crop_0 - stdcall str_cat,edi,Data_String - stdcall str_cat,edi,txt_s_poi_Y - ;param 2 - push edi esi - mov esi,[pData] - lea esi,[esi+Point.CoordY] - mov edi,Data_Double - movsd - movsd - pop esi edi - call DoubleFloat_to_String - call String_crop_0 - stdcall str_cat,edi,Data_String - ; - stdcall str_cat,edi,txt_nl - add dword[pData],sizeof.Point - dec dword[pCou] - jnz .cycle2 - .cycle2end: - add esi,4 - dec edx - jnz .cycle1 - .cycle1end: - - jmp @f - .err_save: - notify_window_run txt_err_save_txt_file_1 - @@: - - ;*** определение параметров файла - mov edi,[open_file_data] - stdcall str_len,edi - ;;cmp eax,[open_file_size] - mov [run_file_70.Count],eax ;размер файла - - ;*** сохраняем файл - mov [run_file_70.Function], SSF_CREATE_FILE - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov ebx, dword[open_file_data] - mov [run_file_70.Buffer], ebx - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], openfile_path - mcall SF_FILE,run_file_70 - or eax,eax - jz .end_save_file - or ebx,ebx - jnz .end_save_file - ;сообщение о неудачном сохранении - notify_window_run txt_err_save_txt_file_0 - .end_save_file: - popad - ret -endp - -;output: -; ecx - memory size for save file -align 4 -proc get_file_save_size uses eax ebx edx esi - mov ecx,100 ;title - mov ebx,ObjData - add ecx,50 ;object - mov edx,[ebx+Object.FigCount] - or edx,edx - jz .cycle1end - mov esi,[ebx+Object.FigData] -align 4 - .cycle1: ; цикл по фигурам - add ecx,80 ;figure - mov eax,[esi] - or eax,eax - jz @f - mov eax,[eax+Figure.PoiCount] - imul eax,70 - add ecx,eax ;points - @@: - add esi,4 - dec edx - jnz .cycle1 - .cycle1end: - ret -endp - -align 4 -but_captions_on_off: - xor dword[opt_draw],1 - mov dword[offs_last_timer],0 ;для обновления по таймеру - ret - -align 4 -but_sel_figure_move_up: - pushad - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .end_fblo - cmp [eax+Figure.OType],'Fig' - jne .end_fblo - stdcall found_parent_obj,eax - or eax,eax - jz .end_f ;if not found - or ecx,ecx - jz .fig_is_0 ;если фигура в начале списка - mov ebx,[eax+Object.FigData] - mov edx,[ebx+4*ecx] ;передвигаемая фигура - mov edi,[ebx+4*ecx-4] - ;меняем фигуры местами - mov [ebx+4*ecx],edi - mov [ebx+4*ecx-4],edx - ;меняем фигуры в списке - stdcall [tl_node_move_up],tree1 - jmp .end_f - .fig_is_0: - notify_window_run txt_err_figure_is_0 - jmp .end_f - .end_fblo: - notify_window_run txt_err_no_figure_select - .end_f: - popad - ret - -align 4 -but_save_png: - pushad - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .end_save_file - - stdcall get_object_data,eax - or ecx,ecx - jz .end_oblo - stdcall draw_obj2d_png,ecx - jmp .beg0 - .end_oblo: - -; cmp [eax+Figure.OType],'Fig' -; jne .end_fblo -; stdcall draw_fig2d_png,eax -; jmp .beg0 -; .end_fblo: - - jmp .end_save_file - .beg0: - copy_path open_dialog_name,communication_area_default_path,file_name,0 - mov [OpenDialog_data.type],1 - stdcall [OpenDialog_Set_file_ext],OpenDialog_data,Filter.2 ;.png - stdcall [OpenDialog_Start],OpenDialog_data - cmp [OpenDialog_data.status],1 - jne .end_save_file - ;код при удачном открытии диалога - mov dword[png_data],0 - - ;create image struct - stdcall [img_create], [buf_png.w], [buf_png.h], Image.bpp24 - mov ebx,eax - test eax,eax - jz @f - ;copy foto to image buffer - mov edi,[eax+Image.Data] - mov esi,[buf_png] - mov ecx,[buf_png.w] - mov edx,[buf_png.h] - imul ecx,edx - imul ecx,3 - shr ecx,2 ;OpenGL buffer align to 4 - rep movsd - - ;encode image - stdcall [img_encode], eax, LIBIMG_FORMAT_PNG, 0 - test eax,eax - jz @f - mov [png_data],eax - mov [png_size],ecx - @@: - stdcall [img_destroy],ebx - - ; заполняем структуру для сохранения файла - mov ebx,run_file_70 - mov dword[ebx],SSF_CREATE_FILE - mov eax,[png_size] - mov [ebx+12],eax ;file size - mov eax,[png_data] - mov [ebx+16],eax - mov dword[ebx+FileInfoBlock.FileName], openfile_path - - mcall SF_FILE,run_file_70 - test eax,eax - jnz .save_error - ;notify_window_run openfile_path - jmp @f - .save_error: - ;сообщение о неудачном сохранении - notify_window_run txt_err_save_img_file - @@: - mcall SF_SYS_MISC, SSF_MEM_FREE, [png_data] - .end_save_file: - popad - ret - -;description: -; выделенные точки сдвигаются вверх -align 4 -proc but_sel_points_move_up -locals - pObj dd ? - pFig dd ? - idFig dd ? -endl - pushad - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .no_point - cmp [eax+Figure.OType],'Fig' - jne .no_point - - mov [pFig],eax - stdcall sel_points_get_count,eax - or eax,eax - jz .no_point - - stdcall found_parent_obj,[pFig] - or eax,eax - jz .end_f ;if not found - mov [pObj],eax - mov [idFig],ecx - - ;проверяем выделенные точки - mov eax,[pFig] - mov ecx,[eax+Figure.PoiCount] - or ecx,ecx - jz .no_point - mov ebx,[eax+Figure.PoiData] - xor eax,eax - .cycle0: - bt dword[ebx+Point.Prop],PROP_BIT_SELECT - jnc @f - or eax,eax - jz .point_is_0 - stdcall point_move_up, [pObj],[pFig],[idFig],ebx;,eax - @@: - inc eax - add ebx,sizeof.Point - loop .cycle0 - - ;для обновления по таймеру - mov dword[offs_last_timer],0 - jmp .end_f - .point_is_0: - notify_window_run txt_err_poi_is_0 - jmp .end_f - .no_point: - notify_window_run txt_err_no_point_sel - .end_f: - popad - ret -endp - -;description: -; выделенные точки сдвигаются вниз -align 4 -proc but_sel_points_move_down -locals - pObj dd ? - pFig dd ? - idFig dd ? -endl - pushad - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .no_point - cmp [eax+Figure.OType],'Fig' - jne .no_point - - mov [pFig],eax - stdcall sel_points_get_count,eax - or eax,eax - jz .no_point - - stdcall found_parent_obj,[pFig] - or eax,eax - jz .end_f ;if not found - mov [pObj],eax - mov [idFig],ecx - - ;проверяем выделенные точки - mov eax,[pFig] - mov ecx,[eax+Figure.PoiCount] - or ecx,ecx - jz .no_point - mov ebx,ecx - dec ebx - imul ebx,sizeof.Point - add ebx,[eax+Figure.PoiData] - .cycle0: - bt dword[ebx+Point.Prop],PROP_BIT_SELECT - jnc @f - cmp ecx,[eax+Figure.PoiCount] - je .point_is_last - mov edi,ebx - add edi,sizeof.Point - stdcall point_move_up, [pObj],[pFig],[idFig],edi;,ecx - @@: - sub ebx,sizeof.Point - loop .cycle0 - - ;для обновления по таймеру - mov dword[offs_last_timer],0 - jmp .end_f - .point_is_last: - notify_window_run txt_err_poi_is_last - jmp .end_f - .no_point: - notify_window_run txt_err_no_point_sel - .end_f: - popad - ret -endp - -;description: -; выделение выбранной точки сдвигается вверх -align 4 -proc but_selection_move_up -locals - pFig dd ? -endl - pushad - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .end_fblo - cmp [eax+Figure.OType],'Fig' - jne .end_fblo - - mov [pFig],eax - stdcall sel_points_get_count,eax - cmp eax,1 - jne .no_point - - ;проверяем выделенные точки - mov eax,[pFig] - mov ecx,[eax+Figure.PoiCount] - or ecx,ecx - jz .no_point - dec ecx - jecxz .end_f - mov ebx,[eax+Figure.PoiData] - .cycle0: - add ebx,sizeof.Point - bt dword[ebx+Point.Prop],PROP_BIT_SELECT - jnc @f - btr dword[ebx+Point.Prop],PROP_BIT_SELECT - bts dword[ebx+Point.Prop-sizeof.Point],PROP_BIT_SELECT - xor ecx,ecx - inc ecx ;ecx = 1 - for exit from cycle - @@: - loop .cycle0 - - ;для обновления по таймеру - mov dword[offs_last_timer],0 - jmp .end_f - .no_point: - notify_window_run txt_err_no_point_sel_1 - jmp .end_f - .end_fblo: - ;notify_window_run txt_err_no_figure_select - .end_f: - popad - ret -endp - -;description: -; выделение выбранной точки сдвигается вниз -align 4 -proc but_selection_move_down -locals - pFig dd ? -endl - pushad - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .end_fblo - cmp [eax+Figure.OType],'Fig' - jne .end_fblo - - mov [pFig],eax - stdcall sel_points_get_count,eax - cmp eax,1 - jne .no_point - - ;проверяем выделенные точки - mov eax,[pFig] - mov ecx,[eax+Figure.PoiCount] - or ecx,ecx - jz .no_point - dec ecx - jecxz .end_f - mov ebx,[eax+Figure.PoiData] - .cycle0: - bt dword[ebx+Point.Prop],PROP_BIT_SELECT - jnc @f - btr dword[ebx+Point.Prop],PROP_BIT_SELECT - bts dword[ebx+Point.Prop+sizeof.Point],PROP_BIT_SELECT - xor ecx,ecx - inc ecx ;ecx = 1 - for exit from cycle - @@: - add ebx,sizeof.Point - loop .cycle0 - - ;для обновления по таймеру - mov dword[offs_last_timer],0 - jmp .end_f - .no_point: - notify_window_run txt_err_no_point_sel_1 - jmp .end_f - .end_fblo: - ;notify_window_run txt_err_no_figure_select - .end_f: - popad - ret -endp - -;output: -; eax - couunt new points -align 4 -proc but_clipboard_copy_points uses ebx ecx edx edi esi -locals - pData dd 0 - pBuf dd 0 -endl - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .no_point - cmp [eax+Figure.OType],'Fig' - jne .no_point - - mov ecx,[eax+Figure.PoiData] - mov [pData],ecx - mov ecx,[eax+Figure.PoiCount] - stdcall sel_points_get_count,eax - or eax,eax - jz .no_point - push eax - imul eax,32 ;for string 'X___.________ Y___.________^^' - stdcall mem.Alloc,eax - mov [pBuf],eax - - mov edx,eax - mov dword[edx+4],0 ;text data - mov dword[edx+8],1 ;code 866 - add edx,12 ;system buffer header size - mov dword[edx],0 - mov word[NumberSymbolsAD],8 -align 4 - .cycle2: ;цикл по точкам - mov esi,[pData] - bt dword[esi+Point.Prop],PROP_BIT_SELECT - jnc .end0 - stdcall str_cat,edx,txt_s_poi - ;param 1 - add esi,Point.CoordX - mov edi,Data_Double - movsd - movsd - call DoubleFloat_to_String - call String_crop_0 - stdcall str_cat,edx,Data_String - stdcall str_cat,edx,txt_s_poi_Y - ;param 2 - ;;mov esi,[pData] - ;;lea esi,[esi+Point.CoordY] - mov edi,Data_Double - movsd - movsd - call DoubleFloat_to_String - call String_crop_0 - stdcall str_cat,edx,Data_String - ; - stdcall str_cat,edx,txt_nl - .end0: - add dword[pData],sizeof.Point - loop .cycle2 - .cycle2end: - - mov edx,[pBuf] - add edx,12 - stdcall str_len,edx - sub edx,12 - mov [edx],eax - add eax,12 - mov ecx,eax - mcall SF_CLIPBOARD,SSF_WRITE_CB ;,ecx,edx - stdcall mem.Free,[pBuf] - pop eax - - .no_point: - ret -endp - -;output: -; eax - couunt new points -align 4 -proc but_clipboard_paste_points uses ebx ecx edx esi edi -locals - pFig dd ? - nCount dd ? -endl - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .end0 - cmp [eax+Figure.OType],'Fig' - jne .end0 - - mov [pFig],eax - - mcall SF_CLIPBOARD,SSF_GET_SLOT_COUNT - cmp eax,1 - jl .end0 - - mov esi,eax - .cycle0: ;обратный цикл по слотам - dec esi ;номер текущего, проверяемого слота - mcall SF_CLIPBOARD,SSF_READ_CB,esi - cmp eax,1 - je .end0 - cmp eax,-1 - je .end0 - mov ecx,dword[eax] - cmp ecx,5 ;min text size - jl .end0 - cmp dword[eax+4],0 ;text - je @f - cmp esi,1 - jge .cycle0 ;если в буфере не текст, а слотов в буфере несколько, пробуем перейти к верхнему слоту - jmp .end0 - @@: - - mov esi,eax - add esi,12 ;смещение начала текста в буфере - stdcall get_max_points - or eax,eax - jz .end_f - mov [nCount],eax - mov ebx,[pFig] - mov edi,[ebx+Figure.PoiCount] - add [ebx+Figure.PoiCount],eax - add eax,edi - imul eax,sizeof.Point - stdcall mem.ReAlloc,[ebx+Figure.PoiData],eax - mov [ebx+Figure.PoiData],eax - - mov ecx,edi - mov edx,eax -align 4 - .cycle1: ;цикл для снятия выделения со старых точек - btr dword[edx+Point.Prop],PROP_BIT_SELECT - add edx,sizeof.Point - loop .cycle1 - - mov ecx,[nCount] - imul edi,sizeof.Point - add edi,eax - finit -align 4 - .cycle2: ;цикл для добавления новых точек - stdcall PointInit,edi - or eax,eax - jz .cycle2end - bts dword[edi+Point.Prop],PROP_BIT_SELECT - add edi,sizeof.Point - loop .cycle2 - .cycle2end: - or ecx,ecx - jz .end1 - ;уменьшаем объем памяти выделенный для точек - sub [ebx+Figure.PoiCount],ecx - mov eax,[ebx+Figure.PoiCount] - imul eax,sizeof.Point - stdcall mem.ReAlloc,[ebx+Figure.PoiData],eax - mov [ebx+Figure.PoiData],eax - .end1: - stdcall found_parent_obj,ebx ;get figure number in ecx - stdcall figure_update_coords,ObjData,ecx - - mov eax,[nCount] - mov dword[offs_last_timer],0 - jmp .end_f - .end0: - xor eax,eax - .end_f: - ret -endp - -align 4 -proc but_sel_points_del -locals - pFig dd ? - nDel dd ? ;need delete -endl - pushad - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .no_point - cmp [eax+Figure.OType],'Fig' - jne .no_point - - mov [pFig],eax - stdcall sel_points_get_count,eax - or eax,eax - jz .no_point - mov [nDel],eax - - ;проверяем выделенные точки - mov ebx,[pFig] - mov ecx,[ebx+Figure.PoiCount] - or ecx,ecx - jz .no_point - - cmp ecx,eax - jle .no_all - - stdcall found_parent_obj,[pFig] - or eax,eax - jz .end_f ;if not found - mov edi,[ebx+Figure.PoiData] - mov edx,[ebx+Figure.PoiCount] - imul edx,sizeof.Point - add edx,edi - - .cycle0: ;1-я выделенная точка - cmp edi,edx - jge .end0 - bt dword[edi+Point.Prop],PROP_BIT_SELECT - jc .cycle0end - add edi,sizeof.Point - jmp .cycle0 - .cycle0end: - - mov esi,edi ;следущая 1-я не выделенная точка - add esi,sizeof.Point - .cycle1: - cmp esi,edx - jge .end0 - bt dword[esi+Point.Prop],PROP_BIT_SELECT - jnc .cycle1end - add esi,sizeof.Point - jmp .cycle1 - .cycle1end: - - mov ecx,sizeof.Point - rep movsb ;замена выделенной точки - bts dword[esi+Point.Prop-sizeof.Point],PROP_BIT_SELECT ;ставим выделение на точку, что-бы потом ее удалить - - jmp .cycle0 - .end0: - - ;обновление памяти - mov eax,[ebx+Figure.PoiCount] - sub eax,[nDel] - mov [ebx+Figure.PoiCount],eax - imul eax,sizeof.Point - stdcall mem.ReAlloc,[ebx+Figure.PoiData],eax - mov [ebx+Figure.PoiData],eax - - ;перерасчет размеров фигуры - stdcall found_parent_obj,ebx ;get figure number in ecx - stdcall figure_update_coords,ObjData,ecx - - ;для обновления по таймеру - mov dword[offs_last_timer],0 - jmp .end_f - - .no_all: - notify_window_run txt_err_no_point_del - jmp .end_f - .no_point: - notify_window_run txt_err_no_point_sel - .end_f: - popad - ret -endp - -align 4 -proc but_sel_points_all uses eax ecx - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .no_point - cmp [eax+Figure.OType],'Fig' - jne .no_point - - mov ecx,[eax+Figure.PoiCount] - or ecx,ecx - jz .no_point - mov eax,[eax+Figure.PoiData] - .cycle0: ;цикл для выделенния точек - bts dword[eax+Point.Prop],PROP_BIT_SELECT - add eax,sizeof.Point - loop .cycle0 - ;для обновления по таймеру - mov dword[offs_last_timer],0 - .no_point: - ret -endp - -align 4 -proc but_sel_points_align_coord_xmin -pushad - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .no_point - cmp [eax+Figure.OType],'Fig' - jne .no_point - - mov ebx,eax - stdcall sel_points_get_count,eax - cmp eax,1 - jle .no_point - mov ecx,[ebx+Figure.PoiCount] - or ecx,ecx - jz .no_point - cmp eax,ecx - je .no_point ;если выделенны все точки, что-бы не портить контур - - mov edx,ecx - imul edx,sizeof.Point - mov ebx,[ebx+Figure.PoiData] - add edx,ebx -align 4 - .cycle0: ;1-я выделенная точка - cmp ebx,edx - jge .no_point - bt dword[ebx+Point.Prop],PROP_BIT_SELECT - jc .cycle0end - add ebx,sizeof.Point - jmp .cycle0 - .cycle0end: - lea esi,[ebx+Point.CoordX] - mov edi,Data_Double - movsd - movsd - finit - fld qword[Data_Double] -align 4 - .cycle1: ;цикл для нахождения min(Point.CoordX) - bt dword[ebx+Point.Prop],PROP_BIT_SELECT - jnc .no_sel - fcom qword[ebx+Point.CoordX] - fstsw ax - sahf - jbe .no_sel - ;if (st0>Point.CoordX) - ffree st0 - fincstp - fld qword[ebx+Point.CoordX] - .no_sel: - add ebx,sizeof.Point - cmp ebx,edx - jl .cycle1 - fstp qword[Data_Double] -align 4 - .cycle2: ;цикл для присваивания всем Point.CoordX = min(Point.CoordX) - sub edx,sizeof.Point - bt dword[edx+Point.Prop],PROP_BIT_SELECT - jnc @f - mov esi,Data_Double - lea edi,[edx+Point.CoordX] - movsd - movsd - @@: - loop .cycle2 - ;для обновления по таймеру - mov dword[offs_last_timer],0 - .no_point: -popad - ret -endp - -align 4 -proc but_sel_points_align_coord_ymin -pushad - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .no_point - cmp [eax+Figure.OType],'Fig' - jne .no_point - - mov ebx,eax - stdcall sel_points_get_count,eax - cmp eax,1 - jle .no_point - mov ecx,[ebx+Figure.PoiCount] - or ecx,ecx - jz .no_point - cmp eax,ecx - je .no_point ;если выделенны все точки, что-бы не портить контур - - mov edx,ecx - imul edx,sizeof.Point - mov ebx,[ebx+Figure.PoiData] - add edx,ebx -align 4 - .cycle0: ;1-я выделенная точка - cmp ebx,edx - jge .no_point - bt dword[ebx+Point.Prop],PROP_BIT_SELECT - jc .cycle0end - add ebx,sizeof.Point - jmp .cycle0 - .cycle0end: - lea esi,[ebx+Point.CoordY] - mov edi,Data_Double - movsd - movsd - finit - fld qword[Data_Double] -align 4 - .cycle1: ;цикл для нахождения min(Point.CoordY) - bt dword[ebx+Point.Prop],PROP_BIT_SELECT - jnc .no_sel - fcom qword[ebx+Point.CoordY] - fstsw ax - sahf - jbe .no_sel - ;if (st0>Point.CoordY) - ffree st0 - fincstp - fld qword[ebx+Point.CoordY] - .no_sel: - add ebx,sizeof.Point - cmp ebx,edx - jl .cycle1 - fstp qword[Data_Double] -align 4 - .cycle2: ;цикл для присваивания всем Point.CoordY = min(Point.CoordY) - sub edx,sizeof.Point - bt dword[edx+Point.Prop],PROP_BIT_SELECT - jnc @f - mov esi,Data_Double - lea edi,[edx+Point.CoordY] - movsd - movsd - @@: - loop .cycle2 - ;для обновления по таймеру - mov dword[offs_last_timer],0 - .no_point: -popad - ret -endp - -align 4 -proc but_sel_points_align_coord_xmax -pushad - stdcall [tl_node_get_data],tree1 - or eax,eax - jz .no_point - cmp [eax+Figure.OType],'Fig' - jne .no_point - - mov ebx,eax - stdcall sel_points_get_count,eax - cmp eax,1 - jle .no_point - mov ecx,[ebx+Figure.PoiCount] - or ecx,ecx - jz .no_point - cmp eax,ecx - je .no_point ;если выделенны все точки, что-бы не портить контур - - mov edx,ecx - imul edx,sizeof.Point - mov ebx,[ebx+Figure.PoiData] - add edx,ebx -align 4 - .cycle0: ;1-я выделенная точка - cmp ebx,edx - jge .no_point - bt dword[ebx+Point.Prop],PROP_BIT_SELECT - jc .cycle0end - add ebx,sizeof.Point - jmp .cycle0 - .cycle0end: - lea esi,[ebx+Point.CoordX] - mov edi,Data_Double - movsd - movsd - finit - fld qword[Data_Double] -align 4 - .cycle1: ;цикл для нахождения max(Point.CoordX) - bt dword[ebx+Point.Prop],PROP_BIT_SELECT - jnc .no_sel - fcom qword[ebx+Point.CoordX] - fstsw ax - sahf - jae .no_sel - ;if (st0'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 - - -;данные для диалога открытия файлов -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 '/sys',0 - -communication_area_name: - db 'FFFFFFFF_open_dialog',0 -open_dialog_name: - db 'opendial',0 -communication_area_default_path: - db '/sys/File managers/',0 - -Filter: -dd Filter.end - Filter ;.1 -.1: db 'NC',0 -.2: db 'PNG',0 -.end: -db 0 - - -align 4 -system_dir_0 db '/sys/lib/' -lib_name_0 db 'proc_lib.obj',0 -system_dir_1 db '/sys/lib/' -lib_name_1 db 'libimg.obj',0 -system_dir_2 db '/sys/lib/' -lib_name_2 db 'buf2d.obj',0 -system_dir_3 db '/sys/lib/' -lib_name_3 db 'box_lib.obj',0 - -align 4 -l_libs_start: - lib_0 l_libs lib_name_0, file_name, system_dir_0, import_proclib - lib_1 l_libs lib_name_1, file_name, system_dir_1, import_libimg - lib_2 l_libs lib_name_2, library_path, system_dir_2, import_buf2d - lib_3 l_libs lib_name_3, file_name, system_dir_3, import_box_lib -l_libs_end: - -align 4 -import_libimg: - 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 -import_proclib: - OpenDialog_Init dd aOpenDialog_Init - OpenDialog_Start dd aOpenDialog_Start - OpenDialog_Set_file_name dd aOpenDialog_Set_file_name - OpenDialog_Set_file_ext dd aOpenDialog_Set_file_ext -dd 0,0 - aOpenDialog_Init db 'OpenDialog_init',0 - aOpenDialog_Start db 'OpenDialog_start',0 - aOpenDialog_Set_file_name db 'OpenDialog_set_file_name',0 - aOpenDialog_Set_file_ext db 'OpenDialog_set_file_ext',0 - -align 4 -import_buf2d: - init dd sz_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_resize dd sz_buf2d_resize - buf2d_line dd sz_buf2d_line - buf2d_line_sm dd sz_buf2d_line_sm - buf2d_rect_by_size dd sz_buf2d_rect_by_size - buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size - buf2d_circle dd sz_buf2d_circle - buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - buf2d_crop_color dd sz_buf2d_crop_color - buf2d_flip_h dd sz_buf2d_flip_h - buf2d_flip_v dd sz_buf2d_flip_v - buf2d_offset_h dd sz_buf2d_offset_h - buf2d_flood_fill dd sz_buf2d_flood_fill - buf2d_set_pixel dd sz_buf2d_set_pixel - dd 0,0 - sz_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_resize db 'buf2d_resize',0 - sz_buf2d_line db 'buf2d_line',0 - sz_buf2d_line_sm db 'buf2d_line_sm',0 - sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 - sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 - sz_buf2d_circle db 'buf2d_circle',0 - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - sz_buf2d_crop_color db 'buf2d_crop_color',0 - sz_buf2d_flip_h db 'buf2d_flip_h',0 - sz_buf2d_flip_v db 'buf2d_flip_v',0 - sz_buf2d_offset_h db 'buf2d_offset_h',0 - sz_buf2d_flood_fill db 'buf2d_flood_fill',0 - sz_buf2d_set_pixel db 'buf2d_set_pixel',0 - -align 4 -import_box_lib: - dd sz_init1 - - init_checkbox dd sz_Init_checkbox - check_box_draw dd sz_Check_box_draw - check_box_mouse dd sz_Check_box_mouse - ;version_ch dd sz_Version_ch - - option_box_draw dd sz_Option_box_draw - option_box_mouse dd sz_Option_box_mouse - ;version_op dd sz_Version_op - - edit_box_draw dd sz_edit_box_draw - edit_box_key dd sz_edit_box_key - edit_box_mouse dd sz_edit_box_mouse - edit_box_set_text dd sz_edit_box_set_text - scrollbar_ver_draw dd sz_scrollbar_ver_draw - scrollbar_hor_draw dd sz_scrollbar_hor_draw - - 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_node_move_up dd sz_tl_node_move_up - tl_node_move_down dd sz_tl_node_move_down - 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_poi_get_info dd sz_tl_node_poi_get_info - tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info - tl_node_poi_get_data dd sz_tl_node_poi_get_data - - dd 0,0 - sz_init1 db 'lib_init',0 - - sz_Init_checkbox db 'init_checkbox2',0 - sz_Check_box_draw db 'check_box_draw2',0 - sz_Check_box_mouse db 'check_box_mouse2',0 - ;sz_Version_ch db 'version_ch2',0 - - sz_Option_box_draw db 'option_box_draw',0 - sz_Option_box_mouse db 'option_box_mouse',0 - ;sz_Version_op db 'version_op',0 - - sz_edit_box_draw db 'edit_box_draw',0 - sz_edit_box_key db 'edit_box_key',0 - sz_edit_box_mouse db 'edit_box_mouse',0 - sz_edit_box_set_text db 'edit_box_set_text',0 - sz_scrollbar_ver_draw db 'scrollbar_v_draw',0 - sz_scrollbar_hor_draw db 'scrollbar_h_draw',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_node_move_up db 'tl_node_move_up',0 - sz_tl_node_move_down db 'tl_node_move_down',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_poi_get_info db 'tl_node_poi_get_info',0 - sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0 - sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0 - -align 4 -mouse_dd dd 0 -last_time dd 0 - -align 16 -sc system_colors - -align 16 -procinfo process_information - -align 4 -buf_0: dd 0 ;указатель на буфер изображения -.l: dw 205 ;+4 left -.t: dw 35 ;+6 top -.w: dd 384 ;+8 w -.h: dd 350 ;+12 h -.color: dd 0xffffd0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_1: - dd 0 ;указатель на буфер изображения - dd 0 ;+4 left,top -.w: dd 0 -.h: dd 0,0,24 ;+12 color,bit in pixel - -font_h dd 0 ;высота шрифта - -align 4 -buf_png: - dd 0,0 -.w: dd 0 -.h: dd 0,0xffffff,24 - -align 4 -el_focus dd tree1 -tree1 tree_list size_one_list,1000+2, tl_key_no_edit+tl_draw_par_line,\ - 16,16, 0xffffff,0xb0d0ff,0x400040, 5,35,195-16,340, 16,Figure.Caption,0,\ - el_focus,w_scr_t1,0 - -align 4 -w_scr_t1 scrollbar 16,0, 3,0, 15, 100, 0,0, 0,0,0, 1 - -;input: -; eax - число -; edi - буфер для строки -; len - длинна буфера -;output: -align 4 -proc convert_int_to_str uses eax ecx edx edi esi, len:dword - mov esi,[len] - add esi,edi - dec esi - call .str - ret -endp - -align 4 -.str: - mov ecx,10 - cmp eax,ecx - jb @f - xor edx,edx - div ecx - push edx - ;dec edi ;смещение необходимое для записи с конца строки - call .str - pop eax - @@: - cmp edi,esi - jge @f - or al,0x30 - stosb - mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор - @@: - ret - -align 4 -proc mem_copy uses ecx esi edi, destination:dword, source:dword, len:dword - cld - mov esi, dword[source] - mov edi, dword[destination] - mov ecx, dword[len] - rep movsb - ret -endp - -align 16 -i_end: - rb 2048 -thread_coords: - rb 2048 -thread_scale: - rb 2048 -thread_n_file: - rb 2048 -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: - +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' + dd 1,start,i_end,mem,stacktop,file_name,sys_path + +include '../../macros.inc' +include '../../proc32.inc' +include '../../KOSfuncs.inc' +include '../../load_img.inc' +include '../../load_lib.mac' +include '../../develop/libraries/libs-dev/libimg/libimg.inc' +include '../../develop/libraries/box_lib/box_lib.mac' +include 'lang.inc' +include 'cnc_editor.inc' +include '../../develop/info3ds/info_fun_float.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +caption db 'CNC editor 23.05.19',0 ;подпись окна + +run_file_70 FileInfoBlock + +offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера + +IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +image_data_toolbar dd 0 ;указатель на временную память. для нужен преобразования изображения +icon_tl_sys dd 0 ;указатель на память для хранения системных иконок +icon_toolbar dd 0 ;указатель на память для хранения иконок объектов + +include 'wnd_point_coords.inc' +include 'wnd_scale.inc' +include 'wnd_new_file.inc' + +align 4 +start: + ;--- copy cmd line --- + mov esi,file_name + mov edi,openfile_path +@@: + lodsd + or eax,eax + jz @f ;выход, если 0 + stosd + jmp @b +@@: + stosd + + load_libraries l_libs_start,l_libs_end + ;проверка на сколько удачно загузилась библиотека + mov ebp,lib_0 + 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,0xC0000027 + stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога + + stdcall [buf2d_create], buf_0 ;создание буфера + + ;шрифт делаем до создания панели (для экономии указателя image_data_toolbar) + include_image_file '..\..\fs\kfar\trunk\font6x9.bmp', image_data_toolbar, buf_1.w,buf_1.h + stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер + stdcall mem.Free,[image_data_toolbar] ;освобождаем память + stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит + stdcall [buf2d_convert_text_matrix], buf_1 + mov eax,[buf_1.h] + shr eax,8 + mov [font_h],eax + + include_image_file 'toolbar.png', image_data_toolbar + + mov dword[w_scr_t1.type],1 + stdcall dword[tl_data_init], tree1 + ;системные иконки 16*16 для tree_list + include_image_file 'tl_sys_16.png', icon_tl_sys + mov eax,dword[icon_tl_sys] + mov dword[tree1.data_img_sys],eax + + include_image_file 'objects.png', icon_toolbar + mov eax,dword[icon_toolbar] + mov dword[tree1.data_img],eax + + ;*** установка времени для таймера + mcall SF_SYSTEM_GET,SSF_TIME_COUNT + mov [last_time],eax + + ;open file from cmd line + cmp dword[openfile_path],0 + je @f + call but_open_file.no_dlg + @@: + +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 + jne @f + call timer_funct + jmp still + @@: + + cmp al,1 + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + cmp al,6 + jne @f + mcall SF_THREAD_INFO,procinfo,-1 + cmp ax,word[procinfo.window_stack_position] + jne @f ;окно не активно + call mouse + @@: + jmp still + +align 4 +mouse: + push eax ebx ecx + mcall SF_MOUSE_GET,SSF_BUTTON_EXT + bt eax,8 + jnc @f + ;mouse l. but. press + call mouse_left_d + jmp .end_l + @@: + ;bt eax,0 + ;jnc @f + ;mouse l. but. move + ;call mouse_left_m + ;jmp .end_l + ;@@: + bt eax,16 + jnc .end_l + ;mouse l. but. up + call mouse_left_u + ;jmp .end_l + .end_l: + bt eax,9 + jnc @f + ;mouse r. but. press + call mouse_right_d + ;jmp .end_r + @@: + ;bt eax,1 + ;jnc @f + ;mouse r. but. move + ;call mouse_right_m + ;jmp .end_r + ;@@: + ;.end_r: + + call buf_get_mouse_coord + cmp eax,-1 + je .end0 + shl eax,1 + sub eax,[buf_0.w] + sar eax,1 + mov [mouse_prop_x],eax + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .end0 + cmp [eax+Figure.OType],'Fig' + je @f + cmp [eax+Figure.OType],'Obj' + je .end1 + jmp .end0 + .end1: + mov eax,ObjData + @@: + mov ecx,eax + shl ebx,1 + sub ebx,[buf_0.h] + sar ebx,1 + mov [mouse_prop_y],ebx + + mcall SF_MOUSE_GET,SSF_SCROLL_DATA + test ax,ax + jz .end0 + finit + fld qword[zoom_plus] + fld1 + fsubp + fld st0 ;for Y coord + + ;for X coord + fild dword[mouse_prop_x] + fmulp st1,st0 + + mov ebx,eax + test ax,0x8000 + jnz .decr + ;увеличение масштаба + fchs + fild dword[ecx+Figure.MCentrX] ;add old value + fmul qword[zoom_plus] + faddp + + fld qword[ecx+Figure.MScale] + fmul qword[zoom_plus] + ;if (Figure.MScale>16.0) + ;... + jmp @f + .decr: + ;уменьшение масштаба + fild dword[ecx+Figure.MCentrX] ;add old value + fdiv qword[zoom_plus] + faddp + + fld qword[ecx+Figure.MScale] + fdiv qword[zoom_plus] + fld1 + fcomp + fstsw ax + sahf + jbe @f + ;if (Figure.MScale<1.0) + ffree st0 + fincstp + ffree st0 + fincstp + fldz ;default Figure.MCentrX + fld1 ;default Figure.MScale + mov dword[ecx+Figure.MCentrY],0 + @@: + fstp qword[ecx+Figure.MScale] + fistp dword[ecx+Figure.MCentrX] + + ;for Y coord + fild dword[mouse_prop_y] + fmulp st1,st0 + test bx,0x8000 + jnz .decr_y + ;увеличение масштаба + fild dword[ecx+Figure.MCentrY] ;add old value + fmul qword[zoom_plus] + faddp + jmp @f + .decr_y: + ;уменьшение масштаба + fchs + fild dword[ecx+Figure.MCentrY] ;add old value + fdiv qword[zoom_plus] + faddp + @@: + fistp dword[ecx+Figure.MCentrY] + + mov dword[offs_last_timer],0 + .end0: + + stdcall [tl_mouse], tree1 + pop ecx ebx eax + ret + +;output: +; eax - buffer coord X (если курсор за буфером -1) +; ebx - buffer coord Y (если курсор за буфером -1) +align 4 +proc buf_get_mouse_coord + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION + cmp ax,word[buf_0.t] + jl .no_buf ;не попали в окно буфера по оси y + mov ebx,eax + shr ebx,16 + cmp bx,word[buf_0.l] + jl .no_buf ;не попали в окно буфера по оси x + + and eax,0xffff ;оставляем координату y + sub ax,word[buf_0.t] + cmp eax,[buf_0.h] + jg .no_buf + sub bx,word[buf_0.l] + cmp ebx,[buf_0.w] + jg .no_buf + xchg eax,ebx + jmp .end_f + .no_buf: + xor eax,eax + not eax + xor ebx,ebx + not ebx + .end_f: + ret +endp + +align 4 +proc timer_funct + pushad + mcall SF_SYSTEM_GET,SSF_TIME_COUNT + mov [last_time],eax + + ;просматриваем выделенный блок данных + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .end_f + cmp dword[offs_last_timer],eax + je .end_f + ;если выделенный блок данных не совпадает с последним запомненным + mov dword[offs_last_timer],eax + + stdcall get_object_data,eax + or ecx,ecx + jz .end_oblo + stdcall draw_obj2d,ecx + stdcall [buf2d_draw], buf_0 + jmp .end_f + .end_oblo: + + cmp [eax+Figure.OType],'Fig' + jne .end_fblo + stdcall draw_fig2d,eax + stdcall [buf2d_draw], buf_0 + jmp .end_f + .end_fblo: + + .end_f: + + popad + ret +endp + +align 4 +draw_window: +pushad + mcall SF_REDRAW,SSF_BEGIN_DRAW + + ; *** рисование главного окна (выполняется 1 раз при запуске) *** + mov edx,[sc.work] + or edx,0x33000000 + mov edi,caption + mcall SF_CREATE_WINDOW,(20 shl 16)+599,(20 shl 16)+415 + + mcall SF_THREAD_INFO,procinfo,-1 + mov eax,dword[procinfo.box.height] + cmp eax,120 + jge @f + mov eax,120 ;min size + @@: + sub eax,65 + mov dword[tree1.box_height],eax + mov word[w_scr_t1.y_size],ax ;новые размеры скроллинга + mov ebx,dword[procinfo.box.width] + cmp ebx,270 + jge @f + mov ebx,270 + @@: + sub ebx,215 + cmp eax,dword[buf_0.h] ;смотрим размер буфера + jne @f + cmp ebx,dword[buf_0.w] + jne @f + jmp .end0 + @@: + stdcall [buf2d_resize],buf_0,ebx,eax,1 + mov eax,ObjData + mov ecx,[eax+Object.FigCount] + or ecx,ecx + jz .end0 + mov eax,[eax+Object.FigData] + xor edx,edx + .cycle0: + stdcall FigCalculateSizes,[eax+4*edx],0 + inc edx + loop .cycle0 + stdcall ObjCalculateScale,ObjData + mov dword[offs_last_timer],0 + call timer_funct + .end0: + + ; *** создание кнопок на панель *** + mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,3, [sc.work_button] + + add ebx,25 shl 16 + mcall ,,,4 ;open + add ebx,25 shl 16 + mcall ,,,5 ;save + + add ebx,30 shl 16 + mcall ,,,6 ;captions on off + + add ebx,25 shl 16 + mcall ,,,7 ;figure move up + add ebx,25 shl 16 + mcall ,,,8 ;figure move down + + add ebx,25 shl 16 + mcall ,,,9 ;sel points dlg + + add ebx,25 shl 16 + mcall ,,,10 ;sel points move up + add ebx,25 shl 16 + mcall ,,,11 ;sel points move down + + add ebx,25 shl 16 + mcall ,,,12 ;align sel points left + add ebx,25 shl 16 + mcall ,,,13 ;align sel points right + add ebx,25 shl 16 + mcall ,,,14 ;align sel points top + add ebx,25 shl 16 + mcall ,,,15 ;align sel points bottom + add ebx,25 shl 16 + mcall ,,,16 ;optimize figure + + add ebx,30 shl 16 + mcall ,,,17 ;copy to clipboard + add ebx,25 shl 16 + mcall ,,,18 ;paste from clipboard + + add ebx,25 shl 16 + mcall ,,,19 ;sel points del + + add ebx,30 shl 16 + mcall ,,,20 ;restore zoom + + add ebx,30 shl 16 + mcall ,,,21 ;.png + + add ebx,25 shl 16 + mcall ,,,22 ;options scale + + ; *** рисование иконок на кнопках *** + mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16,(7 shl 16)+7 ;icon new + + 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) ;captions on off + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;figure move up + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;figure move down + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;sel points dlg + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;sel points move up + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;sel points move down + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;aling sel points left + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;aling sel points right + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;aling sel points top + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;aling sel points bottom + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;optimize figure + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(30 shl 16) ;copy to clipboard + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;paste from clipboard + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;sel points del + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(30 shl 16) ;restore zoom + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(30 shl 16) ;.png + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;options scale + int 0x40 + + mov dword[w_scr_t1.all_redraw],1 + stdcall [tl_draw], tree1 + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW,SSF_END_DRAW +popad + ret + +align 4 +key: + mcall SF_GET_KEY + cmp dword[el_focus], tree1 + jne @f + stdcall [tl_key], tree1 + jmp .end0 + @@: + + cmp ah,178 ;Up + jne @f + call but_selection_move_up + jmp .end0 + @@: + cmp ah,177 ;Down + jne @f + call but_selection_move_down + jmp .end0 + @@: + cmp ah,176 ;Left + jne @f + call but_selection_move_up + jmp .end0 + @@: + cmp ah,179 ;Right + jne @f + call but_selection_move_down + jmp .end0 + @@: + cmp ah,182 ;Delete + jne @f + call but_sel_points_del + jmp .end0 + @@: + + mov ecx,eax + mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS + bt eax,2 ;left Ctrl + jc .key_Ctrl + bt eax,3 ;right Ctrl + jc .key_Ctrl + jmp .end0 + .key_Ctrl: + cmp ch,15 ;111 ;Ctrl+O + jne @f + call but_open_file + @@: + cmp ch,19 ;115 ;Ctrl+S + jne @f + call but_save_file + @@: + cmp ch,14 ;110 ;Ctrl+N + jne @f + call but_new_file + @@: + cmp ch,1 ;97 ;Ctrl+A + jne @f + call but_sel_points_all + @@: + .end0: + 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_captions_on_off + jmp still + @@: + cmp ah,7 + jne @f + call but_sel_figure_move_up + jmp still + @@: + cmp ah,8 + jne @f + call but_sel_figure_move_down + jmp still + @@: + cmp ah,9 + jne @f + call but_dlg_point_coords + jmp still + @@: + cmp ah,10 + jne @f + call but_sel_points_move_up + jmp still + @@: + cmp ah,11 + jne @f + call but_sel_points_move_down + jmp still + @@: + cmp ah,12 + jne @f + call but_sel_points_align_coord_xmin + jmp still + @@: + cmp ah,13 + jne @f + call but_sel_points_align_coord_xmax + jmp still + @@: + cmp ah,14 + jne @f + call but_sel_points_align_coord_ymax + jmp still + @@: + cmp ah,15 + jne @f + call but_sel_points_align_coord_ymin + @@: + cmp ah,16 + jne @f + call but_points_optimize + jmp still + @@: + cmp ah,17 + jne @f + call but_clipboard_copy_points + jmp still + @@: + cmp ah,18 + jne @f + call but_clipboard_paste_points + jmp still + @@: + cmp ah,19 + jne @f + call but_sel_points_del + jmp still + @@: + cmp ah,20 + jne @f + call but_restore_zoom + jmp still + @@: + cmp ah,21 + jne @f + call but_save_png + jmp still + @@: + cmp ah,22 + jne @f + call but_dlg_opt_scale + jmp still + @@: + + ;cmp ah,23 + ;jne @f + ;call but_... + ;jmp still + ;@@: + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 + stdcall mem.Free,[image_data_toolbar] + stdcall mem.Free,[open_file_data] + mcall SF_TERMINATE_PROCESS + + +align 4 +but_new_file: + cmp byte[wnd_n_file],0 + jne .end_f +pushad + mcall SF_CREATE_THREAD,1,start_n_file,thread_n_file +popad + .end_f: + ret + +align 4 +open_file_data dd 0 ;указатель на память для открытия файлов +open_file_size dd 0 ;размер открытого файла + +align 4 +but_open_file: + copy_path open_dialog_name,communication_area_default_path,file_name,0 + pushad + mov [OpenDialog_data.type],0 + stdcall [OpenDialog_Start],OpenDialog_data + cmp [OpenDialog_data.status],2 + je .end_open_file + ;код при удачном открытии диалога + jmp .end0 +.no_dlg: ;если минуем диалог открытия файла + pushad + mov esi,openfile_path + stdcall str_len,esi + add esi,eax + @@: ;цикл для поиска начала имени файла + dec esi + cmp byte[esi],'/' + je @f + cmp byte[esi],0x5c ;'\' + je @f + cmp esi,openfile_path + jg @b + @@: + inc esi + stdcall [OpenDialog_Set_file_name],OpenDialog_data,esi ;копируем имя файла в диалог сохранения + .end0: + + mov [run_file_70.Function], SSF_GET_INFO + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], 0 + mov dword[run_file_70.Buffer], open_b + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mcall SF_FILE,run_file_70 + + mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах + inc ecx ;for text files + stdcall mem.ReAlloc,[open_file_data],ecx + mov [open_file_data],eax + dec ecx ;for text files + mov byte[eax+ecx],0 ;for text files + + 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], ecx + m2m dword[run_file_70.Buffer], dword[open_file_data] + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mcall SF_FILE,run_file_70 ;загружаем файл изображения + test eax,eax + jnz .end_open_file + cmp ebx,0xffffffff + je .end_open_file + + mov [open_file_size],ebx + mcall SF_SET_CAPTION,1,openfile_path + + ;--- + and dword[tree1.style],not tl_cursor_pos_limited + stdcall FileInit,[open_file_data],[open_file_size] + or dword[tree1.style], tl_cursor_pos_limited + stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + .end_open_file: + popad + ret + +align 4 +proc but_save_file +locals + pCou dd ? + pData dd ? +endl + pushad + copy_path open_dialog_name,communication_area_default_path,file_name,0 + mov [OpenDialog_data.type],1 + stdcall [OpenDialog_Set_file_ext],OpenDialog_data,Filter.1 ;.nc + stdcall [OpenDialog_Start],OpenDialog_data + cmp [OpenDialog_data.status],2 + je .end_save_file + ;код при удачном открытии диалога + + ;*** определение примерного размера файла + call get_file_save_size + stdcall mem.ReAlloc,[open_file_data],ecx + mov [open_file_data],eax + mov [open_file_size],ecx + + ;clear memory + mov edi,eax + xor eax,eax + shr ecx,2 + rep stosd + + ;*** пишем информацию в память + mov edi,[open_file_data] + mov ebx,ObjData + mov edx,[ebx+Object.FigCount] + or edx,edx + jz .cycle1end + mov esi,[ebx+Object.FigData] +align 4 + .cycle1: ;цикл по фигурам + ;param 1 + mov eax,[esi] + or eax,eax + jz .err_save + mov eax,[eax+Figure.PoiCount] + mov [pCou],eax + or eax,eax + jnz @f + mov eax,[esi] + lea eax,[eax+Figure.Caption] + stdcall str_cat,edi,eax + stdcall str_len,edi + add edi,eax + stdcall str_cat,edi,txt_nl + @@: + cmp dword[pCou],0 + je .cycle2end + mov eax,[esi] + mov eax,[eax+Figure.PoiData] + mov [pData],eax + mov word[NumberSymbolsAD],8 +align 4 + .cycle2: ;цикл по точкам + stdcall str_cat,edi,txt_s_poi + ;param 1 + push edi esi + mov esi,[pData] + lea esi,[esi+Point.CoordX] + mov edi,Data_Double + movsd + movsd + pop esi edi + call DoubleFloat_to_String + call String_crop_0 + stdcall str_cat,edi,Data_String + stdcall str_cat,edi,txt_s_poi_Y + ;param 2 + push edi esi + mov esi,[pData] + lea esi,[esi+Point.CoordY] + mov edi,Data_Double + movsd + movsd + pop esi edi + call DoubleFloat_to_String + call String_crop_0 + stdcall str_cat,edi,Data_String + ; + stdcall str_cat,edi,txt_nl + add dword[pData],sizeof.Point + dec dword[pCou] + jnz .cycle2 + .cycle2end: + add esi,4 + dec edx + jnz .cycle1 + .cycle1end: + + jmp @f + .err_save: + notify_window_run txt_err_save_txt_file_1 + @@: + + ;*** определение параметров файла + mov edi,[open_file_data] + stdcall str_len,edi + ;;cmp eax,[open_file_size] + mov [run_file_70.Count],eax ;размер файла + + ;*** сохраняем файл + mov [run_file_70.Function], SSF_CREATE_FILE + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov ebx, dword[open_file_data] + mov [run_file_70.Buffer], ebx + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mcall SF_FILE,run_file_70 + or eax,eax + jz .end_save_file + or ebx,ebx + jnz .end_save_file + ;сообщение о неудачном сохранении + notify_window_run txt_err_save_txt_file_0 + .end_save_file: + popad + ret +endp + +;output: +; ecx - memory size for save file +align 4 +proc get_file_save_size uses eax ebx edx esi + mov ecx,100 ;title + mov ebx,ObjData + add ecx,50 ;object + mov edx,[ebx+Object.FigCount] + or edx,edx + jz .cycle1end + mov esi,[ebx+Object.FigData] +align 4 + .cycle1: ; цикл по фигурам + add ecx,80 ;figure + mov eax,[esi] + or eax,eax + jz @f + mov eax,[eax+Figure.PoiCount] + imul eax,70 + add ecx,eax ;points + @@: + add esi,4 + dec edx + jnz .cycle1 + .cycle1end: + ret +endp + +align 4 +but_captions_on_off: + xor dword[opt_draw],1 + mov dword[offs_last_timer],0 ;для обновления по таймеру + ret + +align 4 +but_sel_figure_move_up: + pushad + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .end_fblo + cmp [eax+Figure.OType],'Fig' + jne .end_fblo + stdcall found_parent_obj,eax + or eax,eax + jz .end_f ;if not found + or ecx,ecx + jz .fig_is_0 ;если фигура в начале списка + mov ebx,[eax+Object.FigData] + mov edx,[ebx+4*ecx] ;передвигаемая фигура + mov edi,[ebx+4*ecx-4] + ;меняем фигуры местами + mov [ebx+4*ecx],edi + mov [ebx+4*ecx-4],edx + ;меняем фигуры в списке + stdcall [tl_node_move_up],tree1 + jmp .end_f + .fig_is_0: + notify_window_run txt_err_figure_is_0 + jmp .end_f + .end_fblo: + notify_window_run txt_err_no_figure_select + .end_f: + popad + ret + +align 4 +but_save_png: + pushad + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .end_save_file + + stdcall get_object_data,eax + or ecx,ecx + jz .end_oblo + stdcall draw_obj2d_png,ecx + jmp .beg0 + .end_oblo: + +; cmp [eax+Figure.OType],'Fig' +; jne .end_fblo +; stdcall draw_fig2d_png,eax +; jmp .beg0 +; .end_fblo: + + jmp .end_save_file + .beg0: + copy_path open_dialog_name,communication_area_default_path,file_name,0 + mov [OpenDialog_data.type],1 + stdcall [OpenDialog_Set_file_ext],OpenDialog_data,Filter.2 ;.png + stdcall [OpenDialog_Start],OpenDialog_data + cmp [OpenDialog_data.status],1 + jne .end_save_file + ;код при удачном открытии диалога + mov dword[png_data],0 + + ;create image struct + stdcall [img_create], [buf_png.w], [buf_png.h], Image.bpp24 + mov ebx,eax + test eax,eax + jz @f + ;copy foto to image buffer + mov edi,[eax+Image.Data] + mov esi,[buf_png] + mov ecx,[buf_png.w] + mov edx,[buf_png.h] + imul ecx,edx + imul ecx,3 + shr ecx,2 ;OpenGL buffer align to 4 + rep movsd + + ;encode image + stdcall [img_encode], eax, LIBIMG_FORMAT_PNG, 0 + test eax,eax + jz @f + mov [png_data],eax + mov [png_size],ecx + @@: + stdcall [img_destroy],ebx + + ; заполняем структуру для сохранения файла + mov ebx,run_file_70 + mov dword[ebx],SSF_CREATE_FILE + mov eax,[png_size] + mov [ebx+12],eax ;file size + mov eax,[png_data] + mov [ebx+16],eax + mov dword[ebx+FileInfoBlock.FileName], openfile_path + + mcall SF_FILE,run_file_70 + test eax,eax + jnz .save_error + ;notify_window_run openfile_path + jmp @f + .save_error: + ;сообщение о неудачном сохранении + notify_window_run txt_err_save_img_file + @@: + mcall SF_SYS_MISC, SSF_MEM_FREE, [png_data] + .end_save_file: + popad + ret + +;description: +; выделенные точки сдвигаются вверх +align 4 +proc but_sel_points_move_up +locals + pObj dd ? + pFig dd ? + idFig dd ? +endl + pushad + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .no_point + cmp [eax+Figure.OType],'Fig' + jne .no_point + + mov [pFig],eax + stdcall sel_points_get_count,eax + or eax,eax + jz .no_point + + stdcall found_parent_obj,[pFig] + or eax,eax + jz .end_f ;if not found + mov [pObj],eax + mov [idFig],ecx + + ;проверяем выделенные точки + mov eax,[pFig] + mov ecx,[eax+Figure.PoiCount] + or ecx,ecx + jz .no_point + mov ebx,[eax+Figure.PoiData] + xor eax,eax + .cycle0: + bt dword[ebx+Point.Prop],PROP_BIT_SELECT + jnc @f + or eax,eax + jz .point_is_0 + stdcall point_move_up, [pObj],[pFig],[idFig],ebx;,eax + @@: + inc eax + add ebx,sizeof.Point + loop .cycle0 + + ;для обновления по таймеру + mov dword[offs_last_timer],0 + jmp .end_f + .point_is_0: + notify_window_run txt_err_poi_is_0 + jmp .end_f + .no_point: + notify_window_run txt_err_no_point_sel + .end_f: + popad + ret +endp + +;description: +; выделенные точки сдвигаются вниз +align 4 +proc but_sel_points_move_down +locals + pObj dd ? + pFig dd ? + idFig dd ? +endl + pushad + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .no_point + cmp [eax+Figure.OType],'Fig' + jne .no_point + + mov [pFig],eax + stdcall sel_points_get_count,eax + or eax,eax + jz .no_point + + stdcall found_parent_obj,[pFig] + or eax,eax + jz .end_f ;if not found + mov [pObj],eax + mov [idFig],ecx + + ;проверяем выделенные точки + mov eax,[pFig] + mov ecx,[eax+Figure.PoiCount] + or ecx,ecx + jz .no_point + mov ebx,ecx + dec ebx + imul ebx,sizeof.Point + add ebx,[eax+Figure.PoiData] + .cycle0: + bt dword[ebx+Point.Prop],PROP_BIT_SELECT + jnc @f + cmp ecx,[eax+Figure.PoiCount] + je .point_is_last + mov edi,ebx + add edi,sizeof.Point + stdcall point_move_up, [pObj],[pFig],[idFig],edi;,ecx + @@: + sub ebx,sizeof.Point + loop .cycle0 + + ;для обновления по таймеру + mov dword[offs_last_timer],0 + jmp .end_f + .point_is_last: + notify_window_run txt_err_poi_is_last + jmp .end_f + .no_point: + notify_window_run txt_err_no_point_sel + .end_f: + popad + ret +endp + +;description: +; выделение выбранной точки сдвигается вверх +align 4 +proc but_selection_move_up +locals + pFig dd ? +endl + pushad + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .end_fblo + cmp [eax+Figure.OType],'Fig' + jne .end_fblo + + mov [pFig],eax + stdcall sel_points_get_count,eax + cmp eax,1 + jne .no_point + + ;проверяем выделенные точки + mov eax,[pFig] + mov ecx,[eax+Figure.PoiCount] + or ecx,ecx + jz .no_point + dec ecx + jecxz .end_f + mov ebx,[eax+Figure.PoiData] + .cycle0: + add ebx,sizeof.Point + bt dword[ebx+Point.Prop],PROP_BIT_SELECT + jnc @f + btr dword[ebx+Point.Prop],PROP_BIT_SELECT + bts dword[ebx+Point.Prop-sizeof.Point],PROP_BIT_SELECT + xor ecx,ecx + inc ecx ;ecx = 1 - for exit from cycle + @@: + loop .cycle0 + + ;для обновления по таймеру + mov dword[offs_last_timer],0 + jmp .end_f + .no_point: + notify_window_run txt_err_no_point_sel_1 + jmp .end_f + .end_fblo: + ;notify_window_run txt_err_no_figure_select + .end_f: + popad + ret +endp + +;description: +; выделение выбранной точки сдвигается вниз +align 4 +proc but_selection_move_down +locals + pFig dd ? +endl + pushad + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .end_fblo + cmp [eax+Figure.OType],'Fig' + jne .end_fblo + + mov [pFig],eax + stdcall sel_points_get_count,eax + cmp eax,1 + jne .no_point + + ;проверяем выделенные точки + mov eax,[pFig] + mov ecx,[eax+Figure.PoiCount] + or ecx,ecx + jz .no_point + dec ecx + jecxz .end_f + mov ebx,[eax+Figure.PoiData] + .cycle0: + bt dword[ebx+Point.Prop],PROP_BIT_SELECT + jnc @f + btr dword[ebx+Point.Prop],PROP_BIT_SELECT + bts dword[ebx+Point.Prop+sizeof.Point],PROP_BIT_SELECT + xor ecx,ecx + inc ecx ;ecx = 1 - for exit from cycle + @@: + add ebx,sizeof.Point + loop .cycle0 + + ;для обновления по таймеру + mov dword[offs_last_timer],0 + jmp .end_f + .no_point: + notify_window_run txt_err_no_point_sel_1 + jmp .end_f + .end_fblo: + ;notify_window_run txt_err_no_figure_select + .end_f: + popad + ret +endp + +;output: +; eax - couunt new points +align 4 +proc but_clipboard_copy_points uses ebx ecx edx edi esi +locals + pData dd 0 + pBuf dd 0 +endl + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .no_point + cmp [eax+Figure.OType],'Fig' + jne .no_point + + mov ecx,[eax+Figure.PoiData] + mov [pData],ecx + mov ecx,[eax+Figure.PoiCount] + stdcall sel_points_get_count,eax + or eax,eax + jz .no_point + push eax + imul eax,32 ;for string 'X___.________ Y___.________^^' + stdcall mem.Alloc,eax + mov [pBuf],eax + + mov edx,eax + mov dword[edx+4],0 ;text data + mov dword[edx+8],1 ;code 866 + add edx,12 ;system buffer header size + mov dword[edx],0 + mov word[NumberSymbolsAD],8 +align 4 + .cycle2: ;цикл по точкам + mov esi,[pData] + bt dword[esi+Point.Prop],PROP_BIT_SELECT + jnc .end0 + stdcall str_cat,edx,txt_s_poi + ;param 1 + add esi,Point.CoordX + mov edi,Data_Double + movsd + movsd + call DoubleFloat_to_String + call String_crop_0 + stdcall str_cat,edx,Data_String + stdcall str_cat,edx,txt_s_poi_Y + ;param 2 + ;;mov esi,[pData] + ;;lea esi,[esi+Point.CoordY] + mov edi,Data_Double + movsd + movsd + call DoubleFloat_to_String + call String_crop_0 + stdcall str_cat,edx,Data_String + ; + stdcall str_cat,edx,txt_nl + .end0: + add dword[pData],sizeof.Point + loop .cycle2 + .cycle2end: + + mov edx,[pBuf] + add edx,12 + stdcall str_len,edx + sub edx,12 + mov [edx],eax + add eax,12 + mov ecx,eax + mcall SF_CLIPBOARD,SSF_WRITE_CB ;,ecx,edx + stdcall mem.Free,[pBuf] + pop eax + + .no_point: + ret +endp + +;output: +; eax - couunt new points +align 4 +proc but_clipboard_paste_points uses ebx ecx edx esi edi +locals + pFig dd ? + nCount dd ? +endl + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .end0 + cmp [eax+Figure.OType],'Fig' + jne .end0 + + mov [pFig],eax + + mcall SF_CLIPBOARD,SSF_GET_SLOT_COUNT + cmp eax,1 + jl .end0 + + mov esi,eax + .cycle0: ;обратный цикл по слотам + dec esi ;номер текущего, проверяемого слота + mcall SF_CLIPBOARD,SSF_READ_CB,esi + cmp eax,1 + je .end0 + cmp eax,-1 + je .end0 + mov ecx,dword[eax] + cmp ecx,5 ;min text size + jl .end0 + cmp dword[eax+4],0 ;text + je @f + cmp esi,1 + jge .cycle0 ;если в буфере не текст, а слотов в буфере несколько, пробуем перейти к верхнему слоту + jmp .end0 + @@: + + mov esi,eax + add esi,12 ;смещение начала текста в буфере + stdcall get_max_points + or eax,eax + jz .end_f + mov [nCount],eax + mov ebx,[pFig] + mov edi,[ebx+Figure.PoiCount] + add [ebx+Figure.PoiCount],eax + add eax,edi + imul eax,sizeof.Point + stdcall mem.ReAlloc,[ebx+Figure.PoiData],eax + mov [ebx+Figure.PoiData],eax + + mov ecx,edi + mov edx,eax +align 4 + .cycle1: ;цикл для снятия выделения со старых точек + btr dword[edx+Point.Prop],PROP_BIT_SELECT + add edx,sizeof.Point + loop .cycle1 + + mov ecx,[nCount] + imul edi,sizeof.Point + add edi,eax + finit +align 4 + .cycle2: ;цикл для добавления новых точек + stdcall PointInit,edi + or eax,eax + jz .cycle2end + bts dword[edi+Point.Prop],PROP_BIT_SELECT + add edi,sizeof.Point + loop .cycle2 + .cycle2end: + or ecx,ecx + jz .end1 + ;уменьшаем объем памяти выделенный для точек + sub [ebx+Figure.PoiCount],ecx + mov eax,[ebx+Figure.PoiCount] + imul eax,sizeof.Point + stdcall mem.ReAlloc,[ebx+Figure.PoiData],eax + mov [ebx+Figure.PoiData],eax + .end1: + stdcall found_parent_obj,ebx ;get figure number in ecx + stdcall figure_update_coords,ObjData,ecx + + mov eax,[nCount] + mov dword[offs_last_timer],0 + jmp .end_f + .end0: + xor eax,eax + .end_f: + ret +endp + +align 4 +proc but_sel_points_del +locals + pFig dd ? + nDel dd ? ;need delete +endl + pushad + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .no_point + cmp [eax+Figure.OType],'Fig' + jne .no_point + + mov [pFig],eax + stdcall sel_points_get_count,eax + or eax,eax + jz .no_point + mov [nDel],eax + + ;проверяем выделенные точки + mov ebx,[pFig] + mov ecx,[ebx+Figure.PoiCount] + or ecx,ecx + jz .no_point + + cmp ecx,eax + jle .no_all + + stdcall found_parent_obj,[pFig] + or eax,eax + jz .end_f ;if not found + mov edi,[ebx+Figure.PoiData] + mov edx,[ebx+Figure.PoiCount] + imul edx,sizeof.Point + add edx,edi + + .cycle0: ;1-я выделенная точка + cmp edi,edx + jge .end0 + bt dword[edi+Point.Prop],PROP_BIT_SELECT + jc .cycle0end + add edi,sizeof.Point + jmp .cycle0 + .cycle0end: + + mov esi,edi ;следущая 1-я не выделенная точка + add esi,sizeof.Point + .cycle1: + cmp esi,edx + jge .end0 + bt dword[esi+Point.Prop],PROP_BIT_SELECT + jnc .cycle1end + add esi,sizeof.Point + jmp .cycle1 + .cycle1end: + + mov ecx,sizeof.Point + rep movsb ;замена выделенной точки + bts dword[esi+Point.Prop-sizeof.Point],PROP_BIT_SELECT ;ставим выделение на точку, что-бы потом ее удалить + + jmp .cycle0 + .end0: + + ;обновление памяти + mov eax,[ebx+Figure.PoiCount] + sub eax,[nDel] + mov [ebx+Figure.PoiCount],eax + imul eax,sizeof.Point + stdcall mem.ReAlloc,[ebx+Figure.PoiData],eax + mov [ebx+Figure.PoiData],eax + + ;перерасчет размеров фигуры + stdcall found_parent_obj,ebx ;get figure number in ecx + stdcall figure_update_coords,ObjData,ecx + + ;для обновления по таймеру + mov dword[offs_last_timer],0 + jmp .end_f + + .no_all: + notify_window_run txt_err_no_point_del + jmp .end_f + .no_point: + notify_window_run txt_err_no_point_sel + .end_f: + popad + ret +endp + +align 4 +proc but_sel_points_all uses eax ecx + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .no_point + cmp [eax+Figure.OType],'Fig' + jne .no_point + + mov ecx,[eax+Figure.PoiCount] + or ecx,ecx + jz .no_point + mov eax,[eax+Figure.PoiData] + .cycle0: ;цикл для выделенния точек + bts dword[eax+Point.Prop],PROP_BIT_SELECT + add eax,sizeof.Point + loop .cycle0 + ;для обновления по таймеру + mov dword[offs_last_timer],0 + .no_point: + ret +endp + +align 4 +proc but_sel_points_align_coord_xmin +pushad + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .no_point + cmp [eax+Figure.OType],'Fig' + jne .no_point + + mov ebx,eax + stdcall sel_points_get_count,eax + cmp eax,1 + jle .no_point + mov ecx,[ebx+Figure.PoiCount] + or ecx,ecx + jz .no_point + cmp eax,ecx + je .no_point ;если выделенны все точки, что-бы не портить контур + + mov edx,ecx + imul edx,sizeof.Point + mov ebx,[ebx+Figure.PoiData] + add edx,ebx +align 4 + .cycle0: ;1-я выделенная точка + cmp ebx,edx + jge .no_point + bt dword[ebx+Point.Prop],PROP_BIT_SELECT + jc .cycle0end + add ebx,sizeof.Point + jmp .cycle0 + .cycle0end: + lea esi,[ebx+Point.CoordX] + mov edi,Data_Double + movsd + movsd + finit + fld qword[Data_Double] +align 4 + .cycle1: ;цикл для нахождения min(Point.CoordX) + bt dword[ebx+Point.Prop],PROP_BIT_SELECT + jnc .no_sel + fcom qword[ebx+Point.CoordX] + fstsw ax + sahf + jbe .no_sel + ;if (st0>Point.CoordX) + ffree st0 + fincstp + fld qword[ebx+Point.CoordX] + .no_sel: + add ebx,sizeof.Point + cmp ebx,edx + jl .cycle1 + fstp qword[Data_Double] +align 4 + .cycle2: ;цикл для присваивания всем Point.CoordX = min(Point.CoordX) + sub edx,sizeof.Point + bt dword[edx+Point.Prop],PROP_BIT_SELECT + jnc @f + mov esi,Data_Double + lea edi,[edx+Point.CoordX] + movsd + movsd + @@: + loop .cycle2 + ;для обновления по таймеру + mov dword[offs_last_timer],0 + .no_point: +popad + ret +endp + +align 4 +proc but_sel_points_align_coord_ymin +pushad + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .no_point + cmp [eax+Figure.OType],'Fig' + jne .no_point + + mov ebx,eax + stdcall sel_points_get_count,eax + cmp eax,1 + jle .no_point + mov ecx,[ebx+Figure.PoiCount] + or ecx,ecx + jz .no_point + cmp eax,ecx + je .no_point ;если выделенны все точки, что-бы не портить контур + + mov edx,ecx + imul edx,sizeof.Point + mov ebx,[ebx+Figure.PoiData] + add edx,ebx +align 4 + .cycle0: ;1-я выделенная точка + cmp ebx,edx + jge .no_point + bt dword[ebx+Point.Prop],PROP_BIT_SELECT + jc .cycle0end + add ebx,sizeof.Point + jmp .cycle0 + .cycle0end: + lea esi,[ebx+Point.CoordY] + mov edi,Data_Double + movsd + movsd + finit + fld qword[Data_Double] +align 4 + .cycle1: ;цикл для нахождения min(Point.CoordY) + bt dword[ebx+Point.Prop],PROP_BIT_SELECT + jnc .no_sel + fcom qword[ebx+Point.CoordY] + fstsw ax + sahf + jbe .no_sel + ;if (st0>Point.CoordY) + ffree st0 + fincstp + fld qword[ebx+Point.CoordY] + .no_sel: + add ebx,sizeof.Point + cmp ebx,edx + jl .cycle1 + fstp qword[Data_Double] +align 4 + .cycle2: ;цикл для присваивания всем Point.CoordY = min(Point.CoordY) + sub edx,sizeof.Point + bt dword[edx+Point.Prop],PROP_BIT_SELECT + jnc @f + mov esi,Data_Double + lea edi,[edx+Point.CoordY] + movsd + movsd + @@: + loop .cycle2 + ;для обновления по таймеру + mov dword[offs_last_timer],0 + .no_point: +popad + ret +endp + +align 4 +proc but_sel_points_align_coord_xmax +pushad + stdcall [tl_node_get_data],tree1 + or eax,eax + jz .no_point + cmp [eax+Figure.OType],'Fig' + jne .no_point + + mov ebx,eax + stdcall sel_points_get_count,eax + cmp eax,1 + jle .no_point + mov ecx,[ebx+Figure.PoiCount] + or ecx,ecx + jz .no_point + cmp eax,ecx + je .no_point ;если выделенны все точки, что-бы не портить контур + + mov edx,ecx + imul edx,sizeof.Point + mov ebx,[ebx+Figure.PoiData] + add edx,ebx +align 4 + .cycle0: ;1-я выделенная точка + cmp ebx,edx + jge .no_point + bt dword[ebx+Point.Prop],PROP_BIT_SELECT + jc .cycle0end + add ebx,sizeof.Point + jmp .cycle0 + .cycle0end: + lea esi,[ebx+Point.CoordX] + mov edi,Data_Double + movsd + movsd + finit + fld qword[Data_Double] +align 4 + .cycle1: ;цикл для нахождения max(Point.CoordX) + bt dword[ebx+Point.Prop],PROP_BIT_SELECT + jnc .no_sel + fcom qword[ebx+Point.CoordX] + fstsw ax + sahf + jae .no_sel + ;if (st0'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 + + +;данные для диалога открытия файлов +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 '/sys',0 + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_name: + db 'opendial',0 +communication_area_default_path: + db '/sys/File managers/',0 + +Filter: +dd Filter.end - Filter ;.1 +.1: db 'NC',0 +.2: db 'PNG',0 +.end: +db 0 + + +align 4 +system_dir_0 db '/sys/lib/' +lib_name_0 db 'proc_lib.obj',0 +system_dir_1 db '/sys/lib/' +lib_name_1 db 'libimg.obj',0 +system_dir_2 db '/sys/lib/' +lib_name_2 db 'buf2d.obj',0 +system_dir_3 db '/sys/lib/' +lib_name_3 db 'box_lib.obj',0 + +align 4 +l_libs_start: + lib_0 l_libs lib_name_0, file_name, system_dir_0, import_proclib + lib_1 l_libs lib_name_1, file_name, system_dir_1, import_libimg + lib_2 l_libs lib_name_2, library_path, system_dir_2, import_buf2d + lib_3 l_libs lib_name_3, file_name, system_dir_3, import_box_lib +l_libs_end: + +align 4 +import_libimg: + 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 +import_proclib: + OpenDialog_Init dd aOpenDialog_Init + OpenDialog_Start dd aOpenDialog_Start + OpenDialog_Set_file_name dd aOpenDialog_Set_file_name + OpenDialog_Set_file_ext dd aOpenDialog_Set_file_ext +dd 0,0 + aOpenDialog_Init db 'OpenDialog_init',0 + aOpenDialog_Start db 'OpenDialog_start',0 + aOpenDialog_Set_file_name db 'OpenDialog_set_file_name',0 + aOpenDialog_Set_file_ext db 'OpenDialog_set_file_ext',0 + +align 4 +import_buf2d: + init dd sz_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_resize dd sz_buf2d_resize + buf2d_line dd sz_buf2d_line + buf2d_line_sm dd sz_buf2d_line_sm + buf2d_rect_by_size dd sz_buf2d_rect_by_size + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_flip_h dd sz_buf2d_flip_h + buf2d_flip_v dd sz_buf2d_flip_v + buf2d_offset_h dd sz_buf2d_offset_h + buf2d_flood_fill dd sz_buf2d_flood_fill + buf2d_set_pixel dd sz_buf2d_set_pixel + dd 0,0 + sz_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_resize db 'buf2d_resize',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_line_sm db 'buf2d_line_sm',0 + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + sz_buf2d_circle db 'buf2d_circle',0 + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_flip_h db 'buf2d_flip_h',0 + sz_buf2d_flip_v db 'buf2d_flip_v',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + sz_buf2d_flood_fill db 'buf2d_flood_fill',0 + sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + +align 4 +import_box_lib: + dd sz_init1 + + init_checkbox dd sz_Init_checkbox + check_box_draw dd sz_Check_box_draw + check_box_mouse dd sz_Check_box_mouse + ;version_ch dd sz_Version_ch + + option_box_draw dd sz_Option_box_draw + option_box_mouse dd sz_Option_box_mouse + ;version_op dd sz_Version_op + + edit_box_draw dd sz_edit_box_draw + edit_box_key dd sz_edit_box_key + edit_box_mouse dd sz_edit_box_mouse + edit_box_set_text dd sz_edit_box_set_text + scrollbar_ver_draw dd sz_scrollbar_ver_draw + scrollbar_hor_draw dd sz_scrollbar_hor_draw + + 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_node_move_up dd sz_tl_node_move_up + tl_node_move_down dd sz_tl_node_move_down + 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_poi_get_info dd sz_tl_node_poi_get_info + tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info + tl_node_poi_get_data dd sz_tl_node_poi_get_data + + dd 0,0 + sz_init1 db 'lib_init',0 + + sz_Init_checkbox db 'init_checkbox2',0 + sz_Check_box_draw db 'check_box_draw2',0 + sz_Check_box_mouse db 'check_box_mouse2',0 + ;sz_Version_ch db 'version_ch2',0 + + sz_Option_box_draw db 'option_box_draw',0 + sz_Option_box_mouse db 'option_box_mouse',0 + ;sz_Version_op db 'version_op',0 + + sz_edit_box_draw db 'edit_box_draw',0 + sz_edit_box_key db 'edit_box_key',0 + sz_edit_box_mouse db 'edit_box_mouse',0 + sz_edit_box_set_text db 'edit_box_set_text',0 + sz_scrollbar_ver_draw db 'scrollbar_v_draw',0 + sz_scrollbar_hor_draw db 'scrollbar_h_draw',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_node_move_up db 'tl_node_move_up',0 + sz_tl_node_move_down db 'tl_node_move_down',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_poi_get_info db 'tl_node_poi_get_info',0 + sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0 + sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0 + +align 4 +mouse_dd dd 0 +last_time dd 0 + +align 16 +sc system_colors + +align 16 +procinfo process_information + +align 4 +buf_0: dd 0 ;указатель на буфер изображения +.l: dw 205 ;+4 left +.t: dw 35 ;+6 top +.w: dd 384 ;+8 w +.h: dd 350 ;+12 h +.color: dd 0xffffd0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: + dd 0 ;указатель на буфер изображения + dd 0 ;+4 left,top +.w: dd 0 +.h: dd 0,0,24 ;+12 color,bit in pixel + +font_h dd 0 ;высота шрифта + +align 4 +buf_png: + dd 0,0 +.w: dd 0 +.h: dd 0,0xffffff,24 + +align 4 +el_focus dd tree1 +tree1 tree_list size_one_list,1000+2, tl_key_no_edit+tl_draw_par_line,\ + 16,16, 0xffffff,0xb0d0ff,0x400040, 5,35,195-16,340, 16,Figure.Caption,0,\ + el_focus,w_scr_t1,0 + +align 4 +w_scr_t1 scrollbar 16,0, 3,0, 15, 100, 0,0, 0,0,0, 1 + +;input: +; eax - число +; edi - буфер для строки +; len - длинна буфера +;output: +align 4 +proc convert_int_to_str uses eax ecx edx edi esi, len:dword + mov esi,[len] + add esi,edi + dec esi + call .str + ret +endp + +align 4 +.str: + mov ecx,10 + cmp eax,ecx + jb @f + xor edx,edx + div ecx + push edx + ;dec edi ;смещение необходимое для записи с конца строки + call .str + pop eax + @@: + cmp edi,esi + jge @f + or al,0x30 + stosb + mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор + @@: + ret + +align 4 +proc mem_copy uses ecx esi edi, destination:dword, source:dword, len:dword + cld + mov esi, dword[source] + mov edi, dword[destination] + mov ecx, dword[len] + rep movsb + ret +endp + +align 16 +i_end: + rb 2048 +thread_coords: + rb 2048 +thread_scale: + rb 2048 +thread_n_file: + rb 2048 +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: diff --git a/programs/other/ha/HACONFIG.ASM b/programs/other/ha/HACONFIG.ASM index f6f730cd8..5e7d46cb5 100644 --- a/programs/other/ha/HACONFIG.ASM +++ b/programs/other/ha/HACONFIG.ASM @@ -1,1807 +1,1813 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Compile with FASM -; Version 0.3.9: Apr 11, 2020 - -; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage -; All rights reserved. -; Redistribution and use in source and binary forms, with or without modification, -; are permitted provided that the following conditions are met: -; * Redistributions of source code must retain the above copyright notice, this -; list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright notice, -; this list of conditions and the following disclaimer in the documentation and/or -; other materials provided with the distribution. -; * Neither the name of the nor the names of its contributors may -; be used to endorse or promote products derived from this software without -; specific prior written permission. - -; THE SOFTWARE IS PROVIDED УAS ISФ, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -; INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -; PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -; -------------------------------------------------------------------------------------- - -;P.S. ╩юфє ЄЁхсєхЄё  юяЄшьшчрЎш  ш фюЁрсюЄър (ёь. Єхьє ЇюЁєьр) -format binary as "" ; Binary file format without extension -use32 ; Tell compiler to use 32 bit instructions -org 0 ; the base address of code, always 0x0 - -; Зруюыютюъ шёяюыэ хьюую Їрщыр ╩юышсЁш ╬╤ -db 'MENUET01' -dd 1 -dd START -dd I_END -dd MEM -dd STACKTOP -dd 0, sys_path - -; ═рўрыю юсырёЄш ъюфр -include 'lang.inc' ;яюффхЁцър  ч√ъют яЁш ъюьяшы Ўшш -include '../../macros.inc' -include '../../proc32.inc' -include '../../dll.inc' -include '../../KOSfuncs.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' ;ъюьяюэхэЄ√ checkBox ш editBox -include '../../load_lib.mac' ;ьръЁюё фы  чруЁєчъш сшсышюЄхъ -@use_library - -KMENUITEM_NORMAL equ 0 -KMENUITEM_SUBMENU equ 1 -KMENUITEM_SEPARATOR equ 2 - -Otstup = 30 - -START: - call copyKill ;яЁюёЄхщ°р▀ чр∙шЄр юЄ чряєёър тЄюЁющ ъюяшш яЁшыюцхэш▀ - mcall 68, 11 ;шэшЎшрышчрЎш▀ ъєўш - - ;mcall 48,3,sc,sizeof.system_colors ;яюыєўшЄ№ ёшёЄхьэ√х ЎтхЄр - mov eax,48 ;яюыєўшЄ№ ёшёЄхьэ√х ЎтхЄр - mov ebx,3 - mov ecx, sc - mov edx, sizeof.system_colors - mcall - - stdcall dll.Load, @IMPORT - or eax, eax - jnz exit - - mov eax,40 ;єёЄрэютшЄ№ ьрёъє фы▀ юцшфрхь√ї ёюс√Єшщ - mov ebx,0x27 ;ёшёЄхьр сєфхЄ ЁхрушЁютрЄ№ Єюы№ъю эр ёююс∙хэшх ю яхЁхЁшёютъх, эрцрЄр ъэюяър, юяЁхфхы▐ээр▀ Ёрэхх, ёюс√Єшх юЄ ь√°ш (ўЄю-Єю ёыєўшыюё№ - эрцрЄшх эр ъэюяъє ь√°ш шыш яхЁхьх∙хэшх; ёсЁрё√трхЄё▀ яЁш яЁюўЄхэшш) - mcall - - load_libraries l_libs_start,load_lib_end ;чруЁєчър сшсышюЄхъ(ш) - stdcall [OpenDialog_Init],OpenDialog_data ;яюфуюЄютър фшрыюур - - ;mode menu - stdcall [kmenu_init], sc ;kmenu initialisation - stdcall [ksubmenu_new] - mov [modeMenu], eax - stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu0, 110 - stdcall [ksubmenu_add], [modeMenu], eax - stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu1, 111 - stdcall [ksubmenu_add], [modeMenu], eax - stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu2, 112 - stdcall [ksubmenu_add], [modeMenu], eax - stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu3, 113 - stdcall [ksubmenu_add], [modeMenu], eax - stdcall [kmenuitem_new], KMENUITEM_SUBMENU, valueModeMenu1, [modeMenu] - - call loadConfig ;чруЁєцрхь ъюэЇшуєЁрЎш■ шч Їрщыр, хёыш эхЄ - Єю т√ёЄрты▀хь ярЁрьхЄЁ√ яю єьюыўрэш■ - call draw_window ;юЄЁшёютрЄ№ юъэю яЁшыюцхэш▀ - -; ╬сЁрсюЄър Ўшъыр ёюс√Єшщ -event_wait: - mov eax, 10 ; function 10 : wait until event - mcall ; event type is returned in eax - - cmp eax, 1 ; Event redraw request ? - je red ; Expl.: there has been activity on screen and - ; parts of the applications has to be redrawn. - - cmp eax, 2 ; Event key in buffer ? - je key ; Expl.: User has pressed a key while the - ; app is at the top of the window stack. - - cmp eax, 3 ; Event button in buffer ? - je button ; Expl.: User has pressed one of the - ; applications buttons. - - invoke edit_box_mouse, editLU ;яЁютхЁър ёюс√Єшщ ь√°ш фы▀ editBox'ют - invoke edit_box_mouse, editLD - invoke edit_box_mouse, editRU - invoke edit_box_mouse, editRD - ;stdcall [kmainmenu_dispatch_cursorevent], [modeMenu] ;яЁютхЁър ь√°ш фы▀ ъюьсюсюъёр - invoke edit_box_mouse, editRadius - - jmp event_wait - - -red: ;юсЁрсюЄър ёюс√Єш▀ яхЁхЁшёютъш юъэр - call draw_window - jmp event_wait - -key: ; Keypress event handler - mov eax, 2 ; The key is returned in ah. The key must be - mcall ; read and cleared from the system queue. - - invoke edit_box_key, editLU - invoke edit_box_key, editLD - invoke edit_box_key, editRU - invoke edit_box_key, editRD - invoke edit_box_key, editRadius - - cmp eax, 1 - je event_wait - cmp word[hkSymbol], 0 - jne event_wait - cmp al, 0 - jne .next - mov byte[hkSymbol], ah - - push eax ecx esi ;ёюїЁрэ▀хь ёърэъюф ъыртш°ш - shr eax, 16 - mov byte[keyscan], al - mov ecx, 0 - mov cl, al ;byte[keyscan] - mov esi, keystr.data - call IntToStr - - ;ёўшЄрхь яюыєўхээ√щ ЁрчьхЁ ёЄЁюъш - xor ecx, ecx - mov esi, keystr.data - @@: - cmp byte[esi], 0 - je @f - inc esi - inc ecx - ;cmp ecx, 4 - ;je @f - jmp @b - @@: - ;ш ёюїЁрэ▀хь хую - mov dword[keystr.size], ecx - - pop esi ecx eax - jmp red -.next: - ;cmp al, 2 - ;jne @f - ;cmp ah, 0 - ;jne @f - ;ёўшЄ√трхь єяЁрты▀■∙шх ъыртш°ш - ;shr eax, 16 - ;bt eax, 0 ;left shift - ;jne @f - ;mov byte[hkSymbol], 2 - ;jmp red -@@: - jmp event_wait ; Just read the key, ignore it and jump to event_wait. - -button: ; Buttonpress event handler - mov eax,17 ; The button number defined in window_draw - mcall ; is returned to ah. - - cmp ah,1 ; button id=1 ? - jne noclose -exit: - mov eax,-1 ; Function -1 : close this program - mcall -noclose: - cmp ah, 2 ;ъэюяър "╧ЁшьхэшЄ№" - jne @f ;butend - call applyButton ;т√чют эр°хую юсЁрсюЄўшър эрцрЄш▀ ъэюяъш - jmp event_wait -@@: - cmp ah, 4 - jne @f - mov byte[editID], 4 - call but_open_dlg - jmp event_wait -@@: - cmp ah, 5 - jne @f - mov byte[editID], 5 - call but_open_dlg - jmp event_wait -@@: - cmp ah, 6 - jne @f - mov byte[editID], 6 - call but_open_dlg - jmp event_wait -@@: - cmp ah, 7 - jne @f - mov byte[editID], 7 - call but_open_dlg - jmp event_wait -@@: - cmp ah, 8 - jne @f - push eax ebx ecx - mcall 9, pi, -1 ;get window coord - - mov eax, dword[pi+34] - add eax, buttonModeX ;+ 5 - mov word[coordModeMenu.x], ax - - mov eax, dword[pi+38] - add eax, buttonModeY + 20 ;20 - ¤Єю ёьх∙хэшх тёяы√тр■∙хую ьхэ■ - mov word[coordModeMenu.y], ax - - stdcall [ksubmenu_draw], [modeMenu], coordModeMenu - pop ecx ebx eax - jmp event_wait -@@: - cmp ah, 9 - jne @f - mov word[hkSymbol], 0 - jmp red ;event_wait -@@: - cmp ah, 110 - jne @f - mov byte[mode], 48 ;'0' - jmp event_wait -@@: - cmp ah, 111 - jne @f - mov byte[mode], 49 ;'1' - jmp event_wait -@@: - cmp ah, 112 - jne @f - mov byte[mode], 50 ;'2' - jmp event_wait -@@: - cmp ah, 113 - jne @f - mov byte[mode], 51 ;'3' - jmp event_wait -@@: -butend: - jmp event_wait ;this is for ignored events, useful at development - - - -;шь▀ ъюэЇшуєЁрЎшюээюую Їрщыр -fileName: db 'SETTINGS/HA.CFG', 0 - -;ёЄЁєъЄєЁр фы▀ ёючфрэш▀/яхЁхчряшёш Їрщыр -createFile: - .func dd 2 ;эюьхЁ яюфЇєэъЎшш - .re dd 0, 0 ;чрЁхчхЁтшЁютрэю - .size dd 0 ;ёъюы№ъю срщЄ яшёрЄ№ - .data_adr dd 0 ;єърчрЄхы№ эр фрээ√х - .path db 0 - .path_adr dd fileName ;яєЄ№ - -;ёЄЁюър ярЁрьхЄЁют яю єьюыўрэш■ ш х▐ ЁрчьхЁ -defaultDataForConfig db 121,13,10,'/sys/HACONFIG',13,10,'/sys/HACONFIG',13,10,'/sys/HACONFIG',13,10,'/sys/HACONFIG',13,10,'Space',13,10,'57',13,10,'10',13,10,'s',13,10 -defaultDataSize = 85 ;48+19+4 - - -copyParam: ;ъюяшЁєхЄ ярЁрьхЄЁ(ъюьрэфє чряєёър) т сєЇхЁ (ёь. фры№°х) - push esi ebx ecx - mov ecx, dword[ebx] ;ўшЄрхь ЁрчьхЁ ёЄЁюъш - - cmp ecx, 0 ;яєёЄр ыш ёЄЁюър? - jne copyParam.copy ;хёыш эхЄ, Єю яхЁхїюфшь ъ ъюяшЁютрэш■ ёюфхЁцшьюую ёЄЁюъш (ъ Ўшъыє) - - mov byte[eax], '-' ;хёыш цх яєёЄю, Єю чрьхэ▀хь ёшьтюыюь ьшэєё '-' - inc eax - ;jmp copyParam.copyEnd ;ш т√їюфшь - ;фрыхх т эрўрых Ўшъыр яЁюшчющф▐Є ёЁртэхэшх ш т√їюф - -.copy: ;ъюяшЁєхь ёшьтюы√ - cmp ecx, 0 - je copyParam.copyEnd - mov bl, byte[esi] - mov byte[eax], bl - dec ecx - inc eax - inc esi - jmp copyParam.copy -.copyEnd: - pop ecx ebx esi - ret - - -addPerenos: ;фюсрты▀хЄ яхЁхэюё ёЄЁюъш т сєЇхЁ - mov byte[eax], 13 - inc eax - mov byte[eax], 10 - inc eax - ret - -;юсЁрсюЄўшъ ъэюяъш "╧ЁшьхэшЄ№" -applyButton: - push eax ebx ecx - ;mov dword[createFile.data_adr], defaultDataForConfig - ;mov dword[createFile.size], defaultDataSize - - ;т√ўшёышь ЁрчьхЁ Їрщыр ъюэЇшуєЁрЎшш т срщЄрї - mov ecx, 9*2+1 ;1 срщЄ эр ёюёЄю▀эшх ръЄштэюёЄш ш 9 ярЁ яхЁхэюёют ёЄЁюъ (ёшьтюы√ 13, 10) - add ecx, dword[editLU.size] ;яы■ё ЁрчьхЁ ърцфющ ёЄЁюъш т срщЄрї - add ecx, dword[editLD.size] - add ecx, dword[editRU.size] - add ecx, dword[editRD.size] ;dataBuffer.size4] - add ecx, dword[editRadius.size] - add ecx, dword[hkSize] ;ЁрчьхЁ шьхэш ръЄштрЎшюээющ ъэюяъш - add ecx, dword[keystr.size] ;ЁрчьхЁ ёърэъюфр ръЄштрЎшюээющ ъэюяъш - inc ecx ; х∙▐ 1 срщЄ фы▀ їЁрэхэш▀ ЁрчьхЁр ¤ыхьхэЄют - - ;cmp dword[keystr.size], 3 - ;jbe @f - ;mcall -1 - ;@@: - - ;хёыш чрфрэ√ яєёЄ√х ёЄЁюъш, Єю ь√ ртЄюьрЄшўхёъш фюсрты▀хь чэръ ьшэєё, чэрўшЄ ЁрчьхЁ +1 срщЄ - cmp dword[editLU.size], 0 - jne @f - inc ecx -@@: - cmp dword[editLD.size], 0 - jne @f - inc ecx -@@: - cmp dword[editRU.size], 0 - jne @f - inc ecx -@@: - cmp dword[editRD.size], 0 - jne @f - inc ecx -@@: - - ;ЄхяхЁ№ ЁрчьхЁ Їрщыр ъюэЇшуєЁрЎшш т ecx - mov dword[createFile.size], ecx ;яюыюцшь ЁрчьхЁ срщЄ т ёЄЁєъЄєЁє ёючфрэш▀/яхЁхчряшёш Їрщыр - mcall 68, 12, ecx ;т√фхы▀хь сыюъ ярь▀Єш яюф сєЇхЁ ёюфхЁцшьюую - mov dword[createFile.data_adr], eax ;ёюїЁрэ▀хь рфЁхё сєЇхЁр т ёЄЁєъЄєЁє - - ;чряюыэшь сєЇхЁ ёюфхЁцшьюую: - push ebx ;ёюїЁрэ▀хь т√сЁрээ√щ Ёхцшь - mov bl, byte[mode] - mov byte[eax], bl - pop ebx - - inc eax - call addPerenos - - push esi ebx - call UpdateEditsSizes ;юсэютшЄ№ ЁрчьхЁ√ ЄхъёЄр т edit'рї - - mov esi, dataBuffer.1 ;editLU.text - mov ebx, dataBuffer.size1 ;editLU.size - call copyParam - call addPerenos ;фюсрты▀хь яхЁхэюё ёЄЁюъш - - mov esi, dataBuffer.2 - mov ebx, dataBuffer.size2 - call copyParam - call addPerenos ;фюсрты▀хь яхЁхэюё ёЄЁюъш - - mov esi, dataBuffer.3 - mov ebx, dataBuffer.size3 - call copyParam - call addPerenos ;фюсрты▀хь яхЁхэюё ёЄЁюъш - - mov esi, dataBuffer.4 - mov ebx, dataBuffer.size4 - call copyParam - call addPerenos ;фюсрты▀хь яхЁхэюё ёЄЁюъш - - ;ёюїЁрэ▀хь ъэюяъє ръЄштрЎшш - call saveKey - call addPerenos - - ;ёюїЁрэ▀хь ёърэъюф ъэюяъш - mov esi, keystr.data ;чряшё√трхь ёЄЁюъє keystr т Їрщы - xor ebx, ebx - @@: - cmp byte[esi], 0 - je @f - mov bl, byte[esi] - mov byte[eax], bl - inc eax - inc esi - cmp esi, keystr.size-1 - jae @f - jmp @b - @@: - call addPerenos - - ;ёюїЁрэ▀хь Ёрфшєё - ;!!! хёыш Ёрфшєё юёЄртыхэ яєёЄ√ь, Єю эєцэю ёюїЁрэ▀Є№ чэрўхэшх яю єьюыўрэш■ (ёхщўрё яш°хЄё▀ '-') - mov esi, radiusBuffer.data - mov ebx, editRadius.size ;radiusBuffer.size - call copyParam - call addPerenos - - ;фюсрты▀хь ЁрчьхЁ ¤ыхьхэЄют - push ebx ;ёюїЁрэ▀хь т√сЁрээ√щ Ёхцшь - mov bl, byte[sizeStyle] - mov byte[eax], bl - pop ebx - inc eax - call addPerenos - - pop ebx esi - - - mov ebx, createFile - mcall 70 - cmp eax, 0 - je .end - ;шэрўх чфхё№ эєцэю т√тхёЄш юъэю ё ю°шсъющ !!! -.end: - mcall 68, 13, dword[createFile.data_adr] ;юётюсюцфрхь ярь▀Є№ яюф сєЇхЁ - call finishHotAnglesApp ;чртхЁ°рхь ЁрсюЄє тёхї ъюяшщ ёхЁтшёр @HA - call loadConfig ;яхЁхчруЁєцрхь Їрщы ъюэЇшур - call draw_window ;яхЁхЁшёют√трхь юъэю - call startHotAnglesApp ;яхЁхчряєёърхь @HA - pop ecx ebx eax - ret - - - - - - -compareBytes2: - push edi esi ecx ebx - xor eax, eax - mov ecx, 10 ;max ЁрчьхЁ ёЄЁюъ 11 -@@: - mov bl, byte[edi] - cmp bl, byte[esi] - jne compareBytes.no - inc edi - inc esi - cmp ecx, 0 - je @f - dec ecx - jmp @b -.no: - mov eax, 1 -@@: - pop ebx ecx esi edi - ret - - -finishHotAnglesApp: - ;эрїюфшь тёх ъюяшш яЁшыюцхэш▀ яю шьхэш ш чртхЁ°рхь шї - push eax ebx ecx esi edi - ;єърчрЄхыш, ъюЄюЁ√х эшъюуфр эх ьхэ▀■Єё▀: - mov esi, startAppData.file_name ;яхЁтр▀ ёЄЁюър - шёъюьюх шь▀ яЁшыюцхэш▀ - mov edi, buf ;тЄюЁр▀ ёЄЁюър - шь▀ Єхъє∙хую ёыюЄр - add edi, 10 - - mov ecx, 1 -@@: - mcall 9, buf, ecx ;яюыєўрхь фрээ√х юўхЁхфэюую ёыюЄр - mov dword[slotMax], eax - - call compareBytes2 ;ёЁртэштрхь шь▀ - cmp eax, 0 - jne finishHotAnglesApp.next ;хёыш эх ёютярыю, Єю яхЁхїюфшь эр ёыхфє■∙шщ ёыюЄ - - mcall 18, 2, ecx ;шэрўх чртхЁ°рхь ёыюЄ -.next: - inc ecx - cmp ecx, dword[slotMax] - ja @f - jmp @b -@@: - pop edi esi ecx ebx eax - ret - -startHotAnglesApp: - ;чряєёърхь яЁшыюцхэшх чрэютю - push eax ebx - mcall 70, startAppData - cmp eax, 0 - ja @f ;хёыш eax>0, Єю єёях°эю чряє∙хэю - ;!!! шэрўх ЄєЄ яхўрЄрхь ю°шсъє -@@: - pop ebx eax - ret - -startAppData: - .subfunction dd 7 - .flags dd 0 - .param dd 0 - .rezerv dd 0, 0 - .full_name db '/sys/' - .file_name db '@HA', 0 - -UpdateEditsSizes: - push eax - mov eax, dword[editLU.size] - mov dword[dataBuffer.size1], eax - - mov eax, dword[editLD.size] - mov dword[dataBuffer.size2], eax - - mov eax, dword[editRU.size] - mov dword[dataBuffer.size3], eax - - mov eax, dword[editRD.size] - mov dword[dataBuffer.size4], eax - - mov eax, dword[editRadius.size] - mov dword[radiusBuffer.size], eax - - pop eax - ret - -fileAdr dd 0 - -loadConfig: - push eax ebx ecx edx - mcall 68, 27, fileName ;чруЁєцрхь ъюэЇшуєЁрЎшюээ√щ Їрщы т ╬╟╙ - mov dword[fileAdr], eax ;ёюїЁрэ▀хь рфЁхё сыюър ярь▀Єш Їрщыр - cmp eax, 0 - je loadConfig.default ;хёыш Їрщыр ъюэЇшуєЁрЎшш эхЄ, Єю ёЄртшь эрёЄЁющъш яю єьюыўрэш■ - ;шэрўх фрээ√х чруЁєцхэ√ т ╬╟╙, ЁрчьхЁ т edx - cmp edx, 0 ;хёыш Їрщы яєёЄ, т э▐ь эхЄ фрээ√ї, Єю ёЄртшь эрёЄЁющъш яю єьюыўрэш■ - je loadConfig.default -.start: - add edx, eax ;ъырф▐ь т edx - рфЁхё ъюэЎр ъюэЇшу.фрээ√ї - -.chStart: - - push ebx - mov bl, byte[eax] - cmp bl, 48 ; хёыш чэрўхэшх т√їюфшЄ чр фюяєёЄшь√х яЁхфхы√, Єю яЁютхЁ▀хь эр 'n' (фы▀ ёютьхёЄшьюёЄш) - jb loadConfig.checkN - cmp bl, 51 - ja loadConfig.checkN - - mov byte[mode], bl ;шэрўх єёЄрэртыштрхь ¤ЄюЄ Ёхцшь ъръ хёЄ№ - jmp loadConfig.modeEnd ;ш шф▐ь фры№°х -.checkN: - cmp bl, 'n' ;хёыш n - Єю Ёхцшь "юЄъы■ўхэю" - jne @f - mov byte[mode], 48 ;'0' - jmp loadConfig.modeEnd -@@: - cmp bl, 'y' ;хёыш y - Єю ъырёёшўхёъшщ Ёхцшь - jne @f - mov byte[mode], 49 ;'1' - jmp loadConfig.modeEnd -@@: - mov byte[mode], 48 ;'0' шэрўх яю єьюыўрэш■ юЄъы■ўхэю - ;mov byte[mode], 49 ;'1' шэрўх яю єьюыўрэш■ тъы■ў▐э ъырёёшўхёъшщ Ёхцшь ЁрсюЄ√ -.modeEnd: - pop ebx - ;jmp loadConfig.end ;ъюьрэфр фы▀ єфюсёЄтр юЄырфъш ш яюшёър ю°шсюъ - - ;ъюяшЁєхь ёюфхЁцшьюх ёЄЁюъ т сєЇхЁ - push edi esi ecx ebx eax - ;шэшЎшрышчшЁєхь єърчрЄхыш эр рфЁхёр сєЇхЁр ёЄЁюъш ш х▐ ЁрчьхЁр - mov edi, dataBuffer.1 - mov esi, dataBuffer.size1 - ;ecx - ёў▐Єўшъ срщЄ т ёЄЁюъх -.block: - xor ecx, ecx ;юсэєы▀хь ёў▐Єўшъ - inc eax - cmp byte[eax], 10 ;хёыш юўхЁхфэющ ъюф ёшьтюыр 10 шыш 13, Єю яЁюяєёърхь ёшьтюы√ - je loadConfig.block ;фю яхЁтюую юЄышўэюую юЄ эшї - cmp byte[eax], 13 - je loadConfig.block - - ; ёшьтюы юЄышўхэ юЄ яхЁхэюёр ёЄЁюъш ш тючтЁрЄр ърЁхЄъш - эрўшэрхь ъюяшЁютрЄ№ юЄё■фр т сєЇхЁ - mov bl, byte[eax] - mov byte[edi], bl - inc edi - inc eax - inc ecx ;єтхышўштрхь ёў▐Єўшъ ёшьтюыют т ёЄЁюъх - - ;шф▐ь фю ъюэЎр ¤Єющ ёЄЁюъш: яюър эх тёЄЁхЄшь юўхЁхфэющ 10, 13, 0 шыш file end -.while: ;ш ъюяшЁєхь тё▐ т сєЇхЁ - cmp eax, edx ;яЁютхЁ▀хь чръюэўшыё▀ ыш Їрщы, р ъюэЎр ёЄЁюъш эх с√ыю !!! - ja loadConfig.ura - cmp byte[eax], 10 - je loadConfig.ura - cmp byte[eax], 0 - je loadConfig.ura - cmp byte[eax], 13 - je loadConfig.ura - - mov bl, byte[eax] - mov byte[edi], bl - inc edi - inc eax - inc ecx - cmp ecx, 511 - jae loadConfig.ura - jmp loadConfig.while -.ura: - mov byte[edi], 0 ;ъырф▐ь чртхЁ°р■∙шщ 0 т ёЄЁюъє - mov dword[esi], ecx ;ёюїЁрэ▀хь ЁрчьхЁ ёЄЁюъш - add esi, 4 ;яхЁхїюфшь эр ЁрчьхЁ ёыхфє■∙хую сєЇхЁр - sub edi, ecx ;яхЁхїюфшь эр ёыхфє■∙шщ сєЇхЁ - add edi, 512 - ;xor ecx, ecx ;юсэєы▀хь ЁрчьхЁ ёЄЁюъш - - cmp edi, dataBuffer.size1 ;хёыш ¤Єю с√ы яюёыхфэшщ сєЇхЁ (ш ь√ т√°ыш чр рфЁхёр ЁрчьхЁют сєЇхЁют), Єю т√їюфшь - jb loadConfig.block - - call readOptKey ;ёўшЄ√трхь ъыртш°є - call gotoEndString - - ;ёўшЄ√трхь ёърэъюф ъыртш°ш - call readScanKey - call gotoEndString - - call readOptRadius ;ёўшЄ√трхь чэрўхэшх Ёрфшєёр фы▀ mode 3 - call gotoEndString - call readOptSize ;ёўшЄ√трхь ЁрчьхЁ ¤ыхьхэЄют - call gotoEndString - - pop eax ebx ecx esi edi - - jmp loadConfig.end -.default: - mov eax, defaultDataForConfig - mov edx, defaultDataSize - jmp loadConfig.start -.end: - mov ecx, dword[fileAdr] ;хёыш Їрщы с√ы чруЁєцхэ, Єю - cmp ecx, 0 - je @f - mcall 68, 13, ecx ;т√уЁєцрхь Їрщы шч ярь▀Єш -@@: - call updateParams ;яЁшьхэ▀хь эрёЄЁющъш ърцфюую сєЇхЁр - call setMySize ;яЁшьхэ▀хь эрёЄЁющъш ЁрчьхЁр ¤ыхьхэЄют - pop edx ecx ebx eax - ret - - -setMySize: - push eax - ;т√ёЄрты▀хь mysize т чртшёшьюёЄш юЄ чэрўхэш▀ sizeStyle - cmp byte[sizeStyle], '0' - jb @f - cmp byte[sizeStyle], '7' - ja @f - mov eax, 0 ;хёыш чэрўхэшх ЁрчьхЁр чрфрэю, Єю хую ш т√ёЄрты▀хь - mov al, byte[sizeStyle] - sub al, '0' - jmp .end -@@: - cmp byte[sizeStyle], 'a' - je .auto - ;cmp byte[sizeStyle], 's' - ;je .system -.system: ;шэрўх чэрўхэшх яю єьюыўрэш■: s - ёшёЄхьэр▀ -; push ebx ecx - ;!!! -; mov eax, 9 -; mcall 48, 11 ;яюыєўрхь ёшёЄхьэ√щ ЁрчьхЁ °ЁшЇЄр - ;eax - т√ёюЄр °ЁшЇЄр т яшъёхы▀ї -; mov ecx, eax -; push eax -; mcall 48, 12, ecx ;яЁшьхэ▀хь ЁрчьхЁ °ЁшЇЄр -; pop eax -; pop ecx ebx - ;temp fix - фхышь эр Єхъє∙шщ ЁрчьхЁ °ЁшЇЄр and -1 -; push ebx edx -; mov ebx, 9 - ;div ebx -; pop edx ebx - ;cmp eax, 0 - ;je .end - ;dec eax - mov eax, 0 ;xor eax, eax ;test temp - jmp .end -.auto: ;a - т√ёЄрты▀хь т чртшёшьюёЄш юЄ ЁрчЁх°хэш▀ ¤ъЁрэр - ;!!! - mcall 14 - push ebx - xor ebx, ebx - mov bx, ax - shr eax, 16 - cmp ax, bx ;яюыєўрхь сюы№°шщ ЁрчьхЁ ёЄюЁюэ√ - jae .a - mov ax, bx -.a: - pop ebx - cmp ax, 1919 ;ЁрчьхЁ√ яюыєўхээ√х т√°х юЄ 0 ш эр 1 ьхэ№°х - jb .size0 - cmp ax, 2047 - jb .size1 - cmp ax, 4095 - jb .size2 - cmp ax, 8191 - jb .size3 - - jmp .size4 - -.size0: - mov eax, 0 - jmp .end -.size1: - mov eax, 1 - jmp .end -.size2: - mov eax, 2 - jmp .end -.size3: - mov eax, 3 - jmp .end -.size4: - mov eax, 4 - jmp .end -.size5: - mov eax, 5 - jmp .end -.size6: - mov eax, 6 - jmp .end -.size7: - mov eax, 7 - jmp .end - -;.default: -; mov eax, 1 -.end: - mov byte[mysize], al ;mov dword[mysize], eax - pop eax - ret - - -readScanKey: - ;яЁюяєёърхь яхЁхэюё√ ёЄЁюъ т эрўрых - cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю - ja .default ;эрёЄЁющъш яю єьюыўрэш■ - cmp byte[eax], 10 - je @f - cmp byte[eax], 0 - je @f - cmp byte[eax], 13 - je @f - - push ecx ebx esi - mov ecx, 0 ;xor ecx, ecx - mov esi, keystr.data -.copy: - mov bl, byte[eax] - cmp bl, 0 - je .copyEnd - cmp bl, 10 - je .copyEnd - cmp bl, 13 - je .copyEnd - cmp esi, keystr.size-1 - jae .copyEnd - mov byte[esi], bl - inc esi - inc eax - inc ecx - jmp .copy -.copyEnd: - mov byte[esi], 0 - mov dword[keystr.size], ecx - pop esi ebx ecx - - jmp .end -@@: - inc eax - jmp readScanKey -.default: - mov byte[keyscan], 57 - mov word[keystr.data], '57' - mov byte[keystr.data+2], 0 - mov dword[keystr.size], 2 -.end: - ret - -readOptKey: ;1;3;4;5 - space or shift - ;яЁюяєёърхь яхЁхэюё√ ёЄЁюъ т эрўрых - cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю - ja .default ;эрёЄЁющъш яю єьюыўрэш■ - cmp byte[eax], 10 - je @f - cmp byte[eax], 0 - je @f - cmp byte[eax], 13 - je @f - ;шэрўх ўшЄрхь ъыртш°є ш т√їюфшь - cmp dword[eax], 'Ctrl' - jne .notCtrl - mov byte[hkSymbol], 3 - mov dword[hkSize], 4 - jmp .end -.notCtrl: - cmp dword[eax], 'Shif' - jne .notShift - mov byte[hkSymbol], 2 - mov dword[hkSize], 5 - jmp .end -.notShift: - cmp dword[eax], 'Spac' - jne .notSpace - mov byte[hkSymbol], 32 - mov dword[hkSize], 5 - jmp .end -.notSpace: - cmp word[eax], 'Al' - jne .notAlt - mov byte[hkSymbol], 1 - mov dword[hkSize], 3 - jmp .end -.notAlt: - ;єсхфшьё▀, ўЄю Єрь 1 ёшьтюы, р эх ёЄЁюър - cmp byte[eax+1], 10 - je .oneSymb - cmp byte[eax+1], 0 - je .oneSymb - cmp byte[eax+1], 13 - je .oneSymb - jmp .default -.oneSymb: - ;яЁютхЁ▀хь, ўЄю ёшьтюы ЁрчЁх°▐ээ√щ !!! - - ;фюсрты▀хь ёшьтюы ъръ хёЄ№ - push ebx - ;xor ebx, ebx - mov bl, byte[eax] - mov byte[hkSymbol], bl - mov dword[hkSize], 1 - pop ebx - - jmp .end -@@: - inc eax - jmp readOptKey - -.default: - mov byte[hkSymbol], 32 - mov dword[hkSize], 5 -.end: - mov byte[hkSymbol+1], 0 - ret - -;яЁюїюфшь фю ъюэЎр Єхъє∙хщ ёЄЁюъш -gotoEndString: - cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю - ja @f ;т√їюфшь - cmp byte[eax], 10 - je @f - cmp byte[eax], 0 - je @f - cmp byte[eax], 13 - je @f - ;шэрўх яхЁхїюфшь эр ёыхфє■∙шщ ёшьтюы - inc eax - jmp gotoEndString -@@: - ret - -readOptRadius: - ;яЁюяєёърхь яхЁхэюё√ ёЄЁюъ т эрўрых - cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю - ja .default ;эрёЄЁющъш яю єьюыўрэш■ - cmp byte[eax], 10 - je @f - cmp byte[eax], 0 - je @f - cmp byte[eax], 13 - je @f - - ;шэрўх ёўшЄ√трхь чэрўхэшх - push ebx ecx - xor ecx, ecx -.readValue: - mov bl, byte[eax] - mov byte[radiusBuffer.data+ecx], bl - inc ecx - inc eax - cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю т√їюф - ja .readEnd - cmp byte[eax], 10 - je .readEnd - cmp byte[eax], 0 - je .readEnd - cmp byte[eax], 13 - je .readEnd - cmp ecx, 6 - jae .readEnd - jmp .readValue -.readEnd: - mov byte[radiusBuffer.data+ecx], 0 - mov dword[radiusBuffer.size], ecx - pop ecx ebx - - jmp .end -@@: - inc eax - jmp readOptRadius -.default: - mov byte[radiusBuffer.data], '0' - mov byte[radiusBuffer.data+1], 0 - mov dword[radiusBuffer.size], 1 -.end: - - ret - - -readOptSize: - ;яЁюяєёърхь яхЁхэюё√ ёЄЁюъ т эрўрых - cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю - ja .default ;эрёЄЁющъш яю єьюыўрэш■ - cmp byte[eax], 10 - je @f - cmp byte[eax], 0 - je @f - cmp byte[eax], 13 - je @f - - ;яЁютхЁ▀хь, ўЄю ¤Єю фюяєёЄшьюх чэрўхэшх: 1-7, a, s - cmp byte[eax], 'a' - je .setValue - cmp byte[eax], 's' - je .setValue - cmp byte[eax], '0' - je .setValue - cmp byte[eax], '1' - je .setValue - cmp byte[eax], '2' - je .setValue - cmp byte[eax], '3' - je .setValue - cmp byte[eax], '4' - je .setValue - cmp byte[eax], '5' - je .setValue - cmp byte[eax], '6' - je .setValue - cmp byte[eax], '7' - je .setValue - - jmp .default ;шэрўх ёЄртшь чэрўхэшх яю єьюыўрэш■ - -.setValue: - push ebx - mov bl, byte[eax] - mov byte[sizeStyle], bl - pop ebx - - jmp .end -@@: - inc eax - jmp readOptSize -.default: - mov byte[sizeStyle], 's' ;ёшёЄхьэ√щ -.end: - ret - - - - -updateParams: ;max, size, pos - push eax - mov eax, dword[dataBuffer.size1] - mov dword[editLU.size], eax - mov dword[editLU.pos], eax - - mov eax, dword[dataBuffer.size2] - mov dword[editLD.size], eax - mov dword[editLD.pos], eax - - mov eax, dword[dataBuffer.size3] - mov dword[editRU.size], eax - mov dword[editRU.pos], eax - - mov eax, dword[dataBuffer.size4] - mov dword[editRD.size], eax - mov dword[editRD.pos], eax - - mov eax, dword[radiusBuffer.size] - mov dword[editRadius.size], eax - mov dword[editRadius.pos], eax - pop eax - ret - - - -selfName db 'HACONFIG', 0 -selfNameSize = 8 ;фю 11 byte -; -compareBytes: - push edi esi ecx ebx - mov eax, 0 ;xor eax, eax - mov ecx, selfNameSize ;max ЁрчьхЁ ёЄЁюъ 11 -@@: - mov bl, byte[edi] - cmp bl, byte[esi] - jne compareBytes.no - inc edi - inc esi - cmp ecx, 0 - je @f - dec ecx - jmp @b -.no: - mov eax, 1 -@@: - pop ebx ecx esi edi - ret -; -slotMax dd 0 -selfPID dd 0 -buf db 1024 dup(0) -copyKill: - push eax ebx ecx esi edi - - ;ёяхЁтр яЁюўЄ▐ь ётю■ шэЇюЁьрЎш■ - mcall 9, buf, -1 - mov eax, dword[buf+30] - mov dword[selfPID], eax - - ;єърчрЄхыш, ъюЄюЁ√х эшъюуфр эх ьхэ▀■Єё▀: - mov esi, selfName ;яхЁтр▀ ёЄЁюър - шь▀ Єхъє∙хую яЁшыюцхэш▀ - mov edi, buf ;тЄюЁр▀ ёЄЁюър - шь▀ Єхъє∙хую ёыюЄр - add edi, 10 - - mov ecx, 1 -@@: - mcall 9, buf, ecx - mov dword[slotMax], eax - - ;хёыш ¤Єю ь√ ёрьш, Єю яЁюяєёърхь яЁютхЁъє - mov eax, dword[buf+30] - cmp eax, dword[selfPID] - je copyKill.propusk - - call compareBytes ;ёЁртэштрхь 11 срщЄ ёЄЁюъ, Ёхчєы№ЄрЄ т eax - - cmp eax, 0 - je copyKill.selfKill - -.propusk: - inc ecx - cmp ecx, dword[slotMax] - ja @f - jmp @b - -.selfKill: - pop edi esi ecx ebx eax - mcall -1 - ret -@@: - pop edi esi ecx ebx eax - ret - - WindowsWidth = 550 - WindowsHeight = 235 -coord: ;ъююЁфшэрЄ√ юъэр яЁшыюцхэш▀ - .y dw 0 - .x dw 0 - -draw_window: - mcall 12, 1 ; Start window redraw - - ;юЄюсЁрчшь юъэю яю ЎхэЄЁє ¤ъЁрэр фы▀ ¤Єюую: - mcall 14 ;яюыєўшь ЁрчьхЁ√ ¤ъЁрэр - mov dword[coord], eax ;яюыюцшь ЁрчьхЁ√ ¤ъЁрэр т ъююЁфшэрЄ√ - shr word[coord.x], 1 ;тхЁэхх яюыюцшь шї яюыютшэє - shr word[coord.y], 1 - - ;т√ўшёы▀хь ъююЁфшэрЄ√ юъэр, ўЄюс√ юъэю с√ыю яю ёхЁхфшэх ¤ъЁрэр - sub word[coord.x], WindowsWidth/2 - sub word[coord.y], WindowsHeight/2 - - mov eax, 0 ; function 0 : define and draw window - mov ebx, 0 ; [x start] *65536 + [x size] - mov bx, word[coord.x] - shl ebx, 16 - mov bx, WindowsWidth - - mov ecx, 0 - mov cx, word[coord.y] ; [y start] *65536 + [y size] - shl ecx, 16 - mov cx, WindowsHeight - - mov edx, 0x14ffffff ; color of work area RRGGBB - ; 0x02000000 = window type 4 (fixed size, skinned window) - mov esi, 0x808899ff ; color of grab bar RRGGBB - ; 0x80000000 = color glide - mov edi, title - mcall - - invoke edit_box_draw, editLU ;Ёшёютрэшх edit box'ют - invoke edit_box_draw, editLD - invoke edit_box_draw, editRU - invoke edit_box_draw, editRD - - ;Ёшёєхь ъэюяъє ш хх ЄхъёЄ - buttonAppleY = WindowsHeight-40 - mcall 8, , , 2, 0x00AABBCC - mcall 4, , 0x10FFFFFF, buttonText, buttonTextSize - - ;Ёшёєхь х∙▐ 4 ъэюяъш фы▀ фшрыюуютюую юъэр т√сюЁр Їрщыр - ;эюьхЁр 4,5,6 ш 7 - buttonW = 30 - buttonH = 21 - ;ыхт√щ тхЁїэшщ єуюы - mcall 8, , <85,buttonH>, 4, 0x00AABBCC - ;ыхт√щ эшцэшщ єуюы - mcall 8, , <120,buttonH>, 5 - ;яЁрт√щ тхЁїэшщ єуюы - mcall 8, , <85,buttonH>, 6 - ;яЁрт√щ эшцэшщ єуюы - mcall 8, , <120,buttonH>, 7 - - ;Ёшёєхь ЄхъёЄ√ фы▀ ¤Єшї 4 ъэюяюъ - mov ecx, 0xFFFFFF ;схы√щ ЎтхЄ ЄхъёЄр - mov edx, commonButtonText ;ёЄЁюър ЄхъёЄр - mov esi, commonButtonTextSize ;ЁрчьхЁ ЄхъёЄр т ёшьтюырї - ;ъююЁфшэрЄ√ ЄхъёЄр (x, y) - deltaCommonTextX = 7 - deltaCommonTextY = 6 - mcall 4, - mcall 4, - mcall 4, - mcall 4, - - ;delete mode button, if it exist - mov edx, 0x80000008 - mcall 8 - ;draw button Mode - buttonModeX = 30 ;433 - buttonModeY = 160 ;50 - buttonModeWidth = 300 - buttonModeHeight = 20 - buttonModeTextYoffset = 3 - buttonModeTextXoffset = 5 - mcall 8, , , 8, 0x00FFFFFF - mcall 13, , , 0xAABBCC - ;draw text for button Mode - mov ebx, (buttonModeX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset) ;(x, y) - mov ecx, 0x10000000 - call setTextModeMenu - mov esi, valueModeMenuSize - mcall 4 - mov ebx, (buttonModeX+buttonModeWidth-12) * 65536 + (buttonModeY+buttonModeTextYoffset+3) - mov ecx, 0x80FFFFFF - mov edx, symbolDownArrow - mcall 4 - - ;ъэюяър т√сюЁр уюЁ▀ўхщ ъыртш°ш - buttonHotKeyX = 350-10 - buttonHotKeyWidth = 90 - mov edx, 0x80000009 ;єфры▀хь - mcall 8 - cmp byte[mode], 49 ;Ёшёєхь т√сюЁ ъыртш°ш, Єюы№ъю хёыш mode > 1 - jbe @f - ;Ёшёєхь эютє■ - push eax ebx ecx edx esi - mov ebx, buttonHotKeyX*65536 + buttonHotKeyWidth ;X + Width - mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height - mov edx, 0x00000009 ;button id - mov esi, 0x00FFFFFF ;color button - mcall 8 - pop esi edx ecx ebx eax - ;ЄхъёЄ яюфёърчъш фы▀ уюЁ▀ўхщ ъыртш°ш - mov ebx, (buttonHotKeyX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset) ;(x, y) - mov ecx, 0x90224466 - call setTextForHotKey - mov esi, valueModeMenuSize - mcall 4 - ;чруюыютюъ - push eax ebx ecx edx edi esi - mov ebx, buttonHotKeyX * 65536 + (buttonModeY-11) - mov ecx, 0x80224466 - mov edx, hkCaption - mov esi, 3 - mcall 4 - pop esi edi edx ecx ebx eax - @@: - - ;юЄюсЁрцрхь эрёЄЁющъє Ёрфшєёр фхщёЄтш▀ цхёЄр, Єюы№ъю хёыш т√сЁрэ Ёхцшь 3 - cmp byte[mode], 51 - jne @f - ;чруюыютюъ - push eax ebx ecx edx edi esi - mov ebx, (buttonHotKeyX + buttonHotKeyWidth + 20) * 65536 + (buttonModeY-11) - mov ecx, 0x80224466 - mov edx, radiusCaption - mov esi, 3 - mcall 4 - pop esi edi edx ecx ebx eax - invoke edit_box_draw, editRadius - @@: - - call draw_super_text - - LineLength = 62 - mov ebx, Otstup * 65536 + 32 ; draw info text with function 4 (x, y) - - ;xor ecx, ecx - ;mov cl, 1 ;byte[mysize] - ;shl ecx, 24 - ;add ecx, 0x224466 - ;or ecx, 0x00224466 ;80224466 - mov ecx, 0x10224466 - - mov edx, text - mov esi, LineLength - mov eax, 4 - - .newline: ; text from the DATA AREA - mcall - add ebx, 15 - add edx, LineLength - cmp byte[edx], 0 - jne .newline - - mcall 12, 2 ; End window redraw - - ret - -hkSymbol: db 0, 0 - -setTextForHotKey: - push eax - mov al, byte[hkSymbol] - cmp al, 0 - jne @f - mov edx, hkHint - mov dword[hkSize], 5 ;чэрўхэшх яю єьюыўрэш■ SPACE ;shift - jmp setTextForHotKey.end -@@: - cmp al, 1 - jne @f - mov edx, hkAlt - mov dword[hkSize], 3 - jmp setTextForHotKey.end -@@: - cmp al, 2 - jne @f - mov edx, hkShift - mov dword[hkSize], 5 - jmp setTextForHotKey.end -@@: - cmp al, 3 - jne @f - mov edx, hkCtrl - mov dword[hkSize], 4 - jmp setTextForHotKey.end -@@: - cmp al, 32 - jne @f - mov edx, hkSpace - mov dword[hkSize], 5 - jmp setTextForHotKey.end -@@: - cmp al, 96 ;'`' - je setTextForHotKey.symb - cmp al, 126 ;'~' - je setTextForHotKey.symb - cmp al, 48 ;'0' - jb @f - cmp al, 57 ;'9' - ja @f -.symb: - mov edx, hkSymbol - mov dword[hkSize], 1 - jmp setTextForHotKey.end -@@: - cmp al, 97 ;'a' - jb @f - cmp al, 122 ;'z' - ja @f - ;jmp setTextForHotKey.symb - mov edx, hkSymbol - mov dword[hkSize], 1 - jmp setTextForHotKey.end -@@: - cmp al, 65 ;'A' - jb @f - cmp al, 90 ;'Z' - ja @f - ;jmp setTextForHotKey.symb - mov edx, hkSymbol - mov dword[hkSize], 1 - jmp setTextForHotKey.end -@@: - mov word[hkSymbol], 0 ;хёыш цх яюярыю ўЄю-Єю эхшчтхёЄэюх, Єю ёюЄЁ▐ь хую - mov edx, hkHint - mov dword[hkSize], 5 ;shift or space - чэрўхэшх яю єьюыўрэш■ -.end: - pop eax - ret - - -setTextModeMenu: - cmp byte[mode], 48 - jne @f - mov edx, valueModeMenu0 - ret -@@: - cmp byte[mode], 49 - jne @f - mov edx, valueModeMenu1 - ret -@@: - cmp byte[mode], 50 - jne @f - mov edx, valueModeMenu2 - ret -@@: - cmp byte[mode], 51 - jne @f - mov edx, valueModeMenu3 - ret -@@: - mov edx, valueModeMenu1 - ret - - - - -saveKey: - cmp word[hkSymbol], 0 - je .default - cmp byte[hkSymbol], 1 - je .alt - cmp byte[hkSymbol], 2 - je .shift - cmp byte[hkSymbol], 3 - je .ctrl - cmp byte[hkSymbol], 32 - je .space -.other: - mov esi, hkSymbol - mov byte[esi+1], 0 - mov dword[hkSize], 1 - jmp .end -.space: - mov esi, hkSpace - mov dword[hkSize], 5 - jmp .end -.ctrl: - mov esi, hkCtrl - mov dword[hkSize], 4 - jmp .end -.alt: - mov esi, hkAlt - mov dword[hkSize], 3 - jmp .end -.default: -.shift: - mov esi, hkShift - mov dword[hkSize], 5 -.end: - mov ebx, hkSize ;єърчрЄхы№ эр dword[hkSize] - call copyParam - ret - - - - - -align 16 -@IMPORT: - -library box_lib, 'box_lib.obj' - -import box_lib,\ - edit_box_draw, 'edit_box_draw',\ - edit_box_key, 'edit_box_key',\ - edit_box_mouse, 'edit_box_mouse',\ - init_checkbox, 'init_checkbox2',\ - check_box_draw, 'check_box_draw2',\ - check_box_mouse, 'check_box_mouse2',\ - option_box_draw, 'option_box_draw',\ - option_box_mouse, 'option_box_mouse' - -commonButtonText db '...', 0 ;ЄхъёЄ фы▀ ъэюяюъ т√чютр OpenDial -commonButtonTextSize = 3 - -if lang eq ru_RU ;хёыш ▀ч√ъ ёсюЁъш Ёєёёъшщ - -text db "Конфигуратор Hot Angles отвечает за настройку активных углов. " - db "Настройте параметры под себя или отключите эту опцию. " - db " ", 0 - hed: -title db "Конфигуратор утилиты Hot Angles", 0 -buttonText db "Применить", 0 -buttonTextSize = 9 - -ch_text db 'Включить/активировать "Hot Angles"', 0 - -superText: - .lu db 'Команда левого верхнего угла: ', 0 - .ld db 'Команда левого нижнего угла: ', 0 - .ru db 'Команда правого верхнего угла:', 0 - .rd db 'Команда правого нижнего угла: ', 0 -superTextSize = 30 - -valueModeMenuSize = 32 -ModeMenu db 'Режим работы:',0 -valueModeMenu0 db 'отключено ',0 -valueModeMenu1 db 'классический режим ',0 -valueModeMenu2 db 'режим горячей клавиши ',0 -valueModeMenu3 db 'режим жеста по клавише активации',0 - -hkCaption: db 'Клавиша:',0 -;hkHint: db 'Нажмите любую клавишу',0 -radiusCaption: db 'Радиус:',0 - -else ;шэрўх рэуышщёъшщ ЄхъёЄ - -text db "This is a Hot Angles Configurator. " - db "Set the parameters bellow for yourself or disable this option." - db " ", 0 - hed: -title db "Hot Angles Configurator", 0 -buttonText db " Apply ", 0 -buttonTextSize = 9 - -ch_text db 'Activate "Hot Angles"',0 ;ёюяЁютюцфр■∙шщ ЄхъёЄ фы▀ ўхъ сюъёр - -superText: - .lu db 'Left up angle command: ', 0 - .ld db 'Left down angle command: ', 0 - .ru db 'Right up angle command: ', 0 - .rd db 'Right down angle command:', 0 -superTextSize = 25 - -valueModeMenuSize = 32 -ModeMenu db 'Mode:',0 -valueModeMenu0 db 'disabled ',0 -valueModeMenu1 db 'classic mode ',0 -valueModeMenu2 db 'hot key mode ',0 -valueModeMenu3 db 'activation key gesture mode ',0 - -hkCaption: db 'Key:',0 -;hkHint: db 'press any key',0 -radiusCaption: db 'Radius:',0 - -end if - -hkAlt: db 'Alt',0 -hkShift: db 'Shift',0 -hkCtrl: db 'Ctrl',0 -hkSpace: db 'Space',0 -hkHint: db '?',0 -hkSize: rd 1 ;ЁрчьхЁ ёЄЁюъш ё шьхэхь ъыртш°ш - -draw_super_text: - push eax ebx ecx edx edi esi - - mov ecx, 0 - mov ch, byte[mysize] - shl ecx, 16 - add ecx, 0x224466 - - mcall 4, ,,superText.lu,superTextSize - mcall 4, ,,superText.ld,superTextSize - mcall 4, <290,74> ,,superText.ru,superTextSize - mcall 4, <290,109> ,,superText.rd,superTextSize - - mov ebx, Otstup * 65536 + (buttonModeY-11) - or ecx, 0x80000000 - mov edx, ModeMenu - mov esi, 3 - mcall 4 - -; mov ebx, buttonHotKeyX * 65536 + (buttonModeY-11) -; or ecx, 0x80000000 -; mov edx, hkCaption -; mov esi, 3 -; mcall 4 - - pop esi edi edx ecx ebx eax - ret - -editID db 0 -initEBX: - cmp byte[editID], 4 - jne @f - mov ebx, dataBuffer.1 - ret -@@: - cmp byte[editID], 5 - jne @f - mov ebx, dataBuffer.2 - ret -@@: - cmp byte[editID], 6 - jne @f - mov ebx, dataBuffer.3 - ret -@@: - cmp byte[editID], 7 - jne @f - mov ebx, dataBuffer.4 - ret -@@: - ret -setRESULT: - cmp byte[editID], 4 - jne @f - mov dword[dataBuffer.size1], ecx - mov dword[editLU.size], ecx - mov dword[editLU.pos], ecx - ret -@@: - cmp byte[editID], 5 - jne @f - mov dword[dataBuffer.size2], ecx - mov dword[editLD.size], ecx - mov dword[editLD.pos], ecx - ret -@@: - cmp byte[editID], 6 - jne @f - mov dword[dataBuffer.size3], ecx - mov dword[editRU.size], ecx - mov dword[editRU.pos], ecx - ret -@@: - cmp byte[editID], 7 - jne @f - mov dword[dataBuffer.size4], ecx - mov dword[editRD.size], ecx - mov dword[editRD.pos], ecx - ret -@@: - ret -copyPath: - push eax ebx ecx edx ;copy file name path - mov eax, openfile_path ;dword[OpenDialog_data.openfile_path] - call initEBX ;mov ebx, dataBuffer.1 ;.data - mov ecx, 0 - @@: - mov dl, byte[eax] - cmp dl, 0 ;byte[eax], 0 - je @f - mov byte[ebx], dl - inc eax - inc ebx - inc ecx - jmp @b - @@: - mov byte[ebx], 0 - call setRESULT - pop edx ecx ebx eax - ret - - -IntToStr: ;in esi - ёЄЁюър; eёx - ўшёыю - push eax ecx edx esi - or ecx, ecx - jnz @f - mov byte[esi], '0' - inc esi - jmp .end -@@: - mov eax, ecx - mov ecx, 10 -.next: - xor edx, edx - div ecx - add edx, '0' - - mov byte[esi], dl - - inc esi - or eax, eax - jz .end - jmp .next -.end: - mov byte[esi], 0 ;ъырф▐ь чртхЁ°р■∙шщ эюы№ - pop esi edx ecx eax - call reverseString ;фхырхь ЁхтхЁё ёЄЁюъш - ret - -;тїюф: esi - єърчрЄхы№ эр ёЄЁюъє -reverseString: - push eax esi edi - - mov al, byte[esi] ;хёыш ёЄЁюър яєёЄр▀ Єю т√їюфшь ЁхтхЁё фхырЄ№ эх эрфю - cmp al, 0 - je reverseString.end - - mov edi, esi ;шэрўх эрщф▐ь яючшЎш■ яюёыхфэхую ёшьтюыр ёЄЁюъш ш яюыюцшь х▐ т edi -.go_last_symbol: - mov al, byte[edi+1] - cmp al, 0 - je @f - - inc edi - jmp reverseString.go_last_symbol -@@: - push ebx -.rev: - cmp esi, edi - jae @f - - ;ьхэ▀хь ьхёЄрьш ёшьтюы√ т Ўшъых - mov al, byte[edi] - mov bl, byte[esi] - mov byte[edi], bl - mov byte[esi], al - - inc esi - dec edi - jmp reverseString.rev -@@: - pop ebx -.end: - pop edi esi eax - ret - - - -align 4 -but_open_dlg: - 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],2 - je @f - cmp [OpenDialog_data.status],0 ;яюы№чютрЄхы№ эрцры Cancel? - je .end_open - ;ъюф яЁш єфрўэюь юЄъЁ√Єшш фшрыюур - call copyPath - jmp .end_open - @@: - ;ъюф яЁш эх єфрўэюь юЄъЁ√Єшш фшрыюур - ;... - .end_open: - popad - ret - -;фрээ√х фы▀ фшрыюур юЄъЁ√Єш▀ Їрщыют -align 4 -OpenDialog_data: -.type dd 0 ;0 - юЄъЁ√Є№, 1 - ёюїЁрэшЄ№, 2 - т√сЁрЄ№ фшЁхъЄюЁш■ -.procinfo dd pi -.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 '/sys',0 ;фшЁхъЄюЁш▀ яю єьюыўрэш■ -communication_area_name: db 'FFFFFFFF_open_dialog',0 -open_dialog_name: db 'opendial',0 -communication_area_default_path: db '/sys/File managers/',0 - -Filter: -dd Filter.end - Filter.1 -.1: -;db 'KEX',0 -.end: -db 0 - -mode db 49 ;'1' -modeMenu dd 0 -coordModeMenu: - .x dw 100 - .y dw 200 - - -system_dir0 db '/sys/lib/' -lib0_name db 'proc_lib.obj',0 -system_dir1 db '/sys/lib/' -lib1_name db 'kmenu.obj',0 - -symbolDownArrow db 25,0 - -;library structures -l_libs_start: - lib0 l_libs lib0_name, file_name, system_dir0, import_proclib - lib1 l_libs lib1_name, file_name, system_dir1, import_libkmenu -load_lib_end: - - -edMaxSize = 510 ;ЄхяхЁ№ ё эют√ь ъюьяюэхэЄюь ьюцэю ш 511 єърчрЄ№ -edMax = 0 ;max, size, pos - -align 4 -editLU edit_box 230-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0x10000000, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax ;ed_focus -editLD edit_box 230-buttonW,Otstup+buttonW,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0x10000000, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax -editRU edit_box 230-buttonW,290,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0x10000000, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax -editRD edit_box 230-buttonW,290,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0x10000000, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax -editRadius edit_box 40,(buttonHotKeyX + buttonHotKeyWidth + 20),buttonModeY, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0x10000000, 4, radiusBuffer.data, mouse_dd, ed_figure_only, edMax, edMax - -align 4 -import_proclib: - OpenDialog_Init dd aOpenDialog_Init - OpenDialog_Start dd aOpenDialog_Start -dd 0,0 - aOpenDialog_Init db 'OpenDialog_init',0 - aOpenDialog_Start db 'OpenDialog_start',0 - -align 4 -import_libkmenu: - kmenu_init dd akmenu_init - kmainmenu_draw dd akmainmenu_draw - kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent - ksubmenu_new dd aksubmenu_new - ksubmenu_delete dd aksubmenu_delete - ksubmenu_draw dd aksubmenu_draw - ksubmenu_add dd aksubmenu_add - kmenuitem_new dd akmenuitem_new - kmenuitem_delete dd akmenuitem_delete - kmenuitem_draw dd akmenuitem_draw -dd 0,0 - akmenu_init db 'kmenu_init',0 - akmainmenu_draw db 'kmainmenu_draw',0 - akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0 - aksubmenu_new db 'ksubmenu_new',0 - aksubmenu_delete db 'ksubmenu_delete',0 - aksubmenu_draw db 'ksubmenu_draw',0 - aksubmenu_add db 'ksubmenu_add',0 - akmenuitem_new db 'kmenuitem_new',0 - akmenuitem_delete db 'kmenuitem_delete',0 - akmenuitem_draw db 'kmenuitem_draw',0 - -sc system_colors -mouse_dd rd 1 - -sizeStyle: rb 1 ;ЁрчьхЁ ЄхъёЄр ш юёЄры№э√ї ¤ыхьхэЄют юъэр -mysize: rb 1 ;rd 1 -radiusBuffer: ;сєЇхЁ фы▀ яюы▀ Ёрфшєёр цхёЄр - .data: rb 6 - .size: rd 1 -radiusBufferEnd: - -button_press rd 0 ;for kmenu - -sys_path: rb 4096 -file_name: rb 4096 -plugin_path: rb 4096 -openfile_path: rb 4096 -filename_area: rb 256 -rb 1024 -pi process_information - -keyscan: rb 1 -keystr: - .data: rb 4 ;ёЄЁюър ёю чэрўхэшхь ёърэъюфр ръЄштрЎшюээющ ъыртш°ш - .size: rd 1 ;ЁрчьхЁ ёюфхЁцшьюую ёЄЁюъш схч яюёыхфэхую эєы▀ - -dataBuffer: -.1: rb 512 -.2: rb 512 -.3: rb 512 -.4: rb 512 -.size1: rd 1 -.size2: rd 1 -.size3: rd 1 -.size4: rd 1 -;255+255+2 = 512 -;фтр чрярёэ√ї срщЄр эхюсїюфшь√ фы▀ Єюую ўЄю с√ эх яхяхЁхяшёрЄ№ ёыхфє■∙шхщ срщЄ√, т ъюэЎх сєЇхЁр 0 -dataBufferEnd: - - -I_END: - rb 4096 -align 16 -STACKTOP: - -MEM: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page Windows 1251 - Cyrillic + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Compile with FASM +; Version 0.3.9: Apr 11, 2020 + +; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage +; All rights reserved. +; Redistribution and use in source and binary forms, with or without modification, +; are permitted provided that the following conditions are met: +; * Redistributions of source code must retain the above copyright notice, this +; list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright notice, +; this list of conditions and the following disclaimer in the documentation and/or +; other materials provided with the distribution. +; * Neither the name of the nor the names of its contributors may +; be used to endorse or promote products derived from this software without +; specific prior written permission. + +; THE SOFTWARE IS PROVIDED УAS ISФ, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +; INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +; PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; -------------------------------------------------------------------------------------- + +;P.S. ╩юфє ЄЁхсєхЄё  юяЄшьшчрЎш  ш фюЁрсюЄър (ёь. Єхьє ЇюЁєьр) +format binary as "" ; Binary file format without extension +use32 ; Tell compiler to use 32 bit instructions +org 0 ; the base address of code, always 0x0 + +; Зруюыютюъ шёяюыэ хьюую Їрщыр ╩юышсЁш ╬╤ +db 'MENUET01' +dd 1 +dd START +dd I_END +dd MEM +dd STACKTOP +dd 0, sys_path + +; ═рўрыю юсырёЄш ъюфр +include 'lang.inc' ;яюффхЁцър  ч√ъют яЁш ъюьяшы Ўшш +include '../../macros.inc' +include '../../proc32.inc' +include '../../dll.inc' +include '../../KOSfuncs.inc' +include '../../develop/libraries/box_lib/box_lib.mac' ;ъюьяюэхэЄ√ checkBox ш editBox +include '../../load_lib.mac' ;ьръЁюё фы  чруЁєчъш сшсышюЄхъ +@use_library + +KMENUITEM_NORMAL equ 0 +KMENUITEM_SUBMENU equ 1 +KMENUITEM_SEPARATOR equ 2 + +Otstup = 30 + +START: + call copyKill ;яЁюёЄхщ°р▀ чр∙шЄр юЄ чряєёър тЄюЁющ ъюяшш яЁшыюцхэш▀ + mcall 68, 11 ;шэшЎшрышчрЎш▀ ъєўш + + ;mcall 48,3,sc,sizeof.system_colors ;яюыєўшЄ№ ёшёЄхьэ√х ЎтхЄр + mov eax,48 ;яюыєўшЄ№ ёшёЄхьэ√х ЎтхЄр + mov ebx,3 + mov ecx, sc + mov edx, sizeof.system_colors + mcall + + stdcall dll.Load, @IMPORT + or eax, eax + jnz exit + + mov eax,40 ;єёЄрэютшЄ№ ьрёъє фы▀ юцшфрхь√ї ёюс√Єшщ + mov ebx,0x27 ;ёшёЄхьр сєфхЄ ЁхрушЁютрЄ№ Єюы№ъю эр ёююс∙хэшх ю яхЁхЁшёютъх, эрцрЄр ъэюяър, юяЁхфхы▐ээр▀ Ёрэхх, ёюс√Єшх юЄ ь√°ш (ўЄю-Єю ёыєўшыюё№ - эрцрЄшх эр ъэюяъє ь√°ш шыш яхЁхьх∙хэшх; ёсЁрё√трхЄё▀ яЁш яЁюўЄхэшш) + mcall + + load_libraries l_libs_start,load_lib_end ;чруЁєчър сшсышюЄхъ(ш) + stdcall [OpenDialog_Init],OpenDialog_data ;яюфуюЄютър фшрыюур + + ;mode menu + stdcall [kmenu_init], sc ;kmenu initialisation + stdcall [ksubmenu_new] + mov [modeMenu], eax + stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu0, 110 + stdcall [ksubmenu_add], [modeMenu], eax + stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu1, 111 + stdcall [ksubmenu_add], [modeMenu], eax + stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu2, 112 + stdcall [ksubmenu_add], [modeMenu], eax + stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu3, 113 + stdcall [ksubmenu_add], [modeMenu], eax + stdcall [kmenuitem_new], KMENUITEM_SUBMENU, valueModeMenu1, [modeMenu] + + call loadConfig ;чруЁєцрхь ъюэЇшуєЁрЎш■ шч Їрщыр, хёыш эхЄ - Єю т√ёЄрты▀хь ярЁрьхЄЁ√ яю єьюыўрэш■ + call draw_window ;юЄЁшёютрЄ№ юъэю яЁшыюцхэш▀ + +; ╬сЁрсюЄър Ўшъыр ёюс√Єшщ +event_wait: + mov eax, 10 ; function 10 : wait until event + mcall ; event type is returned in eax + + cmp eax, 1 ; Event redraw request ? + je red ; Expl.: there has been activity on screen and + ; parts of the applications has to be redrawn. + + cmp eax, 2 ; Event key in buffer ? + je key ; Expl.: User has pressed a key while the + ; app is at the top of the window stack. + + cmp eax, 3 ; Event button in buffer ? + je button ; Expl.: User has pressed one of the + ; applications buttons. + + invoke edit_box_mouse, editLU ;яЁютхЁър ёюс√Єшщ ь√°ш фы▀ editBox'ют + invoke edit_box_mouse, editLD + invoke edit_box_mouse, editRU + invoke edit_box_mouse, editRD + ;stdcall [kmainmenu_dispatch_cursorevent], [modeMenu] ;яЁютхЁър ь√°ш фы▀ ъюьсюсюъёр + invoke edit_box_mouse, editRadius + + jmp event_wait + + +red: ;юсЁрсюЄър ёюс√Єш▀ яхЁхЁшёютъш юъэр + call draw_window + jmp event_wait + +key: ; Keypress event handler + mov eax, 2 ; The key is returned in ah. The key must be + mcall ; read and cleared from the system queue. + + invoke edit_box_key, editLU + invoke edit_box_key, editLD + invoke edit_box_key, editRU + invoke edit_box_key, editRD + invoke edit_box_key, editRadius + + cmp eax, 1 + je event_wait + cmp word[hkSymbol], 0 + jne event_wait + cmp al, 0 + jne .next + mov byte[hkSymbol], ah + + push eax ecx esi ;ёюїЁрэ▀хь ёърэъюф ъыртш°ш + shr eax, 16 + mov byte[keyscan], al + mov ecx, 0 + mov cl, al ;byte[keyscan] + mov esi, keystr.data + call IntToStr + + ;ёўшЄрхь яюыєўхээ√щ ЁрчьхЁ ёЄЁюъш + xor ecx, ecx + mov esi, keystr.data + @@: + cmp byte[esi], 0 + je @f + inc esi + inc ecx + ;cmp ecx, 4 + ;je @f + jmp @b + @@: + ;ш ёюїЁрэ▀хь хую + mov dword[keystr.size], ecx + + pop esi ecx eax + jmp red +.next: + ;cmp al, 2 + ;jne @f + ;cmp ah, 0 + ;jne @f + ;ёўшЄ√трхь єяЁрты▀■∙шх ъыртш°ш + ;shr eax, 16 + ;bt eax, 0 ;left shift + ;jne @f + ;mov byte[hkSymbol], 2 + ;jmp red +@@: + jmp event_wait ; Just read the key, ignore it and jump to event_wait. + +button: ; Buttonpress event handler + mov eax,17 ; The button number defined in window_draw + mcall ; is returned to ah. + + cmp ah,1 ; button id=1 ? + jne noclose +exit: + mov eax,-1 ; Function -1 : close this program + mcall +noclose: + cmp ah, 2 ;ъэюяър "╧ЁшьхэшЄ№" + jne @f ;butend + call applyButton ;т√чют эр°хую юсЁрсюЄўшър эрцрЄш▀ ъэюяъш + jmp event_wait +@@: + cmp ah, 4 + jne @f + mov byte[editID], 4 + call but_open_dlg + jmp event_wait +@@: + cmp ah, 5 + jne @f + mov byte[editID], 5 + call but_open_dlg + jmp event_wait +@@: + cmp ah, 6 + jne @f + mov byte[editID], 6 + call but_open_dlg + jmp event_wait +@@: + cmp ah, 7 + jne @f + mov byte[editID], 7 + call but_open_dlg + jmp event_wait +@@: + cmp ah, 8 + jne @f + push eax ebx ecx + mcall 9, pi, -1 ;get window coord + + mov eax, dword[pi+34] + add eax, buttonModeX ;+ 5 + mov word[coordModeMenu.x], ax + + mov eax, dword[pi+38] + add eax, buttonModeY + 20 ;20 - ¤Єю ёьх∙хэшх тёяы√тр■∙хую ьхэ■ + mov word[coordModeMenu.y], ax + + stdcall [ksubmenu_draw], [modeMenu], coordModeMenu + pop ecx ebx eax + jmp event_wait +@@: + cmp ah, 9 + jne @f + mov word[hkSymbol], 0 + jmp red ;event_wait +@@: + cmp ah, 110 + jne @f + mov byte[mode], 48 ;'0' + jmp event_wait +@@: + cmp ah, 111 + jne @f + mov byte[mode], 49 ;'1' + jmp event_wait +@@: + cmp ah, 112 + jne @f + mov byte[mode], 50 ;'2' + jmp event_wait +@@: + cmp ah, 113 + jne @f + mov byte[mode], 51 ;'3' + jmp event_wait +@@: +butend: + jmp event_wait ;this is for ignored events, useful at development + + + +;шь▀ ъюэЇшуєЁрЎшюээюую Їрщыр +fileName: db 'SETTINGS/HA.CFG', 0 + +;ёЄЁєъЄєЁр фы▀ ёючфрэш▀/яхЁхчряшёш Їрщыр +createFile: + .func dd 2 ;эюьхЁ яюфЇєэъЎшш + .re dd 0, 0 ;чрЁхчхЁтшЁютрэю + .size dd 0 ;ёъюы№ъю срщЄ яшёрЄ№ + .data_adr dd 0 ;єърчрЄхы№ эр фрээ√х + .path db 0 + .path_adr dd fileName ;яєЄ№ + +;ёЄЁюър ярЁрьхЄЁют яю єьюыўрэш■ ш х▐ ЁрчьхЁ +defaultDataForConfig db 121,13,10,'/sys/HACONFIG',13,10,'/sys/HACONFIG',13,10,'/sys/HACONFIG',13,10,'/sys/HACONFIG',13,10,'Space',13,10,'57',13,10,'10',13,10,'s',13,10 +defaultDataSize = 85 ;48+19+4 + + +copyParam: ;ъюяшЁєхЄ ярЁрьхЄЁ(ъюьрэфє чряєёър) т сєЇхЁ (ёь. фры№°х) + push esi ebx ecx + mov ecx, dword[ebx] ;ўшЄрхь ЁрчьхЁ ёЄЁюъш + + cmp ecx, 0 ;яєёЄр ыш ёЄЁюър? + jne copyParam.copy ;хёыш эхЄ, Єю яхЁхїюфшь ъ ъюяшЁютрэш■ ёюфхЁцшьюую ёЄЁюъш (ъ Ўшъыє) + + mov byte[eax], '-' ;хёыш цх яєёЄю, Єю чрьхэ▀хь ёшьтюыюь ьшэєё '-' + inc eax + ;jmp copyParam.copyEnd ;ш т√їюфшь + ;фрыхх т эрўрых Ўшъыр яЁюшчющф▐Є ёЁртэхэшх ш т√їюф + +.copy: ;ъюяшЁєхь ёшьтюы√ + cmp ecx, 0 + je copyParam.copyEnd + mov bl, byte[esi] + mov byte[eax], bl + dec ecx + inc eax + inc esi + jmp copyParam.copy +.copyEnd: + pop ecx ebx esi + ret + + +addPerenos: ;фюсрты▀хЄ яхЁхэюё ёЄЁюъш т сєЇхЁ + mov byte[eax], 13 + inc eax + mov byte[eax], 10 + inc eax + ret + +;юсЁрсюЄўшъ ъэюяъш "╧ЁшьхэшЄ№" +applyButton: + push eax ebx ecx + ;mov dword[createFile.data_adr], defaultDataForConfig + ;mov dword[createFile.size], defaultDataSize + + ;т√ўшёышь ЁрчьхЁ Їрщыр ъюэЇшуєЁрЎшш т срщЄрї + mov ecx, 9*2+1 ;1 срщЄ эр ёюёЄю▀эшх ръЄштэюёЄш ш 9 ярЁ яхЁхэюёют ёЄЁюъ (ёшьтюы√ 13, 10) + add ecx, dword[editLU.size] ;яы■ё ЁрчьхЁ ърцфющ ёЄЁюъш т срщЄрї + add ecx, dword[editLD.size] + add ecx, dword[editRU.size] + add ecx, dword[editRD.size] ;dataBuffer.size4] + add ecx, dword[editRadius.size] + add ecx, dword[hkSize] ;ЁрчьхЁ шьхэш ръЄштрЎшюээющ ъэюяъш + add ecx, dword[keystr.size] ;ЁрчьхЁ ёърэъюфр ръЄштрЎшюээющ ъэюяъш + inc ecx ; х∙▐ 1 срщЄ фы▀ їЁрэхэш▀ ЁрчьхЁр ¤ыхьхэЄют + + ;cmp dword[keystr.size], 3 + ;jbe @f + ;mcall -1 + ;@@: + + ;хёыш чрфрэ√ яєёЄ√х ёЄЁюъш, Єю ь√ ртЄюьрЄшўхёъш фюсрты▀хь чэръ ьшэєё, чэрўшЄ ЁрчьхЁ +1 срщЄ + cmp dword[editLU.size], 0 + jne @f + inc ecx +@@: + cmp dword[editLD.size], 0 + jne @f + inc ecx +@@: + cmp dword[editRU.size], 0 + jne @f + inc ecx +@@: + cmp dword[editRD.size], 0 + jne @f + inc ecx +@@: + + ;ЄхяхЁ№ ЁрчьхЁ Їрщыр ъюэЇшуєЁрЎшш т ecx + mov dword[createFile.size], ecx ;яюыюцшь ЁрчьхЁ срщЄ т ёЄЁєъЄєЁє ёючфрэш▀/яхЁхчряшёш Їрщыр + mcall 68, 12, ecx ;т√фхы▀хь сыюъ ярь▀Єш яюф сєЇхЁ ёюфхЁцшьюую + mov dword[createFile.data_adr], eax ;ёюїЁрэ▀хь рфЁхё сєЇхЁр т ёЄЁєъЄєЁє + + ;чряюыэшь сєЇхЁ ёюфхЁцшьюую: + push ebx ;ёюїЁрэ▀хь т√сЁрээ√щ Ёхцшь + mov bl, byte[mode] + mov byte[eax], bl + pop ebx + + inc eax + call addPerenos + + push esi ebx + call UpdateEditsSizes ;юсэютшЄ№ ЁрчьхЁ√ ЄхъёЄр т edit'рї + + mov esi, dataBuffer.1 ;editLU.text + mov ebx, dataBuffer.size1 ;editLU.size + call copyParam + call addPerenos ;фюсрты▀хь яхЁхэюё ёЄЁюъш + + mov esi, dataBuffer.2 + mov ebx, dataBuffer.size2 + call copyParam + call addPerenos ;фюсрты▀хь яхЁхэюё ёЄЁюъш + + mov esi, dataBuffer.3 + mov ebx, dataBuffer.size3 + call copyParam + call addPerenos ;фюсрты▀хь яхЁхэюё ёЄЁюъш + + mov esi, dataBuffer.4 + mov ebx, dataBuffer.size4 + call copyParam + call addPerenos ;фюсрты▀хь яхЁхэюё ёЄЁюъш + + ;ёюїЁрэ▀хь ъэюяъє ръЄштрЎшш + call saveKey + call addPerenos + + ;ёюїЁрэ▀хь ёърэъюф ъэюяъш + mov esi, keystr.data ;чряшё√трхь ёЄЁюъє keystr т Їрщы + xor ebx, ebx + @@: + cmp byte[esi], 0 + je @f + mov bl, byte[esi] + mov byte[eax], bl + inc eax + inc esi + cmp esi, keystr.size-1 + jae @f + jmp @b + @@: + call addPerenos + + ;ёюїЁрэ▀хь Ёрфшєё + ;!!! хёыш Ёрфшєё юёЄртыхэ яєёЄ√ь, Єю эєцэю ёюїЁрэ▀Є№ чэрўхэшх яю єьюыўрэш■ (ёхщўрё яш°хЄё▀ '-') + mov esi, radiusBuffer.data + mov ebx, editRadius.size ;radiusBuffer.size + call copyParam + call addPerenos + + ;фюсрты▀хь ЁрчьхЁ ¤ыхьхэЄют + push ebx ;ёюїЁрэ▀хь т√сЁрээ√щ Ёхцшь + mov bl, byte[sizeStyle] + mov byte[eax], bl + pop ebx + inc eax + call addPerenos + + pop ebx esi + + + mov ebx, createFile + mcall 70 + cmp eax, 0 + je .end + ;шэрўх чфхё№ эєцэю т√тхёЄш юъэю ё ю°шсъющ !!! +.end: + mcall 68, 13, dword[createFile.data_adr] ;юётюсюцфрхь ярь▀Є№ яюф сєЇхЁ + call finishHotAnglesApp ;чртхЁ°рхь ЁрсюЄє тёхї ъюяшщ ёхЁтшёр @HA + call loadConfig ;яхЁхчруЁєцрхь Їрщы ъюэЇшур + call draw_window ;яхЁхЁшёют√трхь юъэю + call startHotAnglesApp ;яхЁхчряєёърхь @HA + pop ecx ebx eax + ret + + + + + + +compareBytes2: + push edi esi ecx ebx + xor eax, eax + mov ecx, 10 ;max ЁрчьхЁ ёЄЁюъ 11 +@@: + mov bl, byte[edi] + cmp bl, byte[esi] + jne compareBytes.no + inc edi + inc esi + cmp ecx, 0 + je @f + dec ecx + jmp @b +.no: + mov eax, 1 +@@: + pop ebx ecx esi edi + ret + + +finishHotAnglesApp: + ;эрїюфшь тёх ъюяшш яЁшыюцхэш▀ яю шьхэш ш чртхЁ°рхь шї + push eax ebx ecx esi edi + ;єърчрЄхыш, ъюЄюЁ√х эшъюуфр эх ьхэ▀■Єё▀: + mov esi, startAppData.file_name ;яхЁтр▀ ёЄЁюър - шёъюьюх шь▀ яЁшыюцхэш▀ + mov edi, buf ;тЄюЁр▀ ёЄЁюър - шь▀ Єхъє∙хую ёыюЄр + add edi, 10 + + mov ecx, 1 +@@: + mcall 9, buf, ecx ;яюыєўрхь фрээ√х юўхЁхфэюую ёыюЄр + mov dword[slotMax], eax + + call compareBytes2 ;ёЁртэштрхь шь▀ + cmp eax, 0 + jne finishHotAnglesApp.next ;хёыш эх ёютярыю, Єю яхЁхїюфшь эр ёыхфє■∙шщ ёыюЄ + + mcall 18, 2, ecx ;шэрўх чртхЁ°рхь ёыюЄ +.next: + inc ecx + cmp ecx, dword[slotMax] + ja @f + jmp @b +@@: + pop edi esi ecx ebx eax + ret + +startHotAnglesApp: + ;чряєёърхь яЁшыюцхэшх чрэютю + push eax ebx + mcall 70, startAppData + cmp eax, 0 + ja @f ;хёыш eax>0, Єю єёях°эю чряє∙хэю + ;!!! шэрўх ЄєЄ яхўрЄрхь ю°шсъє +@@: + pop ebx eax + ret + +startAppData: + .subfunction dd 7 + .flags dd 0 + .param dd 0 + .rezerv dd 0, 0 + .full_name db '/sys/' + .file_name db '@HA', 0 + +UpdateEditsSizes: + push eax + mov eax, dword[editLU.size] + mov dword[dataBuffer.size1], eax + + mov eax, dword[editLD.size] + mov dword[dataBuffer.size2], eax + + mov eax, dword[editRU.size] + mov dword[dataBuffer.size3], eax + + mov eax, dword[editRD.size] + mov dword[dataBuffer.size4], eax + + mov eax, dword[editRadius.size] + mov dword[radiusBuffer.size], eax + + pop eax + ret + +fileAdr dd 0 + +loadConfig: + push eax ebx ecx edx + mcall 68, 27, fileName ;чруЁєцрхь ъюэЇшуєЁрЎшюээ√щ Їрщы т ╬╟╙ + mov dword[fileAdr], eax ;ёюїЁрэ▀хь рфЁхё сыюър ярь▀Єш Їрщыр + cmp eax, 0 + je loadConfig.default ;хёыш Їрщыр ъюэЇшуєЁрЎшш эхЄ, Єю ёЄртшь эрёЄЁющъш яю єьюыўрэш■ + ;шэрўх фрээ√х чруЁєцхэ√ т ╬╟╙, ЁрчьхЁ т edx + cmp edx, 0 ;хёыш Їрщы яєёЄ, т э▐ь эхЄ фрээ√ї, Єю ёЄртшь эрёЄЁющъш яю єьюыўрэш■ + je loadConfig.default +.start: + add edx, eax ;ъырф▐ь т edx - рфЁхё ъюэЎр ъюэЇшу.фрээ√ї + +.chStart: + + push ebx + mov bl, byte[eax] + cmp bl, 48 ; хёыш чэрўхэшх т√їюфшЄ чр фюяєёЄшь√х яЁхфхы√, Єю яЁютхЁ▀хь эр 'n' (фы▀ ёютьхёЄшьюёЄш) + jb loadConfig.checkN + cmp bl, 51 + ja loadConfig.checkN + + mov byte[mode], bl ;шэрўх єёЄрэртыштрхь ¤ЄюЄ Ёхцшь ъръ хёЄ№ + jmp loadConfig.modeEnd ;ш шф▐ь фры№°х +.checkN: + cmp bl, 'n' ;хёыш n - Єю Ёхцшь "юЄъы■ўхэю" + jne @f + mov byte[mode], 48 ;'0' + jmp loadConfig.modeEnd +@@: + cmp bl, 'y' ;хёыш y - Єю ъырёёшўхёъшщ Ёхцшь + jne @f + mov byte[mode], 49 ;'1' + jmp loadConfig.modeEnd +@@: + mov byte[mode], 48 ;'0' шэрўх яю єьюыўрэш■ юЄъы■ўхэю + ;mov byte[mode], 49 ;'1' шэрўх яю єьюыўрэш■ тъы■ў▐э ъырёёшўхёъшщ Ёхцшь ЁрсюЄ√ +.modeEnd: + pop ebx + ;jmp loadConfig.end ;ъюьрэфр фы▀ єфюсёЄтр юЄырфъш ш яюшёър ю°шсюъ + + ;ъюяшЁєхь ёюфхЁцшьюх ёЄЁюъ т сєЇхЁ + push edi esi ecx ebx eax + ;шэшЎшрышчшЁєхь єърчрЄхыш эр рфЁхёр сєЇхЁр ёЄЁюъш ш х▐ ЁрчьхЁр + mov edi, dataBuffer.1 + mov esi, dataBuffer.size1 + ;ecx - ёў▐Єўшъ срщЄ т ёЄЁюъх +.block: + xor ecx, ecx ;юсэєы▀хь ёў▐Єўшъ + inc eax + cmp byte[eax], 10 ;хёыш юўхЁхфэющ ъюф ёшьтюыр 10 шыш 13, Єю яЁюяєёърхь ёшьтюы√ + je loadConfig.block ;фю яхЁтюую юЄышўэюую юЄ эшї + cmp byte[eax], 13 + je loadConfig.block + + ; ёшьтюы юЄышўхэ юЄ яхЁхэюёр ёЄЁюъш ш тючтЁрЄр ърЁхЄъш - эрўшэрхь ъюяшЁютрЄ№ юЄё■фр т сєЇхЁ + mov bl, byte[eax] + mov byte[edi], bl + inc edi + inc eax + inc ecx ;єтхышўштрхь ёў▐Єўшъ ёшьтюыют т ёЄЁюъх + + ;шф▐ь фю ъюэЎр ¤Єющ ёЄЁюъш: яюър эх тёЄЁхЄшь юўхЁхфэющ 10, 13, 0 шыш file end +.while: ;ш ъюяшЁєхь тё▐ т сєЇхЁ + cmp eax, edx ;яЁютхЁ▀хь чръюэўшыё▀ ыш Їрщы, р ъюэЎр ёЄЁюъш эх с√ыю !!! + ja loadConfig.ura + cmp byte[eax], 10 + je loadConfig.ura + cmp byte[eax], 0 + je loadConfig.ura + cmp byte[eax], 13 + je loadConfig.ura + + mov bl, byte[eax] + mov byte[edi], bl + inc edi + inc eax + inc ecx + cmp ecx, 511 + jae loadConfig.ura + jmp loadConfig.while +.ura: + mov byte[edi], 0 ;ъырф▐ь чртхЁ°р■∙шщ 0 т ёЄЁюъє + mov dword[esi], ecx ;ёюїЁрэ▀хь ЁрчьхЁ ёЄЁюъш + add esi, 4 ;яхЁхїюфшь эр ЁрчьхЁ ёыхфє■∙хую сєЇхЁр + sub edi, ecx ;яхЁхїюфшь эр ёыхфє■∙шщ сєЇхЁ + add edi, 512 + ;xor ecx, ecx ;юсэєы▀хь ЁрчьхЁ ёЄЁюъш + + cmp edi, dataBuffer.size1 ;хёыш ¤Єю с√ы яюёыхфэшщ сєЇхЁ (ш ь√ т√°ыш чр рфЁхёр ЁрчьхЁют сєЇхЁют), Єю т√їюфшь + jb loadConfig.block + + call readOptKey ;ёўшЄ√трхь ъыртш°є + call gotoEndString + + ;ёўшЄ√трхь ёърэъюф ъыртш°ш + call readScanKey + call gotoEndString + + call readOptRadius ;ёўшЄ√трхь чэрўхэшх Ёрфшєёр фы▀ mode 3 + call gotoEndString + call readOptSize ;ёўшЄ√трхь ЁрчьхЁ ¤ыхьхэЄют + call gotoEndString + + pop eax ebx ecx esi edi + + jmp loadConfig.end +.default: + mov eax, defaultDataForConfig + mov edx, defaultDataSize + jmp loadConfig.start +.end: + mov ecx, dword[fileAdr] ;хёыш Їрщы с√ы чруЁєцхэ, Єю + cmp ecx, 0 + je @f + mcall 68, 13, ecx ;т√уЁєцрхь Їрщы шч ярь▀Єш +@@: + call updateParams ;яЁшьхэ▀хь эрёЄЁющъш ърцфюую сєЇхЁр + call setMySize ;яЁшьхэ▀хь эрёЄЁющъш ЁрчьхЁр ¤ыхьхэЄют + pop edx ecx ebx eax + ret + + +setMySize: + push eax + ;т√ёЄрты▀хь mysize т чртшёшьюёЄш юЄ чэрўхэш▀ sizeStyle + cmp byte[sizeStyle], '0' + jb @f + cmp byte[sizeStyle], '7' + ja @f + mov eax, 0 ;хёыш чэрўхэшх ЁрчьхЁр чрфрэю, Єю хую ш т√ёЄрты▀хь + mov al, byte[sizeStyle] + sub al, '0' + jmp .end +@@: + cmp byte[sizeStyle], 'a' + je .auto + ;cmp byte[sizeStyle], 's' + ;je .system +.system: ;шэрўх чэрўхэшх яю єьюыўрэш■: s - ёшёЄхьэр▀ +; push ebx ecx + ;!!! +; mov eax, 9 +; mcall 48, 11 ;яюыєўрхь ёшёЄхьэ√щ ЁрчьхЁ °ЁшЇЄр + ;eax - т√ёюЄр °ЁшЇЄр т яшъёхы▀ї +; mov ecx, eax +; push eax +; mcall 48, 12, ecx ;яЁшьхэ▀хь ЁрчьхЁ °ЁшЇЄр +; pop eax +; pop ecx ebx + ;temp fix - фхышь эр Єхъє∙шщ ЁрчьхЁ °ЁшЇЄр and -1 +; push ebx edx +; mov ebx, 9 + ;div ebx +; pop edx ebx + ;cmp eax, 0 + ;je .end + ;dec eax + mov eax, 0 ;xor eax, eax ;test temp + jmp .end +.auto: ;a - т√ёЄрты▀хь т чртшёшьюёЄш юЄ ЁрчЁх°хэш▀ ¤ъЁрэр + ;!!! + mcall 14 + push ebx + xor ebx, ebx + mov bx, ax + shr eax, 16 + cmp ax, bx ;яюыєўрхь сюы№°шщ ЁрчьхЁ ёЄюЁюэ√ + jae .a + mov ax, bx +.a: + pop ebx + cmp ax, 1919 ;ЁрчьхЁ√ яюыєўхээ√х т√°х юЄ 0 ш эр 1 ьхэ№°х + jb .size0 + cmp ax, 2047 + jb .size1 + cmp ax, 4095 + jb .size2 + cmp ax, 8191 + jb .size3 + + jmp .size4 + +.size0: + mov eax, 0 + jmp .end +.size1: + mov eax, 1 + jmp .end +.size2: + mov eax, 2 + jmp .end +.size3: + mov eax, 3 + jmp .end +.size4: + mov eax, 4 + jmp .end +.size5: + mov eax, 5 + jmp .end +.size6: + mov eax, 6 + jmp .end +.size7: + mov eax, 7 + jmp .end + +;.default: +; mov eax, 1 +.end: + mov byte[mysize], al ;mov dword[mysize], eax + pop eax + ret + + +readScanKey: + ;яЁюяєёърхь яхЁхэюё√ ёЄЁюъ т эрўрых + cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю + ja .default ;эрёЄЁющъш яю єьюыўрэш■ + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + + push ecx ebx esi + mov ecx, 0 ;xor ecx, ecx + mov esi, keystr.data +.copy: + mov bl, byte[eax] + cmp bl, 0 + je .copyEnd + cmp bl, 10 + je .copyEnd + cmp bl, 13 + je .copyEnd + cmp esi, keystr.size-1 + jae .copyEnd + mov byte[esi], bl + inc esi + inc eax + inc ecx + jmp .copy +.copyEnd: + mov byte[esi], 0 + mov dword[keystr.size], ecx + pop esi ebx ecx + + jmp .end +@@: + inc eax + jmp readScanKey +.default: + mov byte[keyscan], 57 + mov word[keystr.data], '57' + mov byte[keystr.data+2], 0 + mov dword[keystr.size], 2 +.end: + ret + +readOptKey: ;1;3;4;5 - space or shift + ;яЁюяєёърхь яхЁхэюё√ ёЄЁюъ т эрўрых + cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю + ja .default ;эрёЄЁющъш яю єьюыўрэш■ + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + ;шэрўх ўшЄрхь ъыртш°є ш т√їюфшь + cmp dword[eax], 'Ctrl' + jne .notCtrl + mov byte[hkSymbol], 3 + mov dword[hkSize], 4 + jmp .end +.notCtrl: + cmp dword[eax], 'Shif' + jne .notShift + mov byte[hkSymbol], 2 + mov dword[hkSize], 5 + jmp .end +.notShift: + cmp dword[eax], 'Spac' + jne .notSpace + mov byte[hkSymbol], 32 + mov dword[hkSize], 5 + jmp .end +.notSpace: + cmp word[eax], 'Al' + jne .notAlt + mov byte[hkSymbol], 1 + mov dword[hkSize], 3 + jmp .end +.notAlt: + ;єсхфшьё▀, ўЄю Єрь 1 ёшьтюы, р эх ёЄЁюър + cmp byte[eax+1], 10 + je .oneSymb + cmp byte[eax+1], 0 + je .oneSymb + cmp byte[eax+1], 13 + je .oneSymb + jmp .default +.oneSymb: + ;яЁютхЁ▀хь, ўЄю ёшьтюы ЁрчЁх°▐ээ√щ !!! + + ;фюсрты▀хь ёшьтюы ъръ хёЄ№ + push ebx + ;xor ebx, ebx + mov bl, byte[eax] + mov byte[hkSymbol], bl + mov dword[hkSize], 1 + pop ebx + + jmp .end +@@: + inc eax + jmp readOptKey + +.default: + mov byte[hkSymbol], 32 + mov dword[hkSize], 5 +.end: + mov byte[hkSymbol+1], 0 + ret + +;яЁюїюфшь фю ъюэЎр Єхъє∙хщ ёЄЁюъш +gotoEndString: + cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю + ja @f ;т√їюфшь + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + ;шэрўх яхЁхїюфшь эр ёыхфє■∙шщ ёшьтюы + inc eax + jmp gotoEndString +@@: + ret + +readOptRadius: + ;яЁюяєёърхь яхЁхэюё√ ёЄЁюъ т эрўрых + cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю + ja .default ;эрёЄЁющъш яю єьюыўрэш■ + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + + ;шэрўх ёўшЄ√трхь чэрўхэшх + push ebx ecx + xor ecx, ecx +.readValue: + mov bl, byte[eax] + mov byte[radiusBuffer.data+ecx], bl + inc ecx + inc eax + cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю т√їюф + ja .readEnd + cmp byte[eax], 10 + je .readEnd + cmp byte[eax], 0 + je .readEnd + cmp byte[eax], 13 + je .readEnd + cmp ecx, 6 + jae .readEnd + jmp .readValue +.readEnd: + mov byte[radiusBuffer.data+ecx], 0 + mov dword[radiusBuffer.size], ecx + pop ecx ebx + + jmp .end +@@: + inc eax + jmp readOptRadius +.default: + mov byte[radiusBuffer.data], '0' + mov byte[radiusBuffer.data+1], 0 + mov dword[radiusBuffer.size], 1 +.end: + + ret + + +readOptSize: + ;яЁюяєёърхь яхЁхэюё√ ёЄЁюъ т эрўрых + cmp eax, edx ;хёыш Їрщы чръюэўшыё▀, Єю + ja .default ;эрёЄЁющъш яю єьюыўрэш■ + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + + ;яЁютхЁ▀хь, ўЄю ¤Єю фюяєёЄшьюх чэрўхэшх: 1-7, a, s + cmp byte[eax], 'a' + je .setValue + cmp byte[eax], 's' + je .setValue + cmp byte[eax], '0' + je .setValue + cmp byte[eax], '1' + je .setValue + cmp byte[eax], '2' + je .setValue + cmp byte[eax], '3' + je .setValue + cmp byte[eax], '4' + je .setValue + cmp byte[eax], '5' + je .setValue + cmp byte[eax], '6' + je .setValue + cmp byte[eax], '7' + je .setValue + + jmp .default ;шэрўх ёЄртшь чэрўхэшх яю єьюыўрэш■ + +.setValue: + push ebx + mov bl, byte[eax] + mov byte[sizeStyle], bl + pop ebx + + jmp .end +@@: + inc eax + jmp readOptSize +.default: + mov byte[sizeStyle], 's' ;ёшёЄхьэ√щ +.end: + ret + + + + +updateParams: ;max, size, pos + push eax + mov eax, dword[dataBuffer.size1] + mov dword[editLU.size], eax + mov dword[editLU.pos], eax + + mov eax, dword[dataBuffer.size2] + mov dword[editLD.size], eax + mov dword[editLD.pos], eax + + mov eax, dword[dataBuffer.size3] + mov dword[editRU.size], eax + mov dword[editRU.pos], eax + + mov eax, dword[dataBuffer.size4] + mov dword[editRD.size], eax + mov dword[editRD.pos], eax + + mov eax, dword[radiusBuffer.size] + mov dword[editRadius.size], eax + mov dword[editRadius.pos], eax + pop eax + ret + + + +selfName db 'HACONFIG', 0 +selfNameSize = 8 ;фю 11 byte +; +compareBytes: + push edi esi ecx ebx + mov eax, 0 ;xor eax, eax + mov ecx, selfNameSize ;max ЁрчьхЁ ёЄЁюъ 11 +@@: + mov bl, byte[edi] + cmp bl, byte[esi] + jne compareBytes.no + inc edi + inc esi + cmp ecx, 0 + je @f + dec ecx + jmp @b +.no: + mov eax, 1 +@@: + pop ebx ecx esi edi + ret +; +slotMax dd 0 +selfPID dd 0 +buf db 1024 dup(0) +copyKill: + push eax ebx ecx esi edi + + ;ёяхЁтр яЁюўЄ▐ь ётю■ шэЇюЁьрЎш■ + mcall 9, buf, -1 + mov eax, dword[buf+30] + mov dword[selfPID], eax + + ;єърчрЄхыш, ъюЄюЁ√х эшъюуфр эх ьхэ▀■Єё▀: + mov esi, selfName ;яхЁтр▀ ёЄЁюър - шь▀ Єхъє∙хую яЁшыюцхэш▀ + mov edi, buf ;тЄюЁр▀ ёЄЁюър - шь▀ Єхъє∙хую ёыюЄр + add edi, 10 + + mov ecx, 1 +@@: + mcall 9, buf, ecx + mov dword[slotMax], eax + + ;хёыш ¤Єю ь√ ёрьш, Єю яЁюяєёърхь яЁютхЁъє + mov eax, dword[buf+30] + cmp eax, dword[selfPID] + je copyKill.propusk + + call compareBytes ;ёЁртэштрхь 11 срщЄ ёЄЁюъ, Ёхчєы№ЄрЄ т eax + + cmp eax, 0 + je copyKill.selfKill + +.propusk: + inc ecx + cmp ecx, dword[slotMax] + ja @f + jmp @b + +.selfKill: + pop edi esi ecx ebx eax + mcall -1 + ret +@@: + pop edi esi ecx ebx eax + ret + + WindowsWidth = 550 + WindowsHeight = 235 +coord: ;ъююЁфшэрЄ√ юъэр яЁшыюцхэш▀ + .y dw 0 + .x dw 0 + +draw_window: + mcall 12, 1 ; Start window redraw + + ;юЄюсЁрчшь юъэю яю ЎхэЄЁє ¤ъЁрэр фы▀ ¤Єюую: + mcall 14 ;яюыєўшь ЁрчьхЁ√ ¤ъЁрэр + mov dword[coord], eax ;яюыюцшь ЁрчьхЁ√ ¤ъЁрэр т ъююЁфшэрЄ√ + shr word[coord.x], 1 ;тхЁэхх яюыюцшь шї яюыютшэє + shr word[coord.y], 1 + + ;т√ўшёы▀хь ъююЁфшэрЄ√ юъэр, ўЄюс√ юъэю с√ыю яю ёхЁхфшэх ¤ъЁрэр + sub word[coord.x], WindowsWidth/2 + sub word[coord.y], WindowsHeight/2 + + mov eax, 0 ; function 0 : define and draw window + mov ebx, 0 ; [x start] *65536 + [x size] + mov bx, word[coord.x] + shl ebx, 16 + mov bx, WindowsWidth + + mov ecx, 0 + mov cx, word[coord.y] ; [y start] *65536 + [y size] + shl ecx, 16 + mov cx, WindowsHeight + + mov edx, 0x14ffffff ; color of work area RRGGBB + ; 0x02000000 = window type 4 (fixed size, skinned window) + mov esi, 0x808899ff ; color of grab bar RRGGBB + ; 0x80000000 = color glide + mov edi, title + mcall + + invoke edit_box_draw, editLU ;Ёшёютрэшх edit box'ют + invoke edit_box_draw, editLD + invoke edit_box_draw, editRU + invoke edit_box_draw, editRD + + ;Ёшёєхь ъэюяъє ш хх ЄхъёЄ + buttonAppleY = WindowsHeight-40 + mcall 8, , , 2, 0x00AABBCC + mcall 4, , 0x10FFFFFF, buttonText, buttonTextSize + + ;Ёшёєхь х∙▐ 4 ъэюяъш фы▀ фшрыюуютюую юъэр т√сюЁр Їрщыр + ;эюьхЁр 4,5,6 ш 7 + buttonW = 30 + buttonH = 21 + ;ыхт√щ тхЁїэшщ єуюы + mcall 8, , <85,buttonH>, 4, 0x00AABBCC + ;ыхт√щ эшцэшщ єуюы + mcall 8, , <120,buttonH>, 5 + ;яЁрт√щ тхЁїэшщ єуюы + mcall 8, , <85,buttonH>, 6 + ;яЁрт√щ эшцэшщ єуюы + mcall 8, , <120,buttonH>, 7 + + ;Ёшёєхь ЄхъёЄ√ фы▀ ¤Єшї 4 ъэюяюъ + mov ecx, 0xFFFFFF ;схы√щ ЎтхЄ ЄхъёЄр + mov edx, commonButtonText ;ёЄЁюър ЄхъёЄр + mov esi, commonButtonTextSize ;ЁрчьхЁ ЄхъёЄр т ёшьтюырї + ;ъююЁфшэрЄ√ ЄхъёЄр (x, y) + deltaCommonTextX = 7 + deltaCommonTextY = 6 + mcall 4, + mcall 4, + mcall 4, + mcall 4, + + ;delete mode button, if it exist + mov edx, 0x80000008 + mcall 8 + ;draw button Mode + buttonModeX = 30 ;433 + buttonModeY = 160 ;50 + buttonModeWidth = 300 + buttonModeHeight = 20 + buttonModeTextYoffset = 3 + buttonModeTextXoffset = 5 + mcall 8, , , 8, 0x00FFFFFF + mcall 13, , , 0xAABBCC + ;draw text for button Mode + mov ebx, (buttonModeX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset) ;(x, y) + mov ecx, 0x10000000 + call setTextModeMenu + mov esi, valueModeMenuSize + mcall 4 + mov ebx, (buttonModeX+buttonModeWidth-12) * 65536 + (buttonModeY+buttonModeTextYoffset+3) + mov ecx, 0x80FFFFFF + mov edx, symbolDownArrow + mcall 4 + + ;ъэюяър т√сюЁр уюЁ▀ўхщ ъыртш°ш + buttonHotKeyX = 350-10 + buttonHotKeyWidth = 90 + mov edx, 0x80000009 ;єфры▀хь + mcall 8 + cmp byte[mode], 49 ;Ёшёєхь т√сюЁ ъыртш°ш, Єюы№ъю хёыш mode > 1 + jbe @f + ;Ёшёєхь эютє■ + push eax ebx ecx edx esi + mov ebx, buttonHotKeyX*65536 + buttonHotKeyWidth ;X + Width + mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height + mov edx, 0x00000009 ;button id + mov esi, 0x00FFFFFF ;color button + mcall 8 + pop esi edx ecx ebx eax + ;ЄхъёЄ яюфёърчъш фы▀ уюЁ▀ўхщ ъыртш°ш + mov ebx, (buttonHotKeyX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset) ;(x, y) + mov ecx, 0x90224466 + call setTextForHotKey + mov esi, valueModeMenuSize + mcall 4 + ;чруюыютюъ + push eax ebx ecx edx edi esi + mov ebx, buttonHotKeyX * 65536 + (buttonModeY-11) + mov ecx, 0x80224466 + mov edx, hkCaption + mov esi, 3 + mcall 4 + pop esi edi edx ecx ebx eax + @@: + + ;юЄюсЁрцрхь эрёЄЁющъє Ёрфшєёр фхщёЄтш▀ цхёЄр, Єюы№ъю хёыш т√сЁрэ Ёхцшь 3 + cmp byte[mode], 51 + jne @f + ;чруюыютюъ + push eax ebx ecx edx edi esi + mov ebx, (buttonHotKeyX + buttonHotKeyWidth + 20) * 65536 + (buttonModeY-11) + mov ecx, 0x80224466 + mov edx, radiusCaption + mov esi, 3 + mcall 4 + pop esi edi edx ecx ebx eax + invoke edit_box_draw, editRadius + @@: + + call draw_super_text + + LineLength = 62 + mov ebx, Otstup * 65536 + 32 ; draw info text with function 4 (x, y) + + ;xor ecx, ecx + ;mov cl, 1 ;byte[mysize] + ;shl ecx, 24 + ;add ecx, 0x224466 + ;or ecx, 0x00224466 ;80224466 + mov ecx, 0x10224466 + + mov edx, text + mov esi, LineLength + mov eax, 4 + + .newline: ; text from the DATA AREA + mcall + add ebx, 15 + add edx, LineLength + cmp byte[edx], 0 + jne .newline + + mcall 12, 2 ; End window redraw + + ret + +hkSymbol: db 0, 0 + +setTextForHotKey: + push eax + mov al, byte[hkSymbol] + cmp al, 0 + jne @f + mov edx, hkHint + mov dword[hkSize], 5 ;чэрўхэшх яю єьюыўрэш■ SPACE ;shift + jmp setTextForHotKey.end +@@: + cmp al, 1 + jne @f + mov edx, hkAlt + mov dword[hkSize], 3 + jmp setTextForHotKey.end +@@: + cmp al, 2 + jne @f + mov edx, hkShift + mov dword[hkSize], 5 + jmp setTextForHotKey.end +@@: + cmp al, 3 + jne @f + mov edx, hkCtrl + mov dword[hkSize], 4 + jmp setTextForHotKey.end +@@: + cmp al, 32 + jne @f + mov edx, hkSpace + mov dword[hkSize], 5 + jmp setTextForHotKey.end +@@: + cmp al, 96 ;'`' + je setTextForHotKey.symb + cmp al, 126 ;'~' + je setTextForHotKey.symb + cmp al, 48 ;'0' + jb @f + cmp al, 57 ;'9' + ja @f +.symb: + mov edx, hkSymbol + mov dword[hkSize], 1 + jmp setTextForHotKey.end +@@: + cmp al, 97 ;'a' + jb @f + cmp al, 122 ;'z' + ja @f + ;jmp setTextForHotKey.symb + mov edx, hkSymbol + mov dword[hkSize], 1 + jmp setTextForHotKey.end +@@: + cmp al, 65 ;'A' + jb @f + cmp al, 90 ;'Z' + ja @f + ;jmp setTextForHotKey.symb + mov edx, hkSymbol + mov dword[hkSize], 1 + jmp setTextForHotKey.end +@@: + mov word[hkSymbol], 0 ;хёыш цх яюярыю ўЄю-Єю эхшчтхёЄэюх, Єю ёюЄЁ▐ь хую + mov edx, hkHint + mov dword[hkSize], 5 ;shift or space - чэрўхэшх яю єьюыўрэш■ +.end: + pop eax + ret + + +setTextModeMenu: + cmp byte[mode], 48 + jne @f + mov edx, valueModeMenu0 + ret +@@: + cmp byte[mode], 49 + jne @f + mov edx, valueModeMenu1 + ret +@@: + cmp byte[mode], 50 + jne @f + mov edx, valueModeMenu2 + ret +@@: + cmp byte[mode], 51 + jne @f + mov edx, valueModeMenu3 + ret +@@: + mov edx, valueModeMenu1 + ret + + + + +saveKey: + cmp word[hkSymbol], 0 + je .default + cmp byte[hkSymbol], 1 + je .alt + cmp byte[hkSymbol], 2 + je .shift + cmp byte[hkSymbol], 3 + je .ctrl + cmp byte[hkSymbol], 32 + je .space +.other: + mov esi, hkSymbol + mov byte[esi+1], 0 + mov dword[hkSize], 1 + jmp .end +.space: + mov esi, hkSpace + mov dword[hkSize], 5 + jmp .end +.ctrl: + mov esi, hkCtrl + mov dword[hkSize], 4 + jmp .end +.alt: + mov esi, hkAlt + mov dword[hkSize], 3 + jmp .end +.default: +.shift: + mov esi, hkShift + mov dword[hkSize], 5 +.end: + mov ebx, hkSize ;єърчрЄхы№ эр dword[hkSize] + call copyParam + ret + + + + + +align 16 +@IMPORT: + +library box_lib, 'box_lib.obj' + +import box_lib,\ + edit_box_draw, 'edit_box_draw',\ + edit_box_key, 'edit_box_key',\ + edit_box_mouse, 'edit_box_mouse',\ + init_checkbox, 'init_checkbox2',\ + check_box_draw, 'check_box_draw2',\ + check_box_mouse, 'check_box_mouse2',\ + option_box_draw, 'option_box_draw',\ + option_box_mouse, 'option_box_mouse' + +commonButtonText db '...', 0 ;ЄхъёЄ фы▀ ъэюяюъ т√чютр OpenDial +commonButtonTextSize = 3 + +if lang eq ru_RU ;хёыш ▀ч√ъ ёсюЁъш Ёєёёъшщ + +text db "Конфигуратор Hot Angles отвечает за настройку активных углов. " + db "Настройте параметры под себя или отключите эту опцию. " + db " ", 0 + hed: +title db "Конфигуратор утилиты Hot Angles", 0 +buttonText db "Применить", 0 +buttonTextSize = 9 + +ch_text db 'Включить/активировать "Hot Angles"', 0 + +superText: + .lu db 'Команда левого верхнего угла: ', 0 + .ld db 'Команда левого нижнего угла: ', 0 + .ru db 'Команда правого верхнего угла:', 0 + .rd db 'Команда правого нижнего угла: ', 0 +superTextSize = 30 + +valueModeMenuSize = 32 +ModeMenu db 'Режим работы:',0 +valueModeMenu0 db 'отключено ',0 +valueModeMenu1 db 'классический режим ',0 +valueModeMenu2 db 'режим горячей клавиши ',0 +valueModeMenu3 db 'режим жеста по клавише активации',0 + +hkCaption: db 'Клавиша:',0 +;hkHint: db 'Нажмите любую клавишу',0 +radiusCaption: db 'Радиус:',0 + +else ;шэрўх рэуышщёъшщ ЄхъёЄ + +text db "This is a Hot Angles Configurator. " + db "Set the parameters bellow for yourself or disable this option." + db " ", 0 + hed: +title db "Hot Angles Configurator", 0 +buttonText db " Apply ", 0 +buttonTextSize = 9 + +ch_text db 'Activate "Hot Angles"',0 ;ёюяЁютюцфр■∙шщ ЄхъёЄ фы▀ ўхъ сюъёр + +superText: + .lu db 'Left up angle command: ', 0 + .ld db 'Left down angle command: ', 0 + .ru db 'Right up angle command: ', 0 + .rd db 'Right down angle command:', 0 +superTextSize = 25 + +valueModeMenuSize = 32 +ModeMenu db 'Mode:',0 +valueModeMenu0 db 'disabled ',0 +valueModeMenu1 db 'classic mode ',0 +valueModeMenu2 db 'hot key mode ',0 +valueModeMenu3 db 'activation key gesture mode ',0 + +hkCaption: db 'Key:',0 +;hkHint: db 'press any key',0 +radiusCaption: db 'Radius:',0 + +end if + +hkAlt: db 'Alt',0 +hkShift: db 'Shift',0 +hkCtrl: db 'Ctrl',0 +hkSpace: db 'Space',0 +hkHint: db '?',0 +hkSize: rd 1 ;ЁрчьхЁ ёЄЁюъш ё шьхэхь ъыртш°ш + +draw_super_text: + push eax ebx ecx edx edi esi + + mov ecx, 0 + mov ch, byte[mysize] + shl ecx, 16 + add ecx, 0x224466 + + mcall 4, ,,superText.lu,superTextSize + mcall 4, ,,superText.ld,superTextSize + mcall 4, <290,74> ,,superText.ru,superTextSize + mcall 4, <290,109> ,,superText.rd,superTextSize + + mov ebx, Otstup * 65536 + (buttonModeY-11) + or ecx, 0x80000000 + mov edx, ModeMenu + mov esi, 3 + mcall 4 + +; mov ebx, buttonHotKeyX * 65536 + (buttonModeY-11) +; or ecx, 0x80000000 +; mov edx, hkCaption +; mov esi, 3 +; mcall 4 + + pop esi edi edx ecx ebx eax + ret + +editID db 0 +initEBX: + cmp byte[editID], 4 + jne @f + mov ebx, dataBuffer.1 + ret +@@: + cmp byte[editID], 5 + jne @f + mov ebx, dataBuffer.2 + ret +@@: + cmp byte[editID], 6 + jne @f + mov ebx, dataBuffer.3 + ret +@@: + cmp byte[editID], 7 + jne @f + mov ebx, dataBuffer.4 + ret +@@: + ret +setRESULT: + cmp byte[editID], 4 + jne @f + mov dword[dataBuffer.size1], ecx + mov dword[editLU.size], ecx + mov dword[editLU.pos], ecx + ret +@@: + cmp byte[editID], 5 + jne @f + mov dword[dataBuffer.size2], ecx + mov dword[editLD.size], ecx + mov dword[editLD.pos], ecx + ret +@@: + cmp byte[editID], 6 + jne @f + mov dword[dataBuffer.size3], ecx + mov dword[editRU.size], ecx + mov dword[editRU.pos], ecx + ret +@@: + cmp byte[editID], 7 + jne @f + mov dword[dataBuffer.size4], ecx + mov dword[editRD.size], ecx + mov dword[editRD.pos], ecx + ret +@@: + ret +copyPath: + push eax ebx ecx edx ;copy file name path + mov eax, openfile_path ;dword[OpenDialog_data.openfile_path] + call initEBX ;mov ebx, dataBuffer.1 ;.data + mov ecx, 0 + @@: + mov dl, byte[eax] + cmp dl, 0 ;byte[eax], 0 + je @f + mov byte[ebx], dl + inc eax + inc ebx + inc ecx + jmp @b + @@: + mov byte[ebx], 0 + call setRESULT + pop edx ecx ebx eax + ret + + +IntToStr: ;in esi - ёЄЁюър; eёx - ўшёыю + push eax ecx edx esi + or ecx, ecx + jnz @f + mov byte[esi], '0' + inc esi + jmp .end +@@: + mov eax, ecx + mov ecx, 10 +.next: + xor edx, edx + div ecx + add edx, '0' + + mov byte[esi], dl + + inc esi + or eax, eax + jz .end + jmp .next +.end: + mov byte[esi], 0 ;ъырф▐ь чртхЁ°р■∙шщ эюы№ + pop esi edx ecx eax + call reverseString ;фхырхь ЁхтхЁё ёЄЁюъш + ret + +;тїюф: esi - єърчрЄхы№ эр ёЄЁюъє +reverseString: + push eax esi edi + + mov al, byte[esi] ;хёыш ёЄЁюър яєёЄр▀ Єю т√їюфшь ЁхтхЁё фхырЄ№ эх эрфю + cmp al, 0 + je reverseString.end + + mov edi, esi ;шэрўх эрщф▐ь яючшЎш■ яюёыхфэхую ёшьтюыр ёЄЁюъш ш яюыюцшь х▐ т edi +.go_last_symbol: + mov al, byte[edi+1] + cmp al, 0 + je @f + + inc edi + jmp reverseString.go_last_symbol +@@: + push ebx +.rev: + cmp esi, edi + jae @f + + ;ьхэ▀хь ьхёЄрьш ёшьтюы√ т Ўшъых + mov al, byte[edi] + mov bl, byte[esi] + mov byte[edi], bl + mov byte[esi], al + + inc esi + dec edi + jmp reverseString.rev +@@: + pop ebx +.end: + pop edi esi eax + ret + + + +align 4 +but_open_dlg: + 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],2 + je @f + cmp [OpenDialog_data.status],0 ;яюы№чютрЄхы№ эрцры Cancel? + je .end_open + ;ъюф яЁш єфрўэюь юЄъЁ√Єшш фшрыюур + call copyPath + jmp .end_open + @@: + ;ъюф яЁш эх єфрўэюь юЄъЁ√Єшш фшрыюур + ;... + .end_open: + popad + ret + +;фрээ√х фы▀ фшрыюур юЄъЁ√Єш▀ Їрщыют +align 4 +OpenDialog_data: +.type dd 0 ;0 - юЄъЁ√Є№, 1 - ёюїЁрэшЄ№, 2 - т√сЁрЄ№ фшЁхъЄюЁш■ +.procinfo dd pi +.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 '/sys',0 ;фшЁхъЄюЁш▀ яю єьюыўрэш■ +communication_area_name: db 'FFFFFFFF_open_dialog',0 +open_dialog_name: db 'opendial',0 +communication_area_default_path: db '/sys/File managers/',0 + +Filter: +dd Filter.end - Filter.1 +.1: +;db 'KEX',0 +.end: +db 0 + +mode db 49 ;'1' +modeMenu dd 0 +coordModeMenu: + .x dw 100 + .y dw 200 + + +system_dir0 db '/sys/lib/' +lib0_name db 'proc_lib.obj',0 +system_dir1 db '/sys/lib/' +lib1_name db 'kmenu.obj',0 + +symbolDownArrow db 25,0 + +;library structures +l_libs_start: + lib0 l_libs lib0_name, file_name, system_dir0, import_proclib + lib1 l_libs lib1_name, file_name, system_dir1, import_libkmenu +load_lib_end: + + +edMaxSize = 510 ;ЄхяхЁ№ ё эют√ь ъюьяюэхэЄюь ьюцэю ш 511 єърчрЄ№ +edMax = 0 ;max, size, pos + +align 4 +editLU edit_box 230-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0x10000000, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax ;ed_focus +editLD edit_box 230-buttonW,Otstup+buttonW,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0x10000000, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax +editRU edit_box 230-buttonW,290,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0x10000000, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax +editRD edit_box 230-buttonW,290,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0x10000000, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax +editRadius edit_box 40,(buttonHotKeyX + buttonHotKeyWidth + 20),buttonModeY, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0x10000000, 4, radiusBuffer.data, mouse_dd, ed_figure_only, edMax, edMax + +align 4 +import_proclib: + OpenDialog_Init dd aOpenDialog_Init + OpenDialog_Start dd aOpenDialog_Start +dd 0,0 + aOpenDialog_Init db 'OpenDialog_init',0 + aOpenDialog_Start db 'OpenDialog_start',0 + +align 4 +import_libkmenu: + kmenu_init dd akmenu_init + kmainmenu_draw dd akmainmenu_draw + kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent + ksubmenu_new dd aksubmenu_new + ksubmenu_delete dd aksubmenu_delete + ksubmenu_draw dd aksubmenu_draw + ksubmenu_add dd aksubmenu_add + kmenuitem_new dd akmenuitem_new + kmenuitem_delete dd akmenuitem_delete + kmenuitem_draw dd akmenuitem_draw +dd 0,0 + akmenu_init db 'kmenu_init',0 + akmainmenu_draw db 'kmainmenu_draw',0 + akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0 + aksubmenu_new db 'ksubmenu_new',0 + aksubmenu_delete db 'ksubmenu_delete',0 + aksubmenu_draw db 'ksubmenu_draw',0 + aksubmenu_add db 'ksubmenu_add',0 + akmenuitem_new db 'kmenuitem_new',0 + akmenuitem_delete db 'kmenuitem_delete',0 + akmenuitem_draw db 'kmenuitem_draw',0 + +sc system_colors +mouse_dd rd 1 + +sizeStyle: rb 1 ;ЁрчьхЁ ЄхъёЄр ш юёЄры№э√ї ¤ыхьхэЄют юъэр +mysize: rb 1 ;rd 1 +radiusBuffer: ;сєЇхЁ фы▀ яюы▀ Ёрфшєёр цхёЄр + .data: rb 6 + .size: rd 1 +radiusBufferEnd: + +button_press rd 0 ;for kmenu + +sys_path: rb 4096 +file_name: rb 4096 +plugin_path: rb 4096 +openfile_path: rb 4096 +filename_area: rb 256 +rb 1024 +pi process_information + +keyscan: rb 1 +keystr: + .data: rb 4 ;ёЄЁюър ёю чэрўхэшхь ёърэъюфр ръЄштрЎшюээющ ъыртш°ш + .size: rd 1 ;ЁрчьхЁ ёюфхЁцшьюую ёЄЁюъш схч яюёыхфэхую эєы▀ + +dataBuffer: +.1: rb 512 +.2: rb 512 +.3: rb 512 +.4: rb 512 +.size1: rd 1 +.size2: rd 1 +.size3: rd 1 +.size4: rd 1 +;255+255+2 = 512 +;фтр чрярёэ√ї срщЄр эхюсїюфшь√ фы▀ Єюую ўЄю с√ эх яхяхЁхяшёрЄ№ ёыхфє■∙шхщ срщЄ√, т ъюэЎх сєЇхЁр 0 +dataBufferEnd: + + +I_END: + rb 4096 +align 16 +STACKTOP: + +MEM: diff --git a/programs/other/kpack/trunk/kpack.asm b/programs/other/kpack/trunk/kpack.asm index d354ee437..9f9f63316 100644 --- a/programs/other/kpack/trunk/kpack.asm +++ b/programs/other/kpack/trunk/kpack.asm @@ -1,570 +1,573 @@ -;--------------------------------------------------------------------- -; Kpack - Kolibri Packer -; Kolibri version -; Written by diamond in 2006, 2007 specially for KolibriOS -; -; Disassemled and corrected in 2010-2011 specially for FASM -; by Marat Zakiyanov aka Mario79, aka Mario -; -; Uses LZMA compression library by Igor Pavlov -; (for more information on LZMA and 7-Zip visit http://www.7-zip.org) -; (plain-C packer and ASM unpacker are ported by diamond) -;--------------------------------------------------------------------- -use32 - org 0 - - db 'MENUET01' - dd 1 - dd START - dd IM_END - dd I_END - dd stacktop - dd params - dd cur_dir_path -;--------------------------------------------------------------------- -include '../../../config.inc' ;for nightbuild -include '../../../KOSfuncs.inc' -include '../../../macros.inc' -include '../../../gui_patterns.inc' -include '../../../develop/libraries/box_lib/trunk/box_lib.mac' -include '../../../load_lib.mac' - @use_library - -START: - mcall SF_SYS_MISC,SSF_HEAP_INIT - mcall SF_SET_EVENTS_MASK,0x80000027 - - load_libraries l_libs_start,load_lib_end - cmp eax,-1 - je exit - - init_checkboxes2 check1,check1_end - call clear_messages - -; pack kernel ? - cmp [params], dword '-ker' - jne @f - - mov esi,kernel_name - mov edi,inname - call copy_1 - - mov esi,kernel_name - mov edi,outname - call copy_1 - - mov esi,defpath - mov edi,path - call copy_1 - - call pack - jmp exit - -@@: -; set default path = /SYS/ - mov esi,defpath - mov edi,path - mov [edi-4],dword 6 - movsw - movsd -; get system window info - xor eax,eax - cmp [params],al - je default - - mov edi,path - mov esi,params - call copy_1 - - sub esi,2 - std -@@: - lodsb - dec edi - cmp al,byte '/' - jnz @r - - mov [edi-1],byte 0 - mov edi,inname - add esi,2 - push esi - call copy_1 - pop esi - mov edi,outname - call copy_1 -end_param: -;--------------------------------------------------------------------- - call set_editbox_position_all -;--------------------------------------------------------------------- - call draw_window - call pack - jmp OD_initialization -;********************************************************************* -default: - mov esi,definoutname - mov edi,esi - xor ecx,ecx - xor eax,eax - dec ecx - repnz scasb - not ecx - dec ecx - mov [innamelen],ecx - push ecx - push esi - mov edi,inname - rep movsb - pop esi - pop ecx - mov [outnamelen],ecx - mov edi,outname - rep movsb -;--------------------------------------------------------------------- - call set_editbox_position_all -;--------------------------------------------------------------------- -OD_initialization: -;OpenDialog initialisation - push dword OpenDialog_data - call [OpenDialog_Init] -;--------------------------------------------------------------------- -red: - call draw_window -;-------------------------------------- -still: - mcall SF_WAIT_EVENT - dec eax - jz red - - dec eax - jz key - - dec eax - jz button - - push dword edit1 - call [edit_box_mouse] - - push dword edit2 - call [edit_box_mouse] - - push dword edit3 - call [edit_box_mouse] - - push dword check1 - call [check_box_mouse] - - jmp still -;********************************************************************* -tell_compress_mess: - push compressing_len - pop ecx - mov esi,compressing_str - call write_string - ret -;********************************************************************* -clear_mess_and_displogo: - call refresh_editbox_data -; clear messages - call clear_messages -; display logo - mov esi,info_str - push info_len - pop ecx - call write_string - ret -;********************************************************************* -clear_messages: - xor eax,eax - mov ecx,80*20/4+1 - mov edi,message_mem - rep stosd - ret -;********************************************************************* -exit: - xor eax,eax - dec eax - mcall ;SF_TERMINATE_PROCESS -;********************************************************************* -button: -; button pressed - mcall SF_GET_BUTTON - xchg al,ah - cmp al,7 - jz but7 - - dec eax - jz exit - - dec eax - jnz nopack - - bt dword[check1.flags],1 - jc @f - - call pack - jmp still -;--------------------------------------------------------------------- -@@: - call kerpack - jmp still -;--------------------------------------------------------------------- -nopack: - dec eax - jnz nounpack - - call unpack - jmp still -;--------------------------------------------------------------------- -but7: - call clear_messages -; display logo - mov esi,info_str - push info_len - pop ecx - call write_string -; display info - mov esi,usage_str - mov ecx,usage_len - call write_string - jmp still -;--------------------------------------------------------------------- -nounpack: - dec eax - jnz still - - call OpenDialog_start - jmp still -;********************************************************************* -OpenDialog_start: - mov esi,path - mov edi,temp_dir_pach - call copy_1 - - push dword OpenDialog_data - call [OpenDialog_Start] - cmp [OpenDialog_data.status],1 - jne @f - - mov esi,filename_area - mov edi,inname - call copy_1 - - mov esi,filename_area - mov edi,outname - call copy_1 - - mov esi,temp_dir_pach - mov edi,path - call copy_1 - - call refresh_editbox_data - - call set_editbox_position_all - - call draw_editbox -@@: - ret -;********************************************************************* -copy_1: - xor eax,eax - cld -@@: - lodsb - stosb - test eax,eax - jnz @r - ret -;********************************************************************* -refresh_editbox_data: - mov esi,inname - mov edi,innamelen - call refresh_data - - mov esi,outname - mov edi,outnamelen - call refresh_data - - mov esi,path - mov edi,pathlen - call refresh_data - - ret -;********************************************************************* -refresh_data: - push esi - xor eax,eax - cld -@@: - lodsb - test eax,eax - jnz @r - pop eax - sub esi,eax - dec esi - mov [edi],esi - ret -;********************************************************************* -set_editbox_position_all: - mov ebx,inname - mov edi,edit1 - call set_editbox_position - - mov ebx,outname - mov edi,edit2 - call set_editbox_position - - mov ebx,path - mov edi,edit3 - call set_editbox_position - ret -;********************************************************************* -key: - mcall SF_GET_KEY - - push dword edit1 - call [edit_box_key] - - push dword edit2 - call [edit_box_key] - - push dword edit3 - call [edit_box_key] - - jmp still -;********************************************************************* -get_full_name: - push esi - mov esi,path - mov ecx,[esi-4] - mov edi,fullname - rep movsb - mov al,'/' - cmp [edi-1],al - jz @f - - stosb -;-------------------------------------- -@@: - pop esi - cmp [esi],al - jnz @f - - mov edi,fullname -;-------------------------------------- -@@: - mov ecx,[esi-4] - rep movsb - xor eax,eax - stosb - ret -;********************************************************************* -write_string: -; in: esi=pointer, ecx=length - mov edx,[message_cur_pos] -;-------------------------------------- -x1: - lea edi,[message_mem+edx] -;-------------------------------------- -do_write_char: - lodsb - cmp al,10 - jz newline - - stosb - inc edx - loop do_write_char - jmp x2 -;--------------------------------------------------------------------- -newline: - xor eax,eax - stosb - xchg eax,edx - push ecx - push eax - mov ecx,80 - div ecx - pop eax - xchg eax,edx - sub edx,eax - add edx,ecx - pop ecx - loop x1 -;-------------------------------------- -x2: - mov [message_cur_pos],edx -; update window - call draw_log_area -;-------------------------------------- -draw_messages: - mov ebx,12 shl 16 + LOG_Y + 7 - mov edi,message_mem -;-------------------------------------- -@@: - push edi - xor eax,eax - push 80 - pop ecx - repnz scasb - sub ecx,79 - neg ecx - mov esi,ecx - pop edi - mcall SF_DRAW_TEXT,,0xB0000000,edi - add ebx,16 - add edi,80 - cmp edi,message_cur_pos - jb @b - - ret -;********************************************************************* -draw_log_area: - DrawRectangle 5, LOG_Y, WIN_W-12, LOG_H, [sc.work_graph] - mcall SF_DRAW_RECT, <6,WIN_W-13>, , 0xFFFfff - DrawRectangle3D 6, LOG_Y+1, WIN_W-13, LOG_H-1, 0xDEDEDE, [sc.work_graph] - ret -;********************************************************************* -draw_window: -; start redraw - mcall SF_REDRAW,SSF_BEGIN_DRAW - mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,40 - ;-------------------------------------- - edit_boxes_set_sys_color edit1,editboxes_end,sc - check_boxes_set_sys_color2 check1,check1_end,sc - ;-------------------------------------- -; define window - mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT - - mov ecx,100 shl 16 + WIN_H - add ecx, eax - - mov edx,[sc.work] - add edx,34000000h - xor esi,esi - xor edi,edi - mcall SF_CREATE_WINDOW,<250,WIN_W+10>,,,,caption_str - mcall SF_THREAD_INFO,procinfo,-1 - - mov eax,[procinfo+70] ;status of window - test eax,100b - jne .end -;-------------------------------------- -; draw lines and frame - call draw_log_area -; draw buttons - call draw_buttons -; draw messages - call draw_messages -; draw editbox's - call draw_editbox -; end redraw -.end: - mcall SF_REDRAW,SSF_END_DRAW - ret -;********************************************************************* -draw_editbox: - push dword edit1 - call [edit_box_draw] - - push dword edit2 - call [edit_box_draw] - - push dword edit3 - call [edit_box_draw] - - mov eax,[sc.work_text] - or eax, 0x90000000 - mov [check1.text_color], eax - push dword check1 - call [check_box_draw] - ret -;********************************************************************* -set_editbox_position: - mov esi,ebx - cld -@@: - lodsb - test al,al - jne @r - sub esi,ebx - mov eax,esi - dec eax - mov [edi+48], eax ;ed_size - mov [edi+52], eax ;ed_pos - ret -;********************************************************************* -draw_buttons: -; define compress button - mov cx,18 - mcall SF_DEFINE_BUTTON,, <3, 20>,2,[sc.work_button] -; uncompress button - inc edx - add ecx,LINE_H shl 16 - mcall -; question button - push esi - mov dl,7 - mcall ,, - mov ecx,[sc.work_button_text] - or ecx,0x90000000 - mov edx,aQuestion - mcall SF_DRAW_TEXT, - pop esi -; define Path button - mcall SF_DEFINE_BUTTON,<6,64>,,4 -; text on Path button - mov ebx,8 shl 16+5 - mov al,4 - mov ecx,[sc.work_text] - push buttons1names - pop edx - push 8 - pop esi -;-------------------------------------- -; text on settings buttons - mov ecx, [sc.work_text] - or ecx, 0x10000000 - mcall , <8, 5>, , buttons1names, 8 - - add edx,esi - add ebx,LINE_H - mcall - add edx,esi - add ebx,LINE_H - mov ecx,[sc.work_button_text] - or ecx, 0x10000000 - sub ebx, 10 shl 16 - mcall -; text on compress and decompress buttons - or ecx,0x80000000 - mcall ,,,aCompress - mcall ,,,aDecompress - ret -;********************************************************************* -;Pack procedures -include 'packpoc.inc' -;--------------------------------------------------------------------- -;UnPack procedures -include 'upacproc.inc' -;--------------------------------------------------------------------- -;lzma_compress: -include 'lzma_compress.inc' -;--------------------------------------------------------------------- -;lzma_set_dict_size: -include 'lzma_set_dict_size.inc' -;--------------------------------------------------------------------- -;lzma_decompress: -include 'lzma_decompress.inc' -;--------------------------------------------------------------------- -;kerpack code: -include 'kerpack.inc' -;--------------------------------------------------------------------- -;initialized variables and constants -include 'const_var.inc' -;--------------------------------------------------------------------- -IM_END: -;--------------------------------------------------------------------- -;uninitialized data -include 'data.inc' -;--------------------------------------------------------------------- -I_END: -;--------------------------------------------------------------------- \ No newline at end of file +; SPDX-License-Identifier: NOASSERTION +; + +;--------------------------------------------------------------------- +; Kpack - Kolibri Packer +; Kolibri version +; Written by diamond in 2006, 2007 specially for KolibriOS +; +; Disassemled and corrected in 2010-2011 specially for FASM +; by Marat Zakiyanov aka Mario79, aka Mario +; +; Uses LZMA compression library by Igor Pavlov +; (for more information on LZMA and 7-Zip visit http://www.7-zip.org) +; (plain-C packer and ASM unpacker are ported by diamond) +;--------------------------------------------------------------------- +use32 + org 0 + + db 'MENUET01' + dd 1 + dd START + dd IM_END + dd I_END + dd stacktop + dd params + dd cur_dir_path +;--------------------------------------------------------------------- +include '../../../config.inc' ;for nightbuild +include '../../../KOSfuncs.inc' +include '../../../macros.inc' +include '../../../gui_patterns.inc' +include '../../../develop/libraries/box_lib/box_lib.mac' +include '../../../load_lib.mac' + @use_library + +START: + mcall SF_SYS_MISC,SSF_HEAP_INIT + mcall SF_SET_EVENTS_MASK,0x80000027 + + load_libraries l_libs_start,load_lib_end + cmp eax,-1 + je exit + + init_checkboxes2 check1,check1_end + call clear_messages + +; pack kernel ? + cmp [params], dword '-ker' + jne @f + + mov esi,kernel_name + mov edi,inname + call copy_1 + + mov esi,kernel_name + mov edi,outname + call copy_1 + + mov esi,defpath + mov edi,path + call copy_1 + + call pack + jmp exit + +@@: +; set default path = /SYS/ + mov esi,defpath + mov edi,path + mov [edi-4],dword 6 + movsw + movsd +; get system window info + xor eax,eax + cmp [params],al + je default + + mov edi,path + mov esi,params + call copy_1 + + sub esi,2 + std +@@: + lodsb + dec edi + cmp al,byte '/' + jnz @r + + mov [edi-1],byte 0 + mov edi,inname + add esi,2 + push esi + call copy_1 + pop esi + mov edi,outname + call copy_1 +end_param: +;--------------------------------------------------------------------- + call set_editbox_position_all +;--------------------------------------------------------------------- + call draw_window + call pack + jmp OD_initialization +;********************************************************************* +default: + mov esi,definoutname + mov edi,esi + xor ecx,ecx + xor eax,eax + dec ecx + repnz scasb + not ecx + dec ecx + mov [innamelen],ecx + push ecx + push esi + mov edi,inname + rep movsb + pop esi + pop ecx + mov [outnamelen],ecx + mov edi,outname + rep movsb +;--------------------------------------------------------------------- + call set_editbox_position_all +;--------------------------------------------------------------------- +OD_initialization: +;OpenDialog initialisation + push dword OpenDialog_data + call [OpenDialog_Init] +;--------------------------------------------------------------------- +red: + call draw_window +;-------------------------------------- +still: + mcall SF_WAIT_EVENT + dec eax + jz red + + dec eax + jz key + + dec eax + jz button + + push dword edit1 + call [edit_box_mouse] + + push dword edit2 + call [edit_box_mouse] + + push dword edit3 + call [edit_box_mouse] + + push dword check1 + call [check_box_mouse] + + jmp still +;********************************************************************* +tell_compress_mess: + push compressing_len + pop ecx + mov esi,compressing_str + call write_string + ret +;********************************************************************* +clear_mess_and_displogo: + call refresh_editbox_data +; clear messages + call clear_messages +; display logo + mov esi,info_str + push info_len + pop ecx + call write_string + ret +;********************************************************************* +clear_messages: + xor eax,eax + mov ecx,80*20/4+1 + mov edi,message_mem + rep stosd + ret +;********************************************************************* +exit: + xor eax,eax + dec eax + mcall ;SF_TERMINATE_PROCESS +;********************************************************************* +button: +; button pressed + mcall SF_GET_BUTTON + xchg al,ah + cmp al,7 + jz but7 + + dec eax + jz exit + + dec eax + jnz nopack + + bt dword[check1.flags],1 + jc @f + + call pack + jmp still +;--------------------------------------------------------------------- +@@: + call kerpack + jmp still +;--------------------------------------------------------------------- +nopack: + dec eax + jnz nounpack + + call unpack + jmp still +;--------------------------------------------------------------------- +but7: + call clear_messages +; display logo + mov esi,info_str + push info_len + pop ecx + call write_string +; display info + mov esi,usage_str + mov ecx,usage_len + call write_string + jmp still +;--------------------------------------------------------------------- +nounpack: + dec eax + jnz still + + call OpenDialog_start + jmp still +;********************************************************************* +OpenDialog_start: + mov esi,path + mov edi,temp_dir_pach + call copy_1 + + push dword OpenDialog_data + call [OpenDialog_Start] + cmp [OpenDialog_data.status],1 + jne @f + + mov esi,filename_area + mov edi,inname + call copy_1 + + mov esi,filename_area + mov edi,outname + call copy_1 + + mov esi,temp_dir_pach + mov edi,path + call copy_1 + + call refresh_editbox_data + + call set_editbox_position_all + + call draw_editbox +@@: + ret +;********************************************************************* +copy_1: + xor eax,eax + cld +@@: + lodsb + stosb + test eax,eax + jnz @r + ret +;********************************************************************* +refresh_editbox_data: + mov esi,inname + mov edi,innamelen + call refresh_data + + mov esi,outname + mov edi,outnamelen + call refresh_data + + mov esi,path + mov edi,pathlen + call refresh_data + + ret +;********************************************************************* +refresh_data: + push esi + xor eax,eax + cld +@@: + lodsb + test eax,eax + jnz @r + pop eax + sub esi,eax + dec esi + mov [edi],esi + ret +;********************************************************************* +set_editbox_position_all: + mov ebx,inname + mov edi,edit1 + call set_editbox_position + + mov ebx,outname + mov edi,edit2 + call set_editbox_position + + mov ebx,path + mov edi,edit3 + call set_editbox_position + ret +;********************************************************************* +key: + mcall SF_GET_KEY + + push dword edit1 + call [edit_box_key] + + push dword edit2 + call [edit_box_key] + + push dword edit3 + call [edit_box_key] + + jmp still +;********************************************************************* +get_full_name: + push esi + mov esi,path + mov ecx,[esi-4] + mov edi,fullname + rep movsb + mov al,'/' + cmp [edi-1],al + jz @f + + stosb +;-------------------------------------- +@@: + pop esi + cmp [esi],al + jnz @f + + mov edi,fullname +;-------------------------------------- +@@: + mov ecx,[esi-4] + rep movsb + xor eax,eax + stosb + ret +;********************************************************************* +write_string: +; in: esi=pointer, ecx=length + mov edx,[message_cur_pos] +;-------------------------------------- +x1: + lea edi,[message_mem+edx] +;-------------------------------------- +do_write_char: + lodsb + cmp al,10 + jz newline + + stosb + inc edx + loop do_write_char + jmp x2 +;--------------------------------------------------------------------- +newline: + xor eax,eax + stosb + xchg eax,edx + push ecx + push eax + mov ecx,80 + div ecx + pop eax + xchg eax,edx + sub edx,eax + add edx,ecx + pop ecx + loop x1 +;-------------------------------------- +x2: + mov [message_cur_pos],edx +; update window + call draw_log_area +;-------------------------------------- +draw_messages: + mov ebx,12 shl 16 + LOG_Y + 7 + mov edi,message_mem +;-------------------------------------- +@@: + push edi + xor eax,eax + push 80 + pop ecx + repnz scasb + sub ecx,79 + neg ecx + mov esi,ecx + pop edi + mcall SF_DRAW_TEXT,,0xB0000000,edi + add ebx,16 + add edi,80 + cmp edi,message_cur_pos + jb @b + + ret +;********************************************************************* +draw_log_area: + DrawRectangle 5, LOG_Y, WIN_W-12, LOG_H, [sc.work_graph] + mcall SF_DRAW_RECT, <6,WIN_W-13>, , 0xFFFfff + DrawRectangle3D 6, LOG_Y+1, WIN_W-13, LOG_H-1, 0xDEDEDE, [sc.work_graph] + ret +;********************************************************************* +draw_window: +; start redraw + mcall SF_REDRAW,SSF_BEGIN_DRAW + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,40 + ;-------------------------------------- + edit_boxes_set_sys_color edit1,editboxes_end,sc + check_boxes_set_sys_color2 check1,check1_end,sc + ;-------------------------------------- +; define window + mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT + + mov ecx,100 shl 16 + WIN_H + add ecx, eax + + mov edx,[sc.work] + add edx,34000000h + xor esi,esi + xor edi,edi + mcall SF_CREATE_WINDOW,<250,WIN_W+10>,,,,caption_str + mcall SF_THREAD_INFO,procinfo,-1 + + mov eax,[procinfo+70] ;status of window + test eax,100b + jne .end +;-------------------------------------- +; draw lines and frame + call draw_log_area +; draw buttons + call draw_buttons +; draw messages + call draw_messages +; draw editbox's + call draw_editbox +; end redraw +.end: + mcall SF_REDRAW,SSF_END_DRAW + ret +;********************************************************************* +draw_editbox: + push dword edit1 + call [edit_box_draw] + + push dword edit2 + call [edit_box_draw] + + push dword edit3 + call [edit_box_draw] + + mov eax,[sc.work_text] + or eax, 0x90000000 + mov [check1.text_color], eax + push dword check1 + call [check_box_draw] + ret +;********************************************************************* +set_editbox_position: + mov esi,ebx + cld +@@: + lodsb + test al,al + jne @r + sub esi,ebx + mov eax,esi + dec eax + mov [edi+48], eax ;ed_size + mov [edi+52], eax ;ed_pos + ret +;********************************************************************* +draw_buttons: +; define compress button + mov cx,18 + mcall SF_DEFINE_BUTTON,, <3, 20>,2,[sc.work_button] +; uncompress button + inc edx + add ecx,LINE_H shl 16 + mcall +; question button + push esi + mov dl,7 + mcall ,, + mov ecx,[sc.work_button_text] + or ecx,0x90000000 + mov edx,aQuestion + mcall SF_DRAW_TEXT, + pop esi +; define Path button + mcall SF_DEFINE_BUTTON,<6,64>,,4 +; text on Path button + mov ebx,8 shl 16+5 + mov al,4 + mov ecx,[sc.work_text] + push buttons1names + pop edx + push 8 + pop esi +;-------------------------------------- +; text on settings buttons + mov ecx, [sc.work_text] + or ecx, 0x10000000 + mcall , <8, 5>, , buttons1names, 8 + + add edx,esi + add ebx,LINE_H + mcall + add edx,esi + add ebx,LINE_H + mov ecx,[sc.work_button_text] + or ecx, 0x10000000 + sub ebx, 10 shl 16 + mcall +; text on compress and decompress buttons + or ecx,0x80000000 + mcall ,,,aCompress + mcall ,,,aDecompress + ret +;********************************************************************* +;Pack procedures +include 'packpoc.inc' +;--------------------------------------------------------------------- +;UnPack procedures +include 'upacproc.inc' +;--------------------------------------------------------------------- +;lzma_compress: +include 'lzma_compress.inc' +;--------------------------------------------------------------------- +;lzma_set_dict_size: +include 'lzma_set_dict_size.inc' +;--------------------------------------------------------------------- +;lzma_decompress: +include 'lzma_decompress.inc' +;--------------------------------------------------------------------- +;kerpack code: +include 'kerpack.inc' +;--------------------------------------------------------------------- +;initialized variables and constants +include 'const_var.inc' +;--------------------------------------------------------------------- +IM_END: +;--------------------------------------------------------------------- +;uninitialized data +include 'data.inc' +;--------------------------------------------------------------------- +I_END: +;--------------------------------------------------------------------- diff --git a/programs/other/outdated/dictionary/dictionary.ASM b/programs/other/outdated/dictionary/dictionary.ASM index d3cdbcc4e..059378740 100644 --- a/programs/other/outdated/dictionary/dictionary.ASM +++ b/programs/other/outdated/dictionary/dictionary.ASM @@ -1,415 +1,419 @@ - -use32 ; транслятор, использующий 32 разрядных команды - org 0 ; базовый адрес кода, всегда 0x0 - db 'MENUET01' ; идентификатор исполняемого файла (8 байт) - dd 1 ; версия формата заголовка исполняемого файла - dd start ; адрес, на который система передаёт управление - ; после загрузки приложения в память - dd i_end ; размер приложения - dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта - dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше - dd 0 ; указатель на строку с параметрами. - dd 0;pathprog ;путь и имя проги - -include "../../../macros.inc" -include "../../../proc32.inc" -include "API.INC" -include "../../../dll.inc" -include '../../../develop/libraries/box_lib/trunk/box_lib.mac' -;include '../../../KOSfuncs.inc' -;include '../../../load_lib.mac' - -start: - mcall 68,11 ;инициализируем кучу - test eax,eax - jz Win1.Exit - stdcall dll.Load, @IMPORT - - -; mov ecx,1024 -; mov edi,pathprog -; xor al,al -; -; repne scasb -; -; dec edi -; mov esi,WordFile -; @@: -; lodsb -; stosb -; test al,al -; jne @b - - ;GetFileInfo fStruc,pathprog,fInfo ;проверка на наличие файла - ;test eax,eax ;заодно и получу размер файла - ;je WordFileOK - - ;stdcall [mb_create],msgNotFound,mbThread - ;jmp Win1.Redraw - -;WordFileOK: -; stdcall mem.Alloc,dword [fInfo+32] -; mov ebx,dword [fInfo+32] -; mov [filBuffer],eax -; add dword[fInfo+32],eax ;здесь хранится указатель на конец буфера -; ReadFile fStruc,pathprog,ebx,eax,0 -; test eax,eax -; jz Win1.Redraw -; -; add al,30h -; mov [NumErr],al -; stdcall [mb_create],msgNotFound1,mbThread -; - - -align 4 -Win1.Redraw: - RedrawWinBeg - - xor eax,eax - mov ebx,(524*10000h+500) - mov ecx,(548*10000h+200) - mov edx,73FFFFFFh - mov edi,Win1.Caption - int 40h ;окно с прозрачным фонoм - - mcall 9,ThreadInfo,-1 - - mov eax,13 - mov ebx,[ThreadInfo+3Eh] - inc ebx - mov ecx,[ThreadInfo+42h] - inc ecx - mov edx,clWhite - int 40h ;а теперь не прозрачным:) - - call Perevod ; в перерисовке сразу переводим введённое слово - call NextPerev - stdcall [edit_box_draw],EditIN - RedrawWinEnd - -align 4 -Win1.Events: - WaitMessage - dec eax - jz Win1.Redraw - dec eax - jz Win1.Key - dec eax - jz Win1.ButtonPress - - ;stdcall [edit_box_mouse],EditIN - - jmp Win1.Events - -Win1.ButtonPress: - GetButtonPressed - - cmp ah,idbExit - je Win1.Exit - - jmp Win1.Events - -Win1.Key: - GetKeyPressed - stdcall [edit_box_key],EditIN - jmp Win1.FonRedraw - - -Win1.Exit: - - ExitProcess - -Win1.FonRedraw: ;перерисовка области вывода - mcall 9,ThreadInfo,-1 - - mov eax,13 - mov ebx,[ThreadInfo+3Eh] - inc ebx - mov ecx,20 - shl ecx,16 - add ecx,[ThreadInfo+42h] - sub ecx,19 - mov edx,clWhite - int 40h - - call Perevod - call NextPerev -jmp Win1.Events - -;------------------------------------------------------------------------------- - -Perevod: ;сам перевод - mov edi,dict;[filBuffer] - - Perev: - xor ebx,ebx - @@: ;сравнием исх. слово со словом под esi - mov al,[text+ebx] - test al,al - je endWord - cmp [ebx+edi],al - jne WordNotFound - inc ebx - jmp @b - - endWord: - cmp byte[ebx+edi],20h - jne WordNotFound - - add edi,ebx - dec edi ;пропускаем пробелы после английского слова - @@: - inc edi - cmp byte[edi],20h - je @b - - xor ebx,ebx - CopyWord: ;копируем перевод в строку для вывода - mov al,[edi+ebx] - cmp al,0Dh - je @f - mov [perevText+ebx],al - inc ebx - jmp CopyWord - @@: - mov byte[perevText+ebx],0 - - OutText 7,25,perevText - ret - - WordNotFound: ;если слово не подошло - add edi,ebx - @@: - cmp byte[edi],0Dh - je NextWord - inc edi - cmp edi,SizeDict;dword [fInfo+32] - jae endPerev - jmp @b - - NextWord: - add edi,2 - cmp edi,SizeDict;dword [fInfo+32] - jae endPerev - jmp Perev - endPerev: - ret - - -;------------------------------------------------------------------------------- -NextPerev: - mov ecx,Lines - mov edi,dict;[filBuffer] - LinePerev: ;цикл рисования строки - xor ebx,ebx - @@: ;сравнием исх. слово со словом под esi - mov al,[text+ebx] - test al,al - je N_endWord - cmp [ebx+edi],al - jne N_WordNotFound - inc ebx - jmp @b - - N_endWord: - cmp ebx,0 - jne N_Ppoisk - ret - - N_Ppoisk: ;поиск начала строки - add edi,ebx - @@: - dec edi - cmp byte[edi],0Ah - jne @b - inc edi - - ;########пропускаем уже переведённое слово######## - xor ebx,ebx - N_NoDouble: - mov al,[text+ebx] - test al,al - je N_Double - cmp [ebx+edi],al - jne N_NoDblOk - inc ebx - jmp N_NoDouble - - N_Double: - cmp byte[ebx+edi],20h - jne N_NoDblOk - - add edi,ebx - @@: - inc edi - cmp byte[edi],0Ah - jne @b - add edi,2 - jmp LinePerev - - N_NoDblOk: ;############вывод результатов#################### - xor ebx,ebx ;копируем результат - N_CopyWord: - mov al,[edi+ebx] - cmp al,20h - je @f - mov [perevText+ebx],al - inc ebx - jmp N_CopyWord - @@: - mov byte[perevText+ebx],0 - add edi,ebx - - mov eax,Lines - sub eax,ecx - dec eax - shl eax,3 - add eax,45 - push ecx - push edi - OutText 7,ax,perevText - pop edi - pop ecx - - @@: - inc edi - cmp byte[edi],20h - je @b - - - xor ebx,ebx - N_CopyPerev: - mov al,[edi+ebx] - cmp al,0Dh - je @f - mov [perevText+ebx],al - inc ebx - jmp N_CopyPerev - @@: - mov byte[perevText+ebx],0 - - mov eax,Lines - sub eax,ecx - dec eax - shl eax,3 - add eax,45 - push ecx - push edi - OutText 127,ax,perevText - pop edi - pop ecx - - @@: - inc edi - cmp byte[edi],0Ah - jne @b - inc edi - - loop @f ;недотягивается до LinePerev - ret - @@: - jmp LinePerev - - N_WordNotFound: - add edi,ebx - @@: - cmp byte[edi],0Dh - je N_NextWord - inc edi - cmp edi,SizeDict;dword [fInfo+32] - jae N_endPerev - jmp @b - - N_NextWord: - add edi,2 - cmp edi,SizeDict;dword [fInfo+32] - jae N_endPerev - jmp LinePerev - N_endPerev: - ret - -;------------------------------------------------------------------------------- -;------------------------------------------------------------------------------- -;------DATA--------------------------------------------------------------------- -;------------------------------------------------------------------------------- -;------------------------------------------------------------------------------- - - idbExit = 1 - - Lines = 16 ;количеств строк - - clTheme = 080B0FFh - - Win1.Caption db 'Dictionary ENG -> RUS',0 - Win1X = 524 - Win1Y = 548 - Win1W = 500 - Win1H = 200 - - Memo.X = 5 - Memo.Y = 20 - Memo.W = 400 - Memo.H = 370 - - EditIN edit_box 350,5,5,0FFFFFFh,06F9480h,0,00h,0,40,\ - text,mouse_dd,ed_focus,0,0 - - - -; msgNotFound: -; dw 0 -; db 'Ошибка',0 -; db 'Файл dictionary.wrd не найден',0 -; db 'Ясно',0 -; db 0 -; -; msgNotFound1: -; dw 0 -; db '!!!',0 -; db 'Ошибка чтения ' -; NumErr: db 0 -; db 0 -; db 'Ясно',0 -; db 0 -; -; WordFile db '.wrd',0 - - -;------------------------------------------------------------------------------- -@IMPORT: -library box_lib,'box_lib.obj',msgbox,'msgbox.obj' -import box_lib,\ - edit_box_draw,'edit_box_draw',\ - edit_box_key,'edit_box_key';,\ - ;edit_box_mouse,'edit_box_mouse' -import msgbox,\ - mb_create,'mb_create' - -dict: -include 'dictionary.wrd' - -SizeDict = $;-dict - - -i_end: -;------------------------------------------------------------------------------- - - ;WordFP rb 1024 -; m1 dd 0 - ;filBuffer rd 1 - - - ThreadInfo: rb 1024 - ;pathprog - mouse_dd rd 1 - text rb 40 - perevText rb 300 - ;fStruc rb 30 - ;fInfo rb 40 - mbThread rb 1024 - - - rb 4096 -mem: - +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 ; транслятор, использующий 32 разрядных команды + org 0 ; базовый адрес кода, всегда 0x0 + db 'MENUET01' ; идентификатор исполняемого файла (8 байт) + dd 1 ; версия формата заголовка исполняемого файла + dd start ; адрес, на который система передаёт управление + ; после загрузки приложения в память + dd i_end ; размер приложения + dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта + dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше + dd 0 ; указатель на строку с параметрами. + dd 0;pathprog ;путь и имя проги + +include "../../../macros.inc" +include "../../../proc32.inc" +include "API.INC" +include "../../../dll.inc" +include '../../../develop/libraries/box_lib/box_lib.mac' +;include '../../../KOSfuncs.inc' +;include '../../../load_lib.mac' + +start: + mcall 68,11 ;инициализируем кучу + test eax,eax + jz Win1.Exit + stdcall dll.Load, @IMPORT + + +; mov ecx,1024 +; mov edi,pathprog +; xor al,al +; +; repne scasb +; +; dec edi +; mov esi,WordFile +; @@: +; lodsb +; stosb +; test al,al +; jne @b + + ;GetFileInfo fStruc,pathprog,fInfo ;проверка на наличие файла + ;test eax,eax ;заодно и получу размер файла + ;je WordFileOK + + ;stdcall [mb_create],msgNotFound,mbThread + ;jmp Win1.Redraw + +;WordFileOK: +; stdcall mem.Alloc,dword [fInfo+32] +; mov ebx,dword [fInfo+32] +; mov [filBuffer],eax +; add dword[fInfo+32],eax ;здесь хранится указатель на конец буфера +; ReadFile fStruc,pathprog,ebx,eax,0 +; test eax,eax +; jz Win1.Redraw +; +; add al,30h +; mov [NumErr],al +; stdcall [mb_create],msgNotFound1,mbThread +; + + +align 4 +Win1.Redraw: + RedrawWinBeg + + xor eax,eax + mov ebx,(524*10000h+500) + mov ecx,(548*10000h+200) + mov edx,73FFFFFFh + mov edi,Win1.Caption + int 40h ;окно с прозрачным фонoм + + mcall 9,ThreadInfo,-1 + + mov eax,13 + mov ebx,[ThreadInfo+3Eh] + inc ebx + mov ecx,[ThreadInfo+42h] + inc ecx + mov edx,clWhite + int 40h ;а теперь не прозрачным:) + + call Perevod ; в перерисовке сразу переводим введённое слово + call NextPerev + stdcall [edit_box_draw],EditIN + RedrawWinEnd + +align 4 +Win1.Events: + WaitMessage + dec eax + jz Win1.Redraw + dec eax + jz Win1.Key + dec eax + jz Win1.ButtonPress + + ;stdcall [edit_box_mouse],EditIN + + jmp Win1.Events + +Win1.ButtonPress: + GetButtonPressed + + cmp ah,idbExit + je Win1.Exit + + jmp Win1.Events + +Win1.Key: + GetKeyPressed + stdcall [edit_box_key],EditIN + jmp Win1.FonRedraw + + +Win1.Exit: + + ExitProcess + +Win1.FonRedraw: ;перерисовка области вывода + mcall 9,ThreadInfo,-1 + + mov eax,13 + mov ebx,[ThreadInfo+3Eh] + inc ebx + mov ecx,20 + shl ecx,16 + add ecx,[ThreadInfo+42h] + sub ecx,19 + mov edx,clWhite + int 40h + + call Perevod + call NextPerev +jmp Win1.Events + +;------------------------------------------------------------------------------- + +Perevod: ;сам перевод + mov edi,dict;[filBuffer] + + Perev: + xor ebx,ebx + @@: ;сравнием исх. слово со словом под esi + mov al,[text+ebx] + test al,al + je endWord + cmp [ebx+edi],al + jne WordNotFound + inc ebx + jmp @b + + endWord: + cmp byte[ebx+edi],20h + jne WordNotFound + + add edi,ebx + dec edi ;пропускаем пробелы после английского слова + @@: + inc edi + cmp byte[edi],20h + je @b + + xor ebx,ebx + CopyWord: ;копируем перевод в строку для вывода + mov al,[edi+ebx] + cmp al,0Dh + je @f + mov [perevText+ebx],al + inc ebx + jmp CopyWord + @@: + mov byte[perevText+ebx],0 + + OutText 7,25,perevText + ret + + WordNotFound: ;если слово не подошло + add edi,ebx + @@: + cmp byte[edi],0Dh + je NextWord + inc edi + cmp edi,SizeDict;dword [fInfo+32] + jae endPerev + jmp @b + + NextWord: + add edi,2 + cmp edi,SizeDict;dword [fInfo+32] + jae endPerev + jmp Perev + endPerev: + ret + + +;------------------------------------------------------------------------------- +NextPerev: + mov ecx,Lines + mov edi,dict;[filBuffer] + LinePerev: ;цикл рисования строки + xor ebx,ebx + @@: ;сравнием исх. слово со словом под esi + mov al,[text+ebx] + test al,al + je N_endWord + cmp [ebx+edi],al + jne N_WordNotFound + inc ebx + jmp @b + + N_endWord: + cmp ebx,0 + jne N_Ppoisk + ret + + N_Ppoisk: ;поиск начала строки + add edi,ebx + @@: + dec edi + cmp byte[edi],0Ah + jne @b + inc edi + + ;########пропускаем уже переведённое слово######## + xor ebx,ebx + N_NoDouble: + mov al,[text+ebx] + test al,al + je N_Double + cmp [ebx+edi],al + jne N_NoDblOk + inc ebx + jmp N_NoDouble + + N_Double: + cmp byte[ebx+edi],20h + jne N_NoDblOk + + add edi,ebx + @@: + inc edi + cmp byte[edi],0Ah + jne @b + add edi,2 + jmp LinePerev + + N_NoDblOk: ;############вывод результатов#################### + xor ebx,ebx ;копируем результат + N_CopyWord: + mov al,[edi+ebx] + cmp al,20h + je @f + mov [perevText+ebx],al + inc ebx + jmp N_CopyWord + @@: + mov byte[perevText+ebx],0 + add edi,ebx + + mov eax,Lines + sub eax,ecx + dec eax + shl eax,3 + add eax,45 + push ecx + push edi + OutText 7,ax,perevText + pop edi + pop ecx + + @@: + inc edi + cmp byte[edi],20h + je @b + + + xor ebx,ebx + N_CopyPerev: + mov al,[edi+ebx] + cmp al,0Dh + je @f + mov [perevText+ebx],al + inc ebx + jmp N_CopyPerev + @@: + mov byte[perevText+ebx],0 + + mov eax,Lines + sub eax,ecx + dec eax + shl eax,3 + add eax,45 + push ecx + push edi + OutText 127,ax,perevText + pop edi + pop ecx + + @@: + inc edi + cmp byte[edi],0Ah + jne @b + inc edi + + loop @f ;недотягивается до LinePerev + ret + @@: + jmp LinePerev + + N_WordNotFound: + add edi,ebx + @@: + cmp byte[edi],0Dh + je N_NextWord + inc edi + cmp edi,SizeDict;dword [fInfo+32] + jae N_endPerev + jmp @b + + N_NextWord: + add edi,2 + cmp edi,SizeDict;dword [fInfo+32] + jae N_endPerev + jmp LinePerev + N_endPerev: + ret + +;------------------------------------------------------------------------------- +;------------------------------------------------------------------------------- +;------DATA--------------------------------------------------------------------- +;------------------------------------------------------------------------------- +;------------------------------------------------------------------------------- + + idbExit = 1 + + Lines = 16 ;количеств строк + + clTheme = 080B0FFh + + Win1.Caption db 'Dictionary ENG -> RUS',0 + Win1X = 524 + Win1Y = 548 + Win1W = 500 + Win1H = 200 + + Memo.X = 5 + Memo.Y = 20 + Memo.W = 400 + Memo.H = 370 + + EditIN edit_box 350,5,5,0FFFFFFh,06F9480h,0,00h,0,40,\ + text,mouse_dd,ed_focus,0,0 + + + +; msgNotFound: +; dw 0 +; db 'Ошибка',0 +; db 'Файл dictionary.wrd не найден',0 +; db 'Ясно',0 +; db 0 +; +; msgNotFound1: +; dw 0 +; db '!!!',0 +; db 'Ошибка чтения ' +; NumErr: db 0 +; db 0 +; db 'Ясно',0 +; db 0 +; +; WordFile db '.wrd',0 + + +;------------------------------------------------------------------------------- +@IMPORT: +library box_lib,'box_lib.obj',msgbox,'msgbox.obj' +import box_lib,\ + edit_box_draw,'edit_box_draw',\ + edit_box_key,'edit_box_key';,\ + ;edit_box_mouse,'edit_box_mouse' +import msgbox,\ + mb_create,'mb_create' + +dict: +include 'dictionary.wrd' + +SizeDict = $;-dict + + +i_end: +;------------------------------------------------------------------------------- + + ;WordFP rb 1024 +; m1 dd 0 + ;filBuffer rd 1 + + + ThreadInfo: rb 1024 + ;pathprog + mouse_dd rd 1 + text rb 40 + perevText rb 300 + ;fStruc rb 30 + ;fInfo rb 40 + mbThread rb 1024 + + + rb 4096 +mem: diff --git a/programs/other/planet_v/planet_v.asm b/programs/other/planet_v/planet_v.asm index 2fd9bb1e7..eccbd9adf 100644 --- a/programs/other/planet_v/planet_v.asm +++ b/programs/other/planet_v/planet_v.asm @@ -1,907 +1,912 @@ -;Огромная благодарность Maxxxx32, Diamond, Heavyiron -;и другим программистам, а также Теплову Алексею -use32 - org 0 - db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт - dd 1,start,i_end,mem,stacktop,0,sys_path - -include '../../proc32.inc' -include '../../macros.inc' -include '../../KOSfuncs.inc' -include '../../load_img.inc' -include '../../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.Alloc,mem.Free,mem.ReAlloc, dll.Load - -fn_metki db 'pl_metki.lst',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,lib_0 - .test_lib_open: - cmp dword [ebp+ll_struc_size-4],0 - jz @f - mcall SF_TERMINATE_PROCESS ;exit not correct - @@: - add ebp,ll_struc_size - cmp ebp,load_lib_end - jl .test_lib_open - - copy_path ini_name,sys_path,file_name,0 - 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], tree1, 0, txt_tile_type_0 - 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], tree1, 0, txt_tile_type_0 - -; 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 - - load_image_file 'tl_sys_16.png',tree_sys_icon - mov eax,[tree_sys_icon] - mov [tree1.data_img_sys],eax - mov [tree2.data_img_sys],eax - - load_image_file 'tl_nod_16.bmp',tree_nod_icon - mov eax,[tree_nod_icon] - mov [tree1.data_img],eax - mov [tree2.data_img],eax - - mcall SF_SET_EVENTS_MASK,0x27 - init_checkboxes2 ch1,checkboxes_end - - mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,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: - mcall SF_WAIT_EVENT - - cmp al,0x1 ;изм. положение окна - jz red_win - cmp al,0x2 - jz key - cmp al,0x3 - jz button - - stdcall [check_box_mouse],ch2 - stdcall [check_box_mouse],ch1 - 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 SF_GET_KEY - stdcall [edit_box_key], edit1 - stdcall [edit_box_key], edit2 - - stdcall [tl_key],tree1 - stdcall [tl_key],tree2 - - 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 SF_REDRAW,SSF_BEGIN_DRAW - - mov edx,[sc.work] - or edx,0x33000000 - mcall SF_CREATE_WINDOW,20*65536+min_window_w,20*65536+min_window_h,,,hed - - mcall SF_THREAD_INFO,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_scroll] - 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 esi,[sc.work_button] - mcall SF_DEFINE_BUTTON,145*65536+20,5*65536+25,6 - - mcall ,100*65536+20,5*65536+25,5 - - mov ebx,170*65536+40 ;кнопка вызова диалога OpenDial - 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 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 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 edx,11 - int 0x40 - - mov bx,di - add bx,370-otst_panel_left - shl ebx,16 - mov bx,30 - mov edx,10 - int 0x40 - - mov ecx,[sc.work_button_text] - or ecx,0x80000000 - mcall SF_DRAW_TEXT,152*65536+13,,txt_zoom_p - - 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 edx,txt142 - int 0x40 - - call draw_tiles - - stdcall [check_box_draw], ch1 - stdcall [check_box_draw], ch2 - stdcall [edit_box_draw], edit1 - stdcall [edit_box_draw], edit2 - - mcall SF_REDRAW,SSF_END_DRAW -popad - ret - -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: - lib_0 l_libs lib0_name, file_name, system_dir0, boxlib_import - lib_1 l_libs lib1_name, file_name, system_dir1, libimg_import - lib_2 l_libs lib2_name, file_name, system_dir2, strlib_import - lib_3 l_libs lib3_name, file_name, system_dir3, libini_import - lib_4 l_libs lib4_name, file_name, system_dir4, proclib_import -load_lib_end: - -align 4 -button: - mcall SF_GET_BUTTON - cmp ah,5 - jne @f - call but_ZoomM - jmp still - @@: - cmp ah,6 - jne @f - call but_ZoomP - jmp still - @@: - cmp ah,7 - jne @f - call but_Refresh - jmp still - @@: - - cmp ah,9 - jz but_MetSave - cmp ah,8 - jz but_MetAdd - - cmp ah,10 - jne @f - call but_met_up - jmp still - @@: - cmp ah,11 - jne @f - call but_met_dn - jmp still - @@: - cmp ah,12 - jne @f - call fun_goto_met - jmp still - @@: - cmp ah,13 ;диалог OpenDialog для поиска папки - jne @f - call fun_opn_dlg - jmp still - @@: - 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 SF_TERMINATE_PROCESS - - -;input: -;data_rgb - pointer to rgb data -;size - count img pixels (size img data / 3(rgb) ) -align 4 -proc img_rgb_wdiv2 uses eax ebx ecx edx, data_rgb:dword, size:dword - 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 - 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 uses eax ebx ecx edx, data_rgb:dword, size:dword - ;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 - 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 uses eax ebx ecx edx esi, data_rgb:dword, size:dword, size_w:dword, hoffs:dword - 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 - 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 uses ecx esi edi, source:dword, destination:dword, len:dword - cld - mov esi, dword[source] - mov edi, dword[destination] - mov ecx, dword[len] - rep movsb - ret -endp - -align 4 -proc mem_clear uses eax ecx edi, mem:dword, len:dword - cld - xor al,al - mov edi, dword[mem] - mov ecx, dword[len] - repne stosb - 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 scrollbar 16,0, 100,0, 15, 100, 30,0, 0xeeeeee, 0xbbddff, 0, 1 - -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 '/sys',0 ;директория по умолчанию - -communication_area_name: - db 'FFFFFFFF_open_dialog',0 -open_dialog_name: - db 'opendial',0 -communication_area_default_path: - db '/sys/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 - число -; edi - буфер для строки -; len - длинна буфера -;output: -align 4 -proc convert_int_to_str, len:dword -pushad - mov esi,[len] - add esi,edi - dec esi - call .str -popad - ret -endp - -align 4 -.str: - mov ecx,10 - cmp eax,ecx - jb @f - xor edx,edx - div ecx - push edx - ;dec edi ;смещение необходимое для записи с конца строки - call .str - pop eax - @@: - cmp edi,esi - jge @f - or al,0x30 - stosb - mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор - @@: - ret - -hed db 'Planet viewer 16.02.16',0 ;подпись окна -mouse_dd dd 0 ;нужно для Shift-а в editbox - -align 16 -i_end: - procinfo process_information - sc system_colors ;системные цвета - rb 1024 -align 16 -stacktop: -sys_path rb 4096 -file_name rb 4096 -plugin_path rb 4096 -openfile_path rb 4096 -filename_area rb 256 -mem: - +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +;Огромная благодарность Maxxxx32, Diamond, Heavyiron +;и другим программистам, а также Теплову Алексею +use32 + org 0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 1,start,i_end,mem,stacktop,0,sys_path + +include '../../proc32.inc' +include '../../macros.inc' +include '../../KOSfuncs.inc' +include '../../load_img.inc' +include '../../load_lib.mac' +include '../../develop/libraries/box_lib/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.Alloc,mem.Free,mem.ReAlloc, dll.Load + +fn_metki db 'pl_metki.lst',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,lib_0 + .test_lib_open: + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall SF_TERMINATE_PROCESS ;exit not correct + @@: + add ebp,ll_struc_size + cmp ebp,load_lib_end + jl .test_lib_open + + copy_path ini_name,sys_path,file_name,0 + 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], tree1, 0, txt_tile_type_0 + 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], tree1, 0, txt_tile_type_0 + +; 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 + + load_image_file 'tl_sys_16.png',tree_sys_icon + mov eax,[tree_sys_icon] + mov [tree1.data_img_sys],eax + mov [tree2.data_img_sys],eax + + load_image_file 'tl_nod_16.bmp',tree_nod_icon + mov eax,[tree_nod_icon] + mov [tree1.data_img],eax + mov [tree2.data_img],eax + + mcall SF_SET_EVENTS_MASK,0x27 + init_checkboxes2 ch1,checkboxes_end + + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,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: + mcall SF_WAIT_EVENT + + cmp al,0x1 ;изм. положение окна + jz red_win + cmp al,0x2 + jz key + cmp al,0x3 + jz button + + stdcall [check_box_mouse],ch2 + stdcall [check_box_mouse],ch1 + 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 SF_GET_KEY + stdcall [edit_box_key], edit1 + stdcall [edit_box_key], edit2 + + stdcall [tl_key],tree1 + stdcall [tl_key],tree2 + + 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 SF_REDRAW,SSF_BEGIN_DRAW + + mov edx,[sc.work] + or edx,0x33000000 + mcall SF_CREATE_WINDOW,20*65536+min_window_w,20*65536+min_window_h,,,hed + + mcall SF_THREAD_INFO,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_scroll] + 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 esi,[sc.work_button] + mcall SF_DEFINE_BUTTON,145*65536+20,5*65536+25,6 + + mcall ,100*65536+20,5*65536+25,5 + + mov ebx,170*65536+40 ;кнопка вызова диалога OpenDial + 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 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 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 edx,11 + int 0x40 + + mov bx,di + add bx,370-otst_panel_left + shl ebx,16 + mov bx,30 + mov edx,10 + int 0x40 + + mov ecx,[sc.work_button_text] + or ecx,0x80000000 + mcall SF_DRAW_TEXT,152*65536+13,,txt_zoom_p + + 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 edx,txt142 + int 0x40 + + call draw_tiles + + stdcall [check_box_draw], ch1 + stdcall [check_box_draw], ch2 + stdcall [edit_box_draw], edit1 + stdcall [edit_box_draw], edit2 + + mcall SF_REDRAW,SSF_END_DRAW +popad + ret + +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: + lib_0 l_libs lib0_name, file_name, system_dir0, boxlib_import + lib_1 l_libs lib1_name, file_name, system_dir1, libimg_import + lib_2 l_libs lib2_name, file_name, system_dir2, strlib_import + lib_3 l_libs lib3_name, file_name, system_dir3, libini_import + lib_4 l_libs lib4_name, file_name, system_dir4, proclib_import +load_lib_end: + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,5 + jne @f + call but_ZoomM + jmp still + @@: + cmp ah,6 + jne @f + call but_ZoomP + jmp still + @@: + cmp ah,7 + jne @f + call but_Refresh + jmp still + @@: + + cmp ah,9 + jz but_MetSave + cmp ah,8 + jz but_MetAdd + + cmp ah,10 + jne @f + call but_met_up + jmp still + @@: + cmp ah,11 + jne @f + call but_met_dn + jmp still + @@: + cmp ah,12 + jne @f + call fun_goto_met + jmp still + @@: + cmp ah,13 ;диалог OpenDialog для поиска папки + jne @f + call fun_opn_dlg + jmp still + @@: + 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 SF_TERMINATE_PROCESS + + +;input: +;data_rgb - pointer to rgb data +;size - count img pixels (size img data / 3(rgb) ) +align 4 +proc img_rgb_wdiv2 uses eax ebx ecx edx, data_rgb:dword, size:dword + 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 + 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 uses eax ebx ecx edx, data_rgb:dword, size:dword + ;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 + 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 uses eax ebx ecx edx esi, data_rgb:dword, size:dword, size_w:dword, hoffs:dword + 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 + 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 uses ecx esi edi, source:dword, destination:dword, len:dword + cld + mov esi, dword[source] + mov edi, dword[destination] + mov ecx, dword[len] + rep movsb + ret +endp + +align 4 +proc mem_clear uses eax ecx edi, mem:dword, len:dword + cld + xor al,al + mov edi, dword[mem] + mov ecx, dword[len] + repne stosb + 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 scrollbar 16,0, 100,0, 15, 100, 30,0, 0xeeeeee, 0xbbddff, 0, 1 + +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 '/sys',0 ;директория по умолчанию + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_name: + db 'opendial',0 +communication_area_default_path: + db '/sys/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 - число +; edi - буфер для строки +; len - длинна буфера +;output: +align 4 +proc convert_int_to_str, len:dword +pushad + mov esi,[len] + add esi,edi + dec esi + call .str +popad + ret +endp + +align 4 +.str: + mov ecx,10 + cmp eax,ecx + jb @f + xor edx,edx + div ecx + push edx + ;dec edi ;смещение необходимое для записи с конца строки + call .str + pop eax + @@: + cmp edi,esi + jge @f + or al,0x30 + stosb + mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор + @@: + ret + +hed db 'Planet viewer 16.02.16',0 ;подпись окна +mouse_dd dd 0 ;нужно для Shift-а в editbox + +align 16 +i_end: + procinfo process_information + sc system_colors ;системные цвета + rb 1024 +align 16 +stacktop: +sys_path rb 4096 +file_name rb 4096 +plugin_path rb 4096 +openfile_path rb 4096 +filename_area rb 256 +mem: diff --git a/programs/other/rtfread/rtfread.asm b/programs/other/rtfread/rtfread.asm index 35e9d00d4..26f94a38e 100644 --- a/programs/other/rtfread/rtfread.asm +++ b/programs/other/rtfread/rtfread.asm @@ -1,6 +1,9 @@ ; SPDX-License-Identifier: NOASSERTION ; +; Text encoded with Code Page 866 - Cyrillic + + ; RTF READER FOR KOLIBRI >= 0.7.7.0 ; Written in pure assembler by Ivushkin Andrey aka Willow ; Menu_bar and scroll_bar from box_lib provided by dunkaist @@ -62,7 +65,7 @@ AR_OFFSET equ 10 include '../../config.inc' ;for nightbuild include '../../macros.inc' ; Macros facilitate the life of assemblers! -include '../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' include '../../KOSfuncs.inc' include '../../load_lib.mac' diff --git a/programs/system/MyKey/trunk/MyKey.asm b/programs/system/MyKey/trunk/MyKey.asm index 809c091cb..c3e28a65a 100644 --- a/programs/system/MyKey/trunk/MyKey.asm +++ b/programs/system/MyKey/trunk/MyKey.asm @@ -1,3 +1,6 @@ +; SPDX-License-Identifier: NOASSERTION +; + ; ; MyKey. Version 0.2. ; @@ -26,7 +29,7 @@ include 'string.inc' include '../../../macros.inc' include 'ASPAPI.INC' ;include 'editbox_ex.mac' -include '../../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../../develop/libraries/box_lib/box_lib.mac' ;include 'load_lib.mac' include '../../../develop/libraries/box_lib/load_lib.mac' include '../../../dll.inc' diff --git a/programs/system/colrdial/color_dialog.asm b/programs/system/colrdial/color_dialog.asm index 755c0fa47..b6fff9d4b 100644 --- a/programs/system/colrdial/color_dialog.asm +++ b/programs/system/colrdial/color_dialog.asm @@ -1,707 +1,710 @@ -;***************************************************************************** -; Color Dialog - for KolibriOS -; Copyright (c) 2013, Marat Zakiyanov aka Mario79, aka Mario -; All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in the -; documentation and/or other materials provided with the distribution. -; * Neither the name of the nor the -; names of its contributors may be used to endorse or promote products -; derived from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY -; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;***************************************************************************** -;--------------------------------------------------------------------- -;Some documentation for memory -; -;area name db 'FFFFFFFF_color_dialog',0 ; FFFFFFFF = PID -; -; communication area data -; flag ; +0 -; dw 0 ; 0 - empty, 1 - OK, color selected -; 2 - use another method/not found program, 3 - cancel -; -; type of dialog: 0-Palette&Tone -; dw 0 ; +2 -; -; window X size ; +4 -; dw 0 -; -; window X position ; +6 -; dw 0 -; -; window y size ; +8 -; dw 0 -; -; window Y position ; +10 -; dw 0 -; -; ColorDialog WINDOW SLOT ; +12 -; dd 0 -; -; Color type ; +16 -; dd 0 -; -; Color value ; +20 -; dd 0 - -; First start flag ; +24 -; dd 0 ; 0 - first start, 1 - subsequent starts -; -; Old colors ; +28 -; rd 10 -; -; Free area ; +68 -;--------------------------------------------------------------------- - use32 - org 0 - db 'MENUET01' - dd 1, START, IM_END, I_END, stacktop, param, path -;--------------------------------------------------------------------- -include '../../macros.inc' -include '../../proc32.inc' -include '../../KOSfuncs.inc' -include '../../load_lib.mac' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' -;include 'lang.inc' -;include '../../debug.inc' -@use_library -;--------------------------------------------------------------------- -p_start_x = 10 -p_start_y = 10 - -p_size_x = 20 -p_size_y = 256 -;-------------------------------------- -t_start_x = 40 -t_start_y = 10 -;-------------------------------------- -w_start_x = 200 -w_start_y = 200 - -w_size_x = 400 -w_size_y = 350 -;-------------------------------------- -c_start_x = t_start_x + p_size_y + 10 -c_start_y = 10 - -c_size_x = 27 -c_size_y = 20 -ed_size_x = 53 -;--------------------------------------------------------------------- -x_minimal_size equ 350 -y_minimal_size equ 250 -;--------------------------------------------------------------------- -START: - mcall SF_SYS_MISC,SSF_HEAP_INIT - ;mcall SF_KEYBOARD,SSF_SET_INPUT_MODE,1 - mcall SF_SET_EVENTS_MASK,EVM_REDRAW+EVM_KEY+\ - EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER -;-------------------------------------- -load_libraries l_libs_start,end_l_libs - test eax,eax - jnz button.exit_2 -;-------------------------------------- - call get_communication_area - call get_active_pocess - call clear_colors_history - xor eax,eax - mov al,p_size_x - mov [palette_SIZE_X],eax - mov ax,p_size_y - mov [palette_SIZE_Y],eax - mov [tone_SIZE_X],eax - mov [tone_SIZE_Y],eax - - ;set the last used color as a current one - mov eax,[communication_area] - add eax,28 - mov eax,[eax] - mov [selected_color],eax - mov [tone_color],eax - call prepare_scrollbars_position_from_color -;-------------------------------------- - mov ecx,[palette_SIZE_Y] - imul ecx,[palette_SIZE_X] - lea ecx,[ecx*3] - inc ecx ;reserve for stosd - mcall SF_SYS_MISC,SSF_MEM_ALLOC - mov [palette_area],eax -;-------------------------------------- - call create_palette -;-------------------------------------- - mov ecx,[tone_SIZE_Y] - imul ecx,[tone_SIZE_X] - lea ecx,[ecx*3] - inc ecx ;reserve for stosd - mcall SF_SYS_MISC,SSF_MEM_ALLOC - mov [tone_area],eax -;-------------------------------------- - call create_tone -;--------------------------------------------------------------------- -align 4 -red: - call draw_window -;--------------------------------------------------------------------- -align 4 -still: - mcall SF_WAIT_EVENT - - cmp eax,1 - je red - - cmp eax,2 - je key - - cmp eax,3 - je button - - cmp eax,6 - je mouse - - jmp still -;--------------------------------------------------------------------- -align 4 -button: - mcall SF_GET_BUTTON - - cmp ah, 2 - je palette_button - - cmp ah, 3 - je tone_button - - cmp ah, 4 - je color_button - - cmp ah, 30 - jb @f - - cmp ah, 39 - ja @f - - sub ah,30 - - ;click on a colors History - movzx eax,ah - shl eax,2 - add eax,[communication_area] - add eax,28 - mov eax,[eax] - mov [selected_color],eax - call prepare_scrollbars_position_from_color - call draw_selected_color - call draw_scrollbars - jmp still -;-------------------------------------- -align 4 -@@: - cmp ah, 1 - jne still -;-------------------------------------- -align 4 -.exit: - mov eax,[communication_area] - mov [eax],word 3 - jmp @f -; dps "CD flag value: cancel " -;-------------------------------------- -align 4 -.exit_1: -;-------------------------------------- - call scroll_colors_history -;-------------------------------------- -align 4 -@@: -; mov ax,[eax] -; and eax,0xffff -; dps "CD flag value: " -; dpd eax -; newline - - call get_window_param - mov ebx,[communication_area] - mov ecx,procinfo -; mov eax,[window_x] - mov eax,[ecx+process_information.box.left] - shl eax,16 - add eax,[ecx+process_information.box.width] - mov [ebx+4],eax -; mov eax,[window_y] - mov eax,[ecx+process_information.box.top] - shl eax,16 - add eax,[ecx+process_information.box.height] - mov [ebx+8],eax -;-------------------------------------- -align 4 -.exit_2: - mcall SF_TERMINATE_PROCESS -;--------------------------------------------------------------------- -align 4 -get_window_param: - mcall SF_THREAD_INFO,procinfo,-1 - mov eax,[ebx+process_information.client_box.height] - inc eax -; mov [window_high],eax - mov eax,[ebx+process_information.client_box.width] - inc eax -; mov [window_width],eax - mov eax,dword[ebx+process_information.wnd_state] -; mov [window_status],eax - ret -;--------------------------------------------------------------------- -align 4 -get_communication_area: - movzx eax,byte[param] - test eax,eax - jz @f - mcall SF_SYS_MISC,SSF_MEM_OPEN,param,,0x01 - mov [communication_area],eax -; movzx ebx,word [eax+2] -; mov [color_dialog_type],ebx - - mov ebx,[eax+4] -; cmp bx,word x_minimal_size ;300 -; jb @f - mov bx,510 - mov [window_x],ebx - mov ebx,[eax+8] -; cmp bx,word y_minimal_size ;200 -; jb @f - mov bx,340 - mov [window_y],ebx -@@: - ret -;--------------------------------------------------------------------- -align 4 -get_active_pocess: - mcall SF_THREAD_INFO,procinfo,-1 - mov ecx,[ebx+process_information.PID] - mcall SF_SYSTEM,SSF_GET_THREAD_SLOT - mov [active_process],eax ; WINDOW SLOT - mov ebx,[communication_area] - test ebx,ebx - jz .1 - mov [ebx+12],eax ; WINDOW SLOT to com. area -.1: - ret -;--------------------------------------------------------------------- -align 4 -clear_colors_history: - mov edi,[communication_area] - cmp [edi+24],dword 1 - je @f - mov [edi+24],dword 1 - add edi,28 - mov ecx,10 - cld - mov eax,0x06BEEE - rep stosd -@@: - ret -;--------------------------------------------------------------------- -align 4 -scroll_colors_history: - mov edi,[communication_area] - add edi,28 - mov eax,[selected_color] - cmp [edi],eax - je @f - mov ecx,9 - mov esi,edi - add esi,32 - add edi,36 - std - rep movsd - mov edi,[communication_area] - mov [edi+28],eax -@@: - ret -;--------------------------------------------------------------------- -align 4 -palette_button: - mcall SF_MOUSE_GET,SSF_WINDOW_POSITION - and eax,0xffff - sub eax,p_start_y - imul eax,p_size_x - lea eax,[eax+eax*2] - add eax,[palette_area] - mov eax,[eax] - mov [tone_color],eax - mov [selected_color],eax - call prepare_scrollbars_position_from_color - call create_and_draw_tone - call draw_selected_color - call draw_scrollbars - jmp still -;--------------------------------------------------------------------- -align 4 -tone_button: - mcall SF_MOUSE_GET,SSF_WINDOW_POSITION - mov ebx,eax - and eax,0xffff - shr ebx,16 - sub eax,t_start_y - imul eax,p_size_y - sub ebx,t_start_x - add eax,ebx - lea eax,[eax+eax*2] - add eax,[tone_area] - mov eax,[eax] - mov [selected_color],eax - call prepare_scrollbars_position_from_color - call draw_selected_color - call draw_scrollbars - jmp still -;--------------------------------------------------------------------- -align 4 -color_button: - mov eax,[communication_area] - mov [eax],word 1 - mov ebx,[selected_color] - and ebx,0xffffff - mov [eax+20],ebx -; dps "CD flag value: OK " - jmp button.exit_1 -;--------------------------------------------------------------------- -align 4 -prepare_scrollbars_position_from_color: -; in: eax = selected color - movzx ebx,al - inc bl - neg bl - mov [scroll_bar_data_blue.position],ebx - shr eax,8 - mov bl,al - inc bl - neg bl - mov [scroll_bar_data_green.position],ebx - shr eax,8 - mov bl,al - inc bl - neg bl - mov [scroll_bar_data_red.position],ebx - ret -;--------------------------------------------------------------------- -align 4 -prepare_color_from_scrollbars_position: -; out: ebx = selected color - mov eax,[scroll_bar_data_red.position] - inc al - neg al - movzx ebx,al - shl ebx,8 - mov eax,[scroll_bar_data_green.position] - inc al - neg al - mov bl,al - shl ebx,8 - mov eax,[scroll_bar_data_blue.position] - inc al - neg al - mov bl,al - ret -;--------------------------------------------------------------------- -align 4 -key: - mcall SF_GET_KEY - - test word[edit1.flags],10b ;ed_focus - jne @f - cmp ah,027 ; Esc - je button.exit - jmp still -@@: - stdcall [edit_box_key], edit1 - stdcall conv_str_to_int, [edit1.text] - cmp [selected_color],eax - je still - mov [selected_color],eax - call prepare_scrollbars_position_from_color - ;call draw_selected_color - mcall SF_DRAW_RECT,,,[selected_color] - call draw_scrollbars - jmp still -;--------------------------------------------------------------------- -align 4 -mouse: - cmp [scroll_bar_data_red.delta2],0 - jne .red - cmp [scroll_bar_data_green.delta2],0 - jne .green - cmp [scroll_bar_data_blue.delta2],0 - jne .blue -;-------------------------------------- -align 4 -.red: - stdcall [scrollbar_ver_mouse], scroll_bar_data_red - cmp [scroll_bar_data_red.delta2],0 - jne @f -;-------------------------------------- -align 4 -.green: - stdcall [scrollbar_ver_mouse], scroll_bar_data_green - cmp [scroll_bar_data_green.delta2],0 - jne @f -;-------------------------------------- -align 4 -.blue: - stdcall [scrollbar_ver_mouse], scroll_bar_data_blue - cmp [scroll_bar_data_blue.delta2],0 - jne @f -;-------------------------------------- -align 4 -@@: - stdcall [edit_box_mouse], edit1 - call prepare_color_from_scrollbars_position - cmp [selected_color],ebx - je still - mov [selected_color],ebx - call draw_selected_color - jmp still -;--------------------------------------------------------------------- -align 4 -draw_selected_color: - mcall SF_DRAW_RECT,,,[selected_color] - stdcall hex_in_str, sz_0x,[selected_color],6 - mov byte[sz_0x+6],0 - stdcall [edit_box_set_text],edit1,sz_0x - stdcall [edit_box_draw],edit1 - ret -;--------------------------------------------------------------------- -align 4 -create_and_draw_tone: - call create_tone - call draw_tone - ret -;--------------------------------------------------------------------- -align 4 -draw_tone: - mcall SF_PUT_IMAGE_EXT,[tone_area],<[tone_SIZE_X],[tone_SIZE_Y]>,,24 - ret -;--------------------------------------------------------------------- -align 4 -draw_scrollbars: - stdcall [scrollbar_ver_draw], scroll_bar_data_red - stdcall [scrollbar_ver_draw], scroll_bar_data_green - stdcall [scrollbar_ver_draw], scroll_bar_data_blue - ret -;--------------------------------------------------------------------- -align 4 -draw_history_frame: - mov [frame_data.x],dword (c_start_x+c_size_x+ed_size_x+10*2)*65536+80 - mov [frame_data.y],dword (p_start_y+5)*65536+(p_size_y-5) - - mov [frame_data.draw_text_flag],dword 1 - - mov [frame_data.text_pointer],dword history_text - stdcall [Frame_draw], frame_data - ret -;--------------------------------------------------------------------- -align 4 -draw_button_row: - mov edx,0x60000000 + 30 ; BUTTON ROW -; mov ebx,220*65536+14 - mov ebx,(c_start_x+c_size_x+ed_size_x+10*3)*65536+14 - mov ecx,25*65536+14 - mov eax,SF_DEFINE_BUTTON -;----------------------------------- -align 4 -.newb: - mcall - add ecx,24*65536 - inc edx - cmp edx,0x60000000 + 39 - jbe .newb - ret -;--------------------------------------------------------------------- -align 4 -draw_color_value: - movzx ebx,word[frame_data.x_start] - shl ebx,16 - add ebx,(22 shl 16)+39 - mov ecx,28*65536+11 - mov edx,0xffffff - mov eax,SF_DRAW_RECT - mov edi,10 - mov esi,[communication_area] - add esi,28 -;----------------------------------- -align 4 -@@: - mcall - pusha - lea edx,[ebx+(2 shl 16)] - shr ecx,16 - mov dx,cx - add dx,2 - mov ecx,[esi] - and ecx,0xffffff - mcall SF_DRAW_NUMBER,0x00060100,,,0 - popa - - add ecx,24*65536 - add esi,4 - dec edi - jnz @b - - ret -;--------------------------------------------------------------------- -align 4 -draw_colours: - mov edi,10 - mov esi,[communication_area] - add esi,28 -; mov ebx,220*65536+14 - mov ebx,(c_start_x+c_size_x+ed_size_x+10*3)*65536+14 - mov ecx,27*65536+14 - mov eax,SF_DRAW_RECT - mov [frame_data.draw_text_flag],dword 0 -;-------------------------------------- -align 4 -newcol: - mov edx,[esi] - mcall - - push ebx ecx - - sub ebx,2 shl 16 - add bx,4 - sub ecx,2 shl 16 - add cx,4 - - mov [frame_data.x],ebx - mov [frame_data.y],ecx - - stdcall [Frame_draw], frame_data - - pop ecx ebx - - add ecx,24*65536 - add esi,4 - - dec edi - jnz newcol - - ret -;---------------------------------------------------------------------- -align 4 -draw_window: - mcall SF_REDRAW,SSF_BEGIN_DRAW -; mcall SF_CREATE_WINDOW, , , 0x33AABBCC,,title - xor esi,esi - mcall SF_CREATE_WINDOW,[window_x],[window_y], 0x34EEEeee,,title - mcall SF_DEFINE_BUTTON,,,0x60000002 - mcall ,,,0x60000003 - mcall ,<296,80>,<280,22>,4,0x37A4D4 - mcall ,<402,80>, ,1 - mcall SF_DRAW_TEXT,<332,289>,0x802C7B9E,OK_Cancel - mcall ,<331,288>,0x80FFFfff - xor ebp,ebp - mcall SF_PUT_IMAGE_EXT,[palette_area],<[palette_SIZE_X],[palette_SIZE_Y]>,,24 - call draw_tone - call draw_selected_color - xor eax,eax - inc eax - mov [scroll_bar_data_red.all_redraw],eax - mov [scroll_bar_data_green.all_redraw],eax - mov [scroll_bar_data_blue.all_redraw],eax - call draw_scrollbars - call draw_history_frame - call draw_button_row - call draw_colours - call draw_color_value - mcall SF_REDRAW,SSF_END_DRAW - ret -;--------------------------------------------------------------------- -align 4 -proc hex_in_str, buf:dword,val:dword,zif:dword -pushad - mov edi,[buf] - mov ecx,[zif] - add edi,ecx - dec edi - mov ebx,[val] - - .cycle: - mov al,bl - and al,0xf - cmp al,10 - jl @f - add al,'A'-'0'-10 - @@: - add al,'0' - mov byte[edi],al - dec edi - shr ebx,4 - loop .cycle -popad - ret -endp -;--------------------------------------------------------------------- -;input: -; buf - pointer to a hexadecimal string -;output: -; eax - number -align 4 -proc conv_str_to_int uses ebx esi, buf:dword - xor eax,eax - xor ebx,ebx - mov esi,[buf] - - .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 ;skip the chars not in between '9' and 'A' - .us1: ;╤Б╨╛╤Б╤В╨░╨▓╨╜╨╛╨╡ ╤Г╤Б╨╗╨╛╨▓╨╕╨╡ - cmp bl,'F' - jle .us2 - cmp bl,'a' - jl @f ;skip the chars not in between 'F' and 'a' - sub bl,32 ;convert symbols to uppercase for convenience - .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 - @@: - ret -endp -;--------------------------------------------------------------------- -include 'palette.inc' -;--------------------------------------------------------------------- -include 'tone.inc' -;--------------------------------------------------------------------- -include 'i_data.inc' -;--------------------------------------------------------------------- -IM_END: -;--------------------------------------------------------------------- -include 'u_data.inc' -;--------------------------------------------------------------------- -I_END: -;--------------------------------------------------------------------- +; SPDX-License-Identifier: NOASSERTION +; + +;***************************************************************************** +; Color Dialog - for KolibriOS +; Copyright (c) 2013, Marat Zakiyanov aka Mario79, aka Mario +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; * Neither the name of the nor the +; names of its contributors may be used to endorse or promote products +; derived from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY +; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +;***************************************************************************** +;--------------------------------------------------------------------- +;Some documentation for memory +; +;area name db 'FFFFFFFF_color_dialog',0 ; FFFFFFFF = PID +; +; communication area data +; flag ; +0 +; dw 0 ; 0 - empty, 1 - OK, color selected +; 2 - use another method/not found program, 3 - cancel +; +; type of dialog: 0-Palette&Tone +; dw 0 ; +2 +; +; window X size ; +4 +; dw 0 +; +; window X position ; +6 +; dw 0 +; +; window y size ; +8 +; dw 0 +; +; window Y position ; +10 +; dw 0 +; +; ColorDialog WINDOW SLOT ; +12 +; dd 0 +; +; Color type ; +16 +; dd 0 +; +; Color value ; +20 +; dd 0 + +; First start flag ; +24 +; dd 0 ; 0 - first start, 1 - subsequent starts +; +; Old colors ; +28 +; rd 10 +; +; Free area ; +68 +;--------------------------------------------------------------------- + use32 + org 0 + db 'MENUET01' + dd 1, START, IM_END, I_END, stacktop, param, path +;--------------------------------------------------------------------- +include '../../macros.inc' +include '../../proc32.inc' +include '../../KOSfuncs.inc' +include '../../load_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' +;include 'lang.inc' +;include '../../debug.inc' +@use_library +;--------------------------------------------------------------------- +p_start_x = 10 +p_start_y = 10 + +p_size_x = 20 +p_size_y = 256 +;-------------------------------------- +t_start_x = 40 +t_start_y = 10 +;-------------------------------------- +w_start_x = 200 +w_start_y = 200 + +w_size_x = 400 +w_size_y = 350 +;-------------------------------------- +c_start_x = t_start_x + p_size_y + 10 +c_start_y = 10 + +c_size_x = 27 +c_size_y = 20 +ed_size_x = 53 +;--------------------------------------------------------------------- +x_minimal_size equ 350 +y_minimal_size equ 250 +;--------------------------------------------------------------------- +START: + mcall SF_SYS_MISC,SSF_HEAP_INIT + ;mcall SF_KEYBOARD,SSF_SET_INPUT_MODE,1 + mcall SF_SET_EVENTS_MASK,EVM_REDRAW+EVM_KEY+\ + EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER +;-------------------------------------- +load_libraries l_libs_start,end_l_libs + test eax,eax + jnz button.exit_2 +;-------------------------------------- + call get_communication_area + call get_active_pocess + call clear_colors_history + xor eax,eax + mov al,p_size_x + mov [palette_SIZE_X],eax + mov ax,p_size_y + mov [palette_SIZE_Y],eax + mov [tone_SIZE_X],eax + mov [tone_SIZE_Y],eax + + ;set the last used color as a current one + mov eax,[communication_area] + add eax,28 + mov eax,[eax] + mov [selected_color],eax + mov [tone_color],eax + call prepare_scrollbars_position_from_color +;-------------------------------------- + mov ecx,[palette_SIZE_Y] + imul ecx,[palette_SIZE_X] + lea ecx,[ecx*3] + inc ecx ;reserve for stosd + mcall SF_SYS_MISC,SSF_MEM_ALLOC + mov [palette_area],eax +;-------------------------------------- + call create_palette +;-------------------------------------- + mov ecx,[tone_SIZE_Y] + imul ecx,[tone_SIZE_X] + lea ecx,[ecx*3] + inc ecx ;reserve for stosd + mcall SF_SYS_MISC,SSF_MEM_ALLOC + mov [tone_area],eax +;-------------------------------------- + call create_tone +;--------------------------------------------------------------------- +align 4 +red: + call draw_window +;--------------------------------------------------------------------- +align 4 +still: + mcall SF_WAIT_EVENT + + cmp eax,1 + je red + + cmp eax,2 + je key + + cmp eax,3 + je button + + cmp eax,6 + je mouse + + jmp still +;--------------------------------------------------------------------- +align 4 +button: + mcall SF_GET_BUTTON + + cmp ah, 2 + je palette_button + + cmp ah, 3 + je tone_button + + cmp ah, 4 + je color_button + + cmp ah, 30 + jb @f + + cmp ah, 39 + ja @f + + sub ah,30 + + ;click on a colors History + movzx eax,ah + shl eax,2 + add eax,[communication_area] + add eax,28 + mov eax,[eax] + mov [selected_color],eax + call prepare_scrollbars_position_from_color + call draw_selected_color + call draw_scrollbars + jmp still +;-------------------------------------- +align 4 +@@: + cmp ah, 1 + jne still +;-------------------------------------- +align 4 +.exit: + mov eax,[communication_area] + mov [eax],word 3 + jmp @f +; dps "CD flag value: cancel " +;-------------------------------------- +align 4 +.exit_1: +;-------------------------------------- + call scroll_colors_history +;-------------------------------------- +align 4 +@@: +; mov ax,[eax] +; and eax,0xffff +; dps "CD flag value: " +; dpd eax +; newline + + call get_window_param + mov ebx,[communication_area] + mov ecx,procinfo +; mov eax,[window_x] + mov eax,[ecx+process_information.box.left] + shl eax,16 + add eax,[ecx+process_information.box.width] + mov [ebx+4],eax +; mov eax,[window_y] + mov eax,[ecx+process_information.box.top] + shl eax,16 + add eax,[ecx+process_information.box.height] + mov [ebx+8],eax +;-------------------------------------- +align 4 +.exit_2: + mcall SF_TERMINATE_PROCESS +;--------------------------------------------------------------------- +align 4 +get_window_param: + mcall SF_THREAD_INFO,procinfo,-1 + mov eax,[ebx+process_information.client_box.height] + inc eax +; mov [window_high],eax + mov eax,[ebx+process_information.client_box.width] + inc eax +; mov [window_width],eax + mov eax,dword[ebx+process_information.wnd_state] +; mov [window_status],eax + ret +;--------------------------------------------------------------------- +align 4 +get_communication_area: + movzx eax,byte[param] + test eax,eax + jz @f + mcall SF_SYS_MISC,SSF_MEM_OPEN,param,,0x01 + mov [communication_area],eax +; movzx ebx,word [eax+2] +; mov [color_dialog_type],ebx + + mov ebx,[eax+4] +; cmp bx,word x_minimal_size ;300 +; jb @f + mov bx,510 + mov [window_x],ebx + mov ebx,[eax+8] +; cmp bx,word y_minimal_size ;200 +; jb @f + mov bx,340 + mov [window_y],ebx +@@: + ret +;--------------------------------------------------------------------- +align 4 +get_active_pocess: + mcall SF_THREAD_INFO,procinfo,-1 + mov ecx,[ebx+process_information.PID] + mcall SF_SYSTEM,SSF_GET_THREAD_SLOT + mov [active_process],eax ; WINDOW SLOT + mov ebx,[communication_area] + test ebx,ebx + jz .1 + mov [ebx+12],eax ; WINDOW SLOT to com. area +.1: + ret +;--------------------------------------------------------------------- +align 4 +clear_colors_history: + mov edi,[communication_area] + cmp [edi+24],dword 1 + je @f + mov [edi+24],dword 1 + add edi,28 + mov ecx,10 + cld + mov eax,0x06BEEE + rep stosd +@@: + ret +;--------------------------------------------------------------------- +align 4 +scroll_colors_history: + mov edi,[communication_area] + add edi,28 + mov eax,[selected_color] + cmp [edi],eax + je @f + mov ecx,9 + mov esi,edi + add esi,32 + add edi,36 + std + rep movsd + mov edi,[communication_area] + mov [edi+28],eax +@@: + ret +;--------------------------------------------------------------------- +align 4 +palette_button: + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION + and eax,0xffff + sub eax,p_start_y + imul eax,p_size_x + lea eax,[eax+eax*2] + add eax,[palette_area] + mov eax,[eax] + mov [tone_color],eax + mov [selected_color],eax + call prepare_scrollbars_position_from_color + call create_and_draw_tone + call draw_selected_color + call draw_scrollbars + jmp still +;--------------------------------------------------------------------- +align 4 +tone_button: + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION + mov ebx,eax + and eax,0xffff + shr ebx,16 + sub eax,t_start_y + imul eax,p_size_y + sub ebx,t_start_x + add eax,ebx + lea eax,[eax+eax*2] + add eax,[tone_area] + mov eax,[eax] + mov [selected_color],eax + call prepare_scrollbars_position_from_color + call draw_selected_color + call draw_scrollbars + jmp still +;--------------------------------------------------------------------- +align 4 +color_button: + mov eax,[communication_area] + mov [eax],word 1 + mov ebx,[selected_color] + and ebx,0xffffff + mov [eax+20],ebx +; dps "CD flag value: OK " + jmp button.exit_1 +;--------------------------------------------------------------------- +align 4 +prepare_scrollbars_position_from_color: +; in: eax = selected color + movzx ebx,al + inc bl + neg bl + mov [scroll_bar_data_blue.position],ebx + shr eax,8 + mov bl,al + inc bl + neg bl + mov [scroll_bar_data_green.position],ebx + shr eax,8 + mov bl,al + inc bl + neg bl + mov [scroll_bar_data_red.position],ebx + ret +;--------------------------------------------------------------------- +align 4 +prepare_color_from_scrollbars_position: +; out: ebx = selected color + mov eax,[scroll_bar_data_red.position] + inc al + neg al + movzx ebx,al + shl ebx,8 + mov eax,[scroll_bar_data_green.position] + inc al + neg al + mov bl,al + shl ebx,8 + mov eax,[scroll_bar_data_blue.position] + inc al + neg al + mov bl,al + ret +;--------------------------------------------------------------------- +align 4 +key: + mcall SF_GET_KEY + + test word[edit1.flags],10b ;ed_focus + jne @f + cmp ah,027 ; Esc + je button.exit + jmp still +@@: + stdcall [edit_box_key], edit1 + stdcall conv_str_to_int, [edit1.text] + cmp [selected_color],eax + je still + mov [selected_color],eax + call prepare_scrollbars_position_from_color + ;call draw_selected_color + mcall SF_DRAW_RECT,,,[selected_color] + call draw_scrollbars + jmp still +;--------------------------------------------------------------------- +align 4 +mouse: + cmp [scroll_bar_data_red.delta2],0 + jne .red + cmp [scroll_bar_data_green.delta2],0 + jne .green + cmp [scroll_bar_data_blue.delta2],0 + jne .blue +;-------------------------------------- +align 4 +.red: + stdcall [scrollbar_ver_mouse], scroll_bar_data_red + cmp [scroll_bar_data_red.delta2],0 + jne @f +;-------------------------------------- +align 4 +.green: + stdcall [scrollbar_ver_mouse], scroll_bar_data_green + cmp [scroll_bar_data_green.delta2],0 + jne @f +;-------------------------------------- +align 4 +.blue: + stdcall [scrollbar_ver_mouse], scroll_bar_data_blue + cmp [scroll_bar_data_blue.delta2],0 + jne @f +;-------------------------------------- +align 4 +@@: + stdcall [edit_box_mouse], edit1 + call prepare_color_from_scrollbars_position + cmp [selected_color],ebx + je still + mov [selected_color],ebx + call draw_selected_color + jmp still +;--------------------------------------------------------------------- +align 4 +draw_selected_color: + mcall SF_DRAW_RECT,,,[selected_color] + stdcall hex_in_str, sz_0x,[selected_color],6 + mov byte[sz_0x+6],0 + stdcall [edit_box_set_text],edit1,sz_0x + stdcall [edit_box_draw],edit1 + ret +;--------------------------------------------------------------------- +align 4 +create_and_draw_tone: + call create_tone + call draw_tone + ret +;--------------------------------------------------------------------- +align 4 +draw_tone: + mcall SF_PUT_IMAGE_EXT,[tone_area],<[tone_SIZE_X],[tone_SIZE_Y]>,,24 + ret +;--------------------------------------------------------------------- +align 4 +draw_scrollbars: + stdcall [scrollbar_ver_draw], scroll_bar_data_red + stdcall [scrollbar_ver_draw], scroll_bar_data_green + stdcall [scrollbar_ver_draw], scroll_bar_data_blue + ret +;--------------------------------------------------------------------- +align 4 +draw_history_frame: + mov [frame_data.x],dword (c_start_x+c_size_x+ed_size_x+10*2)*65536+80 + mov [frame_data.y],dword (p_start_y+5)*65536+(p_size_y-5) + + mov [frame_data.draw_text_flag],dword 1 + + mov [frame_data.text_pointer],dword history_text + stdcall [Frame_draw], frame_data + ret +;--------------------------------------------------------------------- +align 4 +draw_button_row: + mov edx,0x60000000 + 30 ; BUTTON ROW +; mov ebx,220*65536+14 + mov ebx,(c_start_x+c_size_x+ed_size_x+10*3)*65536+14 + mov ecx,25*65536+14 + mov eax,SF_DEFINE_BUTTON +;----------------------------------- +align 4 +.newb: + mcall + add ecx,24*65536 + inc edx + cmp edx,0x60000000 + 39 + jbe .newb + ret +;--------------------------------------------------------------------- +align 4 +draw_color_value: + movzx ebx,word[frame_data.x_start] + shl ebx,16 + add ebx,(22 shl 16)+39 + mov ecx,28*65536+11 + mov edx,0xffffff + mov eax,SF_DRAW_RECT + mov edi,10 + mov esi,[communication_area] + add esi,28 +;----------------------------------- +align 4 +@@: + mcall + pusha + lea edx,[ebx+(2 shl 16)] + shr ecx,16 + mov dx,cx + add dx,2 + mov ecx,[esi] + and ecx,0xffffff + mcall SF_DRAW_NUMBER,0x00060100,,,0 + popa + + add ecx,24*65536 + add esi,4 + dec edi + jnz @b + + ret +;--------------------------------------------------------------------- +align 4 +draw_colours: + mov edi,10 + mov esi,[communication_area] + add esi,28 +; mov ebx,220*65536+14 + mov ebx,(c_start_x+c_size_x+ed_size_x+10*3)*65536+14 + mov ecx,27*65536+14 + mov eax,SF_DRAW_RECT + mov [frame_data.draw_text_flag],dword 0 +;-------------------------------------- +align 4 +newcol: + mov edx,[esi] + mcall + + push ebx ecx + + sub ebx,2 shl 16 + add bx,4 + sub ecx,2 shl 16 + add cx,4 + + mov [frame_data.x],ebx + mov [frame_data.y],ecx + + stdcall [Frame_draw], frame_data + + pop ecx ebx + + add ecx,24*65536 + add esi,4 + + dec edi + jnz newcol + + ret +;---------------------------------------------------------------------- +align 4 +draw_window: + mcall SF_REDRAW,SSF_BEGIN_DRAW +; mcall SF_CREATE_WINDOW, , , 0x33AABBCC,,title + xor esi,esi + mcall SF_CREATE_WINDOW,[window_x],[window_y], 0x34EEEeee,,title + mcall SF_DEFINE_BUTTON,,,0x60000002 + mcall ,,,0x60000003 + mcall ,<296,80>,<280,22>,4,0x37A4D4 + mcall ,<402,80>, ,1 + mcall SF_DRAW_TEXT,<332,289>,0x802C7B9E,OK_Cancel + mcall ,<331,288>,0x80FFFfff + xor ebp,ebp + mcall SF_PUT_IMAGE_EXT,[palette_area],<[palette_SIZE_X],[palette_SIZE_Y]>,,24 + call draw_tone + call draw_selected_color + xor eax,eax + inc eax + mov [scroll_bar_data_red.all_redraw],eax + mov [scroll_bar_data_green.all_redraw],eax + mov [scroll_bar_data_blue.all_redraw],eax + call draw_scrollbars + call draw_history_frame + call draw_button_row + call draw_colours + call draw_color_value + mcall SF_REDRAW,SSF_END_DRAW + ret +;--------------------------------------------------------------------- +align 4 +proc hex_in_str, buf:dword,val:dword,zif:dword +pushad + mov edi,[buf] + mov ecx,[zif] + add edi,ecx + dec edi + mov ebx,[val] + + .cycle: + mov al,bl + and al,0xf + cmp al,10 + jl @f + add al,'A'-'0'-10 + @@: + add al,'0' + mov byte[edi],al + dec edi + shr ebx,4 + loop .cycle +popad + ret +endp +;--------------------------------------------------------------------- +;input: +; buf - pointer to a hexadecimal string +;output: +; eax - number +align 4 +proc conv_str_to_int uses ebx esi, buf:dword + xor eax,eax + xor ebx,ebx + mov esi,[buf] + + .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 ;skip the chars not in between '9' and 'A' + .us1: ;╤Б╨╛╤Б╤В╨░╨▓╨╜╨╛╨╡ ╤Г╤Б╨╗╨╛╨▓╨╕╨╡ + cmp bl,'F' + jle .us2 + cmp bl,'a' + jl @f ;skip the chars not in between 'F' and 'a' + sub bl,32 ;convert symbols to uppercase for convenience + .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 + @@: + ret +endp +;--------------------------------------------------------------------- +include 'palette.inc' +;--------------------------------------------------------------------- +include 'tone.inc' +;--------------------------------------------------------------------- +include 'i_data.inc' +;--------------------------------------------------------------------- +IM_END: +;--------------------------------------------------------------------- +include 'u_data.inc' +;--------------------------------------------------------------------- +I_END: +;--------------------------------------------------------------------- diff --git a/programs/system/cpu/trunk/cpu.asm b/programs/system/cpu/trunk/cpu.asm index da50e176a..c0d0527c8 100644 --- a/programs/system/cpu/trunk/cpu.asm +++ b/programs/system/cpu/trunk/cpu.asm @@ -1,3 +1,7 @@ +; SPDX-License-Identifier: NOASSERTION +; + + ;-----------------------; ; CPU - process manager ; ;-----------------------; @@ -18,7 +22,7 @@ ;------------------------------------------------------------------------------- include "lang.inc" ; Language support for locales (UTF-8): de_DE, et_EE, ru_RU, it_IT, en_US. include "../../../macros.inc" -include "../../../develop/libraries/box_lib/trunk/box_lib.mac" +include "../../../develop/libraries/box_lib/box_lib.mac" include "../../../KOSfuncs.inc" include "../../../load_lib.mac" ;------------------------------------------------------------------------------- diff --git a/programs/system/format/format.asm b/programs/system/format/format.asm index d19428471..2d4e3e792 100644 --- a/programs/system/format/format.asm +++ b/programs/system/format/format.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Formatting Disk Utility ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -46,7 +52,7 @@ include '../../macros.inc' include '../../proc32.inc' include '../../KOSfuncs.inc' include '../../dll.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' ;for uses checkBox and editBox +include '../../develop/libraries/box_lib/box_lib.mac' ;for uses checkBox and editBox include '../../load_lib.mac' @use_library @@ -61,7 +67,7 @@ START: stdcall [OpenDialog_Init],OpenDialog_data ;set mask for events: - ;ёююс∙хэшх ю яхЁхЁшёютъх,эрцрЄр ъэюяър, юяЁхфхы╕ээр  Ёрэхх, ёюс√Єшх юЄ ь√°ш (ўЄю-Єю ёыєўшыюё№ - эрцрЄшх эр ъэюяъє ь√°ш шыш яхЁхьх∙хэшх; ёсЁрё√трхЄё  яЁш яЁюўЄхэшш) + ;сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) mcall SF_SET_EVENTS_MASK, 0x27 mov ecx,[sc.work_text] diff --git a/programs/system/icon_new/icon.asm b/programs/system/icon_new/icon.asm index f6ff15f7b..4f641a6f2 100644 --- a/programs/system/icon_new/icon.asm +++ b/programs/system/icon_new/icon.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + ICON_STRIP equ '/sys/icons32.png' ICON_INI equ '/sys/settings/icon.ini' ICON_SIZE equ 68 ;размер области для иконки с надписью @@ -38,7 +44,7 @@ BegData equ fiStdIco.point include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US. include '../../macros.inc' include '../../proc32.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' include '../../dll.inc' include '../../debug.inc' diff --git a/programs/system/keybi/keybi.asm b/programs/system/keybi/keybi.asm index 5e789e11a..5125f3c58 100644 --- a/programs/system/keybi/keybi.asm +++ b/programs/system/keybi/keybi.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page Windows 1251 - Cyrillic + + ; Keyboard indicators v0.2 ; by Albom and IgorA @@ -15,7 +21,7 @@ use32 include '../../macros.inc' include '../../proc32.inc' include '../../develop/libraries/box_lib/load_lib.mac' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' ;include 'mem.inc' ;include 'dll.inc' include 'lang.inc' ; Language support for locales: it_IT, en_US. diff --git a/programs/system/open/open.asm b/programs/system/open/open.asm index 0d5f5b813..fa63bc447 100644 --- a/programs/system/open/open.asm +++ b/programs/system/open/open.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + DEBUG = 0 LIST_WIDTH = 256 @@ -18,7 +24,7 @@ M01header.params: include "../../macros.inc" include "../../dll.inc" include "../../string.inc" - include "../../develop/libraries/box_lib/trunk/box_lib.mac" + include "../../develop/libraries/box_lib/box_lib.mac" include "lang.inc" ; Language support for locales: ru_RU (CP866), et_EE, it_IT, en_US. diff --git a/programs/system/rdsave/trunk/rdsave.asm b/programs/system/rdsave/trunk/rdsave.asm index e60757068..4a9407bb3 100644 --- a/programs/system/rdsave/trunk/rdsave.asm +++ b/programs/system/rdsave/trunk/rdsave.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + ; RDsave для Kolibri (0.6.5.0 и старше) ; Save RAM-disk to hard or floppy drive ;--------------------------------------------------------------------- @@ -33,7 +39,7 @@ include '../../../proc32.inc' include '../../../dll.inc' include '../../../KOSfuncs.inc' include '../../../load_lib.mac' -include '../../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../../develop/libraries/box_lib/box_lib.mac' include 'str.inc' @use_library diff --git a/programs/system/run/trunk/run.asm b/programs/system/run/trunk/run.asm index a4046c644..fdb200bae 100644 --- a/programs/system/run/trunk/run.asm +++ b/programs/system/run/trunk/run.asm @@ -1,9 +1,15 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + window_h=85 window_w=430 ;--- другие макросы --- include '../../../KOSfuncs.inc' include '../../../load_lib.mac' -include '../../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../../develop/libraries/box_lib/box_lib.mac' include 'txtbut.inc' include '../../../macros.inc' include 'run.mac'