Subversion Repositories Kolibri OS

Rev

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

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