Subversion Repositories Kolibri OS

Rev

Rev 2465 | Rev 3232 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 2987 $
  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.  
  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
  29. ;------------------------------------------------------------------------------
  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.  
  46.         cmp     [esi+BITMAPINFOHEADER.BitCount], 24
  47.         je      .img_24
  48.         cmp     [esi+BITMAPINFOHEADER.BitCount], 8
  49.         je      .img_8
  50.         cmp     [esi+BITMAPINFOHEADER.BitCount], 4
  51.         je      .img_4
  52. ;--------------------------------------
  53. align 4
  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]
  72. ;--------------------------------------
  73. align 4
  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
  82. ;--------------------------------------
  83. align 4
  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
  111. ;--------------------------------------
  112. align 4
  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]
  132. ;--------------------------------------
  133. align 4
  134. .l4:
  135.         mov     eax, [pAnd]
  136.         mov     eax, [eax]
  137.         bswap   eax
  138.         mov     [counter], 16
  139. ;--------------------------------------
  140. align 4
  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
  181. ;--------------------------------------
  182. align 4
  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]
  202. ;--------------------------------------
  203. align 4
  204. .l81:
  205.         mov     eax, [pAnd]
  206.         mov     eax, [eax]
  207.         bswap   eax
  208.         mov     [counter], 32
  209. ;--------------------------------------
  210. align 4
  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
  236. ;--------------------------------------
  237. align 4
  238. .img_24:
  239.         add     eax, [esi]
  240.         mov     [pQuad], eax
  241.         add     eax, 0xC00
  242.         mov     [pAnd], eax
  243.         mov     eax, [esi+BITMAPINFOHEADER.Width]
  244.         mov     [width], eax
  245.         mov     ebx, [esi+BITMAPINFOHEADER.Height]
  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]
  255. ;--------------------------------------
  256. align 4
  257. .row_24:
  258.         mov     eax, [esi]
  259.         bswap   eax
  260.         mov     [counter], 32
  261. ;--------------------------------------
  262. align 4
  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
  288. ;------------------------------------------------------------------------------
  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
  299. ;--------------------------------------
  300. align 4
  301. .fail:
  302.         mov     eax, [def_cursor]
  303.         mov     ebx, [current_slot]
  304.         xchg    eax, [ebx+APPDATA.cursor]
  305.         ret
  306. endp
  307. ;------------------------------------------------------------------------------
  308. align 4
  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
  324.         mov     eax, sizeof.CURSOR
  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.  
  356. align 4
  357. .add_cursor:
  358.         mov     ecx, [.hcursor]
  359.         lea     ecx, [ecx+CURSOR.list_next]
  360.         lea     edx, [_display.cr_list.next]
  361.  
  362.         pushfd
  363.         cli
  364.         list_add ecx, edx   ;list_add_tail(new, head)
  365.         popfd
  366.  
  367.         mov     eax, [.hcursor]
  368.         cmp     [_display.init_cursor], 0
  369.         je      .fail
  370.  
  371.         push    eax
  372.         call    [_display.init_cursor]
  373.         add     esp, 4
  374.  
  375.         mov     eax, [.hcursor]
  376. ;--------------------------------------
  377. align 4
  378. .fail:
  379.         add     esp, 12
  380.         ret
  381. ;--------------------------------------
  382. align 4
  383. .indirect:
  384.         shr     ebx, 16
  385.         movzx   ecx, bh
  386.         movzx   edx, bl
  387.         mov     [edi+CURSOR.hot_x], ecx
  388.         mov     [edi+CURSOR.hot_y], edx
  389.  
  390.         xchg    edi, eax
  391.         mov     ecx, 1024
  392.         cld
  393.         rep movsd
  394.         jmp     .add_cursor
  395. ;------------------------------------------------------------------------------
  396. align 4
  397. proc load_cursor stdcall, src:dword, flags:dword
  398.            locals
  399.              handle  dd ?
  400.            endl
  401.  
  402.         xor     eax, eax
  403.         cmp     [create_cursor], eax
  404.         je      .fail2
  405.  
  406.         mov     [handle], eax
  407.         cmp     word [flags], LOAD_FROM_FILE
  408.         jne     @F
  409.  
  410.         stdcall load_file, [src]
  411.         test    eax, eax
  412.         jz      .fail
  413.         mov     [src], eax
  414. ;--------------------------------------
  415. align 4
  416. @@:
  417.         push    ebx
  418.         push    esi
  419.         push    edi
  420.  
  421.         mov     eax, [CURRENT_TASK]
  422.         shl     eax, 5
  423.         mov     eax, [CURRENT_TASK+eax+4]
  424.         mov     ebx, [src]
  425.         mov     ecx, [flags]
  426.         call    create_cursor    ;eax, ebx, ecx
  427.         mov     [handle], eax
  428.  
  429.         cmp     word [flags], LOAD_FROM_FILE
  430.         jne     .exit
  431.         stdcall kernel_free, [src]
  432. ;--------------------------------------
  433. align 4
  434. .exit:
  435.         pop     edi
  436.         pop     esi
  437.         pop     ebx
  438. ;--------------------------------------
  439. align 4
  440. .fail:
  441.         mov     eax, [handle]
  442. ;--------------------------------------
  443. align 4
  444. .fail2:
  445.         ret
  446. endp
  447. ;------------------------------------------------------------------------------
  448. align 4
  449. proc delete_cursor stdcall, hcursor:dword
  450.            locals
  451.              hsrv       dd ?
  452.              io_code    dd ?
  453.              input      dd ?
  454.              inp_size   dd ?
  455.              output     dd ?
  456.              out_size   dd ?
  457.            endl
  458.  
  459.         mov     esi, [hcursor]
  460.         cmp     [esi+CURSOR.magic], 'CURS'
  461.         jne     .fail
  462.  
  463.         mov     ebx, [CURRENT_TASK]
  464.         shl     ebx, 5
  465.         mov     ebx, [CURRENT_TASK+ebx+4]
  466.         cmp     ebx, [esi+CURSOR.pid]
  467.         jne     .fail
  468.  
  469.         mov     ebx, [current_slot]
  470.         cmp     esi, [ebx+APPDATA.cursor]
  471.         jne     @F
  472.         mov     eax, [def_cursor]
  473.         mov     [ebx+APPDATA.cursor], eax
  474. ;--------------------------------------
  475. align 4
  476. @@:
  477.         mov     eax, [hcursor]
  478.         call    [eax+APPOBJ.destroy]
  479. ;--------------------------------------
  480. align 4
  481. .fail:
  482.         ret
  483. endp
  484. ;------------------------------------------------------------------------------
  485. align 4
  486. ; param
  487. ;  eax= cursor
  488. destroy_cursor:
  489.  
  490.         push    eax
  491.         stdcall kernel_free, [eax+CURSOR.base]
  492.  
  493.         mov     eax, [esp]
  494.         lea     eax, [eax+CURSOR.list_next]
  495.  
  496.         pushfd
  497.         cli
  498.         list_del eax
  499.         popfd
  500.  
  501.         pop     eax
  502.         call    destroy_kernel_object
  503.         ret
  504. ;------------------------------------------------------------------------------
  505. align 4
  506. select_cursor:
  507.         mov     eax, [esp+4]
  508.         mov     [_display.cursor], eax
  509.         ret     4
  510. ;------------------------------------------------------------------------------
  511. align 4
  512. proc restore_24 stdcall, x:dword, y:dword
  513.  
  514.         push    ebx
  515.  
  516.         mov     ebx, [cur_saved_base]
  517.         mov     edx, [cur.h]
  518.         test    edx, edx
  519.         jz      .ret
  520.  
  521.         push    esi
  522.         push    edi
  523.  
  524.         mov     esi, cur_saved_data
  525.         mov     ecx, [cur.w]
  526.         lea     ecx, [ecx+ecx*2]
  527.         push    ecx
  528. ;--------------------------------------
  529. align 4
  530. @@:
  531.         mov     edi, ebx
  532.         add     ebx, [BytesPerScanLine]
  533.  
  534.         mov     ecx, [esp]
  535.         rep movsb
  536.         dec     edx
  537.         jnz     @B
  538.  
  539.         pop     ecx
  540.         pop     edi
  541.         pop     esi
  542. ;--------------------------------------
  543. align 4
  544. .ret:
  545.         pop     ebx
  546.         ret
  547. endp
  548. ;------------------------------------------------------------------------------
  549. align 4
  550. proc restore_32 stdcall, x:dword, y:dword
  551.  
  552.         push    ebx
  553.  
  554.         mov     ebx, [cur_saved_base]
  555.         mov     edx, [cur.h]
  556.         test    edx, edx
  557.         jz      .ret
  558.  
  559.         push    esi
  560.         push    edi
  561.  
  562.         mov     esi, cur_saved_data
  563. ;--------------------------------------
  564. align 4
  565. @@:
  566.         mov     edi, ebx
  567.         add     ebx, [BytesPerScanLine]
  568.  
  569.         mov     ecx, [cur.w]
  570.         rep movsd
  571.         dec     edx
  572.         jnz     @B
  573.  
  574.         pop     edi
  575. ;--------------------------------------
  576. align 4
  577. .ret:
  578.         pop     esi
  579.         pop     ebx
  580.         ret
  581. endp
  582. ;------------------------------------------------------------------------------
  583. align 4
  584. proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
  585.            locals
  586.              h      dd ?
  587.              _dx     dd ?
  588.              _dy     dd ?
  589.            endl
  590.  
  591.         mov     esi, [hcursor]
  592.         mov     ecx, [x]
  593.         mov     eax, [y]
  594. ;        mov     ebx, [BytesPerScanLine]
  595.  
  596.         xor     edx, edx
  597.         sub     ecx, [esi+CURSOR.hot_x]
  598.         lea     ebx, [ecx+32-1]
  599.         mov     [x], ecx
  600.         sets    dl
  601.         dec     edx
  602.         and     ecx, edx      ;clip x to 0<=x
  603.         mov     [cur.left], ecx
  604.         mov     edi, ecx
  605.         sub     edi, [x]
  606.         mov     [_dx], edi
  607.  
  608.         xor     edx, edx
  609.         sub     eax, [esi+CURSOR.hot_y]
  610.         lea     edi, [eax+32-1]
  611.         mov     [y], eax
  612.         sets    dl
  613.         dec     edx
  614.         and     eax, edx      ;clip y to 0<=y
  615.         mov     [cur.top], eax
  616.         mov     edx, eax
  617.         sub     edx, [y]
  618.         mov     [_dy], edx
  619.  
  620. ;        mul     dword [BytesPerScanLine]
  621.         mov     eax, [BPSLine_calc_area+eax*4]
  622.         lea     edx, [LFB_BASE+ecx*3]
  623.         add     edx, eax
  624.         mov     [cur_saved_base], edx
  625.  
  626.         cmp     ebx, [Screen_Max_X]
  627.         jbe     @F
  628.         mov     ebx, [Screen_Max_X]
  629. ;--------------------------------------
  630. align 4
  631. @@:
  632.         cmp     edi, [Screen_Max_Y]
  633.         jbe     @F
  634.         mov     edi, [Screen_Max_Y]
  635. ;--------------------------------------
  636. align 4
  637. @@:
  638.         mov     [cur.right], ebx
  639.         mov     [cur.bottom], edi
  640.  
  641.         sub     ebx, [x]
  642.         sub     edi, [y]
  643.         inc     ebx
  644.         inc     edi
  645.         sub     ebx, [_dx]
  646.         sub     edi, [_dy]
  647.  
  648.         mov     [cur.w], ebx
  649.         mov     [cur.h], edi
  650.         mov     [h], edi
  651.  
  652.         mov     eax, edi
  653.         mov     edi, cur_saved_data
  654. ;--------------------------------------
  655. align 4
  656. @@:
  657.         mov     esi, edx
  658.         add     edx, [BytesPerScanLine]
  659.         mov     ecx, [cur.w]
  660.         lea     ecx, [ecx+ecx*2]
  661.         rep movsb
  662.         dec     eax
  663.         jnz     @B
  664.  
  665. ;draw cursor
  666.         mov     ebx, [cur_saved_base]
  667.         mov     eax, [_dy]
  668.         shl     eax, 5
  669.         add     eax, [_dx]
  670.  
  671.         mov     esi, [hcursor]
  672.         mov     esi, [esi+CURSOR.base]
  673.         lea     edx, [esi+eax*4]
  674. ;--------------------------------------
  675. align 4
  676. .row:
  677.         mov     ecx, [cur.w]
  678.         mov     esi, edx
  679.         mov     edi, ebx
  680.         add     edx, 32*4
  681.         add     ebx, [BytesPerScanLine]
  682. ;--------------------------------------
  683. align 4
  684. .pix:
  685.         lodsd
  686.         test    eax, 0xFF000000
  687.         jz      @F
  688.         mov     [edi], ax
  689.         shr     eax, 16
  690.         mov     [edi+2], al
  691. ;--------------------------------------
  692. align 4
  693. @@:
  694.         add     edi, 3
  695.         dec     ecx
  696.         jnz     .pix
  697.  
  698.         dec     [h]
  699.         jnz     .row
  700.         ret
  701. endp
  702. ;------------------------------------------------------------------------------
  703. align 4
  704. proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
  705.            locals
  706.              h      dd ?
  707.              _dx     dd ?
  708.              _dy     dd ?
  709.            endl
  710.  
  711.         mov     esi, [hcursor]
  712.         mov     ecx, [x]
  713.         mov     eax, [y]
  714.  
  715.         xor     edx, edx
  716.         sub     ecx, [esi+CURSOR.hot_x]
  717.         lea     ebx, [ecx+32-1]
  718.         mov     [x], ecx
  719.         sets    dl
  720.         dec     edx
  721.         and     ecx, edx      ;clip x to 0<=x
  722.         mov     [cur.left], ecx
  723.         mov     edi, ecx
  724.         sub     edi, [x]
  725.         mov     [_dx], edi
  726.  
  727.         xor     edx, edx
  728.         sub     eax, [esi+CURSOR.hot_y]
  729.         lea     edi, [eax+32-1]
  730.         mov     [y], eax
  731.         sets    dl
  732.         dec     edx
  733.         and     eax, edx      ;clip y to 0<=y
  734.         mov     [cur.top], eax
  735.         mov     edx, eax
  736.         sub     edx, [y]
  737.         mov     [_dy], edx
  738.  
  739. ;        mul     dword [BytesPerScanLine]
  740.         mov     eax, [BPSLine_calc_area+eax*4]
  741.         lea     edx, [LFB_BASE+eax+ecx*4]
  742.         mov     [cur_saved_base], edx
  743.  
  744.         cmp     ebx, [Screen_Max_X]
  745.         jbe     @F
  746.         mov     ebx, [Screen_Max_X]
  747. ;--------------------------------------
  748. align 4
  749. @@:
  750.         cmp     edi, [Screen_Max_Y]
  751.         jbe     @F
  752.         mov     edi, [Screen_Max_Y]
  753. ;--------------------------------------
  754. align 4
  755. @@:
  756.         mov     [cur.right], ebx
  757.         mov     [cur.bottom], edi
  758.  
  759.         sub     ebx, [x]
  760.         sub     edi, [y]
  761.         inc     ebx
  762.         inc     edi
  763.         sub     ebx, [_dx]
  764.         sub     edi, [_dy]
  765.  
  766.         mov     [cur.w], ebx
  767.         mov     [cur.h], edi
  768.         mov     [h], edi
  769.  
  770.         mov     eax, edi
  771.         mov     edi, cur_saved_data
  772. ;--------------------------------------
  773. align 4
  774. @@:
  775.         mov     esi, edx
  776.         add     edx, [BytesPerScanLine]
  777.         mov     ecx, [cur.w]
  778.         rep movsd
  779.         dec     eax
  780.         jnz     @B
  781.  
  782. ;draw cursor
  783.         mov     ebx, [cur_saved_base]
  784.         mov     eax, [_dy]
  785.         shl     eax, 5
  786.         add     eax, [_dx]
  787.  
  788.         mov     esi, [hcursor]
  789.         mov     esi, [esi+CURSOR.base]
  790.         lea     edx, [esi+eax*4]
  791. ;--------------------------------------
  792. align 4
  793. .row:
  794.         mov     ecx, [cur.w]
  795.         mov     esi, edx
  796.         mov     edi, ebx
  797.         add     edx, 32*4
  798.         add     ebx, [BytesPerScanLine]
  799. ;--------------------------------------
  800. align 4
  801. .pix:
  802.         lodsd
  803.         test    eax, 0xFF000000
  804.         jz      @F
  805.         mov     [edi], eax
  806. ;--------------------------------------
  807. align 4
  808. @@:
  809.         add     edi, 4
  810.         dec     ecx
  811.         jnz     .pix
  812.  
  813.         dec     [h]
  814.         jnz     .row
  815.         ret
  816. endp
  817. ;------------------------------------------------------------------------------
  818. align 4
  819. check_mouse_area_for_getpixel_new:
  820. ; in:
  821. ; eax = x
  822. ; ebx = y
  823. ; out:
  824. ; ecx = new color
  825. ;--------------------------------------
  826. ; check for Y
  827.         cmp     bx, [Y_UNDER_subtraction_CUR_hot_y]
  828.         jb      .no_mouse_area
  829.  
  830.         cmp     bx, [Y_UNDER_sub_CUR_hot_y_add_curh]
  831.         jae     .no_mouse_area
  832. ;--------------------------------------
  833. ; check for X
  834.         cmp     ax, [X_UNDER_subtraction_CUR_hot_x]
  835.         jb      .no_mouse_area
  836.  
  837.         cmp     ax, [X_UNDER_sub_CUR_hot_x_add_curh]
  838.         jae     .no_mouse_area
  839. ;--------------------------------------
  840.         push    eax ebx
  841. ; offset X
  842.         movzx   ecx, word [X_UNDER_subtraction_CUR_hot_x]
  843.         sub     eax, ecx        ; x1
  844. ; offset Y
  845.         movzx   ecx, word [Y_UNDER_subtraction_CUR_hot_y]
  846.         sub     ebx, ecx        ; y1
  847. ;--------------------------------------
  848. ; ebx = offset y
  849. ; eax = offset x
  850.         imul    ebx, [cur.w]     ;y
  851.         add     eax, ebx
  852.         mov     ebx, eax
  853.         shl     eax, 2
  854.         cmp     [ScreenBPP], byte 32
  855.         je      @f
  856.         sub     eax, ebx
  857. ;--------------------------------------
  858. align 4
  859. @@:
  860.         add     eax, cur_saved_data
  861.         mov     ecx, [eax]
  862.         and     ecx, 0xffffff
  863.         add     ecx, 0xff000000
  864.         pop     ebx eax
  865.         ret
  866. ;--------------------------------------
  867. align 4
  868. .no_mouse_area:
  869.         xor     ecx, ecx
  870.         ret
  871. ;-----------------------------------------------------------------------------
  872. align 4
  873. check_mouse_area_for_putpixel_new:
  874. ; in:
  875. ; ecx = x shl 16 + y
  876. ; eax = color
  877. ; out:
  878. ; eax = new color
  879. ;--------------------------------------
  880. ; check for Y
  881.         cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
  882.         jae     .no_mouse_area
  883.  
  884.         sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
  885.         jb      .no_mouse_area
  886.  
  887.         rol     ecx, 16
  888. ;--------------------------------------
  889. ; check for X
  890.         cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
  891.         jae     .no_mouse_area
  892.  
  893.         sub     cx, [X_UNDER_subtraction_CUR_hot_x]
  894.         jb      .no_mouse_area
  895.  
  896.         ror     ecx, 16
  897. ;--------------------------------------
  898. align 4
  899. .1:
  900.         push    eax
  901. ;--------------------------------------
  902. ; ecx = (offset x) shl 16 + (offset y)
  903.         push    ebx
  904.         mov     ebx, ecx
  905.         shr     ebx, 16        ; x
  906.         and     ecx, 0xffff    ; y
  907.  
  908.         cmp     ecx, [cur.h]
  909.         jae     @f
  910.  
  911.         cmp     ebx, [cur.w]
  912.         jb      .ok
  913. ;--------------------------------------
  914. align 4
  915. @@:
  916. ;        DEBUGF  1, "K : SHIT HAPPENS: %x %x \n", ecx,ebx
  917.         pop     ebx
  918.         jmp     .sh   ; SORRY! SHIT HAPPENS!
  919. ;--------------------------------------
  920. align 4
  921. .ok:
  922. ; ecx = offset y
  923. ; ebx = offset x
  924.         push    ebx ecx
  925.         imul    ecx, [cur.w]    ;y
  926.         add     ecx, ebx
  927.         mov     ebx, ecx
  928.         shl     ecx, 2
  929.         cmp     [ScreenBPP], byte 24
  930.         je      .24
  931.         and     eax, 0xFFFFFF
  932.         mov     [ecx + cur_saved_data], eax   ;store new color  to
  933.         jmp     @f
  934. ;--------------------------------------
  935. align 4
  936. .24:
  937.         sub     ecx, ebx
  938.         mov     [ecx + cur_saved_data], ax      ;store new color  to
  939.         shr     eax, 16
  940.         mov     [ecx + cur_saved_data + 2], al  ;store new color  to
  941. ;--------------------------------------
  942. align 4
  943. @@:
  944.         pop     ecx ebx
  945.  
  946.         shl     ecx, 5
  947.         add     ecx, ebx
  948.  
  949.         mov     eax, [current_cursor]
  950.         mov     eax, [eax+CURSOR.base]
  951.         lea     eax, [eax+ecx*4]
  952.         mov     eax, [eax]
  953.  
  954.         pop     ebx
  955.  
  956.         test    eax, 0xFF000000
  957.         jz      @f
  958.  
  959.         add     esp, 4
  960.         ret
  961. ;--------------------------------------
  962. align 4
  963. .sh:
  964.         mov     ecx, -1
  965. ;--------------------------------------
  966. align 4
  967. @@:
  968.         pop     eax
  969. ;--------------------------------------
  970. align 4
  971. .no_mouse_area:
  972.         ret
  973. ;------------------------------------------------------------------------------
  974. align 4
  975. get_display:
  976.         mov     eax, _display
  977.         ret
  978. ;------------------------------------------------------------------------------
  979. align 4
  980. init_display:
  981.         xor     eax, eax
  982.         mov     edi, _display
  983.  
  984.         mov     [edi+display_t.init_cursor], eax
  985.         mov     [edi+display_t.select_cursor], eax
  986.         mov     [edi+display_t.show_cursor], eax
  987.         mov     [edi+display_t.move_cursor], eax
  988.         mov     [edi+display_t.restore_cursor], eax
  989.  
  990.         lea     ecx, [edi+display_t.cr_list.next]
  991.         mov     [edi+display_t.cr_list.next], ecx
  992.         mov     [edi+display_t.cr_list.prev], ecx
  993.  
  994.         cmp     [SCR_MODE], word 0x13
  995.         jbe     .fail
  996.  
  997.         test    word [SCR_MODE], 0x4000
  998.         jz      .fail
  999. ;        jmp      .fail
  1000.  
  1001.         mov     ebx, restore_32
  1002.         mov     ecx, move_cursor_32
  1003.         movzx   eax, byte [ScreenBPP]
  1004.         cmp     eax, 32
  1005.         je      @F
  1006.  
  1007.         mov     ebx, restore_24
  1008.         mov     ecx, move_cursor_24
  1009.         cmp     eax, 24
  1010.         jne     .fail
  1011. ;--------------------------------------
  1012. align 4
  1013. @@:
  1014.         mov     [_display.select_cursor], select_cursor
  1015.         mov     [_display.move_cursor], ecx
  1016.         mov     [_display.restore_cursor], ebx
  1017.         mov     [_display.check_mouse], check_mouse_area_for_putpixel_new
  1018.         mov     [_display.check_m_pixel], check_mouse_area_for_getpixel_new
  1019.  
  1020.         cmp     [PUTPIXEL], dword VGA_putpixel
  1021.         je      @f
  1022.         cmp     [ScreenBPP], byte 32
  1023.         je      .32
  1024.         mov     [PUTPIXEL], dword Vesa20_putpixel24_new
  1025.         jmp     @f
  1026. ;--------------------------------------
  1027. align 4
  1028. .32:
  1029.         mov     [PUTPIXEL], dword Vesa20_putpixel32_new
  1030. ;--------------------------------------
  1031. align 4
  1032. @@:
  1033.         stdcall load_cursor, clock_arrow, dword LOAD_FROM_MEM
  1034.         mov     [def_cursor_clock], eax
  1035.         stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
  1036.         mov     [def_cursor], eax
  1037.         ret
  1038. ;--------------------------------------
  1039. align 4
  1040. .fail:
  1041.         xor     eax, eax
  1042.         mov     [_display.select_cursor], eax
  1043.         mov     [_display.move_cursor], eax
  1044.         ret
  1045. ;------------------------------------------------------------------------------
  1046. align 4
  1047. def_arrow:
  1048.   file 'arrow.cur'
  1049. ;------------------------------------------------------------------------------
  1050. align 4
  1051. clock_arrow:
  1052.   file 'arrow_clock.cur'
  1053. ;------------------------------------------------------------------------------
  1054.  
  1055.