Subversion Repositories Kolibri OS

Rev

Rev 983 | Rev 1316 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
983 diamond 3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
593 mikedld 8
$Revision: 1300 $
9
 
10
 
33 mario79 11
;   check mouse
12
;
13
;
14
;   FB00  ->   FB0F   mouse memory 00 chunk count - FB0A-B x - FB0C-D y
15
;   FB10  ->   FB17   mouse color mem
16
;   FB21              x move
17
;   FB22              y move
18
;   FB30              color temp
19
;   FB28              high bits temp
20
;   FB4A  ->   FB4D   FB4A-B x-under - FB4C-D y-under
21
;   FC00  ->   FCFE   com1/ps2 buffer
22
;   FCFF              com1/ps2 buffer count starting from FC00
23
 
24
uglobal
25
  mousecount  dd  0x0
26
  mousedata   dd  0x0
27
endg
28
 
473 diamond 29
iglobal
769 Rus 30
mouse_delay	   dd 10
479 kastigar 31
mouse_speed_factor: dd 3
32
mouse_timer_ticks  dd 0
473 diamond 33
endg
120 mario79 34
 
769 Rus 35
;include 'm_com.inc'
33 mario79 36
 
37
 
38
;test_mario79:
39
;        push   esi
40
;        push   eax
41
;        mov    [write_error_to],process_test_m79+43
42
;        movzx  eax,al  ;[DevErrorCode]
43
;        call   writehex
44
;        mov    esi,process_test_m79
45
;        call   sys_msg_board_str
46
;        pop    eax
47
;        pop    esi
48
;        ret
49
;process_test_m79 db 'K : Process - test Mario79 error    00000000',13,10,0
50
 
51
draw_mouse_under:
769 Rus 52
	; return old picture
214 serge 53
 
769 Rus 54
	cmp [set_hw_cursor], 0
55
	jz @F
56
	pushad
57
	movzx  eax,word [X_UNDER]
58
	movzx  ebx,word [Y_UNDER]
59
	stdcall [hw_restore], eax, ebx
60
	popad
61
	ret
214 serge 62
@@:
769 Rus 63
	pushad
64
	xor    ecx,ecx
65
	xor    edx,edx
66
	align  4
119 mario79 67
mres:
769 Rus 68
	movzx  eax,word [X_UNDER]
69
	movzx  ebx,word [Y_UNDER]
70
	add    eax,ecx
71
	add    ebx,edx
72
	push   ecx
73
	push   edx
74
	push   eax
75
	push   ebx
76
	mov    eax,edx
77
	shl    eax,6
78
	shl    ecx,2
79
	add    eax,ecx
80
	add    eax,mouseunder
81
	mov    ecx,[eax]
82
	pop    ebx
83
	pop    eax
84
	mov    edi, 1 ;force
85
	call   [putpixel]
86
	pop    edx
87
	pop    ecx
88
	inc    ecx
89
	cmp    ecx, 16
90
	jnz    mres
91
	xor    ecx, ecx
92
	inc    edx
93
	cmp    edx, 24
94
	jnz    mres
95
	popad
96
	ret
33 mario79 97
 
98
save_draw_mouse:
214 serge 99
 
769 Rus 100
	cmp [set_hw_cursor], 0
101
	je .no_hw_cursor
102
	pushad
221 serge 103
 
769 Rus 104
	mov    [X_UNDER],ax
105
	mov    [Y_UNDER],bx
106
	movzx  eax,word [MOUSE_Y]
107
	movzx  ebx,word [MOUSE_X]
108
	push eax
109
	push ebx
221 serge 110
 
769 Rus 111
	mov ecx, [Screen_Max_X]
112
	inc ecx
113
	mul ecx
1300 serge 114
    add eax, [_WinMapAddress]
115
    movzx edx, byte [ebx+eax]
769 Rus 116
	shl edx, 8
802 serge 117
        mov esi, [edx+SLOT_BASE+APPDATA.cursor]
230 serge 118
 
802 serge 119
        cmp esi, [current_cursor]
769 Rus 120
	je .draw
630 serge 121
 
802 serge 122
        push esi
769 Rus 123
	call [select_hw_cursor]
802 serge 124
        mov [current_cursor], esi
630 serge 125
.draw:
802 serge 126
        stdcall [set_hw_cursor], esi
769 Rus 127
	popad
128
	ret
230 serge 129
.fail:
769 Rus 130
	mov ecx, [def_cursor]
131
	mov [edx+SLOT_BASE+APPDATA.cursor], ecx
802 serge 132
        stdcall [set_hw_cursor], ecx            ; stdcall: [esp]=ebx,eax
769 Rus 133
	popad
134
	ret
230 serge 135
 
630 serge 136
.no_hw_cursor:
769 Rus 137
	pushad
138
	; save & draw
139
	mov    [X_UNDER],ax
140
	mov    [Y_UNDER],bx
141
	push   eax
142
	push   ebx
143
	mov    ecx,0
144
	mov    edx,0
145
	align  4
119 mario79 146
drm:
769 Rus 147
	push   eax
148
	push   ebx
149
	push   ecx
150
	push   edx
151
	; helloworld
152
	push  ecx
153
	add    eax,ecx	; save picture under mouse
154
	add    ebx,edx
155
	push   ecx
156
	call   getpixel
157
	mov    [COLOR_TEMP],ecx
158
	pop    ecx
159
	mov    eax,edx
160
	shl    eax,6
161
	shl    ecx,2
162
	add    eax,ecx
163
	add    eax,mouseunder
164
	mov    ebx,[COLOR_TEMP]
165
	mov    [eax],ebx
166
	pop  ecx
167
	mov    edi,edx	     ; y cycle
168
	shl    edi,4	   ; *16 bytes per row
169
	add    edi,ecx	     ; x cycle
170
	mov    esi, edi
171
	add    edi, esi
172
	add    edi, esi       ; *3
173
	add    edi,[MOUSE_PICTURE]	; we have our str address
174
	mov    esi, edi
175
	add    esi, 16*24*3
176
	push   ecx
177
	mov    ecx, [COLOR_TEMP]
178
	call   combine_colors
179
	mov    [MOUSE_COLOR_MEM], ecx
180
	pop    ecx
181
	pop    edx
182
	pop    ecx
183
	pop    ebx
184
	pop    eax
185
	add    eax,ecx	     ; we have x coord+cycle
186
	add    ebx,edx	     ; and y coord+cycle
187
	push   ecx
188
	mov    ecx, [MOUSE_COLOR_MEM]
189
	mov    edi, 1
190
	call   [putpixel]
191
	pop    ecx
192
	mov    ebx,[esp+0]	; pure y coord again
193
	mov    eax,[esp+4]	; and x
194
	inc    ecx	    ; +1 cycle
195
	cmp    ecx,16	    ; if more than 16
196
	jnz    drm
197
	xor    ecx, ecx
198
	inc    edx
199
	cmp    edx,24
200
	jnz    drm
201
	add   esp,8
202
	popad
203
	ret
33 mario79 204
 
205
 
206
combine_colors:
207
      ; in
208
      ; ecx - color ( 00 RR GG BB )
209
      ; edi - ref to new color byte
210
      ; esi - ref to alpha byte
211
      ;
212
      ; out
213
      ; ecx - new color ( roughly (ecx*[esi]>>8)+([edi]*[esi]>>8) )
214
      push eax
215
      push ebx
216
      push edx
217
      push ecx
218
      xor ecx, ecx
769 Rus 219
	 ; byte 2
33 mario79 220
      mov eax, 0xff
221
      sub al, [esi+0]
222
      mov ebx, [esp]
223
      shr ebx, 16
224
      and ebx, 0xff
225
      mul ebx
226
      shr eax, 8
227
      add ecx, eax
119 mario79 228
      xor eax, eax
229
      xor ebx, ebx
230
      mov al, [edi+0]
231
      mov bl, [esi+0]
33 mario79 232
      mul ebx
233
      shr eax, 8
234
      add ecx, eax
235
      shl ecx, 8
769 Rus 236
	 ; byte 1
33 mario79 237
      mov eax, 0xff
238
      sub al, [esi+1]
239
      mov ebx, [esp]
240
      shr ebx, 8
241
      and ebx, 0xff
242
      mul ebx
243
      shr eax, 8
244
      add ecx, eax
119 mario79 245
      xor eax, eax
246
      xor ebx, ebx
247
      mov al, [edi+1]
248
      mov bl, [esi+1]
33 mario79 249
      mul ebx
250
      shr eax, 8
251
      add ecx, eax
252
      shl ecx, 8
769 Rus 253
	 ; byte 2
33 mario79 254
      mov eax, 0xff
255
      sub al, [esi+2]
256
      mov ebx, [esp]
257
      and ebx, 0xff
258
      mul ebx
259
      shr eax, 8
260
      add ecx, eax
119 mario79 261
      xor eax, eax
262
      xor ebx, ebx
263
      mov al, [edi+2]
264
      mov bl, [esi+2]
33 mario79 265
      mul ebx
266
      shr eax, 8
267
      add ecx, eax
268
      pop eax
269
      pop edx
270
      pop ebx
271
      pop eax
272
      ret
273
 
274
 
275
__sys_disable_mouse:
381 serge 276
      cmp  dword [MOUSE_VISIBLE],dword 0
36 mario79 277
      je    @f
278
      ret
214 serge 279
@@:
33 mario79 280
      pushad
379 serge 281
      cmp  [CURRENT_TASK],dword 1
33 mario79 282
      je   disable_m
379 serge 283
      mov  edx,[CURRENT_TASK]
33 mario79 284
      shl  edx,5
285
      add  edx,window_data
381 serge 286
      movzx  eax, word [MOUSE_X]
287
      movzx  ebx, word [MOUSE_Y]
753 serge 288
      mov  ecx,[Screen_Max_X]
33 mario79 289
      inc  ecx
290
      imul  ecx,ebx
291
      add  ecx,eax
1300 serge 292
      add  ecx, [_WinMapAddress]
379 serge 293
      mov   eax, [CURRENT_TASK]
33 mario79 294
      movzx ebx, byte [ecx]
295
      cmp   eax,ebx
296
      je    yes_mouse_disable
297
      movzx ebx, byte [ecx+16]
298
      cmp   eax,ebx
299
      je    yes_mouse_disable
753 serge 300
      mov   ebx,[Screen_Max_X]
33 mario79 301
      inc   ebx
302
      imul  ebx,10
303
      add   ecx,ebx
304
      movzx ebx, byte [ecx]
305
      cmp   eax,ebx
306
      je    yes_mouse_disable
307
      movzx ebx, byte [ecx+16]
308
      cmp   eax,ebx
309
      je    yes_mouse_disable
310
      jmp   no_mouse_disable
119 mario79 311
yes_mouse_disable:
379 serge 312
      mov  edx,[CURRENT_TASK]
33 mario79 313
      shl  edx,5
314
      add  edx,window_data
381 serge 315
      movzx  eax, word [MOUSE_X]
316
      movzx  ebx, word [MOUSE_Y]
769 Rus 317
      mov  ecx,[edx+0]	 ; mouse inside the area ?
739 heavyiron 318
      add  eax,10
33 mario79 319
      cmp  eax,ecx
320
      jb   no_mouse_disable
739 heavyiron 321
      sub  eax,10
33 mario79 322
      add  ecx,[edx+8]
323
      cmp  eax,ecx
324
      jg   no_mouse_disable
325
      mov  ecx,[edx+4]
739 heavyiron 326
      add  ebx,14
33 mario79 327
      cmp  ebx,ecx
328
      jb   no_mouse_disable
739 heavyiron 329
      sub  ebx,14
33 mario79 330
      add  ecx,[edx+12]
331
      cmp  ebx,ecx
332
      jg   no_mouse_disable
119 mario79 333
disable_m:
381 serge 334
      cmp  dword [MOUSE_VISIBLE],dword 0
119 mario79 335
      jne  no_mouse_disable
389 serge 336
      pushf
36 mario79 337
      cli
119 mario79 338
      call draw_mouse_under
389 serge 339
      popf
381 serge 340
      mov  [MOUSE_VISIBLE],dword 1
119 mario79 341
no_mouse_disable:
33 mario79 342
      popad
343
      ret
344
 
345
__sys_draw_pointer:
769 Rus 346
	cmp   [mouse_pause],0
347
	je    @f
348
	ret
119 mario79 349
@@:
769 Rus 350
	push   eax
351
	mov	eax,[timer_ticks]
352
	sub	eax,[MouseTickCounter]
353
	cmp	eax,1
354
	ja	@f
355
	pop    eax
356
	ret
119 mario79 357
@@:
769 Rus 358
	mov	eax,[timer_ticks]
359
	mov	[MouseTickCounter],eax
360
	pop	eax
361
	pushad
362
	cmp    dword [MOUSE_VISIBLE],dword 0  ; mouse visible ?
363
	je     chms00
364
	mov	[MOUSE_VISIBLE], dword 0
365
	movzx  ebx,word [MOUSE_Y]
366
	movzx  eax,word [MOUSE_X]
367
	pushfd
368
	cli
369
	call   save_draw_mouse
370
	popfd
119 mario79 371
nodmu2:
769 Rus 372
	popad
373
	ret
119 mario79 374
chms00:
769 Rus 375
	movzx  ecx,word [X_UNDER]
376
	movzx  edx,word [Y_UNDER]
377
	movzx  ebx,word [MOUSE_Y]
378
	movzx  eax,word [MOUSE_X]
379
	cmp    eax,ecx
380
	jne    redrawmouse
381
	cmp    ebx,edx
382
	jne    redrawmouse
383
	jmp    nodmp
119 mario79 384
redrawmouse:
769 Rus 385
	pushfd
386
	cli
387
	call   draw_mouse_under
388
	call   save_draw_mouse
389
	popfd
119 mario79 390
nodmp:
769 Rus 391
	popad
392
	ret
119 mario79 393
 
479 kastigar 394
proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword
630 serge 395
 
479 kastigar 396
    mov  eax,[BtnState]
397
    mov  [BTN_DOWN],eax
398
 
399
    mov  eax,[XMoving]
400
    call mouse_acceleration
769 Rus 401
    add  ax,[MOUSE_X]	 ;[XCoordinate]
479 kastigar 402
    cmp  ax,0
403
    jge  @@M1
404
    mov  eax,0
405
    jmp  @@M2
406
@@M1:
753 serge 407
    cmp  ax,[Screen_Max_X]   ;ScreenLength
769 Rus 408
    jl	 @@M2
753 serge 409
    mov  ax,[Screen_Max_X]   ;ScreenLength-1
479 kastigar 410
 
411
@@M2:
769 Rus 412
    mov  [MOUSE_X],ax	  ;[XCoordinate]
479 kastigar 413
 
414
    mov  eax,[YMoving]
415
    neg  eax
416
    call mouse_acceleration
417
 
769 Rus 418
    add  ax,[MOUSE_Y]	;[YCoordinate]
479 kastigar 419
    cmp  ax,0
420
    jge  @@M3
421
    mov  ax,0
422
    jmp  @@M4
423
@@M3:
753 serge 424
    cmp  ax,[Screen_Max_Y]  ;ScreenHeigth
769 Rus 425
    jl	 @@M4
753 serge 426
    mov  ax,[Screen_Max_Y] ;ScreenHeigth-1
479 kastigar 427
 
428
@@M4:
769 Rus 429
    mov  [MOUSE_Y],ax	  ;[YCoordinate]
479 kastigar 430
 
431
    mov  eax,[VScroll]
432
    add  [MOUSE_SCROLL_V],ax
630 serge 433
 
479 kastigar 434
    mov  eax,[HScroll]
435
    add  [MOUSE_SCROLL_H],ax
436
 
437
    mov  [mouse_active],1
438
    mov  eax,[timer_ticks]
439
    mov  [mouse_timer_ticks],eax
440
    ret
441
endp
442
 
443
mouse_acceleration:
769 Rus 444
	push  eax
445
	mov   eax,[timer_ticks]
446
	sub   eax,[mouse_timer_ticks]
447
	cmp   eax,[mouse_delay]
448
	pop   eax
449
	ja    @f
450
	;push  edx
451
	imul  eax,[mouse_speed_factor]
452
	;pop   edx
479 kastigar 453
@@:
769 Rus 454
	ret
479 kastigar 455