diff --git a/data/Tupfile.lua b/data/Tupfile.lua index 4a6e32f65..4e92f48dd 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -473,6 +473,7 @@ tup.append_table(img_files, { {"DEVELOP/HEED", VAR_PROGS .. "/develop/heed/trunk/heed"}, {"DEVELOP/KEYASCII", VAR_PROGS .. "/develop/keyascii/trunk/keyascii"}, {"DEVELOP/MTDBG", VAR_PROGS .. "/develop/mtdbg/mtdbg"}, + {"DEVELOP/MSTATE", VAR_PROGS .. "/develop/mstate/mstate"}, {"DEVELOP/SCANCODE", VAR_PROGS .. "/develop/scancode/trunk/scancode"}, {"DEVELOP/EXAMPLES/CIRCLE", VAR_PROGS .. "/develop/examples/circle/trunk/circle"}, {"DEVELOP/EXAMPLES/COLORREF", VAR_PROGS .. "/demos/colorref/trunk/colorref"}, @@ -647,7 +648,6 @@ tup.append_table(img_files, { {"LOD", VAR_PROGS .. "/fs/lod/lod"}, {"TIMER", VAR_PROGS .. "/other/Timer/timer"}, {"TINFO", VAR_PROGS .. "/system/tinfo/tinfo"}, - {"DEVELOP/MSTATE", VAR_PROGS .. "/develop/mstate/mstate"}, {"DEVELOP/GENFILES", VAR_PROGS .. "/testing/genfiles/GenFiles"}, {"MEDIA/FILLSCR", VAR_PROGS .. "/media/FillScr/fillscr"}, }) diff --git a/programs/develop/mstate/Tupfile.lua b/programs/develop/mstate/Tupfile.lua index 513abdfe3..f410da7af 100644 --- a/programs/develop/mstate/Tupfile.lua +++ b/programs/develop/mstate/Tupfile.lua @@ -1,2 +1,4 @@ -if tup.getconfig("NO_NASM") ~= "" then return end -tup.rule("mstate.asm", "nasm -t -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "mstate") +if tup.getconfig("NO_FASM") ~= "" then return end +HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR") +tup.include(HELPERDIR .. "/use_fasm.lua") +tup.rule("mstate.asm", FASM .. " -dlang=" .. tup.getconfig("LANG") .. " %f %o " .. tup.getconfig("KPACK_CMD"), "mstate") diff --git a/programs/develop/mstate/build.bat b/programs/develop/mstate/build.bat new file mode 100644 index 000000000..fb02946b9 --- /dev/null +++ b/programs/develop/mstate/build.bat @@ -0,0 +1,3 @@ +@fasm.exe -m 16384 mstate.asm mstate.kex +@kpack mstate.kex +pause diff --git a/programs/develop/mstate/make.bat b/programs/develop/mstate/make.bat deleted file mode 100644 index 7405a06d1..000000000 --- a/programs/develop/mstate/make.bat +++ /dev/null @@ -1 +0,0 @@ -nasm -f bin mstate.asm -o mstate \ No newline at end of file diff --git a/programs/develop/mstate/mstate.asm b/programs/develop/mstate/mstate.asm index aee4def17..659166201 100644 --- a/programs/develop/mstate/mstate.asm +++ b/programs/develop/mstate/mstate.asm @@ -1,246 +1,227 @@ -; This program shows state of mouse buttons ; -; to compile: nasm -f bin mstate.asm -o mstate ; -ORG 0 -BITS 32 -; ---------------------------------------------------------------------------- ; -PATH_SIZE equ 256 -PARAMS_SIZE equ 256 -STACK_SIZE equ 256 -; ---------------------------------------------------------------------------- ; -TEXT_WIDTH equ 6 -TEXT_HEIGHT equ 9 -; ---------------------------------------------------------------------------- ; -MOUSE_LEFT_BUTTON_MASK equ 1b -MOUSE_RIGHT_BUTTON_MASK equ 10b -MOUSE_MIDDLE_BUTTON_MASK equ 100b -; ---------------------------------------------------------------------------- ; -EM_REDRAW equ 1b -EM_KEY equ 10b -EM_BUTTON equ 100b -EM_RESERVED0 equ 1000b -EM_REDRAW_BACKGROUND equ 10000b -EM_MOUSE equ 100000b -EM_IPC equ 1000000b -EM_NETWORK equ 10000000b -EM_DEBUG equ 100000000b -; ---------------------------------------------------------------------------- ; -WINDOW_STYLE_SKINNED_FIXED equ 0x4000000 -WINDOW_STYLE_COORD_CLIENT equ 0x20000000 -WINDOW_STYLE_CAPTION equ 0x10000000 -; ---------------------------------------------------------------------------- ; -WINDOW_BORDER_SIZE equ 5 -; ---------------------------------------------------------------------------- ; -WINDOW_STYLE equ WINDOW_STYLE_SKINNED_FIXED | WINDOW_STYLE_COORD_CLIENT | WINDOW_STYLE_CAPTION -; ---------------------------------------------------------------------------- ; -MOUSE_BODY_COLOR equ 0x007C7C96 -MOUSE_LEFT_BUTTON_COLOR equ 0x008293A4 -MOUSE_RIGHT_BUTTON_COLOR equ 0x008293A4 -MOUSE_MIDDLE_BUTTON_COLOR equ 0x00A48293 -MOUSE_LEFT_BUTTON_PRESSED_COLOR equ 0x00568EC7 -MOUSE_RIGHT_BUTTON_PRESSED_COLOR equ 0x00568EC7 -MOUSE_MIDDLE_BUTTON_PRESSED_COLOR equ 0x00C7568E -WINDOW_BACK_COLOR equ 0x00EFEFEF -; ---------------------------------------------------------------------------- ; -MOUSE_WIDTH equ 120 -MOUSE_HEIGHT equ 240 -MOUSE_MARGIN equ 4 -BUTTONS_MARGIN equ 2 -; ---------------------------------------------------------------------------- ; -MOUSE_LEFT equ MOUSE_MARGIN -MOUSE_TOP equ MOUSE_MARGIN -WINDOW_WIDTH equ MOUSE_WIDTH + WINDOW_BORDER_SIZE * 2 + MOUSE_MARGIN * 2 -MOUSE_BODY_HEIGHT equ (MOUSE_HEIGHT - BUTTONS_MARGIN) / 2 -MOUSE_BODY_TOP equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT + MOUSE_TOP -LEFT_BUTTON_HEIGHT equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN -RIGHT_BUTTON_HEIGHT equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN -LEFT_BUTTON_WIDTH equ (MOUSE_WIDTH - BUTTONS_MARGIN) / 2 -RIGHT_BUTTON_WIDTH equ MOUSE_WIDTH - LEFT_BUTTON_WIDTH - BUTTONS_MARGIN -LEFT_BUTTON_LEFT equ MOUSE_LEFT -RIGHT_BUTTON_LEFT equ LEFT_BUTTON_LEFT + LEFT_BUTTON_WIDTH + BUTTONS_MARGIN -MIDDLE_BUTTON_WIDTH equ MOUSE_WIDTH / 10 -MIDDLE_BUTTON_HEIGHT equ MOUSE_HEIGHT / 6 -MIDDLE_BUTTON_LEFT equ (MOUSE_WIDTH - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_LEFT -MIDDLE_BUTTON_TOP equ (MOUSE_WIDTH / 2 - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_TOP -; ---------------------------------------------------------------------------- ; -%define SZ_BUTTONS_STATE "Buttons state:" -%define SZ_BIN "bin:" -%define SZ_HEX "hex:0x" -%strlen LEN_SZ_BUTTONS_STATE SZ_BUTTONS_STATE -%strlen LEN_SZ_BIN SZ_BIN -%strlen LEN_SZ_HEX SZ_HEX -; ---------------------------------------------------------------------------- ; -STATE_VALUES_HEIGHT equ 3 * TEXT_HEIGHT ; we have three lines of text -STATE_VALUES_WIDTH equ LEN_SZ_BUTTONS_STATE * TEXT_WIDTH -STATE_VALUES_TOP equ (MOUSE_BODY_HEIGHT - STATE_VALUES_HEIGHT) / 2 + MOUSE_BODY_TOP -STATE_VALUES_LEFT equ (MOUSE_WIDTH - STATE_VALUES_WIDTH) / 2 + MOUSE_LEFT -; ---------------------------------------------------------------------------- ; -MENUET01 db 'MENUET01' -version dd 1 -program.start dd START -program.end dd _END -program.memory dd _END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE -program.stack dd _END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE -program.params dd _END + PATH_SIZE -program.path dd _END -; ---------------------------------------------------------------------------- ; -mouse_body_color dd MOUSE_BODY_COLOR -mouse_left_button_color dd MOUSE_LEFT_BUTTON_COLOR -mouse_right_button_color dd MOUSE_RIGHT_BUTTON_COLOR -mouse_middle_button_color dd MOUSE_MIDDLE_BUTTON_COLOR -; ---------------------------------------------------------------------------- ; -mouse.button dd 0 -; ---------------------------------------------------------------------------- ; -sz_caption db "MouseState",0 -; ---------------------------------------------------------------------------- ; -sz_button_state db SZ_BUTTONS_STATE,0 -sz_bin db SZ_BIN,0 -sz_hex db SZ_HEX,0 -; ---------------------------------------------------------------------------- ; -%macro DrawMouseBody 0 -; draw.rectangle - mov eax, 13 - mov ebx, MOUSE_LEFT << 16 | MOUSE_WIDTH - mov ecx, MOUSE_BODY_TOP << 16 | MOUSE_BODY_HEIGHT - mov edx, [mouse_body_color] - int 64 -; texts - mov eax, 4 - mov ecx, 1100b << 28 | WINDOW_BACK_COLOR - mov edi, [mouse_body_color] -; draw.text - mov ebx, (STATE_VALUES_LEFT << 16) | STATE_VALUES_TOP - mov edx, sz_button_state - int 64 -; draw.text - add ebx, TEXT_HEIGHT - mov edx, sz_bin - int 64 -; draw.text - add ebx, TEXT_HEIGHT - mov edx, sz_hex - int 64 -%endmacro -; ---------------------------------------------------------------------------- ; -align 4 -DrawMouseButtons: - mov eax, 13 -; draw.rectangle - mov ebx, LEFT_BUTTON_LEFT << 16 | LEFT_BUTTON_WIDTH - mov ecx, MOUSE_TOP << 16 | LEFT_BUTTON_HEIGHT - mov edx, [mouse_left_button_color] - int 64 -; draw.rectangle - mov ebx, RIGHT_BUTTON_LEFT << 16 | RIGHT_BUTTON_WIDTH - mov ecx, MOUSE_TOP << 16 | RIGHT_BUTTON_HEIGHT - mov edx, [mouse_right_button_color] - int 64 -; draw.rectangle - mov ebx, MIDDLE_BUTTON_LEFT << 16 | MIDDLE_BUTTON_WIDTH - mov ecx, MIDDLE_BUTTON_TOP << 16 | MIDDLE_BUTTON_HEIGHT - mov edx, [mouse_middle_button_color] - int 64 -; Draw State Values - mov eax, 47 - mov esi, 0100b << 28 | WINDOW_BACK_COLOR - mov ecx, [mouse.button] - mov edi, [mouse_body_color] -; draw.number - mov ebx, (10 << 16) | (2 << 8) ; 10 digits, base2 - mov edx, (LEN_SZ_BIN * TEXT_WIDTH + STATE_VALUES_LEFT) << 16 | (STATE_VALUES_TOP + TEXT_HEIGHT) - int 64 -; draw.number - mov ebx, (8 << 16) | (1 << 8) ; 8 digits, base16 - mov edx, (LEN_SZ_HEX * TEXT_WIDTH + STATE_VALUES_LEFT) << 16 | (STATE_VALUES_TOP + TEXT_HEIGHT * 2) - int 64 - ret -; ---------------------------------------------------------------------------- ; -align 4 -START: -; get.screen.size - mov eax, 61 - mov ebx, 1 - int 64 - mov edx, eax - movzx ecx, ax - shr edx, 16 -; skin.height - mov eax, 48 - mov ebx, 4 - int 64 - add eax, MOUSE_HEIGHT + WINDOW_BORDER_SIZE + MOUSE_MARGIN * 2 - 1 - mov esi, eax - sub edx, (WINDOW_WIDTH - 1) - sub ecx, eax - shr edx, 1 - shr ecx, 1 -; set.event - mov eax, 40 - mov ebx, EM_REDRAW | EM_BUTTON | EM_MOUSE - int 64 -; ---------------------------------------------------------------------------- ; -align 4 -on_redraw: -; redraw.start - mov eax, 12 - mov ebx, 1 - int 64 -; draw.window - xor eax, eax - mov ebx, edx ; window.left -; ecx = window.top - shl ebx, 16 - shl ecx, 16 - or ebx, (WINDOW_WIDTH - 1) - or ecx, esi ; window.height - mov edx, WINDOW_STYLE | WINDOW_BACK_COLOR - mov edi, sz_caption - xor esi, esi - int 64 -; redraw.finish - mov eax, 12 - mov ebx, 2 - int 64 - DrawMouseBody - call DrawMouseButtons -align 4 -wait.event: - mov eax, 10 ; redraw = 001b; 001b & 110b = 000b - int 64 ; button = 011b; 011b & 110b = 010b - test eax, 110b ; mouse = 110b; 110b & 110b = 110b - jz on_redraw - jnp on_button -; get.mouse.button - mov eax, 37 - mov ebx, 2 - int 64 - cmp [mouse.button], eax ; if equal - je wait.event ; then no need update - mov ebx, dword MOUSE_LEFT_BUTTON_COLOR - mov ecx, dword MOUSE_RIGHT_BUTTON_COLOR - mov edx, dword MOUSE_MIDDLE_BUTTON_COLOR -.left: - test eax, MOUSE_LEFT_BUTTON_MASK - jz .right - mov ebx, dword MOUSE_LEFT_BUTTON_PRESSED_COLOR -.right: - test eax, MOUSE_RIGHT_BUTTON_MASK - jz .middle - mov ecx, dword MOUSE_RIGHT_BUTTON_PRESSED_COLOR -.middle: - test eax, MOUSE_MIDDLE_BUTTON_MASK - jz .other - mov edx, dword MOUSE_MIDDLE_BUTTON_PRESSED_COLOR -.other: - mov [mouse_left_button_color], ebx - mov [mouse_right_button_color], ecx - mov [mouse_middle_button_color], edx - mov [mouse.button], eax - call DrawMouseButtons - jmp wait.event -align 4 -on_button: ; terminate because we have only one button(close button) - or eax, -1 - int 64 -; ---------------------------------------------------------------------------- ; -align 4 -_END: +; SPDX-License-Identifier: GPL-2.0-only +; SPDX-FileCopyrightText: 2024 KolibriOS-NG Team + +format binary as "" +use32 +org 0 +db 'MENUET01' ; signature +dd 1 ; header version +dd start ; entry point +dd _image_end ; end of image +dd _memory ; required memory size +dd _stacktop ; address of stack top +dd 0 ; buffer for command line arguments +dd 0 ; buffer for path + +include '../../macros.inc' +include '../../KOSfuncs.inc' + +TEXT_WIDTH = 8 +TEXT_HEIGHT = 16 + +MOUSE_LEFT_BUTTON_MASK = 1b +MOUSE_RIGHT_BUTTON_MASK = 10b +MOUSE_MIDDLE_BUTTON_MASK = 100b + +WINDOW_STYLE_SKINNED_FIXED = 0x4000000 +WINDOW_STYLE_COORD_CLIENT = 0x20000000 +WINDOW_STYLE_CAPTION = 0x10000000 + +WINDOW_BORDER_SIZE = 5 +WINDOW_STYLE = (WINDOW_STYLE_SKINNED_FIXED or WINDOW_STYLE_COORD_CLIENT or WINDOW_STYLE_CAPTION) + +MOUSE_BODY_COLOR = 0x007C7C96 +MOUSE_LEFT_BUTTON_COLOR = 0x008293A4 +MOUSE_RIGHT_BUTTON_COLOR = 0x008293A4 +MOUSE_MIDDLE_BUTTON_COLOR = 0x00A48293 +MOUSE_LEFT_BUTTON_PRESSED_COLOR = 0x00568EC7 +MOUSE_RIGHT_BUTTON_PRESSED_COLOR = 0x00568EC7 +MOUSE_MIDDLE_BUTTON_PRESSED_COLOR = 0x00C7568E +WINDOW_BACK_COLOR = 0x00EFEFEF + +MOUSE_WIDTH = 180 +MOUSE_HEIGHT = 240 +MOUSE_MARGIN = 4 +BUTTONS_MARGIN = 2 + +MOUSE_LEFT = MOUSE_MARGIN +MOUSE_TOP = MOUSE_MARGIN +WINDOW_WIDTH = MOUSE_WIDTH + WINDOW_BORDER_SIZE * 2 + MOUSE_MARGIN * 2 +MOUSE_BODY_HEIGHT = (MOUSE_HEIGHT - BUTTONS_MARGIN) / 2 +MOUSE_BODY_TOP = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT + MOUSE_TOP +LEFT_BUTTON_HEIGHT = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN +RIGHT_BUTTON_HEIGHT = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN +LEFT_BUTTON_WIDTH = (MOUSE_WIDTH - BUTTONS_MARGIN) / 2 +RIGHT_BUTTON_WIDTH = MOUSE_WIDTH - LEFT_BUTTON_WIDTH - BUTTONS_MARGIN +LEFT_BUTTON_LEFT = MOUSE_LEFT +RIGHT_BUTTON_LEFT = LEFT_BUTTON_LEFT + LEFT_BUTTON_WIDTH + BUTTONS_MARGIN +MIDDLE_BUTTON_WIDTH = MOUSE_WIDTH / 10 +MIDDLE_BUTTON_HEIGHT = MOUSE_HEIGHT / 6 +MIDDLE_BUTTON_LEFT = (MOUSE_WIDTH - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_LEFT +MIDDLE_BUTTON_TOP = (MOUSE_WIDTH / 2 - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_TOP + +; data: +mouse_left_button_color dd MOUSE_LEFT_BUTTON_COLOR +mouse_right_button_color dd MOUSE_RIGHT_BUTTON_COLOR +mouse_middle_button_color dd MOUSE_MIDDLE_BUTTON_COLOR + +mouse_button dd 0 +sz_caption db "MouseState", 0 + +sz_button_state db "Buttons state:", 0 +STATE_VALUES_WIDTH = ($ - sz_button_state - 1)*TEXT_WIDTH +sz_bin db "bin: ", 0 +LEN_SZ_BIN = $ - sz_bin - 1 +sz_hex db "hex: 0x", 0 +LEN_SZ_HEX = $ - sz_hex - 1 + +STATE_VALUES_HEIGHT = 3*TEXT_HEIGHT ; we have three lines of text +STATE_VALUES_TOP = ((MOUSE_BODY_HEIGHT - STATE_VALUES_HEIGHT) / 2 + MOUSE_BODY_TOP) +STATE_VALUES_LEFT = ((MOUSE_WIDTH - STATE_VALUES_WIDTH) / 2 + MOUSE_LEFT) + + + +align 4 +draw_mouse_buttons: + mov eax, SF_DRAW_RECT + + mov ebx, (LEFT_BUTTON_LEFT shl 16) or LEFT_BUTTON_WIDTH + mov ecx, (MOUSE_TOP shl 16) or LEFT_BUTTON_HEIGHT + mov edx, [mouse_left_button_color] + mcall + + mov ebx, (RIGHT_BUTTON_LEFT shl 16) or RIGHT_BUTTON_WIDTH + mov ecx, (MOUSE_TOP shl 16) or RIGHT_BUTTON_HEIGHT + mov edx, [mouse_right_button_color] + mcall + + mov ebx, (MIDDLE_BUTTON_LEFT shl 16) or MIDDLE_BUTTON_WIDTH + mov ecx, (MIDDLE_BUTTON_TOP shl 16) or MIDDLE_BUTTON_HEIGHT + mov edx, [mouse_middle_button_color] + mcall +; draw state values + mov eax, SF_DRAW_NUMBER + mov esi, (0101b shl 28) or WINDOW_BACK_COLOR + mov ecx, [mouse_button] + mov edi, MOUSE_BODY_COLOR + + mov ebx, (10 shl 16) or (2 shl 8) ; 10 digits, base2 + mov edx, ((LEN_SZ_BIN * TEXT_WIDTH + STATE_VALUES_LEFT) shl 16) or (STATE_VALUES_TOP + TEXT_HEIGHT) + mcall + + mov ebx, (8 shl 16) or (1 shl 8) ; 8 digits, base16 + mov edx, ((LEN_SZ_HEX * TEXT_WIDTH + STATE_VALUES_LEFT) shl 16) or (STATE_VALUES_TOP + TEXT_HEIGHT * 2) + mcall + ret + + +align 4 +start: + mcall SF_GET_GRAPHICAL_PARAMS, SSF_SCREEN_SIZE + mov edx, eax + movzx ecx, ax + shr edx, 16 + + mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT + add eax, MOUSE_HEIGHT + WINDOW_BORDER_SIZE + MOUSE_MARGIN * 2 - 1 + mov esi, eax + sub edx, (WINDOW_WIDTH - 1) + sub ecx, eax + shr edx, 1 + shr ecx, 1 + + mov eax, SF_SET_EVENTS_MASK + mov ebx, EVM_REDRAW or EVM_BUTTON or EVM_MOUSE + mcall + + +align 4 +on_redraw: + mcall SF_REDRAW, SSF_BEGIN_DRAW + xor eax, eax ; SF_CREATE_WINDOW + mov ebx, edx ; window.left +; ecx = window.top + shl ebx, 16 + shl ecx, 16 + or ebx, (WINDOW_WIDTH - 1) + or ecx, esi ; window.height + mov edx, WINDOW_STYLE or WINDOW_BACK_COLOR + mov edi, sz_caption + xor esi, esi + mcall + + mcall SF_REDRAW, SSF_END_DRAW +; draw mouse body: + mov eax, SF_DRAW_RECT + mov ebx, (MOUSE_LEFT shl 16) or MOUSE_WIDTH + mov ecx, (MOUSE_BODY_TOP shl 16) or MOUSE_BODY_HEIGHT + mov edx, MOUSE_BODY_COLOR + mcall + + mov eax, SF_DRAW_TEXT + mov ecx, (1101b shl 28) or WINDOW_BACK_COLOR + mov edi, MOUSE_BODY_COLOR + + mov ebx, (STATE_VALUES_LEFT shl 16) or STATE_VALUES_TOP + mov edx, sz_button_state + mcall + + add ebx, TEXT_HEIGHT + mov edx, sz_bin + mcall + + add ebx, TEXT_HEIGHT + mov edx, sz_hex + mcall + call draw_mouse_buttons + + +align 4 +wait_event: + mcall SF_WAIT_EVENT + cmp eax, EV_REDRAW + je on_redraw + cmp eax, EV_BUTTON + je on_button + ; otherwise mouse: + + mcall SF_MOUSE_GET, SSF_BUTTON + cmp [mouse_button], eax ; if equal, then no need update + je wait_event + mov ebx, dword MOUSE_LEFT_BUTTON_COLOR + mov ecx, dword MOUSE_RIGHT_BUTTON_COLOR + mov edx, dword MOUSE_MIDDLE_BUTTON_COLOR +.left: + test eax, MOUSE_LEFT_BUTTON_MASK + jz .right + mov ebx, dword MOUSE_LEFT_BUTTON_PRESSED_COLOR +.right: + test eax, MOUSE_RIGHT_BUTTON_MASK + jz .middle + mov ecx, dword MOUSE_RIGHT_BUTTON_PRESSED_COLOR +.middle: + test eax, MOUSE_MIDDLE_BUTTON_MASK + jz .other + mov edx, dword MOUSE_MIDDLE_BUTTON_PRESSED_COLOR +.other: + mov [mouse_left_button_color], ebx + mov [mouse_right_button_color], ecx + mov [mouse_middle_button_color], edx + mov [mouse_button], eax + call draw_mouse_buttons + jmp wait_event + +align 4 +on_button: +; terminate because we have only one button (close) + mcall SF_TERMINATE_PROCESS + +align 16 +_image_end: + +; reserve for stack: + rb 256 +align 16 +_stacktop: +_memory: +