Subversion Repositories Kolibri OS

Rev

Rev 3626 | Rev 4423 | 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. ;;  VESA20.INC                                                  ;;
  7. ;;                                                              ;;
  8. ;;  Vesa 2.0 functions for MenuetOS                             ;;
  9. ;;                                                              ;;
  10. ;;  Copyright 2002 Ville Turjanmaa                              ;;
  11. ;;  Alexey, kgaz@crosswindws.net                                ;;
  12. ;;  - Voodoo compatible graphics                                ;;
  13. ;;  Juan M. Caravaca                                            ;;
  14. ;;  - Graphics optimimizations eg. drawline                     ;;
  15. ;;                                                              ;;
  16. ;;  See file COPYING for details                                ;;
  17. ;;                                                              ;;
  18. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  19.  
  20. $Revision: 4288 $
  21.  
  22.  
  23. ; If you're planning to write your own video driver I suggest
  24. ; you replace the VESA12.INC file and see those instructions.
  25.  
  26.  
  27. ;-----------------------------------------------------------------------------
  28. ; getpixel
  29. ;
  30. ; in:
  31. ; eax = x coordinate
  32. ; ebx = y coordinate
  33. ;
  34. ; ret:
  35. ; ecx = 00 RR GG BB
  36. ;-----------------------------------------------------------------------------
  37. align 4
  38. getpixel:
  39.         push    eax ebx edx edi
  40.         call    dword [GETPIXEL]
  41.         pop     edi edx ebx eax
  42.         ret
  43. ;-----------------------------------------------------------------------------
  44. align 4
  45. Vesa20_getpixel24:
  46. ; eax = x
  47. ; ebx = y
  48. ;--------------------------------------
  49. ; check for hardware cursor
  50.         cmp     [_display.select_cursor], select_cursor
  51.         je      @f
  52.         cmp     [_display.select_cursor], 0
  53.         jne     .no_mouseunder
  54. ;--------------------------------------
  55. align 4
  56. @@:
  57. ; check mouse area for putpixel
  58.         test    ecx, 0x04000000  ; don't load to mouseunder area
  59.         jnz     .no_mouseunder
  60.         call    [_display.check_m_pixel]
  61.         test    ecx, ecx        ;0xff000000
  62.         jnz     @f
  63. ;--------------------------------------
  64. align 4
  65. .no_mouseunder:
  66. ;--------------------------------------
  67. ;        imul    ebx, [BytesPerScanLine] ; ebx = y * y multiplier
  68.         mov     ebx, [BPSLine_calc_area+ebx*4]
  69.         lea     edi, [eax+eax*2]; edi = x*3
  70.         add     edi, ebx      ; edi = x*3+(y*y multiplier)
  71.         mov     ecx, [LFB_BASE+edi]
  72. ;--------------------------------------
  73. align 4
  74. @@:
  75.         and     ecx, 0xffffff
  76.         ret
  77. ;-----------------------------------------------------------------------------
  78. align 4
  79. Vesa20_getpixel32:
  80. ;--------------------------------------
  81. ; check for hardware cursor
  82.         cmp     [_display.select_cursor], select_cursor
  83.         je      @f
  84.         cmp     [_display.select_cursor], 0
  85.         jne     .no_mouseunder
  86. ;--------------------------------------
  87. align 4
  88. @@:
  89. ; check mouse area for putpixel
  90.         test    ecx, 0x04000000  ; don't load to mouseunder area
  91.         jnz     .no_mouseunder
  92.         call    [_display.check_m_pixel]
  93.         test    ecx, ecx        ;0xff000000
  94.         jnz     @f
  95. ;--------------------------------------
  96. align 4
  97. .no_mouseunder:
  98. ;--------------------------------------
  99. ;        imul    ebx, [BytesPerScanLine] ; ebx = y * y multiplier
  100.         mov     ebx, [BPSLine_calc_area+ebx*4]
  101.         lea     edi, [ebx+eax*4]; edi = x*4+(y*y multiplier)
  102.         mov     ecx, [LFB_BASE+edi]
  103. ;--------------------------------------
  104. align 4
  105. @@:
  106.         and     ecx, 0xffffff
  107.         ret
  108. ;-----------------------------------------------------------------------------
  109. virtual at esp
  110.  putimg:
  111.    .real_sx        dd ?
  112.    .real_sy        dd ?
  113.    .image_sx       dd ?
  114.    .image_sy       dd ?
  115.    .image_cx       dd ?
  116.    .image_cy       dd ?
  117.    .pti            dd ?
  118.    .abs_cx         dd ?
  119.    .abs_cy         dd ?
  120.    .line_increment dd ?
  121.    .winmap_newline dd ?
  122.    .screen_newline dd ?
  123.    .real_sx_and_abs_cx dd ?
  124.    .real_sy_and_abs_cy dd ?
  125.    .stack_data = 4*14
  126.    .edi         dd      ?
  127.    .esi         dd      ?
  128.    .ebp         dd      ?
  129.    .esp         dd      ?
  130.    .ebx         dd      ?
  131.    .edx         dd      ?
  132.    .ecx         dd      ?
  133.    .eax         dd      ?
  134.    .ret_addr    dd      ?
  135.    .arg_0       dd      ?
  136. end virtual
  137. ;-----------------------------------------------------------------------------
  138. align 16
  139. ; ebx = pointer
  140. ; ecx = size [x|y]
  141. ; edx = coordinates [x|y]
  142. ; ebp = pointer to 'get' function
  143. ; esi = pointer to 'init' function
  144. ; edi = parameter for 'get' function
  145. vesa20_putimage:
  146.         pushad
  147.         sub     esp, putimg.stack_data
  148. ; save pointer to image
  149.         mov     [putimg.pti], ebx
  150. ; unpack the size
  151.         mov     eax, ecx
  152.         and     ecx, 0xFFFF
  153.         shr     eax, 16
  154.         mov     [putimg.image_sx], eax
  155.         mov     [putimg.image_sy], ecx
  156. ; unpack the coordinates
  157.         mov     eax, edx
  158.         and     edx, 0xFFFF
  159.         shr     eax, 16
  160.         mov     [putimg.image_cx], eax
  161.         mov     [putimg.image_cy], edx
  162. ; calculate absolute (i.e. screen) coordinates
  163.         mov     eax, [TASK_BASE]
  164.         mov     ebx, [eax-twdw + WDATA.box.left]
  165.         add     ebx, [putimg.image_cx]
  166.         mov     [putimg.abs_cx], ebx
  167.         mov     ebx, [eax-twdw + WDATA.box.top]
  168.         add     ebx, [putimg.image_cy]
  169.         mov     [putimg.abs_cy], ebx
  170. ; real_sx = MIN(wnd_sx-image_cx, image_sx);
  171.         mov     ebx, [eax-twdw + WDATA.box.width]; ebx = wnd_sx
  172. ; \begin{diamond}[20.08.2006]
  173. ; note that WDATA.box.width is one pixel less than real window x-size
  174.         inc     ebx
  175. ; \end{diamond}[20.08.2006]
  176.         sub     ebx, [putimg.image_cx]
  177.         ja      @f
  178.         add     esp, putimg.stack_data
  179.         popad
  180.         ret
  181. ;--------------------------------------
  182. align 4
  183. @@:
  184.         cmp     ebx, [putimg.image_sx]
  185.         jbe     .end_x
  186.         mov     ebx, [putimg.image_sx]
  187. ;--------------------------------------
  188. align 4
  189. .end_x:
  190.         mov     [putimg.real_sx], ebx
  191. ; init real_sy
  192.         mov     ebx, [eax-twdw + WDATA.box.height]; ebx = wnd_sy
  193. ; \begin{diamond}[20.08.2006]
  194.         inc     ebx
  195. ; \end{diamond}[20.08.2006]
  196.         sub     ebx, [putimg.image_cy]
  197.         ja      @f
  198.         add     esp, putimg.stack_data
  199.         popad
  200.         ret
  201. ;--------------------------------------
  202. align 4
  203. @@:
  204.         cmp     ebx, [putimg.image_sy]
  205.         jbe     .end_y
  206.         mov     ebx, [putimg.image_sy]
  207. ;--------------------------------------
  208. align 4
  209. .end_y:
  210.         mov     [putimg.real_sy], ebx
  211. ; line increment
  212.         mov     eax, [putimg.image_sx]
  213.         mov     ecx, [putimg.real_sx]
  214.         sub     eax, ecx
  215. ;;     imul    eax, [putimg.source_bpp]
  216. ;     lea     eax, [eax + eax * 2]
  217.         call    esi
  218.         add     eax, [putimg.arg_0]
  219.         mov     [putimg.line_increment], eax
  220. ; winmap new line increment
  221.         mov     eax, [_display.width]
  222.         sub     eax, [putimg.real_sx]
  223.         mov     [putimg.winmap_newline], eax
  224. ; screen new line increment
  225.         mov     eax, [_display.pitch]
  226.         mov     ebx, [_display.bpp]
  227.         shr     ebx, 3
  228.         imul    ecx, ebx
  229.         sub     eax, ecx
  230.         mov     [putimg.screen_newline], eax
  231. ; pointer to image
  232.         mov     esi, [putimg.pti]
  233. ; pointer to screen
  234.         mov     edx, [putimg.abs_cy]
  235. ;        imul    edx, [BytesPerScanLine]
  236.         mov     edx, [BPSLine_calc_area+edx*4]
  237.         mov     eax, [putimg.abs_cx]
  238. ;        movzx   ebx, byte [ScreenBPP]
  239. ;        shr     ebx, 3
  240.         imul    eax, ebx
  241.         add     edx, eax
  242. ; pointer to pixel map
  243.         mov     eax, [putimg.abs_cy]
  244.         mov     eax, [d_width_calc_area + eax*4]
  245.  
  246.         add     eax, [putimg.abs_cx]
  247.         add     eax, [_WinMapAddress]
  248.         xchg    eax, ebp
  249. ;--------------------------------------
  250.         mov     ecx, [putimg.real_sx]
  251.         add     ecx, [putimg.abs_cx]
  252.         mov     [putimg.real_sx_and_abs_cx], ecx
  253.         mov     ecx, [putimg.real_sy]
  254.         add     ecx, [putimg.abs_cy]
  255.         mov     [putimg.real_sy_and_abs_cy], ecx
  256. ;--------------------------------------
  257. ; get process number
  258.         mov     ebx, [CURRENT_TASK]
  259.         cmp     byte [_display.bpp], 32
  260.         je      put_image_end_32
  261. ;--------------------------------------
  262. put_image_end_24:
  263.         mov     edi, [putimg.real_sy]
  264. ;--------------------------------------
  265. ; check for hardware cursor
  266.         mov     ecx, [_display.select_cursor]
  267.         cmp     ecx, select_cursor
  268.         je      put_image_end_24_new
  269.         cmp     ecx, 0
  270.         je      put_image_end_24_old
  271. ;--------------------------------------
  272. align 4
  273. .new_line:
  274.         mov     ecx, [putimg.real_sx]
  275. ;--------------------------------------
  276. align 4
  277. .new_x:
  278.         push    [putimg.edi]
  279.         mov     eax, [putimg.ebp+4]
  280.         call    eax
  281.         cmp     [ebp], bl
  282.         jne     .skip
  283. ;--------------------------------------
  284. ; store to real LFB
  285.         mov     [LFB_BASE+edx], ax
  286.         shr     eax, 16
  287.         mov     [LFB_BASE+edx+2], al
  288. ;--------------------------------------
  289. align 4
  290. .skip:
  291.         add     edx, 3
  292.         inc     ebp
  293.         dec     ecx
  294.         jnz     .new_x
  295.  
  296.         add     esi, [putimg.line_increment]
  297.         add     edx, [putimg.screen_newline];[BytesPerScanLine]
  298.         add     ebp, [putimg.winmap_newline];[Screen_Max_X]
  299.  
  300.         cmp     [putimg.ebp], putimage_get1bpp
  301.         jz      .correct
  302.         cmp     [putimg.ebp], putimage_get2bpp
  303.         jz      .correct
  304.         cmp     [putimg.ebp], putimage_get4bpp
  305.         jnz     @f
  306. ;--------------------------------------
  307. align 4
  308. .correct:
  309.         mov     eax, [putimg.edi]
  310.         mov     byte [eax], 80h
  311. ;--------------------------------------
  312. align 4
  313. @@:
  314.         dec     edi
  315.         jnz     .new_line
  316. ;--------------------------------------
  317. align 4
  318. .finish:
  319.         add     esp, putimg.stack_data
  320.         popad
  321.         ret
  322. ;------------------------------------------------------------------------------
  323. align 4
  324. put_image_end_24_old:
  325. ;--------------------------------------
  326. align 4
  327. .new_line:
  328.         mov     ecx, [putimg.real_sx]
  329. ;--------------------------------------
  330. align 4
  331. .new_x:
  332.         push    [putimg.edi]
  333.         mov     eax, [putimg.ebp+4]
  334.         call    eax
  335.         cmp     [ebp], bl
  336.         jne     .skip
  337. ;--------------------------------------
  338.         push    ecx
  339.  
  340.         neg     ecx
  341.         add     ecx, [putimg.real_sx_and_abs_cx + 4]
  342.         shl     ecx, 16
  343.         add     ecx, [putimg.real_sy_and_abs_cy + 4]
  344.         sub     ecx, edi
  345.  
  346. ; check mouse area for putpixel
  347.         call    check_mouse_area_for_putpixel
  348.         pop     ecx
  349. ; store to real LFB
  350.         mov     [LFB_BASE+edx], ax
  351.         shr     eax, 16
  352.         mov     [LFB_BASE+edx+2], al
  353. ;--------------------------------------
  354. align 4
  355. .skip:
  356.         add     edx, 3
  357.         inc     ebp
  358.         dec     ecx
  359.         jnz     .new_x
  360.  
  361.         add     esi, [putimg.line_increment]
  362.         add     edx, [putimg.screen_newline];[BytesPerScanLine]
  363.         add     ebp, [putimg.winmap_newline];[Screen_Max_X]
  364.  
  365.         cmp     [putimg.ebp], putimage_get1bpp
  366.         jz      .correct
  367.         cmp     [putimg.ebp], putimage_get2bpp
  368.         jz      .correct
  369.         cmp     [putimg.ebp], putimage_get4bpp
  370.         jnz     @f
  371. ;--------------------------------------
  372. align 4
  373. .correct:
  374.         mov     eax, [putimg.edi]
  375.         mov     byte [eax], 80h
  376. ;--------------------------------------
  377. align 4
  378. @@:
  379.         dec     edi
  380.         jnz     .new_line
  381.         jmp     put_image_end_24.finish
  382. ;------------------------------------------------------------------------------
  383. align 4
  384. put_image_end_24_new:
  385. ;--------------------------------------
  386. align 4
  387. .new_line:
  388.         mov     ecx, [putimg.real_sx]
  389. ;--------------------------------------
  390. align 4
  391. .new_x:
  392.         push    [putimg.edi]
  393.         mov     eax, [putimg.ebp+4]
  394.         call    eax
  395.         cmp     [ebp], bl
  396.         jne     .skip
  397. ;--------------------------------------
  398.         push    ecx
  399. ;--------------------------------------
  400. align 4
  401. .sh:
  402.         neg     ecx
  403.         add     ecx, [putimg.real_sx_and_abs_cx + 4]
  404. ;--------------------------------------
  405. ; check for X
  406.         cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
  407.         jae     .no_mouse_area
  408.  
  409.         sub     cx, [X_UNDER_subtraction_CUR_hot_x]
  410.         jb      .no_mouse_area
  411.  
  412.         shl     ecx, 16
  413.  
  414.         add     ecx, [putimg.real_sy_and_abs_cy + 4]
  415.         sub     ecx, edi
  416. ;--------------------------------------
  417. ; check for Y
  418.         cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
  419.         jae     .no_mouse_area
  420.  
  421.         sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
  422.         jb      .no_mouse_area
  423. ;--------------------------------------
  424. ; check mouse area for putpixel
  425.         call    check_mouse_area_for_putpixel_new.1
  426.         cmp     ecx, -1   ;SHIT HAPPENS?
  427.         jne     .no_mouse_area
  428.  
  429.         mov     ecx, [esp]
  430.         jmp     .sh
  431. ;--------------------------------------
  432. align 4
  433. .no_mouse_area:
  434.         pop     ecx
  435. ; store to real LFB
  436.         mov     [LFB_BASE+edx], ax
  437.         shr     eax, 16
  438.         mov     [LFB_BASE+edx+2], al
  439. ;--------------------------------------
  440. align 4
  441. .skip:
  442.         add     edx, 3
  443.         inc     ebp
  444.         dec     ecx
  445.         jnz     .new_x
  446.  
  447.         add     esi, [putimg.line_increment]
  448.         add     edx, [putimg.screen_newline];[BytesPerScanLine]
  449.         add     ebp, [putimg.winmap_newline];[Screen_Max_X]
  450.  
  451.         cmp     [putimg.ebp], putimage_get1bpp
  452.         jz      .correct
  453.         cmp     [putimg.ebp], putimage_get2bpp
  454.         jz      .correct
  455.         cmp     [putimg.ebp], putimage_get4bpp
  456.         jnz     @f
  457. ;--------------------------------------
  458. align 4
  459. .correct:
  460.         mov     eax, [putimg.edi]
  461.         mov     byte [eax], 80h
  462. ;--------------------------------------
  463. align 4
  464. @@:
  465.         dec     edi
  466.         jnz     .new_line
  467.         jmp     put_image_end_24.finish
  468. ;------------------------------------------------------------------------------
  469. align 4
  470. put_image_end_32:
  471.         mov     edi, [putimg.real_sy]
  472. ;--------------------------------------
  473. ; check for hardware cursor
  474.         mov     ecx, [_display.select_cursor]
  475.         cmp     ecx, select_cursor
  476.         je      put_image_end_32_new
  477.         cmp     ecx, 0
  478.         je      put_image_end_32_old
  479. ;--------------------------------------
  480. align 4
  481. .new_line:
  482.         mov     ecx, [putimg.real_sx]
  483. ;--------------------------------------
  484. align 4
  485. .new_x:
  486.         push    [putimg.edi]
  487.         mov     eax, [putimg.ebp+4]
  488.         call    eax
  489.         cmp     [ebp], bl
  490.         jne     .skip
  491. ;--------------------------------------
  492. ; store to real LFB
  493.         mov     [LFB_BASE+edx], eax
  494. ;--------------------------------------
  495. align 4
  496. .skip:
  497.         add     edx, 4
  498.         inc     ebp
  499.         dec     ecx
  500.         jnz     .new_x
  501.  
  502.         add     esi, [putimg.line_increment]
  503.         add     edx, [putimg.screen_newline];[BytesPerScanLine]
  504.         add     ebp, [putimg.winmap_newline];[Screen_Max_X]
  505.  
  506.         cmp     [putimg.ebp], putimage_get1bpp
  507.         jz      .correct
  508.         cmp     [putimg.ebp], putimage_get2bpp
  509.         jz      .correct
  510.         cmp     [putimg.ebp], putimage_get4bpp
  511.         jnz     @f
  512. ;--------------------------------------
  513. align 4
  514. .correct:
  515.         mov     eax, [putimg.edi]
  516.         mov     byte [eax], 80h
  517. ;--------------------------------------
  518. align 4
  519. @@:
  520.         dec     edi
  521.         jnz     .new_line
  522. ;--------------------------------------
  523. align 4
  524. .finish:
  525.         add     esp, putimg.stack_data
  526.         popad
  527.         cmp     [SCR_MODE], 0x12
  528.         jne     @f
  529.         call    VGA__putimage
  530. ;--------------------------------------
  531. align 4
  532. @@:
  533.         mov     [EGA_counter], 1
  534.         ret
  535. ;------------------------------------------------------------------------------
  536. align 4
  537. put_image_end_32_old:
  538. ;--------------------------------------
  539. align 4
  540. .new_line:
  541.         mov     ecx, [putimg.real_sx]
  542. ;--------------------------------------
  543. align 4
  544. .new_x:
  545.         push    [putimg.edi]
  546.         mov     eax, [putimg.ebp+4]
  547.         call    eax
  548.         cmp     [ebp], bl
  549.         jne     .skip
  550. ;--------------------------------------
  551.         push    ecx
  552.  
  553.         neg     ecx
  554.         add     ecx, [putimg.real_sx_and_abs_cx + 4]
  555.         shl     ecx, 16
  556.         add     ecx, [putimg.real_sy_and_abs_cy + 4]
  557.         sub     ecx, edi
  558.  
  559. ; check mouse area for putpixel
  560.         call    check_mouse_area_for_putpixel
  561.         pop     ecx
  562. ; store to real LFB
  563.         mov     [LFB_BASE+edx], eax
  564. ;--------------------------------------
  565. align 4
  566. .skip:
  567.         add     edx, 4
  568.         inc     ebp
  569.         dec     ecx
  570.         jnz     .new_x
  571.  
  572.         add     esi, [putimg.line_increment]
  573.         add     edx, [putimg.screen_newline];[BytesPerScanLine]
  574.         add     ebp, [putimg.winmap_newline];[Screen_Max_X]
  575.  
  576.         cmp     [putimg.ebp], putimage_get1bpp
  577.         jz      .correct
  578.         cmp     [putimg.ebp], putimage_get2bpp
  579.         jz      .correct
  580.         cmp     [putimg.ebp], putimage_get4bpp
  581.         jnz     @f
  582. ;--------------------------------------
  583. align 4
  584. .correct:
  585.         mov     eax, [putimg.edi]
  586.         mov     byte [eax], 80h
  587. ;--------------------------------------
  588. align 4
  589. @@:
  590.         dec     edi
  591.         jnz     .new_line
  592.         jmp     put_image_end_32.finish
  593. ;------------------------------------------------------------------------------
  594. align 4
  595. put_image_end_32_new:
  596. ;--------------------------------------
  597. align 4
  598. .new_line:
  599.         mov     ecx, [putimg.real_sx]
  600. ;--------------------------------------
  601. align 4
  602. .new_x:
  603.         push    [putimg.edi]
  604.         mov     eax, [putimg.ebp+4]
  605.         call    eax
  606.         cmp     [ebp], bl
  607.         jne     .skip
  608. ;--------------------------------------
  609.         push    ecx
  610. ;--------------------------------------
  611. align 4
  612. .sh:
  613.         neg     ecx
  614.         add     ecx, [putimg.real_sx_and_abs_cx + 4]
  615. ;--------------------------------------
  616. ; check for X
  617.         cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
  618.         jae     .no_mouse_area
  619.  
  620.         sub     cx, [X_UNDER_subtraction_CUR_hot_x]
  621.         jb      .no_mouse_area
  622.  
  623.         shl     ecx, 16
  624.  
  625.         add     ecx, [putimg.real_sy_and_abs_cy + 4]
  626.         sub     ecx, edi
  627. ;--------------------------------------
  628. ; check for Y
  629.         cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
  630.         jae     .no_mouse_area
  631.  
  632.         sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
  633.         jb      .no_mouse_area
  634. ;--------------------------------------
  635. ; check mouse area for putpixel
  636.         call    check_mouse_area_for_putpixel_new.1
  637.         cmp     ecx, -1   ;SHIT HAPPENS?
  638.         jne     .no_mouse_area
  639.  
  640.         mov     ecx, [esp]
  641.         jmp     .sh
  642. ;--------------------------------------
  643. align 4
  644. .no_mouse_area:
  645.         pop     ecx
  646. ; store to real LFB
  647.         mov     [LFB_BASE+edx], eax
  648. ;--------------------------------------
  649. align 4
  650. .skip:
  651.         add     edx, 4
  652.         inc     ebp
  653.         dec     ecx
  654.         jnz     .new_x
  655.  
  656.         add     esi, [putimg.line_increment]
  657.         add     edx, [putimg.screen_newline];[BytesPerScanLine]
  658.         add     ebp, [putimg.winmap_newline];[Screen_Max_X]
  659.  
  660.         cmp     [putimg.ebp], putimage_get1bpp
  661.         jz      .correct
  662.         cmp     [putimg.ebp], putimage_get2bpp
  663.         jz      .correct
  664.         cmp     [putimg.ebp], putimage_get4bpp
  665.         jnz     @f
  666. ;--------------------------------------
  667. align 4
  668. .correct:
  669.         mov     eax, [putimg.edi]
  670.         mov     byte [eax], 80h
  671. ;--------------------------------------
  672. align 4
  673. @@:
  674.         dec     edi
  675.         jnz     .new_line
  676.         jmp     put_image_end_32.finish
  677. ;------------------------------------------------------------------------------
  678. align 4
  679. __sys_putpixel:
  680.  
  681. ; eax = x coordinate
  682. ; ebx = y coordinate
  683. ; ecx = ?? RR GG BB    ; 0x01000000 negation
  684.                        ; 0x02000000 used for draw_rectangle without top line
  685.                        ;            for example drawwindow_III and drawwindow_IV
  686. ; edi = 0x00000001 force
  687.  
  688.         pushad
  689.         cmp     eax, [_display.width]
  690.         jae     .exit
  691.         cmp     ebx, [_display.height]
  692.         jae     .exit
  693.         test    edi, 1           ; force ?
  694.         jnz     .forced
  695.  
  696. ; not forced:
  697.         mov     edx, [d_width_calc_area + ebx*4]
  698.         add     edx, [_WinMapAddress]
  699.         movzx   edx, byte [eax+edx]
  700.         cmp     edx, [CURRENT_TASK]
  701.         jne     .exit
  702. ;--------------------------------------
  703. align 4
  704. .forced:
  705. ; check if negation
  706.         test    ecx, 0x01000000
  707.         jz      .noneg
  708.  
  709.         call    getpixel
  710.         not     ecx
  711.  
  712.         rol     ecx, 8
  713.         mov     cl, [esp+32-8+3]
  714.         ror     ecx, 8
  715.         mov     [esp+32-8], ecx
  716. ;--------------------------------------
  717. align 4
  718. .noneg:
  719. ; OK to set pixel
  720.         call    dword [PUTPIXEL]; call the real put_pixel function
  721. ;--------------------------------------
  722. align 4
  723. .exit:
  724.         popad
  725.         ret
  726. ;-----------------------------------------------------------------------------
  727. align 4
  728. Vesa20_putpixel24:
  729. ; eax = x
  730. ; ebx = y
  731.         mov     ecx, eax
  732.         shl     ecx, 16
  733.         mov     cx, bx
  734.  
  735. ;        imul    ebx, [BytesPerScanLine]  ; ebx = y * y multiplier
  736.         mov     ebx, [BPSLine_calc_area+ebx*4]
  737.         lea     edi, [eax+eax*2]; edi = x*3
  738.         mov     eax, [esp+32-8+4]
  739. ;--------------------------------------
  740. ; check for hardware cursor
  741.         cmp     [_display.select_cursor], 0
  742.         jne     @f
  743. ; check mouse area for putpixel
  744.         test    eax, 0x04000000
  745.         jnz     @f
  746.         call    check_mouse_area_for_putpixel
  747. ;--------------------------------------
  748. align 4
  749. @@:
  750. ; store to real LFB
  751.         mov     [LFB_BASE+ebx+edi], ax
  752.         shr     eax, 16
  753.         mov     [LFB_BASE+ebx+edi+2], al
  754.         ret
  755. ;-----------------------------------------------------------------------------
  756. align 4
  757. Vesa20_putpixel24_new:
  758. ; eax = x
  759. ; ebx = y
  760.         mov     ecx, eax
  761.         shl     ecx, 16
  762.         mov     cx, bx
  763.  
  764. ;        imul    ebx, [BytesPerScanLine]  ; ebx = y * y multiplier
  765.         mov     ebx, [BPSLine_calc_area+ebx*4]
  766.         lea     edi, [eax+eax*2]; edi = x*3
  767.         mov     eax, [esp+32-8+4]
  768. ;--------------------------------------
  769. ; check for hardware cursor
  770.         cmp     [_display.select_cursor], select_cursor
  771.         jne     @f
  772. ; check mouse area for putpixel
  773.         test    eax, 0x04000000
  774.         jnz     @f
  775. ;--------------------------------------
  776. ; check for Y
  777.         cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
  778.         jae     @f
  779.  
  780.         sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
  781.         jb      @f
  782.  
  783.         rol     ecx, 16
  784. ;--------------------------------------
  785. ; check for X
  786.         cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
  787.         jae     @f
  788.  
  789.         sub     cx, [X_UNDER_subtraction_CUR_hot_x]
  790.         jb      @f
  791.  
  792.         ror     ecx, 16
  793.  
  794.         call    check_mouse_area_for_putpixel_new.1
  795. ;--------------------------------------
  796. align 4
  797. @@:
  798. ; store to real LFB
  799.         mov     [LFB_BASE+ebx+edi], ax
  800.         shr     eax, 16
  801.         mov     [LFB_BASE+ebx+edi+2], al
  802.         ret
  803. ;-----------------------------------------------------------------------------
  804. align 4
  805. Vesa20_putpixel32:
  806. ; eax = x
  807. ; ebx = y
  808.         mov     ecx, eax
  809.         shl     ecx, 16
  810.         mov     cx, bx
  811.  
  812. ;        imul    ebx, [BytesPerScanLine]  ; ebx = y * y multiplier
  813.         mov     ebx, [BPSLine_calc_area+ebx*4]
  814.         lea     edi, [ebx+eax*4]; edi = x*4+(y*y multiplier)
  815.         mov     eax, [esp+32-8+4]; eax = color
  816. ;--------------------------------------
  817. ; check for hardware cursor
  818.         cmp     [_display.select_cursor], 0
  819.         jne     @f
  820. ; check mouse area for putpixel
  821.         test    eax, 0x04000000
  822.         jnz     @f
  823.         call    check_mouse_area_for_putpixel
  824. ;--------------------------------------
  825. align 4
  826. @@:
  827.         and     eax, 0xffffff
  828. ; store to real LFB
  829.         mov     [LFB_BASE+edi], eax
  830.         ret
  831. ;-----------------------------------------------------------------------------
  832. align 4
  833. Vesa20_putpixel32_new:
  834. ; eax = x
  835. ; ebx = y
  836.         mov     ecx, eax
  837.         shl     ecx, 16
  838.         mov     cx, bx
  839.  
  840. ;        imul    ebx, [BytesPerScanLine]  ; ebx = y * y multiplier
  841.         mov     ebx, [BPSLine_calc_area+ebx*4]
  842.         lea     edi, [ebx+eax*4]; edi = x*4+(y*y multiplier)
  843.         mov     eax, [esp+32-8+4]; eax = color
  844. ;--------------------------------------
  845. ; check for hardware cursor
  846.         cmp     [_display.select_cursor], select_cursor
  847.         jne     @f
  848. ; check mouse area for putpixel
  849.         test    eax, 0x04000000
  850.         jnz     @f
  851. ;--------------------------------------
  852. ; check for Y
  853.         cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
  854.         jae     @f
  855.  
  856.         sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
  857.         jb      @f
  858.  
  859.         rol     ecx, 16
  860. ;--------------------------------------
  861. ; check for X
  862.         cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
  863.         jae     @f
  864.  
  865.         sub     cx, [X_UNDER_subtraction_CUR_hot_x]
  866.         jb      @f
  867.  
  868.         ror     ecx, 16
  869.  
  870.         call    check_mouse_area_for_putpixel_new.1
  871. ;--------------------------------------
  872. align 4
  873. @@:
  874.         and     eax, 0xffffff
  875. ; store to real LFB
  876.         mov     [LFB_BASE+edi], eax
  877.         ret
  878. ;-----------------------------------------------------------------------------
  879. align 4
  880. calculate_edi:
  881.         mov     edi, [d_width_calc_area + ebx*4]
  882.         add     edi, eax
  883.         ret
  884. ;-----------------------------------------------------------------------------
  885. ; DRAWLINE
  886. ;-----------------------------------------------------------------------------
  887. align 4
  888. __sys_draw_line:
  889. ; draw a line
  890. ; eax = HIWORD = x1
  891. ;       LOWORD = x2
  892. ; ebx = HIWORD = y1
  893. ;       LOWORD = y2
  894. ; ecx = color
  895. ; edi = force ?
  896.         pusha
  897.  
  898. dl_x1 equ esp+20
  899. dl_y1 equ esp+16
  900. dl_x2 equ esp+12
  901. dl_y2 equ esp+8
  902. dl_dx equ esp+4
  903. dl_dy equ esp+0
  904.  
  905.         xor     edx, edx   ; clear edx
  906.         xor     esi, esi   ; unpack arguments
  907.         xor     ebp, ebp
  908.         mov     si, ax     ; esi = x2
  909.         mov     bp, bx     ; ebp = y2
  910.         shr     eax, 16    ; eax = x1
  911.         shr     ebx, 16    ; ebx = y1
  912.         push    eax        ; save x1
  913.         push    ebx        ; save y1
  914.         push    esi        ; save x2
  915.         push    ebp        ; save y2
  916. ; checking x-axis...
  917.         sub     esi, eax   ; esi = x2-x1
  918.         push    esi        ; save y2-y1
  919.         jl      .x2lx1     ; is x2 less than x1 ?
  920.         jg      .no_vline  ; x1 > x2 ?
  921.         mov     edx, ebp   ; else (if x1=x2)
  922.         call    vline
  923.         push    edx ; necessary to rightly restore stack frame at .exit
  924.         jmp     .exit
  925. ;--------------------------------------
  926. align 4
  927. .x2lx1:
  928.         neg     esi         ; get esi absolute value
  929. ;--------------------------------------
  930. align 4
  931. .no_vline:
  932. ; checking y-axis...
  933.         sub     ebp, ebx    ; ebp = y2-y1
  934.         push    ebp         ; save y2-y1
  935.         jl      .y2ly1      ; is y2 less than y1 ?
  936.         jg      .no_hline   ; y1 > y2 ?
  937.         mov     edx, [dl_x2]; else (if y1=y2)
  938.         call    hline
  939.         jmp     .exit
  940. ;--------------------------------------
  941. align 4
  942. .y2ly1:
  943.         neg     ebp         ; get ebp absolute value
  944. ;--------------------------------------
  945. align 4
  946. .no_hline:
  947.         cmp     ebp, esi
  948.         jle     .x_rules    ; |y2-y1| < |x2-x1|  ?
  949.         cmp     [dl_y2], ebx; make sure y1 is at the begining
  950.         jge     .no_reverse1
  951.         neg     dword [dl_dx]
  952.         mov     edx, [dl_x2]
  953.         mov     [dl_x2], eax
  954.         mov     [dl_x1], edx
  955.         mov     edx, [dl_y2]
  956.         mov     [dl_y2], ebx
  957.         mov     [dl_y1], edx
  958. ;--------------------------------------
  959. align 4
  960. .no_reverse1:
  961.         mov     eax, [dl_dx]
  962.         cdq                 ; extend eax sing to edx
  963.         shl     eax, 16     ; using 16bit fix-point maths
  964.         idiv    ebp         ; eax = ((x2-x1)*65536)/(y2-y1)
  965. ;--------------------------------------
  966. ; correction for the remainder of the division
  967.         shl     edx, 1
  968.         cmp     ebp, edx
  969.         jb      @f
  970.         inc     eax
  971. ;--------------------------------------
  972. align 4
  973. @@:
  974. ;--------------------------------------
  975.         mov     edx, ebp    ; edx = counter (number of pixels to draw)
  976.         mov     ebp, 1 *65536; <<16   ; ebp = dy = 1.0
  977.         mov     esi, eax    ; esi = dx
  978.         jmp     .y_rules
  979. ;--------------------------------------
  980. align 4
  981. .x_rules:
  982.         cmp     [dl_x2], eax ; make sure x1 is at the begining
  983.         jge     .no_reverse2
  984.         neg     dword [dl_dy]
  985.         mov     edx, [dl_x2]
  986.         mov     [dl_x2], eax
  987.         mov     [dl_x1], edx
  988.         mov     edx, [dl_y2]
  989.         mov     [dl_y2], ebx
  990.         mov     [dl_y1], edx
  991. ;--------------------------------------
  992. align 4
  993. .no_reverse2:
  994.         xor     edx, edx
  995.         mov     eax, [dl_dy]
  996.         cdq                 ; extend eax sing to edx
  997.         shl     eax, 16     ; using 16bit fix-point maths
  998.         idiv    esi         ; eax = ((y2-y1)*65536)/(x2-x1)
  999. ;--------------------------------------
  1000. ; correction for the remainder of the division
  1001.         shl     edx, 1
  1002.         cmp     esi, edx
  1003.         jb      @f
  1004.         inc     eax
  1005. ;--------------------------------------
  1006. align 4
  1007. @@:
  1008. ;--------------------------------------
  1009.         mov     edx, esi    ; edx = counter (number of pixels to draw)
  1010.         mov     esi, 1 *65536;<< 16   ; esi = dx = 1.0
  1011.         mov     ebp, eax    ; ebp = dy
  1012. ;--------------------------------------
  1013. align 4
  1014. .y_rules:
  1015.         mov     eax, [dl_x1]
  1016.         mov     ebx, [dl_y1]
  1017.         shl     eax, 16
  1018.         shl     ebx, 16
  1019.  
  1020.         and     ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
  1021. ;-----------------------------------------------------------------------------
  1022. align 4
  1023. .draw:
  1024.         push    eax ebx
  1025. ;--------------------------------------
  1026. ; correction for the remainder of the division
  1027.         test    ah, 0x80
  1028.         jz      @f
  1029.         add     eax, 1 shl 16
  1030. ;--------------------------------------
  1031. align 4
  1032. @@:
  1033. ;--------------------------------------
  1034.         shr     eax, 16
  1035. ;--------------------------------------
  1036. ; correction for the remainder of the division
  1037.         test    bh, 0x80
  1038.         jz      @f
  1039.         add     ebx, 1 shl 16
  1040. ;--------------------------------------
  1041. align 4
  1042. @@:
  1043. ;--------------------------------------
  1044.         shr     ebx, 16
  1045. ;        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 save to mouseunder area
  1046. ;        call    [putpixel]
  1047.         call    __sys_putpixel
  1048.         pop     ebx eax
  1049.         add     ebx, ebp     ; y = y+dy
  1050.         add     eax, esi     ; x = x+dx
  1051.         dec     edx
  1052.         jnz     .draw
  1053. ; force last drawn pixel to be at (x2,y2)
  1054.         mov     eax, [dl_x2]
  1055.         mov     ebx, [dl_y2]
  1056. ;        and     ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
  1057. ;        call    [putpixel]
  1058.         call    __sys_putpixel
  1059. ;--------------------------------------
  1060. align 4
  1061. .exit:
  1062.         add     esp, 6*4
  1063.         popa
  1064. ;        call    [draw_pointer]
  1065.         ret
  1066. ;------------------------------------------------------------------------------
  1067. align 4
  1068. hline:
  1069. ; draw an horizontal line
  1070. ; eax = x1
  1071. ; edx = x2
  1072. ; ebx = y
  1073. ; ecx = color
  1074. ; edi = force ?
  1075.         push    eax edx
  1076.         cmp     edx, eax   ; make sure x2 is above x1
  1077.         jge     @f
  1078.         xchg    eax, edx
  1079. ;--------------------------------------
  1080. align 4
  1081. @@:
  1082.         and     ecx, 0xFBFFFFFF  ;negate 0x04000000 save to mouseunder area
  1083. ;--------------------------------------
  1084. align 4
  1085. @@:
  1086. ;        call    [putpixel]
  1087.         call    __sys_putpixel
  1088.         inc     eax
  1089.         cmp     eax, edx
  1090.         jle     @b
  1091.         pop     edx eax
  1092.         ret
  1093. ;------------------------------------------------------------------------------
  1094. align 4
  1095. vline:
  1096. ; draw a vertical line
  1097. ; eax = x
  1098. ; ebx = y1
  1099. ; edx = y2
  1100. ; ecx = color
  1101. ; edi = force ?
  1102.         push    ebx edx
  1103.         cmp     edx, ebx   ; make sure y2 is above y1
  1104.         jge     @f
  1105.         xchg    ebx, edx
  1106. ;--------------------------------------
  1107. align 4
  1108. @@:
  1109.         and     ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
  1110. ;--------------------------------------
  1111. align 4
  1112. @@:
  1113. ;        call    [putpixel]
  1114.         call    __sys_putpixel
  1115.         inc     ebx
  1116.         cmp     ebx, edx
  1117.         jle     @b
  1118.         pop     edx ebx
  1119.         ret
  1120. ;------------------------------------------------------------------------------
  1121. align 4
  1122. virtual at esp
  1123. drbar:
  1124.      .bar_sx       dd ?
  1125.      .bar_sy       dd ?
  1126.      .bar_cx       dd ?
  1127.      .bar_cy       dd ?
  1128.      .abs_cx       dd ?
  1129.      .abs_cy       dd ?
  1130.      .real_sx      dd ?
  1131.      .real_sy      dd ?
  1132.      .color        dd ?
  1133.      .line_inc_scr dd ?
  1134.      .line_inc_map dd ?
  1135.      .real_sx_and_abs_cx dd ?
  1136.      .real_sy_and_abs_cy dd ?
  1137.      .stack_data = 4*13
  1138. end virtual
  1139. ;--------------------------------------
  1140. align 4
  1141. ; eax   cx
  1142. ; ebx   cy
  1143. ; ecx   xe
  1144. ; edx   ye
  1145. ; edi   color
  1146. vesa20_drawbar:
  1147.         pushad
  1148.         sub     esp, drbar.stack_data
  1149.         mov     [drbar.color], edi
  1150.         sub     edx, ebx
  1151.         jle     .exit       ;// mike.dld, 2005-01-29
  1152.         sub     ecx, eax
  1153.         jle     .exit       ;// mike.dld, 2005-01-29
  1154.         mov     [drbar.bar_sy], edx
  1155.         mov     [drbar.bar_sx], ecx
  1156.         mov     [drbar.bar_cx], eax
  1157.         mov     [drbar.bar_cy], ebx
  1158.         mov     edi, [TASK_BASE]
  1159.         add     eax, [edi-twdw + WDATA.box.left]; win_cx
  1160.         add     ebx, [edi-twdw + WDATA.box.top]; win_cy
  1161.         mov     [drbar.abs_cx], eax
  1162.         mov     [drbar.abs_cy], ebx
  1163. ; real_sx = MIN(wnd_sx-bar_cx, bar_sx);
  1164.         mov     ebx, [edi-twdw + WDATA.box.width]; ebx = wnd_sx
  1165. ; \begin{diamond}[20.08.2006]
  1166. ; note that WDATA.box.width is one pixel less than real window x-size
  1167.         inc     ebx
  1168. ; \end{diamond}[20.08.2006]
  1169.         sub     ebx, [drbar.bar_cx]
  1170.         ja      @f
  1171. ;--------------------------------------
  1172. align 4
  1173. .exit:                       ;// mike.dld, 2005-01-29
  1174.         add     esp, drbar.stack_data
  1175.         popad
  1176.         xor     eax, eax
  1177.         inc     eax
  1178.         ret
  1179. ;--------------------------------------
  1180. align 4
  1181. @@:
  1182.         cmp     ebx, [drbar.bar_sx]
  1183.         jbe     .end_x
  1184.         mov     ebx, [drbar.bar_sx]
  1185. ;--------------------------------------
  1186. align 4
  1187. .end_x:
  1188.         mov     [drbar.real_sx], ebx
  1189. ; real_sy = MIN(wnd_sy-bar_cy, bar_sy);
  1190.         mov     ebx, [edi-twdw + WDATA.box.height]; ebx = wnd_sy
  1191. ; \begin{diamond}[20.08.2006]
  1192.         inc     ebx
  1193. ; \end{diamond}
  1194.         sub     ebx, [drbar.bar_cy]
  1195.         ja      @f
  1196.         add     esp, drbar.stack_data
  1197.         popad
  1198.         xor     eax, eax
  1199.         inc     eax
  1200.         ret
  1201. ;--------------------------------------
  1202. align 4
  1203. @@:
  1204.         cmp     ebx, [drbar.bar_sy]
  1205.         jbe     .end_y
  1206.         mov     ebx, [drbar.bar_sy]
  1207. ;--------------------------------------
  1208. align 4
  1209. .end_y:
  1210.         mov     [drbar.real_sy], ebx
  1211. ; line_inc_map
  1212.         mov     eax, [_display.width]
  1213.         sub     eax, [drbar.real_sx]
  1214.         mov     [drbar.line_inc_map], eax
  1215. ; line_inc_scr
  1216.         mov     eax, [drbar.real_sx]
  1217.         mov     ebx, [_display.bpp]
  1218.         shr     ebx, 3
  1219.         imul    eax, ebx
  1220.         neg     eax
  1221.         add     eax, [_display.pitch]
  1222.         mov     [drbar.line_inc_scr], eax
  1223. ; pointer to screen
  1224.         mov     edx, [drbar.abs_cy]
  1225. ;        imul    edx, [BytesPerScanLine]
  1226.         mov     edx, [BPSLine_calc_area+edx*4]
  1227.         mov     eax, [drbar.abs_cx]
  1228.         imul    eax, ebx
  1229.         add     edx, eax
  1230. ; pointer to pixel map
  1231.         mov     eax, [drbar.abs_cy]
  1232.         mov     eax, [d_width_calc_area + eax*4]
  1233.  
  1234.         add     eax, [drbar.abs_cx]
  1235.         add     eax, [_WinMapAddress]
  1236.         xchg    eax, ebp
  1237. ;--------------------------------------
  1238.         mov     ebx, [drbar.real_sx]
  1239.         add     ebx, [drbar.abs_cx]
  1240.         mov     [drbar.real_sx_and_abs_cx], ebx
  1241.         mov     ebx, [drbar.real_sy]
  1242.         add     ebx, [drbar.abs_cy]
  1243.         mov     [drbar.real_sy_and_abs_cy], ebx
  1244.  
  1245.         add     edx, LFB_BASE
  1246. ;--------------------------------------
  1247. ; get process number
  1248.         mov     ebx, [CURRENT_TASK]  ; bl - process num
  1249.         mov     esi, [drbar.real_sy]
  1250.         mov     eax, [drbar.color] ; BBGGRR00
  1251.         rol     eax, 8
  1252.         mov     bh, al  ; 0x80 drawing gradient bars
  1253.         ror     eax, 8
  1254.         cmp     byte [_display.bpp], 24
  1255.         jne     draw_bar_end_32
  1256. ;--------------------------------------
  1257. align 4
  1258. draw_bar_end_24:
  1259. ; eax - color high   RRGGBB
  1260. ; bl - process num
  1261. ; ecx - temp
  1262. ; edx - pointer to screen
  1263. ; esi - counter
  1264. ; edi - counter
  1265. ;--------------------------------------
  1266. ; check for hardware cursor
  1267.         mov     ecx, [_display.select_cursor]
  1268.         cmp     ecx, select_cursor
  1269.         je      draw_bar_end_24_new
  1270.         cmp     ecx, 0
  1271.         je      draw_bar_end_24_old
  1272. ;--------------------------------------
  1273. align 4
  1274. .new_y:
  1275.         mov     edi, [drbar.real_sx]
  1276. ;--------------------------------------
  1277. align 4
  1278. .new_x:
  1279.         cmp     byte [ebp], bl
  1280.         jne     .skip
  1281. ;--------------------------------------
  1282. ; store to real LFB
  1283.         mov     [edx], ax
  1284.         shr     eax, 16
  1285.         mov     [edx + 2], al
  1286. ;--------------------------------------
  1287. align 4
  1288. .skip:
  1289. ; add pixel
  1290.         add     edx, 3
  1291.         inc     ebp
  1292.         dec     edi
  1293.         jnz     .new_x
  1294. ; add line
  1295.         add     edx, [drbar.line_inc_scr]
  1296.         add     ebp, [drbar.line_inc_map]
  1297. ; drawing gradient bars
  1298.         test    bh, 0x80
  1299.         jz      @f
  1300.         test    al, al
  1301.         jz      @f
  1302.         dec     al
  1303. ;--------------------------------------
  1304. align 4
  1305. @@:
  1306.         dec     esi
  1307.         jnz     .new_y
  1308. ;--------------------------------------
  1309. align 4
  1310. .end:
  1311.         add     esp, drbar.stack_data
  1312.         popad
  1313.         xor     eax, eax
  1314.         ret
  1315. ;------------------------------------------------------------------------------
  1316. align 4
  1317. draw_bar_end_24_old:
  1318. ;--------------------------------------
  1319. align 4
  1320. .new_y:
  1321.         mov     edi, [drbar.real_sx]
  1322. ;--------------------------------------
  1323. align 4
  1324. .new_x:
  1325.         cmp     byte [ebp], bl
  1326.         jne     .skip
  1327. ;--------------------------------------
  1328.         mov     ecx, [drbar.real_sx_and_abs_cx]
  1329.         sub     ecx, edi
  1330.         shl     ecx, 16
  1331.         add     ecx, [drbar.real_sy_and_abs_cy]
  1332.         sub     ecx, esi
  1333. ; check mouse area for putpixel
  1334.         call    check_mouse_area_for_putpixel
  1335. ; store to real LFB
  1336.         mov     [edx], ax
  1337.         shr     eax, 16
  1338.         mov     [edx + 2], al
  1339.         mov     eax, [drbar.color]
  1340. ;--------------------------------------
  1341. align 4
  1342. .skip:
  1343. ; add pixel
  1344.         add     edx, 3
  1345.         inc     ebp
  1346.         dec     edi
  1347.         jnz     .new_x
  1348. ; add line
  1349.         add     edx, [drbar.line_inc_scr]
  1350.         add     ebp, [drbar.line_inc_map]
  1351. ; drawing gradient bars
  1352.         test    bh, 0x80
  1353.         jz      @f
  1354.         test    al, al
  1355.         jz      @f
  1356.         dec     al
  1357. ;--------------------------------------
  1358. align 4
  1359. @@:
  1360.         dec     esi
  1361.         jnz     .new_y
  1362.         jmp     draw_bar_end_24.end
  1363. ;------------------------------------------------------------------------------
  1364. align 4
  1365. draw_bar_end_24_new:
  1366. ;--------------------------------------
  1367. align 4
  1368. .new_y:
  1369.         mov     edi, [drbar.real_sx]
  1370. ;--------------------------------------
  1371. align 4
  1372. .new_x:
  1373.         cmp     byte [ebp], bl
  1374.         jne     .skip
  1375. ;--------------------------------------
  1376.         mov     ecx, [drbar.real_sy_and_abs_cy]
  1377.         sub     ecx, esi
  1378. ;--------------------------------------
  1379. ; check for Y
  1380.         cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
  1381.         jae     .no_mouse_area
  1382.  
  1383.         sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
  1384.         jb      .no_mouse_area
  1385.  
  1386.         rol     ecx, 16
  1387.         add     ecx, [drbar.real_sx_and_abs_cx]
  1388.         sub     ecx, edi
  1389. ;--------------------------------------
  1390. ; check for X
  1391.         cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
  1392.         jae     .no_mouse_area
  1393.  
  1394.         sub     cx, [X_UNDER_subtraction_CUR_hot_x]
  1395.         jb      .no_mouse_area
  1396.  
  1397.         ror     ecx, 16
  1398. ;--------------------------------------
  1399. ; check mouse area for putpixel
  1400.         push    eax
  1401.         call    check_mouse_area_for_putpixel_new.1
  1402.         mov     [edx], ax
  1403.         shr     eax, 16
  1404.         mov     [edx + 2], al
  1405.         pop     eax
  1406.         jmp     .skip
  1407. ; store to real LFB
  1408. ;--------------------------------------
  1409. align 4
  1410. .no_mouse_area:
  1411.         mov     [edx], ax
  1412.         ror     eax, 16
  1413.         mov     [edx + 2], al
  1414.         rol     eax, 16
  1415. ;--------------------------------------
  1416. align 4
  1417. .skip:
  1418. ; add pixel
  1419.         add     edx, 3
  1420.         inc     ebp
  1421.         dec     edi
  1422.         jnz     .new_x
  1423. ; add line
  1424.         add     edx, [drbar.line_inc_scr]
  1425.         add     ebp, [drbar.line_inc_map]
  1426. ; drawing gradient bars
  1427.         test    bh, 0x80
  1428.         jz      @f
  1429.         test    al, al
  1430.         jz      @f
  1431.         dec     al
  1432. ;--------------------------------------
  1433. align 4
  1434. @@:
  1435.         dec     esi
  1436.         jnz     .new_y
  1437.         jmp     draw_bar_end_24.end
  1438. ;------------------------------------------------------------------------------
  1439. align 4
  1440. draw_bar_end_32:
  1441. ; eax - color high   RRGGBB
  1442. ; bl - process num
  1443. ; ecx - temp
  1444. ; edx - pointer to screen
  1445. ; esi - counter
  1446. ; edi - counter
  1447. ;--------------------------------------
  1448. ; check for hardware cursor
  1449.         mov     ecx, [_display.select_cursor]
  1450.         cmp     ecx, select_cursor
  1451.         je      draw_bar_end_32_new
  1452.         cmp     ecx, 0
  1453.         je      draw_bar_end_32_old
  1454. ;--------------------------------------
  1455. align 4
  1456. .new_y:
  1457.         mov     edi, [drbar.real_sx]
  1458. ;--------------------------------------
  1459. align 4
  1460. .new_x:
  1461.         cmp     byte [ebp], bl
  1462.         jne     .skip
  1463. ;--------------------------------------
  1464. ; store to real LFB
  1465.         mov     [edx], eax
  1466.         mov     eax, [drbar.color]
  1467. ;--------------------------------------
  1468. align 4
  1469. .skip:
  1470. ; add pixel
  1471.         add     edx, 4
  1472.         inc     ebp
  1473.         dec     edi
  1474.         jnz     .new_x
  1475. ; add line
  1476.         add     edx, [drbar.line_inc_scr]
  1477.         add     ebp, [drbar.line_inc_map]
  1478. ; drawing gradient bars
  1479.         test    bh, 0x80
  1480.         jz      @f
  1481.         test    al, al
  1482.         jz      @f
  1483.         dec     al
  1484. ;--------------------------------------
  1485. align 4
  1486. @@:
  1487.         dec     esi
  1488.         jnz     .new_y
  1489. ;--------------------------------------
  1490. align 4
  1491. .end:
  1492.         add     esp, drbar.stack_data
  1493.         popad
  1494.         cmp     [SCR_MODE], 0x12
  1495.         jne     @f
  1496.         call    VGA_draw_bar
  1497. ;--------------------------------------
  1498. align 4
  1499. @@:
  1500.         xor     eax, eax
  1501.         mov     [EGA_counter], 1
  1502.         ret
  1503. ;------------------------------------------------------------------------------
  1504. align 4
  1505. draw_bar_end_32_old:
  1506. ;--------------------------------------
  1507. align 4
  1508. .new_y:
  1509.         mov     edi, [drbar.real_sx]
  1510. ;--------------------------------------
  1511. align 4
  1512. .new_x:
  1513.         cmp     byte [ebp], bl
  1514.         jne     .skip
  1515. ;--------------------------------------
  1516.         mov     ecx, [drbar.real_sx_and_abs_cx]
  1517.         sub     ecx, edi
  1518.         shl     ecx, 16
  1519.         add     ecx, [drbar.real_sy_and_abs_cy]
  1520.         sub     ecx, esi
  1521.  
  1522. ; check mouse area for putpixel
  1523.         call    check_mouse_area_for_putpixel
  1524. ; store to real LFB
  1525.         mov     [edx], eax
  1526.         mov     eax, [drbar.color]
  1527. ;--------------------------------------
  1528. align 4
  1529. .skip:
  1530. ; add pixel
  1531.         add     edx, 4
  1532.         inc     ebp
  1533.         dec     edi
  1534.         jnz     .new_x
  1535. ; add line
  1536.         add     edx, [drbar.line_inc_scr]
  1537.         add     ebp, [drbar.line_inc_map]
  1538. ; drawing gradient bars
  1539.         test    bh, 0x80
  1540.         jz      @f
  1541.         test    al, al
  1542.         jz      @f
  1543.         dec     al
  1544. ;--------------------------------------
  1545. align 4
  1546. @@:
  1547.         dec     esi
  1548.         jnz     .new_y
  1549.         jmp     draw_bar_end_32.end
  1550. ;------------------------------------------------------------------------------
  1551. align 4
  1552. draw_bar_end_32_new:
  1553. ;--------------------------------------
  1554. align 4
  1555. .new_y:
  1556.         mov     edi, [drbar.real_sx]
  1557. ;--------------------------------------
  1558. align 4
  1559. .new_x:
  1560.         cmp     byte [ebp], bl
  1561.         jne     .skip
  1562. ;--------------------------------------
  1563.         mov     ecx, [drbar.real_sy_and_abs_cy]
  1564.         sub     ecx, esi
  1565. ;--------------------------------------
  1566. ; check for Y
  1567.         cmp     cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
  1568.         jae     .no_mouse_area
  1569.  
  1570.         sub     cx, [Y_UNDER_subtraction_CUR_hot_y]
  1571.         jb      .no_mouse_area
  1572.  
  1573.         rol     ecx, 16
  1574.         add     ecx, [drbar.real_sx_and_abs_cx]
  1575.         sub     ecx, edi
  1576. ;--------------------------------------
  1577. ; check for X
  1578.         cmp     cx, [X_UNDER_sub_CUR_hot_x_add_curh]
  1579.         jae     .no_mouse_area
  1580.  
  1581.         sub     cx, [X_UNDER_subtraction_CUR_hot_x]
  1582.         jb      .no_mouse_area
  1583.  
  1584.         ror     ecx, 16
  1585. ;--------------------------------------
  1586. ; check mouse area for putpixel
  1587.         push    eax
  1588.         call    check_mouse_area_for_putpixel_new.1
  1589.         mov     [edx], eax
  1590.         pop     eax
  1591.         jmp     .skip
  1592. ; store to real LFB
  1593. ;--------------------------------------
  1594. align 4
  1595. .no_mouse_area:
  1596.         mov     [edx], eax
  1597. ;--------------------------------------
  1598. align 4
  1599. .skip:
  1600. ; add pixel
  1601.         add     edx, 4
  1602.         inc     ebp
  1603.         dec     edi
  1604.         jnz     .new_x
  1605. ; add line
  1606.         add     edx, [drbar.line_inc_scr]
  1607.         add     ebp, [drbar.line_inc_map]
  1608. ; drawing gradient bars
  1609.         test    bh, 0x80
  1610.         jz      @f
  1611.         test    al, al
  1612.         jz      @f
  1613.         dec     al
  1614. ;--------------------------------------
  1615. align 4
  1616. @@:
  1617.         dec     esi
  1618.         jnz     .new_y
  1619.         jmp     draw_bar_end_32.end
  1620. ;------------------------------------------------------------------------------
  1621. align 4
  1622. vesa20_drawbackground_tiled:
  1623.         pushad
  1624. ; External loop for all y from start to end
  1625.         mov     ebx, [draw_data+32+RECT.top]    ; y start
  1626. ;--------------------------------------
  1627. align 4
  1628. dp2:
  1629.         mov     ebp, [draw_data+32+RECT.left]   ; x start
  1630. ; 1) Calculate pointers in WinMapAddress (does pixel belong to OS thread?) [ebp]
  1631. ;                       and LFB data (output for our function) [edi]
  1632. ;        mov     eax, [BytesPerScanLine]
  1633. ;        mul     ebx
  1634.         mov     eax, [BPSLine_calc_area+ebx*4]
  1635.         xchg    ebp, eax
  1636.         add     ebp, eax
  1637.         add     ebp, eax
  1638.         add     ebp, eax
  1639.         cmp     byte [_display.bpp], 24    ; 24 or 32 bpp ? - x size
  1640.         jz      @f
  1641.         add     ebp, eax
  1642. ;--------------------------------------
  1643. align 4
  1644. @@:
  1645.         add     ebp, LFB_BASE
  1646. ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
  1647.         call    calculate_edi
  1648.         xchg    edi, ebp
  1649.         add     ebp, [_WinMapAddress]
  1650. ; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress
  1651. ; 2) Calculate offset in background memory block
  1652.         push    eax
  1653.         xor     edx, edx
  1654.         mov     eax, ebx
  1655.         div     dword [BgrDataHeight]   ; edx := y mod BgrDataHeight
  1656.         pop     eax
  1657.         push    eax
  1658.         mov     ecx, [BgrDataWidth]
  1659.         mov     esi, edx
  1660.         imul    esi, ecx                ; esi := (y mod BgrDataHeight) * BgrDataWidth
  1661.         xor     edx, edx
  1662.         div     ecx             ; edx := x mod BgrDataWidth
  1663.         sub     ecx, edx
  1664.         add     esi, edx        ; esi := (y mod BgrDataHeight)*BgrDataWidth + (x mod BgrDataWidth)
  1665.         pop     eax
  1666.         lea     esi, [esi*3]
  1667.         add     esi, [img_background]
  1668.         xor     edx, edx
  1669.         inc     edx
  1670. ; 3) Loop through redraw rectangle and copy background data
  1671. ; Registers meaning:
  1672. ; eax = x, ebx = y (screen coordinates)
  1673. ; ecx = deltax - number of pixels left in current tile block
  1674. ; edx = 1
  1675. ; esi -> bgr memory, edi -> output
  1676. ; ebp = offset in WinMapAddress
  1677. ;--------------------------------------
  1678. align 4
  1679. dp3:
  1680.         cmp     [ebp], dl
  1681.         jnz     nbgp
  1682. ;--------------------------------------
  1683.         push    eax ecx
  1684.  
  1685.         mov     ecx, eax
  1686.         shl     ecx, 16
  1687.         add     ecx, ebx
  1688.  
  1689.         mov     eax, [esi]
  1690.  
  1691. ; check for hardware cursor
  1692.         cmp     [_display.select_cursor], select_cursor
  1693.         je      @f
  1694.         cmp     [_display.select_cursor], 0
  1695.         jne     .no_mouseunder
  1696. ;--------------------------------------
  1697. align 4
  1698. @@:
  1699.         and     eax, 0xffffff
  1700. ; check mouse area for putpixel
  1701.         call    [_display.check_mouse]
  1702. ;--------------------------------------
  1703. align 4
  1704. .no_mouseunder:
  1705. ; store to real LFB
  1706.         mov     [edi], ax
  1707.         shr     eax, 16
  1708.         mov     [edi+2], al
  1709.  
  1710.         pop     ecx eax
  1711. ;--------------------------------------
  1712. align 4
  1713. nbgp:
  1714.         add     esi, 3
  1715.         add     edi, 3
  1716. ;--------------------------------------
  1717. align 4
  1718. @@:
  1719.         cmp     byte [_display.bpp], 25    ; 24 or 32 bpp?
  1720.         sbb     edi, -1         ; +1 for 32 bpp
  1721. ; I do not use 'inc eax' because this is slightly slower then 'add eax,1'
  1722.         add     ebp, edx
  1723.         add     eax, edx
  1724.         cmp     eax, [draw_data+32+RECT.right]
  1725.         ja      dp4
  1726.         sub     ecx, edx
  1727.         jnz     dp3
  1728. ; next tile block on x-axis
  1729.         mov     ecx, [BgrDataWidth]
  1730.         sub     esi, ecx
  1731.         sub     esi, ecx
  1732.         sub     esi, ecx
  1733.         jmp     dp3
  1734. ;--------------------------------------
  1735. align 4
  1736. dp4:
  1737. ; next scan line
  1738.         inc     ebx
  1739.         cmp     ebx, [draw_data+32+RECT.bottom]
  1740.         jbe     dp2
  1741.         popad
  1742.         mov     [EGA_counter], 1
  1743.         cmp     [SCR_MODE], 0x12
  1744.         jne     @f
  1745.         call    VGA_drawbackground
  1746. ;--------------------------------------
  1747. align 4
  1748. @@:
  1749.         ret
  1750. ;------------------------------------------------------------------------------
  1751. align 4
  1752. vesa20_drawbackground_stretch:
  1753.         pushad
  1754. ; Helper variables
  1755. ; calculate 2^32*(BgrDataWidth) mod (ScreenWidth)
  1756.         mov     eax, [BgrDataWidth]
  1757.         xor     edx, edx
  1758.         div     dword [_display.width]
  1759.         push    eax     ; high
  1760.         xor     eax, eax
  1761.         div     dword [_display.width]
  1762.         push    eax     ; low
  1763. ; the same for height
  1764.         mov     eax, [BgrDataHeight]
  1765.         xor     edx, edx
  1766.         div     dword [_display.height]
  1767.         push    eax     ; high
  1768.         xor     eax, eax
  1769.         div     dword [_display.height]
  1770.         push    eax     ; low
  1771. ; External loop for all y from start to end
  1772.         mov     ebx, [draw_data+32+RECT.top]    ; y start
  1773.         mov     ebp, [draw_data+32+RECT.left]   ; x start
  1774. ; 1) Calculate pointers in WinMapAddress (does pixel belong to OS thread?) [ebp]
  1775. ;                       and LFB data (output for our function) [edi]
  1776. ;        mov     eax, [BytesPerScanLine]
  1777. ;        mul     ebx
  1778.         mov     eax, [BPSLine_calc_area+ebx*4]
  1779.         xchg    ebp, eax
  1780.         add     ebp, eax
  1781.         add     ebp, eax
  1782.         add     ebp, eax
  1783.         cmp     byte [_display.bpp], 24    ; 24 or 32 bpp ? - x size
  1784.         jz      @f
  1785.         add     ebp, eax
  1786. ;--------------------------------------
  1787. align 4
  1788. @@:
  1789. ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
  1790.         call    calculate_edi
  1791.         xchg    edi, ebp
  1792. ; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress
  1793.         push    ebx
  1794.         push    eax
  1795. ; 2) Calculate offset in background memory block
  1796.         mov     eax, ebx
  1797.         imul    ebx, dword [esp+12]
  1798.         mul     dword [esp+8]
  1799.         add     edx, ebx        ; edx:eax = y * 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
  1800.         mov     esi, edx
  1801.         imul    esi, [BgrDataWidth]
  1802.         push    edx
  1803.         push    eax
  1804.         mov     eax, [esp+8]
  1805.         mul     dword [esp+28]
  1806.         push    eax
  1807.         mov     eax, [esp+12]
  1808.         mul     dword [esp+28]
  1809.         add     [esp], edx
  1810.         pop     edx             ; edx:eax = x * 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
  1811.         add     esi, edx
  1812.         lea     esi, [esi*3]
  1813.         add     esi, [img_background]
  1814.         push    eax
  1815.         push    edx
  1816.         push    esi
  1817. ; 3) Smooth horizontal
  1818. ;--------------------------------------
  1819. align 4
  1820. bgr_resmooth0:
  1821.         mov     ecx, [esp+8]
  1822.         mov     edx, [esp+4]
  1823.         mov     esi, [esp]
  1824.         push    edi
  1825.         mov     edi, bgr_cur_line
  1826.         call    smooth_line
  1827. ;--------------------------------------
  1828. align 4
  1829. bgr_resmooth1:
  1830.         mov     eax, [esp+16+4]
  1831.         inc     eax
  1832.         cmp     eax, [BgrDataHeight]
  1833.         jae     bgr.no2nd
  1834.         mov     ecx, [esp+8+4]
  1835.         mov     edx, [esp+4+4]
  1836.         mov     esi, [esp+4]
  1837.         add     esi, [BgrDataWidth]
  1838.         add     esi, [BgrDataWidth]
  1839.         add     esi, [BgrDataWidth]
  1840.         mov     edi, bgr_next_line
  1841.         call    smooth_line
  1842. ;--------------------------------------
  1843. align 4
  1844. bgr.no2nd:
  1845.         pop     edi
  1846. ;--------------------------------------
  1847. align 4
  1848. sdp3:
  1849.         xor     esi, esi
  1850.         mov     ecx, [esp+12]
  1851. ; 4) Loop through redraw rectangle and copy background data
  1852. ; Registers meaning:
  1853. ; esi = offset in current line, edi -> output
  1854. ; ebp = offset in WinMapAddress
  1855. ; dword [esp] = offset in bgr data
  1856. ; qword [esp+4] = x * 2^32 * (BgrDataWidth-1) / (ScreenWidth-1)
  1857. ; qword [esp+12] = y * 2^32 * (BgrDataHeight-1) / (ScreenHeight-1)
  1858. ; dword [esp+20] = x
  1859. ; dword [esp+24] = y
  1860. ; precalculated constants:
  1861. ; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
  1862. ; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
  1863. ;--------------------------------------
  1864. align 4
  1865. sdp3a:
  1866.         mov     eax, [_WinMapAddress]
  1867.         cmp     [ebp+eax], byte 1
  1868.         jnz     snbgp
  1869.         mov     eax, [bgr_cur_line+esi]
  1870.         test    ecx, ecx
  1871.         jz      .novert
  1872.         mov     ebx, [bgr_next_line+esi]
  1873.         call    [overlapping_of_points_ptr]
  1874. ;--------------------------------------
  1875. align 4
  1876. .novert:
  1877.         push    ecx
  1878. ; check for hardware cursor
  1879.         cmp     [_display.select_cursor], select_cursor
  1880.         je      @f
  1881.         cmp     [_display.select_cursor], 0
  1882.         jne     .no_mouseunder
  1883. ;--------------------------------------
  1884. align 4
  1885. @@:
  1886.         mov     ecx, [esp+20+4]        ;x
  1887.         shl     ecx, 16
  1888.         add     ecx, [esp+24+4]        ;y
  1889. ; check mouse area for putpixel
  1890.         call    [_display.check_mouse]
  1891. ;--------------------------------------
  1892. align 4
  1893. .no_mouseunder:
  1894. ; store to real LFB
  1895.         mov     [LFB_BASE+edi], ax
  1896.         shr     eax, 16
  1897.         mov     [LFB_BASE+edi+2], al
  1898.         pop     ecx
  1899. ;--------------------------------------
  1900. align 4
  1901. snbgp:
  1902.         cmp     byte [_display.bpp], 25
  1903.         sbb     edi, -4
  1904.         add     ebp, 1
  1905.         mov     eax, [esp+20]
  1906.         add     eax, 1
  1907.         mov     [esp+20], eax
  1908.         add     esi, 4
  1909.         cmp     eax, [draw_data+32+RECT.right]
  1910.         jbe     sdp3a
  1911. ;--------------------------------------
  1912. align 4
  1913. sdp4:
  1914. ; next y
  1915.         mov     ebx, [esp+24]
  1916.         add     ebx, 1
  1917.         mov     [esp+24], ebx
  1918.         cmp     ebx, [draw_data+32+RECT.bottom]
  1919.         ja      sdpdone
  1920. ; advance edi, ebp to next scan line
  1921.         sub     eax, [draw_data+32+RECT.left]
  1922.         sub     ebp, eax
  1923.         add     ebp, [_display.width]
  1924.         sub     edi, eax
  1925.         sub     edi, eax
  1926.         sub     edi, eax
  1927.         cmp     byte [_display.bpp], 24
  1928.         jz      @f
  1929.         sub     edi, eax
  1930. ;--------------------------------------
  1931. align 4
  1932. @@:
  1933.         add     edi, [_display.pitch]
  1934. ; restore ecx,edx; advance esi to next background line
  1935.         mov     eax, [esp+28]
  1936.         mov     ebx, [esp+32]
  1937.         add     [esp+12], eax
  1938.         mov     eax, [esp+16]
  1939.         adc     [esp+16], ebx
  1940.         sub     eax, [esp+16]
  1941.         mov     ebx, eax
  1942.         lea     eax, [eax*3]
  1943.         imul    eax, [BgrDataWidth]
  1944.         sub     [esp], eax
  1945.         mov     eax, [draw_data+32+RECT.left]
  1946.         mov     [esp+20], eax
  1947.         test    ebx, ebx
  1948.         jz      sdp3
  1949.         cmp     ebx, -1
  1950.         jnz     bgr_resmooth0
  1951.         push    edi
  1952.         mov     esi, bgr_next_line
  1953.         mov     edi, bgr_cur_line
  1954.         mov     ecx, [_display.width]
  1955.         inc     ecx
  1956.         rep movsd
  1957.         jmp     bgr_resmooth1
  1958. ;--------------------------------------
  1959. align 4
  1960. sdpdone:
  1961.         add     esp, 44
  1962.         popad
  1963.         mov     [EGA_counter], 1
  1964.         cmp     [SCR_MODE], 0x12
  1965.         jne     @f
  1966.         call    VGA_drawbackground
  1967. ;--------------------------------------
  1968. align 4
  1969. @@:
  1970.         ret
  1971.  
  1972. uglobal
  1973. ;--------------------------------------
  1974. align 4
  1975. bgr_cur_line    rd      1920    ; maximum width of screen
  1976. bgr_next_line   rd      1920
  1977. ;--------------------------------------
  1978. endg
  1979. ;--------------------------------------
  1980. align 4
  1981. smooth_line:
  1982.         mov     al, [esi+2]
  1983.         shl     eax, 16
  1984.         mov     ax, [esi]
  1985.         test    ecx, ecx
  1986.         jz      @f
  1987.         mov     ebx, [esi+2]
  1988.         shr     ebx, 8
  1989.         call    [overlapping_of_points_ptr]
  1990. ;--------------------------------------
  1991. align 4
  1992. @@:
  1993.         stosd
  1994.         mov     eax, [esp+20+8]
  1995.         add     eax, 1
  1996.         mov     [esp+20+8], eax
  1997.         cmp     eax, [draw_data+32+RECT.right]
  1998.         ja      @f
  1999.         add     ecx, [esp+36+8]
  2000.         mov     eax, edx
  2001.         adc     edx, [esp+40+8]
  2002.         sub     eax, edx
  2003.         lea     eax, [eax*3]
  2004.         sub     esi, eax
  2005.         jmp     smooth_line
  2006. ;--------------------------------------
  2007. align 4
  2008. @@:
  2009.         mov     eax, [draw_data+32+RECT.left]
  2010.         mov     [esp+20+8], eax
  2011.         ret
  2012. ;------------------------------------------------------------------------------
  2013. align 16
  2014. overlapping_of_points:
  2015. if 0
  2016. ; this version of procedure works, but is slower than next version
  2017.         push    ecx edx
  2018.         mov     edx, eax
  2019.         push    esi
  2020.         shr     ecx, 24
  2021.         mov     esi, ecx
  2022.         mov     ecx, ebx
  2023.         movzx   ebx, dl
  2024.         movzx   eax, cl
  2025.         sub     eax, ebx
  2026.         movzx   ebx, dh
  2027.         imul    eax, esi
  2028.         add     dl, ah
  2029.         movzx   eax, ch
  2030.         sub     eax, ebx
  2031.         imul    eax, esi
  2032.         add     dh, ah
  2033.         ror     ecx, 16
  2034.         ror     edx, 16
  2035.         movzx   eax, cl
  2036.         movzx   ebx, dl
  2037.         sub     eax, ebx
  2038.         imul    eax, esi
  2039.         pop     esi
  2040.         add     dl, ah
  2041.         mov     eax, edx
  2042.         pop     edx
  2043.         ror     eax, 16
  2044.         pop     ecx
  2045.         ret
  2046. else
  2047.         push    ecx edx
  2048.         mov     edx, eax
  2049.         push    esi
  2050.         shr     ecx, 26
  2051.         mov     esi, ecx
  2052.         mov     ecx, ebx
  2053.         shl     esi, 9
  2054.         movzx   ebx, dl
  2055.         movzx   eax, cl
  2056.         sub     eax, ebx
  2057.         movzx   ebx, dh
  2058.         add     dl, [BgrAuxTable+(eax+0x100)+esi]
  2059.         movzx   eax, ch
  2060.         sub     eax, ebx
  2061.         add     dh, [BgrAuxTable+(eax+0x100)+esi]
  2062.         ror     ecx, 16
  2063.         ror     edx, 16
  2064.         movzx   eax, cl
  2065.         movzx   ebx, dl
  2066.         sub     eax, ebx
  2067.         add     dl, [BgrAuxTable+(eax+0x100)+esi]
  2068.         pop     esi
  2069.         mov     eax, edx
  2070.         pop     edx
  2071.         ror     eax, 16
  2072.         pop     ecx
  2073.         ret
  2074. end if
  2075.  
  2076. iglobal
  2077. ;--------------------------------------
  2078. align 4
  2079. overlapping_of_points_ptr       dd      overlapping_of_points
  2080. ;--------------------------------------
  2081. endg
  2082. ;------------------------------------------------------------------------------
  2083. align 4
  2084. init_background:
  2085.         mov     edi, BgrAuxTable
  2086.         xor     edx, edx
  2087. ;--------------------------------------
  2088. align 4
  2089. .loop2:
  2090.         mov     eax, edx
  2091.         shl     eax, 8
  2092.         neg     eax
  2093.         mov     ecx, 0x200
  2094. ;--------------------------------------
  2095. align 4
  2096. .loop1:
  2097.         mov     byte [edi], ah
  2098.         inc     edi
  2099.         add     eax, edx
  2100.         loop    .loop1
  2101.         add     dl, 4
  2102.         jnz     .loop2
  2103.         test    byte [cpu_caps+(CAPS_MMX/8)], 1 shl (CAPS_MMX mod 8)
  2104.         jz      @f
  2105.         mov     [overlapping_of_points_ptr], overlapping_of_points_mmx
  2106. ;--------------------------------------
  2107. align 4
  2108. @@:
  2109.         ret
  2110. ;------------------------------------------------------------------------------
  2111. align 16
  2112. overlapping_of_points_mmx:
  2113.         movd    mm0, eax
  2114.         movd    mm4, eax
  2115.         movd    mm1, ebx
  2116.         pxor    mm2, mm2
  2117.         punpcklbw mm0, mm2
  2118.         punpcklbw mm1, mm2
  2119.         psubw   mm1, mm0
  2120.         movd    mm3, ecx
  2121.         psrld   mm3, 24
  2122.         packuswb mm3, mm3
  2123.         packuswb mm3, mm3
  2124.         pmullw  mm1, mm3
  2125.         psrlw   mm1, 8
  2126.         packuswb mm1, mm2
  2127.         paddb   mm4, mm1
  2128.         movd    eax, mm4
  2129.         ret
  2130. ;------------------------------------------------------------------------------
  2131.