Subversion Repositories Kolibri OS

Rev

Rev 1505 | Rev 1859 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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