Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2024. 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.  
  19. TRIDENT       = 0
  20. S3_VIDEO      = 0
  21. INTEL_VIDEO   = 0
  22.  
  23. if TRIDENT
  24.   if S3_VIDEO or INTEL_VIDEO
  25.     stop
  26.   end if
  27. end if
  28.  
  29. if S3_VIDEO
  30.   if TRIDENT or INTEL_VIDEO
  31.     stop
  32.   end if
  33. end if
  34.  
  35. if INTEL_VIDEO
  36.   if S3_VIDEO or TRIDENT
  37.     stop
  38.   end if
  39. end if
  40.  
  41.  
  42. ; A complete video driver should include the following types of function
  43. ;
  44. ; Putpixel
  45. ; Getpixel
  46. ;
  47. ; Drawimage
  48. ; Drawbar
  49. ;
  50. ; Drawbackground
  51. ;
  52. ;
  53. ; Modifying the set_bank -function is mostly enough
  54. ; for different Vesa 1.2 setups.
  55.  
  56. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  57. ; set_bank for Trident videocards, work on Trident 9440
  58. ; modified by Mario79
  59.  
  60. if TRIDENT
  61. set_bank:
  62.         pushfd
  63.         cli
  64.         cmp     al, [BANK_RW]
  65.         je      .retsb
  66.  
  67.         mov     [BANK_RW], al
  68.         push    dx
  69.         mov     dx, 3D8h
  70.         out     dx, al
  71.         pop     dx
  72. .retsb:
  73.         popfd
  74.         ret
  75. end if
  76.  
  77. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  78. ; set_bank for S3 videocards, work on S3 ViRGE PCI (325)
  79. ; modified by kmeaw
  80.  
  81. if S3_VIDEO
  82. set_bank:
  83.         pushfd
  84.         cli
  85.         cmp     al, [BANK_RW]
  86.         je      .retsb
  87.  
  88.         mov     [BANK_RW], al
  89.         push    ax
  90.         push    dx
  91.         push    cx
  92.         mov     cl, al
  93.         mov     dx, 0x3D4
  94.         mov     al, 0x38
  95.         out     dx, al    ;CR38 Register Lock 1 ;Note: Traditionally 48h is used to
  96.                           ;unlock and 00h to lock
  97.         inc     dx
  98.         mov     al, 0x48
  99.         out     dx, al    ;3d5 -?
  100.         dec     dx
  101.         mov     al, 0x31
  102.         out     dx, al    ;CR31 Memory Configuration Register
  103. ;0  Enable Base Address Offset (CPUA BASE). Enables bank operation if set, ;disables if clear.
  104. ;4-5  Bit 16-17 of the Display Start Address. For the 801/5,928 see index 51h,
  105. ;for the 864/964 see index 69h.
  106.  
  107.         inc     dx
  108.         in      al, dx
  109.         dec     dx
  110.         mov     ah, al
  111.         mov     al, 0x31
  112.         out     dx, ax
  113.         mov     al, ah
  114.         or      al, 9
  115.         inc     dx
  116.         out     dx, al
  117.         dec     dx
  118.         mov     al, 0x35
  119.         out     dx, al  ;CR35 CRT Register Lock
  120.         inc     dx
  121.         in      al, dx
  122.         dec     dx
  123.         and     al, 0xF0
  124.         mov     ch, cl
  125.         and     ch, 0x0F
  126.         or      ch, al
  127.         mov     al, 0x35
  128.         out     dx, al
  129.         inc     dx
  130.         mov     al, ch
  131.         out     dx, ax
  132.         dec     dx
  133.         mov     al, 0x51 ;Extended System Control 2 Register
  134.         out     dx, al
  135.         inc     dx
  136.         in      al, dx
  137.         dec     dx
  138.         and     al, 0xF3
  139.         shr     cl, 2
  140.         and     cl, 0x0C
  141.         or      cl, al
  142.         mov     al, 0x51
  143.         out     dx, al
  144.         inc     dx
  145.         mov     al, cl
  146.         out     dx, al
  147.         dec     dx
  148.         mov     al, 0x38
  149.         out     dx, al
  150.         inc     dx
  151.         xor     al, al
  152.         out     dx, al
  153.         dec     dx
  154.         pop     cx
  155.         pop     dx
  156.         pop     ax
  157. .retsb:
  158.         popfd
  159.         ret
  160. end if
  161.  
  162. ;Set bank function for Intel 810/815 chipsets
  163. ; *****Modified by Protopopius, Russia.*****
  164. ; ********* http://menuetos.hut.ru **************
  165. ; ************************************************
  166.  
  167. if INTEL_VIDEO
  168.  
  169. set_bank:
  170.         pushfd
  171.         cli
  172.  
  173.         cmp     al, [BANK_RW]
  174.         je      .retsb
  175.  
  176.         mov     [BANK_RW], al
  177.         push    ax
  178.         push    dx
  179.         mov     dx, 3CEh
  180.         mov     ah, al          ; Save value for later use
  181.         mov     al, 10h         ; Index GR10 (Address Mapping)
  182.         out     dx, al          ; Select GR10
  183.         inc     dl
  184.         mov     al, 3           ; Set bits 0 and 1 (Enable linear page mapping)
  185.         out     dx, al          ; Write value
  186.         dec     dl
  187.         mov     al, 11h         ; Index GR11 (Page Selector)
  188.         out     dx, al          ; Select GR11
  189.         inc     dl
  190.         mov     al, ah          ; Write address
  191.         out     dx, al          ; Write the value
  192.         pop     dx
  193.         pop     ax
  194. .retsb:
  195.         popfd
  196.         ret
  197. end if
  198.  
  199. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
  200.  
  201. if (TRIDENT or S3_VIDEO or INTEL_VIDEO)
  202. else
  203. set_bank:
  204.         pushfd
  205.         cli
  206.  
  207.         cmp     al, [BANK_RW]
  208.         je      .retsb
  209.  
  210.         mov     [BANK_RW], al
  211.         push    ax
  212.         push    dx
  213.         mov     ah, al
  214.         mov     dx, 0x03D4
  215.         mov     al, 0x39
  216.         out     dx, al
  217.         inc     dl
  218.         mov     al, 0xA5
  219.         out     dx, al
  220.         dec     dl
  221.         mov     al, 6Ah
  222.         out     dx, al
  223.         inc     dl
  224.         mov     al, ah
  225.         out     dx, al
  226.         dec     dl
  227.         mov     al, 0x39
  228.         out     dx, al
  229.         inc     dl
  230.         mov     al, 0x5A
  231.         out     dx, al
  232.         dec     dl
  233.         pop     dx
  234.         pop     ax
  235.  
  236. .retsb:
  237.         popfd
  238.         ret
  239. end if
  240.  
  241. vesa12_drawbackground:
  242.  
  243.         call    [_display.disable_mouse]
  244.  
  245.         push    eax
  246.         push    ebx
  247.         push    ecx
  248.         push    edx
  249.  
  250.         xor     edx, edx
  251.         mov     eax, dword[BgrDataWidth]
  252.         mov     ebx, dword[BgrDataHeight]
  253.         mul     ebx
  254.         mov     ebx, 3
  255.         mul     ebx
  256.         mov     [imax], eax
  257.         mov     eax, [background_window + WDATA.draw_data.left]
  258.         mov     ebx, [background_window + WDATA.draw_data.top]
  259.         xor     edi, edi;no force
  260.  
  261.       v12dp3:
  262.  
  263.         push    eax
  264.         push    ebx
  265.  
  266.         cmp     [BgrDrawMode], dword 1  ; tiled background
  267.         jne     no_vesa12_tiled_bgr
  268.  
  269.         push    edx
  270.  
  271.         xor     edx, edx
  272.         div     dword [BgrDataWidth]
  273.  
  274.         push    edx
  275.         mov     eax, ebx
  276.         xor     edx, edx
  277.         div     dword [BgrDataHeight]
  278.         mov     ebx, edx
  279.         pop     eax
  280.  
  281.         pop     edx
  282.  
  283.       no_vesa12_tiled_bgr:
  284.  
  285.         cmp     [BgrDrawMode], dword 2  ; stretched background
  286.         jne     no_vesa12_stretched_bgr
  287.  
  288.         push    edx
  289.  
  290.         mul     dword [BgrDataWidth]
  291.         mov     ecx, [Screen_Max_X]
  292.         inc     ecx
  293.         div     ecx
  294.  
  295.         push    eax
  296.         mov     eax, ebx
  297.         mul     dword [BgrDataHeight]
  298.         mov     ecx, [Screen_Max_Y]
  299.         inc     ecx
  300.         div     ecx
  301.         mov     ebx, eax
  302.         pop     eax
  303.  
  304.         pop     edx
  305.  
  306.       no_vesa12_stretched_bgr:
  307.  
  308.  
  309.         mov     esi, ebx
  310.         imul    esi, dword [BgrDataWidth]
  311.         add     esi, eax
  312.         lea     esi, [esi*3]
  313.         add     esi, [img_background];IMG_BACKGROUND
  314.         pop     ebx
  315.         pop     eax
  316.  
  317.       v12di4:
  318.  
  319.         mov     cl, [esi+2]
  320.         shl     ecx, 16
  321.         mov     cx, [esi]
  322.         pusha
  323.         mov     esi, eax
  324.         mov     edi, ebx
  325.         mov     eax, [Screen_Max_X]
  326.         add     eax, 1
  327.         mul     ebx
  328.         add     eax, [_WinMapAddress]
  329.         cmp     [eax+esi], byte 1
  330.         jnz     v12nbgp
  331.         mov     eax, [BytesPerScanLine]
  332.         mov     ebx, edi
  333.         mul     ebx
  334.         add     eax, esi
  335.         lea     eax, [VGABasePtr+eax+esi*2]
  336.         cmp     [ScreenBPP], byte 24
  337.         jz      v12bgl3
  338.         add     eax, esi
  339.  
  340.       v12bgl3:
  341.  
  342.         push    ebx
  343.         push    eax
  344.  
  345.         sub     eax, VGABasePtr
  346.  
  347.         shr     eax, 16
  348.         call    set_bank
  349.         pop     eax
  350.         and     eax, 65535
  351.         add     eax, VGABasePtr
  352.         pop     ebx
  353.  
  354.         mov     [eax], cx
  355.         add     eax, 2
  356.         shr     ecx, 16
  357.         mov     [eax], cl
  358.         sti
  359.  
  360.       v12nbgp:
  361.  
  362.         popa
  363.         add     esi, 3
  364.         inc     eax
  365.         cmp     eax, [draw_data+32+RECT.right]
  366.         jg      v12nodp31
  367.         jmp     v12dp3
  368.  
  369.       v12nodp31:
  370.  
  371.         mov     eax, [draw_data+32+RECT.left]
  372.         inc     ebx
  373.         cmp     ebx, [draw_data+32+RECT.bottom]
  374.         jg      v12dp4
  375.         jmp     v12dp3
  376.  
  377.       v12dp4:
  378.  
  379.         pop     edx
  380.         pop     ecx
  381.         pop     ebx
  382.         pop     eax
  383.         ret
  384.  
  385.  
  386. vesa12_drawbar:
  387.  
  388.         call    [_display.disable_mouse]
  389.  
  390. ;;    mov  [novesachecksum],dword 0
  391.         sub     edx, ebx
  392.         sub     ecx, eax
  393.         push    esi
  394.         push    edi
  395.         push    eax
  396.         push    ebx
  397.         push    ecx
  398.         push    edx
  399.         mov     ecx, [current_slot_idx]
  400.         shl     ecx, 5
  401.         add     eax, [ecx + window_data + WDATA.box.left]
  402.         add     ebx, [ecx + window_data + WDATA.box.top]
  403.         push    eax
  404.         mov     eax, ebx ; y
  405.         mov     ebx, [BytesPerScanLine]
  406.         mul     ebx
  407.         pop     ecx
  408.         add     eax, ecx ; x
  409.         add     eax, ecx
  410.         add     eax, ecx
  411.         cmp     [ScreenBPP], byte 24; 24 or 32 bpp ? - x start
  412.         jz      dbpi2412
  413.         add     eax, ecx
  414.  
  415.   dbpi2412:
  416.  
  417.         add     eax, VGABasePtr
  418.         mov     edi, eax
  419.  
  420.     ; x size
  421.  
  422.         mov     eax, [esp+4]; [esp+6]
  423.         mov     ecx, eax
  424.         add     ecx, eax
  425.         add     ecx, eax
  426.         cmp     [ScreenBPP], byte 24; 24 or 32 bpp ? - x size
  427.         jz      dbpi24312
  428.         add     ecx, eax
  429.  
  430.   dbpi24312:
  431.  
  432.         mov     ebx, [esp+0]
  433.  
  434.     ; check limits ?
  435.  
  436.         push    eax
  437.         push    ecx
  438.         mov     eax, [TASK_BASE]
  439.         mov     ecx, [eax+draw_data-CURRENT_TASK+RECT.left]
  440.         cmp     ecx, 0
  441.         jnz     dbcblimitlset12
  442.         mov     ecx, [eax+draw_data-CURRENT_TASK+RECT.top]
  443.         cmp     ecx, 0
  444.         jnz     dbcblimitlset12
  445.         mov     ecx, [eax+draw_data-CURRENT_TASK+RECT.right]
  446.         cmp     ecx, [Screen_Max_X]
  447.         jnz     dbcblimitlset12
  448.         mov     ecx, [eax+draw_data-CURRENT_TASK+RECT.bottom]
  449.         cmp     ecx, [Screen_Max_Y]
  450.         jnz     dbcblimitlset12
  451.         pop     ecx
  452.         pop     eax
  453.         push    dword 0
  454.         jmp     dbcblimitlno12
  455.  
  456.   dbcblimitlset12:
  457.  
  458.         pop     ecx
  459.         pop     eax
  460.         push    dword 1
  461.  
  462.   dbcblimitlno12:
  463.  
  464.         cmp     [ScreenBPP], byte 24; 24 or 32 bpp ?
  465.         jz      dbpi24bit12
  466.         jmp     dbpi32bit12
  467.  
  468.  
  469. ; DRAWBAR 24 BBP
  470.  
  471.  
  472. dbpi24bit12:
  473.  
  474.         push    eax
  475.         push    ebx
  476.         push    edx
  477.         mov     eax, ecx
  478.         mov     ebx, 3
  479.         div     ebx
  480.         mov     ecx, eax
  481.         pop     edx
  482.         pop     ebx
  483.         pop     eax
  484.         cld
  485.  
  486.   dbnewpi12:
  487.  
  488.         push    ebx
  489.         push    edi
  490.         push    ecx
  491.  
  492.         xor     edx, edx
  493.         mov     eax, edi
  494.         sub     eax, VGABasePtr
  495.         mov     ebx, 3
  496.         div     ebx
  497.         add     eax, [_WinMapAddress]
  498.         mov     ebx, [CURRENT_TASK]
  499.         cld
  500.  
  501.       dbnp2412:
  502.  
  503.         mov     dl, [eax]
  504.         push    eax
  505.         push    ecx
  506.         cmp     dl, bl
  507.         jnz     dbimp24no12
  508.         cmp     [esp+5*4], dword 0
  509.         jz      dbimp24yes12
  510. ;        call dbcplimit
  511. ;        jnz  dbimp24no12
  512.  
  513.      dbimp24yes12:
  514.  
  515.         push    edi
  516.         mov     eax, edi
  517.         sub     eax, VGABasePtr
  518.         shr     eax, 16
  519.         call    set_bank
  520.         and     edi, 0xffff
  521.         add     edi, VGABasePtr
  522.         mov     eax, [esp+8+3*4+16+4+4]
  523.         stosw
  524.         shr     eax, 16
  525.         stosb
  526.         sti
  527.         pop     edi
  528.         add     edi, 3
  529.         pop     ecx
  530.         pop     eax
  531.         inc     eax
  532.         loop    dbnp2412
  533.         jmp     dbnp24d12
  534.  
  535.       dbimp24no12:
  536.  
  537.         pop     ecx
  538.         pop     eax
  539.         cld
  540.         add     edi, 3
  541.         inc     eax
  542.         loop    dbnp2412
  543.  
  544.       dbnp24d12:
  545.  
  546.         mov     eax, [esp+3*4+16+4]
  547.         test    eax, 0x80000000
  548.         jz      nodbgl2412
  549.         cmp     al, 0
  550.         jz      nodbgl2412
  551.         dec     eax
  552.         mov     [esp+3*4+16+4], eax
  553.  
  554.       nodbgl2412:
  555.  
  556.         pop     ecx
  557.         pop     edi
  558.         pop     ebx
  559.         add     edi, [BytesPerScanLine]
  560.         dec     ebx
  561.         jz      dbnonewpi12
  562.         jmp     dbnewpi12
  563.  
  564.   dbnonewpi12:
  565.  
  566.         add     esp, 7*4
  567.  
  568.         ret
  569.  
  570.  
  571. ; DRAWBAR 32 BBP
  572.  
  573.  
  574.   dbpi32bit12:
  575.  
  576.         cld
  577.         shr     ecx, 2
  578.  
  579.    dbnewpi3212:
  580.  
  581.         push    ebx
  582.         push    edi
  583.         push    ecx
  584.  
  585.         mov     eax, edi
  586.         sub     eax, VGABasePtr
  587.         shr     eax, 2
  588.         add     eax, [_WinMapAddress]
  589.         mov     ebx, [CURRENT_TASK]
  590.         cld
  591.  
  592.       dbnp3212:
  593.  
  594.         mov     dl, [eax]
  595.         push    eax
  596.         push    ecx
  597.         cmp     dl, bl
  598.         jnz     dbimp32no12
  599.         cmp     [esp+5*4], dword 0
  600.         jz      dbimp32yes12
  601. ;        call dbcplimit
  602. ;        jnz  dbimp32no12
  603.  
  604.       dbimp32yes12:
  605.  
  606.         push    edi
  607.         mov     eax, edi
  608.         sub     eax, VGABasePtr
  609.         shr     eax, 16
  610.         call    set_bank
  611.         and     edi, 0xffff
  612.         add     edi, VGABasePtr
  613.         mov     eax, [esp+8+3*4+16+4+4]
  614.         stosw
  615.         shr     eax, 16
  616.         stosb
  617.         sti
  618.         pop     edi
  619.         add     edi, 4
  620.         inc     ebp
  621.         pop     ecx
  622.         pop     eax
  623.         inc     eax
  624.         loop    dbnp3212
  625.         jmp     dbnp32d12
  626.  
  627.       dbimp32no12:
  628.  
  629.         pop     ecx
  630.         pop     eax
  631.         inc     eax
  632.         add     edi, 4
  633.         inc     ebp
  634.         loop    dbnp3212
  635.  
  636.       dbnp32d12:
  637.  
  638.         mov     eax, [esp+12+16+4]
  639.         test    eax, 0x80000000
  640.         jz      nodbgl3212
  641.         cmp     al, 0
  642.         jz      nodbgl3212
  643.         dec     eax
  644.         mov     [esp+12+16+4], eax
  645.  
  646.       nodbgl3212:
  647.  
  648.         pop     ecx
  649.         pop     edi
  650.         pop     ebx
  651.         add     edi, [BytesPerScanLine]
  652.         dec     ebx
  653.         jz      nodbnewpi3212
  654.         jmp     dbnewpi3212
  655.  
  656.   nodbnewpi3212:
  657.  
  658.         add     esp, 7*4
  659.         ret
  660.  
  661.  
  662. Vesa12_putpixel24:
  663.  
  664.         mov     edi, eax; x
  665.         mov     eax, ebx; y
  666.         lea     edi, [edi+edi*2]
  667.         mov     ebx, [BytesPerScanLine]
  668.         mul     ebx
  669.         add     edi, eax
  670.         mov     eax, edi
  671.         shr     eax, 16
  672.         call    set_bank
  673.         and     edi, 65535
  674.         add     edi, VGABasePtr
  675.         mov     eax, [esp+28]
  676.         stosw
  677.         shr     eax, 16
  678.         mov     [edi], al
  679.         sti
  680.         ret
  681.  
  682.  
  683.  
  684. Vesa12_putpixel32:
  685.  
  686.         mov     edi, eax; x
  687.         mov     eax, ebx; y
  688.         shl     edi, 2
  689.         mov     ebx, [BytesPerScanLine]
  690.         mul     ebx
  691.         add     edi, eax
  692.         mov     eax, edi
  693.         shr     eax, 16
  694.         call    set_bank
  695.         and     edi, 65535
  696.         add     edi, VGABasePtr
  697.         mov     ecx, [esp+28]
  698.         mov     [edi], ecx
  699.         sti
  700.         ret
  701.  
  702.  
  703. Vesa12_getpixel24:
  704.  
  705.         mov     edi, eax; x
  706.         mov     eax, ebx; y
  707.         lea     edi, [edi+edi*2]
  708.         mov     ebx, [BytesPerScanLine]
  709.         mul     ebx
  710.         add     edi, eax
  711.         mov     eax, edi
  712.         shr     eax, 16
  713.         call    set_bank
  714.         and     edi, 65535
  715.         add     edi, VGABasePtr
  716.         mov     ecx, [edi]
  717.         and     ecx, 255*256*256+255*256+255
  718.         sti
  719.         ret
  720.  
  721.  
  722. Vesa12_getpixel32:
  723.  
  724.         mov     edi, eax; x
  725.         mov     eax, ebx; y
  726.         shl     edi, 2
  727.         mov     ebx, [BytesPerScanLine]
  728.         xor     edx, edx
  729.         mul     ebx
  730.         add     edi, eax
  731.         mov     eax, edi
  732.         shr     eax, 16
  733.         call    set_bank
  734.         and     edi, 65535
  735.         add     edi, VGABasePtr
  736.         mov     ecx, [edi]
  737.         and     ecx, 255*256*256+255*256+255
  738.         sti
  739.  
  740.         ret
  741.  
  742.  
  743.  
  744. vesa12_putimage:
  745. ; ebx = pointer to image
  746. ; ecx = size [x|y]
  747. ; edx = coordinates [x|y]
  748. ; ebp = pointer to 'get' function
  749. ; esi = pointer to 'init' function
  750. ; edi = parameter for 'get' function
  751.  
  752. ;    mov  ebx,image
  753. ;    mov  ecx,320*65536+240
  754. ;    mov  edx,20*65536+20
  755.  
  756.         call    [_display.disable_mouse]
  757.  
  758.         mov     [novesachecksum], dword 0
  759.         push    esi
  760.         push    edi
  761.         push    eax
  762.         push    ebx
  763.         push    ecx
  764.         push    edx
  765.         movzx   eax, word [esp+2]
  766.         movzx   ebx, word [esp+0]
  767.         mov     ecx, [current_slot_idx]
  768.         shl     ecx, 5
  769.         add     eax, [ecx + window_data + WDATA.box.left]
  770.         add     ebx, [ecx + window_data + 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.