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: #417
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Burer <burer@noreply.localhost>
Co-authored-by: Andrew <dent.ace@gmail.com>
Co-committed-by: Andrew <dent.ace@gmail.com>
This commit was merged in pull request #417.
This commit is contained in:
2026-04-11 09:21:42 +00:00
committed by Burer
parent d6a1b56b7f
commit 33acd57c58
90 changed files with 7508 additions and 7451 deletions
+8 -8
View File
@@ -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"},
+11 -12
View File
@@ -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
@@ -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

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before

Width:  |  Height:  |  Size: 192 B

After

Width:  |  Height:  |  Size: 192 B

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 670 B

After

Width:  |  Height:  |  Size: 670 B

Before

Width:  |  Height:  |  Size: 960 B

After

Width:  |  Height:  |  Size: 960 B

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

@@ -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())

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before

Width:  |  Height:  |  Size: 644 B

After

Width:  |  Height:  |  Size: 644 B

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because it is too large Load Diff
@@ -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())
@@ -1,9 +1,12 @@
; SPDX-License-Identifier: NOASSERTION
;
;
; Ok, this is the sceleton that MENUET 0.01 understands.
; Do not change the header bits for now. Compile with nasm.
;
include '..\..\..\macros.inc'
include '..\..\macros.inc'
use32
org 0x0
@@ -295,6 +298,3 @@ errorlen2:
base db 0x0
I_END:
@@ -1,331 +1,337 @@
;*********************************
;* *
;* 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:
; 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:
File diff suppressed because it is too large Load Diff
@@ -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())
File diff suppressed because it is too large Load Diff
@@ -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:

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before

Width:  |  Height:  |  Size: 209 B

After

Width:  |  Height:  |  Size: 209 B

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

@@ -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
@@ -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
@@ -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
+1 -1
View File
@@ -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
; внедряем файл с иконками узлов
+1 -1
View File
@@ -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
;---------------------------------------------------------------------