From 33acd57c5855ecf7657e984d868268ff0e5015ba Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 11 Apr 2026 09:21:42 +0000 Subject: [PATCH] programs/media: Post-SVN tidy (#417) - Move source code from `trunk` into root directory for each program. - Update build files and ASM include paths. Add SPDX license header where appropriate. - Note: Line endings standardised from `CRLF` > `LF`, so best to view diffs with whitespace changes hidden. (Work towards #75, point 3) Reviewed-on: https://git.kolibrios.org/KolibriOS/kolibrios/pulls/417 Reviewed-by: Mikhail Frolov Reviewed-by: Burer Co-authored-by: Andrew Co-committed-by: Andrew --- data/Tupfile.lua | 16 +- programs/build_all.bat | 23 +- programs/media/log_el/{trunk => }/Tupfile.lua | 0 programs/media/log_el/{trunk => }/alu_4b.txt | 0 programs/media/log_el/{trunk => }/and_2.txt | 0 programs/media/log_el/{trunk => }/and_3.txt | 0 .../media/log_el/{trunk => }/build_ru.bat | 2 +- programs/media/log_el/{trunk => }/calc.txt | 0 programs/media/log_el/{trunk => }/cursors.png | Bin .../media/log_el/{trunk => }/cursors_gr.png | Bin programs/media/log_el/{trunk => }/le_libs.inc | 0 programs/media/log_el/{trunk => }/le_pole.inc | 0 .../media/log_el/{trunk => }/le_signal.inc | 0 programs/media/log_el/{trunk => }/log_el.asm | 5234 +++++++++-------- programs/media/log_el/{trunk => }/log_el.ini | 0 programs/media/log_el/{trunk => }/mn_4bit.txt | 0 .../media/log_el/{trunk => }/multipl_2b.txt | 0 programs/media/log_el/{trunk => }/objects.png | Bin programs/media/log_el/{trunk => }/or_2.txt | 0 programs/media/log_el/{trunk => }/or_3.txt | 0 programs/media/log_el/{trunk => }/test1.txt | 0 programs/media/log_el/{trunk => }/test2.txt | 0 programs/media/log_el/{trunk => }/test3.txt | 0 programs/media/log_el/{trunk => }/test4.txt | 0 programs/media/log_el/{trunk => }/test5.txt | 0 .../media/log_el/{trunk => }/tl_sys_16.png | Bin programs/media/log_el/{trunk => }/toolbar.png | Bin .../media/log_el/{trunk => }/triger_dc.txt | 0 .../media/log_el/{trunk => }/triger_rs.txt | 0 .../media/log_el/{trunk => }/triger_web.txt | 0 programs/media/midamp/{trunk => }/Tupfile.lua | 2 +- programs/media/midamp/{trunk => }/bottom.gif | Bin programs/media/midamp/{trunk => }/build.bat | 0 programs/media/midamp/{trunk => }/build.sh | 0 programs/media/midamp/{trunk => }/buttons.gif | Bin programs/media/midamp/{trunk => }/dlg.inc | 0 programs/media/midamp/{trunk => }/draw.inc | 0 programs/media/midamp/{trunk => }/event.inc | 0 .../media/midamp/{trunk => }/gif_lite.inc | 0 programs/media/midamp/{trunk => }/hdr.gif | Bin programs/media/midamp/{trunk => }/midamp.asm | 1014 ++-- programs/media/midamp/{trunk => }/midamp.txt | 0 .../media/midamp/{trunk => }/midilite.inc | 0 .../media/midamp/{trunk => }/playlist.inc | 0 .../media/midamp/{trunk => }/playlist.txt | 0 .../media/midamp/{trunk => }/playnote.txt | 0 programs/media/midamp/{trunk => }/thread.inc | 0 .../media/midiplay/{trunk => }/Tupfile.lua | 2 +- .../media/midiplay/{trunk => }/build_en.bat | 0 .../media/midiplay/{trunk => }/build_ru.bat | 0 .../media/midiplay/{trunk => }/midiplay.asm | 8 +- programs/media/paint/{trunk => }/PAINT.ASM | 668 +-- programs/media/paint/{trunk => }/build.bat | 0 .../media/palitra/{trunk => }/Tupfile.lua | 0 programs/media/palitra/{trunk => }/build.bat | 0 .../media/palitra/{trunk => }/palitra.asm | 2588 ++++---- programs/media/palitra/{trunk => }/panel.raw | Bin .../media/palitra/{trunk => }/params_init.inc | 0 programs/media/palitra/{trunk => }/readme.txt | 0 programs/media/pic4/{trunk => }/Tupfile.lua | 2 +- programs/media/pic4/{trunk => }/build_en.bat | 0 programs/media/pic4/{trunk => }/build_ru.bat | 0 programs/media/pic4/{trunk => }/pic4.asm | 1204 ++-- .../media/startmus/{trunk => }/STARTMUS.ASM | 150 +- .../media/startmus/{trunk => }/Tupfile.lua | 0 programs/media/startmus/{trunk => }/build.bat | 0 .../{trunk => }/Transfiguration.vox | Bin .../voxel_editor/{trunk => }/Tupfile.lua | 0 .../media/voxel_editor/{trunk => }/box.vox | Bin .../voxel_editor/{trunk => }/build_ru.bat | 0 .../voxel_editor/{trunk => }/cursors.png | Bin .../voxel_editor/{trunk => }/cursors_gr.png | Bin .../voxel_editor/{trunk => }/home_19_et.vox | Bin .../media/voxel_editor/{trunk => }/house0.vox | Bin .../media/voxel_editor/{trunk => }/house1.vox | Bin .../media/voxel_editor/{trunk => }/house2.vox | Bin .../voxel_editor/{trunk => }/squirrel.vox | Bin .../media/voxel_editor/{trunk => }/str.inc | 0 .../voxel_editor/{trunk => }/toolbar.png | Bin .../voxel_editor/{trunk => }/uaz3741.vox | Bin .../voxel_editor/utilites/vox_creator.asm | 10 +- .../media/voxel_editor/utilites/vox_mover.asm | 12 +- .../media/voxel_editor/utilites/vox_tgl.asm | 8 +- .../voxel_editor/{trunk => }/vaz2106.vox | Bin .../voxel_editor/{trunk => }/vox_draw.inc | 0 .../voxel_editor/{trunk => }/vox_editor.ini | 0 .../voxel_editor/{trunk => }/vox_rotate.inc | 0 .../voxel_editor/{trunk => }/voxel_editor.asm | 4012 ++++++------- programs/other/t_edit/t_edit.asm | 2 +- programs/other/t_edit_synt/te_syntax.asm | 2 +- 90 files changed, 7508 insertions(+), 7451 deletions(-) rename programs/media/log_el/{trunk => }/Tupfile.lua (100%) rename programs/media/log_el/{trunk => }/alu_4b.txt (100%) rename programs/media/log_el/{trunk => }/and_2.txt (100%) rename programs/media/log_el/{trunk => }/and_3.txt (100%) rename programs/media/log_el/{trunk => }/build_ru.bat (60%) rename programs/media/log_el/{trunk => }/calc.txt (100%) rename programs/media/log_el/{trunk => }/cursors.png (100%) rename programs/media/log_el/{trunk => }/cursors_gr.png (100%) rename programs/media/log_el/{trunk => }/le_libs.inc (100%) rename programs/media/log_el/{trunk => }/le_pole.inc (100%) rename programs/media/log_el/{trunk => }/le_signal.inc (100%) rename programs/media/log_el/{trunk => }/log_el.asm (95%) rename programs/media/log_el/{trunk => }/log_el.ini (100%) rename programs/media/log_el/{trunk => }/mn_4bit.txt (100%) rename programs/media/log_el/{trunk => }/multipl_2b.txt (100%) rename programs/media/log_el/{trunk => }/objects.png (100%) rename programs/media/log_el/{trunk => }/or_2.txt (100%) rename programs/media/log_el/{trunk => }/or_3.txt (100%) rename programs/media/log_el/{trunk => }/test1.txt (100%) rename programs/media/log_el/{trunk => }/test2.txt (100%) rename programs/media/log_el/{trunk => }/test3.txt (100%) rename programs/media/log_el/{trunk => }/test4.txt (100%) rename programs/media/log_el/{trunk => }/test5.txt (100%) rename programs/media/log_el/{trunk => }/tl_sys_16.png (100%) rename programs/media/log_el/{trunk => }/toolbar.png (100%) rename programs/media/log_el/{trunk => }/triger_dc.txt (100%) rename programs/media/log_el/{trunk => }/triger_rs.txt (100%) rename programs/media/log_el/{trunk => }/triger_web.txt (100%) rename programs/media/midamp/{trunk => }/Tupfile.lua (79%) rename programs/media/midamp/{trunk => }/bottom.gif (100%) rename programs/media/midamp/{trunk => }/build.bat (100%) rename programs/media/midamp/{trunk => }/build.sh (100%) rename programs/media/midamp/{trunk => }/buttons.gif (100%) rename programs/media/midamp/{trunk => }/dlg.inc (100%) rename programs/media/midamp/{trunk => }/draw.inc (100%) rename programs/media/midamp/{trunk => }/event.inc (100%) rename programs/media/midamp/{trunk => }/gif_lite.inc (100%) rename programs/media/midamp/{trunk => }/hdr.gif (100%) rename programs/media/midamp/{trunk => }/midamp.asm (93%) rename programs/media/midamp/{trunk => }/midamp.txt (100%) rename programs/media/midamp/{trunk => }/midilite.inc (100%) rename programs/media/midamp/{trunk => }/playlist.inc (100%) rename programs/media/midamp/{trunk => }/playlist.txt (100%) rename programs/media/midamp/{trunk => }/playnote.txt (100%) rename programs/media/midamp/{trunk => }/thread.inc (100%) rename programs/media/midiplay/{trunk => }/Tupfile.lua (79%) rename programs/media/midiplay/{trunk => }/build_en.bat (100%) rename programs/media/midiplay/{trunk => }/build_ru.bat (100%) rename programs/media/midiplay/{trunk => }/midiplay.asm (98%) rename programs/media/paint/{trunk => }/PAINT.ASM (96%) rename programs/media/paint/{trunk => }/build.bat (100%) rename programs/media/palitra/{trunk => }/Tupfile.lua (100%) rename programs/media/palitra/{trunk => }/build.bat (100%) rename programs/media/palitra/{trunk => }/palitra.asm (97%) rename programs/media/palitra/{trunk => }/panel.raw (100%) rename programs/media/palitra/{trunk => }/params_init.inc (100%) rename programs/media/palitra/{trunk => }/readme.txt (100%) rename programs/media/pic4/{trunk => }/Tupfile.lua (79%) rename programs/media/pic4/{trunk => }/build_en.bat (100%) rename programs/media/pic4/{trunk => }/build_ru.bat (100%) rename programs/media/pic4/{trunk => }/pic4.asm (93%) rename programs/media/startmus/{trunk => }/STARTMUS.ASM (95%) rename programs/media/startmus/{trunk => }/Tupfile.lua (100%) rename programs/media/startmus/{trunk => }/build.bat (100%) rename programs/media/voxel_editor/{trunk => }/Transfiguration.vox (100%) rename programs/media/voxel_editor/{trunk => }/Tupfile.lua (100%) rename programs/media/voxel_editor/{trunk => }/box.vox (100%) rename programs/media/voxel_editor/{trunk => }/build_ru.bat (100%) rename programs/media/voxel_editor/{trunk => }/cursors.png (100%) rename programs/media/voxel_editor/{trunk => }/cursors_gr.png (100%) rename programs/media/voxel_editor/{trunk => }/home_19_et.vox (100%) rename programs/media/voxel_editor/{trunk => }/house0.vox (100%) rename programs/media/voxel_editor/{trunk => }/house1.vox (100%) rename programs/media/voxel_editor/{trunk => }/house2.vox (100%) rename programs/media/voxel_editor/{trunk => }/squirrel.vox (100%) rename programs/media/voxel_editor/{trunk => }/str.inc (100%) rename programs/media/voxel_editor/{trunk => }/toolbar.png (100%) rename programs/media/voxel_editor/{trunk => }/uaz3741.vox (100%) rename programs/media/voxel_editor/{trunk => }/vaz2106.vox (100%) rename programs/media/voxel_editor/{trunk => }/vox_draw.inc (100%) rename programs/media/voxel_editor/{trunk => }/vox_editor.ini (100%) rename programs/media/voxel_editor/{trunk => }/vox_rotate.inc (100%) rename programs/media/voxel_editor/{trunk => }/voxel_editor.asm (95%) diff --git a/data/Tupfile.lua b/data/Tupfile.lua index 1b7f7e722..375e836aa 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -155,10 +155,10 @@ extra_files = { {"kolibrios/3D/blocks/models/", "../programs/bcc32/games/blocks/models/*"}, {"kolibrios/3D/md2view/", "common/3d/md2view/*"}, {"kolibrios/3D/md2view/md2_model/", "common/3d/md2view/md2_model/*"}, - {"kolibrios/3D/voxel_editor/VOX_EDITOR.INI", SRC_PROGS .. "/media/voxel_editor/trunk/vox_editor.ini"}, - {"kolibrios/3D/voxel_editor/HOUSE1.VOX", SRC_PROGS .. "/media/voxel_editor/trunk/house1.vox"}, - {"kolibrios/3D/voxel_editor/HOUSE2.VOX", SRC_PROGS .. "/media/voxel_editor/trunk/house2.vox"}, - {"kolibrios/3D/voxel_editor/SQUIRREL.VOX", SRC_PROGS .. "/media/voxel_editor/trunk/squirrel.vox"}, + {"kolibrios/3D/voxel_editor/VOX_EDITOR.INI", SRC_PROGS .. "/media/voxel_editor/vox_editor.ini"}, + {"kolibrios/3D/voxel_editor/HOUSE1.VOX", SRC_PROGS .. "/media/voxel_editor/house1.vox"}, + {"kolibrios/3D/voxel_editor/HOUSE2.VOX", SRC_PROGS .. "/media/voxel_editor/house2.vox"}, + {"kolibrios/3D/voxel_editor/SQUIRREL.VOX", SRC_PROGS .. "/media/voxel_editor/squirrel.vox"}, {"kolibrios/3D/voxel_utilites/VOX_MOVER.INI" , SRC_PROGS .. "/media/voxel_editor/utilites/vox_mover.ini"}, {"kolibrios/3D/FONT8X9.BMP", SRC_PROGS .. "/fs/kfar/trunk/font8x9.bmp"}, {"kolibrios/3D/TOOLB_1.PNG", SRC_PROGS .. "/develop/libraries/TinyGL/asm_fork/examples/toolb_1.png"}, @@ -529,12 +529,12 @@ tup.append_table(img_files, { {"MEDIA/FILLSCR", VAR_PROGS .. "/media/FillScr/fillscr"}, {"MEDIA/KIV", VAR_PROGS .. "/media/kiv/kiv"}, {"MEDIA/LISTPLAY", VAR_PROGS .. "/media/listplay/listplay"}, - {"MEDIA/MIDAMP", VAR_PROGS .. "/media/midamp/trunk/midamp"}, + {"MEDIA/MIDAMP", VAR_PROGS .. "/media/midamp/midamp"}, {"MEDIA/MP3INFO", VAR_PROGS .. "/media/mp3info/mp3info"}, - {"MEDIA/PALITRA", VAR_PROGS .. "/media/palitra/trunk/palitra"}, + {"MEDIA/PALITRA", VAR_PROGS .. "/media/palitra/palitra"}, {"MEDIA/PIANO", VAR_PROGS .. "/media/piano/piano"}, {"MEDIA/PIANO.MAP", VAR_PROGS .. "/media/piano/piano.map"}, - {"MEDIA/STARTMUS", VAR_PROGS .. "/media/startmus/trunk/STARTMUS"}, + {"MEDIA/STARTMUS", VAR_PROGS .. "/media/startmus/STARTMUS"}, {"NETWORK/PING", VAR_PROGS .. "/network/ping/ping"}, {"NETWORK/NETCFG", VAR_PROGS .. "/network/netcfg/netcfg"}, {"NETWORK/NETSTAT", VAR_PROGS .. "/network/netstat/netstat"}, @@ -604,7 +604,7 @@ tup.append_table(extra_files, { {"kolibrios/3D/info3ds/INFO3DS", VAR_PROGS .. "/develop/info3ds/info3ds"}, {"kolibrios/3D/textures1", VAR_PROGS .. "/develop/libraries/TinyGL/asm_fork/examples/textures1"}, {"kolibrios/3D/info3ds/INFO3DS_U", VAR_PROGS .. "/develop/info3ds/info3ds_u"}, - {"kolibrios/3D/voxel_editor/VOXEL_EDITOR", VAR_PROGS .. "/media/voxel_editor/trunk/voxel_editor"}, + {"kolibrios/3D/voxel_editor/VOXEL_EDITOR", VAR_PROGS .. "/media/voxel_editor/voxel_editor"}, {"kolibrios/3D/voxel_utilites/VOX_CREATOR" , VAR_PROGS .. "/media/voxel_editor/utilites/vox_creator"}, {"kolibrios/3D/voxel_utilites/VOX_MOVER" , VAR_PROGS .. "/media/voxel_editor/utilites/vox_mover"}, {"kolibrios/3D/voxel_utilites/VOX_TGL" , VAR_PROGS .. "/media/voxel_editor/utilites/vox_tgl"}, diff --git a/programs/build_all.bat b/programs/build_all.bat index 41767ecc2..85b4f994f 100644 --- a/programs/build_all.bat +++ b/programs/build_all.bat @@ -164,17 +164,16 @@ echo Building media echo * rem media\ac97snd\trunk\ac97snd.asm ac97snd fasm media\animage\animage.asm %BIN%\animage -fasm media\cdp\trunk\cdp.asm %BIN%\cdp -fasm media\gifview\trunk\gifview.asm %BIN%\gifview -fasm media\iconedit\trunk\iconedit.asm %BIN%\iconedit -fasm media\jpegview\trunk\jpegview.asm %BIN%\jpegview -fasm media\midamp\trunk\midamp.asm %BIN%\midamp -fasm media\midiplay\trunk\midiplay.asm %BIN%\midiplay -fasm media\mixer\trunk\mixer.asm %BIN%\mixer - -fasm media\mv\trunk\mv.asm %BIN%\mv -fasm media\pic4\trunk\pic4.asm %BIN%\pic4 -fasm media\sb\trunk\sb.asm %BIN%\sb +rem fasm media\cdp\trunk\cdp.asm %BIN%\cdp +rem fasm media\gifview\trunk\gifview.asm %BIN%\gifview +rem fasm media\iconedit\trunk\iconedit.asm %BIN%\iconedit +rem fasm media\jpegview\trunk\jpegview.asm %BIN%\jpegview +fasm media\midamp\midamp.asm %BIN%\midamp +fasm media\midiplay\midiplay.asm %BIN%\midiplay +rem fasm media\mixer\trunk\mixer.asm %BIN%\mixer +rem fasm media\mv\trunk\mv.asm %BIN%\mv +fasm media\pic4\pic4.asm %BIN%\pic4 +rem fasm media\sb\trunk\sb.asm %BIN%\sb fasm media\scrshoot\scrshoot.asm %BIN%\scrshoot echo * @@ -234,7 +233,7 @@ echo __nightbuild fix yes >> config.inc fasm media\kiv\kiv.asm %BIN%\nightbuild\kiv fasm media\scrshoot\scrshoot.asm %BIN%\nightbuild\scrshoot fasm media\animage\animage.asm %BIN%\nightbuild\animage -fasm media\midamp\trunk\midamp.asm %BIN%\nightbuild\midamp +fasm media\midamp\midamp.asm %BIN%\nightbuild\midamp fasm develop\heed\trunk\heed.asm %BIN%\nightbuild\heed fasm develop\tinypad\trunk\tinypad.asm %BIN%\nightbuild\tinypad fasm system\skincfg\skincfg.asm %BIN%\nightbuild\skincfg diff --git a/programs/media/log_el/trunk/Tupfile.lua b/programs/media/log_el/Tupfile.lua similarity index 100% rename from programs/media/log_el/trunk/Tupfile.lua rename to programs/media/log_el/Tupfile.lua diff --git a/programs/media/log_el/trunk/alu_4b.txt b/programs/media/log_el/alu_4b.txt similarity index 100% rename from programs/media/log_el/trunk/alu_4b.txt rename to programs/media/log_el/alu_4b.txt diff --git a/programs/media/log_el/trunk/and_2.txt b/programs/media/log_el/and_2.txt similarity index 100% rename from programs/media/log_el/trunk/and_2.txt rename to programs/media/log_el/and_2.txt diff --git a/programs/media/log_el/trunk/and_3.txt b/programs/media/log_el/and_3.txt similarity index 100% rename from programs/media/log_el/trunk/and_3.txt rename to programs/media/log_el/and_3.txt diff --git a/programs/media/log_el/trunk/build_ru.bat b/programs/media/log_el/build_ru.bat similarity index 60% rename from programs/media/log_el/trunk/build_ru.bat rename to programs/media/log_el/build_ru.bat index 9a104dba2..d0491280d 100644 --- a/programs/media/log_el/trunk/build_ru.bat +++ b/programs/media/log_el/build_ru.bat @@ -1,5 +1,5 @@ if not exist bin mkdir bin -if not exist bin\font6x9.bmp @copy ..\..\..\fs\kfar\trunk\font6x9.bmp bin\font6x9.bmp +if not exist bin\font6x9.bmp @copy ..\..\fs\kfar\trunk\font6x9.bmp bin\font6x9.bmp @copy *.png bin\*.png @copy *.txt bin\*.txt @fasm.exe -m 16384 log_el.asm bin\log_el.kex diff --git a/programs/media/log_el/trunk/calc.txt b/programs/media/log_el/calc.txt similarity index 100% rename from programs/media/log_el/trunk/calc.txt rename to programs/media/log_el/calc.txt diff --git a/programs/media/log_el/trunk/cursors.png b/programs/media/log_el/cursors.png similarity index 100% rename from programs/media/log_el/trunk/cursors.png rename to programs/media/log_el/cursors.png diff --git a/programs/media/log_el/trunk/cursors_gr.png b/programs/media/log_el/cursors_gr.png similarity index 100% rename from programs/media/log_el/trunk/cursors_gr.png rename to programs/media/log_el/cursors_gr.png diff --git a/programs/media/log_el/trunk/le_libs.inc b/programs/media/log_el/le_libs.inc similarity index 100% rename from programs/media/log_el/trunk/le_libs.inc rename to programs/media/log_el/le_libs.inc diff --git a/programs/media/log_el/trunk/le_pole.inc b/programs/media/log_el/le_pole.inc similarity index 100% rename from programs/media/log_el/trunk/le_pole.inc rename to programs/media/log_el/le_pole.inc diff --git a/programs/media/log_el/trunk/le_signal.inc b/programs/media/log_el/le_signal.inc similarity index 100% rename from programs/media/log_el/trunk/le_signal.inc rename to programs/media/log_el/le_signal.inc diff --git a/programs/media/log_el/trunk/log_el.asm b/programs/media/log_el/log_el.asm similarity index 95% rename from programs/media/log_el/trunk/log_el.asm rename to programs/media/log_el/log_el.asm index 7873ced2b..981e18230 100644 --- a/programs/media/log_el/trunk/log_el.asm +++ b/programs/media/log_el/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/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: diff --git a/programs/media/log_el/trunk/log_el.ini b/programs/media/log_el/log_el.ini similarity index 100% rename from programs/media/log_el/trunk/log_el.ini rename to programs/media/log_el/log_el.ini diff --git a/programs/media/log_el/trunk/mn_4bit.txt b/programs/media/log_el/mn_4bit.txt similarity index 100% rename from programs/media/log_el/trunk/mn_4bit.txt rename to programs/media/log_el/mn_4bit.txt diff --git a/programs/media/log_el/trunk/multipl_2b.txt b/programs/media/log_el/multipl_2b.txt similarity index 100% rename from programs/media/log_el/trunk/multipl_2b.txt rename to programs/media/log_el/multipl_2b.txt diff --git a/programs/media/log_el/trunk/objects.png b/programs/media/log_el/objects.png similarity index 100% rename from programs/media/log_el/trunk/objects.png rename to programs/media/log_el/objects.png diff --git a/programs/media/log_el/trunk/or_2.txt b/programs/media/log_el/or_2.txt similarity index 100% rename from programs/media/log_el/trunk/or_2.txt rename to programs/media/log_el/or_2.txt diff --git a/programs/media/log_el/trunk/or_3.txt b/programs/media/log_el/or_3.txt similarity index 100% rename from programs/media/log_el/trunk/or_3.txt rename to programs/media/log_el/or_3.txt diff --git a/programs/media/log_el/trunk/test1.txt b/programs/media/log_el/test1.txt similarity index 100% rename from programs/media/log_el/trunk/test1.txt rename to programs/media/log_el/test1.txt diff --git a/programs/media/log_el/trunk/test2.txt b/programs/media/log_el/test2.txt similarity index 100% rename from programs/media/log_el/trunk/test2.txt rename to programs/media/log_el/test2.txt diff --git a/programs/media/log_el/trunk/test3.txt b/programs/media/log_el/test3.txt similarity index 100% rename from programs/media/log_el/trunk/test3.txt rename to programs/media/log_el/test3.txt diff --git a/programs/media/log_el/trunk/test4.txt b/programs/media/log_el/test4.txt similarity index 100% rename from programs/media/log_el/trunk/test4.txt rename to programs/media/log_el/test4.txt diff --git a/programs/media/log_el/trunk/test5.txt b/programs/media/log_el/test5.txt similarity index 100% rename from programs/media/log_el/trunk/test5.txt rename to programs/media/log_el/test5.txt diff --git a/programs/media/log_el/trunk/tl_sys_16.png b/programs/media/log_el/tl_sys_16.png similarity index 100% rename from programs/media/log_el/trunk/tl_sys_16.png rename to programs/media/log_el/tl_sys_16.png diff --git a/programs/media/log_el/trunk/toolbar.png b/programs/media/log_el/toolbar.png similarity index 100% rename from programs/media/log_el/trunk/toolbar.png rename to programs/media/log_el/toolbar.png diff --git a/programs/media/log_el/trunk/triger_dc.txt b/programs/media/log_el/triger_dc.txt similarity index 100% rename from programs/media/log_el/trunk/triger_dc.txt rename to programs/media/log_el/triger_dc.txt diff --git a/programs/media/log_el/trunk/triger_rs.txt b/programs/media/log_el/triger_rs.txt similarity index 100% rename from programs/media/log_el/trunk/triger_rs.txt rename to programs/media/log_el/triger_rs.txt diff --git a/programs/media/log_el/trunk/triger_web.txt b/programs/media/log_el/triger_web.txt similarity index 100% rename from programs/media/log_el/trunk/triger_web.txt rename to programs/media/log_el/triger_web.txt diff --git a/programs/media/midamp/trunk/Tupfile.lua b/programs/media/midamp/Tupfile.lua similarity index 79% rename from programs/media/midamp/trunk/Tupfile.lua rename to programs/media/midamp/Tupfile.lua index cef5dd9ed..2339456d5 100644 --- a/programs/media/midamp/trunk/Tupfile.lua +++ b/programs/media/midamp/Tupfile.lua @@ -1,5 +1,5 @@ if tup.getconfig("NO_FASM") ~= "" then return end -HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../../.." or tup.getconfig("HELPERDIR") +HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR") tup.include(HELPERDIR .. "/use_fasm.lua") add_include(tup.getvariantdir()) diff --git a/programs/media/midamp/trunk/bottom.gif b/programs/media/midamp/bottom.gif similarity index 100% rename from programs/media/midamp/trunk/bottom.gif rename to programs/media/midamp/bottom.gif diff --git a/programs/media/midamp/trunk/build.bat b/programs/media/midamp/build.bat similarity index 100% rename from programs/media/midamp/trunk/build.bat rename to programs/media/midamp/build.bat diff --git a/programs/media/midamp/trunk/build.sh b/programs/media/midamp/build.sh similarity index 100% rename from programs/media/midamp/trunk/build.sh rename to programs/media/midamp/build.sh diff --git a/programs/media/midamp/trunk/buttons.gif b/programs/media/midamp/buttons.gif similarity index 100% rename from programs/media/midamp/trunk/buttons.gif rename to programs/media/midamp/buttons.gif diff --git a/programs/media/midamp/trunk/dlg.inc b/programs/media/midamp/dlg.inc similarity index 100% rename from programs/media/midamp/trunk/dlg.inc rename to programs/media/midamp/dlg.inc diff --git a/programs/media/midamp/trunk/draw.inc b/programs/media/midamp/draw.inc similarity index 100% rename from programs/media/midamp/trunk/draw.inc rename to programs/media/midamp/draw.inc diff --git a/programs/media/midamp/trunk/event.inc b/programs/media/midamp/event.inc similarity index 100% rename from programs/media/midamp/trunk/event.inc rename to programs/media/midamp/event.inc diff --git a/programs/media/midamp/trunk/gif_lite.inc b/programs/media/midamp/gif_lite.inc similarity index 100% rename from programs/media/midamp/trunk/gif_lite.inc rename to programs/media/midamp/gif_lite.inc diff --git a/programs/media/midamp/trunk/hdr.gif b/programs/media/midamp/hdr.gif similarity index 100% rename from programs/media/midamp/trunk/hdr.gif rename to programs/media/midamp/hdr.gif diff --git a/programs/media/midamp/trunk/midamp.asm b/programs/media/midamp/midamp.asm similarity index 93% rename from programs/media/midamp/trunk/midamp.asm rename to programs/media/midamp/midamp.asm index 51042acbc..56a580327 100644 --- a/programs/media/midamp/trunk/midamp.asm +++ b/programs/media/midamp/midamp.asm @@ -1,504 +1,510 @@ -; MIDI PLAYER FOR KOLIBRI v1.0 -; Written in pure assembler by Ivushkin Andrey aka Willow -; -; -; Created: December 7, 2004 -; Last changed: December 8, 2020 -; -; COMPILE WITH FASM - -format binary as "" - -PLAYLIST_PATH equ '/HD0/1/PLAYLIST.TXT' -;APP_MEM equ 150*1024 - -IPC_PLAY equ 0xa1 -IPC_PAUS equ 0xa2 -IPC_TRIG equ 0xa3 -IPC_UPDT equ 0xb1 -IPC_NEXT equ 0xb2 - -LISTITEMS equ 40 -WND_BACK equ 0x24263c -PLY equ 63 -WND_HEIGHT equ (PLY+9*LISTITEMS+10)+25 - -BTNS_XY equ 14 shl 16+42 -BTNS_SIZE equ 222 shl 16+17 - -BROWSE_X equ 10 shl 16+8 -BROWSE_Y equ 26 shl 16+8 -FN_XY equ 12 shl 16+15 -BAR_WIDTH equ 251 -BAR_X equ 10 shl 16 -BAR_Y equ 29 shl 16+5 -TOTALTIME_XY equ 124 shl 16+28 -CURTIME_X equ 225 shl 16+40 -CURTIME_Y equ 15 shl 16+11 -CURTIME_XY equ 236 shl 16+15 - -NONCRITICAL_MSG equ 0 -SOUND equ ON;OFF -OUTDUMP equ 0 -OUTLINE equ 8 -FL_SHUFFLE equ 0x01 -FL_REPEAT equ 0x02 -FL_HIDDEN equ 0x04 -FL_MUTE equ 0x08 -FL_REVERSE equ 0x10 -FL_ADD equ 0x20 -FL_PLAY equ 0x40 -FL_LOCK equ 0x80 -FL_BOTTRED equ 0x100 -FL_MULSEL equ 0x8000 - -use32 - org 0 - - db 'MENUET01' - dd 1, START, IM_END - dd I_END ;APP_MEM - dd stacktop ;APP_MEM - 1024 - dd I_PARAM, cur_dir_path - -listsel dd 0 -channel dd 0 -COLOR_ORDER equ MENUETOS -include '../../../config.inc' ;for nightbuild -include '../../../macros.inc' ; decrease code size (optional) -include '../../../KOSfuncs.inc' -include '../../../load_lib.mac' - -@use_library - -include 'lang.inc' -;purge mov -include '../../../debug.inc' -;include 'dlg.inc' -include 'playlist.inc' -include 'gif_lite.inc' -bottom: - file 'bottom.gif' -hdrimg: - file 'hdr.gif' -btns: - file 'buttons.gif' -START: - mcall SF_SYS_MISC, SSF_HEAP_INIT - -load_libraries l_libs_start,end_l_libs - - mov esi,I_PARAM - cmp dword[esi],0 - jz @f - mov edi,filename - mov ecx,256/4 - rep movsd - mov byte [edi-1], 0 -@@: -;OpenDialog initialisation - push dword OpenDialog_data - call [OpenDialog_Init] - - or [flag],FL_BOTTRED;+FL_MUTE - mov ecx,ipcarea - call init_ipc - mcall SF_SET_EVENTS_MASK,1000111b - mov esi,btns - mov edi,btn_raw - call ReadGIF - mov esi,hdrimg - mov edi,hdr_raw - call ReadGIF - mov esi,bottom - mov edi,bottom_raw - call ReadGIF - call respawn - mcall SF_THREAD_INFO,prcinfo,-1 - mov edx,[ebx+30] - mov [parentPID],edx - mov esi,I_PARAM - cmp dword[esi],0 - jnz .yesparam - call PL_load - cmp [list_count],0 - je noparam - mov eax,[pl_ptr] - or word[eax],FL_MULSEL - jmp auto_load - .yesparam: - mov al,byte[esi] - cmp al,'/' - je .defact - mov [param],al - inc esi - .defact: - mov edi,filename;fnbuf - mov ecx,64 - rep movsd - jmp open_file -clearpath: - newline - mov [fname_len],0 - noparam: - mov [param],'W' - or [flag],FL_ADD -;--------------------------------------------------------------------- -;OpenDialog_start: -; copy_path open_dialog_name,path,library_path,0 - mov [OpenDialog_data.type],0 ; Open - or [flag],FL_LOCK - push dword OpenDialog_data - call [OpenDialog_Start] - and [flag],not FL_LOCK -; cmp [OpenDialog_data.status],2 ; OpenDialog does not start -; je .fopen ; some kind of alternative, instead OpenDialog - cmp [OpenDialog_data.status],1 -; je open_file -; jmp still - jne still -;--------------------------------------------------------------------- - -;.fopen: -; call fopen -; get_path: -; cmp byte[filename],0 -; jz still - open_file: - cmp [param],'W' - je .noplay - cmp [param],'H' - jne .nohidd -; or [flag],FL_PLAY - or [flag],FL_HIDDEN - call draw_window - and [flag],not FL_HIDDEN - call Shade -; jmp .noplay - - .nohidd: - or [flag],FL_PLAY - .noplay: - xor eax,eax - mov [play_area],ax - mov [tick_count],eax - mov [delta],eax - mov [curnote],0x80 - mov ecx,64 - mov esi,filename - mov edi,I_PARAM - rep movsd - mcall SF_FILE,file_info - add ebx,workarea - mov [midi_limit],ebx - mov edi,I_PARAM - call find_slash - mov [fn_ptr],edi - mov edi,filename - call str_len - mov [fname_len],eax -midi_kill: - call kill -include 'midilite.inc' - -decode_end: -; dpd edi -; dps <13,10,'Notes='> -; sub edi,[midi_limit] -; shr edi,1 -; dpd edi - dps ' Notes: max=' - movzx eax,[max_note] - dpd eax - dps 'min=' - movzx eax,[min_note] - dpd eax - newline -; sub esi,workarea -; jmp _close - .play: - call kill - call respawn - xor edx,edx - mov esi,[midi_limit] - mov [cur_ptr],esi - mov [cur_tick],edx - mov [delta],edx - .count_ticks: - lodsw - test eax,eax - jz .eof - and eax,0x7f - add edx,eax - jmp .count_ticks - .eof: - mov [tick_count],edx - if OUTDUMP eq 1 - mov esi,[midi_limit] - call out_dump - end if - and [flag],not FL_LOCK - test [flag],FL_PLAY - jz .noplay - call draw_window - mcall SF_SLEEP,100 - mov eax,IPC_PLAY - call ipc_send - .noplay: - test [flag],FL_ADD - jz red - mov esi,filename - mov ecx,[fname_len] - movzx eax,[list_count] - mov [play_num],eax - add_song: - call PL_add - and [flag],not FL_ADD -red: - call draw_window -still: - mov ecx,ipcarea - call init_ipc - mcall SF_WAIT_EVENT -prc_event: - test eax,eax - jz still - .evt: - cmp eax,1 - je red - cmp eax,2 - je key - cmp eax,3 - je button - cmp eax,7 - jne still - movzx eax,byte[ipcarea+16] - cmp eax,IPC_UPDT - jne .noupdt - call draw_bar - jmp still - .noupdt: - cmp eax,IPC_NEXT - jne still - cmp [param],'H' - je _close - xor edx,edx - test [flag],FL_SHUFFLE - jz .noshuf - mcall SF_SYSTEM_GET,SSF_TIME_COUNT - movzx ebx,byte[list_count] - div ebx - mov eax,edx - jmp play_ - .noshuf: - test [flag],FL_REPEAT - jnz decode_end.play - mov eax,[play_num] - inc eax - cmp al,[list_count] - jb bList.next - mov eax,IPC_PAUS - call ipc_send - jmp red - -if OUTDUMP eq 1 -out_dump: - mov ecx,OUTLINE - .next_byte: - lodsd - bswap eax - dph eax - dps ' ' - lodsd - bswap eax - dph eax - dps <13,10> - loop .next_byte - ret -end if - -str_len: -; in: edi-str ptr -; out: eax-str length - push ecx edi - xor eax,eax - mov ecx,256 - repne scasb - jecxz .nofn - sub edi,[esp] - mov eax,edi - .nofn: - pop edi ecx - ret - -;fopen: -; or [flag],FL_LOCK -;; opendialog draw_window, ret_path, ret_path, filename -;ret_path: -; and [flag],not FL_LOCK -; ret - -include 'event.inc' -include "thread.inc" -include "draw.inc" -; Здесь находятся данные программы: - - dd -2 shl 16+4,251,12 shl 16,29 shl 16+5 - dd 21,16 -main_coo: - dd 14 shl 16, 42 shl 16,23 shl 16 - dd 228 shl 16+38 - dd 14 shl 16+10 - dd 236 shl 16+15 -btncoords: - dd 120 shl 16+20, 1 shl 16+15 - dd 149 shl 16+44, 2 shl 16+12 - dd 195 shl 16+26, 2 shl 16+12 - - dd -2 shl 16+4,54,63 shl 16,6 shl 16+4 - dd 6,6 -main_coo2: - dd 169 shl 16, 4 shl 16,9 shl 16 - dd 121 shl 16+40 - dd 3 shl 16+9 - dd 130 shl 16+4 -btncoords2: - dd 48 shl 16+6, 6 - dd 2000 shl 16+44, 2 shl 16+12 - dd 2000 shl 16+26, 2 shl 16+12 -ipcarea rb 20 -ipcarea2 rb 20 - -dots db ':-' -text db 'tone> chnl> + loop .next_byte + ret +end if + +str_len: +; in: edi-str ptr +; out: eax-str length + push ecx edi + xor eax,eax + mov ecx,256 + repne scasb + jecxz .nofn + sub edi,[esp] + mov eax,edi + .nofn: + pop edi ecx + ret + +;fopen: +; or [flag],FL_LOCK +;; opendialog draw_window, ret_path, ret_path, filename +;ret_path: +; and [flag],not FL_LOCK +; ret + +include 'event.inc' +include "thread.inc" +include "draw.inc" +; Здесь находятся данные программы: + + dd -2 shl 16+4,251,12 shl 16,29 shl 16+5 + dd 21,16 +main_coo: + dd 14 shl 16, 42 shl 16,23 shl 16 + dd 228 shl 16+38 + dd 14 shl 16+10 + dd 236 shl 16+15 +btncoords: + dd 120 shl 16+20, 1 shl 16+15 + dd 149 shl 16+44, 2 shl 16+12 + dd 195 shl 16+26, 2 shl 16+12 + + dd -2 shl 16+4,54,63 shl 16,6 shl 16+4 + dd 6,6 +main_coo2: + dd 169 shl 16, 4 shl 16,9 shl 16 + dd 121 shl 16+40 + dd 3 shl 16+9 + dd 130 shl 16+4 +btncoords2: + dd 48 shl 16+6, 6 + dd 2000 shl 16+44, 2 shl 16+12 + dd 2000 shl 16+26, 2 shl 16+12 +ipcarea rb 20 +ipcarea2 rb 20 + +dots db ':-' +text db 'tone> chnl> al (сдвиг на 8 бит вправо) - - dec al ; идентификатор_кнопки--; - jnz .noclose ; если результат предыдущей команды равен нулю, закрываемся - ; иначе - идём на метку noclose - - or eax,-1 ; выход из программы - int 0x40 - - .noclose: - ; если мы сюда попали, значит идентификатор кнопки не был равен нулю... - ; теперь у нас в eax содержится (номер цветной кнопки - 1), - ; т.е или 1, или 2, ... ,или 5 - - ; уменьшим на 1: - dec eax - - ; вот эта вот команда извлекает в eax двойное слово по адресу colors+eax*4 - ; где colors - смещение метки colors, после которой идет последовательность - ; цветов, eax*4 - номер цвета, умноженный на 4, т.к. на один цвет нужно - ; четыре байта. - mov eax,[colors+eax*4] - - ; теперь мы установим цвет, содержащийся в регистре eax как основной: - mov [active_color],eax - - ; ну вот, собственно, и всё, что от нас требовалось ;) - ; вернёмся к началу цикла обработки событий - jmp still - -;****************************************************************************** - - mouse: ; обработчик мыши - mov eax,37 ; сначала получим текущие координаты мыши - mov ebx,1 - int 0x40 - - mov ebx,eax ; преобразуем их - shr eax,16 ; eax=x; - and ebx,0xffff ; ebx=y; - - cmp ebx,22 - jb save_canvas - - sub eax,[workarea.cx] ; x-=[workarea.cx] - cmp eax,0 ; если мышь левее клиентской области, - jle .not_pressed ; ничего не рисуем - cmp eax,[workarea.sx] ; если мышь правее... - jae .not_pressed - - sub ebx,[workarea.cy] - cmp ebx,0 ; ...выше... - jle .not_pressed - cmp ebx,[workarea.sy] ; ...ниже... - jae .not_pressed - - ; какие кнопки нажаты? - mov eax,37 - mov ebx,2 - int 0x40 - - ; если левая кнопка (т.е. eax = 1), те пойдём дальше - cmp eax,1 - je .leftbtn - - .not_pressed: - ; Левая кнопка не нажата, запомним текущие координаты и будем ждать события - mov [mouse_pressed],0 ; мышь не нажата - mov eax,37 ; получим координаты - mov ebx,1 - int 0x40 - mov ebx,eax - shr eax,16 - and ebx,0xffff - mov [old_x],eax ; запомним их - mov [old_y],ebx - jmp still - - .leftbtn: - ; Левая кнопка нажата, надо это записать! - mov [mouse_pressed],1 - - ; Получим координаты курсора мыши (относительно окна) - mcall 37,1 ; получить состояние мыши - - ; Переделаем их так, чтобы они были в разных регистрах, т.е. eax и ebx - mov ebx,eax - shr eax,16 - and ebx,0xffff - - ; Подготовим параметры для функции рисования линии - mov ecx,[old_x] ; для начала загрузим старые координаты - mov edx,[old_y] - mov [old_x],eax ; теперь сохраним текущие в старые - mov [old_y],ebx - shl ecx,16 ; в верхнее слово начальные (текущие) координаты - shl edx,16 - add eax,ecx ; а в нижнее слово конечные, т.е. старые - add ebx,edx - - mov ecx,ebx ; поменяем регистры так, как эту нужно 38 функции - mov ebx,eax - mov eax,38 ; номер функции в eax - mov edx,[active_color] ; в edx цвет - int 0x40 - -;  - попробуйте поставить другие значения (00090001) - mov edi,0x00010001 ; чтобы линия не была слишком тонкой, - add ebx,edi ; нарисуем рядом еще 3! - int 0x40 - add ecx,edi - int 0x40 - sub ebx,edi - int 0x40 - - sub ebx,edi ; ну а чтобы смотрелось совсем круто, - int 0x40 ; дорисуем еще 5! - sub ecx,edi - int 0x40 - sub ecx,edi - int 0x40 - add ebx,edi - int 0x40 - add ebx,edi - int 0x40 - - jmp still - -;****************************************************************************** - -save_canvas: - mov eax,[proc_info.box.width] - add eax,[workarea.cx] - mov ebx,[proc_info.box.height] - add ebx,[workarea.cy] - - jmp still - -;****************************************************************************** - -; ********************************************* -; ******* ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ******* -; ********************************************* - -draw_window: - - mcall 48,3,sc,sizeof.system_colors ; ПОДГРУЖАЕМ СИСТЕМНЫЕ ЦВЕТА - mcall 12, 1 ; начало отрисовки окна - mov edx, [sc.work] - or edx, 0x33000000 - mcall 0, (100 shl 16)+400, (100 shl 16)+300, , , title ; рисуем окно - mcall 12, 1 - - mcall 9,proc_info,-1 ; получим информацию о своем потоке - - mov eax,[proc_info.box.width] ; настроим размер рабочей области - sub eax,20 ; (х размер окна - 20) - mov [workarea.sx],eax - mov eax,[proc_info.box.height] - sub eax,63 ; (у размер - 63) - mov [workarea.sy],eax - - cmp [proc_info.box.height],80 - jb .finish - - mov eax, 8 - mov edx, 1 - ; создаём кнопки выбора цвета: - mov ebx,10*65536+15 ; начальная x координата и размер - mov ecx, 7*65536+15 ; начальная y координата & size - .new_button: - inc edx ; идентификатор++; - mov esi,[btn_colors-8+edx*4] ; цвет кнопки - int 0x40 ; ставим кнопку - add ebx,18*65536 ; следующая кнопка правее на 12 - cmp edx,9 ; сравниваем edx (идентификатор) с 9 - jbe .new_button ; если меньше или равно -> ещё одну кпоку - - mov eax,13 ; чистим "холст" - клиентскую область - mov ebx,[workarea.cx] - mov ecx,[workarea.cy] - shl ebx,16 - shl ecx,16 - add ebx,[workarea.sx] - add ecx,[workarea.sy] - mov edx,0xffffff - mcall 13 - - .finish: - ret - -;****************************************************************************** -; начало области инициализированных данных -; если кто ещё не знает, что значит "инициализированные", то поясняю: -; это те данные, которым присвоено начальное значение - -;data - -title db 'Simple Paint v0.3',0 - - mouse_pressed db 0 ; показывает, нажата ли была мышь в предыдущий момент - -; цвета кнопок -btn_colors: - dd 0xdddddd ; white - dd 0x444444 ; black - dd 0x00dd00 ; green - dd 0x0000dd ; blue - dd 0xdd0000 ; red - dd 0xdd00dd ; magenta - dd 0xdddd00 ; yellow - dd 0x00dddd ; cyan - dd 0x559955 ; warm green - -; цвета кисти (в том же порядке, что и цвета кнопок) -colors: - dd 0xffffff ; белый - dd 0x000000 ; черный - dd 0x00ff00 ; зеленый - dd 0x0000ff ; синий - dd 0xff0000 ; красный - dd 0xff00ff ; пурпурный - dd 0xffff00 ; желтый - dd 0x00ffff ; голубой - dd 0x77bb77 ; теплый зеленый - -;****************************************************************************** -; а вот тут начинается область НЕинициализированных данных, т.е. -; здесь данным значения не присвоены. В отличие от иниц., не увеличивают размер -; файла - -I_END: - - active_color dd ? ; активный цвет - - old_x dd ? ; старые координаты мыши - old_y dd ? - - workarea: ; координаты и размеры клиентской области - .cx dd ? ; c - коодинаты - .cy dd ? - .sx dd ? ; s - размеры - .sy dd ? - - sc system_colors ; системные цвета - proc_info process_information ; информация о процессе - - restflag dd ? - canvas rb 800*600*3 - -E_END: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +;********************************* +;* * +;* PAINT 0.02 для MenuetOS * +;* * +;* Компилировать FASM'ом * +;* * +;********************************* + +;****************************************************************************** +; Эту программу не нужно серьезно рассматривать - это всего лишь пример, +; в котором показано, как работать с некоторыми системными функциями МеОС, +; но никак не нормальный графический редактор. Код программы ОЧЕНЬ простой, +; и она предназначена для тех, кто только начинает изучать ассемблер, +; поэтому я стремился сделать его как можно более понятным. +; Тем не менее, код довольно неплохо оптимизирован, хотя это немного +; может затруднить его понимание. Я постарался тщательно прокомментировать +; сложные места. Кстати, идея программы принадлежит не мне, а Sniper'у, для +; которого вобщем-то все и писалось. +; Удачи в изучении асма! +; Иван Поддубный, ivan-yar@bk.ru +;****************************************************************************** + +; Подключаем необходимые макросы +include '../../macros.inc' + +;****************************************************************************** + +; НАЧАЛО ПРОГРАММЫ +use32 + org 0x0 + db 'MENUET01' ; 8 byte id + dd 0x01 ; title version + dd START ; start of code + dd I_END ; size of image + dd E_END ; memory for app + dd E_END ; esp + dd 0x0,0x0 ; I_Param , I_Icon + +; ОБЛАСТЬ КОДА +START: + mov eax,40 ; сообщим системе, какие события будем обрабатывать + mov ebx,0100101b ; маска событий - перерисовка (1) + кнопка (3) + мышь (6 + int 0x40 ; эта команда вызывает системную функцию + + mov [workarea.cx],5 ; координаты рабочей (клиентской) области + mov [workarea.cy],30 ; для рисования + +red: + call draw_window ; вызываем процедуру отрисовки окна + +still: ; ГЛАВНЫЙ ЦИКЛ ПРОГРАММЫ - ЦИКЛ ОБРАБОТКИ СООБЩЕНИЙ + + mov eax,10 ; функция 10 - ждать события; программа останавливается на + int 0x40 ; следующая команда не будет выполнена до тех пор, пока + ; не произойдёт событие + + ; теперь регистр eax содержит номер события + ; поочередно сравним его со всеми возможными значениями, чтобы вызвать + ; нужный обработчик + + cmp eax,1 ; перерисовать окно ? + je red ; если регистр eax равен единице, то переходим на метку red + cmp eax,3 ; нажата кнопка ? + je button + cmp eax,6 ; мышь? + je mouse + + jmp still ; если произошло событие, которое мы не обрабатываем, + ; просто возвращаемся к началу цикла, хотя такого быть + ; не должно! Т.е. если эту команду отсюда убрать, то + ; ничего страшного не случится. + +;****************************************************************************** + + button: ; обработчик нажатия кнопки в окне программы + mov eax,17 ; функция N17 - получить идентификатор нажатой кнопки + int 0x40 + + ; теперь в регистре ah содержится идентификатор. + + shr eax,8 ; ah -> al (сдвиг на 8 бит вправо) + + dec al ; идентификатор_кнопки--; + jnz .noclose ; если результат предыдущей команды равен нулю, закрываемся + ; иначе - идём на метку noclose + + or eax,-1 ; выход из программы + int 0x40 + + .noclose: + ; если мы сюда попали, значит идентификатор кнопки не был равен нулю... + ; теперь у нас в eax содержится (номер цветной кнопки - 1), + ; т.е или 1, или 2, ... ,или 5 + + ; уменьшим на 1: + dec eax + + ; вот эта вот команда извлекает в eax двойное слово по адресу colors+eax*4 + ; где colors - смещение метки colors, после которой идет последовательность + ; цветов, eax*4 - номер цвета, умноженный на 4, т.к. на один цвет нужно + ; четыре байта. + mov eax,[colors+eax*4] + + ; теперь мы установим цвет, содержащийся в регистре eax как основной: + mov [active_color],eax + + ; ну вот, собственно, и всё, что от нас требовалось ;) + ; вернёмся к началу цикла обработки событий + jmp still + +;****************************************************************************** + + mouse: ; обработчик мыши + mov eax,37 ; сначала получим текущие координаты мыши + mov ebx,1 + int 0x40 + + mov ebx,eax ; преобразуем их + shr eax,16 ; eax=x; + and ebx,0xffff ; ebx=y; + + cmp ebx,22 + jb save_canvas + + sub eax,[workarea.cx] ; x-=[workarea.cx] + cmp eax,0 ; если мышь левее клиентской области, + jle .not_pressed ; ничего не рисуем + cmp eax,[workarea.sx] ; если мышь правее... + jae .not_pressed + + sub ebx,[workarea.cy] + cmp ebx,0 ; ...выше... + jle .not_pressed + cmp ebx,[workarea.sy] ; ...ниже... + jae .not_pressed + + ; какие кнопки нажаты? + mov eax,37 + mov ebx,2 + int 0x40 + + ; если левая кнопка (т.е. eax = 1), те пойдём дальше + cmp eax,1 + je .leftbtn + + .not_pressed: + ; Левая кнопка не нажата, запомним текущие координаты и будем ждать события + mov [mouse_pressed],0 ; мышь не нажата + mov eax,37 ; получим координаты + mov ebx,1 + int 0x40 + mov ebx,eax + shr eax,16 + and ebx,0xffff + mov [old_x],eax ; запомним их + mov [old_y],ebx + jmp still + + .leftbtn: + ; Левая кнопка нажата, надо это записать! + mov [mouse_pressed],1 + + ; Получим координаты курсора мыши (относительно окна) + mcall 37,1 ; получить состояние мыши + + ; Переделаем их так, чтобы они были в разных регистрах, т.е. eax и ebx + mov ebx,eax + shr eax,16 + and ebx,0xffff + + ; Подготовим параметры для функции рисования линии + mov ecx,[old_x] ; для начала загрузим старые координаты + mov edx,[old_y] + mov [old_x],eax ; теперь сохраним текущие в старые + mov [old_y],ebx + shl ecx,16 ; в верхнее слово начальные (текущие) координаты + shl edx,16 + add eax,ecx ; а в нижнее слово конечные, т.е. старые + add ebx,edx + + mov ecx,ebx ; поменяем регистры так, как эту нужно 38 функции + mov ebx,eax + mov eax,38 ; номер функции в eax + mov edx,[active_color] ; в edx цвет + int 0x40 + +;  - попробуйте поставить другие значения (00090001) + mov edi,0x00010001 ; чтобы линия не была слишком тонкой, + add ebx,edi ; нарисуем рядом еще 3! + int 0x40 + add ecx,edi + int 0x40 + sub ebx,edi + int 0x40 + + sub ebx,edi ; ну а чтобы смотрелось совсем круто, + int 0x40 ; дорисуем еще 5! + sub ecx,edi + int 0x40 + sub ecx,edi + int 0x40 + add ebx,edi + int 0x40 + add ebx,edi + int 0x40 + + jmp still + +;****************************************************************************** + +save_canvas: + mov eax,[proc_info.box.width] + add eax,[workarea.cx] + mov ebx,[proc_info.box.height] + add ebx,[workarea.cy] + + jmp still + +;****************************************************************************** + +; ********************************************* +; ******* ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ******* +; ********************************************* + +draw_window: + + mcall 48,3,sc,sizeof.system_colors ; ПОДГРУЖАЕМ СИСТЕМНЫЕ ЦВЕТА + mcall 12, 1 ; начало отрисовки окна + mov edx, [sc.work] + or edx, 0x33000000 + mcall 0, (100 shl 16)+400, (100 shl 16)+300, , , title ; рисуем окно + mcall 12, 1 + + mcall 9,proc_info,-1 ; получим информацию о своем потоке + + mov eax,[proc_info.box.width] ; настроим размер рабочей области + sub eax,20 ; (х размер окна - 20) + mov [workarea.sx],eax + mov eax,[proc_info.box.height] + sub eax,63 ; (у размер - 63) + mov [workarea.sy],eax + + cmp [proc_info.box.height],80 + jb .finish + + mov eax, 8 + mov edx, 1 + ; создаём кнопки выбора цвета: + mov ebx,10*65536+15 ; начальная x координата и размер + mov ecx, 7*65536+15 ; начальная y координата & size + .new_button: + inc edx ; идентификатор++; + mov esi,[btn_colors-8+edx*4] ; цвет кнопки + int 0x40 ; ставим кнопку + add ebx,18*65536 ; следующая кнопка правее на 12 + cmp edx,9 ; сравниваем edx (идентификатор) с 9 + jbe .new_button ; если меньше или равно -> ещё одну кпоку + + mov eax,13 ; чистим "холст" - клиентскую область + mov ebx,[workarea.cx] + mov ecx,[workarea.cy] + shl ebx,16 + shl ecx,16 + add ebx,[workarea.sx] + add ecx,[workarea.sy] + mov edx,0xffffff + mcall 13 + + .finish: + ret + +;****************************************************************************** +; начало области инициализированных данных +; если кто ещё не знает, что значит "инициализированные", то поясняю: +; это те данные, которым присвоено начальное значение + +;data + +title db 'Simple Paint v0.3',0 + + mouse_pressed db 0 ; показывает, нажата ли была мышь в предыдущий момент + +; цвета кнопок +btn_colors: + dd 0xdddddd ; white + dd 0x444444 ; black + dd 0x00dd00 ; green + dd 0x0000dd ; blue + dd 0xdd0000 ; red + dd 0xdd00dd ; magenta + dd 0xdddd00 ; yellow + dd 0x00dddd ; cyan + dd 0x559955 ; warm green + +; цвета кисти (в том же порядке, что и цвета кнопок) +colors: + dd 0xffffff ; белый + dd 0x000000 ; черный + dd 0x00ff00 ; зеленый + dd 0x0000ff ; синий + dd 0xff0000 ; красный + dd 0xff00ff ; пурпурный + dd 0xffff00 ; желтый + dd 0x00ffff ; голубой + dd 0x77bb77 ; теплый зеленый + +;****************************************************************************** +; а вот тут начинается область НЕинициализированных данных, т.е. +; здесь данным значения не присвоены. В отличие от иниц., не увеличивают размер +; файла + +I_END: + + active_color dd ? ; активный цвет + + old_x dd ? ; старые координаты мыши + old_y dd ? + + workarea: ; координаты и размеры клиентской области + .cx dd ? ; c - коодинаты + .cy dd ? + .sx dd ? ; s - размеры + .sy dd ? + + sc system_colors ; системные цвета + proc_info process_information ; информация о процессе + + restflag dd ? + canvas rb 800*600*3 + +E_END: diff --git a/programs/media/paint/trunk/build.bat b/programs/media/paint/build.bat similarity index 100% rename from programs/media/paint/trunk/build.bat rename to programs/media/paint/build.bat diff --git a/programs/media/palitra/trunk/Tupfile.lua b/programs/media/palitra/Tupfile.lua similarity index 100% rename from programs/media/palitra/trunk/Tupfile.lua rename to programs/media/palitra/Tupfile.lua diff --git a/programs/media/palitra/trunk/build.bat b/programs/media/palitra/build.bat similarity index 100% rename from programs/media/palitra/trunk/build.bat rename to programs/media/palitra/build.bat diff --git a/programs/media/palitra/trunk/palitra.asm b/programs/media/palitra/palitra.asm similarity index 97% rename from programs/media/palitra/trunk/palitra.asm rename to programs/media/palitra/palitra.asm index a951ea686..9cc140882 100644 --- a/programs/media/palitra/trunk/palitra.asm +++ b/programs/media/palitra/palitra.asm @@ -1,1291 +1,1297 @@ -;#___________________________________________________________________________________________________ -;****************************************************************************************************| -; Program Palitra (c) Sergei Steshin (Akyltist) | -;----------------------------------------------------------------------------------------------------| -;; Charset:DOS-866 Font:Courier New Size:9pt | -;..................................................................................................... -;; compiler: FASM 1.69.31 | -;; version: 0.3.0 | -;; last update: 08/11/2012 | -;; e-mail: dr.steshin@gmail.com | -;..................................................................................................... -;; History: | -;; 0.1.0 - Первая версия программы. | -;; 0.2.0 - Исправлено попадание в сетку, берется ближайший по диагонали пиксель. | -;; - Добавлены ползунки, для регулирования rgb составляющих цвета и вывод этих составляющих. | -;; - Убран вывод цвета в бинарном виде (пока за не надобностью и не актуальностью). | -;; - Мелкая косметика. | -;; 0.3.0 - Добавлено переключение видов цветовых схем (кнопка NEXT) | -;; - Улучшены ползунки, производится обработка нажатия рядом с ползунком. | -;; - Число сеток в цветовой схеме уменьшено с 6 до 4 (кратность 256, иначе дублирование цвета).| -;; - Мелкая косметика. | -;; 0.4.0 - Добавлено переключение между двумя цветами | -;; - Добавлен ползунок регулирования прозрачности (без визуализации). | -;; - Добавлено выравнивание значений rgba по центру, в зависимости от длинны. | -;; - Косметические правки. | -;; - Небольшая оптимизация. | -;; 0.5.0 - Добавлена кнопка смены фона рабочего стола (от Leency). | -;; - Добавлено изменение фона рабочего стола градиентной заливкой. | -;; - Косметические правки. | -;; - Небольшая деоптимизация. | -;; 0.6.0 - Добавлена возможность запуска с параметрами | -;; - Добавлен режим H (hidden) производит замену фона рабочего стола градиентной заливкой. | -;; - Большая деоптимизация. | -;; 0.7.0 - Добавлена пипетка - выбор на среднюю кнопку мыши | -;; 0.7.5 - Нажатие правой клавишей мыши на ячейку с цветом устанавливает не основой, а дополн. цвет | -;; - Уменьшено мерцание при работе пипетки | -;; 0.7.6 - Добавлен режим B, который производит замену фона рабочего стола шумной заливкой (e-andrew)| -;..................................................................................................... -;; 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 Sergei Steshin ''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,START,I_END,I_MEM,stacktop,params,sys_path - - include '../../../macros.inc' - include '../../../proc32.inc' - include '../../../KOSfuncs.inc' - include '../../../dll.inc' - - WIN_W equ 295 ; ширина окна - WIN_H equ 195 ; высота окна - WIN_X equ 250 ; координата х окна - WIN_Y equ 190 ; координата у окна - -panel: - file "panel.raw" - -START: - mcall SF_SYS_MISC,SSF_HEAP_INIT ; инициализация кучи - stdcall dll.Load, @IMPORT - or eax,eax - jnz bexit - mcall SF_SET_EVENTS_MASK,0x27 ; устанавливаем маску событий - include 'params_init.inc' ; обработка параметров командной строки - -;#___________________________________________________________________________________________________ -;****************************************************************************************************| -; ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ - ОБРАБОТКА СОБЫТИЙ | -;----------------------------------------------------------------------------------------------------/ -red: - call draw_main ; вызываем перерисовку окна приложения -still: - mcall SF_WAIT_EVENT ; функция 10 - ждать события - cmp eax,1 ; перерисовать окно ? - je red ; если да - на метку red - cmp eax,2 ; нажата клавиша ? - je key ; если да - на key - cmp eax,3 ; нажата кнопка ? - je button ; если да - на button - cmp eax,6 ; событие от мыши вне окна - je mouse ; если да - на button - jmp still ; если другое событие - в начало цикла -;end_still - -key: ; нажата клавиша на клавиатуре - mcall SF_GET_KEY ; функция 2 - считать код символа (в ah) (тут в принципе не нужна) - jmp still ; вернуться к началу цикла -;end_key - -mouse: - cmp [renmode],2 - jne left - call cyrcle_draw - jmp center - left: - mcall SF_MOUSE_GET,SSF_BUTTON - cmp al,1b - jne right - mov [mouse_f],1 - jmp still - right: - cmp al,10b - jne still - mov [mouse_f],2 - jmp still - center: - mcall SF_MOUSE_GET,SSF_BUTTON - cmp al,100b - jne still - mov [mouse_f],3 - mov [color],edx - call draw_result - jmp still ; вернуться к началу цикла -;end_mouse - -button: - mcall SF_GET_BUTTON ; 17 - получить идентификатор нажатой кнопки - cmp ah, 1 ; если нажата кнопка с номером 1, - jz bexit ; выходим - ;обработка кнопки Next - cmp ah, 12 ; если нажата кнопка NEXT - jne next_bg ; выходим - inc [pnext] ; увеличиваем при нажатии номер палитры - mov [renmode],0 ; включаем цветовые схемы - mov eax,[pnext] ; заносим значение в еах - cmp al,6 ; сравниваем с заявленным количеством палитр - jne next_redraw ; если не больше максимума то на вызов отрисовки - xor eax,eax ; иначе зануляем палитру на default - mov [pnext],eax ; и запоминаем что сбросили палитру на default - next_redraw: - call draw_palitra ; РИСУЕМ ПАЛИТРУ - jmp still ; Уходим на ожидание другого события - next_bg: - cmp ah, 14 ; Кнопка BACKGROUND - jne next_bg2 ; если не нажата то выходим - call set_background ; иначе устанавливаем фон - jmp still ; и на ожидание события - next_bg2: - cmp ah, 16 ; Кнопка BACKGROUND - jne circle_bg ; если не нажата то выходим - call set_background2 ; иначе устанавливаем фон - jmp still ; и на ожидание события - circle_bg: - cmp ah, 15 ; Кнопка Круговая палитра - jne next_end ; если не нажата то выходим - mov [renmode],2 ; включаем отрисовку круговой палитры - call draw_palitra ; РИСУЕМ ПАЛИТРУ - jmp still ; и на ожидание события - next_end: - cmp ah,13 ; COLOR SWAP - jne color_swap_end - push [color2] - push [color] - pop [color2] - pop [color] - call draw_result - jmp still ; И уходим на ожидание другого события - color_swap_end: - cmp ah, 7 ; Проверяем нажата кнопка с ID=7 - jne color_button ; Если не нажата, то идём дальше - call mouse_get ; Иначе включаем обработчик мыши, чтобы считать значение цвета с палитры - jmp still ; И уходим на ожидание другого события - color_button: ; РАСЧЁТ координат для ползунков RGBA - push eax ; запоминаем еах - call mouse_local ; получаем локальные координаты - mov ebx,137 ; нижняя граница ползунка по У - mov ecx,[mouse_y] ; занисим в есх значение курсора по У - sub ebx,ecx ; находим разность (т.е. куда смещается ползунок) - mov ecx,3 ; заносим в есх цифру 3 (256/3=85, где 85-высота ползунков) - imul ecx,ebx ; находим истинный параметр цвета с учётом масштаба ползунка---+ - pop eax ; восстанавливаем еах : - ;red_button: ; Красный Трекбар : - cmp ah, 8 ; ID=8 : - jne green_button ; если нет, то проверяем зелёный трекбар : - mov [cred],cl ; иначе присваиваем значение, красному цвету спектра <------+ - call set_spectr ; устанавливаем спектр - jmp still ; Уходим на ожидание другого события - green_button: - cmp ah, 9 - jne blue_button - mov [cgreen],cl - call set_spectr - jmp still ; Уходим на ожидание другого события - blue_button: - cmp ah, 10 - jne alpha_button - mov [cblue],cl - call set_spectr - jmp still ; Уходим на ожидание другого события - alpha_button: - cmp ah, 11 - jne still - mov [calpha],cl - call set_spectr - jmp still ; Уходим на ожидание другого события - bexit: - mcall SF_TERMINATE_PROCESS ; иначе конец программы -;end_button - -;#___________________________________________________________________________________________________ -;****************************************************************************************************| -; ГЛАВНЫЙ МОДУЛЬ ОТРИСОВКИ ОКНА И ЭЛЕМЕНТОВ ПРИЛОЖЕНИЯ | -;----------------------------------------------------------------------------------------------------/ -draw_main: - ; функция 12: означает, что будет рисоваться окно - mcall SF_REDRAW,SSF_BEGIN_DRAW - - ; Функция 48 - стили отображения окон - mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors - - ; Функция 48 - стили отображения окон - mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT - mov ecx,eax ; Запоминаем высоту скина - - mov edi,[runmode] - cmp edi,2 - jne no_hiddenmode - mov edi,hidden - jmp set_title - no_hiddenmode: - cmp edi,3 - jne no_dialogmode - mov edi,hidden - jmp set_title - no_dialogmode: - mov edi,title ; Заголовок окна - set_title: - - xor eax,eax ; Очищаем eax (mov eax,0) (Функция 0) - mov ebx,WIN_X shl 16+WIN_W ; [координата по оси x]*65536 + [размер по оси x] - add ecx,WIN_Y shl 16+WIN_H ; Высота скина + [координата по y]*65536 + [размер по y] (168 для версии 0.2) - mov edx,[sc.work] ; Видимо стиль окна по дефолту - or edx,0x34000000 ; Или окно со скином фиксированных размеров - - int 0x40 ; Прерывание - - - call draw_palitra ; РИСУЕМ ПАЛИТРУ - call draw_result ; РИСУЕМ РЕЗУЛЬТАТ - - ; Функция 8 - определить/удалить кнопку - mcall SF_DEFINE_BUTTON, (110 shl 16)+147, (9 shl 16)+147, 0x60000007 - - inc edx - mcall , (13 shl 16)+12, (51 shl 16)+85 ; Рисуем невидимую кнопку под слайдером red - add ebx,23 shl 16 ; Добавляем - inc edx ; ID = 9 - int 0x40 ; Рисуем невидимую кнопку под слайдером green - add ebx,23 shl 16 ; Добавляем - inc edx ; ID = 10 - int 0x40 ; Рисуем невидимую кнопку под слайдером blue - add ebx,23 shl 16 ; Добавляем - inc edx ; ID = 11 - int 0x40 ; Рисуем невидимую кнопку под слайдером alpha - - ; Функция 8 - определить/удалить кнопку (СМЕНА ЦВЕТА) - mcall , (11 shl 16)+20, (12 shl 16)+20, 0x6000000D - - call draw_bottom_panel - call draw_left_panel - - ; функция 12: означает, что будет рисоваться окно - mcall SF_REDRAW,SSF_END_DRAW - ret - -;#___________________________________________________________________________________________________ -;****************************************************************************************************| -; БЛОК ВСПОМОГАТЕЛЬНЫХ ПРОЦЕДУР И ФУНКЦИЙ ПРИЛОЖЕНИЯ | -;----------------------------------------------------------------------------------------------------/ - - - ;------------------------------------------------------------------------------------------------+ - draw_left_panel: ; Отрисовка боковой панели - ;................................................................................................. - ; button_next_colorsheme - mcall SF_DEFINE_BUTTON, (266 shl 16)+16, (9 shl 16)+16, 0x6000000C, [sc.work_button] - ; circle diagram - add ecx,19 shl 16 ; move rect - mov edx,0x6000000F ; ID = 15 - int 0x40 ; call - - mcall SF_PUT_IMAGE, panel, (16 shl 16)+149, (266 shl 16)+9 - - ;mov eax,13 ; draw rect - ;mov ebx,266 shl 16+16 ; [x] + [size] - ;mov ecx,9 shl 16+16 ; [y] + [size] - ;mov edx,0x666666 ; RGB - ;push esi ; backup esi - ;mov esi,8 ; counter=8 - ;draw_lpanel: ; loop label - ; int 0x40 ; call draw black rect - ; add ecx,19 shl 16 ; move rect - ; dec esi ; decrement counter - ; cmp esi,0 ; if counter!=zero - ; jne draw_lpanel ; then goto label - ; mov esi,8 ; else counter=8 - ; mov ebx,267 shl 16+14 ; [x] + [size] - ; mov ecx,10 shl 16+14 ; [y] + [size] - ; mov edx,0xF3F3F3 ; RGB - ;draw_lpanel2: ; 2 loop label - ; int 0x40 ; call draw white rect - ; add ecx,19 shl 16 ; move rect - ; dec esi ; decrement counter - ; cmp esi,0 ; if counter!=0 - ; jne draw_lpanel2 ; then goto label2 - ;pop esi ; restore esi - ; draw_left_arrow for button_next_colorsheme - ;mov eax,4 ; Write string - ;mov ebx,272 shl 16+13 ; [x] + [y] - ;mov ecx,0x0 ; RGB - ;mov edx,larrow ; string pointer - ;mov esi,1 ; count symbol - ;int 0x40 ; call - ;mov eax,38 ; draw line - ;mov ebx,270 shl 16+272 ; [start x] + [end x] - ;mov ecx,16 shl 16+16 ; [start y] + [end y] - ;mov edx,0x0 ; RGB - ;int 0x40 ; call - ret ; return - ;................................................................................................. - - - ;------------------------------------------------------------------------------------------------+ - draw_bottom_panel: ; Отрисовка нижней панели - ;................................................................................................. - mcall SF_DEFINE_BUTTON, (92 shl 16)+90, (169 shl 16)+16, 14, [sc.work_button] - - add ebx, 100 shl 16 - add edx, 2 - int 0x40 - - ; Write string - mov ecx,[sc.work_text] ; RGB - or ecx, 1 shl 31 - mcall SF_DRAW_TEXT, (113 - 104) shl 16+174, ,bground - - mov ecx, [sc.work_button_text] - or ecx, 1 shl 31 - - add ebx, 106 shl 16 - mov edx, bground1 - int 0x40 - - add ebx, 107 shl 16 - mov edx, bground2 - int 0x40 - - mcall SF_DRAW_LINE, 4 shl 16+282, 163 shl 16+163, 0x00666666 - ret ; return - ;................................................................................................. - -mouse_global: - ;................................................................................................. - ; Получаем координаты мыши - ;................................................................................................. - mcall SF_MOUSE_GET,SSF_SCREEN_POSITION - ; eax = x*65536 + y, (x,y)=координаты курсора мыши - mov ecx,eax ; - shr ecx,16 ; ecx = x+1 - movzx edx,ax ; edx = y+1 - dec ecx ; ecx = x - dec edx ; edx = y - mov [mouse_x],ecx ; mouse_x = x - mov [mouse_y],edx ; mouse_y = y - ret ; Возвращаем управление -;end_mouse_global - -mouse_local: - ;................................................................................................. - ; Получаем координаты мыши относительно окна - ;................................................................................................. - mcall SF_MOUSE_GET,SSF_WINDOW_POSITION - ; eax = x*65536 + y, (x,y)=координаты курсора мыши - mov ecx,eax ; - shr ecx,16 ; ecx = x+1 - movzx edx,ax ; edx = y+1 - dec ecx ; ecx = x - dec edx ; edx = y - mov [mouse_x],ecx ; mouse_x = x - mov [mouse_y],edx ; mouse_y = y - ret ; Возвращаем управление -;end_mouse_local - -set_background: - ;................................................................................................. - ; Устанавливает фон рабочего стола - ;................................................................................................. - ; Функция 15 - работа с фоновой графикой - ; Подфункция 4 - установить режим отрисовки фона. - ; Режим отрисовки - замостить (1), растянуть (2) - mcall SF_BACKGROUND_SET,SSF_MODE_BG,2 - - ; Функция 15 - работа с фоновой графикой - ; Подфункция 1 - установить размер фонового изображения. - mcall SF_BACKGROUND_SET,SSF_SIZE_BG,2,2 - - mov eax,[color] - mov [cm+0],al - mov [cm+9],al - shr eax,8 - mov [cm+1],al - mov [cm+10],al - shr eax,8 - mov [cm+2],al - mov [cm+11],al - - mov eax,[color2] - mov [cm+3],al - mov [cm+6],al - shr eax,8 - mov [cm+4],al - mov [cm+7],al - shr eax,8 - mov [cm+5],al - mov [cm+8],al - - ; Функция 15 - работа с фоновой графикой - ; Подфункция 5 - поместить блок пикселей на фон. - ; - Указатель на данные в формате BBGGRRBBGGRR - ; - Cмещение в данных фонового изображения - ; - Размер данных в байтах = 3 * число пикселей - mcall SF_BACKGROUND_SET,SSF_IMAGE_BG,cm,0,3*4 - - ; Функция 15 - работа с фоновой графикой - ; Подфункция 3 - перерисовать фон. - mcall SF_BACKGROUND_SET,SSF_REDRAW_BG - - stdcall save_eskin_ini, 'H ' - - ret -;end_set_background - -desktop_get: - ;................................................................................................. - ; Определяем ширину экрана - ;................................................................................................. - ; Определяем ширину экрана (eax = [xsize]*65536 + [ysize]) - mcall SF_GET_SCREEN_SIZE ; xsize = размер по горизонтали - 1 - mov ebx,eax ; - shr ebx,16 ; ebx = xsize-1 - movzx edx,ax ; edx = ysize-1 (лишний код) - inc ebx ; ebx = xsize - inc edx ; edx = ysize (лишний код) - mov [desctop_w],ebx - mov [desctop_h],edx - ret -;end_desktop_get - -mouse_get: - mov esi,2 ; КОСТЫЛЬ: флаг для избежания зацикливания - call mouse_global - call desktop_get - re_mouse_loop: ; КОСТЫЛЬ: метка для возврата если попали в сетку - mov ebx,[desctop_w] - imul ebx,[mouse_y] ; ebx = y*xsize - add ebx,[mouse_x] ; ebx = y*xsize+x - - ;................................................................................................. - ; Берем цвет с палитры в переменную - ;................................................................................................. - ;mov ebx,ecx ;; ebx = y*xsize+x (лишний код) - mcall SF_GET_PIXEL ; Получаем цвет в eax - cmp eax,[sc.work] ; Сравниваем с фоном приложения - je mouse_err ; Если это он - то ничего не делаем - cmp eax,0x222222 ; Сравниваем с цветом сетки - je mouse_err ; Если это он - то ничего не делаем - jmp mouse_set ; КОСТЫЛЬ: прыгаем чтобы не брать цвет сетки - mouse_err: ; КОСТЫЛЬ: если попали в сетку или фон - inc [mouse_y] ; КОСТЫЛЬ: смещаем по диагонали сначала по х - inc [mouse_x] ; КОСТЫЛЬ: смещаем по диагонали потом по у - dec esi ; КОСТЫЛЬ: Уменьшаем флаг - cmp esi,0 ; КОСТЫЛЬ: Сравниваем с нулем - jz mouse_exit ; КОСТЫЛЬ: Если ноль то сделали всё что могли - jmp re_mouse_loop ; КОСТЫЛЬ: Если не ноль то попробуем взять соселний пиксель - mouse_set: ; Иначе запоминаем новый цвет - cmp [mouse_f],1 - jne was_right - mov [color],eax - call draw_result - jmp mouse_exit - was_right: - cmp [mouse_f],2 - jne mouse_exit - mov [color2],eax - call draw_result ; Выводим результат - mouse_exit: - ret ; Возвращаем управление -;end_mouse_get---------------------------------------------------------------------------------------- - -draw_palitra: - ; Функция 13 - нарисовать прямоугольник - mcall SF_DRAW_RECT, 110 shl 16+148, 9 shl 16+148, [sc.work] - - cmp [renmode],2 - je cyrcle_draw - ;cmp [renmode],1 - ;je picker_draw - cmp [renmode],0 - je sheme_draw - ret - - ;................................................................................................. - ; Отрисовка круговой диаграммы - ;................................................................................................. - cyrcle_draw: - ;mov eax,13 - ;mov edx,0x666666 - ;mov ebx,108*65536+152 - ;mov ecx,125*65536+33 - ;mcall - ;mov edx,0xF3F3F3 - ;mov ebx,109*65536+150 - ;mov ecx,126*65536+31 - ;mcall - - ;mov eax,4 ; 4 - вывести строку текста в окно - ;mov ebx,115 shl 16+131 ; [координата по оси x]*65536 + [координата по оси y] - ;mov ecx,0x666666 ; 0xX0RRGGBB (RR, GG, BB задают цвет текста) - ;mov edx,hint ; указатель на начало строки - ;mov esi,24 ; выводить esi символов - ;mcall - ;mov ebx,125 shl 16+144 ; [координата по оси x]*65536 + [координата по оси y] - ;mov edx,hint2 ; указатель на начало строки - ;mov esi,21 ; выводить esi символов - ;mcall - - ;mov edx,[color] - ;mov ebx,109*65536+150 - ;mov ecx, 10*65536+150 - ;mcall - call mouse_local ; получаем координаты мыши относительно окна - mov ecx, [mouse_x] ; заносим в регистр - mov edx, [mouse_y] ; заносим в регистр - cmp ecx, WIN_W-10 - jg cyrcle_draw_2 - cmp edx, WIN_H - jle end_cyrcle_draw - - cyrcle_draw_2: - mcall SF_SLEEP,10 - call desktop_get - call mouse_global - - mov ebx,112*65536+11 - mov esi,0 ; counter=8 - circle_loop: - mov ecx, 10*65536+11 - mov edi,0 - circle_loop2: - call circle_pixel_read - mcall SF_DRAW_RECT - add ecx,11 shl 16 - inc edi - cmp edi,13 - jne circle_loop2 - - add ebx,11 shl 16 - inc esi - cmp esi,13 - jne circle_loop - - mcall SF_DRAW_RECT, 177*65536+13, 76*65536+13, 0 - mov ecx, [mouse_x] - mov edx, [mouse_y] - inc ecx - inc edx - mov ebx, edx - imul ebx, [desctop_w] - add ebx, ecx - mcall SF_GET_PIXEL - mov edx,eax - mcall SF_DRAW_RECT, 178*65536+11, 77*65536+11 - ret - end_cyrcle_draw: - mcall SF_DRAW_RECT, 111*65536+145, 9*65536+145, 0x666666 - ret - - circle_pixel_read: - push ecx ebx - mov ecx, [mouse_x] - mov edx, [mouse_y] - inc ecx - add ecx, esi - cmp ecx, 6 - jl _cpr_exit - sub ecx, 6 - inc edx - add edx, edi - cmp edx, 6 - jl _cpr_exit - sub edx, 6 - - mov ebx, edx - imul ebx, [desctop_w] - add ebx, ecx - mcall SF_GET_PIXEL - mov edx,eax - pop ebx ecx - ret - - _cpr_exit: - xor edx,edx - pop ebx ecx - ret - - ;picker_draw: - ;ret - - ;................................................................................................. - ; Отрисовка фона под кнопки - ;................................................................................................. - sheme_draw: - mov eax,SF_DRAW_RECT ; Функция 13 - нарисовать прямоугольник - mov edx,0x222222 ; цвет - mov ecx,9 shl 16+73 ; Начальные координаты по y [к-та y]*65536 + [размер] - mov esi,2 ; Счетчик линий подложек - re_draw: - mov ebx,110 shl 16+73 ; Начальные координаты по x [к-та x]*65536 + [размер] - mov edi,2 ; Счетчик количества подложек - for_fon_loop: - int 0x40 ; Прерывание - add ebx,75 shl 16 ; Смещаем положение линии по х - dec edi ; Уменьшаем счетчик кнопок - cmp edi,0 ; Сравниваем с нулем - jnz for_fon_loop ; Если не ноль то в начало цикла - dec esi ; Уменьшаем его - cmp esi,0 ; Сравниваем с нулем - mov ecx,84 shl 16+73 ; Начальные координаты по y [к-та y]*65536 + [размер] - jnz re_draw ; Если не ноль то в начало цикла - - ;................................................................................................. - ; Отрисовка кнопок по циклу - ;................................................................................................. - mov eax,SF_DRAW_RECT ; Функция 13 - нарисовать прямоугольник - mov edx,0x0FFFFFFF ; цвет - mov esi,4 ; Счетчик количества абзацев (#4,8) - mov ebx,99 shl 16+8 ; Начальные координаты по x [к-та x]*65536 + [размер] - for_abz: - ;;push esi ; Сохраняем значение счетчика линий в стек - cmp esi,2 - jne x2_line - mov ebx,99 shl 16+8 - x2_line: - add ebx,3 shl 16 ; Смещаем положение линии по x - mov edi,8 ; Счетчик количества кнопок в строке - for_stolbik: - push edi ; Сохраняем значение счетчика линий в стек - mov edi,8 ; Счетчик количества кнопок в строке - mov ecx, 1 shl 16+8 ; Начальные координаты по y [к-та y]*65536 + [размер] - cmp esi,2 - jg y2_line ; Если больше 4 то игнорим - mov ecx,76 shl 16+8 - y2_line: - add ebx,9 shl 16 ; Смещаем положение линии по x - for_loop: - add ecx,9 shl 16 ; Смещаем положение линии по y - int 0x40 ; Прерывание - call sub_red - dec edi ; Уменьшаем счетчик кнопок - cmp edi,0 ; Сравниваем с нулем - jnz for_loop ; Если не ноль то в начало цикла - call sub_green - pop edi ; Иначе восстанавливаем счетчик линий - dec edi ; Уменьшаем его - cmp edi,0 ; Сравниваем с нулем - jnz for_stolbik ; Если не ноль то в начало цикла - call sub_blue - ;;pop esi ; Иначе восстанавливаем счетчик линий - dec esi ; Уменьшаем его - cmp esi,0 ; Сравниваем с нулем - jnz for_abz ; Если не ноль то в начало цикла - ret ; Возвращаем управление -;end_draw_palitra------------------------------------------------------------------------------------- - - -sub_red: - ;................................................................................................. - ; Расчёт смещений красного цвета в генерации цвета палитры - ;................................................................................................. - push eax - mov eax,[pnext] - ;sub_red_0 ; palitra - cmp al,0 - jne sub_red_1 - sub edx,0x40 - jmp sub_red_e - sub_red_1: ; random - cmp al,1 - jne sub_red_2 - sub edx,0x20 - jmp sub_red_e - sub_red_2: ; gree - cmp al,2 - jne sub_red_3 - sub edx,0x010101 - jmp sub_red_e - sub_red_3: ; red - cmp al,3 - jne sub_red_4 - sub edx,0x0101 - jmp sub_red_e - sub_red_4: ; green - cmp al,4 - jne sub_red_5 - sub edx,0x010001 - jmp sub_red_e - sub_red_5: ; blue - cmp al,5 - jne sub_red_e - sub edx,0x010100 - jmp sub_red_e - sub_red_e: - pop eax - ret ; Возвращаем управление -;end_sub_red------------------------------------------------------------------------------------------ - -sub_green: - ;................................................................................................. - ; Расчёт смещений красного цвета в генерации цвета палитры - ;................................................................................................. - push eax - mov eax,[pnext] - ;sub_green_0 - cmp al,0 - jne sub_green_1 - sub edx,0x4000 - jmp sub_green_e - sub_green_1: - cmp al,1 - jne sub_green_e - sub edx,0x2000 - ;jmp sub_green_e - sub_green_e: - pop eax - ret ; Возвращаем управление -;end_sub_green---------------------------------------------------------------------------------------- - - -sub_blue: - ;................................................................................................. - ; Расчёт смещений красного цвета в генерации цвета палитры - ;................................................................................................. - push eax - mov eax,[pnext] - ;sub_blue_0 - cmp al,0 - jne sub_blue_1 - sub edx,0x600000 - jmp sub_blue_e - sub_blue_1: - cmp al,1 - jne sub_blue_e - sub edx,0x400000 - ;jmp sub_blue_e - sub_blue_e: - pop eax - ret ; Возвращаем управление -;end_sub_blue----------------------------------------------------------------------------------------- - -draw_result: - ;................................................................................................. - ; Большая рамка вывода результата - ;................................................................................................. - mcall SF_DRAW_RECT, 4 shl 16+98, 9 shl 16+148, 0x00666666 - mcall , 5 shl 16+96, 10 shl 16+146, 0x00F3F3F3 - - ;................................................................................................. - ; Отрисовка результата цвета в hex color2 - ;................................................................................................. - mcall , 16 shl 16+15, 16 shl 16+15, 0x222222 - ; color 2 - draw color - mcall , 17 shl 16+13, 17 shl 16+13, [color2] - ; color 1 - draw fringle - mcall , 11 shl 16+15, 12 shl 16+15, 0x222222 - ; value - draw fringle - mcall , 34 shl 16+62, 16 shl 16+15 - - ; color 2 - draw color - mcall , 12 shl 16+13, 13 shl 16+13, [color] - ; value - draw background - mcall , 35 shl 16+60, 17 shl 16+13, 0xFFFFFF - - ; Функция 47 - вывод числа в окно - ;ebx - параметры преобразования числа в текст (HEX) - mcall SF_DRAW_NUMBER, 256+8 shl 16, [color], (45 shl 16)+20,, 0 - - ; функция 4: написать текст в окне - ; edx - рисуем '#' - ; esi - длина текста в байтах - mcall SF_DRAW_TEXT,38*65536+20,0,hex,1 - - ;................................................................................................. - ; Отрисовка r g b значений - ;................................................................................................. - call get_spectr - - movzx eax,[cred] ; красный - mov ebx,9*65536+142 ; [x начальный] *65536 + [y начальный] - call draw_value ; выводим результат - - movzx eax,[cgreen] ; зеленый - mov ebx,32*65536+142 ; [x начальный] *65536 + [y начальный] - call draw_value ; выводим результат - - movzx eax,[cblue] ; синий - mov ebx,55*65536+142 ; [x начальный] *65536 + [y начальный] - call draw_value ; выводим результат - - movzx eax,[calpha] ; альфа - mov ebx,78*65536+142 ; [x начальный] *65536 + [y начальный] - call draw_value ; выводим результат - - ;................................................................................................. - ; Выводим буквы r g b a - ;................................................................................................. - mov eax,SF_DRAW_TEXT ; 4 - вывести строку текста в окно - mov ebx,16 shl 16+40 ; [координата по оси x]*65536 + [координата по оси y] - mov ecx,0x0 ; 0xX0RRGGBB (RR, GG, BB задают цвет текста) - mov edx,cname ; указатель на начало строки - mov esi,1 ; выводить esi символов - newline: ; цикл - int 0x40 ; Прерывание - add ebx,23 shl 16 ; Добавляем - inc edx ; Добавляем - cmp [edx],byte 'x' ; Сравнение с байтом х - jne newline ; Если не нуль или не равно - - ;................................................................................................. - ; Отрисовка слайдеров - ;................................................................................................. - ; Функция 13 - нарисовать прямоугольник - mcall SF_DRAW_RECT, 16 shl 16+4, 51 shl 16+86, 0x222222 - add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] - int 0x40 - add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] - int 0x40 - add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] - int 0x40 - - mcall , 17 shl 16+2, 52 shl 16+84, 0xFA0919 - mov edx,0x08CE19 ; цвет-обводки - add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] - int 0x40 - mov edx,0x0909FF ; цвет-обводки - add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] - int 0x40 - mov edx,0xE4E4E4 ; цвет-обводки - add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] - int 0x40 - - ;................................................................................................. - ; Отрисовка ползунков - ;................................................................................................. - mov edx,0x0 ; цвет-ползунков - mov ebx,17 shl 16+11 ; Начальные координаты по x [к-та x]*65536 + [размер] - movzx eax,[cred] ; берем значение цвета - call draw_slider - add ebx,23 shl 16 - movzx eax,[cgreen] ; берем значение цвета - call draw_slider - add ebx,23 shl 16 - movzx eax,[cblue] ; берем значение цвета - call draw_slider - add ebx,23 shl 16 - movzx eax,[calpha] ; берем значение цвета - call draw_slider - - ret ; Возвращаем управление -;end_draw_result - -draw_slider: - xor ecx,ecx - mov cl,0x3 ; будем делить его на 3 так как ползунки длинной 85 пикселей - div cl ; делим - целое в al остаток в ah - mov cl,136 ; нижняя точка ползунка - sub cl,al ; cl=cl-al - shl ecx,16 - inc ecx ; задаем начальное положение - mcall SF_DRAW_RECT ; Функция 13 - нарисовать прямоугольник - push ebx ; сохраняем для следующего ползунка x+w - sub ebx,8 ; так как ширина линии 11 то отнимаем 8 чтобы кубик стал шириной 3 - add ebx,8 shl 16 ; Координаты по x для квадрата на ползунке смещаем на 8 в право - inc ecx ; быдлокодим высоту ползунка до 3-х (1+1=2) - inc ecx ; (2+1=3) ну вот у нас будет кубик 3х3 на 8 в право от линии - int 0x40 ; рисуем - pop ebx ; восстанавливаем нормальные координаты - ret ; Возвращаем управление - -;end_slider - -draw_value: - ;................................................................................................. - ; Вывод числа из строки в указанной области - ;................................................................................................. - push ebx ; сохраняем присланные координаты - mov ebx,10 ; устанавливаем основание системы счисления - mov edi,buff ; указатель на строку буфера - call int2ascii ; конвертируем число и ложим как строку в буфер + esi длина - mov eax,SF_DRAW_TEXT ; функция 4: написать текст в окне - pop ebx ; достаем из стека присланные координаты - cmp esi,2 ; ЦЕНТРИРОВАНИЕ ТЕКСТА - jne draw_value_1 - add ebx,4 shl 16 - jmp draw_value_e - draw_value_1: - cmp esi,1 - jne draw_value_e - add ebx,7 shl 16 - draw_value_e: - mov ecx,0x0 ; цвет текста RRGGBB - mov edx,buff ; указатель на начало текста - int 0x40 - ret ; Возвращаем управление -;end_draw_value - - _read_params: - - mov eax,dword[params+2] - mov dword[params_c+0],eax - - mov eax,dword[params+6] - mov dword[params_c+4],eax - - mov esi,params_c - mov ecx,16 - call ascii2int - mov [color],eax - - mov eax,dword[params+11] - mov dword[params_c+0],eax - - mov eax,dword[params+15] - mov dword[params_c+4],eax - - mov esi,params_c - mov ecx,16 - call ascii2int - mov [color2],eax - - ret - -hex_digit: - ;................................................................................................. - ; Преобразование в ASCII (вне зависимости от системы счисления) - ;................................................................................................. - cmp dl,10 ; в dl ожидается число от 0 до 15 - jb .less ; если dl<10 то переходим - add dl,'A'-10 ; 10->A 11->B 12->C ... - ret ; Возвращаем управление - .less: - or dl,'0' ; Если система счисления 10-я и менее - ret ; Возвращаем управление -;end_hex_digit - -int2ascii: - ;................................................................................................. - ; Преобразование числа в строку - ;................................................................................................. - ; eax - 32-х значное число - ; ebx - основание системы счисления - ; edi - указатель на строку буфера - ; Возвращает заполненный буфер и esi - длина строки - push edi - xor esi,esi ; зануляем счетчик символов - convert_loop: - xor edx,edx ; зануляем регистр под остаток - div ebx ; eax/ebx - остаток в edx - call hex_digit ; преобразуем символ - push edx ; ложим в стек - inc esi ; увеличиваем счетчик - test eax,eax ; если еще можно делить - jnz convert_loop ; то делием еще - cld ; ОБЯЗАТЕЛЬНО сбрасываем флаг направления DF (запись вперёд) - write_loop: ; иначе - pop eax ; достаем из стека в еах - stosb ; записываем в буфер по адресу ES:(E)DI - dec esi ; уменьшаем счетчик - test esi,esi ; если есть что доставать из стека - jnz write_loop ; то достаём - mov byte [edi],0 ; иначе дописыываем нулевой байт - pop edi - ; код ниже не имеет ничего общего к функции, просто возвращает еще длинну полученной строки - call str_len - mov esi,eax - ret ; и возвращаем управление -;end_int2ascii - -char2byte: - sub al,'0' - cmp al,10 - jb done - add al,'0' - and al,0x5f - sub al,'A'-10 - and al,0x0f - done: - ret -;end_char2byte - -ascii2int: - ;................................................................................................. - ; Преобразование строки в число - ;................................................................................................. - ; esi - указатель на нультерминированную строку - ; ecx - основание системы счисления - ; Возвращает eax - число - push esi - xor eax,eax - xor ebx,ebx - cmp byte [esi],'-' - jnz .next - inc esi - .next: - lodsb - or al,al - jz .done - call char2byte - imul ebx,ecx - add ebx,eax - jmp .next - .done: - xchg ebx,eax - pop esi - cmp byte [esi],'-' - jz .negate - ret - .negate: - neg eax - ret -;end_ascii2int - -get_spectr: - ;................................................................................................. - ; возвращает r,g,b состовляющие цвета - ;................................................................................................. - mov ecx,[color] - mov [cblue],cl - shr ecx,8 - mov [cgreen],cl - shr ecx,8 - mov [cred],cl - shr ecx,8 - mov [calpha],cl - ret ; и возвращаем управление -;end_get_spectr - -set_spectr: - ;................................................................................................. - ; устанавливает из r,g,b цвет - ;................................................................................................. - movzx eax,[calpha] - shl eax,8 - mov al,[cred] - shl eax,8 - mov al,[cgreen] - shl eax,8 - mov al,[cblue] - mov [color],eax - call draw_result ; Выводим результат - ret ; и возвращаем управление -;end_get_spectr - -str_len: - ;................................................................................................. - ; определяет длину строки (вход->EDI ZS offset ; выход->EAX ZS length) - ;................................................................................................. - push ecx esi edi - - cld - xor al, al - mov ecx, 0FFFFFFFFh - mov esi, edi - repne scasb - sub edi, esi - mov eax, edi - dec eax - - pop edi esi ecx - - ret -;end_str_len - - - ;------------------------------- - - proc random uses ebx ecx edx, max_value - mov ebx, 0 - mov eax, ebx - or eax, eax - jnz @f - rdtsc - xor eax, edx - mov ebx, eax - - @@: - xor edx, edx - mov ecx, 127773 - div ecx - mov ecx, eax - mov eax, 16807 - mul edx - mov edx, ecx - mov ecx, eax - mov eax, 2836 - mul edx - sub ecx, eax - xor edx, edx - mov eax, ecx - mov ebx, ecx - mov ecx, 100000 - div ecx - mov eax, edx - - xor edx, edx - mov ebx, [max_value] - div ebx - mov eax, edx - - ret - endp - -set_background2: - mcall SF_SYS_MISC, SSF_HEAP_INIT - mcall SF_SYS_MISC, SSF_MEM_ALLOC, 256 * 256 * 3 - mov [image], eax - - mov edx, eax - mov ecx, 256 * 256 - @@: - stdcall random, 15 + 1 - sub al, 15 / 2 - - mov bh, byte [color + 0] - add bh, al - mov [edx + 0], bh - mov bh, byte [color + 1] - add bh, al - mov [edx + 1], bh - mov bh, byte [color + 2] - add bh, al - mov [edx + 2], bh - add edx, 3 - loop @b - - mcall SF_BACKGROUND_SET, SSF_SIZE_BG, 256, 256 - mcall SF_BACKGROUND_SET, SSF_MODE_BG, 1 - mcall SF_BACKGROUND_SET, SSF_IMAGE_BG, [image], 0, 256 * 256 * 3 - mcall SF_BACKGROUND_SET, SSF_REDRAW_BG - - mcall SF_SYS_MISC, SSF_MEM_FREE, [image] - stdcall save_eskin_ini, 'B ' -ret - -align 4 -proc save_eskin_ini, opt_HB:dword - ;save to file eskin.ini - xor al,al - mov ecx,1024 - mov edi,sys_path+2 - repne scasb - sub edi,sys_path+3 - invoke ini_set_str, inifileeskin, amain, aprogram, sys_path+2, edi - ;add param 'H ' - mov eax,[opt_HB] - mov word[params],ax - mov eax,[color] - or eax,0xf ;для избежания вечного цикла если eax=0 - mov edi,params+2 - @@: - rol eax,8 - or al,al - jnz @f - mov word[edi],'00' ;нули перед числом - add edi,2 - jmp @b - @@: - and al,0xf0 - jnz @f - mov byte[edi],'0' - inc edi - @@: - mov eax,[color] - mov ebx,16 - call int2ascii - mov byte[params+10],' ' - ;add color2 - mov eax,[color2] - or eax,0xf ;для избежания вечного цикла если eax=0 - mov edi,params+11 - @@: - rol eax,8 - or al,al - jnz @f - mov word[edi],'00' ;нули перед числом - add edi,2 - jmp @b - @@: - and al,0xf0 - jnz @f - mov byte[edi],'0' - inc edi - @@: - mov eax,[color2] - mov ebx,16 - call int2ascii - - invoke ini_set_str, inifileeskin, amain, aparam, params, 19 - ret -endp - -;#___________________________________________________________________________________________________ -;****************************************************************************************************| -; БЛОК ПЕРЕМЕННЫХ И КОНСТАНТ | -;----------------------------------------------------------------------------------------------------/ -circle: - title db 'Palitra v0.77',0 ; хранит имя программы - hidden db 'Hidden',0 - hex db '#',0 ; для вывода решётки как текста - cname db 'RGBAx' ; хранит разряды цветов (red,green,blue) x-метка конца - larrow db 0x1A,0 - buff db '000',0 - bground db 'BACKGROUND',0 ; имя кнопки - 14 - bground1 db 'Gradient',0 ; имя кнопки - 14 - bground2 db 'Noisy',0 ; имя кнопки - 14 - runmode dd 1 ; режим запуска (1-normal, 2-hidden, 3-colordialog) - color2 dd 00FFFFFFh ; хранит значение второго выбранного цвета - - inifileeskin db '/sys/settings/system.ini',0 - amain db 'style',0 - aprogram db 'bg_program',0 - aparam db 'bg_param',0 - -align 16 -@IMPORT: - -library \ - libini , 'libini.obj' - -import libini, \ - ini_set_str, 'ini_set_str' - -I_END: - cm rb 12 - color rd 1 ; хранит значение выбранного цвета - mouse_x rd 1 ; хранит глобальную х координату мыши - mouse_y rd 1 ; хранит глобальную у координату мыши - mouse_f rd 1 ; хранит данные о том какая кнопка мыши была нажата - desctop_w rd 1 ; хранит ширину экрана - desctop_h rd 1 ; хранит высоту экрана - sc system_colors ; хранит структуру системных цветов скина - cred rb 1 ; храним красный спекрт - cgreen rb 1 ; храним зеленый спектр - cblue rb 1 ; храним синий спектр - calpha rb 1 ; храним прозрачность - pnext rd 1 ; счетчик переключения палитры - renmode rd 1 ; режим отрисовки (1-цветовая схема,2-пипетка,3-круговая) - params rb 20 ; приём параметров - params_c rb 9 ; приёмник для цвета - image rd 1 - - rd 1024 -stacktop: - sys_path rb 1024 -I_MEM: \ No newline at end of file +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +;#___________________________________________________________________________________________________ +;****************************************************************************************************| +; Program Palitra (c) Sergei Steshin (Akyltist) | +;----------------------------------------------------------------------------------------------------| +;; Charset:DOS-866 Font:Courier New Size:9pt | +;..................................................................................................... +;; compiler: FASM 1.69.31 | +;; version: 0.3.0 | +;; last update: 08/11/2012 | +;; e-mail: dr.steshin@gmail.com | +;..................................................................................................... +;; History: | +;; 0.1.0 - Первая версия программы. | +;; 0.2.0 - Исправлено попадание в сетку, берется ближайший по диагонали пиксель. | +;; - Добавлены ползунки, для регулирования rgb составляющих цвета и вывод этих составляющих. | +;; - Убран вывод цвета в бинарном виде (пока за не надобностью и не актуальностью). | +;; - Мелкая косметика. | +;; 0.3.0 - Добавлено переключение видов цветовых схем (кнопка NEXT) | +;; - Улучшены ползунки, производится обработка нажатия рядом с ползунком. | +;; - Число сеток в цветовой схеме уменьшено с 6 до 4 (кратность 256, иначе дублирование цвета).| +;; - Мелкая косметика. | +;; 0.4.0 - Добавлено переключение между двумя цветами | +;; - Добавлен ползунок регулирования прозрачности (без визуализации). | +;; - Добавлено выравнивание значений rgba по центру, в зависимости от длинны. | +;; - Косметические правки. | +;; - Небольшая оптимизация. | +;; 0.5.0 - Добавлена кнопка смены фона рабочего стола (от Leency). | +;; - Добавлено изменение фона рабочего стола градиентной заливкой. | +;; - Косметические правки. | +;; - Небольшая деоптимизация. | +;; 0.6.0 - Добавлена возможность запуска с параметрами | +;; - Добавлен режим H (hidden) производит замену фона рабочего стола градиентной заливкой. | +;; - Большая деоптимизация. | +;; 0.7.0 - Добавлена пипетка - выбор на среднюю кнопку мыши | +;; 0.7.5 - Нажатие правой клавишей мыши на ячейку с цветом устанавливает не основой, а дополн. цвет | +;; - Уменьшено мерцание при работе пипетки | +;; 0.7.6 - Добавлен режим B, который производит замену фона рабочего стола шумной заливкой (e-andrew)| +;..................................................................................................... +;; 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 Sergei Steshin ''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,START,I_END,I_MEM,stacktop,params,sys_path + + include '../../macros.inc' + include '../../proc32.inc' + include '../../KOSfuncs.inc' + include '../../dll.inc' + + WIN_W equ 295 ; ширина окна + WIN_H equ 195 ; высота окна + WIN_X equ 250 ; координата х окна + WIN_Y equ 190 ; координата у окна + +panel: + file "panel.raw" + +START: + mcall SF_SYS_MISC,SSF_HEAP_INIT ; инициализация кучи + stdcall dll.Load, @IMPORT + or eax,eax + jnz bexit + mcall SF_SET_EVENTS_MASK,0x27 ; устанавливаем маску событий + include 'params_init.inc' ; обработка параметров командной строки + +;#___________________________________________________________________________________________________ +;****************************************************************************************************| +; ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ - ОБРАБОТКА СОБЫТИЙ | +;----------------------------------------------------------------------------------------------------/ +red: + call draw_main ; вызываем перерисовку окна приложения +still: + mcall SF_WAIT_EVENT ; функция 10 - ждать события + cmp eax,1 ; перерисовать окно ? + je red ; если да - на метку red + cmp eax,2 ; нажата клавиша ? + je key ; если да - на key + cmp eax,3 ; нажата кнопка ? + je button ; если да - на button + cmp eax,6 ; событие от мыши вне окна + je mouse ; если да - на button + jmp still ; если другое событие - в начало цикла +;end_still + +key: ; нажата клавиша на клавиатуре + mcall SF_GET_KEY ; функция 2 - считать код символа (в ah) (тут в принципе не нужна) + jmp still ; вернуться к началу цикла +;end_key + +mouse: + cmp [renmode],2 + jne left + call cyrcle_draw + jmp center + left: + mcall SF_MOUSE_GET,SSF_BUTTON + cmp al,1b + jne right + mov [mouse_f],1 + jmp still + right: + cmp al,10b + jne still + mov [mouse_f],2 + jmp still + center: + mcall SF_MOUSE_GET,SSF_BUTTON + cmp al,100b + jne still + mov [mouse_f],3 + mov [color],edx + call draw_result + jmp still ; вернуться к началу цикла +;end_mouse + +button: + mcall SF_GET_BUTTON ; 17 - получить идентификатор нажатой кнопки + cmp ah, 1 ; если нажата кнопка с номером 1, + jz bexit ; выходим + ;обработка кнопки Next + cmp ah, 12 ; если нажата кнопка NEXT + jne next_bg ; выходим + inc [pnext] ; увеличиваем при нажатии номер палитры + mov [renmode],0 ; включаем цветовые схемы + mov eax,[pnext] ; заносим значение в еах + cmp al,6 ; сравниваем с заявленным количеством палитр + jne next_redraw ; если не больше максимума то на вызов отрисовки + xor eax,eax ; иначе зануляем палитру на default + mov [pnext],eax ; и запоминаем что сбросили палитру на default + next_redraw: + call draw_palitra ; РИСУЕМ ПАЛИТРУ + jmp still ; Уходим на ожидание другого события + next_bg: + cmp ah, 14 ; Кнопка BACKGROUND + jne next_bg2 ; если не нажата то выходим + call set_background ; иначе устанавливаем фон + jmp still ; и на ожидание события + next_bg2: + cmp ah, 16 ; Кнопка BACKGROUND + jne circle_bg ; если не нажата то выходим + call set_background2 ; иначе устанавливаем фон + jmp still ; и на ожидание события + circle_bg: + cmp ah, 15 ; Кнопка Круговая палитра + jne next_end ; если не нажата то выходим + mov [renmode],2 ; включаем отрисовку круговой палитры + call draw_palitra ; РИСУЕМ ПАЛИТРУ + jmp still ; и на ожидание события + next_end: + cmp ah,13 ; COLOR SWAP + jne color_swap_end + push [color2] + push [color] + pop [color2] + pop [color] + call draw_result + jmp still ; И уходим на ожидание другого события + color_swap_end: + cmp ah, 7 ; Проверяем нажата кнопка с ID=7 + jne color_button ; Если не нажата, то идём дальше + call mouse_get ; Иначе включаем обработчик мыши, чтобы считать значение цвета с палитры + jmp still ; И уходим на ожидание другого события + color_button: ; РАСЧЁТ координат для ползунков RGBA + push eax ; запоминаем еах + call mouse_local ; получаем локальные координаты + mov ebx,137 ; нижняя граница ползунка по У + mov ecx,[mouse_y] ; занисим в есх значение курсора по У + sub ebx,ecx ; находим разность (т.е. куда смещается ползунок) + mov ecx,3 ; заносим в есх цифру 3 (256/3=85, где 85-высота ползунков) + imul ecx,ebx ; находим истинный параметр цвета с учётом масштаба ползунка---+ + pop eax ; восстанавливаем еах : + ;red_button: ; Красный Трекбар : + cmp ah, 8 ; ID=8 : + jne green_button ; если нет, то проверяем зелёный трекбар : + mov [cred],cl ; иначе присваиваем значение, красному цвету спектра <------+ + call set_spectr ; устанавливаем спектр + jmp still ; Уходим на ожидание другого события + green_button: + cmp ah, 9 + jne blue_button + mov [cgreen],cl + call set_spectr + jmp still ; Уходим на ожидание другого события + blue_button: + cmp ah, 10 + jne alpha_button + mov [cblue],cl + call set_spectr + jmp still ; Уходим на ожидание другого события + alpha_button: + cmp ah, 11 + jne still + mov [calpha],cl + call set_spectr + jmp still ; Уходим на ожидание другого события + bexit: + mcall SF_TERMINATE_PROCESS ; иначе конец программы +;end_button + +;#___________________________________________________________________________________________________ +;****************************************************************************************************| +; ГЛАВНЫЙ МОДУЛЬ ОТРИСОВКИ ОКНА И ЭЛЕМЕНТОВ ПРИЛОЖЕНИЯ | +;----------------------------------------------------------------------------------------------------/ +draw_main: + ; функция 12: означает, что будет рисоваться окно + mcall SF_REDRAW,SSF_BEGIN_DRAW + + ; Функция 48 - стили отображения окон + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors + + ; Функция 48 - стили отображения окон + mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT + mov ecx,eax ; Запоминаем высоту скина + + mov edi,[runmode] + cmp edi,2 + jne no_hiddenmode + mov edi,hidden + jmp set_title + no_hiddenmode: + cmp edi,3 + jne no_dialogmode + mov edi,hidden + jmp set_title + no_dialogmode: + mov edi,title ; Заголовок окна + set_title: + + xor eax,eax ; Очищаем eax (mov eax,0) (Функция 0) + mov ebx,WIN_X shl 16+WIN_W ; [координата по оси x]*65536 + [размер по оси x] + add ecx,WIN_Y shl 16+WIN_H ; Высота скина + [координата по y]*65536 + [размер по y] (168 для версии 0.2) + mov edx,[sc.work] ; Видимо стиль окна по дефолту + or edx,0x34000000 ; Или окно со скином фиксированных размеров + + int 0x40 ; Прерывание + + + call draw_palitra ; РИСУЕМ ПАЛИТРУ + call draw_result ; РИСУЕМ РЕЗУЛЬТАТ + + ; Функция 8 - определить/удалить кнопку + mcall SF_DEFINE_BUTTON, (110 shl 16)+147, (9 shl 16)+147, 0x60000007 + + inc edx + mcall , (13 shl 16)+12, (51 shl 16)+85 ; Рисуем невидимую кнопку под слайдером red + add ebx,23 shl 16 ; Добавляем + inc edx ; ID = 9 + int 0x40 ; Рисуем невидимую кнопку под слайдером green + add ebx,23 shl 16 ; Добавляем + inc edx ; ID = 10 + int 0x40 ; Рисуем невидимую кнопку под слайдером blue + add ebx,23 shl 16 ; Добавляем + inc edx ; ID = 11 + int 0x40 ; Рисуем невидимую кнопку под слайдером alpha + + ; Функция 8 - определить/удалить кнопку (СМЕНА ЦВЕТА) + mcall , (11 shl 16)+20, (12 shl 16)+20, 0x6000000D + + call draw_bottom_panel + call draw_left_panel + + ; функция 12: означает, что будет рисоваться окно + mcall SF_REDRAW,SSF_END_DRAW + ret + +;#___________________________________________________________________________________________________ +;****************************************************************************************************| +; БЛОК ВСПОМОГАТЕЛЬНЫХ ПРОЦЕДУР И ФУНКЦИЙ ПРИЛОЖЕНИЯ | +;----------------------------------------------------------------------------------------------------/ + + + ;------------------------------------------------------------------------------------------------+ + draw_left_panel: ; Отрисовка боковой панели + ;................................................................................................. + ; button_next_colorsheme + mcall SF_DEFINE_BUTTON, (266 shl 16)+16, (9 shl 16)+16, 0x6000000C, [sc.work_button] + ; circle diagram + add ecx,19 shl 16 ; move rect + mov edx,0x6000000F ; ID = 15 + int 0x40 ; call + + mcall SF_PUT_IMAGE, panel, (16 shl 16)+149, (266 shl 16)+9 + + ;mov eax,13 ; draw rect + ;mov ebx,266 shl 16+16 ; [x] + [size] + ;mov ecx,9 shl 16+16 ; [y] + [size] + ;mov edx,0x666666 ; RGB + ;push esi ; backup esi + ;mov esi,8 ; counter=8 + ;draw_lpanel: ; loop label + ; int 0x40 ; call draw black rect + ; add ecx,19 shl 16 ; move rect + ; dec esi ; decrement counter + ; cmp esi,0 ; if counter!=zero + ; jne draw_lpanel ; then goto label + ; mov esi,8 ; else counter=8 + ; mov ebx,267 shl 16+14 ; [x] + [size] + ; mov ecx,10 shl 16+14 ; [y] + [size] + ; mov edx,0xF3F3F3 ; RGB + ;draw_lpanel2: ; 2 loop label + ; int 0x40 ; call draw white rect + ; add ecx,19 shl 16 ; move rect + ; dec esi ; decrement counter + ; cmp esi,0 ; if counter!=0 + ; jne draw_lpanel2 ; then goto label2 + ;pop esi ; restore esi + ; draw_left_arrow for button_next_colorsheme + ;mov eax,4 ; Write string + ;mov ebx,272 shl 16+13 ; [x] + [y] + ;mov ecx,0x0 ; RGB + ;mov edx,larrow ; string pointer + ;mov esi,1 ; count symbol + ;int 0x40 ; call + ;mov eax,38 ; draw line + ;mov ebx,270 shl 16+272 ; [start x] + [end x] + ;mov ecx,16 shl 16+16 ; [start y] + [end y] + ;mov edx,0x0 ; RGB + ;int 0x40 ; call + ret ; return + ;................................................................................................. + + + ;------------------------------------------------------------------------------------------------+ + draw_bottom_panel: ; Отрисовка нижней панели + ;................................................................................................. + mcall SF_DEFINE_BUTTON, (92 shl 16)+90, (169 shl 16)+16, 14, [sc.work_button] + + add ebx, 100 shl 16 + add edx, 2 + int 0x40 + + ; Write string + mov ecx,[sc.work_text] ; RGB + or ecx, 1 shl 31 + mcall SF_DRAW_TEXT, (113 - 104) shl 16+174, ,bground + + mov ecx, [sc.work_button_text] + or ecx, 1 shl 31 + + add ebx, 106 shl 16 + mov edx, bground1 + int 0x40 + + add ebx, 107 shl 16 + mov edx, bground2 + int 0x40 + + mcall SF_DRAW_LINE, 4 shl 16+282, 163 shl 16+163, 0x00666666 + ret ; return + ;................................................................................................. + +mouse_global: + ;................................................................................................. + ; Получаем координаты мыши + ;................................................................................................. + mcall SF_MOUSE_GET,SSF_SCREEN_POSITION + ; eax = x*65536 + y, (x,y)=координаты курсора мыши + mov ecx,eax ; + shr ecx,16 ; ecx = x+1 + movzx edx,ax ; edx = y+1 + dec ecx ; ecx = x + dec edx ; edx = y + mov [mouse_x],ecx ; mouse_x = x + mov [mouse_y],edx ; mouse_y = y + ret ; Возвращаем управление +;end_mouse_global + +mouse_local: + ;................................................................................................. + ; Получаем координаты мыши относительно окна + ;................................................................................................. + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION + ; eax = x*65536 + y, (x,y)=координаты курсора мыши + mov ecx,eax ; + shr ecx,16 ; ecx = x+1 + movzx edx,ax ; edx = y+1 + dec ecx ; ecx = x + dec edx ; edx = y + mov [mouse_x],ecx ; mouse_x = x + mov [mouse_y],edx ; mouse_y = y + ret ; Возвращаем управление +;end_mouse_local + +set_background: + ;................................................................................................. + ; Устанавливает фон рабочего стола + ;................................................................................................. + ; Функция 15 - работа с фоновой графикой + ; Подфункция 4 - установить режим отрисовки фона. + ; Режим отрисовки - замостить (1), растянуть (2) + mcall SF_BACKGROUND_SET,SSF_MODE_BG,2 + + ; Функция 15 - работа с фоновой графикой + ; Подфункция 1 - установить размер фонового изображения. + mcall SF_BACKGROUND_SET,SSF_SIZE_BG,2,2 + + mov eax,[color] + mov [cm+0],al + mov [cm+9],al + shr eax,8 + mov [cm+1],al + mov [cm+10],al + shr eax,8 + mov [cm+2],al + mov [cm+11],al + + mov eax,[color2] + mov [cm+3],al + mov [cm+6],al + shr eax,8 + mov [cm+4],al + mov [cm+7],al + shr eax,8 + mov [cm+5],al + mov [cm+8],al + + ; Функция 15 - работа с фоновой графикой + ; Подфункция 5 - поместить блок пикселей на фон. + ; - Указатель на данные в формате BBGGRRBBGGRR + ; - Cмещение в данных фонового изображения + ; - Размер данных в байтах = 3 * число пикселей + mcall SF_BACKGROUND_SET,SSF_IMAGE_BG,cm,0,3*4 + + ; Функция 15 - работа с фоновой графикой + ; Подфункция 3 - перерисовать фон. + mcall SF_BACKGROUND_SET,SSF_REDRAW_BG + + stdcall save_eskin_ini, 'H ' + + ret +;end_set_background + +desktop_get: + ;................................................................................................. + ; Определяем ширину экрана + ;................................................................................................. + ; Определяем ширину экрана (eax = [xsize]*65536 + [ysize]) + mcall SF_GET_SCREEN_SIZE ; xsize = размер по горизонтали - 1 + mov ebx,eax ; + shr ebx,16 ; ebx = xsize-1 + movzx edx,ax ; edx = ysize-1 (лишний код) + inc ebx ; ebx = xsize + inc edx ; edx = ysize (лишний код) + mov [desctop_w],ebx + mov [desctop_h],edx + ret +;end_desktop_get + +mouse_get: + mov esi,2 ; КОСТЫЛЬ: флаг для избежания зацикливания + call mouse_global + call desktop_get + re_mouse_loop: ; КОСТЫЛЬ: метка для возврата если попали в сетку + mov ebx,[desctop_w] + imul ebx,[mouse_y] ; ebx = y*xsize + add ebx,[mouse_x] ; ebx = y*xsize+x + + ;................................................................................................. + ; Берем цвет с палитры в переменную + ;................................................................................................. + ;mov ebx,ecx ;; ebx = y*xsize+x (лишний код) + mcall SF_GET_PIXEL ; Получаем цвет в eax + cmp eax,[sc.work] ; Сравниваем с фоном приложения + je mouse_err ; Если это он - то ничего не делаем + cmp eax,0x222222 ; Сравниваем с цветом сетки + je mouse_err ; Если это он - то ничего не делаем + jmp mouse_set ; КОСТЫЛЬ: прыгаем чтобы не брать цвет сетки + mouse_err: ; КОСТЫЛЬ: если попали в сетку или фон + inc [mouse_y] ; КОСТЫЛЬ: смещаем по диагонали сначала по х + inc [mouse_x] ; КОСТЫЛЬ: смещаем по диагонали потом по у + dec esi ; КОСТЫЛЬ: Уменьшаем флаг + cmp esi,0 ; КОСТЫЛЬ: Сравниваем с нулем + jz mouse_exit ; КОСТЫЛЬ: Если ноль то сделали всё что могли + jmp re_mouse_loop ; КОСТЫЛЬ: Если не ноль то попробуем взять соселний пиксель + mouse_set: ; Иначе запоминаем новый цвет + cmp [mouse_f],1 + jne was_right + mov [color],eax + call draw_result + jmp mouse_exit + was_right: + cmp [mouse_f],2 + jne mouse_exit + mov [color2],eax + call draw_result ; Выводим результат + mouse_exit: + ret ; Возвращаем управление +;end_mouse_get---------------------------------------------------------------------------------------- + +draw_palitra: + ; Функция 13 - нарисовать прямоугольник + mcall SF_DRAW_RECT, 110 shl 16+148, 9 shl 16+148, [sc.work] + + cmp [renmode],2 + je cyrcle_draw + ;cmp [renmode],1 + ;je picker_draw + cmp [renmode],0 + je sheme_draw + ret + + ;................................................................................................. + ; Отрисовка круговой диаграммы + ;................................................................................................. + cyrcle_draw: + ;mov eax,13 + ;mov edx,0x666666 + ;mov ebx,108*65536+152 + ;mov ecx,125*65536+33 + ;mcall + ;mov edx,0xF3F3F3 + ;mov ebx,109*65536+150 + ;mov ecx,126*65536+31 + ;mcall + + ;mov eax,4 ; 4 - вывести строку текста в окно + ;mov ebx,115 shl 16+131 ; [координата по оси x]*65536 + [координата по оси y] + ;mov ecx,0x666666 ; 0xX0RRGGBB (RR, GG, BB задают цвет текста) + ;mov edx,hint ; указатель на начало строки + ;mov esi,24 ; выводить esi символов + ;mcall + ;mov ebx,125 shl 16+144 ; [координата по оси x]*65536 + [координата по оси y] + ;mov edx,hint2 ; указатель на начало строки + ;mov esi,21 ; выводить esi символов + ;mcall + + ;mov edx,[color] + ;mov ebx,109*65536+150 + ;mov ecx, 10*65536+150 + ;mcall + call mouse_local ; получаем координаты мыши относительно окна + mov ecx, [mouse_x] ; заносим в регистр + mov edx, [mouse_y] ; заносим в регистр + cmp ecx, WIN_W-10 + jg cyrcle_draw_2 + cmp edx, WIN_H + jle end_cyrcle_draw + + cyrcle_draw_2: + mcall SF_SLEEP,10 + call desktop_get + call mouse_global + + mov ebx,112*65536+11 + mov esi,0 ; counter=8 + circle_loop: + mov ecx, 10*65536+11 + mov edi,0 + circle_loop2: + call circle_pixel_read + mcall SF_DRAW_RECT + add ecx,11 shl 16 + inc edi + cmp edi,13 + jne circle_loop2 + + add ebx,11 shl 16 + inc esi + cmp esi,13 + jne circle_loop + + mcall SF_DRAW_RECT, 177*65536+13, 76*65536+13, 0 + mov ecx, [mouse_x] + mov edx, [mouse_y] + inc ecx + inc edx + mov ebx, edx + imul ebx, [desctop_w] + add ebx, ecx + mcall SF_GET_PIXEL + mov edx,eax + mcall SF_DRAW_RECT, 178*65536+11, 77*65536+11 + ret + end_cyrcle_draw: + mcall SF_DRAW_RECT, 111*65536+145, 9*65536+145, 0x666666 + ret + + circle_pixel_read: + push ecx ebx + mov ecx, [mouse_x] + mov edx, [mouse_y] + inc ecx + add ecx, esi + cmp ecx, 6 + jl _cpr_exit + sub ecx, 6 + inc edx + add edx, edi + cmp edx, 6 + jl _cpr_exit + sub edx, 6 + + mov ebx, edx + imul ebx, [desctop_w] + add ebx, ecx + mcall SF_GET_PIXEL + mov edx,eax + pop ebx ecx + ret + + _cpr_exit: + xor edx,edx + pop ebx ecx + ret + + ;picker_draw: + ;ret + + ;................................................................................................. + ; Отрисовка фона под кнопки + ;................................................................................................. + sheme_draw: + mov eax,SF_DRAW_RECT ; Функция 13 - нарисовать прямоугольник + mov edx,0x222222 ; цвет + mov ecx,9 shl 16+73 ; Начальные координаты по y [к-та y]*65536 + [размер] + mov esi,2 ; Счетчик линий подложек + re_draw: + mov ebx,110 shl 16+73 ; Начальные координаты по x [к-та x]*65536 + [размер] + mov edi,2 ; Счетчик количества подложек + for_fon_loop: + int 0x40 ; Прерывание + add ebx,75 shl 16 ; Смещаем положение линии по х + dec edi ; Уменьшаем счетчик кнопок + cmp edi,0 ; Сравниваем с нулем + jnz for_fon_loop ; Если не ноль то в начало цикла + dec esi ; Уменьшаем его + cmp esi,0 ; Сравниваем с нулем + mov ecx,84 shl 16+73 ; Начальные координаты по y [к-та y]*65536 + [размер] + jnz re_draw ; Если не ноль то в начало цикла + + ;................................................................................................. + ; Отрисовка кнопок по циклу + ;................................................................................................. + mov eax,SF_DRAW_RECT ; Функция 13 - нарисовать прямоугольник + mov edx,0x0FFFFFFF ; цвет + mov esi,4 ; Счетчик количества абзацев (#4,8) + mov ebx,99 shl 16+8 ; Начальные координаты по x [к-та x]*65536 + [размер] + for_abz: + ;;push esi ; Сохраняем значение счетчика линий в стек + cmp esi,2 + jne x2_line + mov ebx,99 shl 16+8 + x2_line: + add ebx,3 shl 16 ; Смещаем положение линии по x + mov edi,8 ; Счетчик количества кнопок в строке + for_stolbik: + push edi ; Сохраняем значение счетчика линий в стек + mov edi,8 ; Счетчик количества кнопок в строке + mov ecx, 1 shl 16+8 ; Начальные координаты по y [к-та y]*65536 + [размер] + cmp esi,2 + jg y2_line ; Если больше 4 то игнорим + mov ecx,76 shl 16+8 + y2_line: + add ebx,9 shl 16 ; Смещаем положение линии по x + for_loop: + add ecx,9 shl 16 ; Смещаем положение линии по y + int 0x40 ; Прерывание + call sub_red + dec edi ; Уменьшаем счетчик кнопок + cmp edi,0 ; Сравниваем с нулем + jnz for_loop ; Если не ноль то в начало цикла + call sub_green + pop edi ; Иначе восстанавливаем счетчик линий + dec edi ; Уменьшаем его + cmp edi,0 ; Сравниваем с нулем + jnz for_stolbik ; Если не ноль то в начало цикла + call sub_blue + ;;pop esi ; Иначе восстанавливаем счетчик линий + dec esi ; Уменьшаем его + cmp esi,0 ; Сравниваем с нулем + jnz for_abz ; Если не ноль то в начало цикла + ret ; Возвращаем управление +;end_draw_palitra------------------------------------------------------------------------------------- + + +sub_red: + ;................................................................................................. + ; Расчёт смещений красного цвета в генерации цвета палитры + ;................................................................................................. + push eax + mov eax,[pnext] + ;sub_red_0 ; palitra + cmp al,0 + jne sub_red_1 + sub edx,0x40 + jmp sub_red_e + sub_red_1: ; random + cmp al,1 + jne sub_red_2 + sub edx,0x20 + jmp sub_red_e + sub_red_2: ; gree + cmp al,2 + jne sub_red_3 + sub edx,0x010101 + jmp sub_red_e + sub_red_3: ; red + cmp al,3 + jne sub_red_4 + sub edx,0x0101 + jmp sub_red_e + sub_red_4: ; green + cmp al,4 + jne sub_red_5 + sub edx,0x010001 + jmp sub_red_e + sub_red_5: ; blue + cmp al,5 + jne sub_red_e + sub edx,0x010100 + jmp sub_red_e + sub_red_e: + pop eax + ret ; Возвращаем управление +;end_sub_red------------------------------------------------------------------------------------------ + +sub_green: + ;................................................................................................. + ; Расчёт смещений красного цвета в генерации цвета палитры + ;................................................................................................. + push eax + mov eax,[pnext] + ;sub_green_0 + cmp al,0 + jne sub_green_1 + sub edx,0x4000 + jmp sub_green_e + sub_green_1: + cmp al,1 + jne sub_green_e + sub edx,0x2000 + ;jmp sub_green_e + sub_green_e: + pop eax + ret ; Возвращаем управление +;end_sub_green---------------------------------------------------------------------------------------- + + +sub_blue: + ;................................................................................................. + ; Расчёт смещений красного цвета в генерации цвета палитры + ;................................................................................................. + push eax + mov eax,[pnext] + ;sub_blue_0 + cmp al,0 + jne sub_blue_1 + sub edx,0x600000 + jmp sub_blue_e + sub_blue_1: + cmp al,1 + jne sub_blue_e + sub edx,0x400000 + ;jmp sub_blue_e + sub_blue_e: + pop eax + ret ; Возвращаем управление +;end_sub_blue----------------------------------------------------------------------------------------- + +draw_result: + ;................................................................................................. + ; Большая рамка вывода результата + ;................................................................................................. + mcall SF_DRAW_RECT, 4 shl 16+98, 9 shl 16+148, 0x00666666 + mcall , 5 shl 16+96, 10 shl 16+146, 0x00F3F3F3 + + ;................................................................................................. + ; Отрисовка результата цвета в hex color2 + ;................................................................................................. + mcall , 16 shl 16+15, 16 shl 16+15, 0x222222 + ; color 2 - draw color + mcall , 17 shl 16+13, 17 shl 16+13, [color2] + ; color 1 - draw fringle + mcall , 11 shl 16+15, 12 shl 16+15, 0x222222 + ; value - draw fringle + mcall , 34 shl 16+62, 16 shl 16+15 + + ; color 2 - draw color + mcall , 12 shl 16+13, 13 shl 16+13, [color] + ; value - draw background + mcall , 35 shl 16+60, 17 shl 16+13, 0xFFFFFF + + ; Функция 47 - вывод числа в окно + ;ebx - параметры преобразования числа в текст (HEX) + mcall SF_DRAW_NUMBER, 256+8 shl 16, [color], (45 shl 16)+20,, 0 + + ; функция 4: написать текст в окне + ; edx - рисуем '#' + ; esi - длина текста в байтах + mcall SF_DRAW_TEXT,38*65536+20,0,hex,1 + + ;................................................................................................. + ; Отрисовка r g b значений + ;................................................................................................. + call get_spectr + + movzx eax,[cred] ; красный + mov ebx,9*65536+142 ; [x начальный] *65536 + [y начальный] + call draw_value ; выводим результат + + movzx eax,[cgreen] ; зеленый + mov ebx,32*65536+142 ; [x начальный] *65536 + [y начальный] + call draw_value ; выводим результат + + movzx eax,[cblue] ; синий + mov ebx,55*65536+142 ; [x начальный] *65536 + [y начальный] + call draw_value ; выводим результат + + movzx eax,[calpha] ; альфа + mov ebx,78*65536+142 ; [x начальный] *65536 + [y начальный] + call draw_value ; выводим результат + + ;................................................................................................. + ; Выводим буквы r g b a + ;................................................................................................. + mov eax,SF_DRAW_TEXT ; 4 - вывести строку текста в окно + mov ebx,16 shl 16+40 ; [координата по оси x]*65536 + [координата по оси y] + mov ecx,0x0 ; 0xX0RRGGBB (RR, GG, BB задают цвет текста) + mov edx,cname ; указатель на начало строки + mov esi,1 ; выводить esi символов + newline: ; цикл + int 0x40 ; Прерывание + add ebx,23 shl 16 ; Добавляем + inc edx ; Добавляем + cmp [edx],byte 'x' ; Сравнение с байтом х + jne newline ; Если не нуль или не равно + + ;................................................................................................. + ; Отрисовка слайдеров + ;................................................................................................. + ; Функция 13 - нарисовать прямоугольник + mcall SF_DRAW_RECT, 16 shl 16+4, 51 shl 16+86, 0x222222 + add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] + int 0x40 + add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] + int 0x40 + add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] + int 0x40 + + mcall , 17 shl 16+2, 52 shl 16+84, 0xFA0919 + mov edx,0x08CE19 ; цвет-обводки + add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] + int 0x40 + mov edx,0x0909FF ; цвет-обводки + add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] + int 0x40 + mov edx,0xE4E4E4 ; цвет-обводки + add ebx,23 shl 16 ; Начальные координаты по x [к-та y]*65536 + [размер] + int 0x40 + + ;................................................................................................. + ; Отрисовка ползунков + ;................................................................................................. + mov edx,0x0 ; цвет-ползунков + mov ebx,17 shl 16+11 ; Начальные координаты по x [к-та x]*65536 + [размер] + movzx eax,[cred] ; берем значение цвета + call draw_slider + add ebx,23 shl 16 + movzx eax,[cgreen] ; берем значение цвета + call draw_slider + add ebx,23 shl 16 + movzx eax,[cblue] ; берем значение цвета + call draw_slider + add ebx,23 shl 16 + movzx eax,[calpha] ; берем значение цвета + call draw_slider + + ret ; Возвращаем управление +;end_draw_result + +draw_slider: + xor ecx,ecx + mov cl,0x3 ; будем делить его на 3 так как ползунки длинной 85 пикселей + div cl ; делим - целое в al остаток в ah + mov cl,136 ; нижняя точка ползунка + sub cl,al ; cl=cl-al + shl ecx,16 + inc ecx ; задаем начальное положение + mcall SF_DRAW_RECT ; Функция 13 - нарисовать прямоугольник + push ebx ; сохраняем для следующего ползунка x+w + sub ebx,8 ; так как ширина линии 11 то отнимаем 8 чтобы кубик стал шириной 3 + add ebx,8 shl 16 ; Координаты по x для квадрата на ползунке смещаем на 8 в право + inc ecx ; быдлокодим высоту ползунка до 3-х (1+1=2) + inc ecx ; (2+1=3) ну вот у нас будет кубик 3х3 на 8 в право от линии + int 0x40 ; рисуем + pop ebx ; восстанавливаем нормальные координаты + ret ; Возвращаем управление + +;end_slider + +draw_value: + ;................................................................................................. + ; Вывод числа из строки в указанной области + ;................................................................................................. + push ebx ; сохраняем присланные координаты + mov ebx,10 ; устанавливаем основание системы счисления + mov edi,buff ; указатель на строку буфера + call int2ascii ; конвертируем число и ложим как строку в буфер + esi длина + mov eax,SF_DRAW_TEXT ; функция 4: написать текст в окне + pop ebx ; достаем из стека присланные координаты + cmp esi,2 ; ЦЕНТРИРОВАНИЕ ТЕКСТА + jne draw_value_1 + add ebx,4 shl 16 + jmp draw_value_e + draw_value_1: + cmp esi,1 + jne draw_value_e + add ebx,7 shl 16 + draw_value_e: + mov ecx,0x0 ; цвет текста RRGGBB + mov edx,buff ; указатель на начало текста + int 0x40 + ret ; Возвращаем управление +;end_draw_value + + _read_params: + + mov eax,dword[params+2] + mov dword[params_c+0],eax + + mov eax,dword[params+6] + mov dword[params_c+4],eax + + mov esi,params_c + mov ecx,16 + call ascii2int + mov [color],eax + + mov eax,dword[params+11] + mov dword[params_c+0],eax + + mov eax,dword[params+15] + mov dword[params_c+4],eax + + mov esi,params_c + mov ecx,16 + call ascii2int + mov [color2],eax + + ret + +hex_digit: + ;................................................................................................. + ; Преобразование в ASCII (вне зависимости от системы счисления) + ;................................................................................................. + cmp dl,10 ; в dl ожидается число от 0 до 15 + jb .less ; если dl<10 то переходим + add dl,'A'-10 ; 10->A 11->B 12->C ... + ret ; Возвращаем управление + .less: + or dl,'0' ; Если система счисления 10-я и менее + ret ; Возвращаем управление +;end_hex_digit + +int2ascii: + ;................................................................................................. + ; Преобразование числа в строку + ;................................................................................................. + ; eax - 32-х значное число + ; ebx - основание системы счисления + ; edi - указатель на строку буфера + ; Возвращает заполненный буфер и esi - длина строки + push edi + xor esi,esi ; зануляем счетчик символов + convert_loop: + xor edx,edx ; зануляем регистр под остаток + div ebx ; eax/ebx - остаток в edx + call hex_digit ; преобразуем символ + push edx ; ложим в стек + inc esi ; увеличиваем счетчик + test eax,eax ; если еще можно делить + jnz convert_loop ; то делием еще + cld ; ОБЯЗАТЕЛЬНО сбрасываем флаг направления DF (запись вперёд) + write_loop: ; иначе + pop eax ; достаем из стека в еах + stosb ; записываем в буфер по адресу ES:(E)DI + dec esi ; уменьшаем счетчик + test esi,esi ; если есть что доставать из стека + jnz write_loop ; то достаём + mov byte [edi],0 ; иначе дописыываем нулевой байт + pop edi + ; код ниже не имеет ничего общего к функции, просто возвращает еще длинну полученной строки + call str_len + mov esi,eax + ret ; и возвращаем управление +;end_int2ascii + +char2byte: + sub al,'0' + cmp al,10 + jb done + add al,'0' + and al,0x5f + sub al,'A'-10 + and al,0x0f + done: + ret +;end_char2byte + +ascii2int: + ;................................................................................................. + ; Преобразование строки в число + ;................................................................................................. + ; esi - указатель на нультерминированную строку + ; ecx - основание системы счисления + ; Возвращает eax - число + push esi + xor eax,eax + xor ebx,ebx + cmp byte [esi],'-' + jnz .next + inc esi + .next: + lodsb + or al,al + jz .done + call char2byte + imul ebx,ecx + add ebx,eax + jmp .next + .done: + xchg ebx,eax + pop esi + cmp byte [esi],'-' + jz .negate + ret + .negate: + neg eax + ret +;end_ascii2int + +get_spectr: + ;................................................................................................. + ; возвращает r,g,b состовляющие цвета + ;................................................................................................. + mov ecx,[color] + mov [cblue],cl + shr ecx,8 + mov [cgreen],cl + shr ecx,8 + mov [cred],cl + shr ecx,8 + mov [calpha],cl + ret ; и возвращаем управление +;end_get_spectr + +set_spectr: + ;................................................................................................. + ; устанавливает из r,g,b цвет + ;................................................................................................. + movzx eax,[calpha] + shl eax,8 + mov al,[cred] + shl eax,8 + mov al,[cgreen] + shl eax,8 + mov al,[cblue] + mov [color],eax + call draw_result ; Выводим результат + ret ; и возвращаем управление +;end_get_spectr + +str_len: + ;................................................................................................. + ; определяет длину строки (вход->EDI ZS offset ; выход->EAX ZS length) + ;................................................................................................. + push ecx esi edi + + cld + xor al, al + mov ecx, 0FFFFFFFFh + mov esi, edi + repne scasb + sub edi, esi + mov eax, edi + dec eax + + pop edi esi ecx + + ret +;end_str_len + + + ;------------------------------- + + proc random uses ebx ecx edx, max_value + mov ebx, 0 + mov eax, ebx + or eax, eax + jnz @f + rdtsc + xor eax, edx + mov ebx, eax + + @@: + xor edx, edx + mov ecx, 127773 + div ecx + mov ecx, eax + mov eax, 16807 + mul edx + mov edx, ecx + mov ecx, eax + mov eax, 2836 + mul edx + sub ecx, eax + xor edx, edx + mov eax, ecx + mov ebx, ecx + mov ecx, 100000 + div ecx + mov eax, edx + + xor edx, edx + mov ebx, [max_value] + div ebx + mov eax, edx + + ret + endp + +set_background2: + mcall SF_SYS_MISC, SSF_HEAP_INIT + mcall SF_SYS_MISC, SSF_MEM_ALLOC, 256 * 256 * 3 + mov [image], eax + + mov edx, eax + mov ecx, 256 * 256 + @@: + stdcall random, 15 + 1 + sub al, 15 / 2 + + mov bh, byte [color + 0] + add bh, al + mov [edx + 0], bh + mov bh, byte [color + 1] + add bh, al + mov [edx + 1], bh + mov bh, byte [color + 2] + add bh, al + mov [edx + 2], bh + add edx, 3 + loop @b + + mcall SF_BACKGROUND_SET, SSF_SIZE_BG, 256, 256 + mcall SF_BACKGROUND_SET, SSF_MODE_BG, 1 + mcall SF_BACKGROUND_SET, SSF_IMAGE_BG, [image], 0, 256 * 256 * 3 + mcall SF_BACKGROUND_SET, SSF_REDRAW_BG + + mcall SF_SYS_MISC, SSF_MEM_FREE, [image] + stdcall save_eskin_ini, 'B ' +ret + +align 4 +proc save_eskin_ini, opt_HB:dword + ;save to file eskin.ini + xor al,al + mov ecx,1024 + mov edi,sys_path+2 + repne scasb + sub edi,sys_path+3 + invoke ini_set_str, inifileeskin, amain, aprogram, sys_path+2, edi + ;add param 'H ' + mov eax,[opt_HB] + mov word[params],ax + mov eax,[color] + or eax,0xf ;для избежания вечного цикла если eax=0 + mov edi,params+2 + @@: + rol eax,8 + or al,al + jnz @f + mov word[edi],'00' ;нули перед числом + add edi,2 + jmp @b + @@: + and al,0xf0 + jnz @f + mov byte[edi],'0' + inc edi + @@: + mov eax,[color] + mov ebx,16 + call int2ascii + mov byte[params+10],' ' + ;add color2 + mov eax,[color2] + or eax,0xf ;для избежания вечного цикла если eax=0 + mov edi,params+11 + @@: + rol eax,8 + or al,al + jnz @f + mov word[edi],'00' ;нули перед числом + add edi,2 + jmp @b + @@: + and al,0xf0 + jnz @f + mov byte[edi],'0' + inc edi + @@: + mov eax,[color2] + mov ebx,16 + call int2ascii + + invoke ini_set_str, inifileeskin, amain, aparam, params, 19 + ret +endp + +;#___________________________________________________________________________________________________ +;****************************************************************************************************| +; БЛОК ПЕРЕМЕННЫХ И КОНСТАНТ | +;----------------------------------------------------------------------------------------------------/ +circle: + title db 'Palitra v0.77',0 ; хранит имя программы + hidden db 'Hidden',0 + hex db '#',0 ; для вывода решётки как текста + cname db 'RGBAx' ; хранит разряды цветов (red,green,blue) x-метка конца + larrow db 0x1A,0 + buff db '000',0 + bground db 'BACKGROUND',0 ; имя кнопки - 14 + bground1 db 'Gradient',0 ; имя кнопки - 14 + bground2 db 'Noisy',0 ; имя кнопки - 14 + runmode dd 1 ; режим запуска (1-normal, 2-hidden, 3-colordialog) + color2 dd 00FFFFFFh ; хранит значение второго выбранного цвета + + inifileeskin db '/sys/settings/system.ini',0 + amain db 'style',0 + aprogram db 'bg_program',0 + aparam db 'bg_param',0 + +align 16 +@IMPORT: + +library \ + libini , 'libini.obj' + +import libini, \ + ini_set_str, 'ini_set_str' + +I_END: + cm rb 12 + color rd 1 ; хранит значение выбранного цвета + mouse_x rd 1 ; хранит глобальную х координату мыши + mouse_y rd 1 ; хранит глобальную у координату мыши + mouse_f rd 1 ; хранит данные о том какая кнопка мыши была нажата + desctop_w rd 1 ; хранит ширину экрана + desctop_h rd 1 ; хранит высоту экрана + sc system_colors ; хранит структуру системных цветов скина + cred rb 1 ; храним красный спекрт + cgreen rb 1 ; храним зеленый спектр + cblue rb 1 ; храним синий спектр + calpha rb 1 ; храним прозрачность + pnext rd 1 ; счетчик переключения палитры + renmode rd 1 ; режим отрисовки (1-цветовая схема,2-пипетка,3-круговая) + params rb 20 ; приём параметров + params_c rb 9 ; приёмник для цвета + image rd 1 + + rd 1024 +stacktop: + sys_path rb 1024 +I_MEM: diff --git a/programs/media/palitra/trunk/panel.raw b/programs/media/palitra/panel.raw similarity index 100% rename from programs/media/palitra/trunk/panel.raw rename to programs/media/palitra/panel.raw diff --git a/programs/media/palitra/trunk/params_init.inc b/programs/media/palitra/params_init.inc similarity index 100% rename from programs/media/palitra/trunk/params_init.inc rename to programs/media/palitra/params_init.inc diff --git a/programs/media/palitra/trunk/readme.txt b/programs/media/palitra/readme.txt similarity index 100% rename from programs/media/palitra/trunk/readme.txt rename to programs/media/palitra/readme.txt diff --git a/programs/media/pic4/trunk/Tupfile.lua b/programs/media/pic4/Tupfile.lua similarity index 79% rename from programs/media/pic4/trunk/Tupfile.lua rename to programs/media/pic4/Tupfile.lua index 6b77c029b..fbfdb554b 100644 --- a/programs/media/pic4/trunk/Tupfile.lua +++ b/programs/media/pic4/Tupfile.lua @@ -1,5 +1,5 @@ if tup.getconfig("NO_FASM") ~= "" then return end -HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../../.." or tup.getconfig("HELPERDIR") +HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR") tup.include(HELPERDIR .. "/use_fasm.lua") add_include(tup.getvariantdir()) diff --git a/programs/media/pic4/trunk/build_en.bat b/programs/media/pic4/build_en.bat similarity index 100% rename from programs/media/pic4/trunk/build_en.bat rename to programs/media/pic4/build_en.bat diff --git a/programs/media/pic4/trunk/build_ru.bat b/programs/media/pic4/build_ru.bat similarity index 100% rename from programs/media/pic4/trunk/build_ru.bat rename to programs/media/pic4/build_ru.bat diff --git a/programs/media/pic4/trunk/pic4.asm b/programs/media/pic4/pic4.asm similarity index 93% rename from programs/media/pic4/trunk/pic4.asm rename to programs/media/pic4/pic4.asm index 6e7147292..ab1b9f0c2 100644 --- a/programs/media/pic4/trunk/pic4.asm +++ b/programs/media/pic4/pic4.asm @@ -1,599 +1,605 @@ -; -; BACKGROUND SET - Compile with fasm -; - use32 - org 0x0 - db 'MENUET01' ; 8 byte id - dd 0x01 ; version - dd START ; program start - dd I_END ; image size - dd mem ; reguired amount of memory - dd mem ; stack pointer - dd I_Param,0 - - include 'lang.inc' - include '..\..\..\macros.inc' -purge mov ; decrease kpack'ed size - -START: - mov eax,48 - mov ebx,3 - mov ecx,sc - mov edx,sizeof.system_colors - mcall - - cmp dword [I_Param], 'BOOT' - jz OnBoot - - call draw_window - - call load_texture - call draw_image - - -still: - - mov eax,10 ; wait here for event - mcall - - dec eax - jz red - dec eax - jnz button - - key: - mov al,2 - mcall - jmp still - - red: - call draw_window - jmp still - - button: - mov al,17 - mcall - - shr eax,8 - - cmp al,101 ; tiled - jne no101 - mov ecx,1 -setbgrmode: - mov eax,15 - mov ebx,4 - mcall - dec ebx - mcall - jmp still - no101: - - mov ecx, 2 - cmp al, 102 - jz setbgrmode - no102: - - cmp al,1 ; end program - jnz no_end - or eax,-1 - mcall - no_end: - - cmp al,11 - jz bg - cmp al,12 - jz bg - cmp al,13 - jz bg - - cmp al,121 - jb no_bg_select - cmp al,133 - ja no_bg_select - mov eax,[arrays + (eax-121)*4] - mov [usearray],eax - call load_texture - call draw_image - jmp still - no_bg_select: - - cmp al,14+20 - jge bg4 - - jmp bg2 - - -OnBoot: - - call load_texture - - mov eax,15 - mov ebx,1 - mov ecx,256 - mov edx,256 - mcall - - mov ebx,5 - mov ecx,image + 0 ; <<< +0 for blue, +1 for red, - ; <<< +2 for green background at boot - mov edx,0 - mov esi,256*3*256 - mcall - - dec ebx - mov ecx,2 - mcall - - dec ebx - mcall - - mov eax,-1 - mcall - - -; set background - -bg: - - mov edi,image - - cmp al,12 - jb bb1 - inc edi - bb1: - cmp al,13 - jb bb2 - inc edi - bb2: - - mov eax,15 - mov ebx,1 - mov ecx,256 - mov edx,256 - mcall - - mov ebx,5 - mov ecx,edi - mov edx,0 - mov esi,256*256*3 - mcall - - mov ebx,3 - mcall - - jmp still - - -; colored background - -bg2: - mov edi, eax - mcall 15,4,1 - mcall ,1,,1 - lea ecx, [(edi-14)*3+fill] - mcall ,5,,0,3*1*1 - mcall ,3 - - jmp still - - -; shaped background - -bg4: - - shl eax,3 - add eax,shape - (14+20)*8 - mov ecx,[eax+0] - mov edx,[eax+4] - - mov eax,15 - mov ebx,1 - mcall - - mov ebx,3 - mcall - - jmp still - - -; ********************************************* -; ******* CELLULAR TEXTURE GENERATION ********* -; **** by Cesare Castiglia (dixan/sk/mfx) ***** -; ********* dixan@spinningkids.org ********** -; ********************************************* -; * the algorythm is kinda simple. the color * -; * component for every pixel is evaluated * -; * according to the squared distance from * -; * the closest point in 'ptarray'. * -; ********************************************* - -load_texture: -gentexture: - - xor ecx,ecx ; ycounter - xor edi,edi ; pixel counter - - mov ebp,[usearray] - - ylup: - xor ebx,ebx - - xlup: - push edi - xor edi, edi - mov esi, 512000000 ; abnormous initial value :) - - pixlup: - push esi - mov eax,ebx ; evaluate first distance - sub eax, [ebp+edi] ; x-x1 - call wrappit - imul eax - mov esi, eax ; (x-x1)^2 - mov eax, ecx - add edi,4 - sub eax, [ebp+edi] ; y-y1 - call wrappit - imul eax ; (y-y1)^2 - add eax,esi ; (x-x1)^2+(y-y1)^2 - pop esi - - cmp esi,eax - jb ok ; compare and take the smaller one - mov esi,eax - - ok: - add edi,4 - cmp [ebp+edi],dword 777 - jne pixlup - - mov eax,esi ; now evaluate color... - - mov edi,24 ; 50 = max shaded distance - idiv edi - - pop edi - mov [image+edi],eax - add edi,3 - - add ebx,1 ; bounce x loop - cmp ebx,256 ; xsize - jne xlup - - add ecx,1 - cmp ecx,256 ; ysize - jne ylup - - ret - -wrappit: - cmp eax,0 ; this makes the texture wrap - jg noabs - neg eax - noabs: - cmp eax,128 - jb nowrap - neg eax - add eax,256 - nowrap: - ret - -; ********************************************* -; ******* WINDOW DEFINITIONS AND DRAW ********* -; ********************************************* - - -draw_image: - - mov eax,7 - mov ebx,image - mov ecx,256*65536+255 - mov edx,14*65536+40;55 - mcall - - ret - - -y_add equ 19 ; 30 -y_s equ 13 - -y_add2 equ 315 ;325 -set equ 0 ;15 - -draw_window: - - mov eax, 12 ; tell os about draw - mov ebx, 1 - mcall - - xor eax, eax ; define and draw window - mov ebx, 220*65536+293 - mov ecx, 50*65536+408 - mov edx, [sc.work] - or edx, 0x34000000 - mov edi, title - mcall - - call draw_image - - mov eax,8 ; Blue button - mov ebx,(set+190+27)*65536+17 - mov ecx,y_add*65536+y_s - mov edx,11 - mov esi,0x005555bb - mcall - ;mov eax,8 ; Red button - mov ebx,(set+208+27)*65536+17 - mov edx,12 - mov esi,0x00bb5555 - mcall - ;mov eax,8 ; Green button - mov ebx,(set+253)*65536+17 - mov edx,13 - mov esi,0x0055bb55 - mcall - - ;mov eax, 8 ; tiled - mov ebx, 90*65536+63 - mov ecx, y_add*65536+y_s - mov edx, 101 - mov esi, [sc.work_button] - mcall - - ;mov eax, 8 ; stretch - mov ebx, 154*65536+61 - mov edx, 102 - mcall - - mov eax, 4 - mov ebx, 215*65536+5 - mov ecx, [sc.work_text] - mov edx, apply_text - mov esi, apply_text.size - mcall - - mov ebx, 14*65536+301 - mov edx, image_buttons_text - mov esi, image_buttons_text.size - mcall - - mov ebx, 14*65536+(y_add2+27) - mov edx, simple_text - mov esi, simple_text.size - mcall - - mov ecx, (y_add2)*65536+20 - mov ebx, (13)*65536+25 - mov edx, 121 - mov esi, [sc.work_button] - mov edi, 9 - mov eax, 8 - @@: - mcall - add ebx, 29*65536 - inc edx - dec edi - jnz @b - - - mov edx, 34+4 - mov edi, 4 - ;mov eax, 8 - mov ebx, 13*65536+18 - mov ecx, y_add*65536+y_s - @@: - mcall - inc edx - add ebx, 19*65536 - dec edi - jnz @b - - - ;----------------------- - mov eax,8 - mov edx,14 ; button number - mov ebx,(13)*65536+17 ; button start x & size - mov ecx,(y_add2+40)*65536+14 ; button start y & size - - newcb: - mov esi,[(edx-14)*4+colors] - - mcall - - inc edx - add ebx,20*65536 - - cmp edx,27 - jnz newcb - ;----------------------- - - mov eax, 4 - mov ebx, 94*65536+4+y_add - mov ecx, [sc.work_button_text] - mov edx, la2 - mov esi, la2.size - mcall - - mov eax,12 - mov ebx,2 - mcall - - ret - - - -; DATA SECTION - -if lang eq ru_RU - title db 'Генератор фона рабочего стола',0 -else - title db 'Background',0 -end if - -lsz apply_text,\ - ru, "Применить:",\ - en, "Apply:" - -lsz image_buttons_text,\ - ru, "Выберите образец:",\ - en, "Select pattern:" - -lsz simple_text,\ - ru, "Одноцветный фон:",\ - en, "Single-color background:" - -lsz la2,\ - ru, "ЗАМОСТИТЬ РАСТЯНУТЬ",\ - en, " TILED STRETCH" - - -xx db 'x' - -colors: - dd 0x770000 - dd 0x007700 - dd 0x000077 - dd 0x777700 - dd 0x770077 - dd 0x007777 - dd 0x777777 - dd 0x335577 - dd 0x775533 - dd 0x773355 - dd 0x553377 - dd 0x111111 - dd 0xcccccc - -fill: - db 0x00,0x00,0x77 - db 0x00,0x77,0x00 - db 0x77,0x00,0x00 - db 0x00,0x77,0x77 - db 0x77,0x00,0x77 - db 0x77,0x77,0x00 - db 0x77,0x77,0x77 - db 0x77,0x55,0x33 - db 0x33,0x55,0x77 - db 0x55,0x33,0x77 - db 0x77,0x33,0x55 - db 0x11,0x11,0x11 - db 0xcc,0xcc,0xcc - -shape: - - dd 1024,64 - dd 1024,32 - dd 2048,32 - dd 4096,32 - - dd 512,16 - dd 1024,16 - dd 2048,16 - dd 4096,16 - - dd 64,32 - dd 64,16 - dd 32,32 - dd 8,8 - dd 16,16 - dd 64,64 - -usearray dd ptarray - -arrays dd ptarray,ptarray2,ptarray3,ptarray4,ptarray5,ptarray6 - dd ptarray7,ptarray8,ptarray9 - -ptarray: - - dd 105,205 - dd 135,225 - dd 211,75 - dd 205,189 - dd 228,249 - dd 160,43 - dd 127,78 - dd 54,43 - dd 83,54 - dd 5,155 - dd 231,34 - dd 244,132 - dd 7,223 - dd 221,224 - dd 777 ; <- end of array - -ptarray2: - - dd 255,255,205,205,155,155,105,105,55,55,5,5 - dd 205,105,105,205,55,155,155,55 - dd 777 - -ptarray3: - - dd 200,105,105,200,55,150,150,55 - dd 225,225,35,35 - dd 777 - -ptarray4: - - dd 59,255,59,191,59,127,59,59 - dd 191,223,191,159,191,105,191,27 - dd 777 - -ptarray5: - - dd 59,255,59,191,59,127,59,59 - dd 191,255,191,191,191,127,191,59 - dd 777 - -ptarray6: - - dd 206,206,127,205,45,205 - dd 205,127,127,127,45,127 - dd 205,45,127,45,45,45 - - dd 777 - -ptarray7: - - dd 255,255 - dd 59,59,191,191 - dd 127,255 - dd 255,127 - dd 191,191,59,191 - dd 59,59,191,59 - dd 127,127 - - dd 777 - -ptarray8: - - dd 255, 127 - dd 255, 127 - dd 127, 255 - dd 255, 127 - dd 127, 255 - dd 255, 127 - dd 127, 255 - dd 255, 127 - dd 127, 255 - dd 127, 127 - - dd 777 - -ptarray9: - - - dd 255,7,191,127,127,191,59,207,95,95,161,31,15,159,250,250,777 - - -I_END: -sc system_colors - -I_Param: - -image: - rb 256*256*3 + 4 - -align 100h -rb 100h ; it is enough for stack in this program -mem: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +; +; BACKGROUND SET - Compile with fasm +; + use32 + org 0x0 + db 'MENUET01' ; 8 byte id + dd 0x01 ; version + dd START ; program start + dd I_END ; image size + dd mem ; reguired amount of memory + dd mem ; stack pointer + dd I_Param,0 + + include 'lang.inc' + include '..\..\macros.inc' +purge mov ; decrease kpack'ed size + +START: + mov eax,48 + mov ebx,3 + mov ecx,sc + mov edx,sizeof.system_colors + mcall + + cmp dword [I_Param], 'BOOT' + jz OnBoot + + call draw_window + + call load_texture + call draw_image + + +still: + + mov eax,10 ; wait here for event + mcall + + dec eax + jz red + dec eax + jnz button + + key: + mov al,2 + mcall + jmp still + + red: + call draw_window + jmp still + + button: + mov al,17 + mcall + + shr eax,8 + + cmp al,101 ; tiled + jne no101 + mov ecx,1 +setbgrmode: + mov eax,15 + mov ebx,4 + mcall + dec ebx + mcall + jmp still + no101: + + mov ecx, 2 + cmp al, 102 + jz setbgrmode + no102: + + cmp al,1 ; end program + jnz no_end + or eax,-1 + mcall + no_end: + + cmp al,11 + jz bg + cmp al,12 + jz bg + cmp al,13 + jz bg + + cmp al,121 + jb no_bg_select + cmp al,133 + ja no_bg_select + mov eax,[arrays + (eax-121)*4] + mov [usearray],eax + call load_texture + call draw_image + jmp still + no_bg_select: + + cmp al,14+20 + jge bg4 + + jmp bg2 + + +OnBoot: + + call load_texture + + mov eax,15 + mov ebx,1 + mov ecx,256 + mov edx,256 + mcall + + mov ebx,5 + mov ecx,image + 0 ; <<< +0 for blue, +1 for red, + ; <<< +2 for green background at boot + mov edx,0 + mov esi,256*3*256 + mcall + + dec ebx + mov ecx,2 + mcall + + dec ebx + mcall + + mov eax,-1 + mcall + + +; set background + +bg: + + mov edi,image + + cmp al,12 + jb bb1 + inc edi + bb1: + cmp al,13 + jb bb2 + inc edi + bb2: + + mov eax,15 + mov ebx,1 + mov ecx,256 + mov edx,256 + mcall + + mov ebx,5 + mov ecx,edi + mov edx,0 + mov esi,256*256*3 + mcall + + mov ebx,3 + mcall + + jmp still + + +; colored background + +bg2: + mov edi, eax + mcall 15,4,1 + mcall ,1,,1 + lea ecx, [(edi-14)*3+fill] + mcall ,5,,0,3*1*1 + mcall ,3 + + jmp still + + +; shaped background + +bg4: + + shl eax,3 + add eax,shape - (14+20)*8 + mov ecx,[eax+0] + mov edx,[eax+4] + + mov eax,15 + mov ebx,1 + mcall + + mov ebx,3 + mcall + + jmp still + + +; ********************************************* +; ******* CELLULAR TEXTURE GENERATION ********* +; **** by Cesare Castiglia (dixan/sk/mfx) ***** +; ********* dixan@spinningkids.org ********** +; ********************************************* +; * the algorythm is kinda simple. the color * +; * component for every pixel is evaluated * +; * according to the squared distance from * +; * the closest point in 'ptarray'. * +; ********************************************* + +load_texture: +gentexture: + + xor ecx,ecx ; ycounter + xor edi,edi ; pixel counter + + mov ebp,[usearray] + + ylup: + xor ebx,ebx + + xlup: + push edi + xor edi, edi + mov esi, 512000000 ; abnormous initial value :) + + pixlup: + push esi + mov eax,ebx ; evaluate first distance + sub eax, [ebp+edi] ; x-x1 + call wrappit + imul eax + mov esi, eax ; (x-x1)^2 + mov eax, ecx + add edi,4 + sub eax, [ebp+edi] ; y-y1 + call wrappit + imul eax ; (y-y1)^2 + add eax,esi ; (x-x1)^2+(y-y1)^2 + pop esi + + cmp esi,eax + jb ok ; compare and take the smaller one + mov esi,eax + + ok: + add edi,4 + cmp [ebp+edi],dword 777 + jne pixlup + + mov eax,esi ; now evaluate color... + + mov edi,24 ; 50 = max shaded distance + idiv edi + + pop edi + mov [image+edi],eax + add edi,3 + + add ebx,1 ; bounce x loop + cmp ebx,256 ; xsize + jne xlup + + add ecx,1 + cmp ecx,256 ; ysize + jne ylup + + ret + +wrappit: + cmp eax,0 ; this makes the texture wrap + jg noabs + neg eax + noabs: + cmp eax,128 + jb nowrap + neg eax + add eax,256 + nowrap: + ret + +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ********* +; ********************************************* + + +draw_image: + + mov eax,7 + mov ebx,image + mov ecx,256*65536+255 + mov edx,14*65536+40;55 + mcall + + ret + + +y_add equ 19 ; 30 +y_s equ 13 + +y_add2 equ 315 ;325 +set equ 0 ;15 + +draw_window: + + mov eax, 12 ; tell os about draw + mov ebx, 1 + mcall + + xor eax, eax ; define and draw window + mov ebx, 220*65536+293 + mov ecx, 50*65536+408 + mov edx, [sc.work] + or edx, 0x34000000 + mov edi, title + mcall + + call draw_image + + mov eax,8 ; Blue button + mov ebx,(set+190+27)*65536+17 + mov ecx,y_add*65536+y_s + mov edx,11 + mov esi,0x005555bb + mcall + ;mov eax,8 ; Red button + mov ebx,(set+208+27)*65536+17 + mov edx,12 + mov esi,0x00bb5555 + mcall + ;mov eax,8 ; Green button + mov ebx,(set+253)*65536+17 + mov edx,13 + mov esi,0x0055bb55 + mcall + + ;mov eax, 8 ; tiled + mov ebx, 90*65536+63 + mov ecx, y_add*65536+y_s + mov edx, 101 + mov esi, [sc.work_button] + mcall + + ;mov eax, 8 ; stretch + mov ebx, 154*65536+61 + mov edx, 102 + mcall + + mov eax, 4 + mov ebx, 215*65536+5 + mov ecx, [sc.work_text] + mov edx, apply_text + mov esi, apply_text.size + mcall + + mov ebx, 14*65536+301 + mov edx, image_buttons_text + mov esi, image_buttons_text.size + mcall + + mov ebx, 14*65536+(y_add2+27) + mov edx, simple_text + mov esi, simple_text.size + mcall + + mov ecx, (y_add2)*65536+20 + mov ebx, (13)*65536+25 + mov edx, 121 + mov esi, [sc.work_button] + mov edi, 9 + mov eax, 8 + @@: + mcall + add ebx, 29*65536 + inc edx + dec edi + jnz @b + + + mov edx, 34+4 + mov edi, 4 + ;mov eax, 8 + mov ebx, 13*65536+18 + mov ecx, y_add*65536+y_s + @@: + mcall + inc edx + add ebx, 19*65536 + dec edi + jnz @b + + + ;----------------------- + mov eax,8 + mov edx,14 ; button number + mov ebx,(13)*65536+17 ; button start x & size + mov ecx,(y_add2+40)*65536+14 ; button start y & size + + newcb: + mov esi,[(edx-14)*4+colors] + + mcall + + inc edx + add ebx,20*65536 + + cmp edx,27 + jnz newcb + ;----------------------- + + mov eax, 4 + mov ebx, 94*65536+4+y_add + mov ecx, [sc.work_button_text] + mov edx, la2 + mov esi, la2.size + mcall + + mov eax,12 + mov ebx,2 + mcall + + ret + + + +; DATA SECTION + +if lang eq ru_RU + title db 'Генератор фона рабочего стола',0 +else + title db 'Background',0 +end if + +lsz apply_text,\ + ru, "Применить:",\ + en, "Apply:" + +lsz image_buttons_text,\ + ru, "Выберите образец:",\ + en, "Select pattern:" + +lsz simple_text,\ + ru, "Одноцветный фон:",\ + en, "Single-color background:" + +lsz la2,\ + ru, "ЗАМОСТИТЬ РАСТЯНУТЬ",\ + en, " TILED STRETCH" + + +xx db 'x' + +colors: + dd 0x770000 + dd 0x007700 + dd 0x000077 + dd 0x777700 + dd 0x770077 + dd 0x007777 + dd 0x777777 + dd 0x335577 + dd 0x775533 + dd 0x773355 + dd 0x553377 + dd 0x111111 + dd 0xcccccc + +fill: + db 0x00,0x00,0x77 + db 0x00,0x77,0x00 + db 0x77,0x00,0x00 + db 0x00,0x77,0x77 + db 0x77,0x00,0x77 + db 0x77,0x77,0x00 + db 0x77,0x77,0x77 + db 0x77,0x55,0x33 + db 0x33,0x55,0x77 + db 0x55,0x33,0x77 + db 0x77,0x33,0x55 + db 0x11,0x11,0x11 + db 0xcc,0xcc,0xcc + +shape: + + dd 1024,64 + dd 1024,32 + dd 2048,32 + dd 4096,32 + + dd 512,16 + dd 1024,16 + dd 2048,16 + dd 4096,16 + + dd 64,32 + dd 64,16 + dd 32,32 + dd 8,8 + dd 16,16 + dd 64,64 + +usearray dd ptarray + +arrays dd ptarray,ptarray2,ptarray3,ptarray4,ptarray5,ptarray6 + dd ptarray7,ptarray8,ptarray9 + +ptarray: + + dd 105,205 + dd 135,225 + dd 211,75 + dd 205,189 + dd 228,249 + dd 160,43 + dd 127,78 + dd 54,43 + dd 83,54 + dd 5,155 + dd 231,34 + dd 244,132 + dd 7,223 + dd 221,224 + dd 777 ; <- end of array + +ptarray2: + + dd 255,255,205,205,155,155,105,105,55,55,5,5 + dd 205,105,105,205,55,155,155,55 + dd 777 + +ptarray3: + + dd 200,105,105,200,55,150,150,55 + dd 225,225,35,35 + dd 777 + +ptarray4: + + dd 59,255,59,191,59,127,59,59 + dd 191,223,191,159,191,105,191,27 + dd 777 + +ptarray5: + + dd 59,255,59,191,59,127,59,59 + dd 191,255,191,191,191,127,191,59 + dd 777 + +ptarray6: + + dd 206,206,127,205,45,205 + dd 205,127,127,127,45,127 + dd 205,45,127,45,45,45 + + dd 777 + +ptarray7: + + dd 255,255 + dd 59,59,191,191 + dd 127,255 + dd 255,127 + dd 191,191,59,191 + dd 59,59,191,59 + dd 127,127 + + dd 777 + +ptarray8: + + dd 255, 127 + dd 255, 127 + dd 127, 255 + dd 255, 127 + dd 127, 255 + dd 255, 127 + dd 127, 255 + dd 255, 127 + dd 127, 255 + dd 127, 127 + + dd 777 + +ptarray9: + + + dd 255,7,191,127,127,191,59,207,95,95,161,31,15,159,250,250,777 + + +I_END: +sc system_colors + +I_Param: + +image: + rb 256*256*3 + 4 + +align 100h +rb 100h ; it is enough for stack in this program +mem: diff --git a/programs/media/startmus/trunk/STARTMUS.ASM b/programs/media/startmus/STARTMUS.ASM similarity index 95% rename from programs/media/startmus/trunk/STARTMUS.ASM rename to programs/media/startmus/STARTMUS.ASM index 4a91006c5..2a6e5f505 100644 --- a/programs/media/startmus/trunk/STARTMUS.ASM +++ b/programs/media/startmus/STARTMUS.ASM @@ -1,73 +1,77 @@ -use32 - db 'MENUET01' - dd 1 - dd start - dd i_end - dd 0x400 - dd 0x400 - dd 0,0 - -include '../../../macros.inc' - -start: - mov eax, 55 - mov ebx, eax - mov esi, melody2 - int 0x40 - mov eax, 5 - mov ebx, 1000 - int 0x40 - mov eax, -1 - int 0x40 - -melody1: - db 0xE4, 0x35, 0x99, 0x33, 0x99, 0x31, 0x99, 0x33 - db 0xE4, 0x35, 0x99, 0x35, 0x99, 0x36, 0x99, 0x38, 0x99, 0x3A - db 0xE4, 0x36, 0xE4, 0x36 - db 0xB2, 0xFF - db 0xE4, 0x33, 0x99, 0x31, 0x99, 0x2C, 0x99, 0x31 - db 0xE4, 0x33, 0xB2, 0x33, 0x99, 0x35, 0x99, 0x36 - db 0xE4, 0x35, 0xE4, 0x35 - db 0xB2, 0xFF - db 0x99, 0x35, 0x99, 0x36 - db 0xE4, 0x33, 0x99, 0x35, 0x99, 0x36 - db 0xB2, 0x33, 0x99, 0x35, 0x99, 0x36 - db 0xB2, 0x33, 0x99, 0x35, 0x99, 0x36 - db 0xE4, 0x39, 0xE4, 0x39 - db 0xB2, 0xFF - db 0x99, 0x35, 0x99, 0x36 - db 0xE4, 0x33, 0x99, 0x35, 0x99, 0x36 - db 0xB2, 0x33, 0x99, 0x35, 0x99, 0x36 - db 0xB2, 0x33, 0x99, 0x35, 0x99, 0x36 - db 0xE4, 0x35, 0xE4, 0x35 - db 0 - -melody2: - db 0x90, 0x31, 0x90, 0x33, 0x90, 0x35, 0x90, 0x36 - db 0xA0, 0xFF - db 0xA0, 0x06 - db 0x90, 0xFF - db 0xA0, 0x06 - db 0x90, 0xFF - db 0x90, 0x33, 0x90, 0x35, 0x90, 0x37, 0x90, 0x38 - db 0xA0, 0xFF - db 0xA0, 0x18 - db 0x90, 0xFF - db 0xA0, 0x18 - db 0x90, 0xFF - db 0x90, 0x33, 0x90, 0x35, 0x90, 0x37, 0x90, 0x38 - db 0xA0, 0xFF - db 0x90, 0x33, 0x90, 0x35, 0x90, 0x37, 0x90, 0x38 - db 0xA0, 0xFF - db 0x90, 0x31, 0x90, 0x33, 0x90, 0x35, 0x90, 0x36 - db 0xA0, 0xFF - db 0xA0, 0x16 - db 0x90, 0xFF - db 0xA0, 0x16 - db 0 - -melody3: - db 0x99, 0x31, 0xB2, 0x36, 0x99, 0x3A, 0xB2, 0x36 - db 0x99, 0x33, 0xB2, 0x28, 0xBC, 0x38 - db 0 -i_end: +; SPDX-License-Identifier: NOASSERTION +; + + +use32 + db 'MENUET01' + dd 1 + dd start + dd i_end + dd 0x400 + dd 0x400 + dd 0,0 + +include '../../macros.inc' + +start: + mov eax, 55 + mov ebx, eax + mov esi, melody2 + int 0x40 + mov eax, 5 + mov ebx, 1000 + int 0x40 + mov eax, -1 + int 0x40 + +melody1: + db 0xE4, 0x35, 0x99, 0x33, 0x99, 0x31, 0x99, 0x33 + db 0xE4, 0x35, 0x99, 0x35, 0x99, 0x36, 0x99, 0x38, 0x99, 0x3A + db 0xE4, 0x36, 0xE4, 0x36 + db 0xB2, 0xFF + db 0xE4, 0x33, 0x99, 0x31, 0x99, 0x2C, 0x99, 0x31 + db 0xE4, 0x33, 0xB2, 0x33, 0x99, 0x35, 0x99, 0x36 + db 0xE4, 0x35, 0xE4, 0x35 + db 0xB2, 0xFF + db 0x99, 0x35, 0x99, 0x36 + db 0xE4, 0x33, 0x99, 0x35, 0x99, 0x36 + db 0xB2, 0x33, 0x99, 0x35, 0x99, 0x36 + db 0xB2, 0x33, 0x99, 0x35, 0x99, 0x36 + db 0xE4, 0x39, 0xE4, 0x39 + db 0xB2, 0xFF + db 0x99, 0x35, 0x99, 0x36 + db 0xE4, 0x33, 0x99, 0x35, 0x99, 0x36 + db 0xB2, 0x33, 0x99, 0x35, 0x99, 0x36 + db 0xB2, 0x33, 0x99, 0x35, 0x99, 0x36 + db 0xE4, 0x35, 0xE4, 0x35 + db 0 + +melody2: + db 0x90, 0x31, 0x90, 0x33, 0x90, 0x35, 0x90, 0x36 + db 0xA0, 0xFF + db 0xA0, 0x06 + db 0x90, 0xFF + db 0xA0, 0x06 + db 0x90, 0xFF + db 0x90, 0x33, 0x90, 0x35, 0x90, 0x37, 0x90, 0x38 + db 0xA0, 0xFF + db 0xA0, 0x18 + db 0x90, 0xFF + db 0xA0, 0x18 + db 0x90, 0xFF + db 0x90, 0x33, 0x90, 0x35, 0x90, 0x37, 0x90, 0x38 + db 0xA0, 0xFF + db 0x90, 0x33, 0x90, 0x35, 0x90, 0x37, 0x90, 0x38 + db 0xA0, 0xFF + db 0x90, 0x31, 0x90, 0x33, 0x90, 0x35, 0x90, 0x36 + db 0xA0, 0xFF + db 0xA0, 0x16 + db 0x90, 0xFF + db 0xA0, 0x16 + db 0 + +melody3: + db 0x99, 0x31, 0xB2, 0x36, 0x99, 0x3A, 0xB2, 0x36 + db 0x99, 0x33, 0xB2, 0x28, 0xBC, 0x38 + db 0 +i_end: diff --git a/programs/media/startmus/trunk/Tupfile.lua b/programs/media/startmus/Tupfile.lua similarity index 100% rename from programs/media/startmus/trunk/Tupfile.lua rename to programs/media/startmus/Tupfile.lua diff --git a/programs/media/startmus/trunk/build.bat b/programs/media/startmus/build.bat similarity index 100% rename from programs/media/startmus/trunk/build.bat rename to programs/media/startmus/build.bat diff --git a/programs/media/voxel_editor/trunk/Transfiguration.vox b/programs/media/voxel_editor/Transfiguration.vox similarity index 100% rename from programs/media/voxel_editor/trunk/Transfiguration.vox rename to programs/media/voxel_editor/Transfiguration.vox diff --git a/programs/media/voxel_editor/trunk/Tupfile.lua b/programs/media/voxel_editor/Tupfile.lua similarity index 100% rename from programs/media/voxel_editor/trunk/Tupfile.lua rename to programs/media/voxel_editor/Tupfile.lua diff --git a/programs/media/voxel_editor/trunk/box.vox b/programs/media/voxel_editor/box.vox similarity index 100% rename from programs/media/voxel_editor/trunk/box.vox rename to programs/media/voxel_editor/box.vox diff --git a/programs/media/voxel_editor/trunk/build_ru.bat b/programs/media/voxel_editor/build_ru.bat similarity index 100% rename from programs/media/voxel_editor/trunk/build_ru.bat rename to programs/media/voxel_editor/build_ru.bat diff --git a/programs/media/voxel_editor/trunk/cursors.png b/programs/media/voxel_editor/cursors.png similarity index 100% rename from programs/media/voxel_editor/trunk/cursors.png rename to programs/media/voxel_editor/cursors.png diff --git a/programs/media/voxel_editor/trunk/cursors_gr.png b/programs/media/voxel_editor/cursors_gr.png similarity index 100% rename from programs/media/voxel_editor/trunk/cursors_gr.png rename to programs/media/voxel_editor/cursors_gr.png diff --git a/programs/media/voxel_editor/trunk/home_19_et.vox b/programs/media/voxel_editor/home_19_et.vox similarity index 100% rename from programs/media/voxel_editor/trunk/home_19_et.vox rename to programs/media/voxel_editor/home_19_et.vox diff --git a/programs/media/voxel_editor/trunk/house0.vox b/programs/media/voxel_editor/house0.vox similarity index 100% rename from programs/media/voxel_editor/trunk/house0.vox rename to programs/media/voxel_editor/house0.vox diff --git a/programs/media/voxel_editor/trunk/house1.vox b/programs/media/voxel_editor/house1.vox similarity index 100% rename from programs/media/voxel_editor/trunk/house1.vox rename to programs/media/voxel_editor/house1.vox diff --git a/programs/media/voxel_editor/trunk/house2.vox b/programs/media/voxel_editor/house2.vox similarity index 100% rename from programs/media/voxel_editor/trunk/house2.vox rename to programs/media/voxel_editor/house2.vox diff --git a/programs/media/voxel_editor/trunk/squirrel.vox b/programs/media/voxel_editor/squirrel.vox similarity index 100% rename from programs/media/voxel_editor/trunk/squirrel.vox rename to programs/media/voxel_editor/squirrel.vox diff --git a/programs/media/voxel_editor/trunk/str.inc b/programs/media/voxel_editor/str.inc similarity index 100% rename from programs/media/voxel_editor/trunk/str.inc rename to programs/media/voxel_editor/str.inc diff --git a/programs/media/voxel_editor/trunk/toolbar.png b/programs/media/voxel_editor/toolbar.png similarity index 100% rename from programs/media/voxel_editor/trunk/toolbar.png rename to programs/media/voxel_editor/toolbar.png diff --git a/programs/media/voxel_editor/trunk/uaz3741.vox b/programs/media/voxel_editor/uaz3741.vox similarity index 100% rename from programs/media/voxel_editor/trunk/uaz3741.vox rename to programs/media/voxel_editor/uaz3741.vox diff --git a/programs/media/voxel_editor/utilites/vox_creator.asm b/programs/media/voxel_editor/utilites/vox_creator.asm index 328fc100e..bba50a68b 100644 --- a/programs/media/voxel_editor/utilites/vox_creator.asm +++ b/programs/media/voxel_editor/utilites/vox_creator.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + use32 org 0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт @@ -8,13 +14,13 @@ include '../../../proc32.inc' include '../../../KOSfuncs.inc' include '../../../load_img.inc' include '../../../load_lib.mac' -include '../trunk/str.inc' +include '../str.inc' include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US. vox_offs_tree_table equ 4 vox_offs_data equ 12 txt_buf rb 8 -include '../trunk/vox_rotate.inc' +include '../vox_rotate.inc' @use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load if lang eq ru_RU diff --git a/programs/media/voxel_editor/utilites/vox_mover.asm b/programs/media/voxel_editor/utilites/vox_mover.asm index b80283491..4baa219ec 100644 --- a/programs/media/voxel_editor/utilites/vox_mover.asm +++ b/programs/media/voxel_editor/utilites/vox_mover.asm @@ -1,3 +1,9 @@ +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + use32 org 0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт @@ -8,9 +14,9 @@ include '../../../proc32.inc' include '../../../KOSfuncs.inc' include '../../../load_img.inc' include '../../../load_lib.mac' -include '../trunk/vox_draw.inc' -include '../trunk/vox_rotate.inc' -include '../trunk/str.inc' +include '../vox_draw.inc' +include '../vox_rotate.inc' +include '../str.inc' include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US. @use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load diff --git a/programs/media/voxel_editor/utilites/vox_tgl.asm b/programs/media/voxel_editor/utilites/vox_tgl.asm index b9d4785e9..98e4afe1d 100644 --- a/programs/media/voxel_editor/utilites/vox_tgl.asm +++ b/programs/media/voxel_editor/utilites/vox_tgl.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 '../../../load_lib.mac' include '../../../develop/libraries/TinyGL/asm_fork/opengl_const.inc' include '../../../develop/libraries/TinyGL/asm_fork/zbuffer.inc' include 'vox_3d.inc' -include '../trunk/str.inc' +include '../str.inc' include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US. @use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load diff --git a/programs/media/voxel_editor/trunk/vaz2106.vox b/programs/media/voxel_editor/vaz2106.vox similarity index 100% rename from programs/media/voxel_editor/trunk/vaz2106.vox rename to programs/media/voxel_editor/vaz2106.vox diff --git a/programs/media/voxel_editor/trunk/vox_draw.inc b/programs/media/voxel_editor/vox_draw.inc similarity index 100% rename from programs/media/voxel_editor/trunk/vox_draw.inc rename to programs/media/voxel_editor/vox_draw.inc diff --git a/programs/media/voxel_editor/trunk/vox_editor.ini b/programs/media/voxel_editor/vox_editor.ini similarity index 100% rename from programs/media/voxel_editor/trunk/vox_editor.ini rename to programs/media/voxel_editor/vox_editor.ini diff --git a/programs/media/voxel_editor/trunk/vox_rotate.inc b/programs/media/voxel_editor/vox_rotate.inc similarity index 100% rename from programs/media/voxel_editor/trunk/vox_rotate.inc rename to programs/media/voxel_editor/vox_rotate.inc diff --git a/programs/media/voxel_editor/trunk/voxel_editor.asm b/programs/media/voxel_editor/voxel_editor.asm similarity index 95% rename from programs/media/voxel_editor/trunk/voxel_editor.asm rename to programs/media/voxel_editor/voxel_editor.asm index 68394bc8b..b8484d5d5 100644 --- a/programs/media/voxel_editor/trunk/voxel_editor.asm +++ b/programs/media/voxel_editor/voxel_editor.asm @@ -1,2003 +1,2009 @@ -use32 - org 0 - db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт - dd 1, start, i_end, mem, stacktop, openfile_path, sys_path - -include '../../../macros.inc' -include '../../../proc32.inc' -include '../../../KOSfuncs.inc' -include '../../../load_img.inc' -include '../../../load_lib.mac' -include 'vox_draw.inc' -include 'vox_rotate.inc' -include 'str.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Voxel editor 22.03.18',0 ;подпись окна - -IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 -image_data_toolbar dd 0 -cursors_count equ 4 - -;значения задаваемые по умолчанию, без ini файла -ini_def_window_t equ 10 -ini_def_window_l equ 10 -ini_def_window_w equ 550 -ini_def_window_h equ 415 -ini_def_buf_w equ 198 ;=192+6 -ini_def_buf_h equ 231 ;=224+7 -ini_def_s_zoom equ 5 -ini_def_t_size equ 10 -ini_def_color_b equ 0xffffff -;описание параматров для ini файла -ini_name db 'vox_editor.ini',0 -ini_sec_window db 'Window',0 -key_window_t db 't',0 -key_window_l db 'l',0 -key_window_w db 'w',0 -key_window_h db 'h',0 -key_buf_w db 'buf_w',0 -key_buf_h db 'buf_h',0 -ini_sec_options db 'Options',0 -key_s_zoom db 's_zoom',0 -key_t_size db 'tile_size',0 -key_f_size db 'file_size',0 -key_col_b db 'c_background',0 - -OT_MAP_X equ 0 -OT_MAP_Y equ 0 -OT_CAPT_X_COLOR equ 5 ;отступ для подписи цвета -OT_CAPT_Y_COLOR equ 30 -PEN_MODE_NONE equ -1 -PEN_MODE_CLEAR equ 0 ;режим стирания -PEN_MODE_SELECT_COLOR equ 2 ;режим выбора цвета -PEN_MODE_BRUSH equ 3 ;режим работы с кистью - -run_file_70 FileInfoBlock - -align 4 -start: - load_libraries l_libs_start,l_libs_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,l_libs_end - jl .test_lib_open - mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors - mcall SF_SET_EVENTS_MASK,0xC0000027 - stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога - -;--- load ini file --- - copy_path ini_name,sys_path,file_name,0 - ;window startup pozition - stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_l,ini_def_window_l - mov word[wnd_s_pos+2],ax - stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_w,ini_def_window_w - mov word[wnd_s_pos],ax - stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_t,ini_def_window_t - mov word[wnd_s_pos+6],ax - stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_h,ini_def_window_h - mov word[wnd_s_pos+4],ax - ;image buffer size - stdcall dword[ini_get_int],file_name,ini_sec_window,key_buf_w,ini_def_buf_w - mov [buf_0.w],eax - mov [buf_0z.w],eax - add ax,15 - mov [buf_pl.l],ax ;отступ для правого окна - stdcall dword[ini_get_int],file_name,ini_sec_window,key_buf_h,ini_def_buf_h - mov [buf_0.h],eax - mov [buf_0z.h],eax - ;цвет фона - stdcall dword[ini_get_color],file_name,ini_sec_window,key_col_b,ini_def_color_b - mov [buf_0.color],eax - mov [buf_pl.color],eax - - ;мастаб, после которого будет увеличение - stdcall dword[ini_get_int],file_name,ini_sec_options,key_s_zoom,ini_def_s_zoom - mov [scaled_zoom],eax - ;размер квадратика на плоскости сечения - stdcall dword[ini_get_int],file_name,ini_sec_options,key_t_size,ini_def_t_size - mov [tile_size],eax - - stdcall dword[ini_get_int],file_name,ini_sec_options,key_f_size,64 - shl eax,10 - mov [max_open_file_size],eax - - mov ecx,[scaled_zoom] - xor eax,eax - inc eax - shl eax,cl - imul eax,[tile_size] - mov [buf_pl.w],eax - add eax,[tile_size] - mov [buf_pl.h],eax - - ;*** загрузка курсоров - include_image_file 'cursors_gr.png',image_data_toolbar - stdcall [buf2d_create_f_img], buf_curs_8,[image_data_toolbar] ;создаем буфер - stdcall mem.Free,[image_data_toolbar] ;освобождаем память - - include_image_file 'cursors.png',image_data_toolbar - stdcall [buf2d_create_f_img], buf_curs,[image_data_toolbar] ;создаем буфер - stdcall mem.Free,[image_data_toolbar] ;освобождаем память - - 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 [buf2d_create], buf_0 ;создание буфера изображения - stdcall [buf2d_create], buf_0z ;создание буфера глубины - stdcall [buf2d_create], buf_pl ;создание буфера для сечения - - stdcall [buf2d_vox_brush_create], buf_vox_g3, vox_6_7_z - stdcall [buf2d_vox_brush_create], buf_vox_g2, vox_6_4_z - - include_image_file 'toolbar.png', image_data_toolbar - - stdcall mem.Alloc,[max_open_file_size] - mov dword[open_file_vox],eax - - call but_new_file - - ;первоначальная установка курсора - stdcall set_pen_mode,1,0,((9 shl 8)+9) shl 16 ;pen - - ;проверка командной строки - cmp dword[openfile_path],0 - je @f - call but_open_file_cmd_lin - @@: - -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 - mcall SF_THREAD_INFO,procinfo,-1 - cmp ax,word[procinfo+4] - jne @f ;окно не активно - call mouse - @@: - jmp still - -align 4 -mouse: - pushad - mcall SF_MOUSE_GET,SSF_BUTTON - bt eax,1 ;right button - jnc @f - mcall SF_MOUSE_GET,SSF_WINDOW_POSITION - mov ebx,eax - shr ebx,16 - and eax,0xffff - stdcall get_buf_color, buf_0 - stdcall get_buf_color, buf_pl - jmp .end_f - @@: - bt eax,0 ;left button - jnc .end_f - mcall SF_MOUSE_GET,SSF_WINDOW_POSITION - mov ebx,eax - shr ebx,16 - and eax,0xffff - - cmp dword[v_pen_mode],PEN_MODE_SELECT_COLOR - jne .end_2 - stdcall get_buf_color, buf_0 - stdcall get_buf_color, buf_pl - jmp .end_f - .end_2: - - - push eax ebx - mov edx,[v_zoom] - cmp edx,[scaled_zoom] - jle @f - ;режим масштабирования изображения - sub edx,[scaled_zoom] - sub ax,word[buf_0.t] - sub bx,word[buf_0.l] - stdcall get_mouse_ev_scale, [buf_vox], ebx, eax, [scaled_zoom],edx - cmp eax,0 - je @f - mov ebx,eax - and eax,0x3fffffff - rol ebx,2 - and ebx,3 - dec ebx - - shl ebx,2 - add ebx,cam_x - mov dword[ebx],eax ;change [cam_x] or [cam_y] or [cam_z] - call draw_objects - - pop ebx eax - jmp .end_f - @@: - pop ebx eax - - - ;eax - mouse coord y - ;ebx - mouse coord x - movzx edx,word[buf_pl.t] - add edx,OT_MAP_Y - cmp eax,edx - jl .end_f - sub eax,edx - xor edx,edx - mov ecx,[tile_size] ;H - div ecx - movzx edx,word[buf_pl.l] - add edx,OT_MAP_X - cmp ebx,edx - jl .end_f - call convert_y ;преобразование координаты y - cmp eax,0 - jge .end_0 ;ограничение по нижней координате y - cmp eax,-1 - jne .end_f - ;меняем сечение, попали на квадратик - sub ebx,edx - mov eax,ebx - xor edx,edx - mov ecx,[tile_size] ;W - div ecx - mov [n_plane],eax - jmp .end_1 - .end_0: - mov [v_cur_y],eax ;Y-coord - sub ebx,edx - mov eax,ebx - xor edx,edx - mov ecx,[tile_size] ;W - div ecx - mov [v_cur_x],eax ;X-coord - - cmp dword[v_pen_mode],PEN_MODE_CLEAR - jl .end_1 - cmp dword[v_pen_mode],1 - jg .end_1 - mov eax,[v_cur_x] - mov ebx,[n_plane] - mov edx,[v_cur_y] - - mov ecx,[v_zoom] - cmp ecx,[scaled_zoom] - jle .no_c_coord_0 - ;преобразование координат, с учетом увеличения - ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) - mov ecx,[scaled_zoom] - - mov edi,[cam_x] - shl edi,cl - add eax,edi - mov edi,[cam_y] - shl edi,cl - add ebx,edi - mov edi,[cam_z] - shl edi,cl - add edx,edi - .no_c_coord_0: - - ;отличающийся параметр для функции создания вокселя - cmp dword[v_pen_mode],1 - jne @f - push dword[v_color] - @@: - - mov ecx,dword[v_zoom] - mov edi,eax - mov esi,ebx - mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS - and eax,3 ;3 -> бит 0 левый Shift нажат, бит 1 правый Shift нажат - jz .shift_end - ;если нажат Shift, то редактируем на верхнем уровне - ;для этого все координаты делим на 2 а от мастаба отнимаем 1 - shr edx,1 - shr esi,1 - shr edi,1 - dec ecx - .shift_end: - - ;вызов общих параметров для функций - push ecx edx esi edi - push dword[open_file_vox] - - ;вызов функций - cmp dword[v_pen_mode],1 - jne @f - call buf2d_vox_obj_create_node - ;stdcall buf2d_vox_obj_create_node, [open_file_vox], edi,esi,edx, [v_zoom], [v_color] - jmp .end_1 - @@: - call buf2d_vox_obj_delete_node - ;stdcall buf2d_vox_obj_delete_node, [open_file_vox], edi,esi,edx, [v_zoom] - - .end_1: - call draw_objects - call draw_pok - .end_f: - popad - ret - -;input: -; eax - coord y -; ebx - coord x -align 4 -proc get_buf_color, buf:dword -pushad - mov edi,[buf] - cmp ax,buf2d_t - jl .end_f - sub ax,buf2d_t - cmp eax,buf2d_h - jg .end_f - cmp bx,buf2d_l - jl .end_f - sub bx,buf2d_l - cmp ebx,buf2d_w - jg .end_f - stdcall [buf2d_get_pixel], edi,ebx,eax - mov [v_color],eax - call on_change_color ;отображаем изменения цвета - .end_f: -popad - ret -endp - -;преобразовываем координату y (значение должно увеличиваться с низу вверх) -align 4 -convert_y: - push ecx edx - mov ecx,[v_zoom] - cmp ecx,[scaled_zoom] - jle @f - mov ecx,[scaled_zoom] - @@: - mov edx,1 - cmp ecx,1 - jl @f - shl edx,cl - @@: - sub edx,eax - dec edx - mov eax,edx - pop edx ecx - ret - -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,dword[wnd_s_pos],dword[wnd_s_pos+4] - - ; *** создание кнопок на панель *** - mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,3,[sc.work_button] - - mov ebx,(30 shl 16)+20 - inc edx - int 0x40 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - add ebx,25 shl 16 - inc edx - int 0x40 - add ebx,25 shl 16 - inc edx - 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) ;увелич. масштаб - 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) ;camera 3g 2g - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;поворот z - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;поворот x - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;поворот y - 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) ;инструмент карандаш - 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) ;выбор цвета - 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) ;рендер 2*2 - 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) ;удалить кисть - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;ширина кисти -1 - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;ширина кисти +1 - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;высота кисти -1 - int 0x40 - add ebx,IMAGE_TOOLBAR_ICON_SIZE - add edx,(25 shl 16) ;высота кисти +1 - 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) ;повернуть кисть 90 гр. - int 0x40 - - ; *** рисование буферов *** - call draw_objects - call draw_pok - - mcall SF_REDRAW,SSF_END_DRAW -popad - ret - -align 4 -draw_pok: - mov eax,SF_DRAW_NUMBER - mov ecx,[v_zoom] - mov ebx,(3 shl 16)+(1 shl 31) - mov edx,((350+6*9) shl 16)+OT_CAPT_Y_COLOR+2 - mov esi,[sc.work_button_text] - or esi,(1 shl 30) - mov edi,[sc.work_button] - int 0x40 ;масштаб - mov ecx,[n_plane] - add edx,115 shl 16 ;9 - int 0x40 ;номер сечения - - ;обновление параметров курсора - mov dword[txt_curor.size],0 - mov eax,dword[v_cur_x] - mov edi,txt_curor.size - stdcall convert_int_to_str,10 - stdcall str_cat, edi,txt_mull - mov eax,dword[v_cur_y] - mov edi,txt_buf - stdcall convert_int_to_str,16 - stdcall str_cat, txt_curor.size,edi - stdcall str_cat, txt_curor.size,txt_space ;завершающий пробел - - ;обновление параметров кисти - mov dword[txt_brush.size],0 - mov eax,dword[brush_w] - mov edi,txt_brush.size - stdcall convert_int_to_str,10 - stdcall str_cat, edi,txt_mull - mov eax,dword[brush_h] - mov edi,txt_buf - stdcall convert_int_to_str,16 - stdcall str_cat, txt_brush.size,edi - stdcall str_cat, txt_brush.size,txt_space ;завершающий пробел - - mov ecx,[sc.work_text] - or ecx,0x80000000 ;or (1 shl 30) - mov edx,txt_color - mcall SF_DRAW_TEXT,(OT_CAPT_X_COLOR shl 16)+OT_CAPT_Y_COLOR+2 - - mov edx,txt_curor - add ebx,115 shl 16 - or ecx,(1 shl 30) - mov edi,[sc.work] - int 0x40 - - mov edx,txt_brush - add ebx,115 shl 16 - int 0x40 - - mov edx,txt_zoom - add ebx,115 shl 16 - int 0x40 - - mov edx,txt_n_plane - add ebx,115 shl 16 - int 0x40 - - call on_change_color - ret - -align 4 -on_change_color: -pushad - mcall SF_DRAW_RECT,((OT_CAPT_X_COLOR+35) shl 16)+16,(OT_CAPT_Y_COLOR shl 16)+12,[v_color] - - mov ecx,edx - mov edx,((OT_CAPT_X_COLOR+55) shl 16)+OT_CAPT_Y_COLOR+2 - mov esi,[sc.work_text] - add esi,(1 shl 30) - mov edi,[sc.work] - mcall SF_DRAW_NUMBER,(1 shl 8)+(6 shl 16) -popad - ret - -align 4 -key: - mcall SF_GET_KEY - jmp still - - -align 4 -button: - mcall SF_GET_BUTTON - cmp ah,3 - jne @f - call but_new_file - call draw_objects - call draw_pok - @@: - 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_camera_3g_2g - @@: - cmp ah,7 - jne @f - call but_zoom_p - @@: - cmp ah,8 - jne @f - call but_zoom_m - @@: - cmp ah,9 - jne @f - call but_r_z - @@: - cmp ah,10 - jne @f - call but_r_x - @@: - cmp ah,11 - jne @f - call but_r_y - @@: - cmp ah,12 - jne @f - call but_plane_inc - @@: - cmp ah,13 - jne @f - call but_plane_dec - @@: - cmp ah,14 - jne @f - call but_mode_pen - @@: - cmp ah,15 - jne @f - call but_mode_brush - @@: - cmp ah,16 - jne @f - call but_mode_clear - @@: - cmp ah,17 - jne @f - stdcall set_pen_mode,PEN_MODE_SELECT_COLOR,3,((9 shl 8)+9) shl 16 - call draw_palete - @@: - cmp ah,18 - jne @f - call but_light - @@: - cmp ah,19 - jne @f - call but_rend_2_2 - @@: - cmp ah,20 - jne @f - call but_brush_copy - @@: - cmp ah,21 - jne @f - call but_brush_draw - @@: - cmp ah,22 - jne @f - call but_brush_clear - @@: - cmp ah,23 - jne @f - call but_bru_w_m - @@: - cmp ah,24 - jne @f - call but_bru_w_p - @@: - cmp ah,25 - jne @f - call but_bru_h_m - @@: - cmp ah,26 - jne @f - call but_bru_h_p - @@: - cmp ah,27 - jne @f - call but_bru_flip_h - @@: - cmp ah,28 - jne @f - call but_bru_flip_v - @@: - cmp ah,29 - jne @f - call but_bru_rot_90 - @@: - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 - stdcall [buf2d_delete],buf_0z - cmp dword[buf_r_img],0 - je @f - stdcall [buf2d_delete],buf_r_img - stdcall [buf2d_delete],buf_r_z - @@: - stdcall [buf2d_vox_brush_delete], buf_vox_g3 - stdcall [buf2d_vox_brush_delete], buf_vox_g2 - stdcall [buf2d_delete],buf_curs - stdcall [buf2d_delete],buf_curs_8 - stdcall mem.Free,[image_data_toolbar] - stdcall mem.Free,[open_file_vox] - mcall SF_TERMINATE_PROCESS - -;данные для инициализации воксельного объекта -align 4 -vox_new_data: - db 2,0,0,0 - db 0,1,2,3,4,5,6,7 ;default table - dd 0 ;null node - -;инициализация воксельного объекта -align 4 -proc but_new_file uses ecx edi esi - mov ecx,vox_offs_data+4 - mov esi,vox_new_data - mov edi,[open_file_vox] - cld - rep movsb - ret -endp - -align 4 -open_file_vox dd 0 ;указатель на область для открытия файлов - -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 - ;код при удачном открытии диалога - - call but_open_file_cmd_lin - call draw_objects - .end_open_file: - popad - ret - -align 4 -but_open_file_cmd_lin: - pushad - 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: размер файла в байтах - cmp ecx,[max_open_file_size] ;проверяем размер выделенной памяти - jle @f - mov [max_open_file_size],ecx - stdcall mem.ReAlloc,[open_file_vox],ecx - mov [open_file_vox],eax - notify_window_run txt_need_memory - @@: - - 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_vox] - 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 - - mcall SF_SET_CAPTION,1,openfile_path - - ;--- - mov eax,[open_file_vox] - movzx eax,byte[eax] - and eax,0xff ;берем масштаб по умолчанию - mov dword[v_zoom],eax ;берем масштаб по умолчанию - mov dword[cam_x],0 - mov dword[cam_y],0 - mov dword[cam_z],0 - .end_open_file: - 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,dword[v_zoom] ;задаем масштаб по умолчанию - mov ebx,[open_file_vox] - mov byte[ebx],al - - stdcall buf2d_vox_obj_get_size, ebx - mov dword[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_vox] - 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 ;загружаем файл изображения - cmp ebx,0xffffffff - je .end_save_file - - .end_save_file: - popad - ret - -;смена вида камеры на просмотр 3 и 2 граней -align 4 -but_camera_3g_2g: - cmp dword[buf_vox],buf_vox_g3 - je @f - mov dword[buf_vox],buf_vox_g3 - jmp .end_0 - @@: - mov dword[buf_vox],buf_vox_g2 - .end_0: - call draw_objects - ret - -;увеличение масштаба -align 4 -but_zoom_p: - cmp dword[v_zoom],10 ;максимальный размер, до которого можно увеличить 2^10=1024 - jge @f - inc dword[v_zoom] - shl dword[n_plane],1 - push eax - mov eax,[v_zoom] - cmp eax,[scaled_zoom] - jl .end_0 - push ecx - mov ecx,[scaled_zoom] - xor eax,eax - inc eax - shl eax,cl - shl dword[cam_x],1 - shl dword[cam_y],1 - shl dword[cam_z],1 - cmp eax,[n_plane] - jg .end_1 - ;коректировка ползунка - sub [n_plane],eax - inc dword[cam_y] - .end_1: - pop ecx - .end_0: - pop eax - call draw_objects - call draw_pok - @@: - ret - -;уменьшение масштаба -align 4 -but_zoom_m: - cmp dword[v_zoom],1 - jl @f - dec dword[v_zoom] - shr dword[n_plane],1 - push eax - mov eax,[v_zoom] - cmp eax,[scaled_zoom] - jl .end_0 - shr dword[cam_x],1 - shr dword[cam_y],1 - jnc .end_1 - ;коректировка ползунка - push ecx - mov ecx,[scaled_zoom] - dec ecx - xor eax,eax - inc eax - shl eax,cl - add [n_plane],eax - pop ecx - .end_1: - shr dword[cam_z],1 - .end_0: - pop eax - call draw_objects - call draw_pok - @@: - ret - -align 4 -but_r_z: - stdcall vox_obj_rot_z, [open_file_vox] - call draw_objects - ret - -align 4 -but_r_x: - stdcall vox_obj_rot_x, [open_file_vox] - call draw_objects - ret - -align 4 -but_r_y: - stdcall vox_obj_rot_y, [open_file_vox] - call draw_objects - ret - -;сдвигаем плоскость среза -align 4 -but_plane_inc: -push eax ecx - inc dword[n_plane] - mov eax,[v_zoom] - cmp eax,[scaled_zoom] - jle .end_0 - ;происходит масштабирование - mov ecx,[scaled_zoom] - xor eax,eax - inc eax - shl eax,cl - cmp eax,[n_plane] - jg @f - mov dword[n_plane],0 - inc dword[cam_y] ;переходим в соседний куб - neg ecx - ;inc ecx - add ecx,[v_zoom] - xor eax,eax - inc eax - shl eax,cl - cmp eax,[cam_y] - jg @f - mov dword[cam_y],0 ;зацикливаем если вылезли за пределы последнего куба - @@: - jmp .end_1 - .end_0: - ;масштабирование не происходит - mov ecx,eax - xor eax,eax - inc eax - shl eax,cl - cmp eax,[n_plane] - jg .end_1 - mov dword[n_plane],0 - .end_1: - call draw_objects - call draw_pok -pop ecx eax - ret - -;сдвигаем плоскость среза -align 4 -but_plane_dec: - dec dword[n_plane] - cmp dword[n_plane],0 - jge .end_f -push eax ecx - mov ecx,[scaled_zoom] - xor eax,eax - inc eax - shl eax,cl - dec eax - mov dword[n_plane],eax - - mov eax,[v_zoom] - cmp eax,[scaled_zoom] - jle .end_0 - ;происходит масштабирование - dec dword[cam_y] ;переходим в соседний куб - cmp dword[cam_y],0 - jge .end_0 - - mov ecx,eax - sub ecx,[scaled_zoom] - xor eax,eax - inc eax - shl eax,cl - dec eax - mov dword[cam_y],eax ;если номер куба оказался меньше 0 исправляем на максимальное значение - .end_0: -pop ecx eax - .end_f: - call draw_objects - call draw_pok - ret - -align 4 -but_mode_pen: - push eax - mov eax,dword[v_pen_mode] - stdcall set_pen_mode,1,0,((9 shl 8)+9) shl 16 ;pen - cmp eax,PEN_MODE_SELECT_COLOR - jne @f - call draw_objects - @@: - pop eax - ret - -align 4 -but_mode_brush: - push eax - mov eax,dword[v_pen_mode] - stdcall set_pen_mode,3,1,((9 shl 8)+9) shl 16 ;brush - cmp eax,PEN_MODE_SELECT_COLOR - jne @f - call draw_objects - @@: - pop eax - ret - -align 4 -but_mode_clear: - push eax - mov eax,dword[v_pen_mode] - stdcall set_pen_mode,PEN_MODE_CLEAR,2,((15 shl 8)+9) shl 16 - cmp eax,PEN_MODE_SELECT_COLOR - jne @f - call draw_objects - @@: - pop eax - ret - -align 4 -but_light: - xor dword[mode_light],1 - call draw_objects - ret - -align 4 -but_rend_2_2: -push edi - cmp dword[buf_r_img],0 - jne @f - ;создание буфера для рендера - push ecx esi - mov edi,buf_r_img - mov esi,buf_0 - mov ecx,BUF_STRUCT_SIZE - cld - rep movsb ;копируем все параметры с основного буфера - mov edi,buf_r_img - mov buf2d_data,0 - shl buf2d_w,1 ;увеличиваем размер буфера - shl buf2d_h,1 - stdcall [buf2d_create],buf_r_img - - mov edi,buf_r_z - mov esi,buf_0z - mov ecx,BUF_STRUCT_SIZE - cld - rep movsb ;копируем все параметры с основного буфера - mov edi,buf_r_z - mov buf2d_data,0 - shl buf2d_w,1 ;увеличиваем размер буфера - shl buf2d_h,1 - stdcall [buf2d_create],buf_r_z - pop esi ecx - @@: - stdcall [buf2d_clear], buf_r_img, [buf_0.color] ;чистим буфер - stdcall [buf2d_clear], buf_r_z, 0 ;чистим буфер - - push eax ebx ecx - mov eax,[v_zoom] - cmp eax,[scaled_zoom] - jle .end_scaled - ;рендер увеличенной части объекта - mov ebx,[scaled_zoom] - sub eax,ebx - inc ebx - stdcall [buf2d_vox_obj_draw_3g_scaled], buf_r_img, buf_r_z, [buf_vox],\ - [open_file_vox], 0,0, 0, ebx, [cam_x],[cam_y],[cam_z],eax, [sc.work_graph] - bt dword[mode_light],0 - jnc @f - stdcall [buf2d_vox_obj_draw_3g_shadows], buf_r_img, buf_r_z, [buf_vox], 0,0, 0, ebx, 3 - @@: - xor ebx,ebx - xor ecx,ecx - mov edi,buf_r_img - stdcall [buf2d_img_hdiv2], edi - shr buf2d_h,1 - stdcall [buf2d_img_wdiv2], edi - shr buf2d_w,1 - jmp .show - .end_scaled: - - inc eax - stdcall [buf2d_vox_obj_draw_3g], buf_r_img, buf_r_z, [buf_vox], [open_file_vox], 0,0, 0, eax - stdcall [buf2d_vox_obj_draw_1g], buf_r_img, buf_r_z, [open_file_vox], 0,0, eax - bt dword[mode_light],0 - jnc @f - stdcall [buf2d_vox_obj_draw_3g_shadows], buf_r_img, buf_r_z, [buf_vox], 0,0, 0, eax, 3 - @@: - - mov edi,buf_r_img - stdcall [buf2d_img_hdiv2], edi - shr buf2d_h,1 - stdcall [buf2d_img_wdiv2], edi - shr buf2d_w,1 - - stdcall [buf2d_vox_obj_get_img_w_3g], [buf_vox],[v_zoom] - mov ebx,[buf_0.w] - sub ebx,eax - shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали - stdcall [buf2d_vox_obj_get_img_h_3g], [buf_vox],[v_zoom] - cmp eax,[buf_0.h] - jg @f - mov ecx,[buf_0.h] - sub ecx,eax - shr ecx,1 ;ecx - для центровки маленьких изображений по вертикали - @@: - .show: - stdcall [buf2d_bit_blt], buf_0, ebx,ecx, edi - shl buf2d_h,1 - shl buf2d_w,1 - pop ecx ebx eax -pop edi - stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране - ret - -;уменьшаем ширину кисти -align 4 -but_bru_w_m: - cmp dword[brush_w],1 - jle @f - dec dword[brush_w] - pushad - call draw_pok - call draw_plane - popad - @@: - ret -;увеличиваем ширину кисти -align 4 -but_bru_w_p: - cmp dword[brush_w],32 - jge @f - inc dword[brush_w] - pushad - call draw_pok - call draw_plane - popad - @@: - ret -;уменьшаем высоту кисти -align 4 -but_bru_h_m: - cmp dword[brush_h],1 - jle @f - dec dword[brush_h] - pushad - call draw_pok - call draw_plane - popad - @@: - ret -;увеличиваем высоту кисти -align 4 -but_bru_h_p: - cmp dword[brush_h],32 - jge @f - inc dword[brush_h] - pushad - call draw_pok - call draw_plane - popad - @@: - ret - -align 4 -but_bru_flip_h: - stdcall [buf2d_flip_h],buf_brush - call draw_plane - ret - -align 4 -but_bru_flip_v: - stdcall [buf2d_flip_v],buf_brush - call draw_plane - ret - -align 4 -but_bru_rot_90: - stdcall [buf2d_rotate],buf_brush,90 - call draw_plane - ret - -align 4 -but_brush_copy: - cmp dword[v_pen_mode],PEN_MODE_BRUSH - jne .end_f -pushad - mov eax,[v_cur_x] - mov ebx,[n_plane] - mov edx,[v_cur_y] - - mov ecx,[v_zoom] - cmp ecx,[scaled_zoom] - jle @f - ;преобразование координат, с учетом увеличения - ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) - mov ecx,[scaled_zoom] - - mov edi,[cam_x] - shl edi,cl - add eax,edi - mov edi,[cam_y] - shl edi,cl - add ebx,edi - mov edi,[cam_z] - shl edi,cl - add edx,edi - @@: - - cld - mov edi,brush_data - mov esi,edx - sub esi,[brush_h] - .cycle_0: - mov ecx,[brush_w] - @@: - push eax - stdcall buf2d_vox_obj_node_get_color, [open_file_vox], eax,ebx,edx, [v_zoom] - cmp eax,[v_color] - jne .end_0 - mov eax,1 shl 30 - .end_0: - mov dword[edi],eax ;color - pop eax - inc eax - add edi,4 - loop @b - dec edx - sub eax,[brush_w] - cmp edx,esi - jg .cycle_0 - - call draw_objects -popad - .end_f: - ret - -align 4 -but_brush_draw: - cmp dword[v_pen_mode],PEN_MODE_BRUSH - jne .end_f -pushad - mov eax,[v_cur_x] - mov ebx,[n_plane] - mov edx,[v_cur_y] - - mov ecx,[v_zoom] - cmp ecx,[scaled_zoom] - jle @f - ;преобразование координат, с учетом увеличения - ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) - mov ecx,[scaled_zoom] - - mov edi,[cam_x] - shl edi,cl - add eax,edi - mov edi,[cam_y] - shl edi,cl - add ebx,edi - mov edi,[cam_z] - shl edi,cl - add edx,edi - @@: - - cld - mov edi,brush_data - mov esi,edx - sub esi,[brush_h] - .cycle_0: - mov ecx,[brush_w] - @@: - bt dword[edi],31 ;бит прозрачности - jc .end_2 - bt dword[edi],30 ;бит текущего цвета - jnc .end_0 - push dword[v_color] - jmp .end_1 - .end_0: - push dword[edi] - .end_1: - stdcall buf2d_vox_obj_create_node, [open_file_vox], eax,ebx,edx, [v_zoom] ;, color - .end_2: - inc eax - add edi,4 - loop @b - dec edx - sub eax,[brush_w] - cmp edx,esi - jg .cycle_0 - - call draw_objects -popad - .end_f: - ret - -align 4 -but_brush_clear: - cmp dword[v_pen_mode],PEN_MODE_BRUSH - jne .end_f -pushad - mov eax,[v_cur_x] - mov ebx,[n_plane] - mov edx,[v_cur_y] - - mov ecx,[v_zoom] - cmp ecx,[scaled_zoom] - jle @f - ;преобразование координат, с учетом увеличения - ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) - mov ecx,[scaled_zoom] - - mov edi,[cam_x] - shl edi,cl - add eax,edi - mov edi,[cam_y] - shl edi,cl - add ebx,edi - mov edi,[cam_z] - shl edi,cl - add edx,edi - @@: - - cld - mov edi,brush_data - mov esi,edx - sub esi,[brush_h] - .cycle_0: - mov ecx,[brush_w] - @@: - bt dword[edi],31 ;бит прозрачности - jc .end_2 - stdcall buf2d_vox_obj_delete_node, [open_file_vox], eax,ebx,edx, [v_zoom] - .end_2: - inc eax - add edi,4 - loop @b - dec edx - sub eax,[brush_w] - cmp edx,esi - jg .cycle_0 - - call draw_objects -popad - .end_f: - ret - -align 4 -draw_palete: - stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер - stdcall buf2d_draw_palete, buf_0, 5,3, 9,6, 18, 512 - stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране - ret - -align 4 -v_zoom dd 3 ;текущий масштаб -v_cur_x dd 0 ;координата курсора x -v_cur_y dd 0 ;координата курсора y (но ось в объекте z) -n_plane dd 0 ;плоскость сечения -v_color dd 0xff ;цвет карандаша -v_pen_mode dd PEN_MODE_NONE ;режим работы курсора (см. константы PEN_MODE_...) -mode_light dd 1 ;режим освещения -cam_x dd 0 -cam_y dd 0 -cam_z dd 0 -scaled_zoom dd 5 ;масштаб после которого начинается рисование части изображения -tile_size dd ? ;размер квадратика на плоскости с сечением -max_open_file_size dd ? - -align 4 -buf_brush: ;буфер с прозрачностью для курсоров - dd brush_data ;указатель на буфер изображения - dw 0 ;+4 left - dw 0 ;+6 top -brush_w dd 5 ;ширина кисти -brush_h dd 5 ;высота кисти - dd 0 ;+16 color - db 32 ;+20 bit in pixel - -brush_data dd 1 shl 31,1 shl 30,1 shl 30,1 shl 30,1 shl 31 -dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 -dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 -dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 -dd 1 shl 31,1 shl 30,1 shl 30,1 shl 30,1 shl 31 -rd 999 ;32*32-25 - -txt_zoom db 'Масштаб:',0 -txt_curor: db 'Курсор: ' -.size: rb 10 -txt_n_plane db 'Сечение:',0 -txt_color db 'Цвет:',0 -txt_brush: db 'Кисть: ' -.size: rb 10 -txt_mull db '*',0 -txt_space db ' ',0 -txt_buf rb 16 -txt_need_memory db 'Мало памяти для работы с открываемым файлом.',13,10,\ - 'При редактировании файла программа может зависнуть.',13,10,\ - 'Увеличте размер переменной ',39,'file_size',39,' в файле ',39,'vox_editor.ini',39,'.',0 - -;рисование буфера с воксельными объектами -align 4 -draw_objects: - stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер - stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер - - cmp dword[v_pen_mode],PEN_MODE_SELECT_COLOR - jne @f - call draw_palete - jmp .end_f - @@: - push eax ebx ecx - stdcall [buf2d_vox_obj_get_img_w_3g], [buf_vox],[v_zoom] - mov ebx,[buf_0.w] - sub ebx,eax - shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали - - xor ecx,ecx - stdcall [buf2d_vox_obj_get_img_h_3g], [buf_vox],[v_zoom] - cmp eax,[buf_0.h] - jg @f - mov ecx,[buf_0.h] - sub ecx,eax - shr ecx,1 ;ecx - для центровки маленьких изображений по вертикали - @@: - - mov eax,[v_zoom] - cmp eax,[scaled_zoom] - jg @f - ;обычный режим изображения - stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, [buf_vox],\ - [open_file_vox], ebx,ecx, 0, eax - stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_0z,\ - [open_file_vox], 0,0, eax - bt dword[mode_light],0 - jnc .end_1 - stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, [buf_vox], ebx,ecx, 0, eax, 3 - .end_1: - jmp .end_0 - @@: - ;режим масштабирования изображения - sub eax,[scaled_zoom] - stdcall [buf2d_vox_obj_draw_3g_scaled], buf_0, buf_0z, [buf_vox],\ - [open_file_vox], 0,0, 0, [scaled_zoom], [cam_x],[cam_y],[cam_z],eax, [sc.work_graph] ;scroll -> 2^eax - bt dword[mode_light],0 - jnc .end_2 - stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, [buf_vox], 0,0, 0, [scaled_zoom], 3 - .end_2: - .end_0: - pop ecx ebx eax - - call draw_plane - stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране - .end_f: - ret - -;рисование плоскости с сечением объекта -align 4 -proc draw_plane uses eax - stdcall [buf2d_clear], buf_pl, [buf_pl.color] ;чистим буфер - - mov eax,[v_zoom] - cmp eax,[scaled_zoom] - jg @f - ;обычный режим изображения - stdcall [buf2d_vox_obj_draw_pl], buf_pl, [open_file_vox],\ - OT_MAP_X,OT_MAP_Y,[tile_size], eax, [n_plane], [sc.work_graph] - jmp .end_0 - @@: - ;режим масштабирования изображения - sub eax,[scaled_zoom] - stdcall [buf2d_vox_obj_draw_pl_scaled], buf_pl, [open_file_vox],\ - OT_MAP_X,OT_MAP_Y,[tile_size], [scaled_zoom], [n_plane], [sc.work_graph],[cam_x],[cam_y],[cam_z],eax - .end_0: - - call draw_vox_cursor - stdcall [buf2d_draw], buf_pl ;обновляем буфер на экране - .end_f: - ret -endp - -;рисование курсора -align 4 -draw_vox_cursor: -pushad - mov ecx,[v_zoom] - cmp ecx,[scaled_zoom] - jle @f - mov ecx,[scaled_zoom] - @@: - xor edx,edx - inc edx - shl edx,cl - - mov eax,[v_cur_x] - cmp eax,edx - jge .end_f ;курсор за пределами поля - mov edi,[tile_size] - imul eax,edi - add eax,OT_MAP_X - mov ebx,edx - dec ebx - sub ebx,[v_cur_y] - imul ebx,edi - add ebx,OT_MAP_Y - inc eax - cmp dword[v_pen_mode],PEN_MODE_BRUSH - je .brush - inc ebx - sub edi,2 - stdcall [buf2d_rect_by_size], buf_pl, eax,ebx, edi,edi,[sc.work_graph] - dec ebx - add edi,2 - - ;горизонтальные линии - sub eax,2 - mov ecx,edi - imul edi,edx - shr ecx,1 - add ebx,ecx ;центровка по середине клетки - mov ecx,OT_MAP_X - add edi,ecx - stdcall [buf2d_line], buf_pl, ecx,ebx, eax,ebx,[sc.work_graph] - add eax,[tile_size] - inc eax - cmp eax,edi - jge @f ;если курсор на краю поля - dec edi - stdcall [buf2d_line], buf_pl, eax,ebx, edi,ebx,[sc.work_graph] - @@: - jmp .end_f - - ;рамка для кисти - .brush: - dec eax - mov ecx,[brush_w] - imul ecx,[tile_size] - ;mov edi,eax - mov edi,ecx - mov esi,[brush_h] - imul esi,[tile_size] - stdcall [buf2d_rect_by_size], buf_pl, eax,ebx, edi,esi,[sc.work_graph] - - ;рисование точек для кисти - mov ecx,[brush_w] - mov edx,[tile_size] - sub eax,edx ;eax-=tile_size - shr edx,2 - add eax,edx ;eax+=tile_size/4 - add ebx,edx ;ebx+=tile_size/4 - mov edx,eax - mov esi,[tile_size] - imul esi,ecx - imul ecx,[brush_h] - add esi,edx - ;eax = from edx to esi - mov edi,brush_data - cld - @@: - add eax,[tile_size] - bt dword[edi],31 - jc .no_pixel - bt dword[edi],30 - jc .sel_color - push dword[edi] - jmp .set_pixel - .sel_color: - push [v_color] - .set_pixel: - stdcall [buf2d_rect_by_size], buf_pl, eax,ebx, 3,3 ;, [edi] - .no_pixel: - add edi,4 - cmp eax,esi - jl .end_line - mov eax,edx - add ebx,[tile_size] - .end_line: - loop @b - - .end_f: -popad - ret - -;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 [v_pen_mode],eax - je @f - mov [v_pen_mode],eax - mov edx,[hot_p] - mov dx,2 ;LOAD_INDIRECT - mov ecx,[icon] - shl ecx,12 ;умножаем на 4 кб - add ecx,[buf_curs.data] - mcall SF_MOUSE_GET,SSF_LOAD_CURSOR - - cmp eax,0 - je @f - mov [cursor_pointer],eax - mcall SF_MOUSE_GET,SSF_SET_CURSOR,[cursor_pointer] - @@: - ret -endp - -;данные для диалога открытия файлов -align 4 -OpenDialog_data: -.type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию -.procinfo dd procinfo ;+4 -.com_area_name dd communication_area_name ;+8 -.com_area dd 0 ;+12 -.opendir_path dd plugin_path ;+16 -.dir_default_path dd default_dir ;+20 -.start_path dd file_name ;+24 путь к диалогу открытия файлов -.draw_window dd draw_window ;+28 -.status dd 0 ;+32 -.openfile_path dd openfile_path ;+36 путь к открываемому файлу -.filename_area dd filename_area ;+40 -.filter_area dd Filter -.x: -.x_size dw 420 ;+48 ; Window X size -.x_start dw 10 ;+50 ; Window X position -.y: -.y_size dw 320 ;+52 ; Window y size -.y_start dw 10 ;+54 ; Window Y position - -default_dir db '/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 'VOX',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 'libini.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_libini -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 - buf2d_get_pixel dd sz_buf2d_get_pixel - buf2d_flip_h dd sz_buf2d_flip_h - buf2d_flip_v dd sz_buf2d_flip_v - buf2d_rotate dd sz_buf2d_rotate - buf2d_vox_brush_create dd sz_buf2d_vox_brush_create - buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete - buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g - buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g - buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g - buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g - buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled - buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows - buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl - buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled - - 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 - sz_buf2d_get_pixel db 'buf2d_get_pixel',0 - sz_buf2d_flip_h db 'buf2d_flip_h',0 - sz_buf2d_flip_v db 'buf2d_flip_v',0 - sz_buf2d_rotate db 'buf2d_rotate',0 - sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 - sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 - sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 - sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 - sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0 - sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 - sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 - sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 - sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 - sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 - -align 4 -import_libini: - dd alib_init2 - 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_init2 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 -buf_0: dd 0 ;указатель на дaные изображения -.l: dw 5 ;+4 left -.t: dw 45 ;+6 top -.w: dd 192+6 ;+8 w -.h: dd 224+7 ;+12 h -.color: dd 0xffffff ;+16 color - db 24 ;+20 bit in pixel - -;буфер глубины основного изображения -align 4 -buf_0z: dd 0 - dw 0 ;+4 left - dw 0 ;+6 top -.w: dd 192+6 ;+8 w -.h: dd 224+7 ;+12 h -.color: dd 0 ;+16 color - db 32 ;+20 bit in pixel - -;буфер для рисования среза объекта -align 4 -buf_pl: dd 0 -.l: dw 15+192+6 ;+4 left -.t: dw 45 ;+6 top -.w: dd 320 ;+8 w -.h: dd 330 ;+12 h -.color: dd 0xffffff ;+16 color - db 24 ;+20 bit in pixel - -;буфер для улучшеного рендера -align 4 -buf_r_img: - rb BUF_STRUCT_SIZE -align 4 -buf_r_z: - rb BUF_STRUCT_SIZE - -align 4 -buf_curs: ;буфер с курсорами -.data: dd 0 ;указатель на буфер изображения - dw 0 ;+4 left - dw 0 ;+6 top - dd 32 ;+8 w - dd 32*cursors_count ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_curs_8: ;буфер с прозрачностью для курсоров -.data: dd 0 ;указатель на буфер изображения - dw 0 ;+4 left - dw 0 ;+6 top - dd 32 ;+8 w - dd 32*cursors_count ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -;данные для создания минимального единичного вокселя -align 4 -vox_6_7_z: ;воксель где видно 3 грани -dd 0,0,1,1,0,0,\ - 0,2,2,2,2,0,\ - 2,2,2,2,2,2,\ - 2,3,2,2,3,2,\ - 2,3,3,3,3,2,\ - 0,3,3,3,3,0,\ - 0,0,3,3,0,0 - -align 4 -vox_6_4_z: ;воксель, где видно 2 боковые грани а верхней грани не видно -dd 1,2,3,3,2,1,\ - 1,2,3,3,2,1,\ - 1,2,3,3,2,1,\ - 1,2,3,3,2,1 - -align 4 -buf_vox dd buf_vox_g3 - -buf_vox_g3: - db 6,7,4,3 ;w,h,h_osn,n - rb BUF_STRUCT_SIZE*(3+1) - -align 4 -buf_vox_g2: - db 6,4,0,3 ;w,h,h_osn,n - rb BUF_STRUCT_SIZE*(3+1) - -align 16 -i_end: - procinfo process_information - sc system_colors - mouse_dd dd ? - cursor_pointer dd ? ;указатель на данные для курсора - wnd_s_pos: ;место для настроек стартовой позиции окна - rq 0 - rb 4096 -align 16 -stacktop: - sys_path rb 1024 - file_name rb 2048 ;4096 - plugin_path rb 1024 ;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, openfile_path, sys_path + +include '../../macros.inc' +include '../../proc32.inc' +include '../../KOSfuncs.inc' +include '../../load_img.inc' +include '../../load_lib.mac' +include 'vox_draw.inc' +include 'vox_rotate.inc' +include 'str.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +caption db 'Voxel editor 22.03.18',0 ;подпись окна + +IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +image_data_toolbar dd 0 +cursors_count equ 4 + +;значения задаваемые по умолчанию, без ini файла +ini_def_window_t equ 10 +ini_def_window_l equ 10 +ini_def_window_w equ 550 +ini_def_window_h equ 415 +ini_def_buf_w equ 198 ;=192+6 +ini_def_buf_h equ 231 ;=224+7 +ini_def_s_zoom equ 5 +ini_def_t_size equ 10 +ini_def_color_b equ 0xffffff +;описание параматров для ini файла +ini_name db 'vox_editor.ini',0 +ini_sec_window db 'Window',0 +key_window_t db 't',0 +key_window_l db 'l',0 +key_window_w db 'w',0 +key_window_h db 'h',0 +key_buf_w db 'buf_w',0 +key_buf_h db 'buf_h',0 +ini_sec_options db 'Options',0 +key_s_zoom db 's_zoom',0 +key_t_size db 'tile_size',0 +key_f_size db 'file_size',0 +key_col_b db 'c_background',0 + +OT_MAP_X equ 0 +OT_MAP_Y equ 0 +OT_CAPT_X_COLOR equ 5 ;отступ для подписи цвета +OT_CAPT_Y_COLOR equ 30 +PEN_MODE_NONE equ -1 +PEN_MODE_CLEAR equ 0 ;режим стирания +PEN_MODE_SELECT_COLOR equ 2 ;режим выбора цвета +PEN_MODE_BRUSH equ 3 ;режим работы с кистью + +run_file_70 FileInfoBlock + +align 4 +start: + load_libraries l_libs_start,l_libs_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,l_libs_end + jl .test_lib_open + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors + mcall SF_SET_EVENTS_MASK,0xC0000027 + stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога + +;--- load ini file --- + copy_path ini_name,sys_path,file_name,0 + ;window startup pozition + stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_l,ini_def_window_l + mov word[wnd_s_pos+2],ax + stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_w,ini_def_window_w + mov word[wnd_s_pos],ax + stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_t,ini_def_window_t + mov word[wnd_s_pos+6],ax + stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_h,ini_def_window_h + mov word[wnd_s_pos+4],ax + ;image buffer size + stdcall dword[ini_get_int],file_name,ini_sec_window,key_buf_w,ini_def_buf_w + mov [buf_0.w],eax + mov [buf_0z.w],eax + add ax,15 + mov [buf_pl.l],ax ;отступ для правого окна + stdcall dword[ini_get_int],file_name,ini_sec_window,key_buf_h,ini_def_buf_h + mov [buf_0.h],eax + mov [buf_0z.h],eax + ;цвет фона + stdcall dword[ini_get_color],file_name,ini_sec_window,key_col_b,ini_def_color_b + mov [buf_0.color],eax + mov [buf_pl.color],eax + + ;мастаб, после которого будет увеличение + stdcall dword[ini_get_int],file_name,ini_sec_options,key_s_zoom,ini_def_s_zoom + mov [scaled_zoom],eax + ;размер квадратика на плоскости сечения + stdcall dword[ini_get_int],file_name,ini_sec_options,key_t_size,ini_def_t_size + mov [tile_size],eax + + stdcall dword[ini_get_int],file_name,ini_sec_options,key_f_size,64 + shl eax,10 + mov [max_open_file_size],eax + + mov ecx,[scaled_zoom] + xor eax,eax + inc eax + shl eax,cl + imul eax,[tile_size] + mov [buf_pl.w],eax + add eax,[tile_size] + mov [buf_pl.h],eax + + ;*** загрузка курсоров + include_image_file 'cursors_gr.png',image_data_toolbar + stdcall [buf2d_create_f_img], buf_curs_8,[image_data_toolbar] ;создаем буфер + stdcall mem.Free,[image_data_toolbar] ;освобождаем память + + include_image_file 'cursors.png',image_data_toolbar + stdcall [buf2d_create_f_img], buf_curs,[image_data_toolbar] ;создаем буфер + stdcall mem.Free,[image_data_toolbar] ;освобождаем память + + 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 [buf2d_create], buf_0 ;создание буфера изображения + stdcall [buf2d_create], buf_0z ;создание буфера глубины + stdcall [buf2d_create], buf_pl ;создание буфера для сечения + + stdcall [buf2d_vox_brush_create], buf_vox_g3, vox_6_7_z + stdcall [buf2d_vox_brush_create], buf_vox_g2, vox_6_4_z + + include_image_file 'toolbar.png', image_data_toolbar + + stdcall mem.Alloc,[max_open_file_size] + mov dword[open_file_vox],eax + + call but_new_file + + ;первоначальная установка курсора + stdcall set_pen_mode,1,0,((9 shl 8)+9) shl 16 ;pen + + ;проверка командной строки + cmp dword[openfile_path],0 + je @f + call but_open_file_cmd_lin + @@: + +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 + mcall SF_THREAD_INFO,procinfo,-1 + cmp ax,word[procinfo+4] + jne @f ;окно не активно + call mouse + @@: + jmp still + +align 4 +mouse: + pushad + mcall SF_MOUSE_GET,SSF_BUTTON + bt eax,1 ;right button + jnc @f + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION + mov ebx,eax + shr ebx,16 + and eax,0xffff + stdcall get_buf_color, buf_0 + stdcall get_buf_color, buf_pl + jmp .end_f + @@: + bt eax,0 ;left button + jnc .end_f + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION + mov ebx,eax + shr ebx,16 + and eax,0xffff + + cmp dword[v_pen_mode],PEN_MODE_SELECT_COLOR + jne .end_2 + stdcall get_buf_color, buf_0 + stdcall get_buf_color, buf_pl + jmp .end_f + .end_2: + + + push eax ebx + mov edx,[v_zoom] + cmp edx,[scaled_zoom] + jle @f + ;режим масштабирования изображения + sub edx,[scaled_zoom] + sub ax,word[buf_0.t] + sub bx,word[buf_0.l] + stdcall get_mouse_ev_scale, [buf_vox], ebx, eax, [scaled_zoom],edx + cmp eax,0 + je @f + mov ebx,eax + and eax,0x3fffffff + rol ebx,2 + and ebx,3 + dec ebx + + shl ebx,2 + add ebx,cam_x + mov dword[ebx],eax ;change [cam_x] or [cam_y] or [cam_z] + call draw_objects + + pop ebx eax + jmp .end_f + @@: + pop ebx eax + + + ;eax - mouse coord y + ;ebx - mouse coord x + movzx edx,word[buf_pl.t] + add edx,OT_MAP_Y + cmp eax,edx + jl .end_f + sub eax,edx + xor edx,edx + mov ecx,[tile_size] ;H + div ecx + movzx edx,word[buf_pl.l] + add edx,OT_MAP_X + cmp ebx,edx + jl .end_f + call convert_y ;преобразование координаты y + cmp eax,0 + jge .end_0 ;ограничение по нижней координате y + cmp eax,-1 + jne .end_f + ;меняем сечение, попали на квадратик + sub ebx,edx + mov eax,ebx + xor edx,edx + mov ecx,[tile_size] ;W + div ecx + mov [n_plane],eax + jmp .end_1 + .end_0: + mov [v_cur_y],eax ;Y-coord + sub ebx,edx + mov eax,ebx + xor edx,edx + mov ecx,[tile_size] ;W + div ecx + mov [v_cur_x],eax ;X-coord + + cmp dword[v_pen_mode],PEN_MODE_CLEAR + jl .end_1 + cmp dword[v_pen_mode],1 + jg .end_1 + mov eax,[v_cur_x] + mov ebx,[n_plane] + mov edx,[v_cur_y] + + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle .no_c_coord_0 + ;преобразование координат, с учетом увеличения + ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) + mov ecx,[scaled_zoom] + + mov edi,[cam_x] + shl edi,cl + add eax,edi + mov edi,[cam_y] + shl edi,cl + add ebx,edi + mov edi,[cam_z] + shl edi,cl + add edx,edi + .no_c_coord_0: + + ;отличающийся параметр для функции создания вокселя + cmp dword[v_pen_mode],1 + jne @f + push dword[v_color] + @@: + + mov ecx,dword[v_zoom] + mov edi,eax + mov esi,ebx + mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS + and eax,3 ;3 -> бит 0 левый Shift нажат, бит 1 правый Shift нажат + jz .shift_end + ;если нажат Shift, то редактируем на верхнем уровне + ;для этого все координаты делим на 2 а от мастаба отнимаем 1 + shr edx,1 + shr esi,1 + shr edi,1 + dec ecx + .shift_end: + + ;вызов общих параметров для функций + push ecx edx esi edi + push dword[open_file_vox] + + ;вызов функций + cmp dword[v_pen_mode],1 + jne @f + call buf2d_vox_obj_create_node + ;stdcall buf2d_vox_obj_create_node, [open_file_vox], edi,esi,edx, [v_zoom], [v_color] + jmp .end_1 + @@: + call buf2d_vox_obj_delete_node + ;stdcall buf2d_vox_obj_delete_node, [open_file_vox], edi,esi,edx, [v_zoom] + + .end_1: + call draw_objects + call draw_pok + .end_f: + popad + ret + +;input: +; eax - coord y +; ebx - coord x +align 4 +proc get_buf_color, buf:dword +pushad + mov edi,[buf] + cmp ax,buf2d_t + jl .end_f + sub ax,buf2d_t + cmp eax,buf2d_h + jg .end_f + cmp bx,buf2d_l + jl .end_f + sub bx,buf2d_l + cmp ebx,buf2d_w + jg .end_f + stdcall [buf2d_get_pixel], edi,ebx,eax + mov [v_color],eax + call on_change_color ;отображаем изменения цвета + .end_f: +popad + ret +endp + +;преобразовываем координату y (значение должно увеличиваться с низу вверх) +align 4 +convert_y: + push ecx edx + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + mov ecx,[scaled_zoom] + @@: + mov edx,1 + cmp ecx,1 + jl @f + shl edx,cl + @@: + sub edx,eax + dec edx + mov eax,edx + pop edx ecx + ret + +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,dword[wnd_s_pos],dword[wnd_s_pos+4] + + ; *** создание кнопок на панель *** + mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,3,[sc.work_button] + + mov ebx,(30 shl 16)+20 + inc edx + int 0x40 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + add ebx,25 shl 16 + inc edx + int 0x40 + add ebx,25 shl 16 + inc edx + 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) ;увелич. масштаб + 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) ;camera 3g 2g + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;поворот z + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;поворот x + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;поворот y + 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) ;инструмент карандаш + 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) ;выбор цвета + 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) ;рендер 2*2 + 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) ;удалить кисть + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;ширина кисти -1 + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;ширина кисти +1 + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;высота кисти -1 + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;высота кисти +1 + 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) ;повернуть кисть 90 гр. + int 0x40 + + ; *** рисование буферов *** + call draw_objects + call draw_pok + + mcall SF_REDRAW,SSF_END_DRAW +popad + ret + +align 4 +draw_pok: + mov eax,SF_DRAW_NUMBER + mov ecx,[v_zoom] + mov ebx,(3 shl 16)+(1 shl 31) + mov edx,((350+6*9) shl 16)+OT_CAPT_Y_COLOR+2 + mov esi,[sc.work_button_text] + or esi,(1 shl 30) + mov edi,[sc.work_button] + int 0x40 ;масштаб + mov ecx,[n_plane] + add edx,115 shl 16 ;9 + int 0x40 ;номер сечения + + ;обновление параметров курсора + mov dword[txt_curor.size],0 + mov eax,dword[v_cur_x] + mov edi,txt_curor.size + stdcall convert_int_to_str,10 + stdcall str_cat, edi,txt_mull + mov eax,dword[v_cur_y] + mov edi,txt_buf + stdcall convert_int_to_str,16 + stdcall str_cat, txt_curor.size,edi + stdcall str_cat, txt_curor.size,txt_space ;завершающий пробел + + ;обновление параметров кисти + mov dword[txt_brush.size],0 + mov eax,dword[brush_w] + mov edi,txt_brush.size + stdcall convert_int_to_str,10 + stdcall str_cat, edi,txt_mull + mov eax,dword[brush_h] + mov edi,txt_buf + stdcall convert_int_to_str,16 + stdcall str_cat, txt_brush.size,edi + stdcall str_cat, txt_brush.size,txt_space ;завершающий пробел + + mov ecx,[sc.work_text] + or ecx,0x80000000 ;or (1 shl 30) + mov edx,txt_color + mcall SF_DRAW_TEXT,(OT_CAPT_X_COLOR shl 16)+OT_CAPT_Y_COLOR+2 + + mov edx,txt_curor + add ebx,115 shl 16 + or ecx,(1 shl 30) + mov edi,[sc.work] + int 0x40 + + mov edx,txt_brush + add ebx,115 shl 16 + int 0x40 + + mov edx,txt_zoom + add ebx,115 shl 16 + int 0x40 + + mov edx,txt_n_plane + add ebx,115 shl 16 + int 0x40 + + call on_change_color + ret + +align 4 +on_change_color: +pushad + mcall SF_DRAW_RECT,((OT_CAPT_X_COLOR+35) shl 16)+16,(OT_CAPT_Y_COLOR shl 16)+12,[v_color] + + mov ecx,edx + mov edx,((OT_CAPT_X_COLOR+55) shl 16)+OT_CAPT_Y_COLOR+2 + mov esi,[sc.work_text] + add esi,(1 shl 30) + mov edi,[sc.work] + mcall SF_DRAW_NUMBER,(1 shl 8)+(6 shl 16) +popad + ret + +align 4 +key: + mcall SF_GET_KEY + jmp still + + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,3 + jne @f + call but_new_file + call draw_objects + call draw_pok + @@: + 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_camera_3g_2g + @@: + cmp ah,7 + jne @f + call but_zoom_p + @@: + cmp ah,8 + jne @f + call but_zoom_m + @@: + cmp ah,9 + jne @f + call but_r_z + @@: + cmp ah,10 + jne @f + call but_r_x + @@: + cmp ah,11 + jne @f + call but_r_y + @@: + cmp ah,12 + jne @f + call but_plane_inc + @@: + cmp ah,13 + jne @f + call but_plane_dec + @@: + cmp ah,14 + jne @f + call but_mode_pen + @@: + cmp ah,15 + jne @f + call but_mode_brush + @@: + cmp ah,16 + jne @f + call but_mode_clear + @@: + cmp ah,17 + jne @f + stdcall set_pen_mode,PEN_MODE_SELECT_COLOR,3,((9 shl 8)+9) shl 16 + call draw_palete + @@: + cmp ah,18 + jne @f + call but_light + @@: + cmp ah,19 + jne @f + call but_rend_2_2 + @@: + cmp ah,20 + jne @f + call but_brush_copy + @@: + cmp ah,21 + jne @f + call but_brush_draw + @@: + cmp ah,22 + jne @f + call but_brush_clear + @@: + cmp ah,23 + jne @f + call but_bru_w_m + @@: + cmp ah,24 + jne @f + call but_bru_w_p + @@: + cmp ah,25 + jne @f + call but_bru_h_m + @@: + cmp ah,26 + jne @f + call but_bru_h_p + @@: + cmp ah,27 + jne @f + call but_bru_flip_h + @@: + cmp ah,28 + jne @f + call but_bru_flip_v + @@: + cmp ah,29 + jne @f + call but_bru_rot_90 + @@: + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 + stdcall [buf2d_delete],buf_0z + cmp dword[buf_r_img],0 + je @f + stdcall [buf2d_delete],buf_r_img + stdcall [buf2d_delete],buf_r_z + @@: + stdcall [buf2d_vox_brush_delete], buf_vox_g3 + stdcall [buf2d_vox_brush_delete], buf_vox_g2 + stdcall [buf2d_delete],buf_curs + stdcall [buf2d_delete],buf_curs_8 + stdcall mem.Free,[image_data_toolbar] + stdcall mem.Free,[open_file_vox] + mcall SF_TERMINATE_PROCESS + +;данные для инициализации воксельного объекта +align 4 +vox_new_data: + db 2,0,0,0 + db 0,1,2,3,4,5,6,7 ;default table + dd 0 ;null node + +;инициализация воксельного объекта +align 4 +proc but_new_file uses ecx edi esi + mov ecx,vox_offs_data+4 + mov esi,vox_new_data + mov edi,[open_file_vox] + cld + rep movsb + ret +endp + +align 4 +open_file_vox dd 0 ;указатель на область для открытия файлов + +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 + ;код при удачном открытии диалога + + call but_open_file_cmd_lin + call draw_objects + .end_open_file: + popad + ret + +align 4 +but_open_file_cmd_lin: + pushad + 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: размер файла в байтах + cmp ecx,[max_open_file_size] ;проверяем размер выделенной памяти + jle @f + mov [max_open_file_size],ecx + stdcall mem.ReAlloc,[open_file_vox],ecx + mov [open_file_vox],eax + notify_window_run txt_need_memory + @@: + + 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_vox] + 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 + + mcall SF_SET_CAPTION,1,openfile_path + + ;--- + mov eax,[open_file_vox] + movzx eax,byte[eax] + and eax,0xff ;берем масштаб по умолчанию + mov dword[v_zoom],eax ;берем масштаб по умолчанию + mov dword[cam_x],0 + mov dword[cam_y],0 + mov dword[cam_z],0 + .end_open_file: + 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,dword[v_zoom] ;задаем масштаб по умолчанию + mov ebx,[open_file_vox] + mov byte[ebx],al + + stdcall buf2d_vox_obj_get_size, ebx + mov dword[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_vox] + 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 ;загружаем файл изображения + cmp ebx,0xffffffff + je .end_save_file + + .end_save_file: + popad + ret + +;смена вида камеры на просмотр 3 и 2 граней +align 4 +but_camera_3g_2g: + cmp dword[buf_vox],buf_vox_g3 + je @f + mov dword[buf_vox],buf_vox_g3 + jmp .end_0 + @@: + mov dword[buf_vox],buf_vox_g2 + .end_0: + call draw_objects + ret + +;увеличение масштаба +align 4 +but_zoom_p: + cmp dword[v_zoom],10 ;максимальный размер, до которого можно увеличить 2^10=1024 + jge @f + inc dword[v_zoom] + shl dword[n_plane],1 + push eax + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jl .end_0 + push ecx + mov ecx,[scaled_zoom] + xor eax,eax + inc eax + shl eax,cl + shl dword[cam_x],1 + shl dword[cam_y],1 + shl dword[cam_z],1 + cmp eax,[n_plane] + jg .end_1 + ;коректировка ползунка + sub [n_plane],eax + inc dword[cam_y] + .end_1: + pop ecx + .end_0: + pop eax + call draw_objects + call draw_pok + @@: + ret + +;уменьшение масштаба +align 4 +but_zoom_m: + cmp dword[v_zoom],1 + jl @f + dec dword[v_zoom] + shr dword[n_plane],1 + push eax + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jl .end_0 + shr dword[cam_x],1 + shr dword[cam_y],1 + jnc .end_1 + ;коректировка ползунка + push ecx + mov ecx,[scaled_zoom] + dec ecx + xor eax,eax + inc eax + shl eax,cl + add [n_plane],eax + pop ecx + .end_1: + shr dword[cam_z],1 + .end_0: + pop eax + call draw_objects + call draw_pok + @@: + ret + +align 4 +but_r_z: + stdcall vox_obj_rot_z, [open_file_vox] + call draw_objects + ret + +align 4 +but_r_x: + stdcall vox_obj_rot_x, [open_file_vox] + call draw_objects + ret + +align 4 +but_r_y: + stdcall vox_obj_rot_y, [open_file_vox] + call draw_objects + ret + +;сдвигаем плоскость среза +align 4 +but_plane_inc: +push eax ecx + inc dword[n_plane] + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jle .end_0 + ;происходит масштабирование + mov ecx,[scaled_zoom] + xor eax,eax + inc eax + shl eax,cl + cmp eax,[n_plane] + jg @f + mov dword[n_plane],0 + inc dword[cam_y] ;переходим в соседний куб + neg ecx + ;inc ecx + add ecx,[v_zoom] + xor eax,eax + inc eax + shl eax,cl + cmp eax,[cam_y] + jg @f + mov dword[cam_y],0 ;зацикливаем если вылезли за пределы последнего куба + @@: + jmp .end_1 + .end_0: + ;масштабирование не происходит + mov ecx,eax + xor eax,eax + inc eax + shl eax,cl + cmp eax,[n_plane] + jg .end_1 + mov dword[n_plane],0 + .end_1: + call draw_objects + call draw_pok +pop ecx eax + ret + +;сдвигаем плоскость среза +align 4 +but_plane_dec: + dec dword[n_plane] + cmp dword[n_plane],0 + jge .end_f +push eax ecx + mov ecx,[scaled_zoom] + xor eax,eax + inc eax + shl eax,cl + dec eax + mov dword[n_plane],eax + + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jle .end_0 + ;происходит масштабирование + dec dword[cam_y] ;переходим в соседний куб + cmp dword[cam_y],0 + jge .end_0 + + mov ecx,eax + sub ecx,[scaled_zoom] + xor eax,eax + inc eax + shl eax,cl + dec eax + mov dword[cam_y],eax ;если номер куба оказался меньше 0 исправляем на максимальное значение + .end_0: +pop ecx eax + .end_f: + call draw_objects + call draw_pok + ret + +align 4 +but_mode_pen: + push eax + mov eax,dword[v_pen_mode] + stdcall set_pen_mode,1,0,((9 shl 8)+9) shl 16 ;pen + cmp eax,PEN_MODE_SELECT_COLOR + jne @f + call draw_objects + @@: + pop eax + ret + +align 4 +but_mode_brush: + push eax + mov eax,dword[v_pen_mode] + stdcall set_pen_mode,3,1,((9 shl 8)+9) shl 16 ;brush + cmp eax,PEN_MODE_SELECT_COLOR + jne @f + call draw_objects + @@: + pop eax + ret + +align 4 +but_mode_clear: + push eax + mov eax,dword[v_pen_mode] + stdcall set_pen_mode,PEN_MODE_CLEAR,2,((15 shl 8)+9) shl 16 + cmp eax,PEN_MODE_SELECT_COLOR + jne @f + call draw_objects + @@: + pop eax + ret + +align 4 +but_light: + xor dword[mode_light],1 + call draw_objects + ret + +align 4 +but_rend_2_2: +push edi + cmp dword[buf_r_img],0 + jne @f + ;создание буфера для рендера + push ecx esi + mov edi,buf_r_img + mov esi,buf_0 + mov ecx,BUF_STRUCT_SIZE + cld + rep movsb ;копируем все параметры с основного буфера + mov edi,buf_r_img + mov buf2d_data,0 + shl buf2d_w,1 ;увеличиваем размер буфера + shl buf2d_h,1 + stdcall [buf2d_create],buf_r_img + + mov edi,buf_r_z + mov esi,buf_0z + mov ecx,BUF_STRUCT_SIZE + cld + rep movsb ;копируем все параметры с основного буфера + mov edi,buf_r_z + mov buf2d_data,0 + shl buf2d_w,1 ;увеличиваем размер буфера + shl buf2d_h,1 + stdcall [buf2d_create],buf_r_z + pop esi ecx + @@: + stdcall [buf2d_clear], buf_r_img, [buf_0.color] ;чистим буфер + stdcall [buf2d_clear], buf_r_z, 0 ;чистим буфер + + push eax ebx ecx + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jle .end_scaled + ;рендер увеличенной части объекта + mov ebx,[scaled_zoom] + sub eax,ebx + inc ebx + stdcall [buf2d_vox_obj_draw_3g_scaled], buf_r_img, buf_r_z, [buf_vox],\ + [open_file_vox], 0,0, 0, ebx, [cam_x],[cam_y],[cam_z],eax, [sc.work_graph] + bt dword[mode_light],0 + jnc @f + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_r_img, buf_r_z, [buf_vox], 0,0, 0, ebx, 3 + @@: + xor ebx,ebx + xor ecx,ecx + mov edi,buf_r_img + stdcall [buf2d_img_hdiv2], edi + shr buf2d_h,1 + stdcall [buf2d_img_wdiv2], edi + shr buf2d_w,1 + jmp .show + .end_scaled: + + inc eax + stdcall [buf2d_vox_obj_draw_3g], buf_r_img, buf_r_z, [buf_vox], [open_file_vox], 0,0, 0, eax + stdcall [buf2d_vox_obj_draw_1g], buf_r_img, buf_r_z, [open_file_vox], 0,0, eax + bt dword[mode_light],0 + jnc @f + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_r_img, buf_r_z, [buf_vox], 0,0, 0, eax, 3 + @@: + + mov edi,buf_r_img + stdcall [buf2d_img_hdiv2], edi + shr buf2d_h,1 + stdcall [buf2d_img_wdiv2], edi + shr buf2d_w,1 + + stdcall [buf2d_vox_obj_get_img_w_3g], [buf_vox],[v_zoom] + mov ebx,[buf_0.w] + sub ebx,eax + shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали + stdcall [buf2d_vox_obj_get_img_h_3g], [buf_vox],[v_zoom] + cmp eax,[buf_0.h] + jg @f + mov ecx,[buf_0.h] + sub ecx,eax + shr ecx,1 ;ecx - для центровки маленьких изображений по вертикали + @@: + .show: + stdcall [buf2d_bit_blt], buf_0, ebx,ecx, edi + shl buf2d_h,1 + shl buf2d_w,1 + pop ecx ebx eax +pop edi + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + ret + +;уменьшаем ширину кисти +align 4 +but_bru_w_m: + cmp dword[brush_w],1 + jle @f + dec dword[brush_w] + pushad + call draw_pok + call draw_plane + popad + @@: + ret +;увеличиваем ширину кисти +align 4 +but_bru_w_p: + cmp dword[brush_w],32 + jge @f + inc dword[brush_w] + pushad + call draw_pok + call draw_plane + popad + @@: + ret +;уменьшаем высоту кисти +align 4 +but_bru_h_m: + cmp dword[brush_h],1 + jle @f + dec dword[brush_h] + pushad + call draw_pok + call draw_plane + popad + @@: + ret +;увеличиваем высоту кисти +align 4 +but_bru_h_p: + cmp dword[brush_h],32 + jge @f + inc dword[brush_h] + pushad + call draw_pok + call draw_plane + popad + @@: + ret + +align 4 +but_bru_flip_h: + stdcall [buf2d_flip_h],buf_brush + call draw_plane + ret + +align 4 +but_bru_flip_v: + stdcall [buf2d_flip_v],buf_brush + call draw_plane + ret + +align 4 +but_bru_rot_90: + stdcall [buf2d_rotate],buf_brush,90 + call draw_plane + ret + +align 4 +but_brush_copy: + cmp dword[v_pen_mode],PEN_MODE_BRUSH + jne .end_f +pushad + mov eax,[v_cur_x] + mov ebx,[n_plane] + mov edx,[v_cur_y] + + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + ;преобразование координат, с учетом увеличения + ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) + mov ecx,[scaled_zoom] + + mov edi,[cam_x] + shl edi,cl + add eax,edi + mov edi,[cam_y] + shl edi,cl + add ebx,edi + mov edi,[cam_z] + shl edi,cl + add edx,edi + @@: + + cld + mov edi,brush_data + mov esi,edx + sub esi,[brush_h] + .cycle_0: + mov ecx,[brush_w] + @@: + push eax + stdcall buf2d_vox_obj_node_get_color, [open_file_vox], eax,ebx,edx, [v_zoom] + cmp eax,[v_color] + jne .end_0 + mov eax,1 shl 30 + .end_0: + mov dword[edi],eax ;color + pop eax + inc eax + add edi,4 + loop @b + dec edx + sub eax,[brush_w] + cmp edx,esi + jg .cycle_0 + + call draw_objects +popad + .end_f: + ret + +align 4 +but_brush_draw: + cmp dword[v_pen_mode],PEN_MODE_BRUSH + jne .end_f +pushad + mov eax,[v_cur_x] + mov ebx,[n_plane] + mov edx,[v_cur_y] + + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + ;преобразование координат, с учетом увеличения + ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) + mov ecx,[scaled_zoom] + + mov edi,[cam_x] + shl edi,cl + add eax,edi + mov edi,[cam_y] + shl edi,cl + add ebx,edi + mov edi,[cam_z] + shl edi,cl + add edx,edi + @@: + + cld + mov edi,brush_data + mov esi,edx + sub esi,[brush_h] + .cycle_0: + mov ecx,[brush_w] + @@: + bt dword[edi],31 ;бит прозрачности + jc .end_2 + bt dword[edi],30 ;бит текущего цвета + jnc .end_0 + push dword[v_color] + jmp .end_1 + .end_0: + push dword[edi] + .end_1: + stdcall buf2d_vox_obj_create_node, [open_file_vox], eax,ebx,edx, [v_zoom] ;, color + .end_2: + inc eax + add edi,4 + loop @b + dec edx + sub eax,[brush_w] + cmp edx,esi + jg .cycle_0 + + call draw_objects +popad + .end_f: + ret + +align 4 +but_brush_clear: + cmp dword[v_pen_mode],PEN_MODE_BRUSH + jne .end_f +pushad + mov eax,[v_cur_x] + mov ebx,[n_plane] + mov edx,[v_cur_y] + + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + ;преобразование координат, с учетом увеличения + ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) + mov ecx,[scaled_zoom] + + mov edi,[cam_x] + shl edi,cl + add eax,edi + mov edi,[cam_y] + shl edi,cl + add ebx,edi + mov edi,[cam_z] + shl edi,cl + add edx,edi + @@: + + cld + mov edi,brush_data + mov esi,edx + sub esi,[brush_h] + .cycle_0: + mov ecx,[brush_w] + @@: + bt dword[edi],31 ;бит прозрачности + jc .end_2 + stdcall buf2d_vox_obj_delete_node, [open_file_vox], eax,ebx,edx, [v_zoom] + .end_2: + inc eax + add edi,4 + loop @b + dec edx + sub eax,[brush_w] + cmp edx,esi + jg .cycle_0 + + call draw_objects +popad + .end_f: + ret + +align 4 +draw_palete: + stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер + stdcall buf2d_draw_palete, buf_0, 5,3, 9,6, 18, 512 + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + ret + +align 4 +v_zoom dd 3 ;текущий масштаб +v_cur_x dd 0 ;координата курсора x +v_cur_y dd 0 ;координата курсора y (но ось в объекте z) +n_plane dd 0 ;плоскость сечения +v_color dd 0xff ;цвет карандаша +v_pen_mode dd PEN_MODE_NONE ;режим работы курсора (см. константы PEN_MODE_...) +mode_light dd 1 ;режим освещения +cam_x dd 0 +cam_y dd 0 +cam_z dd 0 +scaled_zoom dd 5 ;масштаб после которого начинается рисование части изображения +tile_size dd ? ;размер квадратика на плоскости с сечением +max_open_file_size dd ? + +align 4 +buf_brush: ;буфер с прозрачностью для курсоров + dd brush_data ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top +brush_w dd 5 ;ширина кисти +brush_h dd 5 ;высота кисти + dd 0 ;+16 color + db 32 ;+20 bit in pixel + +brush_data dd 1 shl 31,1 shl 30,1 shl 30,1 shl 30,1 shl 31 +dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 +dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 +dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 +dd 1 shl 31,1 shl 30,1 shl 30,1 shl 30,1 shl 31 +rd 999 ;32*32-25 + +txt_zoom db 'Масштаб:',0 +txt_curor: db 'Курсор: ' +.size: rb 10 +txt_n_plane db 'Сечение:',0 +txt_color db 'Цвет:',0 +txt_brush: db 'Кисть: ' +.size: rb 10 +txt_mull db '*',0 +txt_space db ' ',0 +txt_buf rb 16 +txt_need_memory db 'Мало памяти для работы с открываемым файлом.',13,10,\ + 'При редактировании файла программа может зависнуть.',13,10,\ + 'Увеличте размер переменной ',39,'file_size',39,' в файле ',39,'vox_editor.ini',39,'.',0 + +;рисование буфера с воксельными объектами +align 4 +draw_objects: + stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер + stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер + + cmp dword[v_pen_mode],PEN_MODE_SELECT_COLOR + jne @f + call draw_palete + jmp .end_f + @@: + push eax ebx ecx + stdcall [buf2d_vox_obj_get_img_w_3g], [buf_vox],[v_zoom] + mov ebx,[buf_0.w] + sub ebx,eax + shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали + + xor ecx,ecx + stdcall [buf2d_vox_obj_get_img_h_3g], [buf_vox],[v_zoom] + cmp eax,[buf_0.h] + jg @f + mov ecx,[buf_0.h] + sub ecx,eax + shr ecx,1 ;ecx - для центровки маленьких изображений по вертикали + @@: + + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jg @f + ;обычный режим изображения + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, [buf_vox],\ + [open_file_vox], ebx,ecx, 0, eax + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_0z,\ + [open_file_vox], 0,0, eax + bt dword[mode_light],0 + jnc .end_1 + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, [buf_vox], ebx,ecx, 0, eax, 3 + .end_1: + jmp .end_0 + @@: + ;режим масштабирования изображения + sub eax,[scaled_zoom] + stdcall [buf2d_vox_obj_draw_3g_scaled], buf_0, buf_0z, [buf_vox],\ + [open_file_vox], 0,0, 0, [scaled_zoom], [cam_x],[cam_y],[cam_z],eax, [sc.work_graph] ;scroll -> 2^eax + bt dword[mode_light],0 + jnc .end_2 + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, [buf_vox], 0,0, 0, [scaled_zoom], 3 + .end_2: + .end_0: + pop ecx ebx eax + + call draw_plane + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + .end_f: + ret + +;рисование плоскости с сечением объекта +align 4 +proc draw_plane uses eax + stdcall [buf2d_clear], buf_pl, [buf_pl.color] ;чистим буфер + + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jg @f + ;обычный режим изображения + stdcall [buf2d_vox_obj_draw_pl], buf_pl, [open_file_vox],\ + OT_MAP_X,OT_MAP_Y,[tile_size], eax, [n_plane], [sc.work_graph] + jmp .end_0 + @@: + ;режим масштабирования изображения + sub eax,[scaled_zoom] + stdcall [buf2d_vox_obj_draw_pl_scaled], buf_pl, [open_file_vox],\ + OT_MAP_X,OT_MAP_Y,[tile_size], [scaled_zoom], [n_plane], [sc.work_graph],[cam_x],[cam_y],[cam_z],eax + .end_0: + + call draw_vox_cursor + stdcall [buf2d_draw], buf_pl ;обновляем буфер на экране + .end_f: + ret +endp + +;рисование курсора +align 4 +draw_vox_cursor: +pushad + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + mov ecx,[scaled_zoom] + @@: + xor edx,edx + inc edx + shl edx,cl + + mov eax,[v_cur_x] + cmp eax,edx + jge .end_f ;курсор за пределами поля + mov edi,[tile_size] + imul eax,edi + add eax,OT_MAP_X + mov ebx,edx + dec ebx + sub ebx,[v_cur_y] + imul ebx,edi + add ebx,OT_MAP_Y + inc eax + cmp dword[v_pen_mode],PEN_MODE_BRUSH + je .brush + inc ebx + sub edi,2 + stdcall [buf2d_rect_by_size], buf_pl, eax,ebx, edi,edi,[sc.work_graph] + dec ebx + add edi,2 + + ;горизонтальные линии + sub eax,2 + mov ecx,edi + imul edi,edx + shr ecx,1 + add ebx,ecx ;центровка по середине клетки + mov ecx,OT_MAP_X + add edi,ecx + stdcall [buf2d_line], buf_pl, ecx,ebx, eax,ebx,[sc.work_graph] + add eax,[tile_size] + inc eax + cmp eax,edi + jge @f ;если курсор на краю поля + dec edi + stdcall [buf2d_line], buf_pl, eax,ebx, edi,ebx,[sc.work_graph] + @@: + jmp .end_f + + ;рамка для кисти + .brush: + dec eax + mov ecx,[brush_w] + imul ecx,[tile_size] + ;mov edi,eax + mov edi,ecx + mov esi,[brush_h] + imul esi,[tile_size] + stdcall [buf2d_rect_by_size], buf_pl, eax,ebx, edi,esi,[sc.work_graph] + + ;рисование точек для кисти + mov ecx,[brush_w] + mov edx,[tile_size] + sub eax,edx ;eax-=tile_size + shr edx,2 + add eax,edx ;eax+=tile_size/4 + add ebx,edx ;ebx+=tile_size/4 + mov edx,eax + mov esi,[tile_size] + imul esi,ecx + imul ecx,[brush_h] + add esi,edx + ;eax = from edx to esi + mov edi,brush_data + cld + @@: + add eax,[tile_size] + bt dword[edi],31 + jc .no_pixel + bt dword[edi],30 + jc .sel_color + push dword[edi] + jmp .set_pixel + .sel_color: + push [v_color] + .set_pixel: + stdcall [buf2d_rect_by_size], buf_pl, eax,ebx, 3,3 ;, [edi] + .no_pixel: + add edi,4 + cmp eax,esi + jl .end_line + mov eax,edx + add ebx,[tile_size] + .end_line: + loop @b + + .end_f: +popad + ret + +;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 [v_pen_mode],eax + je @f + mov [v_pen_mode],eax + mov edx,[hot_p] + mov dx,2 ;LOAD_INDIRECT + mov ecx,[icon] + shl ecx,12 ;умножаем на 4 кб + add ecx,[buf_curs.data] + mcall SF_MOUSE_GET,SSF_LOAD_CURSOR + + cmp eax,0 + je @f + mov [cursor_pointer],eax + mcall SF_MOUSE_GET,SSF_SET_CURSOR,[cursor_pointer] + @@: + ret +endp + +;данные для диалога открытия файлов +align 4 +OpenDialog_data: +.type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию +.procinfo dd procinfo ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_path dd plugin_path ;+16 +.dir_default_path dd default_dir ;+20 +.start_path dd file_name ;+24 путь к диалогу открытия файлов +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_path dd openfile_path ;+36 путь к открываемому файлу +.filename_area dd filename_area ;+40 +.filter_area dd Filter +.x: +.x_size dw 420 ;+48 ; Window X size +.x_start dw 10 ;+50 ; Window X position +.y: +.y_size dw 320 ;+52 ; Window y size +.y_start dw 10 ;+54 ; Window Y position + +default_dir db '/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 'VOX',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 'libini.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_libini +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 + buf2d_get_pixel dd sz_buf2d_get_pixel + buf2d_flip_h dd sz_buf2d_flip_h + buf2d_flip_v dd sz_buf2d_flip_v + buf2d_rotate dd sz_buf2d_rotate + buf2d_vox_brush_create dd sz_buf2d_vox_brush_create + buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete + buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g + buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g + buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g + buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g + buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled + buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows + buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl + buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled + + 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 + sz_buf2d_get_pixel db 'buf2d_get_pixel',0 + sz_buf2d_flip_h db 'buf2d_flip_h',0 + sz_buf2d_flip_v db 'buf2d_flip_v',0 + sz_buf2d_rotate db 'buf2d_rotate',0 + sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 + sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 + sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 + sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 + sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0 + sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 + sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 + sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 + sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 + sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 + +align 4 +import_libini: + dd alib_init2 + 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_init2 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 +buf_0: dd 0 ;указатель на дaные изображения +.l: dw 5 ;+4 left +.t: dw 45 ;+6 top +.w: dd 192+6 ;+8 w +.h: dd 224+7 ;+12 h +.color: dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +;буфер глубины основного изображения +align 4 +buf_0z: dd 0 + dw 0 ;+4 left + dw 0 ;+6 top +.w: dd 192+6 ;+8 w +.h: dd 224+7 ;+12 h +.color: dd 0 ;+16 color + db 32 ;+20 bit in pixel + +;буфер для рисования среза объекта +align 4 +buf_pl: dd 0 +.l: dw 15+192+6 ;+4 left +.t: dw 45 ;+6 top +.w: dd 320 ;+8 w +.h: dd 330 ;+12 h +.color: dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +;буфер для улучшеного рендера +align 4 +buf_r_img: + rb BUF_STRUCT_SIZE +align 4 +buf_r_z: + rb BUF_STRUCT_SIZE + +align 4 +buf_curs: ;буфер с курсорами +.data: dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd 32 ;+8 w + dd 32*cursors_count ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_curs_8: ;буфер с прозрачностью для курсоров +.data: dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd 32 ;+8 w + dd 32*cursors_count ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +;данные для создания минимального единичного вокселя +align 4 +vox_6_7_z: ;воксель где видно 3 грани +dd 0,0,1,1,0,0,\ + 0,2,2,2,2,0,\ + 2,2,2,2,2,2,\ + 2,3,2,2,3,2,\ + 2,3,3,3,3,2,\ + 0,3,3,3,3,0,\ + 0,0,3,3,0,0 + +align 4 +vox_6_4_z: ;воксель, где видно 2 боковые грани а верхней грани не видно +dd 1,2,3,3,2,1,\ + 1,2,3,3,2,1,\ + 1,2,3,3,2,1,\ + 1,2,3,3,2,1 + +align 4 +buf_vox dd buf_vox_g3 + +buf_vox_g3: + db 6,7,4,3 ;w,h,h_osn,n + rb BUF_STRUCT_SIZE*(3+1) + +align 4 +buf_vox_g2: + db 6,4,0,3 ;w,h,h_osn,n + rb BUF_STRUCT_SIZE*(3+1) + +align 16 +i_end: + procinfo process_information + sc system_colors + mouse_dd dd ? + cursor_pointer dd ? ;указатель на данные для курсора + wnd_s_pos: ;место для настроек стартовой позиции окна + rq 0 + rb 4096 +align 16 +stacktop: + sys_path rb 1024 + file_name rb 2048 ;4096 + plugin_path rb 1024 ;4096 + openfile_path rb 4096 + filename_area rb 256 +mem: diff --git a/programs/other/t_edit/t_edit.asm b/programs/other/t_edit/t_edit.asm index b130f55f9..130579161 100644 --- a/programs/other/t_edit/t_edit.asm +++ b/programs/other/t_edit/t_edit.asm @@ -93,7 +93,7 @@ mov ebp,lib0 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 + include_image_file '..\..\media\log_el\tl_sys_16.png', icon_tl_sys mov eax,dword[icon_tl_sys] mov dword[tree1.data_img_sys],eax ; внедряем файл с иконками узлов diff --git a/programs/other/t_edit_synt/te_syntax.asm b/programs/other/t_edit_synt/te_syntax.asm index 1e8aaacb0..68f3d1ca6 100644 --- a/programs/other/t_edit_synt/te_syntax.asm +++ b/programs/other/t_edit_synt/te_syntax.asm @@ -50,7 +50,7 @@ start: stdcall [tl_data_init], tree1 ; читаем файл с курсорами и линиями - include_image_file '..\..\media\log_el\trunk\tl_sys_16.png', icon_tl_sys + include_image_file '..\..\media\log_el\tl_sys_16.png', icon_tl_sys mov eax,[icon_tl_sys] mov [tree1.data_img_sys],eax ;---------------------------------------------------------------------