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: |