Subversion Repositories Kolibri OS

Rev

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

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