From bd56fbf35f0b62b105f5f90f8859d87a4b267fbf Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 24 May 2025 20:04:47 +0100 Subject: [PATCH] develop/libraries/box_lib: Post-SVN tidy - Move source code from `trunk` into program root directory. - Update build files and ASM include paths. This touches *many* files. - Note: Line endings standardised from `CRLF` > `LF`, so best to view diffs with whitespace changes hidden. --- contrib/C_Layer/ASM/loadboxlib.asm | 10 +- data/Tupfile.lua | 2 +- programs/build_all.bat | 2 +- programs/develop/fasm/tags/1.71/fasm.asm | 62 +- programs/develop/h2d2b/h2d2b.asm | 2 +- programs/develop/heed/heed.asm | 2 +- programs/develop/info3ds/info3ds.asm | 8 +- programs/develop/info3ds/info3ds_u.asm | 8 +- programs/develop/kol_f_edit/kol_f_edit.asm | 3256 ++++---- .../libraries/box_lib/{trunk => }/Tupfile.lua | 0 .../box_lib/asm/{trunk => }/Tupfile.lua | 0 .../box_lib/asm/{trunk => }/build.bat | 0 .../box_lib/asm/{trunk => }/build.sh | 0 .../box_lib/asm/{trunk => }/ctrldemo.asm | 846 +-- .../box_lib/asm/{trunk => }/data.inc | 0 .../box_lib/asm/{trunk => }/editbox_ex.asm | 394 +- .../box_lib/asm/{trunk => }/opendial.mac | 0 .../asm/{trunk => }/reload_16x16_8b.png | Bin .../box_lib/asm/{trunk => }/tooltip_demo.asm | 348 +- .../box_lib/asm/{trunk => }/w_about.inc | 0 .../libraries/box_lib/{trunk => }/box_lib.asm | 826 +-- .../libraries/box_lib/{trunk => }/box_lib.mac | 0 .../libraries/box_lib/{trunk => }/build.sh | 0 .../box_lib/{trunk => }/checkbox.asm | 0 .../box_lib/{trunk => }/d_button.asm | 0 .../box_lib/{trunk => }/doc/box_lib.htm | 0 .../doc/checkbox/info_checkbox.htm | 0 .../{trunk => }/doc/editbox/info_editbox.htm | 0 .../{trunk => }/doc/editbox/window_fasm.png | Bin .../box_lib/{trunk => }/doc/frame/SCR_1.PNG | Bin .../box_lib/{trunk => }/doc/frame/SCR_2.PNG | Bin .../box_lib/{trunk => }/doc/frame/SCR_3.PNG | Bin .../box_lib/{trunk => }/doc/frame/SCR_4.PNG | Bin .../box_lib/{trunk => }/doc/frame/SCR_5.PNG | Bin .../{trunk => }/doc/frame/info_frame.htm | 0 .../{trunk => }/doc/pathshow/pathshow.htm | 0 .../{trunk => }/doc/scrollbar/scrollbar.htm | 0 .../box_lib/{trunk => }/doc/style.css | 0 .../box_lib/{trunk => }/doc/t_edit/t_edit.htm | 0 .../{trunk => }/doc/tooltip/tooltip.htm | 0 .../{trunk => }/doc/tree_list/info_size.png | Bin .../doc/tree_list/info_treelist.htm | 0 .../doc/tree_list/window_tree_list.png | Bin .../libraries/box_lib/{trunk => }/editbox.asm | 0 .../box_lib/{trunk => }/filebrowser.asm | 0 .../libraries/box_lib/{trunk => }/frame.asm | 0 .../libraries/box_lib/{trunk => }/keys.inc | 0 .../libraries/box_lib/{trunk => }/menubar.asm | 0 .../box_lib/{trunk => }/optionbox.asm | 0 .../box_lib/{trunk => }/pathshow.asm | 0 .../box_lib/{trunk => }/progressbar.asm | 0 .../libraries/box_lib/{trunk => }/readme.txt | 0 .../libraries/box_lib/{trunk => }/run.bat | 0 .../box_lib/{trunk => }/scrollbar.asm | 0 .../libraries/box_lib/{trunk => }/t_edit.asm | 0 .../box_lib/{trunk => }/tl_nod_16.bmp | Bin .../box_lib/{trunk => }/tl_nod_16_w.bmp | Bin .../box_lib/{trunk => }/tl_sys_16.bmp | Bin .../box_lib/{trunk => }/tl_sys_16_w.bmp | Bin .../libraries/box_lib/{trunk => }/tooltip.asm | 0 .../box_lib/{trunk => }/tree_list.asm | 0 .../crypt_des/example/crypt_files.asm | 1172 +-- .../libraries/exif/examples/viev_exif.asm | 1454 ++-- .../libraries/fontslib/trunk/font_ex.asm | 418 +- .../libraries/http/examples/deflate.asm | 932 ++- .../develop/libraries/http/examples/get.asm | 866 ++- .../libraries/nnp/examples/nnp_points.asm | 1500 ++-- programs/develop/str_double/str_double.asm | 2 +- programs/fs/opendial/opendial.asm | 6544 +++++++++-------- programs/fs/unz/unz.asm | 10 +- programs/games/nu_pogodi/nu_pogod.asm | 2872 ++++---- programs/games/snake/snake.asm | 5103 ++++++------- programs/media/log_el/trunk/log_el.asm | 5234 ++++++------- programs/media/scrshoot/scrshoot.asm | 8 +- programs/media/zsea/zSea.asm | 1002 +-- programs/network/downloader/downloader.asm | 908 +-- programs/network/ftpc/gui.inc | 27 +- programs/network/ircc/ircc.asm | 1284 ++-- programs/network/netstat/netstat.asm | 2058 +++--- programs/network/tftpc/tftpc.asm | 1338 ++-- programs/network/vncc/vncc.asm | 1234 ++-- programs/other/calcplus/calcplus.asm | 1468 ++-- programs/other/cnc_control/cnc_control.asm | 2155 +++--- programs/other/cnc_editor/cnc_editor.asm | 4843 ++++++------ programs/other/ha/HACONFIG.ASM | 3620 ++++----- programs/other/kpack/trunk/kpack.asm | 1143 +-- .../other/outdated/dictionary/dictionary.ASM | 834 +-- programs/other/planet_v/planet_v.asm | 1819 ++--- programs/other/rtfread/rtfread.asm | 5 +- programs/other/t_edit/t_edit.asm | 864 +-- programs/other/t_edit_synt/te_syntax.asm | 784 +- programs/system/MyKey/trunk/MyKey.asm | 5 +- programs/system/RunOD/RunOD.asm | 710 +- programs/system/colrdial/color_dialog.asm | 1417 ++-- programs/system/cpu/trunk/cpu.asm | 6 +- programs/system/format/format.asm | 10 +- programs/system/hdd_info/trunk/hdd_info.asm | 3920 +++++----- programs/system/icon_new/icon.asm | 8 +- programs/system/keybi/keybi.asm | 8 +- programs/system/open/open.asm | 8 +- programs/system/rdsave/trunk/rdsave.asm | 8 +- programs/system/run/trunk/run.asm | 8 +- programs/system/terminal/terminal.asm | 994 +-- programs/testing/fspeed/fspeed.asm | 711 +- programs/testing/mgb/trunk/mgb.asm | 2408 +++--- 105 files changed, 34203 insertions(+), 33285 deletions(-) rename programs/develop/libraries/box_lib/{trunk => }/Tupfile.lua (100%) rename programs/develop/libraries/box_lib/asm/{trunk => }/Tupfile.lua (100%) rename programs/develop/libraries/box_lib/asm/{trunk => }/build.bat (100%) rename programs/develop/libraries/box_lib/asm/{trunk => }/build.sh (100%) rename programs/develop/libraries/box_lib/asm/{trunk => }/ctrldemo.asm (94%) rename programs/develop/libraries/box_lib/asm/{trunk => }/data.inc (100%) rename programs/develop/libraries/box_lib/asm/{trunk => }/editbox_ex.asm (94%) rename programs/develop/libraries/box_lib/asm/{trunk => }/opendial.mac (100%) rename programs/develop/libraries/box_lib/asm/{trunk => }/reload_16x16_8b.png (100%) rename programs/develop/libraries/box_lib/asm/{trunk => }/tooltip_demo.asm (92%) rename programs/develop/libraries/box_lib/asm/{trunk => }/w_about.inc (100%) rename programs/develop/libraries/box_lib/{trunk => }/box_lib.asm (94%) rename programs/develop/libraries/box_lib/{trunk => }/box_lib.mac (100%) rename programs/develop/libraries/box_lib/{trunk => }/build.sh (100%) rename programs/develop/libraries/box_lib/{trunk => }/checkbox.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/d_button.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/box_lib.htm (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/checkbox/info_checkbox.htm (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/editbox/info_editbox.htm (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/editbox/window_fasm.png (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/frame/SCR_1.PNG (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/frame/SCR_2.PNG (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/frame/SCR_3.PNG (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/frame/SCR_4.PNG (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/frame/SCR_5.PNG (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/frame/info_frame.htm (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/pathshow/pathshow.htm (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/scrollbar/scrollbar.htm (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/style.css (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/t_edit/t_edit.htm (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/tooltip/tooltip.htm (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/tree_list/info_size.png (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/tree_list/info_treelist.htm (100%) rename programs/develop/libraries/box_lib/{trunk => }/doc/tree_list/window_tree_list.png (100%) rename programs/develop/libraries/box_lib/{trunk => }/editbox.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/filebrowser.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/frame.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/keys.inc (100%) rename programs/develop/libraries/box_lib/{trunk => }/menubar.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/optionbox.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/pathshow.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/progressbar.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/readme.txt (100%) rename programs/develop/libraries/box_lib/{trunk => }/run.bat (100%) rename programs/develop/libraries/box_lib/{trunk => }/scrollbar.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/t_edit.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/tl_nod_16.bmp (100%) rename programs/develop/libraries/box_lib/{trunk => }/tl_nod_16_w.bmp (100%) rename programs/develop/libraries/box_lib/{trunk => }/tl_sys_16.bmp (100%) rename programs/develop/libraries/box_lib/{trunk => }/tl_sys_16_w.bmp (100%) rename programs/develop/libraries/box_lib/{trunk => }/tooltip.asm (100%) rename programs/develop/libraries/box_lib/{trunk => }/tree_list.asm (100%) 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/data/Tupfile.lua b/data/Tupfile.lua index 547d74cb7..b5ebf0e03 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -506,7 +506,7 @@ tup.append_table(img_files, { {"GAMES/TETRIS", VAR_PROGS .. "/games/tetris/tetris"}, {"GAMES/C4", VAR_PROGS .. "/games/c4/c4"}, {"LIB/ARCHIVER.OBJ", VAR_PROGS .. "/fs/kfar/trunk/kfar_arc/kfar_arc.obj"}, - {"LIB/BOX_LIB.OBJ", VAR_PROGS .. "/develop/libraries/box_lib/trunk/box_lib.obj"}, + {"LIB/BOX_LIB.OBJ", VAR_PROGS .. "/develop/libraries/box_lib/box_lib.obj"}, {"LIB/BUF2D.OBJ", VAR_PROGS .. "/develop/libraries/buf2d/trunk/buf2d.obj"}, {"LIB/CONSOLE.OBJ", VAR_PROGS .. "/develop/libraries/console_coff/console.obj"}, {"LIB/CNV_PNG.OBJ", VAR_PROGS .. "/media/zsea/plugins/png/cnv_png.obj"}, diff --git a/programs/build_all.bat b/programs/build_all.bat index e343c09db..1d205dc1a 100644 --- a/programs/build_all.bat +++ b/programs/build_all.bat @@ -101,7 +101,7 @@ fasm develop\cObj\cObj.asm %BIN%\develop\cObj echo * echo Building systems libraries echo * -fasm develop\libraries\box_lib\trunk\box_lib.asm %BIN%\lib\box_lib.obj +fasm develop\libraries\box_lib\box_lib.asm %BIN%\lib\box_lib.obj fasm develop\libraries\console\console.asm %BIN%\lib\console.obj fasm develop\libraries\libs-dev\libgfx\libgfx.asm %BIN%\lib\libgfx.obj fasm develop\libraries\libs-dev\libimg\libimg.asm %BIN%\lib\libimg.obj 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/exif/examples/viev_exif.asm b/programs/develop/libraries/exif/examples/viev_exif.asm index c11c20ff6..c39f9452f 100644 --- a/programs/develop/libraries/exif/examples/viev_exif.asm +++ b/programs/develop/libraries/exif/examples/viev_exif.asm @@ -1,724 +1,730 @@ -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 'Просмотр информации Exif 11.03.16',0 ;подпись окна - -run_file_70 FileInfoBlock - -fn_toolbar db 'toolbar.png',0 -IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 -image_data_toolbar dd 0 - -memory_file_size dd 512*1024 ;размер памяти для открытия файлов (в начале 512 Kb, но может увеличиватся при необходимости) - -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 ;создание буфера - stdcall [buf2d_create], buf_thumb - - load_image_file 'font8x9.bmp', image_data_toolbar - 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 - - stdcall mem.Alloc,[memory_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)+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 - - mov ebx,(30 shl 16)+20 - mov edx,4 - int 0x40 - - mov ebx,(55 shl 16)+20 - mov edx,5 - int 0x40 - - mov ebx,(85 shl 16)+20 - mov edx,6 - int 0x40 - - mov ebx,(110 shl 16)+20 - mov edx,7 - int 0x40 - - mov ebx,(135 shl 16)+20 - mov edx,8 - int 0x40 - - mov ebx,(160 shl 16)+20 - mov edx,9 - 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) ;app1 text - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;app1 gps - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;app2 text - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;app2 thumbnail - int 0x40 - - ; *** рисование буфера *** - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW,SSF_END_DRAW -popad - ret - -align 4 -key: - mcall SF_GET_KEY - jmp still - -align 4 -mouse: - - 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 draw_file_1 ;основная информация - @@: - cmp ah,7 - jne @f - call draw_file_2 ;информация по GPS - @@: - cmp ah,8 - jne @f - call draw_file_3 ;информация app2 - @@: - cmp ah,9 - jne @f - call draw_file_4 - @@: - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 - stdcall [buf2d_delete],buf_1 ;удаляем буфер - stdcall [buf2d_delete],buf_thumb - 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_1 - ret - -align 4 -open_file dd 0 ;указатель на память для открытия файлов -open_file_size dd 0 ;размер открытого файла (должен быть не больше memory_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 [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 - m2m [run_file_70.Buffer], [open_file] - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], openfile_path - mcall SF_FILE,run_file_70 - cmp eax,0 - jne .end_open_file - - mov eax,[open_file] - mov ebx,[eax+32] ;dword[eax+32] - размер открываемого файла - mov [open_file_size],ebx ;ebx - размер открываемого файла - ;memory_file_size - размер выделенной памяти для файла - cmp [memory_file_size],ebx - jge @f - ;увеличиваем память если не хватило - mov [memory_file_size],ebx - stdcall mem.ReAlloc, [open_file],ebx - mov [open_file],eax - @@: - - mov [run_file_70.Function], SSF_READ_FILE - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - m2m dword[run_file_70.Count], dword[open_file_size] - m2m dword[run_file_70.Buffer],dword[open_file] - 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 [open_file_size],ebx - ;add ebx,dword[open_file] - ;mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом - stdcall [exif_get_app1], [open_file],h_app1 - mcall SF_SET_CAPTION,1,openfile_path - - call draw_file_1 - .end_open_file: - popad - ret - -;description: -; информация exif из app1 -; текстовые и числовые данные -align 4 -draw_file_1: -pushad - stdcall [buf2d_clear], buf_0, [buf_0.color] - cmp dword[open_file_size],0 - je .open_file - - mov eax,1 - mov ebx,1 - .cycle_0: - stdcall [exif_get_tag], h_app1,eax,txt_buf,80 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 - inc eax - add ebx,10 - cmp byte[txt_buf],0 - jne .cycle_0 - - ;считываем дочерние теги для 0x8769 - stdcall [exif_get_child], h_app1,h_child,0x8769 - cmp dword[h_child],0 - je .no_found_child - - mov eax,1 - sub ebx,5 - .cycle_1: - stdcall [exif_get_tag], h_child,eax,txt_buf,80 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb00000 - inc eax - add ebx,10 - cmp byte[txt_buf],0 - jne .cycle_1 - - jmp @f - .no_found_child: - stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000 - jmp @f - .open_file: - stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000 - @@: - stdcall [buf2d_draw], buf_0 -popad - ret - -;description: -; информация exif из app1 -; данные о gps -align 4 -draw_file_2: -pushad - stdcall [buf2d_clear], buf_0, [buf_0.color] - cmp dword[open_file_size],0 - je .open_file - - mov eax,1 - mov ebx,1 - .cycle_0: - stdcall [exif_get_tag], h_app1,eax,txt_buf,80 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 - inc eax - add ebx,10 - cmp byte[txt_buf],0 - jne .cycle_0 - - ;считываем дочерние теги для 0x8825 - stdcall [exif_get_child], h_app1,h_child,0x8825 - cmp dword[h_child],0 - je .no_found_child - - mov eax,1 - sub ebx,5 - .cycle_1: - stdcall [exif_get_tag], h_child,eax,txt_buf,80 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb00000 - inc eax - add ebx,10 - cmp byte[txt_buf],0 - jne .cycle_1 - - jmp @f - .no_found_child: - stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000 - jmp @f - .open_file: - stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000 - @@: - stdcall [buf2d_draw], buf_0 -popad - ret - -;description: -; информация exif из app2 -; текстовые и числовые данные -align 4 -draw_file_3: -pushad - stdcall [buf2d_clear], buf_0, [buf_0.color] - cmp dword[open_file_size],0 - je .open_file - - mov eax,1 - mov ebx,1 - .cycle_0: - stdcall [exif_get_tag], h_app1,eax,txt_buf,80 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 - inc eax - add ebx,10 - cmp byte[txt_buf],0 - jne .cycle_0 - - ;находим app2 - stdcall [exif_get_app2], h_app1,h_child - cmp dword[h_child],0 - je .no_found_child - - mov eax,1 ;25 - sub ebx,5 - .cycle_1: - stdcall [exif_get_tag], h_child,eax,txt_buf,80 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb00000 - inc eax - add ebx,10 - cmp byte[txt_buf],0 - jne .cycle_1 - - jmp @f - .no_found_child: - stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000 - jmp @f - .open_file: - stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000 - @@: - stdcall [buf2d_draw], buf_0 -popad - ret - -;description: -; информация exif из app2 -; картинка для камер Nikon -align 4 -draw_file_4: -pushad - stdcall [buf2d_clear], buf_0, [buf_0.color] - cmp dword[open_file_size],0 - je .open_file - - ;выводим общую информацию по снимку: - ;0x010f - Manufacturer of digicam - ;0x0110 - Model - ;0x0132 - Modify date - mov ebx,3 - stdcall [exif_get_tag_id], h_app1,0x010f,txt_buf,80 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 - add ebx,10 - stdcall [exif_get_tag_id], h_app1,0x0110,txt_buf,80 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 - add ebx,10 - stdcall [exif_get_tag_id], h_app1,0x0132,txt_buf,80 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 - add ebx,20 - - ;находим app2 - stdcall [exif_get_app2], h_app1,h_child - cmp dword[h_child],0 - je .no_found_child - - ;считываем дочерние теги - ;0x0011 - Preview IFD - stdcall [exif_get_child], h_child,h_child,0x0011 - cmp dword[h_child],0 - je .no_found_child - - ;0x0202 - Preview Image Length - stdcall [exif_get_child], h_child,h_child_siz,0x0202 - cmp dword[h_child_siz],0 - je .no_found_child - - ;0x0201 - Preview Image Start - stdcall [exif_get_child], h_child,h_child,0x0201 - cmp dword[h_child],0 - je .no_found_child - - stdcall [img_decode],dword[h_child],dword[h_child_siz],0 - cmp dword[eax+4],1 - jl .no_found_child - cmp dword[eax+8],1 - jl .no_found_child - mov ebx,eax - stdcall [buf2d_resize],buf_thumb,[eax+4],[eax+8],1 - ;преобразуем изображение к формату rgb - stdcall [img_to_rgb2],ebx,[buf_thumb] - stdcall [img_destroy],ebx ;удаляем временный буфер ebx - - mov ebx,43 - stdcall [buf2d_draw_text], buf_0, buf_1,txt_thumb,3,ebx,0xb000 - add ebx,10 - stdcall [buf2d_bit_blt], buf_0, 0,ebx, buf_thumb ;рисуем изображение - jmp @f - - .no_found_child: - stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000 - 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 [run_file_70.Function], SSF_CREATE_FILE - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - -if 1 ;ставим 1 если сохраняется все изображение - mov ebx, dword[open_file] - mov [run_file_70.Buffer], ebx - mov ebx,[open_file_size] -end if -if 0 ;ставим 1 если сохраняется эскиз изображения - ;находим app2 - stdcall [exif_get_app2], h_app1,h_child - cmp dword[h_child],0 - je .end_save_file - ;считываем дочерние теги - stdcall [exif_get_child], h_child,h_child,0x0011 - cmp dword[h_child],0 - je .end_save_file - stdcall [exif_get_child], h_child,h_child,0x0201 - cmp dword[h_child],0 - je .end_save_file - - mov ebx,dword[h_child] ;dword[open_file] - mov [run_file_70.Buffer], ebx - mov ebx,dword[h_child_siz] ;размер эскиза изображения -end if - mov dword[run_file_70.Count], ebx ;размер файла - 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_save_file - ; ... сообщение о неудачном сохранении ... - - .end_save_file: - popad - 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 'JPG',0 -db 'JPEG',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 'exif.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, file_name, system_dir_2, import_buf2d - lib_3 l_libs lib_name_3, file_name, system_dir_3, import_exif -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_resize dd sz_buf2d_resize - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - 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_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - -align 4 -import_exif: ;описание экспортируемых функций - exif_get_app1 dd sz_exif_get_app1 - exif_get_app2 dd sz_exif_get_app2 - exif_get_tag dd sz_exif_get_tag - exif_get_tag_id dd sz_exif_get_tag_id - exif_get_child dd sz_exif_get_child - -dd 0,0 - sz_exif_get_app1 db 'exif_get_app1',0 - sz_exif_get_app2 db 'exif_get_app2',0 - sz_exif_get_tag db 'exif_get_tag',0 - sz_exif_get_tag_id db 'exif_get_tag_id',0 - sz_exif_get_child db 'exif_get_child',0 - - -sc system_colors - -align 16 -procinfo process_information - -align 4 -buf_0: dd 0 ;указатель на буфер изображения - dw 5 ;+4 left - dw 31 ;+6 top -.w: dd 570 ;+8 w -.h: dd 480 ;+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 - -align 4 -buf_thumb: - dd 0 ;указатель на буфер изображения - dw 0 ;+4 left - dw 0 ;+6 top - dd 120 ;+8 w - dd 100 ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -h_app1 rb 14 ;структура для заголовка главных тегов -h_child rb 14 ;структура для заголовка дочерних тегов -h_child_siz rb 14 - -txt_openfile db 'Откройте файл изображения в формате *.jpg.',0 -txt_thumb db 'Это эскиз изображения из данных app2.',0 -txt_nochild db 'Информация по этой кнопке не найдена.',0 -txt_buf rb 80 - -align 16 -i_end: - rb 2048 -stacktop: - sys_path rb 1024 - 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 + + +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/box_lib.mac' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +caption db 'Просмотр информации Exif 11.03.16',0 ;подпись окна + +run_file_70 FileInfoBlock + +fn_toolbar db 'toolbar.png',0 +IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +image_data_toolbar dd 0 + +memory_file_size dd 512*1024 ;размер памяти для открытия файлов (в начале 512 Kb, но может увеличиватся при необходимости) + +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 ;создание буфера + stdcall [buf2d_create], buf_thumb + + load_image_file 'font8x9.bmp', image_data_toolbar + 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 + + stdcall mem.Alloc,[memory_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)+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 + + mov ebx,(30 shl 16)+20 + mov edx,4 + int 0x40 + + mov ebx,(55 shl 16)+20 + mov edx,5 + int 0x40 + + mov ebx,(85 shl 16)+20 + mov edx,6 + int 0x40 + + mov ebx,(110 shl 16)+20 + mov edx,7 + int 0x40 + + mov ebx,(135 shl 16)+20 + mov edx,8 + int 0x40 + + mov ebx,(160 shl 16)+20 + mov edx,9 + 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) ;app1 text + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;app1 gps + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;app2 text + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;app2 thumbnail + int 0x40 + + ; *** рисование буфера *** + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW,SSF_END_DRAW +popad + ret + +align 4 +key: + mcall SF_GET_KEY + jmp still + +align 4 +mouse: + + 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 draw_file_1 ;основная информация + @@: + cmp ah,7 + jne @f + call draw_file_2 ;информация по GPS + @@: + cmp ah,8 + jne @f + call draw_file_3 ;информация app2 + @@: + cmp ah,9 + jne @f + call draw_file_4 + @@: + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 + stdcall [buf2d_delete],buf_1 ;удаляем буфер + stdcall [buf2d_delete],buf_thumb + 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_1 + ret + +align 4 +open_file dd 0 ;указатель на память для открытия файлов +open_file_size dd 0 ;размер открытого файла (должен быть не больше memory_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 [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 + m2m [run_file_70.Buffer], [open_file] + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mcall SF_FILE,run_file_70 + cmp eax,0 + jne .end_open_file + + mov eax,[open_file] + mov ebx,[eax+32] ;dword[eax+32] - размер открываемого файла + mov [open_file_size],ebx ;ebx - размер открываемого файла + ;memory_file_size - размер выделенной памяти для файла + cmp [memory_file_size],ebx + jge @f + ;увеличиваем память если не хватило + mov [memory_file_size],ebx + stdcall mem.ReAlloc, [open_file],ebx + mov [open_file],eax + @@: + + mov [run_file_70.Function], SSF_READ_FILE + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + m2m dword[run_file_70.Count], dword[open_file_size] + m2m dword[run_file_70.Buffer],dword[open_file] + 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 [open_file_size],ebx + ;add ebx,dword[open_file] + ;mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом + stdcall [exif_get_app1], [open_file],h_app1 + mcall SF_SET_CAPTION,1,openfile_path + + call draw_file_1 + .end_open_file: + popad + ret + +;description: +; информация exif из app1 +; текстовые и числовые данные +align 4 +draw_file_1: +pushad + stdcall [buf2d_clear], buf_0, [buf_0.color] + cmp dword[open_file_size],0 + je .open_file + + mov eax,1 + mov ebx,1 + .cycle_0: + stdcall [exif_get_tag], h_app1,eax,txt_buf,80 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 + inc eax + add ebx,10 + cmp byte[txt_buf],0 + jne .cycle_0 + + ;считываем дочерние теги для 0x8769 + stdcall [exif_get_child], h_app1,h_child,0x8769 + cmp dword[h_child],0 + je .no_found_child + + mov eax,1 + sub ebx,5 + .cycle_1: + stdcall [exif_get_tag], h_child,eax,txt_buf,80 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb00000 + inc eax + add ebx,10 + cmp byte[txt_buf],0 + jne .cycle_1 + + jmp @f + .no_found_child: + stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000 + jmp @f + .open_file: + stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000 + @@: + stdcall [buf2d_draw], buf_0 +popad + ret + +;description: +; информация exif из app1 +; данные о gps +align 4 +draw_file_2: +pushad + stdcall [buf2d_clear], buf_0, [buf_0.color] + cmp dword[open_file_size],0 + je .open_file + + mov eax,1 + mov ebx,1 + .cycle_0: + stdcall [exif_get_tag], h_app1,eax,txt_buf,80 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 + inc eax + add ebx,10 + cmp byte[txt_buf],0 + jne .cycle_0 + + ;считываем дочерние теги для 0x8825 + stdcall [exif_get_child], h_app1,h_child,0x8825 + cmp dword[h_child],0 + je .no_found_child + + mov eax,1 + sub ebx,5 + .cycle_1: + stdcall [exif_get_tag], h_child,eax,txt_buf,80 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb00000 + inc eax + add ebx,10 + cmp byte[txt_buf],0 + jne .cycle_1 + + jmp @f + .no_found_child: + stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000 + jmp @f + .open_file: + stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000 + @@: + stdcall [buf2d_draw], buf_0 +popad + ret + +;description: +; информация exif из app2 +; текстовые и числовые данные +align 4 +draw_file_3: +pushad + stdcall [buf2d_clear], buf_0, [buf_0.color] + cmp dword[open_file_size],0 + je .open_file + + mov eax,1 + mov ebx,1 + .cycle_0: + stdcall [exif_get_tag], h_app1,eax,txt_buf,80 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 + inc eax + add ebx,10 + cmp byte[txt_buf],0 + jne .cycle_0 + + ;находим app2 + stdcall [exif_get_app2], h_app1,h_child + cmp dword[h_child],0 + je .no_found_child + + mov eax,1 ;25 + sub ebx,5 + .cycle_1: + stdcall [exif_get_tag], h_child,eax,txt_buf,80 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb00000 + inc eax + add ebx,10 + cmp byte[txt_buf],0 + jne .cycle_1 + + jmp @f + .no_found_child: + stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000 + jmp @f + .open_file: + stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000 + @@: + stdcall [buf2d_draw], buf_0 +popad + ret + +;description: +; информация exif из app2 +; картинка для камер Nikon +align 4 +draw_file_4: +pushad + stdcall [buf2d_clear], buf_0, [buf_0.color] + cmp dword[open_file_size],0 + je .open_file + + ;выводим общую информацию по снимку: + ;0x010f - Manufacturer of digicam + ;0x0110 - Model + ;0x0132 - Modify date + mov ebx,3 + stdcall [exif_get_tag_id], h_app1,0x010f,txt_buf,80 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 + add ebx,10 + stdcall [exif_get_tag_id], h_app1,0x0110,txt_buf,80 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 + add ebx,10 + stdcall [exif_get_tag_id], h_app1,0x0132,txt_buf,80 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 + add ebx,20 + + ;находим app2 + stdcall [exif_get_app2], h_app1,h_child + cmp dword[h_child],0 + je .no_found_child + + ;считываем дочерние теги + ;0x0011 - Preview IFD + stdcall [exif_get_child], h_child,h_child,0x0011 + cmp dword[h_child],0 + je .no_found_child + + ;0x0202 - Preview Image Length + stdcall [exif_get_child], h_child,h_child_siz,0x0202 + cmp dword[h_child_siz],0 + je .no_found_child + + ;0x0201 - Preview Image Start + stdcall [exif_get_child], h_child,h_child,0x0201 + cmp dword[h_child],0 + je .no_found_child + + stdcall [img_decode],dword[h_child],dword[h_child_siz],0 + cmp dword[eax+4],1 + jl .no_found_child + cmp dword[eax+8],1 + jl .no_found_child + mov ebx,eax + stdcall [buf2d_resize],buf_thumb,[eax+4],[eax+8],1 + ;преобразуем изображение к формату rgb + stdcall [img_to_rgb2],ebx,[buf_thumb] + stdcall [img_destroy],ebx ;удаляем временный буфер ebx + + mov ebx,43 + stdcall [buf2d_draw_text], buf_0, buf_1,txt_thumb,3,ebx,0xb000 + add ebx,10 + stdcall [buf2d_bit_blt], buf_0, 0,ebx, buf_thumb ;рисуем изображение + jmp @f + + .no_found_child: + stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000 + 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 [run_file_70.Function], SSF_CREATE_FILE + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + +if 1 ;ставим 1 если сохраняется все изображение + mov ebx, dword[open_file] + mov [run_file_70.Buffer], ebx + mov ebx,[open_file_size] +end if +if 0 ;ставим 1 если сохраняется эскиз изображения + ;находим app2 + stdcall [exif_get_app2], h_app1,h_child + cmp dword[h_child],0 + je .end_save_file + ;считываем дочерние теги + stdcall [exif_get_child], h_child,h_child,0x0011 + cmp dword[h_child],0 + je .end_save_file + stdcall [exif_get_child], h_child,h_child,0x0201 + cmp dword[h_child],0 + je .end_save_file + + mov ebx,dword[h_child] ;dword[open_file] + mov [run_file_70.Buffer], ebx + mov ebx,dword[h_child_siz] ;размер эскиза изображения +end if + mov dword[run_file_70.Count], ebx ;размер файла + 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_save_file + ; ... сообщение о неудачном сохранении ... + + .end_save_file: + popad + 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 'JPG',0 +db 'JPEG',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 'exif.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, file_name, system_dir_2, import_buf2d + lib_3 l_libs lib_name_3, file_name, system_dir_3, import_exif +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_resize dd sz_buf2d_resize + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + 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_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + +align 4 +import_exif: ;описание экспортируемых функций + exif_get_app1 dd sz_exif_get_app1 + exif_get_app2 dd sz_exif_get_app2 + exif_get_tag dd sz_exif_get_tag + exif_get_tag_id dd sz_exif_get_tag_id + exif_get_child dd sz_exif_get_child + +dd 0,0 + sz_exif_get_app1 db 'exif_get_app1',0 + sz_exif_get_app2 db 'exif_get_app2',0 + sz_exif_get_tag db 'exif_get_tag',0 + sz_exif_get_tag_id db 'exif_get_tag_id',0 + sz_exif_get_child db 'exif_get_child',0 + + +sc system_colors + +align 16 +procinfo process_information + +align 4 +buf_0: dd 0 ;указатель на буфер изображения + dw 5 ;+4 left + dw 31 ;+6 top +.w: dd 570 ;+8 w +.h: dd 480 ;+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 + +align 4 +buf_thumb: + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd 120 ;+8 w + dd 100 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +h_app1 rb 14 ;структура для заголовка главных тегов +h_child rb 14 ;структура для заголовка дочерних тегов +h_child_siz rb 14 + +txt_openfile db 'Откройте файл изображения в формате *.jpg.',0 +txt_thumb db 'Это эскиз изображения из данных app2.',0 +txt_nochild db 'Информация по этой кнопке не найдена.',0 +txt_buf rb 80 + +align 16 +i_end: + rb 2048 +stacktop: + sys_path rb 1024 + file_name rb 4096 + 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/http/examples/deflate.asm b/programs/develop/libraries/http/examples/deflate.asm index 7efad8c96..8624d153a 100644 --- a/programs/develop/libraries/http/examples/deflate.asm +++ b/programs/develop/libraries/http/examples/deflate.asm @@ -1,467 +1,465 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2009-2015. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;; downloader.asm - HTTP client for KolibriOS ;; -;; ;; -;; ;; -;; GNU GENERAL PUBLIC LICENSE ;; -;; Version 2, June 1991 ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -URLMAXLEN = 1024 -BUFFERSIZE = 4096 - -__DEBUG__ = 1 -__DEBUG_LEVEL__ = 1 - -format binary as "" -;-------------------------------------- -frame_1: - .x = 5 - .y = 10 - .width = 350 - .height = 55 -;-------------------------------------- -frame_2: - .x = 5 - .y = 75 - .width = 350 - .height = 55 -;--------------------------------------------------------------------- -use32 - org 0x0 - - db 'MENUET01' ; header - dd 0x01 ; header version - dd START ; entry point - dd IM_END ; image size - dd I_END ; required memory - dd stacktop ; esp - dd params ; I_PARAM - dd 0x0 ; I_Path -;--------------------------------------------------------------------- -include '../../../../macros.inc' -include '../../../../proc32.inc' -include '../../../../dll.inc' -include '../../../../debug-fdo.inc' -include '../../box_lib/trunk/box_lib.mac' -include '../../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 exit -;--------------------------------------------------------------------- - mov edi,filename_area - mov esi,start_temp_file_name - call copy_file_name_path - - mov edi,fname_buf - mov esi,start_file_path - call copy_file_name_path - -;OpenDialog initialisation - push dword OpenDialog_data - call [OpenDialog_Init] - -; prepare for PathShow - push dword PathShow_data_1 - call [PathShow_prepare] -;--------------------------------------------------------------------- -; check parameters - cmp byte[params], 0 ; no parameters ? - je reset_events ; load the GUI - - inc [silently] - -download: - call download_1 - - test [silently], 0xff - jnz save - -reset_events: - DEBUGF 1, "resetting events\n" - -; Report events -; defaults + mouse - mcall 40,EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER -;--------------------------------------------------------------------- -redraw: - call draw_window - -still: -;; DEBUGF 1, "waiting for events\n" - - 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 still -;--------------------------------------------------------------------- -key: - mcall 2 ; read key - - stdcall [edit_box_key], dword edit1 - - cmp ax, 13 shl 8 - je download - - jmp still -;--------------------------------------------------------------------- -button: - - mcall 17 ; get id - - cmp ah, 26 - jne @f -; invoke OpenDialog - push dword OpenDialog_data - call [OpenDialog_Start] - cmp [OpenDialog_data.status],1 - jne still - -; prepare for PathShow - push dword PathShow_data_1 - call [PathShow_prepare] - call draw_window - jmp still -@@: - cmp ah, 1 ; button id=1 ? - je exit - - call download_1 - jmp save -;--------------------------------------------------------------------- -mouse: - stdcall [edit_box_mouse], edit1 - jmp still -;--------------------------------------------------------------------- -exit: - DEBUGF 1, "Exiting\n" - invoke HTTP_free, [identifier] ; free buffer -fail: - or eax, -1 ; close this program - mcall -;--------------------------------------------------------------------- -download_1: - DEBUGF 1, "Starting download\n" - - invoke HTTP_get, 0, 0, params, sz_add_header - test eax, eax - jz fail - mov [identifier], eax - - .loop: - invoke HTTP_receive, [identifier] - test eax, eax - jnz .loop - - mov eax, [identifier] - mov ebx, [eax + http_msg.content_length] - mov [final_size], ebx - mov ebx, [eax + http_msg.content_ptr] - mov [final_buffer], ebx - - invoke HTTP_find_header, [identifier], sz_content_enc - test eax, eax - jz .no_deflate - -; TODO: check if parameter equals "deflate" - - DEBUGF 1, "deflating\n" - - lea eax, [final_size] - invoke deflate_unpack, [final_buffer], eax - push eax - mcall 68, 13, [final_buffer] ; Free the compressed data - pop [final_buffer] - - DEBUGF 1, "deflated size=%u bytes\n", [final_size] - .no_deflate: - - invoke HTTP_free, [identifier] - mov [identifier], 0 - - ret -;--------------------------------------------------------------------- -save: - cmp [final_buffer], 0 - je still - - mcall 70, fileinfo - - DEBUGF 1, "File saved\n" - - test [silently], 0xff - jnz exit - - mov ecx, [sc.work_text] - or ecx, 0x80000000 - mcall 4, <10, frame_2.y+frame_2.height+7>, , download_complete - - jmp still -;--------------------------------------------------------------------- -copy_file_name_path: - xor eax,eax - cld -@@: - lodsb - stosb - test eax,eax - jnz @r - ret -;--------------------------------------------------------------------- -; ********************************************* -; ******* WINDOW DEFINITIONS AND DRAW ******** -; ********************************************* - -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, 370>, <350, 170>, , 0, title -;----------------------------------- -; draw frames - mov [frame_data.x],dword frame_1.x shl 16+frame_1.width - mov [frame_data.y],dword frame_1.y shl 16+frame_1.height - mov [frame_data.text_pointer],dword select_addr_text - mov eax,[sc.work] - mov [frame_data.font_backgr_color],eax - mov eax,[sc.work_text] - mov [frame_data.font_color],eax - - push dword frame_data - call [Frame_draw] -;----------------------------------- - mov [frame_data.x],dword frame_2.x shl 16+frame_2.width - mov [frame_data.y],dword frame_2.y shl 16+frame_2.height - mov [frame_data.text_pointer],dword select_path_text - - push dword frame_data - call [Frame_draw] -;----------------------------------- -; draw "url:" text - mov ecx, [sc.work_text] - or ecx, 80000000h - mcall 4, , , type_pls -;----------------------------------- -; draw editbox - edit_boxes_set_sys_color edit1, editboxes_end, sc - stdcall [edit_box_draw], edit1 -;----------------------------------- -; draw buttons - mcall 8,,,22,[sc.work_button] ; reload - mcall ,,, 24 ; stop - - mcall , ,,26 ; save -;----------------------------------- -; draw buttons text - mov ecx, [sc.work_button_text] - or ecx, 80000000h - mcall 4, , , button_text.1 - mcall , , , button_text.2 - mcall , , , button_text.3 - - mcall 13,,,0xffffff - push dword PathShow_data_1 - call [PathShow_draw] - - mcall 12, 2 ; end window redraw - - ret -;--------------------------------------------------------------------- -; Data area -;----------------------------------------------------------------------------- -align 4 -@IMPORT: - -library lib_http, 'http.obj', \ - box_lib, 'box_lib.obj', \ - proc_lib, 'proc_lib.obj', \ - archiver, 'archiver.obj' - -import lib_http, \ - HTTP_get, 'get' , \ - HTTP_receive, 'receive', \ - HTTP_find_header, 'find_header_field', \ - HTTP_free, 'free' - -import box_lib, \ - edit_box_draw, 'edit_box_draw', \ - edit_box_key, 'edit_box_key', \ - edit_box_mouse, 'edit_box_mouse', \ - PathShow_prepare, 'PathShow_prepare', \ - PathShow_draw, 'PathShow_draw', \ - Frame_draw, 'frame_draw' - -import proc_lib, \ - OpenDialog_Init, 'OpenDialog_init', \ - OpenDialog_Start, 'OpenDialog_start' - -import archiver,\ - deflate_unpack, 'deflate_unpack' -;--------------------------------------------------------------------- -fileinfo dd 2, 0, 0 -final_size dd 0 -final_buffer dd 0 - db 0 - dd fname_buf -;--------------------------------------------------------------------- - -mouse_dd dd 0 -edit1 edit_box 295, 48, (frame_1.y+10), 0xffffff, 0xff, 0x80ff, 0, 0x8000, URLMAXLEN, document_user, mouse_dd, ed_focus+ed_always_focus, 7, 7 -editboxes_end: - -;--------------------------------------------------------------------- - -include_debug_strings - -;--------------------------------------------------------------------- - -type_pls db 'URL:', 0 -button_text: -.1: db 'DOWNLOAD',0 -.2: db 'STOP',0 -.3: db 'SELECT', 0 -download_complete db 'FILE SAVED!', 0 -title db 'HTTP Downloader', 0 -silently db 0 - -sz_add_header db 'Accept-Encoding: deflate', 13, 10, 0 ; archiver.obj doesnt export unpack method for gzip yet :( -sz_content_enc db 'content-encoding', 0 - -;--------------------------------------------------------------------- -select_addr_text db ' NETWORK ADDRESS: ',0 -select_path_text db ' PATH TO SAVE FILE: ',0 -;--------------------------------------------------------------------- -frame_data: -.type dd 0 ;+0 -.x: -.x_size dw 0 ;+4 -.x_start dw 0 ;+6 -.y: -.y_size dw 0 ;+8 -.y_start dw 0 ;+10 -.ext_fr_col dd 0x0 ;+12 -.int_fr_col dd 0xffffff ;+16 -.draw_text_flag dd 1 ;+20 -.text_pointer dd 0 ;+24 -.text_position dd 0 ;+28 -.font_number dd 0 ;+32 -.font_size_y dd 9 ;+36 -.font_color dd 0x0 ;+40 -.font_backgr_color dd 0xffffff ;+44 -;--------------------------------------------------------------------- -PathShow_data_1: -.type dd 0 ;+0 -.start_y dw frame_2.y+14 ;+4 -.start_x dw frame_2.x+20 ;+6 -.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 -.area_size_x dw frame_2.width-35 ;+10 -.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable -.background_flag dd 0 ;+16 -.font_color dd 0 ;+20 -.background_color dd 0 ;+24 -.text_pointer dd fname_buf ;+28 -.work_area_pointer dd text_work_area ;+32 -.temp_text_length dd 0 ;+36 -;--------------------------------------------------------------------- -OpenDialog_data: -.type dd 1 ; Save -.procinfo dd procinfo ;+4 -.com_area_name dd communication_area_name ;+8 -.com_area dd 0 ;+12 -.opendir_path dd temp_dir_path ;+16 -.dir_default_path dd communication_area_default_path ;+20 -.start_path dd open_dialog_path ;+24 -.draw_window dd draw_window ;+28 -.status dd 0 ;+32 -.openfile_pach dd fname_buf ;+36 -.filename_area dd filename_area ;+40 -.filter_area dd Filter -.x: -.x_size dw 420 ;+48 ; Window X size -.x_start dw 200 ;+50 ; Window X position -.y: -.y_size dw 320 ;+52 ; Window y size -.y_start dw 120 ;+54 ; 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 Filter.end - Filter -.1: -db 'IMG',0 -db 'IMA',0 -.end: -db 0 - -start_temp_file_name: db 'some.garbage',0 - -start_file_path: db '/sys/.download', 0 -;--------------------------------------------------------------------- -document_user db 'http://' -;--------------------------------------------------------------------- -IM_END: -;--------------------------------------------------------------------- -params rb URLMAXLEN -;--------------------------------------------------------------------- - sc system_colors -;--------------------------------------------------------------------- -identifier dd ? -;--------------------------------------------------------------------- -filename_area: - rb 256 -;--------------------------------------------------------------------- -temp_dir_path: - rb 4096 -;--------------------------------------------------------------------- -procinfo: - rb 1024 -;--------------------------------------------------------------------- -fname_buf: - rb 4096 -;--------------------------------------------------------------------- -text_work_area: - rb 1024 -;--------------------------------------------------------------------- - rb 4096 -stacktop: -;--------------------------------------------------------------------- -I_END: -;--------------------------------------------------------------------- - - +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2009-2015. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; downloader.asm - HTTP client for KolibriOS ;; +;; ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +URLMAXLEN = 1024 +BUFFERSIZE = 4096 + +__DEBUG__ = 1 +__DEBUG_LEVEL__ = 1 + +format binary as "" +;-------------------------------------- +frame_1: + .x = 5 + .y = 10 + .width = 350 + .height = 55 +;-------------------------------------- +frame_2: + .x = 5 + .y = 75 + .width = 350 + .height = 55 +;--------------------------------------------------------------------- +use32 + org 0x0 + + db 'MENUET01' ; header + dd 0x01 ; header version + dd START ; entry point + dd IM_END ; image size + dd I_END ; required memory + dd stacktop ; esp + dd params ; I_PARAM + dd 0x0 ; I_Path +;--------------------------------------------------------------------- +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../dll.inc' +include '../../../../debug-fdo.inc' +include '../../box_lib/box_lib.mac' +include '../../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 exit +;--------------------------------------------------------------------- + mov edi,filename_area + mov esi,start_temp_file_name + call copy_file_name_path + + mov edi,fname_buf + mov esi,start_file_path + call copy_file_name_path + +;OpenDialog initialisation + push dword OpenDialog_data + call [OpenDialog_Init] + +; prepare for PathShow + push dword PathShow_data_1 + call [PathShow_prepare] +;--------------------------------------------------------------------- +; check parameters + cmp byte[params], 0 ; no parameters ? + je reset_events ; load the GUI + + inc [silently] + +download: + call download_1 + + test [silently], 0xff + jnz save + +reset_events: + DEBUGF 1, "resetting events\n" + +; Report events +; defaults + mouse + mcall 40,EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER +;--------------------------------------------------------------------- +redraw: + call draw_window + +still: +;; DEBUGF 1, "waiting for events\n" + + 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 still +;--------------------------------------------------------------------- +key: + mcall 2 ; read key + + stdcall [edit_box_key], dword edit1 + + cmp ax, 13 shl 8 + je download + + jmp still +;--------------------------------------------------------------------- +button: + + mcall 17 ; get id + + cmp ah, 26 + jne @f +; invoke OpenDialog + push dword OpenDialog_data + call [OpenDialog_Start] + cmp [OpenDialog_data.status],1 + jne still + +; prepare for PathShow + push dword PathShow_data_1 + call [PathShow_prepare] + call draw_window + jmp still +@@: + cmp ah, 1 ; button id=1 ? + je exit + + call download_1 + jmp save +;--------------------------------------------------------------------- +mouse: + stdcall [edit_box_mouse], edit1 + jmp still +;--------------------------------------------------------------------- +exit: + DEBUGF 1, "Exiting\n" + invoke HTTP_free, [identifier] ; free buffer +fail: + or eax, -1 ; close this program + mcall +;--------------------------------------------------------------------- +download_1: + DEBUGF 1, "Starting download\n" + + invoke HTTP_get, 0, 0, params, sz_add_header + test eax, eax + jz fail + mov [identifier], eax + + .loop: + invoke HTTP_receive, [identifier] + test eax, eax + jnz .loop + + mov eax, [identifier] + mov ebx, [eax + http_msg.content_length] + mov [final_size], ebx + mov ebx, [eax + http_msg.content_ptr] + mov [final_buffer], ebx + + invoke HTTP_find_header, [identifier], sz_content_enc + test eax, eax + jz .no_deflate + +; TODO: check if parameter equals "deflate" + + DEBUGF 1, "deflating\n" + + lea eax, [final_size] + invoke deflate_unpack, [final_buffer], eax + push eax + mcall 68, 13, [final_buffer] ; Free the compressed data + pop [final_buffer] + + DEBUGF 1, "deflated size=%u bytes\n", [final_size] + .no_deflate: + + invoke HTTP_free, [identifier] + mov [identifier], 0 + + ret +;--------------------------------------------------------------------- +save: + cmp [final_buffer], 0 + je still + + mcall 70, fileinfo + + DEBUGF 1, "File saved\n" + + test [silently], 0xff + jnz exit + + mov ecx, [sc.work_text] + or ecx, 0x80000000 + mcall 4, <10, frame_2.y+frame_2.height+7>, , download_complete + + jmp still +;--------------------------------------------------------------------- +copy_file_name_path: + xor eax,eax + cld +@@: + lodsb + stosb + test eax,eax + jnz @r + ret +;--------------------------------------------------------------------- +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ******** +; ********************************************* + +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, 370>, <350, 170>, , 0, title +;----------------------------------- +; draw frames + mov [frame_data.x],dword frame_1.x shl 16+frame_1.width + mov [frame_data.y],dword frame_1.y shl 16+frame_1.height + mov [frame_data.text_pointer],dword select_addr_text + mov eax,[sc.work] + mov [frame_data.font_backgr_color],eax + mov eax,[sc.work_text] + mov [frame_data.font_color],eax + + push dword frame_data + call [Frame_draw] +;----------------------------------- + mov [frame_data.x],dword frame_2.x shl 16+frame_2.width + mov [frame_data.y],dword frame_2.y shl 16+frame_2.height + mov [frame_data.text_pointer],dword select_path_text + + push dword frame_data + call [Frame_draw] +;----------------------------------- +; draw "url:" text + mov ecx, [sc.work_text] + or ecx, 80000000h + mcall 4, , , type_pls +;----------------------------------- +; draw editbox + edit_boxes_set_sys_color edit1, editboxes_end, sc + stdcall [edit_box_draw], edit1 +;----------------------------------- +; draw buttons + mcall 8,,,22,[sc.work_button] ; reload + mcall ,,, 24 ; stop + + mcall , ,,26 ; save +;----------------------------------- +; draw buttons text + mov ecx, [sc.work_button_text] + or ecx, 80000000h + mcall 4, , , button_text.1 + mcall , , , button_text.2 + mcall , , , button_text.3 + + mcall 13,,,0xffffff + push dword PathShow_data_1 + call [PathShow_draw] + + mcall 12, 2 ; end window redraw + + ret +;--------------------------------------------------------------------- +; Data area +;----------------------------------------------------------------------------- +align 4 +@IMPORT: + +library lib_http, 'http.obj', \ + box_lib, 'box_lib.obj', \ + proc_lib, 'proc_lib.obj', \ + archiver, 'archiver.obj' + +import lib_http, \ + HTTP_get, 'get' , \ + HTTP_receive, 'receive', \ + HTTP_find_header, 'find_header_field', \ + HTTP_free, 'free' + +import box_lib, \ + edit_box_draw, 'edit_box_draw', \ + edit_box_key, 'edit_box_key', \ + edit_box_mouse, 'edit_box_mouse', \ + PathShow_prepare, 'PathShow_prepare', \ + PathShow_draw, 'PathShow_draw', \ + Frame_draw, 'frame_draw' + +import proc_lib, \ + OpenDialog_Init, 'OpenDialog_init', \ + OpenDialog_Start, 'OpenDialog_start' + +import archiver,\ + deflate_unpack, 'deflate_unpack' +;--------------------------------------------------------------------- +fileinfo dd 2, 0, 0 +final_size dd 0 +final_buffer dd 0 + db 0 + dd fname_buf +;--------------------------------------------------------------------- + +mouse_dd dd 0 +edit1 edit_box 295, 48, (frame_1.y+10), 0xffffff, 0xff, 0x80ff, 0, 0x8000, URLMAXLEN, document_user, mouse_dd, ed_focus+ed_always_focus, 7, 7 +editboxes_end: + +;--------------------------------------------------------------------- + +include_debug_strings + +;--------------------------------------------------------------------- + +type_pls db 'URL:', 0 +button_text: +.1: db 'DOWNLOAD',0 +.2: db 'STOP',0 +.3: db 'SELECT', 0 +download_complete db 'FILE SAVED!', 0 +title db 'HTTP Downloader', 0 +silently db 0 + +sz_add_header db 'Accept-Encoding: deflate', 13, 10, 0 ; archiver.obj doesnt export unpack method for gzip yet :( +sz_content_enc db 'content-encoding', 0 + +;--------------------------------------------------------------------- +select_addr_text db ' NETWORK ADDRESS: ',0 +select_path_text db ' PATH TO SAVE FILE: ',0 +;--------------------------------------------------------------------- +frame_data: +.type dd 0 ;+0 +.x: +.x_size dw 0 ;+4 +.x_start dw 0 ;+6 +.y: +.y_size dw 0 ;+8 +.y_start dw 0 ;+10 +.ext_fr_col dd 0x0 ;+12 +.int_fr_col dd 0xffffff ;+16 +.draw_text_flag dd 1 ;+20 +.text_pointer dd 0 ;+24 +.text_position dd 0 ;+28 +.font_number dd 0 ;+32 +.font_size_y dd 9 ;+36 +.font_color dd 0x0 ;+40 +.font_backgr_color dd 0xffffff ;+44 +;--------------------------------------------------------------------- +PathShow_data_1: +.type dd 0 ;+0 +.start_y dw frame_2.y+14 ;+4 +.start_x dw frame_2.x+20 ;+6 +.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 +.area_size_x dw frame_2.width-35 ;+10 +.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable +.background_flag dd 0 ;+16 +.font_color dd 0 ;+20 +.background_color dd 0 ;+24 +.text_pointer dd fname_buf ;+28 +.work_area_pointer dd text_work_area ;+32 +.temp_text_length dd 0 ;+36 +;--------------------------------------------------------------------- +OpenDialog_data: +.type dd 1 ; Save +.procinfo dd procinfo ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_path dd temp_dir_path ;+16 +.dir_default_path dd communication_area_default_path ;+20 +.start_path dd open_dialog_path ;+24 +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_pach dd fname_buf ;+36 +.filename_area dd filename_area ;+40 +.filter_area dd Filter +.x: +.x_size dw 420 ;+48 ; Window X size +.x_start dw 200 ;+50 ; Window X position +.y: +.y_size dw 320 ;+52 ; Window y size +.y_start dw 120 ;+54 ; 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 Filter.end - Filter +.1: +db 'IMG',0 +db 'IMA',0 +.end: +db 0 + +start_temp_file_name: db 'some.garbage',0 + +start_file_path: db '/sys/.download', 0 +;--------------------------------------------------------------------- +document_user db 'http://' +;--------------------------------------------------------------------- +IM_END: +;--------------------------------------------------------------------- +params rb URLMAXLEN +;--------------------------------------------------------------------- + sc system_colors +;--------------------------------------------------------------------- +identifier dd ? +;--------------------------------------------------------------------- +filename_area: + rb 256 +;--------------------------------------------------------------------- +temp_dir_path: + rb 4096 +;--------------------------------------------------------------------- +procinfo: + rb 1024 +;--------------------------------------------------------------------- +fname_buf: + rb 4096 +;--------------------------------------------------------------------- +text_work_area: + rb 1024 +;--------------------------------------------------------------------- + rb 4096 +stacktop: +;--------------------------------------------------------------------- +I_END: +;--------------------------------------------------------------------- diff --git a/programs/develop/libraries/http/examples/get.asm b/programs/develop/libraries/http/examples/get.asm index 5bb614192..aa849d9fc 100644 --- a/programs/develop/libraries/http/examples/get.asm +++ b/programs/develop/libraries/http/examples/get.asm @@ -1,434 +1,432 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2009-2015. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;; downloader.asm - HTTP client for KolibriOS ;; -;; ;; -;; ;; -;; GNU GENERAL PUBLIC LICENSE ;; -;; Version 2, June 1991 ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -URLMAXLEN = 1024 -BUFFERSIZE = 4096 - -__DEBUG__ = 1 -__DEBUG_LEVEL__ = 1 - -format binary as "" -;-------------------------------------- -frame_1: - .x = 5 - .y = 10 - .width = 350 - .height = 55 -;-------------------------------------- -frame_2: - .x = 5 - .y = 75 - .width = 350 - .height = 55 -;--------------------------------------------------------------------- -use32 - org 0x0 - - db 'MENUET01' ; header - dd 0x01 ; header version - dd START ; entry point - dd IM_END ; image size - dd I_END ; required memory - dd stacktop ; esp - dd params ; I_PARAM - dd 0x0 ; I_Path -;--------------------------------------------------------------------- -include '../../../../macros.inc' -include '../../../../proc32.inc' -include '../../../../dll.inc' -include '../../../../debug-fdo.inc' -include '../../box_lib/trunk/box_lib.mac' -include '../../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 exit -;--------------------------------------------------------------------- - mov edi,filename_area - mov esi,start_temp_file_name - call copy_file_name_path - - mov edi,fname_buf - mov esi,start_file_path - call copy_file_name_path - -;OpenDialog initialisation - push dword OpenDialog_data - call [OpenDialog_Init] - -; prepare for PathShow - push dword PathShow_data_1 - call [PathShow_prepare] -;--------------------------------------------------------------------- -; check parameters - cmp byte[params], 0 ; no parameters ? - je reset_events ; load the GUI - - inc [silently] - -download: - call download_1 - - test [silently], 0xff - jnz save - -reset_events: - DEBUGF 1, "resetting events\n" - -; Report events -; defaults + mouse - mcall 40,EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER -;--------------------------------------------------------------------- -redraw: - call draw_window - -still: -;; DEBUGF 1, "waiting for events\n" - - 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 still -;--------------------------------------------------------------------- -key: - mcall 2 ; read key - - stdcall [edit_box_key], dword edit1 - - cmp ax, 13 shl 8 - je download - - jmp still -;--------------------------------------------------------------------- -button: - - mcall 17 ; get id - - cmp ah, 26 - jne @f -; invoke OpenDialog - push dword OpenDialog_data - call [OpenDialog_Start] - cmp [OpenDialog_data.status],1 - jne still - -; prepare for PathShow - push dword PathShow_data_1 - call [PathShow_prepare] - call draw_window - jmp still -@@: - cmp ah, 1 ; button id=1 ? - je exit - - call download_1 - jmp save -;--------------------------------------------------------------------- -mouse: - stdcall [edit_box_mouse], edit1 - jmp still -;--------------------------------------------------------------------- -exit: - DEBUGF 1, "Exiting\n" - invoke HTTP_free, [identifier] ; free buffer -fail: - or eax, -1 ; close this program - mcall -;--------------------------------------------------------------------- -download_1: - DEBUGF 1, "Starting download\n" - - invoke HTTP_get, document_user, 0, params, 0 - test eax, eax - jz fail - mov [identifier], eax - - .loop: - invoke HTTP_receive, [identifier] - test eax, eax - jnz .loop - ret -;--------------------------------------------------------------------- -save: - mov ebp, [identifier] - mov eax, [ebp + http_msg.content_received] - mov [final_size], eax - mov ebx, [ebp + http_msg.content_ptr] - mov [final_buffer], ebx - mcall 70, fileinfo - - DEBUGF 1, "File saved\n" - - test [silently], 0xff - jnz exit - - mov ecx, [sc.work_text] - or ecx, 0x80000000 - mcall 4, <10, frame_2.y+frame_2.height+7>, , download_complete - - jmp still -;--------------------------------------------------------------------- -copy_file_name_path: - xor eax,eax - cld -@@: - lodsb - stosb - test eax,eax - jnz @r - ret -;--------------------------------------------------------------------- -; ********************************************* -; ******* WINDOW DEFINITIONS AND DRAW ******** -; ********************************************* - -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, 370>, <350, 170>, , 0, title -;----------------------------------- -; draw frames - mov [frame_data.x],dword frame_1.x shl 16+frame_1.width - mov [frame_data.y],dword frame_1.y shl 16+frame_1.height - mov [frame_data.text_pointer],dword select_addr_text - mov eax,[sc.work] - mov [frame_data.font_backgr_color],eax - mov eax,[sc.work_text] - mov [frame_data.font_color],eax - - push dword frame_data - call [Frame_draw] -;----------------------------------- - mov [frame_data.x],dword frame_2.x shl 16+frame_2.width - mov [frame_data.y],dword frame_2.y shl 16+frame_2.height - mov [frame_data.text_pointer],dword select_path_text - - push dword frame_data - call [Frame_draw] -;----------------------------------- -; draw "url:" text - mov ecx, [sc.work_text] - or ecx, 80000000h - mcall 4, , , type_pls -;----------------------------------- -; draw editbox - edit_boxes_set_sys_color edit1, editboxes_end, sc - stdcall [edit_box_draw], edit1 -;----------------------------------- -; draw buttons - mcall 8,,,22,[sc.work_button] ; reload - mcall ,,, 24 ; stop - - mcall , ,,26 ; save -;----------------------------------- -; draw buttons text - mov ecx, [sc.work_button_text] - or ecx, 80000000h - mcall 4, , , button_text.1 - mcall , , , button_text.2 - mcall , , , button_text.3 - - mcall 13,,,0xffffff - push dword PathShow_data_1 - call [PathShow_draw] - - mcall 12, 2 ; end window redraw - - 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', \ - PathShow_prepare, 'PathShow_prepare', \ - PathShow_draw, 'PathShow_draw', \ - Frame_draw, 'frame_draw' - -import proc_lib, \ - OpenDialog_Init, 'OpenDialog_init', \ - OpenDialog_Start, 'OpenDialog_start' -;--------------------------------------------------------------------- -fileinfo dd 2, 0, 0 -final_size dd 0 -final_buffer dd 0 - db 0 - dd fname_buf -;--------------------------------------------------------------------- - -mouse_dd dd 0 -edit1 edit_box 295, 48, (frame_1.y+10), 0xffffff, 0xff, 0x80ff, 0, 0x8000, URLMAXLEN, document_user, mouse_dd, ed_focus+ed_always_focus, 7, 7 -editboxes_end: - -;--------------------------------------------------------------------- - -include_debug_strings - -;--------------------------------------------------------------------- - -type_pls db 'URL:', 0 -button_text: -.1: db 'DOWNLOAD',0 -.2: db 'STOP',0 -.3: db 'SELECT', 0 -download_complete db 'FILE SAVED!', 0 -title db 'HTTP Downloader', 0 -silently db 0 - -;--------------------------------------------------------------------- -select_addr_text db ' NETWORK ADDRESS: ',0 -select_path_text db ' PATH TO SAVE FILE: ',0 -;--------------------------------------------------------------------- -frame_data: -.type dd 0 ;+0 -.x: -.x_size dw 0 ;+4 -.x_start dw 0 ;+6 -.y: -.y_size dw 0 ;+8 -.y_start dw 0 ;+10 -.ext_fr_col dd 0x0 ;+12 -.int_fr_col dd 0xffffff ;+16 -.draw_text_flag dd 1 ;+20 -.text_pointer dd 0 ;+24 -.text_position dd 0 ;+28 -.font_number dd 0 ;+32 -.font_size_y dd 9 ;+36 -.font_color dd 0x0 ;+40 -.font_backgr_color dd 0xffffff ;+44 -;--------------------------------------------------------------------- -PathShow_data_1: -.type dd 0 ;+0 -.start_y dw frame_2.y+14 ;+4 -.start_x dw frame_2.x+20 ;+6 -.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 -.area_size_x dw frame_2.width-35 ;+10 -.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable -.background_flag dd 0 ;+16 -.font_color dd 0 ;+20 -.background_color dd 0 ;+24 -.text_pointer dd fname_buf ;+28 -.work_area_pointer dd text_work_area ;+32 -.temp_text_length dd 0 ;+36 -;--------------------------------------------------------------------- -OpenDialog_data: -.type dd 1 ; Save -.procinfo dd procinfo ;+4 -.com_area_name dd communication_area_name ;+8 -.com_area dd 0 ;+12 -.opendir_path dd temp_dir_path ;+16 -.dir_default_path dd communication_area_default_path ;+20 -.start_path dd open_dialog_path ;+24 -.draw_window dd draw_window ;+28 -.status dd 0 ;+32 -.openfile_pach dd fname_buf ;+36 -.filename_area dd filename_area ;+40 -.filter_area dd Filter -.x: -.x_size dw 420 ;+48 ; Window X size -.x_start dw 200 ;+50 ; Window X position -.y: -.y_size dw 320 ;+52 ; Window y size -.y_start dw 120 ;+54 ; 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 Filter.end - Filter -.1: -db 'IMG',0 -db 'IMA',0 -.end: -db 0 - -start_temp_file_name: db 'some.garbage',0 - -start_file_path: db '/sys/.download', 0 -;--------------------------------------------------------------------- -document_user db 'http://' -;--------------------------------------------------------------------- -IM_END: -;--------------------------------------------------------------------- -params rb URLMAXLEN -;--------------------------------------------------------------------- - sc system_colors -;--------------------------------------------------------------------- -identifier dd ? -;--------------------------------------------------------------------- -filename_area: - rb 256 -;--------------------------------------------------------------------- -temp_dir_path: - rb 4096 -;--------------------------------------------------------------------- -procinfo: - rb 1024 -;--------------------------------------------------------------------- -fname_buf: - rb 4096 -;--------------------------------------------------------------------- -text_work_area: - rb 1024 -;--------------------------------------------------------------------- - rb 4096 -stacktop: -;--------------------------------------------------------------------- -I_END: -;--------------------------------------------------------------------- - - +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2009-2015. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; downloader.asm - HTTP client for KolibriOS ;; +;; ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +URLMAXLEN = 1024 +BUFFERSIZE = 4096 + +__DEBUG__ = 1 +__DEBUG_LEVEL__ = 1 + +format binary as "" +;-------------------------------------- +frame_1: + .x = 5 + .y = 10 + .width = 350 + .height = 55 +;-------------------------------------- +frame_2: + .x = 5 + .y = 75 + .width = 350 + .height = 55 +;--------------------------------------------------------------------- +use32 + org 0x0 + + db 'MENUET01' ; header + dd 0x01 ; header version + dd START ; entry point + dd IM_END ; image size + dd I_END ; required memory + dd stacktop ; esp + dd params ; I_PARAM + dd 0x0 ; I_Path +;--------------------------------------------------------------------- +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../dll.inc' +include '../../../../debug-fdo.inc' +include '../../box_lib/box_lib.mac' +include '../../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 exit +;--------------------------------------------------------------------- + mov edi,filename_area + mov esi,start_temp_file_name + call copy_file_name_path + + mov edi,fname_buf + mov esi,start_file_path + call copy_file_name_path + +;OpenDialog initialisation + push dword OpenDialog_data + call [OpenDialog_Init] + +; prepare for PathShow + push dword PathShow_data_1 + call [PathShow_prepare] +;--------------------------------------------------------------------- +; check parameters + cmp byte[params], 0 ; no parameters ? + je reset_events ; load the GUI + + inc [silently] + +download: + call download_1 + + test [silently], 0xff + jnz save + +reset_events: + DEBUGF 1, "resetting events\n" + +; Report events +; defaults + mouse + mcall 40,EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER +;--------------------------------------------------------------------- +redraw: + call draw_window + +still: +;; DEBUGF 1, "waiting for events\n" + + 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 still +;--------------------------------------------------------------------- +key: + mcall 2 ; read key + + stdcall [edit_box_key], dword edit1 + + cmp ax, 13 shl 8 + je download + + jmp still +;--------------------------------------------------------------------- +button: + + mcall 17 ; get id + + cmp ah, 26 + jne @f +; invoke OpenDialog + push dword OpenDialog_data + call [OpenDialog_Start] + cmp [OpenDialog_data.status],1 + jne still + +; prepare for PathShow + push dword PathShow_data_1 + call [PathShow_prepare] + call draw_window + jmp still +@@: + cmp ah, 1 ; button id=1 ? + je exit + + call download_1 + jmp save +;--------------------------------------------------------------------- +mouse: + stdcall [edit_box_mouse], edit1 + jmp still +;--------------------------------------------------------------------- +exit: + DEBUGF 1, "Exiting\n" + invoke HTTP_free, [identifier] ; free buffer +fail: + or eax, -1 ; close this program + mcall +;--------------------------------------------------------------------- +download_1: + DEBUGF 1, "Starting download\n" + + invoke HTTP_get, document_user, 0, params, 0 + test eax, eax + jz fail + mov [identifier], eax + + .loop: + invoke HTTP_receive, [identifier] + test eax, eax + jnz .loop + ret +;--------------------------------------------------------------------- +save: + mov ebp, [identifier] + mov eax, [ebp + http_msg.content_received] + mov [final_size], eax + mov ebx, [ebp + http_msg.content_ptr] + mov [final_buffer], ebx + mcall 70, fileinfo + + DEBUGF 1, "File saved\n" + + test [silently], 0xff + jnz exit + + mov ecx, [sc.work_text] + or ecx, 0x80000000 + mcall 4, <10, frame_2.y+frame_2.height+7>, , download_complete + + jmp still +;--------------------------------------------------------------------- +copy_file_name_path: + xor eax,eax + cld +@@: + lodsb + stosb + test eax,eax + jnz @r + ret +;--------------------------------------------------------------------- +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ******** +; ********************************************* + +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, 370>, <350, 170>, , 0, title +;----------------------------------- +; draw frames + mov [frame_data.x],dword frame_1.x shl 16+frame_1.width + mov [frame_data.y],dword frame_1.y shl 16+frame_1.height + mov [frame_data.text_pointer],dword select_addr_text + mov eax,[sc.work] + mov [frame_data.font_backgr_color],eax + mov eax,[sc.work_text] + mov [frame_data.font_color],eax + + push dword frame_data + call [Frame_draw] +;----------------------------------- + mov [frame_data.x],dword frame_2.x shl 16+frame_2.width + mov [frame_data.y],dword frame_2.y shl 16+frame_2.height + mov [frame_data.text_pointer],dword select_path_text + + push dword frame_data + call [Frame_draw] +;----------------------------------- +; draw "url:" text + mov ecx, [sc.work_text] + or ecx, 80000000h + mcall 4, , , type_pls +;----------------------------------- +; draw editbox + edit_boxes_set_sys_color edit1, editboxes_end, sc + stdcall [edit_box_draw], edit1 +;----------------------------------- +; draw buttons + mcall 8,,,22,[sc.work_button] ; reload + mcall ,,, 24 ; stop + + mcall , ,,26 ; save +;----------------------------------- +; draw buttons text + mov ecx, [sc.work_button_text] + or ecx, 80000000h + mcall 4, , , button_text.1 + mcall , , , button_text.2 + mcall , , , button_text.3 + + mcall 13,,,0xffffff + push dword PathShow_data_1 + call [PathShow_draw] + + mcall 12, 2 ; end window redraw + + 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', \ + PathShow_prepare, 'PathShow_prepare', \ + PathShow_draw, 'PathShow_draw', \ + Frame_draw, 'frame_draw' + +import proc_lib, \ + OpenDialog_Init, 'OpenDialog_init', \ + OpenDialog_Start, 'OpenDialog_start' +;--------------------------------------------------------------------- +fileinfo dd 2, 0, 0 +final_size dd 0 +final_buffer dd 0 + db 0 + dd fname_buf +;--------------------------------------------------------------------- + +mouse_dd dd 0 +edit1 edit_box 295, 48, (frame_1.y+10), 0xffffff, 0xff, 0x80ff, 0, 0x8000, URLMAXLEN, document_user, mouse_dd, ed_focus+ed_always_focus, 7, 7 +editboxes_end: + +;--------------------------------------------------------------------- + +include_debug_strings + +;--------------------------------------------------------------------- + +type_pls db 'URL:', 0 +button_text: +.1: db 'DOWNLOAD',0 +.2: db 'STOP',0 +.3: db 'SELECT', 0 +download_complete db 'FILE SAVED!', 0 +title db 'HTTP Downloader', 0 +silently db 0 + +;--------------------------------------------------------------------- +select_addr_text db ' NETWORK ADDRESS: ',0 +select_path_text db ' PATH TO SAVE FILE: ',0 +;--------------------------------------------------------------------- +frame_data: +.type dd 0 ;+0 +.x: +.x_size dw 0 ;+4 +.x_start dw 0 ;+6 +.y: +.y_size dw 0 ;+8 +.y_start dw 0 ;+10 +.ext_fr_col dd 0x0 ;+12 +.int_fr_col dd 0xffffff ;+16 +.draw_text_flag dd 1 ;+20 +.text_pointer dd 0 ;+24 +.text_position dd 0 ;+28 +.font_number dd 0 ;+32 +.font_size_y dd 9 ;+36 +.font_color dd 0x0 ;+40 +.font_backgr_color dd 0xffffff ;+44 +;--------------------------------------------------------------------- +PathShow_data_1: +.type dd 0 ;+0 +.start_y dw frame_2.y+14 ;+4 +.start_x dw frame_2.x+20 ;+6 +.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 +.area_size_x dw frame_2.width-35 ;+10 +.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable +.background_flag dd 0 ;+16 +.font_color dd 0 ;+20 +.background_color dd 0 ;+24 +.text_pointer dd fname_buf ;+28 +.work_area_pointer dd text_work_area ;+32 +.temp_text_length dd 0 ;+36 +;--------------------------------------------------------------------- +OpenDialog_data: +.type dd 1 ; Save +.procinfo dd procinfo ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_path dd temp_dir_path ;+16 +.dir_default_path dd communication_area_default_path ;+20 +.start_path dd open_dialog_path ;+24 +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_pach dd fname_buf ;+36 +.filename_area dd filename_area ;+40 +.filter_area dd Filter +.x: +.x_size dw 420 ;+48 ; Window X size +.x_start dw 200 ;+50 ; Window X position +.y: +.y_size dw 320 ;+52 ; Window y size +.y_start dw 120 ;+54 ; 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 Filter.end - Filter +.1: +db 'IMG',0 +db 'IMA',0 +.end: +db 0 + +start_temp_file_name: db 'some.garbage',0 + +start_file_path: db '/sys/.download', 0 +;--------------------------------------------------------------------- +document_user db 'http://' +;--------------------------------------------------------------------- +IM_END: +;--------------------------------------------------------------------- +params rb URLMAXLEN +;--------------------------------------------------------------------- + sc system_colors +;--------------------------------------------------------------------- +identifier dd ? +;--------------------------------------------------------------------- +filename_area: + rb 256 +;--------------------------------------------------------------------- +temp_dir_path: + rb 4096 +;--------------------------------------------------------------------- +procinfo: + rb 1024 +;--------------------------------------------------------------------- +fname_buf: + rb 4096 +;--------------------------------------------------------------------- +text_work_area: + rb 1024 +;--------------------------------------------------------------------- + rb 4096 +stacktop: +;--------------------------------------------------------------------- +I_END: +;--------------------------------------------------------------------- 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 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_open_dialog',0 ; FFFFFFFF = PID -; -; communication area data -; flag ; +0 -; dw 0 ; 0 - empty, 1 - file for open, 2 -folder for open, -; 3 - cancel, 4 - path=name of area 6822. -; -; type of dialog: 0-Open, 1-Save, 2-Dir -; 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 -; -; OpenDialog WINDOW SLOT ; +12 -; dd 0 -; -; file_path ; +16 -; rb 3824 ; path to file -; -; file name ; +3840 -; rb 256 -; -; filtration flag ; +4096 -; dd 0 ; flag 0 - no filtration, 1 - filtering -; -; area for storage of filtering values ; +4100 -; rb 4092 -;--------------------------------------------------------------------- - use32 - org 0x0 - - db 'MENUET01' - dd 0x01 - dd START - dd IM_END - dd I_END - dd stacktop - dd param - dd path - -include '../../macros.inc' -;define __DEBUG__ 1 -;define __DEBUG_LEVEL__ 1 -;include '../../debug-fdo.inc' -include '../../KOSfuncs.inc' -include '../../load_lib.mac' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' -;include 'macros.inc' -;include 'load_lib.mac' -;include 'box_lib.mac' -@use_library - -x_minimal_size equ 350 -y_minimal_size equ 250 -;--------------------------------------------------------------------- -;--------------------------------------------------------------------- -START: - mcall 68,11 - mcall 66,1,1 - mcall 40,0x27 - call get_communication_area - - call get_active_pocess - -load_libraries l_libs_start,end_l_libs - test eax,eax - jnz button.exit -; initialize sort - push dword 1 - call dword [sort_init] -; unpack deflate - mov eax,[unpack_DeflateUnpack2] - mov [deflate_unpack],eax - - mov esi,start_pach - mov edi,previous_dir_path - call copy_dir_name.1 - - call load_root_directory - call load_start_directory - call sort_directory - call load_icons - call convert_icons - call load_ini - call calc_ini - jmp red_1 -;--------------------------------------------------------------------- -red: - call control_minimal_window_size -red_1: - 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 -;--------------------------------------------------------------------- -control_minimal_window_size: - pusha - call get_window_param - test [window_status],10b - jnz .end ;red_1 - test [window_status],100b - jnz .end ;red_1 - test [window_status],1b - jnz .end ;red_1 - mov esi,-1 - mov eax,procinfo - mov eax,[eax+46] - cmp eax,dword y_minimal_size ;200 - jae @f - mov esi,dword y_minimal_size ;200 - mcall 67,-1,ebx,ebx -@@: - mov edx,-1 - mov eax,procinfo - mov eax,[eax+42] - cmp eax,dword x_minimal_size ;300 - jae @f - mov edx,dword x_minimal_size ;300 - mcall 67,-1,ebx,,ebx -@@: -.end: - popa - ret -;--------------------------------------------------------------------- -key: - mov al,[focus_pointer] - test al,al - jne key_ASCII - mcall 2 - xor ebx,ebx - cmp [extended_key],1 - je .extended_key - test al,al - jnz still - cmp ah,0xE0 - jne @f - mov [extended_key],1 - jmp still -@@: - cmp ah,72 ; arrow up - je .2 - cmp ah,80 ; arrow down - je .1 - cmp ah,28 ; Enter - je .7 - cmp ah,1 ; Esc - je button.exit - cmp ah,14 ; Backspace - je button.exit_dir - cmp ah,187 ; F1 - je select_disk - cmp ah,188 ; F2 - je select_sort - cmp ah,189 ; F3 - je select_filter - cmp ah,19 ; R - je button.reload_dir - cmp ah,42 - je key_shift_up - cmp ah,54 - je key_shift_up - cmp ah,170 - je key_shift_down - cmp ah,182 - je key_shift_down - cmp ah,29 - je key_ctrl_up - cmp ah,157 - je key_ctrl_down - cmp ah,56 - je key_alt_up - cmp ah,184 - je key_alt_down - cmp ah,206 ; NumPad+ Up - je NumPad_plus_Up - cmp ah,202 ; NumPad- Up - je NumPad_minus_Up - cmp ah,183 ; NumPad* Up - je NumPad_invert_Up - cmp ah,158 - je symbol_a_up - cmp ah,15 ; Tab down - je change_focus_area_press_Tab_key - cmp ah,143 ; Tab up - je change_focus_area_check_Tab_key -; compare for "1,2,3,4,5,6,7,8,9,0,(-),(=)" - cmp ah,2 - jb still - cmp ah,13 - jbe .12 -; compare for "q,w,e,r,t,y,u,i,o,p,([),(])" - cmp ah,16 - jb still - cmp ah,27 - jbe .12 -; compare for "a,s,d,f,g,h,j,k,l,(;),('),(`)" - cmp ah,30 - jb still - cmp ah,41 - jbe .12 -; compare for "(\),z,x,c,v,b,n,m,(,),(.),(/)" - cmp ah,43 - jb still - cmp ah,53 - jbe .12 - jmp still -.extended_key: - mov [extended_key],0 - cmp ah,80 ; arrow down - je .1 - cmp ah,72 ; arrow up - je .2 - cmp ah,81 ; PageDown - je .3 - cmp ah,73 ; PageUp - je .4 - cmp ah,71 ; Home - je .5 - cmp ah,79 ; End - je .6 - cmp ah,28 ; Enter - je .7 - cmp ah,82 ; Insert - je .8 - - cmp ah,29 - je key_ctrl_up - cmp ah,157 - je key_ctrl_down - cmp ah,56 - je key_alt_up - cmp ah,184 - je key_alt_down - jmp still -;--------------------------------- -.12: - inc ebx ; 12 - Search with key -;--------------------------------- -.11: - inc ebx ; 11 - Invert Mark -;--------------------------------- -.10: - inc ebx ; 10 - Unmark All -;--------------------------------- -.9: - inc ebx ; 9 - Mark All -;--------------------------------- -.8: - inc ebx ; 8 - Insert (Mark) -;--------------------------------- -.7: - inc ebx ; 7 - Enter -;--------------------------------- -.6: - inc ebx ; 6 - End -;--------------------------------- -.5: - inc ebx ; 5 - Home -;--------------------------------- -.4: - inc ebx ; 4 - PageUp -;--------------------------------- -.3: - inc ebx ; 3 - PageDown -;--------------------------------- -.2: - inc ebx ; 2 - arrow up -;--------------------------------- -.1: - inc ebx ; 1 - arrow down -;--------------------------------- - call .key_action - -; movzx ecx,word [file_browser_data_1.start_draw_cursor_line] -; mcall 47,0x80000,,<50,0>,0x40000000,0xffffff -; movzx ecx,word [file_browser_data_1.size_y] -; mcall 47,0x80000,,<150,0>,0x40000000,0xffffff - - mov eax,file_browser_data_1.mouse_keys_delta - cmp [eax],dword 3 - jne still - xor ebx,ebx - mov [eax],ebx - call load_next_dir - jmp still -;------------------------------------------------------- -.key_action: - mov [file_browser_data_1.key_action],bx - shr ax,8 - mov [file_browser_data_1.key_action_num],ax - - push dword file_browser_data_1 - call [FileBrowser_key] - - call draw_open_button_label - - cmp [file_browser_data_1.draw_scroll_bar],0 - je @f - call draw_scrollbar1 - mov [file_browser_data_1.draw_scroll_bar],0 -@@: - ret -;--------------------------------------------------------------------- -change_focus_area_Tab_key_ASCII: - xor eax,eax - inc eax - mov [Tab_key_block],al - jmp change_focus_area -;--------------------------------------------------------------------- -change_focus_area_press_Tab_key: - cmp [open_dialog_type],1 - jne still - mov al,[Tab_key_block] - test al,al - jnz still - xor eax,eax - inc eax - mov [Tab_key],al - jmp still -;--------------------------------------------------------------------- -change_focus_area_check_Tab_key: - cmp [open_dialog_type],1 - jne still - xor eax,eax - mov [Tab_key_block],al - mov al,[Tab_key] - test al,al - jz still - xor eax,eax - mov [Tab_key],al -;--------------------------------------------------------------------- -change_focus_area: - mov al,[focus_pointer] - inc al - and al,1 - mov [focus_pointer],al -.1: - mov edi,edit1 - test al,al - jne @f - mov [file_browser_data_1.select_panel_counter],1 - and [edi+44],dword 0xFFFFFFFD ; ed_focus - mov [edi+12],dword 0xffffff ; color white - call draw_draw_file_browser1 - mcall 66,1,1 - jmp still -@@: - mov [file_browser_data_1.select_panel_counter],0 - or [edi+44],dword ed_focus - mov [edi+12],dword 0xffffb0 ; color yellow - call draw_draw_file_browser1 - mcall 66,1,0 - jmp still -;--------------------------------------------------------------------- -key_ASCII: - mcall 2 - cmp ah,9 - je change_focus_area_Tab_key_ASCII - cmp ah,13 - je .13 - cmp ah,27 - je button.exit - push dword name_editboxes - call [edit_box_key] - jmp still -.13: -; cmp [open_dialog_type],2 ; Select dir -; je file_no_folder -; cmp [open_dialog_type],1 ; Save file -; jne user_selected_name_action ; load_dir -; inc [open_dialog_type] - jmp file_no_folder -;.load_dir: -; mov [file_browser_data_1.select_panel_counter],1 -; xor eax,eax -; mov [focus_pointer],al -; mcall 66,1,1 - -; xor eax,eax -; mov esi,dir_path -; cld -;@@: -; lodsb -; test al,al -; jne @r -; sub esi,2 -; cmp [esi],byte '/' -; jne @f -; xor eax,eax -; mov [esi],al -;@@: -; call load_next_dir.1 -; jmp still -;--------------------------------------------------------------------- -user_selected_name_action: - mov eax,[communication_area] - test eax,eax - jnz @f - call control_minimal_window_size - call draw_window - ret -@@: - add eax,16 ;12 -;copy_path user_selected_name,dir_path,eax,0 - mov esi,dir_path - mov edi,eax - call copy_dir_name - mov [edi-1],byte '/' - mov esi,user_selected_name - call copy_dir_name - - mov eax,[communication_area] - mov [eax],word 1 - jmp button.exit -;--------------------------------------------------------------------- -select_disk: - call check_alt -.1: - call load_root_directory - xor eax,eax - mov [menu_data_1.ret_key],eax - - push dword menu_data_1 - call [menu_bar_activate] - - call clear_control_key_flag - - mov eax,[menu_data_1.ret_key] - mov [menu_data_1.ret_key],dword 0 - cmp eax,1 - je select_filter.1 - - cmp eax,2 - je select_sort.1 - - cmp [menu_data_1.click],dword 1 - jne still - - cmp [menu_data_1.cursor_out],dword 0 - jne analyse_out_menu_1 - jmp still -;--------------------------------------------------------------------- -select_sort: - call check_alt -.1: - xor eax,eax - mov [menu_data_2.ret_key],eax - - push dword menu_data_2 - call [menu_bar_activate] - - call clear_control_key_flag - - mov eax,[menu_data_2.ret_key] - mov [menu_data_2.ret_key],dword 0 - cmp eax,1 - je select_disk.1 - - cmp eax,2 - je select_filter.1 - - - cmp [menu_data_2.click],dword 1 - jne still - - cmp [menu_data_2.cursor_out],dword 0 - jne analyse_out_menu_2 - jmp still -;--------------------------------------------------------------------- -select_filter: - call check_alt -.1: - xor eax,eax - mov [menu_data_3.ret_key],eax - - push dword menu_data_3 - call [menu_bar_activate] - - call clear_control_key_flag - - mov eax,[menu_data_3.ret_key] - mov [menu_data_3.ret_key],dword 0 - cmp eax,1 - je select_sort.1 - - cmp eax,2 - je select_disk.1 - - - cmp [menu_data_3.click],dword 1 - jne still - - cmp [menu_data_3.cursor_out],dword 0 - jne analyse_out_menu_3 - jmp still -;--------------------------------------------------------------------- -symbol_a_up: -NumPad_plus_Up: - call check_ctrl - jmp key.9 -;--------------------------------------- -NumPad_minus_Up: - call check_ctrl - jmp key.10 -;--------------------------------------- -NumPad_invert_Up: - call check_ctrl - jmp key.11 -;--------------------------------------- -check_alt: - xor eax,eax - mov al,[alt_flag] - test eax,eax - jz @f - xor ebx,ebx - ret -@@: - add esp,4 - jmp still -;--------------------------------------- -check_ctrl: - xor eax,eax - mov al,[ctrl_flag] - test eax,eax - jz @f - xor ebx,ebx - ret -@@: - add esp,4 - jmp still -;--------------------------------------------------------------------- -clear_control_key_flag: - xor eax,eax - mov [shift_flag],al - mov [ctrl_flag],al - mov [alt_flag],al - ret -;--------------------------------------------------------------------- -key_shift_up: - mov [shift_flag],1 - jmp still -;--------------------------------------------------------------------- -key_shift_down: - mov [shift_flag],0 - jmp still -;--------------------------------------------------------------------- -key_ctrl_up: - mov [ctrl_flag],1 - jmp still -;--------------------------------------------------------------------- -key_ctrl_down: - mov [ctrl_flag],0 - jmp still -;--------------------------------------------------------------------- -key_alt_up: - mov [alt_flag],1 - jmp still -;--------------------------------------------------------------------- -key_alt_down: - mov [alt_flag],0 - jmp still -;--------------------------------------------------------------------- -button: - mcall 17 - cmp ah,6 - je .reload_dir_1 - cmp ah,4 - je .open_dir_or_file - cmp ah,3 - je .exit - cmp ah,2 - je .exit_dir - cmp ah,1 - jne still -.exit: - mov eax,[communication_area] - test eax,eax - jz @f - cmp [eax],word 1 - je @f - mov [eax],word 3 -@@: - mov eax,[N_error] - test eax,eax - jz @f - call start_error_window_thread -@@: - call get_window_param - mov ebx,[communication_area] - mov ecx,procinfo -; mov eax,[window_x] - mov eax,[ecx+34] - shl eax,16 - add eax,[ecx+42] - mov [ebx+4],eax -; mov eax,[window_y] - mov eax,[ecx+38] - shl eax,16 - add eax,[ecx+46] - mov [ebx+8],eax - - mcall -1 -;--------------------------------------------------------------------- -.reload_dir: - cmp [ctrl_flag],bl - je key.12 ; Just symbol 'R' or 'r' -.reload_dir_1: - call load_next_dir.1 - jmp still -;--------------------------------------------------------------------- -.exit_dir: - call load_next_dir.exit_dir - jmp still -;--------------------------------------------------------------------- -.open_dir_or_file: - cmp [open_dialog_type],0 ;Open file - jne @f - - mov eax,[file_browser_data_1.folder_data] - mov eax,[eax+4] - test eax,eax - jz button.exit -@@: - cmp [open_dialog_type],2 ;Select dir - je file_no_folder - - cmp [open_dialog_type],1 ;Save file - jne @f - - mov al,[focus_pointer] - test al,al - jne file_no_folder -@@: - xor ebx,ebx - jmp key.7 -;--------------------------------------------------------------------- -thread_start: - mov eax,[N_error] - cmp al,1 - jne @f - mov [N_error],load_ini_error_type - mov [error_path],file_name - jmp .error_type -@@: - cmp al,2 - jne @f - mov [N_error],load_icons_error_type - mov [error_path],file_name - jmp .error_type -@@: - cmp al,3 - jne @f - mov [N_error],memory_free_error_type - xor eax,eax - mov [error_path],eax - mov [error_type],eax - jmp .red -@@: - cmp al,4 - jne @f - mov [N_error],memory_get_error_type - xor eax,eax - mov [error_path],eax - mov [error_type],eax - jmp .red -@@: - cmp al,5 - jne @f - mov [N_error],load_directory_error_type - mov [error_path],dir_path - jmp .error_type -@@: - cmp al,6 - jne .button - mov [N_error],convert_icons_error_type - mov [error_path],file_name - xor eax,eax - mov [error_type],eax - jmp .red -.error_type: - mov eax,[error_type] - shl eax,2 - add eax,error_fs_text_pointers - mov eax,[eax] - mov [error_type],eax -.red: - call draw_error_window -.still: - mcall 10 - cmp eax,1 - je .red - cmp eax,2 - je .key - cmp eax,3 - je .button - jmp .still -.key: - mcall 2 - jmp .still -.button: - mcall -1 - jmp .still -;--------------------------------------------------------------------- -draw_error_window: - mcall 12,1 - mcall 0,[error_window_x],[error_window_y],0x03ff0000 - call type_title - mcall 4,<10,30>,0x90ffffff,[N_error] - mov eax,[error_path] - test eax,eax - jz @f - mcall 4,<10,50>,,[error_path] -@@: - mov eax,[error_type] - test eax,eax - jz @f - mcall 4,<10,70>,,[error_type] -@@: - mcall 12,2 - ret -;--------------------------------------------------------------------- -start_error_window_thread: - mcall 9,procinfo,-1 - mov eax,[ebx+46] - shr eax,1 - add eax,[ebx+38] - sub eax,40 - mov [error_window_y+2],ax - mov eax,[ebx+42] - shr eax,1 - add eax,[ebx+34] - sub eax,125 - mov [error_window_x+2],ax - mcall 51,1,thread_start,thread_stack - ret -;--------------------------------------------------------------------- -mouse: - mcall 18,7 - cmp [active_process],eax - jne still - - mcall 37,7 - mov [mouse_scroll_data],eax - - mcall 37,1 - mov [mouse_position],eax - - cmp [scroll_bar_data_vertical.delta2],0 - jne .scrollbar - - mov [file_browser_data_1.select_flag],0 - - push dword file_browser_data_1 - call [FileBrowser_mouse] - - call draw_open_button_label - - mov eax,file_browser_data_1.mouse_keys_delta - cmp [eax],dword 3 - jne .check_focus ; scrollbar - mov [eax],dword 0 - call load_next_dir - jmp still -;--------------------------------------------------- -.check_focus: - mov ebx,[file_browser_data_1.select_flag] - test ebx,ebx - jz .scrollbar ;@f - mov al,[focus_pointer] - test al,al - jz .scrollbar - xor eax,eax - mov [focus_pointer],al - jmp change_focus_area.1 -;--------------------------------------------------- -.scrollbar: - mov eax,[scroll_bar_data_vertical.max_area] - cmp eax,[scroll_bar_data_vertical.cur_area] - jbe .menu_bar ;still - - push dword scroll_bar_data_vertical - call [scrollbar_ver_mouse] - - cmp [scroll_bar_data_vertical.redraw],0 - je .menu_bar ;still - mov [scroll_bar_data_vertical.redraw],0 -.draw: - call draw_draw_file_browser2 - jmp still - -;--------------------------------------------------- -.menu_bar: - cmp [scroll_bar_data_vertical.delta2],0 - jne still - -.menu_bar_1: - call .set_mouse_flag -@@: - 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 select_disk.1 ;analyse_out_menu_1 - jmp .menu_bar_1 -;-------------------------------------------- -.menu_bar_2: - push dword menu_data_2 - call [menu_bar_mouse] - - cmp [menu_data_2.click],dword 1 - jne .menu_bar_3 - - cmp [menu_data_2.cursor_out],dword 0 - jne analyse_out_menu_2 - jmp .menu_bar_1 -;--------------------------------------------------- -.menu_bar_3: - push dword menu_data_3 - call [menu_bar_mouse] - - cmp [menu_data_3.click],dword 1 - jne .check_editboxes - - cmp [menu_data_3.cursor_out],dword 0 - jne analyse_out_menu_3 - jmp .menu_bar_1 -;--------------------------------------------------- -.check_editboxes: - cmp [open_dialog_type],1 - jne .check_scroll_event - mov eax,[edit1+44] - and eax,10b - push dword name_editboxes - call [edit_box_mouse] - mov ebx,[edit1+44] - and ebx,10b - cmp eax,ebx - je .check_scroll_event - mov al,[focus_pointer] - test al,al - jnz .check_scroll_event - xor eax,eax - test ebx,10b - jz @f - inc eax -@@: - mov [focus_pointer],al - jmp change_focus_area.1 -;--------------------------------------------------- -.check_scroll_event: - mov eax,[mouse_position] - xor ebx,ebx - mov bx,ax ; EBX mouse y - shr eax,16 ; EAX mouse x - - mov cx,[file_browser_data_1.start_x] - mov dx,[file_browser_data_1.start_y] - - cmp ax,cx - jb .mouse_next ; min x - - cmp bx,dx - jb .mouse_next ; min y - - add cx,[file_browser_data_1.size_x] - cmp ax,cx - ja .mouse_next ; max x - - add dx,[file_browser_data_1.size_y] - cmp bx,dx - ja .mouse_next ; max y - - xor ecx,ecx - xor ebx,ebx - mov eax,[mouse_scroll_data] - test eax,eax - jz .mouse_next - test ax,0x8000 - jnz .decr - shr eax,16 - test ax,0x8000 - jnz .decr_1 - - mov cx,[mouse_scroll_data.vertical] - test ecx,ecx - jnz @f - mov cx,[mouse_scroll_data.horizontal] - test ecx,ecx - jz .mouse_next -@@: - mov ebx,1 -@@: - push ebx ecx - call key.key_action - pop ecx ebx - dec ecx - jnz @r - jmp still -;---------------------------------------- -.decr: - mov bx,[mouse_scroll_data.vertical] - jmp @f -.decr_1: - mov bx,[mouse_scroll_data.horizontal] -@@: - mov ecx,0xffff - sub ecx,ebx - inc ecx - mov ebx,2 -@@: - push ebx ecx - call key.key_action - pop ecx ebx - dec ecx - jnz @r - jmp still -;--------------------------------------------------- -.mouse_next: - jmp still -;--------------------------------------------------------------------- -.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: -; Available disks - mov eax,[menu_data_1.cursor_out] - dec eax - imul esi,eax,10 - add esi,retrieved_devices_table - mov edi,dir_path - call copy_dir_name - call load_next_dir.1 - jmp still -;--------------------------------------------------------------------- -analyse_out_menu_2: -; Sort - mov eax,[menu_data_2.cursor_out] - xor ebx,ebx - cmp eax,dword 1 - je .1 - cmp eax,dword 2 - je .2 - cmp eax,dword 3 - je .3 - cmp eax,dword 4 - je .4 - jmp still -.4: - add ebx,2 -.3: - add ebx,2 -.2: - add ebx,2 -.1: - mov [sort_type],ebx - call sort_directory - call draw_draw_file_browser1 - jmp still -;--------------------------------------------------------------------- -analyse_out_menu_3: -; Filter - mov eax,[menu_data_3.cursor_out] - cmp eax,dword 1 - jne @f - mov [filter_flag],0 - call load_next_dir.1 - jmp still -@@: - cmp eax,dword 2 - jne still - mov [filter_flag],1 - call load_next_dir.1 - jmp still -;--------------------------------------------------------------------- -get_communication_area: - xor eax,eax - mov al,[param] - test eax,eax - jz .exit - mcall 68,22,param,,0x01 - mov [communication_area],eax - movzx ebx,word [eax+2] - mov [open_dialog_type],ebx - cmp ebx,1 - jne @f - pushad - mov [focus_pointer],bl - mov edi,edit1 - mov [file_browser_data_1.select_panel_counter],0 - or [edi+44],dword ed_focus - mov [edi+12],dword 0xffffb0 ; color yellow - mcall 66,1,0 - popad -@@: - mov ebx,[eax+4] - cmp bx,word x_minimal_size ;300 - jb @f - mov [window_x],ebx - mov ebx,[eax+8] - cmp bx,word y_minimal_size ;200 - jb @f - mov [window_y],ebx -.exit: - ret -;--------------------------------------------------------------------- -load_start_directory: - mov eax,[communication_area] - test eax,eax - jz .1 - movzx ebx,word [eax] - test eax,eax - jz .1 - add eax,16 ;12 ;4 - mov esi,eax - push esi - mov esi,[communication_area] - add esi,3840 ;4096-256 - mov eax,[esi] - test al,al - jnz @f - mov esi,example_name_temp -@@: - mov edi,user_selected_name - call copy_dir_name - pop esi - jmp .2 -.1: - mov esi,start_pach -.2: - mov edi,dir_path - call copy_dir_name - -; call load_directory -; mov eax,[N_error] -; test eax,eax -; jnz button.exit -.3: - call load_directory - mov eax,[N_error] - test eax,eax - jz @f - call error_handler - jmp .3 -@@: - ret -;--------------------------------------------------------------------- -load_next_dir: - mov ebx,[file_browser_data_1.folder_block] - test ebx,ebx - jz .exit - - mov ebx,[file_browser_data_1.selected_BDVK_adress] - add ebx,40 - test [ebx-40],byte 0x10 - jz file_no_folder - cmp [ebx],word '..' - jne @f - cmp [ebx+2],byte 0 - je .exit_dir -@@: - mov esi,dir_path - call copy_dir_path - -@@: -.1: - call load_directory - mov eax,[N_error] - test eax,eax - jz @f - call error_handler - jmp .1 -@@: - call sort_directory - - mov ebx,[scroll_bar_data_vertical.x] - inc ebx - mov ecx,[scroll_bar_data_vertical.y] - inc ecx - mcall 13,,,0xcccccc - mov edi,edit1 - xor eax,eax - mov [edi+44],eax - mov [edi+12],dword 0xffffff ; color white - call draw_draw_file_browser1 -.exit: - ret -.exit_dir: - mov esi,dir_path - call copy_exit_dir - jmp .1 -;--------------------------------------------------------------------- -error_handler: - mcall 66,2 - mov [error_handler_store_input_mode],eax - mcall 66,1,1 -.red: - call .draw_window -;------------------------------------ -.still: - mcall 10 - cmp eax,1 - je .red - cmp eax,2 - je .key - cmp eax,3 - je .button - jmp .still -;------------------------------------ -.draw_window: - xor eax,eax - inc eax - mov [error_window],al - call control_minimal_window_size - call draw_window - xor eax,eax - mov [error_window],al - ret -;------------------------------------ -.key: - mcall 2 - xor ebx,ebx - cmp [extended_key],1 - je .extended_key - test al,al - jnz .still - cmp ah,0xE0 - jne @f - mov [extended_key],1 - jmp .still -@@: - cmp ah,129 ; Esc - je .exit - jmp .still -.extended_key: - jmp .still -;------------------------------------ -.button: - mcall 17 - cmp ah,5 - je .exit - cmp ah,1 - jne .still - xor eax,eax - mov [N_error],eax - jmp button.exit -;------------------------------------ -.exit: - cmp [open_dialog_type],1 - jne @f - - mov esi,root_pach - mov edi,dir_path - call copy_dir_name.1 - mov esi,root_pach - mov edi,previous_dir_path - call copy_dir_name.1 - jmp .restore_input_mode -@@: - mov esi,previous_dir_path - mov edi,dir_path - call copy_dir_name.1 - mov esi,start_pach - mov edi,previous_dir_path - call copy_dir_name.1 -.restore_input_mode: - mcall 66,1,[error_handler_store_input_mode] - ret -;--------------------------------------------------------------------- -file_no_folder: - mov esi,dir_path - mov edi,file_name - call copy_dir_name - push ebx - mov al,[focus_pointer] - test al,al - je @f - mov ebx,user_selected_name - xor eax,eax - cmp [ebx],al - je .exit -@@: - cmp [open_dialog_type],2 - je @f - mov esi,file_name - call copy_dir_path -@@: - mov eax,[communication_area] - test eax,eax - jnz @f - call control_minimal_window_size - call draw_window - pop ebx - ret -@@: - mov edi,eax - add edi,16 ;12 - mov esi,file_name - call copy_dir_name - - pop esi - mov al,[focus_pointer] - test al,al - jz @f - mov esi,user_selected_name -@@: - xor eax,eax - cmp [esi],al - je .exit - mov edi,[communication_area] - add edi,3840 ;4096-256 - call copy_dir_name -.exit: - mov eax,[communication_area] - mov [eax],word 1 - jmp button.exit -;--------------------------------------------------------------------- -load_root_directory: - mov [dirinfo.name],dword dir_path_temp - mov eax,[dirinfo.return] - push eax - mov eax,[file_browser_data_1.folder_data] - push eax - xor eax,eax - mov [dirinfo.return],eax - mov [file_browser_data_1.folder_data],eax - mov esi,root_pach - mov edi,dir_path_temp - call copy_dir_name - call load_directory - mov eax,[N_error] - test eax,eax - jnz button.exit - - mov eax,[dirinfo.return] - mov [root_folder_area],eax - mov eax,[eax+4] - mov [root_folder_block],eax - - xor eax,eax - mov [dirinfo.return],eax - mov [file_browser_data_1.folder_data],eax - mov [temp_counter_1],eax ;0 - - mov [retrieved_devices_table_counter],eax ;0 -.start_temp_counter_1: - imul esi,[temp_counter_1],304 - add esi,[root_folder_area] - add esi,32+40 - mov edi,dir_path_temp+1 - mov [edi-1],byte '/' - call copy_dir_name - call load_directory - mov eax,[N_error] - test eax,eax - jnz button.exit - - mov eax,[dirinfo.return] - mov [root1_folder_area],eax - mov eax,[eax+4] - test eax,eax - jz .continue - mov [root1_folder_block],eax - - mov ebp,0 -.start_copy_device_patch: - imul edi,[retrieved_devices_table_counter],10 - add edi,retrieved_devices_table - mov [edi],byte '/' - inc edi - imul esi,[temp_counter_1],304 - add esi,[root_folder_area] - add esi,32+40 - - call copy_dir_name - - imul esi,ebp,304 - add esi,[root1_folder_area] - add esi,32+40 - mov [edi-1],byte '/' - - call copy_dir_name - - inc [retrieved_devices_table_counter] - inc ebp - cmp ebp,[root1_folder_block] - jb .start_copy_device_patch -.continue: - inc [temp_counter_1] - mov eax,[temp_counter_1] - cmp eax,[root_folder_block] - jb .start_temp_counter_1 - - cmp [root_folder_area],dword 0 - je @f - mcall 68,13,[root_folder_area] - test eax,eax - jz memory_free_error -@@: - - xor ecx,ecx - mov edi,menu_text_area_1_1 ;.1 -@@: - imul esi,ecx,10 - add esi,retrieved_devices_table - call copy_dir_name - inc ecx - cmp ecx,[retrieved_devices_table_counter] - jb @b - mov [menu_data_1.text_end],edi - xor eax,eax - mov [edi],eax - pop eax - mov [file_browser_data_1.folder_data],eax - pop eax - mov [dirinfo.return],eax - mov [dirinfo.name],dword dir_path - ret -;--------------------------------------------------------------------- -memory_free_error: - mov [N_error],3 - jmp button.exit -;--------------------------------------------------------------------- -memory_get_error: - mov [N_error],4 - jmp button.exit -;--------------------------------------------------------------------- -type_title: - mov ecx,[open_dialog_type] - shl ecx,2 - add ecx,open_dialog_title_pointer - mov ecx,[ecx] - test ecx,ecx - jz @f - mcall 71,1,; title ;;param ;file_name ;dir_path -@@: - ret -;--------------------------------------------------------------------- -draw_window: - - mcall 12,1 - call prepare_system_colors - xor esi,esi - mcall 0,[window_x],[window_y],0x63AABBCC - call type_title - call get_window_param - mov eax,[procinfo+70] ;status of window - test eax,100b - jne .end - - mov eax,[window_high] - sub eax,25+45 - mov [file_browser_data_1.size_y],ax - mov [scroll_bar_data_vertical.size_y],ax - mov eax,[window_width] - sub eax,10+20 - mov [file_browser_data_1.size_x],ax - add ax,10 - mov [scroll_bar_data_vertical.start_x],ax - mov edx,[w_work] ; color of work area RRGGBB,8->color - or edx,0x63000000 - mcall 13,[window_width],45 ;,0xcccccc - - push ecx - rol ecx,16 - add cx,[file_browser_data_1.size_y] - add cx,45 - ror ecx,16 - mov cx,25 - mcall - pop ecx - add ecx,45 shl 16 - mov cx,[file_browser_data_1.size_y] - mov bx,10 - mcall - mov bx,[file_browser_data_1.size_x] - add bx,10 - shl ebx,16 - mov bx,20 - mcall - - cmp [error_window],0 - je @f - call draw_for_fs_errors - jmp .1 -@@: - mov [do_not_draw_open_button_label],1 - call draw_draw_file_browser1 - mov [do_not_draw_open_button_label],0 -.1: - push dword menu_data_1 - call [menu_bar_draw] - push dword menu_data_2 - call [menu_bar_draw] - push dword menu_data_3 - call [menu_bar_draw] - - mov ebx,[file_browser_data_1.x] - mov ax,bx - shl eax,16 - add ebx,eax - mov eax,50 - mov bx,ax - shl eax,16 - sub ebx,eax - mov ecx,25 shl 16 + 16 - mcall 8,,,2,[w_work_button] ;0xffffff - - pusha - shr ecx,16 - mov bx,cx - add ebx,21 shl 16 - mov ecx,[w_work_button_text] - or ecx,0x90000000 - mcall 4,,,message_ExitDir_button - add ebx,4 - mcall - add ebx,4 - mcall - popa - - push ebx - sub ebx,70 shl 16 - mov bx,60 - mcall 8,,,6 - - shr ecx,16 - mov bx,cx - add ebx,2 shl 16 - mov ecx,[w_work_button_text] - or ecx,0x90000000 - mcall 4,,,message_ReloadDir_button - pop ebx - - mov ebx,[file_browser_data_1.x] - mov ax,bx - shl eax,16 - add ebx,eax - mov eax,55 - mov bx,ax - shl eax,16 - sub ebx,eax - mov ecx,[file_browser_data_1.y] - mov ax,cx - add eax,3 - shl eax,16 - add ecx,eax - mov cx,16 - mcall 8,,,3 - - pusha - shr ecx,16 - mov bx,cx - add ebx,4 shl 16 - mov ecx,[w_work_button_text] - or ecx,0x90000000 - mcall 4,,,message_cancel_button - popa - - sub ebx,65 shl 16 - mcall 8,,,4 - - shr ecx,16 - mov bx,cx - add ebx,4 shl 16 - mov edx,[open_dialog_type] - shl edx,2 - add edx,message_open_dialog_button - mov edx,[edx] -;------------------------------- - cmp [open_dialog_type],1 - jne @f - - cmp [focus_pointer],1 - je @f - - cmp [error_window],0 - jne @f - - mov eax,[file_browser_data_1.folder_block] - test eax,eax - jz @f - - mov eax,[file_browser_data_1.selected_BDVK_adress] - test [eax],byte 0x10 - jz @f - - mov edx,message_0 ; Open Dir -@@: -;-------------------------------------- - mov [open_button_coordinates],ebx - mov ecx,[w_work_button_text] - or ecx,0x90000000 - mcall 4 ;message_open_button -.end: - mcall 12,2 - ret -;--------------------------------------------------------------------- -draw_open_button_label: - cmp [do_not_draw_open_button_label],1 - je .exit_1 - - cmp [open_dialog_type],1 - jne .exit_1 - - cmp [focus_pointer],1 - je draw_save_button_label - - pusha - mov ebx,[open_button_coordinates] - test ebx,ebx - jz .exit - - mov edx,[open_dialog_type] - shl edx,2 - add edx,message_open_dialog_button - mov edx,[edx] - - mov eax,[file_browser_data_1.folder_block] - test eax,eax - jz .1 - - mov eax,[file_browser_data_1.selected_BDVK_adress] - test [eax],byte 0x10 - jz @f - - mov edx,message_0 ; Open Dir - jmp .1 -@@: - call copy_new_file_name -.1: - mov ecx,[w_work_button_text] - or ecx,0xd0000000 - mov edi,[w_work_button] - mcall 4 ;message_open_button -.exit: - popa -.exit_1: - ret -;--------------------------------------------------------------------- -draw_save_button_label: - pusha - mov ebx,[open_button_coordinates] - - mov edx,message_1 ; Save - - mov ecx,[w_work_button_text] - or ecx,0xd0000000 - mov edi,[w_work_button] - mcall 4 ;message_open_button - popa - ret -;--------------------------------------------------------------------- -copy_new_file_name: - mov esi,[file_browser_data_1.selected_BDVK_adress] - add esi,40 - mov edi,user_selected_name - cld - lodsb - test al,al - jnz .1 - ret -@@: - lodsb -.1: - stosb - test al,al - jnz @r - - sub edi,user_selected_name - dec edi - - mov esi,edit1 - mov [esi+48],edi ;ed_size - mov [esi+52],edi ;ed_pos - - push dword name_editboxes - call [edit_box_draw] - ret -;--------------------------------------------------------------------- -prepare_system_colors: - mcall 48,3,app_colours,10*4 - - mov eax,[w_work] - mov [menu_data_1.bckg_col],eax - mov [menu_data_2.bckg_col],eax - mov [menu_data_3.bckg_col],eax - - mov [menu_data_1.menu_col],eax - mov [menu_data_2.menu_col],eax - mov [menu_data_3.menu_col],eax - - mov [scroll_bar_data_vertical.bckg_col],eax - - mov eax,[w_work_button] - mov [menu_data_1.frnt_col],eax - mov [menu_data_2.frnt_col],eax - mov [menu_data_3.frnt_col],eax - - mov [scroll_bar_data_vertical.frnt_col],eax - - mov eax,[w_work_button] - mov [menu_data_1.menu_sel_col],eax - mov [menu_data_2.menu_sel_col],eax - mov [menu_data_3.menu_sel_col],eax - - mov eax,[w_work_text] - mov [menu_data_1.bckg_text_col],eax - mov [menu_data_2.bckg_text_col],eax - mov [menu_data_3.bckg_text_col],eax - - mov eax,[w_work_button_text] - mov [menu_data_1.frnt_text_col],eax - mov [menu_data_2.frnt_text_col],eax - mov [menu_data_3.frnt_text_col],eax - - mov [scroll_bar_data_vertical.line_col],eax - ret -;--------------------------------------------------------------------- -draw_for_fs_errors: - call draw_dir_path - - mov ebx,[file_browser_data_1.x] - mov ecx,[file_browser_data_1.y] - mcall 13,,,[file_browser_data_1.background_color] - push ebx ecx - add ebx,10 shl 16 - sub ebx,20 - add ecx,10 shl 16 - sub ecx,20 - - shr ecx,16 - mov bx,cx - add ebx,5 shl 16+15 - mcall 4,,0x90000000,load_directory_error_type - - add ebx,20 - mcall 4,,,dir_path - - mov eax,[error_type] - shl eax,2 - add eax,error_fs_text_pointers - mov edx,[eax] - add ebx,20 - mcall 4 - - add ebx,20 - mcall ,,,error_help_text - - pop ecx ebx - - mov ebx,[file_browser_data_1.x] - mov ax,bx - shr eax,1 - shl eax,16 - add ebx,eax - mov eax,50 - mov bx,ax - shr eax,1 - shl eax,16 - sub ebx,eax - - mov ecx,[file_browser_data_1.y] - mov ax,cx - sub eax,40 - shl eax,16 - add ecx,eax - mov cx,15 - - mcall 8,,,5,[w_work_button] ;0xffffff - - shr ecx,16 - mov bx,cx - add ebx,4 shl 16 - mov ecx,[w_work_button_text] - add ecx,0x90000000 - mcall 4,,,message_cancel_button - - ret -;--------------------------------------------------------------------- -draw_file_name: - mov esi,user_selected_name - cld -@@: - lodsb - test al,al - jne @r - sub esi,user_selected_name - mov eax,esi - dec eax - - mov edi,edit1 - mov [edi+48],eax ;ed_size - mov [edi+52],eax ;ed_pos -;-------------------------------------- - mov eax,[file_browser_data_1.x] - mov ebx,eax - shr ebx,16 - and eax,0xffff - sub eax,200 - mov [edi],eax - add ebx,70 - mov [edi+4],ebx - - mov eax,[file_browser_data_1.y] - mov ebx,eax - shr ebx,16 - and eax,0xffff - add eax,ebx - add eax,5 - mov [edi+8],eax - - push dword name_editboxes - call [edit_box_draw] - - mov bx,[file_browser_data_1.start_x] - add bx,5 - shl ebx,16 - mov bx,[file_browser_data_1.start_y] - add bx,[file_browser_data_1.size_y] - add bx,9 - mov ecx,[w_work_text] - add ecx,0x80000000 - mcall 4,,,message_file_name - ret -;--------------------------------------------------------------------- -draw_dir_path: - mov eax,[file_browser_data_1.x] - mov ebx,eax - shr ebx,16 - add ebx,3 - and eax,0xffff - sub eax,5 - - mov [PathShow_data_1.area_size_x],ax - mov [PathShow_data_1.start_x],bx -;-------------------------------------- -;; top line -; mov ebx,[file_browser_data_1.x] -; mcall 13,,<7,1>,0x0 -; down line -; push ebx ecx -; mcall ,,<21,1>, -; pop ecx ebx -; left line -; push ebx -; mov bx,1 -; mov cx,15 -; mcall -; pop ebx -; right line -; mov ax,bx -; shr ebx,16 -; add bx,ax -; dec ebx -; shl ebx,16 -; mov bx,1 -; mcall 13 -;-------------------------------------- - mov ebx,[file_browser_data_1.x] - sub ebx,2 - add ebx,1 shl 16 - mcall 13,,<8,13>,0xffffcc -;-------------------------------------- -; prepare for PathShow - push dword PathShow_data_1 - call [PathShow_prepare] - -; draw for PathShow - push dword PathShow_data_1 - call [PathShow_draw] - - ret -;--------------------------------------------------------------------- -draw_draw_file_browser1: - call draw_dir_path - cmp [open_dialog_type],1 - jne @f - call draw_file_name -@@: - xor eax,eax - inc eax - mov [file_browser_data_1.all_redraw],eax - mov [scroll_bar_data_vertical.all_redraw],eax - - push dword file_browser_data_1 - call [FileBrowser_draw] - - call draw_open_button_label - - call prepare_scrollbar_data - - call draw_scrollbar - - xor eax,eax - mov [file_browser_data_1.all_redraw],eax - mov [scroll_bar_data_vertical.all_redraw],eax - ret -;--------------------------------------------------------------------- -draw_draw_file_browser2: - mov eax,2 - mov [file_browser_data_1.all_redraw],eax - - call get_scrollbar_data - - push dword file_browser_data_1 - call [FileBrowser_draw] - - call draw_open_button_label - - xor eax,eax - mov [file_browser_data_1.all_redraw],eax - ret -;--------------------------------------------------------------------- -draw_scrollbar1: - mov eax,[file_browser_data_1.start_draw_line] - mov [scroll_bar_data_vertical.position],eax - - call draw_scrollbar - - ret -;--------------------------------------------------------------------- -draw_scrollbar: - mov eax,[scroll_bar_data_vertical.max_area] - cmp eax,[scroll_bar_data_vertical.cur_area] - jbe @f - cmp [scroll_bar_data_vertical.cur_area],0 - je @f - push dword scroll_bar_data_vertical - call [scrollbar_ver_draw] -@@: - ret -;--------------------------------------------------------------------- -get_scrollbar_data: - mov eax,[scroll_bar_data_vertical.position] - mov [file_browser_data_1.start_draw_line],eax - ret -;--------------------------------------------------------------------- -prepare_scrollbar_data: - mov eax,[file_browser_data_1.folder_block] - mov [scroll_bar_data_vertical.max_area],eax - mov eax,[file_browser_data_1.max_panel_line] - mov [scroll_bar_data_vertical.cur_area],eax - ret -;--------------------------------------------------------------------- -get_active_pocess: - mcall 9,procinfo,-1 - mov ecx,[ebx+30] ; PID - mcall 18,21 - 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 -;--------------------------------------------------------------------- -get_window_param: - mcall 9,procinfo,-1 - mov eax,[ebx+66] - inc eax - mov [window_high],eax - mov eax,[ebx+62] - inc eax - mov [window_width],eax - mov eax,[ebx+70] - mov [window_status],eax - ret -;--------------------------------------------------------------------- -convert_icons: - 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, - test eax,eax - jz memory_free_error - - cmp [return_code],dword 0 - je @f - mov [N_error],6 - jmp button.exit -@@: - - mov ebx,[raw_pointer] - mov eax,[ebx+4] -; set of icon size x - mov [file_browser_data_1.icon_size_x],ax -; mov eax,[ebx+8] -; set of icon size y - mov [file_browser_data_1.icon_size_y],ax - inc ax - mov [file_browser_data_1.line_size_y],ax - mov eax,[ebx+12] -; set of RAW resolution to pixel - mov [file_browser_data_1.resolution_raw],eax - - mov eax,[ebx+20] - add eax,ebx -; set RAW palette,use else resolution 8bit or less - mov [file_browser_data_1.palette_raw],eax - - mov eax,[ebx+28] - add eax,ebx -; set RAW area for icon - mov [file_browser_data_1.icon_raw_area],eax - ret -;--------------------------------------------------------------------- -calc_ini: - mov eax,[image_file] - mov [file_browser_data_1.ini_file_start],eax - - mov edi,eax - add edi,[img_size] - dec edi - mov esi,eax - add esi,9 ; after [icons16] - cld -@@: - lodsb - cmp esi,edi - je @f - cmp al,byte '[' - jne @r - -@@: - mov [file_browser_data_1.ini_file_end],esi - ret -;--------------------------------------------------------------------- -load_ini: - mov edi,ini_file_name - - mov [fileinfo.name],edi - mov [fileinfo.subfunction],dword 5 - mov [fileinfo.size],dword 0 - mov [fileinfo.return],dword file_info - mcall 70,fileinfo - test eax,eax - jnz .error - - mov [fileinfo.subfunction],dword 0 - - mov ecx,[file_info+32] - mov [fileinfo.size],ecx - mov [img_size],ecx - - mcall 68,12 - test eax,eax - jz memory_get_error - - mov [fileinfo.return],eax - mov [image_file],eax - - mcall 70,fileinfo - test eax,eax - jnz .error - ret -.error: - mov [N_error],1 - mov [error_type],eax - jmp button.exit -;--------------------------------------------------------------------- -load_icons: - mov ebx,icons_file_name_2 - mov esi,path - mov edi,file_name - call copy_file_path - - mov [fileinfo.subfunction],dword 5 - mov [fileinfo.size],dword 0 - mov [fileinfo.return],dword file_info - mcall 70,fileinfo - test eax,eax - jz @f - - mov edi,icons_path - - mov [fileinfo.name],edi - mov [fileinfo.subfunction],dword 5 - mov [fileinfo.size],dword 0 - mov [fileinfo.return],dword file_info - mcall 70,fileinfo - test eax,eax - jnz .error -@@: - mov [fileinfo.subfunction],dword 0 - - mov ecx,[file_info+32] - mov [fileinfo.size],ecx - mov [img_size],ecx - - mcall 68,12 - test eax,eax - jz memory_get_error - - mov [fileinfo.return],eax - mov [image_file],eax - - mcall 70,fileinfo - test eax,eax - jnz .error - ret -.error: - mov [N_error],2 - mov [error_type],eax - jmp button.exit -;--------------------------------------------------------------------- -sort_directory: - mov eax,[file_browser_data_1.folder_data] - mov ebx,[eax+4] ; number of files - add eax,32 - cmp [eax+40],word '..' - jne @f - cmp [eax+40+2],byte 0 - jne @f - dec ebx - add eax,304 -@@: - push dword [sort_type] ; sort mode - push ebx ; number of files - push eax ; data files - call [sort_dir] - ret -;-------------------------------------------------------------------- -load_directory: - xor eax,eax - mov [N_error],eax - cmp [file_browser_data_1.folder_data],eax - je @f - mcall 68,13,[file_browser_data_1.folder_data] - test eax,eax - jz memory_free_error - -@@: - mov [dirinfo.size],dword 0 - mov [dirinfo.return],dir_header - mcall 70,dirinfo - test eax,eax - jz @f -; mov esi,previous_dir_path -; mov edi,dir_path -; call copy_dir_name.1 -; mcall 70,dirinfo -; test eax,eax -; jz @f - xor ebx,ebx - mov [file_browser_data_1.folder_data],ebx - jmp .error -@@: - - mov ecx,[dir_header.totl_blocks] - mov [dirinfo.size],ecx - imul ecx,304 - add ecx,32 - mcall 68,12 - test eax,eax - jz memory_get_error - - mov [dirinfo.return],eax - mov [file_browser_data_1.folder_data],eax - - mcall 70,dirinfo - test eax,eax - jnz .error - -; test for empty directory - mov eax,[dirinfo.return] - mov eax,[eax+4] - test eax,eax - jz @f - - call delete_point_dir -; call files_name_normalize - call check_filter - call prepare_extension_and_mark - call clear_data_fb_and_sb -@@: - ret - -.error: - mov [N_error],5 - mov [error_type],eax - ret -;--------------------------------------------------------------------- -clear_data_fb_and_sb: - xor eax,eax - mov [file_browser_data_1.start_draw_cursor_line],ax - mov [file_browser_data_1.start_draw_line],eax - mov [scroll_bar_data_vertical.position],eax - ret -;--------------------------------------------------------------------- -check_filter: - cmp [open_dialog_type],2 ; Select dir - je .1 - xor eax,eax - mov al,[filter_flag] - test eax,eax - jz @f - - mov eax,[communication_area] - test eax,eax - jz @f - mov eax,[eax+4096] - test eax,eax - jz @f -.1: - call delete_unsupported_BDFE -@@: - ret -;--------------------------------------------------------------------- -delete_unsupported_BDFE: - mov ebx,[file_browser_data_1.folder_data] - add ebx,4 - xor ecx,ecx - dec ecx - - mov eax,[file_browser_data_1.folder_data] - add eax,32+40 - sub eax,304 -.start: - inc ecx - add eax,304 -.1: - cmp [ebx],ecx - je .end - cmp [eax],byte '.' - jne @f - cmp [eax+1],byte 0 - je .delete -@@: - test [eax-40],byte 0x10 - jnz .start - - cmp [open_dialog_type],2 ; Select dir - je .delete - - push eax ebx - mov esi,eax - call search_expansion - test eax,eax - pop ebx eax - jnz .delete - - push eax ebx ecx esi - mov edi,[communication_area] - add edi,4100 - call compare_expansion - test eax,eax - pop esi ecx ebx eax - jz .start - -;------------------------------------------- -.delete: - dec dword [ebx] - mov esi,[ebx] - sub esi,ecx - - push ecx - mov ecx,esi - imul ecx,304/4 - mov edi,eax - sub edi,40 - mov esi,edi - add esi,304 - cld - rep movsd - pop ecx - - jmp .1 -.end: - ret -;--------------------------------------------------------------------- -search_expansion: - mov edi,esi - xor eax,eax -@@: - cld - lodsb - test eax,eax - jnz @b - mov ebx,esi - dec esi -@@: - std - lodsb - cmp esi,edi - jb .end_err - cmp al,'.' - jne @b - - add esi,2 - sub ebx,esi - mov [expansion_length],ebx - cld - xor eax,eax - ret - -.end_err: - cld - xor eax,eax - inc eax - ret -;--------------------------------------------------------------------- -compare_expansion: - mov ebx,[edi] - add ebx,edi - add edi,3 -.start: - cmp ebx,edi - jb .end_err - mov ecx,[expansion_length] - inc edi - - push esi edi -@@: - cld - lodsb - xchg esi,edi - shl eax,8 - lodsb - xchg esi,edi - call char_todown - xchg al,ah - call char_todown - cmp al,ah - jne @f - dec ecx - jnz @b - jmp .end -@@: - pop edi esi - jmp .start -.end: - pop edi esi - xor eax,eax - ret - -.end_err: - xor eax,eax - inc eax - ret -;--------------------------------------------------------------------- -prepare_extension_and_mark: - mov esi,[dirinfo.return] - mov ebp,[esi+4] - test ebp,ebp - jz .end - - add esi,32+40 -.start: - push esi - call search_extension_start - mov eax,esi - pop esi - sub eax,esi - sub ebx,esi - shl eax,16 - mov ax,bx - mov [esi+300-40],eax - mov [esi+299-40],byte 0 - add esi,304 - dec ebp - jnz .start -.end: - ret -;--------------------------------------------------------------------- -search_extension_start: - mov edx,esi - xor eax,eax - cld -@@: - lodsb - test eax,eax - jnz @b - dec esi - dec edx - push esi - std -@@: - lodsb - cmp esi,edx - je .end - cmp al,'.' - jnz @b - add esi,2 - cld - pop ebx - ret -.end: - cld - pop esi - mov ebx,esi - ret -;--------------------------------------------------------------------- -delete_point_dir: - mov eax,[dirinfo.return] - cmp [eax+32+40],byte '.' - jne @f - cmp [eax+32+40+1],byte 0 - jne @f - mov edi,eax - add edi,32 - mov esi,edi - add esi,304 - mov ecx,[eax+4] - dec ecx - mov [eax+4],ecx - imul ecx,304 - shr ecx,2 - cld - rep movsd -@@: - ret -;--------------------------------------------------------------------- -;files_name_normalize: -; mov esi,[dirinfo.return] -; mov ebp,[esi+4] -; add esi,32+40 -;.start: -; push esi -; mov al,[esi] -; call char_toupper -; mov [esi],al -;@@: -; inc esi -; mov al,[esi] -; test al,al -; jz @f -; call char_todown -; mov [esi],al -; jmp @b -;@@: -; pop esi -; add esi,304 -; dec ebp -; jnz .start -; ret -;--------------------------------------------------------------------- -char_toupper: -; convert character to uppercase,using cp866 encoding -; in: al=symbol -; out: al=converted symbol - cmp al,'a' - jb .ret - cmp al,'z' - jbe .az - cmp al,'а' - jb .ret - cmp al,'р' - jb .rus1 - cmp al,'я' - ja .ret -; 0xE0-0xEF -> 0x90-0x9F - sub al,'р'-'Р' -.ret: - ret -.rus1: -; 0xA0-0xAF -> 0x80-0x8F -.az: - and al,not 0x20 - ret -;--------------------------------------------------------------------- -char_todown: -; convert character to uppercase,using cp866 encoding -; in: al=symbol -; out: al=converted symbol - cmp al,'A' - jb .ret - cmp al,'Z' - jbe .az - cmp al,'А' - jb .ret - cmp al,'Р' - jb .rus1 - cmp al,'Я' - ja .ret -; 0x90-0x9F -> 0xE0-0xEF - add al,'р'-'Р' -.ret: - ret -.rus1: -; 0x80-0x8F -> 0xA0-0xAF -.az: - add al,0x20 - ret -;--------------------------------------------------------------------- -copy_file_path: - xor eax,eax - cld -@@: - lodsb - stosb - test eax,eax - jnz @b - mov esi,edi - dec esi - std -@@: - lodsb - cmp al,'/' - jnz @b - mov edi,esi - add edi,2 - mov esi,ebx - cld -@@: - lodsb - stosb - test eax,eax - jnz @b - ret -;--------------------------------------------------------------------- -copy_dir_path: - mov ecx,esi - inc ecx - inc ecx - xor eax,eax - cld -@@: - lodsb - test eax,eax - jnz @b - - cmp ecx,esi - jb @f - dec esi -@@: - mov [esi-1],byte '/' - mov edi,esi - mov esi,ebx -@@: - lodsb - stosb - test eax,eax - jnz @b - ret -;--------------------------------------------------------------------- -copy_exit_dir: - mov ebx,esi - inc ebx - xor eax,eax - cld -@@: - lodsb - test eax,eax - jnz @b - sub esi,2 - std -@@: - lodsb - cmp al,'/' - jnz @b - xor eax,eax - cmp ebx,esi - jb @f - inc esi -@@: - mov [esi+1],al - cld - ret -;--------------------------------------------------------------------- -copy_dir_name: - push esi edi - mov esi,edi - mov edi,previous_dir_path - call .1 - pop edi esi -.1: - xor eax,eax - cmp [esi],al - je .exit - cld -@@: - lodsb - stosb - test eax,eax - jnz @b -.exit: - ret -;--------------------------------------------------------------------- -;--------------------------------------------------------------------- - -;plugins_directory db 'plugins/',0 -plugins_directory db 0 - -system_dir_Boxlib db '/sys/lib/box_lib.obj',0 -system_dir_CnvPNG db '/sys/lib/cnv_png.obj',0 -system_dir_Sort db '/sys/lib/sort.obj',0 -system_dir_UNPACK db '/sys/lib/archiver.obj',0 - -align 4 -l_libs_start: -library01 l_libs system_dir_Boxlib+9,file_name,system_dir_Boxlib,\ -Box_lib_import,plugins_directory - -library02 l_libs system_dir_CnvPNG+9,file_name,system_dir_CnvPNG,\ -cnv_png_import,plugins_directory - -library03 l_libs system_dir_Sort+9,file_name,system_dir_Sort,\ -Sort_import,plugins_directory - -library04 l_libs system_dir_UNPACK+9,file_name,system_dir_UNPACK,\ -UNPACK_import,plugins_directory - -end_l_libs: - -;--------------------------------------------------------------------- -align 4 -UNPACK_import: -;unpack_Version dd aUnpack_Version -;unpack_PluginLoad dd aUnpack_PluginLoad -;unpack_OpenFilePlugin dd aUnpack_OpenFilePlugin -;unpack_ClosePlugin dd aUnpack_ClosePlugin -;unpack_ReadFolder dd aUnpack_ReadFolder -;unpack_SetFolder dd aUnpack_SetFolder -;unpack_GetFiles dd aUnpack_GetFiles -;unpack_GetOpenPluginInfo dd aUnpack_GetOpenPluginInfo -;unpack_Getattr dd aUnpack_Getattr -;unpack_Open dd aUnpack_Open -;unpack_Read dd aUnpack_Read -;unpack_Setpos dd aUnpack_Setpos -;unpack_Close dd aUnpack_Close -;unpack_DeflateUnpack dd aUnpack_DeflateUnpack -unpack_DeflateUnpack2 dd aUnpack_DeflateUnpack2 - dd 0 - dd 0 - -;aUnpack_Version db 'version',0 -;aUnpack_PluginLoad db 'plugin_load',0 -;aUnpack_OpenFilePlugin db 'OpenFilePlugin',0 -;aUnpack_ClosePlugin db 'ClosePlugin',0 -;aUnpack_ReadFolder db 'ReadFolder',0 -;aUnpack_SetFolder db 'SetFolder',0 -;aUnpack_GetFiles db 'GetFiles',0 -;aUnpack_GetOpenPluginInfo db 'GetOpenPluginInfo',0 -;aUnpack_Getattr db 'getattr',0 -;aUnpack_Open db 'open',0 -;aUnpack_Read db 'read',0 -;aUnpack_Setpos db 'setpos',0 -;aUnpack_Close db 'close',0 -;aUnpack_DeflateUnpack db 'deflate_unpack',0 -aUnpack_DeflateUnpack2 db 'deflate_unpack2',0 - -;--------------------------------------------------------------------- -;--------------------------------------------------------------------- -align 4 -Sort_import: -sort_init dd aSort_init -sort_version dd aSort_version -sort_dir dd aSort_SortDir -sort_strcmpi dd aSort_strcmpi - dd 0 - dd 0 - -aSort_init db 'START',0 -aSort_version db 'version',0 -aSort_SortDir db 'SortDir',0 -aSort_strcmpi db 'strcmpi',0 - -;--------------------------------------------------------------------- -align 4 -cnv_png_import: -.Start dd aCP_Start -.Version dd aCP_Version -.Check dd aCP_Check -.Assoc dd aCP_Assoc - dd 0 - dd 0 -aCP_Start db 'START',0 -aCP_Version db 'version',0 -aCP_Check db 'Check_Header',0 -aCP_Assoc db 'Associations',0 -;--------------------------------------------------------------------- -align 4 -Box_lib_import: -;init_lib dd a_init -;version_lib dd a_version - - -edit_box_draw dd aEdit_box_draw -edit_box_key dd aEdit_box_key -edit_box_mouse dd aEdit_box_mouse -;version_ed dd aVersion_ed - -;check_box_draw dd aCheck_box_draw -;check_box_mouse dd aCheck_box_mouse -;version_ch dd aVersion_ch - -;option_box_draw dd aOption_box_draw -;option_box_mouse dd aOption_box_mouse -;version_op dd aVersion_op - -scrollbar_ver_draw dd aScrollbar_ver_draw -scrollbar_ver_mouse dd aScrollbar_ver_mouse -;scrollbar_hor_draw dd aScrollbar_hor_draw -;scrollbar_hor_mouse dd aScrollbar_hor_mouse -;version_scrollbar dd aVersion_scrollbar - -;dinamic_button_draw dd aDbutton_draw -;dinamic_button_mouse dd aDbutton_mouse -;version_dbutton dd aVersion_dbutton - -menu_bar_draw dd aMenu_bar_draw -menu_bar_mouse dd aMenu_bar_mouse -menu_bar_activate dd aMenu_bar_activate -;version_menu_bar dd aVersion_menu_bar - -FileBrowser_draw dd aFileBrowser_draw -FileBrowser_mouse dd aFileBrowser_mouse -FileBrowser_key dd aFileBrowser_key -;Version_FileBrowser dd aVersion_FileBrowser - -PathShow_prepare dd sz_PathShow_prepare -PathShow_draw dd sz_PathShow_draw -;Version_path_show dd szVersion_path_show - dd 0 - dd 0 - -;a_init db 'lib_init',0 -;a_version db 'version',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 - -;aCheck_box_draw db 'check_box_draw',0 -;aCheck_box_mouse db 'check_box_mouse',0 -;aVersion_ch db 'version_ch',0 - -;aOption_box_draw db 'option_box_draw',0 -;aOption_box_mouse db 'option_box_mouse',0 -;aVersion_op db 'version_op',0 - -aScrollbar_ver_draw db 'scrollbar_v_draw',0 -aScrollbar_ver_mouse db 'scrollbar_v_mouse',0 -;aScrollbar_hor_draw db 'scrollbar_h_draw',0 -;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0 -;aVersion_scrollbar db 'version_scrollbar',0 - -;aDbutton_draw db 'dbutton_draw',0 -;aDbutton_mouse db 'dbutton_mouse',0 -;aVersion_dbutton db 'version_dbutton',0 - -aMenu_bar_draw db 'menu_bar_draw',0 -aMenu_bar_mouse db 'menu_bar_mouse',0 -aMenu_bar_activate db 'menu_bar_activate',0 -;aVersion_menu_bar db 'version_menu_bar',0 - -aFileBrowser_draw db 'FileBrowser_draw',0 -aFileBrowser_mouse db 'FileBrowser_mouse',0 -aFileBrowser_key db 'FileBrowser_key',0 -;aVersion_FileBrowser db 'version_FileBrowser',0 - -sz_PathShow_prepare db 'PathShow_prepare',0 -sz_PathShow_draw db 'PathShow_draw',0 -;szVersion_path_show db 'version_PathShow',0 -;--------------------------------------------------------------------- -;--------------------------------------------------------------------- -align 4 -window_high dd 0 -window_width dd 0 -window_status dd 0 - -active_process dd 0 -PID dd 0 -sort_type dd 2 -root_folder_area dd 0 -root_folder_block dd 0 -root1_folder_area dd 0 -root1_folder_block dd 0 -temp_counter_1 dd 0 -retrieved_devices_table_counter dd 0 -communication_area dd 0 -open_dialog_type dd 0 - -open_dialog_title_pointer: - dd title_0 - dd title_1 - dd title_2 - dd 0 - -message_open_dialog_button: - dd message_0 - dd message_1 - dd message_2 - dd 0 -;--------------------------------------------------------------------- -expansion_length dd 0 -;--------------------------------------------------------------------- -N_error dd 0 -error_type dd 0 -error_path dd 0 -error_window_x: dd 100 shl 16+250 -error_window_y: dd 100 shl 16+120 -;--------------------------------------------------------------------- -mouse_scroll_data: -.vertical dw 0 -.horizontal dw 0 - -mouse_position: -.y dw 0 -.x dw 0 -;--------------------------------------------------------------------- -; not change this section!!! -; start section -;--------------------------------------------------------------------- -align 4 -image_file dd 0 -raw_pointer dd 0 -return_code dd 0 -img_size dd 0 -deflate_unpack dd 0 -raw_pointer_2 dd 0 ;+20 -;--------------------------------------------------------------------- -; end section -;--------------------------------------------------------------------- -align 4 -fileinfo: -.subfunction dd 5 -.Offset dd 0 -.Offset_1 dd 0 -.size dd 0 -.return dd file_info - db 0 -.name: dd file_name -;--------------------------------------------------------------------- -align 4 -dirinfo: -.subfunction dd 1 -.start dd 0 -.flags dd 0 -.size dd 0 -.return dd 0 - db 0 -.name: dd dir_path -;--------------------------------------------------------------------- -align 4 -dir_header: -.version dd 0 ;+0 -.curn_blocks dd 0 ;+4 -.totl_blocks dd 0 ;+8 -.other rb 20 -;--------------------------------------------------------------------- -load_ini_error_type: - db 'Error loading INI file',0 - -load_icons_error_type: - db 'Error loading of icons file',0 - -memory_free_error_type: - db 'Error of free memory',0 - -memory_get_error_type: - db 'Memory allocation error',0 - -load_directory_error_type: - db 'Error loading directory',0 - -convert_icons_error_type: - db 'Unsupported or corrupt data for icons file',0 -;--------------------------------------------------------------------- -error_help_text: - db 'For continue press key or ',0 -;--------------------------------------------------------------------- -align 4 -error_fs_text_pointers: - dd error_fs_text_0 - dd error_fs_text_1 - dd error_fs_text_2 - dd error_fs_text_3 - dd error_fs_text_4 - dd error_fs_text_5 - dd error_fs_text_6 - dd error_fs_text_7 - dd error_fs_text_8 - dd error_fs_text_9 - dd error_fs_text_10 - dd error_fs_text_11 - -error_fs_text_0: db '0 - Success full',0 -error_fs_text_1: db '1 - Base and/or partition of a hard disk is not defined',0 -error_fs_text_2: db '2 - Function is not supported for the given file system',0 -error_fs_text_3: db '3 - Unknown file system',0 -error_fs_text_4: db '4 - Reserved, is never returned in the current implementation',0 -error_fs_text_5: db '5 - File not found',0 -error_fs_text_6: db '6 - End of file, EOF',0 -error_fs_text_7: db '7 - Pointer lies outside of application memory',0 -error_fs_text_8: db '8 - Disk is full',0 -error_fs_text_9: db '9 - FAT table is destroyed',0 -error_fs_text_10: db '10 - Access denied',0 -error_fs_text_11: db '11 - Device error',0 -;--------------------------------------------------------------------- - -extended_key db 0 - -shift_flag db 0 -ctrl_flag db 0 -alt_flag db 0 - -error_window db 0 - -Tab_key db 0 -Tab_key_block db 0 - -filter_flag db 1 - -focus_pointer db 0 -;--------------------------------------------------------------------- -start_pach: - db '/sys',0 - -root_pach: - db '/',0 - -icons_file_name_2 db 'buttons/' -icons_path db '/sys/icons16.png',0 -ini_file_name db '/sys/File managers/icons.ini',0 -;--------------------------------------------------------------------- - -message: - db 'Press any key...',0 - -message_cancel_button: - db 'Cancel',0 - -message_ReloadDir_button: - db 'Refresh',0 - -message_ExitDir_button: - db '^',0 - -message_file_name: - db 'File name:',0 - -message_0: - db ' Open ',0 -message_1: - db ' Save ',0 -message_2: - db 'Select',0 - -title_0: - db 'Open Dialog',0 -title_1: - db 'Save Dialog',0 -title_2: - db 'Select Dir',0 -;--------------------------------------------------------------------- -align 4 -menu_data_1: -.type: dd 1 ;+0 -.x: -.size_x dw 80 ;+4 -.start_x dw 10 ;+6 -.y: -.size_y dw 15 ;+8 -.start_y dw 26 ;+10 -.text_pointer: dd menu_text_area_1 ;0 ;+12 -.pos_pointer: dd menu_text_area_1_1 ;0 ;+16 -.text_end dd menu_text_area_1_1 ;0 ;+20 -.ret_key dd 0 ;+24 -.mouse_keys dd 0 ;+28 -.x1: -.size_x1 dw 80 ;+32 -.start_x1 dw 10 ;+34 -.y1: -.size_y1 dw 100 ;+36 -.start_y1 dw 41 ;+38 -.bckg_col dd 0xffffff ;0xe5e5e5 ;+40 -.frnt_col dd 0xff ;+44 -.menu_col dd 0xeef0ff ;0xffffff ;+48 -.select dd 0 ;+52 -.out_select dd 0 ;+56 -.buf_adress dd 0 ;+60 -.procinfo dd procinfo ;+64 -.click dd 0 ;+68 -.cursor dd 0 ;+72 -.cursor_old dd 0 ;+76 -.interval dd 16 ;+80 -.cursor_max dd 0 ;+84 -.extended_key dd 0 ;+88 -.menu_sel_col dd 0x00cc00 ;+92 -.bckg_text_col dd 0 ; +96 -.frnt_text_col dd 0xffffff ;+100 -.mouse_keys_old dd 0 ;+104 -.font_height dd 8 ;+108 -.cursor_out dd 0 ;+112 -.get_mouse_flag dd 0 ;+116 -;--------------------------------------------------------------------- -menu_text_area_1: -db 'Select Disk',0 -;--------------------------------------------------------------------- -align 4 -menu_data_2: -.type: dd 0 ;+0 -.x: -.size_x dw 30 ;+4 -.start_x dw 95 ;+6 -.y: -.size_y dw 15 ;+8 -.start_y dw 26 ;+10 -.text_pointer: dd menu_text_area_2 ;0 ;+12 -.pos_pointer: dd menu_text_area_2.1 ;0 ;+16 -.text_end dd menu_text_area_2.end ;0 ;+20 -.ret_key dd 0 ;+24 -.mouse_keys dd 0 ;+28 -.x1: -.size_x1 dw 30 ;+32 -.start_x1 dw 95 ;+34 -.y1: -.size_y1 dw 100 ;+36 -.start_y1 dw 41 ;+38 -.bckg_col dd 0xffffff ; 0xe5e5e5 ;+40 -.frnt_col dd 0xff ;+44 -.menu_col dd 0xeef0ff ;0xffffff ;+48 -.select dd 0 ;+52 -.out_select dd 0 ;+56 -.buf_adress dd 0 ;+60 -.procinfo dd procinfo ;+64 -.click dd 0 ;+68 -.cursor dd 0 ;+72 -.cursor_old dd 0 ;+76 -.interval dd 16 ;+80 -.cursor_max dd 0 ;+84 -.extended_key dd 0 ;+88 -.menu_sel_col dd 0x00cc00 ;+92 -.bckg_text_col dd 0 ; +96 -.frnt_text_col dd 0xffffff ;+100 -.mouse_keys_old dd 0 ;+104 -.font_height dd 8 ;+108 -.cursor_out dd 0 ;+112 -.get_mouse_flag dd 0 ;+116 -;--------------------------------------------------------------------- -menu_text_area_2: -db 'Sort',0 -.1: -db 'Name',0 -db 'Type',0 -db 'Date',0 -db 'Size',0 -.end: -db 0 -;--------------------------------------------------------------------- -align 4 -menu_data_3: -.type: dd 0 ;+0 -.x: -.size_x dw 45 ;+4 -.start_x dw 130 ;+6 -.y: -.size_y dw 15 ;+8 -.start_y dw 26 ;+10 -.text_pointer: dd menu_text_area_3 ;0 ;+12 -.pos_pointer: dd menu_text_area_3.1 ;0 ;+16 -.text_end dd menu_text_area_3.end ;0 ;+20 -.ret_key dd 0 ;+24 -.mouse_keys dd 0 ;+28 -.x1: -.size_x1 dw 95 ;+32 -.start_x1 dw 130 ;+34 -.y1: -.size_y1 dw 100 ;+36 -.start_y1 dw 41 ;+38 -.bckg_col dd 0xffffff ; 0xe5e5e5 ;+40 -.frnt_col dd 0xff ;+44 -.menu_col dd 0xeef0ff ;0xffffff ;+48 -.select dd 0 ;+52 -.out_select dd 0 ;+56 -.buf_adress dd 0 ;+60 -.procinfo dd procinfo ;+64 -.click dd 0 ;+68 -.cursor dd 0 ;+72 -.cursor_old dd 0 ;+76 -.interval dd 16 ;+80 -.cursor_max dd 0 ;+84 -.extended_key dd 0 ;+88 -.menu_sel_col dd 0x00cc00 ;+92 -.bckg_text_col dd 0 ; +96 -.frnt_text_col dd 0xffffff ;+100 -.mouse_keys_old dd 0 ;+104 -.font_height dd 8 ;+108 -.cursor_out dd 0 ;+112 -.get_mouse_flag dd 0 ;+116 -;--------------------------------------------------------------------- -menu_text_area_3: -db 'Filter',0 -.1: -db '*.* - show all',0 -db 'Only supported',0 -.end: -db 0 -;--------------------------------------------------------------------- - -align 4 -scroll_bar_data_vertical: -.x: -.size_x dw 15 ;+0 -.start_x dw 500 ;+2 -.y: -.size_y dw 300 ;+4 -.start_y dw 45 ;+6 -.btn_high dd 15 ;+8 -.type dd 2 ;+12 -.max_area dd 10 ;+16 -.cur_area dd 2 ;+20 -.position dd 0 ;+24 -.bckg_col dd 0xeeeeee ;+28 -.frnt_col dd 0xbbddff ;+32 ;0x8aeaa0 -.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 -file_browser_data_1: -.type dd 0 ;+0 -.x: -.size_x dw 400 ;+4 -.start_x dw 10 ;+6 -.y: -.size_y dw 550 ;+8 -.start_y dw 45 ;+10 -.icon_size_y dw 16 ; +12 -.icon_size_x dw 16 ; +14 -.line_size_x dw 0 ; +16 -.line_size_y dw 18 ; +18 -.type_size_x dw 0 ; +20 -.size_size_x dw 0 ; +22 -.date_size_x dw 0 ; +24 -.attributes_size_x dw 0 ; +26 -.icon_assoc_area dd 0 ; +28 -.icon_raw_area dd 0 ; +32 -.resolution_raw dd 0 ; +36 -.palette_raw dd 0 ; +40 -.directory_path_area dd 0 ; +44 -.file_name_area dd 0 ; +48 -.select_flag dd 0 ; +52 -.background_color dd 0xffffff ; +56 -.select_color dd 0xbbddff ; +60 -.seclect_text_color dd 0 ; +64 -.text_color dd 0 ; +68 -.reduct_text_color dd 0xff0000 ; +72 -.marked_text_color dd 0 ; +76 -.max_panel_line dd 0 ; +80 -.select_panel_counter dd 1 ; +84 -.folder_block dd 0 ; +88 -.start_draw_line dd 0 ; +92 -.start_draw_cursor_line dw 0 ; +96 ; pixels -.folder_data dd 0 ; +98 -.temp_counter dd 0 ; +102 -.file_name_length dd 0 ; +106 -.marked_file dd 0 ; +110 -.extension_size dd 0 ; +114 -.extension_start dd 0 ; +118 -.type_table dd features_table ; +122 -.ini_file_start dd 0 ; +126 -.ini_file_end dd 0 ; +130 -.draw_scroll_bar dd 0 ; +134 -.font_size_y dw 9 ; +138 -.font_size_x dw 6 ; +140 -.mouse_keys dd 0 ; +142 -.mouse_keys_old dd 0 ; +146 -.mouse_pos dd 0 ; +150 -.mouse_keys_delta dd 0 ; +154 -.mouse_key_delay dd 50 ; +158 -.mouse_keys_tick dd 0 ; +162 -.start_draw_cursor_line_2 dw 0 ;+166 -.all_redraw dd 0 ;+168 -.selected_BDVK_adress dd 0 ;+172 -.key_action dw 0 ;+176 -.key_action_num dw 0 ;+178 -.name_temp_area dd name_temp_area ;+180 -.max_name_temp_size dd 0 ;+184 -.display_name_max_length dd 0 ;+188 -.draw_panel_selection_flag dd 0 ;+192 -.mouse_pos_old dd 0 ;+196 -.marked_counter dd 0 ;+200 -.keymap_pointer dd keymap_area ;+204 -;--------------------------------------------------------------------- -PathShow_data_1: -.type dd 0 ;+0 -.start_y dw 11 ;+4 -.start_x dw 10 ;+6 -.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 -.area_size_x dw 200 ;+10 -.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable -.background_flag dd 0 ;+16 -.font_color dd 0x0 ;+20 -.background_color dd 0x0 ;+24 -.text_pointer dd dir_path ;+28 -.work_area_pointer dd text_work_area ;+32 -.temp_text_length dd 0 ;+36 -;--------------------------------------------------------------------- -; for EDITBOX -align 4 -name_editboxes: -edit1 edit_box 200,10,7,0xffffff,0xbbddff,0,0,0,4095,user_selected_name,mouse_dd,,0 -name_editboxes_end: - -;mouse_flag: dd 0x0 - -mouse_dd rd 1 -;--------------------------------------------------------------------- -window_x: -.x_size dw 420 -.x_start dw 10 -window_y: -.y_size dw 320 -.y_start dw 10 -;--------------------------------------------------------------------- -features_table: -.type_table: - db ' ' -;--------------------------------------------------------------------- -.size_table: - db '1023b ' -;--------------------------------------------------------------------- -.date_table: - db '00.00.0000 00:00 ' -;--------------------------------------------------------------------- -example_name_temp: - db 'temp1.asm',0 -;--------------------------------------------------------------------- -IM_END: -;--------------------------------------------------------------------- -do_not_draw_open_button_label rb 1 -;--------------------------------------------------------------------- -;include_debug_strings -;--------------------------------------------------------------------- -align 4 -app_colours: - -w_frame rd 1 -w_grab rd 1 -w_work_dark rd 1 -w_work_light rd 1 -w_grab_text rd 1 -w_work rd 1 -w_work_button rd 1 -w_work_button_text rd 1 -w_work_text rd 1 -w_work_graph rd 1 -;--------------------------------------------------------------------- -open_button_coordinates rd 1 -;--------------------------------------------------------------------- -error_handler_store_input_mode rd 1 -;--------------------------------------------------------------------- -menu_text_area_1_1: -rb 256 -;--------------------------------------------------------------------- - rb 1024 -stacktop: -;--------------------------------------------------------------------- -; window error message - rb 1024 -thread_stack: -;--------------------------------------------------------------------- -retrieved_devices_table: - rb 200 -;--------------------------------------------------------------------- -keymap_area: - rb 128 -;--------------------------------------------------------------------- -name_temp_area: - rb 256 -;--------------------------------------------------------------------- -user_selected_name: - rb 256 -;--------------------------------------------------------------------- -param: - rb 256 -;--------------------------------------------------------------------- -path: - rb 4096 -;--------------------------------------------------------------------- -file_name: - rb 4096 -;--------------------------------------------------------------------- -previous_dir_path: - rb 4096 -;--------------------------------------------------------------------- -dir_path: - rb 4096 -;--------------------------------------------------------------------- -dir_path_temp: - rb 4096 -;--------------------------------------------------------------------- -text_work_area: - rb 1024 -;--------------------------------------------------------------------- -procinfo: -process_info: - rb 1024 -;---------------------- -file_info: - rb 40 -I_END: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +;***************************************************************************** +; Open Dialog - for Kolibri OS +; Copyright (c) 2009-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_open_dialog',0 ; FFFFFFFF = PID +; +; communication area data +; flag ; +0 +; dw 0 ; 0 - empty, 1 - file for open, 2 -folder for open, +; 3 - cancel, 4 - path=name of area 6822. +; +; type of dialog: 0-Open, 1-Save, 2-Dir +; 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 +; +; OpenDialog WINDOW SLOT ; +12 +; dd 0 +; +; file_path ; +16 +; rb 3824 ; path to file +; +; file name ; +3840 +; rb 256 +; +; filtration flag ; +4096 +; dd 0 ; flag 0 - no filtration, 1 - filtering +; +; area for storage of filtering values ; +4100 +; rb 4092 +;--------------------------------------------------------------------- + use32 + org 0x0 + + db 'MENUET01' + dd 0x01 + dd START + dd IM_END + dd I_END + dd stacktop + dd param + dd path + +include '../../macros.inc' +;define __DEBUG__ 1 +;define __DEBUG_LEVEL__ 1 +;include '../../debug-fdo.inc' +include '../../KOSfuncs.inc' +include '../../load_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' +;include 'macros.inc' +;include 'load_lib.mac' +;include 'box_lib.mac' +@use_library + +x_minimal_size equ 350 +y_minimal_size equ 250 +;--------------------------------------------------------------------- +;--------------------------------------------------------------------- +START: + mcall 68,11 + mcall 66,1,1 + mcall 40,0x27 + call get_communication_area + + call get_active_pocess + +load_libraries l_libs_start,end_l_libs + test eax,eax + jnz button.exit +; initialize sort + push dword 1 + call dword [sort_init] +; unpack deflate + mov eax,[unpack_DeflateUnpack2] + mov [deflate_unpack],eax + + mov esi,start_pach + mov edi,previous_dir_path + call copy_dir_name.1 + + call load_root_directory + call load_start_directory + call sort_directory + call load_icons + call convert_icons + call load_ini + call calc_ini + jmp red_1 +;--------------------------------------------------------------------- +red: + call control_minimal_window_size +red_1: + 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 +;--------------------------------------------------------------------- +control_minimal_window_size: + pusha + call get_window_param + test [window_status],10b + jnz .end ;red_1 + test [window_status],100b + jnz .end ;red_1 + test [window_status],1b + jnz .end ;red_1 + mov esi,-1 + mov eax,procinfo + mov eax,[eax+46] + cmp eax,dword y_minimal_size ;200 + jae @f + mov esi,dword y_minimal_size ;200 + mcall 67,-1,ebx,ebx +@@: + mov edx,-1 + mov eax,procinfo + mov eax,[eax+42] + cmp eax,dword x_minimal_size ;300 + jae @f + mov edx,dword x_minimal_size ;300 + mcall 67,-1,ebx,,ebx +@@: +.end: + popa + ret +;--------------------------------------------------------------------- +key: + mov al,[focus_pointer] + test al,al + jne key_ASCII + mcall 2 + xor ebx,ebx + cmp [extended_key],1 + je .extended_key + test al,al + jnz still + cmp ah,0xE0 + jne @f + mov [extended_key],1 + jmp still +@@: + cmp ah,72 ; arrow up + je .2 + cmp ah,80 ; arrow down + je .1 + cmp ah,28 ; Enter + je .7 + cmp ah,1 ; Esc + je button.exit + cmp ah,14 ; Backspace + je button.exit_dir + cmp ah,187 ; F1 + je select_disk + cmp ah,188 ; F2 + je select_sort + cmp ah,189 ; F3 + je select_filter + cmp ah,19 ; R + je button.reload_dir + cmp ah,42 + je key_shift_up + cmp ah,54 + je key_shift_up + cmp ah,170 + je key_shift_down + cmp ah,182 + je key_shift_down + cmp ah,29 + je key_ctrl_up + cmp ah,157 + je key_ctrl_down + cmp ah,56 + je key_alt_up + cmp ah,184 + je key_alt_down + cmp ah,206 ; NumPad+ Up + je NumPad_plus_Up + cmp ah,202 ; NumPad- Up + je NumPad_minus_Up + cmp ah,183 ; NumPad* Up + je NumPad_invert_Up + cmp ah,158 + je symbol_a_up + cmp ah,15 ; Tab down + je change_focus_area_press_Tab_key + cmp ah,143 ; Tab up + je change_focus_area_check_Tab_key +; compare for "1,2,3,4,5,6,7,8,9,0,(-),(=)" + cmp ah,2 + jb still + cmp ah,13 + jbe .12 +; compare for "q,w,e,r,t,y,u,i,o,p,([),(])" + cmp ah,16 + jb still + cmp ah,27 + jbe .12 +; compare for "a,s,d,f,g,h,j,k,l,(;),('),(`)" + cmp ah,30 + jb still + cmp ah,41 + jbe .12 +; compare for "(\),z,x,c,v,b,n,m,(,),(.),(/)" + cmp ah,43 + jb still + cmp ah,53 + jbe .12 + jmp still +.extended_key: + mov [extended_key],0 + cmp ah,80 ; arrow down + je .1 + cmp ah,72 ; arrow up + je .2 + cmp ah,81 ; PageDown + je .3 + cmp ah,73 ; PageUp + je .4 + cmp ah,71 ; Home + je .5 + cmp ah,79 ; End + je .6 + cmp ah,28 ; Enter + je .7 + cmp ah,82 ; Insert + je .8 + + cmp ah,29 + je key_ctrl_up + cmp ah,157 + je key_ctrl_down + cmp ah,56 + je key_alt_up + cmp ah,184 + je key_alt_down + jmp still +;--------------------------------- +.12: + inc ebx ; 12 - Search with key +;--------------------------------- +.11: + inc ebx ; 11 - Invert Mark +;--------------------------------- +.10: + inc ebx ; 10 - Unmark All +;--------------------------------- +.9: + inc ebx ; 9 - Mark All +;--------------------------------- +.8: + inc ebx ; 8 - Insert (Mark) +;--------------------------------- +.7: + inc ebx ; 7 - Enter +;--------------------------------- +.6: + inc ebx ; 6 - End +;--------------------------------- +.5: + inc ebx ; 5 - Home +;--------------------------------- +.4: + inc ebx ; 4 - PageUp +;--------------------------------- +.3: + inc ebx ; 3 - PageDown +;--------------------------------- +.2: + inc ebx ; 2 - arrow up +;--------------------------------- +.1: + inc ebx ; 1 - arrow down +;--------------------------------- + call .key_action + +; movzx ecx,word [file_browser_data_1.start_draw_cursor_line] +; mcall 47,0x80000,,<50,0>,0x40000000,0xffffff +; movzx ecx,word [file_browser_data_1.size_y] +; mcall 47,0x80000,,<150,0>,0x40000000,0xffffff + + mov eax,file_browser_data_1.mouse_keys_delta + cmp [eax],dword 3 + jne still + xor ebx,ebx + mov [eax],ebx + call load_next_dir + jmp still +;------------------------------------------------------- +.key_action: + mov [file_browser_data_1.key_action],bx + shr ax,8 + mov [file_browser_data_1.key_action_num],ax + + push dword file_browser_data_1 + call [FileBrowser_key] + + call draw_open_button_label + + cmp [file_browser_data_1.draw_scroll_bar],0 + je @f + call draw_scrollbar1 + mov [file_browser_data_1.draw_scroll_bar],0 +@@: + ret +;--------------------------------------------------------------------- +change_focus_area_Tab_key_ASCII: + xor eax,eax + inc eax + mov [Tab_key_block],al + jmp change_focus_area +;--------------------------------------------------------------------- +change_focus_area_press_Tab_key: + cmp [open_dialog_type],1 + jne still + mov al,[Tab_key_block] + test al,al + jnz still + xor eax,eax + inc eax + mov [Tab_key],al + jmp still +;--------------------------------------------------------------------- +change_focus_area_check_Tab_key: + cmp [open_dialog_type],1 + jne still + xor eax,eax + mov [Tab_key_block],al + mov al,[Tab_key] + test al,al + jz still + xor eax,eax + mov [Tab_key],al +;--------------------------------------------------------------------- +change_focus_area: + mov al,[focus_pointer] + inc al + and al,1 + mov [focus_pointer],al +.1: + mov edi,edit1 + test al,al + jne @f + mov [file_browser_data_1.select_panel_counter],1 + and [edi+44],dword 0xFFFFFFFD ; ed_focus + mov [edi+12],dword 0xffffff ; color white + call draw_draw_file_browser1 + mcall 66,1,1 + jmp still +@@: + mov [file_browser_data_1.select_panel_counter],0 + or [edi+44],dword ed_focus + mov [edi+12],dword 0xffffb0 ; color yellow + call draw_draw_file_browser1 + mcall 66,1,0 + jmp still +;--------------------------------------------------------------------- +key_ASCII: + mcall 2 + cmp ah,9 + je change_focus_area_Tab_key_ASCII + cmp ah,13 + je .13 + cmp ah,27 + je button.exit + push dword name_editboxes + call [edit_box_key] + jmp still +.13: +; cmp [open_dialog_type],2 ; Select dir +; je file_no_folder +; cmp [open_dialog_type],1 ; Save file +; jne user_selected_name_action ; load_dir +; inc [open_dialog_type] + jmp file_no_folder +;.load_dir: +; mov [file_browser_data_1.select_panel_counter],1 +; xor eax,eax +; mov [focus_pointer],al +; mcall 66,1,1 + +; xor eax,eax +; mov esi,dir_path +; cld +;@@: +; lodsb +; test al,al +; jne @r +; sub esi,2 +; cmp [esi],byte '/' +; jne @f +; xor eax,eax +; mov [esi],al +;@@: +; call load_next_dir.1 +; jmp still +;--------------------------------------------------------------------- +user_selected_name_action: + mov eax,[communication_area] + test eax,eax + jnz @f + call control_minimal_window_size + call draw_window + ret +@@: + add eax,16 ;12 +;copy_path user_selected_name,dir_path,eax,0 + mov esi,dir_path + mov edi,eax + call copy_dir_name + mov [edi-1],byte '/' + mov esi,user_selected_name + call copy_dir_name + + mov eax,[communication_area] + mov [eax],word 1 + jmp button.exit +;--------------------------------------------------------------------- +select_disk: + call check_alt +.1: + call load_root_directory + xor eax,eax + mov [menu_data_1.ret_key],eax + + push dword menu_data_1 + call [menu_bar_activate] + + call clear_control_key_flag + + mov eax,[menu_data_1.ret_key] + mov [menu_data_1.ret_key],dword 0 + cmp eax,1 + je select_filter.1 + + cmp eax,2 + je select_sort.1 + + cmp [menu_data_1.click],dword 1 + jne still + + cmp [menu_data_1.cursor_out],dword 0 + jne analyse_out_menu_1 + jmp still +;--------------------------------------------------------------------- +select_sort: + call check_alt +.1: + xor eax,eax + mov [menu_data_2.ret_key],eax + + push dword menu_data_2 + call [menu_bar_activate] + + call clear_control_key_flag + + mov eax,[menu_data_2.ret_key] + mov [menu_data_2.ret_key],dword 0 + cmp eax,1 + je select_disk.1 + + cmp eax,2 + je select_filter.1 + + + cmp [menu_data_2.click],dword 1 + jne still + + cmp [menu_data_2.cursor_out],dword 0 + jne analyse_out_menu_2 + jmp still +;--------------------------------------------------------------------- +select_filter: + call check_alt +.1: + xor eax,eax + mov [menu_data_3.ret_key],eax + + push dword menu_data_3 + call [menu_bar_activate] + + call clear_control_key_flag + + mov eax,[menu_data_3.ret_key] + mov [menu_data_3.ret_key],dword 0 + cmp eax,1 + je select_sort.1 + + cmp eax,2 + je select_disk.1 + + + cmp [menu_data_3.click],dword 1 + jne still + + cmp [menu_data_3.cursor_out],dword 0 + jne analyse_out_menu_3 + jmp still +;--------------------------------------------------------------------- +symbol_a_up: +NumPad_plus_Up: + call check_ctrl + jmp key.9 +;--------------------------------------- +NumPad_minus_Up: + call check_ctrl + jmp key.10 +;--------------------------------------- +NumPad_invert_Up: + call check_ctrl + jmp key.11 +;--------------------------------------- +check_alt: + xor eax,eax + mov al,[alt_flag] + test eax,eax + jz @f + xor ebx,ebx + ret +@@: + add esp,4 + jmp still +;--------------------------------------- +check_ctrl: + xor eax,eax + mov al,[ctrl_flag] + test eax,eax + jz @f + xor ebx,ebx + ret +@@: + add esp,4 + jmp still +;--------------------------------------------------------------------- +clear_control_key_flag: + xor eax,eax + mov [shift_flag],al + mov [ctrl_flag],al + mov [alt_flag],al + ret +;--------------------------------------------------------------------- +key_shift_up: + mov [shift_flag],1 + jmp still +;--------------------------------------------------------------------- +key_shift_down: + mov [shift_flag],0 + jmp still +;--------------------------------------------------------------------- +key_ctrl_up: + mov [ctrl_flag],1 + jmp still +;--------------------------------------------------------------------- +key_ctrl_down: + mov [ctrl_flag],0 + jmp still +;--------------------------------------------------------------------- +key_alt_up: + mov [alt_flag],1 + jmp still +;--------------------------------------------------------------------- +key_alt_down: + mov [alt_flag],0 + jmp still +;--------------------------------------------------------------------- +button: + mcall 17 + cmp ah,6 + je .reload_dir_1 + cmp ah,4 + je .open_dir_or_file + cmp ah,3 + je .exit + cmp ah,2 + je .exit_dir + cmp ah,1 + jne still +.exit: + mov eax,[communication_area] + test eax,eax + jz @f + cmp [eax],word 1 + je @f + mov [eax],word 3 +@@: + mov eax,[N_error] + test eax,eax + jz @f + call start_error_window_thread +@@: + call get_window_param + mov ebx,[communication_area] + mov ecx,procinfo +; mov eax,[window_x] + mov eax,[ecx+34] + shl eax,16 + add eax,[ecx+42] + mov [ebx+4],eax +; mov eax,[window_y] + mov eax,[ecx+38] + shl eax,16 + add eax,[ecx+46] + mov [ebx+8],eax + + mcall -1 +;--------------------------------------------------------------------- +.reload_dir: + cmp [ctrl_flag],bl + je key.12 ; Just symbol 'R' or 'r' +.reload_dir_1: + call load_next_dir.1 + jmp still +;--------------------------------------------------------------------- +.exit_dir: + call load_next_dir.exit_dir + jmp still +;--------------------------------------------------------------------- +.open_dir_or_file: + cmp [open_dialog_type],0 ;Open file + jne @f + + mov eax,[file_browser_data_1.folder_data] + mov eax,[eax+4] + test eax,eax + jz button.exit +@@: + cmp [open_dialog_type],2 ;Select dir + je file_no_folder + + cmp [open_dialog_type],1 ;Save file + jne @f + + mov al,[focus_pointer] + test al,al + jne file_no_folder +@@: + xor ebx,ebx + jmp key.7 +;--------------------------------------------------------------------- +thread_start: + mov eax,[N_error] + cmp al,1 + jne @f + mov [N_error],load_ini_error_type + mov [error_path],file_name + jmp .error_type +@@: + cmp al,2 + jne @f + mov [N_error],load_icons_error_type + mov [error_path],file_name + jmp .error_type +@@: + cmp al,3 + jne @f + mov [N_error],memory_free_error_type + xor eax,eax + mov [error_path],eax + mov [error_type],eax + jmp .red +@@: + cmp al,4 + jne @f + mov [N_error],memory_get_error_type + xor eax,eax + mov [error_path],eax + mov [error_type],eax + jmp .red +@@: + cmp al,5 + jne @f + mov [N_error],load_directory_error_type + mov [error_path],dir_path + jmp .error_type +@@: + cmp al,6 + jne .button + mov [N_error],convert_icons_error_type + mov [error_path],file_name + xor eax,eax + mov [error_type],eax + jmp .red +.error_type: + mov eax,[error_type] + shl eax,2 + add eax,error_fs_text_pointers + mov eax,[eax] + mov [error_type],eax +.red: + call draw_error_window +.still: + mcall 10 + cmp eax,1 + je .red + cmp eax,2 + je .key + cmp eax,3 + je .button + jmp .still +.key: + mcall 2 + jmp .still +.button: + mcall -1 + jmp .still +;--------------------------------------------------------------------- +draw_error_window: + mcall 12,1 + mcall 0,[error_window_x],[error_window_y],0x03ff0000 + call type_title + mcall 4,<10,30>,0x90ffffff,[N_error] + mov eax,[error_path] + test eax,eax + jz @f + mcall 4,<10,50>,,[error_path] +@@: + mov eax,[error_type] + test eax,eax + jz @f + mcall 4,<10,70>,,[error_type] +@@: + mcall 12,2 + ret +;--------------------------------------------------------------------- +start_error_window_thread: + mcall 9,procinfo,-1 + mov eax,[ebx+46] + shr eax,1 + add eax,[ebx+38] + sub eax,40 + mov [error_window_y+2],ax + mov eax,[ebx+42] + shr eax,1 + add eax,[ebx+34] + sub eax,125 + mov [error_window_x+2],ax + mcall 51,1,thread_start,thread_stack + ret +;--------------------------------------------------------------------- +mouse: + mcall 18,7 + cmp [active_process],eax + jne still + + mcall 37,7 + mov [mouse_scroll_data],eax + + mcall 37,1 + mov [mouse_position],eax + + cmp [scroll_bar_data_vertical.delta2],0 + jne .scrollbar + + mov [file_browser_data_1.select_flag],0 + + push dword file_browser_data_1 + call [FileBrowser_mouse] + + call draw_open_button_label + + mov eax,file_browser_data_1.mouse_keys_delta + cmp [eax],dword 3 + jne .check_focus ; scrollbar + mov [eax],dword 0 + call load_next_dir + jmp still +;--------------------------------------------------- +.check_focus: + mov ebx,[file_browser_data_1.select_flag] + test ebx,ebx + jz .scrollbar ;@f + mov al,[focus_pointer] + test al,al + jz .scrollbar + xor eax,eax + mov [focus_pointer],al + jmp change_focus_area.1 +;--------------------------------------------------- +.scrollbar: + mov eax,[scroll_bar_data_vertical.max_area] + cmp eax,[scroll_bar_data_vertical.cur_area] + jbe .menu_bar ;still + + push dword scroll_bar_data_vertical + call [scrollbar_ver_mouse] + + cmp [scroll_bar_data_vertical.redraw],0 + je .menu_bar ;still + mov [scroll_bar_data_vertical.redraw],0 +.draw: + call draw_draw_file_browser2 + jmp still + +;--------------------------------------------------- +.menu_bar: + cmp [scroll_bar_data_vertical.delta2],0 + jne still + +.menu_bar_1: + call .set_mouse_flag +@@: + 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 select_disk.1 ;analyse_out_menu_1 + jmp .menu_bar_1 +;-------------------------------------------- +.menu_bar_2: + push dword menu_data_2 + call [menu_bar_mouse] + + cmp [menu_data_2.click],dword 1 + jne .menu_bar_3 + + cmp [menu_data_2.cursor_out],dword 0 + jne analyse_out_menu_2 + jmp .menu_bar_1 +;--------------------------------------------------- +.menu_bar_3: + push dword menu_data_3 + call [menu_bar_mouse] + + cmp [menu_data_3.click],dword 1 + jne .check_editboxes + + cmp [menu_data_3.cursor_out],dword 0 + jne analyse_out_menu_3 + jmp .menu_bar_1 +;--------------------------------------------------- +.check_editboxes: + cmp [open_dialog_type],1 + jne .check_scroll_event + mov eax,[edit1+44] + and eax,10b + push dword name_editboxes + call [edit_box_mouse] + mov ebx,[edit1+44] + and ebx,10b + cmp eax,ebx + je .check_scroll_event + mov al,[focus_pointer] + test al,al + jnz .check_scroll_event + xor eax,eax + test ebx,10b + jz @f + inc eax +@@: + mov [focus_pointer],al + jmp change_focus_area.1 +;--------------------------------------------------- +.check_scroll_event: + mov eax,[mouse_position] + xor ebx,ebx + mov bx,ax ; EBX mouse y + shr eax,16 ; EAX mouse x + + mov cx,[file_browser_data_1.start_x] + mov dx,[file_browser_data_1.start_y] + + cmp ax,cx + jb .mouse_next ; min x + + cmp bx,dx + jb .mouse_next ; min y + + add cx,[file_browser_data_1.size_x] + cmp ax,cx + ja .mouse_next ; max x + + add dx,[file_browser_data_1.size_y] + cmp bx,dx + ja .mouse_next ; max y + + xor ecx,ecx + xor ebx,ebx + mov eax,[mouse_scroll_data] + test eax,eax + jz .mouse_next + test ax,0x8000 + jnz .decr + shr eax,16 + test ax,0x8000 + jnz .decr_1 + + mov cx,[mouse_scroll_data.vertical] + test ecx,ecx + jnz @f + mov cx,[mouse_scroll_data.horizontal] + test ecx,ecx + jz .mouse_next +@@: + mov ebx,1 +@@: + push ebx ecx + call key.key_action + pop ecx ebx + dec ecx + jnz @r + jmp still +;---------------------------------------- +.decr: + mov bx,[mouse_scroll_data.vertical] + jmp @f +.decr_1: + mov bx,[mouse_scroll_data.horizontal] +@@: + mov ecx,0xffff + sub ecx,ebx + inc ecx + mov ebx,2 +@@: + push ebx ecx + call key.key_action + pop ecx ebx + dec ecx + jnz @r + jmp still +;--------------------------------------------------- +.mouse_next: + jmp still +;--------------------------------------------------------------------- +.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: +; Available disks + mov eax,[menu_data_1.cursor_out] + dec eax + imul esi,eax,10 + add esi,retrieved_devices_table + mov edi,dir_path + call copy_dir_name + call load_next_dir.1 + jmp still +;--------------------------------------------------------------------- +analyse_out_menu_2: +; Sort + mov eax,[menu_data_2.cursor_out] + xor ebx,ebx + cmp eax,dword 1 + je .1 + cmp eax,dword 2 + je .2 + cmp eax,dword 3 + je .3 + cmp eax,dword 4 + je .4 + jmp still +.4: + add ebx,2 +.3: + add ebx,2 +.2: + add ebx,2 +.1: + mov [sort_type],ebx + call sort_directory + call draw_draw_file_browser1 + jmp still +;--------------------------------------------------------------------- +analyse_out_menu_3: +; Filter + mov eax,[menu_data_3.cursor_out] + cmp eax,dword 1 + jne @f + mov [filter_flag],0 + call load_next_dir.1 + jmp still +@@: + cmp eax,dword 2 + jne still + mov [filter_flag],1 + call load_next_dir.1 + jmp still +;--------------------------------------------------------------------- +get_communication_area: + xor eax,eax + mov al,[param] + test eax,eax + jz .exit + mcall 68,22,param,,0x01 + mov [communication_area],eax + movzx ebx,word [eax+2] + mov [open_dialog_type],ebx + cmp ebx,1 + jne @f + pushad + mov [focus_pointer],bl + mov edi,edit1 + mov [file_browser_data_1.select_panel_counter],0 + or [edi+44],dword ed_focus + mov [edi+12],dword 0xffffb0 ; color yellow + mcall 66,1,0 + popad +@@: + mov ebx,[eax+4] + cmp bx,word x_minimal_size ;300 + jb @f + mov [window_x],ebx + mov ebx,[eax+8] + cmp bx,word y_minimal_size ;200 + jb @f + mov [window_y],ebx +.exit: + ret +;--------------------------------------------------------------------- +load_start_directory: + mov eax,[communication_area] + test eax,eax + jz .1 + movzx ebx,word [eax] + test eax,eax + jz .1 + add eax,16 ;12 ;4 + mov esi,eax + push esi + mov esi,[communication_area] + add esi,3840 ;4096-256 + mov eax,[esi] + test al,al + jnz @f + mov esi,example_name_temp +@@: + mov edi,user_selected_name + call copy_dir_name + pop esi + jmp .2 +.1: + mov esi,start_pach +.2: + mov edi,dir_path + call copy_dir_name + +; call load_directory +; mov eax,[N_error] +; test eax,eax +; jnz button.exit +.3: + call load_directory + mov eax,[N_error] + test eax,eax + jz @f + call error_handler + jmp .3 +@@: + ret +;--------------------------------------------------------------------- +load_next_dir: + mov ebx,[file_browser_data_1.folder_block] + test ebx,ebx + jz .exit + + mov ebx,[file_browser_data_1.selected_BDVK_adress] + add ebx,40 + test [ebx-40],byte 0x10 + jz file_no_folder + cmp [ebx],word '..' + jne @f + cmp [ebx+2],byte 0 + je .exit_dir +@@: + mov esi,dir_path + call copy_dir_path + +@@: +.1: + call load_directory + mov eax,[N_error] + test eax,eax + jz @f + call error_handler + jmp .1 +@@: + call sort_directory + + mov ebx,[scroll_bar_data_vertical.x] + inc ebx + mov ecx,[scroll_bar_data_vertical.y] + inc ecx + mcall 13,,,0xcccccc + mov edi,edit1 + xor eax,eax + mov [edi+44],eax + mov [edi+12],dword 0xffffff ; color white + call draw_draw_file_browser1 +.exit: + ret +.exit_dir: + mov esi,dir_path + call copy_exit_dir + jmp .1 +;--------------------------------------------------------------------- +error_handler: + mcall 66,2 + mov [error_handler_store_input_mode],eax + mcall 66,1,1 +.red: + call .draw_window +;------------------------------------ +.still: + mcall 10 + cmp eax,1 + je .red + cmp eax,2 + je .key + cmp eax,3 + je .button + jmp .still +;------------------------------------ +.draw_window: + xor eax,eax + inc eax + mov [error_window],al + call control_minimal_window_size + call draw_window + xor eax,eax + mov [error_window],al + ret +;------------------------------------ +.key: + mcall 2 + xor ebx,ebx + cmp [extended_key],1 + je .extended_key + test al,al + jnz .still + cmp ah,0xE0 + jne @f + mov [extended_key],1 + jmp .still +@@: + cmp ah,129 ; Esc + je .exit + jmp .still +.extended_key: + jmp .still +;------------------------------------ +.button: + mcall 17 + cmp ah,5 + je .exit + cmp ah,1 + jne .still + xor eax,eax + mov [N_error],eax + jmp button.exit +;------------------------------------ +.exit: + cmp [open_dialog_type],1 + jne @f + + mov esi,root_pach + mov edi,dir_path + call copy_dir_name.1 + mov esi,root_pach + mov edi,previous_dir_path + call copy_dir_name.1 + jmp .restore_input_mode +@@: + mov esi,previous_dir_path + mov edi,dir_path + call copy_dir_name.1 + mov esi,start_pach + mov edi,previous_dir_path + call copy_dir_name.1 +.restore_input_mode: + mcall 66,1,[error_handler_store_input_mode] + ret +;--------------------------------------------------------------------- +file_no_folder: + mov esi,dir_path + mov edi,file_name + call copy_dir_name + push ebx + mov al,[focus_pointer] + test al,al + je @f + mov ebx,user_selected_name + xor eax,eax + cmp [ebx],al + je .exit +@@: + cmp [open_dialog_type],2 + je @f + mov esi,file_name + call copy_dir_path +@@: + mov eax,[communication_area] + test eax,eax + jnz @f + call control_minimal_window_size + call draw_window + pop ebx + ret +@@: + mov edi,eax + add edi,16 ;12 + mov esi,file_name + call copy_dir_name + + pop esi + mov al,[focus_pointer] + test al,al + jz @f + mov esi,user_selected_name +@@: + xor eax,eax + cmp [esi],al + je .exit + mov edi,[communication_area] + add edi,3840 ;4096-256 + call copy_dir_name +.exit: + mov eax,[communication_area] + mov [eax],word 1 + jmp button.exit +;--------------------------------------------------------------------- +load_root_directory: + mov [dirinfo.name],dword dir_path_temp + mov eax,[dirinfo.return] + push eax + mov eax,[file_browser_data_1.folder_data] + push eax + xor eax,eax + mov [dirinfo.return],eax + mov [file_browser_data_1.folder_data],eax + mov esi,root_pach + mov edi,dir_path_temp + call copy_dir_name + call load_directory + mov eax,[N_error] + test eax,eax + jnz button.exit + + mov eax,[dirinfo.return] + mov [root_folder_area],eax + mov eax,[eax+4] + mov [root_folder_block],eax + + xor eax,eax + mov [dirinfo.return],eax + mov [file_browser_data_1.folder_data],eax + mov [temp_counter_1],eax ;0 + + mov [retrieved_devices_table_counter],eax ;0 +.start_temp_counter_1: + imul esi,[temp_counter_1],304 + add esi,[root_folder_area] + add esi,32+40 + mov edi,dir_path_temp+1 + mov [edi-1],byte '/' + call copy_dir_name + call load_directory + mov eax,[N_error] + test eax,eax + jnz button.exit + + mov eax,[dirinfo.return] + mov [root1_folder_area],eax + mov eax,[eax+4] + test eax,eax + jz .continue + mov [root1_folder_block],eax + + mov ebp,0 +.start_copy_device_patch: + imul edi,[retrieved_devices_table_counter],10 + add edi,retrieved_devices_table + mov [edi],byte '/' + inc edi + imul esi,[temp_counter_1],304 + add esi,[root_folder_area] + add esi,32+40 + + call copy_dir_name + + imul esi,ebp,304 + add esi,[root1_folder_area] + add esi,32+40 + mov [edi-1],byte '/' + + call copy_dir_name + + inc [retrieved_devices_table_counter] + inc ebp + cmp ebp,[root1_folder_block] + jb .start_copy_device_patch +.continue: + inc [temp_counter_1] + mov eax,[temp_counter_1] + cmp eax,[root_folder_block] + jb .start_temp_counter_1 + + cmp [root_folder_area],dword 0 + je @f + mcall 68,13,[root_folder_area] + test eax,eax + jz memory_free_error +@@: + + xor ecx,ecx + mov edi,menu_text_area_1_1 ;.1 +@@: + imul esi,ecx,10 + add esi,retrieved_devices_table + call copy_dir_name + inc ecx + cmp ecx,[retrieved_devices_table_counter] + jb @b + mov [menu_data_1.text_end],edi + xor eax,eax + mov [edi],eax + pop eax + mov [file_browser_data_1.folder_data],eax + pop eax + mov [dirinfo.return],eax + mov [dirinfo.name],dword dir_path + ret +;--------------------------------------------------------------------- +memory_free_error: + mov [N_error],3 + jmp button.exit +;--------------------------------------------------------------------- +memory_get_error: + mov [N_error],4 + jmp button.exit +;--------------------------------------------------------------------- +type_title: + mov ecx,[open_dialog_type] + shl ecx,2 + add ecx,open_dialog_title_pointer + mov ecx,[ecx] + test ecx,ecx + jz @f + mcall 71,1,; title ;;param ;file_name ;dir_path +@@: + ret +;--------------------------------------------------------------------- +draw_window: + + mcall 12,1 + call prepare_system_colors + xor esi,esi + mcall 0,[window_x],[window_y],0x63AABBCC + call type_title + call get_window_param + mov eax,[procinfo+70] ;status of window + test eax,100b + jne .end + + mov eax,[window_high] + sub eax,25+45 + mov [file_browser_data_1.size_y],ax + mov [scroll_bar_data_vertical.size_y],ax + mov eax,[window_width] + sub eax,10+20 + mov [file_browser_data_1.size_x],ax + add ax,10 + mov [scroll_bar_data_vertical.start_x],ax + mov edx,[w_work] ; color of work area RRGGBB,8->color + or edx,0x63000000 + mcall 13,[window_width],45 ;,0xcccccc + + push ecx + rol ecx,16 + add cx,[file_browser_data_1.size_y] + add cx,45 + ror ecx,16 + mov cx,25 + mcall + pop ecx + add ecx,45 shl 16 + mov cx,[file_browser_data_1.size_y] + mov bx,10 + mcall + mov bx,[file_browser_data_1.size_x] + add bx,10 + shl ebx,16 + mov bx,20 + mcall + + cmp [error_window],0 + je @f + call draw_for_fs_errors + jmp .1 +@@: + mov [do_not_draw_open_button_label],1 + call draw_draw_file_browser1 + mov [do_not_draw_open_button_label],0 +.1: + push dword menu_data_1 + call [menu_bar_draw] + push dword menu_data_2 + call [menu_bar_draw] + push dword menu_data_3 + call [menu_bar_draw] + + mov ebx,[file_browser_data_1.x] + mov ax,bx + shl eax,16 + add ebx,eax + mov eax,50 + mov bx,ax + shl eax,16 + sub ebx,eax + mov ecx,25 shl 16 + 16 + mcall 8,,,2,[w_work_button] ;0xffffff + + pusha + shr ecx,16 + mov bx,cx + add ebx,21 shl 16 + mov ecx,[w_work_button_text] + or ecx,0x90000000 + mcall 4,,,message_ExitDir_button + add ebx,4 + mcall + add ebx,4 + mcall + popa + + push ebx + sub ebx,70 shl 16 + mov bx,60 + mcall 8,,,6 + + shr ecx,16 + mov bx,cx + add ebx,2 shl 16 + mov ecx,[w_work_button_text] + or ecx,0x90000000 + mcall 4,,,message_ReloadDir_button + pop ebx + + mov ebx,[file_browser_data_1.x] + mov ax,bx + shl eax,16 + add ebx,eax + mov eax,55 + mov bx,ax + shl eax,16 + sub ebx,eax + mov ecx,[file_browser_data_1.y] + mov ax,cx + add eax,3 + shl eax,16 + add ecx,eax + mov cx,16 + mcall 8,,,3 + + pusha + shr ecx,16 + mov bx,cx + add ebx,4 shl 16 + mov ecx,[w_work_button_text] + or ecx,0x90000000 + mcall 4,,,message_cancel_button + popa + + sub ebx,65 shl 16 + mcall 8,,,4 + + shr ecx,16 + mov bx,cx + add ebx,4 shl 16 + mov edx,[open_dialog_type] + shl edx,2 + add edx,message_open_dialog_button + mov edx,[edx] +;------------------------------- + cmp [open_dialog_type],1 + jne @f + + cmp [focus_pointer],1 + je @f + + cmp [error_window],0 + jne @f + + mov eax,[file_browser_data_1.folder_block] + test eax,eax + jz @f + + mov eax,[file_browser_data_1.selected_BDVK_adress] + test [eax],byte 0x10 + jz @f + + mov edx,message_0 ; Open Dir +@@: +;-------------------------------------- + mov [open_button_coordinates],ebx + mov ecx,[w_work_button_text] + or ecx,0x90000000 + mcall 4 ;message_open_button +.end: + mcall 12,2 + ret +;--------------------------------------------------------------------- +draw_open_button_label: + cmp [do_not_draw_open_button_label],1 + je .exit_1 + + cmp [open_dialog_type],1 + jne .exit_1 + + cmp [focus_pointer],1 + je draw_save_button_label + + pusha + mov ebx,[open_button_coordinates] + test ebx,ebx + jz .exit + + mov edx,[open_dialog_type] + shl edx,2 + add edx,message_open_dialog_button + mov edx,[edx] + + mov eax,[file_browser_data_1.folder_block] + test eax,eax + jz .1 + + mov eax,[file_browser_data_1.selected_BDVK_adress] + test [eax],byte 0x10 + jz @f + + mov edx,message_0 ; Open Dir + jmp .1 +@@: + call copy_new_file_name +.1: + mov ecx,[w_work_button_text] + or ecx,0xd0000000 + mov edi,[w_work_button] + mcall 4 ;message_open_button +.exit: + popa +.exit_1: + ret +;--------------------------------------------------------------------- +draw_save_button_label: + pusha + mov ebx,[open_button_coordinates] + + mov edx,message_1 ; Save + + mov ecx,[w_work_button_text] + or ecx,0xd0000000 + mov edi,[w_work_button] + mcall 4 ;message_open_button + popa + ret +;--------------------------------------------------------------------- +copy_new_file_name: + mov esi,[file_browser_data_1.selected_BDVK_adress] + add esi,40 + mov edi,user_selected_name + cld + lodsb + test al,al + jnz .1 + ret +@@: + lodsb +.1: + stosb + test al,al + jnz @r + + sub edi,user_selected_name + dec edi + + mov esi,edit1 + mov [esi+48],edi ;ed_size + mov [esi+52],edi ;ed_pos + + push dword name_editboxes + call [edit_box_draw] + ret +;--------------------------------------------------------------------- +prepare_system_colors: + mcall 48,3,app_colours,10*4 + + mov eax,[w_work] + mov [menu_data_1.bckg_col],eax + mov [menu_data_2.bckg_col],eax + mov [menu_data_3.bckg_col],eax + + mov [menu_data_1.menu_col],eax + mov [menu_data_2.menu_col],eax + mov [menu_data_3.menu_col],eax + + mov [scroll_bar_data_vertical.bckg_col],eax + + mov eax,[w_work_button] + mov [menu_data_1.frnt_col],eax + mov [menu_data_2.frnt_col],eax + mov [menu_data_3.frnt_col],eax + + mov [scroll_bar_data_vertical.frnt_col],eax + + mov eax,[w_work_button] + mov [menu_data_1.menu_sel_col],eax + mov [menu_data_2.menu_sel_col],eax + mov [menu_data_3.menu_sel_col],eax + + mov eax,[w_work_text] + mov [menu_data_1.bckg_text_col],eax + mov [menu_data_2.bckg_text_col],eax + mov [menu_data_3.bckg_text_col],eax + + mov eax,[w_work_button_text] + mov [menu_data_1.frnt_text_col],eax + mov [menu_data_2.frnt_text_col],eax + mov [menu_data_3.frnt_text_col],eax + + mov [scroll_bar_data_vertical.line_col],eax + ret +;--------------------------------------------------------------------- +draw_for_fs_errors: + call draw_dir_path + + mov ebx,[file_browser_data_1.x] + mov ecx,[file_browser_data_1.y] + mcall 13,,,[file_browser_data_1.background_color] + push ebx ecx + add ebx,10 shl 16 + sub ebx,20 + add ecx,10 shl 16 + sub ecx,20 + + shr ecx,16 + mov bx,cx + add ebx,5 shl 16+15 + mcall 4,,0x90000000,load_directory_error_type + + add ebx,20 + mcall 4,,,dir_path + + mov eax,[error_type] + shl eax,2 + add eax,error_fs_text_pointers + mov edx,[eax] + add ebx,20 + mcall 4 + + add ebx,20 + mcall ,,,error_help_text + + pop ecx ebx + + mov ebx,[file_browser_data_1.x] + mov ax,bx + shr eax,1 + shl eax,16 + add ebx,eax + mov eax,50 + mov bx,ax + shr eax,1 + shl eax,16 + sub ebx,eax + + mov ecx,[file_browser_data_1.y] + mov ax,cx + sub eax,40 + shl eax,16 + add ecx,eax + mov cx,15 + + mcall 8,,,5,[w_work_button] ;0xffffff + + shr ecx,16 + mov bx,cx + add ebx,4 shl 16 + mov ecx,[w_work_button_text] + add ecx,0x90000000 + mcall 4,,,message_cancel_button + + ret +;--------------------------------------------------------------------- +draw_file_name: + mov esi,user_selected_name + cld +@@: + lodsb + test al,al + jne @r + sub esi,user_selected_name + mov eax,esi + dec eax + + mov edi,edit1 + mov [edi+48],eax ;ed_size + mov [edi+52],eax ;ed_pos +;-------------------------------------- + mov eax,[file_browser_data_1.x] + mov ebx,eax + shr ebx,16 + and eax,0xffff + sub eax,200 + mov [edi],eax + add ebx,70 + mov [edi+4],ebx + + mov eax,[file_browser_data_1.y] + mov ebx,eax + shr ebx,16 + and eax,0xffff + add eax,ebx + add eax,5 + mov [edi+8],eax + + push dword name_editboxes + call [edit_box_draw] + + mov bx,[file_browser_data_1.start_x] + add bx,5 + shl ebx,16 + mov bx,[file_browser_data_1.start_y] + add bx,[file_browser_data_1.size_y] + add bx,9 + mov ecx,[w_work_text] + add ecx,0x80000000 + mcall 4,,,message_file_name + ret +;--------------------------------------------------------------------- +draw_dir_path: + mov eax,[file_browser_data_1.x] + mov ebx,eax + shr ebx,16 + add ebx,3 + and eax,0xffff + sub eax,5 + + mov [PathShow_data_1.area_size_x],ax + mov [PathShow_data_1.start_x],bx +;-------------------------------------- +;; top line +; mov ebx,[file_browser_data_1.x] +; mcall 13,,<7,1>,0x0 +; down line +; push ebx ecx +; mcall ,,<21,1>, +; pop ecx ebx +; left line +; push ebx +; mov bx,1 +; mov cx,15 +; mcall +; pop ebx +; right line +; mov ax,bx +; shr ebx,16 +; add bx,ax +; dec ebx +; shl ebx,16 +; mov bx,1 +; mcall 13 +;-------------------------------------- + mov ebx,[file_browser_data_1.x] + sub ebx,2 + add ebx,1 shl 16 + mcall 13,,<8,13>,0xffffcc +;-------------------------------------- +; prepare for PathShow + push dword PathShow_data_1 + call [PathShow_prepare] + +; draw for PathShow + push dword PathShow_data_1 + call [PathShow_draw] + + ret +;--------------------------------------------------------------------- +draw_draw_file_browser1: + call draw_dir_path + cmp [open_dialog_type],1 + jne @f + call draw_file_name +@@: + xor eax,eax + inc eax + mov [file_browser_data_1.all_redraw],eax + mov [scroll_bar_data_vertical.all_redraw],eax + + push dword file_browser_data_1 + call [FileBrowser_draw] + + call draw_open_button_label + + call prepare_scrollbar_data + + call draw_scrollbar + + xor eax,eax + mov [file_browser_data_1.all_redraw],eax + mov [scroll_bar_data_vertical.all_redraw],eax + ret +;--------------------------------------------------------------------- +draw_draw_file_browser2: + mov eax,2 + mov [file_browser_data_1.all_redraw],eax + + call get_scrollbar_data + + push dword file_browser_data_1 + call [FileBrowser_draw] + + call draw_open_button_label + + xor eax,eax + mov [file_browser_data_1.all_redraw],eax + ret +;--------------------------------------------------------------------- +draw_scrollbar1: + mov eax,[file_browser_data_1.start_draw_line] + mov [scroll_bar_data_vertical.position],eax + + call draw_scrollbar + + ret +;--------------------------------------------------------------------- +draw_scrollbar: + mov eax,[scroll_bar_data_vertical.max_area] + cmp eax,[scroll_bar_data_vertical.cur_area] + jbe @f + cmp [scroll_bar_data_vertical.cur_area],0 + je @f + push dword scroll_bar_data_vertical + call [scrollbar_ver_draw] +@@: + ret +;--------------------------------------------------------------------- +get_scrollbar_data: + mov eax,[scroll_bar_data_vertical.position] + mov [file_browser_data_1.start_draw_line],eax + ret +;--------------------------------------------------------------------- +prepare_scrollbar_data: + mov eax,[file_browser_data_1.folder_block] + mov [scroll_bar_data_vertical.max_area],eax + mov eax,[file_browser_data_1.max_panel_line] + mov [scroll_bar_data_vertical.cur_area],eax + ret +;--------------------------------------------------------------------- +get_active_pocess: + mcall 9,procinfo,-1 + mov ecx,[ebx+30] ; PID + mcall 18,21 + 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 +;--------------------------------------------------------------------- +get_window_param: + mcall 9,procinfo,-1 + mov eax,[ebx+66] + inc eax + mov [window_high],eax + mov eax,[ebx+62] + inc eax + mov [window_width],eax + mov eax,[ebx+70] + mov [window_status],eax + ret +;--------------------------------------------------------------------- +convert_icons: + 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, + test eax,eax + jz memory_free_error + + cmp [return_code],dword 0 + je @f + mov [N_error],6 + jmp button.exit +@@: + + mov ebx,[raw_pointer] + mov eax,[ebx+4] +; set of icon size x + mov [file_browser_data_1.icon_size_x],ax +; mov eax,[ebx+8] +; set of icon size y + mov [file_browser_data_1.icon_size_y],ax + inc ax + mov [file_browser_data_1.line_size_y],ax + mov eax,[ebx+12] +; set of RAW resolution to pixel + mov [file_browser_data_1.resolution_raw],eax + + mov eax,[ebx+20] + add eax,ebx +; set RAW palette,use else resolution 8bit or less + mov [file_browser_data_1.palette_raw],eax + + mov eax,[ebx+28] + add eax,ebx +; set RAW area for icon + mov [file_browser_data_1.icon_raw_area],eax + ret +;--------------------------------------------------------------------- +calc_ini: + mov eax,[image_file] + mov [file_browser_data_1.ini_file_start],eax + + mov edi,eax + add edi,[img_size] + dec edi + mov esi,eax + add esi,9 ; after [icons16] + cld +@@: + lodsb + cmp esi,edi + je @f + cmp al,byte '[' + jne @r + +@@: + mov [file_browser_data_1.ini_file_end],esi + ret +;--------------------------------------------------------------------- +load_ini: + mov edi,ini_file_name + + mov [fileinfo.name],edi + mov [fileinfo.subfunction],dword 5 + mov [fileinfo.size],dword 0 + mov [fileinfo.return],dword file_info + mcall 70,fileinfo + test eax,eax + jnz .error + + mov [fileinfo.subfunction],dword 0 + + mov ecx,[file_info+32] + mov [fileinfo.size],ecx + mov [img_size],ecx + + mcall 68,12 + test eax,eax + jz memory_get_error + + mov [fileinfo.return],eax + mov [image_file],eax + + mcall 70,fileinfo + test eax,eax + jnz .error + ret +.error: + mov [N_error],1 + mov [error_type],eax + jmp button.exit +;--------------------------------------------------------------------- +load_icons: + mov ebx,icons_file_name_2 + mov esi,path + mov edi,file_name + call copy_file_path + + mov [fileinfo.subfunction],dword 5 + mov [fileinfo.size],dword 0 + mov [fileinfo.return],dword file_info + mcall 70,fileinfo + test eax,eax + jz @f + + mov edi,icons_path + + mov [fileinfo.name],edi + mov [fileinfo.subfunction],dword 5 + mov [fileinfo.size],dword 0 + mov [fileinfo.return],dword file_info + mcall 70,fileinfo + test eax,eax + jnz .error +@@: + mov [fileinfo.subfunction],dword 0 + + mov ecx,[file_info+32] + mov [fileinfo.size],ecx + mov [img_size],ecx + + mcall 68,12 + test eax,eax + jz memory_get_error + + mov [fileinfo.return],eax + mov [image_file],eax + + mcall 70,fileinfo + test eax,eax + jnz .error + ret +.error: + mov [N_error],2 + mov [error_type],eax + jmp button.exit +;--------------------------------------------------------------------- +sort_directory: + mov eax,[file_browser_data_1.folder_data] + mov ebx,[eax+4] ; number of files + add eax,32 + cmp [eax+40],word '..' + jne @f + cmp [eax+40+2],byte 0 + jne @f + dec ebx + add eax,304 +@@: + push dword [sort_type] ; sort mode + push ebx ; number of files + push eax ; data files + call [sort_dir] + ret +;-------------------------------------------------------------------- +load_directory: + xor eax,eax + mov [N_error],eax + cmp [file_browser_data_1.folder_data],eax + je @f + mcall 68,13,[file_browser_data_1.folder_data] + test eax,eax + jz memory_free_error + +@@: + mov [dirinfo.size],dword 0 + mov [dirinfo.return],dir_header + mcall 70,dirinfo + test eax,eax + jz @f +; mov esi,previous_dir_path +; mov edi,dir_path +; call copy_dir_name.1 +; mcall 70,dirinfo +; test eax,eax +; jz @f + xor ebx,ebx + mov [file_browser_data_1.folder_data],ebx + jmp .error +@@: + + mov ecx,[dir_header.totl_blocks] + mov [dirinfo.size],ecx + imul ecx,304 + add ecx,32 + mcall 68,12 + test eax,eax + jz memory_get_error + + mov [dirinfo.return],eax + mov [file_browser_data_1.folder_data],eax + + mcall 70,dirinfo + test eax,eax + jnz .error + +; test for empty directory + mov eax,[dirinfo.return] + mov eax,[eax+4] + test eax,eax + jz @f + + call delete_point_dir +; call files_name_normalize + call check_filter + call prepare_extension_and_mark + call clear_data_fb_and_sb +@@: + ret + +.error: + mov [N_error],5 + mov [error_type],eax + ret +;--------------------------------------------------------------------- +clear_data_fb_and_sb: + xor eax,eax + mov [file_browser_data_1.start_draw_cursor_line],ax + mov [file_browser_data_1.start_draw_line],eax + mov [scroll_bar_data_vertical.position],eax + ret +;--------------------------------------------------------------------- +check_filter: + cmp [open_dialog_type],2 ; Select dir + je .1 + xor eax,eax + mov al,[filter_flag] + test eax,eax + jz @f + + mov eax,[communication_area] + test eax,eax + jz @f + mov eax,[eax+4096] + test eax,eax + jz @f +.1: + call delete_unsupported_BDFE +@@: + ret +;--------------------------------------------------------------------- +delete_unsupported_BDFE: + mov ebx,[file_browser_data_1.folder_data] + add ebx,4 + xor ecx,ecx + dec ecx + + mov eax,[file_browser_data_1.folder_data] + add eax,32+40 + sub eax,304 +.start: + inc ecx + add eax,304 +.1: + cmp [ebx],ecx + je .end + cmp [eax],byte '.' + jne @f + cmp [eax+1],byte 0 + je .delete +@@: + test [eax-40],byte 0x10 + jnz .start + + cmp [open_dialog_type],2 ; Select dir + je .delete + + push eax ebx + mov esi,eax + call search_expansion + test eax,eax + pop ebx eax + jnz .delete + + push eax ebx ecx esi + mov edi,[communication_area] + add edi,4100 + call compare_expansion + test eax,eax + pop esi ecx ebx eax + jz .start + +;------------------------------------------- +.delete: + dec dword [ebx] + mov esi,[ebx] + sub esi,ecx + + push ecx + mov ecx,esi + imul ecx,304/4 + mov edi,eax + sub edi,40 + mov esi,edi + add esi,304 + cld + rep movsd + pop ecx + + jmp .1 +.end: + ret +;--------------------------------------------------------------------- +search_expansion: + mov edi,esi + xor eax,eax +@@: + cld + lodsb + test eax,eax + jnz @b + mov ebx,esi + dec esi +@@: + std + lodsb + cmp esi,edi + jb .end_err + cmp al,'.' + jne @b + + add esi,2 + sub ebx,esi + mov [expansion_length],ebx + cld + xor eax,eax + ret + +.end_err: + cld + xor eax,eax + inc eax + ret +;--------------------------------------------------------------------- +compare_expansion: + mov ebx,[edi] + add ebx,edi + add edi,3 +.start: + cmp ebx,edi + jb .end_err + mov ecx,[expansion_length] + inc edi + + push esi edi +@@: + cld + lodsb + xchg esi,edi + shl eax,8 + lodsb + xchg esi,edi + call char_todown + xchg al,ah + call char_todown + cmp al,ah + jne @f + dec ecx + jnz @b + jmp .end +@@: + pop edi esi + jmp .start +.end: + pop edi esi + xor eax,eax + ret + +.end_err: + xor eax,eax + inc eax + ret +;--------------------------------------------------------------------- +prepare_extension_and_mark: + mov esi,[dirinfo.return] + mov ebp,[esi+4] + test ebp,ebp + jz .end + + add esi,32+40 +.start: + push esi + call search_extension_start + mov eax,esi + pop esi + sub eax,esi + sub ebx,esi + shl eax,16 + mov ax,bx + mov [esi+300-40],eax + mov [esi+299-40],byte 0 + add esi,304 + dec ebp + jnz .start +.end: + ret +;--------------------------------------------------------------------- +search_extension_start: + mov edx,esi + xor eax,eax + cld +@@: + lodsb + test eax,eax + jnz @b + dec esi + dec edx + push esi + std +@@: + lodsb + cmp esi,edx + je .end + cmp al,'.' + jnz @b + add esi,2 + cld + pop ebx + ret +.end: + cld + pop esi + mov ebx,esi + ret +;--------------------------------------------------------------------- +delete_point_dir: + mov eax,[dirinfo.return] + cmp [eax+32+40],byte '.' + jne @f + cmp [eax+32+40+1],byte 0 + jne @f + mov edi,eax + add edi,32 + mov esi,edi + add esi,304 + mov ecx,[eax+4] + dec ecx + mov [eax+4],ecx + imul ecx,304 + shr ecx,2 + cld + rep movsd +@@: + ret +;--------------------------------------------------------------------- +;files_name_normalize: +; mov esi,[dirinfo.return] +; mov ebp,[esi+4] +; add esi,32+40 +;.start: +; push esi +; mov al,[esi] +; call char_toupper +; mov [esi],al +;@@: +; inc esi +; mov al,[esi] +; test al,al +; jz @f +; call char_todown +; mov [esi],al +; jmp @b +;@@: +; pop esi +; add esi,304 +; dec ebp +; jnz .start +; ret +;--------------------------------------------------------------------- +char_toupper: +; convert character to uppercase,using cp866 encoding +; in: al=symbol +; out: al=converted symbol + cmp al,'a' + jb .ret + cmp al,'z' + jbe .az + cmp al,'а' + jb .ret + cmp al,'р' + jb .rus1 + cmp al,'я' + ja .ret +; 0xE0-0xEF -> 0x90-0x9F + sub al,'р'-'Р' +.ret: + ret +.rus1: +; 0xA0-0xAF -> 0x80-0x8F +.az: + and al,not 0x20 + ret +;--------------------------------------------------------------------- +char_todown: +; convert character to uppercase,using cp866 encoding +; in: al=symbol +; out: al=converted symbol + cmp al,'A' + jb .ret + cmp al,'Z' + jbe .az + cmp al,'А' + jb .ret + cmp al,'Р' + jb .rus1 + cmp al,'Я' + ja .ret +; 0x90-0x9F -> 0xE0-0xEF + add al,'р'-'Р' +.ret: + ret +.rus1: +; 0x80-0x8F -> 0xA0-0xAF +.az: + add al,0x20 + ret +;--------------------------------------------------------------------- +copy_file_path: + xor eax,eax + cld +@@: + lodsb + stosb + test eax,eax + jnz @b + mov esi,edi + dec esi + std +@@: + lodsb + cmp al,'/' + jnz @b + mov edi,esi + add edi,2 + mov esi,ebx + cld +@@: + lodsb + stosb + test eax,eax + jnz @b + ret +;--------------------------------------------------------------------- +copy_dir_path: + mov ecx,esi + inc ecx + inc ecx + xor eax,eax + cld +@@: + lodsb + test eax,eax + jnz @b + + cmp ecx,esi + jb @f + dec esi +@@: + mov [esi-1],byte '/' + mov edi,esi + mov esi,ebx +@@: + lodsb + stosb + test eax,eax + jnz @b + ret +;--------------------------------------------------------------------- +copy_exit_dir: + mov ebx,esi + inc ebx + xor eax,eax + cld +@@: + lodsb + test eax,eax + jnz @b + sub esi,2 + std +@@: + lodsb + cmp al,'/' + jnz @b + xor eax,eax + cmp ebx,esi + jb @f + inc esi +@@: + mov [esi+1],al + cld + ret +;--------------------------------------------------------------------- +copy_dir_name: + push esi edi + mov esi,edi + mov edi,previous_dir_path + call .1 + pop edi esi +.1: + xor eax,eax + cmp [esi],al + je .exit + cld +@@: + lodsb + stosb + test eax,eax + jnz @b +.exit: + ret +;--------------------------------------------------------------------- +;--------------------------------------------------------------------- + +;plugins_directory db 'plugins/',0 +plugins_directory db 0 + +system_dir_Boxlib db '/sys/lib/box_lib.obj',0 +system_dir_CnvPNG db '/sys/lib/cnv_png.obj',0 +system_dir_Sort db '/sys/lib/sort.obj',0 +system_dir_UNPACK db '/sys/lib/archiver.obj',0 + +align 4 +l_libs_start: +library01 l_libs system_dir_Boxlib+9,file_name,system_dir_Boxlib,\ +Box_lib_import,plugins_directory + +library02 l_libs system_dir_CnvPNG+9,file_name,system_dir_CnvPNG,\ +cnv_png_import,plugins_directory + +library03 l_libs system_dir_Sort+9,file_name,system_dir_Sort,\ +Sort_import,plugins_directory + +library04 l_libs system_dir_UNPACK+9,file_name,system_dir_UNPACK,\ +UNPACK_import,plugins_directory + +end_l_libs: + +;--------------------------------------------------------------------- +align 4 +UNPACK_import: +;unpack_Version dd aUnpack_Version +;unpack_PluginLoad dd aUnpack_PluginLoad +;unpack_OpenFilePlugin dd aUnpack_OpenFilePlugin +;unpack_ClosePlugin dd aUnpack_ClosePlugin +;unpack_ReadFolder dd aUnpack_ReadFolder +;unpack_SetFolder dd aUnpack_SetFolder +;unpack_GetFiles dd aUnpack_GetFiles +;unpack_GetOpenPluginInfo dd aUnpack_GetOpenPluginInfo +;unpack_Getattr dd aUnpack_Getattr +;unpack_Open dd aUnpack_Open +;unpack_Read dd aUnpack_Read +;unpack_Setpos dd aUnpack_Setpos +;unpack_Close dd aUnpack_Close +;unpack_DeflateUnpack dd aUnpack_DeflateUnpack +unpack_DeflateUnpack2 dd aUnpack_DeflateUnpack2 + dd 0 + dd 0 + +;aUnpack_Version db 'version',0 +;aUnpack_PluginLoad db 'plugin_load',0 +;aUnpack_OpenFilePlugin db 'OpenFilePlugin',0 +;aUnpack_ClosePlugin db 'ClosePlugin',0 +;aUnpack_ReadFolder db 'ReadFolder',0 +;aUnpack_SetFolder db 'SetFolder',0 +;aUnpack_GetFiles db 'GetFiles',0 +;aUnpack_GetOpenPluginInfo db 'GetOpenPluginInfo',0 +;aUnpack_Getattr db 'getattr',0 +;aUnpack_Open db 'open',0 +;aUnpack_Read db 'read',0 +;aUnpack_Setpos db 'setpos',0 +;aUnpack_Close db 'close',0 +;aUnpack_DeflateUnpack db 'deflate_unpack',0 +aUnpack_DeflateUnpack2 db 'deflate_unpack2',0 + +;--------------------------------------------------------------------- +;--------------------------------------------------------------------- +align 4 +Sort_import: +sort_init dd aSort_init +sort_version dd aSort_version +sort_dir dd aSort_SortDir +sort_strcmpi dd aSort_strcmpi + dd 0 + dd 0 + +aSort_init db 'START',0 +aSort_version db 'version',0 +aSort_SortDir db 'SortDir',0 +aSort_strcmpi db 'strcmpi',0 + +;--------------------------------------------------------------------- +align 4 +cnv_png_import: +.Start dd aCP_Start +.Version dd aCP_Version +.Check dd aCP_Check +.Assoc dd aCP_Assoc + dd 0 + dd 0 +aCP_Start db 'START',0 +aCP_Version db 'version',0 +aCP_Check db 'Check_Header',0 +aCP_Assoc db 'Associations',0 +;--------------------------------------------------------------------- +align 4 +Box_lib_import: +;init_lib dd a_init +;version_lib dd a_version + + +edit_box_draw dd aEdit_box_draw +edit_box_key dd aEdit_box_key +edit_box_mouse dd aEdit_box_mouse +;version_ed dd aVersion_ed + +;check_box_draw dd aCheck_box_draw +;check_box_mouse dd aCheck_box_mouse +;version_ch dd aVersion_ch + +;option_box_draw dd aOption_box_draw +;option_box_mouse dd aOption_box_mouse +;version_op dd aVersion_op + +scrollbar_ver_draw dd aScrollbar_ver_draw +scrollbar_ver_mouse dd aScrollbar_ver_mouse +;scrollbar_hor_draw dd aScrollbar_hor_draw +;scrollbar_hor_mouse dd aScrollbar_hor_mouse +;version_scrollbar dd aVersion_scrollbar + +;dinamic_button_draw dd aDbutton_draw +;dinamic_button_mouse dd aDbutton_mouse +;version_dbutton dd aVersion_dbutton + +menu_bar_draw dd aMenu_bar_draw +menu_bar_mouse dd aMenu_bar_mouse +menu_bar_activate dd aMenu_bar_activate +;version_menu_bar dd aVersion_menu_bar + +FileBrowser_draw dd aFileBrowser_draw +FileBrowser_mouse dd aFileBrowser_mouse +FileBrowser_key dd aFileBrowser_key +;Version_FileBrowser dd aVersion_FileBrowser + +PathShow_prepare dd sz_PathShow_prepare +PathShow_draw dd sz_PathShow_draw +;Version_path_show dd szVersion_path_show + dd 0 + dd 0 + +;a_init db 'lib_init',0 +;a_version db 'version',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 + +;aCheck_box_draw db 'check_box_draw',0 +;aCheck_box_mouse db 'check_box_mouse',0 +;aVersion_ch db 'version_ch',0 + +;aOption_box_draw db 'option_box_draw',0 +;aOption_box_mouse db 'option_box_mouse',0 +;aVersion_op db 'version_op',0 + +aScrollbar_ver_draw db 'scrollbar_v_draw',0 +aScrollbar_ver_mouse db 'scrollbar_v_mouse',0 +;aScrollbar_hor_draw db 'scrollbar_h_draw',0 +;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0 +;aVersion_scrollbar db 'version_scrollbar',0 + +;aDbutton_draw db 'dbutton_draw',0 +;aDbutton_mouse db 'dbutton_mouse',0 +;aVersion_dbutton db 'version_dbutton',0 + +aMenu_bar_draw db 'menu_bar_draw',0 +aMenu_bar_mouse db 'menu_bar_mouse',0 +aMenu_bar_activate db 'menu_bar_activate',0 +;aVersion_menu_bar db 'version_menu_bar',0 + +aFileBrowser_draw db 'FileBrowser_draw',0 +aFileBrowser_mouse db 'FileBrowser_mouse',0 +aFileBrowser_key db 'FileBrowser_key',0 +;aVersion_FileBrowser db 'version_FileBrowser',0 + +sz_PathShow_prepare db 'PathShow_prepare',0 +sz_PathShow_draw db 'PathShow_draw',0 +;szVersion_path_show db 'version_PathShow',0 +;--------------------------------------------------------------------- +;--------------------------------------------------------------------- +align 4 +window_high dd 0 +window_width dd 0 +window_status dd 0 + +active_process dd 0 +PID dd 0 +sort_type dd 2 +root_folder_area dd 0 +root_folder_block dd 0 +root1_folder_area dd 0 +root1_folder_block dd 0 +temp_counter_1 dd 0 +retrieved_devices_table_counter dd 0 +communication_area dd 0 +open_dialog_type dd 0 + +open_dialog_title_pointer: + dd title_0 + dd title_1 + dd title_2 + dd 0 + +message_open_dialog_button: + dd message_0 + dd message_1 + dd message_2 + dd 0 +;--------------------------------------------------------------------- +expansion_length dd 0 +;--------------------------------------------------------------------- +N_error dd 0 +error_type dd 0 +error_path dd 0 +error_window_x: dd 100 shl 16+250 +error_window_y: dd 100 shl 16+120 +;--------------------------------------------------------------------- +mouse_scroll_data: +.vertical dw 0 +.horizontal dw 0 + +mouse_position: +.y dw 0 +.x dw 0 +;--------------------------------------------------------------------- +; not change this section!!! +; start section +;--------------------------------------------------------------------- +align 4 +image_file dd 0 +raw_pointer dd 0 +return_code dd 0 +img_size dd 0 +deflate_unpack dd 0 +raw_pointer_2 dd 0 ;+20 +;--------------------------------------------------------------------- +; end section +;--------------------------------------------------------------------- +align 4 +fileinfo: +.subfunction dd 5 +.Offset dd 0 +.Offset_1 dd 0 +.size dd 0 +.return dd file_info + db 0 +.name: dd file_name +;--------------------------------------------------------------------- +align 4 +dirinfo: +.subfunction dd 1 +.start dd 0 +.flags dd 0 +.size dd 0 +.return dd 0 + db 0 +.name: dd dir_path +;--------------------------------------------------------------------- +align 4 +dir_header: +.version dd 0 ;+0 +.curn_blocks dd 0 ;+4 +.totl_blocks dd 0 ;+8 +.other rb 20 +;--------------------------------------------------------------------- +load_ini_error_type: + db 'Error loading INI file',0 + +load_icons_error_type: + db 'Error loading of icons file',0 + +memory_free_error_type: + db 'Error of free memory',0 + +memory_get_error_type: + db 'Memory allocation error',0 + +load_directory_error_type: + db 'Error loading directory',0 + +convert_icons_error_type: + db 'Unsupported or corrupt data for icons file',0 +;--------------------------------------------------------------------- +error_help_text: + db 'For continue press key or ',0 +;--------------------------------------------------------------------- +align 4 +error_fs_text_pointers: + dd error_fs_text_0 + dd error_fs_text_1 + dd error_fs_text_2 + dd error_fs_text_3 + dd error_fs_text_4 + dd error_fs_text_5 + dd error_fs_text_6 + dd error_fs_text_7 + dd error_fs_text_8 + dd error_fs_text_9 + dd error_fs_text_10 + dd error_fs_text_11 + +error_fs_text_0: db '0 - Success full',0 +error_fs_text_1: db '1 - Base and/or partition of a hard disk is not defined',0 +error_fs_text_2: db '2 - Function is not supported for the given file system',0 +error_fs_text_3: db '3 - Unknown file system',0 +error_fs_text_4: db '4 - Reserved, is never returned in the current implementation',0 +error_fs_text_5: db '5 - File not found',0 +error_fs_text_6: db '6 - End of file, EOF',0 +error_fs_text_7: db '7 - Pointer lies outside of application memory',0 +error_fs_text_8: db '8 - Disk is full',0 +error_fs_text_9: db '9 - FAT table is destroyed',0 +error_fs_text_10: db '10 - Access denied',0 +error_fs_text_11: db '11 - Device error',0 +;--------------------------------------------------------------------- + +extended_key db 0 + +shift_flag db 0 +ctrl_flag db 0 +alt_flag db 0 + +error_window db 0 + +Tab_key db 0 +Tab_key_block db 0 + +filter_flag db 1 + +focus_pointer db 0 +;--------------------------------------------------------------------- +start_pach: + db '/sys',0 + +root_pach: + db '/',0 + +icons_file_name_2 db 'buttons/' +icons_path db '/sys/icons16.png',0 +ini_file_name db '/sys/File managers/icons.ini',0 +;--------------------------------------------------------------------- + +message: + db 'Press any key...',0 + +message_cancel_button: + db 'Cancel',0 + +message_ReloadDir_button: + db 'Refresh',0 + +message_ExitDir_button: + db '^',0 + +message_file_name: + db 'File name:',0 + +message_0: + db ' Open ',0 +message_1: + db ' Save ',0 +message_2: + db 'Select',0 + +title_0: + db 'Open Dialog',0 +title_1: + db 'Save Dialog',0 +title_2: + db 'Select Dir',0 +;--------------------------------------------------------------------- +align 4 +menu_data_1: +.type: dd 1 ;+0 +.x: +.size_x dw 80 ;+4 +.start_x dw 10 ;+6 +.y: +.size_y dw 15 ;+8 +.start_y dw 26 ;+10 +.text_pointer: dd menu_text_area_1 ;0 ;+12 +.pos_pointer: dd menu_text_area_1_1 ;0 ;+16 +.text_end dd menu_text_area_1_1 ;0 ;+20 +.ret_key dd 0 ;+24 +.mouse_keys dd 0 ;+28 +.x1: +.size_x1 dw 80 ;+32 +.start_x1 dw 10 ;+34 +.y1: +.size_y1 dw 100 ;+36 +.start_y1 dw 41 ;+38 +.bckg_col dd 0xffffff ;0xe5e5e5 ;+40 +.frnt_col dd 0xff ;+44 +.menu_col dd 0xeef0ff ;0xffffff ;+48 +.select dd 0 ;+52 +.out_select dd 0 ;+56 +.buf_adress dd 0 ;+60 +.procinfo dd procinfo ;+64 +.click dd 0 ;+68 +.cursor dd 0 ;+72 +.cursor_old dd 0 ;+76 +.interval dd 16 ;+80 +.cursor_max dd 0 ;+84 +.extended_key dd 0 ;+88 +.menu_sel_col dd 0x00cc00 ;+92 +.bckg_text_col dd 0 ; +96 +.frnt_text_col dd 0xffffff ;+100 +.mouse_keys_old dd 0 ;+104 +.font_height dd 8 ;+108 +.cursor_out dd 0 ;+112 +.get_mouse_flag dd 0 ;+116 +;--------------------------------------------------------------------- +menu_text_area_1: +db 'Select Disk',0 +;--------------------------------------------------------------------- +align 4 +menu_data_2: +.type: dd 0 ;+0 +.x: +.size_x dw 30 ;+4 +.start_x dw 95 ;+6 +.y: +.size_y dw 15 ;+8 +.start_y dw 26 ;+10 +.text_pointer: dd menu_text_area_2 ;0 ;+12 +.pos_pointer: dd menu_text_area_2.1 ;0 ;+16 +.text_end dd menu_text_area_2.end ;0 ;+20 +.ret_key dd 0 ;+24 +.mouse_keys dd 0 ;+28 +.x1: +.size_x1 dw 30 ;+32 +.start_x1 dw 95 ;+34 +.y1: +.size_y1 dw 100 ;+36 +.start_y1 dw 41 ;+38 +.bckg_col dd 0xffffff ; 0xe5e5e5 ;+40 +.frnt_col dd 0xff ;+44 +.menu_col dd 0xeef0ff ;0xffffff ;+48 +.select dd 0 ;+52 +.out_select dd 0 ;+56 +.buf_adress dd 0 ;+60 +.procinfo dd procinfo ;+64 +.click dd 0 ;+68 +.cursor dd 0 ;+72 +.cursor_old dd 0 ;+76 +.interval dd 16 ;+80 +.cursor_max dd 0 ;+84 +.extended_key dd 0 ;+88 +.menu_sel_col dd 0x00cc00 ;+92 +.bckg_text_col dd 0 ; +96 +.frnt_text_col dd 0xffffff ;+100 +.mouse_keys_old dd 0 ;+104 +.font_height dd 8 ;+108 +.cursor_out dd 0 ;+112 +.get_mouse_flag dd 0 ;+116 +;--------------------------------------------------------------------- +menu_text_area_2: +db 'Sort',0 +.1: +db 'Name',0 +db 'Type',0 +db 'Date',0 +db 'Size',0 +.end: +db 0 +;--------------------------------------------------------------------- +align 4 +menu_data_3: +.type: dd 0 ;+0 +.x: +.size_x dw 45 ;+4 +.start_x dw 130 ;+6 +.y: +.size_y dw 15 ;+8 +.start_y dw 26 ;+10 +.text_pointer: dd menu_text_area_3 ;0 ;+12 +.pos_pointer: dd menu_text_area_3.1 ;0 ;+16 +.text_end dd menu_text_area_3.end ;0 ;+20 +.ret_key dd 0 ;+24 +.mouse_keys dd 0 ;+28 +.x1: +.size_x1 dw 95 ;+32 +.start_x1 dw 130 ;+34 +.y1: +.size_y1 dw 100 ;+36 +.start_y1 dw 41 ;+38 +.bckg_col dd 0xffffff ; 0xe5e5e5 ;+40 +.frnt_col dd 0xff ;+44 +.menu_col dd 0xeef0ff ;0xffffff ;+48 +.select dd 0 ;+52 +.out_select dd 0 ;+56 +.buf_adress dd 0 ;+60 +.procinfo dd procinfo ;+64 +.click dd 0 ;+68 +.cursor dd 0 ;+72 +.cursor_old dd 0 ;+76 +.interval dd 16 ;+80 +.cursor_max dd 0 ;+84 +.extended_key dd 0 ;+88 +.menu_sel_col dd 0x00cc00 ;+92 +.bckg_text_col dd 0 ; +96 +.frnt_text_col dd 0xffffff ;+100 +.mouse_keys_old dd 0 ;+104 +.font_height dd 8 ;+108 +.cursor_out dd 0 ;+112 +.get_mouse_flag dd 0 ;+116 +;--------------------------------------------------------------------- +menu_text_area_3: +db 'Filter',0 +.1: +db '*.* - show all',0 +db 'Only supported',0 +.end: +db 0 +;--------------------------------------------------------------------- + +align 4 +scroll_bar_data_vertical: +.x: +.size_x dw 15 ;+0 +.start_x dw 500 ;+2 +.y: +.size_y dw 300 ;+4 +.start_y dw 45 ;+6 +.btn_high dd 15 ;+8 +.type dd 2 ;+12 +.max_area dd 10 ;+16 +.cur_area dd 2 ;+20 +.position dd 0 ;+24 +.bckg_col dd 0xeeeeee ;+28 +.frnt_col dd 0xbbddff ;+32 ;0x8aeaa0 +.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 +file_browser_data_1: +.type dd 0 ;+0 +.x: +.size_x dw 400 ;+4 +.start_x dw 10 ;+6 +.y: +.size_y dw 550 ;+8 +.start_y dw 45 ;+10 +.icon_size_y dw 16 ; +12 +.icon_size_x dw 16 ; +14 +.line_size_x dw 0 ; +16 +.line_size_y dw 18 ; +18 +.type_size_x dw 0 ; +20 +.size_size_x dw 0 ; +22 +.date_size_x dw 0 ; +24 +.attributes_size_x dw 0 ; +26 +.icon_assoc_area dd 0 ; +28 +.icon_raw_area dd 0 ; +32 +.resolution_raw dd 0 ; +36 +.palette_raw dd 0 ; +40 +.directory_path_area dd 0 ; +44 +.file_name_area dd 0 ; +48 +.select_flag dd 0 ; +52 +.background_color dd 0xffffff ; +56 +.select_color dd 0xbbddff ; +60 +.seclect_text_color dd 0 ; +64 +.text_color dd 0 ; +68 +.reduct_text_color dd 0xff0000 ; +72 +.marked_text_color dd 0 ; +76 +.max_panel_line dd 0 ; +80 +.select_panel_counter dd 1 ; +84 +.folder_block dd 0 ; +88 +.start_draw_line dd 0 ; +92 +.start_draw_cursor_line dw 0 ; +96 ; pixels +.folder_data dd 0 ; +98 +.temp_counter dd 0 ; +102 +.file_name_length dd 0 ; +106 +.marked_file dd 0 ; +110 +.extension_size dd 0 ; +114 +.extension_start dd 0 ; +118 +.type_table dd features_table ; +122 +.ini_file_start dd 0 ; +126 +.ini_file_end dd 0 ; +130 +.draw_scroll_bar dd 0 ; +134 +.font_size_y dw 9 ; +138 +.font_size_x dw 6 ; +140 +.mouse_keys dd 0 ; +142 +.mouse_keys_old dd 0 ; +146 +.mouse_pos dd 0 ; +150 +.mouse_keys_delta dd 0 ; +154 +.mouse_key_delay dd 50 ; +158 +.mouse_keys_tick dd 0 ; +162 +.start_draw_cursor_line_2 dw 0 ;+166 +.all_redraw dd 0 ;+168 +.selected_BDVK_adress dd 0 ;+172 +.key_action dw 0 ;+176 +.key_action_num dw 0 ;+178 +.name_temp_area dd name_temp_area ;+180 +.max_name_temp_size dd 0 ;+184 +.display_name_max_length dd 0 ;+188 +.draw_panel_selection_flag dd 0 ;+192 +.mouse_pos_old dd 0 ;+196 +.marked_counter dd 0 ;+200 +.keymap_pointer dd keymap_area ;+204 +;--------------------------------------------------------------------- +PathShow_data_1: +.type dd 0 ;+0 +.start_y dw 11 ;+4 +.start_x dw 10 ;+6 +.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 +.area_size_x dw 200 ;+10 +.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable +.background_flag dd 0 ;+16 +.font_color dd 0x0 ;+20 +.background_color dd 0x0 ;+24 +.text_pointer dd dir_path ;+28 +.work_area_pointer dd text_work_area ;+32 +.temp_text_length dd 0 ;+36 +;--------------------------------------------------------------------- +; for EDITBOX +align 4 +name_editboxes: +edit1 edit_box 200,10,7,0xffffff,0xbbddff,0,0,0,4095,user_selected_name,mouse_dd,,0 +name_editboxes_end: + +;mouse_flag: dd 0x0 + +mouse_dd rd 1 +;--------------------------------------------------------------------- +window_x: +.x_size dw 420 +.x_start dw 10 +window_y: +.y_size dw 320 +.y_start dw 10 +;--------------------------------------------------------------------- +features_table: +.type_table: + db ' ' +;--------------------------------------------------------------------- +.size_table: + db '1023b ' +;--------------------------------------------------------------------- +.date_table: + db '00.00.0000 00:00 ' +;--------------------------------------------------------------------- +example_name_temp: + db 'temp1.asm',0 +;--------------------------------------------------------------------- +IM_END: +;--------------------------------------------------------------------- +do_not_draw_open_button_label rb 1 +;--------------------------------------------------------------------- +;include_debug_strings +;--------------------------------------------------------------------- +align 4 +app_colours: + +w_frame rd 1 +w_grab rd 1 +w_work_dark rd 1 +w_work_light rd 1 +w_grab_text rd 1 +w_work rd 1 +w_work_button rd 1 +w_work_button_text rd 1 +w_work_text rd 1 +w_work_graph rd 1 +;--------------------------------------------------------------------- +open_button_coordinates rd 1 +;--------------------------------------------------------------------- +error_handler_store_input_mode rd 1 +;--------------------------------------------------------------------- +menu_text_area_1_1: +rb 256 +;--------------------------------------------------------------------- + rb 1024 +stacktop: +;--------------------------------------------------------------------- +; window error message + rb 1024 +thread_stack: +;--------------------------------------------------------------------- +retrieved_devices_table: + rb 200 +;--------------------------------------------------------------------- +keymap_area: + rb 128 +;--------------------------------------------------------------------- +name_temp_area: + rb 256 +;--------------------------------------------------------------------- +user_selected_name: + rb 256 +;--------------------------------------------------------------------- +param: + rb 256 +;--------------------------------------------------------------------- +path: + rb 4096 +;--------------------------------------------------------------------- +file_name: + rb 4096 +;--------------------------------------------------------------------- +previous_dir_path: + rb 4096 +;--------------------------------------------------------------------- +dir_path: + rb 4096 +;--------------------------------------------------------------------- +dir_path_temp: + rb 4096 +;--------------------------------------------------------------------- +text_work_area: + rb 1024 +;--------------------------------------------------------------------- +procinfo: +process_info: + rb 1024 +;---------------------- +file_info: + rb 40 +I_END: diff --git a/programs/fs/unz/unz.asm b/programs/fs/unz/unz.asm index 57e0eec9d..2b9a4d712 100644 --- a/programs/fs/unz/unz.asm +++ b/programs/fs/unz/unz.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + ;unz - распаковщик, использующий archiver.obj. Поддерживает zip и 7z. ;unz [-o output path] [-f file for unpack] [-f ...] [-h] file.zip @@ -42,7 +48,7 @@ include 'lang.inc' ; Language support for locales: ru_RU (CP866), es_ES, en_US. include '../../macros.inc' include '../../proc32.inc' include "../../string.inc" -include '../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../develop/libraries/box_lib/box_lib.mac' include '../../dll.inc' ;include '../../debug.inc' include 'debug.inc' @@ -917,5 +923,3 @@ stackDlg: stack_top: end_mem: - - diff --git a/programs/games/nu_pogodi/nu_pogod.asm b/programs/games/nu_pogodi/nu_pogod.asm index f04391434..77fd33dff 100644 --- a/programs/games/nu_pogodi/nu_pogod.asm +++ b/programs/games/nu_pogodi/nu_pogod.asm @@ -1,1433 +1,1439 @@ -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' ;макросы для задания элементов 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: +; 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/media/zsea/zSea.asm b/programs/media/zsea/zSea.asm index bb9169f9a..f5c4f67eb 100644 --- a/programs/media/zsea/zSea.asm +++ b/programs/media/zsea/zSea.asm @@ -1,498 +1,504 @@ -;***************************************************************************** -;***************************************************************************** -; zSea - advanced image viewer for KolibriOS -; Copyright (c) 2008-2014, 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. -;***************************************************************************** -; v.1.0 rё5 22.04.2014 -;****************************************************************************** - use32 - org 0x0 - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; start of code - dd IM_END ; size of image - dd I_END ; memory for app - dd stacktop ; esp - dd dest_cmdline ; I_Param - dd path ; APPLICATION PACH - -include 'lang.inc' -;include 'macros.inc' -;include 'editbox_ex.mac' -;include 'proc32.inc' -include '../../macros.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' -include '../../proc32.inc' -;include 'debug.inc' -include '../../KOSfuncs.inc' -include '../../load_lib.mac' - @use_library ;use load lib macros -;****************************************************************************** -;------------------------------------------------------------------------------ -START: ; start of execution - mcall 68, 11 - mcall 66, 1,1 - mcall 40, 0x27 - - mcall 9, procinfo, -1 - mov eax,[ebx+30] - mov [PID],eax - xor ecx,ecx -@@: - inc ecx - mcall 9, procinfo - mov eax,[PID] - cmp eax,[ebx+30] - jne @r - mov [active_process],ecx - - mcall 48,4 - mov [skin_height],eax - - mcall 68,12,1024 - mov [menu_data_1.procinfo],eax - mov [menu_data_2.procinfo],eax - mov [menu_data_3.procinfo],eax - mov [menu_data_4.procinfo],eax - mov [menu_data_5.procinfo],eax - mov [menu_data_6.procinfo],eax - - mov [load_directory_pointer],dir_header - - - call load_plugins - - ;init_checkboxes2 check1,... - push check1 - call [init_checkbox] - push check2 - call [init_checkbox] - - call load_buttons - -; call init_data_OpenDialog - -;init_OpenDialog OpenDialog_data - push dword OpenDialog_data - call [OpenDialog_Init] - -;init_ColorDialog ColorDialog_data - push dword ColorDialog_data - call [ColorDialog_Init] - - call get_filter_data - -;----------------------------------------------------- -; check for parameters - mov esi, [28] - cmp dword [esi],'BOOT' - jne .no_boot -.background: - call load_image - cmp [error_fs],0 - jnz .exit - call convert - - call background - -.exit: - call Set_ini -.exit_1: - mov ebx,18 - mov edx,PID1 - mov esi,7 -.kill_successors: - mov ecx,[edx] - add edx,4 - test ecx,ecx - jz @f - mcall 18 -@@: - dec esi - jnz .kill_successors - - mcall -1 -;----------------------------------------------------- - .no_boot: - xor eax,eax - cmp [esi],al - jnz @f - mov [file_name],eax - jmp .no_param -@@: - - - mov edi,string ; clear string - mov ecx,4096/4 ;256/4 ; length of a string - xor eax,eax ; symbol <0> - rep stosd - - - mov edi, [28] ; look for <0> in temp_area - - cmp [edi],byte "\" - jne .continue - cmp [edi+1],byte "T" - jne @f - mov [bgrmode],dword 1 - jmp .continue_1 -@@: - cmp [edi+1],byte "S" - jne START.exit - mov [bgrmode],dword 2 -.continue_1: - add edi,4 -.continue: - mov esi,edi - mov ecx,4095 ;257 ; strlen - repne scasb - mov ecx, edi - sub ecx, [28] - - mov edi,string - rep movsb ; copy string from temp_area to "string" (filename) - mov ecx, [28] - cmp [ecx],byte "\" - je START.background - call load_directory - test eax,eax - jnz @f - call load_image - test eax,eax - jnz @f - call convert - jmp .no_param -@@: - mov [load_directory_pointer],dir_header - mov [error_fs],eax - call convert.error -;----------------------------------------------------- - .no_param: -; or ecx,-1 ; get information about me -; call getappinfo - -; mov edx,[process_info+30] ; ЄхяхЁ№ т edx эр° шфхэЄшЇшърЄюЁ -; mov ecx,eax - -; @@: -; call getappinfo -; cmp edx,[process_info+30] -; je @f ; хёыш эр° PID ёютяры ё PID ЁрёёьрЄЁштрхьюую яЁюЎхёёр, ь√ эр°ыш ёхс  -; dec ecx ; шэрўх ёьюЄЁшь ёыхфє■∙шщ яЁюЎхёё -; jne @b ; тючтЁр∙рхьё , хёыш эх тёх яЁюЎхёё√ ЁрёёьюЄЁхэ√ -; @@: - -; ЄхяхЁ№ т ecx эюьхЁ яЁюЎхёёр -; mov [process],ecx -;--------------------------------------------------------------------- - cmp [wnd_width],778 - jae @f - mov [wnd_width],778 -@@: - mcall 48, 5 ; GetClientTop, fix for case when @patel in the top - shr ebx, 16 - mov ecx,ebx - shl ecx,16 - add ecx,523 ; [y start] *65536 + [y size] - cmp [wnd_height],ecx - jae @f - mov [wnd_height],ecx -@@: -; call draw_window -red: -;draw_still: -; pusha - call get_window_param - test [window_status],10b - jnz red_1 ;still - test [window_status],100b - jnz red_1 - test [window_status],1b - jnz red_1 - mov esi,-1 - mov eax,procinfo - mov eax,[eax+66] - cmp eax,150 -; cmp [window_high],150 - jae @f - mov esi,150 - mcall 67,-1,ebx,ebx -@@: - mov edx,-1 - mov eax,procinfo - mov eax,[eax+62] - cmp eax,635 -; cmp [window_width],635 - jae @f ;red_1 - mov edx,635 - mcall 67,-1,ebx, ,ebx -@@: -; mcall 67,-1,ebx -; popa -; xor esi,esi -red_1: -; xor eax,eax -; mov [scroll_bar_data_vertical.position],eax -; mov [scroll_bar_data_horizontal.position],eax - - call draw_window - - cmp [redraw_wallpaper_flag],0 - je still - mov [redraw_wallpaper_flag],0 - call clear_thread -; mcall 15,3 -; jmp red_1 -still: - call pause_cicle - - cmp [RAW1_flag],1 - je animation_handler - - mcall 48,4 - cmp [skin_height],eax - je @f - mov [skin_height],eax - call convert.img_resolution_ok - jmp red_1 -@@: - mcall 10 -.1: - cmp [open_file_flag],1 - je kopen_1 - cmp [sort_directory_flag],byte 1 - je red_sort_directory - cmp [redraw_flag],byte 1 - je redraw_window - cmp eax,1 ; яхЁхЁшёютрЄ№ юъэю ? - je red ; хёыш фр - эр ьхЄъє red - cmp eax,2 ; эрцрЄр ъыртш°р ? - je key ; хёыш фр - эр key - cmp eax,3 ; эрцрЄр ъэюяър ? - je button ; хёыш фр - эр button - cmp eax,6 - je mouse -; cmp [redraw_wallpaper_flag],1 -; jne still -; mov [redraw_wallpaper_flag],0 -; mcall 15,3 - jmp still ; хёыш фЁєуюх ёюс√Єшх - т эрўрыю Ўшъыр - -red_sort_directory: - mov [sort_directory_flag],byte 0 - jmp red_1 - -redraw_window: - mov [redraw_flag],byte 0 - jmp red_1 - -;--------------------------------------------------------------------- -; red: -; test dword [status], 4 -; jz draw_still -; mov al,18 -; mov ebx,3 -; mov ecx,[process] -; mcall 18,3,[active_process] -; and byte [status], not 4 -; jmp still -;--------------------------------------------------------------------- -button: ; button - mov eax,17 ; get id - mcall - cmp ah,1 ; button id=1 ? - je START.exit -; jne .noclose -; -; mov eax,-1 ; close this program -; mcall -.noclose: - cmp ah,2 - je slide_show.3 ;still - jmp slide_show -;--------------------------------------------------------------------- -pause_cicle: - pusha -.start: - mcall 9,procinfo,-1 - mov eax,[procinfo+70] ;status of window - test eax,100b - jne @f - popa - ret -@@: - mcall 10 - dec eax - jz .redraw - dec eax - jz .key - dec eax - jnz .start -.button: - mcall -1 -.key: - mcall 2 - jmp .start -.redraw: - call draw_window - jmp .start -;--------------------------------------------------------------------- -get_filter_data: - mov edi,Filter+4 - xor eax,eax - mov ecx,10 - cld -@@: - mov esi,10 - sub esi,ecx - lea esi,[esi+esi*2] ; x 3 - shl esi,3 ; x 8 - add esi,dword Convert_plugin_0.Assoc - mov esi,[esi] - add esi,4 - - test esi,esi - jz @f - call .start - dec ecx - jnz @r -@@: - mov [edi],byte 0 - mov eax,Filter - sub edi,eax - mov [eax],edi - - ret -.start: -@@: - lodsb - stosb - test eax,eax - jnz @r - cmp [esi],ah - jne @r - ret -;--------------------------------------------------------------------- -kopen_1: - - mov [open_file_flag],0 - call load_directory - test eax,eax - jz kopen -.err: - mov [load_directory_pointer],dir_header - mov [error_fs],eax - call convert.error - jmp still ;red_1 - -kopen: - cmp [string],byte 0 - je still - - mov ecx,-1 - call getappinfo - - call load_image - - test eax,eax - jnz kopen_1.err - call convert - -.1: - call get_window_param - test [window_status],1b - jz red ;draw_still - mov [no_draw_window],1 - -; push edx -; mov edx,size_after_convert_2 -; call write_memory_size -; pop edx - - call draw_other - - mov [no_draw_window],0 -; jmp draw_still - jmp still -;--------------------------------------------------------------------- -getappinfo: - mov eax,9 - mov ebx,process_info - mcall - ret -;--------------------------------------------------------------------- -get_window_param: - mcall 9, procinfo, -1 - mov eax,[ebx+34] - mov [window_start_x],eax - mov eax,[ebx+38] - mov [window_start_y],eax - mov eax,[ebx+66] ;46] - inc eax - mov [window_high],eax - mov eax,[ebx+62] ;42] - inc eax - mov [window_width],eax - mov eax,[ebx+70] - mov [window_status],eax -; mcall 48,4 -; mov [skin_high],eax - ret -;--------------------------------------------------------------------- -;write_memory_size: -; pusha -; mcall 9, procinfo, -1 -; mov eax,[ebx+26] -; mov [edx],eax -; popa -; ret -;--------------------------------------------------------------------- -include 'backgrnd.inc' -include 'draw_win.inc' -include 'full_win.inc' -include 'mouse.inc' -include 'key.inc' -include 'menu_key.inc' -include 'clr_bcgr.inc' -include 'w_error.inc' -include 'load.inc' -include 'animat.inc' -include 'draw_img.inc' -include 'convert.inc' -include 'zoom.inc' -include 'w_about.inc' -include 'win_file.inc' -include 'win_info.inc' -include 'win_bcgr.inc' -include 'win_sort.inc' -include 'win_opti.inc' -include 'libini.inc' -include '../../dll.inc' -include 'data.inc' -;--------------------------------------------------------------------- -IM_END: -include 'dat_area.inc' -I_END: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page Windows 1251 - Cyrillic + + +;***************************************************************************** +;***************************************************************************** +; zSea - advanced image viewer for KolibriOS +; Copyright (c) 2008-2014, 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. +;***************************************************************************** +; v.1.0 rё5 22.04.2014 +;****************************************************************************** + use32 + org 0x0 + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd IM_END ; size of image + dd I_END ; memory for app + dd stacktop ; esp + dd dest_cmdline ; I_Param + dd path ; APPLICATION PACH + +include 'lang.inc' +;include 'macros.inc' +;include 'editbox_ex.mac' +;include 'proc32.inc' +include '../../macros.inc' +include '../../develop/libraries/box_lib/box_lib.mac' +include '../../proc32.inc' +;include 'debug.inc' +include '../../KOSfuncs.inc' +include '../../load_lib.mac' + @use_library ;use load lib macros +;****************************************************************************** +;------------------------------------------------------------------------------ +START: ; start of execution + mcall 68, 11 + mcall 66, 1,1 + mcall 40, 0x27 + + mcall 9, procinfo, -1 + mov eax,[ebx+30] + mov [PID],eax + xor ecx,ecx +@@: + inc ecx + mcall 9, procinfo + mov eax,[PID] + cmp eax,[ebx+30] + jne @r + mov [active_process],ecx + + mcall 48,4 + mov [skin_height],eax + + mcall 68,12,1024 + mov [menu_data_1.procinfo],eax + mov [menu_data_2.procinfo],eax + mov [menu_data_3.procinfo],eax + mov [menu_data_4.procinfo],eax + mov [menu_data_5.procinfo],eax + mov [menu_data_6.procinfo],eax + + mov [load_directory_pointer],dir_header + + + call load_plugins + + ;init_checkboxes2 check1,... + push check1 + call [init_checkbox] + push check2 + call [init_checkbox] + + call load_buttons + +; call init_data_OpenDialog + +;init_OpenDialog OpenDialog_data + push dword OpenDialog_data + call [OpenDialog_Init] + +;init_ColorDialog ColorDialog_data + push dword ColorDialog_data + call [ColorDialog_Init] + + call get_filter_data + +;----------------------------------------------------- +; check for parameters + mov esi, [28] + cmp dword [esi],'BOOT' + jne .no_boot +.background: + call load_image + cmp [error_fs],0 + jnz .exit + call convert + + call background + +.exit: + call Set_ini +.exit_1: + mov ebx,18 + mov edx,PID1 + mov esi,7 +.kill_successors: + mov ecx,[edx] + add edx,4 + test ecx,ecx + jz @f + mcall 18 +@@: + dec esi + jnz .kill_successors + + mcall -1 +;----------------------------------------------------- + .no_boot: + xor eax,eax + cmp [esi],al + jnz @f + mov [file_name],eax + jmp .no_param +@@: + + + mov edi,string ; clear string + mov ecx,4096/4 ;256/4 ; length of a string + xor eax,eax ; symbol <0> + rep stosd + + + mov edi, [28] ; look for <0> in temp_area + + cmp [edi],byte "\" + jne .continue + cmp [edi+1],byte "T" + jne @f + mov [bgrmode],dword 1 + jmp .continue_1 +@@: + cmp [edi+1],byte "S" + jne START.exit + mov [bgrmode],dword 2 +.continue_1: + add edi,4 +.continue: + mov esi,edi + mov ecx,4095 ;257 ; strlen + repne scasb + mov ecx, edi + sub ecx, [28] + + mov edi,string + rep movsb ; copy string from temp_area to "string" (filename) + mov ecx, [28] + cmp [ecx],byte "\" + je START.background + call load_directory + test eax,eax + jnz @f + call load_image + test eax,eax + jnz @f + call convert + jmp .no_param +@@: + mov [load_directory_pointer],dir_header + mov [error_fs],eax + call convert.error +;----------------------------------------------------- + .no_param: +; or ecx,-1 ; get information about me +; call getappinfo + +; mov edx,[process_info+30] ; ЄхяхЁ№ т edx эр° шфхэЄшЇшърЄюЁ +; mov ecx,eax + +; @@: +; call getappinfo +; cmp edx,[process_info+30] +; je @f ; хёыш эр° PID ёютяры ё PID ЁрёёьрЄЁштрхьюую яЁюЎхёёр, ь√ эр°ыш ёхс  +; dec ecx ; шэрўх ёьюЄЁшь ёыхфє■∙шщ яЁюЎхёё +; jne @b ; тючтЁр∙рхьё , хёыш эх тёх яЁюЎхёё√ ЁрёёьюЄЁхэ√ +; @@: + +; ЄхяхЁ№ т ecx эюьхЁ яЁюЎхёёр +; mov [process],ecx +;--------------------------------------------------------------------- + cmp [wnd_width],778 + jae @f + mov [wnd_width],778 +@@: + mcall 48, 5 ; GetClientTop, fix for case when @patel in the top + shr ebx, 16 + mov ecx,ebx + shl ecx,16 + add ecx,523 ; [y start] *65536 + [y size] + cmp [wnd_height],ecx + jae @f + mov [wnd_height],ecx +@@: +; call draw_window +red: +;draw_still: +; pusha + call get_window_param + test [window_status],10b + jnz red_1 ;still + test [window_status],100b + jnz red_1 + test [window_status],1b + jnz red_1 + mov esi,-1 + mov eax,procinfo + mov eax,[eax+66] + cmp eax,150 +; cmp [window_high],150 + jae @f + mov esi,150 + mcall 67,-1,ebx,ebx +@@: + mov edx,-1 + mov eax,procinfo + mov eax,[eax+62] + cmp eax,635 +; cmp [window_width],635 + jae @f ;red_1 + mov edx,635 + mcall 67,-1,ebx, ,ebx +@@: +; mcall 67,-1,ebx +; popa +; xor esi,esi +red_1: +; xor eax,eax +; mov [scroll_bar_data_vertical.position],eax +; mov [scroll_bar_data_horizontal.position],eax + + call draw_window + + cmp [redraw_wallpaper_flag],0 + je still + mov [redraw_wallpaper_flag],0 + call clear_thread +; mcall 15,3 +; jmp red_1 +still: + call pause_cicle + + cmp [RAW1_flag],1 + je animation_handler + + mcall 48,4 + cmp [skin_height],eax + je @f + mov [skin_height],eax + call convert.img_resolution_ok + jmp red_1 +@@: + mcall 10 +.1: + cmp [open_file_flag],1 + je kopen_1 + cmp [sort_directory_flag],byte 1 + je red_sort_directory + cmp [redraw_flag],byte 1 + je redraw_window + cmp eax,1 ; яхЁхЁшёютрЄ№ юъэю ? + je red ; хёыш фр - эр ьхЄъє red + cmp eax,2 ; эрцрЄр ъыртш°р ? + je key ; хёыш фр - эр key + cmp eax,3 ; эрцрЄр ъэюяър ? + je button ; хёыш фр - эр button + cmp eax,6 + je mouse +; cmp [redraw_wallpaper_flag],1 +; jne still +; mov [redraw_wallpaper_flag],0 +; mcall 15,3 + jmp still ; хёыш фЁєуюх ёюс√Єшх - т эрўрыю Ўшъыр + +red_sort_directory: + mov [sort_directory_flag],byte 0 + jmp red_1 + +redraw_window: + mov [redraw_flag],byte 0 + jmp red_1 + +;--------------------------------------------------------------------- +; red: +; test dword [status], 4 +; jz draw_still +; mov al,18 +; mov ebx,3 +; mov ecx,[process] +; mcall 18,3,[active_process] +; and byte [status], not 4 +; jmp still +;--------------------------------------------------------------------- +button: ; button + mov eax,17 ; get id + mcall + cmp ah,1 ; button id=1 ? + je START.exit +; jne .noclose +; +; mov eax,-1 ; close this program +; mcall +.noclose: + cmp ah,2 + je slide_show.3 ;still + jmp slide_show +;--------------------------------------------------------------------- +pause_cicle: + pusha +.start: + mcall 9,procinfo,-1 + mov eax,[procinfo+70] ;status of window + test eax,100b + jne @f + popa + ret +@@: + mcall 10 + dec eax + jz .redraw + dec eax + jz .key + dec eax + jnz .start +.button: + mcall -1 +.key: + mcall 2 + jmp .start +.redraw: + call draw_window + jmp .start +;--------------------------------------------------------------------- +get_filter_data: + mov edi,Filter+4 + xor eax,eax + mov ecx,10 + cld +@@: + mov esi,10 + sub esi,ecx + lea esi,[esi+esi*2] ; x 3 + shl esi,3 ; x 8 + add esi,dword Convert_plugin_0.Assoc + mov esi,[esi] + add esi,4 + + test esi,esi + jz @f + call .start + dec ecx + jnz @r +@@: + mov [edi],byte 0 + mov eax,Filter + sub edi,eax + mov [eax],edi + + ret +.start: +@@: + lodsb + stosb + test eax,eax + jnz @r + cmp [esi],ah + jne @r + ret +;--------------------------------------------------------------------- +kopen_1: + + mov [open_file_flag],0 + call load_directory + test eax,eax + jz kopen +.err: + mov [load_directory_pointer],dir_header + mov [error_fs],eax + call convert.error + jmp still ;red_1 + +kopen: + cmp [string],byte 0 + je still + + mov ecx,-1 + call getappinfo + + call load_image + + test eax,eax + jnz kopen_1.err + call convert + +.1: + call get_window_param + test [window_status],1b + jz red ;draw_still + mov [no_draw_window],1 + +; push edx +; mov edx,size_after_convert_2 +; call write_memory_size +; pop edx + + call draw_other + + mov [no_draw_window],0 +; jmp draw_still + jmp still +;--------------------------------------------------------------------- +getappinfo: + mov eax,9 + mov ebx,process_info + mcall + ret +;--------------------------------------------------------------------- +get_window_param: + mcall 9, procinfo, -1 + mov eax,[ebx+34] + mov [window_start_x],eax + mov eax,[ebx+38] + mov [window_start_y],eax + mov eax,[ebx+66] ;46] + inc eax + mov [window_high],eax + mov eax,[ebx+62] ;42] + inc eax + mov [window_width],eax + mov eax,[ebx+70] + mov [window_status],eax +; mcall 48,4 +; mov [skin_high],eax + ret +;--------------------------------------------------------------------- +;write_memory_size: +; pusha +; mcall 9, procinfo, -1 +; mov eax,[ebx+26] +; mov [edx],eax +; popa +; ret +;--------------------------------------------------------------------- +include 'backgrnd.inc' +include 'draw_win.inc' +include 'full_win.inc' +include 'mouse.inc' +include 'key.inc' +include 'menu_key.inc' +include 'clr_bcgr.inc' +include 'w_error.inc' +include 'load.inc' +include 'animat.inc' +include 'draw_img.inc' +include 'convert.inc' +include 'zoom.inc' +include 'w_about.inc' +include 'win_file.inc' +include 'win_info.inc' +include 'win_bcgr.inc' +include 'win_sort.inc' +include 'win_opti.inc' +include 'libini.inc' +include '../../dll.inc' +include 'data.inc' +;--------------------------------------------------------------------- +IM_END: +include 'dat_area.inc' +I_END: 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/network/netstat/netstat.asm b/programs/network/netstat/netstat.asm index 1c95ac099..80d703764 100644 --- a/programs/network/netstat/netstat.asm +++ b/programs/network/netstat/netstat.asm @@ -1,1029 +1,1029 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2010-2021. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;; netstat.asm - Network Status Tool for KolibriOS ;; -;; ;; -;; Written by hidnplayr@kolibrios.org ;; -;; ;; -;; GNU GENERAL PUBLIC LICENSE ;; -;; Version 2, June 1991 ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -format binary as "" - -BOX_WIDTH = 390 -BOX_HEIGHT = 185 - -use32 - - org 0x0 - - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; start of code - dd I_END ; size of image - dd (I_END+0x1000) ; memory for app - dd (I_END+0x1000) ; esp - dd 0, 0 ; I_Param, I_Path - -include '../../proc32.inc' -include '../../macros.inc' -include '../../dll.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' - -include '../../network.inc' - -include 'ipcfg.inc' - -START: - - mcall 68, 11 - - stdcall dll.Load, @IMPORT - or eax, eax - jnz exit - - mcall 40, EVM_REDRAW + EVM_BUTTON + EVM_STACK2 + EVM_KEY - -window_redraw: - -; get system colors - mcall 48, 3, sc, 40 - -; Notify kernel of start of window draw - mcall 12, 1 - -; Draw the window - mcall 0, 100 shl 16 + 600, 100 shl 16 + 240, 0x34E1E1E1, , name - -; Define the buttons (for tabs) - mov ebx, 5 shl 16 + 54 - mov ecx, 4 shl 16 + 21 - mov edx, 0x60000000 + 101 - .buttonloop: - mcall 8 - add ebx, 60 shl 16 - inc edx - cmp dl, 106 - jle .buttonloop - -; draw sides and upper lines of the tab buttons - mov eax, 13 - mov ebx, 5 shl 16 + 1 - mov ecx, 4 shl 16 + 21 - mov edx, 0x00777777 - .loop: - mcall - mov bx, 54 - mov cx, 1 - mcall - mov bx, 1 - mov cx, 21 - add ebx, 54 shl 16 - mcall - add ebx, 6 shl 16 - cmp ebx, 360 shl 16 - jb .loop - -; Draw sides and bottom lines of the rectangle - mcall , 0 shl 16 + 1, 25 shl 16 + BOX_HEIGHT;, 0x00777777 - mcall , (0+BOX_WIDTH) shl 16 +1, 25 shl 16 + (BOX_HEIGHT+1) - mcall , 0 shl 16 + BOX_WIDTH, (25+BOX_HEIGHT) shl 16 + 1 - -redraw: - -; Draw interface buttons (on the right hand side) - call draw_interfaces - -; Draw upper line of rectangle - mcall 13, 0 shl 16 + BOX_WIDTH, 25 shl 16 + 1, 0x00777777 - -; Fill rectangle - mcall 13, 1 shl 16 + BOX_WIDTH-1, 26 shl 16 + BOX_HEIGHT-1, 0x00F3F3F3 - -; Undefine IP settings button - mov edx, 0x80000002 - mcall 8 - -; Fill tab buttons - mov eax, 13 - mov ebx, 6 shl 16 + 53 - mov si, 101 - .buttonloop: - mov ecx, 6 shl 16 + 19 - mov edx, 0x00BBBBBB - cmp si, [mode] - jne @f - mov edx, 0x00F3F3F3 ; Activated button has other colors - inc ecx - @@: - mcall - mov edx, 0x00E1E1E1 - cmp si, [mode] - jne @f - mov edx, 0x00FFFFFF ; Activated button has other colors - @@: - mov ecx, 5 shl 16 + 1 - mcall - add ebx, 60 shl 16 - inc si - cmp si, 106 - jle .buttonloop -; Print button names on top of the buttons - mcall 4, 9 shl 16 + 12, 0x80000000, modes - -; Get information about the selected device - xor ebx, ebx - mov bh, [device] - mcall 74 - mov [device_type], eax - - cmp [mode], 101 - jne .no_eth - - mcall 4, 212 shl 16 + 35, 0x80000000, str_err - add ebx, 18 - mov edx, str_dropped - mcall - add ebx, 18 - mov edx, str_missed - mcall - add ebx, 18 - mov edx, str_err - mcall - add ebx, 18 - mov edx, str_dropped - mcall - add ebx, 18 - mov edx, str_missed - mcall - - mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx - add ebx, 18 - mov edx, str_packets_rx - mcall - add ebx, 18 - mov edx, str_bytes_tx - mcall - add ebx, 18 - mov edx, str_bytes_rx - mcall - add ebx, 18 - mov edx, str_speed_tx - mcall - add ebx, 18 - mov edx, str_speed_rx - mcall - add ebx, 18 - mov edx, str_link - mcall - - cmp [device_type], 1 - jne end_of_draw - - add ebx, 18 - mov edx, str_MAC - mcall - - mov ebx, API_ETH - mov bh, [device] - mcall 76 - push eax - push bx - - mov edx, 116 shl 16 + 35 + 7*18 - call draw_mac - jmp end_of_draw - - .no_eth: - - cmp [mode], 102 - jne .no_ip - - mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx - add ebx, 18 - mov edx, str_packets_rx - mcall - add ebx, 18 - mov edx, str_ip - mcall - add ebx, 18 - mov edx, str_dns - mcall - add ebx, 18 - mov edx, str_subnet - mcall - add ebx, 18 - mov edx, str_gateway - mcall - - - mov ebx, API_IPv4 + 8 - mov bh, [device] - mcall 76 - push eax - - dec bl - dec bl - mcall 76 - push eax - - dec bl - dec bl - mcall 76 - push eax - - dec bl - dec bl - mcall 76 - push eax - - mov edx, 116 shl 16 + 35 + 2*18 - call draw_ip - - add edx, 18 - call draw_ip - - add edx, 18 - call draw_ip - - add edx, 18 - call draw_ip - - cmp [device], 0 - je end_of_draw - - mcall 8, 128 shl 16 + 100, 150 shl 16 + 20, 2, [sc.work_button] - mcall 4, 150 shl 16 + 157, [sc.work_button_text], str_ip_cfg, str_ip_cfg.len - - jmp end_of_draw - - .no_ip: - - cmp [mode], 103 - jne .no_arp - - mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx - add ebx, 18 - mov edx, str_packets_rx - mcall - add ebx, 18 - mov edx, str_arp - mcall - add ebx, 18 - mov edx, str_conflicts - mcall - - mcall 4, 8 shl 16 + 130, 0x80000000, str_ARP_legend - - jmp end_of_draw - - .no_arp: - - mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx - - add ebx, 18 - mov edx, str_packets_rx - mcall - - cmp [mode], 106 - jne end_of_draw - - add ebx, 18 - mov edx, str_missed - mcall - - add ebx, 18 - mov edx, str_dropped - mcall - - add ebx, 18 - mov edx, str_queued - mcall - -end_of_draw: - - mcall 12, 2 - -draw_stats: - - cmp [mode], 101 - jne not_101 - - mov ebx, API_ETH - mov bh, [device] - mov bl, 6 - @@: - push ebx - mcall 74 - pop ebx - push eax - inc bl - cmp bl, 16 - jbe @r - -; rx ovr - mov ebx, 0x000a0000 - pop ecx - mov edx, 320 shl 16 + 35 + 5*18 - mov esi, 0x40000000 - mcall 47 - -; rx drop - sub edx, 18 - pop ecx - mcall - -; rx err - sub edx, 18 - pop ecx - mcall - -; tx ovr - sub edx, 18 - pop ecx - mcall - -; tx drop - sub edx, 18 - pop ecx - mcall - -; tx err - sub edx, 18 - pop ecx - mcall - -; Calculate speed - pop ecx - - push [time] - pop [delta_time] - mcall 26, 9 ; TODO: use 26, 10 instead - mov [time], eax - sub eax, [delta_time] - jnz @f - inc eax ; Zero time units? Lets make it at least one. - @@: - lea eax, [eax + 4*eax] - shl eax, 1 - mov [delta_time], eax - - mov eax, [esp+4] ; bytes received - push eax - sub eax, [prev_rx] - pop [prev_rx] - xor edx, edx - div [delta_time] - push eax - - mov eax, [esp+4] ; bytes sent - push eax - sub eax, [prev_tx] - pop [prev_tx] - xor edx, edx - div [delta_time] - push eax - - test cl, cl - jnz @f - mov edx, str_down - jmp .print_link - @@: - cmp cl, 100b - jnz @f - mov edx, str_10m - jmp .print_link - @@: - cmp cl, 110b - jnz @f - mov edx, str_10mfd - jmp .print_link - @@: - cmp cl, 1000b - jnz @f - mov edx, str_100m - jmp .print_link - @@: - cmp cl, 1010b - jnz @f - mov edx, str_100mfd - jmp .print_link - @@: - cmp cl, 1100b - jnz @f - mov edx, str_1g - jmp .print_link - @@: - cmp cl, 1110b - jnz @f - mov edx, str_1gfd - jmp .print_link - @@: - mov edx, str_unknown - - .print_link: - mov ebx, 116 shl 16 + 35 + 6*18 - mov ecx, 0xc0000000 - mov edi, 0x00f3f3f3 - mcall 4 - -; speed rx - mov ebx, 0x000a0000 - pop ecx - mov edx, 116 shl 16 + 35 + 5*18 - mov esi, 0x40000000 - mcall 47 - -; speed tx - sub edx, 18 - pop ecx - mcall - -; bytes received - sub edx, 18 - pop ecx - mcall - -; bytes sent - sub edx, 18 - pop ecx - mcall - -; packets received - sub edx, 18 - pop ecx - mcall - -; packets sent - sub edx, 18 - pop ecx - mcall - - jmp mainloop - - -not_101: - - cmp [mode], 102 - jne not_102 - - mov ebx, API_IPv4 - mov bh, [device] - push ebx - mcall 76 - pop ebx - push eax - - inc bl - push ebx - mcall 76 - pop ebx - push eax - - - mov ebx, 0x000a0000 - pop ecx - mov edx, 116 shl 16 + 35 + 18 - mov esi, 0x40000000 - mov edi, 0x00F3F3F3 - mcall 47 - - sub edx, 18 - pop ecx - mcall - - jmp mainloop - - -not_102: - - cmp [mode], 103 - jne not_103 - - mov ebx, API_ARP - mov bh, [device] - push ebx - mcall 76 ; tx - pop ebx - push eax - - inc bl - push ebx - mcall 76 ; rx - pop ebx - push eax - - inc bl - push ebx - mcall 76 ; entries - pop ebx - push eax - - mov bl, 7 - push ebx - mcall 76 - pop ebx - push eax - - mov ebx, 0x000a0000 - pop ecx - mov edx, 116 shl 16 + 35 + 3*18 - mov esi, 0x40000000 - mov edi, 0x00F3F3F3 - mcall 47 - - sub edx, 18 - pop ecx - mcall - - sub edx, 18 - pop ecx - mcall - - sub edx, 18 - pop ecx - mcall - -; mov edx, 50 shl 16 + 150 - mov [last], 0 - - .arp_loop: - mov ebx, API_ARP + 3 ; read ARP entry - mov bh, [device] - mcall 76, ,[last], , , arp_buf - cmp eax, -1 - je mainloop - - mov ebx, [last] - imul ebx, 16 - add ebx, 8 shl 16 + 140 - mcall 4, , 0x80000000, str_ARP_entry - mov edx, ebx - - mov eax, 47 - mov ebx, 0x00030000 - mov esi, 0x40000000 - mov edi, 0x00F3F3F3 - xor ecx, ecx - - mov cl, byte[arp_buf.IP+0] - mcall - - mov cl, byte[arp_buf.IP+1] - add edx, 24 shl 16 - mcall - - mov cl, byte[arp_buf.IP+2] - add edx, 24 shl 16 - mcall - - mov cl, byte[arp_buf.IP+3] - add edx, 24 shl 16 - mcall - - - mov ebx, 0x00020100 - mov cl, byte[arp_buf.MAC+0] - add edx, 36 shl 16 - mcall - - mov cl, byte[arp_buf.MAC+1] - add edx, 18 shl 16 - mcall - - mov cl, byte[arp_buf.MAC+2] - add edx, 18 shl 16 - mcall - - mov cl, byte[arp_buf.MAC+3] - add edx, 18 shl 16 - mcall - - mov cl, byte[arp_buf.MAC+4] - add edx, 18 shl 16 - mcall - - mov cl, byte[arp_buf.MAC+5] - add edx, 18 shl 16 - mcall - - mov ebx, 0x00040000 - mov cx, [arp_buf.status] - add edx, 30 shl 16 - mcall - - mov cx, [arp_buf.TTL] - add edx, 60 shl 16 - mcall - - add dx, 18 - rol edx, 16 - mov dx, 8 - rol edx, 16 - inc [last] - - jmp .arp_loop - -not_103: - - cmp [mode], 104 - jne not_104 - - mov ebx, API_ICMP - mov bh, [device] - push ebx - mcall 76 - pop ebx - push eax - - inc bl - push ebx - mcall 76 - pop ebx - push eax - - mov ebx, 0x000a0000 - pop ecx - mov edx, 116 shl 16 + 35 + 18 - mov esi, 0x40000000 - mov edi, 0x00F3F3F3 - mcall 47 - - sub edx, 18 - pop ecx - mcall - - jmp mainloop - -not_104: - - cmp [mode], 105 - jne not_105 - - mov ebx, API_UDP - mov bh, [device] - push ebx - mcall 76 - pop ebx - push eax - - inc bl - push ebx - mcall 76 - pop ebx - push eax - - mov ebx, 0x000a0000 - pop ecx - mov edx, 116 shl 16 + 35 + 18 - mov esi, 0x40000000 - mov edi, 0x00F3F3F3 - mcall 47 - - sub edx, 18 - pop ecx - mcall - - jmp mainloop - -not_105: - - cmp [mode], 106 - jne not_106 - - mov ebx, API_TCP - mov bh, [device] - push ebx - mcall 76 - pop ebx - push eax - - inc bl - push ebx - mcall 76 - pop ebx - push eax - - inc bl - push ebx - mcall 76 - pop ebx - push eax - - inc bl - push ebx - mcall 76 - pop ebx - push eax - - inc bl - push ebx - mcall 76 - pop ebx - push eax - - mov ebx, 0x000a0000 - pop ecx - mov edx, 116 shl 16 + 35 + 18*4 - mov esi, 0x40000000 - mov edi, 0x00F3F3F3 - mcall 47 - - sub edx, 18 - pop ecx - mcall - - sub edx, 18 - pop ecx - mcall - - sub edx, 18 - pop ecx - mcall - - sub edx, 18 - pop ecx - mcall - - jmp mainloop - -not_106: - -mainloop: - - mcall 23, 50 ; wait for event with timeout (0,5 s) - - cmp eax, EV_REDRAW - je window_redraw - cmp eax, EV_BUTTON - je button - cmp eax, EV_KEY - je key - cmp eax, 11 - je redraw - - jmp draw_stats - -button: ; button - mcall 17 ; get id - cmp ah, 1 - je exit - cmp ah, 2 - je .ipcfg - cmp ah, 0 - je .interface - shr ax, 8 - mov [mode], ax - jmp redraw - - .ipcfg: - mcall 51, 1, ipcfg, I_END+0x1000 - jmp mainloop - - .interface: - shr eax, 16 - mov [device], al - jmp redraw - -key: - mcall 2 - cmp ah, 9 - je .tab - cmp ah, 183 - je .pgdown - cmp ah, 184 - je .pgup - jmp mainloop - - .tab: - inc [mode] - cmp [mode], 106 - jbe redraw - mov [mode], 101 - jmp redraw - - .pgdown: - inc [device] - mov al, [device] - cmp al, [last_device] - jbe redraw - mov [device], 0 - jmp redraw - - .pgup: - dec [device] - cmp [device], 0 - jge redraw - mov al, [last_device] - mov [device], al - jmp redraw - -exit: - mcall -1 - - - -draw_mac: - - mov eax, 47 - mov ebx, 0x00020100 - mov esi, 0x40000000 - mov edi, 0x00F3F3F3 - - mov cl, [esp+4] - mcall - - mov cl, [esp+4+1] - add edx, 18 shl 16 - mcall - - mov cl, [esp+4+2] - add edx, 18 shl 16 - mcall - - mov cl, [esp+4+3] - add edx, 18 shl 16 - mcall - - mov cl, [esp+4+4] - add edx, 18 shl 16 - mcall - - mov cl, [esp+4+5] - add edx, 18 shl 16 - mcall - - sub edx, 5*18 shl 16 - - ret 6 - - -draw_ip: - - mov eax, 47 - mov ebx, 0x00030000 - mov esi, 0x40000000 - mov edi, 0x00F3F3F3 - - xor ecx, ecx - - mov cl, [esp+4] - mcall - - mov cl, [esp+4+1] - add edx, 24 shl 16 - mcall - - mov cl, [esp+4+2] - add edx, 24 shl 16 - mcall - - mov cl, [esp+4+3] - add edx, 24 shl 16 - mcall - - sub edx, 3*24 shl 16 - ret 4 - - -draw_interfaces: - - mov [.btnpos], 5 shl 16 + 20 - mov [.txtpos], 405 shl 16 + 12 - - mcall 74, -1 ; get number of active network devices - mov ecx, eax - dec al - mov [last_device], al - cmp [device], al - jbe @f - mov [device], 0 - @@: - - xor ebx, ebx ; get device type - .loop: - mcall 74 - cmp eax, 1 ; loopback or ethernet? - jbe .hit - inc bh - jb .loop ; tried all 256? - ret - - - .hit: - push ecx ebx - movzx edx, bh - shl edx, 8 - mov esi, 0x00BBBbbb - cmp bh, [device] - cmove esi, 0x0081BBFF - mcall 8, 400 shl 16 + 185, [.btnpos] - mov ebx, [esp] - inc bl - mov ecx, namebuf - mov edx, namebuf - mcall 74 ; get device name - cmp eax, -1 - jne @f - mov edx, str_unknown - @@: - mcall 4, [.txtpos], 0x80000000 ; print the name - pop ebx ecx - - inc bh - - add [.btnpos], 25 shl 16 - add [.txtpos], 25 - - dec ecx - jnz .loop - - ret - - .btnpos dd ? - .txtpos dd ? - - -; DATA AREA - -align 16 -@IMPORT: - -library box_lib , 'box_lib.obj', \ - libini , 'libini.obj' - -import libini, \ - ini.get_str , 'ini_get_str' ,\ - ini.set_str , 'ini_set_str' ,\ - ini.enum_sections, 'ini_enum_sections' - -import box_lib ,\ - edit_box_draw , 'edit_box' ,\ - edit_box_key , 'edit_box_key' ,\ - edit_box_mouse , 'edit_box_mouse' ,\ - edit_set_text , 'edit_box_set_text' ,\ - version_ed , 'version_ed' ,\ - init_checkbox , 'init_checkbox2' ,\ - check_box_draw , 'check_box_draw2' ,\ - check_box_mouse , 'check_box_mouse2' ,\ - version_ch , 'version_ch2' ,\ - option_box_draw , 'option_box_draw' ,\ - option_box_mouse, 'option_box_mouse' ,\ - version_op , 'version_op' - -name db 'Network status', 0 -mode dw 101 ; currently selected protocol -device db 1 ; currently selected device -last_device db ? ; last device available -device_type dd ? -last dd ? -modes db 'Physical IPv4 ARP ICMP UDP TCP', 0 - -str_packets_tx db 'Packets sent:', 0 -str_packets_rx db 'Packets received:', 0 -str_bytes_tx db 'Bytes sent:', 0 -str_bytes_rx db 'Bytes received:', 0 -str_MAC db 'MAC address: - - - - -', 0 -str_ip db 'IP address: . . .', 0 -str_dns db 'DNS address: . . .', 0 -str_subnet db 'Subnet mask: . . .', 0 -str_gateway db 'Standard gateway: . . .', 0 -str_arp db 'ARP entrys:', 0 -str_conflicts db 'ARP conflicts:', 0 -str_missed db 'Packets missed:', 0 -str_dropped db 'Packets dropped:', 0 -str_err db 'Packet errors:', 0 -str_queued db 'Packets queued:', 0 -str_link db 'Link state:', 0 -str_speed_tx db 'Upload (kb/s):', 0 -str_speed_rx db 'Download (kb/s):', 0 -str_ip_cfg db 'Configure' -.len = $ - str_ip_cfg - -str_down db 'disconnected ', 0 -str_unknown db 'unknown ', 0 -str_10m db '10 Mbit Half duplex ', 0 -str_10mfd db '10 Mbit Full duplex ', 0 -str_100m db '100 Mbit Half duplex', 0 -str_100mfd db '100 Mbit Full duplex', 0 -str_1g db '1 Gbit Half duplex ', 0 -str_1gfd db '1 Gbit Full duplex ', 0 - -str_ARP_legend db 'IP-address MAC-address Status TTL', 0 -str_ARP_entry db ' . . . - - - - -', 0 - -prev_rx dd ? -prev_tx dd ? -time dd ? -delta_time dd ? - -namebuf rb 64 -arp_buf ARP_entry - -sc system_colors - -I_END: \ No newline at end of file +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2010-2021. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; netstat.asm - Network Status Tool for KolibriOS ;; +;; ;; +;; Written by hidnplayr@kolibrios.org ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +format binary as "" + +BOX_WIDTH = 390 +BOX_HEIGHT = 185 + +use32 + + org 0x0 + + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd I_END ; size of image + dd (I_END+0x1000) ; memory for app + dd (I_END+0x1000) ; esp + dd 0, 0 ; I_Param, I_Path + +include '../../proc32.inc' +include '../../macros.inc' +include '../../dll.inc' +include '../../develop/libraries/box_lib/box_lib.mac' + +include '../../network.inc' + +include 'ipcfg.inc' + +START: + + mcall 68, 11 + + stdcall dll.Load, @IMPORT + or eax, eax + jnz exit + + mcall 40, EVM_REDRAW + EVM_BUTTON + EVM_STACK2 + EVM_KEY + +window_redraw: + +; get system colors + mcall 48, 3, sc, 40 + +; Notify kernel of start of window draw + mcall 12, 1 + +; Draw the window + mcall 0, 100 shl 16 + 600, 100 shl 16 + 240, 0x34E1E1E1, , name + +; Define the buttons (for tabs) + mov ebx, 5 shl 16 + 54 + mov ecx, 4 shl 16 + 21 + mov edx, 0x60000000 + 101 + .buttonloop: + mcall 8 + add ebx, 60 shl 16 + inc edx + cmp dl, 106 + jle .buttonloop + +; draw sides and upper lines of the tab buttons + mov eax, 13 + mov ebx, 5 shl 16 + 1 + mov ecx, 4 shl 16 + 21 + mov edx, 0x00777777 + .loop: + mcall + mov bx, 54 + mov cx, 1 + mcall + mov bx, 1 + mov cx, 21 + add ebx, 54 shl 16 + mcall + add ebx, 6 shl 16 + cmp ebx, 360 shl 16 + jb .loop + +; Draw sides and bottom lines of the rectangle + mcall , 0 shl 16 + 1, 25 shl 16 + BOX_HEIGHT;, 0x00777777 + mcall , (0+BOX_WIDTH) shl 16 +1, 25 shl 16 + (BOX_HEIGHT+1) + mcall , 0 shl 16 + BOX_WIDTH, (25+BOX_HEIGHT) shl 16 + 1 + +redraw: + +; Draw interface buttons (on the right hand side) + call draw_interfaces + +; Draw upper line of rectangle + mcall 13, 0 shl 16 + BOX_WIDTH, 25 shl 16 + 1, 0x00777777 + +; Fill rectangle + mcall 13, 1 shl 16 + BOX_WIDTH-1, 26 shl 16 + BOX_HEIGHT-1, 0x00F3F3F3 + +; Undefine IP settings button + mov edx, 0x80000002 + mcall 8 + +; Fill tab buttons + mov eax, 13 + mov ebx, 6 shl 16 + 53 + mov si, 101 + .buttonloop: + mov ecx, 6 shl 16 + 19 + mov edx, 0x00BBBBBB + cmp si, [mode] + jne @f + mov edx, 0x00F3F3F3 ; Activated button has other colors + inc ecx + @@: + mcall + mov edx, 0x00E1E1E1 + cmp si, [mode] + jne @f + mov edx, 0x00FFFFFF ; Activated button has other colors + @@: + mov ecx, 5 shl 16 + 1 + mcall + add ebx, 60 shl 16 + inc si + cmp si, 106 + jle .buttonloop +; Print button names on top of the buttons + mcall 4, 9 shl 16 + 12, 0x80000000, modes + +; Get information about the selected device + xor ebx, ebx + mov bh, [device] + mcall 74 + mov [device_type], eax + + cmp [mode], 101 + jne .no_eth + + mcall 4, 212 shl 16 + 35, 0x80000000, str_err + add ebx, 18 + mov edx, str_dropped + mcall + add ebx, 18 + mov edx, str_missed + mcall + add ebx, 18 + mov edx, str_err + mcall + add ebx, 18 + mov edx, str_dropped + mcall + add ebx, 18 + mov edx, str_missed + mcall + + mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx + add ebx, 18 + mov edx, str_packets_rx + mcall + add ebx, 18 + mov edx, str_bytes_tx + mcall + add ebx, 18 + mov edx, str_bytes_rx + mcall + add ebx, 18 + mov edx, str_speed_tx + mcall + add ebx, 18 + mov edx, str_speed_rx + mcall + add ebx, 18 + mov edx, str_link + mcall + + cmp [device_type], 1 + jne end_of_draw + + add ebx, 18 + mov edx, str_MAC + mcall + + mov ebx, API_ETH + mov bh, [device] + mcall 76 + push eax + push bx + + mov edx, 116 shl 16 + 35 + 7*18 + call draw_mac + jmp end_of_draw + + .no_eth: + + cmp [mode], 102 + jne .no_ip + + mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx + add ebx, 18 + mov edx, str_packets_rx + mcall + add ebx, 18 + mov edx, str_ip + mcall + add ebx, 18 + mov edx, str_dns + mcall + add ebx, 18 + mov edx, str_subnet + mcall + add ebx, 18 + mov edx, str_gateway + mcall + + + mov ebx, API_IPv4 + 8 + mov bh, [device] + mcall 76 + push eax + + dec bl + dec bl + mcall 76 + push eax + + dec bl + dec bl + mcall 76 + push eax + + dec bl + dec bl + mcall 76 + push eax + + mov edx, 116 shl 16 + 35 + 2*18 + call draw_ip + + add edx, 18 + call draw_ip + + add edx, 18 + call draw_ip + + add edx, 18 + call draw_ip + + cmp [device], 0 + je end_of_draw + + mcall 8, 128 shl 16 + 100, 150 shl 16 + 20, 2, [sc.work_button] + mcall 4, 150 shl 16 + 157, [sc.work_button_text], str_ip_cfg, str_ip_cfg.len + + jmp end_of_draw + + .no_ip: + + cmp [mode], 103 + jne .no_arp + + mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx + add ebx, 18 + mov edx, str_packets_rx + mcall + add ebx, 18 + mov edx, str_arp + mcall + add ebx, 18 + mov edx, str_conflicts + mcall + + mcall 4, 8 shl 16 + 130, 0x80000000, str_ARP_legend + + jmp end_of_draw + + .no_arp: + + mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx + + add ebx, 18 + mov edx, str_packets_rx + mcall + + cmp [mode], 106 + jne end_of_draw + + add ebx, 18 + mov edx, str_missed + mcall + + add ebx, 18 + mov edx, str_dropped + mcall + + add ebx, 18 + mov edx, str_queued + mcall + +end_of_draw: + + mcall 12, 2 + +draw_stats: + + cmp [mode], 101 + jne not_101 + + mov ebx, API_ETH + mov bh, [device] + mov bl, 6 + @@: + push ebx + mcall 74 + pop ebx + push eax + inc bl + cmp bl, 16 + jbe @r + +; rx ovr + mov ebx, 0x000a0000 + pop ecx + mov edx, 320 shl 16 + 35 + 5*18 + mov esi, 0x40000000 + mcall 47 + +; rx drop + sub edx, 18 + pop ecx + mcall + +; rx err + sub edx, 18 + pop ecx + mcall + +; tx ovr + sub edx, 18 + pop ecx + mcall + +; tx drop + sub edx, 18 + pop ecx + mcall + +; tx err + sub edx, 18 + pop ecx + mcall + +; Calculate speed + pop ecx + + push [time] + pop [delta_time] + mcall 26, 9 ; TODO: use 26, 10 instead + mov [time], eax + sub eax, [delta_time] + jnz @f + inc eax ; Zero time units? Lets make it at least one. + @@: + lea eax, [eax + 4*eax] + shl eax, 1 + mov [delta_time], eax + + mov eax, [esp+4] ; bytes received + push eax + sub eax, [prev_rx] + pop [prev_rx] + xor edx, edx + div [delta_time] + push eax + + mov eax, [esp+4] ; bytes sent + push eax + sub eax, [prev_tx] + pop [prev_tx] + xor edx, edx + div [delta_time] + push eax + + test cl, cl + jnz @f + mov edx, str_down + jmp .print_link + @@: + cmp cl, 100b + jnz @f + mov edx, str_10m + jmp .print_link + @@: + cmp cl, 110b + jnz @f + mov edx, str_10mfd + jmp .print_link + @@: + cmp cl, 1000b + jnz @f + mov edx, str_100m + jmp .print_link + @@: + cmp cl, 1010b + jnz @f + mov edx, str_100mfd + jmp .print_link + @@: + cmp cl, 1100b + jnz @f + mov edx, str_1g + jmp .print_link + @@: + cmp cl, 1110b + jnz @f + mov edx, str_1gfd + jmp .print_link + @@: + mov edx, str_unknown + + .print_link: + mov ebx, 116 shl 16 + 35 + 6*18 + mov ecx, 0xc0000000 + mov edi, 0x00f3f3f3 + mcall 4 + +; speed rx + mov ebx, 0x000a0000 + pop ecx + mov edx, 116 shl 16 + 35 + 5*18 + mov esi, 0x40000000 + mcall 47 + +; speed tx + sub edx, 18 + pop ecx + mcall + +; bytes received + sub edx, 18 + pop ecx + mcall + +; bytes sent + sub edx, 18 + pop ecx + mcall + +; packets received + sub edx, 18 + pop ecx + mcall + +; packets sent + sub edx, 18 + pop ecx + mcall + + jmp mainloop + + +not_101: + + cmp [mode], 102 + jne not_102 + + mov ebx, API_IPv4 + mov bh, [device] + push ebx + mcall 76 + pop ebx + push eax + + inc bl + push ebx + mcall 76 + pop ebx + push eax + + + mov ebx, 0x000a0000 + pop ecx + mov edx, 116 shl 16 + 35 + 18 + mov esi, 0x40000000 + mov edi, 0x00F3F3F3 + mcall 47 + + sub edx, 18 + pop ecx + mcall + + jmp mainloop + + +not_102: + + cmp [mode], 103 + jne not_103 + + mov ebx, API_ARP + mov bh, [device] + push ebx + mcall 76 ; tx + pop ebx + push eax + + inc bl + push ebx + mcall 76 ; rx + pop ebx + push eax + + inc bl + push ebx + mcall 76 ; entries + pop ebx + push eax + + mov bl, 7 + push ebx + mcall 76 + pop ebx + push eax + + mov ebx, 0x000a0000 + pop ecx + mov edx, 116 shl 16 + 35 + 3*18 + mov esi, 0x40000000 + mov edi, 0x00F3F3F3 + mcall 47 + + sub edx, 18 + pop ecx + mcall + + sub edx, 18 + pop ecx + mcall + + sub edx, 18 + pop ecx + mcall + +; mov edx, 50 shl 16 + 150 + mov [last], 0 + + .arp_loop: + mov ebx, API_ARP + 3 ; read ARP entry + mov bh, [device] + mcall 76, ,[last], , , arp_buf + cmp eax, -1 + je mainloop + + mov ebx, [last] + imul ebx, 16 + add ebx, 8 shl 16 + 140 + mcall 4, , 0x80000000, str_ARP_entry + mov edx, ebx + + mov eax, 47 + mov ebx, 0x00030000 + mov esi, 0x40000000 + mov edi, 0x00F3F3F3 + xor ecx, ecx + + mov cl, byte[arp_buf.IP+0] + mcall + + mov cl, byte[arp_buf.IP+1] + add edx, 24 shl 16 + mcall + + mov cl, byte[arp_buf.IP+2] + add edx, 24 shl 16 + mcall + + mov cl, byte[arp_buf.IP+3] + add edx, 24 shl 16 + mcall + + + mov ebx, 0x00020100 + mov cl, byte[arp_buf.MAC+0] + add edx, 36 shl 16 + mcall + + mov cl, byte[arp_buf.MAC+1] + add edx, 18 shl 16 + mcall + + mov cl, byte[arp_buf.MAC+2] + add edx, 18 shl 16 + mcall + + mov cl, byte[arp_buf.MAC+3] + add edx, 18 shl 16 + mcall + + mov cl, byte[arp_buf.MAC+4] + add edx, 18 shl 16 + mcall + + mov cl, byte[arp_buf.MAC+5] + add edx, 18 shl 16 + mcall + + mov ebx, 0x00040000 + mov cx, [arp_buf.status] + add edx, 30 shl 16 + mcall + + mov cx, [arp_buf.TTL] + add edx, 60 shl 16 + mcall + + add dx, 18 + rol edx, 16 + mov dx, 8 + rol edx, 16 + inc [last] + + jmp .arp_loop + +not_103: + + cmp [mode], 104 + jne not_104 + + mov ebx, API_ICMP + mov bh, [device] + push ebx + mcall 76 + pop ebx + push eax + + inc bl + push ebx + mcall 76 + pop ebx + push eax + + mov ebx, 0x000a0000 + pop ecx + mov edx, 116 shl 16 + 35 + 18 + mov esi, 0x40000000 + mov edi, 0x00F3F3F3 + mcall 47 + + sub edx, 18 + pop ecx + mcall + + jmp mainloop + +not_104: + + cmp [mode], 105 + jne not_105 + + mov ebx, API_UDP + mov bh, [device] + push ebx + mcall 76 + pop ebx + push eax + + inc bl + push ebx + mcall 76 + pop ebx + push eax + + mov ebx, 0x000a0000 + pop ecx + mov edx, 116 shl 16 + 35 + 18 + mov esi, 0x40000000 + mov edi, 0x00F3F3F3 + mcall 47 + + sub edx, 18 + pop ecx + mcall + + jmp mainloop + +not_105: + + cmp [mode], 106 + jne not_106 + + mov ebx, API_TCP + mov bh, [device] + push ebx + mcall 76 + pop ebx + push eax + + inc bl + push ebx + mcall 76 + pop ebx + push eax + + inc bl + push ebx + mcall 76 + pop ebx + push eax + + inc bl + push ebx + mcall 76 + pop ebx + push eax + + inc bl + push ebx + mcall 76 + pop ebx + push eax + + mov ebx, 0x000a0000 + pop ecx + mov edx, 116 shl 16 + 35 + 18*4 + mov esi, 0x40000000 + mov edi, 0x00F3F3F3 + mcall 47 + + sub edx, 18 + pop ecx + mcall + + sub edx, 18 + pop ecx + mcall + + sub edx, 18 + pop ecx + mcall + + sub edx, 18 + pop ecx + mcall + + jmp mainloop + +not_106: + +mainloop: + + mcall 23, 50 ; wait for event with timeout (0,5 s) + + cmp eax, EV_REDRAW + je window_redraw + cmp eax, EV_BUTTON + je button + cmp eax, EV_KEY + je key + cmp eax, 11 + je redraw + + jmp draw_stats + +button: ; button + mcall 17 ; get id + cmp ah, 1 + je exit + cmp ah, 2 + je .ipcfg + cmp ah, 0 + je .interface + shr ax, 8 + mov [mode], ax + jmp redraw + + .ipcfg: + mcall 51, 1, ipcfg, I_END+0x1000 + jmp mainloop + + .interface: + shr eax, 16 + mov [device], al + jmp redraw + +key: + mcall 2 + cmp ah, 9 + je .tab + cmp ah, 183 + je .pgdown + cmp ah, 184 + je .pgup + jmp mainloop + + .tab: + inc [mode] + cmp [mode], 106 + jbe redraw + mov [mode], 101 + jmp redraw + + .pgdown: + inc [device] + mov al, [device] + cmp al, [last_device] + jbe redraw + mov [device], 0 + jmp redraw + + .pgup: + dec [device] + cmp [device], 0 + jge redraw + mov al, [last_device] + mov [device], al + jmp redraw + +exit: + mcall -1 + + + +draw_mac: + + mov eax, 47 + mov ebx, 0x00020100 + mov esi, 0x40000000 + mov edi, 0x00F3F3F3 + + mov cl, [esp+4] + mcall + + mov cl, [esp+4+1] + add edx, 18 shl 16 + mcall + + mov cl, [esp+4+2] + add edx, 18 shl 16 + mcall + + mov cl, [esp+4+3] + add edx, 18 shl 16 + mcall + + mov cl, [esp+4+4] + add edx, 18 shl 16 + mcall + + mov cl, [esp+4+5] + add edx, 18 shl 16 + mcall + + sub edx, 5*18 shl 16 + + ret 6 + + +draw_ip: + + mov eax, 47 + mov ebx, 0x00030000 + mov esi, 0x40000000 + mov edi, 0x00F3F3F3 + + xor ecx, ecx + + mov cl, [esp+4] + mcall + + mov cl, [esp+4+1] + add edx, 24 shl 16 + mcall + + mov cl, [esp+4+2] + add edx, 24 shl 16 + mcall + + mov cl, [esp+4+3] + add edx, 24 shl 16 + mcall + + sub edx, 3*24 shl 16 + ret 4 + + +draw_interfaces: + + mov [.btnpos], 5 shl 16 + 20 + mov [.txtpos], 405 shl 16 + 12 + + mcall 74, -1 ; get number of active network devices + mov ecx, eax + dec al + mov [last_device], al + cmp [device], al + jbe @f + mov [device], 0 + @@: + + xor ebx, ebx ; get device type + .loop: + mcall 74 + cmp eax, 1 ; loopback or ethernet? + jbe .hit + inc bh + jb .loop ; tried all 256? + ret + + + .hit: + push ecx ebx + movzx edx, bh + shl edx, 8 + mov esi, 0x00BBBbbb + cmp bh, [device] + cmove esi, 0x0081BBFF + mcall 8, 400 shl 16 + 185, [.btnpos] + mov ebx, [esp] + inc bl + mov ecx, namebuf + mov edx, namebuf + mcall 74 ; get device name + cmp eax, -1 + jne @f + mov edx, str_unknown + @@: + mcall 4, [.txtpos], 0x80000000 ; print the name + pop ebx ecx + + inc bh + + add [.btnpos], 25 shl 16 + add [.txtpos], 25 + + dec ecx + jnz .loop + + ret + + .btnpos dd ? + .txtpos dd ? + + +; DATA AREA + +align 16 +@IMPORT: + +library box_lib , 'box_lib.obj', \ + libini , 'libini.obj' + +import libini, \ + ini.get_str , 'ini_get_str' ,\ + ini.set_str , 'ini_set_str' ,\ + ini.enum_sections, 'ini_enum_sections' + +import box_lib ,\ + edit_box_draw , 'edit_box' ,\ + edit_box_key , 'edit_box_key' ,\ + edit_box_mouse , 'edit_box_mouse' ,\ + edit_set_text , 'edit_box_set_text' ,\ + version_ed , 'version_ed' ,\ + init_checkbox , 'init_checkbox2' ,\ + check_box_draw , 'check_box_draw2' ,\ + check_box_mouse , 'check_box_mouse2' ,\ + version_ch , 'version_ch2' ,\ + option_box_draw , 'option_box_draw' ,\ + option_box_mouse, 'option_box_mouse' ,\ + version_op , 'version_op' + +name db 'Network status', 0 +mode dw 101 ; currently selected protocol +device db 1 ; currently selected device +last_device db ? ; last device available +device_type dd ? +last dd ? +modes db 'Physical IPv4 ARP ICMP UDP TCP', 0 + +str_packets_tx db 'Packets sent:', 0 +str_packets_rx db 'Packets received:', 0 +str_bytes_tx db 'Bytes sent:', 0 +str_bytes_rx db 'Bytes received:', 0 +str_MAC db 'MAC address: - - - - -', 0 +str_ip db 'IP address: . . .', 0 +str_dns db 'DNS address: . . .', 0 +str_subnet db 'Subnet mask: . . .', 0 +str_gateway db 'Standard gateway: . . .', 0 +str_arp db 'ARP entrys:', 0 +str_conflicts db 'ARP conflicts:', 0 +str_missed db 'Packets missed:', 0 +str_dropped db 'Packets dropped:', 0 +str_err db 'Packet errors:', 0 +str_queued db 'Packets queued:', 0 +str_link db 'Link state:', 0 +str_speed_tx db 'Upload (kb/s):', 0 +str_speed_rx db 'Download (kb/s):', 0 +str_ip_cfg db 'Configure' +.len = $ - str_ip_cfg + +str_down db 'disconnected ', 0 +str_unknown db 'unknown ', 0 +str_10m db '10 Mbit Half duplex ', 0 +str_10mfd db '10 Mbit Full duplex ', 0 +str_100m db '100 Mbit Half duplex', 0 +str_100mfd db '100 Mbit Full duplex', 0 +str_1g db '1 Gbit Half duplex ', 0 +str_1gfd db '1 Gbit Full duplex ', 0 + +str_ARP_legend db 'IP-address MAC-address Status TTL', 0 +str_ARP_entry db ' . . . - - - - -', 0 + +prev_rx dd ? +prev_tx dd ? +time dd ? +delta_time dd ? + +namebuf rb 64 +arp_buf ARP_entry + +sc system_colors + +I_END: diff --git a/programs/network/tftpc/tftpc.asm b/programs/network/tftpc/tftpc.asm index 71cff2522..236f18cc4 100644 --- a/programs/network/tftpc/tftpc.asm +++ b/programs/network/tftpc/tftpc.asm @@ -1,669 +1,669 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2010-2017. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;; tftpc.asm - TFTP client for KolibriOS ;; -;; ;; -;; Written by hidnplayr@kolibrios.org ;; -;; ;; -;; GNU GENERAL PUBLIC LICENSE ;; -;; Version 2, June 1991 ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -format binary as "" - -__DEBUG__ = 0 -__DEBUG_LEVEL__ = 1 - -use32 - org 0x0 - - db 'MENUET01' - dd 0x1 - dd START - dd I_END - dd IM_END+0x1000 - dd IM_END+0x1000 - dd 0, 0 - -include '../../proc32.inc' -include '../../macros.inc' -include '../../develop/libraries/libs-dev/libio/libio.inc' -include '../../dll.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' - -include '../../network.inc' -include '../../debug-fdo.inc' - -TIMEOUT = 100 -buffer_len = 4096 - -opcode_rrq = 1 shl 8 -opcode_wrq = 2 shl 8 -opcode_data = 3 shl 8 -opcode_ack = 4 shl 8 -opcode_error = 5 shl 8 - -; read/write request packet -; -; 2 bytes string 1 byte string 1 byte -; ------------------------------------------------ -; | Opcode | Filename | 0 | Mode | 0 | -; ------------------------------------------------ - -; data packet -; -; 2 bytes 2 bytes n bytes -; ---------------------------------- -; | Opcode | Block # | Data | -; ---------------------------------- - -; acknowledgement packet -; -; 2 bytes 2 bytes -; --------------------- -; | Opcode | Block # | -; --------------------- - -; error packet -; -; 2 bytes 2 bytes string 1 byte -; ---------------------------------------- -; | Opcode | ErrorCode | ErrMsg | 0 | -; ---------------------------------------- - - -START: - - mcall 68, 11 - - stdcall dll.Load, @IMPORT - or eax, eax - jnz exit - -home: - mcall 40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_REDRAW + EVM_BUTTON + EVM_KEY + EVM_STACK - -redraw: - call draw_window - -mainloop: - mcall 10 - dec eax - jz redraw - dec eax - jz key - dec eax - jz button - - invoke edit_box_mouse, edit1 - invoke edit_box_mouse, edit2 - invoke edit_box_mouse, edit3 - invoke edit_box_mouse, edit4 - - invoke option_box_mouse, Option_boxs1 - invoke option_box_mouse, Option_boxs2 - - jmp mainloop - -button: - mcall 17 - - cmp ah, 0x10 ; connect button - je start_transfer - - test ah , ah - jz mainloop - -exit: - mcall -1 -key: - mcall 2 - - invoke edit_box_key, edit1 - invoke edit_box_key, edit2 - invoke edit_box_key, edit3 - invoke edit_box_key, edit4 - - jmp mainloop - - -draw_window: -; get system colors - mcall 48, 3, sc, 40 - - mcall 12, 1 - - mov edx, [sc.work] - or edx, 0x34000000 - xor esi, esi - mov edi, str_title - mcall 0, 50 shl 16 + 400, 30 shl 16 + 180 - - mov ebx, 35 shl 16 + 10 - mov ecx, 0x80000000 - or ecx, [sc.work_text] - mov edx, str_server - mcall 4 - mov ebx, 5 shl 16 + 30 - mov edx, str_source - mcall - mov ebx, 11 shl 16 + 50 - mov edx, str_destination - mcall - mov ebx, 47 shl 16 + 72 - mov edx, str_mode - mcall - mov ebx, 160 shl 16 + 72 - mov edx, str_method - mcall - mov ebx, 270 shl 16 + 72 - mov edx, str_blocksize - mcall - - invoke edit_box_draw, edit1 - invoke edit_box_draw, edit2 - invoke edit_box_draw, edit3 - invoke edit_box_draw, edit4 - - invoke option_box_draw, Option_boxs1 - invoke option_box_draw, Option_boxs2 - - mov esi, [sc.work_button] - mcall 8, 210 shl 16 + 170, 105 shl 16 + 16, 0x10 - - mcall 38, 10 shl 16 + 380, 130 shl 16 + 130, [sc.work_graph] - - cmp [errormsg], 0 - je .no_error - - mov ecx, 0x80000000 - or ecx, [sc.work_text] - mcall 4, 20 shl 16 + 137, , [errormsg] - mcall 12, 2 - jmp .draw_btn - - .no_error: - mov ecx, 0x80000000 - or ecx, [sc.work_text] - mcall 4, 350 shl 16 + 137, , str_kb_s - mcall 4, 50 shl 16 + 137, , str_complete - mcall 47, 1 shl 31 + 7 shl 16 + 1, kbps, 305 shl 16 + 137, [sc.work_text] - mcall 47, 1 shl 31 + 3 shl 16 + 1, done, 25 shl 16 + 137 - - .draw_btn: - cmp [socketnum], 0 - je .no_transfer - - mov ecx, 0x80000000 - or ecx, [sc.work_button_text] - mcall 4, 270 shl 16 + 110, , str_stop - - mcall 12, 2 - ret - - .no_transfer: - mov ecx, 0x80000000 - or ecx, [sc.work_button_text] - mcall 4, 260 shl 16 + 110, , str_transfer - - mcall 12, 2 - ret - - - -start_transfer: - -; resolve the hostname - mov [errormsg], str_err_resolve - - push esp ; reserve stack place - - push esp ; fourth parameter - push 0 ; third parameter - push 0 ; second parameter - push dword SRV ; first parameter - call [getaddrinfo] - - pop esi - - ; test for error - test eax, eax - jnz home - - mov eax, [esi + addrinfo.ai_addr] - mov eax, [eax + sockaddr_in.sin_addr] - mov [sockaddr.ip], eax - - ; free allocated memory - push esi - call [freeaddrinfo] - -; Open a socket & connect to server - mov [errormsg], str_err_socket - - mcall socket, AF_INET4, SOCK_DGRAM, 0 - cmp eax, -1 - je home - mov [socketnum], eax - - mcall connect, [socketnum], sockaddr, sockaddr_len - cmp eax, -1 - je home - -; Create the read/write request packet - mov word[buffer], opcode_rrq - cmp [option_group2], op3 - je @f - mov word[buffer], opcode_wrq - @@: - -; Copy in the remote filename (asciiz) - xor al, al - mov edi, remote_addr - mov ecx, 255 - repnz scasb - lea ecx, [edi - remote_addr - 1] - mov esi, remote_addr - mov edi, buffer+2 - rep movsb - stosb - -; Append the data type (asciiz) - cmp [option_group1], op1 - je .ascii - mov esi, octet - movsd - movsb - jmp .send_request - - .ascii: - mov esi, netascii - movsd - movsd - -; Send the request to the server - .send_request: - xor al, al - stosb - lea esi, [edi - buffer] - xor edi, edi - mcall send, [socketnum], buffer - cmp eax, -1 - je home - -; Jump to send/receive code - cmp word[buffer], opcode_wrq - je tftp_send - - -tftp_receive: - - mcall 40, EVM_REDRAW + EVM_BUTTON + EVM_STACK - mov [last_ack], 0 - mov [errormsg], 0 - - call draw_window - -; Open/create local file - mov [file_struct.subfn], 2 - mov [file_struct.offset], 0 - mov [file_struct.size], 0 - mcall 70, file_struct - -; Truncate it to 0 bytes - mov [file_struct.subfn], 4 - mcall 70, file_struct - -; Set parameters for writing to file - mov [file_struct.subfn], 3 - mov [file_struct.data], buffer + 4 - - .loop: - mcall 23, TIMEOUT - dec eax - jz .red - dec eax - dec eax - jz .button - - mcall recv, [socketnum], buffer, buffer_len, MSG_DONTWAIT ; receive data - cmp eax, -1 - je .loop - - DEBUGF 1, "Got %u bytes\n", eax - cmp word[buffer], opcode_error - je tftp_error - cmp word[buffer], opcode_data - jne .error - -; Verify ACK number - mov bx, word[buffer + 2] - rol bx, 8 - cmp [last_ack], 0 - je @f - cmp [last_ack], bx - jne .packet_got_lost - inc bx - @@: - mov [last_ack], bx - -; Write to the file - lea ecx, [eax - 4] - mov [file_struct.size], ecx - mcall 70, file_struct - add [file_struct.offset], ecx - -; Send ACK - mov word[buffer], opcode_ack - mcall send, [socketnum], buffer, 4, 0 - jmp .loop - - .packet_got_lost: - ;TODO - jmp .loop - - .red: - call draw_window - jmp .loop - - .button: - mcall 17 - cmp ah, 1 - jne .abort - - mcall close, [socketnum] - mcall -1 - - .abort: - mcall close, [socketnum] - xor eax, eax - mov [socketnum], eax - mov [errormsg], str_abort - jmp home - - .error: - mcall close, [socketnum] - xor eax, eax - mov [socketnum], eax - mov [errormsg], str_err_unexp - jmp home - - .done: - mcall close, [socketnum] - xor eax, eax - mov [socketnum], eax - mov [errormsg], str_success - jmp home - - - -tftp_send: - - mcall 40, EVM_REDRAW + EVM_BUTTON + EVM_STACK - mov [last_ack], 0 - mov [errormsg], 0 - - call draw_window - - mov [file_struct.subfn], 0 - mov [file_struct.offset], 0 - mov [file_struct.size], buffer_len - mov [file_struct.data], buffer + 4 - - .next: - mov edi, buffer - mov ax, opcode_data - stosw - mov ax, [last_ack] - stosw - - mcall 70, file_struct - test eax, eax -; jnz .done - mov [size], ebx - - .resend: - mov ebx, [size] - lea esi, [ebx + 4] - xor edi, edi - mcall send, [socketnum], buffer - - .loop: - mcall 23, TIMEOUT - dec eax - jz .red - dec eax - dec eax - jz .button - - mcall recv, [socketnum], buffer, buffer_len, MSG_DONTWAIT - cmp eax, -1 - je .loop - - cmp word[buffer], opcode_error - je tftp_error - cmp word[buffer], opcode_ack - jne .error - - mov ax, [last_ack] - cmp word[buffer+2], ax - jne .resend - - mov eax, [size] - cmp eax, buffer_len - jb .done - add [file_struct.offset], eax - - inc [last_ack] - jmp .next - - .red: - call draw_window - jmp .loop - - .button: - mcall 17 - cmp ah, 1 - jne .abort - - mcall close, [socketnum] - mcall -1 - - .abort: - mcall close, [socketnum] - xor eax, eax - mov [socketnum], eax - mov [errormsg], str_abort - jmp home - - .error: - mcall close, [socketnum] - xor eax, eax - mov [socketnum], eax - mov [errormsg], str_err_unexp - jmp home - - .done: - mcall close, [socketnum] - xor eax, eax - mov [socketnum], eax - mov [errormsg], str_success - jmp home - - - -tftp_error: - mcall close, [socketnum] - xor eax, eax - mov [socketnum], eax - - mov ax, word[buffer+2] - xchg al, ah - - test ax, ax - jz .0 - dec ax - jz .1 - dec ax - jz .2 - dec ax - jz .3 - dec ax - jz .4 - dec ax - jz .5 - dec ax - jz .6 - dec ax - jz .7 - - .0: - mov [errormsg], str_error.0 - jmp home - .1: - mov [errormsg], str_error.1 - jmp redraw - .2: - mov [errormsg], str_error.2 - jmp home - .3: - mov [errormsg], str_error.3 - jmp home - .4: - mov [errormsg], str_error.4 - jmp home - .5: - mov [errormsg], str_error.5 - jmp home - .6: - mov [errormsg], str_error.6 - jmp home - .7: - mov [errormsg], str_error.7 - jmp home - -;------------------------- -; DATA - -socketnum dd 0 -kbps dd 0 -done dd 0 -errormsg dd str_welcome - -sockaddr: - dw AF_INET4 - dw 0x4500 ; 69 - .ip dd ? -sockaddr_len = $ - sockaddr - -file_struct: - .subfn dd ? - .offset dd ? - dd 0 - .size dd ? - .data dd ? - db 0 - .filename dd local_addr - -align 16 -@IMPORT: - -library box_lib , 'box_lib.obj' ,\ - network , 'network.obj' - -import box_lib ,\ - edit_box_draw , 'edit_box' ,\ - edit_box_key , 'edit_box_key' ,\ - edit_box_mouse , 'edit_box_mouse' ,\ - version_ed , 'version_ed' ,\ - init_checkbox , 'init_checkbox2' ,\ - check_box_draw , 'check_box_draw2' ,\ - check_box_mouse , 'check_box_mouse2' ,\ - version_ch , 'version_ch2' ,\ - option_box_draw , 'option_box_draw' ,\ - option_box_mouse, 'option_box_mouse' ,\ - version_op , 'version_op' - -import network ,\ - inet_ntoa , 'inet_ntoa' ,\ - getaddrinfo , 'getaddrinfo' ,\ - freeaddrinfo , 'freeaddrinfo' - - -edit1 edit_box 300, 80, 5, 0xffffff, 0x6f9480, 0, 0, 0, 255, SRV, mouse_dd, ed_focus, 13, 13 -edit2 edit_box 300, 80, 25, 0xffffff, 0x6f9480, 0, 0, 0, 255, remote_addr, mouse_dd, 0, 4, 4 -edit3 edit_box 300, 80, 45, 0xffffff, 0x6f9480, 0, 0, 0, 255, local_addr, mouse_dd, 0, 12, 12 -edit4 edit_box 40, 340, 68, 0xffffff, 0x6f9480, 0, 0, 0, 5, BLK, mouse_dd, ed_figure_only, 3, 3 - -op1 option_box option_group1, 80, 68, 6, 12, 0xffffff, 0, 0, netascii, octet-netascii -op2 option_box option_group1, 80, 85, 6, 12, 0xFFFFFF, 0, 0, octet, get-octet - -op3 option_box option_group2, 210, 68, 6, 12, 0xffffff, 0, 0, get, put-get -op4 option_box option_group2, 210, 85, 6, 12, 0xFFFFFF, 0, 0, put, BLK-put - -option_group1 dd op1 -option_group2 dd op3 -Option_boxs1 dd op1, op2, 0 -Option_boxs2 dd op3, op4, 0 - -str_title db 'TFTP client', 0 -str_server db 'Server:', 0 -str_source db 'Remote file:', 0 -str_destination db 'Local file:', 0 -str_mode db 'Mode:', 0 -str_method db 'Method:', 0 -str_blocksize db 'Blocksize:', 0 -str_kb_s db 'kB/s', 0 -str_complete db '% complete', 0 -str_transfer db 'Transfer', 0 -str_stop db 'Stop', 0 - -str_error: -.0 db 'Error.', 0 ; not further defined error -.1 db 'File not found.', 0 -.2 db 'Access violation.', 0 -.3 db 'Disk full or allocation exceeded.', 0 -.4 db 'Illegal TFTP operation.', 0 -.5 db 'Unknown transfer ID.', 0 -.6 db 'File already exists.', 0 -.7 db 'No such user.', 0 - -str_welcome db 'Welcome.', 0 -str_err_resolve db 'Unable to resolve server address.', 0 -str_err_socket db 'Socket error.', 0 -str_err_unexp db 'Unexpected command from server.', 0 -str_success db 'Operation completed successfully.', 0 -str_abort db 'Operation aborted by user.', 0 - -netascii db 'NetASCII' -octet db 'Octet' -get db 'GET' -put db 'PUT' - -BLK db "512", 0, 0, 0 - -SRV db "192.168.1.115", 0 - rb (SRV + 256 - $) - -remote_addr db "file", 0 - rb (remote_addr + 256 - $) - -local_addr db "/tmp0/1/file", 0 - rb (local_addr + 256 - $) - -include_debug_strings - -I_END: - -last_ack dw ? -size dd ? -mouse_dd dd ? - -sc system_colors - -buffer rb buffer_len - -IM_END: \ No newline at end of file +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2010-2017. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; tftpc.asm - TFTP client for KolibriOS ;; +;; ;; +;; Written by hidnplayr@kolibrios.org ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +format binary as "" + +__DEBUG__ = 0 +__DEBUG_LEVEL__ = 1 + +use32 + org 0x0 + + db 'MENUET01' + dd 0x1 + dd START + dd I_END + dd IM_END+0x1000 + dd IM_END+0x1000 + dd 0, 0 + +include '../../proc32.inc' +include '../../macros.inc' +include '../../develop/libraries/libs-dev/libio/libio.inc' +include '../../dll.inc' +include '../../develop/libraries/box_lib/box_lib.mac' + +include '../../network.inc' +include '../../debug-fdo.inc' + +TIMEOUT = 100 +buffer_len = 4096 + +opcode_rrq = 1 shl 8 +opcode_wrq = 2 shl 8 +opcode_data = 3 shl 8 +opcode_ack = 4 shl 8 +opcode_error = 5 shl 8 + +; read/write request packet +; +; 2 bytes string 1 byte string 1 byte +; ------------------------------------------------ +; | Opcode | Filename | 0 | Mode | 0 | +; ------------------------------------------------ + +; data packet +; +; 2 bytes 2 bytes n bytes +; ---------------------------------- +; | Opcode | Block # | Data | +; ---------------------------------- + +; acknowledgement packet +; +; 2 bytes 2 bytes +; --------------------- +; | Opcode | Block # | +; --------------------- + +; error packet +; +; 2 bytes 2 bytes string 1 byte +; ---------------------------------------- +; | Opcode | ErrorCode | ErrMsg | 0 | +; ---------------------------------------- + + +START: + + mcall 68, 11 + + stdcall dll.Load, @IMPORT + or eax, eax + jnz exit + +home: + mcall 40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_REDRAW + EVM_BUTTON + EVM_KEY + EVM_STACK + +redraw: + call draw_window + +mainloop: + mcall 10 + dec eax + jz redraw + dec eax + jz key + dec eax + jz button + + invoke edit_box_mouse, edit1 + invoke edit_box_mouse, edit2 + invoke edit_box_mouse, edit3 + invoke edit_box_mouse, edit4 + + invoke option_box_mouse, Option_boxs1 + invoke option_box_mouse, Option_boxs2 + + jmp mainloop + +button: + mcall 17 + + cmp ah, 0x10 ; connect button + je start_transfer + + test ah , ah + jz mainloop + +exit: + mcall -1 +key: + mcall 2 + + invoke edit_box_key, edit1 + invoke edit_box_key, edit2 + invoke edit_box_key, edit3 + invoke edit_box_key, edit4 + + jmp mainloop + + +draw_window: +; get system colors + mcall 48, 3, sc, 40 + + mcall 12, 1 + + mov edx, [sc.work] + or edx, 0x34000000 + xor esi, esi + mov edi, str_title + mcall 0, 50 shl 16 + 400, 30 shl 16 + 180 + + mov ebx, 35 shl 16 + 10 + mov ecx, 0x80000000 + or ecx, [sc.work_text] + mov edx, str_server + mcall 4 + mov ebx, 5 shl 16 + 30 + mov edx, str_source + mcall + mov ebx, 11 shl 16 + 50 + mov edx, str_destination + mcall + mov ebx, 47 shl 16 + 72 + mov edx, str_mode + mcall + mov ebx, 160 shl 16 + 72 + mov edx, str_method + mcall + mov ebx, 270 shl 16 + 72 + mov edx, str_blocksize + mcall + + invoke edit_box_draw, edit1 + invoke edit_box_draw, edit2 + invoke edit_box_draw, edit3 + invoke edit_box_draw, edit4 + + invoke option_box_draw, Option_boxs1 + invoke option_box_draw, Option_boxs2 + + mov esi, [sc.work_button] + mcall 8, 210 shl 16 + 170, 105 shl 16 + 16, 0x10 + + mcall 38, 10 shl 16 + 380, 130 shl 16 + 130, [sc.work_graph] + + cmp [errormsg], 0 + je .no_error + + mov ecx, 0x80000000 + or ecx, [sc.work_text] + mcall 4, 20 shl 16 + 137, , [errormsg] + mcall 12, 2 + jmp .draw_btn + + .no_error: + mov ecx, 0x80000000 + or ecx, [sc.work_text] + mcall 4, 350 shl 16 + 137, , str_kb_s + mcall 4, 50 shl 16 + 137, , str_complete + mcall 47, 1 shl 31 + 7 shl 16 + 1, kbps, 305 shl 16 + 137, [sc.work_text] + mcall 47, 1 shl 31 + 3 shl 16 + 1, done, 25 shl 16 + 137 + + .draw_btn: + cmp [socketnum], 0 + je .no_transfer + + mov ecx, 0x80000000 + or ecx, [sc.work_button_text] + mcall 4, 270 shl 16 + 110, , str_stop + + mcall 12, 2 + ret + + .no_transfer: + mov ecx, 0x80000000 + or ecx, [sc.work_button_text] + mcall 4, 260 shl 16 + 110, , str_transfer + + mcall 12, 2 + ret + + + +start_transfer: + +; resolve the hostname + mov [errormsg], str_err_resolve + + push esp ; reserve stack place + + push esp ; fourth parameter + push 0 ; third parameter + push 0 ; second parameter + push dword SRV ; first parameter + call [getaddrinfo] + + pop esi + + ; test for error + test eax, eax + jnz home + + mov eax, [esi + addrinfo.ai_addr] + mov eax, [eax + sockaddr_in.sin_addr] + mov [sockaddr.ip], eax + + ; free allocated memory + push esi + call [freeaddrinfo] + +; Open a socket & connect to server + mov [errormsg], str_err_socket + + mcall socket, AF_INET4, SOCK_DGRAM, 0 + cmp eax, -1 + je home + mov [socketnum], eax + + mcall connect, [socketnum], sockaddr, sockaddr_len + cmp eax, -1 + je home + +; Create the read/write request packet + mov word[buffer], opcode_rrq + cmp [option_group2], op3 + je @f + mov word[buffer], opcode_wrq + @@: + +; Copy in the remote filename (asciiz) + xor al, al + mov edi, remote_addr + mov ecx, 255 + repnz scasb + lea ecx, [edi - remote_addr - 1] + mov esi, remote_addr + mov edi, buffer+2 + rep movsb + stosb + +; Append the data type (asciiz) + cmp [option_group1], op1 + je .ascii + mov esi, octet + movsd + movsb + jmp .send_request + + .ascii: + mov esi, netascii + movsd + movsd + +; Send the request to the server + .send_request: + xor al, al + stosb + lea esi, [edi - buffer] + xor edi, edi + mcall send, [socketnum], buffer + cmp eax, -1 + je home + +; Jump to send/receive code + cmp word[buffer], opcode_wrq + je tftp_send + + +tftp_receive: + + mcall 40, EVM_REDRAW + EVM_BUTTON + EVM_STACK + mov [last_ack], 0 + mov [errormsg], 0 + + call draw_window + +; Open/create local file + mov [file_struct.subfn], 2 + mov [file_struct.offset], 0 + mov [file_struct.size], 0 + mcall 70, file_struct + +; Truncate it to 0 bytes + mov [file_struct.subfn], 4 + mcall 70, file_struct + +; Set parameters for writing to file + mov [file_struct.subfn], 3 + mov [file_struct.data], buffer + 4 + + .loop: + mcall 23, TIMEOUT + dec eax + jz .red + dec eax + dec eax + jz .button + + mcall recv, [socketnum], buffer, buffer_len, MSG_DONTWAIT ; receive data + cmp eax, -1 + je .loop + + DEBUGF 1, "Got %u bytes\n", eax + cmp word[buffer], opcode_error + je tftp_error + cmp word[buffer], opcode_data + jne .error + +; Verify ACK number + mov bx, word[buffer + 2] + rol bx, 8 + cmp [last_ack], 0 + je @f + cmp [last_ack], bx + jne .packet_got_lost + inc bx + @@: + mov [last_ack], bx + +; Write to the file + lea ecx, [eax - 4] + mov [file_struct.size], ecx + mcall 70, file_struct + add [file_struct.offset], ecx + +; Send ACK + mov word[buffer], opcode_ack + mcall send, [socketnum], buffer, 4, 0 + jmp .loop + + .packet_got_lost: + ;TODO + jmp .loop + + .red: + call draw_window + jmp .loop + + .button: + mcall 17 + cmp ah, 1 + jne .abort + + mcall close, [socketnum] + mcall -1 + + .abort: + mcall close, [socketnum] + xor eax, eax + mov [socketnum], eax + mov [errormsg], str_abort + jmp home + + .error: + mcall close, [socketnum] + xor eax, eax + mov [socketnum], eax + mov [errormsg], str_err_unexp + jmp home + + .done: + mcall close, [socketnum] + xor eax, eax + mov [socketnum], eax + mov [errormsg], str_success + jmp home + + + +tftp_send: + + mcall 40, EVM_REDRAW + EVM_BUTTON + EVM_STACK + mov [last_ack], 0 + mov [errormsg], 0 + + call draw_window + + mov [file_struct.subfn], 0 + mov [file_struct.offset], 0 + mov [file_struct.size], buffer_len + mov [file_struct.data], buffer + 4 + + .next: + mov edi, buffer + mov ax, opcode_data + stosw + mov ax, [last_ack] + stosw + + mcall 70, file_struct + test eax, eax +; jnz .done + mov [size], ebx + + .resend: + mov ebx, [size] + lea esi, [ebx + 4] + xor edi, edi + mcall send, [socketnum], buffer + + .loop: + mcall 23, TIMEOUT + dec eax + jz .red + dec eax + dec eax + jz .button + + mcall recv, [socketnum], buffer, buffer_len, MSG_DONTWAIT + cmp eax, -1 + je .loop + + cmp word[buffer], opcode_error + je tftp_error + cmp word[buffer], opcode_ack + jne .error + + mov ax, [last_ack] + cmp word[buffer+2], ax + jne .resend + + mov eax, [size] + cmp eax, buffer_len + jb .done + add [file_struct.offset], eax + + inc [last_ack] + jmp .next + + .red: + call draw_window + jmp .loop + + .button: + mcall 17 + cmp ah, 1 + jne .abort + + mcall close, [socketnum] + mcall -1 + + .abort: + mcall close, [socketnum] + xor eax, eax + mov [socketnum], eax + mov [errormsg], str_abort + jmp home + + .error: + mcall close, [socketnum] + xor eax, eax + mov [socketnum], eax + mov [errormsg], str_err_unexp + jmp home + + .done: + mcall close, [socketnum] + xor eax, eax + mov [socketnum], eax + mov [errormsg], str_success + jmp home + + + +tftp_error: + mcall close, [socketnum] + xor eax, eax + mov [socketnum], eax + + mov ax, word[buffer+2] + xchg al, ah + + test ax, ax + jz .0 + dec ax + jz .1 + dec ax + jz .2 + dec ax + jz .3 + dec ax + jz .4 + dec ax + jz .5 + dec ax + jz .6 + dec ax + jz .7 + + .0: + mov [errormsg], str_error.0 + jmp home + .1: + mov [errormsg], str_error.1 + jmp redraw + .2: + mov [errormsg], str_error.2 + jmp home + .3: + mov [errormsg], str_error.3 + jmp home + .4: + mov [errormsg], str_error.4 + jmp home + .5: + mov [errormsg], str_error.5 + jmp home + .6: + mov [errormsg], str_error.6 + jmp home + .7: + mov [errormsg], str_error.7 + jmp home + +;------------------------- +; DATA + +socketnum dd 0 +kbps dd 0 +done dd 0 +errormsg dd str_welcome + +sockaddr: + dw AF_INET4 + dw 0x4500 ; 69 + .ip dd ? +sockaddr_len = $ - sockaddr + +file_struct: + .subfn dd ? + .offset dd ? + dd 0 + .size dd ? + .data dd ? + db 0 + .filename dd local_addr + +align 16 +@IMPORT: + +library box_lib , 'box_lib.obj' ,\ + network , 'network.obj' + +import box_lib ,\ + edit_box_draw , 'edit_box' ,\ + edit_box_key , 'edit_box_key' ,\ + edit_box_mouse , 'edit_box_mouse' ,\ + version_ed , 'version_ed' ,\ + init_checkbox , 'init_checkbox2' ,\ + check_box_draw , 'check_box_draw2' ,\ + check_box_mouse , 'check_box_mouse2' ,\ + version_ch , 'version_ch2' ,\ + option_box_draw , 'option_box_draw' ,\ + option_box_mouse, 'option_box_mouse' ,\ + version_op , 'version_op' + +import network ,\ + inet_ntoa , 'inet_ntoa' ,\ + getaddrinfo , 'getaddrinfo' ,\ + freeaddrinfo , 'freeaddrinfo' + + +edit1 edit_box 300, 80, 5, 0xffffff, 0x6f9480, 0, 0, 0, 255, SRV, mouse_dd, ed_focus, 13, 13 +edit2 edit_box 300, 80, 25, 0xffffff, 0x6f9480, 0, 0, 0, 255, remote_addr, mouse_dd, 0, 4, 4 +edit3 edit_box 300, 80, 45, 0xffffff, 0x6f9480, 0, 0, 0, 255, local_addr, mouse_dd, 0, 12, 12 +edit4 edit_box 40, 340, 68, 0xffffff, 0x6f9480, 0, 0, 0, 5, BLK, mouse_dd, ed_figure_only, 3, 3 + +op1 option_box option_group1, 80, 68, 6, 12, 0xffffff, 0, 0, netascii, octet-netascii +op2 option_box option_group1, 80, 85, 6, 12, 0xFFFFFF, 0, 0, octet, get-octet + +op3 option_box option_group2, 210, 68, 6, 12, 0xffffff, 0, 0, get, put-get +op4 option_box option_group2, 210, 85, 6, 12, 0xFFFFFF, 0, 0, put, BLK-put + +option_group1 dd op1 +option_group2 dd op3 +Option_boxs1 dd op1, op2, 0 +Option_boxs2 dd op3, op4, 0 + +str_title db 'TFTP client', 0 +str_server db 'Server:', 0 +str_source db 'Remote file:', 0 +str_destination db 'Local file:', 0 +str_mode db 'Mode:', 0 +str_method db 'Method:', 0 +str_blocksize db 'Blocksize:', 0 +str_kb_s db 'kB/s', 0 +str_complete db '% complete', 0 +str_transfer db 'Transfer', 0 +str_stop db 'Stop', 0 + +str_error: +.0 db 'Error.', 0 ; not further defined error +.1 db 'File not found.', 0 +.2 db 'Access violation.', 0 +.3 db 'Disk full or allocation exceeded.', 0 +.4 db 'Illegal TFTP operation.', 0 +.5 db 'Unknown transfer ID.', 0 +.6 db 'File already exists.', 0 +.7 db 'No such user.', 0 + +str_welcome db 'Welcome.', 0 +str_err_resolve db 'Unable to resolve server address.', 0 +str_err_socket db 'Socket error.', 0 +str_err_unexp db 'Unexpected command from server.', 0 +str_success db 'Operation completed successfully.', 0 +str_abort db 'Operation aborted by user.', 0 + +netascii db 'NetASCII' +octet db 'Octet' +get db 'GET' +put db 'PUT' + +BLK db "512", 0, 0, 0 + +SRV db "192.168.1.115", 0 + rb (SRV + 256 - $) + +remote_addr db "file", 0 + rb (remote_addr + 256 - $) + +local_addr db "/tmp0/1/file", 0 + rb (local_addr + 256 - $) + +include_debug_strings + +I_END: + +last_ack dw ? +size dd ? +mouse_dd dd ? + +sc system_colors + +buffer rb buffer_len + +IM_END: diff --git a/programs/network/vncc/vncc.asm b/programs/network/vncc/vncc.asm index 16c292a0f..808f6e2d1 100644 --- a/programs/network/vncc/vncc.asm +++ b/programs/network/vncc/vncc.asm @@ -1,618 +1,616 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2010-2015. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;; VNC client for KolibriOS ;; -;; ;; -;; Written by hidnplayr@kolibrios.org ;; -;; ;; -;; GNU GENERAL PUBLIC LICENSE ;; -;; Version 2, June 1991 ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -format binary as "" - -__DEBUG__ = 1 -__DEBUG_LEVEL__ = 2 - -BITS_PER_PIXEL = 32 ; 8, 16, 24 or 32 -SERVERADDRLEN = 4096 - -use32 - - org 0x0 - - db "MENUET01" ; 8 byte id - dd 0x01 ; header version - dd START ; start of code - dd I_END ; size of image - dd IM_END ; memory for app - dd IM_END ; esp - dd serveraddr, 0x0 ; I_Param , I_Path - -include "../../macros.inc" -include "../../debug-fdo.inc" -include "../../proc32.inc" -include "../../dll.inc" -include "../../struct.inc" -include "../../develop/libraries/box_lib/trunk/box_lib.mac" -include "../../network.inc" - -struct PixelFormat - bpp db ? - depth db ? - big_endian db ? - true_color db ? - red_max dw ? - green_max dw ? - blue_max dw ? - red_shift db ? - green_shift db ? - blue_shift db ? - padding rb 3 -ends - -struct ServerInit - width dw ? - height dw ? - pixelformat PixelFormat - name_length dd ? - name db ? -ends - -xpos = 4 -ypos = 21 - -TIMEOUT = 5 ; timeout in seconds - -RECEIVE_BUFFER_SIZE = 8*1024*1024 ; 8 Mib - -STATUS_CONNECT = 0 -STATUS_CONNECTING = 1 -STATUS_REQ_LOGIN = 2 -STATUS_LOGIN = 3 -STATUS_CONNECTED = 4 -STATUS_CLOSED = 5 - -STATUS_DISCONNECTED = 10 -STATUS_DNS_ERR = 11 -STATUS_SOCK_ERR = 12 -STATUS_CONNECT_ERR = 13 -STATUS_PROTO_ERR = 14 -STATUS_SECURITY_ERR = 15 -STATUS_LIB_ERR = 16 -STATUS_THREAD_ERR = 17 -STATUS_LOGIN_FAILED = 18 -STATUS_SECURITY_ERR_C = 19 - -WORK_FRAMEBUFFER = 1 shl 0 -WORK_CURSOR = 1 shl 1 -WORK_GUI = 1 shl 2 - -BYTES_PER_PIXEL = (BITS_PER_PIXEL + 7) / 8 - -if BITS_PER_PIXEL = 32 - BYTES_PER_CPIXEL= 3 -else - BYTES_PER_CPIXEL= BYTES_PER_PIXEL -end if - -include "keymap.inc" -include "gui.inc" -include "network.inc" -include "raw.inc" -include "copyrect.inc" -include "rre.inc" -include "trle.inc" -include "zrle.inc" -include "cursor.inc" -include "des.inc" - - -if BITS_PER_PIXEL = 8 -create_lut: - mov edi, lut_8bpp ; 332 format - xor eax, eax - call green - add eax, 0x240000 - call green - add eax, 0x250000 - call green - add eax, 0x240000 - call green - add eax, 0x250000 - call green - add eax, 0x240000 - call green - add eax, 0x250000 - call green - add eax, 0x240000 - call green - ret - -green: - mov ah, 0 - call blue - mov ah, 36 - call blue - add ah, 37 - call blue - add ah, 36 - call blue - add ah, 37 - call blue - add ah, 36 - call blue - add ah, 37 - call blue - add ah, 36 - call blue - ret - -blue: - mov al, 0 - stosd - mov al, 85 - stosd - mov al, 170 - stosd - mov al, 255 - stosd - ret -end if - - -START: - - mcall 68, 11 ; init heap - -; Load libraries - stdcall dll.Load, @IMPORT - test eax, eax - jz @f - mov [status], STATUS_LIB_ERR - jmp draw_gui.first_time - @@: - -; When using 8BPP, create lookup table -if BITS_PER_PIXEL = 8 - call create_lut -end if - -; Check if we got a server address through parameters - cmp byte[serveraddr], 0 - je @f - xor al, al - mov edi, serveraddr - mov ecx, SERVERADDRLEN - repne scasb - sub edi, serveraddr+1 - mov [URLbox.size], edi - mov [URLbox.pos], edi - call open_connection - @@: - -; Present the user with the GUI and wait for network connection - jmp draw_gui.first_time - -; Create main window -connected: - mcall 71, 1, name ; reset window caption (add server name) - - mov edx, dword[screen] - movzx esi, dx - shr edx, 16 - add edx, 2*xpos - add esi, ypos+xpos - mcall 67, 10, 10 ; resize the window - - mcall 40, EVM_CURSOR_FILTER + EVM_MOUSE_FILTER + EVM_MOUSE + EVM_KEY + EVM_REDRAW + EVM_BUTTON - - mcall 66, 1, 1 ; Switch keyboard to scancode mode - - call generate_keymap - -redraw: - mcall 12, 1 - - mov ebx, dword[screen] - movzx ecx, bx - shr ebx, 16 - mov edx, 0x74ffffff - mov edi, name - mcall 0 ; draw window - - mcall 12, 2 - -draw_framebuffer: - DEBUGF 1, "Drawing framebuffer\n" - mcall 7, framebuffer, dword[screen], 0 - and [work], not WORK_FRAMEBUFFER - -mainloop: - cmp [status], STATUS_CONNECTED - jne draw_gui - test [work], WORK_FRAMEBUFFER - jnz draw_framebuffer - test [work], WORK_CURSOR - jnz update_cursor - - mcall 23, 10 ; Check for event with 0,1s timeout - - dec eax - jz redraw - dec eax - jz key - dec eax - jz button - sub eax, 3 - jz mouse - jmp mainloop - -key: - mcall 66, 3 - mov ebx, eax ; get modifier keys - - mcall 2 ; get key scancode - cmp ah, 224 ; extended keycode? - je .extended - - xor al, al - test ah, 0x80 ; key up? - jnz @f - inc al - and ah, 0x7f - @@: - mov byte[KeyEvent.down], al - - movzx eax, ah - - test ebx, 100000b ; alt? - jz .no_alt - mov ax, [keymap_alt+eax*2] - jmp .key - .no_alt: - - test ebx, 11b ; shift? - jz .no_shift - mov ax, [keymap_shift+eax*2] - jmp .key - .no_shift: - - test ebx, 10000000b ; numlock ? - jz .no_numlock - cmp al, 71 - jb .no_numlock - cmp al, 83 - ja .no_numlock - mov ah, [keymap_numlock+eax-71] - xor al, al - jmp .key - - .extended: ; extended keys always use regular keymap - mcall 2 - shr eax, 8 - jz mainloop - - xor ah, ah - test al, 0x80 ; key up? - jnz @f - inc ah - @@: - mov byte[KeyEvent.down], ah - and ax, 0x007f - .no_numlock: - mov ax, [keymap+eax*2] - .key: - test ax, ax - jz mainloop - mov word[KeyEvent.key+2], ax - DEBUGF 1, "Sending key: 0x%x\n", ax - mcall send, [socketnum], KeyEvent, 8, 0 - jmp mainloop - - - -mouse: -; DEBUGF 1, "Sending pointer event\n" - - mcall 37, 1 ; get mouse pos - bswap eax - mov [PointerEvent.x], ax - shr eax, 16 - mov [PointerEvent.y], ax - - mcall 37, 2 ; get mouse buttons - test al, 00000010b ; test if right button was pressed (bit 1 in kolibri) - jz @f - add al, 00000010b ; in RFB protocol it is bit 2, so if we add bit 2 again, we"ll get bit 3 and bit 1 will remain the same - @@: - mov [PointerEvent.mask], al - - mcall send, [socketnum], PointerEvent, 6, 0 - jmp mainloop - -button: - mcall 17 ; get id - mov [status], STATUS_CLOSED - mcall close, [socketnum] - mcall -1 - - -update_cursor: - -; load cursor - mov dx, word[cursor.y] - shl edx, 16 - mov dx, 2 - mcall 37, 4, cursor.image - test eax, eax - jz .fail - -; set cursor - mov ecx, eax - mcall 37, 5 - -; delete previously set cursor - mov ecx, eax - mcall 37, 6 - -.fail: - and [work], not WORK_CURSOR - jmp mainloop - - -; DATA AREA - -include_debug_strings - -keymap_numlock: - db '7', '8', '9', '-' - db '4', '5', '6', '+' - db '1', '2', '3' - db '0', '.' - -HandShake db "RFB 003.003", 10 - -ClientInit db 0 ; not shared - -if BITS_PER_PIXEL = 32 - -SetPixelFormat db 0 ; setPixelformat - db 0, 0, 0 ; padding -.bpp db 32 ; bits per pixel -.depth db 24 ; depth -.big_endian db 0 ; big-endian flag -.true_color db 1 ; true-colour flag -.red_max db 0, 255 ; red-max -.green_max db 0, 255 ; green-max -.blue_max db 0, 255 ; blue-max -.red_shift db 16 ; red-shift -.green_shift db 8 ; green-shift -.blue_shift db 0 ; blue-shift - db 0, 0, 0 ; padding - -else if BITS_PER_PIXEL = 24 - -SetPixelFormat db 0 ; setPixelformat - db 0, 0, 0 ; padding -.bpp db 24 ; bits per pixel -.depth db 24 ; depth -.big_endian db 0 ; big-endian flag -.true_color db 1 ; true-colour flag -.red_max db 0, 255 ; red-max -.green_max db 0, 255 ; green-max -.blue_max db 0, 255 ; blue-max -.red_shift db 16 ; red-shift -.green_shift db 8 ; green-shift -.blue_shift db 0 ; blue-shift - db 0, 0, 0 ; padding - -else if BITS_PER_PIXEL = 16 - -SetPixelFormat db 0 ; setPixelformat - db 0, 0, 0 ; padding -.bpp db 16 ; bits per pixel -.depth db 16 ; depth -.big_endian db 0 ; big-endian flag -.true_color db 1 ; true-colour flag -.red_max db 0, 31 ; red-max -.green_max db 0, 63 ; green-max -.blue_max db 0, 31 ; blue-max -.red_shift db 11 ; red-shift -.green_shift db 5 ; green-shift -.blue_shift db 0 ; blue-shift - db 0, 0, 0 ; padding - -else if BITS_PER_PIXEL = 8 - -SetPixelFormat db 0 ; setPixelformat - db 0, 0, 0 ; padding -.bpp db 8 ; bits per pixel -.depth db 8 ; depth -.big_endian db 0 ; big-endian flag -.true_color db 1 ; true-colour flag -.red_max db 0, 7 ; red-max -.green_max db 0, 7 ; green-max -.blue_max db 0, 3 ; blue-max -.red_shift db 5 ; red-shift -.green_shift db 2 ; green-shift -.blue_shift db 0 ; blue-shift - db 0, 0, 0 ; padding - -end if - -SetEncodings db 2 ; setEncodings - db 0 ; padding - db 0, 5 ; number of encodings -; db 0, 0, 0, 16 ; ZRLE - db 0, 0, 0, 15 ; TRLE - db 0, 0, 0, 2 ; RRE - db 0, 0, 0, 1 ; Copyrect encoding - db 0xff, 0xff, 0xff, 0x11 ; Cursor pseudo encoding - db 0, 0, 0, 0 ; raw encoding - .length = $ - SetEncodings - -FramebufferUpdateRequest db 3 -.inc db 0 ; incremental -.x dw 0 -.y dw 0 -.width dw 0 -.height dw 0 - -KeyEvent db 4 ; keyevent -.down db 0 ; down-flag - dw 0 ; padding -.key dd 0 ; key - -PointerEvent db 5 ; pointerevent -.mask db 0 ; button-mask -.x dw 0 ; x-position -.y dw 0 ; y-position - - -sockaddr1: - dw AF_INET4 -.port dw 0x0c17 ; 5900 -.ip dd 0 - rb 10 - -beep db 0x85, 0x25, 0x85, 0x40, 0 - -status dd STATUS_CONNECT -work dd 0 -mouse_dd dd 0 -thread_id dd 0 - -deflate_buffer dd 0 -deflate_length dd ? -deflate_str dd ? - -URLbox edit_box 235, 70, 20, 0xffffff, 0x6f9480, 0, 0, 0x90000000, SERVERADDRLEN, serveraddr, mouse_dd, ed_focus, 0, 0 -USERbox edit_box 215, 90, 10, 0xffffff, 0x6f9480, 0, 0, 0x90000000, 127, username, mouse_dd, ed_focus, 0, 0 -PASSbox edit_box 215, 90, 35, 0xffffff, 0x6f9480, 0, 0, 0x10000000, 127, password, mouse_dd, ed_pass, 0, 0 - -serverstr db "server:" -userstr db "username:" -passstr db "password:" -connectstr db "Connect" -loginstr db "Log in" -cancelstr db "Cancel" -okstr db "OK" -okstr_e: - -sz_err_disconnected db "The server has closed the connection unexpectedly.", 0 -sz_err_dns db "Could not resolve hostname.", 0 -sz_err_sock db "Could not open socket.", 0 -sz_err_connect db "Could not connect to the server.", 0 -sz_err_proto db "A protocol error has occured.", 0 -sz_err_security db "An authentication problem has occured.", 0 -sz_err_library db "Could not load needed libraries.", 0 -sz_err_thread db "Could not create thread.", 0 -sz_err_login_failed db "Login failed.", 0 - -err_msg dd sz_err_disconnected - dd sz_err_dns - dd sz_err_sock - dd sz_err_connect - dd sz_err_proto - dd sz_err_security - dd sz_err_library - dd sz_err_thread - dd sz_err_login_failed - dd sz_err_security_c - -; import -align 4 -@IMPORT: - -library network, "network.obj",\ - box_lib, "box_lib.obj",\ - archiver, "archiver.obj" - -import network,\ - getaddrinfo, "getaddrinfo", \ - freeaddrinfo, "freeaddrinfo", \ - inet_ntoa, "inet_ntoa" - -import box_lib,\ - edit_box_draw, "edit_box",\ - edit_box_key, "edit_box_key",\ - edit_box_mouse, "edit_box_mouse",\ - scrollbar_v_draw, "scrollbar_v_draw",\ - scrollbar_v_mouse, "scrollbar_v_mouse",\ - scrollbar_h_draw, "scrollbar_h_draw",\ - scrollbar_h_mouse, "scrollbar_h_mouse" - -import archiver,\ - deflate_unpack2, "deflate_unpack2" - -name db "VNC viewer " -.dash db 0, " " - -port_notice db "Example: 192.168.0.3:5900" -port_notice_e: - -I_END: - -servername rb 64+1 - -serveraddr db 0 - rb SERVERADDRLEN - -socketnum dd ? -datapointer dd ? - -rectangles dw ? - -rectangle: -.x dd ? -.y dd ? -.width dd ? -.height dd ? - -subrectangles dd ? - -subrectangle: -.x dd ? -.y dd ? -.width dd ? -.height dd ? - -screen: ; Remote screen resolution -.height dw ? -.width dw ? - -palette rd 128 ; TRLE/ZRLE -palettesize db ? ; TRLE/ZRLE - -keymap rw 128 -keymap_shift rw 128 -keymap_alt rw 128 -username rb 128 -password rb 128 -keys rd 32*2 ; DES keys for VNC authentication - -cursor: -.y db ? -.x db ? -.image rd 32*32 - -align 4 -if BITS_PER_PIXEL = 8 -lut_8bpp rd 256 -end if - -sz_err_security_c rb 512+1 - -receive_buffer rb RECEIVE_BUFFER_SIZE -framebuffer rb 1280*1024*3 ; framebuffer - - rb 0x1000 -thread_stack: - rb 0x1000 -IM_END: - - +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2010-2015. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; VNC client for KolibriOS ;; +;; ;; +;; Written by hidnplayr@kolibrios.org ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +format binary as "" + +__DEBUG__ = 1 +__DEBUG_LEVEL__ = 2 + +BITS_PER_PIXEL = 32 ; 8, 16, 24 or 32 +SERVERADDRLEN = 4096 + +use32 + + org 0x0 + + db "MENUET01" ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd I_END ; size of image + dd IM_END ; memory for app + dd IM_END ; esp + dd serveraddr, 0x0 ; I_Param , I_Path + +include "../../macros.inc" +include "../../debug-fdo.inc" +include "../../proc32.inc" +include "../../dll.inc" +include "../../struct.inc" +include "../../develop/libraries/box_lib/box_lib.mac" +include "../../network.inc" + +struct PixelFormat + bpp db ? + depth db ? + big_endian db ? + true_color db ? + red_max dw ? + green_max dw ? + blue_max dw ? + red_shift db ? + green_shift db ? + blue_shift db ? + padding rb 3 +ends + +struct ServerInit + width dw ? + height dw ? + pixelformat PixelFormat + name_length dd ? + name db ? +ends + +xpos = 4 +ypos = 21 + +TIMEOUT = 5 ; timeout in seconds + +RECEIVE_BUFFER_SIZE = 8*1024*1024 ; 8 Mib + +STATUS_CONNECT = 0 +STATUS_CONNECTING = 1 +STATUS_REQ_LOGIN = 2 +STATUS_LOGIN = 3 +STATUS_CONNECTED = 4 +STATUS_CLOSED = 5 + +STATUS_DISCONNECTED = 10 +STATUS_DNS_ERR = 11 +STATUS_SOCK_ERR = 12 +STATUS_CONNECT_ERR = 13 +STATUS_PROTO_ERR = 14 +STATUS_SECURITY_ERR = 15 +STATUS_LIB_ERR = 16 +STATUS_THREAD_ERR = 17 +STATUS_LOGIN_FAILED = 18 +STATUS_SECURITY_ERR_C = 19 + +WORK_FRAMEBUFFER = 1 shl 0 +WORK_CURSOR = 1 shl 1 +WORK_GUI = 1 shl 2 + +BYTES_PER_PIXEL = (BITS_PER_PIXEL + 7) / 8 + +if BITS_PER_PIXEL = 32 + BYTES_PER_CPIXEL= 3 +else + BYTES_PER_CPIXEL= BYTES_PER_PIXEL +end if + +include "keymap.inc" +include "gui.inc" +include "network.inc" +include "raw.inc" +include "copyrect.inc" +include "rre.inc" +include "trle.inc" +include "zrle.inc" +include "cursor.inc" +include "des.inc" + + +if BITS_PER_PIXEL = 8 +create_lut: + mov edi, lut_8bpp ; 332 format + xor eax, eax + call green + add eax, 0x240000 + call green + add eax, 0x250000 + call green + add eax, 0x240000 + call green + add eax, 0x250000 + call green + add eax, 0x240000 + call green + add eax, 0x250000 + call green + add eax, 0x240000 + call green + ret + +green: + mov ah, 0 + call blue + mov ah, 36 + call blue + add ah, 37 + call blue + add ah, 36 + call blue + add ah, 37 + call blue + add ah, 36 + call blue + add ah, 37 + call blue + add ah, 36 + call blue + ret + +blue: + mov al, 0 + stosd + mov al, 85 + stosd + mov al, 170 + stosd + mov al, 255 + stosd + ret +end if + + +START: + + mcall 68, 11 ; init heap + +; Load libraries + stdcall dll.Load, @IMPORT + test eax, eax + jz @f + mov [status], STATUS_LIB_ERR + jmp draw_gui.first_time + @@: + +; When using 8BPP, create lookup table +if BITS_PER_PIXEL = 8 + call create_lut +end if + +; Check if we got a server address through parameters + cmp byte[serveraddr], 0 + je @f + xor al, al + mov edi, serveraddr + mov ecx, SERVERADDRLEN + repne scasb + sub edi, serveraddr+1 + mov [URLbox.size], edi + mov [URLbox.pos], edi + call open_connection + @@: + +; Present the user with the GUI and wait for network connection + jmp draw_gui.first_time + +; Create main window +connected: + mcall 71, 1, name ; reset window caption (add server name) + + mov edx, dword[screen] + movzx esi, dx + shr edx, 16 + add edx, 2*xpos + add esi, ypos+xpos + mcall 67, 10, 10 ; resize the window + + mcall 40, EVM_CURSOR_FILTER + EVM_MOUSE_FILTER + EVM_MOUSE + EVM_KEY + EVM_REDRAW + EVM_BUTTON + + mcall 66, 1, 1 ; Switch keyboard to scancode mode + + call generate_keymap + +redraw: + mcall 12, 1 + + mov ebx, dword[screen] + movzx ecx, bx + shr ebx, 16 + mov edx, 0x74ffffff + mov edi, name + mcall 0 ; draw window + + mcall 12, 2 + +draw_framebuffer: + DEBUGF 1, "Drawing framebuffer\n" + mcall 7, framebuffer, dword[screen], 0 + and [work], not WORK_FRAMEBUFFER + +mainloop: + cmp [status], STATUS_CONNECTED + jne draw_gui + test [work], WORK_FRAMEBUFFER + jnz draw_framebuffer + test [work], WORK_CURSOR + jnz update_cursor + + mcall 23, 10 ; Check for event with 0,1s timeout + + dec eax + jz redraw + dec eax + jz key + dec eax + jz button + sub eax, 3 + jz mouse + jmp mainloop + +key: + mcall 66, 3 + mov ebx, eax ; get modifier keys + + mcall 2 ; get key scancode + cmp ah, 224 ; extended keycode? + je .extended + + xor al, al + test ah, 0x80 ; key up? + jnz @f + inc al + and ah, 0x7f + @@: + mov byte[KeyEvent.down], al + + movzx eax, ah + + test ebx, 100000b ; alt? + jz .no_alt + mov ax, [keymap_alt+eax*2] + jmp .key + .no_alt: + + test ebx, 11b ; shift? + jz .no_shift + mov ax, [keymap_shift+eax*2] + jmp .key + .no_shift: + + test ebx, 10000000b ; numlock ? + jz .no_numlock + cmp al, 71 + jb .no_numlock + cmp al, 83 + ja .no_numlock + mov ah, [keymap_numlock+eax-71] + xor al, al + jmp .key + + .extended: ; extended keys always use regular keymap + mcall 2 + shr eax, 8 + jz mainloop + + xor ah, ah + test al, 0x80 ; key up? + jnz @f + inc ah + @@: + mov byte[KeyEvent.down], ah + and ax, 0x007f + .no_numlock: + mov ax, [keymap+eax*2] + .key: + test ax, ax + jz mainloop + mov word[KeyEvent.key+2], ax + DEBUGF 1, "Sending key: 0x%x\n", ax + mcall send, [socketnum], KeyEvent, 8, 0 + jmp mainloop + + + +mouse: +; DEBUGF 1, "Sending pointer event\n" + + mcall 37, 1 ; get mouse pos + bswap eax + mov [PointerEvent.x], ax + shr eax, 16 + mov [PointerEvent.y], ax + + mcall 37, 2 ; get mouse buttons + test al, 00000010b ; test if right button was pressed (bit 1 in kolibri) + jz @f + add al, 00000010b ; in RFB protocol it is bit 2, so if we add bit 2 again, we"ll get bit 3 and bit 1 will remain the same + @@: + mov [PointerEvent.mask], al + + mcall send, [socketnum], PointerEvent, 6, 0 + jmp mainloop + +button: + mcall 17 ; get id + mov [status], STATUS_CLOSED + mcall close, [socketnum] + mcall -1 + + +update_cursor: + +; load cursor + mov dx, word[cursor.y] + shl edx, 16 + mov dx, 2 + mcall 37, 4, cursor.image + test eax, eax + jz .fail + +; set cursor + mov ecx, eax + mcall 37, 5 + +; delete previously set cursor + mov ecx, eax + mcall 37, 6 + +.fail: + and [work], not WORK_CURSOR + jmp mainloop + + +; DATA AREA + +include_debug_strings + +keymap_numlock: + db '7', '8', '9', '-' + db '4', '5', '6', '+' + db '1', '2', '3' + db '0', '.' + +HandShake db "RFB 003.003", 10 + +ClientInit db 0 ; not shared + +if BITS_PER_PIXEL = 32 + +SetPixelFormat db 0 ; setPixelformat + db 0, 0, 0 ; padding +.bpp db 32 ; bits per pixel +.depth db 24 ; depth +.big_endian db 0 ; big-endian flag +.true_color db 1 ; true-colour flag +.red_max db 0, 255 ; red-max +.green_max db 0, 255 ; green-max +.blue_max db 0, 255 ; blue-max +.red_shift db 16 ; red-shift +.green_shift db 8 ; green-shift +.blue_shift db 0 ; blue-shift + db 0, 0, 0 ; padding + +else if BITS_PER_PIXEL = 24 + +SetPixelFormat db 0 ; setPixelformat + db 0, 0, 0 ; padding +.bpp db 24 ; bits per pixel +.depth db 24 ; depth +.big_endian db 0 ; big-endian flag +.true_color db 1 ; true-colour flag +.red_max db 0, 255 ; red-max +.green_max db 0, 255 ; green-max +.blue_max db 0, 255 ; blue-max +.red_shift db 16 ; red-shift +.green_shift db 8 ; green-shift +.blue_shift db 0 ; blue-shift + db 0, 0, 0 ; padding + +else if BITS_PER_PIXEL = 16 + +SetPixelFormat db 0 ; setPixelformat + db 0, 0, 0 ; padding +.bpp db 16 ; bits per pixel +.depth db 16 ; depth +.big_endian db 0 ; big-endian flag +.true_color db 1 ; true-colour flag +.red_max db 0, 31 ; red-max +.green_max db 0, 63 ; green-max +.blue_max db 0, 31 ; blue-max +.red_shift db 11 ; red-shift +.green_shift db 5 ; green-shift +.blue_shift db 0 ; blue-shift + db 0, 0, 0 ; padding + +else if BITS_PER_PIXEL = 8 + +SetPixelFormat db 0 ; setPixelformat + db 0, 0, 0 ; padding +.bpp db 8 ; bits per pixel +.depth db 8 ; depth +.big_endian db 0 ; big-endian flag +.true_color db 1 ; true-colour flag +.red_max db 0, 7 ; red-max +.green_max db 0, 7 ; green-max +.blue_max db 0, 3 ; blue-max +.red_shift db 5 ; red-shift +.green_shift db 2 ; green-shift +.blue_shift db 0 ; blue-shift + db 0, 0, 0 ; padding + +end if + +SetEncodings db 2 ; setEncodings + db 0 ; padding + db 0, 5 ; number of encodings +; db 0, 0, 0, 16 ; ZRLE + db 0, 0, 0, 15 ; TRLE + db 0, 0, 0, 2 ; RRE + db 0, 0, 0, 1 ; Copyrect encoding + db 0xff, 0xff, 0xff, 0x11 ; Cursor pseudo encoding + db 0, 0, 0, 0 ; raw encoding + .length = $ - SetEncodings + +FramebufferUpdateRequest db 3 +.inc db 0 ; incremental +.x dw 0 +.y dw 0 +.width dw 0 +.height dw 0 + +KeyEvent db 4 ; keyevent +.down db 0 ; down-flag + dw 0 ; padding +.key dd 0 ; key + +PointerEvent db 5 ; pointerevent +.mask db 0 ; button-mask +.x dw 0 ; x-position +.y dw 0 ; y-position + + +sockaddr1: + dw AF_INET4 +.port dw 0x0c17 ; 5900 +.ip dd 0 + rb 10 + +beep db 0x85, 0x25, 0x85, 0x40, 0 + +status dd STATUS_CONNECT +work dd 0 +mouse_dd dd 0 +thread_id dd 0 + +deflate_buffer dd 0 +deflate_length dd ? +deflate_str dd ? + +URLbox edit_box 235, 70, 20, 0xffffff, 0x6f9480, 0, 0, 0x90000000, SERVERADDRLEN, serveraddr, mouse_dd, ed_focus, 0, 0 +USERbox edit_box 215, 90, 10, 0xffffff, 0x6f9480, 0, 0, 0x90000000, 127, username, mouse_dd, ed_focus, 0, 0 +PASSbox edit_box 215, 90, 35, 0xffffff, 0x6f9480, 0, 0, 0x10000000, 127, password, mouse_dd, ed_pass, 0, 0 + +serverstr db "server:" +userstr db "username:" +passstr db "password:" +connectstr db "Connect" +loginstr db "Log in" +cancelstr db "Cancel" +okstr db "OK" +okstr_e: + +sz_err_disconnected db "The server has closed the connection unexpectedly.", 0 +sz_err_dns db "Could not resolve hostname.", 0 +sz_err_sock db "Could not open socket.", 0 +sz_err_connect db "Could not connect to the server.", 0 +sz_err_proto db "A protocol error has occured.", 0 +sz_err_security db "An authentication problem has occured.", 0 +sz_err_library db "Could not load needed libraries.", 0 +sz_err_thread db "Could not create thread.", 0 +sz_err_login_failed db "Login failed.", 0 + +err_msg dd sz_err_disconnected + dd sz_err_dns + dd sz_err_sock + dd sz_err_connect + dd sz_err_proto + dd sz_err_security + dd sz_err_library + dd sz_err_thread + dd sz_err_login_failed + dd sz_err_security_c + +; import +align 4 +@IMPORT: + +library network, "network.obj",\ + box_lib, "box_lib.obj",\ + archiver, "archiver.obj" + +import network,\ + getaddrinfo, "getaddrinfo", \ + freeaddrinfo, "freeaddrinfo", \ + inet_ntoa, "inet_ntoa" + +import box_lib,\ + edit_box_draw, "edit_box",\ + edit_box_key, "edit_box_key",\ + edit_box_mouse, "edit_box_mouse",\ + scrollbar_v_draw, "scrollbar_v_draw",\ + scrollbar_v_mouse, "scrollbar_v_mouse",\ + scrollbar_h_draw, "scrollbar_h_draw",\ + scrollbar_h_mouse, "scrollbar_h_mouse" + +import archiver,\ + deflate_unpack2, "deflate_unpack2" + +name db "VNC viewer " +.dash db 0, " " + +port_notice db "Example: 192.168.0.3:5900" +port_notice_e: + +I_END: + +servername rb 64+1 + +serveraddr db 0 + rb SERVERADDRLEN + +socketnum dd ? +datapointer dd ? + +rectangles dw ? + +rectangle: +.x dd ? +.y dd ? +.width dd ? +.height dd ? + +subrectangles dd ? + +subrectangle: +.x dd ? +.y dd ? +.width dd ? +.height dd ? + +screen: ; Remote screen resolution +.height dw ? +.width dw ? + +palette rd 128 ; TRLE/ZRLE +palettesize db ? ; TRLE/ZRLE + +keymap rw 128 +keymap_shift rw 128 +keymap_alt rw 128 +username rb 128 +password rb 128 +keys rd 32*2 ; DES keys for VNC authentication + +cursor: +.y db ? +.x db ? +.image rd 32*32 + +align 4 +if BITS_PER_PIXEL = 8 +lut_8bpp rd 256 +end if + +sz_err_security_c rb 512+1 + +receive_buffer rb RECEIVE_BUFFER_SIZE +framebuffer rb 1280*1024*3 ; framebuffer + + rb 0x1000 +thread_stack: + rb 0x1000 +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/other/t_edit/t_edit.asm b/programs/other/t_edit/t_edit.asm index d64cb1154..8ecc9efdc 100644 --- a/programs/other/t_edit/t_edit.asm +++ b/programs/other/t_edit/t_edit.asm @@ -1,429 +1,435 @@ -;Огромная благодарность всем, кто помогал: кодом/советом/дизайном ... - -use32 - org 0 - db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт - dd 1, start, i_end, mem, stacktop, file_name, sys_path - -MAX_COLOR_WORD_LEN equ 40 -maxChars equ 100002 ;(колличество символов в новом документе + 2) -BUF_SIZE equ 4096 ;buffer for copy|paste -maxSyntaxFileSize equ 410000 -TOOLBAR_ICONS_SIZE equ 1200*21 - -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' -include '../../system/skincfg/trunk/kglobals.inc' -include '../../system/skincfg/trunk/unpacker.inc' -include 'lang.inc' - -include 't_data.inc' -include 't_button.inc' -include 't_menu.inc' -include 'strlen.inc' -include 't_draw.inc' ;draw main window functions -include 'wnd_k_words.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load - -align 4 -icon_tl_sys dd 0 ;указатель на память для хранения системных иконок -run_file_70 FileInfoBlock - -align 4 -start: - mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors - - mcall SF_SYS_MISC,SSF_HEAP_INIT - or eax,eax - jnz @f - call ted_Exit - @@: - - mcall SF_KEYBOARD,SSF_SET_INPUT_MODE,1 ;scan code - mcall SF_SET_EVENTS_MASK,0xC0000027 - - mov esi,file_name - stdcall str_len,esi - mov ecx,eax - mov edi,openfile_path - cld - rep movsb ;копируем имя файла в буфер openfile_path - -load_libraries l_libs_start,load_lib_end - -;проверка на сколько удачно загузились библиотеки -mov ebp,lib0 -.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 - -;--------------------------------------------------------------------- - stdcall [ted_init], tedit0 - stdcall [tl_data_init], tree1 - option_boxes_set_sys_color sc,opt_grlist1 - init_checkboxes2 check_boxes,check_boxes_end - check_boxes_set_sys_color2 check_boxes,check_boxes_end,sc - -; OpenDialog initialisation - stdcall [OpenDialog_Init],OpenDialog_data - -; kmenu initialisation - call tedit_menu_init - -; init toolbar file - include_image_file 'te_icon.png', bmp_icon,,,6 ;6 для серых кнопок - mov eax,[bmp_icon] - add eax,TOOLBAR_ICONS_SIZE - stdcall img_to_gray, [bmp_icon],eax,(TOOLBAR_ICONS_SIZE)/3 -;--------------------------------------------------------------------- -; внедряем файл с курсорами и линиями - include_image_file '..\..\media\log_el\trunk\tl_sys_16.png', icon_tl_sys - mov eax,dword[icon_tl_sys] - mov dword[tree1.data_img_sys],eax -; внедряем файл с иконками узлов - include_image_file 'tl_nod_16.png', icon_tl_sys - mov eax,dword[icon_tl_sys] - mov dword[tree1.data_img],eax -;------------------------------------------------------------------------------ - copy_path fn_syntax_dir,sys_path,file_name,0 ;берем путь к папке с файлами синтаксиса - xor eax,eax - mov ecx,4096 - mov edi,file_name - repnz scasb - mov byte[edi-2],al ;убираем '/' в конце имени папки (нужно для чтения с CD) - mcall SF_FILE,tree_file_struct - - or ebx,ebx - jz .end_dir_init - mov eax,dir_mem+32+40 - mov ecx,ebx - @@: - cmp byte[eax],'.' ;фильтруем файлы с именами '.' и '..' - je .filter - ;0x10000 ;1*2^16 - где 1 номер иконки с книгой - stdcall [tl_node_add], tree1,0x10000,eax - stdcall [tl_cur_next], tree1 - .filter: - add eax,304 - loop @b - stdcall [tl_cur_beg],tree1 ;ставим курсор на начало списка - or dword[tree1.style], tl_cursor_pos_limited ;ограничиваем движение курсора в пределах списка - .end_dir_init: - -;--- load ini file --- - copy_path ini_name,sys_path,file_name,0 - ;window startup pozition - stdcall [ini_get_int],file_name,ini_sec_window,key_window_l,ini_def_window_l - mov word[wnd_s_pos+2],ax - stdcall [ini_get_int],file_name,ini_sec_window,key_window_w,ini_def_window_w - mov word[wnd_s_pos],ax - stdcall [ini_get_int],file_name,ini_sec_window,key_window_t,ini_def_window_t - mov word[wnd_s_pos+6],ax - stdcall [ini_get_int],file_name,ini_sec_window,key_window_h,ini_def_window_h - mov word[wnd_s_pos+4],ax - ;scrool type - stdcall [ini_get_int],file_name,ini_sec_window,key_scroll_type,ini_def_scroll_type - mov [wScr.type],eax - mov [hScr.type],eax - mov [ws_dir_lbox.type],eax - mov [w_scr_t3.type],eax - ;symbol size - stdcall [ini_get_int],file_name,ini_sec_window,key_symbol_w,ini_def_symbol_w - mov dword[tedit0.rec.width],eax - stdcall [ini_get_int],file_name,ini_sec_window,key_symbol_h,ini_def_symbol_h - mov dword[tedit0.rec.height],eax - ;lea eax,[eax+eax*2] - ;mov dword[tedit0.rec.top],eax - ;font size - stdcall [ini_get_int],file_name,ini_sec_window,key_font_s,ini_def_font_s - shl eax,24 - mov dword[tedit0.font_size],eax - ;кнопки на панели - ini_panel key_but_new, ID_BUT_NEW - ini_panel key_but_open, ID_BUT_OPEN - ini_panel key_but_save, ID_BUT_SAVE - ini_panel key_but_save_as,ID_BUT_SAVE_AS - ini_panel key_but_select, ID_BUT_SELECT - ini_panel key_but_cut, ID_BUT_CUT - ini_panel key_but_copy, ID_BUT_COPY - ini_panel key_but_paste, ID_BUT_PASTE - ini_panel key_but_find, ID_BUT_FIND - ini_panel key_but_replace,ID_BUT_REPLACE - ini_panel key_but_key_words,ID_BUT_KEY_WORDS - ini_panel key_but_upper, ID_BUT_UPPER - ini_panel key_but_lower, ID_BUT_LOWER - ini_panel key_but_reverse,ID_BUT_REVERSE - ini_panel key_but_undo, ID_BUT_UNDO - ini_panel key_but_redo, ID_BUT_REDO - ini_panel key_but_invisible,ID_BUT_INVISIBLE - ini_panel key_but_syntax_list,ID_BUT_SYNTAX_LIST - ini_panel key_but_syntax_mode,ID_BUT_SYNTAX_MODE - ini_panel key_but_convert_1251_866,ID_BUT_CONVERT_1251_866 - ini_panel key_but_convert_866_1251,ID_BUT_CONVERT_866_1251 - ;файловые расширения - xor edx,edx - mov ebx,synt_auto_open - @@: - ;берем имя файла - stdcall [ini_get_str],file_name,ini_sec_options,key_synt_file,ebx,32,ini_def_synt_f - cmp byte[ebx],0 - je @f - inc byte[key_synt_file.numb] - add ebx,32 - ;берем расширения - stdcall [ini_get_str],file_name,ini_sec_options,key_synt_ext,ebx,32,ini_def_synt_f - inc byte[key_synt_ext.numb] - add ebx,32 - inc edx - cmp edx,max_synt_auto_open - jl @b - @@: - -;--- load color option file --- - stdcall open_unpac_synt_file,[fn_col_option] - -;--- get cmd line --- - cmp byte[openfile_path+3],0 ;openfile_path - je @f ;if file names exist - mov esi,openfile_path - stdcall auto_open_syntax,esi - call but_no_msg_OpenFile - @@: - - - -align 16 -red_win: - call draw_window - -align 16 -still: - mcall SF_WAIT_EVENT - cmp dword[exit_code],1 - jne @f - call ted_Exit - jmp still - @@: - - cmp al,1 ;изменилось положение окна - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - cmp al,6 ;мышь - jne @f - call mouse - @@: - jmp still - -align 16 -mouse: - stdcall [kmainmenu_dispatch_cursorevent], [main_menu] - - mcall SF_MOUSE_GET,SSF_WINDOW_POSITION - cmp word[tedit0.wnd.top],ax - jg .no_edit - shr eax,16 - cmp word[tedit0.wnd.left],ax - jg .no_edit - mcall SF_MOUSE_GET,SSF_BUTTON_EXT - bt eax,24 ;двойной щелчёк левой кнопкой - jnc @f - stdcall [ted_but_select_word], tedit0 - ret - @@: - stdcall [ted_mouse], tedit0 - .no_edit: - - ;проверка боковых панелей - cmp byte[tedit0.panel_id],TED_PANEL_FIND - jne @f - stdcall [edit_box_mouse], edit_find - stdcall [option_box_mouse], opt_grlist1 - stdcall [check_box_mouse], ch1 - @@: - cmp byte[tedit0.panel_id],TED_PANEL_REPLACE - jne @f - stdcall [edit_box_mouse], edit_find - stdcall [edit_box_mouse], edit_replace - stdcall [option_box_mouse], opt_grlist1 - @@: - cmp byte[tedit0.panel_id],TED_PANEL_SYNTAX - jne @f - stdcall [tl_mouse], tree1 - @@: - cmp byte[tedit0.panel_id],TED_PANEL_GOTO - jne @f - stdcall [edit_box_mouse], edit_goto - @@: - ret -;--------------------------------------------------------------------- - -;output: -; ah = symbol -align 16 -proc KeyConvertToASCII uses ebx, table:dword - mov ebx,dword[table] ;convert scan to ascii - shr ax,8 - add bx,ax - mov ah,byte[ebx] - ret -endp - -align 16 -key: - mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS ;66.3 получить состояние управляющих клавиш - xor esi,esi - mov ecx,1 - test al,3 ;[Shift] - jz @f - mov cl,2 - or esi,KM_SHIFT - @@: - test al,0x0c ;[Ctrl] - jz @f - or esi,KM_CTRL - @@: - test al,0x30 ;[Alt] - jz @f - mov cl,3 - or esi,KM_ALT - @@: - test al,0x80 ;[NumLock] - jz @f - or esi,KM_NUMLOCK - @@: - - mcall SF_SYSTEM_GET,SSF_KEYBOARD_LAYOUT,,conv_tabl ;26.2 получить раскладку клавиатуры - mcall SF_GET_KEY - stdcall [tl_key], tree1 - - test word[edit_replace.flags],ed_focus ;если не в фокусе, выходим - je @f - cmp ah,0x80 ;if key up - ja still - cmp ah,42 ;[Shift] (left) - je still - cmp ah,54 ;[Shift] (right) - je still - cmp ah,56 ;[Alt] - je still - cmp ah,29 ;[Ctrl] - je still - cmp ah,69 ;[Pause Break] - je still - - stdcall KeyConvertToASCII, conv_tabl - stdcall [edit_box_key], edit_replace - jmp still - @@: - test word[edit_find.flags],ed_focus ;если не в фокусе, выходим - je @f - cmp ah,0x80 ;if key up - ja still - cmp ah,42 ;[Shift] (left) - je still - cmp ah,54 ;[Shift] (right) - je still - cmp ah,56 ;[Alt] - je still - cmp ah,29 ;[Ctrl] - je still - cmp ah,69 ;[Pause Break] - je still - - stdcall KeyConvertToASCII, conv_tabl - stdcall [edit_box_key], edit_find - jmp still - @@: - test word[edit_goto.flags],ed_focus ;если не в фокусе, выходим - je @f - cmp ah,0x80 ;if key up - ja still - cmp ah,42 ;[Shift] (left) - je still - cmp ah,54 ;[Shift] (right) - je still - cmp ah,56 ;[Alt] - je still - cmp ah,29 ;[Ctrl] - je still - cmp ah,69 ;[Pause Break] - je still - - stdcall KeyConvertToASCII, conv_tabl - stdcall [edit_box_key], edit_goto - jmp still - @@: - - stdcall [ted_key], tedit0, conv_tabl,esi - jmp still - -align 4 -edit_replace edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 300, buf_replace, mouse_dd, 0 -edit_find edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 300, buf_find, mouse_dd, 0 -edit_goto edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 10, buf_goto, mouse_dd, 0 - -unpac_mem dd 0 - -;library structures -l_libs_start: - lib0 l_libs lib_name_0, file_name, system_dir_0, import_box_lib - lib1 l_libs lib_name_1, file_name, system_dir_1, import_msgbox_lib - lib2 l_libs lib_name_2, file_name, system_dir_2, import_proclib - lib3 l_libs lib_name_3, file_name, system_dir_3, import_libimg - lib4 l_libs lib_name_4, file_name, system_dir_4, import_libini - lib5 l_libs lib_name_5, file_name, system_dir_5, import_libkmenu -load_lib_end: - -IncludeIGlobals -hed db 'TextEdit ' -i_end: - openfile_path: ;полный путь к файлу с которым идет работа - rb 4096 - dir_mem rb 32+304*count_of_dir_list_files - wnd_s_pos: ;место для настроек стартовой позиции окна - rq 1 - last_open_synt_file rb 32 ;имя последнего подключенного файла синтаксиса - buf rb BUF_SIZE ;буфер для копирования и вставки - buf_find rb 302 ;буфер для поиска текста - buf_replace rb 302 ;буфер для замены текста - buf_goto rb 12 ;буфер для перхода на строку - sc system_colors -IncludeUGlobals - align 16 - procinfo process_information - rb 1024 - thread: - rb 4096 -align 16 - thread_coords: - rb 4096 -align 16 -stacktop: - sys_path: ;путь откуда запустился исполняемый файл - rb 4096 - file_name: ;параметры запуска - rb 4096 - syntax_path: ;имя подключаемого файла синтаксиса - rb 4096 - plugin_path: - rb 4096 - text_work_area: ;путь к файлу, который показывается в окне - rb 4096 - filename_area: ;имя файла для диалога открытия/закрытия - rb 256 - file_info: - rb 40 -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, file_name, sys_path + +MAX_COLOR_WORD_LEN equ 40 +maxChars equ 100002 ;(колличество символов в новом документе + 2) +BUF_SIZE equ 4096 ;buffer for copy|paste +maxSyntaxFileSize equ 410000 +TOOLBAR_ICONS_SIZE equ 1200*21 + +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' +include '../../system/skincfg/trunk/kglobals.inc' +include '../../system/skincfg/trunk/unpacker.inc' +include 'lang.inc' + +include 't_data.inc' +include 't_button.inc' +include 't_menu.inc' +include 'strlen.inc' +include 't_draw.inc' ;draw main window functions +include 'wnd_k_words.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load + +align 4 +icon_tl_sys dd 0 ;указатель на память для хранения системных иконок +run_file_70 FileInfoBlock + +align 4 +start: + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors + + mcall SF_SYS_MISC,SSF_HEAP_INIT + or eax,eax + jnz @f + call ted_Exit + @@: + + mcall SF_KEYBOARD,SSF_SET_INPUT_MODE,1 ;scan code + mcall SF_SET_EVENTS_MASK,0xC0000027 + + mov esi,file_name + stdcall str_len,esi + mov ecx,eax + mov edi,openfile_path + cld + rep movsb ;копируем имя файла в буфер openfile_path + +load_libraries l_libs_start,load_lib_end + +;проверка на сколько удачно загузились библиотеки +mov ebp,lib0 +.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 + +;--------------------------------------------------------------------- + stdcall [ted_init], tedit0 + stdcall [tl_data_init], tree1 + option_boxes_set_sys_color sc,opt_grlist1 + init_checkboxes2 check_boxes,check_boxes_end + check_boxes_set_sys_color2 check_boxes,check_boxes_end,sc + +; OpenDialog initialisation + stdcall [OpenDialog_Init],OpenDialog_data + +; kmenu initialisation + call tedit_menu_init + +; init toolbar file + include_image_file 'te_icon.png', bmp_icon,,,6 ;6 для серых кнопок + mov eax,[bmp_icon] + add eax,TOOLBAR_ICONS_SIZE + stdcall img_to_gray, [bmp_icon],eax,(TOOLBAR_ICONS_SIZE)/3 +;--------------------------------------------------------------------- +; внедряем файл с курсорами и линиями + include_image_file '..\..\media\log_el\trunk\tl_sys_16.png', icon_tl_sys + mov eax,dword[icon_tl_sys] + mov dword[tree1.data_img_sys],eax +; внедряем файл с иконками узлов + include_image_file 'tl_nod_16.png', icon_tl_sys + mov eax,dword[icon_tl_sys] + mov dword[tree1.data_img],eax +;------------------------------------------------------------------------------ + copy_path fn_syntax_dir,sys_path,file_name,0 ;берем путь к папке с файлами синтаксиса + xor eax,eax + mov ecx,4096 + mov edi,file_name + repnz scasb + mov byte[edi-2],al ;убираем '/' в конце имени папки (нужно для чтения с CD) + mcall SF_FILE,tree_file_struct + + or ebx,ebx + jz .end_dir_init + mov eax,dir_mem+32+40 + mov ecx,ebx + @@: + cmp byte[eax],'.' ;фильтруем файлы с именами '.' и '..' + je .filter + ;0x10000 ;1*2^16 - где 1 номер иконки с книгой + stdcall [tl_node_add], tree1,0x10000,eax + stdcall [tl_cur_next], tree1 + .filter: + add eax,304 + loop @b + stdcall [tl_cur_beg],tree1 ;ставим курсор на начало списка + or dword[tree1.style], tl_cursor_pos_limited ;ограничиваем движение курсора в пределах списка + .end_dir_init: + +;--- load ini file --- + copy_path ini_name,sys_path,file_name,0 + ;window startup pozition + stdcall [ini_get_int],file_name,ini_sec_window,key_window_l,ini_def_window_l + mov word[wnd_s_pos+2],ax + stdcall [ini_get_int],file_name,ini_sec_window,key_window_w,ini_def_window_w + mov word[wnd_s_pos],ax + stdcall [ini_get_int],file_name,ini_sec_window,key_window_t,ini_def_window_t + mov word[wnd_s_pos+6],ax + stdcall [ini_get_int],file_name,ini_sec_window,key_window_h,ini_def_window_h + mov word[wnd_s_pos+4],ax + ;scrool type + stdcall [ini_get_int],file_name,ini_sec_window,key_scroll_type,ini_def_scroll_type + mov [wScr.type],eax + mov [hScr.type],eax + mov [ws_dir_lbox.type],eax + mov [w_scr_t3.type],eax + ;symbol size + stdcall [ini_get_int],file_name,ini_sec_window,key_symbol_w,ini_def_symbol_w + mov dword[tedit0.rec.width],eax + stdcall [ini_get_int],file_name,ini_sec_window,key_symbol_h,ini_def_symbol_h + mov dword[tedit0.rec.height],eax + ;lea eax,[eax+eax*2] + ;mov dword[tedit0.rec.top],eax + ;font size + stdcall [ini_get_int],file_name,ini_sec_window,key_font_s,ini_def_font_s + shl eax,24 + mov dword[tedit0.font_size],eax + ;кнопки на панели + ini_panel key_but_new, ID_BUT_NEW + ini_panel key_but_open, ID_BUT_OPEN + ini_panel key_but_save, ID_BUT_SAVE + ini_panel key_but_save_as,ID_BUT_SAVE_AS + ini_panel key_but_select, ID_BUT_SELECT + ini_panel key_but_cut, ID_BUT_CUT + ini_panel key_but_copy, ID_BUT_COPY + ini_panel key_but_paste, ID_BUT_PASTE + ini_panel key_but_find, ID_BUT_FIND + ini_panel key_but_replace,ID_BUT_REPLACE + ini_panel key_but_key_words,ID_BUT_KEY_WORDS + ini_panel key_but_upper, ID_BUT_UPPER + ini_panel key_but_lower, ID_BUT_LOWER + ini_panel key_but_reverse,ID_BUT_REVERSE + ini_panel key_but_undo, ID_BUT_UNDO + ini_panel key_but_redo, ID_BUT_REDO + ini_panel key_but_invisible,ID_BUT_INVISIBLE + ini_panel key_but_syntax_list,ID_BUT_SYNTAX_LIST + ini_panel key_but_syntax_mode,ID_BUT_SYNTAX_MODE + ini_panel key_but_convert_1251_866,ID_BUT_CONVERT_1251_866 + ini_panel key_but_convert_866_1251,ID_BUT_CONVERT_866_1251 + ;файловые расширения + xor edx,edx + mov ebx,synt_auto_open + @@: + ;берем имя файла + stdcall [ini_get_str],file_name,ini_sec_options,key_synt_file,ebx,32,ini_def_synt_f + cmp byte[ebx],0 + je @f + inc byte[key_synt_file.numb] + add ebx,32 + ;берем расширения + stdcall [ini_get_str],file_name,ini_sec_options,key_synt_ext,ebx,32,ini_def_synt_f + inc byte[key_synt_ext.numb] + add ebx,32 + inc edx + cmp edx,max_synt_auto_open + jl @b + @@: + +;--- load color option file --- + stdcall open_unpac_synt_file,[fn_col_option] + +;--- get cmd line --- + cmp byte[openfile_path+3],0 ;openfile_path + je @f ;if file names exist + mov esi,openfile_path + stdcall auto_open_syntax,esi + call but_no_msg_OpenFile + @@: + + + +align 16 +red_win: + call draw_window + +align 16 +still: + mcall SF_WAIT_EVENT + cmp dword[exit_code],1 + jne @f + call ted_Exit + jmp still + @@: + + cmp al,1 ;изменилось положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + cmp al,6 ;мышь + jne @f + call mouse + @@: + jmp still + +align 16 +mouse: + stdcall [kmainmenu_dispatch_cursorevent], [main_menu] + + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION + cmp word[tedit0.wnd.top],ax + jg .no_edit + shr eax,16 + cmp word[tedit0.wnd.left],ax + jg .no_edit + mcall SF_MOUSE_GET,SSF_BUTTON_EXT + bt eax,24 ;двойной щелчёк левой кнопкой + jnc @f + stdcall [ted_but_select_word], tedit0 + ret + @@: + stdcall [ted_mouse], tedit0 + .no_edit: + + ;проверка боковых панелей + cmp byte[tedit0.panel_id],TED_PANEL_FIND + jne @f + stdcall [edit_box_mouse], edit_find + stdcall [option_box_mouse], opt_grlist1 + stdcall [check_box_mouse], ch1 + @@: + cmp byte[tedit0.panel_id],TED_PANEL_REPLACE + jne @f + stdcall [edit_box_mouse], edit_find + stdcall [edit_box_mouse], edit_replace + stdcall [option_box_mouse], opt_grlist1 + @@: + cmp byte[tedit0.panel_id],TED_PANEL_SYNTAX + jne @f + stdcall [tl_mouse], tree1 + @@: + cmp byte[tedit0.panel_id],TED_PANEL_GOTO + jne @f + stdcall [edit_box_mouse], edit_goto + @@: + ret +;--------------------------------------------------------------------- + +;output: +; ah = symbol +align 16 +proc KeyConvertToASCII uses ebx, table:dword + mov ebx,dword[table] ;convert scan to ascii + shr ax,8 + add bx,ax + mov ah,byte[ebx] + ret +endp + +align 16 +key: + mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS ;66.3 получить состояние управляющих клавиш + xor esi,esi + mov ecx,1 + test al,3 ;[Shift] + jz @f + mov cl,2 + or esi,KM_SHIFT + @@: + test al,0x0c ;[Ctrl] + jz @f + or esi,KM_CTRL + @@: + test al,0x30 ;[Alt] + jz @f + mov cl,3 + or esi,KM_ALT + @@: + test al,0x80 ;[NumLock] + jz @f + or esi,KM_NUMLOCK + @@: + + mcall SF_SYSTEM_GET,SSF_KEYBOARD_LAYOUT,,conv_tabl ;26.2 получить раскладку клавиатуры + mcall SF_GET_KEY + stdcall [tl_key], tree1 + + test word[edit_replace.flags],ed_focus ;если не в фокусе, выходим + je @f + cmp ah,0x80 ;if key up + ja still + cmp ah,42 ;[Shift] (left) + je still + cmp ah,54 ;[Shift] (right) + je still + cmp ah,56 ;[Alt] + je still + cmp ah,29 ;[Ctrl] + je still + cmp ah,69 ;[Pause Break] + je still + + stdcall KeyConvertToASCII, conv_tabl + stdcall [edit_box_key], edit_replace + jmp still + @@: + test word[edit_find.flags],ed_focus ;если не в фокусе, выходим + je @f + cmp ah,0x80 ;if key up + ja still + cmp ah,42 ;[Shift] (left) + je still + cmp ah,54 ;[Shift] (right) + je still + cmp ah,56 ;[Alt] + je still + cmp ah,29 ;[Ctrl] + je still + cmp ah,69 ;[Pause Break] + je still + + stdcall KeyConvertToASCII, conv_tabl + stdcall [edit_box_key], edit_find + jmp still + @@: + test word[edit_goto.flags],ed_focus ;если не в фокусе, выходим + je @f + cmp ah,0x80 ;if key up + ja still + cmp ah,42 ;[Shift] (left) + je still + cmp ah,54 ;[Shift] (right) + je still + cmp ah,56 ;[Alt] + je still + cmp ah,29 ;[Ctrl] + je still + cmp ah,69 ;[Pause Break] + je still + + stdcall KeyConvertToASCII, conv_tabl + stdcall [edit_box_key], edit_goto + jmp still + @@: + + stdcall [ted_key], tedit0, conv_tabl,esi + jmp still + +align 4 +edit_replace edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 300, buf_replace, mouse_dd, 0 +edit_find edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 300, buf_find, mouse_dd, 0 +edit_goto edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 10, buf_goto, mouse_dd, 0 + +unpac_mem dd 0 + +;library structures +l_libs_start: + lib0 l_libs lib_name_0, file_name, system_dir_0, import_box_lib + lib1 l_libs lib_name_1, file_name, system_dir_1, import_msgbox_lib + lib2 l_libs lib_name_2, file_name, system_dir_2, import_proclib + lib3 l_libs lib_name_3, file_name, system_dir_3, import_libimg + lib4 l_libs lib_name_4, file_name, system_dir_4, import_libini + lib5 l_libs lib_name_5, file_name, system_dir_5, import_libkmenu +load_lib_end: + +IncludeIGlobals +hed db 'TextEdit ' +i_end: + openfile_path: ;полный путь к файлу с которым идет работа + rb 4096 + dir_mem rb 32+304*count_of_dir_list_files + wnd_s_pos: ;место для настроек стартовой позиции окна + rq 1 + last_open_synt_file rb 32 ;имя последнего подключенного файла синтаксиса + buf rb BUF_SIZE ;буфер для копирования и вставки + buf_find rb 302 ;буфер для поиска текста + buf_replace rb 302 ;буфер для замены текста + buf_goto rb 12 ;буфер для перхода на строку + sc system_colors +IncludeUGlobals + align 16 + procinfo process_information + rb 1024 + thread: + rb 4096 +align 16 + thread_coords: + rb 4096 +align 16 +stacktop: + sys_path: ;путь откуда запустился исполняемый файл + rb 4096 + file_name: ;параметры запуска + rb 4096 + syntax_path: ;имя подключаемого файла синтаксиса + rb 4096 + plugin_path: + rb 4096 + text_work_area: ;путь к файлу, который показывается в окне + rb 4096 + filename_area: ;имя файла для диалога открытия/закрытия + rb 256 + file_info: + rb 40 +mem: diff --git a/programs/other/t_edit_synt/te_syntax.asm b/programs/other/t_edit_synt/te_syntax.asm index 8a0ed71fc..ebee8e547 100644 --- a/programs/other/t_edit_synt/te_syntax.asm +++ b/programs/other/t_edit_synt/te_syntax.asm @@ -1,389 +1,395 @@ -use32 - org 0 - db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт - dd 1, start, i_end, mem, stacktop, file_name, sys_path - -MAX_COLOR_WORD_LEN equ 40 -BUF_SIZE equ 4096 ;buffer for copy|paste -CAPT_PATH_WIDTH equ 50 ;ширина подписи перед текстовым полем - -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 '../../system/skincfg/trunk/kglobals.inc' -include '../../system/skincfg/trunk/unpacker.inc' -include 'te_data.inc' -include 'te_work.inc' ;text work functions - -@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load - -icon_tl_sys dd 0 ;указатель на память для хранения системных иконок - -align 4 -start: - mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors - - mcall SF_SYS_MISC,SSF_HEAP_INIT - or eax,eax - jz button.exit - - mcall SF_KEYBOARD,SSF_SET_INPUT_MODE,1 ;scan code - mcall SF_SET_EVENTS_MASK,0xC0000027 - - load_libraries l_libs_start,load_lib_end - - ;проверка на сколько удачно загузилась библиотека - cmp dword[lib0+ll_struc_size-4],0 - jz @f - mcall -1 ;exit not correct - @@: - -;--------------------------------------------------------------------- - stdcall [tl_data_init], tree1 - -; читаем файл с курсорами и линиями - include_image_file '..\..\media\log_el\trunk\tl_sys_16.png', icon_tl_sys - mov eax,[icon_tl_sys] - mov [tree1.data_img_sys],eax -;--------------------------------------------------------------------- -; читаем bmp файл с иконками узлов - include_image_file '..\t_edit\tl_nod_16.png', icon_tl_sys - mov eax,[icon_tl_sys] - mov [tree1.data_img],eax -;------------------------------------------------------------------------------ - copy_path fn_syntax_dir,sys_path,file_name,0 ;берем путь к папке с файлами синтаксиса - mcall SF_FILE,tree_file_struct - - cmp ebx,2 - jg @f - notify_window_run file_name ;сообщение если не удалось открыть файлы - jmp .end_dir_init - @@: - ;cmp ebx,0 - ;jle .end_dir_init - mov eax,dir_mem+32+40 - mov ecx,ebx - @@: - cmp byte[eax],'.' ;фильтруем файлы с именами '.' и '..' - je .filter - stdcall [tl_node_add],tree1,0x10000,eax ;1*2^16 - где 1 номер иконки с книгой - stdcall [tl_cur_next],tree1 - .filter: - add eax,304 - loop @b - stdcall [tl_cur_beg],tree1 ;ставим курсор на начало списка - or dword[tree1.style], tl_cursor_pos_limited ;ограничиваем движение курсора в пределах списка - .end_dir_init: - - xor eax,eax - inc eax - mov [scrol_w1.type],eax - mov [scrol_h1.type],eax - mov [ws_dir_lbox.type],eax - -;--- load color option file --- -stdcall [ted_init], tedit0 -mov byte[file_name],0 - -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 - jz mouse - - jmp still - - -align 4 -draw_window: - pushad - mcall SF_REDRAW,SSF_BEGIN_DRAW - - mov edx,[sc.work] - or edx,0x33000000 - mov edi,hed - mcall SF_CREATE_WINDOW,<10,555>,<10,333> - - mcall SF_THREAD_INFO,procinfo,-1 - mov edi,tedit0 ;значение edi нужно для EvSize и ted_wnd_t - call EvSize - - mov esi,[sc.work_button];0xd0 - mcall SF_DEFINE_BUTTON,5*65536+90,195*65536+20,200 - - mov ebx,100*65536+85 - mov ecx,195*65536+20 - mov edx,201 - mov esi,0xd00000 - mcall - - mov ecx,[sc.work_button_text] - or ecx,0x80000000 - mcall SF_DRAW_TEXT,10*65536+200,,txt_load_f - - mov ecx,0xffff00 - or ecx,0x80000000 - mcall ,105*65536+200,,txt_save_f - - mov ecx,[sc.work_text] - or ecx,0x80000000 - mcall ,195*65536+10,,txt_inp_file - - add ebx,20 - mov edx,txt_out_file - int 0x40 - - stdcall [PathShow_draw], PathShow_data_1 - - stdcall [edit_box_draw], edit1 - stdcall [tl_draw], tree1 - - ;scroll 1 - mov [ws_dir_lbox.all_redraw],1 - stdcall [scrollbar_ver_draw],ws_dir_lbox - stdcall [ted_draw], tedit0 - - mcall SF_REDRAW,SSF_END_DRAW - popad - ret - -MIN_M_WND_H equ 100 ;минимальная высота главного окна -;input: -; edi = pointer to tedit struct -align 4 -EvSize: - pushad - mov ebx,ted_scr_h - mov esi,ted_scr_w - - m2m ted_wnd_w,[procinfo.client_box.width] ;ставим ширину окна редактора равной ширине всего окна - mov eax,ted_wnd_l - sub ted_wnd_w,eax ;отнимаем отступ слева - movzx eax,word[esi+sb_offs_size_x] - sub ted_wnd_w,eax ;отнимаем ширину верт. скроллинга - - m2m ted_wnd_h,[procinfo.client_box.height] ;ставим высоту окна редактора равной высоте всего окна - cmp ted_wnd_h,MIN_M_WND_H - jg @f - mov ted_wnd_h,MIN_M_WND_H - @@: - - movzx eax,word[ebx+sb_offs_size_y] - sub ted_wnd_h,eax ;отнимаем высоту гориз. скроллинга - mov eax,ted_wnd_t - sub ted_wnd_h,eax ;отнимаем отступ сверху - - stdcall [ted_init_scroll_bars], tedit0,2 - popad - ret - -align 4 -mouse: - stdcall [tl_mouse],tree1 - stdcall [edit_box_mouse],edit1 - stdcall [ted_mouse], tedit0 - jmp still - -;output: -; ah = symbol -align 4 -proc KeyConvertToASCII, table:dword - push ebx - mov ebx,dword[table] ;convert scan to ascii - shr ax,8 - add bx,ax - mov ah,byte[ebx] - pop ebx - ret -endp - -align 4 -key: - mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS ;66.3 получить состояние управляющих клавиш - xor esi,esi - mov ecx,1 - test al,3 ;[Shift] - jz @f - mov cl,2 - or esi,KM_SHIFT - @@: - test al,0x0c ;[Ctrl] - jz @f - or esi,KM_CTRL - @@: - test al,0x30 ;[Alt] - jz @f - mov cl,3 - or esi,KM_ALT - @@: - test al,0x80 ;[NumLock] - jz @f - or esi,KM_NUMLOCK - @@: - - mcall SF_SYSTEM_GET,SSF_KEYBOARD_LAYOUT,,conv_tabl ;26.2 получить раскладку клавиатуры - mcall SF_GET_KEY - stdcall [tl_key],tree1 - - test word [edit1.flags],10b;ed_focus ; если не в фокусе, выходим - je @f - cmp ah,0x80 ;if key up - ja still - cmp ah,42 ;[Shift] (left) - je still - cmp ah,54 ;[Shift] (right) - je still - cmp ah,56 ;[Alt] - je still - cmp ah,29 ;[Ctrl] - je still - cmp ah,69 ;[Pause Break] - je still - - stdcall KeyConvertToASCII, conv_tabl - stdcall [edit_box_key],edit1 - jmp still - @@: - - stdcall [ted_key], tedit0, conv_tabl,esi - jmp still - -align 4 -button: - mcall SF_GET_BUTTON - - cmp ah,200 - jne @f - call but_OpenSyntax - @@: - cmp ah,201 - jne @f - call but_SaveSyntax - @@: - - cmp ah,1 - jne still -.exit: - stdcall mem.Free,[options_file] - stdcall mem.Free,[unpac_mem] - - stdcall [tl_data_clear], tree1 - stdcall [ted_delete], tedit0 - mcall SF_TERMINATE_PROCESS ;выход из программы - -align 4 -but_OpenSyntax: -push eax - stdcall [tl_node_get_data],tree1 - mov [fn_col_option],eax - call InitColText -pop eax - ret - -align 4 -but_SaveSyntax: - stdcall [ted_save_file], tedit0,run_file_70,[edit1.text] - ret - -;description: -; функция вызываемую при нажатии Ctrl+N,O,F,S,H,G -align 4 -proc ted_but_ctrl_all uses eax, opt_key:dword - mov eax,[opt_key] - cmp al,'N' ;Ctrl+N - jne @f - call but_ctrl_n - jmp .end0 - @@: - cmp al,'O' ;Ctrl+O - jne @f - call but_ctrl_o - @@: - ;cmp al,'S' ;Ctrl+S - ;cmp al,'F' ;Ctrl+F - ;cmp al,'G' ;Ctrl+G - ;cmp al,'H' ;Ctrl+H - .end0: - ret -endp - -align 4 -but_ctrl_o: - push eax - call get_wnd_in_focus - or eax,eax - jz @f - stdcall [ted_open_file], eax,str_file_70,[edit1.text] - @@: - pop eax - ret - -;создание нового файла -align 4 -but_ctrl_n: - push eax - call get_wnd_in_focus - or eax,eax - jz @f - stdcall [ted_clear], eax,1 - stdcall [ted_draw], eax - @@: - pop eax - ret - -;определяем какое из окон редактора в фокусе -align 4 -get_wnd_in_focus: - xor eax,eax - cmp dword[el_focus],tedit0 - jne @f - mov eax,tedit0 - @@: - ;cmp dword[el_focus],tedit1 - ;jne @f - ; mov eax,tedit1 - ;@@: - ret - -hed db 'TextEditor syntax file converter 18.12.20',0 ;подпись окна -conv_tabl rb 128 ; таблица для конвертирования scan-кода в ascii-код - -txt_load_f db 'Загр. файл',0 -txt_save_f db 'Сохр. файл',0 -txt_inp_file db 'Исх. файл:',0 -txt_out_file db 'Вых. файл:',0 - -;library structures -l_libs_start: - lib0 l_libs lib_name_0, file_name, system_dir_0, import_box_lib - lib1 l_libs lib_name_1, file_name, system_dir_1, import_libimg -load_lib_end: - -IncludeIGlobals - -align 16 -i_end: -IncludeUGlobals - procinfo process_information - rb 1024 -thread: - rb 1024 -stacktop: - sys_path rb 4096 - file_name rb 4096 - file_name_rez rb 4096 -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, file_name, sys_path + +MAX_COLOR_WORD_LEN equ 40 +BUF_SIZE equ 4096 ;buffer for copy|paste +CAPT_PATH_WIDTH equ 50 ;ширина подписи перед текстовым полем + +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 '../../system/skincfg/trunk/kglobals.inc' +include '../../system/skincfg/trunk/unpacker.inc' +include 'te_data.inc' +include 'te_work.inc' ;text work functions + +@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load + +icon_tl_sys dd 0 ;указатель на память для хранения системных иконок + +align 4 +start: + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors + + mcall SF_SYS_MISC,SSF_HEAP_INIT + or eax,eax + jz button.exit + + mcall SF_KEYBOARD,SSF_SET_INPUT_MODE,1 ;scan code + mcall SF_SET_EVENTS_MASK,0xC0000027 + + load_libraries l_libs_start,load_lib_end + + ;проверка на сколько удачно загузилась библиотека + cmp dword[lib0+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + +;--------------------------------------------------------------------- + stdcall [tl_data_init], tree1 + +; читаем файл с курсорами и линиями + include_image_file '..\..\media\log_el\trunk\tl_sys_16.png', icon_tl_sys + mov eax,[icon_tl_sys] + mov [tree1.data_img_sys],eax +;--------------------------------------------------------------------- +; читаем bmp файл с иконками узлов + include_image_file '..\t_edit\tl_nod_16.png', icon_tl_sys + mov eax,[icon_tl_sys] + mov [tree1.data_img],eax +;------------------------------------------------------------------------------ + copy_path fn_syntax_dir,sys_path,file_name,0 ;берем путь к папке с файлами синтаксиса + mcall SF_FILE,tree_file_struct + + cmp ebx,2 + jg @f + notify_window_run file_name ;сообщение если не удалось открыть файлы + jmp .end_dir_init + @@: + ;cmp ebx,0 + ;jle .end_dir_init + mov eax,dir_mem+32+40 + mov ecx,ebx + @@: + cmp byte[eax],'.' ;фильтруем файлы с именами '.' и '..' + je .filter + stdcall [tl_node_add],tree1,0x10000,eax ;1*2^16 - где 1 номер иконки с книгой + stdcall [tl_cur_next],tree1 + .filter: + add eax,304 + loop @b + stdcall [tl_cur_beg],tree1 ;ставим курсор на начало списка + or dword[tree1.style], tl_cursor_pos_limited ;ограничиваем движение курсора в пределах списка + .end_dir_init: + + xor eax,eax + inc eax + mov [scrol_w1.type],eax + mov [scrol_h1.type],eax + mov [ws_dir_lbox.type],eax + +;--- load color option file --- +stdcall [ted_init], tedit0 +mov byte[file_name],0 + +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 + jz mouse + + jmp still + + +align 4 +draw_window: + pushad + mcall SF_REDRAW,SSF_BEGIN_DRAW + + mov edx,[sc.work] + or edx,0x33000000 + mov edi,hed + mcall SF_CREATE_WINDOW,<10,555>,<10,333> + + mcall SF_THREAD_INFO,procinfo,-1 + mov edi,tedit0 ;значение edi нужно для EvSize и ted_wnd_t + call EvSize + + mov esi,[sc.work_button];0xd0 + mcall SF_DEFINE_BUTTON,5*65536+90,195*65536+20,200 + + mov ebx,100*65536+85 + mov ecx,195*65536+20 + mov edx,201 + mov esi,0xd00000 + mcall + + mov ecx,[sc.work_button_text] + or ecx,0x80000000 + mcall SF_DRAW_TEXT,10*65536+200,,txt_load_f + + mov ecx,0xffff00 + or ecx,0x80000000 + mcall ,105*65536+200,,txt_save_f + + mov ecx,[sc.work_text] + or ecx,0x80000000 + mcall ,195*65536+10,,txt_inp_file + + add ebx,20 + mov edx,txt_out_file + int 0x40 + + stdcall [PathShow_draw], PathShow_data_1 + + stdcall [edit_box_draw], edit1 + stdcall [tl_draw], tree1 + + ;scroll 1 + mov [ws_dir_lbox.all_redraw],1 + stdcall [scrollbar_ver_draw],ws_dir_lbox + stdcall [ted_draw], tedit0 + + mcall SF_REDRAW,SSF_END_DRAW + popad + ret + +MIN_M_WND_H equ 100 ;минимальная высота главного окна +;input: +; edi = pointer to tedit struct +align 4 +EvSize: + pushad + mov ebx,ted_scr_h + mov esi,ted_scr_w + + m2m ted_wnd_w,[procinfo.client_box.width] ;ставим ширину окна редактора равной ширине всего окна + mov eax,ted_wnd_l + sub ted_wnd_w,eax ;отнимаем отступ слева + movzx eax,word[esi+sb_offs_size_x] + sub ted_wnd_w,eax ;отнимаем ширину верт. скроллинга + + m2m ted_wnd_h,[procinfo.client_box.height] ;ставим высоту окна редактора равной высоте всего окна + cmp ted_wnd_h,MIN_M_WND_H + jg @f + mov ted_wnd_h,MIN_M_WND_H + @@: + + movzx eax,word[ebx+sb_offs_size_y] + sub ted_wnd_h,eax ;отнимаем высоту гориз. скроллинга + mov eax,ted_wnd_t + sub ted_wnd_h,eax ;отнимаем отступ сверху + + stdcall [ted_init_scroll_bars], tedit0,2 + popad + ret + +align 4 +mouse: + stdcall [tl_mouse],tree1 + stdcall [edit_box_mouse],edit1 + stdcall [ted_mouse], tedit0 + jmp still + +;output: +; ah = symbol +align 4 +proc KeyConvertToASCII, table:dword + push ebx + mov ebx,dword[table] ;convert scan to ascii + shr ax,8 + add bx,ax + mov ah,byte[ebx] + pop ebx + ret +endp + +align 4 +key: + mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS ;66.3 получить состояние управляющих клавиш + xor esi,esi + mov ecx,1 + test al,3 ;[Shift] + jz @f + mov cl,2 + or esi,KM_SHIFT + @@: + test al,0x0c ;[Ctrl] + jz @f + or esi,KM_CTRL + @@: + test al,0x30 ;[Alt] + jz @f + mov cl,3 + or esi,KM_ALT + @@: + test al,0x80 ;[NumLock] + jz @f + or esi,KM_NUMLOCK + @@: + + mcall SF_SYSTEM_GET,SSF_KEYBOARD_LAYOUT,,conv_tabl ;26.2 получить раскладку клавиатуры + mcall SF_GET_KEY + stdcall [tl_key],tree1 + + test word [edit1.flags],10b;ed_focus ; если не в фокусе, выходим + je @f + cmp ah,0x80 ;if key up + ja still + cmp ah,42 ;[Shift] (left) + je still + cmp ah,54 ;[Shift] (right) + je still + cmp ah,56 ;[Alt] + je still + cmp ah,29 ;[Ctrl] + je still + cmp ah,69 ;[Pause Break] + je still + + stdcall KeyConvertToASCII, conv_tabl + stdcall [edit_box_key],edit1 + jmp still + @@: + + stdcall [ted_key], tedit0, conv_tabl,esi + jmp still + +align 4 +button: + mcall SF_GET_BUTTON + + cmp ah,200 + jne @f + call but_OpenSyntax + @@: + cmp ah,201 + jne @f + call but_SaveSyntax + @@: + + cmp ah,1 + jne still +.exit: + stdcall mem.Free,[options_file] + stdcall mem.Free,[unpac_mem] + + stdcall [tl_data_clear], tree1 + stdcall [ted_delete], tedit0 + mcall SF_TERMINATE_PROCESS ;выход из программы + +align 4 +but_OpenSyntax: +push eax + stdcall [tl_node_get_data],tree1 + mov [fn_col_option],eax + call InitColText +pop eax + ret + +align 4 +but_SaveSyntax: + stdcall [ted_save_file], tedit0,run_file_70,[edit1.text] + ret + +;description: +; функция вызываемую при нажатии Ctrl+N,O,F,S,H,G +align 4 +proc ted_but_ctrl_all uses eax, opt_key:dword + mov eax,[opt_key] + cmp al,'N' ;Ctrl+N + jne @f + call but_ctrl_n + jmp .end0 + @@: + cmp al,'O' ;Ctrl+O + jne @f + call but_ctrl_o + @@: + ;cmp al,'S' ;Ctrl+S + ;cmp al,'F' ;Ctrl+F + ;cmp al,'G' ;Ctrl+G + ;cmp al,'H' ;Ctrl+H + .end0: + ret +endp + +align 4 +but_ctrl_o: + push eax + call get_wnd_in_focus + or eax,eax + jz @f + stdcall [ted_open_file], eax,str_file_70,[edit1.text] + @@: + pop eax + ret + +;создание нового файла +align 4 +but_ctrl_n: + push eax + call get_wnd_in_focus + or eax,eax + jz @f + stdcall [ted_clear], eax,1 + stdcall [ted_draw], eax + @@: + pop eax + ret + +;определяем какое из окон редактора в фокусе +align 4 +get_wnd_in_focus: + xor eax,eax + cmp dword[el_focus],tedit0 + jne @f + mov eax,tedit0 + @@: + ;cmp dword[el_focus],tedit1 + ;jne @f + ; mov eax,tedit1 + ;@@: + ret + +hed db 'TextEditor syntax file converter 18.12.20',0 ;подпись окна +conv_tabl rb 128 ; таблица для конвертирования scan-кода в ascii-код + +txt_load_f db 'Загр. файл',0 +txt_save_f db 'Сохр. файл',0 +txt_inp_file db 'Исх. файл:',0 +txt_out_file db 'Вых. файл:',0 + +;library structures +l_libs_start: + lib0 l_libs lib_name_0, file_name, system_dir_0, import_box_lib + lib1 l_libs lib_name_1, file_name, system_dir_1, import_libimg +load_lib_end: + +IncludeIGlobals + +align 16 +i_end: +IncludeUGlobals + procinfo process_information + rb 1024 +thread: + rb 1024 +stacktop: + sys_path rb 4096 + file_name rb 4096 + file_name_rez rb 4096 +mem: 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/RunOD/RunOD.asm b/programs/system/RunOD/RunOD.asm index 14f90fcbb..6f6a1c83f 100644 --- a/programs/system/RunOD/RunOD.asm +++ b/programs/system/RunOD/RunOD.asm @@ -1 +1,709 @@ - ; Run with OpenDialog ; org 0 use32 STACK_SIZE equ 256 REDRAW_EVENT equ 1 KEY_EVENT equ 2 BUTTON_EVENT equ 3 MOUSE_EVENT equ 6 BUTTON_RUN equ 10 BUTTON_BROWSE equ 20 MENUET01 db 'MENUET01' version dd 1 program.start dd start_ program.end dd data_ program.memory dd end_ + STACK_SIZE program.stack dd end_ + STACK_SIZE program.params dd 0 program.path dd 0 include 'lang.inc' include '../../develop/libraries/box_lib/trunk/box_lib.mac' ; ======================================================================= ; start_: mov byte [file_info], 7 ; set.event mov eax, 40 mov ebx, 39 int 64 push sz_box_lib call load.library mov [box_lib], eax push dword[box_lib] push sz_edit_box call getprocaddress mov [edit_box_draw], eax push dword[box_lib] push sz_edit_box_key call getprocaddress mov [edit_box_key], eax push dword[box_lib] push sz_edit_box_mouse call getprocaddress mov [edit_box_mouse], eax push dword[box_lib] push sz_edit_box_set_text call getprocaddress mov [edit_box_set_text], eax push sz_proc_lib call load.library mov [proc_lib], eax push dword[proc_lib] push sz_OpenDialog_init call getprocaddress mov [opendialog_init], eax push dword[proc_lib] push sz_OpenDialog_start call getprocaddress mov [opendialog_start], eax ; memory.allocate: mov eax, 68 mov ebx, 12 mov ecx, 4096 + 4096 + 4096 int 64 mov [od.procinfo], eax add eax, 1024 mov [od.filename_area], eax add eax, 4096 - 1024 mov [od.opendir_path], eax add eax, 4096 mov [od.openfile_path], eax push od call [opendialog_init] ; get.screen.size mov eax, 61 mov ebx, 1 int 64 mov [screen], eax movzx eax, word[screen.width] shr eax, 3 lea eax, [eax*2 + eax] add eax, 90 mov [window.width], eax ; skin.height mov eax, 48 mov ebx, 4 int 64 add eax, 100 mov [window.height], eax movzx eax, word[screen.width] sub eax, [window.width] shr eax, 1 mov [window.left], eax movzx eax, word[screen.height] sub eax, [window.height] sub eax, 100 mov [window.top], eax mov eax, [window.width] sub eax, 80 mov [edit1.width], eax mov eax, [od.openfile_path] mov [edit1.text], eax call on_redraw ; ----------------------- ; .loop: ; wait.event mov eax, 10 int 64 cmp eax, REDRAW_EVENT jne .check_key call on_redraw jmp .loop ; ----------------------- ; .check_key: cmp eax, KEY_EVENT jne .check_button mov eax, 2 int 64 cmp ah, 13 jne .no_key_enter call on_button_run jmp .loop ; ----------------------- ; .no_key_enter: cmp ah, 185 jne .no_key_insert call on_button_browse jmp .loop .no_key_insert: push edit1 call [edit_box_key] jmp .loop ; ----------------------- ; .check_button: cmp eax, BUTTON_EVENT jne .check_mouse ; get.button.number mov eax, 17 int 64 cmp ah, 1 jne .check_button_run ; program.terminate or eax, -1 int 64 ; ----------------------- ; .check_button_run: cmp ah, BUTTON_RUN jne .check_button_browse call on_button_run jmp .loop ; ----------------------- ; .check_button_browse: cmp ah, BUTTON_BROWSE jne .loop call on_button_browse jmp .loop ; ----------------------- ; .check_mouse: cmp eax, MOUSE_EVENT jne .loop push edit1 call [edit_box_mouse] jmp .loop ; ======================================================================= ; on_button_run: push dword[edit1.text] call extractrunpathandparams ;file.run: mov eax, 70 mov ebx, file_info int 64 mov dl, byte[lastendpath] mov ecx, [ptrlastendpath] mov [ecx], dl test eax, eax jnge .error mov [runresult], dword sz_Program_run_successfully jmp .exit .error: ; ----------------------- ; .5: cmp al, -5 jne .31 mov [runresult], dword sz_File_not_found jmp .exit ; ----------------------- ; .31: cmp al, -31 jne .32 mov [runresult], dword sz_File_is_not_executable jmp .exit ; ----------------------- ; .32: cmp al, -32 jne .10 mov [runresult], dword sz_Too_many_processes jmp .exit ; ----------------------- ; .10: cmp al, -10 jne .30 mov [runresult], dword sz_Access_denied jmp .exit ; ----------------------- ; .30: cmp al, -30 jne .unknown mov [runresult], dword sz_Out_of_memory jmp .exit ; ----------------------- ; .unknown: mov [runresult], dword sz_Unknown_error ; ----------------------- ; .exit: call on_redraw ret ; ======================================================================= ; on_button_browse: push od call [opendialog_start] mov eax, [od.status] test eax, eax je .exit ;======== if space exist in filepath, then quote filepath mov eax, [od.openfile_path] ; ----------------------- ; .check_space: cmp [eax], byte 0 je .no_space cmp [eax], byte 32 ;space je .space inc eax jmp .check_space .space: ; ----------------------- ; .find_end_zero: inc eax cmp [eax], byte 0 jne .find_end_zero mov [eax + 2], byte 0 mov [eax + 1], byte 34 ; quote ; ----------------------- ; .shift_path: dec eax mov dl, byte [eax ] mov [eax + 1], dl cmp eax, [od.openfile_path] jne .shift_path mov [eax ], byte 34 ; quote .no_space: ;================================= push dword[od.openfile_path] push edit1 call [edit_box_set_text] ; ----------------------- ; .exit: ret ; ======================================================================= ; on_redraw: ; redraw.start mov eax, 12 mov ebx, 1 int 64 ; get.standart.colors mov eax, 48 mov ebx, 3 mov ecx, sc mov edx, 40 int 64 mov eax, [sc.work_graph] mov [edit1.shift_color], eax mov eax, [sc.work_graph] mov [edit1.focus_border_color], eax mov eax, [sc.frames] mov [edit1.blur_border_color], eax mov eax, [sc.work_text] bts eax, 28 mov [edit1.text_color], eax ; draw.window xor eax, eax mov ebx, [window.left] shl ebx, 16 add ebx, [window.width] mov ecx, [window.top] shl ecx, 16 add ecx, [window.height] mov edx, [sc.work] or edx, 34000000h mov edi, title int 64 push 5 push 5 push sz_Type_name_of_program push dword [sc.work_text] call draw.text ; ====================| browse button |==================== push 20 mov eax, [window.width] sub eax, 70 push eax push 26 push 52 push 21 call draw.button mov eax, [window.width] sub eax, 56 push eax push 29 push sz_browse push dword [sc.work_button_text] call draw.text ; ====================| run button |==================== push 10 push 5 push 52 mov eax, [window.width] sub eax, 22 push eax push 21 call draw.button mov eax, [window.width] shr eax, 1 sub eax, 40 push eax push 55 push sz_run push dword [sc.work_button_text] call draw.text ; ===================================================== push 5 push 80 push dword[runresult] push dword [sc.work_text] call draw.text push edit1 call [edit_box_draw] ; redraw.finish mov eax, 12 mov ebx, 2 int 64 ret ; ======================================================================= ; extractrunpathandparams: xor ecx, ecx mov eax, [esp + 4] mov [runpath], eax movzx eax, byte [eax] cmp eax, 34 jne .start_without_quote inc ecx ; ----------------------- ; .loop1: mov eax, [runpath] movzx eax, byte [eax + ecx] cmp eax, 34 jne .not_quote mov eax, [runpath] mov [eax + ecx], byte 0 mov eax, [runpath] add eax, ecx mov [ptrlastendpath], eax mov [lastendpath], byte 34 inc ecx ; ----------------------- ; .skip_space1: mov eax, [runpath] movzx eax, byte [eax + ecx] cmp al, 32 jne .skipped1 inc ecx jmp .skip_space1 ; ----------------------- ; .skipped1: mov eax, [runpath] add eax, ecx mov [runparams], eax inc dword [runpath] jmp .exit ; ----------------------- ; .not_quote: mov eax, [runpath] movzx eax, byte [eax + ecx] test eax, eax jne .not_zero1 mov eax, [runpath] add eax, ecx mov [runparams], eax mov eax, [runpath] add eax, ecx mov [ptrlastendpath], eax mov [lastendpath], byte 0 jmp .exit ; ----------------------- ; .not_zero1: inc ecx jmp .loop1 ; ----------------------- ; .start_without_quote: ; ----------------------- ; .loop2: mov eax, [runpath] movzx eax, byte [eax + ecx] cmp eax, 32 jne .not_space mov eax, [runpath] mov [eax + ecx], byte 0 mov eax, [runpath] add eax, ecx mov [ptrlastendpath], eax mov [lastendpath], byte 32 inc ecx ; ----------------------- ; .skip_space2: mov eax, [runpath] movzx eax, byte [eax + ecx] cmp al, 32 jne .skipped2 inc ecx jmp .skip_space2 ; ----------------------- ; .skipped2: mov eax, [runpath] add eax, ecx mov [runparams], eax jmp .exit ; ----------------------- ; .not_space: mov eax, [runpath] movzx eax, byte [eax + ecx] test eax, eax jne .not_zero2 mov eax, [runpath] add eax, ecx mov [runparams], eax mov eax, [runpath] add eax, ecx mov [ptrlastendpath], eax mov [lastendpath], byte 0 jmp .exit ; ----------------------- ; .not_zero2: inc ecx jmp .loop2 ; ----------------------- ; .exit: ret 4 ; ======================================================================= ; draw.button: mov eax, 8 mov ebx, [esp + 16] shl ebx, 16 add ebx, [esp + 8] mov ecx, [esp + 12] shl ecx, 16 add ecx, [esp + 4] mov edx, [esp + 20] mov esi, [sc.work_button] int 64 ret 20 ; ======================================================================= ; draw.text: mov eax, 4 mov ebx, [esp + 16] shl ebx, 16 add ebx, [esp + 12] mov ecx, [esp + 4] or ecx, 90000000h mov edx, [esp + 8] int 64 ret 16 ; ======================================================================= ; load.library: mov eax, 68 mov ebx, 19 mov ecx, [esp + 4] int 64 ret 4 ; ======================================================================= ; getprocaddress: mov edx, [esp + 8] ; hlib xor eax, eax test edx, edx ; If hlib = 0 then goto .end jz .end ; ----------------------- ; .next: cmp [edx], dword 0 ; If end of export table then goto .end jz .end xor eax, eax mov esi, [edx] mov edi, [esp + 4] ; name ; ----------------------- ; .next_: lodsb scasb jne .fail or al, al jnz .next_ jmp .ok ; ----------------------- ; .fail: add edx, 8 jmp .next ; ----------------------- ; .ok: ; return address mov eax, [edx + 4] ; ----------------------- ; .end: ret 8 data_: sz_box_lib db "/sys/lib/box_lib.obj",0 sz_edit_box db "edit_box",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_proc_lib db "/sys/lib/proc_lib.obj",0 sz_OpenDialog_init db "OpenDialog_init",0 sz_OpenDialog_start db "OpenDialog_start",0 sz_FFFFFFFF_open_dialog db "FFFFFFFF_open_dialog",0 sz_SYS db "/sys",0 sz_opendial_path db "/sys/File managers/opendial",0 if lang eq it_IT sz_Program_run_successfully db "Programma eseguito correttamente",0 sz_File_not_found db "File non trovato",0 sz_File_is_not_executable db "File non eseguibile",0 sz_Too_many_processes db "Troppi processi",0 sz_Access_denied db "Accesso negato",0 sz_Out_of_memory db "Out of memory",0 sz_Unknown_error db "Errore sconosciuto",0 sz_Type_name_of_program db "Digita il nome del programma per eseguirlo",0 sz_run db " Esegui",0 sz_browse db "Browse",0 title db "Esegui",0 else if lang eq ru_RU sz_Program_run_successfully db "Программа запущена успешно",0 sz_File_not_found db "Файл не найден",0 sz_File_is_not_executable db "Файл не является исполняемым",0 sz_Too_many_processes db "Слишком много процессов",0 sz_Access_denied db "Доступ запрещен",0 sz_Out_of_memory db "Недостаточно памяти",0 sz_Unknown_error db "Неизвестная ошибка",0 sz_Type_name_of_program db "Введите название программы",0 sz_run db "Запустить",0 sz_browse db "...",0 title db "Запуск программы",0 else sz_Program_run_successfully db "Program run successfully",0 sz_File_not_found db "File not found",0 sz_File_is_not_executable db "File is not executable",0 sz_Too_many_processes db "Too many processes",0 sz_Access_denied db "Access denied",0 sz_Out_of_memory db "Out of memory",0 sz_Unknown_error db "Unknown error",0 sz_Type_name_of_program db "Type name of program to run",0 sz_run db " Run",0 sz_browse db "...",0 title db "Run",0 end if align 4 od: .mode dd 0 .procinfo dd 0 .com_area_name dd sz_FFFFFFFF_open_dialog .com_area dd 0 .opendir_path dd 0 .dir_default_path dd sz_SYS .start_path dd sz_opendial_path .draw_window dd on_redraw .status dd 0 .openfile_path dd 0 .filename_area dd 0 .filter_area dd filefilter .x_size dw 414 .x_start dw 0 .y_size dw 414 .y_start dw 0 runresult dd sz_empty edit1 edit_box 0, 5, 26, 0ffffffh, 0, 0, 0, 0, 4096, 0, 0, 4002h box_lib dd ? proc_lib dd ? filefilter dd ? ptrlastendpath dd ? edit_box_draw dd ? edit_box_key dd ? edit_box_mouse dd ? edit_box_set_text dd ? opendialog_init dd ? opendialog_start dd ? sc: .frames dd ? .grab dd ? .grab_button dd ? .grab_button_text dd ? .grab_text dd ? .work dd ? .work_button dd ? .work_button_text dd ? .work_text dd ? .work_graph dd ? window: .left dd ? .top dd ? .width dd ? .height dd ? screen: .height dw ? .width dw ? file_info: dd ? dd ? runparams: dd ? dd ? dd ? db ? runpath: dd ? lastendpath db ? sz_empty db ? align 4 end_: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + + ; Run with OpenDialog ; + +org 0 +use32 + +STACK_SIZE equ 256 +REDRAW_EVENT equ 1 +KEY_EVENT equ 2 +BUTTON_EVENT equ 3 +MOUSE_EVENT equ 6 + +BUTTON_RUN equ 10 +BUTTON_BROWSE equ 20 + +MENUET01 db 'MENUET01' +version dd 1 +program.start dd start_ +program.end dd data_ +program.memory dd end_ + STACK_SIZE +program.stack dd end_ + STACK_SIZE +program.params dd 0 +program.path dd 0 + +include 'lang.inc' +include '../../develop/libraries/box_lib/box_lib.mac' + +; ======================================================================= ; +start_: + mov byte [file_info], 7 +; set.event + mov eax, 40 + mov ebx, 39 + int 64 + + push sz_box_lib + call load.library + mov [box_lib], eax + + push dword[box_lib] + push sz_edit_box + call getprocaddress + mov [edit_box_draw], eax + + push dword[box_lib] + push sz_edit_box_key + call getprocaddress + mov [edit_box_key], eax + + push dword[box_lib] + push sz_edit_box_mouse + call getprocaddress + mov [edit_box_mouse], eax + + push dword[box_lib] + push sz_edit_box_set_text + call getprocaddress + mov [edit_box_set_text], eax + + push sz_proc_lib + call load.library + mov [proc_lib], eax + + push dword[proc_lib] + push sz_OpenDialog_init + call getprocaddress + mov [opendialog_init], eax + + push dword[proc_lib] + push sz_OpenDialog_start + call getprocaddress + mov [opendialog_start], eax + + +; memory.allocate: + mov eax, 68 + mov ebx, 12 + mov ecx, 4096 + 4096 + 4096 + int 64 + + mov [od.procinfo], eax + + add eax, 1024 + mov [od.filename_area], eax + + add eax, 4096 - 1024 + mov [od.opendir_path], eax + + add eax, 4096 + mov [od.openfile_path], eax + + push od + call [opendialog_init] + + +; get.screen.size + mov eax, 61 + mov ebx, 1 + int 64 + + mov [screen], eax + movzx eax, word[screen.width] + shr eax, 3 + lea eax, [eax*2 + eax] + add eax, 90 + mov [window.width], eax + +; skin.height + mov eax, 48 + mov ebx, 4 + int 64 + + add eax, 100 + mov [window.height], eax + + movzx eax, word[screen.width] + sub eax, [window.width] + shr eax, 1 + mov [window.left], eax + + movzx eax, word[screen.height] + sub eax, [window.height] + sub eax, 100 + mov [window.top], eax + + mov eax, [window.width] + sub eax, 80 + mov [edit1.width], eax + + mov eax, [od.openfile_path] + mov [edit1.text], eax + + + call on_redraw +; ----------------------- ; +.loop: +; wait.event + mov eax, 10 + int 64 + cmp eax, REDRAW_EVENT + jne .check_key + call on_redraw + jmp .loop +; ----------------------- ; +.check_key: + cmp eax, KEY_EVENT + jne .check_button + mov eax, 2 + int 64 + cmp ah, 13 + jne .no_key_enter + call on_button_run + jmp .loop +; ----------------------- ; +.no_key_enter: + cmp ah, 185 + jne .no_key_insert + call on_button_browse + jmp .loop +.no_key_insert: + push edit1 + call [edit_box_key] + jmp .loop +; ----------------------- ; +.check_button: + cmp eax, BUTTON_EVENT + jne .check_mouse +; get.button.number + mov eax, 17 + int 64 + cmp ah, 1 + jne .check_button_run +; program.terminate + or eax, -1 + int 64 +; ----------------------- ; +.check_button_run: + cmp ah, BUTTON_RUN + jne .check_button_browse + call on_button_run + jmp .loop +; ----------------------- ; +.check_button_browse: + cmp ah, BUTTON_BROWSE + jne .loop + call on_button_browse + jmp .loop +; ----------------------- ; +.check_mouse: + cmp eax, MOUSE_EVENT + jne .loop + push edit1 + call [edit_box_mouse] + jmp .loop + + +; ======================================================================= ; +on_button_run: + push dword[edit1.text] + call extractrunpathandparams + +;file.run: + mov eax, 70 + mov ebx, file_info + int 64 + + mov dl, byte[lastendpath] + mov ecx, [ptrlastendpath] + mov [ecx], dl + + test eax, eax + jnge .error + mov [runresult], dword sz_Program_run_successfully + jmp .exit + +.error: +; ----------------------- ; +.5: + cmp al, -5 + jne .31 + mov [runresult], dword sz_File_not_found + jmp .exit +; ----------------------- ; +.31: + cmp al, -31 + jne .32 + mov [runresult], dword sz_File_is_not_executable + jmp .exit +; ----------------------- ; +.32: + cmp al, -32 + jne .10 + mov [runresult], dword sz_Too_many_processes + jmp .exit +; ----------------------- ; +.10: + cmp al, -10 + jne .30 + mov [runresult], dword sz_Access_denied + jmp .exit +; ----------------------- ; +.30: + cmp al, -30 + jne .unknown + mov [runresult], dword sz_Out_of_memory + jmp .exit +; ----------------------- ; +.unknown: + mov [runresult], dword sz_Unknown_error +; ----------------------- ; +.exit: + call on_redraw + ret + +; ======================================================================= ; +on_button_browse: + push od + call [opendialog_start] + + mov eax, [od.status] + test eax, eax + je .exit + +;======== if space exist in filepath, then quote filepath + mov eax, [od.openfile_path] +; ----------------------- ; +.check_space: + cmp [eax], byte 0 + je .no_space + cmp [eax], byte 32 ;space + je .space + inc eax + jmp .check_space +.space: +; ----------------------- ; +.find_end_zero: + inc eax + cmp [eax], byte 0 + jne .find_end_zero + mov [eax + 2], byte 0 + mov [eax + 1], byte 34 ; quote +; ----------------------- ; +.shift_path: + dec eax + + mov dl, byte [eax ] + mov [eax + 1], dl + + cmp eax, [od.openfile_path] + jne .shift_path + mov [eax ], byte 34 ; quote + +.no_space: +;================================= + + push dword[od.openfile_path] + push edit1 + call [edit_box_set_text] +; ----------------------- ; +.exit: + ret + + +; ======================================================================= ; +on_redraw: +; redraw.start + mov eax, 12 + mov ebx, 1 + int 64 +; get.standart.colors + mov eax, 48 + mov ebx, 3 + mov ecx, sc + mov edx, 40 + int 64 + + mov eax, [sc.work_graph] + mov [edit1.shift_color], eax + + mov eax, [sc.work_graph] + mov [edit1.focus_border_color], eax + + mov eax, [sc.frames] + mov [edit1.blur_border_color], eax + + mov eax, [sc.work_text] + bts eax, 28 + mov [edit1.text_color], eax + +; draw.window + xor eax, eax + mov ebx, [window.left] + shl ebx, 16 + add ebx, [window.width] + mov ecx, [window.top] + shl ecx, 16 + add ecx, [window.height] + mov edx, [sc.work] + or edx, 34000000h + mov edi, title + int 64 + + push 5 + push 5 + push sz_Type_name_of_program + push dword [sc.work_text] + call draw.text +; ====================| browse button |==================== + push 20 + mov eax, [window.width] + sub eax, 70 + push eax + push 26 + push 52 + push 21 + call draw.button + + mov eax, [window.width] + sub eax, 56 + push eax + push 29 + push sz_browse + push dword [sc.work_button_text] + call draw.text +; ====================| run button |==================== + push 10 + push 5 + push 52 + mov eax, [window.width] + sub eax, 22 + push eax + push 21 + call draw.button + + mov eax, [window.width] + shr eax, 1 + sub eax, 40 + push eax + push 55 + push sz_run + push dword [sc.work_button_text] + call draw.text + ; ===================================================== + push 5 + push 80 + push dword[runresult] + push dword [sc.work_text] + call draw.text + + push edit1 + call [edit_box_draw] + +; redraw.finish + mov eax, 12 + mov ebx, 2 + int 64 + + ret + + +; ======================================================================= ; +extractrunpathandparams: + xor ecx, ecx + + mov eax, [esp + 4] + mov [runpath], eax + + movzx eax, byte [eax] + cmp eax, 34 + jne .start_without_quote + + inc ecx +; ----------------------- ; +.loop1: + mov eax, [runpath] + movzx eax, byte [eax + ecx] + cmp eax, 34 + jne .not_quote + + mov eax, [runpath] + mov [eax + ecx], byte 0 + + mov eax, [runpath] + add eax, ecx + mov [ptrlastendpath], eax + mov [lastendpath], byte 34 + inc ecx +; ----------------------- ; +.skip_space1: + mov eax, [runpath] + movzx eax, byte [eax + ecx] + cmp al, 32 + jne .skipped1 + inc ecx + jmp .skip_space1 +; ----------------------- ; +.skipped1: + mov eax, [runpath] + add eax, ecx + mov [runparams], eax + inc dword [runpath] + jmp .exit +; ----------------------- ; +.not_quote: + mov eax, [runpath] + movzx eax, byte [eax + ecx] + + test eax, eax + jne .not_zero1 + mov eax, [runpath] + add eax, ecx + mov [runparams], eax + mov eax, [runpath] + add eax, ecx + mov [ptrlastendpath], eax + mov [lastendpath], byte 0 + jmp .exit +; ----------------------- ; +.not_zero1: + inc ecx + jmp .loop1 +; ----------------------- ; +.start_without_quote: +; ----------------------- ; +.loop2: + mov eax, [runpath] + movzx eax, byte [eax + ecx] + cmp eax, 32 + jne .not_space + + mov eax, [runpath] + mov [eax + ecx], byte 0 + + mov eax, [runpath] + add eax, ecx + mov [ptrlastendpath], eax + mov [lastendpath], byte 32 + inc ecx +; ----------------------- ; +.skip_space2: + mov eax, [runpath] + movzx eax, byte [eax + ecx] + cmp al, 32 + jne .skipped2 + inc ecx + jmp .skip_space2 +; ----------------------- ; +.skipped2: + mov eax, [runpath] + add eax, ecx + mov [runparams], eax + jmp .exit +; ----------------------- ; +.not_space: + mov eax, [runpath] + movzx eax, byte [eax + ecx] + + test eax, eax + jne .not_zero2 + mov eax, [runpath] + add eax, ecx + mov [runparams], eax + mov eax, [runpath] + add eax, ecx + mov [ptrlastendpath], eax + mov [lastendpath], byte 0 + jmp .exit +; ----------------------- ; +.not_zero2: + inc ecx + jmp .loop2 +; ----------------------- ; +.exit: + ret 4 + +; ======================================================================= ; +draw.button: + mov eax, 8 + mov ebx, [esp + 16] + shl ebx, 16 + add ebx, [esp + 8] + mov ecx, [esp + 12] + shl ecx, 16 + add ecx, [esp + 4] + mov edx, [esp + 20] + mov esi, [sc.work_button] + int 64 + ret 20 +; ======================================================================= ; +draw.text: + mov eax, 4 + mov ebx, [esp + 16] + shl ebx, 16 + add ebx, [esp + 12] + mov ecx, [esp + 4] + or ecx, 90000000h + mov edx, [esp + 8] + int 64 + ret 16 +; ======================================================================= ; +load.library: + mov eax, 68 + mov ebx, 19 + mov ecx, [esp + 4] + int 64 + ret 4 +; ======================================================================= ; +getprocaddress: + mov edx, [esp + 8] ; hlib + xor eax, eax + test edx, edx ; If hlib = 0 then goto .end + jz .end +; ----------------------- ; +.next: + cmp [edx], dword 0 ; If end of export table then goto .end + jz .end + + xor eax, eax + mov esi, [edx] + mov edi, [esp + 4] ; name +; ----------------------- ; +.next_: + lodsb + scasb + jne .fail + or al, al + jnz .next_ + jmp .ok +; ----------------------- ; +.fail: + add edx, 8 + jmp .next +; ----------------------- ; +.ok: ; return address + mov eax, [edx + 4] +; ----------------------- ; +.end: + ret 8 + +data_: + +sz_box_lib db "/sys/lib/box_lib.obj",0 +sz_edit_box db "edit_box",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_proc_lib db "/sys/lib/proc_lib.obj",0 +sz_OpenDialog_init db "OpenDialog_init",0 +sz_OpenDialog_start db "OpenDialog_start",0 +sz_FFFFFFFF_open_dialog db "FFFFFFFF_open_dialog",0 +sz_SYS db "/sys",0 +sz_opendial_path db "/sys/File managers/opendial",0 + +if lang eq it_IT + sz_Program_run_successfully db "Programma eseguito correttamente",0 + sz_File_not_found db "File non trovato",0 + sz_File_is_not_executable db "File non eseguibile",0 + sz_Too_many_processes db "Troppi processi",0 + sz_Access_denied db "Accesso negato",0 + sz_Out_of_memory db "Out of memory",0 + sz_Unknown_error db "Errore sconosciuto",0 + sz_Type_name_of_program db "Digita il nome del programma per eseguirlo",0 + sz_run db " Esegui",0 + sz_browse db "Browse",0 + title db "Esegui",0 +else if lang eq ru_RU + sz_Program_run_successfully db "Программа запущена успешно",0 + sz_File_not_found db "Файл не найден",0 + sz_File_is_not_executable db "Файл не является исполняемым",0 + sz_Too_many_processes db "Слишком много процессов",0 + sz_Access_denied db "Доступ запрещен",0 + sz_Out_of_memory db "Недостаточно памяти",0 + sz_Unknown_error db "Неизвестная ошибка",0 + sz_Type_name_of_program db "Введите название программы",0 + sz_run db "Запустить",0 + sz_browse db "...",0 + title db "Запуск программы",0 +else + sz_Program_run_successfully db "Program run successfully",0 + sz_File_not_found db "File not found",0 + sz_File_is_not_executable db "File is not executable",0 + sz_Too_many_processes db "Too many processes",0 + sz_Access_denied db "Access denied",0 + sz_Out_of_memory db "Out of memory",0 + sz_Unknown_error db "Unknown error",0 + sz_Type_name_of_program db "Type name of program to run",0 + sz_run db " Run",0 + sz_browse db "...",0 + title db "Run",0 +end if + +align 4 +od: +.mode dd 0 +.procinfo dd 0 +.com_area_name dd sz_FFFFFFFF_open_dialog +.com_area dd 0 +.opendir_path dd 0 +.dir_default_path dd sz_SYS +.start_path dd sz_opendial_path +.draw_window dd on_redraw +.status dd 0 +.openfile_path dd 0 +.filename_area dd 0 +.filter_area dd filefilter +.x_size dw 414 +.x_start dw 0 +.y_size dw 414 +.y_start dw 0 + +runresult dd sz_empty + +edit1 edit_box 0, 5, 26, 0ffffffh, 0, 0, 0, 0, 4096, 0, 0, 4002h + +box_lib dd ? +proc_lib dd ? +filefilter dd ? +ptrlastendpath dd ? +edit_box_draw dd ? +edit_box_key dd ? +edit_box_mouse dd ? +edit_box_set_text dd ? +opendialog_init dd ? +opendialog_start dd ? + +sc: +.frames dd ? +.grab dd ? +.grab_button dd ? +.grab_button_text dd ? +.grab_text dd ? +.work dd ? +.work_button dd ? +.work_button_text dd ? +.work_text dd ? +.work_graph dd ? + +window: +.left dd ? +.top dd ? +.width dd ? +.height dd ? + +screen: +.height dw ? +.width dw ? + +file_info: + dd ? + dd ? +runparams: + dd ? + dd ? + dd ? + db ? +runpath: + dd ? + +lastendpath db ? +sz_empty db ? + +align 4 +end_: 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/hdd_info/trunk/hdd_info.asm b/programs/system/hdd_info/trunk/hdd_info.asm index 132f9ccf8..2b03af084 100644 --- a/programs/system/hdd_info/trunk/hdd_info.asm +++ b/programs/system/hdd_info/trunk/hdd_info.asm @@ -1,1957 +1,1963 @@ -; v. 0.2 -; last update: 19/09/2010 -; written by: Marat Zakiyanov aka Mario79, aka Mario -; changes: select path with OpenDialog -; show 2 different path for Info and SMART files -; draw number of page -;--------------------------------------------------------------------- -; v. 0.11: 15.09.2009 staper@inbox.ru -;--------------------------------------------------------------------- -; Макросы load_lib.mac, editbox_ex и библиотеку box_lib.obj создали: -; - Alexey Teplov / Алексей Теплов -; Mario79, Mario - Marat Zakiyanov / Марат Закиянов -; Diamondz - Evgeny Grechnikov / Евгений Гречников и др. -;--------------------------------------------------------------------- -use32 - org 0 - - db 'MENUET01' - dd 1 - dd START - dd IM_END - dd I_END ;(i_end+200) and not 3 - dd stacktop ;(i_end+200) and not 3 - dd 0x0 ;buf_cmd_lin - dd cur_dir_path - -PRIMARY_CHANNEL equ 0x1f7 -SECONDARY_CHANNEL equ 0x177 -; Ручной поиск портов по шине PCI (преимущественно для SATA): -; mcall SF_SYSTEM_SET,SSF_ACCESS_PCI,1 ;разрешить низкоуровневый доступ к PCI -; mcall SF_PCI,0x0006,((((0x1f shl 3) + 01) shl 8) + 0x10) ;см. ф-ю 62 -; ax = 1 - стандартные порты (константы выше), или нестандартные (168-16f,1e8-1ef) -; Пример: -; Fnc 02: 10-0x1c01,14-0x18f5,18-0x18f9,1c-0x18f1,BMA-0x1811,00000000 -; Fnc 01: 10-1,14-1,18-1,1c-1,BMA-0x18e1,0x18d1 -; Регистр по смещению 0х10 для функции 02 содержит 0x1c01 (порты 0х1с00-0х1с07) - -include 'lang.inc' ; language support - -; Режимы Legacy, Native и пр. меняются через BIOS. -include '../../../config.inc' ;for nightbuild -include '../../../macros.inc' -include '../../../develop/libraries/box_lib/trunk/box_lib.mac' -include '../../../KOSfuncs.inc' -include '../../../load_lib.mac' - @use_library -;--------------------------------------------------------------------- -macro ab { - add ebx,455*65536 - } -;--------------------------------------------------------------------- -macro sb { - sub ebx,455*65536-12 - } -;--------------------------------------------------------------------- -macro ad { - add ebx,12 - } -;--------------------------------------------------------------------- -macro wba num,text { -@@: - bt di,num - jnc @f - ad - mcall SF_DRAW_TEXT,,0x80000000,text - } -;--------------------------------------------------------------------- -macro wba num,text { -@@: - bt di,num - jnc @f - ad - mcall SF_DRAW_TEXT,,0x80000000,text - } -;--------------------------------------------------------------------- -macro sc num,text { - cmp al,num - jne @f - mov edx,text -@@: - } -;--------------------------------------------------------------------- -macro mz text,str1,str2,str3 { - mcall SF_DRAW_TEXT,,0x80444444,text - ab - mov edx,ebx - push ebx - str1 - str2 - str3 - mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 - pop ebx - sb - } -;--------------------------------------------------------------------- -START: -; load_library boxlib_name,buf_cmd_lin,system_path,Box_lib_import - mcall SF_SYS_MISC,SSF_HEAP_INIT - -load_libraries l_libs_start,end_l_libs - - cmp eax,-1 - jz close -;--------------------------------------------------------------------- - mov edi,filename_area - mov esi,default_Info+5 ;default.info - call copy_str_1 - - mov edi,filename_area2 - mov esi,default_SMART+5 ;default.smart - call copy_str_1 - - mov edi,fname_Info - mov esi,default_Info ;/sys/default.info - call copy_str_1 - - mov edi,fname_SMART ;/sys/default.smart -; cmp byte [edi], 0 -; jne skin_path_ready - mov esi,default_SMART - call copy_str_1 -;skin_path_ready: -;--------------------------------------------------------------------- -;OpenDialog initialisation - push dword OpenDialog_data - call [OpenDialog_Init] - - push dword OpenDialog_data2 - call [OpenDialog_Init] - -; prepare for PathShow - push dword PathShow_data_1 - call [PathShow_prepare] - - push dword PathShow_data_2 - call [PathShow_prepare] -;--------------------------------------------------------------------- - - mcall SF_SET_EVENTS_MASK,0x27 -;--------------------------------------------------------------------- -redraw_all: -redraw: - call draw_window -;--------------------------------------------------------------------- -still: - mcall SF_WAIT_EVENT - dec al - jz redraw_all - dec al - jz key - dec al - jz button -;--------------------------------------------------------------------- -mouse: - bt [flags],2 - jnc still - mcall SF_MOUSE_GET,SSF_BUTTON - test al,al - jz still - push dword Option_boxs - call [option_box_mouse] - jmp still -;--------------------------------------------------------------------- -copy_str_1: - xor eax,eax - cld -@@: - lodsb - stosb - test eax,eax - jnz @b - ret -;--------------------------------------------------------------------- -draw_PathShow: - pusha - mcall SF_DRAW_RECT,<125,420>,<83,15>,0xFFFFED - mcall SF_DRAW_RECT,,<100,15>, -; draw for PathShow - push dword PathShow_data_1 - call [PathShow_draw] - - push dword PathShow_data_2 - call [PathShow_draw] - popa - ret -;--------------------------------------------------------------------- -draw_window: - mcall SF_REDRAW,SSF_BEGIN_DRAW - xor esi,esi - mcall SF_CREATE_WINDOW,<100,580>,<100,350>,0x34ffffff,,title - mcall SF_DEFINE_BUTTON,<1,30>,<1,15>,2,0x365732 - mcall ,<35,38>,,3, -; mcall ,<77,38>,,6, - mcall ,<120,45>,,7, - - mcall ,<195,20>,,4, ;влево,вправо - mcall ,<217,20>,,5, - mcall SF_DRAW_TEXT,<4,6>,0x80ffffff,menu_text - - mcall ,<260,6>,0x80000000,page_text - movzx ecx, byte [page_num] - mcall SF_DRAW_NUMBER,0x800a0000,,<300,6>,0x0 - - mcall SF_DRAW_LINE,<2,535>,<20,20>,0x00aabbaa - bt [flags],2 - jnc @f - call show_ControlBlock - mcall SF_DRAW_TEXT,<4,125>,0x80FF0000,[error_text] - jmp .end -@@: - bt [flags],6 - jnc @f - call show_TestBlock - jmp .end -@@: - bt [flags],7 - jnc @f - call show_InfoBlock - jmp .end -@@: - bt [flags],8 - jnc .end - call show_SmartBlock -.end: - mcall SF_REDRAW,SSF_END_DRAW - ret -;--------------------------------------------------------------------- -key: - mcall SF_GET_KEY -; push edit1 -; call [edit_box_key] -; push edit1 -; call [edit_box_draw] - jmp still -;--------------------------------------------------------------------- -button: - mcall SF_GET_BUTTON - cmp ah,1 - jne @f -close: - mcall SF_TERMINATE_PROCESS -@@: - cmp ah,2 - jne @f - call get_InfoBlock - mov ax,[flags] - btr ax,2 - btr ax,6 - bts ax,7 - btr ax,8 - mov [flags],ax - mov [page_num],1 - jmp redraw -;--------------------------------------------------------------------- -@@: - cmp ah,3 - jne @f - call get_SmartBlock - mov [page_num],1 - mov ax,[flags] - btr ax,2 - btr ax,6 - btr ax,7 - bts ax,8 - mov [flags],ax - jmp redraw -;--------------------------------------------------------------------- -@@: - cmp ah,4 - jne @f - cmp [page_num],1 - je still - dec [page_num] - jmp redraw -;--------------------------------------------------------------------- -@@: - cmp ah,5 - jne @f - cmp [page_num],5 - je still - inc [page_num] - jmp redraw -;--------------------------------------------------------------------- -@@: - cmp ah,6 - jne @f - mov ax,[flags] - btr ax,2 - btr ax,6 - btr ax,7 - btr ax,8 - mov [flags],ax - jmp redraw -;--------------------------------------------------------------------- -@@: - cmp ah,7 - jne @f - mov ax,[flags] - bts ax,2 - btr ax,6 - btr ax,7 - btr ax,8 - mov [flags],ax -@@: - cmp ah,8 - jne @f - bts [flags],9 - call get_SmartBlock - jmp still -;--------------------------------------------------------------------- -@@: - cmp ah,9 ; Save Info - jne @f -; invoke OpenDialog - mov [OpenDialog_data.type],dword 1 - push dword OpenDialog_data - call [OpenDialog_Start] - cmp [OpenDialog_data.status],1 - jne still -; prepare for PathShow - push dword PathShow_data_1 - call [PathShow_prepare] - call draw_PathShow - - btr [flags],4 - jmp save_file -;--------------------------------------------------------------------- -@@: - cmp ah,10 ; Load Info - jne @f -; invoke OpenDialog - mov [OpenDialog_data.type],dword 0 - push dword OpenDialog_data - call [OpenDialog_Start] - cmp [OpenDialog_data.status],1 - jne still -; prepare for PathShow - push dword PathShow_data_1 - call [PathShow_prepare] - call draw_PathShow - - btr [flags],4 - jmp open_file -;--------------------------------------------------------------------- -@@: - cmp ah,11 ; Save SMART - jne @f -; invoke OpenDialog - mov [OpenDialog_data2.type],dword 1 - push dword OpenDialog_data2 - call [OpenDialog_Start] - cmp [OpenDialog_data2.status],1 - jne still -; prepare for PathShow - push dword PathShow_data_2 - call [PathShow_prepare] - call draw_PathShow - - bts [flags],4 - jmp save_file -;--------------------------------------------------------------------- -@@: - cmp ah,12 ; Load SMART - jne redraw -; invoke OpenDialog - mov [OpenDialog_data2.type],dword 0 - push dword OpenDialog_data2 - call [OpenDialog_Start] - cmp [OpenDialog_data2.status],1 - jne still -; prepare for PathShow - push dword PathShow_data_2 - call [PathShow_prepare] - call draw_PathShow - - bts [flags],4 - jmp open_file -;--------------------------------------------------------------------- -open_file: - mov [func_70.func_n],SSF_READ_FILE - mov [func_70.param3],512 - mov [func_70.param4],InfoArray - mov [func_70.name],filename_area - bt [flags],4 - jnc @f - mov [func_70.param4],SmartArray - mov [func_70.param3],1024 - mov [func_70.name],filename_area2 -@@: - mcall SF_FILE,func_70 - test al,al ;файл найден? - jnz .1 - mov ax,[flags] - bts ax,0 - btr ax,7 - btr ax,8 - btr ax,6 - btr ax,2 - bt ax,4 - jc @f - bts ax,7 - mov [flags],ax - jmp good -@@: - bts ax,8 - mov [flags],ax - jmp redraw_all -.1: - bt [flags],4 - jnc @f - mov [error_text],error_open_file_string_SMART - jmp redraw_all -@@: - mov [error_text],error_open_file_string_Info - jmp redraw_all -;--------------------------------------------------------------------- -save_file: ;сохраняем файл - mov [func_70.func_n],SSF_CREATE_FILE - mov [func_70.param3],512 - mov [func_70.param4],InfoArray - mov [func_70.name],filename_area - bt [flags],4 - jnc @f - mov [func_70.param4],SmartArray - mov [func_70.param3],1024 - mov [func_70.name],filename_area2 -@@: - mcall SF_FILE,func_70 - test al,al ;сохранён удачно? - jz good - bt [flags],4 - jnc @f - mov [error_text],error_save_file_string_SMART - jmp redraw_all -@@: - mov [error_text],error_save_file_string_Info - jmp redraw_all -;--------------------------------------------------------------------- -good: - mov [error_text],no_error_text - jmp redraw_all -;--------------------------------------------------------------------- -ports_: - mov eax,[option_group1] - cmp eax,op1 - jne @f - mov edx,PRIMARY_CHANNEL - btr [flags],5 - jmp .0 -;--------------------------------------------------------------------- -@@: - cmp eax,op2 - jne @f - mov edx,PRIMARY_CHANNEL - bts [flags],5 - jmp .0 -;--------------------------------------------------------------------- -@@: - cmp eax,op3 - jbe @f - mov edx,SECONDARY_CHANNEL - btr [flags],5 - jmp .0 -;--------------------------------------------------------------------- -@@: - mov edx,SECONDARY_CHANNEL - bts [flags],5 -.0: - mov ecx,edx - sub ecx,7 - mcall SF_SET_PORTS,0 - ret -;--------------------------------------------------------------------- -get_InfoBlock: - call ports_ - push ecx edx - xor ecx,ecx -.1: - in al,dx ;Проверить готовность - dec cx ;необходимо проверять и бит 7, однако работает ... - jz .error - bt ax,6 - jnc .1 - - dec dx - in al,dx - mov bx,ax ;сохраняем бит выбора устройтсва - btr ax,4 - bt [flags],5 - jnc @f - bts ax,4 -@@: - out dx,al - inc dx - mov al,0xec - out dx,al - - push bx - mcall SF_SLEEP,10 - pop bx - xor cx,cx -.2: - in al,dx ;Проверить готовность - dec cx - jz .error - bt ax,6 - jnc .2 - - mov esi,InfoArray ;Получить информацию - xor edi,edi - sub dx,7 -.3: - in ax,dx - xchg al,ah - mov [esi+edi*2],ax - inc edi - cmp edi,256 - jne .3 - bts [flags],0 - btr [flags],2 - btr [flags],3 - - push bx - mcall SF_SLEEP,10 - pop bx - - mov ax,bx - add dx,6 - out dx,al - pop edx ecx - mcall SF_SET_PORTS,1 - ret -;--------------------------------------------------------------------- -.error: - bts [flags],3 - pop edx ecx - mcall SF_SET_PORTS,1 - ret -;--------------------------------------------------------------------- -get_SmartBlock: - call ports_ - push ecx edx - xor ecx,ecx -.1: - in al,dx ;Проверить готовность - dec cx - jz .error - bt ax,6 - jnc .1 - - dec dx - in al,dx - mov cx,ax ;сохраняем бит выбора устройтсва - btr ax,4 - bt [flags],5 - jnc @f - bts ax,4 -@@: - out dx,al - inc dx - - bt [flags],9 ;S.M.A.R.T. on/off - jnc @f - sub dx,3 - mov al,0x4f - out dx,al - inc dx - mov al,0xc2 - out dx,al - sub dx,4 - mov al,0xd8 - btc [flags],10 - jnc .2 - inc al -.2: - out dx,al - add dx,6 - mov al,0xb0 - out dx,al - dec dx - mov ax,cx - out dx,ax - btr [flags],9 - btr [flags],1 - jmp .end -;--------------------------------------------------------------------- -@@: - sub dx,3 - mov al,0x4f - out dx,al - inc dx - mov al,0xc2 - out dx,al - sub dx,4 - mov al,0xd0 - out dx,al - add dx,6 - mov al,0xb0 - out dx,al - - mcall SF_SLEEP,10 - - mov esi,SmartArray ;Получить информацию - xor edi,edi - sub dx,7 -.3: - in ax,dx - xchg al,ah - mov [esi+edi*2],ax - inc edi - cmp edi,256 - jne .3 - - mcall SF_SLEEP,10 - - add dx,4 - mov al,0x4f - out dx,al - inc dx - mov al,0xc2 - out dx,al - sub dx,4 - mov al,0xd1 - out dx,al - add dx,6 - mov al,0xb0 - out dx,al - - mcall SF_SLEEP,10 - - sub dx,7 -.4: - in ax,dx - xchg al,ah - mov [esi+edi*2],ax - inc edi - cmp edi,256*2 - jne .4 - - bts [flags],1 - btr [flags],3 - mov ax,cx - add dx,6 - out dx,al -.end: - pop edx ecx - mcall SF_SET_PORTS,1 - ret -;--------------------------------------------------------------------- -.error: - bts [flags],3 - pop edx ecx - mcall SF_SET_PORTS,1 - ret -;--------------------------------------------------------------------- -show_ControlBlock: - mcall SF_DRAW_TEXT,<4,30>,0x80000000,ctrl_text1 - mcall ,<4,45>,,ctrl_text2 - push dword Option_boxs - call [option_box_draw] -; push dword edit1 -; call [edit_box_draw] - call draw_PathShow - - mcall SF_DEFINE_BUTTON,<3,80>,<60,15>,8,0xf0f0f0 - mcall ,<50,30>,<82,15>,9, ; Save Info - mcall ,<90,30>,,10, ; Load Info - mcall ,<50,30>,<100,15>,11, ; Save SMART - mcall ,<90,30>,,12, ; Load SMART - mcall SF_DRAW_TEXT,<4,87>,0x80000000,edbx_text1 - mcall ,<7,64>,,smrt_text1 - mcall ,<4,105>,,edbx_text2 -show_TestBlock: - ret -;--------------------------------------------------------------------- -show_InfoBlock: - bt [flags],0 - jnc .end - bt [flags],3 - jc .end - mov al,[page_num] - dec al - jz .page1 - dec al - jz .page2 - dec al - je .page3 - dec al - jz .page4 - dec al - jz .page5 -.end: - ret -;--------------------------------------------------------------------- -.page1: -;TABLE 1 of 11 - mcall SF_DRAW_TEXT,5*65536+25,0x80444444,t.10_19 - ab ; add ebx,300*65536 - mcall ,,0x0,(InfoArray+10*2),((19-10)+1)*2 - sb ; sub ebx,300*65536-12 - mcall ,,0x80444444,t.23_26 - ab - mcall ,,0x0,(InfoArray+23*2),((26-23)+1)*2 - sb - mcall ,,0x80444444,t.27_46 - ab - mcall ,,0x0,(InfoArray+27*2),((46-27)+1)*2 - sb - mcall ,,0x80444444,t.type - ab - mov di,[InfoArray+222*2] -@@: - bt di,4 - jnc @f - mcall SF_DRAW_TEXT,,0x80000000,t.222.12.1 -@@: - bt di,4 - jc @f - mcall SF_DRAW_TEXT,,0x80000000,t.222.12.0 -@@: - sb - mcall SF_DRAW_TEXT,,0x80444444,t.60_61 - ab - mov edx,ebx - push ebx - mov ecx, [InfoArray+60*2] - bswap ecx - ror ecx,16 - mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 - shr ecx,11 ;LBA in MB - add edx,70*65536 - mcall ,,,,0x459a - pop ebx - - sb ;CHS - mcall SF_DRAW_TEXT,,0x80444444,t.chs - ab - mov edx,ebx - push ebx - movzx ecx, word [InfoArray+2] - xchg ch,cl - mcall SF_DRAW_NUMBER,0x80050000,,,0x0 - add edx,35*65536 - movzx ecx, word [InfoArray+6] - xchg ch,cl - mcall SF_DRAW_NUMBER,0x80040000,,,0x0 - add edx,15*65536 - movzx ecx, word [InfoArray+12] - xchg ch,cl - mcall ;SF_DRAW_NUMBER,0x80040000,,,0x0 - add edx,20*65536 - push ebx edx - xor edx,edx - movzx eax,word[InfoArray+2] - xchg ah,al - movzx ebx, word [InfoArray+6] - xchg bh,bl - mul ebx - mul ecx - xchg eax,ecx - pop edx ebx - shr ecx,11 - mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 - pop ebx - - mov ax,[InfoArray+48*2] - bt ax,8 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.48.0 - ab - mcall ,,0x80000000,t.sup -@@: - mov ax,[InfoArray+49*2] - xchg al,ah - mov di,ax - bt di,13 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.49.13.1 - ab - mcall ,,0x80000000,t.sup -@@: - bt di,13 - jc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.49.13.0 - ab -@@: - bt di,11 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.49.11.1 - ab - mcall ,,0x80000000,t.sup -@@: - bt di,11 - jc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.49.11.0 - ab - mcall ,,0x80000000,t.sup -@@: - bt di,10 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.49.10.1 - ab -@@: - bt di,9 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.49.9 - ab - mcall ,,0x80000000,t.sup -@@: - bt di,8 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.49.8 - ab - mcall ,,0x80000000,t.sup -@@: - sb - mcall SF_DRAW_TEXT,,0x80444444,t.47 -; add ebx,10 -; mcall SF_DRAW_TEXT,,0x80444444,t.47_ - ab - mov edx,ebx - movzx ecx, word [InfoArray+47*2] - xchg ch,cl - mcall SF_DRAW_NUMBER,0x80050000,,,0x80000000 - mov ebx,edx - - -;PART 2 of 11 - sb - mcall SF_DRAW_TEXT,,0x80444444,t.59 -; add ebx,10 -; mcall SF_DRAW_TEXT,,0x80444444,t.59_ - ab - mov edx,ebx - movzx ecx, word [InfoArray+59*2] - xchg ch,cl - mcall SF_DRAW_NUMBER,0x80050000,,,0x0 - mov ebx,edx - - mov ax,[InfoArray+63*2] - xchg al,ah - mov di,ax - bt di,10 - jnc @f - mov edx,ebx -; push ebx - sb - mcall SF_DRAW_TEXT,,0x80444444,t.63.10 - ab - mcall ,,0x80000000,t.sel -@@: - bt di,9 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.63.9 - ab - mcall ,,0x80000000,t.sel -@@: - bt di,8 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.63.8 - ab - mcall ,,0x80000000,t.sel -@@: - bt di,2 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.63.2 - ab - mcall ,,0x80000000,t.sup -@@: - bt di,1 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.63.1 - ab - mcall ,,0x80000000,t.sup -@@: - bt di,0 - jnc @f - sb - mcall SF_DRAW_TEXT,,0x80444444,t.63.0 - ab - mcall ,,0x80000000,t.sup -@@: - -;PART 3 of 11 - sb - mcall SF_DRAW_TEXT,,0x80444444,t.75.0_4 - ab - mov edx,ebx - push ebx - movzx ecx, byte [InfoArray+75*2+1] - mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 - pop ebx - -;words 76-79 - SATA -;.word80: -; sb -; mcall SF_DRAW_TEXT,,0x80444444,t.80 -; ab -; mov cx,[InfoArray+80*2] -; test cx,cx -; jnz @f -; mcall SF_DRAW_TEXT,,0x80444444,t.unk -; ret -;@@: cmp cx,-1 -; jne @f -; mcall SF_DRAW_TEXT,,0x80444444,t.unk -; ret -;@@: xchg ch,cl -; mov edx,ebx -; mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 -; mov ebx,edx - sb - mcall SF_DRAW_TEXT,,0x80444444,t.80__ - mov ax,[InfoArray+80*2] - ab - xchg al,ah - mov di,ax - bt di,8 - jnc @f - mcall SF_DRAW_TEXT,,0x80000000,t.80.8 - jmp .end -;--------------------------------------------------------------------- -@@: - bt di,7 - jnc @f - mcall SF_DRAW_TEXT,,0x80000000,t.80.7 - jmp .end -;--------------------------------------------------------------------- -@@: - bt di,6 - jnc @f - mcall SF_DRAW_TEXT,,0x80000000,t.80.6 - jmp .end -;--------------------------------------------------------------------- -@@: - bt di,5 - jnc @f - mcall SF_DRAW_TEXT,,0x80000000,t.80.5 - jmp .end -;--------------------------------------------------------------------- -@@: - bt di,4 - jnc @f - mcall SF_DRAW_TEXT,,0x80000000,t.80.4 - jmp .end -@@: - ret -;--------------------------------------------------------------------- -.page2: -;PART 4 of 11 - mcall SF_DRAW_TEXT,5*65536+25,0x80444444,t.82 - add ebx,10*65536 - mov ax,[InfoArray+82*2] - xchg al,ah - mov di,ax - bt di,14 - jnc @f - ad - mcall SF_DRAW_TEXT,,0x80000000,t.82.14 - wba 13,t.82.13 - wba 12,t.82.12 - wba 10,t.82.10 - wba 9,t.82.9 - wba 8,t.82.8 - wba 7,t.82.7 - wba 6,t.82.6 - wba 5,t.82.5 - wba 4,t.82.4 - wba 3,t.82.3 - wba 1,t.82.1 - wba 0,t.82.0 -@@: - mov ax,[InfoArray+83*2] - xchg al,ah - mov di,ax - - wba 13,t.83.13 - wba 12,t.83.12 - wba 11,t.83.11 - wba 10,t.83.10 - wba 9,t.83.9 - wba 8,t.83.8 - wba 6,t.83.6 - wba 5,t.83.5 - wba 3,t.83.3 - wba 2,t.83.2 - wba 1,t.83.1 - wba 0,t.83.0 -@@: - -;PART 5 of 11 - mov ebx,290*65536+25 - mov ax,[InfoArray+84*2] - xchg al,ah - mov di,ax - wba 13,t.84.13 - wba 8,t.84.8 - wba 7,t.84.7 - wba 6,t.84.6 - wba 5,t.84.5 - wba 4,t.84.4 - wba 3,t.84.3 - wba 2,t.84.2 - wba 1,t.84.1 - wba 0,t.84.0 -@@: - ret -;--------------------------------------------------------------------- -.page3: - mcall SF_DRAW_TEXT,5*65536+25,0x80444444,t.85 - add ebx,10*65536 - mov ax,[InfoArray+85*2] - xchg al,ah - mov di,ax - bt di,14 - jnc @f - ad - mcall SF_DRAW_TEXT,,0x80000000,t.85.14 - wba 13,t.85.13 - wba 12,t.85.12 - wba 10,t.85.10 -; ad -; mcall SF_DRAW_TEXT,,0x80000000,t.85.10_ - wba 9,t.85.9 - wba 8,t.85.8 - wba 7,t.85.7 - wba 6,t.85.6 - wba 5,t.85.5 - wba 4,t.85.4 - wba 3,t.85.3 - wba 1,t.85.1 - wba 0,t.85.0 -@@: - mov ax,[InfoArray+86*2] - xchg al,ah - mov di,ax - bt di,13 - jnc @f - ad - mcall SF_DRAW_TEXT,,0x80000000,t.86.13 - wba 12,t.86.12 - wba 11,t.86.11 - wba 10,t.86.10 - wba 9,t.86.9 - wba 8,t.86.8 - wba 6,t.86.6 - wba 5,t.86.5 - wba 3,t.86.3 - wba 2,t.86.2 - wba 1,t.86.1 - wba 0,t.86.0 -@@: - ret -;--------------------------------------------------------------------- -.page4: - mov ebx,5*65536+25 - mov ax,[InfoArray+88*2] - xchg al,ah - xor di,di - bt ax,8 - jnc @f - mov di,1 -@@: - bt ax,9 - jnc @f - mov di,2 -@@: - bt ax,10 - jnc @f - mov di,3 -@@: - bt ax,11 - jnc @f - mov di,4 -@@: - bt ax,12 - jnc @f - mov di,5 -@@: - bt ax,13 - jnc @f - mov di,6 -@@: - test di,di - jz @f - mcall SF_DRAW_TEXT,,0x80444444,t.88 - mov edx,ebx - push ebx - add edx,90*65536 - movzx ecx, word di - dec cl - mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 - pop ebx - ad -@@: - xor di,di - mov ax,[InfoArray+88*2] - xchg al,ah - bt ax,0 - jnc @f - mov di,1 -@@: - bt ax,1 - jnc @f - mov di,2 -@@: - bt ax,2 - jnc @f - mov di,3 -@@: - bt ax,3 - jnc @f - mov di,4 -@@: - bt ax,4 - jnc @f - mov di,5 -@@: - bt ax,5 - jnc @f - mov di,6 -@@: - bt ax,6 - jnc @f - mov di,7 -@@: - test di,di - jz @f - mcall SF_DRAW_TEXT,,0x80444444,t.88.1_6 - mov edx,ebx - push ebx - add edx,90*65536 - movzx ecx, word di - dec cl - mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 - pop ebx - ad -@@: - mz t.89,, - mz t.90,, - mz t.91,, - mz t.92,, -;WORD 94 - mz t.94.8_15,, - mz t.94.0_7,, - mz t.95,, - mz t.96,, - mz t.97,, - mz t.98_99,,, - mz t.100_103,,, - mz t.104,, - -;PART 6 of 11 ? - mcall SF_DRAW_TEXT,,0x80444444,t.106 - add ebx,12 - mov ax,[InfoArray+106*2] - xchg ah,al - mov di,ax - bt di,13 - jnc @f - mcall SF_DRAW_TEXT,,0x80444444,t.106.13 - add ebx,15 -@@: - bt di,12 - jnc @f - mcall SF_DRAW_TEXT,,0x80444444,t.106.12 - add ebx,15 -@@: - mcall SF_DRAW_TEXT,,0x80444444,t.106.0_3 - ab - shl di,12 - shr di,12 - movzx ecx,di - mov edx,ebx - mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 - mov ebx,edx - sb - - mz t.107,, -;108 - 111 добавить - mz t.117_118,, - ret -;--------------------------------------------------------------------- -.page5: -; mcall SF_DRAW_TEXT,5*65536+25,0x80444444,t.85 - ret -;--------------------------------------------------------------------- -show_SmartBlock: - bt [flags],1 - jnc .end - bt [flags],3 - jc .end - - cmp byte [SmartArray+2],0 - je .end - mcall SF_DRAW_TEXT,5*65536+25,0x80444444,s.title - ad - movzx ax, byte [SmartArray+2] - cmp ax,30 ;максимум 30 атрибутов - jg .end - push ax - push dword (3+SmartArray) -@@: - xor edx,edx - call .find - push edx - - mov edx,ebx - movzx ecx,al - mcall SF_DRAW_NUMBER,0x80030000,,,0x0 - mov ebx,edx - add ebx,30*65536 - pop edx - test edx,edx - jnz .0 - mov edx,s.0 - .0: mov eax,[esp] - mov al,[eax+2] - mov ecx,0x80000000 - and al,1 - jz .1 -; mov ecx,0x80ff0000 - .1: mcall SF_DRAW_TEXT,,, - sub ebx,30*65536 - - mov ecx,[esp] - inc ecx - movzx ecx, byte [ecx] - add ebx,400*65536 - mov edx,ebx - mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 - mov ecx,[esp] - add ecx,4 - movzx ecx, byte [ecx] - add edx,30*65536 - mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 - mov ebx,edx - sub ebx,(30+400)*65536 - - ad - add dword [esp],12 - dec word [esp+4] - jnz @b - add esp,6 -.end: - ret -;--------------------------------------------------------------------- -.find: - mov eax, dword [esp+4] - mov al,[eax] - sc 1,s.1 - sc 2,s.2 - sc 3,s.3 - sc 4,s.4 - sc 5,s.5 - sc 6,s.6 - sc 7,s.7 - sc 8,s.8 - sc 9,s.9 - sc 10,s.10 - sc 11,s.11 - sc 12,s.12 - sc 13,s.13 - sc 190,s.190 - sc 191,s.191 - sc 192,s.192 - sc 193,s.193 - sc 194,s.194 - sc 195,s.195 - sc 196,s.196 - sc 197,s.197 - sc 198,s.198 - sc 199,s.199 - sc 200,s.200 - sc 201,s.201 - sc 202,s.202 - sc 203,s.203 - sc 204,s.204 - sc 205,s.205 - sc 206,s.206 - sc 207,s.207 - sc 208,s.208 - sc 209,s.209 - sc 220,s.220 - sc 221,s.221 - sc 222,s.222 - sc 223,s.223 - sc 224,s.224 - sc 225,s.225 - sc 226,s.226 - sc 227,s.227 - sc 228,s.228 - sc 230,s.230 - sc 231,s.231 - sc 240,s.240 - sc 250,s.250 - ret -;--------------------------------------------------------------------- -;DATA AREA -if lang eq it_IT - t: - .sup db 'supportato',0 - .sel db 'selzionato',0 - .enb db 'abilitato',0 - .unk db 'sconosciuto',0 - .type db 'Tipo',0 - .chs db 'CHS',0 -else - t: - .sup db 'supported',0 - ;.usp db 'unsupported',0 - .sel db 'selected',0 - ;.usl db 'not selected',0 - .enb db 'enabled',0 - ;.dis db 'disabled',0 - .unk db 'unknown',0 - .type db 'Type',0 - .chs db 'CHS',0 -end if - -if lang eq it_IT - .10_19 db 'Numero seriale',0 - .23_26 db 'Versione firmware',0 - .27_46 db 'Numero modello',0 - .47 db 'Max. number of sectors that shall be transferred per DRQ data block',0 - .48.0 db 'Trusted Computing feature set is',0 - .49.13.1 db 'Standby timer values are',0 - .49.13.0 db 'Standby timer values shall be managed by the device',0 - .49.11.1 db 'IORDY',0 - .49.11.0 db 'IORDY may be',0 - .49.10.1 db 'IORDY potrebbe essere disabilitato',0 - .49.9 db 'LBA',0 - .49.8 db 'DMA',0 -else - .10_19 db 'Serial number',0 - .23_26 db 'Firmware revision',0 - .27_46 db 'Model number',0 - .47 db 'Max. number of sectors that shall be transferred per DRQ data block',0 - ;.47 db 'Maximum number of logical sectors that shall be transferred per DRQ',0 - ;.47_ db 'data block on READ/WRITE MULTIPLE commands',0 - .48.0 db 'Trusted Computing feature set is',0 ;1 sup - .49.13.1 db 'Standby timer values are',0 ;sup - .49.13.0 db 'Standby timer values shall be managed by the device',0 - .49.11.1 db 'IORDY',0 ;sup - .49.11.0 db 'IORDY may be',0 ;sup - .49.10.1 db 'IORDY may be disabled',0 - .49.9 db 'LBA',0 ;1 sup - .49.8 db 'DMA',0 ;1 sup -end if - -;.53 db 'Free-fall Control Sensitivity',0 -;.53.6_15 db 'Sensitivity level',0 -.59 db 'Current number of sectors that shall be transferred per DRQ data block',0 -;.59 db 'Current setting for number of logical sectors that shall be',0 -;.59_ db 'transferred per DRQ data block on READ/WRITE MULTIPLE commands',0 -.60_61 db 'Total number of user addressable logical sectors',0 -.63.10 db 'Multiword DMA mode 2 is',0 ;1 sel -.63.9 db 'Multiword DMA mode 1 is',0 ;1 sel -.63.8 db 'Multiword DMA mode 0 is',0 ;1 sel -.63.2 db 'Miltiword DMA mode 2 and below are',0 ;sup -.63.1 db 'Miltiword DMA mode 1 and below are',0 ;sup -.63.0 db 'Miltiword DMA mode 0 is',0 ;sup -.64.0_7 db 'PIO modes',0 ;sup - -;.65 - .68 добавить - -.75.0_4 db 'Maximum queue depth -1 ',0 -.76 db 'Serial ATA Capabilities:',0 -.76.10 db 'Supports Phy Event Counters',0 ;1 -.76.9 db 'Supports receit of host initiated power management request',0 ;1 -.76.8 db 'Supports native Command Queuing',0 ;1 -.76.2 db 'Supports SATA Gen2 Signaling Speed (3.0Gb/s)',0 -.76.1 db 'Supports SATA Gen1 Signaling Speed (1.5Gb/s)',0 -.78 db 'SATA Features Supported',0 -.78_ db 'Device supports:',0 -.78.6 db 'Software Setting Preservation',0 ;1 -.78.4 db 'in-order data delivery',0 ;1 -.78.3 db 'initiating power management',0 ;1 -.78.2 db 'DMA Setup auto-activation',0 ;1 -.78.1 db 'non-zero buffer offsets',0 ;1 -.79 db 'SATA Features Enabled:',0 -.79.6 = .78.6;1 enb -.79.4 = .78.4;1 enb -.79.3 = .78.3;1 enb -.79.2 = .78.2;1 enb -.79.1 = .78.1;1 enb -.80 db 'Major revision number',0 -.80__ db 'supports:',0 -.80.8 db 'ATA8-ACS',0 ;1 -.80.7 db 'ATA/ATAPI-7',0 ;1 -.80.6 db 'ATA/ATAPI-6',0 ;1 -.80.5 db 'ATA/ATAPI-5',0 ;1 -.80.4 db 'ATA/ATAPI-4',0 ;1 -.81 db 'Minor revision number',0 - -.82 db 'Command set/feature supported:',0 -.82.14 db 'NOP command',0 ;1 sup -.82.13 db 'READ BUFFER command',0 ;1 sup -.82.12 db 'WRITE BUFFER command',0 ;1 sup -.82.10 db 'Host Protected Area feature set',0 ;1 sup -.82.9 db 'DEVICE RESET command',0 ;1 sup -.82.8 db 'SERVICE interrupt',0 ;1 sup -.82.7 db 'release interrupt',0 ;1 sup -.82.6 db 'read look-ahead',0 ;1 sup -.82.5 db 'volatile write cache',0 ;1 sup -.82.4 db 'PACKET feature set',0 ;1 sup -.82.3 db 'Mandatory Power Management feature set',0 ;1 sup -.82.1 db 'Security feature set',0 ;1 sup -.82.0 db 'SMART feature set',0 ;1 sup -;.83 db 'Command sets supported:',0 -.83.13 db 'FLUSH CACHE EXT command',0 ;1 sup -.83.12 db 'Mandatory FLUSH CACHE command',0 ;1 sup -.83.11 db 'Device Configuration Overlay feature set',0 ;1 sup -.83.10 db '48-bit Address feature set',0 ;1 sup -.83.9 db 'Automatic Acoustic Management feature set',0 ;1 sup -.83.8 db 'SET MAX security extension',0 ;1 sup -.83.6 db 'SET FEATURES subcommand required to spin-up after power-up',0 ;1 -.83.5 db 'Power-Up In Standby feature set',0 ;1 sup -.83.3 db 'Advanced Power Management feature set',0 ;1 sup -.83.2 db 'CFA feature set',0 ;1 sup -.83.1 db 'READ/WRITE DMA QUEUED',0 ;1 sup -.83.0 db 'DOWNLOAD MICROCODE command',0 ;1 sup - -;.84 db 'Command set/feature supported:',0 -.84.13 db 'IDLE IMMEDIATE with UNLOAD FEATURE',0 ;1 sup -.84.8 db '64-bit World wide name supported',0 ;1 sup -.84.7 db 'WRITE DMA QUEUED FUA EXT command',0 ;1 sup -.84.6 db 'WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT commands',0 ;1 sup -.84.5 db 'General Purpose Logging feature set',0 ;1 sup -.84.4 db 'Streaming feature set',0 ;1 sup -.84.3 db 'Media Card Pass Through Command feature set',0 ;1 sup -.84.2 db 'Media serial number',0 ;1 sup -.84.1 db 'SMART self-test',0 ;1 sup -.84.0 db 'SMART error logging',0 ;1 sup -.85 db 'Command set/feature enabled/supported:',0 -.85.14 = .82.14 ;1 sup -.85.13 = .82.13 ;1 sup -.85.12 = .82.12 ;1 sup -.85.10 db 'Host Protected Area has been established',0;1 (i.e., the maximum LBA is less than the maximum native LBA) -.85.9 = .82.9; 1 sup -.85.8 = .82.8; 1 enb -.85.7 = .82.7; 1 enb -.85.6 = .82.6; 1 enb -.85.5 = .82.5; 1 enb -.85.4 = .82.4; 1 sup -.85.3 = .82.3; 1 sup -.85.1 = .82.1; 1 enb -.85.0 = .82.0; 1 enb - -;.86 db 'Command set/feature enabled/supported:',0 -.86.13 = .83.13; 1 sup -.86.12 db 'FLUSH CACHE command',0 ;1 sup -.86.11 db 'Device Configuration Overlay',0 ;1 sup -.86.10 = .83.10 ;1 sup -.86.9 = .83.9 ;1 enb -.86.8 db 'SET MAX security extension enabled by SET MAX SET PASSWORD',0 ;1 -.86.6 = .83.6 ;1 -.86.5 = .83.5 ;1 enb -.86.3 = .83.3 ;1 enb -.86.2 = .83.2 ;l sup -.86.1 = .83.1 ;1 sup -.86.0 = .83.0 ;1 sup -;.87 db 'Command set/feature enabled/supported:',0 -;.87.x см..84 - -.88 db 'Ultra DMA mode selected',0 -;бит 14 установлен - mode 6 is selected, 13-5, 12-4, 11-3, 10-2, 9-1, 8-0 -.88.1_6 db 'Ultra DMA mode and below are supported',0 ;бит 1-1, ..., 6-6 -;.88.0: db 'Ultra DMA mode 0 is',0 ;1 sup -.89 db 'Time required for security erase unit completion',0 -.90 db 'Time required for Enhanced security erase completion',0 -.91 db 'Current advanced power management value',0 -.92 db 'Master Password Identifier',0 - -;.93 db 'Hardware reset result',0 ;добавить -.94.8_15 db 'Vendor"s recommended acoustic management value',0 -.94.0_7 db 'Current automatic acoustic management value',0 -.95 db 'Stream Minimum Request Size',0 -.96 db 'Streaming Transfer Time - DMA',0 -.97 db 'Streaming Access Latency - DMA and PIO',0 -.98_99 db 'Streaming Performance Granularity',0 -.100_103 db 'Total Number of User Addressable Sectors for the 48-bit Address feature set',0 -.104 db 'Streaming Transfer Time - PIO',0; - -.106 db 'Physical sector size / Logical Sector Size:',0 -.106.13 db 'Device has multiple logical sectors per physical sector',0 ;1 -.106.12 db 'Device Logical Sector Longer than 256 Words',0 ;1 -.106.0_3 db '2^X logical sectors per physical sector',0 -.107 db 'Inter-seek delay for ISO-7779 acoustic testing in microseconds',0 -.108.12_15 db 'NAA (3:0)',0 -.108.0_11 db 'IEEE OUI (23:12)',0 -.109.4_15 db 'IEEE OUI (11:0)',0 -.109.0_3 db 'Unique ID (35:32)',0 -.110 db 'Unique ID (31:16)',0 -.111 db 'Unique ID (15:0)',0; -.117_118 db 'Words per Logical Sector',0 -.119 db 'Supported Settings:',0 -.119.5 db 'Free-fall Control feature set is',0 ;1 sup -.119.4 db 'The Segmented feature for DOWNLOAD MICROCODE is',0 ;1 sup -.119.3 db 'READ and WRITE DMA EXT GPL optional commands are',0 ;1 sup -.119.2 db 'WRITE UNCORRECTABLE EXT is',0 ;1 sup -.119.1 db 'Write-Read-Verify feature set is',0 ;1 sup -.120 db 'Command set/feature enabled/supported',0 -.120.5 db 'Free-fall Control feature set is',0 ;1 enb -.120.4 db 'The Segmented feature for DOWNLOAD MICROCODE is',0 ;1 sup -.120.3 db 'READ and WRITE DMA EXT GPL optional commands are',0 ;1 sup -.120.2 db 'WRITE UNCORRECTABLE EXT is',0 ;1 sup -.120.1 db 'Write-Read-Verify feature set is',0 ;1 enb - -.128 db 'Security status',0 -.128.8.0 db 'Security level = High',0 -.128.8.1 db 'Security level = Maximum',0 -.128.5 db 'Enhanced security erase',0 ;1 sup -.128.4 db 'Security count expired',0 ;1 -.128.3 db 'Security frozen',0 ;1 -.128.2 db 'Security locked',0 ;1 -.128.1 db 'Security enabled',0 ;1 -.128.0 db 'Security supported',0 ;1 - -;.160 добавить - -.176_205 db 'Current media serial number',0 -.206 db 'SCT Command Transport:',0 -.206.5 db 'Data Tables',0 ;1 sup -.206.4 db 'Features Control',0 ;1 sup -.206.3 db 'Error Recovery Control',0 ;1 sup -.206.2 db 'Write Same',0 ;1 sup -.206.1 db 'Long Sector Access',0 ;1 sup -.206.0 db '',0 ;1 sup -.209 db 'Alignment of logical blocks within a larger physical block',0 -.209.0_13 db '"Logical sector" offset within the first physical sector where the first logical sector is placed.',0; -.210_211 db 'Write-Read-Verify Sector Count Mode 3 Only',0 -.212_213 db 'Verify Sector Count Mode 2 Only',0 -.214 db 'NV Cache Capabilities:',0 -.214.12_15 db 'NV Cache feature set version',0 -.214.8_11 db 'NV Cache Power Mode feature set version',0 -.214.4 db 'NV Cache feature set',0 ;1 enb -.214.1 db 'NV Cache Power Mode feature set',0 ;1 enb -.214.0 db 'NV Cache Power Mode feature set',0 ;1 sup -.215 db 'NV Cache Size in Logical Blocks (15:0)',0 - -.216 db 'NV Cache Size in Logical Blocks (31:16)',0 -.217 db 'Nominal media rotation rate',0 -.219 db 'NV Cache Options',0 -.219.0_7 db 'Device Estimated Time to Spin Up in Seconds',0 -.220.0_7 db 'Write-Read-Verify feature set current mode',0; -.222 db 'Transport Major revision number',0 -.222.12.0 db 'Parallel',0 -.222.12.1 db 'Serial',0 -;.222.0_11 добавить -.223 db 'Transport Major revision number',0 -.234 db 'Minimum number of 512 byte units per DOWNLOAD MICROCODE command for mode 03h',0 -.235 db 'Maximum number of 512 byte units per DOWNLOAD MICROCODE command for mode 03h',0 -.255 db 'Integrity word',0 -.255.8_15 db 'Checksum',0 -.255.0_7 db 'Signature',0 -;--------------------------------------------------------------------- -s: -.title db 'ID/Name/Value/Wrst',0 -.0 db '?',0 -.1 db 'Raw Read Error Rate',0 -.2 db 'Throughput Performance',0 -.3 db 'Spin Up Time',0 -.4 db 'Start/Stop Count',0 -.5 db 'Reallocated Sector Count',0 -.6 db 'Read Channel Margin',0 -.7 db 'Seek Error Rate',0 -.8 db 'Seek Time Performance',0 -.9 db 'Power-On Hours Count',0 -.10 db 'Spin Retry Count',0 -.11 db 'Recalibration Retries',0 -.12 db 'Device Power Cycle Count',0 -.13 db 'Soft Read Error Rate',0 -;?? db 'Emergency Re-track (Hitachi)',0 -;?? db 'ECC On-The-Fly Count (Hitachi)',0 -;96 db '? (Maxtor) -;97 db '? (Maxtor) -;98 db '? (Maxtor) -;99 db '? (Maxtor) -;100 db '? (Maxtor) -;101 db '? (Maxtor) -.190 db 'Airflow Temperature (WDC)',0 -.191 db 'G-Sense Error Rate',0 -.192 db 'Power-Off Retract Cycle',0 -.193 db 'Load/Unload Cycle Count',0 -.194 db 'Temperature',0 -.195 db 'Hardware ECC Recovered',0 -.196 db 'Reallocation Events Count',0 -.197 db 'Current Pending Sector Count',0 -.198 db 'Uncorrectable Sector Count',0 -.199 db 'UltraDMA CRC Error Rate',0 -.200 db 'Write Error Rate (WD - MultiZone Error Rate)',0 -.201 db 'TA Counter Detected (or Soft read error rate ?)',0 -.202 db 'TA Counter Increased (or Data Address Mark errors ?)',0 -.203 db 'Run out cancel',0 -.204 db 'Soft ECC correction',0 -.205 db 'Thermal asperity rate (TAR)',0 -.206 db 'Flying height',0 -.207 db 'Spin high',0 -.208 db 'Spin buzz',0 -.209 db 'Offline seek performance',0 -.220 db 'Disk Shift',0 -.221 db 'G-Sense Error Rate (Hitachi - Shock Sense Error Rate)',0 -.222 db 'Loaded Hours',0 -.223 db 'Load/Unload Retry Count',0 -.224 db 'Load Friction',0 -.225 db 'Load/Unload Cycle Count',0 -.226 db 'Load-in Time',0 -.227 db 'Torque Amplification Count',0 -.228 db 'Power-Off Retract Count',0 -;229 db '? (IBM DTTA)',0 -.230 db 'GMR Head Amplitude',0 -.231 db 'Temperature',0 -.240 db 'Head Flying Hours (Hitachi)',0 -.250 db 'Read Error Retry Rate',0 -;--------------------------------------------------------------------- -title db 'Hard Disk Drive INFOrmer v0.2',0 -menu_text db 'Info SMART Tests Control < >',0 -ctrl_text1 db 'Ports: 1f0-1f7 170-177',0 -ctrl_text2 db 'Device: 0 1 0 1',0 -edbx_text1 db 'Info: Save Load',0 -edbx_text2 db 'SMART: Save Load',0 -smrt_text1 db 'SMART on/off',0 -page_text db 'Page:',0 -;system_path db '/sys/lib/' -;boxlib_name db 'box_lib.obj',0 -;head_f_i: -;head_f_l db 'error',0 -;err_message_found_lib db 'box_lib.obj was not found',0 -;err_message_import db 'box_lib.obj was not imported ',0 -if lang eq it_IT - error_open_file_string_Info db 'Non riesco ad aprire Info file!',0 - error_save_file_string_Info db 'Non riesco a salvare Info file!',0 - - error_open_file_string_SMART db 'Non riesco ad aprire SMART file!',0 - error_save_file_string_SMART db 'Non riesco a salvare SMART file!',0 -else - error_open_file_string_Info db 'Can not open Info file!',0 - error_save_file_string_Info db 'Can not save Info file!',0 - - error_open_file_string_SMART db 'Can not open SMART file!',0 - error_save_file_string_SMART db 'Can not save SMART file!',0 -end if -no_error_text db 0 -align 4 -error_text dd no_error_text -;--------------------------------------------------------------------- -system_dir_Boxlib db '/sys/lib/box_lib.obj',0 -system_dir_ProcLib db '/sys/lib/proc_lib.obj',0 -;--------------------------------------------------------------------- -align 4 -l_libs_start: - -library01 l_libs system_dir_Boxlib+9, library_path, system_dir_Boxlib, Box_lib_import - -library02 l_libs system_dir_ProcLib+9, library_path, system_dir_ProcLib, ProcLib_import - -end_l_libs: -;--------------------------------------------------------------------- - - -;edit1 edit_box 200,2,85,0xaaaaaa,0x6a9480,0,0xAABBCC,0,128,file_name,ed_focus,10,10 -op1 option_box option_group1,72,44,6,9,0xffffff,0x0,0,0,0 -op2 option_box option_group1,94,44,6,9,0xffffff,0x0,0,0,0 -op3 option_box option_group1,132,44,6,9,0xffffff,0x0,0,0,0 -op4 option_box option_group1,154,44,6,9,0xffffff,0x0,0,0,0 -option_group1 dd op1 -Option_boxs dd op1,op2,op3,op4,0 -;--------------------------------------------------------------------- -;file_name db '/sys/hdd_',0 -;times 128 db (0) -;--------------------------------------------------------------------- -struct f70 - func_n dd ? - param1 dd 0 - param2 dd 0 - param3 dd ? - param4 dd ? - rezerv db 0 - name dd filename_area -ends -;--------------------------------------------------------------------- -func_70 f70 -; Info_name dd filename_area ;file_name -;--------------------------------------------------------------------- -; SMART_name dd filename_area2 ;file_name -;--------------------------------------------------------------------- -align 4 -ProcLib_import: -OpenDialog_Init dd aOpenDialog_Init -OpenDialog_Start dd aOpenDialog_Start -;OpenDialog__Version dd aOpenDialog_Version - dd 0 - dd 0 -aOpenDialog_Init db 'OpenDialog_init',0 -aOpenDialog_Start db 'OpenDialog_start',0 -;aOpenDialog_Version db 'Version_OpenDialog',0 -;--------------------------------------------------------------------- -align 4 -Box_lib_import: -;init_lib dd a_init -;version_lib dd a_version - - -edit_box_draw dd aEdit_box_draw -edit_box_key dd aEdit_box_key -edit_box_mouse dd aEdit_box_mouse -;version_ed dd aVersion_ed - -;check_box_draw dd aCheck_box_draw -;check_box_mouse dd aCheck_box_mouse -;version_ch dd aVersion_ch - -option_box_draw dd aOption_box_draw -option_box_mouse dd aOption_box_mouse -;version_op dd aVersion_op - -;scrollbar_ver_draw dd aScrollbar_ver_draw -;scrollbar_ver_mouse dd aScrollbar_ver_mouse -;scrollbar_hor_draw dd aScrollbar_hor_draw -;scrollbar_hor_mouse dd aScrollbar_hor_mouse -;version_scrollbar dd aVersion_scrollbar - -;dinamic_button_draw dd aDbutton_draw -;dinamic_button_mouse dd aDbutton_mouse -;version_dbutton dd aVersion_dbutton - -;menu_bar_draw dd aMenu_bar_draw -;menu_bar_mouse dd aMenu_bar_mouse -;menu_bar_activate dd aMenu_bar_activate -;version_menu_bar dd aVersion_menu_bar - -;FileBrowser_draw dd aFileBrowser_draw -;FileBrowser_mouse dd aFileBrowser_mouse -;FileBrowser_key dd aFileBrowser_key -;Version_FileBrowser dd aVersion_FileBrowser - -PathShow_prepare dd sz_PathShow_prepare -PathShow_draw dd sz_PathShow_draw -;Version_path_show dd szVersion_path_show - dd 0,0 - -;a_init db 'lib_init',0 -;a_version db 'version',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 - -;aCheck_box_draw db 'check_box_draw',0 -;aCheck_box_mouse db 'check_box_mouse',0 -;aVersion_ch db 'version_ch',0 - -aOption_box_draw db 'option_box_draw',0 -aOption_box_mouse db 'option_box_mouse',0 -;aVersion_op db 'version_op',0 - -;aScrollbar_ver_draw db 'scrollbar_v_draw',0 -;aScrollbar_ver_mouse db 'scrollbar_v_mouse',0 -;aScrollbar_hor_draw db 'scrollbar_h_draw',0 -;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0 -;aVersion_scrollbar db 'version_scrollbar',0 - -;aDbutton_draw db 'dbutton_draw',0 -;aDbutton_mouse db 'dbutton_mouse',0 -;aVersion_dbutton db 'version_dbutton',0 - -;aMenu_bar_draw db 'menu_bar_draw',0 -;aMenu_bar_mouse db 'menu_bar_mouse',0 -;aMenu_bar_activate db 'menu_bar_activate',0 -;aVersion_menu_bar db 'version_menu_bar',0 - -;aFileBrowser_draw db 'FileBrowser_draw',0 -;aFileBrowser_mouse db 'FileBrowser_mouse',0 -;aFileBrowser_key db 'FileBrowser_key',0 -;aVersion_FileBrowser db 'version_FileBrowser',0 - -sz_PathShow_prepare db 'PathShow_prepare',0 -sz_PathShow_draw db 'PathShow_draw',0 -;szVersion_path_show db 'version_PathShow',0 -;--------------------------------------------------------------------- -PathShow_data_1: -.type dd 0 ;+0 -.start_y dw 85 ;+4 -.start_x dw 128 ;+6 -.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 -.area_size_x dw 415 ;+10 -.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable -.background_flag dd 0 ;+16 -.font_color dd 0x0 ;+20 -.background_color dd 0x0 ;+24 -.text_pointer dd fname_Info ;+28 -.work_area_pointer dd text_work_area ;+32 -.temp_text_length dd 0 ;+36 -;--------------------------------------------------------------------- -PathShow_data_2: -.type dd 0 ;+0 -.start_y dw 104 ;+4 -.start_x dw 127 ;+6 -.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 -.area_size_x dw 415 ;+10 -.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable -.background_flag dd 0 ;+16 -.font_color dd 0x0 ;+20 -.background_color dd 0x0 ;+24 -.text_pointer dd fname_SMART ;+28 -.work_area_pointer dd text_work_area2 ;+32 -.temp_text_length dd 0 ;+36 -;--------------------------------------------------------------------- -OpenDialog_data: -.type dd 0 -.procinfo dd procinfo ;+4 -.com_area_name dd communication_area_name ;+8 -.com_area dd 0 ;+12 -.opendir_pach dd temp_dir_pach ;+16 -.dir_default_pach dd communication_area_default_pach ;+20 -.start_path dd open_dialog_path ;+24 -.draw_window dd draw_window ;+28 -.status dd 0 ;+32 -.openfile_pach dd fname_Info ;+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 - -OpenDialog_data2: -.type dd 0 -.procinfo dd procinfo ;+4 -.com_area_name dd communication_area_name2 ;+8 -.com_area dd 0 ;+12 -.opendir_pach dd temp_dir_pach2 ;+16 -.dir_default_pach dd communication_area_default_pach ;+20 -.start_path dd open_dialog_path ;+24 -.draw_window dd draw_window ;+28 -.status dd 0 ;+32 -.openfile_pach dd fname_SMART ;+36 -.filename_area dd filename_area2 ;+40 -.filter_area dd Filter2 -.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 - -communication_area_name2: - db 'FFFFFFFF_open_dialog',0 - -communication_area_name: - db 'FFFFFFFF_open_dialog2',0 -open_dialog_path: -if __nightbuild eq yes - db '/sys/MANAGERS/opendial',0 -else - db '/sys/File Managers/opendial',0 -end if -communication_area_default_pach: - db '/sys',0 - -Filter: -dd Filter.end - Filter -.1: -db 'INFO',0 -.end: -db 0 - -Filter2: -dd Filter.end - Filter -.1: -db 'SMART',0 -.end: -db 0 - -default_Info: - db '/sys/default.info',0 -default_SMART: - db '/sys/default.smart',0 -;--------------------------------------------------------------------- -page_num db 1 -flags dw 100b -;бит 0: 0/1 - InfoBlock не/прочитан -;1: 0/1 - SmartBlock не/прочитан -;2: 1 - показ ControlBlock -;3: 1 - при попытке чтения возникла ошибка (превышено время ожидания) -;4: 0/1 - сохраняем/загружаем InfoBlock/Smart -;5: 0/1 - выбор Master/Slave -;6: 1 - показ Tests -;7: 1 - показ InfoBlock -;8: 1 - показ Smart -;9: 1 - выключаем или включаем SMART -;10: 1 - включаем SMART -;--------------------------------------------------------------------- -IM_END: -;--------------------------------------------------------------------- -align 16 -InfoArray: times 256 dw 0 -SmartArray: times 512 dw 0 - -;buf_cmd_lin rb 0 -;threath_buf rb 0x400 -align 4 -;--------------------------------------------------------------------- -cur_dir_path: - rb 4096 -;--------------------------------------------------------------------- -fname_Info: - rb 4096 ; filename -;--------------------------------------------------------------------- -fname_SMART: - rb 4096 ; filename -;--------------------------------------------------------------------- -text_work_area: - rb 1024 -;--------------------------------------------------------------------- -text_work_area2: - rb 1024 -;--------------------------------------------------------------------- -procinfo: - rb 1024 -;--------------------------------------------------------------------- -temp_dir_pach: - rb 4096 -;--------------------------------------------------------------------- -temp_dir_pach2: - rb 4096 -;--------------------------------------------------------------------- -filename_area: - rb 256 -;--------------------------------------------------------------------- -filename_area2: - rb 256 -;--------------------------------------------------------------------- -library_path: - rb 4096 -;--------------------------------------------------------------------- - rb 4096 -stacktop: -;--------------------------------------------------------------------- -I_END: -;--------------------------------------------------------------------- +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +; v. 0.2 +; last update: 19/09/2010 +; written by: Marat Zakiyanov aka Mario79, aka Mario +; changes: select path with OpenDialog +; show 2 different path for Info and SMART files +; draw number of page +;--------------------------------------------------------------------- +; v. 0.11: 15.09.2009 staper@inbox.ru +;--------------------------------------------------------------------- +; Макросы load_lib.mac, editbox_ex и библиотеку box_lib.obj создали: +; - Alexey Teplov / Алексей Теплов +; Mario79, Mario - Marat Zakiyanov / Марат Закиянов +; Diamondz - Evgeny Grechnikov / Евгений Гречников и др. +;--------------------------------------------------------------------- +use32 + org 0 + + db 'MENUET01' + dd 1 + dd START + dd IM_END + dd I_END ;(i_end+200) and not 3 + dd stacktop ;(i_end+200) and not 3 + dd 0x0 ;buf_cmd_lin + dd cur_dir_path + +PRIMARY_CHANNEL equ 0x1f7 +SECONDARY_CHANNEL equ 0x177 +; Ручной поиск портов по шине PCI (преимущественно для SATA): +; mcall SF_SYSTEM_SET,SSF_ACCESS_PCI,1 ;разрешить низкоуровневый доступ к PCI +; mcall SF_PCI,0x0006,((((0x1f shl 3) + 01) shl 8) + 0x10) ;см. ф-ю 62 +; ax = 1 - стандартные порты (константы выше), или нестандартные (168-16f,1e8-1ef) +; Пример: +; Fnc 02: 10-0x1c01,14-0x18f5,18-0x18f9,1c-0x18f1,BMA-0x1811,00000000 +; Fnc 01: 10-1,14-1,18-1,1c-1,BMA-0x18e1,0x18d1 +; Регистр по смещению 0х10 для функции 02 содержит 0x1c01 (порты 0х1с00-0х1с07) + +include 'lang.inc' ; language support + +; Режимы Legacy, Native и пр. меняются через BIOS. +include '../../../config.inc' ;for nightbuild +include '../../../macros.inc' +include '../../../develop/libraries/box_lib/box_lib.mac' +include '../../../KOSfuncs.inc' +include '../../../load_lib.mac' + @use_library +;--------------------------------------------------------------------- +macro ab { + add ebx,455*65536 + } +;--------------------------------------------------------------------- +macro sb { + sub ebx,455*65536-12 + } +;--------------------------------------------------------------------- +macro ad { + add ebx,12 + } +;--------------------------------------------------------------------- +macro wba num,text { +@@: + bt di,num + jnc @f + ad + mcall SF_DRAW_TEXT,,0x80000000,text + } +;--------------------------------------------------------------------- +macro wba num,text { +@@: + bt di,num + jnc @f + ad + mcall SF_DRAW_TEXT,,0x80000000,text + } +;--------------------------------------------------------------------- +macro sc num,text { + cmp al,num + jne @f + mov edx,text +@@: + } +;--------------------------------------------------------------------- +macro mz text,str1,str2,str3 { + mcall SF_DRAW_TEXT,,0x80444444,text + ab + mov edx,ebx + push ebx + str1 + str2 + str3 + mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 + pop ebx + sb + } +;--------------------------------------------------------------------- +START: +; load_library boxlib_name,buf_cmd_lin,system_path,Box_lib_import + mcall SF_SYS_MISC,SSF_HEAP_INIT + +load_libraries l_libs_start,end_l_libs + + cmp eax,-1 + jz close +;--------------------------------------------------------------------- + mov edi,filename_area + mov esi,default_Info+5 ;default.info + call copy_str_1 + + mov edi,filename_area2 + mov esi,default_SMART+5 ;default.smart + call copy_str_1 + + mov edi,fname_Info + mov esi,default_Info ;/sys/default.info + call copy_str_1 + + mov edi,fname_SMART ;/sys/default.smart +; cmp byte [edi], 0 +; jne skin_path_ready + mov esi,default_SMART + call copy_str_1 +;skin_path_ready: +;--------------------------------------------------------------------- +;OpenDialog initialisation + push dword OpenDialog_data + call [OpenDialog_Init] + + push dword OpenDialog_data2 + call [OpenDialog_Init] + +; prepare for PathShow + push dword PathShow_data_1 + call [PathShow_prepare] + + push dword PathShow_data_2 + call [PathShow_prepare] +;--------------------------------------------------------------------- + + mcall SF_SET_EVENTS_MASK,0x27 +;--------------------------------------------------------------------- +redraw_all: +redraw: + call draw_window +;--------------------------------------------------------------------- +still: + mcall SF_WAIT_EVENT + dec al + jz redraw_all + dec al + jz key + dec al + jz button +;--------------------------------------------------------------------- +mouse: + bt [flags],2 + jnc still + mcall SF_MOUSE_GET,SSF_BUTTON + test al,al + jz still + push dword Option_boxs + call [option_box_mouse] + jmp still +;--------------------------------------------------------------------- +copy_str_1: + xor eax,eax + cld +@@: + lodsb + stosb + test eax,eax + jnz @b + ret +;--------------------------------------------------------------------- +draw_PathShow: + pusha + mcall SF_DRAW_RECT,<125,420>,<83,15>,0xFFFFED + mcall SF_DRAW_RECT,,<100,15>, +; draw for PathShow + push dword PathShow_data_1 + call [PathShow_draw] + + push dword PathShow_data_2 + call [PathShow_draw] + popa + ret +;--------------------------------------------------------------------- +draw_window: + mcall SF_REDRAW,SSF_BEGIN_DRAW + xor esi,esi + mcall SF_CREATE_WINDOW,<100,580>,<100,350>,0x34ffffff,,title + mcall SF_DEFINE_BUTTON,<1,30>,<1,15>,2,0x365732 + mcall ,<35,38>,,3, +; mcall ,<77,38>,,6, + mcall ,<120,45>,,7, + + mcall ,<195,20>,,4, ;влево,вправо + mcall ,<217,20>,,5, + mcall SF_DRAW_TEXT,<4,6>,0x80ffffff,menu_text + + mcall ,<260,6>,0x80000000,page_text + movzx ecx, byte [page_num] + mcall SF_DRAW_NUMBER,0x800a0000,,<300,6>,0x0 + + mcall SF_DRAW_LINE,<2,535>,<20,20>,0x00aabbaa + bt [flags],2 + jnc @f + call show_ControlBlock + mcall SF_DRAW_TEXT,<4,125>,0x80FF0000,[error_text] + jmp .end +@@: + bt [flags],6 + jnc @f + call show_TestBlock + jmp .end +@@: + bt [flags],7 + jnc @f + call show_InfoBlock + jmp .end +@@: + bt [flags],8 + jnc .end + call show_SmartBlock +.end: + mcall SF_REDRAW,SSF_END_DRAW + ret +;--------------------------------------------------------------------- +key: + mcall SF_GET_KEY +; push edit1 +; call [edit_box_key] +; push edit1 +; call [edit_box_draw] + jmp still +;--------------------------------------------------------------------- +button: + mcall SF_GET_BUTTON + cmp ah,1 + jne @f +close: + mcall SF_TERMINATE_PROCESS +@@: + cmp ah,2 + jne @f + call get_InfoBlock + mov ax,[flags] + btr ax,2 + btr ax,6 + bts ax,7 + btr ax,8 + mov [flags],ax + mov [page_num],1 + jmp redraw +;--------------------------------------------------------------------- +@@: + cmp ah,3 + jne @f + call get_SmartBlock + mov [page_num],1 + mov ax,[flags] + btr ax,2 + btr ax,6 + btr ax,7 + bts ax,8 + mov [flags],ax + jmp redraw +;--------------------------------------------------------------------- +@@: + cmp ah,4 + jne @f + cmp [page_num],1 + je still + dec [page_num] + jmp redraw +;--------------------------------------------------------------------- +@@: + cmp ah,5 + jne @f + cmp [page_num],5 + je still + inc [page_num] + jmp redraw +;--------------------------------------------------------------------- +@@: + cmp ah,6 + jne @f + mov ax,[flags] + btr ax,2 + btr ax,6 + btr ax,7 + btr ax,8 + mov [flags],ax + jmp redraw +;--------------------------------------------------------------------- +@@: + cmp ah,7 + jne @f + mov ax,[flags] + bts ax,2 + btr ax,6 + btr ax,7 + btr ax,8 + mov [flags],ax +@@: + cmp ah,8 + jne @f + bts [flags],9 + call get_SmartBlock + jmp still +;--------------------------------------------------------------------- +@@: + cmp ah,9 ; Save Info + jne @f +; invoke OpenDialog + mov [OpenDialog_data.type],dword 1 + push dword OpenDialog_data + call [OpenDialog_Start] + cmp [OpenDialog_data.status],1 + jne still +; prepare for PathShow + push dword PathShow_data_1 + call [PathShow_prepare] + call draw_PathShow + + btr [flags],4 + jmp save_file +;--------------------------------------------------------------------- +@@: + cmp ah,10 ; Load Info + jne @f +; invoke OpenDialog + mov [OpenDialog_data.type],dword 0 + push dword OpenDialog_data + call [OpenDialog_Start] + cmp [OpenDialog_data.status],1 + jne still +; prepare for PathShow + push dword PathShow_data_1 + call [PathShow_prepare] + call draw_PathShow + + btr [flags],4 + jmp open_file +;--------------------------------------------------------------------- +@@: + cmp ah,11 ; Save SMART + jne @f +; invoke OpenDialog + mov [OpenDialog_data2.type],dword 1 + push dword OpenDialog_data2 + call [OpenDialog_Start] + cmp [OpenDialog_data2.status],1 + jne still +; prepare for PathShow + push dword PathShow_data_2 + call [PathShow_prepare] + call draw_PathShow + + bts [flags],4 + jmp save_file +;--------------------------------------------------------------------- +@@: + cmp ah,12 ; Load SMART + jne redraw +; invoke OpenDialog + mov [OpenDialog_data2.type],dword 0 + push dword OpenDialog_data2 + call [OpenDialog_Start] + cmp [OpenDialog_data2.status],1 + jne still +; prepare for PathShow + push dword PathShow_data_2 + call [PathShow_prepare] + call draw_PathShow + + bts [flags],4 + jmp open_file +;--------------------------------------------------------------------- +open_file: + mov [func_70.func_n],SSF_READ_FILE + mov [func_70.param3],512 + mov [func_70.param4],InfoArray + mov [func_70.name],filename_area + bt [flags],4 + jnc @f + mov [func_70.param4],SmartArray + mov [func_70.param3],1024 + mov [func_70.name],filename_area2 +@@: + mcall SF_FILE,func_70 + test al,al ;файл найден? + jnz .1 + mov ax,[flags] + bts ax,0 + btr ax,7 + btr ax,8 + btr ax,6 + btr ax,2 + bt ax,4 + jc @f + bts ax,7 + mov [flags],ax + jmp good +@@: + bts ax,8 + mov [flags],ax + jmp redraw_all +.1: + bt [flags],4 + jnc @f + mov [error_text],error_open_file_string_SMART + jmp redraw_all +@@: + mov [error_text],error_open_file_string_Info + jmp redraw_all +;--------------------------------------------------------------------- +save_file: ;сохраняем файл + mov [func_70.func_n],SSF_CREATE_FILE + mov [func_70.param3],512 + mov [func_70.param4],InfoArray + mov [func_70.name],filename_area + bt [flags],4 + jnc @f + mov [func_70.param4],SmartArray + mov [func_70.param3],1024 + mov [func_70.name],filename_area2 +@@: + mcall SF_FILE,func_70 + test al,al ;сохранён удачно? + jz good + bt [flags],4 + jnc @f + mov [error_text],error_save_file_string_SMART + jmp redraw_all +@@: + mov [error_text],error_save_file_string_Info + jmp redraw_all +;--------------------------------------------------------------------- +good: + mov [error_text],no_error_text + jmp redraw_all +;--------------------------------------------------------------------- +ports_: + mov eax,[option_group1] + cmp eax,op1 + jne @f + mov edx,PRIMARY_CHANNEL + btr [flags],5 + jmp .0 +;--------------------------------------------------------------------- +@@: + cmp eax,op2 + jne @f + mov edx,PRIMARY_CHANNEL + bts [flags],5 + jmp .0 +;--------------------------------------------------------------------- +@@: + cmp eax,op3 + jbe @f + mov edx,SECONDARY_CHANNEL + btr [flags],5 + jmp .0 +;--------------------------------------------------------------------- +@@: + mov edx,SECONDARY_CHANNEL + bts [flags],5 +.0: + mov ecx,edx + sub ecx,7 + mcall SF_SET_PORTS,0 + ret +;--------------------------------------------------------------------- +get_InfoBlock: + call ports_ + push ecx edx + xor ecx,ecx +.1: + in al,dx ;Проверить готовность + dec cx ;необходимо проверять и бит 7, однако работает ... + jz .error + bt ax,6 + jnc .1 + + dec dx + in al,dx + mov bx,ax ;сохраняем бит выбора устройтсва + btr ax,4 + bt [flags],5 + jnc @f + bts ax,4 +@@: + out dx,al + inc dx + mov al,0xec + out dx,al + + push bx + mcall SF_SLEEP,10 + pop bx + xor cx,cx +.2: + in al,dx ;Проверить готовность + dec cx + jz .error + bt ax,6 + jnc .2 + + mov esi,InfoArray ;Получить информацию + xor edi,edi + sub dx,7 +.3: + in ax,dx + xchg al,ah + mov [esi+edi*2],ax + inc edi + cmp edi,256 + jne .3 + bts [flags],0 + btr [flags],2 + btr [flags],3 + + push bx + mcall SF_SLEEP,10 + pop bx + + mov ax,bx + add dx,6 + out dx,al + pop edx ecx + mcall SF_SET_PORTS,1 + ret +;--------------------------------------------------------------------- +.error: + bts [flags],3 + pop edx ecx + mcall SF_SET_PORTS,1 + ret +;--------------------------------------------------------------------- +get_SmartBlock: + call ports_ + push ecx edx + xor ecx,ecx +.1: + in al,dx ;Проверить готовность + dec cx + jz .error + bt ax,6 + jnc .1 + + dec dx + in al,dx + mov cx,ax ;сохраняем бит выбора устройтсва + btr ax,4 + bt [flags],5 + jnc @f + bts ax,4 +@@: + out dx,al + inc dx + + bt [flags],9 ;S.M.A.R.T. on/off + jnc @f + sub dx,3 + mov al,0x4f + out dx,al + inc dx + mov al,0xc2 + out dx,al + sub dx,4 + mov al,0xd8 + btc [flags],10 + jnc .2 + inc al +.2: + out dx,al + add dx,6 + mov al,0xb0 + out dx,al + dec dx + mov ax,cx + out dx,ax + btr [flags],9 + btr [flags],1 + jmp .end +;--------------------------------------------------------------------- +@@: + sub dx,3 + mov al,0x4f + out dx,al + inc dx + mov al,0xc2 + out dx,al + sub dx,4 + mov al,0xd0 + out dx,al + add dx,6 + mov al,0xb0 + out dx,al + + mcall SF_SLEEP,10 + + mov esi,SmartArray ;Получить информацию + xor edi,edi + sub dx,7 +.3: + in ax,dx + xchg al,ah + mov [esi+edi*2],ax + inc edi + cmp edi,256 + jne .3 + + mcall SF_SLEEP,10 + + add dx,4 + mov al,0x4f + out dx,al + inc dx + mov al,0xc2 + out dx,al + sub dx,4 + mov al,0xd1 + out dx,al + add dx,6 + mov al,0xb0 + out dx,al + + mcall SF_SLEEP,10 + + sub dx,7 +.4: + in ax,dx + xchg al,ah + mov [esi+edi*2],ax + inc edi + cmp edi,256*2 + jne .4 + + bts [flags],1 + btr [flags],3 + mov ax,cx + add dx,6 + out dx,al +.end: + pop edx ecx + mcall SF_SET_PORTS,1 + ret +;--------------------------------------------------------------------- +.error: + bts [flags],3 + pop edx ecx + mcall SF_SET_PORTS,1 + ret +;--------------------------------------------------------------------- +show_ControlBlock: + mcall SF_DRAW_TEXT,<4,30>,0x80000000,ctrl_text1 + mcall ,<4,45>,,ctrl_text2 + push dword Option_boxs + call [option_box_draw] +; push dword edit1 +; call [edit_box_draw] + call draw_PathShow + + mcall SF_DEFINE_BUTTON,<3,80>,<60,15>,8,0xf0f0f0 + mcall ,<50,30>,<82,15>,9, ; Save Info + mcall ,<90,30>,,10, ; Load Info + mcall ,<50,30>,<100,15>,11, ; Save SMART + mcall ,<90,30>,,12, ; Load SMART + mcall SF_DRAW_TEXT,<4,87>,0x80000000,edbx_text1 + mcall ,<7,64>,,smrt_text1 + mcall ,<4,105>,,edbx_text2 +show_TestBlock: + ret +;--------------------------------------------------------------------- +show_InfoBlock: + bt [flags],0 + jnc .end + bt [flags],3 + jc .end + mov al,[page_num] + dec al + jz .page1 + dec al + jz .page2 + dec al + je .page3 + dec al + jz .page4 + dec al + jz .page5 +.end: + ret +;--------------------------------------------------------------------- +.page1: +;TABLE 1 of 11 + mcall SF_DRAW_TEXT,5*65536+25,0x80444444,t.10_19 + ab ; add ebx,300*65536 + mcall ,,0x0,(InfoArray+10*2),((19-10)+1)*2 + sb ; sub ebx,300*65536-12 + mcall ,,0x80444444,t.23_26 + ab + mcall ,,0x0,(InfoArray+23*2),((26-23)+1)*2 + sb + mcall ,,0x80444444,t.27_46 + ab + mcall ,,0x0,(InfoArray+27*2),((46-27)+1)*2 + sb + mcall ,,0x80444444,t.type + ab + mov di,[InfoArray+222*2] +@@: + bt di,4 + jnc @f + mcall SF_DRAW_TEXT,,0x80000000,t.222.12.1 +@@: + bt di,4 + jc @f + mcall SF_DRAW_TEXT,,0x80000000,t.222.12.0 +@@: + sb + mcall SF_DRAW_TEXT,,0x80444444,t.60_61 + ab + mov edx,ebx + push ebx + mov ecx, [InfoArray+60*2] + bswap ecx + ror ecx,16 + mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 + shr ecx,11 ;LBA in MB + add edx,70*65536 + mcall ,,,,0x459a + pop ebx + + sb ;CHS + mcall SF_DRAW_TEXT,,0x80444444,t.chs + ab + mov edx,ebx + push ebx + movzx ecx, word [InfoArray+2] + xchg ch,cl + mcall SF_DRAW_NUMBER,0x80050000,,,0x0 + add edx,35*65536 + movzx ecx, word [InfoArray+6] + xchg ch,cl + mcall SF_DRAW_NUMBER,0x80040000,,,0x0 + add edx,15*65536 + movzx ecx, word [InfoArray+12] + xchg ch,cl + mcall ;SF_DRAW_NUMBER,0x80040000,,,0x0 + add edx,20*65536 + push ebx edx + xor edx,edx + movzx eax,word[InfoArray+2] + xchg ah,al + movzx ebx, word [InfoArray+6] + xchg bh,bl + mul ebx + mul ecx + xchg eax,ecx + pop edx ebx + shr ecx,11 + mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 + pop ebx + + mov ax,[InfoArray+48*2] + bt ax,8 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.48.0 + ab + mcall ,,0x80000000,t.sup +@@: + mov ax,[InfoArray+49*2] + xchg al,ah + mov di,ax + bt di,13 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.49.13.1 + ab + mcall ,,0x80000000,t.sup +@@: + bt di,13 + jc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.49.13.0 + ab +@@: + bt di,11 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.49.11.1 + ab + mcall ,,0x80000000,t.sup +@@: + bt di,11 + jc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.49.11.0 + ab + mcall ,,0x80000000,t.sup +@@: + bt di,10 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.49.10.1 + ab +@@: + bt di,9 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.49.9 + ab + mcall ,,0x80000000,t.sup +@@: + bt di,8 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.49.8 + ab + mcall ,,0x80000000,t.sup +@@: + sb + mcall SF_DRAW_TEXT,,0x80444444,t.47 +; add ebx,10 +; mcall SF_DRAW_TEXT,,0x80444444,t.47_ + ab + mov edx,ebx + movzx ecx, word [InfoArray+47*2] + xchg ch,cl + mcall SF_DRAW_NUMBER,0x80050000,,,0x80000000 + mov ebx,edx + + +;PART 2 of 11 + sb + mcall SF_DRAW_TEXT,,0x80444444,t.59 +; add ebx,10 +; mcall SF_DRAW_TEXT,,0x80444444,t.59_ + ab + mov edx,ebx + movzx ecx, word [InfoArray+59*2] + xchg ch,cl + mcall SF_DRAW_NUMBER,0x80050000,,,0x0 + mov ebx,edx + + mov ax,[InfoArray+63*2] + xchg al,ah + mov di,ax + bt di,10 + jnc @f + mov edx,ebx +; push ebx + sb + mcall SF_DRAW_TEXT,,0x80444444,t.63.10 + ab + mcall ,,0x80000000,t.sel +@@: + bt di,9 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.63.9 + ab + mcall ,,0x80000000,t.sel +@@: + bt di,8 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.63.8 + ab + mcall ,,0x80000000,t.sel +@@: + bt di,2 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.63.2 + ab + mcall ,,0x80000000,t.sup +@@: + bt di,1 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.63.1 + ab + mcall ,,0x80000000,t.sup +@@: + bt di,0 + jnc @f + sb + mcall SF_DRAW_TEXT,,0x80444444,t.63.0 + ab + mcall ,,0x80000000,t.sup +@@: + +;PART 3 of 11 + sb + mcall SF_DRAW_TEXT,,0x80444444,t.75.0_4 + ab + mov edx,ebx + push ebx + movzx ecx, byte [InfoArray+75*2+1] + mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 + pop ebx + +;words 76-79 - SATA +;.word80: +; sb +; mcall SF_DRAW_TEXT,,0x80444444,t.80 +; ab +; mov cx,[InfoArray+80*2] +; test cx,cx +; jnz @f +; mcall SF_DRAW_TEXT,,0x80444444,t.unk +; ret +;@@: cmp cx,-1 +; jne @f +; mcall SF_DRAW_TEXT,,0x80444444,t.unk +; ret +;@@: xchg ch,cl +; mov edx,ebx +; mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 +; mov ebx,edx + sb + mcall SF_DRAW_TEXT,,0x80444444,t.80__ + mov ax,[InfoArray+80*2] + ab + xchg al,ah + mov di,ax + bt di,8 + jnc @f + mcall SF_DRAW_TEXT,,0x80000000,t.80.8 + jmp .end +;--------------------------------------------------------------------- +@@: + bt di,7 + jnc @f + mcall SF_DRAW_TEXT,,0x80000000,t.80.7 + jmp .end +;--------------------------------------------------------------------- +@@: + bt di,6 + jnc @f + mcall SF_DRAW_TEXT,,0x80000000,t.80.6 + jmp .end +;--------------------------------------------------------------------- +@@: + bt di,5 + jnc @f + mcall SF_DRAW_TEXT,,0x80000000,t.80.5 + jmp .end +;--------------------------------------------------------------------- +@@: + bt di,4 + jnc @f + mcall SF_DRAW_TEXT,,0x80000000,t.80.4 + jmp .end +@@: + ret +;--------------------------------------------------------------------- +.page2: +;PART 4 of 11 + mcall SF_DRAW_TEXT,5*65536+25,0x80444444,t.82 + add ebx,10*65536 + mov ax,[InfoArray+82*2] + xchg al,ah + mov di,ax + bt di,14 + jnc @f + ad + mcall SF_DRAW_TEXT,,0x80000000,t.82.14 + wba 13,t.82.13 + wba 12,t.82.12 + wba 10,t.82.10 + wba 9,t.82.9 + wba 8,t.82.8 + wba 7,t.82.7 + wba 6,t.82.6 + wba 5,t.82.5 + wba 4,t.82.4 + wba 3,t.82.3 + wba 1,t.82.1 + wba 0,t.82.0 +@@: + mov ax,[InfoArray+83*2] + xchg al,ah + mov di,ax + + wba 13,t.83.13 + wba 12,t.83.12 + wba 11,t.83.11 + wba 10,t.83.10 + wba 9,t.83.9 + wba 8,t.83.8 + wba 6,t.83.6 + wba 5,t.83.5 + wba 3,t.83.3 + wba 2,t.83.2 + wba 1,t.83.1 + wba 0,t.83.0 +@@: + +;PART 5 of 11 + mov ebx,290*65536+25 + mov ax,[InfoArray+84*2] + xchg al,ah + mov di,ax + wba 13,t.84.13 + wba 8,t.84.8 + wba 7,t.84.7 + wba 6,t.84.6 + wba 5,t.84.5 + wba 4,t.84.4 + wba 3,t.84.3 + wba 2,t.84.2 + wba 1,t.84.1 + wba 0,t.84.0 +@@: + ret +;--------------------------------------------------------------------- +.page3: + mcall SF_DRAW_TEXT,5*65536+25,0x80444444,t.85 + add ebx,10*65536 + mov ax,[InfoArray+85*2] + xchg al,ah + mov di,ax + bt di,14 + jnc @f + ad + mcall SF_DRAW_TEXT,,0x80000000,t.85.14 + wba 13,t.85.13 + wba 12,t.85.12 + wba 10,t.85.10 +; ad +; mcall SF_DRAW_TEXT,,0x80000000,t.85.10_ + wba 9,t.85.9 + wba 8,t.85.8 + wba 7,t.85.7 + wba 6,t.85.6 + wba 5,t.85.5 + wba 4,t.85.4 + wba 3,t.85.3 + wba 1,t.85.1 + wba 0,t.85.0 +@@: + mov ax,[InfoArray+86*2] + xchg al,ah + mov di,ax + bt di,13 + jnc @f + ad + mcall SF_DRAW_TEXT,,0x80000000,t.86.13 + wba 12,t.86.12 + wba 11,t.86.11 + wba 10,t.86.10 + wba 9,t.86.9 + wba 8,t.86.8 + wba 6,t.86.6 + wba 5,t.86.5 + wba 3,t.86.3 + wba 2,t.86.2 + wba 1,t.86.1 + wba 0,t.86.0 +@@: + ret +;--------------------------------------------------------------------- +.page4: + mov ebx,5*65536+25 + mov ax,[InfoArray+88*2] + xchg al,ah + xor di,di + bt ax,8 + jnc @f + mov di,1 +@@: + bt ax,9 + jnc @f + mov di,2 +@@: + bt ax,10 + jnc @f + mov di,3 +@@: + bt ax,11 + jnc @f + mov di,4 +@@: + bt ax,12 + jnc @f + mov di,5 +@@: + bt ax,13 + jnc @f + mov di,6 +@@: + test di,di + jz @f + mcall SF_DRAW_TEXT,,0x80444444,t.88 + mov edx,ebx + push ebx + add edx,90*65536 + movzx ecx, word di + dec cl + mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 + pop ebx + ad +@@: + xor di,di + mov ax,[InfoArray+88*2] + xchg al,ah + bt ax,0 + jnc @f + mov di,1 +@@: + bt ax,1 + jnc @f + mov di,2 +@@: + bt ax,2 + jnc @f + mov di,3 +@@: + bt ax,3 + jnc @f + mov di,4 +@@: + bt ax,4 + jnc @f + mov di,5 +@@: + bt ax,5 + jnc @f + mov di,6 +@@: + bt ax,6 + jnc @f + mov di,7 +@@: + test di,di + jz @f + mcall SF_DRAW_TEXT,,0x80444444,t.88.1_6 + mov edx,ebx + push ebx + add edx,90*65536 + movzx ecx, word di + dec cl + mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 + pop ebx + ad +@@: + mz t.89,, + mz t.90,, + mz t.91,, + mz t.92,, +;WORD 94 + mz t.94.8_15,, + mz t.94.0_7,, + mz t.95,, + mz t.96,, + mz t.97,, + mz t.98_99,,, + mz t.100_103,,, + mz t.104,, + +;PART 6 of 11 ? + mcall SF_DRAW_TEXT,,0x80444444,t.106 + add ebx,12 + mov ax,[InfoArray+106*2] + xchg ah,al + mov di,ax + bt di,13 + jnc @f + mcall SF_DRAW_TEXT,,0x80444444,t.106.13 + add ebx,15 +@@: + bt di,12 + jnc @f + mcall SF_DRAW_TEXT,,0x80444444,t.106.12 + add ebx,15 +@@: + mcall SF_DRAW_TEXT,,0x80444444,t.106.0_3 + ab + shl di,12 + shr di,12 + movzx ecx,di + mov edx,ebx + mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 + mov ebx,edx + sb + + mz t.107,, +;108 - 111 добавить + mz t.117_118,, + ret +;--------------------------------------------------------------------- +.page5: +; mcall SF_DRAW_TEXT,5*65536+25,0x80444444,t.85 + ret +;--------------------------------------------------------------------- +show_SmartBlock: + bt [flags],1 + jnc .end + bt [flags],3 + jc .end + + cmp byte [SmartArray+2],0 + je .end + mcall SF_DRAW_TEXT,5*65536+25,0x80444444,s.title + ad + movzx ax, byte [SmartArray+2] + cmp ax,30 ;максимум 30 атрибутов + jg .end + push ax + push dword (3+SmartArray) +@@: + xor edx,edx + call .find + push edx + + mov edx,ebx + movzx ecx,al + mcall SF_DRAW_NUMBER,0x80030000,,,0x0 + mov ebx,edx + add ebx,30*65536 + pop edx + test edx,edx + jnz .0 + mov edx,s.0 + .0: mov eax,[esp] + mov al,[eax+2] + mov ecx,0x80000000 + and al,1 + jz .1 +; mov ecx,0x80ff0000 + .1: mcall SF_DRAW_TEXT,,, + sub ebx,30*65536 + + mov ecx,[esp] + inc ecx + movzx ecx, byte [ecx] + add ebx,400*65536 + mov edx,ebx + mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 + mov ecx,[esp] + add ecx,4 + movzx ecx, byte [ecx] + add edx,30*65536 + mcall SF_DRAW_NUMBER,0x800a0000,,,0x0 + mov ebx,edx + sub ebx,(30+400)*65536 + + ad + add dword [esp],12 + dec word [esp+4] + jnz @b + add esp,6 +.end: + ret +;--------------------------------------------------------------------- +.find: + mov eax, dword [esp+4] + mov al,[eax] + sc 1,s.1 + sc 2,s.2 + sc 3,s.3 + sc 4,s.4 + sc 5,s.5 + sc 6,s.6 + sc 7,s.7 + sc 8,s.8 + sc 9,s.9 + sc 10,s.10 + sc 11,s.11 + sc 12,s.12 + sc 13,s.13 + sc 190,s.190 + sc 191,s.191 + sc 192,s.192 + sc 193,s.193 + sc 194,s.194 + sc 195,s.195 + sc 196,s.196 + sc 197,s.197 + sc 198,s.198 + sc 199,s.199 + sc 200,s.200 + sc 201,s.201 + sc 202,s.202 + sc 203,s.203 + sc 204,s.204 + sc 205,s.205 + sc 206,s.206 + sc 207,s.207 + sc 208,s.208 + sc 209,s.209 + sc 220,s.220 + sc 221,s.221 + sc 222,s.222 + sc 223,s.223 + sc 224,s.224 + sc 225,s.225 + sc 226,s.226 + sc 227,s.227 + sc 228,s.228 + sc 230,s.230 + sc 231,s.231 + sc 240,s.240 + sc 250,s.250 + ret +;--------------------------------------------------------------------- +;DATA AREA +if lang eq it_IT + t: + .sup db 'supportato',0 + .sel db 'selzionato',0 + .enb db 'abilitato',0 + .unk db 'sconosciuto',0 + .type db 'Tipo',0 + .chs db 'CHS',0 +else + t: + .sup db 'supported',0 + ;.usp db 'unsupported',0 + .sel db 'selected',0 + ;.usl db 'not selected',0 + .enb db 'enabled',0 + ;.dis db 'disabled',0 + .unk db 'unknown',0 + .type db 'Type',0 + .chs db 'CHS',0 +end if + +if lang eq it_IT + .10_19 db 'Numero seriale',0 + .23_26 db 'Versione firmware',0 + .27_46 db 'Numero modello',0 + .47 db 'Max. number of sectors that shall be transferred per DRQ data block',0 + .48.0 db 'Trusted Computing feature set is',0 + .49.13.1 db 'Standby timer values are',0 + .49.13.0 db 'Standby timer values shall be managed by the device',0 + .49.11.1 db 'IORDY',0 + .49.11.0 db 'IORDY may be',0 + .49.10.1 db 'IORDY potrebbe essere disabilitato',0 + .49.9 db 'LBA',0 + .49.8 db 'DMA',0 +else + .10_19 db 'Serial number',0 + .23_26 db 'Firmware revision',0 + .27_46 db 'Model number',0 + .47 db 'Max. number of sectors that shall be transferred per DRQ data block',0 + ;.47 db 'Maximum number of logical sectors that shall be transferred per DRQ',0 + ;.47_ db 'data block on READ/WRITE MULTIPLE commands',0 + .48.0 db 'Trusted Computing feature set is',0 ;1 sup + .49.13.1 db 'Standby timer values are',0 ;sup + .49.13.0 db 'Standby timer values shall be managed by the device',0 + .49.11.1 db 'IORDY',0 ;sup + .49.11.0 db 'IORDY may be',0 ;sup + .49.10.1 db 'IORDY may be disabled',0 + .49.9 db 'LBA',0 ;1 sup + .49.8 db 'DMA',0 ;1 sup +end if + +;.53 db 'Free-fall Control Sensitivity',0 +;.53.6_15 db 'Sensitivity level',0 +.59 db 'Current number of sectors that shall be transferred per DRQ data block',0 +;.59 db 'Current setting for number of logical sectors that shall be',0 +;.59_ db 'transferred per DRQ data block on READ/WRITE MULTIPLE commands',0 +.60_61 db 'Total number of user addressable logical sectors',0 +.63.10 db 'Multiword DMA mode 2 is',0 ;1 sel +.63.9 db 'Multiword DMA mode 1 is',0 ;1 sel +.63.8 db 'Multiword DMA mode 0 is',0 ;1 sel +.63.2 db 'Miltiword DMA mode 2 and below are',0 ;sup +.63.1 db 'Miltiword DMA mode 1 and below are',0 ;sup +.63.0 db 'Miltiword DMA mode 0 is',0 ;sup +.64.0_7 db 'PIO modes',0 ;sup + +;.65 - .68 добавить + +.75.0_4 db 'Maximum queue depth -1 ',0 +.76 db 'Serial ATA Capabilities:',0 +.76.10 db 'Supports Phy Event Counters',0 ;1 +.76.9 db 'Supports receit of host initiated power management request',0 ;1 +.76.8 db 'Supports native Command Queuing',0 ;1 +.76.2 db 'Supports SATA Gen2 Signaling Speed (3.0Gb/s)',0 +.76.1 db 'Supports SATA Gen1 Signaling Speed (1.5Gb/s)',0 +.78 db 'SATA Features Supported',0 +.78_ db 'Device supports:',0 +.78.6 db 'Software Setting Preservation',0 ;1 +.78.4 db 'in-order data delivery',0 ;1 +.78.3 db 'initiating power management',0 ;1 +.78.2 db 'DMA Setup auto-activation',0 ;1 +.78.1 db 'non-zero buffer offsets',0 ;1 +.79 db 'SATA Features Enabled:',0 +.79.6 = .78.6;1 enb +.79.4 = .78.4;1 enb +.79.3 = .78.3;1 enb +.79.2 = .78.2;1 enb +.79.1 = .78.1;1 enb +.80 db 'Major revision number',0 +.80__ db 'supports:',0 +.80.8 db 'ATA8-ACS',0 ;1 +.80.7 db 'ATA/ATAPI-7',0 ;1 +.80.6 db 'ATA/ATAPI-6',0 ;1 +.80.5 db 'ATA/ATAPI-5',0 ;1 +.80.4 db 'ATA/ATAPI-4',0 ;1 +.81 db 'Minor revision number',0 + +.82 db 'Command set/feature supported:',0 +.82.14 db 'NOP command',0 ;1 sup +.82.13 db 'READ BUFFER command',0 ;1 sup +.82.12 db 'WRITE BUFFER command',0 ;1 sup +.82.10 db 'Host Protected Area feature set',0 ;1 sup +.82.9 db 'DEVICE RESET command',0 ;1 sup +.82.8 db 'SERVICE interrupt',0 ;1 sup +.82.7 db 'release interrupt',0 ;1 sup +.82.6 db 'read look-ahead',0 ;1 sup +.82.5 db 'volatile write cache',0 ;1 sup +.82.4 db 'PACKET feature set',0 ;1 sup +.82.3 db 'Mandatory Power Management feature set',0 ;1 sup +.82.1 db 'Security feature set',0 ;1 sup +.82.0 db 'SMART feature set',0 ;1 sup +;.83 db 'Command sets supported:',0 +.83.13 db 'FLUSH CACHE EXT command',0 ;1 sup +.83.12 db 'Mandatory FLUSH CACHE command',0 ;1 sup +.83.11 db 'Device Configuration Overlay feature set',0 ;1 sup +.83.10 db '48-bit Address feature set',0 ;1 sup +.83.9 db 'Automatic Acoustic Management feature set',0 ;1 sup +.83.8 db 'SET MAX security extension',0 ;1 sup +.83.6 db 'SET FEATURES subcommand required to spin-up after power-up',0 ;1 +.83.5 db 'Power-Up In Standby feature set',0 ;1 sup +.83.3 db 'Advanced Power Management feature set',0 ;1 sup +.83.2 db 'CFA feature set',0 ;1 sup +.83.1 db 'READ/WRITE DMA QUEUED',0 ;1 sup +.83.0 db 'DOWNLOAD MICROCODE command',0 ;1 sup + +;.84 db 'Command set/feature supported:',0 +.84.13 db 'IDLE IMMEDIATE with UNLOAD FEATURE',0 ;1 sup +.84.8 db '64-bit World wide name supported',0 ;1 sup +.84.7 db 'WRITE DMA QUEUED FUA EXT command',0 ;1 sup +.84.6 db 'WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT commands',0 ;1 sup +.84.5 db 'General Purpose Logging feature set',0 ;1 sup +.84.4 db 'Streaming feature set',0 ;1 sup +.84.3 db 'Media Card Pass Through Command feature set',0 ;1 sup +.84.2 db 'Media serial number',0 ;1 sup +.84.1 db 'SMART self-test',0 ;1 sup +.84.0 db 'SMART error logging',0 ;1 sup +.85 db 'Command set/feature enabled/supported:',0 +.85.14 = .82.14 ;1 sup +.85.13 = .82.13 ;1 sup +.85.12 = .82.12 ;1 sup +.85.10 db 'Host Protected Area has been established',0;1 (i.e., the maximum LBA is less than the maximum native LBA) +.85.9 = .82.9; 1 sup +.85.8 = .82.8; 1 enb +.85.7 = .82.7; 1 enb +.85.6 = .82.6; 1 enb +.85.5 = .82.5; 1 enb +.85.4 = .82.4; 1 sup +.85.3 = .82.3; 1 sup +.85.1 = .82.1; 1 enb +.85.0 = .82.0; 1 enb + +;.86 db 'Command set/feature enabled/supported:',0 +.86.13 = .83.13; 1 sup +.86.12 db 'FLUSH CACHE command',0 ;1 sup +.86.11 db 'Device Configuration Overlay',0 ;1 sup +.86.10 = .83.10 ;1 sup +.86.9 = .83.9 ;1 enb +.86.8 db 'SET MAX security extension enabled by SET MAX SET PASSWORD',0 ;1 +.86.6 = .83.6 ;1 +.86.5 = .83.5 ;1 enb +.86.3 = .83.3 ;1 enb +.86.2 = .83.2 ;l sup +.86.1 = .83.1 ;1 sup +.86.0 = .83.0 ;1 sup +;.87 db 'Command set/feature enabled/supported:',0 +;.87.x см..84 + +.88 db 'Ultra DMA mode selected',0 +;бит 14 установлен - mode 6 is selected, 13-5, 12-4, 11-3, 10-2, 9-1, 8-0 +.88.1_6 db 'Ultra DMA mode and below are supported',0 ;бит 1-1, ..., 6-6 +;.88.0: db 'Ultra DMA mode 0 is',0 ;1 sup +.89 db 'Time required for security erase unit completion',0 +.90 db 'Time required for Enhanced security erase completion',0 +.91 db 'Current advanced power management value',0 +.92 db 'Master Password Identifier',0 + +;.93 db 'Hardware reset result',0 ;добавить +.94.8_15 db 'Vendor"s recommended acoustic management value',0 +.94.0_7 db 'Current automatic acoustic management value',0 +.95 db 'Stream Minimum Request Size',0 +.96 db 'Streaming Transfer Time - DMA',0 +.97 db 'Streaming Access Latency - DMA and PIO',0 +.98_99 db 'Streaming Performance Granularity',0 +.100_103 db 'Total Number of User Addressable Sectors for the 48-bit Address feature set',0 +.104 db 'Streaming Transfer Time - PIO',0; + +.106 db 'Physical sector size / Logical Sector Size:',0 +.106.13 db 'Device has multiple logical sectors per physical sector',0 ;1 +.106.12 db 'Device Logical Sector Longer than 256 Words',0 ;1 +.106.0_3 db '2^X logical sectors per physical sector',0 +.107 db 'Inter-seek delay for ISO-7779 acoustic testing in microseconds',0 +.108.12_15 db 'NAA (3:0)',0 +.108.0_11 db 'IEEE OUI (23:12)',0 +.109.4_15 db 'IEEE OUI (11:0)',0 +.109.0_3 db 'Unique ID (35:32)',0 +.110 db 'Unique ID (31:16)',0 +.111 db 'Unique ID (15:0)',0; +.117_118 db 'Words per Logical Sector',0 +.119 db 'Supported Settings:',0 +.119.5 db 'Free-fall Control feature set is',0 ;1 sup +.119.4 db 'The Segmented feature for DOWNLOAD MICROCODE is',0 ;1 sup +.119.3 db 'READ and WRITE DMA EXT GPL optional commands are',0 ;1 sup +.119.2 db 'WRITE UNCORRECTABLE EXT is',0 ;1 sup +.119.1 db 'Write-Read-Verify feature set is',0 ;1 sup +.120 db 'Command set/feature enabled/supported',0 +.120.5 db 'Free-fall Control feature set is',0 ;1 enb +.120.4 db 'The Segmented feature for DOWNLOAD MICROCODE is',0 ;1 sup +.120.3 db 'READ and WRITE DMA EXT GPL optional commands are',0 ;1 sup +.120.2 db 'WRITE UNCORRECTABLE EXT is',0 ;1 sup +.120.1 db 'Write-Read-Verify feature set is',0 ;1 enb + +.128 db 'Security status',0 +.128.8.0 db 'Security level = High',0 +.128.8.1 db 'Security level = Maximum',0 +.128.5 db 'Enhanced security erase',0 ;1 sup +.128.4 db 'Security count expired',0 ;1 +.128.3 db 'Security frozen',0 ;1 +.128.2 db 'Security locked',0 ;1 +.128.1 db 'Security enabled',0 ;1 +.128.0 db 'Security supported',0 ;1 + +;.160 добавить + +.176_205 db 'Current media serial number',0 +.206 db 'SCT Command Transport:',0 +.206.5 db 'Data Tables',0 ;1 sup +.206.4 db 'Features Control',0 ;1 sup +.206.3 db 'Error Recovery Control',0 ;1 sup +.206.2 db 'Write Same',0 ;1 sup +.206.1 db 'Long Sector Access',0 ;1 sup +.206.0 db '',0 ;1 sup +.209 db 'Alignment of logical blocks within a larger physical block',0 +.209.0_13 db '"Logical sector" offset within the first physical sector where the first logical sector is placed.',0; +.210_211 db 'Write-Read-Verify Sector Count Mode 3 Only',0 +.212_213 db 'Verify Sector Count Mode 2 Only',0 +.214 db 'NV Cache Capabilities:',0 +.214.12_15 db 'NV Cache feature set version',0 +.214.8_11 db 'NV Cache Power Mode feature set version',0 +.214.4 db 'NV Cache feature set',0 ;1 enb +.214.1 db 'NV Cache Power Mode feature set',0 ;1 enb +.214.0 db 'NV Cache Power Mode feature set',0 ;1 sup +.215 db 'NV Cache Size in Logical Blocks (15:0)',0 + +.216 db 'NV Cache Size in Logical Blocks (31:16)',0 +.217 db 'Nominal media rotation rate',0 +.219 db 'NV Cache Options',0 +.219.0_7 db 'Device Estimated Time to Spin Up in Seconds',0 +.220.0_7 db 'Write-Read-Verify feature set current mode',0; +.222 db 'Transport Major revision number',0 +.222.12.0 db 'Parallel',0 +.222.12.1 db 'Serial',0 +;.222.0_11 добавить +.223 db 'Transport Major revision number',0 +.234 db 'Minimum number of 512 byte units per DOWNLOAD MICROCODE command for mode 03h',0 +.235 db 'Maximum number of 512 byte units per DOWNLOAD MICROCODE command for mode 03h',0 +.255 db 'Integrity word',0 +.255.8_15 db 'Checksum',0 +.255.0_7 db 'Signature',0 +;--------------------------------------------------------------------- +s: +.title db 'ID/Name/Value/Wrst',0 +.0 db '?',0 +.1 db 'Raw Read Error Rate',0 +.2 db 'Throughput Performance',0 +.3 db 'Spin Up Time',0 +.4 db 'Start/Stop Count',0 +.5 db 'Reallocated Sector Count',0 +.6 db 'Read Channel Margin',0 +.7 db 'Seek Error Rate',0 +.8 db 'Seek Time Performance',0 +.9 db 'Power-On Hours Count',0 +.10 db 'Spin Retry Count',0 +.11 db 'Recalibration Retries',0 +.12 db 'Device Power Cycle Count',0 +.13 db 'Soft Read Error Rate',0 +;?? db 'Emergency Re-track (Hitachi)',0 +;?? db 'ECC On-The-Fly Count (Hitachi)',0 +;96 db '? (Maxtor) +;97 db '? (Maxtor) +;98 db '? (Maxtor) +;99 db '? (Maxtor) +;100 db '? (Maxtor) +;101 db '? (Maxtor) +.190 db 'Airflow Temperature (WDC)',0 +.191 db 'G-Sense Error Rate',0 +.192 db 'Power-Off Retract Cycle',0 +.193 db 'Load/Unload Cycle Count',0 +.194 db 'Temperature',0 +.195 db 'Hardware ECC Recovered',0 +.196 db 'Reallocation Events Count',0 +.197 db 'Current Pending Sector Count',0 +.198 db 'Uncorrectable Sector Count',0 +.199 db 'UltraDMA CRC Error Rate',0 +.200 db 'Write Error Rate (WD - MultiZone Error Rate)',0 +.201 db 'TA Counter Detected (or Soft read error rate ?)',0 +.202 db 'TA Counter Increased (or Data Address Mark errors ?)',0 +.203 db 'Run out cancel',0 +.204 db 'Soft ECC correction',0 +.205 db 'Thermal asperity rate (TAR)',0 +.206 db 'Flying height',0 +.207 db 'Spin high',0 +.208 db 'Spin buzz',0 +.209 db 'Offline seek performance',0 +.220 db 'Disk Shift',0 +.221 db 'G-Sense Error Rate (Hitachi - Shock Sense Error Rate)',0 +.222 db 'Loaded Hours',0 +.223 db 'Load/Unload Retry Count',0 +.224 db 'Load Friction',0 +.225 db 'Load/Unload Cycle Count',0 +.226 db 'Load-in Time',0 +.227 db 'Torque Amplification Count',0 +.228 db 'Power-Off Retract Count',0 +;229 db '? (IBM DTTA)',0 +.230 db 'GMR Head Amplitude',0 +.231 db 'Temperature',0 +.240 db 'Head Flying Hours (Hitachi)',0 +.250 db 'Read Error Retry Rate',0 +;--------------------------------------------------------------------- +title db 'Hard Disk Drive INFOrmer v0.2',0 +menu_text db 'Info SMART Tests Control < >',0 +ctrl_text1 db 'Ports: 1f0-1f7 170-177',0 +ctrl_text2 db 'Device: 0 1 0 1',0 +edbx_text1 db 'Info: Save Load',0 +edbx_text2 db 'SMART: Save Load',0 +smrt_text1 db 'SMART on/off',0 +page_text db 'Page:',0 +;system_path db '/sys/lib/' +;boxlib_name db 'box_lib.obj',0 +;head_f_i: +;head_f_l db 'error',0 +;err_message_found_lib db 'box_lib.obj was not found',0 +;err_message_import db 'box_lib.obj was not imported ',0 +if lang eq it_IT + error_open_file_string_Info db 'Non riesco ad aprire Info file!',0 + error_save_file_string_Info db 'Non riesco a salvare Info file!',0 + + error_open_file_string_SMART db 'Non riesco ad aprire SMART file!',0 + error_save_file_string_SMART db 'Non riesco a salvare SMART file!',0 +else + error_open_file_string_Info db 'Can not open Info file!',0 + error_save_file_string_Info db 'Can not save Info file!',0 + + error_open_file_string_SMART db 'Can not open SMART file!',0 + error_save_file_string_SMART db 'Can not save SMART file!',0 +end if +no_error_text db 0 +align 4 +error_text dd no_error_text +;--------------------------------------------------------------------- +system_dir_Boxlib db '/sys/lib/box_lib.obj',0 +system_dir_ProcLib db '/sys/lib/proc_lib.obj',0 +;--------------------------------------------------------------------- +align 4 +l_libs_start: + +library01 l_libs system_dir_Boxlib+9, library_path, system_dir_Boxlib, Box_lib_import + +library02 l_libs system_dir_ProcLib+9, library_path, system_dir_ProcLib, ProcLib_import + +end_l_libs: +;--------------------------------------------------------------------- + + +;edit1 edit_box 200,2,85,0xaaaaaa,0x6a9480,0,0xAABBCC,0,128,file_name,ed_focus,10,10 +op1 option_box option_group1,72,44,6,9,0xffffff,0x0,0,0,0 +op2 option_box option_group1,94,44,6,9,0xffffff,0x0,0,0,0 +op3 option_box option_group1,132,44,6,9,0xffffff,0x0,0,0,0 +op4 option_box option_group1,154,44,6,9,0xffffff,0x0,0,0,0 +option_group1 dd op1 +Option_boxs dd op1,op2,op3,op4,0 +;--------------------------------------------------------------------- +;file_name db '/sys/hdd_',0 +;times 128 db (0) +;--------------------------------------------------------------------- +struct f70 + func_n dd ? + param1 dd 0 + param2 dd 0 + param3 dd ? + param4 dd ? + rezerv db 0 + name dd filename_area +ends +;--------------------------------------------------------------------- +func_70 f70 +; Info_name dd filename_area ;file_name +;--------------------------------------------------------------------- +; SMART_name dd filename_area2 ;file_name +;--------------------------------------------------------------------- +align 4 +ProcLib_import: +OpenDialog_Init dd aOpenDialog_Init +OpenDialog_Start dd aOpenDialog_Start +;OpenDialog__Version dd aOpenDialog_Version + dd 0 + dd 0 +aOpenDialog_Init db 'OpenDialog_init',0 +aOpenDialog_Start db 'OpenDialog_start',0 +;aOpenDialog_Version db 'Version_OpenDialog',0 +;--------------------------------------------------------------------- +align 4 +Box_lib_import: +;init_lib dd a_init +;version_lib dd a_version + + +edit_box_draw dd aEdit_box_draw +edit_box_key dd aEdit_box_key +edit_box_mouse dd aEdit_box_mouse +;version_ed dd aVersion_ed + +;check_box_draw dd aCheck_box_draw +;check_box_mouse dd aCheck_box_mouse +;version_ch dd aVersion_ch + +option_box_draw dd aOption_box_draw +option_box_mouse dd aOption_box_mouse +;version_op dd aVersion_op + +;scrollbar_ver_draw dd aScrollbar_ver_draw +;scrollbar_ver_mouse dd aScrollbar_ver_mouse +;scrollbar_hor_draw dd aScrollbar_hor_draw +;scrollbar_hor_mouse dd aScrollbar_hor_mouse +;version_scrollbar dd aVersion_scrollbar + +;dinamic_button_draw dd aDbutton_draw +;dinamic_button_mouse dd aDbutton_mouse +;version_dbutton dd aVersion_dbutton + +;menu_bar_draw dd aMenu_bar_draw +;menu_bar_mouse dd aMenu_bar_mouse +;menu_bar_activate dd aMenu_bar_activate +;version_menu_bar dd aVersion_menu_bar + +;FileBrowser_draw dd aFileBrowser_draw +;FileBrowser_mouse dd aFileBrowser_mouse +;FileBrowser_key dd aFileBrowser_key +;Version_FileBrowser dd aVersion_FileBrowser + +PathShow_prepare dd sz_PathShow_prepare +PathShow_draw dd sz_PathShow_draw +;Version_path_show dd szVersion_path_show + dd 0,0 + +;a_init db 'lib_init',0 +;a_version db 'version',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 + +;aCheck_box_draw db 'check_box_draw',0 +;aCheck_box_mouse db 'check_box_mouse',0 +;aVersion_ch db 'version_ch',0 + +aOption_box_draw db 'option_box_draw',0 +aOption_box_mouse db 'option_box_mouse',0 +;aVersion_op db 'version_op',0 + +;aScrollbar_ver_draw db 'scrollbar_v_draw',0 +;aScrollbar_ver_mouse db 'scrollbar_v_mouse',0 +;aScrollbar_hor_draw db 'scrollbar_h_draw',0 +;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0 +;aVersion_scrollbar db 'version_scrollbar',0 + +;aDbutton_draw db 'dbutton_draw',0 +;aDbutton_mouse db 'dbutton_mouse',0 +;aVersion_dbutton db 'version_dbutton',0 + +;aMenu_bar_draw db 'menu_bar_draw',0 +;aMenu_bar_mouse db 'menu_bar_mouse',0 +;aMenu_bar_activate db 'menu_bar_activate',0 +;aVersion_menu_bar db 'version_menu_bar',0 + +;aFileBrowser_draw db 'FileBrowser_draw',0 +;aFileBrowser_mouse db 'FileBrowser_mouse',0 +;aFileBrowser_key db 'FileBrowser_key',0 +;aVersion_FileBrowser db 'version_FileBrowser',0 + +sz_PathShow_prepare db 'PathShow_prepare',0 +sz_PathShow_draw db 'PathShow_draw',0 +;szVersion_path_show db 'version_PathShow',0 +;--------------------------------------------------------------------- +PathShow_data_1: +.type dd 0 ;+0 +.start_y dw 85 ;+4 +.start_x dw 128 ;+6 +.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 +.area_size_x dw 415 ;+10 +.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable +.background_flag dd 0 ;+16 +.font_color dd 0x0 ;+20 +.background_color dd 0x0 ;+24 +.text_pointer dd fname_Info ;+28 +.work_area_pointer dd text_work_area ;+32 +.temp_text_length dd 0 ;+36 +;--------------------------------------------------------------------- +PathShow_data_2: +.type dd 0 ;+0 +.start_y dw 104 ;+4 +.start_x dw 127 ;+6 +.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 +.area_size_x dw 415 ;+10 +.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable +.background_flag dd 0 ;+16 +.font_color dd 0x0 ;+20 +.background_color dd 0x0 ;+24 +.text_pointer dd fname_SMART ;+28 +.work_area_pointer dd text_work_area2 ;+32 +.temp_text_length dd 0 ;+36 +;--------------------------------------------------------------------- +OpenDialog_data: +.type dd 0 +.procinfo dd procinfo ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_pach dd temp_dir_pach ;+16 +.dir_default_pach dd communication_area_default_pach ;+20 +.start_path dd open_dialog_path ;+24 +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_pach dd fname_Info ;+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 + +OpenDialog_data2: +.type dd 0 +.procinfo dd procinfo ;+4 +.com_area_name dd communication_area_name2 ;+8 +.com_area dd 0 ;+12 +.opendir_pach dd temp_dir_pach2 ;+16 +.dir_default_pach dd communication_area_default_pach ;+20 +.start_path dd open_dialog_path ;+24 +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_pach dd fname_SMART ;+36 +.filename_area dd filename_area2 ;+40 +.filter_area dd Filter2 +.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 + +communication_area_name2: + db 'FFFFFFFF_open_dialog',0 + +communication_area_name: + db 'FFFFFFFF_open_dialog2',0 +open_dialog_path: +if __nightbuild eq yes + db '/sys/MANAGERS/opendial',0 +else + db '/sys/File Managers/opendial',0 +end if +communication_area_default_pach: + db '/sys',0 + +Filter: +dd Filter.end - Filter +.1: +db 'INFO',0 +.end: +db 0 + +Filter2: +dd Filter.end - Filter +.1: +db 'SMART',0 +.end: +db 0 + +default_Info: + db '/sys/default.info',0 +default_SMART: + db '/sys/default.smart',0 +;--------------------------------------------------------------------- +page_num db 1 +flags dw 100b +;бит 0: 0/1 - InfoBlock не/прочитан +;1: 0/1 - SmartBlock не/прочитан +;2: 1 - показ ControlBlock +;3: 1 - при попытке чтения возникла ошибка (превышено время ожидания) +;4: 0/1 - сохраняем/загружаем InfoBlock/Smart +;5: 0/1 - выбор Master/Slave +;6: 1 - показ Tests +;7: 1 - показ InfoBlock +;8: 1 - показ Smart +;9: 1 - выключаем или включаем SMART +;10: 1 - включаем SMART +;--------------------------------------------------------------------- +IM_END: +;--------------------------------------------------------------------- +align 16 +InfoArray: times 256 dw 0 +SmartArray: times 512 dw 0 + +;buf_cmd_lin rb 0 +;threath_buf rb 0x400 +align 4 +;--------------------------------------------------------------------- +cur_dir_path: + rb 4096 +;--------------------------------------------------------------------- +fname_Info: + rb 4096 ; filename +;--------------------------------------------------------------------- +fname_SMART: + rb 4096 ; filename +;--------------------------------------------------------------------- +text_work_area: + rb 1024 +;--------------------------------------------------------------------- +text_work_area2: + rb 1024 +;--------------------------------------------------------------------- +procinfo: + rb 1024 +;--------------------------------------------------------------------- +temp_dir_pach: + rb 4096 +;--------------------------------------------------------------------- +temp_dir_pach2: + rb 4096 +;--------------------------------------------------------------------- +filename_area: + rb 256 +;--------------------------------------------------------------------- +filename_area2: + rb 256 +;--------------------------------------------------------------------- +library_path: + rb 4096 +;--------------------------------------------------------------------- + rb 4096 +stacktop: +;--------------------------------------------------------------------- +I_END: +;--------------------------------------------------------------------- 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' diff --git a/programs/system/terminal/terminal.asm b/programs/system/terminal/terminal.asm index 5cfb554ce..0ffc92859 100644 --- a/programs/system/terminal/terminal.asm +++ b/programs/system/terminal/terminal.asm @@ -1,497 +1,497 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2014. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;; terminal for KolibriOS ;; -;; ;; -;; Written by hidnplayr@kolibrios.org ;; -;; ;; -;; GNU GENERAL PUBLIC LICENSE ;; -;; Version 2, June 1991 ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -format binary as "" - -use32 - org 0x0 - - db 'MENUET01' - dd 0x1 - dd START - dd I_END - dd IM_END+0x1000 - dd IM_END+0x1000 - dd 0, 0 - -include '../../proc32.inc' -include '../../macros.inc' -include '../../dll.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' - - -START: - - mcall 68, 11 - - stdcall dll.Load, @IMPORT - or eax, eax - jnz exit - - mcall 40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_REDRAW + EVM_BUTTON + EVM_KEY - - invoke init_checkbox, ch1 - -red_win: - call draw_window - -mainloop: - mcall 10 - - dec eax - jz red_win - - dec eax - jz key - - dec eax - jz button - - invoke edit_box_mouse, edit1 - invoke edit_box_mouse, edit2 - invoke edit_box_mouse, edit3 - invoke edit_box_mouse, edit4 - - invoke option_box_mouse, Option_boxs1 - invoke option_box_mouse, Option_boxs2 - - invoke check_box_mouse, ch1 - - jmp mainloop - -button: - mcall 17 - - cmp ah, 0x10 ; connect button - je open_connection - - test ah , ah - jz mainloop -exit: - mcall -1 - -key: - mcall 2 - - cmp ah, 13 ; enter key - je open_connection - - invoke edit_box_key, edit1 - invoke edit_box_key, edit2 - invoke edit_box_key, edit3 - invoke edit_box_key, edit4 - - jmp mainloop - - - -draw_window: -; get system colors - mcall 48, 3, sc, 40 - - mcall 12,1 - mov edx, [sc.work] - or edx, 0x34000000 - xor esi, esi - mov edi, str_title - mcall 0, 50 shl 16 + 415, 30 shl 16 + 195 - - mov ebx, 5 shl 16 + 12 - mov ecx, 0x90000000 - or ecx, [sc.work_text] - mov edx, str_port - mcall 4 - add ebx, 25 - mov edx, str_speed - mcall - add ebx, 25 - mov edx, str_data - mcall - add ebx, 25 - mov edx, str_stop - mcall - - mov ebx, 195 shl 16 + 12 - mov edx, str_parity - mcall - mov ebx, 280 shl 16 + 12 - mov edx, str_flow - mcall - - edit_boxes_set_sys_color edit1,editboxes_end,sc - invoke edit_box_draw, edit1 - invoke edit_box_draw, edit2 - invoke edit_box_draw, edit3 - invoke edit_box_draw, edit4 - - option_boxes_set_sys_color sc, Option_boxs1 - option_boxes_set_sys_color sc, Option_boxs2 - invoke option_box_draw, Option_boxs1 - invoke option_box_draw, Option_boxs2 - - check_boxes_set_sys_color2 ch1,ch1_end,sc ;set color - invoke check_box_draw, ch1 - - mov esi, [sc.work_button] - mcall 8, 280 shl 16 + 100, 115 shl 16 + 22, 0x10 - - mov ecx, 0x90000000 - or ecx, [sc.work_button_text] - mcall 4, 315 shl 16 + 119, , str_open - - - mov edx, [sc.work_graph] - mcall 38, 0 shl 16 + 405, 145 shl 16 + 145 - - mov ecx, 0x90000000 - or ecx, [sc.work_text] - mcall 4, 5 shl 16 + 150, , [errormsg] - - mcall 12, 2 - ret - - -open_connection: - - mov [errormsg], err_none ; clear previous error message - -; Read the serial port name, and convert it to a port number - cmp byte[ed_port+4], 0 - jne .port_error - mov eax, dword[ed_port] - or eax, 0x20202020 ; convert to lowercase - cmp eax, 'com1' - je .com1 - cmp eax, 'com2' - je .com2 - cmp eax, 'com3' - je .com3 - cmp eax, 'com4' - je .com4 - .port_error: - mov [errormsg], err_port - jmp red_win - - .com1: - mov [port], 0x3f8 - jmp .port_ok - .com2: - mov [port], 0x2f8 - jmp .port_ok - .com3: - mov [port], 0x3e8 - jmp .port_ok - .com4: - mov [port], 0x2e8 - .port_ok: - -; reserve the com port so we can work with it - xor ebx, ebx - movzx ecx, [port] - mov edx, ecx - add edx, 7 - mcall 46 - test eax, eax - jz .port_reserved - mov [errormsg], err_reserve - jmp red_win - .port_reserved: - -; disable com interrupts -; (We cannot receive them on the application level :( ) - mov dx, [port] - inc dx - mov al, 0 - out dx, al - -; Set speed: -; Convert the ascii decimal number that user entered -; So we can do some math with it - mov esi, ed_speed - xor eax, eax - xor ebx, ebx - .convert_loop: - lodsb - test al, al - jz .convert_done - sub al, '0' - jb .invalid_speed - cmp al, 9 - ja .invalid_speed - lea ebx, [ebx + 4*ebx] - shl ebx, 1 - add ebx, eax - jmp .convert_loop - .invalid_speed: - call free_port - mov [errormsg], err_speed - jmp red_win - .convert_done: - test ebx, ebx - jz .invalid_speed - -; We now have the speed setting in ebx -; calculate the divisor latch value as 115200/ebx - xor edx, edx - mov eax, 115200 - div ebx - test edx, edx - jnz .invalid_speed - cmp eax, 0xffff - ja .invalid_speed - mov bx, ax - -; enable Divisor latch - mov dx, [port] - add dx, 3 - mov al, 1 shl 7 ; dlab bit - out dx, al - -; Set divisor latch value - mov dx, [port] - mov al, bl - out dx, al - inc dx - mov al, bh - out dx, al - -; Check the parity type - xor bl, bl - cmp [option_group1], op1 ; none - je .parity_ok - - mov bl, 001b shl 3 - cmp [option_group1], op2 ; odd - je .parity_ok - - mov bl, 011b shl 3 - cmp [option_group1], op3 ; even - je .parity_ok - - mov bl, 101b shl 3 - cmp [option_group1], op4 ; mark - je .parity_ok - - mov bl, 111b shl 3 - cmp [option_group1], op5 ; space - je .parity_ok - jmp exit2 ; something went terribly wrong - .parity_ok: - -; Check number of stop bits - cmp [ed_stop], '1' - je .stop_ok - cmp [ed_stop], '2' - jne .invalid_stop - or bl, 1 shl 2 ; number of stop bits - jmp .stop_ok - .invalid_stop: - call free_port - mov [errormsg], err_stopbits - jmp red_win - .stop_ok: - -; Check number of data bits - mov al, [ed_data] - cmp al, '8' - ja .invalid_data - sub al, '5' - jae .data_ok - .invalid_data: - call free_port - mov [errormsg], err_databits - jmp red_win - .data_ok: - or al, bl -; Program data bits, stop bits and parity in the UART - mov dx, [port] - add dx, 3 ; Line Control Register - out dx, al - -; clear + enable fifo (64 bytes), 1 byte trigger level - mov dx, [port] - inc dx - inc dx - mov al, 0x7 + 1 shl 5 - out dx, al - -; flow control - mov dx, [port] - add dx, 4 - mov al, 0xb - out dx, al - -; Hide our GUI window and open the console - mcall 40, 0 ; disable all events - mcall 67, 0, 0, 0, 0 ; hide window - mcall 12, 1 - mcall 12, 2 - - invoke con_start, 1 - invoke con_init, 80, 25, 80, 25, str_title - -console_loop: - mcall 5, 1 ; wait 10 ms - - invoke con_get_flags - test eax, 0x200 ; con window closed? - jnz exit2 - - .tx_loop: - invoke con_kbhit - test eax, eax ; did user press a key? - jz .rx_loop - - invoke con_getch2 ; get the pressed key from buffer - mov dx, [port] - out dx, al - - test [ch1.flags], ch_flag_en ; does user want us to echo locally? - je .tx_loop - - and eax, 0xff - push eax - invoke con_write_asciiz, esp ; print the character - pop eax - jmp .tx_loop - - .rx_loop: - mov dx, [port] - add dx, 5 ; Line status register - in al, dx - test al, 1 ; Data ready? - jz console_loop - - mov dx, [port] ; Read character from buffer - in al, dx - - and eax, 0xff - push eax - invoke con_write_asciiz, esp ; print the character - pop eax - - jmp .rx_loop - - -exit2: - - call free_port - mcall -1 ; exit - -free_port: - - xor ebx, ebx - inc ebx - movzx ecx, [port] - mov edx, ecx - add edx, 7 - mcall 46 - - ret - -;------------------------- -; DATA - -align 16 -@IMPORT: - -library box_lib, 'box_lib.obj',\ - console, 'console.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' - -import console,\ - con_start, 'START',\ - con_init, 'con_init',\ - con_exit, 'con_exit',\ - con_getch2, 'con_getch2',\ - con_write_asciiz, 'con_write_asciiz',\ - con_get_flags, 'con_get_flags',\ - con_kbhit, 'con_kbhit' - -edit1 edit_box 60, 112, 10, 0xffffff, 0x6f9480, 0, 0, 0x10000000, 8, ed_port, mouse_dd, ed_focus, 4, 4 -edit2 edit_box 60, 112, 35, 0xffffff, 0x6a9480, 0, 0, 0x10000000, 7, ed_speed, mouse_dd, ed_figure_only, 4, 4 -edit3 edit_box 60, 112, 60, 0xffffff, 0x6a9480, 0, 0, 0x10000000, 1, ed_data, mouse_dd, ed_figure_only, 1, 1 -edit4 edit_box 60, 112, 85, 0xffffff, 0x6a9480, 0, 0, 0x10000000, 1, ed_stop, mouse_dd, ed_figure_only, 1, 1 -editboxes_end: - -ed_port db "COM1",0,0,0,0,0,0 -ed_speed db "9600",0,0,0 -ed_data db "8",0 -ed_stop db "1",0 - -option_group1 dd op1 -op1 option_box option_group1, 195, 30, 6, 12, 0xffffff, 0, 0, str_none, 4 -op2 option_box option_group1, 195, 47, 6, 12, 0xffffff, 0, 0, str_odd, 3 -op3 option_box option_group1, 195, 64, 6, 12, 0xffffff, 0, 0, str_even, 4 -op4 option_box option_group1, 195, 81, 6, 12, 0xffffff, 0, 0, str_mark, 4 -op5 option_box option_group1, 195, 98, 6, 12, 0xffffff, 0, 0, str_space, 5 - -option_group2 dd op6 -op6 option_box option_group2, 280, 30, 6, 12, 0xffffff, 0, 0, str_none, 4 -;op7 option_box option_group2, 270, 44, 6, 12, 0xffffff, 0, 0, str_xon, 8, 10b -;op8 option_box option_group2, 270, 61, 6, 12, 0xffffff, 0, 0, str_rts, 7, 1b -;op9 option_box option_group2, 270, 78, 6, 12, 0xffffff, 0, 0, str_dsr, 7 - -ch1 check_box2 5 shl 16 + 12, 119 shl 16 + 12, 5, 0xffffff, 0x000000, 0, str_echo, ch_flag_middle -ch1_end: - -Option_boxs1 dd op1, op2, op3, op4, op5, 0 -Option_boxs2 dd op6, 0 ;op7, op8, op9, 0 - -str_title db 'Terminal', 0 -str_port db 'Serial port:', 0 -str_speed db 'Speed (baud):', 0 -str_data db 'Data bits:', 0 -str_parity db 'Parity:', 0 -str_flow db 'Flow control:', 0 -str_stop db 'Stop bits:', 0 - -str_open db 'Open', 0 - -str_none db 'None' -str_odd db 'Odd' -str_even db 'Even' -str_mark db 'Mark' -str_space db 'Space' -;str_xon db 'XON/XOFF' -;str_rts db 'RTS/CTS' -;str_dsr db 'DSR/DTR' - -str_echo db 'Local echo', 0 - -errormsg dd err_none -err_none db 0 -err_port db 'Invalid serial port.', 0 -err_reserve db 'The port is already in use.', 0 -err_speed db 'Incorrect speed setting.', 0 -err_stopbits db 'Invalid number of stop bits. Must be 1 or 2.', 0 -err_databits db 'Invalid number of data bits. Must be between 5 and 8.', 0 - -I_END: - -mouse_dd dd ? -echo db ? -port dw ? -sc system_colors - -IM_END: \ No newline at end of file +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2014. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; terminal for KolibriOS ;; +;; ;; +;; Written by hidnplayr@kolibrios.org ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +format binary as "" + +use32 + org 0x0 + + db 'MENUET01' + dd 0x1 + dd START + dd I_END + dd IM_END+0x1000 + dd IM_END+0x1000 + dd 0, 0 + +include '../../proc32.inc' +include '../../macros.inc' +include '../../dll.inc' +include '../../develop/libraries/box_lib/box_lib.mac' + + +START: + + mcall 68, 11 + + stdcall dll.Load, @IMPORT + or eax, eax + jnz exit + + mcall 40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_REDRAW + EVM_BUTTON + EVM_KEY + + invoke init_checkbox, ch1 + +red_win: + call draw_window + +mainloop: + mcall 10 + + dec eax + jz red_win + + dec eax + jz key + + dec eax + jz button + + invoke edit_box_mouse, edit1 + invoke edit_box_mouse, edit2 + invoke edit_box_mouse, edit3 + invoke edit_box_mouse, edit4 + + invoke option_box_mouse, Option_boxs1 + invoke option_box_mouse, Option_boxs2 + + invoke check_box_mouse, ch1 + + jmp mainloop + +button: + mcall 17 + + cmp ah, 0x10 ; connect button + je open_connection + + test ah , ah + jz mainloop +exit: + mcall -1 + +key: + mcall 2 + + cmp ah, 13 ; enter key + je open_connection + + invoke edit_box_key, edit1 + invoke edit_box_key, edit2 + invoke edit_box_key, edit3 + invoke edit_box_key, edit4 + + jmp mainloop + + + +draw_window: +; get system colors + mcall 48, 3, sc, 40 + + mcall 12,1 + mov edx, [sc.work] + or edx, 0x34000000 + xor esi, esi + mov edi, str_title + mcall 0, 50 shl 16 + 415, 30 shl 16 + 195 + + mov ebx, 5 shl 16 + 12 + mov ecx, 0x90000000 + or ecx, [sc.work_text] + mov edx, str_port + mcall 4 + add ebx, 25 + mov edx, str_speed + mcall + add ebx, 25 + mov edx, str_data + mcall + add ebx, 25 + mov edx, str_stop + mcall + + mov ebx, 195 shl 16 + 12 + mov edx, str_parity + mcall + mov ebx, 280 shl 16 + 12 + mov edx, str_flow + mcall + + edit_boxes_set_sys_color edit1,editboxes_end,sc + invoke edit_box_draw, edit1 + invoke edit_box_draw, edit2 + invoke edit_box_draw, edit3 + invoke edit_box_draw, edit4 + + option_boxes_set_sys_color sc, Option_boxs1 + option_boxes_set_sys_color sc, Option_boxs2 + invoke option_box_draw, Option_boxs1 + invoke option_box_draw, Option_boxs2 + + check_boxes_set_sys_color2 ch1,ch1_end,sc ;set color + invoke check_box_draw, ch1 + + mov esi, [sc.work_button] + mcall 8, 280 shl 16 + 100, 115 shl 16 + 22, 0x10 + + mov ecx, 0x90000000 + or ecx, [sc.work_button_text] + mcall 4, 315 shl 16 + 119, , str_open + + + mov edx, [sc.work_graph] + mcall 38, 0 shl 16 + 405, 145 shl 16 + 145 + + mov ecx, 0x90000000 + or ecx, [sc.work_text] + mcall 4, 5 shl 16 + 150, , [errormsg] + + mcall 12, 2 + ret + + +open_connection: + + mov [errormsg], err_none ; clear previous error message + +; Read the serial port name, and convert it to a port number + cmp byte[ed_port+4], 0 + jne .port_error + mov eax, dword[ed_port] + or eax, 0x20202020 ; convert to lowercase + cmp eax, 'com1' + je .com1 + cmp eax, 'com2' + je .com2 + cmp eax, 'com3' + je .com3 + cmp eax, 'com4' + je .com4 + .port_error: + mov [errormsg], err_port + jmp red_win + + .com1: + mov [port], 0x3f8 + jmp .port_ok + .com2: + mov [port], 0x2f8 + jmp .port_ok + .com3: + mov [port], 0x3e8 + jmp .port_ok + .com4: + mov [port], 0x2e8 + .port_ok: + +; reserve the com port so we can work with it + xor ebx, ebx + movzx ecx, [port] + mov edx, ecx + add edx, 7 + mcall 46 + test eax, eax + jz .port_reserved + mov [errormsg], err_reserve + jmp red_win + .port_reserved: + +; disable com interrupts +; (We cannot receive them on the application level :( ) + mov dx, [port] + inc dx + mov al, 0 + out dx, al + +; Set speed: +; Convert the ascii decimal number that user entered +; So we can do some math with it + mov esi, ed_speed + xor eax, eax + xor ebx, ebx + .convert_loop: + lodsb + test al, al + jz .convert_done + sub al, '0' + jb .invalid_speed + cmp al, 9 + ja .invalid_speed + lea ebx, [ebx + 4*ebx] + shl ebx, 1 + add ebx, eax + jmp .convert_loop + .invalid_speed: + call free_port + mov [errormsg], err_speed + jmp red_win + .convert_done: + test ebx, ebx + jz .invalid_speed + +; We now have the speed setting in ebx +; calculate the divisor latch value as 115200/ebx + xor edx, edx + mov eax, 115200 + div ebx + test edx, edx + jnz .invalid_speed + cmp eax, 0xffff + ja .invalid_speed + mov bx, ax + +; enable Divisor latch + mov dx, [port] + add dx, 3 + mov al, 1 shl 7 ; dlab bit + out dx, al + +; Set divisor latch value + mov dx, [port] + mov al, bl + out dx, al + inc dx + mov al, bh + out dx, al + +; Check the parity type + xor bl, bl + cmp [option_group1], op1 ; none + je .parity_ok + + mov bl, 001b shl 3 + cmp [option_group1], op2 ; odd + je .parity_ok + + mov bl, 011b shl 3 + cmp [option_group1], op3 ; even + je .parity_ok + + mov bl, 101b shl 3 + cmp [option_group1], op4 ; mark + je .parity_ok + + mov bl, 111b shl 3 + cmp [option_group1], op5 ; space + je .parity_ok + jmp exit2 ; something went terribly wrong + .parity_ok: + +; Check number of stop bits + cmp [ed_stop], '1' + je .stop_ok + cmp [ed_stop], '2' + jne .invalid_stop + or bl, 1 shl 2 ; number of stop bits + jmp .stop_ok + .invalid_stop: + call free_port + mov [errormsg], err_stopbits + jmp red_win + .stop_ok: + +; Check number of data bits + mov al, [ed_data] + cmp al, '8' + ja .invalid_data + sub al, '5' + jae .data_ok + .invalid_data: + call free_port + mov [errormsg], err_databits + jmp red_win + .data_ok: + or al, bl +; Program data bits, stop bits and parity in the UART + mov dx, [port] + add dx, 3 ; Line Control Register + out dx, al + +; clear + enable fifo (64 bytes), 1 byte trigger level + mov dx, [port] + inc dx + inc dx + mov al, 0x7 + 1 shl 5 + out dx, al + +; flow control + mov dx, [port] + add dx, 4 + mov al, 0xb + out dx, al + +; Hide our GUI window and open the console + mcall 40, 0 ; disable all events + mcall 67, 0, 0, 0, 0 ; hide window + mcall 12, 1 + mcall 12, 2 + + invoke con_start, 1 + invoke con_init, 80, 25, 80, 25, str_title + +console_loop: + mcall 5, 1 ; wait 10 ms + + invoke con_get_flags + test eax, 0x200 ; con window closed? + jnz exit2 + + .tx_loop: + invoke con_kbhit + test eax, eax ; did user press a key? + jz .rx_loop + + invoke con_getch2 ; get the pressed key from buffer + mov dx, [port] + out dx, al + + test [ch1.flags], ch_flag_en ; does user want us to echo locally? + je .tx_loop + + and eax, 0xff + push eax + invoke con_write_asciiz, esp ; print the character + pop eax + jmp .tx_loop + + .rx_loop: + mov dx, [port] + add dx, 5 ; Line status register + in al, dx + test al, 1 ; Data ready? + jz console_loop + + mov dx, [port] ; Read character from buffer + in al, dx + + and eax, 0xff + push eax + invoke con_write_asciiz, esp ; print the character + pop eax + + jmp .rx_loop + + +exit2: + + call free_port + mcall -1 ; exit + +free_port: + + xor ebx, ebx + inc ebx + movzx ecx, [port] + mov edx, ecx + add edx, 7 + mcall 46 + + ret + +;------------------------- +; DATA + +align 16 +@IMPORT: + +library box_lib, 'box_lib.obj',\ + console, 'console.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' + +import console,\ + con_start, 'START',\ + con_init, 'con_init',\ + con_exit, 'con_exit',\ + con_getch2, 'con_getch2',\ + con_write_asciiz, 'con_write_asciiz',\ + con_get_flags, 'con_get_flags',\ + con_kbhit, 'con_kbhit' + +edit1 edit_box 60, 112, 10, 0xffffff, 0x6f9480, 0, 0, 0x10000000, 8, ed_port, mouse_dd, ed_focus, 4, 4 +edit2 edit_box 60, 112, 35, 0xffffff, 0x6a9480, 0, 0, 0x10000000, 7, ed_speed, mouse_dd, ed_figure_only, 4, 4 +edit3 edit_box 60, 112, 60, 0xffffff, 0x6a9480, 0, 0, 0x10000000, 1, ed_data, mouse_dd, ed_figure_only, 1, 1 +edit4 edit_box 60, 112, 85, 0xffffff, 0x6a9480, 0, 0, 0x10000000, 1, ed_stop, mouse_dd, ed_figure_only, 1, 1 +editboxes_end: + +ed_port db "COM1",0,0,0,0,0,0 +ed_speed db "9600",0,0,0 +ed_data db "8",0 +ed_stop db "1",0 + +option_group1 dd op1 +op1 option_box option_group1, 195, 30, 6, 12, 0xffffff, 0, 0, str_none, 4 +op2 option_box option_group1, 195, 47, 6, 12, 0xffffff, 0, 0, str_odd, 3 +op3 option_box option_group1, 195, 64, 6, 12, 0xffffff, 0, 0, str_even, 4 +op4 option_box option_group1, 195, 81, 6, 12, 0xffffff, 0, 0, str_mark, 4 +op5 option_box option_group1, 195, 98, 6, 12, 0xffffff, 0, 0, str_space, 5 + +option_group2 dd op6 +op6 option_box option_group2, 280, 30, 6, 12, 0xffffff, 0, 0, str_none, 4 +;op7 option_box option_group2, 270, 44, 6, 12, 0xffffff, 0, 0, str_xon, 8, 10b +;op8 option_box option_group2, 270, 61, 6, 12, 0xffffff, 0, 0, str_rts, 7, 1b +;op9 option_box option_group2, 270, 78, 6, 12, 0xffffff, 0, 0, str_dsr, 7 + +ch1 check_box2 5 shl 16 + 12, 119 shl 16 + 12, 5, 0xffffff, 0x000000, 0, str_echo, ch_flag_middle +ch1_end: + +Option_boxs1 dd op1, op2, op3, op4, op5, 0 +Option_boxs2 dd op6, 0 ;op7, op8, op9, 0 + +str_title db 'Terminal', 0 +str_port db 'Serial port:', 0 +str_speed db 'Speed (baud):', 0 +str_data db 'Data bits:', 0 +str_parity db 'Parity:', 0 +str_flow db 'Flow control:', 0 +str_stop db 'Stop bits:', 0 + +str_open db 'Open', 0 + +str_none db 'None' +str_odd db 'Odd' +str_even db 'Even' +str_mark db 'Mark' +str_space db 'Space' +;str_xon db 'XON/XOFF' +;str_rts db 'RTS/CTS' +;str_dsr db 'DSR/DTR' + +str_echo db 'Local echo', 0 + +errormsg dd err_none +err_none db 0 +err_port db 'Invalid serial port.', 0 +err_reserve db 'The port is already in use.', 0 +err_speed db 'Incorrect speed setting.', 0 +err_stopbits db 'Invalid number of stop bits. Must be 1 or 2.', 0 +err_databits db 'Invalid number of data bits. Must be between 5 and 8.', 0 + +I_END: + +mouse_dd dd ? +echo db ? +port dw ? +sc system_colors + +IM_END: diff --git a/programs/testing/fspeed/fspeed.asm b/programs/testing/fspeed/fspeed.asm index 0ceefa736..7446abce7 100644 --- a/programs/testing/fspeed/fspeed.asm +++ b/programs/testing/fspeed/fspeed.asm @@ -1,354 +1,357 @@ -;***************************************************************************** -; File Speed - for KolibriOS -; Copyright (c) 2014, 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. -;***************************************************************************** -;----------------------------------------------------------------------------- - use32 - org 0 - db 'MENUET01' - dd 1 - dd START - dd IM_END - dd I_END - dd STACK_TOP - dd 0 - dd cur_dir_path -;----------------------------------------------------------------------------- -include 'lang.inc' -include '../../macros.inc' -define __DEBUG__ 1 -define __DEBUG_LEVEL__ 1 -include '../../debug-fdo.inc' -include '../../develop/libraries/box_lib/trunk/box_lib.mac' -include '../../KOSfuncs.inc' -include '../../load_lib.mac' - @use_library -;----------------------------------------------------------------------------- -struct RESULT_SLOT - text dd ? - read_speed dd ? - write_speed dd ? - chunk_size dd ? -ends -;----------------------------------------------------------------------------- -START: - DEBUGF 1,'FSPEED: start of programm\n' -;----------------------------------------------------------------------------- - mcall 68,11 - test eax,eax - jz exit -;----------------------------------------------------------------------------- -load_libraries l_libs_start,end_l_libs -;if return code =-1 then exit, else nornary work - inc eax - test eax,eax - jz exit -;----------------------------------------------------------------------------- -;OpenDialog initialisation - push dword OpenDialog_data - call [OpenDialog_Init] - - push check1 - call [init_checkbox] - - mcall 40,0x27 -;----------------------------------------------------------------------------- -red: - call draw_window -;----------------------------------------------------------------------------- -still: - mcall 10 - cmp eax,1 - je red - - cmp eax,2 - je key - - cmp eax,3 - je button - - push dword check1 - call [check_box_mouse] - - jmp still -;----------------------------------------------------------------------------- -key: - mcall 2 - jmp still -;----------------------------------------------------------------------------- -button: - mcall 17 - - cmp ah,2 - je select_file - - cmp ah,3 - je testing - - cmp ah,1 - jne still -;-------------------------------------- -exit: - mcall -1 -;----------------------------------------------------------------------------- -select_file: -; invoke OpenDialog - mov [OpenDialog_data.type],dword 0 - push dword OpenDialog_data - call [OpenDialog_Start] - cmp [OpenDialog_data.status],1 - jne still -; prepare for PathShow - push dword PathShow_data - call [PathShow_prepare] - - call draw_PathShow - jmp still -;----------------------------------------------------------------------------- -draw_PathShow: - mcall 13,<5,400-20>,<5,15>,0xffffff -; draw for PathShow - push dword PathShow_data - call [PathShow_draw] - ret -;----------------------------------------------------------------------------- -draw_window: - mcall 48,3,app_colours,4*10 ; get current colors - - mcall 12,1 - xor esi,esi - xor ebp,ebp - mov edx,[w_work] ; color of work area RRGGBB,8->color - or edx,0x34000000 - mcall 0,<100,400>,<100,300>,,,title - - call draw_PathShow - mov eax,[w_work_text] - or eax,0x80000000 - mov [check1.text_color],eax - push dword check1 - call [check_box_draw] - - mcall 8,<5,80>,<25,15>,2,[w_work_button] - mcall ,<400-65,50>,,3 - mov ecx,[w_work_button_text] - or ecx,0x80000000 - mcall 4,<5+10,25+4>,,s_text - mcall ,<400-65+10,25+4>,,r_text - mov ecx,[w_work_text] - or ecx,0x80000000 - mcall ,<10,47>,,check_box_warning_text - mcall ,<10,65>,,result_table_text - - mov edx,ecx - and edx,0xffffff - mcall 38,<5,400-15>,<59,59> -; draw result table - mov ebx,10 shl 16+77 - mov ebp,result_table - mov ecx,18 -;-------------------------------------- -@@: - push ecx - mov ecx,[w_work_text] - or ecx,0x80000000 - mcall 4,,,[ebp+RESULT_SLOT.text] - push ebx - mov edx,ebx - add edx,(11*6) shl 16 - mov ebx,0x800a0000 - mcall 47,,[ebp+RESULT_SLOT.read_speed],,[w_work_text] - add edx,(16*6) shl 16 - mcall ,,[ebp+RESULT_SLOT.write_speed] - pop ebx - add ebx,6+5 - add ebp,sizeof.RESULT_SLOT - pop ecx - dec ecx - jnz @b - - mcall 12,2 - ret -;-----------------------------------------------------------------------------;----------------------------------------------------------------------------- -testing: - mcall 70,fileinfo - test eax,eax - jz @f - - DEBUGF 1,'FSPEED: file not found %s\n',fname - jmp still -;-------------------------------------- -@@: - DEBUGF 1,'FSPEED: target file %s\n',fname - mov ebp,result_table - mov ecx,18 -;-------------------------------------- -@@: - push ecx - call read_chunk - - pusha - call draw_window - popa - - call write_chunk - - pusha - call draw_window - popa - - pop ecx - add ebp,sizeof.RESULT_SLOT - - dec ecx - jnz @b - - jmp still -;----------------------------------------------------------------------------- -read_chunk: - mov eax,[file_info+32] ; file size - cmp [ebp+RESULT_SLOT.chunk_size],eax - jb @f - - xor eax,eax ; small file size for current chunk size - mov [ebp+RESULT_SLOT.read_speed],eax - ret -;-------------------------------------- -@@: - mcall 68,12,[ebp+RESULT_SLOT.chunk_size] - mov [fileread.return],eax - xor eax,eax - mov [fileread.offset],eax ; zero current offset - mcall 26,9 ; get start time - add eax,1600 ; 16 sec for iterations - mov esi,eax - mov ecx,1 - mov eax,[ebp+RESULT_SLOT.chunk_size] - mov [fileread.size],eax -;-------------------------------------- -.loop: - mcall 70,fileread - - mcall 26,9 ; check current time - cmp esi,eax - jbe .end -; correct offset - mov edx,[ebp+RESULT_SLOT.chunk_size] - add [fileread.offset],edx ; current offset -; check offset and file size - mov edx,[file_info+32] ; file size - sub edx,[ebp+RESULT_SLOT.chunk_size] - cmp [fileread.offset],edx - jbe @f - - xor edx,edx - mov [fileread.offset],edx ; zero current offset -;-------------------------------------- -@@: - inc ecx - jmp .loop -;-------------------------------------- -.end: - mov eax,[ebp+RESULT_SLOT.chunk_size] - xor edx,edx - mul ecx - shr eax,10+4 ;div 1024 ; div 16 - shl edx,18 - add eax,edx - mov [ebp+RESULT_SLOT.read_speed],eax ; speed KB/s - DEBUGF 1,'FSPEED: read chunk size: %s iterations: %d speed: %d KB/s\n',\ - [ebp+RESULT_SLOT.text],ecx,eax - mcall 68,13,[fileread.return] - ret -;----------------------------------------------------------------------------- -write_chunk: - test [check1.flags],dword 10b - jz .exit - - mov eax,[file_info+32] ; file size - cmp [ebp+RESULT_SLOT.chunk_size],eax - jb @f -;-------------------------------------- -.exit: - xor eax,eax ; small file size for current chunk size - mov [ebp+RESULT_SLOT.write_speed],eax - ret -;-------------------------------------- -@@: - mcall 68,12,[ebp+RESULT_SLOT.chunk_size] - mov [filewrite.data],eax - xor eax,eax - mov [filewrite.offset],eax ; zero current offset - mcall 26,9 ; get start time - add eax,1600 ; 16 sec for iterations - mov esi,eax - mov ecx,1 - mov eax,[ebp+RESULT_SLOT.chunk_size] - mov [filewrite.size],eax -;-------------------------------------- -.loop: - mcall 70,filewrite - - mcall 26,9 ; check current time - cmp esi,eax - jbe .end -; correct offset - mov edx,[ebp+RESULT_SLOT.chunk_size] - add [filewrite.offset],edx ; current offset -; check offset and file size - mov edx,[file_info+32] ; file size - sub edx,[ebp+RESULT_SLOT.chunk_size] - cmp [filewrite.offset],edx - jbe @f - - xor edx,edx - mov [filewrite.offset],edx ; zero current offset -;-------------------------------------- -@@: - inc ecx - jmp .loop -;-------------------------------------- -.end: - mov eax,[ebp+RESULT_SLOT.chunk_size] - xor edx,edx - mul ecx - shr eax,10+4 ;div 1024 ; div 16 - shl edx,18 - add eax,edx - mov [ebp+RESULT_SLOT.write_speed],eax ; speed KB/s - DEBUGF 1,'FSPEED: write chunk size: %s iterations: %d speed: %d KB/s\n',\ - [ebp+RESULT_SLOT.text],ecx,eax - mcall 68,13,[filewrite.data] - ret -;----------------------------------------------------------------------------- -include 'idata.inc' -;----------------------------------------------------------------------------- -IM_END: -;----------------------------------------------------------------------------- -include 'udata.inc' -;----------------------------------------------------------------------------- -I_END: -;----------------------------------------------------------------------------- +; SPDX-License-Identifier: NOASSERTION +; + +;***************************************************************************** +; File Speed - for KolibriOS +; Copyright (c) 2014, 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. +;***************************************************************************** +;----------------------------------------------------------------------------- + use32 + org 0 + db 'MENUET01' + dd 1 + dd START + dd IM_END + dd I_END + dd STACK_TOP + dd 0 + dd cur_dir_path +;----------------------------------------------------------------------------- +include 'lang.inc' +include '../../macros.inc' +define __DEBUG__ 1 +define __DEBUG_LEVEL__ 1 +include '../../debug-fdo.inc' +include '../../develop/libraries/box_lib/box_lib.mac' +include '../../KOSfuncs.inc' +include '../../load_lib.mac' + @use_library +;----------------------------------------------------------------------------- +struct RESULT_SLOT + text dd ? + read_speed dd ? + write_speed dd ? + chunk_size dd ? +ends +;----------------------------------------------------------------------------- +START: + DEBUGF 1,'FSPEED: start of programm\n' +;----------------------------------------------------------------------------- + mcall 68,11 + test eax,eax + jz exit +;----------------------------------------------------------------------------- +load_libraries l_libs_start,end_l_libs +;if return code =-1 then exit, else nornary work + inc eax + test eax,eax + jz exit +;----------------------------------------------------------------------------- +;OpenDialog initialisation + push dword OpenDialog_data + call [OpenDialog_Init] + + push check1 + call [init_checkbox] + + mcall 40,0x27 +;----------------------------------------------------------------------------- +red: + call draw_window +;----------------------------------------------------------------------------- +still: + mcall 10 + cmp eax,1 + je red + + cmp eax,2 + je key + + cmp eax,3 + je button + + push dword check1 + call [check_box_mouse] + + jmp still +;----------------------------------------------------------------------------- +key: + mcall 2 + jmp still +;----------------------------------------------------------------------------- +button: + mcall 17 + + cmp ah,2 + je select_file + + cmp ah,3 + je testing + + cmp ah,1 + jne still +;-------------------------------------- +exit: + mcall -1 +;----------------------------------------------------------------------------- +select_file: +; invoke OpenDialog + mov [OpenDialog_data.type],dword 0 + push dword OpenDialog_data + call [OpenDialog_Start] + cmp [OpenDialog_data.status],1 + jne still +; prepare for PathShow + push dword PathShow_data + call [PathShow_prepare] + + call draw_PathShow + jmp still +;----------------------------------------------------------------------------- +draw_PathShow: + mcall 13,<5,400-20>,<5,15>,0xffffff +; draw for PathShow + push dword PathShow_data + call [PathShow_draw] + ret +;----------------------------------------------------------------------------- +draw_window: + mcall 48,3,app_colours,4*10 ; get current colors + + mcall 12,1 + xor esi,esi + xor ebp,ebp + mov edx,[w_work] ; color of work area RRGGBB,8->color + or edx,0x34000000 + mcall 0,<100,400>,<100,300>,,,title + + call draw_PathShow + mov eax,[w_work_text] + or eax,0x80000000 + mov [check1.text_color],eax + push dword check1 + call [check_box_draw] + + mcall 8,<5,80>,<25,15>,2,[w_work_button] + mcall ,<400-65,50>,,3 + mov ecx,[w_work_button_text] + or ecx,0x80000000 + mcall 4,<5+10,25+4>,,s_text + mcall ,<400-65+10,25+4>,,r_text + mov ecx,[w_work_text] + or ecx,0x80000000 + mcall ,<10,47>,,check_box_warning_text + mcall ,<10,65>,,result_table_text + + mov edx,ecx + and edx,0xffffff + mcall 38,<5,400-15>,<59,59> +; draw result table + mov ebx,10 shl 16+77 + mov ebp,result_table + mov ecx,18 +;-------------------------------------- +@@: + push ecx + mov ecx,[w_work_text] + or ecx,0x80000000 + mcall 4,,,[ebp+RESULT_SLOT.text] + push ebx + mov edx,ebx + add edx,(11*6) shl 16 + mov ebx,0x800a0000 + mcall 47,,[ebp+RESULT_SLOT.read_speed],,[w_work_text] + add edx,(16*6) shl 16 + mcall ,,[ebp+RESULT_SLOT.write_speed] + pop ebx + add ebx,6+5 + add ebp,sizeof.RESULT_SLOT + pop ecx + dec ecx + jnz @b + + mcall 12,2 + ret +;-----------------------------------------------------------------------------;----------------------------------------------------------------------------- +testing: + mcall 70,fileinfo + test eax,eax + jz @f + + DEBUGF 1,'FSPEED: file not found %s\n',fname + jmp still +;-------------------------------------- +@@: + DEBUGF 1,'FSPEED: target file %s\n',fname + mov ebp,result_table + mov ecx,18 +;-------------------------------------- +@@: + push ecx + call read_chunk + + pusha + call draw_window + popa + + call write_chunk + + pusha + call draw_window + popa + + pop ecx + add ebp,sizeof.RESULT_SLOT + + dec ecx + jnz @b + + jmp still +;----------------------------------------------------------------------------- +read_chunk: + mov eax,[file_info+32] ; file size + cmp [ebp+RESULT_SLOT.chunk_size],eax + jb @f + + xor eax,eax ; small file size for current chunk size + mov [ebp+RESULT_SLOT.read_speed],eax + ret +;-------------------------------------- +@@: + mcall 68,12,[ebp+RESULT_SLOT.chunk_size] + mov [fileread.return],eax + xor eax,eax + mov [fileread.offset],eax ; zero current offset + mcall 26,9 ; get start time + add eax,1600 ; 16 sec for iterations + mov esi,eax + mov ecx,1 + mov eax,[ebp+RESULT_SLOT.chunk_size] + mov [fileread.size],eax +;-------------------------------------- +.loop: + mcall 70,fileread + + mcall 26,9 ; check current time + cmp esi,eax + jbe .end +; correct offset + mov edx,[ebp+RESULT_SLOT.chunk_size] + add [fileread.offset],edx ; current offset +; check offset and file size + mov edx,[file_info+32] ; file size + sub edx,[ebp+RESULT_SLOT.chunk_size] + cmp [fileread.offset],edx + jbe @f + + xor edx,edx + mov [fileread.offset],edx ; zero current offset +;-------------------------------------- +@@: + inc ecx + jmp .loop +;-------------------------------------- +.end: + mov eax,[ebp+RESULT_SLOT.chunk_size] + xor edx,edx + mul ecx + shr eax,10+4 ;div 1024 ; div 16 + shl edx,18 + add eax,edx + mov [ebp+RESULT_SLOT.read_speed],eax ; speed KB/s + DEBUGF 1,'FSPEED: read chunk size: %s iterations: %d speed: %d KB/s\n',\ + [ebp+RESULT_SLOT.text],ecx,eax + mcall 68,13,[fileread.return] + ret +;----------------------------------------------------------------------------- +write_chunk: + test [check1.flags],dword 10b + jz .exit + + mov eax,[file_info+32] ; file size + cmp [ebp+RESULT_SLOT.chunk_size],eax + jb @f +;-------------------------------------- +.exit: + xor eax,eax ; small file size for current chunk size + mov [ebp+RESULT_SLOT.write_speed],eax + ret +;-------------------------------------- +@@: + mcall 68,12,[ebp+RESULT_SLOT.chunk_size] + mov [filewrite.data],eax + xor eax,eax + mov [filewrite.offset],eax ; zero current offset + mcall 26,9 ; get start time + add eax,1600 ; 16 sec for iterations + mov esi,eax + mov ecx,1 + mov eax,[ebp+RESULT_SLOT.chunk_size] + mov [filewrite.size],eax +;-------------------------------------- +.loop: + mcall 70,filewrite + + mcall 26,9 ; check current time + cmp esi,eax + jbe .end +; correct offset + mov edx,[ebp+RESULT_SLOT.chunk_size] + add [filewrite.offset],edx ; current offset +; check offset and file size + mov edx,[file_info+32] ; file size + sub edx,[ebp+RESULT_SLOT.chunk_size] + cmp [filewrite.offset],edx + jbe @f + + xor edx,edx + mov [filewrite.offset],edx ; zero current offset +;-------------------------------------- +@@: + inc ecx + jmp .loop +;-------------------------------------- +.end: + mov eax,[ebp+RESULT_SLOT.chunk_size] + xor edx,edx + mul ecx + shr eax,10+4 ;div 1024 ; div 16 + shl edx,18 + add eax,edx + mov [ebp+RESULT_SLOT.write_speed],eax ; speed KB/s + DEBUGF 1,'FSPEED: write chunk size: %s iterations: %d speed: %d KB/s\n',\ + [ebp+RESULT_SLOT.text],ecx,eax + mcall 68,13,[filewrite.data] + ret +;----------------------------------------------------------------------------- +include 'idata.inc' +;----------------------------------------------------------------------------- +IM_END: +;----------------------------------------------------------------------------- +include 'udata.inc' +;----------------------------------------------------------------------------- +I_END: +;----------------------------------------------------------------------------- diff --git a/programs/testing/mgb/trunk/mgb.asm b/programs/testing/mgb/trunk/mgb.asm index 9d6fc4335..6b6b151c4 100644 --- a/programs/testing/mgb/trunk/mgb.asm +++ b/programs/testing/mgb/trunk/mgb.asm @@ -1,1201 +1,1207 @@ -;============================================================================= -; Kolibri Graphics Benchmark 0.9 -;-------------------------------------- -; MGB - Menuet Graphics Benchmark 0.3 -; Compile with FASM -; -;============================================================================= -; version: 0.9 -; last update: 15/04/2019 -; written by: Kiril Lipatov aka Leency -; changes: use big fonts, editing two comments, improve UI, show delta % -; Russian translation by Daniel Ovchinnikov -;--------------------------------------------------------------------- -; version: 0.82 -; last update: 03/11/2014 -; written by: Marat Zakiyanov aka Mario79, aka Mario -; changes: fix "benchmark GS selector" for 16bpp (support SVN r.5154) -;--------------------------------------------------------------------- -; version: 0.81 -; last update: 01/05/2014 -; written by: Marat Zakiyanov aka Mario79, aka Mario -; changes: fix "benchmark GS selector" for some display sizes -; (for example, 1366 by horizontal) and code optimization -;--------------------------------------------------------------------- -; version: 0.8 -; last update: 08/07/2013 -; written by: Marat Zakiyanov aka Mario79, aka Mario -; changes: benchmark f4 with memory + f65 -;--------------------------------------------------------------------- -; version: 0.7 -; last update: 05/04/2013 -; written by: Marat Zakiyanov aka Mario79, aka Mario -; changes: benchmark GS selector - read screen area -;--------------------------------------------------------------------- -; version: 0.6 -; last update: 14/03/2013 -; written by: Marat Zakiyanov aka Mario79, aka Mario -; changes: benchmark f36 - read screen area -;--------------------------------------------------------------------- -; version: 0.5 -; last update: 05/03/2013 -; written by: Marat Zakiyanov aka Mario79, aka Mario -; changes: benchmark f73-blitter -;--------------------------------------------------------------------- -; version: 0.4 -; last update: 18/09//2010 -; written by: Marat Zakiyanov aka Mario79, aka Mario -; changes: select path with OpenDialog, -; use of Box_Lib and Proc_Lib, -; support start with path for *.mgb file -; optimization code and size of use memory -;--------------------------------------------------------------------- -; Original author and copyrights holder: -; Mikhail Lisovin a.k.a. Mihasik -; lisovin@26.ru -; -; Disassembled with IDA 5.0.0.879: -; http://www.datarescue.com/ -; With use of 'ida.int' and 'kloader.ldw': -; Eugene Grechnikov a.k.a. diamond -; diamondz@land.ru -; http://diamondz.land.ru/ -; -; Modified for version 0.3: -; Mike Semenako a.k.a mike.dld -; mike.dld@gmail.com -; http://www.mikedld.com/ -; -;============================================================================= - -org 0x0 -use32 - - db 'MENUET01' - dd 1 - dd start - dd IM_END - dd I_END ;0x200000 - dd stacktop ;0x07FFF0 - dd fname_buf - dd cur_dir_path - -include '../../../config.inc' ;for nightbuild -include '../../../macros.inc' -include '../../../proc32.inc' -;include '../../../debug.inc' -include '../../../develop/libraries/box_lib/trunk/box_lib.mac' -include '../../../develop/libraries/box_lib/load_lib.mac' -include 'lang.inc' ;language support - @use_library -;--------------------------------------------------------------------- -start: - mcall 68,11 - - mcall 68,12,8+9*6*38*4 ; 7352 - mov [text_scren_buffer],eax - - mcall 68,12,8+9*6*38*4 ; 8216 - mov [text_scren_buffer2],eax - -load_libraries l_libs_start,end_l_libs - - cmp eax,-1 - jz close -;--------------------------------------------------------------------- - mov edi,filename_area - mov esi,start_temp_file_name - call copy_str_1 - - mov edi,comment_string_1 - mov esi,aComment1 - call copy_str_1 - - mov edi,comment_string_2 - mov esi,aComment2 - call copy_str_1 - - mov edi,fname_buf - cmp [edi],byte 0 - jne @f - mov esi,path4 - call copy_str_1 - jmp .OpenDialog -@@: - call locLoadFile - xor dword [wFlags],1 -.OpenDialog: -;OpenDialog initialisation - push dword OpenDialog_data - call [OpenDialog_Init] -;--------------------------------------------------------------------- - mcall 40,0x80000027 -red: - call draw_window -still: - mcall 10 - cmp eax,1 - jz red - cmp eax,2 - jz key - cmp eax,3 - jz button - jmp still -;--------------------------------------------------------------------- -copy_str_1: - xor eax,eax - cld -@@: - lodsb - stosb - test eax,eax - jnz @b - ret -;--------------------------------------------------------------------- -key: - mcall 2 - cmp ah,'t' - jz ActionTest - cmp ah,'c' - jz ActionComment - cmp ah,'m' - jz ActionPatternMove - cmp ah,'o' - jz ActionOpen - cmp ah,'s' - jz ActionSave - jmp still -;--------------------------------------------------------------------- -button: - mcall 17 - cmp ah,1 - jnz NotClose -close: - mcall -1 -NotClose: - cmp ah,2 - jnz locNotTest -ActionTest: - test dword [wFlags],1 - jnz still - mcall 51,1,TestWndProc,thread_stack1 - jmp still -;--------------------------------------------------------------------- -locNotTest: - cmp ah,3 - jnz NotComment -ActionComment: - test dword [wFlags],1 - jnz still - mcall 51,1,thread_comment,thread_stack2 - jmp still -;--------------------------------------------------------------------- -NotComment: - cmp ah,6 - jnz NotPatternCopy -ActionPatternMove: - test dword [wFlags],1 - jnz still - mov esi,results_table - cld -@@: - lodsd - mov [esi],eax - add esi,TEST_REC_SIZE-4 - cmp dword [esi+TEST_REC_SIZE-4],0 - jne @b - mov esi,comment_string_1 - mov edi,comment_string_2 - call copy_str_1 - call DrawBars - jmp still -;--------------------------------------------------------------------- -NotPatternCopy: - cmp ah,4 - jnz NotOpen -ActionOpen: - test dword [wFlags],1 - jnz still - mov [OpenDialog_data.type],0 ; open - call OpenDialog_Start_1 - jne still - call locLoadFile - call DrawBars -.1: - xor dword [wFlags],1 - jmp still -;--------------------------------------------------------------------- -OpenDialog_Start_1: - push dword OpenDialog_data - call [OpenDialog_Start] - cmp [OpenDialog_data.status],1 - ret -;--------------------------------------------------------------------- -NotOpen: - cmp ah,5 - jnz still -ActionSave: - test dword [wFlags],1 - jnz still - mov [OpenDialog_data.type],1 ; save - call OpenDialog_Start_1 - jne still - call locSaveFile - jmp ActionOpen.1 -;--------------------------------------------------------------------- -TestWndProc: - mcall 68,12,90*123*3 - mov [area_for_f36],eax - or dword [wFlags],1 - mov esi,results_table+8 -align 4 -.next_test: - xor edi,edi - mcall 26,9 - inc eax - mov ecx,eax - add eax,100 - mov [dwTestEndTime],eax -align 4 -@@: - mcall 26 - cmp eax,ecx - jb @r -align 4 -@@: - push esi edi - call dword [esi] - pop edi esi - inc edi - mcall 26,9 - cmp eax,[dwTestEndTime] - jb @b - mov [esi-8],edi - - add esi,TEST_REC_SIZE - cmp dword [esi], testDrawPicture_f73 - jnz @f - call prepare_f73 -@@: - cmp dword [esi],0 - jnz .next_test - xor dword [wFlags],1 - mcall 68,13,[area_for_f36] - mcall -1 -;--------------------------------------------------------------------- -draw_window: - mcall 12,1 - mcall 48,4 - mov ebx,460*65536+(LINE_DESCRIPTION_CHARS+5)*8+16 - mov ecx,80*65536+TESTS_NUM*(LINE_HEIGHT+2)+15+38 - add cx,ax - xor eax,eax - xor esi,esi - mcall ,,,34000000h,,aCaption - - mov eax,8 - mov ebx,20*65536+84 - mov ecx,4*65536+24 - mov edx,2 - mov esi,0x00007F7F -@@: - mcall - add ebx,96*65536 - inc edx - cmp edx,7 - jb @r - - mov ecx,33 - mov edx,0x00007F7F - mov esi,(LINE_DESCRIPTION_CHARS*8)/2+20 - call drawSeparator - - mcall 4,<46,9>,0x90DDEEFF,aButtonsText - call DrawBars - - mov ecx,TESTS_NUM*LINE_HEIGHT+15+23 - mov edx,0x00007F7F - mov esi,(LINE_DESCRIPTION_CHARS*8)/2+20 - call drawSeparator - mcall 12,2 - ret -;--------------------------------------------------------------------- -drawSeparator: - mov eax,1 - mov ebx,3 -@@: - mcall - add ebx,2 - dec esi - jnz @b - ret -;--------------------------------------------------------------------- -align 4 -testDrawWindow: - xor eax,eax - mcall ,640145h,4F0190h,3000000h - ret -;--------------------------------------------------------------------- -align 4 -testDrawBar: - mcall 13,0A0064h,1E00FAh,6A73D0h - ret -;--------------------------------------------------------------------- -align 4 -testDrawPicture: -; xor ebx,ebx - mcall 7,[area_for_f36],<90,123>,<15,33> - ret -;--------------------------------------------------------------------- -prepare_f73: - mov ecx, 90*123 - mov eax, params_f73.data - mov ebx, [area_for_f36] -@@: - mov edx, [ebx] - and edx, 0xFFFFFF - mov [eax], edx - add ebx, 3 - add eax, 4 - dec ecx - jnz @b - ret -align 4 -testDrawPicture_f73: - xor ebx,ebx - mcall 73,,params_f73 - ret -;--------------------------------------------------------------------- -align 4 -testGetScreen_f36: - xor ebx,ebx - mcall 36,[area_for_f36],<90,123>,<15,33> - ret -;--------------------------------------------------------------------- -GS_start_x = 15 -GS_start_y = 33 -GS_size_x = 90 -GS_size_y = 123 -;----------------------------------------------------------------------------- -align 4 -testGetScreen_GS: - push edi - mov edi,[area_for_f36] - - mcall 61,2 - cmp eax,24 - je get_area_with_GS_24 - - cmp eax,16 - je get_area_with_GS_16 -;----------------------------------------------------------------------------- -align 4 -get_area_with_GS_32: - mcall 61,3 - mov ebx,eax - - mov esi,GS_start_y - imul esi,eax - - mov eax,GS_start_x - shl eax,2 - add esi,eax - - mov ebp,GS_size_x - mov eax,ebp - shl eax,2 - sub ebx,eax - - mov edx,GS_size_y - sub esi,ebx -;-------------------------------------- -align 4 -.start_y: - add esi,ebx - mov ecx,ebp -;-------------------------------------- -align 4 -.start_x: - mov eax,[gs:esi] - mov [edi],eax - add esi,4 - add edi,3 - - dec ecx - jnz .start_x - - dec edx - jnz .start_y - - pop edi - ret -;----------------------------------------------------------------------------- -align 4 -get_area_with_GS_24: - mcall 61,3 - mov ebx,eax - - mov esi,GS_start_y - imul esi,eax - - mov eax,GS_start_x - lea eax,[eax*3] - add esi,eax - - mov ebp,GS_size_x - mov eax,ebp - lea eax,[eax*3] - sub ebx,eax - - mov edx,GS_size_y - sub esi,ebx -;-------------------------------------- -align 4 -.start_y: - add esi,ebx - mov ecx,ebp -;-------------------------------------- -align 4 -.start_x: - mov eax,[gs:esi] - mov [edi],eax - add esi,3 - add edi,3 - - dec ecx - jnz .start_x - - dec edx - jnz .start_y - - pop edi - ret -;----------------------------------------------------------------------------- -align 4 -get_area_with_GS_16: - mcall 61,3 - mov ebx,eax - - mov esi,GS_start_y - imul esi,eax - - mov eax,GS_start_x - shl eax,1 - add esi,eax - - mov ebp,GS_size_x - mov eax,ebp - shl eax,1 - sub ebx,eax - - mov edx,GS_size_y - sub esi,ebx -;-------------------------------------- -align 4 -.start_y: - add esi,ebx - mov ecx,ebp -;-------------------------------------- -align 4 -.start_x: - xor eax,eax - mov ax,[gs:esi] - shl eax, 3 - ror eax, 8 - shl ax, 2 - ror eax, 8 - shl al, 3 - rol eax, 16 - mov [edi],eax - add esi,2 - add edi,3 - - dec ecx - jnz .start_x - - dec edx - jnz .start_y - - pop edi - ret -;----------------------------------------------------------------------------- -align 4 -testDrawVertLine: - mcall 38,<300,300>,<30,380>,1090207Fh - ret -;--------------------------------------------------------------------- -align 4 -testDrawHorzLine: - mcall 38,<30,300>,<380,380>,1090207Fh - ret -;--------------------------------------------------------------------- -align 4 -testDrawFreeLine: - mcall 38,<30,300>,<380,30>,1090207Fh - ret -;--------------------------------------------------------------------- -align 4 -testDrawText1: - mcall 4,<12,300>,0x0000AA66,aTestText,34 - ret -;--------------------------------------------------------------------- -align 4 -testDrawText1m: - mov eax,[text_scren_buffer] - mov [eax],dword 6*34 - mov [eax+4],dword 9 - mcall 4,<0,0>,0x0800AA66,aTestText,34,[text_scren_buffer] - xor ebp,ebp - mov ebx,[text_scren_buffer] - add ebx,8 - mcall 65,,<6*34,9>,<18,309>,32 - ret -;--------------------------------------------------------------------- -align 4 -testDrawText2: - mcall 4,<27,315>,0x10E7B850,aTestText,34 - ret -;--------------------------------------------------------------------- -align 4 -testDrawText2m: - mov eax,[text_scren_buffer2] - mov [eax],dword 6*38 - mov [eax+4],dword 9 - mcall 4,<0,0>,0x18E7B850,aTestText,34,[text_scren_buffer2] - xor ebp,ebp - mov ebx,[text_scren_buffer2] - add ebx,8 - mcall 65,,<6*38,9>,<33,324>,32 - ret -;--------------------------------------------------------------------- -align 4 -testDrawNumber: - mcall 47,0x80000,12345678,<42,333>,0x0E0B27B - ret -;--------------------------------------------------------------------- -align 4 -testDrawPixel: - mcall 1,100,100,0FFFFFFh - ret -;--------------------------------------------------------------------- -DrawBars: - mov edi,results_table - mov ebx,30+7 -.next_result: - cmp dword[edi+TEST_REC_SIZE-4],0 - je .exit - - push ebx - movzx ecx,bx - add ecx,-2 - shl ecx,16 - mov cx,LINE_HEIGHT - mov ebx,0*65536+LINE_DESCRIPTION_CHARS*8+5 - xor edx,edx - mcall 13 - pop ebx - - and ebx,0x0000FFFF - or ebx,5*65536 - mov edx,[edi+TEST_REC_SIZE-4] - mcall 4,,0x9000CCCC - - push '=' 0x00FFFF00 0x00FFFF7F 0x00FFFF7F - mov eax,[edi+0] - cmp eax,[edi+4] - je @f - jb .lp1 - mov dword[esp+0],0x007FFF7F - mov dword[esp+4],0x00FF7F7F - mov dword[esp+8],0x0000FF00 - mov byte[esp+12],'>' -.lp1: - ja @f - mov dword[esp+0],0x00FF7F7F - mov dword[esp+4],0x007FFF7F - mov dword[esp+8],0x00FF0000 - mov byte[esp+12],'<' -@@: - pop ecx - call int2str - add ebx,(LINE_DESCRIPTION_CHARS*8-8*8*2-20)*65536 ; 196 - add ecx,0x10000000 ;big font - mcall 4,,,textarea,8 - - pop ecx - mov eax,[edi+4] - call int2str - add ebx,(6*8+26)*65536 - add ecx,0x10000000 ;big font - mcall 4 - - ;pop ecx - ;add ebx,(-15)*65536 - ;mov edx,esp - ;mov esi,1 - ;add ecx,0x10000000 ;big font - ;mcall - - - ; draw difference - pop ecx - add ecx,0x10000000 ;big font - - pusha - mov esi,ecx - mov eax,[edi+0] - mov ecx,[edi+4] - cmp ecx,0 - je .difference_end ; no div by zero - imul eax,100 - xor edx,edx - div ecx - mov ecx, eax - sub ecx,100 - mov [sign],'+' - cmp ecx,0 - jge @f ; no need to invert positive rumber - neg ecx - mov [sign],'-' - @@: - cmp ecx,1 ; do not show <=1% results - jle .difference_end - cmp ecx,100 ; do not show >=100% results - je .difference_end - - push ecx esi - add ebx,(10*8)*65536 - mov ecx,esi - mov edx,sign - mov esi,1 - mcall 4 - pop esi ecx - - add ebx,(1*8)*65536 - mov edx,ebx - mcall 47, 10000000000001000000000000000000b - - .difference_end: - popa - - add esp,4 - - add edi,TEST_REC_SIZE - add bx,LINE_HEIGHT - jmp .next_result -.exit: - - - mov ebx, 0*65536+LINE_DESCRIPTION_CHARS*8+5 - mov ecx, (TESTS_NUM*LINE_HEIGHT+15+27)*65536+LINE_HEIGHT*2 - xor edx, edx - mcall 13 - - mov ebx, 5*65536+(TESTS_NUM*LINE_HEIGHT+15+27) - mcall 4,,0x9000CCCC,aLeft - - add ebx, (8*10)*65536 - mcall ,,0x90FFFF00,comment_string_1 - - mov ebx, 5*65536+(TESTS_NUM*LINE_HEIGHT+15+27+LINE_HEIGHT) - mcall ,,0x9000CCCC,aRight - - add ebx, (8*10)*65536 - mcall ,,0x90FFFF00,comment_string_2 - ret -;--------------------------------------------------------------------- -int2str: - push eax ecx edx edi - mov edi,textarea+7 - mov dword[textarea+0],' ' - mov dword[textarea+4],' ' - mov ecx,10 -@@: - xor edx,edx - div ecx - add dl,'0' - mov [edi],dl - dec edi - or eax,eax - jnz @b - pop edi edx ecx eax - ret -;--------------------------------------------------------------------- -thread_comment: - or dword [wFlags],1 - mcall 40,0x80000027 - mov esi,comment_string_1 - cld -@@: - lodsb - test al,al - jne @r - sub esi,comment_string_1 - mov eax,esi - dec eax - mov edi, edit1 - mov [edi+48], eax ;ed_size - mov [edi+52], eax ;ed_pos - - mov esi,comment_string_2 - cld -@@: - lodsb - test al,al - jne @r - sub esi,comment_string_2 - mov eax,esi - dec eax - mov edi, edit2 - mov [edi+48], eax ;ed_size - mov [edi+52], eax ;ed_pos - - ;--------------------------------------------------------------------- -.red: - call .draw_window -.still: - mcall 10 ; wait here for event - cmp eax,1 ; redraw request ? - je .red - cmp eax,2 ; key in buffer ? - je .key - cmp eax,3 ; button in buffer ? - je .button - - push dword edit1 - call [edit_box_mouse] - push dword edit2 - call [edit_box_mouse] - jmp .still -;--------------------------------------------------------------------- -.key: ; key - mcall 2 - cmp ah,13 - je .close ;.close_with_open_file - cmp ah,27 - je .close - - push dword edit1 - call [edit_box_key] - push dword edit2 - call [edit_box_key] - jmp .still -;--------------------------------------------------------------------- -.button: ; button - mcall 17 - cmp ah,1 ; button id=1 ? - jne .still -.close: - xor dword [wFlags],1 - mcall -1 -;--------------------------------------------------------------------- -.draw_window: - mcall 12,1 - xor eax,eax - xor esi,esi - mcall ,<110,300>,<120,120>,0x34C0C0C0,,aCommentT ; 0x34780078 - push dword edit1 - call [edit_box_draw] - push dword edit2 - call [edit_box_draw] - mcall 12,2 - ret -;--------------------------------------------------------------------- -locLoadFile: - mov [stFileInfoBlock], 0 - or dword [wFlags],1 - mcall 70,stFileInfoBlock - mov esi,mgb_data - mov edi,results_table+4 - cld -@@: - cmp dword[edi+TEST_REC_SIZE-8],0 - je @f - movsd - add edi,TEST_REC_SIZE-4 - jmp @b -@@: - mov edi,comment_string_2 - mov ecx,44 - rep movsb - ret -;--------------------------------------------------------------------- -locSaveFile: - mov [stFileInfoBlock], 2 - or dword [wFlags],1 - mov esi,results_table ;+4 to save Right Bar - mov edi,mgb_data - cld -@@: - cmp dword[esi+TEST_REC_SIZE-8],0 - je @f - movsd - add esi,TEST_REC_SIZE-4 - jmp @b -@@: - mov esi,comment_string_2 - mov ecx,44 - rep movsb - mcall 70,stFileInfoBlock - ret -;--------------------------------------------------------------------- -align 4 -stFileInfoBlock dd 0,0,0 -dwDataSize dd TESTS_NUM*4+44 ;1 - dd mgb_data - db 0 - dd fname_buf -;--------------------------------------------------------------------- -wFlags dd 0 -;--------------------------------------------------------------------- -align 4 -results_table dd \ - ?,?,testDrawWindow,aDrawingWindow,\ - ?,?,testDrawBar,aDrawingBar,\ - ?,?,testGetScreen_f36,aGetScreenF36,\ - ?,?,testGetScreen_GS,aGetScreen_GS,\ - ?,?,testDrawPicture,aDrawingPicture,\ - ?,?,testDrawPicture_f73,aDrawingPictF73,\ - ?,?,testDrawVertLine,aDrawingVLine,\ - ?,?,testDrawHorzLine,aDrawingHLine,\ - ?,?,testDrawFreeLine,aDrawingFLine,\ - ?,?,testDrawText1,aDrawingText1,\ - ?,?,testDrawText1m,aDrawingText1m,\ - ?,?,testDrawText2,aDrawingText2,\ - ?,?,testDrawText2m,aDrawingText2m,\ - ?,?,testDrawNumber,aDrawingNumber,\ - ?,?,testDrawPixel,aDrawingPixel,\ - 0,0,0,0 -;--------------------------------------------------------------------- -LINE_HEIGHT = 17 -TEST_REC_SIZE = 16 -LINE_DESCRIPTION_CHARS = 58 -TESTS_NUM = ($ - results_table) / TEST_REC_SIZE - 1 -;--------------------------------------------------------------------- -if lang eq it_IT - aDrawingWindow db 'Window Of Type #3, 325x400 px',0 - aDrawingBar db 'Filled Rectangle, 100x250 px',0 - aDrawingPicture db 'Picture, 90x123, px',0 - aDrawingPictF73 db 'Picture for Blitter, 90x123, px',0 - aGetScreenF36 db 'Get a piece of screen f.36, 90x123, px',0 - aGetScreen_GS db 'Get a piece of screen GS, 90x123, px',0 - aDrawingVLine db 'Linea verticale, 350 px',0 - aDrawingHLine db 'Linea orizzontale, 270 px',0 - aDrawingFLine db 'Free-angled Line, 350 px',0 - aDrawingText1 db 'Fixed-width Text, 34 chars',0 - aDrawingText1m db 'Fixed-width Text(m), 34 chars',0 - aDrawingText2 db 'Proportional Text, 34 chars',0 - aDrawingText2m db 'Proportional Text(m), 34 chars',0 - aDrawingNumber db 'Decimal Number, 8 digits',0 - aDrawingPixel db 'Singolo pixel',0 - - aTestText db 'This is a 34-charachters test text' - aButtonsText db 'Test Commenti Apri Salva Move >',0 - aCaption db 'Kolibri Graphical Benchmark 0.9',0 - - aLeft db 'Sinistra:',0 - aRight db 'Destra :',0 - - aComment1 db 'Attuale test',0 - aComment2 db 'previous test',0 - aCommentT db 'Commenti',0 -else if lang eq ru_RU - aDrawingWindow db 'Системное окно со скином, 325x400 px',0 - aDrawingBar db 'Закрашенный прямоугольник, 100x250 px',0 - aDrawingPicture db 'Картинка, 90x123, px',0 - aDrawingPictF73 db 'Картинка для блиттера, 90x123, px',0 - aGetScreenF36 db 'Чтение экрана из видеопамяти, 90x123, px',0 - aGetScreen_GS db 'Чтение экрана из видеокарты, 90x123, px',0 - aDrawingVLine db 'Больший катет, 350 px',0 - aDrawingHLine db 'Меньший катет, 270 px',0 - aDrawingFLine db 'Гипотенуза, 350 px',0 - aDrawingText1 db 'Системный текст маленький, 34 знака',0 - aDrawingText1m db 'Системный текст маленький (буф), 34 знака',0 - aDrawingText2 db 'Системный текст большой, 34 знака',0 - aDrawingText2m db 'Системный текст большой (буф), 34 знака',0 - aDrawingNumber db 'Десятичное число, 8 цифр',0 - aDrawingPixel db 'Одиночный пиксель',0 - - aTestText db 'This is a 34-charachters test text' - aButtonsText db 'Тест Названия Из файла В файл Вправо >',0 - aCaption db 'Графический бенчмарк для Колибри v0.9',0 - - aLeft db 'Слева:',0 - aRight db 'Справа:',0 - - aComment1 db 'этот тест',0 - aComment2 db 'предыдущий тест',0 - aCommentT db 'Редактировать комментарии',0 -else - aDrawingWindow db 'Window Of Type #3, 325x400 px',0 - aDrawingBar db 'Filled Rectangle, 100x250 px',0 - aDrawingPicture db 'Picture, 90x123, px',0 - aDrawingPictF73 db 'Picture for Blitter, 90x123, px',0 - aGetScreenF36 db 'Get a piece of screen f.36, 90x123, px',0 - aGetScreen_GS db 'Get a piece of screen GS, 90x123, px',0 - aDrawingVLine db 'Vertical Line, 350 px',0 - aDrawingHLine db 'Horizontal Line, 270 px',0 - aDrawingFLine db 'Free-angled Line, 350 px',0 - aDrawingText1 db 'Fixed-width Text, 34 chars',0 - aDrawingText1m db 'Fixed-width Text(mem), 34 chars',0 - aDrawingText2 db 'Proportional Text, 34 chars',0 - aDrawingText2m db 'Proportional Text(mem), 34 chars',0 - aDrawingNumber db 'Decimal Number, 8 digits',0 - aDrawingPixel db 'Single Pixel',0 - - aTestText db 'This is a 34-charachters test text' - aButtonsText db 'Test Comments Open Save Move >',0 - aCaption db 'Kolibri Graphical Benchmark 0.9',0 - - aLeft db 'Left :',0 - aRight db 'Right :',0 - - aComment1 db 'current test',0 - aComment2 db 'previous test',0 - aCommentT db 'Edit comments',0 -end if -;--------------------------------------------------------------------- -system_dir_Boxlib db '/sys/lib/box_lib.obj',0 -system_dir_ProcLib db '/sys/lib/proc_lib.obj',0 -;--------------------------------------------------------------------- -head_f_i: -if lang eq it_IT - head_f_l db 'Errore Sistema',0 -else - head_f_l db 'System error',0 -end if - -err_message_found_lib1 db 'box_lib.obj - Not found!',0 -err_message_found_lib2 db 'proc_lib.obj - Not found!',0 - -err_message_import1 db 'box_lib.obj - Wrong import!',0 -err_message_import2 db 'proc_lib.obj - Wrong import!',0 -;--------------------------------------------------------------------- -align 4 -l_libs_start: - -library01 l_libs system_dir_Boxlib+9, cur_dir_path, library_path, system_dir_Boxlib, \ -err_message_found_lib1, head_f_l, Box_lib_import, err_message_import1, head_f_i - -library02 l_libs system_dir_ProcLib+9, cur_dir_path, library_path, system_dir_ProcLib, \ -err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i - -end_l_libs: -;--------------------------------------------------------------------- -align 4 -OpenDialog_data: -.type dd 1 ; Save -.procinfo dd procinfo ;+4 -.com_area_name dd communication_area_name ;+8 -.com_area dd 0 ;+12 -.opendir_pach dd temp_dir_pach ;+16 -.dir_default_pach dd communication_area_default_pach ;+20 -.start_path dd open_dialog_path ;+24 -.draw_window dd draw_window ;+28 -.status dd 0 ;+32 -.openfile_pach dd fname_buf ;+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 - -communication_area_name: - db 'FFFFFFFF_open_dialog',0 -open_dialog_path: -if __nightbuild eq yes - db '/sys/MANAGERS/opendial',0 -else - db '/sys/File Managers/opendial',0 -end if -communication_area_default_pach: - db '/sys/',0 - -Filter: -dd Filter.end - Filter -.1: -db 'MGB',0 -.end: -db 0 - -sign db ?,0 - -start_temp_file_name: db 'results.mgb',0 - -path4 db '/sys/results.mgb',0 -;--------------------------------------------------------------------- -align 4 -params_f73: -; destination -.offset_X_dest dd 0 ; +0 -.offset_Y_dest dd 0 ; +4 -.width_dest dd 90 ; +8 -.height_dest dd 123 ; +12 -; source -.offset_X_src dd 0 ; +16 -.offset_Y_src dd 0 ; +20 -.width_src dd 90 ; +24 -.height_src dd 123 ; +28 -; other -.pointer dd .data; 90*4 ; +32 -.row_size dd 90*4 ; +36 -;--------------------------------------------------------------------- -align 4 -ProcLib_import: -OpenDialog_Init dd aOpenDialog_Init -OpenDialog_Start dd aOpenDialog_Start -;OpenDialog__Version dd aOpenDialog_Version - dd 0,0 -aOpenDialog_Init db 'OpenDialog_init',0 -aOpenDialog_Start db 'OpenDialog_start',0 -;aOpenDialog_Version db 'Version_OpenDialog',0 -;--------------------------------------------------------------------- -align 4 -Box_lib_import: -;init_lib dd a_init -;version_lib dd a_version - - -edit_box_draw dd aEdit_box_draw -edit_box_key dd aEdit_box_key -edit_box_mouse dd aEdit_box_mouse -;version_ed dd aVersion_ed - -;check_box_draw dd aCheck_box_draw -;check_box_mouse dd aCheck_box_mouse -;version_ch dd aVersion_ch - -;option_box_draw dd aOption_box_draw -;option_box_mouse dd aOption_box_mouse -;version_op dd aVersion_op - -;scrollbar_ver_draw dd aScrollbar_ver_draw -;scrollbar_ver_mouse dd aScrollbar_ver_mouse -;scrollbar_hor_draw dd aScrollbar_hor_draw -;scrollbar_hor_mouse dd aScrollbar_hor_mouse -;version_scrollbar dd aVersion_scrollbar - -;dinamic_button_draw dd aDbutton_draw -;dinamic_button_mouse dd aDbutton_mouse -;version_dbutton dd aVersion_dbutton - -;menu_bar_draw dd aMenu_bar_draw -;menu_bar_mouse dd aMenu_bar_mouse -;menu_bar_activate dd aMenu_bar_activate -;version_menu_bar dd aVersion_menu_bar - -;FileBrowser_draw dd aFileBrowser_draw -;FileBrowser_mouse dd aFileBrowser_mouse -;FileBrowser_key dd aFileBrowser_key -;Version_FileBrowser dd aVersion_FileBrowser - -;PathShow_prepare dd sz_PathShow_prepare -;PathShow_draw dd sz_PathShow_draw -;Version_path_show dd szVersion_path_show - dd 0,0 - -;a_init db 'lib_init',0 -;a_version db 'version',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 - -;aCheck_box_draw db 'check_box_draw',0 -;aCheck_box_mouse db 'check_box_mouse',0 -;aVersion_ch db 'version_ch',0 - -;aOption_box_draw db 'option_box_draw',0 -;aOption_box_mouse db 'option_box_mouse',0 -;aVersion_op db 'version_op',0 - -;aScrollbar_ver_draw db 'scrollbar_v_draw',0 -;aScrollbar_ver_mouse db 'scrollbar_v_mouse',0 -;aScrollbar_hor_draw db 'scrollbar_h_draw',0 -;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0 -;aVersion_scrollbar db 'version_scrollbar',0 - -;aDbutton_draw db 'dbutton_draw',0 -;aDbutton_mouse db 'dbutton_mouse',0 -;aVersion_dbutton db 'version_dbutton',0 - -;aMenu_bar_draw db 'menu_bar_draw',0 -;aMenu_bar_mouse db 'menu_bar_mouse',0 -;aMenu_bar_activate db 'menu_bar_activate',0 -;aVersion_menu_bar db 'version_menu_bar',0 - -;aFileBrowser_draw db 'FileBrowser_draw',0 -;aFileBrowser_mouse db 'FileBrowser_mouse',0 -;aFileBrowser_key db 'FileBrowser_key',0 -;aVersion_FileBrowser db 'version_FileBrowser',0 - -;sz_PathShow_prepare db 'PathShow_prepare',0 -;sz_PathShow_draw db 'PathShow_draw',0 -;szVersion_path_show db 'version_PathShow',0 -;--------------------------------------------------------------------- -; for EDITBOX -align 4 -editboxes: -edit1 edit_box 260,12,15,0xffffff,0xbbddff,0xFF00FF,0x7F7F7F,\ - 0x90000000,43,comment_string_1,0,ed_focus,0 -edit2 edit_box 260,12,50,0xffffff,0xbbddff,0xFF00FF,0x7F7F7F,\ - 0x90000000,43,comment_string_2,0,0,0 -editboxes_end: -;--------------------------------------------------------------------- - -IM_END: -align 4 -area_for_f36 rd 1 -dwTestEndTime rd 1 -dwMainPID rd 1 -;----------------------------------------------------------------------------- -text_scren_buffer rd 1 -text_scren_buffer2 rd 1 -;--------------------------------------------------------------------- -textarea: - rb 8 -;--------------------------------------------------------------------- -comment_string_1: - rb 44 -;--------------------------------------------------------------------- -comment_string_2: - rb 44 -;--------------------------------------------------------------------- -mgb_data: - rb 100 -;--------------------------------------------------------------------- -procinfo: - rb 1024 -;--------------------------------------------------------------------- -cur_dir_path: - rb 4096 -;--------------------------------------------------------------------- -library_path: - rb 4096 -;--------------------------------------------------------------------- -temp_dir_pach: - rb 4096 -;--------------------------------------------------------------------- -fname_buf: - rb 4096 -;--------------------------------------------------------------------- -filename_area: - rb 256 -;--------------------------------------------------------------------- -align 4 - rb 4096 -thread_stack2: -;--------------------------------------------------------------------- -align 4 - rb 4096 -thread_stack1: -;--------------------------------------------------------------------- -align 4 - rb 4096 -stacktop: -params_f73.data rb 123*90*4 -I_END: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +;============================================================================= +; Kolibri Graphics Benchmark 0.9 +;-------------------------------------- +; MGB - Menuet Graphics Benchmark 0.3 +; Compile with FASM +; +;============================================================================= +; version: 0.9 +; last update: 15/04/2019 +; written by: Kiril Lipatov aka Leency +; changes: use big fonts, editing two comments, improve UI, show delta % +; Russian translation by Daniel Ovchinnikov +;--------------------------------------------------------------------- +; version: 0.82 +; last update: 03/11/2014 +; written by: Marat Zakiyanov aka Mario79, aka Mario +; changes: fix "benchmark GS selector" for 16bpp (support SVN r.5154) +;--------------------------------------------------------------------- +; version: 0.81 +; last update: 01/05/2014 +; written by: Marat Zakiyanov aka Mario79, aka Mario +; changes: fix "benchmark GS selector" for some display sizes +; (for example, 1366 by horizontal) and code optimization +;--------------------------------------------------------------------- +; version: 0.8 +; last update: 08/07/2013 +; written by: Marat Zakiyanov aka Mario79, aka Mario +; changes: benchmark f4 with memory + f65 +;--------------------------------------------------------------------- +; version: 0.7 +; last update: 05/04/2013 +; written by: Marat Zakiyanov aka Mario79, aka Mario +; changes: benchmark GS selector - read screen area +;--------------------------------------------------------------------- +; version: 0.6 +; last update: 14/03/2013 +; written by: Marat Zakiyanov aka Mario79, aka Mario +; changes: benchmark f36 - read screen area +;--------------------------------------------------------------------- +; version: 0.5 +; last update: 05/03/2013 +; written by: Marat Zakiyanov aka Mario79, aka Mario +; changes: benchmark f73-blitter +;--------------------------------------------------------------------- +; version: 0.4 +; last update: 18/09//2010 +; written by: Marat Zakiyanov aka Mario79, aka Mario +; changes: select path with OpenDialog, +; use of Box_Lib and Proc_Lib, +; support start with path for *.mgb file +; optimization code and size of use memory +;--------------------------------------------------------------------- +; Original author and copyrights holder: +; Mikhail Lisovin a.k.a. Mihasik +; lisovin@26.ru +; +; Disassembled with IDA 5.0.0.879: +; http://www.datarescue.com/ +; With use of 'ida.int' and 'kloader.ldw': +; Eugene Grechnikov a.k.a. diamond +; diamondz@land.ru +; http://diamondz.land.ru/ +; +; Modified for version 0.3: +; Mike Semenako a.k.a mike.dld +; mike.dld@gmail.com +; http://www.mikedld.com/ +; +;============================================================================= + +org 0x0 +use32 + + db 'MENUET01' + dd 1 + dd start + dd IM_END + dd I_END ;0x200000 + dd stacktop ;0x07FFF0 + dd fname_buf + dd cur_dir_path + +include '../../../config.inc' ;for nightbuild +include '../../../macros.inc' +include '../../../proc32.inc' +;include '../../../debug.inc' +include '../../../develop/libraries/box_lib/box_lib.mac' +include '../../../develop/libraries/box_lib/load_lib.mac' +include 'lang.inc' ;language support + @use_library +;--------------------------------------------------------------------- +start: + mcall 68,11 + + mcall 68,12,8+9*6*38*4 ; 7352 + mov [text_scren_buffer],eax + + mcall 68,12,8+9*6*38*4 ; 8216 + mov [text_scren_buffer2],eax + +load_libraries l_libs_start,end_l_libs + + cmp eax,-1 + jz close +;--------------------------------------------------------------------- + mov edi,filename_area + mov esi,start_temp_file_name + call copy_str_1 + + mov edi,comment_string_1 + mov esi,aComment1 + call copy_str_1 + + mov edi,comment_string_2 + mov esi,aComment2 + call copy_str_1 + + mov edi,fname_buf + cmp [edi],byte 0 + jne @f + mov esi,path4 + call copy_str_1 + jmp .OpenDialog +@@: + call locLoadFile + xor dword [wFlags],1 +.OpenDialog: +;OpenDialog initialisation + push dword OpenDialog_data + call [OpenDialog_Init] +;--------------------------------------------------------------------- + mcall 40,0x80000027 +red: + call draw_window +still: + mcall 10 + cmp eax,1 + jz red + cmp eax,2 + jz key + cmp eax,3 + jz button + jmp still +;--------------------------------------------------------------------- +copy_str_1: + xor eax,eax + cld +@@: + lodsb + stosb + test eax,eax + jnz @b + ret +;--------------------------------------------------------------------- +key: + mcall 2 + cmp ah,'t' + jz ActionTest + cmp ah,'c' + jz ActionComment + cmp ah,'m' + jz ActionPatternMove + cmp ah,'o' + jz ActionOpen + cmp ah,'s' + jz ActionSave + jmp still +;--------------------------------------------------------------------- +button: + mcall 17 + cmp ah,1 + jnz NotClose +close: + mcall -1 +NotClose: + cmp ah,2 + jnz locNotTest +ActionTest: + test dword [wFlags],1 + jnz still + mcall 51,1,TestWndProc,thread_stack1 + jmp still +;--------------------------------------------------------------------- +locNotTest: + cmp ah,3 + jnz NotComment +ActionComment: + test dword [wFlags],1 + jnz still + mcall 51,1,thread_comment,thread_stack2 + jmp still +;--------------------------------------------------------------------- +NotComment: + cmp ah,6 + jnz NotPatternCopy +ActionPatternMove: + test dword [wFlags],1 + jnz still + mov esi,results_table + cld +@@: + lodsd + mov [esi],eax + add esi,TEST_REC_SIZE-4 + cmp dword [esi+TEST_REC_SIZE-4],0 + jne @b + mov esi,comment_string_1 + mov edi,comment_string_2 + call copy_str_1 + call DrawBars + jmp still +;--------------------------------------------------------------------- +NotPatternCopy: + cmp ah,4 + jnz NotOpen +ActionOpen: + test dword [wFlags],1 + jnz still + mov [OpenDialog_data.type],0 ; open + call OpenDialog_Start_1 + jne still + call locLoadFile + call DrawBars +.1: + xor dword [wFlags],1 + jmp still +;--------------------------------------------------------------------- +OpenDialog_Start_1: + push dword OpenDialog_data + call [OpenDialog_Start] + cmp [OpenDialog_data.status],1 + ret +;--------------------------------------------------------------------- +NotOpen: + cmp ah,5 + jnz still +ActionSave: + test dword [wFlags],1 + jnz still + mov [OpenDialog_data.type],1 ; save + call OpenDialog_Start_1 + jne still + call locSaveFile + jmp ActionOpen.1 +;--------------------------------------------------------------------- +TestWndProc: + mcall 68,12,90*123*3 + mov [area_for_f36],eax + or dword [wFlags],1 + mov esi,results_table+8 +align 4 +.next_test: + xor edi,edi + mcall 26,9 + inc eax + mov ecx,eax + add eax,100 + mov [dwTestEndTime],eax +align 4 +@@: + mcall 26 + cmp eax,ecx + jb @r +align 4 +@@: + push esi edi + call dword [esi] + pop edi esi + inc edi + mcall 26,9 + cmp eax,[dwTestEndTime] + jb @b + mov [esi-8],edi + + add esi,TEST_REC_SIZE + cmp dword [esi], testDrawPicture_f73 + jnz @f + call prepare_f73 +@@: + cmp dword [esi],0 + jnz .next_test + xor dword [wFlags],1 + mcall 68,13,[area_for_f36] + mcall -1 +;--------------------------------------------------------------------- +draw_window: + mcall 12,1 + mcall 48,4 + mov ebx,460*65536+(LINE_DESCRIPTION_CHARS+5)*8+16 + mov ecx,80*65536+TESTS_NUM*(LINE_HEIGHT+2)+15+38 + add cx,ax + xor eax,eax + xor esi,esi + mcall ,,,34000000h,,aCaption + + mov eax,8 + mov ebx,20*65536+84 + mov ecx,4*65536+24 + mov edx,2 + mov esi,0x00007F7F +@@: + mcall + add ebx,96*65536 + inc edx + cmp edx,7 + jb @r + + mov ecx,33 + mov edx,0x00007F7F + mov esi,(LINE_DESCRIPTION_CHARS*8)/2+20 + call drawSeparator + + mcall 4,<46,9>,0x90DDEEFF,aButtonsText + call DrawBars + + mov ecx,TESTS_NUM*LINE_HEIGHT+15+23 + mov edx,0x00007F7F + mov esi,(LINE_DESCRIPTION_CHARS*8)/2+20 + call drawSeparator + mcall 12,2 + ret +;--------------------------------------------------------------------- +drawSeparator: + mov eax,1 + mov ebx,3 +@@: + mcall + add ebx,2 + dec esi + jnz @b + ret +;--------------------------------------------------------------------- +align 4 +testDrawWindow: + xor eax,eax + mcall ,640145h,4F0190h,3000000h + ret +;--------------------------------------------------------------------- +align 4 +testDrawBar: + mcall 13,0A0064h,1E00FAh,6A73D0h + ret +;--------------------------------------------------------------------- +align 4 +testDrawPicture: +; xor ebx,ebx + mcall 7,[area_for_f36],<90,123>,<15,33> + ret +;--------------------------------------------------------------------- +prepare_f73: + mov ecx, 90*123 + mov eax, params_f73.data + mov ebx, [area_for_f36] +@@: + mov edx, [ebx] + and edx, 0xFFFFFF + mov [eax], edx + add ebx, 3 + add eax, 4 + dec ecx + jnz @b + ret +align 4 +testDrawPicture_f73: + xor ebx,ebx + mcall 73,,params_f73 + ret +;--------------------------------------------------------------------- +align 4 +testGetScreen_f36: + xor ebx,ebx + mcall 36,[area_for_f36],<90,123>,<15,33> + ret +;--------------------------------------------------------------------- +GS_start_x = 15 +GS_start_y = 33 +GS_size_x = 90 +GS_size_y = 123 +;----------------------------------------------------------------------------- +align 4 +testGetScreen_GS: + push edi + mov edi,[area_for_f36] + + mcall 61,2 + cmp eax,24 + je get_area_with_GS_24 + + cmp eax,16 + je get_area_with_GS_16 +;----------------------------------------------------------------------------- +align 4 +get_area_with_GS_32: + mcall 61,3 + mov ebx,eax + + mov esi,GS_start_y + imul esi,eax + + mov eax,GS_start_x + shl eax,2 + add esi,eax + + mov ebp,GS_size_x + mov eax,ebp + shl eax,2 + sub ebx,eax + + mov edx,GS_size_y + sub esi,ebx +;-------------------------------------- +align 4 +.start_y: + add esi,ebx + mov ecx,ebp +;-------------------------------------- +align 4 +.start_x: + mov eax,[gs:esi] + mov [edi],eax + add esi,4 + add edi,3 + + dec ecx + jnz .start_x + + dec edx + jnz .start_y + + pop edi + ret +;----------------------------------------------------------------------------- +align 4 +get_area_with_GS_24: + mcall 61,3 + mov ebx,eax + + mov esi,GS_start_y + imul esi,eax + + mov eax,GS_start_x + lea eax,[eax*3] + add esi,eax + + mov ebp,GS_size_x + mov eax,ebp + lea eax,[eax*3] + sub ebx,eax + + mov edx,GS_size_y + sub esi,ebx +;-------------------------------------- +align 4 +.start_y: + add esi,ebx + mov ecx,ebp +;-------------------------------------- +align 4 +.start_x: + mov eax,[gs:esi] + mov [edi],eax + add esi,3 + add edi,3 + + dec ecx + jnz .start_x + + dec edx + jnz .start_y + + pop edi + ret +;----------------------------------------------------------------------------- +align 4 +get_area_with_GS_16: + mcall 61,3 + mov ebx,eax + + mov esi,GS_start_y + imul esi,eax + + mov eax,GS_start_x + shl eax,1 + add esi,eax + + mov ebp,GS_size_x + mov eax,ebp + shl eax,1 + sub ebx,eax + + mov edx,GS_size_y + sub esi,ebx +;-------------------------------------- +align 4 +.start_y: + add esi,ebx + mov ecx,ebp +;-------------------------------------- +align 4 +.start_x: + xor eax,eax + mov ax,[gs:esi] + shl eax, 3 + ror eax, 8 + shl ax, 2 + ror eax, 8 + shl al, 3 + rol eax, 16 + mov [edi],eax + add esi,2 + add edi,3 + + dec ecx + jnz .start_x + + dec edx + jnz .start_y + + pop edi + ret +;----------------------------------------------------------------------------- +align 4 +testDrawVertLine: + mcall 38,<300,300>,<30,380>,1090207Fh + ret +;--------------------------------------------------------------------- +align 4 +testDrawHorzLine: + mcall 38,<30,300>,<380,380>,1090207Fh + ret +;--------------------------------------------------------------------- +align 4 +testDrawFreeLine: + mcall 38,<30,300>,<380,30>,1090207Fh + ret +;--------------------------------------------------------------------- +align 4 +testDrawText1: + mcall 4,<12,300>,0x0000AA66,aTestText,34 + ret +;--------------------------------------------------------------------- +align 4 +testDrawText1m: + mov eax,[text_scren_buffer] + mov [eax],dword 6*34 + mov [eax+4],dword 9 + mcall 4,<0,0>,0x0800AA66,aTestText,34,[text_scren_buffer] + xor ebp,ebp + mov ebx,[text_scren_buffer] + add ebx,8 + mcall 65,,<6*34,9>,<18,309>,32 + ret +;--------------------------------------------------------------------- +align 4 +testDrawText2: + mcall 4,<27,315>,0x10E7B850,aTestText,34 + ret +;--------------------------------------------------------------------- +align 4 +testDrawText2m: + mov eax,[text_scren_buffer2] + mov [eax],dword 6*38 + mov [eax+4],dword 9 + mcall 4,<0,0>,0x18E7B850,aTestText,34,[text_scren_buffer2] + xor ebp,ebp + mov ebx,[text_scren_buffer2] + add ebx,8 + mcall 65,,<6*38,9>,<33,324>,32 + ret +;--------------------------------------------------------------------- +align 4 +testDrawNumber: + mcall 47,0x80000,12345678,<42,333>,0x0E0B27B + ret +;--------------------------------------------------------------------- +align 4 +testDrawPixel: + mcall 1,100,100,0FFFFFFh + ret +;--------------------------------------------------------------------- +DrawBars: + mov edi,results_table + mov ebx,30+7 +.next_result: + cmp dword[edi+TEST_REC_SIZE-4],0 + je .exit + + push ebx + movzx ecx,bx + add ecx,-2 + shl ecx,16 + mov cx,LINE_HEIGHT + mov ebx,0*65536+LINE_DESCRIPTION_CHARS*8+5 + xor edx,edx + mcall 13 + pop ebx + + and ebx,0x0000FFFF + or ebx,5*65536 + mov edx,[edi+TEST_REC_SIZE-4] + mcall 4,,0x9000CCCC + + push '=' 0x00FFFF00 0x00FFFF7F 0x00FFFF7F + mov eax,[edi+0] + cmp eax,[edi+4] + je @f + jb .lp1 + mov dword[esp+0],0x007FFF7F + mov dword[esp+4],0x00FF7F7F + mov dword[esp+8],0x0000FF00 + mov byte[esp+12],'>' +.lp1: + ja @f + mov dword[esp+0],0x00FF7F7F + mov dword[esp+4],0x007FFF7F + mov dword[esp+8],0x00FF0000 + mov byte[esp+12],'<' +@@: + pop ecx + call int2str + add ebx,(LINE_DESCRIPTION_CHARS*8-8*8*2-20)*65536 ; 196 + add ecx,0x10000000 ;big font + mcall 4,,,textarea,8 + + pop ecx + mov eax,[edi+4] + call int2str + add ebx,(6*8+26)*65536 + add ecx,0x10000000 ;big font + mcall 4 + + ;pop ecx + ;add ebx,(-15)*65536 + ;mov edx,esp + ;mov esi,1 + ;add ecx,0x10000000 ;big font + ;mcall + + + ; draw difference + pop ecx + add ecx,0x10000000 ;big font + + pusha + mov esi,ecx + mov eax,[edi+0] + mov ecx,[edi+4] + cmp ecx,0 + je .difference_end ; no div by zero + imul eax,100 + xor edx,edx + div ecx + mov ecx, eax + sub ecx,100 + mov [sign],'+' + cmp ecx,0 + jge @f ; no need to invert positive rumber + neg ecx + mov [sign],'-' + @@: + cmp ecx,1 ; do not show <=1% results + jle .difference_end + cmp ecx,100 ; do not show >=100% results + je .difference_end + + push ecx esi + add ebx,(10*8)*65536 + mov ecx,esi + mov edx,sign + mov esi,1 + mcall 4 + pop esi ecx + + add ebx,(1*8)*65536 + mov edx,ebx + mcall 47, 10000000000001000000000000000000b + + .difference_end: + popa + + add esp,4 + + add edi,TEST_REC_SIZE + add bx,LINE_HEIGHT + jmp .next_result +.exit: + + + mov ebx, 0*65536+LINE_DESCRIPTION_CHARS*8+5 + mov ecx, (TESTS_NUM*LINE_HEIGHT+15+27)*65536+LINE_HEIGHT*2 + xor edx, edx + mcall 13 + + mov ebx, 5*65536+(TESTS_NUM*LINE_HEIGHT+15+27) + mcall 4,,0x9000CCCC,aLeft + + add ebx, (8*10)*65536 + mcall ,,0x90FFFF00,comment_string_1 + + mov ebx, 5*65536+(TESTS_NUM*LINE_HEIGHT+15+27+LINE_HEIGHT) + mcall ,,0x9000CCCC,aRight + + add ebx, (8*10)*65536 + mcall ,,0x90FFFF00,comment_string_2 + ret +;--------------------------------------------------------------------- +int2str: + push eax ecx edx edi + mov edi,textarea+7 + mov dword[textarea+0],' ' + mov dword[textarea+4],' ' + mov ecx,10 +@@: + xor edx,edx + div ecx + add dl,'0' + mov [edi],dl + dec edi + or eax,eax + jnz @b + pop edi edx ecx eax + ret +;--------------------------------------------------------------------- +thread_comment: + or dword [wFlags],1 + mcall 40,0x80000027 + mov esi,comment_string_1 + cld +@@: + lodsb + test al,al + jne @r + sub esi,comment_string_1 + mov eax,esi + dec eax + mov edi, edit1 + mov [edi+48], eax ;ed_size + mov [edi+52], eax ;ed_pos + + mov esi,comment_string_2 + cld +@@: + lodsb + test al,al + jne @r + sub esi,comment_string_2 + mov eax,esi + dec eax + mov edi, edit2 + mov [edi+48], eax ;ed_size + mov [edi+52], eax ;ed_pos + + ;--------------------------------------------------------------------- +.red: + call .draw_window +.still: + mcall 10 ; wait here for event + cmp eax,1 ; redraw request ? + je .red + cmp eax,2 ; key in buffer ? + je .key + cmp eax,3 ; button in buffer ? + je .button + + push dword edit1 + call [edit_box_mouse] + push dword edit2 + call [edit_box_mouse] + jmp .still +;--------------------------------------------------------------------- +.key: ; key + mcall 2 + cmp ah,13 + je .close ;.close_with_open_file + cmp ah,27 + je .close + + push dword edit1 + call [edit_box_key] + push dword edit2 + call [edit_box_key] + jmp .still +;--------------------------------------------------------------------- +.button: ; button + mcall 17 + cmp ah,1 ; button id=1 ? + jne .still +.close: + xor dword [wFlags],1 + mcall -1 +;--------------------------------------------------------------------- +.draw_window: + mcall 12,1 + xor eax,eax + xor esi,esi + mcall ,<110,300>,<120,120>,0x34C0C0C0,,aCommentT ; 0x34780078 + push dword edit1 + call [edit_box_draw] + push dword edit2 + call [edit_box_draw] + mcall 12,2 + ret +;--------------------------------------------------------------------- +locLoadFile: + mov [stFileInfoBlock], 0 + or dword [wFlags],1 + mcall 70,stFileInfoBlock + mov esi,mgb_data + mov edi,results_table+4 + cld +@@: + cmp dword[edi+TEST_REC_SIZE-8],0 + je @f + movsd + add edi,TEST_REC_SIZE-4 + jmp @b +@@: + mov edi,comment_string_2 + mov ecx,44 + rep movsb + ret +;--------------------------------------------------------------------- +locSaveFile: + mov [stFileInfoBlock], 2 + or dword [wFlags],1 + mov esi,results_table ;+4 to save Right Bar + mov edi,mgb_data + cld +@@: + cmp dword[esi+TEST_REC_SIZE-8],0 + je @f + movsd + add esi,TEST_REC_SIZE-4 + jmp @b +@@: + mov esi,comment_string_2 + mov ecx,44 + rep movsb + mcall 70,stFileInfoBlock + ret +;--------------------------------------------------------------------- +align 4 +stFileInfoBlock dd 0,0,0 +dwDataSize dd TESTS_NUM*4+44 ;1 + dd mgb_data + db 0 + dd fname_buf +;--------------------------------------------------------------------- +wFlags dd 0 +;--------------------------------------------------------------------- +align 4 +results_table dd \ + ?,?,testDrawWindow,aDrawingWindow,\ + ?,?,testDrawBar,aDrawingBar,\ + ?,?,testGetScreen_f36,aGetScreenF36,\ + ?,?,testGetScreen_GS,aGetScreen_GS,\ + ?,?,testDrawPicture,aDrawingPicture,\ + ?,?,testDrawPicture_f73,aDrawingPictF73,\ + ?,?,testDrawVertLine,aDrawingVLine,\ + ?,?,testDrawHorzLine,aDrawingHLine,\ + ?,?,testDrawFreeLine,aDrawingFLine,\ + ?,?,testDrawText1,aDrawingText1,\ + ?,?,testDrawText1m,aDrawingText1m,\ + ?,?,testDrawText2,aDrawingText2,\ + ?,?,testDrawText2m,aDrawingText2m,\ + ?,?,testDrawNumber,aDrawingNumber,\ + ?,?,testDrawPixel,aDrawingPixel,\ + 0,0,0,0 +;--------------------------------------------------------------------- +LINE_HEIGHT = 17 +TEST_REC_SIZE = 16 +LINE_DESCRIPTION_CHARS = 58 +TESTS_NUM = ($ - results_table) / TEST_REC_SIZE - 1 +;--------------------------------------------------------------------- +if lang eq it_IT + aDrawingWindow db 'Window Of Type #3, 325x400 px',0 + aDrawingBar db 'Filled Rectangle, 100x250 px',0 + aDrawingPicture db 'Picture, 90x123, px',0 + aDrawingPictF73 db 'Picture for Blitter, 90x123, px',0 + aGetScreenF36 db 'Get a piece of screen f.36, 90x123, px',0 + aGetScreen_GS db 'Get a piece of screen GS, 90x123, px',0 + aDrawingVLine db 'Linea verticale, 350 px',0 + aDrawingHLine db 'Linea orizzontale, 270 px',0 + aDrawingFLine db 'Free-angled Line, 350 px',0 + aDrawingText1 db 'Fixed-width Text, 34 chars',0 + aDrawingText1m db 'Fixed-width Text(m), 34 chars',0 + aDrawingText2 db 'Proportional Text, 34 chars',0 + aDrawingText2m db 'Proportional Text(m), 34 chars',0 + aDrawingNumber db 'Decimal Number, 8 digits',0 + aDrawingPixel db 'Singolo pixel',0 + + aTestText db 'This is a 34-charachters test text' + aButtonsText db 'Test Commenti Apri Salva Move >',0 + aCaption db 'Kolibri Graphical Benchmark 0.9',0 + + aLeft db 'Sinistra:',0 + aRight db 'Destra :',0 + + aComment1 db 'Attuale test',0 + aComment2 db 'previous test',0 + aCommentT db 'Commenti',0 +else if lang eq ru_RU + aDrawingWindow db 'Системное окно со скином, 325x400 px',0 + aDrawingBar db 'Закрашенный прямоугольник, 100x250 px',0 + aDrawingPicture db 'Картинка, 90x123, px',0 + aDrawingPictF73 db 'Картинка для блиттера, 90x123, px',0 + aGetScreenF36 db 'Чтение экрана из видеопамяти, 90x123, px',0 + aGetScreen_GS db 'Чтение экрана из видеокарты, 90x123, px',0 + aDrawingVLine db 'Больший катет, 350 px',0 + aDrawingHLine db 'Меньший катет, 270 px',0 + aDrawingFLine db 'Гипотенуза, 350 px',0 + aDrawingText1 db 'Системный текст маленький, 34 знака',0 + aDrawingText1m db 'Системный текст маленький (буф), 34 знака',0 + aDrawingText2 db 'Системный текст большой, 34 знака',0 + aDrawingText2m db 'Системный текст большой (буф), 34 знака',0 + aDrawingNumber db 'Десятичное число, 8 цифр',0 + aDrawingPixel db 'Одиночный пиксель',0 + + aTestText db 'This is a 34-charachters test text' + aButtonsText db 'Тест Названия Из файла В файл Вправо >',0 + aCaption db 'Графический бенчмарк для Колибри v0.9',0 + + aLeft db 'Слева:',0 + aRight db 'Справа:',0 + + aComment1 db 'этот тест',0 + aComment2 db 'предыдущий тест',0 + aCommentT db 'Редактировать комментарии',0 +else + aDrawingWindow db 'Window Of Type #3, 325x400 px',0 + aDrawingBar db 'Filled Rectangle, 100x250 px',0 + aDrawingPicture db 'Picture, 90x123, px',0 + aDrawingPictF73 db 'Picture for Blitter, 90x123, px',0 + aGetScreenF36 db 'Get a piece of screen f.36, 90x123, px',0 + aGetScreen_GS db 'Get a piece of screen GS, 90x123, px',0 + aDrawingVLine db 'Vertical Line, 350 px',0 + aDrawingHLine db 'Horizontal Line, 270 px',0 + aDrawingFLine db 'Free-angled Line, 350 px',0 + aDrawingText1 db 'Fixed-width Text, 34 chars',0 + aDrawingText1m db 'Fixed-width Text(mem), 34 chars',0 + aDrawingText2 db 'Proportional Text, 34 chars',0 + aDrawingText2m db 'Proportional Text(mem), 34 chars',0 + aDrawingNumber db 'Decimal Number, 8 digits',0 + aDrawingPixel db 'Single Pixel',0 + + aTestText db 'This is a 34-charachters test text' + aButtonsText db 'Test Comments Open Save Move >',0 + aCaption db 'Kolibri Graphical Benchmark 0.9',0 + + aLeft db 'Left :',0 + aRight db 'Right :',0 + + aComment1 db 'current test',0 + aComment2 db 'previous test',0 + aCommentT db 'Edit comments',0 +end if +;--------------------------------------------------------------------- +system_dir_Boxlib db '/sys/lib/box_lib.obj',0 +system_dir_ProcLib db '/sys/lib/proc_lib.obj',0 +;--------------------------------------------------------------------- +head_f_i: +if lang eq it_IT + head_f_l db 'Errore Sistema',0 +else + head_f_l db 'System error',0 +end if + +err_message_found_lib1 db 'box_lib.obj - Not found!',0 +err_message_found_lib2 db 'proc_lib.obj - Not found!',0 + +err_message_import1 db 'box_lib.obj - Wrong import!',0 +err_message_import2 db 'proc_lib.obj - Wrong import!',0 +;--------------------------------------------------------------------- +align 4 +l_libs_start: + +library01 l_libs system_dir_Boxlib+9, cur_dir_path, library_path, system_dir_Boxlib, \ +err_message_found_lib1, head_f_l, Box_lib_import, err_message_import1, head_f_i + +library02 l_libs system_dir_ProcLib+9, cur_dir_path, library_path, system_dir_ProcLib, \ +err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i + +end_l_libs: +;--------------------------------------------------------------------- +align 4 +OpenDialog_data: +.type dd 1 ; Save +.procinfo dd procinfo ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_pach dd temp_dir_pach ;+16 +.dir_default_pach dd communication_area_default_pach ;+20 +.start_path dd open_dialog_path ;+24 +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_pach dd fname_buf ;+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 + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_path: +if __nightbuild eq yes + db '/sys/MANAGERS/opendial',0 +else + db '/sys/File Managers/opendial',0 +end if +communication_area_default_pach: + db '/sys/',0 + +Filter: +dd Filter.end - Filter +.1: +db 'MGB',0 +.end: +db 0 + +sign db ?,0 + +start_temp_file_name: db 'results.mgb',0 + +path4 db '/sys/results.mgb',0 +;--------------------------------------------------------------------- +align 4 +params_f73: +; destination +.offset_X_dest dd 0 ; +0 +.offset_Y_dest dd 0 ; +4 +.width_dest dd 90 ; +8 +.height_dest dd 123 ; +12 +; source +.offset_X_src dd 0 ; +16 +.offset_Y_src dd 0 ; +20 +.width_src dd 90 ; +24 +.height_src dd 123 ; +28 +; other +.pointer dd .data; 90*4 ; +32 +.row_size dd 90*4 ; +36 +;--------------------------------------------------------------------- +align 4 +ProcLib_import: +OpenDialog_Init dd aOpenDialog_Init +OpenDialog_Start dd aOpenDialog_Start +;OpenDialog__Version dd aOpenDialog_Version + dd 0,0 +aOpenDialog_Init db 'OpenDialog_init',0 +aOpenDialog_Start db 'OpenDialog_start',0 +;aOpenDialog_Version db 'Version_OpenDialog',0 +;--------------------------------------------------------------------- +align 4 +Box_lib_import: +;init_lib dd a_init +;version_lib dd a_version + + +edit_box_draw dd aEdit_box_draw +edit_box_key dd aEdit_box_key +edit_box_mouse dd aEdit_box_mouse +;version_ed dd aVersion_ed + +;check_box_draw dd aCheck_box_draw +;check_box_mouse dd aCheck_box_mouse +;version_ch dd aVersion_ch + +;option_box_draw dd aOption_box_draw +;option_box_mouse dd aOption_box_mouse +;version_op dd aVersion_op + +;scrollbar_ver_draw dd aScrollbar_ver_draw +;scrollbar_ver_mouse dd aScrollbar_ver_mouse +;scrollbar_hor_draw dd aScrollbar_hor_draw +;scrollbar_hor_mouse dd aScrollbar_hor_mouse +;version_scrollbar dd aVersion_scrollbar + +;dinamic_button_draw dd aDbutton_draw +;dinamic_button_mouse dd aDbutton_mouse +;version_dbutton dd aVersion_dbutton + +;menu_bar_draw dd aMenu_bar_draw +;menu_bar_mouse dd aMenu_bar_mouse +;menu_bar_activate dd aMenu_bar_activate +;version_menu_bar dd aVersion_menu_bar + +;FileBrowser_draw dd aFileBrowser_draw +;FileBrowser_mouse dd aFileBrowser_mouse +;FileBrowser_key dd aFileBrowser_key +;Version_FileBrowser dd aVersion_FileBrowser + +;PathShow_prepare dd sz_PathShow_prepare +;PathShow_draw dd sz_PathShow_draw +;Version_path_show dd szVersion_path_show + dd 0,0 + +;a_init db 'lib_init',0 +;a_version db 'version',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 + +;aCheck_box_draw db 'check_box_draw',0 +;aCheck_box_mouse db 'check_box_mouse',0 +;aVersion_ch db 'version_ch',0 + +;aOption_box_draw db 'option_box_draw',0 +;aOption_box_mouse db 'option_box_mouse',0 +;aVersion_op db 'version_op',0 + +;aScrollbar_ver_draw db 'scrollbar_v_draw',0 +;aScrollbar_ver_mouse db 'scrollbar_v_mouse',0 +;aScrollbar_hor_draw db 'scrollbar_h_draw',0 +;aScrollbar_hor_mouse db 'scrollbar_h_mouse',0 +;aVersion_scrollbar db 'version_scrollbar',0 + +;aDbutton_draw db 'dbutton_draw',0 +;aDbutton_mouse db 'dbutton_mouse',0 +;aVersion_dbutton db 'version_dbutton',0 + +;aMenu_bar_draw db 'menu_bar_draw',0 +;aMenu_bar_mouse db 'menu_bar_mouse',0 +;aMenu_bar_activate db 'menu_bar_activate',0 +;aVersion_menu_bar db 'version_menu_bar',0 + +;aFileBrowser_draw db 'FileBrowser_draw',0 +;aFileBrowser_mouse db 'FileBrowser_mouse',0 +;aFileBrowser_key db 'FileBrowser_key',0 +;aVersion_FileBrowser db 'version_FileBrowser',0 + +;sz_PathShow_prepare db 'PathShow_prepare',0 +;sz_PathShow_draw db 'PathShow_draw',0 +;szVersion_path_show db 'version_PathShow',0 +;--------------------------------------------------------------------- +; for EDITBOX +align 4 +editboxes: +edit1 edit_box 260,12,15,0xffffff,0xbbddff,0xFF00FF,0x7F7F7F,\ + 0x90000000,43,comment_string_1,0,ed_focus,0 +edit2 edit_box 260,12,50,0xffffff,0xbbddff,0xFF00FF,0x7F7F7F,\ + 0x90000000,43,comment_string_2,0,0,0 +editboxes_end: +;--------------------------------------------------------------------- + +IM_END: +align 4 +area_for_f36 rd 1 +dwTestEndTime rd 1 +dwMainPID rd 1 +;----------------------------------------------------------------------------- +text_scren_buffer rd 1 +text_scren_buffer2 rd 1 +;--------------------------------------------------------------------- +textarea: + rb 8 +;--------------------------------------------------------------------- +comment_string_1: + rb 44 +;--------------------------------------------------------------------- +comment_string_2: + rb 44 +;--------------------------------------------------------------------- +mgb_data: + rb 100 +;--------------------------------------------------------------------- +procinfo: + rb 1024 +;--------------------------------------------------------------------- +cur_dir_path: + rb 4096 +;--------------------------------------------------------------------- +library_path: + rb 4096 +;--------------------------------------------------------------------- +temp_dir_pach: + rb 4096 +;--------------------------------------------------------------------- +fname_buf: + rb 4096 +;--------------------------------------------------------------------- +filename_area: + rb 256 +;--------------------------------------------------------------------- +align 4 + rb 4096 +thread_stack2: +;--------------------------------------------------------------------- +align 4 + rb 4096 +thread_stack1: +;--------------------------------------------------------------------- +align 4 + rb 4096 +stacktop: +params_f73.data rb 123*90*4 +I_END: