diff --git a/programs/develop/mstate/make.bat b/programs/develop/mstate/make.bat new file mode 100644 index 0000000000..7405a06d19 --- /dev/null +++ b/programs/develop/mstate/make.bat @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000000..63576df02e --- /dev/null +++ b/programs/develop/mstate/mstate.asm @@ -0,0 +1,246 @@ +; 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: \ No newline at end of file