rewrite mstate from nasm to fasm (rgimad)

This commit is contained in:
2025-02-27 12:07:00 +02:00
parent 5e5f011099
commit 4aaff31484
5 changed files with 235 additions and 250 deletions

View File

@@ -473,6 +473,7 @@ tup.append_table(img_files, {
{"DEVELOP/HEED", VAR_PROGS .. "/develop/heed/trunk/heed"}, {"DEVELOP/HEED", VAR_PROGS .. "/develop/heed/trunk/heed"},
{"DEVELOP/KEYASCII", VAR_PROGS .. "/develop/keyascii/trunk/keyascii"}, {"DEVELOP/KEYASCII", VAR_PROGS .. "/develop/keyascii/trunk/keyascii"},
{"DEVELOP/MTDBG", VAR_PROGS .. "/develop/mtdbg/mtdbg"}, {"DEVELOP/MTDBG", VAR_PROGS .. "/develop/mtdbg/mtdbg"},
{"DEVELOP/MSTATE", VAR_PROGS .. "/develop/mstate/mstate"},
{"DEVELOP/SCANCODE", VAR_PROGS .. "/develop/scancode/trunk/scancode"}, {"DEVELOP/SCANCODE", VAR_PROGS .. "/develop/scancode/trunk/scancode"},
{"DEVELOP/EXAMPLES/CIRCLE", VAR_PROGS .. "/develop/examples/circle/trunk/circle"}, {"DEVELOP/EXAMPLES/CIRCLE", VAR_PROGS .. "/develop/examples/circle/trunk/circle"},
{"DEVELOP/EXAMPLES/COLORREF", VAR_PROGS .. "/demos/colorref/trunk/colorref"}, {"DEVELOP/EXAMPLES/COLORREF", VAR_PROGS .. "/demos/colorref/trunk/colorref"},
@@ -647,7 +648,6 @@ tup.append_table(img_files, {
{"LOD", VAR_PROGS .. "/fs/lod/lod"}, {"LOD", VAR_PROGS .. "/fs/lod/lod"},
{"TIMER", VAR_PROGS .. "/other/Timer/timer"}, {"TIMER", VAR_PROGS .. "/other/Timer/timer"},
{"TINFO", VAR_PROGS .. "/system/tinfo/tinfo"}, {"TINFO", VAR_PROGS .. "/system/tinfo/tinfo"},
{"DEVELOP/MSTATE", VAR_PROGS .. "/develop/mstate/mstate"},
{"DEVELOP/GENFILES", VAR_PROGS .. "/testing/genfiles/GenFiles"}, {"DEVELOP/GENFILES", VAR_PROGS .. "/testing/genfiles/GenFiles"},
{"MEDIA/FILLSCR", VAR_PROGS .. "/media/FillScr/fillscr"}, {"MEDIA/FILLSCR", VAR_PROGS .. "/media/FillScr/fillscr"},
}) })

View File

@@ -1,2 +1,4 @@
if tup.getconfig("NO_NASM") ~= "" then return end if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("mstate.asm", "nasm -t -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "mstate") 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")

View File

@@ -0,0 +1,3 @@
@fasm.exe -m 16384 mstate.asm mstate.kex
@kpack mstate.kex
pause

View File

@@ -1 +0,0 @@
nasm -f bin mstate.asm -o mstate

View File

@@ -1,220 +1,193 @@
; This program shows state of mouse buttons ; ; SPDX-License-Identifier: GPL-2.0-only
; to compile: nasm -f bin mstate.asm -o mstate ; ; SPDX-FileCopyrightText: 2024 KolibriOS-NG Team
ORG 0
BITS 32 format binary as ""
; ---------------------------------------------------------------------------- ; use32
PATH_SIZE equ 256 org 0
PARAMS_SIZE equ 256 db 'MENUET01' ; signature
STACK_SIZE equ 256 dd 1 ; header version
; ---------------------------------------------------------------------------- ; dd start ; entry point
TEXT_WIDTH equ 6 dd _image_end ; end of image
TEXT_HEIGHT equ 9 dd _memory ; required memory size
; ---------------------------------------------------------------------------- ; dd _stacktop ; address of stack top
MOUSE_LEFT_BUTTON_MASK equ 1b dd 0 ; buffer for command line arguments
MOUSE_RIGHT_BUTTON_MASK equ 10b dd 0 ; buffer for path
MOUSE_MIDDLE_BUTTON_MASK equ 100b
; ---------------------------------------------------------------------------- ; include '../../macros.inc'
EM_REDRAW equ 1b include '../../KOSfuncs.inc'
EM_KEY equ 10b
EM_BUTTON equ 100b TEXT_WIDTH = 8
EM_RESERVED0 equ 1000b TEXT_HEIGHT = 16
EM_REDRAW_BACKGROUND equ 10000b
EM_MOUSE equ 100000b MOUSE_LEFT_BUTTON_MASK = 1b
EM_IPC equ 1000000b MOUSE_RIGHT_BUTTON_MASK = 10b
EM_NETWORK equ 10000000b MOUSE_MIDDLE_BUTTON_MASK = 100b
EM_DEBUG equ 100000000b
; ---------------------------------------------------------------------------- ; WINDOW_STYLE_SKINNED_FIXED = 0x4000000
WINDOW_STYLE_SKINNED_FIXED equ 0x4000000 WINDOW_STYLE_COORD_CLIENT = 0x20000000
WINDOW_STYLE_COORD_CLIENT equ 0x20000000 WINDOW_STYLE_CAPTION = 0x10000000
WINDOW_STYLE_CAPTION equ 0x10000000
; ---------------------------------------------------------------------------- ; WINDOW_BORDER_SIZE = 5
WINDOW_BORDER_SIZE equ 5 WINDOW_STYLE = (WINDOW_STYLE_SKINNED_FIXED or WINDOW_STYLE_COORD_CLIENT or WINDOW_STYLE_CAPTION)
; ---------------------------------------------------------------------------- ;
WINDOW_STYLE equ WINDOW_STYLE_SKINNED_FIXED | WINDOW_STYLE_COORD_CLIENT | WINDOW_STYLE_CAPTION MOUSE_BODY_COLOR = 0x007C7C96
; ---------------------------------------------------------------------------- ; MOUSE_LEFT_BUTTON_COLOR = 0x008293A4
MOUSE_BODY_COLOR equ 0x007C7C96 MOUSE_RIGHT_BUTTON_COLOR = 0x008293A4
MOUSE_LEFT_BUTTON_COLOR equ 0x008293A4 MOUSE_MIDDLE_BUTTON_COLOR = 0x00A48293
MOUSE_RIGHT_BUTTON_COLOR equ 0x008293A4 MOUSE_LEFT_BUTTON_PRESSED_COLOR = 0x00568EC7
MOUSE_MIDDLE_BUTTON_COLOR equ 0x00A48293 MOUSE_RIGHT_BUTTON_PRESSED_COLOR = 0x00568EC7
MOUSE_LEFT_BUTTON_PRESSED_COLOR equ 0x00568EC7 MOUSE_MIDDLE_BUTTON_PRESSED_COLOR = 0x00C7568E
MOUSE_RIGHT_BUTTON_PRESSED_COLOR equ 0x00568EC7 WINDOW_BACK_COLOR = 0x00EFEFEF
MOUSE_MIDDLE_BUTTON_PRESSED_COLOR equ 0x00C7568E
WINDOW_BACK_COLOR equ 0x00EFEFEF MOUSE_WIDTH = 180
; ---------------------------------------------------------------------------- ; MOUSE_HEIGHT = 240
MOUSE_WIDTH equ 120 MOUSE_MARGIN = 4
MOUSE_HEIGHT equ 240 BUTTONS_MARGIN = 2
MOUSE_MARGIN equ 4
BUTTONS_MARGIN equ 2 MOUSE_LEFT = MOUSE_MARGIN
; ---------------------------------------------------------------------------- ; MOUSE_TOP = MOUSE_MARGIN
MOUSE_LEFT equ MOUSE_MARGIN WINDOW_WIDTH = MOUSE_WIDTH + WINDOW_BORDER_SIZE * 2 + MOUSE_MARGIN * 2
MOUSE_TOP equ MOUSE_MARGIN MOUSE_BODY_HEIGHT = (MOUSE_HEIGHT - BUTTONS_MARGIN) / 2
WINDOW_WIDTH equ MOUSE_WIDTH + WINDOW_BORDER_SIZE * 2 + MOUSE_MARGIN * 2 MOUSE_BODY_TOP = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT + MOUSE_TOP
MOUSE_BODY_HEIGHT equ (MOUSE_HEIGHT - BUTTONS_MARGIN) / 2 LEFT_BUTTON_HEIGHT = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN
MOUSE_BODY_TOP equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT + MOUSE_TOP RIGHT_BUTTON_HEIGHT = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN
LEFT_BUTTON_HEIGHT equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN LEFT_BUTTON_WIDTH = (MOUSE_WIDTH - BUTTONS_MARGIN) / 2
RIGHT_BUTTON_HEIGHT equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN RIGHT_BUTTON_WIDTH = MOUSE_WIDTH - LEFT_BUTTON_WIDTH - BUTTONS_MARGIN
LEFT_BUTTON_WIDTH equ (MOUSE_WIDTH - BUTTONS_MARGIN) / 2 LEFT_BUTTON_LEFT = MOUSE_LEFT
RIGHT_BUTTON_WIDTH equ MOUSE_WIDTH - LEFT_BUTTON_WIDTH - BUTTONS_MARGIN RIGHT_BUTTON_LEFT = LEFT_BUTTON_LEFT + LEFT_BUTTON_WIDTH + BUTTONS_MARGIN
LEFT_BUTTON_LEFT equ MOUSE_LEFT MIDDLE_BUTTON_WIDTH = MOUSE_WIDTH / 10
RIGHT_BUTTON_LEFT equ LEFT_BUTTON_LEFT + LEFT_BUTTON_WIDTH + BUTTONS_MARGIN MIDDLE_BUTTON_HEIGHT = MOUSE_HEIGHT / 6
MIDDLE_BUTTON_WIDTH equ MOUSE_WIDTH / 10 MIDDLE_BUTTON_LEFT = (MOUSE_WIDTH - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_LEFT
MIDDLE_BUTTON_HEIGHT equ MOUSE_HEIGHT / 6 MIDDLE_BUTTON_TOP = (MOUSE_WIDTH / 2 - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_TOP
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 ; data:
; ---------------------------------------------------------------------------- ;
%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_left_button_color dd MOUSE_LEFT_BUTTON_COLOR
mouse_right_button_color dd MOUSE_RIGHT_BUTTON_COLOR mouse_right_button_color dd MOUSE_RIGHT_BUTTON_COLOR
mouse_middle_button_color dd MOUSE_MIDDLE_BUTTON_COLOR mouse_middle_button_color dd MOUSE_MIDDLE_BUTTON_COLOR
; ---------------------------------------------------------------------------- ;
mouse.button dd 0 mouse_button dd 0
; ---------------------------------------------------------------------------- ;
sz_caption db "MouseState", 0 sz_caption db "MouseState", 0
; ---------------------------------------------------------------------------- ;
sz_button_state db SZ_BUTTONS_STATE,0 sz_button_state db "Buttons state:", 0
sz_bin db SZ_BIN,0 STATE_VALUES_WIDTH = ($ - sz_button_state - 1)*TEXT_WIDTH
sz_hex db SZ_HEX,0 sz_bin db "bin: ", 0
; ---------------------------------------------------------------------------- ; LEN_SZ_BIN = $ - sz_bin - 1
%macro DrawMouseBody 0 sz_hex db "hex: 0x", 0
; draw.rectangle LEN_SZ_HEX = $ - sz_hex - 1
mov eax, 13
mov ebx, MOUSE_LEFT << 16 | MOUSE_WIDTH STATE_VALUES_HEIGHT = 3*TEXT_HEIGHT ; we have three lines of text
mov ecx, MOUSE_BODY_TOP << 16 | MOUSE_BODY_HEIGHT STATE_VALUES_TOP = ((MOUSE_BODY_HEIGHT - STATE_VALUES_HEIGHT) / 2 + MOUSE_BODY_TOP)
mov edx, [mouse_body_color] STATE_VALUES_LEFT = ((MOUSE_WIDTH - STATE_VALUES_WIDTH) / 2 + MOUSE_LEFT)
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 align 4
DrawMouseButtons: draw_mouse_buttons:
mov eax, 13 mov eax, SF_DRAW_RECT
; draw.rectangle
mov ebx, LEFT_BUTTON_LEFT << 16 | LEFT_BUTTON_WIDTH mov ebx, (LEFT_BUTTON_LEFT shl 16) or LEFT_BUTTON_WIDTH
mov ecx, MOUSE_TOP << 16 | LEFT_BUTTON_HEIGHT mov ecx, (MOUSE_TOP shl 16) or LEFT_BUTTON_HEIGHT
mov edx, [mouse_left_button_color] mov edx, [mouse_left_button_color]
int 64 mcall
; draw.rectangle
mov ebx, RIGHT_BUTTON_LEFT << 16 | RIGHT_BUTTON_WIDTH mov ebx, (RIGHT_BUTTON_LEFT shl 16) or RIGHT_BUTTON_WIDTH
mov ecx, MOUSE_TOP << 16 | RIGHT_BUTTON_HEIGHT mov ecx, (MOUSE_TOP shl 16) or RIGHT_BUTTON_HEIGHT
mov edx, [mouse_right_button_color] mov edx, [mouse_right_button_color]
int 64 mcall
; draw.rectangle
mov ebx, MIDDLE_BUTTON_LEFT << 16 | MIDDLE_BUTTON_WIDTH mov ebx, (MIDDLE_BUTTON_LEFT shl 16) or MIDDLE_BUTTON_WIDTH
mov ecx, MIDDLE_BUTTON_TOP << 16 | MIDDLE_BUTTON_HEIGHT mov ecx, (MIDDLE_BUTTON_TOP shl 16) or MIDDLE_BUTTON_HEIGHT
mov edx, [mouse_middle_button_color] mov edx, [mouse_middle_button_color]
int 64 mcall
; Draw State Values ; draw state values
mov eax, 47 mov eax, SF_DRAW_NUMBER
mov esi, 0100b << 28 | WINDOW_BACK_COLOR mov esi, (0101b shl 28) or WINDOW_BACK_COLOR
mov ecx, [mouse.button] mov ecx, [mouse_button]
mov edi, [mouse_body_color] mov edi, MOUSE_BODY_COLOR
; draw.number
mov ebx, (10 << 16) | (2 << 8) ; 10 digits, base2 mov ebx, (10 shl 16) or (2 shl 8) ; 10 digits, base2
mov edx, (LEN_SZ_BIN * TEXT_WIDTH + STATE_VALUES_LEFT) << 16 | (STATE_VALUES_TOP + TEXT_HEIGHT) mov edx, ((LEN_SZ_BIN * TEXT_WIDTH + STATE_VALUES_LEFT) shl 16) or (STATE_VALUES_TOP + TEXT_HEIGHT)
int 64 mcall
; draw.number
mov ebx, (8 << 16) | (1 << 8) ; 8 digits, base16 mov ebx, (8 shl 16) or (1 shl 8) ; 8 digits, base16
mov edx, (LEN_SZ_HEX * TEXT_WIDTH + STATE_VALUES_LEFT) << 16 | (STATE_VALUES_TOP + TEXT_HEIGHT * 2) mov edx, ((LEN_SZ_HEX * TEXT_WIDTH + STATE_VALUES_LEFT) shl 16) or (STATE_VALUES_TOP + TEXT_HEIGHT * 2)
int 64 mcall
ret ret
; ---------------------------------------------------------------------------- ;
align 4 align 4
START: start:
; get.screen.size mcall SF_GET_GRAPHICAL_PARAMS, SSF_SCREEN_SIZE
mov eax, 61
mov ebx, 1
int 64
mov edx, eax mov edx, eax
movzx ecx, ax movzx ecx, ax
shr edx, 16 shr edx, 16
; skin.height
mov eax, 48 mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
mov ebx, 4
int 64
add eax, MOUSE_HEIGHT + WINDOW_BORDER_SIZE + MOUSE_MARGIN * 2 - 1 add eax, MOUSE_HEIGHT + WINDOW_BORDER_SIZE + MOUSE_MARGIN * 2 - 1
mov esi, eax mov esi, eax
sub edx, (WINDOW_WIDTH - 1) sub edx, (WINDOW_WIDTH - 1)
sub ecx, eax sub ecx, eax
shr edx, 1 shr edx, 1
shr ecx, 1 shr ecx, 1
; set.event
mov eax, 40 mov eax, SF_SET_EVENTS_MASK
mov ebx, EM_REDRAW | EM_BUTTON | EM_MOUSE mov ebx, EVM_REDRAW or EVM_BUTTON or EVM_MOUSE
int 64 mcall
; ---------------------------------------------------------------------------- ;
align 4 align 4
on_redraw: on_redraw:
; redraw.start mcall SF_REDRAW, SSF_BEGIN_DRAW
mov eax, 12 xor eax, eax ; SF_CREATE_WINDOW
mov ebx, 1
int 64
; draw.window
xor eax, eax
mov ebx, edx ; window.left mov ebx, edx ; window.left
; ecx = window.top ; ecx = window.top
shl ebx, 16 shl ebx, 16
shl ecx, 16 shl ecx, 16
or ebx, (WINDOW_WIDTH - 1) or ebx, (WINDOW_WIDTH - 1)
or ecx, esi ; window.height or ecx, esi ; window.height
mov edx, WINDOW_STYLE | WINDOW_BACK_COLOR mov edx, WINDOW_STYLE or WINDOW_BACK_COLOR
mov edi, sz_caption mov edi, sz_caption
xor esi, esi xor esi, esi
int 64 mcall
; redraw.finish
mov eax, 12 mcall SF_REDRAW, SSF_END_DRAW
mov ebx, 2 ; draw mouse body:
int 64 mov eax, SF_DRAW_RECT
DrawMouseBody mov ebx, (MOUSE_LEFT shl 16) or MOUSE_WIDTH
call DrawMouseButtons 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 align 4
wait.event: wait_event:
mov eax, 10 ; redraw = 001b; 001b & 110b = 000b mcall SF_WAIT_EVENT
int 64 ; button = 011b; 011b & 110b = 010b cmp eax, EV_REDRAW
test eax, 110b ; mouse = 110b; 110b & 110b = 110b je on_redraw
jz on_redraw cmp eax, EV_BUTTON
jnp on_button je on_button
; get.mouse.button ; otherwise mouse:
mov eax, 37
mov ebx, 2 mcall SF_MOUSE_GET, SSF_BUTTON
int 64 cmp [mouse_button], eax ; if equal, then no need update
cmp [mouse.button], eax ; if equal je wait_event
je wait.event ; then no need update
mov ebx, dword MOUSE_LEFT_BUTTON_COLOR mov ebx, dword MOUSE_LEFT_BUTTON_COLOR
mov ecx, dword MOUSE_RIGHT_BUTTON_COLOR mov ecx, dword MOUSE_RIGHT_BUTTON_COLOR
mov edx, dword MOUSE_MIDDLE_BUTTON_COLOR mov edx, dword MOUSE_MIDDLE_BUTTON_COLOR
@@ -234,13 +207,21 @@ wait.event:
mov [mouse_left_button_color], ebx mov [mouse_left_button_color], ebx
mov [mouse_right_button_color], ecx mov [mouse_right_button_color], ecx
mov [mouse_middle_button_color], edx mov [mouse_middle_button_color], edx
mov [mouse.button], eax mov [mouse_button], eax
call DrawMouseButtons call draw_mouse_buttons
jmp wait.event jmp wait_event
align 4 align 4
on_button: ; terminate because we have only one button(close button) on_button:
or eax, -1 ; terminate because we have only one button (close)
int 64 mcall SF_TERMINATE_PROCESS
; ---------------------------------------------------------------------------- ;
align 4 align 16
_END: _image_end:
; reserve for stack:
rb 256
align 16
_stacktop:
_memory: