Subversion Repositories Kolibri OS

Rev

Rev 5363 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;  VESA12.INC                                                  ;;
  7. ;;                                                              ;;
  8. ;;  Vesa 1.2 functions for MenuetOS                             ;;
  9. ;;                                                              ;;
  10. ;;  Copyright 2002 Ville Turjanmaa                              ;;
  11. ;;                                                              ;;
  12. ;;  quickcode@mail.ru - bankswitch for S3 cards                 ;;
  13. ;;                                                              ;;
  14. ;;  See file COPYING for details                                ;;
  15. ;;                                                              ;;
  16. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  17.  
  18. $Revision: 7136 $
  19.  
  20.  
  21. TRIDENT       = 0
  22. S3_VIDEO      = 0
  23. INTEL_VIDEO   = 0
  24.  
  25. if TRIDENT
  26.   if S3_VIDEO or INTEL_VIDEO
  27.     stop
  28.   end if
  29. end if
  30.  
  31. if S3_VIDEO
  32.   if TRIDENT or INTEL_VIDEO
  33.     stop
  34.   end if
  35. end if
  36.  
  37. if INTEL_VIDEO
  38.   if S3_VIDEO or TRIDENT
  39.     stop
  40.   end if
  41. end if
  42.  
  43.  
  44. ; A complete video driver should include the following types of function
  45. ;
  46. ; Putpixel
  47. ; Getpixel
  48. ;
  49. ; Drawimage
  50. ; Drawbar
  51. ;
  52. ; Drawbackground
  53. ;
  54. ;
  55. ; Modifying the set_bank -function is mostly enough
  56. ; for different Vesa 1.2 setups.
  57.  
  58. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  59. ; set_bank for Trident videocards, work on Trident 9440
  60. ; modified by Mario79
  61.  
  62. if TRIDENT
  63. set_bank:
  64.         pushfd
  65.         cli
  66.         cmp     al, [BANK_RW]
  67.         je      .retsb
  68.  
  69.         mov     [BANK_RW], al
  70.         push    dx
  71.         mov     dx, 3D8h
  72.         out     dx, al
  73.         pop     dx
  74. .retsb:
  75.         popfd
  76.         ret
  77. end if
  78.  
  79. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  80. ; set_bank for S3 videocards, work on S3 ViRGE PCI (325)
  81. ; modified by kmeaw
  82.  
  83. if S3_VIDEO
  84. set_bank:
  85.         pushfd
  86.         cli
  87.         cmp     al, [BANK_RW]
  88.         je      .retsb
  89.  
  90.         mov     [BANK_RW], al
  91.         push    ax
  92.         push    dx
  93.         push    cx
  94.         mov     cl, al
  95.         mov     dx, 0x3D4
  96.         mov     al, 0x38
  97.         out     dx, al    ;CR38 Register Lock 1 ;Note: Traditionally 48h is used to
  98.                           ;unlock and 00h to lock
  99.         inc     dx
  100.         mov     al, 0x48
  101.         out     dx, al    ;3d5 -?
  102.         dec     dx
  103.         mov     al, 0x31
  104.         out     dx, al    ;CR31 Memory Configuration Register
  105. ;0  Enable Base Address Offset (CPUA BASE). Enables bank operation if set, ;disables if clear.
  106. ;4-5  Bit 16-17 of the Display Start Address. For the 801/5,928 see index 51h,
  107. ;for the 864/964 see index 69h.
  108.  
  109.         inc     dx
  110.         in      al, dx
  111.         dec     dx
  112.         mov     ah, al
  113.         mov     al, 0x31
  114.         out     dx, ax
  115.         mov     al, ah
  116.         or      al, 9
  117.         inc     dx
  118.         out     dx, al
  119.         dec     dx
  120.         mov     al, 0x35
  121.         out     dx, al  ;CR35 CRT Register Lock
  122.         inc     dx
  123.         in      al, dx
  124.         dec     dx
  125.         and     al, 0xF0
  126.         mov     ch, cl
  127.         and     ch, 0x0F
  128.         or      ch, al
  129.         mov     al, 0x35
  130.         out     dx, al
  131.         inc     dx
  132.         mov     al, ch
  133.         out     dx, ax
  134.         dec     dx
  135.         mov     al, 0x51 ;Extended System Control 2 Register
  136.         out     dx, al
  137.         inc     dx
  138.         in      al, dx
  139.         dec     dx
  140.         and     al, 0xF3
  141.         shr     cl, 2
  142.         and     cl, 0x0C
  143.         or      cl, al
  144.         mov     al, 0x51
  145.         out     dx, al
  146.         inc     dx
  147.         mov     al, cl
  148.         out     dx, al
  149.         dec     dx
  150.         mov     al, 0x38
  151.         out     dx, al
  152.         inc     dx
  153.         xor     al, al
  154.         out     dx, al
  155.         dec     dx
  156.         pop     cx
  157.         pop     dx
  158.         pop     ax
  159. .retsb:
  160.         popfd
  161.         ret
  162. end if
  163.  
  164. ;Set bank function for Intel 810/815 chipsets
  165. ; *****Modified by Protopopius, Russia.*****
  166. ; ********* http://menuetos.hut.ru **************
  167. ; ************************************************
  168.  
  169. if INTEL_VIDEO
  170.  
  171. set_bank:
  172.         pushfd
  173.         cli
  174.  
  175.         cmp     al, [BANK_RW]
  176.         je      .retsb
  177.  
  178.         mov     [BANK_RW], al
  179.         push    ax
  180.         push    dx
  181.         mov     dx, 3CEh
  182.         mov     ah, al          ; Save value for later use
  183.         mov     al, 10h         ; Index GR10 (Address Mapping)
  184.         out     dx, al          ; Select GR10
  185.         inc     dl
  186.         mov     al, 3           ; Set bits 0 and 1 (Enable linear page mapping)
  187.         out     dx, al          ; Write value
  188.         dec     dl
  189.         mov     al, 11h         ; Index GR11 (Page Selector)
  190.         out     dx, al          ; Select GR11
  191.         inc     dl
  192.         mov     al, ah          ; Write address
  193.         out     dx, al          ; Write the value
  194.         pop     dx
  195.         pop     ax
  196. .retsb:
  197.         popfd
  198.         ret
  199. end if
  200.  
  201. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
  202.  
  203. if (TRIDENT or S3_VIDEO or INTEL_VIDEO)
  204. else
  205. set_bank:
  206.         pushfd
  207.         cli
  208.  
  209.         cmp     al, [BANK_RW]
  210.         je      .retsb
  211.  
  212.         mov     [BANK_RW], al
  213.         push    ax
  214.         push    dx
  215.         mov     ah, al
  216.         mov     dx, 0x03D4
  217.         mov     al, 0x39
  218.         out     dx, al
  219.         inc     dl
  220.         mov     al, 0xA5
  221.         out     dx, al
  222.         dec     dl
  223.         mov     al, 6Ah
  224.         out     dx, al
  225.         inc     dl
  226.         mov     al, ah
  227.         out     dx, al
  228.         dec     dl
  229.         mov     al, 0x39
  230.         out     dx, al
  231.         inc     dl
  232.         mov     al, 0x5A
  233.         out     dx, al
  234.         dec     dl
  235.         pop     dx
  236.         pop     ax
  237.  
  238. .retsb:
  239.         popfd
  240.         ret
  241. end if
  242.  
  243. vesa12_drawbackground:
  244.  
  245.         call    [_display.disable_mouse]
  246.  
  247.         push    eax
  248.         push    ebx
  249.         push    ecx
  250.         push    edx
  251.  
  252.         xor     edx, edx
  253.         mov     eax, dword[BgrDataWidth]
  254.         mov     ebx, dword[BgrDataHeight]
  255.         mul     ebx
  256.         mov     ebx, 3
  257.         mul     ebx
  258.         mov     [imax], eax
  259.         mov     eax, [draw_data+32+RECT.left]
  260.         mov     ebx, [draw_data+32+RECT.top]
  261.         xor     edi, edi;no force
  262.  
  263.       v12dp3:
  264.  
  265.         push    eax
  266.         push    ebx
  267.  
  268.         cmp     [BgrDrawMode], dword 1  ; tiled background
  269.         jne     no_vesa12_tiled_bgr
  270.  
  271.         push    edx
  272.  
  273.         xor     edx, edx
  274.         div     dword [BgrDataWidth]
  275.  
  276.         push    edx
  277.         mov     eax, ebx
  278.         xor     edx, edx
  279.         div     dword [BgrDataHeight]
  280.         mov     ebx, edx
  281.         pop     eax
  282.  
  283.         pop     edx
  284.  
  285.       no_vesa12_tiled_bgr:
  286.  
  287.         cmp     [BgrDrawMode], dword 2  ; stretched background
  288.         jne     no_vesa12_stretched_bgr
  289.  
  290.         push    edx
  291.  
  292.         mul     dword [BgrDataWidth]
  293.         mov     ecx, [Screen_Max_X]
  294.         inc     ecx
  295.         div     ecx
  296.  
  297.         push    eax
  298.         mov     eax, ebx
  299.         mul     dword [BgrDataHeight]
  300.         mov     ecx, [Screen_Max_Y]
  301.         inc     ecx
  302.         div     ecx
  303.         mov     ebx, eax
  304.         pop     eax
  305.  
  306.         pop     edx
  307.  
  308.       no_vesa12_stretched_bgr:
  309.  
  310.  
  311.         mov     esi, ebx
  312.         imul    esi, dword [BgrDataWidth]
  313.         add     esi, eax
  314.         lea     esi, [esi*3]
  315.         add     esi, [img_background];IMG_BACKGROUND
  316.         pop     ebx
  317.         pop     eax
  318.  
  319.       v12di4:
  320.  
  321.         mov     cl, [esi+2]
  322.         shl     ecx, 16
  323.         mov     cx, [esi]
  324.         pusha
  325.         mov     esi, eax
  326.         mov     edi, ebx
  327.         mov     eax, [Screen_Max_X]
  328.         add     eax, 1
  329.         mul     ebx
  330.         add     eax, [_WinMapAddress]
  331.         cmp     [eax+esi], byte 1
  332.         jnz     v12nbgp
  333.         mov     eax, [BytesPerScanLine]
  334.         mov     ebx, edi
  335.         mul     ebx
  336.         add     eax, esi
  337.         lea     eax, [VGABasePtr+eax+esi*2]
  338.         cmp     [ScreenBPP], byte 24
  339.         jz      v12bgl3
  340.         add     eax, esi
  341.  
  342.       v12bgl3:
  343.  
  344.         push    ebx
  345.         push    eax
  346.  
  347.         sub     eax, VGABasePtr
  348.  
  349.         shr     eax, 16
  350.         call    set_bank
  351.         pop     eax
  352.         and     eax, 65535
  353.         add     eax, VGABasePtr
  354.         pop     ebx
  355.  
  356.         mov     [eax], cx
  357.         add     eax, 2
  358.         shr     ecx, 16
  359.         mov     [eax], cl
  360.         sti
  361.  
  362.       v12nbgp:
  363.  
  364.         popa
  365.         add     esi, 3
  366.         inc     eax
  367.         cmp     eax, [draw_data+32+RECT.right]
  368.         jg      v12nodp31
  369.         jmp     v12dp3
  370.  
  371.       v12nodp31:
  372.  
  373.         mov     eax, [draw_data+32+RECT.left]
  374.         inc     ebx
  375.         cmp     ebx, [draw_data+32+RECT.bottom]
  376.         jg      v12dp4
  377.         jmp     v12dp3
  378.  
  379.       v12dp4:
  380.  
  381.         pop     edx
  382.         pop     ecx
  383.         pop     ebx
  384.         pop     eax
  385.         ret
  386.  
  387.  
  388. vesa12_drawbar:
  389.  
  390.         call    [_display.disable_mouse]
  391.  
  392. ;;    mov  [novesachecksum],dword 0
  393.         sub     edx, ebx
  394.         sub     ecx, eax
  395.         push    esi
  396.         push    edi
  397.         push    eax
  398.         push    ebx
  399.         push    ecx
  400.         push    edx
  401.         mov     ecx, [TASK_BASE]
  402.         add     eax, [ecx-twdw+WDATA.box.left]
  403.         add     ebx, [ecx-twdw+WDATA.box.top]
  404.         push    eax
  405.         mov     eax, ebx ; y
  406.         mov     ebx, [BytesPerScanLine]
  407.         mul     ebx
  408.         pop     ecx
  409.         add     eax, ecx ; x
  410.         add     eax, ecx
  411.         add     eax, ecx
  412.         cmp     [ScreenBPP], byte 24; 24 or 32 bpp ? - x start
  413.         jz      dbpi2412
  414.         add     eax, ecx
  415.  
  416.   dbpi2412:
  417.  
  418.         add     eax, VGABasePtr
  419.         mov     edi, eax
  420.  
  421.     ; x size
  422.  
  423.         mov     eax, [esp+4]; [esp+6]
  424.         mov     ecx, eax
  425.         add     ecx, eax
  426.         add     ecx, eax
  427.         cmp     [ScreenBPP], byte 24; 24 or 32 bpp ? - x size
  428.         jz      dbpi24312
  429.         add     ecx, eax
  430.  
  431.   dbpi24312:
  432.  
  433.         mov     ebx, [esp+0]
  434.  
  435.     ; check limits ?
  436.  
  437.         push    eax
  438.         push    ecx
  439.         mov     eax, [TASK_BASE]
  440.         mov     ecx, [eax+draw_data-CURRENT_TASK+RECT.left]
  441.         cmp     ecx, 0
  442.         jnz     dbcblimitlset12
  443.         mov     ecx, [eax+draw_data-CURRENT_TASK+RECT.top]
  444.         cmp     ecx, 0
  445.         jnz     dbcblimitlset12
  446.         mov     ecx, [eax+draw_data-CURRENT_TASK+RECT.right]
  447.         cmp     ecx, [Screen_Max_X]
  448.         jnz     dbcblimitlset12
  449.         mov     ecx, [eax+draw_data-CURRENT_TASK+RECT.bottom]
  450.         cmp     ecx, [Screen_Max_Y]
  451.         jnz     dbcblimitlset12
  452.         pop     ecx
  453.         pop     eax
  454.         push    dword 0
  455.         jmp     dbcblimitlno12
  456.  
  457.   dbcblimitlset12:
  458.  
  459.         pop     ecx
  460.         pop     eax
  461.         push    dword 1
  462.  
  463.   dbcblimitlno12:
  464.  
  465.         cmp     [ScreenBPP], byte 24; 24 or 32 bpp ?
  466.         jz      dbpi24bit12
  467.         jmp     dbpi32bit12
  468.  
  469.  
  470. ; DRAWBAR 24 BBP
  471.  
  472.  
  473. dbpi24bit12:
  474.  
  475.         push    eax
  476.         push    ebx
  477.         push    edx
  478.         mov     eax, ecx
  479.         mov     ebx, 3
  480.         div     ebx
  481.         mov     ecx, eax
  482.         pop     edx
  483.         pop     ebx
  484.         pop     eax
  485.         cld
  486.  
  487.   dbnewpi12:
  488.  
  489.         push    ebx
  490.         push    edi
  491.         push    ecx
  492.  
  493.         xor     edx, edx
  494.         mov     eax, edi
  495.         sub     eax, VGABasePtr
  496.         mov     ebx, 3
  497.         div     ebx
  498.         add     eax, [_WinMapAddress]
  499.         mov     ebx, [CURRENT_TASK]
  500.         cld
  501.  
  502.       dbnp2412:
  503.  
  504.         mov     dl, [eax]
  505.         push    eax
  506.         push    ecx
  507.         cmp     dl, bl
  508.         jnz     dbimp24no12
  509.         cmp     [esp+5*4], dword 0
  510.         jz      dbimp24yes12
  511. ;        call dbcplimit
  512. ;        jnz  dbimp24no12
  513.  
  514.      dbimp24yes12:
  515.  
  516.         push    edi
  517.         mov     eax, edi
  518.         sub     eax, VGABasePtr
  519.         shr     eax, 16
  520.         call    set_bank
  521.         and     edi, 0xffff
  522.         add     edi, VGABasePtr
  523.         mov     eax, [esp+8+3*4+16+4+4]
  524.         stosw
  525.         shr     eax, 16
  526.         stosb
  527.         sti
  528.         pop     edi
  529.         add     edi, 3
  530.         pop     ecx
  531.         pop     eax
  532.         inc     eax
  533.         loop    dbnp2412
  534.         jmp     dbnp24d12
  535.  
  536.       dbimp24no12:
  537.  
  538.         pop     ecx
  539.         pop     eax
  540.         cld
  541.         add     edi, 3
  542.         inc     eax
  543.         loop    dbnp2412
  544.  
  545.       dbnp24d12:
  546.  
  547.         mov     eax, [esp+3*4+16+4]
  548.         test    eax, 0x80000000
  549.         jz      nodbgl2412
  550.         cmp     al, 0
  551.         jz      nodbgl2412
  552.         dec     eax
  553.         mov     [esp+3*4+16+4], eax
  554.  
  555.       nodbgl2412:
  556.  
  557.         pop     ecx
  558.         pop     edi
  559.         pop     ebx
  560.         add     edi, [BytesPerScanLine]
  561.         dec     ebx
  562.         jz      dbnonewpi12
  563.         jmp     dbnewpi12
  564.  
  565.   dbnonewpi12:
  566.  
  567.         add     esp, 7*4
  568.  
  569.         ret
  570.  
  571.  
  572. ; DRAWBAR 32 BBP
  573.  
  574.  
  575.   dbpi32bit12:
  576.  
  577.         cld
  578.         shr     ecx, 2
  579.  
  580.    dbnewpi3212:
  581.  
  582.         push    ebx
  583.         push    edi
  584.         push    ecx
  585.  
  586.         mov     eax, edi
  587.         sub     eax, VGABasePtr
  588.         shr     eax, 2
  589.         add     eax, [_WinMapAddress]
  590.         mov     ebx, [CURRENT_TASK]
  591.         cld
  592.  
  593.       dbnp3212:
  594.  
  595.         mov     dl, [eax]
  596.         push    eax
  597.         push    ecx
  598.         cmp     dl, bl
  599.         jnz     dbimp32no12
  600.         cmp     [esp+5*4], dword 0
  601.         jz      dbimp32yes12
  602. ;        call dbcplimit
  603. ;        jnz  dbimp32no12
  604.  
  605.       dbimp32yes12:
  606.  
  607.         push    edi
  608.         mov     eax, edi
  609.         sub     eax, VGABasePtr
  610.         shr     eax, 16
  611.         call    set_bank
  612.         and     edi, 0xffff
  613.         add     edi, VGABasePtr
  614.         mov     eax, [esp+8+3*4+16+4+4]
  615.         stosw
  616.         shr     eax, 16
  617.         stosb
  618.         sti
  619.         pop     edi
  620.         add     edi, 4
  621.         inc     ebp
  622.         pop     ecx
  623.         pop     eax
  624.         inc     eax
  625.         loop    dbnp3212
  626.         jmp     dbnp32d12
  627.  
  628.       dbimp32no12:
  629.  
  630.         pop     ecx
  631.         pop     eax
  632.         inc     eax
  633.         add     edi, 4
  634.         inc     ebp
  635.         loop    dbnp3212
  636.  
  637.       dbnp32d12:
  638.  
  639.         mov     eax, [esp+12+16+4]
  640.         test    eax, 0x80000000
  641.         jz      nodbgl3212
  642.         cmp     al, 0
  643.         jz      nodbgl3212
  644.         dec     eax
  645.         mov     [esp+12+16+4], eax
  646.  
  647.       nodbgl3212:
  648.  
  649.         pop     ecx
  650.         pop     edi
  651.         pop     ebx
  652.         add     edi, [BytesPerScanLine]
  653.         dec     ebx
  654.         jz      nodbnewpi3212
  655.         jmp     dbnewpi3212
  656.  
  657.   nodbnewpi3212:
  658.  
  659.         add     esp, 7*4
  660.         ret
  661.  
  662.  
  663. Vesa12_putpixel24:
  664.  
  665.         mov     edi, eax; x
  666.         mov     eax, ebx; y
  667.         lea     edi, [edi+edi*2]
  668.         mov     ebx, [BytesPerScanLine]
  669.         mul     ebx
  670.         add     edi, eax
  671.         mov     eax, edi
  672.         shr     eax, 16
  673.         call    set_bank
  674.         and     edi, 65535
  675.         add     edi, VGABasePtr
  676.         mov     eax, [esp+28]
  677.         stosw
  678.         shr     eax, 16
  679.         mov     [edi], al
  680.         sti
  681.         ret
  682.  
  683.  
  684.  
  685. Vesa12_putpixel32:
  686.  
  687.         mov     edi, eax; x
  688.         mov     eax, ebx; y
  689.         shl     edi, 2
  690.         mov     ebx, [BytesPerScanLine]
  691.         mul     ebx
  692.         add     edi, eax
  693.         mov     eax, edi
  694.         shr     eax, 16
  695.         call    set_bank
  696.         and     edi, 65535
  697.         add     edi, VGABasePtr
  698.         mov     ecx, [esp+28]
  699.         mov     [edi], ecx
  700.         sti
  701.         ret
  702.  
  703.  
  704. Vesa12_getpixel24:
  705.  
  706.         mov     edi, eax; x
  707.         mov     eax, ebx; y
  708.         lea     edi, [edi+edi*2]
  709.         mov     ebx, [BytesPerScanLine]
  710.         mul     ebx
  711.         add     edi, eax
  712.         mov     eax, edi
  713.         shr     eax, 16
  714.         call    set_bank
  715.         and     edi, 65535
  716.         add     edi, VGABasePtr
  717.         mov     ecx, [edi]
  718.         and     ecx, 255*256*256+255*256+255
  719.         sti
  720.         ret
  721.  
  722.  
  723. Vesa12_getpixel32:
  724.  
  725.         mov     edi, eax; x
  726.         mov     eax, ebx; y
  727.         shl     edi, 2
  728.         mov     ebx, [BytesPerScanLine]
  729.         xor     edx, edx
  730.         mul     ebx
  731.         add     edi, eax
  732.         mov     eax, edi
  733.         shr     eax, 16
  734.         call    set_bank
  735.         and     edi, 65535
  736.         add     edi, VGABasePtr
  737.         mov     ecx, [edi]
  738.         and     ecx, 255*256*256+255*256+255
  739.         sti
  740.  
  741.         ret
  742.  
  743.  
  744.  
  745. vesa12_putimage:
  746. ; ebx = pointer to image
  747. ; ecx = size [x|y]
  748. ; edx = coordinates [x|y]
  749. ; ebp = pointer to 'get' function
  750. ; esi = pointer to 'init' function
  751. ; edi = parameter for 'get' function
  752.  
  753. ;    mov  ebx,image
  754. ;    mov  ecx,320*65536+240
  755. ;    mov  edx,20*65536+20
  756.  
  757.         call    [_display.disable_mouse]
  758.  
  759.         mov     [novesachecksum], dword 0
  760.         push    esi
  761.         push    edi
  762.         push    eax
  763.         push    ebx
  764.         push    ecx
  765.         push    edx
  766.         movzx   eax, word [esp+2]
  767.         movzx   ebx, word [esp+0]
  768.         mov     ecx, [TASK_BASE]
  769.         add     eax, [ecx-twdw+WDATA.box.left]
  770.         add     ebx, [ecx-twdw+WDATA.box.top]
  771.         push    eax
  772.         mov     eax, ebx  ; y
  773.         mul     dword [BytesPerScanLine]
  774.         pop     ecx
  775.         add     eax, ecx  ; x
  776.         add     eax, ecx
  777.         add     eax, ecx
  778.         cmp     [ScreenBPP], byte 24; 24 or 32 bpp ? - x start
  779.         jz      pi2412
  780.         add     eax, ecx
  781.  
  782.   pi2412:
  783.  
  784.         add     eax, VGABasePtr
  785.         mov     edi, eax
  786.  
  787.     ; x size
  788.  
  789.         movzx   ecx, word [esp+6]
  790.  
  791.         mov     esi, [esp+8]
  792.         movzx   ebx, word [esp+4]
  793.  
  794.     ; check limits while draw ?
  795.  
  796.         push    ecx
  797.         mov     eax, [TASK_BASE]
  798.         cmp     dword [eax+draw_data-CURRENT_TASK+RECT.left], 0
  799.         jnz     dbcblimitlset212
  800.         cmp     dword [eax+draw_data-CURRENT_TASK+RECT.top], 0
  801.         jnz     dbcblimitlset212
  802.         mov     ecx, [eax+draw_data-CURRENT_TASK+RECT.right]
  803.         cmp     ecx, [Screen_Max_X]
  804.         jnz     dbcblimitlset212
  805.         mov     ecx, [eax+draw_data-CURRENT_TASK+RECT.bottom]
  806.         cmp     ecx, [Screen_Max_Y]
  807.         jnz     dbcblimitlset212
  808.         pop     ecx
  809.         push    0
  810.         jmp     dbcblimitlno212
  811.  
  812.   dbcblimitlset212:
  813.  
  814.         pop     ecx
  815.         push    1
  816.  
  817.   dbcblimitlno212:
  818.  
  819.         cmp     [ScreenBPP], byte 24; 24 or 32 bpp ?
  820.         jnz     pi32bit12
  821.  
  822.   pi24bit12:
  823.  
  824.   newpi12:
  825.  
  826.         push    edi
  827.         push    ecx
  828.         push    ebx
  829.  
  830.         mov     edx, edi
  831.         sub     edx, VGABasePtr
  832.         mov     ebx, 3
  833.         div     ebx
  834.         add     edx, [_WinMapAddress]
  835.         mov     ebx, [CURRENT_TASK]
  836.         mov     bh, [esp+4*3]
  837.  
  838.       np2412:
  839.  
  840.         cmp     bl, [edx]
  841.         jnz     imp24no12
  842. ;        mov  eax,[esi]
  843.         push    dword [esp+4*3+20]
  844.         call    ebp
  845. ;        cmp  bh,0
  846. ;        jz   imp24yes12
  847. ;        call dbcplimit
  848. ;        jnz  imp24no12
  849.  
  850.      imp24yes12:
  851.  
  852.         push    edi
  853.         push    eax
  854.         mov     eax, edi
  855.         sub     eax, VGABasePtr
  856.         shr     eax, 16
  857.         call    set_bank
  858.         pop     eax
  859.         and     edi, 0xffff
  860.         add     edi, VGABasePtr
  861.         mov     [edi], ax
  862.         shr     eax, 16
  863.         mov     [edi+2], al
  864.         pop     edi
  865.  
  866.      imp24no12:
  867.  
  868.         inc     edx
  869. ;        add  esi,3
  870.         add     edi, 3
  871.         dec     ecx
  872.         jnz     np2412
  873.  
  874.       np24d12:
  875.  
  876.         pop     ebx
  877.         pop     ecx
  878.         pop     edi
  879.  
  880.         add     edi, [BytesPerScanLine]
  881.         add     esi, [esp+32]
  882.         cmp     ebp, putimage_get1bpp
  883.         jz      .correct
  884.         cmp     ebp, putimage_get2bpp
  885.         jz      .correct
  886.         cmp     ebp, putimage_get4bpp
  887.         jnz     @f
  888. .correct:
  889.         mov     eax, [esp+20]
  890.         mov     byte[eax], 80h
  891. @@:
  892.         dec     ebx
  893.         jnz     newpi12
  894.  
  895.   nonewpi12:
  896.  
  897.         pop     eax edx ecx ebx eax edi esi
  898.         xor     eax, eax
  899.         ret
  900.  
  901.  
  902.   pi32bit12:
  903.  
  904.    newpi3212:
  905.  
  906.         push    edi
  907.         push    ecx
  908.         push    ebx
  909.  
  910.         mov     edx, edi
  911.         sub     edx, VGABasePtr
  912.         shr     edx, 2
  913.         add     edx, [_WinMapAddress]
  914.         mov     ebx, [CURRENT_TASK]
  915.         mov     bh, [esp+4*3]
  916.  
  917.       np3212:
  918.  
  919.         cmp     bl, [edx]
  920.         jnz     imp32no12
  921. ;        mov  eax,[esi]
  922.         push    dword [esp+4*3+20]
  923.         call    ebp
  924. ;        cmp  bh,0
  925. ;        jz   imp32yes12
  926. ;        call dbcplimit
  927. ;        jnz  imp32no12
  928.  
  929.       imp32yes12:
  930.  
  931.         push    edi
  932.         push    eax
  933.         mov     eax, edi
  934.         sub     eax, VGABasePtr
  935.         shr     eax, 16
  936.         call    set_bank
  937.         pop     eax
  938.         and     edi, 0xffff
  939.         mov     [edi+VGABasePtr], eax
  940.         pop     edi
  941.  
  942.       imp32no12:
  943.  
  944.         inc     edx
  945. ;        add  esi,3
  946.         add     edi, 4
  947.         dec     ecx
  948.         jnz     np3212
  949.  
  950.       np32d12:
  951.  
  952.         pop     ebx
  953.         pop     ecx
  954.         pop     edi
  955.  
  956.         add     edi, [BytesPerScanLine]
  957.         cmp     ebp, putimage_get1bpp
  958.         jz      .correct
  959.         cmp     ebp, putimage_get2bpp
  960.         jz      .correct
  961.         cmp     ebp, putimage_get4bpp
  962.         jnz     @f
  963. .correct:
  964.         mov     eax, [esp+20]
  965.         mov     byte[eax], 80h
  966. @@:
  967.         dec     ebx
  968.         jnz     newpi3212
  969.  
  970.   nonewpi3212:
  971.  
  972.         pop     eax edx ecx ebx eax edi esi
  973.         xor     eax, eax
  974.         ret
  975.  
  976.  
  977. vesa12_read_screen_pixel:
  978.  
  979.         and     eax, 0x3FFFFF
  980.         cmp     [ScreenBPP], byte 24; 24 or 32 bpp ?
  981.         jz      v12rsp24
  982.         mov     edi, eax
  983.         shl     edi, 2
  984.         mov     eax, edi
  985.         shr     eax, 16
  986.         call    set_bank
  987.         and     edi, 65535
  988.         add     edi, VGABasePtr
  989.         mov     eax, [edi]
  990.         and     eax, 0x00ffffff
  991.         ret
  992.   v12rsp24:
  993.  
  994.         imul    eax, 3
  995.         mov     edi, eax
  996.         shr     eax, 16
  997.         call    set_bank
  998.         and     edi, 65535
  999.         add     edi, VGABasePtr
  1000.         mov     eax, [edi]
  1001.         and     eax, 0x00ffffff
  1002.         ret
  1003.  
  1004.  
  1005.