home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / 2d / vesa.asm < prev    next >
Assembly Source File  |  1998-06-08  |  21KB  |  1,029 lines

  1. ;THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  2. ;SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  3. ;END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  4. ;ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  5. ;IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  6. ;SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  7. ;FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  8. ;CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  9. ;AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  10. ;COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  11. ;
  12. ; $Source: f:/miner/source/2d/rcs/vesa.asm $
  13. ; $Revision: 1.20 $
  14. ; $Author: john $
  15. ; $Date: 1994/07/27 15:43:37 $
  16. ;
  17. ; Routines to access VESA VGA memory
  18. ;
  19. ; $Log: vesa.asm $
  20. ; Revision 1.20  1994/07/27  15:43:37  john
  21. ; Fixed bug with allocation dos memory more than once.
  22. ; Revision 1.19  1994/06/24  17:27:02  john
  23. ; Made rowsizes bigger than actual screen work with SVGA.
  24. ; Revision 1.18  1994/05/31  11:10:45  john
  25. ; *** empty log message ***
  26. ; Revision 1.17  1994/05/06  12:50:21  john
  27. ; Added supertransparency; neatend things up; took out warnings.
  28. ; Revision 1.16  1994/03/14  16:56:29  john
  29. ; Changed grs_bitmap structure to include bm_flags.
  30. ; Revision 1.15  1994/02/02  11:27:22  john
  31. ; *** empty log message ***
  32. ; Revision 1.14  1994/01/25  11:40:46  john
  33. ; Added gr_check_mode function.
  34. ; Revision 1.13  1994/01/13  14:41:51  unknown
  35. ; Fixed bug with Error 7 return Error 8.
  36. ; Revision 1.12  1993/12/21  19:58:38  john
  37. ; made rep movsb in scanline be rep movsw
  38. ; Revision 1.11  1993/12/09  16:05:51  john
  39. ; Made no VESA driver detection work correctly
  40. ; Revision 1.10  1993/12/09  15:02:41  john
  41. ; Changed palette stuff majorly
  42. ; Revision 1.9  1993/11/16  11:28:28  john
  43. ; *** empty log message ***
  44. ; Revision 1.8  1993/10/26  13:18:03  john
  45. ; *** empty log message ***
  46. ; Revision 1.7  1993/10/15  16:23:28  john
  47. ; y
  48. ; Revision 1.6  1993/09/29  17:31:10  john
  49. ; optimized gr_vesa_pixel
  50. ; Revision 1.5  1993/09/26  18:59:34  john
  51. ; fade stuff
  52. ; Revision 1.4  1993/09/20  14:47:20  john
  53. ; *** empty log message ***
  54. ; Revision 1.3  1993/09/13  17:54:07  john
  55. ; Minor bug fix
  56. ; Revision 1.2  1993/09/08  15:56:06  john
  57. ; Started adding DPMI support for SVGA paging.
  58. ; Revision 1.1  1993/09/08  11:41:25  john
  59. ; Initial revision
  60. ;
  61. ;
  62.  
  63. .386
  64.  
  65. OPTION OLDSTRUCTS
  66. INCLUDE VGAREGS.INC
  67. INCLUDE GR.INC
  68.  
  69. _DATA   SEGMENT BYTE PUBLIC USE32 'DATA'
  70.  
  71.         PUBLIC      __A0000
  72.         __A0000      dw  ?
  73.  
  74.         BufferPtr   dd  0
  75.         BufferSeg   dw  0
  76.         GoalMode    dw  ?
  77.         LastPage    db  0FFh
  78.  
  79.         BPR         dw  ?
  80.         TempReg     dd  ?
  81.  
  82.         ; Information from VESA return SuperVGA Information
  83.  
  84.         VESAVersion         dw  ?
  85.         OEMStringPtr        dd  ?
  86.         Capabilities        dd  ?
  87.         VideoModePtr        dd  ?
  88.         TotalMemory         dw  ?
  89.         WinGranularity      dw  ?
  90.         WinSize             dw  ?
  91.         WinFuncPtr          dd  ?
  92.         PageSizeShift       db  ?
  93.  
  94.         VESA_Signature      = 041534556h
  95.  
  96. REALREGS    STRUCT
  97.         RealEDI     dd      ?
  98.         RealESI     dd      ?
  99.         RealEBP     dd      ?
  100.         Reserved    dd      ?
  101.         RealEBX     dd      ?
  102.         RealEDX     dd      ?
  103.         RealECX     dd      ?
  104.         RealEAX     dd      ?
  105.         RealFlags   dw      ?
  106.         RealES      dw      ?
  107.         RealDS      dw      ?
  108.         RealFS      dw      ?
  109.         RealGS      dw      ?
  110.         RealIP      dw      ?
  111.         RealCS      dw      ?
  112.         RealSP      dw      ?
  113.         RealSS      dw      ?
  114. REALREGS    ENDS
  115.  
  116.         regs    REALREGS    < >
  117.  
  118.         vesa_error    dd    ?
  119.         SourceInc   dd  ?
  120.         DestInc     dw  ?
  121.         RowWidth    dd  ?
  122.  
  123.         extern _gr_var_color:dword, _gr_var_bwidth:dword
  124.  
  125.  
  126. _DATA   ENDS
  127.  
  128. DGROUP  GROUP _DATA
  129.  
  130.  
  131. _TEXT   SEGMENT BYTE PUBLIC USE32 'CODE'
  132.  
  133.         ASSUME  DS:_DATA
  134.         ASSUME  CS:_TEXT
  135.  
  136. MyStosd MACRO Width:REQ
  137. ; Assumes:   EDI = Dest Address
  138. ;            Width = a 32-bit value, can't be ECX or EDI
  139. ; Trashes:   ECX will be zero
  140. ;            EDI = Dest Address + Width
  141. ;            EDX = ????
  142. ;            Width
  143. LOCAL Aligned
  144.             cmp     Width, 16
  145.             jbe     Aligned
  146.             mov     ecx, edi
  147.             and     ecx, 3
  148.             jcxz    Aligned
  149.             neg     ecx
  150.             add     ecx, 4
  151.             sub     Width, ecx
  152.             rep     stosb
  153. Aligned:            mov     ecx, Width
  154.             shr     ecx, 2
  155.             rep     stosd
  156.             mov     ecx, Width
  157.             and     ecx, 3
  158.             rep     stosb
  159. ENDM
  160.  
  161.  
  162. ENTER_PROC  MACRO
  163.             push    esi
  164.             push    edi
  165.             push    ebp
  166.             push    eax
  167.             push    ebx
  168.             push    ecx
  169.             push    edx
  170. ENDM
  171.  
  172. EXIT_PROC   MACRO
  173.  
  174.             cmp     [esp-4], edx
  175.             je      @f
  176.             ; YOU TRASHED EDX !!!!!!!
  177.             int     3
  178. @@:         pop     edx
  179.  
  180.             cmp     [esp-4], ecx
  181.             je      @f
  182.             ; YOU TRASHED ECX !!!!!!!
  183.             int     3
  184. @@:         pop     ecx
  185.  
  186.             cmp     [esp-4], ebx
  187.             je      @f
  188.             ; YOU TRASHED EBX !!!!!!!
  189.             int     3
  190. @@:         pop     ebx
  191.  
  192.             cmp     [esp-4], eax
  193.             je      @f
  194.             ; YOU TRASHED EAX !!!!!!!
  195.             int     3
  196. @@:         pop     eax
  197.  
  198.             cmp     [esp-4], ebp
  199.             je      @f
  200.             ; YOU TRASHED EBP !!!!!!!
  201.             int     3
  202. @@:         pop     ebp
  203.  
  204.             cmp     [esp-4], edi
  205.             je      @f
  206.             ; YOU TRASHED EDI !!!!!!!
  207.             int     3
  208. @@:         pop     edi
  209.  
  210.             cmp     [esp-4], esi
  211.             je      @f
  212.             ; YOU TRASHED ESI !!!!!!!
  213.             int     3
  214. @@:         pop     esi
  215.  
  216. ENDM
  217.  
  218.  
  219. MyMovsd MACRO Width:REQ
  220. ; Assumes:   EDI = Dest Address
  221. ;            ESI = Source Address
  222. ;            Width = a 32-bit value, can't be ECX or EDI or ESI
  223. ;            Assumes that ESI is already aligned
  224. ; Trashes:   ECX will be zero
  225. ;            EDI = Dest Address + Width
  226. ;            ESI = Source Address + Width
  227. ;            EDX = ????
  228. LOCAL Aligned
  229.             cmp     Width, 16
  230.             jbe     Aligned
  231.             mov     ecx, edi
  232.             and     ecx, 3
  233.             jcxz    Aligned
  234.             neg     ecx
  235.             add     ecx, 4
  236.             sub     Width, ecx
  237.             rep     movsb
  238. Aligned:    mov     ecx, Width
  239.             shr     ecx, 2
  240.             rep     movsd
  241.             mov     ecx, Width
  242.             and     ecx, 3
  243.             rep     movsb
  244. ENDM
  245.  
  246.  
  247. EBXFarTo32:
  248.             push    ecx
  249.             mov     ecx, ebx
  250.             and     ecx, 0FFFF0000h
  251.             shr     ecx, 12
  252.             and     ebx, 0FFFFh
  253.             add     ebx, ecx
  254.             pop     ecx
  255.             ret
  256.  
  257. PUBLIC  gr_init_A0000_
  258.  
  259. gr_init_A0000_:
  260.  
  261.             push    ebx
  262.             mov     ax, 0002h
  263.             mov     bx, 0a000h
  264.             int     31h
  265.             jc      NoGo
  266.             mov     __A0000, ax
  267.             pop     ebx
  268.             xor     eax, eax
  269.             ret
  270. NoGo:       pop     ebx
  271.             mov     eax, 1
  272.             ret
  273.  
  274. PUBLIC  gr_vesa_checkmode_
  275.  
  276. gr_vesa_checkmode_:
  277.             pushad
  278.  
  279.             mov     GoalMode, ax
  280.             cmp     BufferSeg, 0
  281.             jne    GotDosMemory
  282.  
  283.             ; Allocate a 256 byte block of DOS memory using DPMI
  284.             mov     ax, 0100h
  285.             mov     bx, 16
  286.             int     31h
  287.             jc      NoMemory
  288.  
  289.             ; AX = real mode segment of allocated block
  290.             and     eax, 0FFFFh
  291.             mov     BufferSeg, ax
  292.             shl     eax, 4      ; EAX = 32-bit pointer to DOS memory
  293.             mov     BufferPtr, eax
  294. GotDosMemory:
  295.  
  296.  
  297.             ; Get SuperVGA information
  298.             mov     ax, BufferSeg
  299.             mov     regs.RealEDI, 0
  300.             mov     regs.RealESI, 0
  301.             mov     regs.RealEBP, 0
  302.             mov     regs.Reserved, 0
  303.             mov     regs.RealEBX, 0
  304.             mov     regs.RealEDX, 0
  305.             mov     regs.RealECX, 0
  306.             mov     regs.RealEAX, 04f00h
  307.             mov     regs.RealFlags, 0
  308.             mov     regs.RealES, ax
  309.             mov     regs.RealDS, 0
  310.             mov     regs.RealFS, 0
  311.             mov     regs.RealGS, 0
  312.             mov     regs.RealIP, 0
  313.             mov     regs.RealCS, 0
  314.             mov     regs.RealSP, 0
  315.             mov     regs.RealSS, 0
  316.  
  317.             mov     bl, 10h
  318.             xor     bh, bh
  319.             xor     ecx, ecx
  320.             mov     edi, offset regs
  321.             mov     ax, 0300h
  322.             int     31h
  323.  
  324.             mov     eax, regs.RealEAX
  325.             cmp     ax, 04fh
  326.             jne     NoVESADriver
  327.  
  328.             ; Make sure there is a VESA signature
  329.             mov     eax, BufferPtr
  330.             cmp     dword ptr[eax+0], VESA_Signature
  331.             jne     NoVESADriver
  332.  
  333.             ; We now have a valid VESA driver loaded
  334.  
  335.             mov     bx, word ptr [eax+4]
  336.             mov     VESAVersion, bx
  337.  
  338.             mov     ebx, dword ptr [eax+6]
  339.             call    EBXFarTo32
  340.             mov     OEMStringPtr, ebx
  341.  
  342.             mov     ebx, dword ptr [eax+10]
  343.             mov     Capabilities, ebx
  344.  
  345.             mov     bx, word ptr [eax+18]
  346.             mov     TotalMemory, bx
  347.  
  348.             mov     ebx, dword ptr [eax+14]
  349.             call    EBXFarTo32
  350.             mov     VideoModePtr, ebx
  351.  
  352. TryAnotherMode:
  353.             mov     ax, word ptr [ebx]
  354.             add     ebx, 2
  355.             cmp     ax, GoalMode
  356.             je      ModeSupported
  357.             cmp     ax, -1
  358.             je      ModeNotSupported
  359.             jmp     TryAnotherMode
  360.  
  361. ModeSupported:
  362.  
  363.             ; Get SuperVGA information
  364.             mov     ax, BufferSeg
  365.             movzx   ecx, GoalMode
  366.             mov     regs.RealEDI, 0
  367.             mov     regs.RealESI, 0
  368.             mov     regs.RealEBP, 0
  369.             mov     regs.Reserved, 0
  370.             mov     regs.RealEBX, 0
  371.             mov     regs.RealEDX, 0
  372.             mov     regs.RealECX, ecx
  373.             mov     regs.RealEAX, 04f01h
  374.             mov     regs.RealFlags, 0
  375.             mov     regs.RealES, ax
  376.             mov     regs.RealDS, 0
  377.             mov     regs.RealFS, 0
  378.             mov     regs.RealGS, 0
  379.             mov     regs.RealIP, 0
  380.             mov     regs.RealCS, 0
  381.             mov     regs.RealSP, 0
  382.             mov     regs.RealSS, 0
  383.  
  384.             mov     bl, 10h
  385.             xor     bh, bh
  386.             xor     cx, cx
  387.             mov     edi, offset regs
  388.             mov     ax, 0300h
  389.             int     31h
  390.  
  391.             mov     eax, regs.RealEAX
  392.             cmp     ax, 04fh
  393.             jne     BadStatus
  394.  
  395.             ; Check if this mode supported by hardware.
  396.             mov     eax, BufferPtr
  397.             mov     bx, [eax]
  398.             bt      bx, 0
  399.             jnc     HardwareNotSupported
  400.  
  401.  
  402.             mov     bx, [eax+4]
  403.             cmp     bx, 64
  404.             jne     @f
  405.             mov     PageSizeShift, 0
  406.             jmp     GranularityOK
  407. @@:                 cmp     bx, 32
  408.             jne     @f
  409.             mov     PageSizeShift, 1
  410.             jmp     GranularityOK
  411. @@:                 cmp     bx, 16
  412.             jne     @f
  413.             mov     PageSizeShift, 2
  414.             jmp     GranularityOK
  415. @@:                 cmp     bx, 8
  416.             jne     @f
  417.             mov     PageSizeShift, 3
  418.             jmp     GranularityOK
  419. @@:                 cmp     bx, 4
  420.             jne     @f
  421.             mov     PageSizeShift, 4
  422.             jmp     GranularityOK
  423. @@:                 cmp     bx, 2
  424.             jne     @f
  425.             mov     PageSizeShift, 5
  426.             jmp     GranularityOK
  427. @@:                 cmp     bx, 1
  428.             jne     WrongGranularity
  429.             mov     PageSizeShift, 6
  430.  
  431. GranularityOK:
  432.             shl     bx, 10
  433.             mov     WinGranularity, bx
  434.  
  435.             mov     bx, [eax+6]
  436.             mov     WinSize, bx
  437.  
  438.             mov     ebx, [eax+12]
  439.             call    EBXFarTo32
  440.             mov     WinFuncPtr, ebx
  441.  
  442.             movzx   ebx, word ptr [eax+16]
  443.  
  444. NoError:
  445.             mov     vesa_error, 0
  446.             jmp     Done
  447.  
  448. WrongGranularity:
  449.             mov     vesa_error, 2
  450.             jmp     Done
  451.  
  452. HardwareNotSupported:
  453.             mov     vesa_error, 3
  454.             jmp     Done
  455.  
  456. ModeNotSupported:
  457.             mov     vesa_error, 4
  458.             jmp     Done
  459.  
  460. NoVESADriver:
  461.             mov     vesa_error, 5
  462.             jmp     Done
  463.  
  464. BadStatus:
  465.             mov     vesa_error, 6
  466.             jmp     Done
  467.  
  468. NoMemory:
  469.             mov     vesa_error, 7
  470.             jmp    Done
  471.  
  472. DPMIError:
  473.             mov     vesa_error, 8
  474.  
  475. Done:            popad
  476.             mov    eax, vesa_error
  477.  
  478.             ret
  479.  
  480. PUBLIC  gr_get_dos_mem_
  481.  
  482. gr_get_dos_mem_:
  483.             
  484.         ; eax = how many bytes
  485.  
  486.         push    ebx
  487.         
  488.         mov    ebx, eax
  489.         shr    ebx, 4
  490.         mov    eax, 0100h
  491.         int    31h
  492.         jc    nomem
  493.         and    eax, 0ffffh
  494.         shl    eax, 4
  495.         pop    ebx
  496.         ret
  497.  
  498. nomem:        pop    ebx
  499.         mov    eax,0
  500.         ret
  501.         
  502.  
  503.  
  504.  
  505. PUBLIC gr_vesa_setmodea_
  506.  
  507. gr_vesa_setmodea_:
  508.  
  509.         ; eax = mode
  510.         pushad
  511.         mov    ebx, eax                
  512.         mov     eax, 04f02h
  513.         int     10h
  514.         cmp     ax, 04fh
  515.         jne     BadStatus
  516.         jmp    NoError
  517.  
  518. PUBLIC  gr_vesa_setpage_
  519.  
  520. gr_vesa_setpage_:
  521.  
  522.             ; EAX = 64K Page number
  523.  
  524.             cmp     al, LastPage
  525.             jne     @f
  526.             ret
  527. @@:                 mov     LastPage, al
  528.             push    edx
  529.             push    ebx
  530.             push    ecx
  531.             mov     edx, eax
  532.             mov     cl, PageSizeShift
  533.             shl     edx, cl         ; Convert from 64K pages to GranUnit pages.
  534.             xor     ebx, ebx        ; BH=Select window, BL=Window A
  535.             mov     eax, 04f05h     ; AX=Super VGA video memory window control
  536.             int     10h
  537.             pop     ecx
  538.             pop     ebx
  539.             pop     edx
  540.             ret
  541.  
  542. PUBLIC  gr_vesa_setaddress_
  543.  
  544. gr_vesa_setaddress_:
  545.             ; EAX = Address of video memory to write to
  546.             push    edx
  547.             push    ebx
  548.             push    ecx
  549.             mov     edx, eax
  550.             shl     edx, 12         ; Convert from address pages to 4k GranUnit pages.
  551.             xor     ebx, ebx        ; BH=Select window, BL=Window A
  552.             mov     eax, 04f05h     ; AX=Super VGA video memory window control
  553.             int     10h
  554.             pop     ecx
  555.             pop     ebx
  556.             pop     edx
  557.             ret
  558.  
  559. PUBLIC  gr_vesa_incpage_
  560.  
  561. gr_vesa_incpage_:
  562.  
  563.             push    eax
  564.             push    ebx
  565.             push    ecx
  566.             push    edx
  567.             push    ebp
  568.             inc     LastPage
  569.             mov     dl, LastPage
  570.             mov     cl, PageSizeShift
  571.             shl     edx, cl         ; Convert from 64K pages to GranUnit pages.
  572.             xor     ebx, ebx        ; BH=Select window, BL=Window A
  573.             mov     eax, 04f05h     ; AX=Super VGA video memory window control
  574.             int     10h
  575.             pop     ebp
  576.             pop     edx
  577.             pop     ecx
  578.             pop     ebx
  579.             pop     eax
  580.             ret
  581.  
  582.  
  583. PUBLIC  gr_vesa_setstart_
  584.  
  585. gr_vesa_setstart_:
  586.  
  587.             ; EAX = First column
  588.             ; EDX = First row
  589.             push    ebx
  590.             push    ecx
  591.             mov     ecx, eax
  592.             mov     eax, 4f07h
  593.             xor     ebx, ebx
  594.             int     10h
  595.             pop     ecx
  596.             pop     ebx
  597.             ret
  598.  
  599.  
  600. PUBLIC  gr_vesa_setlogical_
  601.  
  602. gr_vesa_setlogical_:
  603.  
  604.             ; EAX = line width
  605.             push    ebx
  606.             push    ecx
  607.             push    edx
  608.  
  609.             mov     cx, ax
  610.             mov     ax, 04f06h
  611.             mov     bl, 0
  612.             int     10h
  613.             and     ebx, 0FFFFh
  614.             mov     ax, cx
  615.  
  616.             pop     edx
  617.             pop     ecx
  618.             pop     ebx
  619.             ret
  620.  
  621.  
  622.  
  623. PUBLIC gr_vesa_scanline_
  624.  
  625. gr_vesa_scanline_:
  626.  
  627.             ; EAX = x1
  628.             ; EDX = x2
  629.             ; EBX = y
  630.             ; ECX = color
  631.  
  632.             push    edi
  633.             cld
  634.             cmp     edx, eax
  635.             jge     @f
  636.             xchg    edx, eax
  637.  
  638. @@:                 mov     edi, ebx
  639.             imul    edi, _gr_var_bwidth
  640.             add     edi, eax        ; EDI = y*bpr+x1
  641.             sub     edx, eax        ; ECX = x2-x1
  642.             inc     edx
  643.  
  644.             mov     eax, edi
  645.             shr     eax, 16
  646.  
  647.             cmp     al, LastPage
  648.             je      @f
  649.             mov     LastPage, al
  650.             push    edx
  651.             push    ecx
  652.             mov     edx, eax
  653.             mov     cl, PageSizeShift
  654.             shl     edx, cl         ; Convert from 64K pages to GranUnit pages.
  655.             xor     ebx, ebx        ; BH=Select window, BL=Window A
  656.             mov     eax, 04f05h     ; AX=Super VGA video memory window control
  657.             int     10h
  658.             pop     ecx
  659.             pop     edx
  660.  
  661. @@:                 and     edi, 00FFFFh
  662.             or      edi, 0A0000h
  663.  
  664.             ;mov     eax, _Table8to32[ecx*4]
  665.             mov    ch, cl
  666.             mov    ax, cx
  667.             shl    eax, 16
  668.             mov    ax, cx
  669.  
  670.             ; edx = width in bytes
  671.             ; edi = dest
  672.             mov     bx, dx
  673.             add     bx, di
  674.             jnc     scanonepage
  675.  
  676.             sub     dx, bx
  677.             movzx   ecx, dx
  678.             
  679.             shr    ecx, 1            
  680.             rep     stosw
  681.             adc    ecx, ecx
  682.             rep    stosb
  683.  
  684.             movzx   edx, bx
  685.             cmp     edx, 0
  686.             je      scandone
  687.  
  688.             call    gr_vesa_incpage_
  689.             mov     edi, 0A0000h
  690.  
  691. scanonepage:
  692.             movzx   ecx, dx
  693.  
  694.             shr    ecx, 1            
  695.             rep     stosw
  696.             adc    ecx, ecx
  697.             rep    stosb
  698.  
  699. scandone:
  700.  
  701.             pop     edi
  702.             ret
  703.  
  704.  
  705. PUBLIC gr_vesa_set_logical_
  706.  
  707. gr_vesa_set_logical_:
  708.  
  709.             ; EAX = logical width in pixels
  710.  
  711.             push    ebx
  712.             push    ecx
  713.  
  714.             mov     ecx, eax
  715.             mov     eax, 04f06h
  716.             mov     bl, 0
  717.             int     10h
  718.             and     ebx, 0ffffh
  719.  
  720.             movzx   eax, cx
  721.  
  722.             pop     ecx
  723.             pop     ebx
  724.  
  725.             ret
  726.  
  727.  
  728. PUBLIC gr_vesa_pixel_
  729.  
  730. gr_vesa_pixel_:
  731.  
  732.             ; EAX = color (in AL)
  733.             ; EDX = offset from 0A0000
  734.  
  735.             shld    eax, edx, 16
  736.             and     edx, 0ffffh
  737.             cmp     al, LastPage
  738.             jne     @f
  739.             shr     eax, 16
  740.             mov     [edx+0A0000h], al
  741.             ret
  742.  
  743. @@:         mov     LastPage, al
  744.             pushad
  745.             and     eax, 0fh
  746.             mov     edx, eax
  747.             mov     cl, PageSizeShift
  748.             shl     edx, cl         ; Convert from 64K pages to GranUnit pages.
  749.             xor     ebx, ebx        ; BH=Select window, BL=Window A
  750.             mov     eax, 04f05h     ; AX=Super VGA video memory window control
  751.             int     10h
  752.             popad
  753.  
  754.             shr     eax, 16
  755.             mov     [edx+0A0000h], al
  756.             ret
  757.  
  758.  
  759. PUBLIC gr_vesa_bitblt_
  760.  
  761. gr_vesa_bitblt_:
  762.  
  763.             ; EAX = source_ptr
  764.             ; EDX = vesa_address
  765.             ; EBX = height
  766.             ; ECX = width
  767.  
  768.             push    edi
  769.             push    esi
  770.  
  771.             mov     esi, eax        ; Point ESI to source bitmap
  772.  
  773.             ; Set the initial page
  774.             mov     eax, edx            ; Move offset into SVGA into eax
  775.             shr     eax, 16             ; Page = offset / 64K
  776.             call    gr_vesa_setpage_
  777.  
  778.             mov     edi, edx            ; EDI = offset into SVGA
  779.             and     edi,  0FFFFh        ; EDI = offset into 64K page
  780.             add     edi, 0A0000h        ; EDI = ptr to dest
  781.  
  782.  
  783.             mov     edx, _gr_var_bwidth
  784.             sub     edx, ecx            ; EDX = amount to step each row
  785.  
  786.  
  787.             mov     eax, ecx
  788.  
  789. NextScanLine:
  790.             push    eax
  791.             MyMovsd eax
  792.             pop     eax
  793.  
  794.             dec     ebx
  795.             jz      DoneBlt
  796.  
  797.             add     di, dx
  798.             jnc     NextScanLine
  799.  
  800.             ; Need to increment page!
  801.             call    gr_vesa_incpage_
  802.             jmp     NextScanLine
  803.  
  804. DoneBlt:    pop     esi
  805.             pop     edi
  806.  
  807.             ret
  808.  
  809. PUBLIC gr_vesa_bitmap_
  810.  
  811. gr_vesa_bitmap_:
  812.  
  813.             ; EAX = Source bitmap       (LINEAR)
  814.             ; EDX = Destination bitmap  (SVGA)
  815.             ; EBX = x
  816.             ; ECX = y
  817.  
  818.             push    esi
  819.             push    edi
  820.             push    ebp
  821.             push    es
  822.  
  823.             push    eax
  824.             mov     eax, [edx].bm_data
  825.             imul    ecx, _gr_var_bwidth
  826.             add     eax, ecx
  827.             add     eax, ebx
  828.             mov     edi, eax            ; EDI = offset into SVGA
  829.             shr     eax, 16
  830.             call    gr_vesa_setpage_
  831.  
  832.             mov     ax, __A0000
  833.             mov     es, ax
  834.             pop     eax
  835.  
  836.             mov     esi, [eax].bm_data
  837.             and     edi, 0ffffh
  838.  
  839.             movzx   ecx, [eax].bm_h
  840.  
  841. NextScanLine1:
  842.                 push    ecx
  843.                 movzx   ecx, [eax].bm_w
  844.                 mov     bx, cx
  845.                 add     bx, di
  846.                 jnc     OnePage
  847.  
  848.                 sub     cx,bx
  849.                 mov     ebp, ecx
  850.                 MyMovsd ebp
  851.                 and     edi, 00ffffh        ; IN CASE IT WENT OVER 64K
  852.                 mov     cx,bx
  853.                 call    gr_vesa_incpage_
  854.                 jcxz    DoneWithLine
  855. OnePage:
  856.                 mov     ebp, ecx
  857.                 MyMovsd ebp
  858.                 and     edi, 00ffffh        ; IN CASE IT WENT OVER 64K
  859.  
  860. DoneWithLine:   mov     bx, [eax].bm_rowsize
  861.                 sub     bx, [eax].bm_w
  862.                 and     ebx, 0ffffh
  863.                 add     esi, ebx
  864.                 mov     bx, [edx].bm_rowsize
  865.                 sub     bx, [eax].bm_w
  866.                 add     di, bx
  867.                 jnc     NoPageInc
  868.                 call    gr_vesa_incpage_
  869. NoPageInc:  pop     ecx
  870.             dec     ecx
  871.             jz      @f
  872.             jmp     NextScanLine1
  873.  
  874. @@:
  875.  
  876.             pop es
  877.             pop ebp
  878.             pop edi
  879.             pop esi
  880.             ret
  881.  
  882.  
  883.  
  884.  
  885. PUBLIC gr_vesa_update_
  886.  
  887. gr_vesa_update_:
  888.  
  889.             ; EAX = Source bitmap       (LINEAR)
  890.             ; EDX = Destination bitmap  (SVGA)
  891.             ; EBX = Old source bitmap   (LINEAR)
  892.  
  893.             push    ecx
  894.             push    esi
  895.             push    edi
  896.             push    ebp
  897.             push    fs
  898.  
  899.             push    eax
  900.             mov     eax, [edx].bm_data
  901.             mov     ebp, eax            ; EDI = offset into SVGA
  902.             shr     eax, 16
  903.             call    gr_vesa_setpage_
  904.  
  905.             mov     ax, __A0000
  906.             mov     fs, ax
  907.             pop     eax
  908.  
  909.             mov     esi, [eax].bm_data
  910.             and     ebp, 0ffffh
  911.  
  912.             movzx   ecx, [eax].bm_h
  913.  
  914.             mov     edi, [ebx].bm_data
  915.  
  916.             movzx   ebx, [eax].bm_rowsize
  917.             sub     bx, [eax].bm_w
  918.             mov     SourceInc, ebx
  919.  
  920.             movzx   ebx, [edx].bm_rowsize
  921.             sub     bx, [eax].bm_w
  922.             mov     DestInc, bx
  923.  
  924.             movzx   ebx, [eax].bm_w
  925.             mov     RowWidth, ebx
  926.  
  927. NextScanLine3:
  928.                 push    ecx
  929.                 mov     ecx, RowWidth
  930.                 mov     dx, cx
  931.                 add     dx, bp
  932.                 jnc     OnePage3
  933.  
  934.                 sub     cx,dx
  935.                 mov     ebx, esi
  936.  
  937. InnerLoop3:     repe    cmpsb
  938.                 mov     al, [esi-1]
  939.                 sub     esi, ebx
  940.                 mov     fs:[ebp+esi-1], al       ; EDX = dest + size - bytes to end
  941.                 add     esi, ebx
  942.                 cmp     ecx, 0
  943.                 jne     InnerLoop3
  944.  
  945.                 sub     esi, ebx
  946.                 add     ebp, esi
  947.                 add     esi, ebx
  948.                 and     ebp, 00ffffh        ; IN CASE IT WENT OVER 64K
  949.  
  950.                 mov     cx,dx
  951.                 call    gr_vesa_incpage_
  952.                 jcxz    DoneWithLine3
  953. OnePage3:
  954.                 mov     ebx, esi
  955.                 mov     edx, ecx
  956.                 and     edx, 11b
  957.                 shr     ecx, 2
  958.  
  959. InnerLoop4:     repe    cmpsd
  960.                 mov     eax, [esi-4]
  961.                 sub     esi, ebx
  962.                 mov     fs:[ebp+esi-4], eax       ; EDX = dest + size - bytes to end
  963.                 add     esi, ebx
  964.                 cmp     ecx, 0
  965.                 jne     InnerLoop4
  966.  
  967.                 mov     ecx, edx
  968.                 jecxz   EvenWidth
  969. InnerLoop5:     repe    cmpsb
  970.                 mov     al, [esi-1]
  971.                 sub     esi, ebx
  972.                 mov     fs:[ebp+esi-1], al       ; EDX = dest + size - bytes to end
  973.                 add     esi, ebx
  974.                 cmp     ecx, 0
  975.                 jne     InnerLoop5
  976.  
  977. EvenWidth:      sub     esi, ebx
  978.                 add     ebp, esi
  979.                 add     esi, ebx
  980.                 and     ebp, 00ffffh        ; IN CASE IT WENT OVER 64K
  981.  
  982. DoneWithLine3:
  983.                 add     esi, SourceInc
  984.                 add     edi, SourceInc
  985.                 add     bp, DestInc
  986.                 jnc     NoPageInc3
  987.                 call    gr_vesa_incpage_
  988. NoPageInc3: pop     ecx
  989.             dec     ecx
  990.             jnz     NextScanLine3
  991.  
  992.             pop     fs
  993.             pop     ebp
  994.             pop     edi
  995.             pop     esi
  996.             pop     ecx
  997.             ret
  998.  
  999.  
  1000.  
  1001.  
  1002. _TEXT   ENDS
  1003.  
  1004.  
  1005.         END
  1006.  
  1007.  
  1008. 
  1009.