Subversion Repositories Kolibri OS

Rev

Rev 4944 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4944 0CodErr 1
;   This program shows  state of mouse buttons   ;
2
;  to compile: nasm -f bin mstate.asm -o mstate  ;
3
ORG 0
4
BITS 32
5
; ---------------------------------------------------------------------------- ;
6
PATH_SIZE                         equ 256
7
PARAMS_SIZE                       equ 256
8
STACK_SIZE                        equ 256
9
; ---------------------------------------------------------------------------- ;
10
TEXT_WIDTH                        equ 6
11
TEXT_HEIGHT                       equ 9
12
; ---------------------------------------------------------------------------- ;
13
MOUSE_LEFT_BUTTON_MASK            equ         1b
14
MOUSE_RIGHT_BUTTON_MASK           equ        10b
15
MOUSE_MIDDLE_BUTTON_MASK          equ       100b
16
; ---------------------------------------------------------------------------- ;
17
EM_REDRAW                         equ         1b
18
EM_KEY                            equ        10b
19
EM_BUTTON                         equ       100b
20
EM_RESERVED0                      equ      1000b
21
EM_REDRAW_BACKGROUND              equ     10000b
22
EM_MOUSE                          equ    100000b
23
EM_IPC                            equ   1000000b
24
EM_NETWORK                        equ  10000000b
25
EM_DEBUG                          equ 100000000b
26
; ---------------------------------------------------------------------------- ;
27
WINDOW_STYLE_SKINNED_FIXED        equ 0x4000000
28
WINDOW_STYLE_COORD_CLIENT         equ 0x20000000
29
WINDOW_STYLE_CAPTION              equ 0x10000000
30
; ---------------------------------------------------------------------------- ;
31
WINDOW_BORDER_SIZE                equ 5
32
; ---------------------------------------------------------------------------- ;
33
WINDOW_STYLE                      equ WINDOW_STYLE_SKINNED_FIXED | WINDOW_STYLE_COORD_CLIENT | WINDOW_STYLE_CAPTION
34
; ---------------------------------------------------------------------------- ;
35
MOUSE_BODY_COLOR                  equ 0x007C7C96
36
MOUSE_LEFT_BUTTON_COLOR           equ 0x008293A4
37
MOUSE_RIGHT_BUTTON_COLOR          equ 0x008293A4
38
MOUSE_MIDDLE_BUTTON_COLOR         equ 0x00A48293
39
MOUSE_LEFT_BUTTON_PRESSED_COLOR   equ 0x00568EC7
40
MOUSE_RIGHT_BUTTON_PRESSED_COLOR  equ 0x00568EC7
41
MOUSE_MIDDLE_BUTTON_PRESSED_COLOR equ 0x00C7568E
42
WINDOW_BACK_COLOR                 equ 0x00EFEFEF
43
; ---------------------------------------------------------------------------- ;
44
MOUSE_WIDTH                       equ 120
45
MOUSE_HEIGHT                      equ 240
46
MOUSE_MARGIN                      equ 4
47
BUTTONS_MARGIN                    equ 2
48
; ---------------------------------------------------------------------------- ;
49
MOUSE_LEFT                        equ MOUSE_MARGIN
50
MOUSE_TOP                         equ MOUSE_MARGIN
51
WINDOW_WIDTH                      equ MOUSE_WIDTH + WINDOW_BORDER_SIZE * 2 + MOUSE_MARGIN * 2
52
MOUSE_BODY_HEIGHT                 equ (MOUSE_HEIGHT - BUTTONS_MARGIN) / 2
53
MOUSE_BODY_TOP                    equ MOUSE_HEIGHT  - MOUSE_BODY_HEIGHT + MOUSE_TOP
54
LEFT_BUTTON_HEIGHT                equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN
55
RIGHT_BUTTON_HEIGHT               equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN
56
LEFT_BUTTON_WIDTH                 equ (MOUSE_WIDTH  - BUTTONS_MARGIN) / 2
57
RIGHT_BUTTON_WIDTH                equ MOUSE_WIDTH  - LEFT_BUTTON_WIDTH - BUTTONS_MARGIN
58
LEFT_BUTTON_LEFT                  equ MOUSE_LEFT
59
RIGHT_BUTTON_LEFT                 equ LEFT_BUTTON_LEFT + LEFT_BUTTON_WIDTH + BUTTONS_MARGIN
60
MIDDLE_BUTTON_WIDTH               equ MOUSE_WIDTH / 10
61
MIDDLE_BUTTON_HEIGHT              equ MOUSE_HEIGHT / 6
62
MIDDLE_BUTTON_LEFT                equ (MOUSE_WIDTH - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_LEFT
63
MIDDLE_BUTTON_TOP                 equ (MOUSE_WIDTH / 2 - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_TOP
64
; ---------------------------------------------------------------------------- ;
65
%define SZ_BUTTONS_STATE "Buttons state:"
66
%define SZ_BIN "bin:"
67
%define SZ_HEX "hex:0x"
68
%strlen LEN_SZ_BUTTONS_STATE SZ_BUTTONS_STATE
69
%strlen LEN_SZ_BIN SZ_BIN
70
%strlen LEN_SZ_HEX SZ_HEX
71
; ---------------------------------------------------------------------------- ;
72
STATE_VALUES_HEIGHT               equ 3 * TEXT_HEIGHT ; we have three lines of text
73
STATE_VALUES_WIDTH                equ LEN_SZ_BUTTONS_STATE * TEXT_WIDTH
74
STATE_VALUES_TOP                  equ (MOUSE_BODY_HEIGHT - STATE_VALUES_HEIGHT) / 2 + MOUSE_BODY_TOP
75
STATE_VALUES_LEFT                 equ (MOUSE_WIDTH - STATE_VALUES_WIDTH) / 2 + MOUSE_LEFT
76
; ---------------------------------------------------------------------------- ;
77
MENUET01                          db 'MENUET01'
78
version                           dd 1
79
program.start                     dd START
5098 clevermous 80
program.end                       dd _END
81
program.memory                    dd _END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE
82
program.stack                     dd _END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE
83
program.params                    dd _END + PATH_SIZE
84
program.path                      dd _END
4944 0CodErr 85
; ---------------------------------------------------------------------------- ;
86
mouse_body_color                  dd MOUSE_BODY_COLOR
87
mouse_left_button_color           dd MOUSE_LEFT_BUTTON_COLOR
88
mouse_right_button_color          dd MOUSE_RIGHT_BUTTON_COLOR
89
mouse_middle_button_color         dd MOUSE_MIDDLE_BUTTON_COLOR
90
; ---------------------------------------------------------------------------- ;
91
mouse.button                      dd 0
92
; ---------------------------------------------------------------------------- ;
93
sz_caption                        db "MouseState",0
94
; ---------------------------------------------------------------------------- ;
95
sz_button_state                   db SZ_BUTTONS_STATE,0
96
sz_bin                            db SZ_BIN,0
97
sz_hex                            db SZ_HEX,0
98
; ---------------------------------------------------------------------------- ;
99
%macro DrawMouseBody 0
100
; draw.rectangle
101
        mov    eax, 13
102
        mov    ebx, MOUSE_LEFT         << 16 | MOUSE_WIDTH
103
        mov    ecx, MOUSE_BODY_TOP     << 16 | MOUSE_BODY_HEIGHT
104
        mov    edx, [mouse_body_color]
105
        int    64
106
; texts
107
        mov    eax, 4
108
        mov    ecx, 1100b << 28 | WINDOW_BACK_COLOR
109
        mov    edi, [mouse_body_color]
110
; draw.text
111
        mov    ebx, (STATE_VALUES_LEFT << 16) | STATE_VALUES_TOP
112
        mov    edx, sz_button_state
113
        int    64
114
; draw.text
115
        add    ebx, TEXT_HEIGHT
116
        mov    edx, sz_bin
117
        int    64
118
; draw.text
119
        add    ebx, TEXT_HEIGHT
120
        mov    edx, sz_hex
121
        int    64
122
%endmacro
123
; ---------------------------------------------------------------------------- ;
124
align 4
125
DrawMouseButtons:
126
        mov    eax, 13
127
; draw.rectangle
128
        mov    ebx, LEFT_BUTTON_LEFT   << 16 | LEFT_BUTTON_WIDTH
129
        mov    ecx, MOUSE_TOP          << 16 | LEFT_BUTTON_HEIGHT
130
        mov    edx, [mouse_left_button_color]
131
        int    64
132
; draw.rectangle
133
        mov    ebx, RIGHT_BUTTON_LEFT  << 16 | RIGHT_BUTTON_WIDTH
134
        mov    ecx, MOUSE_TOP          << 16 | RIGHT_BUTTON_HEIGHT
135
        mov    edx, [mouse_right_button_color]
136
        int    64
137
; draw.rectangle
138
        mov    ebx, MIDDLE_BUTTON_LEFT << 16 | MIDDLE_BUTTON_WIDTH
139
        mov    ecx, MIDDLE_BUTTON_TOP  << 16 | MIDDLE_BUTTON_HEIGHT
140
        mov    edx, [mouse_middle_button_color]
141
        int    64
142
; Draw State Values
143
        mov    eax, 47
144
        mov    esi, 0100b << 28 | WINDOW_BACK_COLOR
145
        mov    ecx, [mouse.button]
146
        mov    edi, [mouse_body_color]
147
; draw.number
148
        mov    ebx, (10 << 16) | (2 << 8) ; 10 digits, base2
149
        mov    edx, (LEN_SZ_BIN * TEXT_WIDTH + STATE_VALUES_LEFT) << 16 | (STATE_VALUES_TOP + TEXT_HEIGHT)
150
        int    64
151
; draw.number
152
        mov    ebx, (8 << 16) | (1 << 8) ; 8 digits, base16
153
        mov    edx, (LEN_SZ_HEX * TEXT_WIDTH + STATE_VALUES_LEFT) << 16 | (STATE_VALUES_TOP + TEXT_HEIGHT * 2)
154
        int    64
155
        ret
156
; ---------------------------------------------------------------------------- ;
157
align 4
158
START:
159
; get.screen.size
160
        mov    eax, 61
161
        mov    ebx, 1
162
        int    64
163
        mov    edx, eax
164
        movzx  ecx, ax
165
        shr    edx, 16
166
; skin.height
167
        mov    eax, 48
168
        mov    ebx, 4
169
        int    64
170
        add    eax, MOUSE_HEIGHT + WINDOW_BORDER_SIZE + MOUSE_MARGIN * 2 - 1
171
        mov    esi, eax
172
        sub    edx, (WINDOW_WIDTH - 1)
173
        sub    ecx, eax
174
        shr    edx, 1
175
        shr    ecx, 1
176
; set.event
177
        mov    eax, 40
178
        mov    ebx, EM_REDRAW | EM_BUTTON | EM_MOUSE
179
        int    64
180
; ---------------------------------------------------------------------------- ;
181
align 4
182
on_redraw:
183
; redraw.start
184
        mov    eax, 12
185
        mov    ebx, 1
186
        int    64
187
; draw.window
188
        xor    eax, eax
189
        mov    ebx, edx ; window.left
190
; ecx = window.top
191
        shl    ebx, 16
192
        shl    ecx, 16
193
        or     ebx, (WINDOW_WIDTH - 1)
194
        or     ecx, esi ; window.height
195
        mov    edx, WINDOW_STYLE | WINDOW_BACK_COLOR
196
        mov    edi, sz_caption
197
        xor    esi, esi
198
        int    64
199
; redraw.finish
200
        mov    eax, 12
201
        mov    ebx, 2
202
        int    64
203
        DrawMouseBody
204
        call   DrawMouseButtons
205
align 4
206
wait.event:
207
        mov    eax, 10    ; redraw = 001b; 001b & 110b = 000b
208
        int    64         ; button = 011b; 011b & 110b = 010b
209
        test   eax, 110b  ; mouse  = 110b; 110b & 110b = 110b
210
        jz     on_redraw
211
        jnp    on_button
212
; get.mouse.button
213
        mov    eax, 37
214
        mov    ebx, 2
215
        int    64
216
        cmp    [mouse.button], eax ;      if equal
217
        je     wait.event          ; then no need update
218
        mov    ebx, dword MOUSE_LEFT_BUTTON_COLOR
219
        mov    ecx, dword MOUSE_RIGHT_BUTTON_COLOR
220
        mov    edx, dword MOUSE_MIDDLE_BUTTON_COLOR
221
.left:
222
        test   eax, MOUSE_LEFT_BUTTON_MASK
223
        jz     .right
224
        mov    ebx, dword MOUSE_LEFT_BUTTON_PRESSED_COLOR
225
.right:
226
        test   eax, MOUSE_RIGHT_BUTTON_MASK
227
        jz     .middle
228
        mov    ecx, dword MOUSE_RIGHT_BUTTON_PRESSED_COLOR
229
.middle:
230
        test   eax, MOUSE_MIDDLE_BUTTON_MASK
231
        jz     .other
232
        mov    edx, dword MOUSE_MIDDLE_BUTTON_PRESSED_COLOR
233
.other:
234
        mov    [mouse_left_button_color], ebx
235
        mov    [mouse_right_button_color], ecx
236
        mov    [mouse_middle_button_color], edx
237
        mov    [mouse.button], eax
238
        call   DrawMouseButtons
239
        jmp    wait.event
240
align 4
241
on_button: ; terminate because we have only one button(close button)
242
        or     eax, -1
243
        int    64
244
; ---------------------------------------------------------------------------- ;
245
align 4
5098 clevermous 246
_END: