diff --git a/data/Tupfile.lua b/data/Tupfile.lua index f03ce45ad9..339ec27ffb 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -239,6 +239,7 @@ extra_files = { {"kolibrios/lib/i915_dri.drv", "common/lib/i915_dri.drv"}, {"kolibrios/media/fplay", "common/media/fplay"}, {"kolibrios/media/fplay_run", "common/media/fplay_run"}, + {"kolibrios/media/minimp3", "common/media/minimp3"}, {"kolibrios/media/updf", "common/media/updf"}, {"kolibrios/media/vttf", "common/media/vttf"}, {"kolibrios/media/zsea/zsea.ini", PROGS .. "/media/zsea/zSea.ini"}, diff --git a/data/common/media/minimp3 b/data/common/media/minimp3 new file mode 100644 index 0000000000..e76b106b46 Binary files /dev/null and b/data/common/media/minimp3 differ diff --git a/programs/cmm/mousecfg/mousecfg.c b/programs/cmm/mousecfg/mousecfg.c index c6e2e1bdc3..9fffe6ca1e 100644 --- a/programs/cmm/mousecfg/mousecfg.c +++ b/programs/cmm/mousecfg/mousecfg.c @@ -1,4 +1,4 @@ -// Mouse Configuration Utility ver 1.61 +// Mouse Configuration Utility ver 1.62 #ifndef AUTOBUILD #include "lang.h--" @@ -25,6 +25,9 @@ ?define DOUBLE_CLICK_TEXT "Задержка двойного клика мышью" ?define MOUSE_EMULATION "Управление указателем мыши через клавиатуру" ?define MADMOUSE "Сквозные для курсора стороны экрана" + ?define COMMOUSE "Загрузить драйвер мыши для COM-порта (F10)" + ?define COMMOUSE_LOADED "'Драйвер для COM мыши был загружен' -O" + ?define COMMOUSE_CAN_NOT_UNLOAD "'Остановка драйвера невозможна' -W" #else ?define WINDOW_TITLE "Mouse testing and configuration" ?define CHECK_MOUSE_1 "Click on this area to" @@ -34,16 +37,22 @@ ?define DOUBLE_CLICK_TEXT "Mouse double click delay" ?define MOUSE_EMULATION "Enable mouse emulation using keyboard NumPad" ?define MADMOUSE "Through screen sides for pointer" + ?define COMMOUSE "Load mouse driver for COM-port (F10)" + ?define COMMOUSE_LOADED "'Driver for COM mouse loaded' -O" + ?define COMMOUSE_CAN_NOT_UNLOAD "'Driver stop is impossible' -W" #endif -:block mouse_frame = { 18, 18, NULL, 130 }; +#define FRAME_X 18 +#define FRAME_Y 18 +:block mouse_frame = { FRAME_X, FRAME_Y, NULL, 130 }; :more_less_box pointer_speed = { NULL, 0, 64, POINTER_SPEED }; :more_less_box acceleration = { NULL, 0, 64, ACCELERATION_TEXT }; :more_less_box double_click_delay = { NULL, 0, 999, DOUBLE_CLICK_TEXT, 8 }; :checkbox emulation = { MOUSE_EMULATION, NULL }; :checkbox madmouse = { MADMOUSE, NULL }; +:checkbox com_mouse = { COMMOUSE, NULL }; -_ini ini = { "/sys/settings/system.ini", "mouse" }; +_ini ini = { "/sys/settings/system.ini", "loaded drivers" }; void main() { proc_info Form; @@ -70,33 +79,37 @@ void main() { else IF (pointer_speed.click(id)) ApplyCfg(); else IF (acceleration.click(id)) ApplyCfg(); else IF (double_click_delay.click(id)) ApplyCfg(); - ELSE IF (emulation.click(id)) { + else IF (emulation.click(id)) { IF (emulation.checked == true) RunProgram("/sys/mousemul", 0); ELSE KillProcessByName("mousemul", SINGLE); break; } - ELSE IF (madmouse.click(id)) { + else IF (madmouse.click(id)) { IF (madmouse.checked == true) RunProgram("/sys/madmouse", 0); ELSE KillProcessByName("madmouse", SINGLE); break; } + else IF (id == com_mouse.id) { + EventClickComMouse(); + } break; case evKey: GetKeys(); IF (key_scancode == SCAN_CODE_ESC) ExitApp(); + IF (key_scancode == SCAN_CODE_F10) EventClickComMouse(); break; case evReDraw: system.color.get(); - DefineAndDrawWindow(430, 150, 424, 313+skin_height,0x34,system.color.work,WINDOW_TITLE,0); + DefineAndDrawWindow(430, 150, 424, 343+skin_height,0x34,system.color.work,WINDOW_TITLE,0); GetProcessInfo(#Form, SelfInfo); if (Form.status_window>2) break; - mouse_frame.w = - mouse_frame.x * 2 + Form.cwidth; - DefineButton(mouse_frame.x, mouse_frame.y, mouse_frame.w, + mouse_frame.w = - FRAME_X * 2 + Form.cwidth; + DefineButton(FRAME_X, FRAME_Y, mouse_frame.w, mouse_frame.h, 99+BT_NOFRAME, 0xF0F2F3); //needed to handle mouse_up and refresh mouse image - WriteText(mouse_frame.x + 110, mouse_frame.y + 25, 0x90, 0x2C343C, CHECK_MOUSE_1); - WriteText(mouse_frame.x + 110, mouse_frame.y + 45, 0x90, 0x2C343C, CHECK_MOUSE_2); + WriteText(FRAME_X + 110, FRAME_Y + 25, 0x90, 0x2C343C, CHECK_MOUSE_1); + WriteText(FRAME_X + 110, FRAME_Y + 45, 0x90, 0x2C343C, CHECK_MOUSE_2); DrawMouseImage(0,0,0,0); DrawControls(); } @@ -132,26 +145,26 @@ void DrawMouseImage(dword l,r,m,v) { void DrawControls() { incn y; - y.n = mouse_frame.y+115; - pointer_speed.draw(mouse_frame.x, y.inc(30)); - acceleration.draw(mouse_frame.x, y.inc(30)); - double_click_delay.draw(mouse_frame.x, y.inc(30)); - emulation.draw(mouse_frame.x, y.inc(33)); - madmouse.draw(mouse_frame.x, y.inc(27)); + y.n = FRAME_Y+115; + pointer_speed.draw(FRAME_X, y.inc(30)); + acceleration.draw(FRAME_X, y.inc(30)); + double_click_delay.draw(FRAME_X, y.inc(30)); + emulation.draw(FRAME_X, y.inc(33)); + madmouse.draw(FRAME_X, y.inc(27)); + com_mouse.draw(FRAME_X, y.inc(27)); } void LoadCfg() { - acceleration.value = ini.GetInt("acceleration", GetMouseAcceleration()); - pointer_speed.value = ini.GetInt("speed", GetMouseSpeed()); - double_click_delay.value = ini.GetInt("double_click_delay", GetMouseDoubleClickDelay()); + acceleration.value = GetMouseAcceleration(); + pointer_speed.value = GetMouseSpeed(); + double_click_delay.value = GetMouseDoubleClickDelay(); + com_mouse.checked = ini.GetInt("com_mouse", 0); madmouse.checked = CheckProcessExists("MADMOUSE"); emulation.checked = CheckProcessExists("MOUSEMUL"); } void ExitApp() { - ini.SetInt("acceleration", acceleration.value); - ini.SetInt("speed", pointer_speed.value); - ini.SetInt("double_click_delay", double_click_delay.value); + ini.SetInt("com_mouse", com_mouse.checked); ExitProcess(); } @@ -161,4 +174,22 @@ void ApplyCfg() { SetMouseDoubleClickDelay(double_click_delay.value); } +void EventClickComMouse() +{ + if (!com_mouse.checked) + { + if (RunProgram("/sys/loaddrv", "COMMOUSE")>=0) { + notify(COMMOUSE_LOADED); + com_mouse.click(com_mouse.id); + } + else { + notify("'Error running LOADDRV' -E"); + } + } + else + { + notify(COMMOUSE_CAN_NOT_UNLOAD); + } +} + stop: diff --git a/programs/media/piano/Tupfile.lua b/programs/media/piano/Tupfile.lua new file mode 100644 index 0000000000..798fc76452 --- /dev/null +++ b/programs/media/piano/Tupfile.lua @@ -0,0 +1,2 @@ +if tup.getconfig("NO_FASM") ~= "" then return end +tup.rule("piano.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "piano") diff --git a/programs/media/piano/build.bat b/programs/media/piano/build.bat new file mode 100644 index 0000000000..bcfe7ec327 --- /dev/null +++ b/programs/media/piano/build.bat @@ -0,0 +1,3 @@ +@fasm.exe piano.asm piano + +pause \ No newline at end of file diff --git a/programs/media/piano/piano.asm b/programs/media/piano/piano.asm new file mode 100644 index 0000000000..6e34d48e91 --- /dev/null +++ b/programs/media/piano/piano.asm @@ -0,0 +1,959 @@ +; Простой пример программы для KolibriOS +; озвучивает код нажатой клавиши +; +; Компилировать FASM'ом +; Можно открыть example.asm через программу FASM (её ярлык есть +; на рабочем столе) +; А можно просто нажать F9 в Tinypad'е. Лог компиляции +; отображается на доске отладки (программа BOARD) +; +; Что важно знать при программировании под Колибри: +; Номер функции помещается в регистр eax. +; Вызов системной функции осуществляется командой "int 0x40". +; Все регистры, кроме явно указанных в возвращаемом значении, +; включая регистр флагов eflags, сохраняются. +; +; Пример: +; mov eax, 1 ;Функция 1 - поставить точку в окне +; ;список сисфункций см. в DOCPACK - sysfuncr.txt +; mov ebx, 10 ; координата x=10 +; mov ecx, 20 ; координата y=10 +; mov edx, 0xFFFfff ;цвет точки +; int 0x40 ;вызвать функцию +; +; Тоже самое с использованием макроса: +; mcall 1, 10, 20, 0xFFFfff +;--------------------------------------------------------------------- + + use32 ; включить 32-битный режим ассемблера + org 0 ; адресация с нуля + + db 'MENUET01' ; 8-байтный идентификатор MenuetOS + dd 1 ; версия заголовка (всегда 1) + dd START ; адрес первой команды + dd I_END ; размер программы + dd MEM ; количество памяти + dd STACKTOP ; адрес вершины стэка + dd 0 ; адрес буфера для параметров + dd 0 ; зарезервировано + +include "../../macros.inc" ; макросы облегчают жизнь ассемблерщиков! + +;--------------------------------------------------------------------- +;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- +;--------------------------------------------------------------------- + +START: + +red: ; перерисовать окно + + call draw_window ; вызываем процедуру отрисовки окна + +;--------------------------------------------------------------------- +;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- +;--------------------------------------------------------------------- + +still: + ;mcall 10 ; функция 10 - ждать события + mov eax, 10 + int 0x40 + + cmp eax,2 ; нажата клавиша ? + je key ; если да - на key + cmp eax,3 ; нажата кнопка ? + je button ; если да - на button + cmp eax,1 ; перерисовать окно ? + je red ; если да - на метку red + + jmp still ; если другое событие - в начало цикла + + + +;--------------------------------------------------------------------- + + + key: ; нажата клавиша на клавиатуре + mcall 2 ; функция 2 - считать код символа (в ah) + + + cmp ah, 0x41 ; A - if Caps Lock ON + jnz @f + jmp _07 + @@: + cmp ah, 0x5a ; Z + jnz @f + jmp _08 + @@: + cmp ah, 0x53 ; S + jnz @f + jmp _09 + @@: + cmp ah, 0x58 ; X + jnz @f + jmp _0a + @@: + cmp ah, 0x44 ; D + jnz @f + jmp _0b + @@: + cmp ah, 0x43 ; C + jnz @f + jmp _0c + @@: + cmp ah, 0x56 ; V + jnz @f + _01: + mov ah, 0x01 + jmp p + @@: + cmp ah, 0x47 ; G + jnz @f + _02: + mov ah, 0x02 + jmp p + @@: + cmp ah, 0x42 ; B + jnz @f + _03: + mov ah, 0x03 + jmp p + @@: + cmp ah, 0x48 ; H + jnz @f + _04: + mov ah, 0x04 + jmp p + @@: + cmp ah, 0x4e ; N + jnz @f + _05: + mov ah, 0x05 + jmp p + @@: + cmp ah, 0x4d ; M + jnz @f + _06: + mov ah, 0x06 + jmp p + @@: + cmp ah, 0x4b ; K + jnz @f + _07: + mov ah, 0x07 + jmp p + @@: + cmp ah, 0x3c ; < + jnz @f + _08: + mov ah, 0x08 + jmp p + @@: + cmp ah, 0x4c ; L + jnz @f + _09: + mov ah, 0x09 + jmp p + @@: + cmp ah, 0x3e ; > + jnz @f + _0a: + mov ah, 0x0a + jmp p + @@: + cmp ah, 0x3a ; : + jnz @f + _0b: + mov ah, 0x0b + jmp p + @@: + cmp ah, 0x3f ; ? + jnz @f + _0c: + mov ah, 0x0c + jmp p + @@: + cmp ah, 0x22 ; " + jnz @f + jmp _11 + @@: + cmp ah, 0x21 ; key !------- + jnz @f + jmp _0c + @@: + cmp ah, 0x51 ; key Q + jnz @f + _11: + mov ah, 0x11 + jmp p + @@: + cmp ah, 0x40 ; key @ + jnz @f + _12: + mov ah, 0x12 + jmp p + @@: + cmp ah, 0x57 ; key W + jnz @f + _13: + mov ah, 0x13 + jmp p + @@: + cmp ah, 0x23 ; key # + jnz @f + _14: + mov ah, 0x14 + jmp p + @@: + cmp ah, 0x45 ; key E + jnz @f + _15: + mov ah, 0x15 + jmp p + @@: + cmp ah, 0x52 ; key R + jnz @f + _16: + mov ah, 0x16 + jmp p + @@: + cmp ah, 0x25 ; key % + jnz @f + jmp _17 + @@: + cmp ah, 0x54 ; key T + jnz @f + jmp _18 + @@: + cmp ah, 0x5e ; key ^ + jnz @f + jmp _19 + @@: + cmp ah, 0x59 ; key Y + jnz @f + jmp _1a + @@: + cmp ah, 0x26 ; key & + jnz @f + jmp _1b + @@: + cmp ah, 0x55 ; key U + jnz @f + jmp _1c + @@: + cmp ah, 0x49 ; key I + jnz @f + jmp _21 + @@: + cmp ah, 0x28 ; key ( + jnz @f + jmp _22 + @@: + cmp ah, 0x4f ; key O + jnz @f + jmp _23 + @@: + cmp ah, 0x29 ; key ) + jnz @f + jmp _24 + @@: + cmp ah, 0x50 ; key P + jnz @f + jmp _25 + @@: + cmp ah, 0x7b ; key { + jnz @f + jmp _26 + @@: + cmp ah, 0x2b ; key + + jnz @f + jmp _27 + @@: + cmp ah, 0x7d ; key } + jnz @f + jmp _28 + @@: + cmp ah, 0x7c ; key | + jnz @f + jmp _29 + @@: + cmp ah, 0x61 ; a - if Caps Lock OFF + jnz @f + _17: + mov ah, 0x17 + jmp p + @@: + cmp ah, 0x7a ; z + jnz @f + _18: + mov ah, 0x18 + jmp p + @@: + cmp ah, 0x73 ; s + jnz @f + _19: + mov ah, 0x19 + jmp p + @@: + cmp ah, 0x78 ; x + jnz @f + _1a: + mov ah, 0x1a + jmp p + @@: + cmp ah, 0x64 ; d + jnz @f + _1b: + mov ah, 0x1b + jmp p + @@: + cmp ah, 0x63 ; c + jnz @f + _1c: + mov ah, 0x1c + jmp p + @@: + cmp ah, 0x76 ; v + jnz @f + _21: + mov ah, 0x21 + jmp p + @@: + cmp ah, 0x67 ; g + jnz @f + _22: + mov ah, 0x22 + jmp p + @@: + cmp ah, 0x62 ; b + jnz @f + _23: + mov ah, 0x23 + jmp p + @@: + cmp ah, 0x68 ; h + jnz @f + _24: + mov ah, 0x24 + jmp p + @@: + cmp ah, 0x6e ; n + jnz @f + _25: + mov ah, 0x25 + jmp p + @@: + cmp ah, 0x6d ; m + jnz @f + _26: + mov ah, 0x26 + jmp p + @@: + cmp ah, 0x6b ; k + jnz @f + _27: + mov ah, 0x27 + jmp p + @@: + cmp ah, 0x2c ; , + jnz @f + _28: + mov ah, 0x28 + jmp p + @@: + cmp ah, 0x6c ; l + jnz @f + _29: + mov ah, 0x29 + jmp p + @@: + cmp ah, 0x2e ; . + jnz @f + _2a: + mov ah, 0x2a + jmp p + @@: + cmp ah, 0x3b ; ; + jnz @f + _2b: + mov ah, 0x2b + jmp p + @@: + cmp ah, 0x2f ; / + jnz @f + _2c: + mov ah, 0x2c + jmp p + @@: + cmp ah, 0x27 ; ' + jnz @f + _31: + mov ah, 0x31 + jmp p + @@: + cmp ah, 0x60 ; key ` + jnz @f + jmp _2c + @@: + cmp ah, 0x09 ; key tab + jnz @f + jmp _31 + @@: + cmp ah, 0x31 ; key 1 + jnz @f + _32: + mov ah, 0x32 + jmp p + @@: + cmp ah, 0x71 ; key q + jnz @f + _33: + mov ah, 0x33 + jmp p + @@: + cmp ah, 0x32 ; key 2 + jnz @f + _34: + mov ah, 0x34 + jmp p + @@: + cmp ah, 0x77 ; key w + jnz @f + _35: + mov ah, 0x35 + jmp p + @@: + cmp ah, 0x65 ; key e + jnz @f + _36: + mov ah, 0x36 + jmp p + @@: + cmp ah, 0x34 ; key 4 + jnz @f + _37: + mov ah, 0x37 + jmp p + @@: + cmp ah, 0x72 ; key r + jnz @f + _38: + mov ah, 0x38 + jmp p + @@: + cmp ah, 0x35 ; key 5 + jnz @f + _39: + mov ah, 0x39 + jmp p + @@: + cmp ah, 0x74 ; key t + jnz @f + _3a: + mov ah, 0x3a + jmp p + @@: + cmp ah, 0x36 ; key 6 + jnz @f + _3b: + mov ah, 0x3b + jmp p + @@: + cmp ah, 0x79 ; key y + jnz @f + _3c: + mov ah, 0x3c + jmp p + @@: + cmp ah, 0x75 ; key u + jnz @f + _41: + mov ah, 0x41 + jmp p + @@: + cmp ah, 0x38 ; key 8 + jnz @f + mov ah, 0x42 + jmp p + @@: + cmp ah, 0x69 ; key i + jnz @f + mov ah, 0x43 + jmp p + @@: + cmp ah, 0x39 ; key 9 + jnz @f + mov ah, 0x44 + jmp p + @@: + cmp ah, 0x6f ; key o + jnz @f + mov ah, 0x45 + jmp p + @@: + cmp ah, 0x70 ; key p + jnz @f + mov ah, 0x46 + jmp p + @@: + cmp ah, 0x2d ; key - + jnz @f + mov ah, 0x47 + jmp p + @@: + cmp ah, 0x5b ; key [ + jnz @f + mov ah, 0x48 + jmp p + @@: + cmp ah, 0x3d ; key = + jnz @f + mov ah, 0x49 + jmp p + @@: + cmp ah, 0x5d ; key ] + jnz @f + mov ah, 0x4a + jmp p + @@: + cmp ah, 0x5c ; key \ + jnz @f + mov ah, 0x4b + jmp p + @@: + cmp ah, 0x08 ; key backspace + jnz @f + mov ah, 0x4c + jmp p + @@: + cmp ah, 0x0d ; key enter + jnz @f + mov ah, 0x51 + jmp p + @@: + cmp ah, 0x66 ; key f + jnz @f + mov ah, 0x01 + jmp p + @@: + cmp ah, 0x6a ; key j + jnz @f + mov ah, 0x05 + jmp p + @@: + cmp ah, 0x33 ; key 3 + jnz @f + mov ah, 0x08 + jmp p + @@: + cmp ah, 0x37 ; key 7 + jnz @f + jmp _11 + @@: + cmp ah, 0x30 ; key 0 + jnz @f + jmp _15 + @@: + cmp ah, 0xb4 ; key home + jnz @f + mov ah, 0x10 + jmp p + @@: + cmp ah, 0xb5 ; key end + jnz @f + _70: + mov ah, 0xfc + jmp p + @@: + cmp ah, 0xb8 ; key Page Up + jnz @f + mov ah, 0x20 + jmp p + @@: + cmp ah, 0xb7 ; key Page Down + jnz @f + jmp _70 + @@: + cmp ah, 0xff ; key F12 + jnz @f + mov ah, 0x00 + jmp p + @@: + cmp ah, 0xb6 ; key Del + jnz @f + jmp _70 + @@: + + p: + mov [M+1], ah ; записать код символа как код ноты + + ; функция 55-55: системный динамик ("PlayNote") + ; esi - адрес мелодии + + mov eax,55 + mov ebx,eax + mov esi,M + int 0x40 + + ; или коротко: + ;mcall 55, , , , Music + + jmp still ; вернуться к началу цикла + + +;--------------------------------------------------------------------- + + button: + mcall 17 ; 17 - получить идентификатор нажатой кнопки + + cmp ah, 0xa1 ; button 1 + jnz @f + jmp _01 + @@: + cmp ah, 0x02 ; button 2 + jnz @f + jmp _02 + @@: + cmp ah, 0x03 ; button 3 + jnz @f + jmp _03 + @@: + cmp ah, 0x04 + jnz @f + jmp _04 + @@: + cmp ah, 0x05 + jnz @f + jmp _05 + @@: + cmp ah, 0x06 + jnz @f + jmp _06 + @@: + cmp ah, 0x07 + jnz @f + jmp _07 + @@: + cmp ah, 0x08 ; button 8 + jnz @f + jmp _08 + @@: + cmp ah, 0x09 + jnz @f + jmp _09 + @@: + cmp ah, 0x0a ; button 10 + jnz @f + jmp _0a + @@: + cmp ah, 0x0b + jnz @f + jmp _0b + @@: + cmp ah, 0x0c ; button 12 + jnz @f + jmp _0c + @@: + + cmp ah, 0x11 + jnz @f + jmp _11 + @@: + cmp ah, 0x12 + jnz @f + jmp _12 + @@: + cmp ah, 0x13 + jnz @f + jmp _13 + @@: + cmp ah, 0x14 + jnz @f + jmp _14 + @@: + cmp ah, 0x15 + jnz @f + jmp _15 + @@: + cmp ah, 0x16 + jnz @f + jmp _16 + @@: + cmp ah, 0x17 + jnz @f + jmp _17 + @@: + cmp ah, 0x18 + jnz @f + jmp _18 + @@: + cmp ah, 0x19 + jnz @f + jmp _19 + @@: + cmp ah, 0x1a + jnz @f + jmp _1a + @@: + cmp ah, 0x1b + jnz @f + jmp _1b + @@: + cmp ah, 0x1c + jnz @f + jmp _1c + @@: + + cmp ah, 0x21 ; button 1 + jnz @f + jmp _21 + @@: + cmp ah, 0x22 + jnz @f + jmp _22 + @@: + cmp ah, 0x23 ; button 3 + jnz @f + jmp _23 + @@: + cmp ah, 0x24 + jnz @f + jmp _24 + @@: + cmp ah, 0x25 ; button 5 + jnz @f + jmp _25 + @@: + cmp ah, 0x26 + jnz @f + jmp _26 + @@: + cmp ah, 0x27 ; button 7 + jnz @f + jmp _27 + @@: + cmp ah, 0x28 + jnz @f + jmp _28 + @@: + cmp ah, 0x29 ; button 9 + jnz @f + jmp _29 + @@: + cmp ah, 0x2a + jnz @f + jmp _2a + @@: + cmp ah, 0x2b ; button 11 + jnz @f + jmp _2b + @@: + cmp ah, 0x2c + jnz @f + jmp _2c + @@: + cmp ah, 0x31 + jnz @f + jmp _31 + + @@: + cmp ah, 0x32 + jnz @f + jmp _32 + @@: + cmp ah, 0x33 + jnz @f + jmp _33 + @@: + cmp ah, 0x34 + jnz @f + jmp _34 + @@: + cmp ah, 0x35 + jnz @f + jmp _35 + @@: + cmp ah, 0x36 + jnz @f + jmp _36 + @@: + cmp ah, 0x37 + jnz @f + jmp _37 + @@: + cmp ah, 0x38 + jnz @f + jmp _38 + @@: + cmp ah, 0x39 + jnz @f + jmp _39 + @@: + cmp ah, 0x3a + jnz @f + jmp _3a + @@: + cmp ah, 0x3b + jnz @f + jmp _3b + @@: + cmp ah, 0x3c + jnz @f + jmp _3c + @@: + cmp ah, 0x41 + jnz @f + jmp _41 + @@: + + cmp ah, 1 ; если НЕ нажата кнопка с номером 1, + jne still ; вернуться + + .exit: + mcall -1 ; иначе конец программы + + +;--------------------------------------------------------------------- +;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ---------------------------------- +;--------------------------------------------------------------------- + +draw_window: + + mcall 12, 1 ; функция 12: сообщить ОС о начале отрисовки + + mcall 48, 3, sc,sizeof.system_colors + + ; далее: сначала длинный вариант (закомментированный) + ; затем короткий аналог с использованием макросов + +; mov eax,0 ; функция 0: определить окно +; mov ebx,200*65536+300 ; [x старт] *65536 + [x размер] +; mov ecx,200*65536+150 ; [y старт] *65536 + [y размер] +; mov edx, [sc.work] ; цвет фона +; or edx, 0x33000000 ; и тип окна 3 +; mov edi,header ; ЗАГОЛОВОК ОКНА +; int 0x40 + + mov edx, [sc.work] ; цвет фона + or edx, 0x33000000 ; и тип окна 3 + mcall 0, <0,760>, <200,250>, , ,title + + mcall 8, <0,50>, <0,100>, 0x21, 0xff7a74 + mcall 8, <50,50>, <0,100>, 0x23, 0x907040 + mcall 8, <100,50>, <0,100>, 0x25, 0xa08050 + mcall 8, <150,50>, <0,100>, 0x26, 0xb09060 + mcall 8, <200,50>, <00,100>, 0x28, 0xc0a070 + mcall 8, <250,50>, <00,100>, 0x2a, 0xd0b080 + mcall 8, <300,50>, <0,100>, 0x2c, 0xe0c090 + mcall 8, <350,50>, <0,100>, 0x31, 0xffa97c + mcall 8, <400,50>, <0,100>, 0x33, 0xaf8d8d + mcall 8, <450,50>, <0,100>, 0x35, 0xbf9d9d + mcall 8, <500,50>, <0,100>, 0x36, 0xcfadad + mcall 8, <550,50>, <00,100>, 0x38, 0xdfbdbd + mcall 8, <600,50>, <00,100>, 0x3a, 0xefcdcd + mcall 8, <650,50>, <0,100>, 0x3c, 0xffdddd + mcall 8, <700,50>, <0,100>, 0x41, 0xffe558 + + mcall 8, <35,30>, <0,50>, 0x22, 0x221100 + mcall 8, <85,30>, <0,50>, 0x24, 0x221100 + mcall 8, <185,30>, <0,50>, 0x27, 0x221100 + mcall 8, <235,30>, <0,50>, 0x29, 0x221100 + mcall 8, <285,30>, <0,50>, 0x2b, 0x221100 + mcall 8, <385,30>, <0,50>, 0x32, 0x221100 + mcall 8, <435,30>, <0,50>, 0x34, 0x221100 + mcall 8, <535,30>, <0,50>, 0x37, 0x221100 + mcall 8, <585,30>, <0,50>, 0x39, 0x221100 + mcall 8, <635,30>, <0,50>, 0x3b, 0x221100 + + mcall 8, <0,50>, <100,100>, 0xa1, 0x702050 + mcall 8, <50,50>, <100,100>, 0x03, 0x683638 + mcall 8, <100,50>, <100,100>, 0x05, 0x784648 + mcall 8, <150,50>, <100,100>, 0x06, 0x885658 + mcall 8, <200,50>, <100,100>, 0x08, 0x986668 + mcall 8, <250,50>, <100,100>, 0x0a, 0xa87678 + mcall 8, <300,50>, <100,100>, 0x0c, 0xb88688 + mcall 8, <350,50>, <100,100>, 0x11, 0x880040 + mcall 8, <400,50>, <100,100>, 0x13, 0x90622b + mcall 8, <450,50>, <100,100>, 0x15, 0xa0723b + mcall 8, <500,50>, <100,100>, 0x16, 0xb0824b + mcall 8, <550,50>, <100,100>, 0x18, 0xc0925b + mcall 8, <600,50>, <100,100>, 0x1a, 0xd0a26b + mcall 8, <650,50>, <100,100>, 0x1c, 0xe0b27b + mcall 8, <700,50>, <100,100>, 0x21, 0xff7a74 + + mcall 8, <35,30>, <100,50>, 0x02, 0x221100 + mcall 8, <85,30>, <100,50>, 0x04, 0x221100 + mcall 8, <185,30>, <100,50>, 0x07, 0x221100 + mcall 8, <235,30>, <100,50>, 0x09, 0x221100 + mcall 8, <285,30>, <100,50>, 0x0b, 0x221100 + mcall 8, <385,30>, <100,50>, 0x12, 0x221100 + mcall 8, <435,30>, <100,50>, 0x14, 0x221100 + mcall 8, <535,30>, <100,50>, 0x17, 0x221100 + mcall 8, <585,30>, <100,50>, 0x19, 0x221100 + mcall 8, <635,30>, <100,50>, 0x1b, 0x221100 + + + ; вывод текстовой строки + mov ecx, [sc.work_text] ; цвет фона + or ecx, 0x90000000 ; и тип строки + mcall 4, <50, 205>, , message + mcall 4, <10, 235>, , message1 + mcall 4, <10, 260>, , message2 + mcall 4, <10, 285>, , message3 + mcall 4, <10, 310>, , message4 + mcall 4, <15, 185>, , message5 + mcall 4, <65, 185>, , message6 + mcall 4, <115, 185>, , message7 + mcall 4, <165, 185>, , message8 + mcall 4, <210, 185>, , message9 + mcall 4, <265, 185>, , message10 + mcall 4, <315, 185>, , message11 + mcall 4, <365, 185>, , message5 + + mcall 12, 2 ; функция 12.2, закончили рисовать + + ret ; выходим из процедуры + + +;--------------------------------------------------------------------- +;--- ДАННЫЕ ПРОГРАММЫ ---------------------------------------------- +;--------------------------------------------------------------------- + + +; Второй байт в M (Music) изменяется нажатием клавиши + +M: + db 0x90, 0x30, 0 + + +sc system_colors + +message db 'Справка: щёлкните 2 раза на заголовке.',0 +message1 db 'Нажмите любую клавишу в английской раскладке - ',0 +message2 db 'должен звучать динамик компьютера.',0 +message3 db 'Нота "До" - клавиши V,Tab,U,Enter, при включении',0 +message4 db 'Caps Lock - клавиши V,Q,I.',0 +message5 db 'ДО',0 +message6 db 'РЕ',0 +message7 db 'МИ',0 +message8 db 'ФА',0 +message9 db 'СОЛЬ',0 +message10 db 'ЛЯ',0 +message11 db 'СИ',0 +title db 'Детское пианино',0 + +;--------------------------------------------------------------------- + +I_END: ; метка конца программы + rb 4096 ; память для стека +align 16 +STACKTOP: ; метка вершины стека (при заполнении стек + ; растет в сторону уменьшения адресов, потому + ; память для него в коде программы встречается + ; раньше чем его вершина) +MEM: ; метка указывающая на конец программы плюс + ; размер используемой ею оперативной памяти +; Адрес метки MEM всегда должен быть больше чем адрес метки I_END. +; Метка STACKTOP должна располагается после метки I_END и перед меткой +; MEM. STACKTOP может находится и перед I_END, но это не правильно. +; Имена меток могут быть с любыми названиями, главное соблюдать +; правильный порядок их расположения. \ No newline at end of file