Subversion Repositories Kolibri OS

Rev

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