Subversion Repositories Kolibri OS

Rev

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

Rev 4423 Rev 5201
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2014. 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: 4423 $
8
$Revision: 5201 $
9
 
9
 
10
 
10
 
11
LOAD_FROM_FILE  equ 0
11
LOAD_FROM_FILE  equ 0
12
LOAD_FROM_MEM   equ 1
12
LOAD_FROM_MEM   equ 1
13
LOAD_INDIRECT   equ 2
13
LOAD_INDIRECT   equ 2
14
LOAD_SYSTEM     equ 3
14
LOAD_SYSTEM     equ 3
15
 
15
 
16
struct  BITMAPINFOHEADER
16
struct  BITMAPINFOHEADER
17
        Size                    dd ?
17
        Size                    dd ?
18
        Width                   dd ?
18
        Width                   dd ?
19
        Height                  dd ?
19
        Height                  dd ?
20
        Planes                  dw ?
20
        Planes                  dw ?
21
        BitCount                dw ?
21
        BitCount                dw ?
22
        Compression             dd ?
22
        Compression             dd ?
23
        SizeImage               dd ?
23
        SizeImage               dd ?
24
        XPelsPerMeter           dd ?
24
        XPelsPerMeter           dd ?
25
        YPelsPerMeter           dd ?
25
        YPelsPerMeter           dd ?
26
        ClrUsed                 dd ?
26
        ClrUsed                 dd ?
27
        ClrImportant            dd ?
27
        ClrImportant            dd ?
28
ends
28
ends
29
;------------------------------------------------------------------------------
29
;------------------------------------------------------------------------------
30
align 4
30
align 4
31
proc init_cursor stdcall, dst:dword, src:dword
31
proc init_cursor stdcall, dst:dword, src:dword
32
           locals
32
           locals
33
             rBase    dd ?
33
             rBase    dd ?
34
             pQuad    dd ?
34
             pQuad    dd ?
35
             pBits    dd ?
35
             pBits    dd ?
36
             pAnd     dd ?
36
             pAnd     dd ?
37
             width    dd ?
37
             width    dd ?
38
             height   dd ?
38
             height   dd ?
39
             counter  dd ?
39
             counter  dd ?
40
           endl
40
           endl
41
 
41
 
42
        mov     esi, [src]
42
        mov     esi, [src]
43
        add     esi, [esi+18]
43
        add     esi, [esi+18]
44
        mov     eax, esi
44
        mov     eax, esi
45
 
45
 
46
        cmp     [esi+BITMAPINFOHEADER.BitCount], 24
46
        cmp     [esi+BITMAPINFOHEADER.BitCount], 24
47
        je      .img_24
47
        je      .img_24
48
        cmp     [esi+BITMAPINFOHEADER.BitCount], 8
48
        cmp     [esi+BITMAPINFOHEADER.BitCount], 8
49
        je      .img_8
49
        je      .img_8
50
        cmp     [esi+BITMAPINFOHEADER.BitCount], 4
50
        cmp     [esi+BITMAPINFOHEADER.BitCount], 4
51
        je      .img_4
51
        je      .img_4
52
;--------------------------------------
52
;--------------------------------------
53
align 4
53
align 4
54
.img_2:
54
.img_2:
55
        add     eax, [esi]
55
        add     eax, [esi]
56
        mov     [pQuad], eax
56
        mov     [pQuad], eax
57
        add     eax, 8
57
        add     eax, 8
58
        mov     [pBits], eax
58
        mov     [pBits], eax
59
        add     eax, 128
59
        add     eax, 128
60
        mov     [pAnd], eax
60
        mov     [pAnd], eax
61
        mov     eax, [esi+4]
61
        mov     eax, [esi+4]
62
        mov     [width], eax
62
        mov     [width], eax
63
        mov     ebx, [esi+8]
63
        mov     ebx, [esi+8]
64
        shr     ebx, 1
64
        shr     ebx, 1
65
        mov     [height], ebx
65
        mov     [height], ebx
66
 
66
 
67
        mov     edi, [dst]
67
        mov     edi, [dst]
68
        add     edi, 32*31*4
68
        add     edi, 32*31*4
69
        mov     [rBase], edi
69
        mov     [rBase], edi
70
 
70
 
71
        mov     esi, [pQuad]
71
        mov     esi, [pQuad]
72
;--------------------------------------
72
;--------------------------------------
73
align 4
73
align 4
74
.l21:
74
.l21:
75
        mov     ebx, [pBits]
75
        mov     ebx, [pBits]
76
        mov     ebx, [ebx]
76
        mov     ebx, [ebx]
77
        bswap   ebx
77
        bswap   ebx
78
        mov     eax, [pAnd]
78
        mov     eax, [pAnd]
79
        mov     eax, [eax]
79
        mov     eax, [eax]
80
        bswap   eax
80
        bswap   eax
81
        mov     [counter], 32
81
        mov     [counter], 32
82
;--------------------------------------
82
;--------------------------------------
83
align 4
83
align 4
84
@@:
84
@@:
85
        xor     edx, edx
85
        xor     edx, edx
86
        shl     eax, 1
86
        shl     eax, 1
87
        setc    dl
87
        setc    dl
88
        dec     edx
88
        dec     edx
89
 
89
 
90
        xor     ecx, ecx
90
        xor     ecx, ecx
91
        shl     ebx, 1
91
        shl     ebx, 1
92
        setc    cl
92
        setc    cl
93
        mov     ecx, [esi+ecx*4]
93
        mov     ecx, [esi+ecx*4]
94
        and     ecx, edx
94
        and     ecx, edx
95
        and     edx, 0xFF000000
95
        and     edx, 0xFF000000
96
        or      edx, ecx
96
        or      edx, ecx
97
        mov     [edi], edx
97
        mov     [edi], edx
98
 
98
 
99
        add     edi, 4
99
        add     edi, 4
100
        dec     [counter]
100
        dec     [counter]
101
        jnz     @B
101
        jnz     @B
102
 
102
 
103
        add     [pBits], 4
103
        add     [pBits], 4
104
        add     [pAnd], 4
104
        add     [pAnd], 4
105
        mov     edi, [rBase]
105
        mov     edi, [rBase]
106
        sub     edi, 128
106
        sub     edi, 128
107
        mov     [rBase], edi
107
        mov     [rBase], edi
108
        sub     [height], 1
108
        sub     [height], 1
109
        jnz     .l21
109
        jnz     .l21
110
        ret
110
        ret
111
;--------------------------------------
111
;--------------------------------------
112
align 4
112
align 4
113
.img_4:
113
.img_4:
114
        add     eax, [esi]
114
        add     eax, [esi]
115
        mov     [pQuad], eax
115
        mov     [pQuad], eax
116
        add     eax, 64
116
        add     eax, 64
117
        mov     [pBits], eax
117
        mov     [pBits], eax
118
        add     eax, 0x200
118
        add     eax, 0x200
119
        mov     [pAnd], eax
119
        mov     [pAnd], eax
120
        mov     eax, [esi+4]
120
        mov     eax, [esi+4]
121
        mov     [width], eax
121
        mov     [width], eax
122
        mov     ebx, [esi+8]
122
        mov     ebx, [esi+8]
123
        shr     ebx, 1
123
        shr     ebx, 1
124
        mov     [height], ebx
124
        mov     [height], ebx
125
 
125
 
126
        mov     edi, [dst]
126
        mov     edi, [dst]
127
        add     edi, 32*31*4
127
        add     edi, 32*31*4
128
        mov     [rBase], edi
128
        mov     [rBase], edi
129
 
129
 
130
        mov     esi, [pQuad]
130
        mov     esi, [pQuad]
131
        mov     ebx, [pBits]
131
        mov     ebx, [pBits]
132
;--------------------------------------
132
;--------------------------------------
133
align 4
133
align 4
134
.l4:
134
.l4:
135
        mov     eax, [pAnd]
135
        mov     eax, [pAnd]
136
        mov     eax, [eax]
136
        mov     eax, [eax]
137
        bswap   eax
137
        bswap   eax
138
        mov     [counter], 16
138
        mov     [counter], 16
139
;--------------------------------------
139
;--------------------------------------
140
align 4
140
align 4
141
@@:
141
@@:
142
        xor     edx, edx
142
        xor     edx, edx
143
        shl     eax, 1
143
        shl     eax, 1
144
        setc    dl
144
        setc    dl
145
        dec     edx
145
        dec     edx
146
 
146
 
147
        movzx   ecx, byte [ebx]
147
        movzx   ecx, byte [ebx]
148
        and     cl, 0xF0
148
        and     cl, 0xF0
149
        shr     ecx, 2
149
        shr     ecx, 2
150
        mov     ecx, [esi+ecx]
150
        mov     ecx, [esi+ecx]
151
        and     ecx, edx
151
        and     ecx, edx
152
        and     edx, 0xFF000000
152
        and     edx, 0xFF000000
153
        or      edx, ecx
153
        or      edx, ecx
154
        mov     [edi], edx
154
        mov     [edi], edx
155
 
155
 
156
        xor     edx, edx
156
        xor     edx, edx
157
        shl     eax, 1
157
        shl     eax, 1
158
        setc    dl
158
        setc    dl
159
        dec     edx
159
        dec     edx
160
 
160
 
161
        movzx   ecx, byte [ebx]
161
        movzx   ecx, byte [ebx]
162
        and     cl, 0x0F
162
        and     cl, 0x0F
163
        mov     ecx, [esi+ecx*4]
163
        mov     ecx, [esi+ecx*4]
164
        and     ecx, edx
164
        and     ecx, edx
165
        and     edx, 0xFF000000
165
        and     edx, 0xFF000000
166
        or      edx, ecx
166
        or      edx, ecx
167
        mov     [edi+4], edx
167
        mov     [edi+4], edx
168
 
168
 
169
        inc     ebx
169
        inc     ebx
170
        add     edi, 8
170
        add     edi, 8
171
        dec     [counter]
171
        dec     [counter]
172
        jnz     @B
172
        jnz     @B
173
 
173
 
174
        add     [pAnd], 4
174
        add     [pAnd], 4
175
        mov     edi, [rBase]
175
        mov     edi, [rBase]
176
        sub     edi, 128
176
        sub     edi, 128
177
        mov     [rBase], edi
177
        mov     [rBase], edi
178
        sub     [height], 1
178
        sub     [height], 1
179
        jnz     .l4
179
        jnz     .l4
180
        ret
180
        ret
181
;--------------------------------------
181
;--------------------------------------
182
align 4
182
align 4
183
.img_8:
183
.img_8:
184
        add     eax, [esi]
184
        add     eax, [esi]
185
        mov     [pQuad], eax
185
        mov     [pQuad], eax
186
        add     eax, 1024
186
        add     eax, 1024
187
        mov     [pBits], eax
187
        mov     [pBits], eax
188
        add     eax, 1024
188
        add     eax, 1024
189
        mov     [pAnd], eax
189
        mov     [pAnd], eax
190
        mov     eax, [esi+4]
190
        mov     eax, [esi+4]
191
        mov     [width], eax
191
        mov     [width], eax
192
        mov     ebx, [esi+8]
192
        mov     ebx, [esi+8]
193
        shr     ebx, 1
193
        shr     ebx, 1
194
        mov     [height], ebx
194
        mov     [height], ebx
195
 
195
 
196
        mov     edi, [dst]
196
        mov     edi, [dst]
197
        add     edi, 32*31*4
197
        add     edi, 32*31*4
198
        mov     [rBase], edi
198
        mov     [rBase], edi
199
 
199
 
200
        mov     esi, [pQuad]
200
        mov     esi, [pQuad]
201
        mov     ebx, [pBits]
201
        mov     ebx, [pBits]
202
;--------------------------------------
202
;--------------------------------------
203
align 4
203
align 4
204
.l81:
204
.l81:
205
        mov     eax, [pAnd]
205
        mov     eax, [pAnd]
206
        mov     eax, [eax]
206
        mov     eax, [eax]
207
        bswap   eax
207
        bswap   eax
208
        mov     [counter], 32
208
        mov     [counter], 32
209
;--------------------------------------
209
;--------------------------------------
210
align 4
210
align 4
211
@@:
211
@@:
212
        xor     edx, edx
212
        xor     edx, edx
213
        shl     eax, 1
213
        shl     eax, 1
214
        setc    dl
214
        setc    dl
215
        dec     edx
215
        dec     edx
216
 
216
 
217
        movzx   ecx, byte [ebx]
217
        movzx   ecx, byte [ebx]
218
        mov     ecx, [esi+ecx*4]
218
        mov     ecx, [esi+ecx*4]
219
        and     ecx, edx
219
        and     ecx, edx
220
        and     edx, 0xFF000000
220
        and     edx, 0xFF000000
221
        or      edx, ecx
221
        or      edx, ecx
222
        mov     [edi], edx
222
        mov     [edi], edx
223
 
223
 
224
        inc     ebx
224
        inc     ebx
225
        add     edi, 4
225
        add     edi, 4
226
        dec     [counter]
226
        dec     [counter]
227
        jnz     @B
227
        jnz     @B
228
 
228
 
229
        add     [pAnd], 4
229
        add     [pAnd], 4
230
        mov     edi, [rBase]
230
        mov     edi, [rBase]
231
        sub     edi, 128
231
        sub     edi, 128
232
        mov     [rBase], edi
232
        mov     [rBase], edi
233
        sub     [height], 1
233
        sub     [height], 1
234
        jnz     .l81
234
        jnz     .l81
235
        ret
235
        ret
236
;--------------------------------------
236
;--------------------------------------
237
align 4
237
align 4
238
.img_24:
238
.img_24:
239
        add     eax, [esi]
239
        add     eax, [esi]
240
        mov     [pQuad], eax
240
        mov     [pQuad], eax
241
        add     eax, 0xC00
241
        add     eax, 0xC00
242
        mov     [pAnd], eax
242
        mov     [pAnd], eax
243
        mov     eax, [esi+BITMAPINFOHEADER.Width]
243
        mov     eax, [esi+BITMAPINFOHEADER.Width]
244
        mov     [width], eax
244
        mov     [width], eax
245
        mov     ebx, [esi+BITMAPINFOHEADER.Height]
245
        mov     ebx, [esi+BITMAPINFOHEADER.Height]
246
        shr     ebx, 1
246
        shr     ebx, 1
247
        mov     [height], ebx
247
        mov     [height], ebx
248
 
248
 
249
        mov     edi, [dst]
249
        mov     edi, [dst]
250
        add     edi, 32*31*4
250
        add     edi, 32*31*4
251
        mov     [rBase], edi
251
        mov     [rBase], edi
252
 
252
 
253
        mov     esi, [pAnd]
253
        mov     esi, [pAnd]
254
        mov     ebx, [pQuad]
254
        mov     ebx, [pQuad]
255
;--------------------------------------
255
;--------------------------------------
256
align 4
256
align 4
257
.row_24:
257
.row_24:
258
        mov     eax, [esi]
258
        mov     eax, [esi]
259
        bswap   eax
259
        bswap   eax
260
        mov     [counter], 32
260
        mov     [counter], 32
261
;--------------------------------------
261
;--------------------------------------
262
align 4
262
align 4
263
@@:
263
@@:
264
        xor     edx, edx
264
        xor     edx, edx
265
        shl     eax, 1
265
        shl     eax, 1
266
        setc    dl
266
        setc    dl
267
        dec     edx
267
        dec     edx
268
 
268
 
269
        mov     ecx, [ebx]
269
        mov     ecx, [ebx]
270
        and     ecx, 0x00FFFFFF
270
        and     ecx, 0x00FFFFFF
271
        and     ecx, edx
271
        and     ecx, edx
272
        and     edx, 0xFF000000
272
        and     edx, 0xFF000000
273
        or      edx, ecx
273
        or      edx, ecx
274
        mov     [edi], edx
274
        mov     [edi], edx
275
        add     ebx, 3
275
        add     ebx, 3
276
        add     edi, 4
276
        add     edi, 4
277
        dec     [counter]
277
        dec     [counter]
278
        jnz     @B
278
        jnz     @B
279
 
279
 
280
        add     esi, 4
280
        add     esi, 4
281
        mov     edi, [rBase]
281
        mov     edi, [rBase]
282
        sub     edi, 128
282
        sub     edi, 128
283
        mov     [rBase], edi
283
        mov     [rBase], edi
284
        sub     [height], 1
284
        sub     [height], 1
285
        jnz     .row_24
285
        jnz     .row_24
286
        ret
286
        ret
287
endp
287
endp
288
;------------------------------------------------------------------------------
288
;------------------------------------------------------------------------------
289
align 4
289
align 4
290
proc set_cursor stdcall, hcursor:dword
290
proc set_cursor stdcall, hcursor:dword
291
        mov     eax, [hcursor]
291
        mov     eax, [hcursor]
292
        cmp     [eax+CURSOR.magic], 'CURS'
292
        cmp     [eax+CURSOR.magic], 'CURS'
293
        jne     .fail
293
        jne     .fail
294
;           cmp [eax+CURSOR.size], CURSOR_SIZE
294
;           cmp [eax+CURSOR.size], CURSOR_SIZE
295
;           jne .fail
295
;           jne .fail
296
        mov     ebx, [current_slot]
296
        mov     ebx, [current_slot]
297
        xchg    eax, [ebx+APPDATA.cursor]
297
        xchg    eax, [ebx+APPDATA.cursor]
298
        mov     [redrawmouse_unconditional], 1
-
 
299
        call    __sys_draw_pointer
-
 
300
        ret
298
        jmp     .end
301
;--------------------------------------
299
;--------------------------------------
302
align 4
300
align 4
303
.fail:
301
.fail:
304
        mov     eax, [def_cursor]
302
        mov     eax, [def_cursor]
305
        mov     ebx, [current_slot]
303
        mov     ebx, [current_slot]
306
        xchg    eax, [ebx+APPDATA.cursor]
304
        xchg    eax, [ebx+APPDATA.cursor]
-
 
305
align 4
-
 
306
.end:
-
 
307
        mov     [redrawmouse_unconditional], 1
-
 
308
        call    __sys_draw_pointer        
307
        ret
309
        ret
308
endp
310
endp
309
;------------------------------------------------------------------------------
311
;------------------------------------------------------------------------------
310
align 4
312
align 4
311
; param
313
; param
312
;  eax= pid
314
;  eax= pid
313
;  ebx= src
315
;  ebx= src
314
;  ecx= flags
316
;  ecx= flags
315
 
317
 
316
create_cursor:
318
create_cursor:
317
.src     equ esp
319
.src     equ esp
318
.flags   equ esp+4
320
.flags   equ esp+4
319
.hcursor equ esp+8
321
.hcursor equ esp+8
320
 
322
 
321
        sub     esp, 4         ;space for .hcursor
323
        sub     esp, 4         ;space for .hcursor
322
        push    ecx
324
        push    ecx
323
        push    ebx
325
        push    ebx
324
 
326
 
325
        mov     ebx, eax
327
        mov     ebx, eax
326
        mov     eax, sizeof.CURSOR
328
        mov     eax, sizeof.CURSOR
327
        call    create_kernel_object
329
        call    create_kernel_object
328
        test    eax, eax
330
        test    eax, eax
329
        jz      .fail
331
        jz      .fail
330
 
332
 
331
        mov     [.hcursor], eax
333
        mov     [.hcursor], eax
332
 
334
 
333
        xor     ebx, ebx
335
        xor     ebx, ebx
334
        mov     [eax+CURSOR.magic], 'CURS'
336
        mov     [eax+CURSOR.magic], 'CURS'
335
        mov     [eax+CURSOR.destroy], destroy_cursor
337
        mov     [eax+CURSOR.destroy], destroy_cursor
336
        mov     [eax+CURSOR.hot_x], ebx
338
        mov     [eax+CURSOR.hot_x], ebx
337
        mov     [eax+CURSOR.hot_y], ebx
339
        mov     [eax+CURSOR.hot_y], ebx
338
 
340
 
339
        stdcall kernel_alloc, 0x1000
341
        stdcall kernel_alloc, 0x1000
340
        test    eax, eax
342
        test    eax, eax
341
        jz      .fail
343
        jz      .fail
342
 
344
 
343
        mov     edi, [.hcursor]
345
        mov     edi, [.hcursor]
344
        mov     [edi+CURSOR.base], eax
346
        mov     [edi+CURSOR.base], eax
345
 
347
 
346
        mov     esi, [.src]
348
        mov     esi, [.src]
347
        mov     ebx, [.flags]
349
        mov     ebx, [.flags]
348
        cmp     bx, LOAD_INDIRECT
350
        cmp     bx, LOAD_INDIRECT
349
        je      .indirect
351
        je      .indirect
350
 
352
 
351
        movzx   ecx, word [esi+10]
353
        movzx   ecx, word [esi+10]
352
        movzx   edx, word [esi+12]
354
        movzx   edx, word [esi+12]
353
        mov     [edi+CURSOR.hot_x], ecx
355
        mov     [edi+CURSOR.hot_x], ecx
354
        mov     [edi+CURSOR.hot_y], edx
356
        mov     [edi+CURSOR.hot_y], edx
355
 
357
 
356
        stdcall init_cursor, eax, esi
358
        stdcall init_cursor, eax, esi
357
 
359
 
358
align 4
360
align 4
359
.add_cursor:
361
.add_cursor:
360
        mov     ecx, [.hcursor]
362
        mov     ecx, [.hcursor]
361
        lea     ecx, [ecx+CURSOR.list_next]
363
        lea     ecx, [ecx+CURSOR.list_next]
362
        lea     edx, [_display.cr_list.next]
364
        lea     edx, [_display.cr_list.next]
363
 
365
 
364
        pushfd
366
        pushfd
365
        cli
367
        cli
366
        list_add ecx, edx   ;list_add_tail(new, head)
368
        list_add ecx, edx   ;list_add_tail(new, head)
367
        popfd
369
        popfd
368
 
370
 
369
        mov     eax, [.hcursor]
371
        mov     eax, [.hcursor]
370
        cmp     [_display.init_cursor], 0
372
        cmp     [_display.init_cursor], 0
371
        je      .fail
373
        je      .fail
372
 
374
 
373
        push    eax
375
        push    eax
374
        call    [_display.init_cursor]
376
        call    [_display.init_cursor]
375
        add     esp, 4
377
        add     esp, 4
376
 
378
 
377
        mov     eax, [.hcursor]
379
        mov     eax, [.hcursor]
378
;--------------------------------------
380
;--------------------------------------
379
align 4
381
align 4
380
.fail:
382
.fail:
381
        add     esp, 12
383
        add     esp, 12
382
        ret
384
        ret
383
;--------------------------------------
385
;--------------------------------------
384
align 4
386
align 4
385
.indirect:
387
.indirect:
386
        shr     ebx, 16
388
        shr     ebx, 16
387
        movzx   ecx, bh
389
        movzx   ecx, bh
388
        movzx   edx, bl
390
        movzx   edx, bl
389
        mov     [edi+CURSOR.hot_x], ecx
391
        mov     [edi+CURSOR.hot_x], ecx
390
        mov     [edi+CURSOR.hot_y], edx
392
        mov     [edi+CURSOR.hot_y], edx
391
 
393
 
392
        xchg    edi, eax
394
        xchg    edi, eax
393
        mov     ecx, 1024
395
        mov     ecx, 1024
394
        cld
396
        cld
395
        rep movsd
397
        rep movsd
396
        jmp     .add_cursor
398
        jmp     .add_cursor
397
;------------------------------------------------------------------------------
399
;------------------------------------------------------------------------------
398
align 4
400
align 4
399
proc load_cursor stdcall, src:dword, flags:dword
401
proc load_cursor stdcall, src:dword, flags:dword
400
           locals
402
           locals
401
             handle  dd ?
403
             handle  dd ?
402
           endl
404
           endl
403
 
405
 
404
        xor     eax, eax
406
        xor     eax, eax
405
        cmp     [create_cursor], eax
407
        cmp     [create_cursor], eax
406
        je      .fail2
408
        je      .fail2
407
 
409
 
408
        mov     [handle], eax
410
        mov     [handle], eax
409
        cmp     word [flags], LOAD_FROM_FILE
411
        cmp     word [flags], LOAD_FROM_FILE
410
        jne     @F
412
        jne     @F
411
 
413
 
412
        stdcall load_file, [src]
414
        stdcall load_file, [src]
413
        test    eax, eax
415
        test    eax, eax
414
        jz      .fail
416
        jz      .fail
415
        mov     [src], eax
417
        mov     [src], eax
416
;--------------------------------------
418
;--------------------------------------
417
align 4
419
align 4
418
@@:
420
@@:
419
        push    ebx
421
        push    ebx
420
        push    esi
422
        push    esi
421
        push    edi
423
        push    edi
422
 
424
 
423
        mov     eax, [CURRENT_TASK]
425
        mov     eax, [CURRENT_TASK]
424
        shl     eax, 5
426
        shl     eax, 5
425
        mov     eax, [CURRENT_TASK+eax+4]
427
        mov     eax, [CURRENT_TASK+eax+4]
426
        mov     ebx, [src]
428
        mov     ebx, [src]
427
        mov     ecx, [flags]
429
        mov     ecx, [flags]
428
        call    create_cursor    ;eax, ebx, ecx
430
        call    create_cursor    ;eax, ebx, ecx
429
        mov     [handle], eax
431
        mov     [handle], eax
430
 
432
 
431
        cmp     word [flags], LOAD_FROM_FILE
433
        cmp     word [flags], LOAD_FROM_FILE
432
        jne     .exit
434
        jne     .exit
433
        stdcall kernel_free, [src]
435
        stdcall kernel_free, [src]
434
;--------------------------------------
436
;--------------------------------------
435
align 4
437
align 4
436
.exit:
438
.exit:
437
        pop     edi
439
        pop     edi
438
        pop     esi
440
        pop     esi
439
        pop     ebx
441
        pop     ebx
440
;--------------------------------------
442
;--------------------------------------
441
align 4
443
align 4
442
.fail:
444
.fail:
443
        mov     eax, [handle]
445
        mov     eax, [handle]
444
;--------------------------------------
446
;--------------------------------------
445
align 4
447
align 4
446
.fail2:
448
.fail2:
447
        ret
449
        ret
448
endp
450
endp
449
;------------------------------------------------------------------------------
451
;------------------------------------------------------------------------------
450
align 4
452
align 4
451
proc delete_cursor stdcall, hcursor:dword
453
proc delete_cursor stdcall, hcursor:dword
452
 
454
 
453
;        DEBUGF 1,'K : delete_cursor %x\n', [hcursor]
455
;        DEBUGF 1,'K : delete_cursor %x\n', [hcursor]
454
 
456
 
455
        mov     esi, [hcursor]
457
        mov     esi, [hcursor]
456
 
458
 
457
        cmp     [esi+CURSOR.magic], 'CURS'
459
        cmp     [esi+CURSOR.magic], 'CURS'
458
        jne     .fail
460
        jne     .fail
459
 
461
 
460
        mov     ebx, [CURRENT_TASK]
462
        mov     ebx, [CURRENT_TASK]
461
        shl     ebx, 5
463
        shl     ebx, 5
462
        mov     ebx, [CURRENT_TASK+ebx+4]
464
        mov     ebx, [CURRENT_TASK+ebx+4]
463
        cmp     ebx, [esi+CURSOR.pid]
465
        cmp     ebx, [esi+CURSOR.pid]
464
        jne     .fail
466
        jne     .fail
465
 
467
 
466
        mov     ebx, [current_slot]
468
        mov     ebx, [current_slot]
467
        cmp     esi, [ebx+APPDATA.cursor]
469
        cmp     esi, [ebx+APPDATA.cursor]
468
        jne     @F
470
        jne     @F
469
        mov     eax, [def_cursor]
471
        mov     eax, [def_cursor]
470
        mov     [ebx+APPDATA.cursor], eax
472
        mov     [ebx+APPDATA.cursor], eax
471
;--------------------------------------
473
;--------------------------------------
472
align 4
474
align 4
473
@@:
475
@@:
474
        mov     eax, [hcursor]
476
        mov     eax, [hcursor]
475
        call    [eax+APPOBJ.destroy]
477
        call    [eax+APPOBJ.destroy]
476
;--------------------------------------
478
;--------------------------------------
477
align 4
479
align 4
478
.fail:
480
.fail:
479
        ret
481
        ret
480
endp
482
endp
481
;------------------------------------------------------------------------------
483
;------------------------------------------------------------------------------
482
align 4
484
align 4
483
; param
485
; param
484
;  eax= cursor
486
;  eax= cursor
485
destroy_cursor:
487
destroy_cursor:
486
 
488
 
487
        push    eax
489
        push    eax
488
        stdcall kernel_free, [eax+CURSOR.base]
490
        stdcall kernel_free, [eax+CURSOR.base]
489
 
491
 
490
        mov     eax, [esp]
492
        mov     eax, [esp]
491
        lea     eax, [eax+CURSOR.list_next]
493
        lea     eax, [eax+CURSOR.list_next]
492
 
494
 
493
        pushfd
495
        pushfd
494
        cli
496
        cli
495
        list_del eax
497
        list_del eax
496
        popfd
498
        popfd
497
 
499
 
498
        pop     eax
500
        pop     eax
499
        call    destroy_kernel_object
501
        call    destroy_kernel_object
500
        ret
502
        ret
501
;------------------------------------------------------------------------------
503
;------------------------------------------------------------------------------
502
align 4
504
align 4
503
select_cursor:
505
select_cursor:
504
        mov     eax, [esp+4]
506
        mov     eax, [esp+4]
505
        mov     [_display.cursor], eax
507
        mov     [_display.cursor], eax
506
        ret     4
508
        ret     4
507
;------------------------------------------------------------------------------
509
;------------------------------------------------------------------------------
508
align 4
510
align 4
509
proc restore_24 stdcall, x:dword, y:dword
511
proc restore_24 stdcall, x:dword, y:dword
510
 
512
 
511
        push    ebx
513
        push    ebx
512
 
514
 
513
        mov     ebx, [cur_saved_base]
515
        mov     ebx, [cur_saved_base]
514
        mov     edx, [cur.h]
516
        mov     edx, [cur.h]
515
        test    edx, edx
517
        test    edx, edx
516
        jz      .ret
518
        jz      .ret
517
 
519
 
518
        push    esi
520
        push    esi
519
        push    edi
521
        push    edi
520
 
522
 
521
        mov     esi, cur_saved_data
523
        mov     esi, cur_saved_data
522
        mov     ecx, [cur.w]
524
        mov     ecx, [cur.w]
523
        lea     ecx, [ecx+ecx*2]
525
        lea     ecx, [ecx+ecx*2]
524
        push    ecx
526
        push    ecx
525
;--------------------------------------
527
;--------------------------------------
526
align 4
528
align 4
527
@@:
529
@@:
528
        mov     edi, ebx
530
        mov     edi, ebx
529
        add     ebx, [_display.pitch]
531
        add     ebx, [_display.pitch]
530
 
532
 
531
        mov     ecx, [esp]
533
        mov     ecx, [esp]
532
        rep movsb
534
        rep movsb
533
        dec     edx
535
        dec     edx
534
        jnz     @B
536
        jnz     @B
535
 
537
 
536
        pop     ecx
538
        pop     ecx
537
        pop     edi
539
        pop     edi
538
        pop     esi
540
        pop     esi
539
;--------------------------------------
541
;--------------------------------------
540
align 4
542
align 4
541
.ret:
543
.ret:
542
        pop     ebx
544
        pop     ebx
543
        ret
545
        ret
544
endp
546
endp
545
;------------------------------------------------------------------------------
547
;------------------------------------------------------------------------------
546
align 4
548
align 4
547
proc restore_32 stdcall, x:dword, y:dword
549
proc restore_32 stdcall, x:dword, y:dword
548
 
550
 
549
        push    ebx
551
        push    ebx
550
 
552
 
551
        mov     ebx, [cur_saved_base]
553
        mov     ebx, [cur_saved_base]
552
        mov     edx, [cur.h]
554
        mov     edx, [cur.h]
553
        test    edx, edx
555
        test    edx, edx
554
        jz      .ret
556
        jz      .ret
555
 
557
 
556
        push    esi
558
        push    esi
557
        push    edi
559
        push    edi
558
 
560
 
559
        mov     esi, cur_saved_data
561
        mov     esi, cur_saved_data
560
;--------------------------------------
562
;--------------------------------------
561
align 4
563
align 4
562
@@:
564
@@:
563
        mov     edi, ebx
565
        mov     edi, ebx
564
        add     ebx, [_display.pitch]
566
        add     ebx, [_display.pitch]
565
 
567
 
566
        mov     ecx, [cur.w]
568
        mov     ecx, [cur.w]
567
        rep movsd
569
        rep movsd
568
        dec     edx
570
        dec     edx
569
        jnz     @B
571
        jnz     @B
570
 
572
 
571
        pop     edi
573
        pop     edi
572
;--------------------------------------
574
;--------------------------------------
573
align 4
575
align 4
574
.ret:
576
.ret:
575
        pop     esi
577
        pop     esi
576
        pop     ebx
578
        pop     ebx
577
        ret
579
        ret
578
endp
580
endp
579
;------------------------------------------------------------------------------
581
;------------------------------------------------------------------------------
580
align 4
582
align 4
-
 
583
proc restore_16 stdcall, x:dword, y:dword
-
 
584
 
-
 
585
        push    ebx
-
 
586
 
-
 
587
        mov     ebx, [cur_saved_base]
-
 
588
        mov     edx, [cur.h]
-
 
589
        test    edx, edx
-
 
590
        jz      .ret
-
 
591
 
-
 
592
        push    esi
-
 
593
        push    edi
-
 
594
 
-
 
595
        mov     esi, cur_saved_data
-
 
596
;--------------------------------------
-
 
597
align 4
-
 
598
@@:
-
 
599
        mov     edi, ebx
-
 
600
        add     ebx, [_display.pitch]
-
 
601
 
-
 
602
        mov     ecx, [cur.w]
-
 
603
        rep movsw
-
 
604
        dec     edx
-
 
605
        jnz     @B
-
 
606
 
-
 
607
        pop     edi
-
 
608
;--------------------------------------
-
 
609
align 4
-
 
610
.ret:
-
 
611
        pop     esi
-
 
612
        pop     ebx
-
 
613
        ret
-
 
614
endp
-
 
615
;------------------------------------------------------------------------------
-
 
616
align 4
581
proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
617
proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
582
           locals
618
           locals
583
             h      dd ?
619
             h      dd ?
584
             _dx     dd ?
620
             _dx     dd ?
585
             _dy     dd ?
621
             _dy     dd ?
586
           endl
622
           endl
587
 
623
 
588
        mov     esi, [hcursor]
624
        mov     esi, [hcursor]
589
        mov     ecx, [x]
625
        mov     ecx, [x]
590
        mov     eax, [y]
626
        mov     eax, [y]
591
;        mov     ebx, [BytesPerScanLine]
627
;        mov     ebx, [BytesPerScanLine]
592
 
628
 
593
        xor     edx, edx
629
        xor     edx, edx
594
        sub     ecx, [esi+CURSOR.hot_x]
630
        sub     ecx, [esi+CURSOR.hot_x]
595
        lea     ebx, [ecx+32-1]
631
        lea     ebx, [ecx+32-1]
596
        mov     [x], ecx
632
        mov     [x], ecx
597
        sets    dl
633
        sets    dl
598
        dec     edx
634
        dec     edx
599
        and     ecx, edx      ;clip x to 0<=x
635
        and     ecx, edx      ;clip x to 0<=x
600
        mov     [cur.left], ecx
636
        mov     [cur.left], ecx
601
        mov     edi, ecx
637
        mov     edi, ecx
602
        sub     edi, [x]
638
        sub     edi, [x]
603
        mov     [_dx], edi
639
        mov     [_dx], edi
604
 
640
 
605
        xor     edx, edx
641
        xor     edx, edx
606
        sub     eax, [esi+CURSOR.hot_y]
642
        sub     eax, [esi+CURSOR.hot_y]
607
        lea     edi, [eax+32-1]
643
        lea     edi, [eax+32-1]
608
        mov     [y], eax
644
        mov     [y], eax
609
        sets    dl
645
        sets    dl
610
        dec     edx
646
        dec     edx
611
        and     eax, edx      ;clip y to 0<=y
647
        and     eax, edx      ;clip y to 0<=y
612
        mov     [cur.top], eax
648
        mov     [cur.top], eax
613
        mov     edx, eax
649
        mov     edx, eax
614
        sub     edx, [y]
650
        sub     edx, [y]
615
        mov     [_dy], edx
651
        mov     [_dy], edx
616
 
652
 
617
;        mul     dword [BytesPerScanLine]
653
;        mul     dword [BytesPerScanLine]
618
        mov     eax, [BPSLine_calc_area+eax*4]
654
        mov     eax, [BPSLine_calc_area+eax*4]
619
        lea     edx, [LFB_BASE+ecx*3]
655
        lea     edx, [LFB_BASE+ecx*3]
620
        add     edx, eax
656
        add     edx, eax
621
        mov     [cur_saved_base], edx
657
        mov     [cur_saved_base], edx
622
 
658
 
623
        cmp     ebx, [_display.width]
659
        cmp     ebx, [_display.width]
624
        jb      @F
660
        jb      @F
625
        mov     ebx, [_display.width]
661
        mov     ebx, [_display.width]
626
        dec     ebx
662
        dec     ebx
627
;--------------------------------------
663
;--------------------------------------
628
align 4
664
align 4
629
@@:
665
@@:
630
        cmp     edi, [_display.height]
666
        cmp     edi, [_display.height]
631
        jb      @F
667
        jb      @F
632
        mov     edi, [_display.height]
668
        mov     edi, [_display.height]
633
        dec     edi
669
        dec     edi
634
;--------------------------------------
670
;--------------------------------------
635
align 4
671
align 4
636
@@:
672
@@:
637
        mov     [cur.right], ebx
673
        mov     [cur.right], ebx
638
        mov     [cur.bottom], edi
674
        mov     [cur.bottom], edi
639
 
675
 
640
        sub     ebx, [x]
676
        sub     ebx, [x]
641
        sub     edi, [y]
677
        sub     edi, [y]
642
        inc     ebx
678
        inc     ebx
643
        inc     edi
679
        inc     edi
644
        sub     ebx, [_dx]
680
        sub     ebx, [_dx]
645
        sub     edi, [_dy]
681
        sub     edi, [_dy]
646
 
682
 
647
        mov     [cur.w], ebx
683
        mov     [cur.w], ebx
648
        mov     [cur.h], edi
684
        mov     [cur.h], edi
649
        mov     [h], edi
685
        mov     [h], edi
650
 
686
 
651
        mov     eax, edi
687
        mov     eax, edi
652
        mov     edi, cur_saved_data
688
        mov     edi, cur_saved_data
653
;--------------------------------------
689
;--------------------------------------
654
align 4
690
align 4
655
@@:
691
@@:
656
        mov     esi, edx
692
        mov     esi, edx
657
        add     edx, [_display.pitch]
693
        add     edx, [_display.pitch]
658
        mov     ecx, [cur.w]
694
        mov     ecx, [cur.w]
659
        lea     ecx, [ecx+ecx*2]
695
        lea     ecx, [ecx+ecx*2]
660
        rep movsb
696
        rep movsb
661
        dec     eax
697
        dec     eax
662
        jnz     @B
698
        jnz     @B
663
 
699
 
664
;draw cursor
700
;draw cursor
665
        mov     ebx, [cur_saved_base]
701
        mov     ebx, [cur_saved_base]
666
        mov     eax, [_dy]
702
        mov     eax, [_dy]
667
        shl     eax, 5
703
        shl     eax, 5
668
        add     eax, [_dx]
704
        add     eax, [_dx]
669
 
705
 
670
        mov     esi, [hcursor]
706
        mov     esi, [hcursor]
671
        mov     esi, [esi+CURSOR.base]
707
        mov     esi, [esi+CURSOR.base]
672
        lea     edx, [esi+eax*4]
708
        lea     edx, [esi+eax*4]
673
;--------------------------------------
709
;--------------------------------------
674
align 4
710
align 4
675
.row:
711
.row:
676
        mov     ecx, [cur.w]
712
        mov     ecx, [cur.w]
677
        mov     esi, edx
713
        mov     esi, edx
678
        mov     edi, ebx
714
        mov     edi, ebx
679
        add     edx, 32*4
715
        add     edx, 32*4
680
        add     ebx, [_display.pitch]
716
        add     ebx, [_display.pitch]
681
;--------------------------------------
717
;--------------------------------------
682
align 4
718
align 4
683
.pix:
719
.pix:
684
        lodsd
720
        lodsd
685
        test    eax, 0xFF000000
721
        test    eax, 0xFF000000
686
        jz      @F
722
        jz      @F
687
        mov     [edi], ax
723
        mov     [edi], ax
688
        shr     eax, 16
724
        shr     eax, 16
689
        mov     [edi+2], al
725
        mov     [edi+2], al
690
;--------------------------------------
726
;--------------------------------------
691
align 4
727
align 4
692
@@:
728
@@:
693
        add     edi, 3
729
        add     edi, 3
694
        dec     ecx
730
        dec     ecx
695
        jnz     .pix
731
        jnz     .pix
696
 
732
 
697
        dec     [h]
733
        dec     [h]
698
        jnz     .row
734
        jnz     .row
699
        ret
735
        ret
700
endp
736
endp
701
;------------------------------------------------------------------------------
737
;------------------------------------------------------------------------------
702
align 4
738
align 4
703
proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
739
proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
704
           locals
740
           locals
705
             h      dd ?
741
             h      dd ?
706
             _dx     dd ?
742
             _dx     dd ?
707
             _dy     dd ?
743
             _dy     dd ?
708
           endl
744
           endl
709
 
745
 
710
        mov     esi, [hcursor]
746
        mov     esi, [hcursor]
711
        mov     ecx, [x]
747
        mov     ecx, [x]
712
        mov     eax, [y]
748
        mov     eax, [y]
713
 
749
 
714
        xor     edx, edx
750
        xor     edx, edx
715
        sub     ecx, [esi+CURSOR.hot_x]
751
        sub     ecx, [esi+CURSOR.hot_x]
716
        lea     ebx, [ecx+32-1]
752
        lea     ebx, [ecx+32-1]
717
        mov     [x], ecx
753
        mov     [x], ecx
718
        sets    dl
754
        sets    dl
719
        dec     edx
755
        dec     edx
720
        and     ecx, edx      ;clip x to 0<=x
756
        and     ecx, edx      ;clip x to 0<=x
721
        mov     [cur.left], ecx
757
        mov     [cur.left], ecx
722
        mov     edi, ecx
758
        mov     edi, ecx
723
        sub     edi, [x]
759
        sub     edi, [x]
724
        mov     [_dx], edi
760
        mov     [_dx], edi
725
 
761
 
726
        xor     edx, edx
762
        xor     edx, edx
727
        sub     eax, [esi+CURSOR.hot_y]
763
        sub     eax, [esi+CURSOR.hot_y]
728
        lea     edi, [eax+32-1]
764
        lea     edi, [eax+32-1]
729
        mov     [y], eax
765
        mov     [y], eax
730
        sets    dl
766
        sets    dl
731
        dec     edx
767
        dec     edx
732
        and     eax, edx      ;clip y to 0<=y
768
        and     eax, edx      ;clip y to 0<=y
733
        mov     [cur.top], eax
769
        mov     [cur.top], eax
734
        mov     edx, eax
770
        mov     edx, eax
735
        sub     edx, [y]
771
        sub     edx, [y]
736
        mov     [_dy], edx
772
        mov     [_dy], edx
737
 
773
 
738
;        mul     dword [BytesPerScanLine]
774
;        mul     dword [BytesPerScanLine]
739
        mov     eax, [BPSLine_calc_area+eax*4]
775
        mov     eax, [BPSLine_calc_area+eax*4]
740
        lea     edx, [LFB_BASE+eax+ecx*4]
776
        lea     edx, [LFB_BASE+eax+ecx*4]
741
        mov     [cur_saved_base], edx
777
        mov     [cur_saved_base], edx
742
 
778
 
743
        cmp     ebx, [_display.width]
779
        cmp     ebx, [_display.width]
744
        jb      @F
780
        jb      @F
745
        mov     ebx, [_display.width]
781
        mov     ebx, [_display.width]
746
        dec     ebx
782
        dec     ebx
747
;--------------------------------------
783
;--------------------------------------
748
align 4
784
align 4
749
@@:
785
@@:
750
        cmp     edi, [_display.height]
786
        cmp     edi, [_display.height]
751
        jb      @F
787
        jb      @F
752
        mov     edi, [_display.height]
788
        mov     edi, [_display.height]
753
        dec     edi
789
        dec     edi
754
;--------------------------------------
790
;--------------------------------------
755
align 4
791
align 4
756
@@:
792
@@:
757
        mov     [cur.right], ebx
793
        mov     [cur.right], ebx
758
        mov     [cur.bottom], edi
794
        mov     [cur.bottom], edi
759
 
795
 
760
        sub     ebx, [x]
796
        sub     ebx, [x]
761
        sub     edi, [y]
797
        sub     edi, [y]
762
        inc     ebx
798
        inc     ebx
763
        inc     edi
799
        inc     edi
764
        sub     ebx, [_dx]
800
        sub     ebx, [_dx]
765
        sub     edi, [_dy]
801
        sub     edi, [_dy]
766
 
802
 
767
        mov     [cur.w], ebx
803
        mov     [cur.w], ebx
768
        mov     [cur.h], edi
804
        mov     [cur.h], edi
769
        mov     [h], edi
805
        mov     [h], edi
770
 
806
 
771
        mov     eax, edi
807
        mov     eax, edi
772
        mov     edi, cur_saved_data
808
        mov     edi, cur_saved_data
773
;--------------------------------------
809
;--------------------------------------
774
align 4
810
align 4
775
@@:
811
@@:
776
        mov     esi, edx
812
        mov     esi, edx
777
        add     edx, [_display.pitch]
813
        add     edx, [_display.pitch]
778
        mov     ecx, [cur.w]
814
        mov     ecx, [cur.w]
779
        rep movsd
815
        rep movsd
780
        dec     eax
816
        dec     eax
781
        jnz     @B
817
        jnz     @B
782
 
818
 
783
;draw cursor
819
;draw cursor
784
        mov     ebx, [cur_saved_base]
820
        mov     ebx, [cur_saved_base]
785
        mov     eax, [_dy]
821
        mov     eax, [_dy]
786
        shl     eax, 5
822
        shl     eax, 5
787
        add     eax, [_dx]
823
        add     eax, [_dx]
788
 
824
 
789
        mov     esi, [hcursor]
825
        mov     esi, [hcursor]
790
        mov     esi, [esi+CURSOR.base]
826
        mov     esi, [esi+CURSOR.base]
791
        lea     edx, [esi+eax*4]
827
        lea     edx, [esi+eax*4]
792
;--------------------------------------
828
;--------------------------------------
793
align 4
829
align 4
794
.row:
830
.row:
795
        mov     ecx, [cur.w]
831
        mov     ecx, [cur.w]
796
        mov     esi, edx
832
        mov     esi, edx
797
        mov     edi, ebx
833
        mov     edi, ebx
798
        add     edx, 32*4
834
        add     edx, 32*4
799
        add     ebx, [_display.pitch]
835
        add     ebx, [_display.pitch]
800
;--------------------------------------
836
;--------------------------------------
801
align 4
837
align 4
802
.pix:
838
.pix:
803
        lodsd
839
        lodsd
804
        test    eax, 0xFF000000
840
        test    eax, 0xFF000000
805
        jz      @F
841
        jz      @F
806
        mov     [edi], eax
842
        mov     [edi], eax
807
;--------------------------------------
843
;--------------------------------------
808
align 4
844
align 4
809
@@:
845
@@:
810
        add     edi, 4
846
        add     edi, 4
811
        dec     ecx
847
        dec     ecx
812
        jnz     .pix
848
        jnz     .pix
813
 
849
 
814
        dec     [h]
850
        dec     [h]
815
        jnz     .row
851
        jnz     .row
816
        ret
852
        ret
817
endp
853
endp
818
;------------------------------------------------------------------------------
854
;------------------------------------------------------------------------------
819
align 4
855
align 4
-
 
856
proc move_cursor_16 stdcall, hcursor:dword, x:dword, y:dword
-
 
857
           locals
-
 
858
             h      dd ?
-
 
859
             _dx     dd ?
-
 
860
             _dy     dd ?
-
 
861
           endl
-
 
862
 
-
 
863
        mov     esi, [hcursor]
-
 
864
        mov     ecx, [x]
-
 
865
        mov     eax, [y]
-
 
866
 
-
 
867
        xor     edx, edx
-
 
868
        sub     ecx, [esi+CURSOR.hot_x]
-
 
869
        lea     ebx, [ecx+32-1]
-
 
870
        mov     [x], ecx
-
 
871
        sets    dl
-
 
872
        dec     edx
-
 
873
        and     ecx, edx      ;clip x to 0<=x
-
 
874
        mov     [cur.left], ecx
-
 
875
        mov     edi, ecx
-
 
876
        sub     edi, [x]
-
 
877
        mov     [_dx], edi
-
 
878
 
-
 
879
        xor     edx, edx
-
 
880
        sub     eax, [esi+CURSOR.hot_y]
-
 
881
        lea     edi, [eax+32-1]
-
 
882
        mov     [y], eax
-
 
883
        sets    dl
-
 
884
        dec     edx
-
 
885
        and     eax, edx      ;clip y to 0<=y
-
 
886
        mov     [cur.top], eax
-
 
887
        mov     edx, eax
-
 
888
        sub     edx, [y]
-
 
889
        mov     [_dy], edx
-
 
890
 
-
 
891
;        mul     dword [BytesPerScanLine]
-
 
892
        mov     eax, [BPSLine_calc_area+eax*4]
-
 
893
        lea     edx, [LFB_BASE+eax+ecx*2]
-
 
894
        mov     [cur_saved_base], edx
-
 
895
 
-
 
896
        cmp     ebx, [Screen_Max_X]
-
 
897
        jbe     @F
-
 
898
        mov     ebx, [Screen_Max_X]
-
 
899
;--------------------------------------
-
 
900
align 4
-
 
901
@@:
-
 
902
        cmp     edi, [Screen_Max_Y]
-
 
903
        jbe     @F
-
 
904
        mov     edi, [Screen_Max_Y]
-
 
905
;--------------------------------------
-
 
906
align 4
-
 
907
@@:
-
 
908
        mov     [cur.right], ebx
-
 
909
        mov     [cur.bottom], edi
-
 
910
 
-
 
911
        sub     ebx, [x]
-
 
912
        sub     edi, [y]
-
 
913
        inc     ebx
-
 
914
        inc     edi
-
 
915
        sub     ebx, [_dx]
-
 
916
        sub     edi, [_dy]
-
 
917
 
-
 
918
        mov     [cur.w], ebx
-
 
919
        mov     [cur.h], edi
-
 
920
        mov     [h], edi
-
 
921
 
-
 
922
        mov     eax, edi
-
 
923
        mov     edi, cur_saved_data
-
 
924
;--------------------------------------
-
 
925
align 4
-
 
926
@@:
-
 
927
        mov     esi, edx
-
 
928
        add     edx, [_display.pitch]
-
 
929
        mov     ecx, [cur.w]
-
 
930
 
-
 
931
        rep movsw
-
 
932
        dec     eax
-
 
933
        jnz     @B
-
 
934
 
-
 
935
;draw cursor
-
 
936
        mov     ebx, [cur_saved_base]
-
 
937
        mov     eax, [_dy]
-
 
938
        shl     eax, 5
-
 
939
        add     eax, [_dx]
-
 
940
 
-
 
941
        mov     esi, [hcursor]
-
 
942
        mov     esi, [esi+CURSOR.base]
-
 
943
        lea     edx, [esi+eax*4]
-
 
944
;--------------------------------------
-
 
945
align 4
-
 
946
.row:
-
 
947
        mov     ecx, [cur.w]
-
 
948
        mov     esi, edx
-
 
949
        mov     edi, ebx
-
 
950
        add     edx, 32*4
-
 
951
        add     ebx, [_display.pitch]
-
 
952
;--------------------------------------
-
 
953
align 4
-
 
954
.pix:
-
 
955
        lodsd
-
 
956
        test    eax, 0xFF000000
-
 
957
        jz      @F
-
 
958
; convert to 16 bpp and store to real LFB
-
 
959
        and     eax, 00000000111110001111110011111000b
-
 
960
        shr     ah, 2
-
 
961
        shr     ax, 3
-
 
962
        ror     eax, 8
-
 
963
        add     al, ah
-
 
964
        rol     eax, 8
-
 
965
        mov     [edi], ax
-
 
966
;--------------------------------------
-
 
967
align 4
-
 
968
@@:
-
 
969
        add     edi, 2
-
 
970
        dec     ecx
-
 
971
        jnz     .pix
-
 
972
 
-
 
973
        dec     [h]
-
 
974
        jnz     .row
-
 
975
        ret
-
 
976
endp
-
 
977
;------------------------------------------------------------------------------
-
 
978
align 4
820
check_mouse_area_for_getpixel_new:
979
check_mouse_area_for_getpixel_new:
821
; in:
980
; in:
822
; eax = x
981
; eax = x
823
; ebx = y
982
; ebx = y
824
; out:
983
; out:
825
; ecx = new color
984
; ecx = new color
826
;--------------------------------------
985
;--------------------------------------
827
; check for Y
986
; check for Y
828
        cmp     bx, [Y_UNDER_subtraction_CUR_hot_y]
987
        cmp     bx, [Y_UNDER_subtraction_CUR_hot_y]
829
        jb      .no_mouse_area
988
        jb      .no_mouse_area
830
 
989
 
831
        cmp     bx, [Y_UNDER_sub_CUR_hot_y_add_curh]
990
        cmp     bx, [Y_UNDER_sub_CUR_hot_y_add_curh]
832
        jae     .no_mouse_area
991
        jae     .no_mouse_area
833
;--------------------------------------
992
;--------------------------------------
834
; check for X
993
; check for X
835
        cmp     ax, [X_UNDER_subtraction_CUR_hot_x]
994
        cmp     ax, [X_UNDER_subtraction_CUR_hot_x]
836
        jb      .no_mouse_area
995
        jb      .no_mouse_area
837
 
996
 
838
        cmp     ax, [X_UNDER_sub_CUR_hot_x_add_curh]
997
        cmp     ax, [X_UNDER_sub_CUR_hot_x_add_curh]
839
        jae     .no_mouse_area
998
        jae     .no_mouse_area
840
;--------------------------------------
999
;--------------------------------------
841
        push    eax ebx
1000
        push    eax ebx
842
; offset X
1001
; offset X
843
        movzx   ecx, word [X_UNDER_subtraction_CUR_hot_x]
1002
        movzx   ecx, word [X_UNDER_subtraction_CUR_hot_x]
844
        sub     eax, ecx        ; x1
1003
        sub     eax, ecx        ; x1
845
; offset Y
1004
; offset Y
846
        movzx   ecx, word [Y_UNDER_subtraction_CUR_hot_y]
1005
        movzx   ecx, word [Y_UNDER_subtraction_CUR_hot_y]
847
        sub     ebx, ecx        ; y1
1006
        sub     ebx, ecx        ; y1
848
;--------------------------------------
1007
;--------------------------------------
849
; ebx = offset y
1008
; ebx = offset y
850
; eax = offset x
1009
; eax = offset x
851
        imul    ebx, [cur.w]     ;y
1010
        imul    ebx, [cur.w]     ;y
852
        add     eax, ebx
1011
        add     eax, ebx
853
        mov     ebx, eax
1012
        mov     ebx, eax
854
        shl     eax, 2
1013
        shl     eax, 2
855
        cmp     byte [_display.bpp], 32
1014
        cmp     byte [_display.bits_per_pixel], 32
-
 
1015
        je      @f
-
 
1016
        sub     eax, ebx
-
 
1017
        cmp     byte [_display.bits_per_pixel], 24
856
        je      @f
1018
        je      @f
857
        sub     eax, ebx
1019
        sub     eax, ebx
858
;--------------------------------------
1020
;--------------------------------------
859
align 4
1021
align 4
860
@@:
1022
@@:
861
        add     eax, cur_saved_data
1023
        add     eax, cur_saved_data
862
        mov     ecx, [eax]
1024
        mov     ecx, [eax]
863
        and     ecx, 0xffffff
1025
        and     ecx, 0xffffff
864
        add     ecx, 0xff000000
1026
        add     ecx, 0xff000000
865
        pop     ebx eax
1027
        pop     ebx eax
866
        ret
1028
        ret
867
;--------------------------------------
1029
;--------------------------------------
868
align 4
1030
align 4
869
.no_mouse_area:
1031
.no_mouse_area:
870
        xor     ecx, ecx
1032
        xor     ecx, ecx
871
        ret
1033
        ret
872
;-----------------------------------------------------------------------------
1034
;-----------------------------------------------------------------------------
873
align 4
1035
align 4
874
check_mouse_area_for_putpixel_new:
1036
check_mouse_area_for_putpixel_new:
875
; in:
1037
; in:
876
; ecx = x shl 16 + y
1038
; ecx = x shl 16 + y
877
; eax = color
1039
; eax = color
878
; out:
1040
; out:
879
; eax = new color
1041
; eax = new color
880
;--------------------------------------
1042
;--------------------------------------
881
; check for Y
1043
; check for Y
882
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
1044
        cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
883
        jae     .no_mouse_area
1045
        jae     .no_mouse_area
884
 
1046
 
885
        sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
1047
        sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
886
        jb      .no_mouse_area
1048
        jb      .no_mouse_area
887
 
1049
 
888
        rol     ecx, 16
1050
        rol     ecx, 16
889
;--------------------------------------
1051
;--------------------------------------
890
; check for X
1052
; check for X
891
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
1053
        cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
892
        jae     .no_mouse_area
1054
        jae     .no_mouse_area
893
 
1055
 
894
        sub     cx, [X_UNDER_subtraction_CUR_hot_x]
1056
        sub     cx, [X_UNDER_subtraction_CUR_hot_x]
895
        jb      .no_mouse_area
1057
        jb      .no_mouse_area
896
 
1058
 
897
        ror     ecx, 16
1059
        ror     ecx, 16
898
;--------------------------------------
1060
;--------------------------------------
899
align 4
1061
align 4
900
.1:
1062
.1:
901
        push    eax
1063
        push    eax
902
;--------------------------------------
1064
;--------------------------------------
903
; ecx = (offset x) shl 16 + (offset y)
1065
; ecx = (offset x) shl 16 + (offset y)
904
        push    ebx
1066
        push    ebx
905
        mov     ebx, ecx
1067
        mov     ebx, ecx
906
        shr     ebx, 16        ; x
1068
        shr     ebx, 16        ; x
907
        and     ecx, 0xffff    ; y
1069
        and     ecx, 0xffff    ; y
908
 
1070
 
909
        cmp     ecx, [cur.h]
1071
        cmp     ecx, [cur.h]
910
        jae     @f
1072
        jae     @f
911
 
1073
 
912
        cmp     ebx, [cur.w]
1074
        cmp     ebx, [cur.w]
913
        jb      .ok
1075
        jb      .ok
914
;--------------------------------------
1076
;--------------------------------------
915
align 4
1077
align 4
916
@@:
1078
@@:
917
;        DEBUGF  1, "K : SHIT HAPPENS: %x %x \n", ecx,ebx
1079
;        DEBUGF  1, "K : SHIT HAPPENS: %x %x \n", ecx,ebx
918
        pop     ebx
1080
        pop     ebx
919
        jmp     .sh   ; SORRY! SHIT HAPPENS!
1081
        jmp     .sh   ; SORRY! SHIT HAPPENS!
920
;--------------------------------------
1082
;--------------------------------------
921
align 4
1083
align 4
922
.ok:
1084
.ok:
923
; ecx = offset y
1085
; ecx = offset y
924
; ebx = offset x
1086
; ebx = offset x
925
        push    ebx ecx
1087
        push    ebx ecx
926
        imul    ecx, [cur.w]    ;y
1088
        imul    ecx, [cur.w]    ;y
927
        add     ecx, ebx
1089
        add     ecx, ebx
928
        mov     ebx, ecx
1090
        mov     ebx, ecx
929
        shl     ecx, 2
1091
        shl     ecx, 2
-
 
1092
        cmp     byte [_display.bits_per_pixel], 16
-
 
1093
        je      .16
930
        cmp     byte [_display.bpp], 24
1094
        cmp     byte [_display.bits_per_pixel], 24
931
        je      .24
1095
        je      .24
932
        and     eax, 0xFFFFFF
1096
        and     eax, 0xFFFFFF
933
        mov     [ecx + cur_saved_data], eax   ;store new color  to
1097
        mov     [ecx + cur_saved_data], eax   ;store new color  to
934
        jmp     @f
1098
        jmp     @f
935
;--------------------------------------
1099
;--------------------------------------
936
align 4
1100
align 4
-
 
1101
.16:
-
 
1102
        sub     ecx, ebx
-
 
1103
        sub     ecx, ebx
-
 
1104
; convert to 16 bpp and store to real LFB
-
 
1105
        and     eax, 00000000111110001111110011111000b
-
 
1106
        shr     ah, 2
-
 
1107
        shr     ax, 3
-
 
1108
        ror     eax, 8
-
 
1109
        add     al, ah
-
 
1110
        rol     eax, 8
-
 
1111
        mov     [ecx + cur_saved_data], ax      ;store new color  to
-
 
1112
        jmp     @f
-
 
1113
;--------------------------------------
-
 
1114
align 4
937
.24:
1115
.24:
938
        sub     ecx, ebx
1116
        sub     ecx, ebx
939
        mov     [ecx + cur_saved_data], ax      ;store new color  to
1117
        mov     [ecx + cur_saved_data], ax      ;store new color  to
940
        shr     eax, 16
1118
        shr     eax, 16
941
        mov     [ecx + cur_saved_data + 2], al  ;store new color  to
1119
        mov     [ecx + cur_saved_data + 2], al  ;store new color  to
942
;--------------------------------------
1120
;--------------------------------------
943
align 4
1121
align 4
944
@@:
1122
@@:
945
        pop     ecx ebx
1123
        pop     ecx ebx
946
 
1124
 
947
        shl     ecx, 5
1125
        shl     ecx, 5
948
        add     ecx, ebx
1126
        add     ecx, ebx
949
 
1127
 
950
        mov     eax, [current_cursor]
1128
        mov     eax, [current_cursor]
951
        mov     eax, [eax+CURSOR.base]
1129
        mov     eax, [eax+CURSOR.base]
952
        lea     eax, [eax+ecx*4]
1130
        lea     eax, [eax+ecx*4]
953
        mov     eax, [eax]
1131
        mov     eax, [eax]
954
 
1132
 
955
        pop     ebx
1133
        pop     ebx
956
 
1134
 
957
        test    eax, 0xFF000000
1135
        test    eax, 0xFF000000
958
        jz      @f
1136
        jz      @f
959
 
1137
 
960
        add     esp, 4
1138
        add     esp, 4
961
        ret
1139
        ret
962
;--------------------------------------
1140
;--------------------------------------
963
align 4
1141
align 4
964
.sh:
1142
.sh:
965
        mov     ecx, -1
1143
        mov     ecx, -1
966
;--------------------------------------
1144
;--------------------------------------
967
align 4
1145
align 4
968
@@:
1146
@@:
969
        pop     eax
1147
        pop     eax
970
;--------------------------------------
1148
;--------------------------------------
971
align 4
1149
align 4
972
.no_mouse_area:
1150
.no_mouse_area:
973
        ret
1151
        ret
974
;------------------------------------------------------------------------------
1152
;------------------------------------------------------------------------------
975
align 4
1153
align 4
976
get_display:
1154
get_display:
977
        mov     eax, _display
1155
        mov     eax, _display
978
        ret
1156
        ret
979
;------------------------------------------------------------------------------
1157
;------------------------------------------------------------------------------
980
align 4
1158
align 4
981
init_display:
1159
init_display:
982
        xor     eax, eax
1160
        xor     eax, eax
983
        mov     edi, _display
1161
        mov     edi, _display
984
 
1162
 
985
        mov     [edi+display_t.init_cursor], eax
1163
        mov     [edi+display_t.init_cursor], eax
986
        mov     [edi+display_t.select_cursor], eax
1164
        mov     [edi+display_t.select_cursor], eax
987
        mov     [edi+display_t.show_cursor], eax
1165
        mov     [edi+display_t.show_cursor], eax
988
        mov     [edi+display_t.move_cursor], eax
1166
        mov     [edi+display_t.move_cursor], eax
989
        mov     [edi+display_t.restore_cursor], eax
1167
        mov     [edi+display_t.restore_cursor], eax
990
 
1168
 
991
        lea     ecx, [edi+display_t.cr_list.next]
1169
        lea     ecx, [edi+display_t.cr_list.next]
992
        mov     [edi+display_t.cr_list.next], ecx
1170
        mov     [edi+display_t.cr_list.next], ecx
993
        mov     [edi+display_t.cr_list.prev], ecx
1171
        mov     [edi+display_t.cr_list.prev], ecx
994
 
1172
 
995
        cmp     [SCR_MODE], word 0x13
1173
        cmp     [SCR_MODE], word 0x13
996
        jbe     .fail
1174
        jbe     .fail
997
 
1175
 
998
        test    word [SCR_MODE], 0x4000
1176
        test    word [SCR_MODE], 0x4000
999
        jz      .fail
1177
        jz      .fail
1000
 
1178
 
1001
        mov     ebx, restore_32
1179
        mov     ebx, restore_32
1002
        mov     ecx, move_cursor_32
1180
        mov     ecx, move_cursor_32
1003
        mov     edx, Vesa20_putpixel32_new
1181
        mov     edx, Vesa20_putpixel32_new
1004
        mov     eax, [_display.bpp]
1182
        mov     eax, [_display.bits_per_pixel]
1005
        cmp     al, 32
1183
        cmp     al, 32
1006
        jne     .24
1184
        jne     .not_32bpp
1007
 
1185
 
1008
.set:
1186
.set:
1009
        mov     [_display.select_cursor], select_cursor
1187
        mov     [_display.select_cursor], select_cursor
1010
        mov     [_display.move_cursor], ecx
1188
        mov     [_display.move_cursor], ecx
1011
        mov     [_display.restore_cursor], ebx
1189
        mov     [_display.restore_cursor], ebx
1012
        mov     [_display.check_mouse], check_mouse_area_for_putpixel_new
1190
        mov     [_display.check_mouse], check_mouse_area_for_putpixel_new
1013
        mov     [_display.check_m_pixel], check_mouse_area_for_getpixel_new
1191
        mov     [_display.check_m_pixel], check_mouse_area_for_getpixel_new
1014
 
1192
 
1015
        cmp     [PUTPIXEL], dword VGA_putpixel
1193
        cmp     [PUTPIXEL], dword VGA_putpixel
1016
        je      @f
1194
        je      @f
1017
        mov     [PUTPIXEL], edx
1195
        mov     [PUTPIXEL], edx
1018
@@:
1196
@@:
1019
        stdcall load_cursor, clock_arrow, dword LOAD_FROM_MEM
1197
        stdcall load_cursor, clock_arrow, dword LOAD_FROM_MEM
1020
        mov     [def_cursor_clock], eax
1198
        mov     [def_cursor_clock], eax
1021
        stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
1199
        stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
1022
        mov     [def_cursor], eax
1200
        mov     [def_cursor], eax
1023
        ret
1201
        ret
1024
 
1202
 
-
 
1203
.not_32bpp:
-
 
1204
        cmp     al, 24
-
 
1205
        jne     .not_24bpp
1025
.24:
1206
 
1026
        mov     ebx, restore_24
1207
        mov     ebx, restore_24
1027
        mov     ecx, move_cursor_24
1208
        mov     ecx, move_cursor_24
1028
        mov     edx, Vesa20_putpixel24_new
1209
        mov     edx, Vesa20_putpixel24_new
-
 
1210
        jmp     .set
-
 
1211
 
-
 
1212
.not_24bpp:
1029
        cmp     al, 24
1213
        cmp     al, 16
-
 
1214
        jne     .not_16bpp
-
 
1215
        mov     ebx, restore_16
-
 
1216
        mov     ecx, move_cursor_16
-
 
1217
        mov     edx, Vesa20_putpixel16_new
1030
        je      .set
1218
        jmp     .set
-
 
1219
 
-
 
1220
.not_16bpp:
-
 
1221
;        cmp     al, 15
-
 
1222
;        jne     .fail
-
 
1223
;        mov     ebx, restore_15
-
 
1224
;        mov     ecx, move_cursor_15
-
 
1225
;        mov     edx, Vesa20_putpixel15_new
-
 
1226
;        jmp     .set
1031
 
1227
 
1032
.fail:
1228
.fail:
1033
        xor     eax, eax
1229
        xor     eax, eax
1034
        mov     [_display.select_cursor], eax
1230
        mov     [_display.select_cursor], eax
1035
        mov     [_display.move_cursor], eax
1231
        mov     [_display.move_cursor], eax
1036
        ret
1232
        ret
1037
;------------------------------------------------------------------------------
1233
;------------------------------------------------------------------------------
1038
align 4
1234
align 4
1039
def_arrow:
1235
def_arrow:
1040
  file 'arrow.cur'
1236
  file 'arrow.cur'
1041
;------------------------------------------------------------------------------
1237
;------------------------------------------------------------------------------
1042
align 4
1238
align 4
1043
clock_arrow:
1239
clock_arrow:
1044
  file 'arrow_clock.cur'
1240
  file 'arrow_clock.cur'
1045
;------------------------------------------------------------------------------
1241
;------------------------------------------------------------------------------
1046
>
1242
>
1047
>
1243
>
1048
>
1244
>
1049
>
1245
>
-
 
1246
>
-
 
1247
>