home *** CD-ROM | disk | FTP | other *** search
/ Best Objectech Shareware Selections / UNTITLED.iso / boss / grap / util / 015 / svga256.asm < prev    next >
Assembly Source File  |  1993-03-07  |  17KB  |  614 lines

  1. ;****************************************************************************
  2. ;*
  3. ;*                           SuperVGA Test Library
  4. ;*
  5. ;*                  Copyright (C) 1993 Kendall Bennett.
  6. ;*                            All rights reserved.
  7. ;*
  8. ;* Filename:    $RCSfile: svga256.asm $
  9. ;* Version:        $Revision: 1.2 $
  10. ;*
  11. ;* Language:    80386 Assembler
  12. ;* Environment:    IBM PC (MS DOS)
  13. ;*
  14. ;* Description:    This source file contains code to initialise the SuperVGA
  15. ;*                for bank switching and extended page flipping.
  16. ;*
  17. ;*                It also contains code to draw pixels, clear the display
  18. ;*                and perform page flipping for SuperVGA 256 color modes.
  19. ;*
  20. ;* $Id: svga256.asm 1.2 1993/03/07 04:05:36 kjb Exp $
  21. ;*
  22. ;* Revision History:
  23. ;* -----------------
  24. ;*
  25. ;* $Log: svga256.asm $
  26. ;* Revision 1.2  1993/03/07  04:05:36  kjb
  27. ;* Bug fixes.
  28. ;*
  29. ;* Revision 1.1  1993/03/03  10:26:38  kjb
  30. ;* Initial revision
  31. ;*
  32. ;****************************************************************************
  33.  
  34.         IDEAL
  35.         JUMPS
  36.         P386                    ; Use 386 instructions
  37.  
  38. INCLUDE "model.mac"                ; Memory model macros
  39.  
  40. header        init
  41.  
  42. INCLUDE    "MGRAPH.EQU"            ; Include Equates for Mgraph Routines
  43.  
  44. CRTC            EQU    3D4h        ; Port of CRTC registers
  45. VGABufferSeg    EQU    0A000h        ; Segment of VGA display memory
  46. FIRSTMODE        EQU    grVGA_320x200x256
  47. MAXMODE            EQU    grSVGA_1280x1024x256
  48.  
  49. begcodeseg    svga256
  50.  
  51. ; Globals used by driver
  52.  
  53. OldBIOSMode            db    0            ; Old video mode before graphics
  54. Old50Lines            db    0            ; 1 if old mode was 50 line VGA
  55. CntDriver            dw    0            ; Graphics driver number
  56. CntMode                dw    0            ; Graphics mode number
  57. CntChipID            dw    0            ; Graphics driver chip ID
  58. CntColors            dw    gr256Color    ; This is a 256 color driver
  59.  
  60. ; The following information held in the status status area changes depending
  61. ; on which mode the driver is set up to be used in:
  62.  
  63. StatusArea:
  64.  
  65. XRes                dw    0            ; Device resolution in x direction - 1
  66. YRes                dw    0            ; Device resolution in y direction - 1
  67. BytesPerLine        dw    0            ; Number of bytes in a line
  68. PageSize            dd    0            ; Graphics page size
  69.  
  70. MaxPage                dw    0            ; Maximum number of video pages
  71. OriginOffset        dw    0            ; Offset of 0,0 into buffer
  72.  
  73. ; Here we set up a series of tables that can be used to fill in the start of
  74. ; the status area for each mode supported by this driver, and the address's
  75. ; of the routines required for each particular driver mode:
  76.  
  77. ModeTabStart:
  78.  
  79. ModeVGA_320x200:    dw    319            ; XRes
  80.                     dw    199            ; YRes
  81.                     dw    320            ; BytesPerLine
  82. ModeSVGA_640x350:    dw    639            ; XRes
  83.                     dw    349            ; YRes
  84.                     dw    640            ; BytesPerLine
  85. ModeSVGA_640x400:    dw    639            ; XRes
  86.                     dw    399            ; YRes
  87.                     dw    640            ; BytesPerLine
  88. ModeSVGA_640x480:    dw    639            ; XRes
  89.                     dw    479            ; YRes
  90.                     dw    640            ; BytesPerLine
  91. ModeSVGA_800x600:    dw    799            ; XRes
  92.                     dw    599            ; YRes
  93.                     dw    800            ; BytesPerLine
  94. ModeSVGA_1024x768:    dw    1023        ; XRes
  95.                     dw    767            ; YRes
  96.                     dw    1024        ; BytesPerLine
  97. ModeSVGA_1280x1024:    dw    1279        ; XRes
  98.                     dw    1023        ; YRes
  99.                     dw    1280        ; BytesPerLine
  100. ModeTabSize            =    ($-ModeSVGA_1280x1024)    ; Size of table in bytes
  101.  
  102. INCLUDE "SV_PORTS.ASM"
  103. INCLUDE "SV_BANKS.ASM"
  104. INCLUDE "SV_MODES.ASM"
  105. INCLUDE "SV_PAGE.ASM"
  106. INCLUDE "SV_MAXPG.ASM"
  107.  
  108. ;----------------------------------------------------------------------------
  109. ; int _initSuperVGA(int driver,int chipID,int mode,int memory)
  110. ;----------------------------------------------------------------------------
  111. ; Routine to initialise the bank switching code for the SuperVGA, and setup
  112. ; internal tables of information about the video mode. If the video mode
  113. ; is not supported, we return -1.
  114. ;
  115. ; The value returned is a status number, where bit 0 represents extended
  116. ; page flipping is available, bit 1 that separate read/write banks are
  117. ; available.
  118. ;----------------------------------------------------------------------------
  119. procstart    __initSuperVGA
  120.  
  121.         ARG        driver:WORD, ChipID:WORD, mode:WORD, memory:WORD
  122.  
  123.         enter    0,0
  124.         push    si
  125.         push    di
  126.  
  127. ; Save the driver number and chip ID for later
  128.  
  129.         mov        ax,[ChipID]
  130.         mov        [CntChipID],ax
  131.         mov        ax,[driver]
  132.         mov        [CntDriver],ax
  133.  
  134. ; Load the Status area with info for the currently selected mode:
  135.  
  136.         mov        ax,[mode]
  137.         mov        [CntMode],ax
  138.         cmp        ax,MAXMODE            ; AX := desired mode
  139.         jg        @@Invalid            ; invalid if greater than maximum
  140.         cmp        ax,FIRSTMODE
  141.         jl        @@Invalid            ; invalid if less than first mode
  142.         cmp        ax,grVGA_320x200x256
  143.         je        @@ValidVGAMode
  144.         cmp        ax,grSVGA_640x350x256
  145.         jl        @@Invalid            ; Mode is invalid
  146.  
  147.         sub        ax,grSVGA_640x350x256 - 1
  148.         jmp        @@LoadValues
  149.  
  150. @@ValidVGAMode:
  151.         sub        ax,FIRSTMODE
  152.  
  153. @@LoadValues:
  154.         mov        cx,ModeTabSize        ; Put size of table into cx
  155.         mul        cl                    ; AX := Mode * ModeTabSize
  156.         mov        si,ax
  157.         lea        si,[ModeTabStart + si]
  158.         push    cs
  159.         pop        es                    ; Set up es to point to code seg
  160.         lea        di,[StatusArea]        ; DI := Start of status area
  161.  
  162.         cld
  163.     rep    movs     [BYTE es:di],[BYTE es:si]
  164.  
  165.         mov        ax,[driver]
  166.         mov        bx,[mode]
  167.         call    loadSVGAMode        ; Load the SuperVGA video mode
  168.         or        ax,ax
  169.         jz        @@Invalid            ; Mode not supported on this adapter!
  170.  
  171.         mov        [maxpage],0            ; Clear maxpage variable
  172.         call    SetupBanks            ; Setup SuperVGA bank switching
  173.         call    [InitSVGA]            ; Initialise the SuperVGA
  174.         call    SetupPaging            ; Setup SuperVGA page flipping
  175.         mov        ax,0                ; Assume no paging available
  176.         jc        @@Done                ; Extended page flipping not available
  177.  
  178. ; Determine the number of pages available for the mode and the video page
  179. ; size.
  180.  
  181.         xor        ebx,ebx
  182.         mov        bx,[memory]
  183.         shl        ebx,10                ; EBX := video memory in bytes
  184.         mov        ax,[mode]
  185.         call    numPages            ; Calculate the number of video pages
  186.         dec        ax
  187.         mov        [MaxPage],ax        ; Save maximum page number
  188.         mov        [DWORD pageSize],ebx
  189.         mov        [WORD bytesPerLine],cx
  190.         mov        ax,1                ; Extended paging is available
  191.  
  192. @@Done:
  193.         mov        bx,[TwoBanks]
  194.         shl        bx,1
  195.         or        ax,bx                ; Set the two banks flag
  196.         jmp        @@Exit
  197.  
  198. @@Invalid:
  199.         mov        ax,-1                ; Return failure!
  200.  
  201. @@Exit:
  202.         pop        di
  203.         pop        si
  204.         leave
  205.         ret
  206.  
  207. procend        __initSuperVGA
  208.  
  209. ;----------------------------------------------------------------------------
  210. ; int _setSuperVGAMode(void);
  211. ;----------------------------------------------------------------------------
  212. ; Routine sets the system into the SuperVGA graphics mode setup by the
  213. ; initSuperVGA routine. Note that this routine remembers if the EGA/VGA
  214. ; 43/50 line mode was set.
  215. ;
  216. ; If the video mode was not correctly set, we return false.
  217. ;----------------------------------------------------------------------------
  218. procstart    __setSuperVGAMode
  219.  
  220.         push    bp                    ; INT 10h Kills this!!!
  221.         push    si                    ; so save all regs...
  222.         push    di
  223.         push    ds
  224.  
  225.         mov        ah,0Fh                ; Get current video mode service
  226.         int        10h
  227.         mov        [OldBIOSMode],al    ; Save old video mode
  228.         mov        [Old50Lines],0        ; Default to non-50 line mode
  229.  
  230.         mov        ax,1130h            ; AH := INT 10h function number
  231.                                     ; AL := Get character gen information
  232.         mov        bh,00                ; Get contents of INT 1Fh
  233.         xor        dl,dl                ; Clear dl
  234.         int        10h                    ; Determine number of lines (in dl)
  235.         cmp        dl,49                ; 50 line mode?
  236.         jne        @@SetMode            ; No, must have been 25 lines
  237.         mov        [Old50Lines],1        ; Yes, 50 line mode was on
  238.  
  239. @@SetMode:
  240.         mov        ax,[CntDriver]
  241.         mov        bx,[CntMode]
  242.         call    loadSVGAMode        ; AX,BX := correct values for mode
  243.         int        10h                    ; Set the video mode
  244.  
  245.         mov        ax,40h
  246.         mov        es,ax
  247.         xor        ax,ax
  248.         cmp        [BYTE es:49h],3        ; Mode is still text mode, did not set
  249.         jbe        @@Exit
  250.  
  251.         call    [InitSVGA]            ; Initialise bank switching on SuperVGA's
  252.         mov        ax,1                ; Mode was correctly set
  253.  
  254. @@Exit:
  255.         pop        ds
  256.         pop        di                    ; Restore regs
  257.         pop        si
  258.         pop        bp                    ; Restore bp (after INT 10 trashes it)
  259.         ret
  260.  
  261. procend        __setSuperVGAMode
  262.  
  263. ;----------------------------------------------------------------------------
  264. ; void restoreMode(void)
  265. ;----------------------------------------------------------------------------
  266. ; Routine restores the original video mode that was set before graphics mode
  267. ; was entered.
  268. ;----------------------------------------------------------------------------
  269. procstart    _restoreMode
  270.  
  271.         push    bp                    ; INT 10h kills bp sometimes
  272.         push    si                    ; Save all regs...
  273.         push    di
  274.  
  275.         call    [ExitSVGA]            ; Uninitialise the S