Subversion Repositories Kolibri OS

Rev

Rev 983 | Rev 1322 | 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. ;;  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: 1300 $
  19.  
  20.  
  21. TRIDENT       equ 0
  22. S3_VIDEO      equ 0
  23. INTEL_VIDEO   equ 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.         mov   edi,0 ;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.