home *** CD-ROM | disk | FTP | other *** search
/ World of Graphics / WOGRAPH.BIN / 434.SV_BANKS.ASM < prev    next >
Assembly Source File  |  1993-03-07  |  39KB  |  1,436 lines

  1. ;****************************************************************************
  2. ;*
  3. ;*                        MegaGraph Graphics Library
  4. ;*
  5. ;*                  Copyright (C) 1993 Kendall Bennett.
  6. ;*                            All rights reserved.
  7. ;*
  8. ;* Filename:    $RCSfile: sv_banks.asm $
  9. ;* Version:        $Revision: 1.2 $
  10. ;*
  11. ;* Language:    80386 Assembler
  12. ;* Environment:    IBM PC (MS DOS)
  13. ;*
  14. ;* Description:    This source file contains the code needed to change banks
  15. ;*                on supported SuperVGA adapters, along with tables to find
  16. ;*                the correct routines for a specified video card.
  17. ;*
  18. ;*                The code in here originally appeared in John Bridges
  19. ;*                VGAKIT library, and has been modified to work with the
  20. ;*                MGL. Specifically support for individually setting the
  21. ;*                read and write banks has been included, along with adapter
  22. ;*                initialisation code (such as accessing extended registers
  23. ;*                etc).
  24. ;*
  25. ;*                To set up separate read/write banks, you must first call
  26. ;*                NewBank to set the read/write banks to the same value,
  27. ;*                then call ReadBank to change the read bank value.
  28. ;*
  29. ;* $Id: sv_banks.asm 1.2 1993/03/07 04:05:36 kjb Exp $
  30. ;*
  31. ;* Revision History:
  32. ;* -----------------
  33. ;*
  34. ;* $Log: sv_banks.asm $
  35. ;* Revision 1.2  1993/03/07  04:05:36  kjb
  36. ;* Bug fixes.
  37. ;*
  38. ;* Revision 1.1  1993/03/03  10:26:52  kjb
  39. ;* Initial revision
  40. ;*
  41. ;****************************************************************************
  42.  
  43. ; Table of SuperVGA bank switching routines by video card.
  44.  
  45. SVGAInfoTable:
  46.     dw    false,    VESA_bank,        VESA_bank,        VESA_init,        NONE_exit
  47.     dw    true,    ATI_bank,        ATI_rbank,        ATI_init,        NONE_exit
  48.     dw    false,    AHEADA_bank,    AHEADA_bank,    AHEAD_init,        AHEAD_exit
  49.     dw    true,    AHEADB_bank,    AHEADB_rbank,    AHEAD_init,        AHEAD_exit
  50.     dw    false,    CHIPS451_bank,    CHIPS451_bank,    CHIPS_init,        CHIPS_exit
  51.     dw    false,    EVEREX_bank,    EVEREX_bank,    EVEREX_init,    NONE_exit
  52.     dw    true,    GENOA_bank,        GENOA_rbank,    NONE_init,        NONE_exit
  53.     dw    true,    OAK_bank,        OAK_rbank,        NONE_init,        NONE_exit
  54.     dw    true,    PARADISE_bank,    PARADISE_rbank,    PARADISE_init,    PARADISE_exit
  55.     dw    false,    TRIDENT_bank,    TRIDENT_bank,    TRIDENT_init,    NONE_exit
  56.     dw    false,    TRIDENT_bank,    TRIDENT_bank,    TRIDENT_init,    NONE_exit
  57.     dw    true,    VIDEO7V5_bank,    VIDEO7V5_rbank,    VIDEO7_init,    VIDEO7_exit
  58.     dw    true,    ET3000_bank,    ET3000_rbank,    NONE_init,        NONE_exit
  59.     dw    true,    ET4000_bank,    ET4000_rbank,    ET4000_init,    NONE_exit
  60.     dw    true,    NCR_bank,        NCR_rbank,        NCR_init,        NONE_exit
  61.     dw    false,    S3_bank,        S3_bank,        S3_init,        NONE_exit
  62.     dw    false,    ACUMOS_bank,    ACUMOS_bank,    ACUMOS_init,    ACUMOS_exit
  63.     dw    false,    AL2101_bank,    AL2101_bank,    AL2101_init,    NONE_exit
  64.     dw    true,    MXIC_bank,        MXIC_rbank,        MXIC_init,        MXIC_exit
  65.     dw    true,    P2000_bank,        P2000_rbank,    NONE_init,        NONE_exit
  66.     dw    true,    RT3106_bank,    RT3106_rbank,    RT3106_init,    NONE_exit
  67.     dw    false,    CIRRUS_bank,    CIRRUS_bank,    CIRRUS_init,    CIRRUS_exit
  68.  
  69. SVGAInfo:
  70. TwoBanks    dw    0                ; Flags if two banks available
  71. NewBank        dw    NONE_bank        ; Address of read/write bank switch routine
  72. ReadBank    dw    NONE_bank        ; Address of read bank routine
  73. InitSVGA    dw    NONE_init        ; Address of card Init routine
  74. ExitSVGA    dw    NONE_exit        ; Address of card close routine
  75. SVGAInfoSize    = ($-SVGAInfo)    ; Size of the above table
  76.  
  77. CurBank        dw    0FFh            ; Currently active read/write bank
  78. VesaGran    db    0                ; VESA Granularity
  79. VesaBank    dd    0                ; Address of VESA bank switch routine
  80. VesaBuf        db    256 dup (?)        ; Place to store VESA Info
  81.  
  82. VesaModes:    dw    100h, grSVGA_640x400x256
  83.             dw    101h, grSVGA_640x480x256
  84.             dw    102h, grSVGA_800x600x16
  85.             dw    103h, grSVGA_800x600x256
  86.             dw    104h, grSVGA_1024x768x16
  87.             dw    105h, grSVGA_1024x768x256
  88.             dw    106h, grSVGA_1280x1024x16
  89.             dw    107h, grSVGA_1280x1024x256
  90.             dw    10Dh, grSVGA_320x200x32k
  91.             dw    10Fh, grSVGA_320x200x16m
  92.             dw    110h, grSVGA_640x480x32k
  93.             dw    112h, grSVGA_640x480x16m
  94.             dw    113h, grSVGA_800x600x32k
  95.             dw    115h, grSVGA_800x600x16m
  96.             dw    116h, grSVGA_1024x768x32k
  97.             dw    118h, grSVGA_1024x768x16m
  98.             dw    119h, grSVGA_1280x1024x32k
  99.             dw    11Bh, grSVGA_1280x1024x16m
  100.             dw    0
  101.  
  102. ;----------------------------------------------------------------------------
  103. ; SetupBanks    Setup the SuperVGA bank switching routines
  104. ;----------------------------------------------------------------------------
  105. ;
  106. ; Given the id of the SuperVGA card that is installed, this routine sets
  107. ; up the following bank switching code.
  108. ;
  109. ; Registers:    AX,CX,SI,DI
  110. ;
  111. ;----------------------------------------------------------------------------
  112. PROC    SetupBanks    near
  113.  
  114.         mov        [ReadBank],offset NONE_bank
  115.         mov        [InitSVGA],offset NONE_init
  116.         mov        ax,[CntDriver]
  117.         cmp        ax,grSVGA
  118.         jl        @@Exit                ; Not a SuperVGA adapter
  119.  
  120.         mov        si,offset SVGAInfoTable
  121.         mov        ax,[CntDriver]        ; AX := number of current driver
  122.         sub        ax,grSVGA            ; Adjust to start at 0 for SVGA's
  123.         mov        cx,SVGAInfoSize
  124.         mul        cx
  125.         add        si,ax                ; SI := index into table of SVGA banks
  126.         mov        di,offset SVGAInfo
  127.         push    cs
  128.         pop        es
  129.     rep    movs    [BYTE es:di],[BYTE es:si]
  130.  
  131. @@Exit:
  132.         mov        [CurBank],0FFh        ; Set the bank to nothing to start with
  133.         ret
  134.  
  135. ENDP    SetupBanks
  136.  
  137. ;----------------------------------------------------------------------------
  138. ; NewBank    Change to a new 64k bank on a SuperVGA card (reading and writing)
  139. ;----------------------------------------------------------------------------
  140. ;
  141. ; Changes to a new 64k bank given the specified index. The global variable
  142. ; CurBank is updated to reflect the current bank number and can be used
  143. ; to avoid unnecessary bank switching.
  144. ;
  145. ; These routines should set both the read and write bank for cards that
  146. ; support multiple banks to the same bank number.
  147. ;
  148. ; Note that the value of all regs MUST be preserved across this call.
  149. ;
  150. ; Entry:        AX    - Number of 64k bank (0-15 for 1Mb cards)
  151. ;
  152. ; Registers:    None.
  153. ;
  154. ;----------------------------------------------------------------------------
  155.  
  156. NONE_bank:
  157.         ret
  158.  
  159. VESA_bank:
  160.         mov        [CurBank],ax        ; Save the new bank number for later
  161.         push    ax
  162.         push    bx
  163.         push    dx
  164.         mul        [VesaGran]            ; Adjust with granularity factor
  165.         push    ax
  166.         mov        dx,ax                ; Select window position
  167.         xor        bx,bx                ; BH := 0 (Select SVGA memory window)
  168.                                     ; BL := 0 (window to set)
  169.         call    [VesaBank]            ; Change bank A
  170.         pop        dx                    ; Select window position
  171.         inc        bx                    ; BL := 1 (window to set)
  172.         call    [VesaBank]            ; Change bank B
  173.         pop        dx
  174.         pop        bx
  175.         pop        ax
  176.         ret
  177.  
  178. ATI_bank:
  179.         mov        [CurBank],ax        ; Save the new bank number for later
  180.         cli
  181.         push    ax
  182.         push    dx
  183.         and        al,0Fh                ; Mask out bottom four bits
  184.         mov        ah,al
  185.         shl        ah,4                ; Shift read bank into position
  186.         or        ah,al                ; AH := combined read/write register numbers
  187.         rol        ah,1                ; Shift banks numbers in position
  188.         mov        dx,1CEh                ; Port of extended registers
  189.         mov        al,0B2h
  190.         out        dx,ax                ; Set the ATI Bank Register
  191.         pop        dx
  192.         pop        ax
  193.         sti
  194.         ret
  195.  
  196. AHEADA_bank:
  197.         mov        [CurBank],ax        ; Save the new bank number for later
  198.         cli
  199.         push    ax
  200.         push    dx
  201.         push    cx
  202.         mov        ch,al
  203.         mov        dx,03CCh            ; bit 0 in bit 5 of Misc Output reg
  204.         in        al,dx                ; Read Misc output register
  205.         mov        dl,0C2h
  206.         and        al,11011111b
  207.         shr        ch,1                ; Need to set the bit?
  208.         jnc        @@SkpA                ; No, so skip it
  209.         or        al,00100000b
  210. @@SkpA:    out        dx,al                ; Set the new value
  211.         mov        dx,3CEh                ; bits 3-1 in bits 2-0 of Segment Reg
  212.         mov        al,0Dh                ; Index 0Dh for segment reg
  213.         mov        ah,ch                ; ch contains top three bits shr 1
  214.         out        dx,ax                ; Set the new value
  215.         pop        cx
  216.         pop        dx
  217.         pop        ax
  218.         sti
  219.         ret
  220.  
  221. AHEADB_bank:
  222.         mov        [CurBank],ax        ; Save the new bank number for later
  223.         cli
  224.         push    ax
  225.         push    dx
  226.         mov        ah,al                ; Combine read/write bank numbers
  227.         shl        ah,4
  228.         or        ah,al
  229.         mov        al,0Dh                ; Index of Bank Switch register
  230.         mov        dx,3CEh
  231.         out        dx,ax                ; Set the register
  232.         pop        dx
  233.         pop        ax
  234.         sti
  235.         ret
  236.  
  237. CHIPS451_bank:
  238.         mov        [CurBank],ax        ; Save the new bank number for later
  239.         cli
  240.         push    ax
  241.         push    dx
  242.         mov        ah,al
  243.         mov        al,0Bh                ; Index of Single/Low Map register
  244.         mov        dx,3D6h
  245.         out        dx,ax                ; Set the register value
  246.         pop        dx
  247.         pop        ax
  248.         sti
  249.         ret
  250.  
  251. CHIPS452_bank:
  252.         mov        [CurBank],ax        ; Save the new bank number for later
  253.         cli
  254.         push    ax
  255.         push    dx
  256.         mov        ah,al
  257.         shl        ah,2                ; Change 64k bank into 16k bank number
  258.         mov        al,10h                ; Index of Single/Low Map register
  259.         mov        dx,3D6h
  260.         out        dx,ax                ; Set the register value
  261.         pop        dx
  262.         pop        ax
  263.         sti
  264.         ret
  265.  
  266. CHIPS453_bank:
  267.         mov        [CurBank],ax        ; Save the new bank number for later
  268.         cli
  269.         push    ax
  270.         push    dx
  271.         mov        ah,al
  272.         shl        ah,4                ; Change 64k bank into 4k bank number
  273.         mov        al,10h                ; Index of Single/Low Map register
  274.         mov        dx,3D6h
  275.         out        dx,ax                ; Set the register value
  276.         pop        dx
  277.         pop        ax
  278.         sti
  279.         ret
  280.  
  281. EVEREX_bank:
  282.         mov        [CurBank],ax        ; Save the new bank number for later
  283.         cli
  284.         push    ax
  285.         push    dx
  286.         push    cx
  287.         mov        cl,al
  288.         mov        dx,3C4h
  289.         mov        al,8
  290.         out        dx,al
  291.         inc        dl
  292.         in        al,dx
  293.         dec        dl
  294.         shl        al,1
  295.         shr        cl,1
  296.         rcr        al,1
  297.         mov        ah,al
  298.         mov        al,8
  299.         out        dx,ax                ; Bit 0 stored in 3C4 index 8 bit 7
  300.         mov        dl,0CCh
  301.         in        al,dx
  302.         mov        dl,0C2h
  303.         and        al,0DFh
  304.         shr        cl,1
  305.         jc        @@Nob2
  306.         or        al,20h
  307. @@Nob2:    out        dx,al                ; Bit 1 stored in 3C2 bit 5
  308.         pop        cx
  309.         pop        dx
  310.         pop        ax
  311.         sti
  312.         ret
  313.  
  314. GENOA_bank:
  315.         mov        [CurBank],ax        ; Save the new bank number for later
  316.         cli
  317.         push    ax
  318.         push    dx
  319.         mov        ah,al                ; Put read bank in bits 2-0 ...
  320.         shl        al,3                ; ...  write bank in bits 5-3
  321.         or        ah,al
  322.         or        ah,40h                ; Set MEM bit
  323.         mov        al,6                ; Index of Memory Segment Register
  324.         mov        dx,3C4h
  325.         out        dx,ax                ; Set the read/write banks
  326.         pop        dx
  327.         pop        ax
  328.         sti
  329.         ret
  330.  
  331. OAK_bank:
  332.         mov        [CurBank],ax        ; Save the new bank number for later
  333.         cli
  334.         push    ax
  335.         push    dx
  336.         and        al,15
  337.         mov        ah,al                ; Combine read/write bank numbers
  338.         shl        al,4
  339.         or        ah,al
  340.         mov        al,11h                ; Index of bank switch register
  341.         mov        dx,3DEh
  342.         out        dx,ax                ; Set the register value
  343.         pop        dx
  344.         pop        ax
  345.         sti
  346.         ret
  347.  
  348. PARADISEPVGA_bank:
  349.         mov        [CurBank],ax        ; Save the new bank number for later
  350.         cli
  351.         push    ax
  352.         push    dx
  353.         mov        dx,3CEh
  354.         shl        al,4                ; change 64k bank into 4k bank number
  355.         mov        ah,al
  356.         mov        al,9                ; Index of PROA register
  357.         out        dx,ax                ; Program PROA register
  358.         pop        dx
  359.         pop        ax
  360.         sti
  361.         ret
  362.  
  363. PARADISE_bank:
  364.         mov        [CurBank],ax        ; Save the new bank number for later
  365.         cli
  366.         push    ax
  367.         push    dx
  368.         mov        dx,3CEh
  369.         shl        al,4                ; change 64k bank into 4k bank number
  370.         mov        ah,al
  371.         mov        al,9                ; Index of PROA register (read bank)
  372.         out        dx,ax                ; Program PROA register
  373.         mov        al,0Ah                ; Index of PROB register (write bank)
  374.         out        dx,ax                ; Program PROB register
  375.         pop        dx
  376.         pop        ax
  377.         sti
  378.         ret
  379.  
  380. TRIDENT_bank:
  381.         mov        [CurBank],ax        ; Save the new bank number for later
  382.         cli
  383.         push    ax
  384.         push    dx
  385.         xor        al,2                ; Adjust page bit
  386.         mov        ah,al
  387.         mov        dx,3C4h
  388.         mov        al,0Bh                ; Index of Chip Version register
  389.         out        dx,al                ; Program index
  390.         inc        dl
  391.         xor        al,al
  392.         out        dx,al                ; Force old definitions
  393.         in        al,dx                ; Force new definitions
  394.         dec        dl
  395.         mov        al,0Eh                ; Index of New Mode Control Reg
  396.         out        dx,ax                ; Program the page value
  397.         pop        dx
  398.         pop        ax
  399.         sti
  400.         ret
  401.  
  402. NCR_bank:
  403.         mov        [CurBank],ax        ; Save the new bank number for later
  404.         cli
  405.         push    ax
  406.         push    dx
  407.         shl        al,2                ; Change 64k bank into 16k bank number
  408.         cmp        [CntColors],gr16Color
  409.         jne        @@NCR1
  410.         shl        al,2                ; Change 64k bank into 4k bank number
  411. @@NCR1:    mov        ah,al
  412.         mov        al,18h
  413.         mov        dx,3C4h
  414.         out        dx,ax                ; Set write bank number
  415.         mov        al,1Ch
  416.         out        dx,ax                ; Set read bank number
  417.         pop        dx
  418.         pop        ax
  419.         sti
  420.         ret
  421.  
  422. VIDEO7_bank:
  423.         mov        [CurBank],ax        ; Save the new bank number for later
  424.         cli
  425.         push    ax
  426.         push    cx
  427.         push    dx
  428.         and        al,0Fh                ; Mask to 4 bits
  429.         mov        ch,al
  430.         mov        dx,3C4h
  431.         mov        ah,ch
  432.         and        ah,1
  433.         mov        al,0F9h                ; Index of Extended Page Select register
  434.         out        dx,ax                ; Program PS bit in register
  435.         mov        al,ch
  436.         and        al,1100b            ; Bits 3-2 for read field
  437.         mov        ah,al
  438.         shr        ah,2                ; Bits 1-0 for write field
  439.         or        ah,al                ; Combine two values
  440.         mov        al,0F6h
  441.         out        dx,al                ; Index the bank select register
  442.         inc        dl
  443.         in        al,dx                ; Read old value
  444.         and        al,11110000b        ; Zero out old bits
  445.         or        al,ah                ; Combine with new values
  446.         out        dx,al                ; Program the values
  447.         mov        ah,ch
  448.         and        ah,10b                ; Mask out bit 2
  449.         shl        ah,4                ; Put into bit 5
  450.         mov        dx,3CCh                ; Address Miscellaneous register
  451.         in        al,dx                ; Read old value
  452.         and        al,0DFh                ; Zero bit 5
  453.         mov        dx,3C2h
  454.         or        al,ah                ; Or in the page bit
  455.         out        dx,al                ; Program the new value
  456.         pop        dx
  457.         pop        cx
  458.         pop        ax
  459.         sti
  460.         ret
  461.  
  462. VIDEO7V5_bank:
  463.         mov        [CurBank],ax        ; Save the new bank number for later
  464.         cli
  465.         push    ax
  466.         push    dx
  467.         and        al,0Fh                ; Mask to 4 bits
  468.         shl        al,4                ; Shift into bits 7-4
  469.         mov        ah,al
  470.         mov        dx,3C4h
  471.         mov        al,0E8h                ; Index of write bank register
  472.         out        dx,ax                ; Program the write bank
  473.         mov        al,0E9h                ; Index of read bank register
  474.         out        dx,ax                ; Program the read bank
  475.         pop        dx
  476.         pop        ax
  477.         sti
  478.         ret
  479.  
  480. ET3000_bank:
  481.         mov        [CurBank],ax        ; Save the new bank number for later
  482.         cli
  483.         push    ax
  484.         push    dx
  485.         and        al,7                ; Mask out bottom 3 bits
  486.         mov        ah,al                ; Combine read and write bank values in al
  487.         shl        ah,3
  488.         or        al,ah
  489.         or        al,40h                ; Set bit 6 to select 64k segments
  490.         mov        dx,3CDh                ; Point to memory segment register
  491.         out        dx,al                ; Set the new bank value
  492.         pop        dx
  493.         pop        ax
  494.         sti
  495.         ret
  496.  
  497. ET4000_bank:
  498.         mov        [CurBank],ax        ; Save the new bank number for later
  499.         cli
  500.         push    ax
  501.         push    dx
  502.         and        al,0Fh                ; Mask out bottom 4 bits
  503.         mov        ah,al                ; Combine read and write values in al
  504.         shl        ah,4
  505.         or        al,ah
  506.         mov        dx,3CDh                ; Point to memory segment register
  507.         out        dx,al                ; Set the new bank value
  508.         pop        dx
  509.         pop        ax
  510.         sti
  511.         ret
  512.  
  513. S3_bank:
  514.         mov        [CurBank],ax        ; Save the new bank number for later
  515.         cli
  516.         push    ax
  517.         push    cx
  518.         push    dx
  519.         mov        dx,3D4h
  520.         cmp        [CntColors],gr16Color
  521.         jne        @@S31
  522.         shl        al,2                ; bank = bank * 4 in 16 color modes
  523. @@S31:    and        al,0Fh                ; Mask off all but bottom 4 bits
  524.         mov        cl,al
  525.         mov        ax,4838h            ; Enable extended registers
  526.         out        dx,ax
  527.         mov        al,31h                ; Index of S3R1
  528.         out        dx,al
  529.         inc        dl
  530.         in        al,dx                ; Read value of S3R1
  531.         or        al,9                ; Set bits 0 and 3
  532.         or         al,1001b
  533.         out        dx,al                ; Write value back again
  534.         dec        dl
  535.         mov        al,35h                ; Index of S3R5
  536.         out        dx,al
  537.         inc        dl
  538.         in        al,dx                ; Read value of S3R5
  539.         and        al,0F0h                ; Mask off low nybble
  540.         or        al,cl                ; Or in new bank number
  541.         out        dx,al                ; Write the value back again
  542.         dec        dl
  543.         mov        ax,0038h            ; Disable extended registers
  544.         out        dx,ax
  545.         pop        dx
  546.         pop        cx
  547.         pop        ax
  548.         sti
  549.         ret
  550.  
  551. CIRRUS_bank:
  552.         mov        [CurBank],ax        ; Save the new bank number for later
  553.         cli
  554.         push    ax
  555.         push    dx
  556.         mov        dx,3CEh
  557.         shl        al,4                ; Convert to 4k bank number
  558.         mov        ah,al
  559.         mov        al,9
  560.         out        dx,ax
  561.         pop        dx
  562.         pop        ax
  563.         sti
  564.         ret
  565.  
  566. ACUMOS_bank:
  567.         mov        [CurBank],ax        ; Save the new bank number for later
  568.         cli
  569.         push    ax
  570.         push    dx
  571.         mov        dx,3CEh
  572.         shl        al,4                ; Convert to 4k bank number
  573.         mov        ah,al
  574.         mov        al,9
  575.         out        dx,ax
  576.         pop        dx
  577.         pop        ax
  578.         sti
  579.         ret
  580.  
  581. AL2101_bank:
  582.         mov        [CurBank],ax        ; Save the new bank number for later
  583.         cli
  584.         push    ax
  585.         push    dx
  586.         mov        dx,3D6h
  587.         out        dx,al                ; Set read bank register
  588.         inc        dx
  589.         out        dx,al                ; Set write bank
  590.         pop        dx
  591.         pop        ax
  592.         sti
  593.         ret
  594.  
  595. MXIC_bank:
  596.         mov        [CurBank],ax        ; Save the new bank number for later
  597.         cli
  598.         push    ax
  599.         push    dx
  600.         and        al,0Fh                ; Mask out all but 4 bottom bits
  601.         mov        ah,al                ; Combine read/write bank numbers
  602.         shl        al,4
  603.         or        ah,al
  604.         mov        al,0C5h                ; Index of bank switch register
  605.         mov        dx,3C4h
  606.         out        dx,ax                ; Set the register value
  607.         pop        dx
  608.         pop        ax
  609.         sti
  610.         ret
  611.  
  612. P2000_bank:
  613.         mov        [CurBank],ax        ; Save the new bank number for later
  614.         cli
  615.         push    ax
  616.         push    dx
  617.         mov        dx,3D6h
  618.         out        dx,al                ; Set write bank register
  619.         inc        dx
  620.         out        dx,al                ; Set read bank
  621.         pop        dx
  622.         pop        ax
  623.         sti
  624.         ret
  625.  
  626. RT3106_bank:
  627.         mov        [CurBank],ax        ; Save the new bank number for later
  628.         cli
  629.         push    ax
  630.         push    dx
  631.         mov        dx,3D6h
  632.         out        dx,al                ; Set write bank register
  633.         inc        dx
  634.         out        dx,al                ; Set read bank
  635.         pop        dx
  636.         pop        ax
  637.         sti
  638.         ret
  639.  
  640. ;----------------------------------------------------------------------------
  641. ; ReadBank    Change to a new 64k read bank on a SuperVGA card
  642. ;----------------------------------------------------------------------------
  643. ;
  644. ; Changes to a new 64k bank for reading given the specified index. The write
  645. ; bank should be preserved across this call.We also trash the value in
  646. ; CurBank to indicate that bank switching needs to be done again to set
  647. ; the read and write banks to the same value.
  648. ;
  649. ; Note that the value of all regs MUST be preserved across this call.
  650. ;
  651. ; Entry:        AX    - Number of 64k bank (0-15 for 1Mb cards)
  652. ;
  653. ; Registers:    None.
  654. ;
  655. ;----------------------------------------------------------------------------
  656.  
  657. VESA_rbank:
  658.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  659.         push    ax
  660.         push    bx
  661.         push    dx
  662.         mul        [VesaGran]            ; Adjust with granularity factor
  663.         mov        dx,ax                ; Select window position
  664.         xor        bh,bh                ; BH := 0 (Select SVGA memory window)
  665.         mov        bl,1                ; Window to set
  666.         call    [VesaBank]            ; Change bank
  667.         pop        dx
  668.         pop        bx
  669.         pop        ax
  670.         ret
  671.  
  672. ATI_rbank:
  673.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  674.         cli
  675.         push    ax
  676.         push    dx
  677.         and        al,0Fh                ; Mask out bottom four bits
  678.         rol        al,5                ; Shift read bank into position
  679.         mov        ah,al
  680.         mov        dx,1CEh                ; Port of extended registers
  681.         mov        al,0B2h
  682.         out        dx,al                ; Index ATI bank register
  683.         inc        dl
  684.         in        al,dx
  685.         and        al,01Eh                ; Zero out bits 7-5 and bit 0
  686.         or        ah,al                ; AL := combined value
  687.         mov        al,0B2h
  688.         out        dx,ax                ; Ouput the new value
  689.         pop        dx
  690.         pop        ax
  691.         sti
  692.         ret
  693.  
  694. AHEADB_rbank:
  695.         mov        [CurBank],ax        ; Save the new bank number for later
  696.         cli
  697.         push    ax
  698.         push    dx
  699.         mov        ah,al                ; Read bank number in bits 3-0
  700.         mov        al,0Dh                ; Index of Bank Switch register
  701.         mov        dx,3CEh
  702.         out        dx,al
  703.         inc        dl
  704.         in        al,dx                ; Read old register value
  705.         and        al,0F0h                ; Mask out bits 3-0
  706.         or        al,ah                ; Combine with new value
  707.         out        dx,al                ; Set the new register value
  708.         pop        dx
  709.         pop        ax
  710.         sti
  711.         ret
  712.  
  713. GENOA_rbank:
  714.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  715.         cli
  716.         push    ax
  717.         push    dx
  718.         and        al,7                ; Mask out bottom three bits
  719.         mov        ah,al
  720.         mov        dx,3C4h
  721.         mov        al,6                ; Index of Memory Segment Register
  722.         out        dx,al                ; Output index
  723.         inc        dl
  724.         in        al,dx                ; Read current value
  725.         and        al,0F8h                ; Zero bits 2-0
  726.         or        al,ah                ; Or in new value
  727.         out        dx,al                ; Output the new bank
  728.         pop        dx
  729.         pop        ax
  730.         sti
  731.         ret
  732.  
  733. OAK_rbank:
  734.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  735.         cli
  736.         push    ax
  737.         push    dx
  738.         and        al,15
  739.         mov        ah,al                ; AH := read bank number
  740.         mov        al,11h                ; Index of bank switch register
  741.         mov        dx,3DEh
  742.         out        dx,al
  743.         inc        dl
  744.         in        al,dx                ; Read old value
  745.         and        al,0F0h                ; Mask out read bank value
  746.         or        al,ah                ; Or in new value
  747.         out        dx,al                ; Program the new value
  748.         pop        dx
  749.         pop        ax
  750.         sti
  751.         ret
  752.  
  753. PARADISE_rbank:
  754.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  755.         cli
  756.         push    ax
  757.         push    dx
  758.         mov        dx,3CEh
  759.         shl        al,4                ; change 64k bank into 4k bank number
  760.         mov        ah,al
  761.         mov        al,09h                ; Index of PROA register (read bank)
  762.         out        dx,ax                ; Program PROA register
  763.         pop        dx
  764.         pop        ax
  765.         sti
  766.         ret
  767.  
  768. NCR_rbank:
  769.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  770.         cli
  771.         push    ax
  772.         push    dx
  773.         shl        al,2                ; Change 64k bank into 16k bank number
  774.         cmp        [CntColors],gr16Color
  775.         jne        @@NCR2
  776.         shl        al,2                ; Change 64k bank into 4k bank number
  777. @@NCR2:    mov        ah,al
  778.         mov        al,1Ch
  779.         mov        dx,3C4h
  780.         out        dx,ax                ; Set read bank number
  781.         pop        dx
  782.         pop        ax
  783.         sti
  784.         ret
  785.  
  786. VIDEO7V5_rbank:
  787.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  788.         cli
  789.         push    ax
  790.         push    dx
  791.         and        al,0Fh                ; Mask to 4 bits
  792.         shl        al,4                ; Shift into bits 7-4
  793.         mov        ah,al
  794.         mov        dx,3C4h
  795.         mov        al,0E9h                ; Index of read bank register
  796.         out        dx,al                ; Program the value
  797.         pop        dx
  798.         pop        ax
  799.         sti
  800.         ret
  801.  
  802. ET3000_rbank:
  803.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  804.         cli
  805.         push    ax
  806.         push    dx
  807.         mov        ah,bl                ; Save value of bl
  808.         and        al,7                ; Mask out bottom 3 bits
  809.         shl        al,3                ; Shift into position
  810.         mov        bl,al
  811.         mov        dx,3CDh
  812.         in        al,dx                ; Read current value
  813.         and        al,0C7h                ; Mask out read bank select value
  814.         or        al,bl                ; Or in the new read bank value
  815.         out        dx,al                ; Set the new bank value
  816.         mov        bl,ah                ; Restore value of bl
  817.         pop        dx
  818.         pop        ax
  819.         sti
  820.         ret
  821.  
  822. ET4000_rbank:
  823.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  824.         cli
  825.         push    ax
  826.         push    dx
  827.         mov        ah,bl                ; Save value of bl
  828.         and        al,0Fh                ; Mask out bottom 4 bits
  829.         shl        al,4                ; Shift into position
  830.         mov        bl,al
  831.         mov        dx,3CDh
  832.         in        al,dx                ; Read current value
  833.         and        al,00Fh                ; Mask out read bank select bits 7-4
  834.         or        al,bl                ; Or in the new read bank value
  835.         out        dx,al                ; Set the new bank value
  836.         mov        bl,ah                ; Restore value of bl
  837.         pop        dx
  838.         pop        ax
  839.         sti
  840.         ret
  841.  
  842. AL2101_rbank:
  843.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  844.         cli
  845.         push    ax
  846.         push    dx
  847.         mov        dx,3D6h
  848.         out        dx,al                ; Set read bank register
  849.         pop        ax
  850.         pop        dx
  851.         sti
  852.         ret
  853.  
  854. MXIC_rbank:
  855.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  856.         cli
  857.         push    ax
  858.         push    dx
  859.         and        al,0Fh                ; Mask out all but 4 bottom bits
  860.         shl        al,4
  861.         mov        ah,al
  862.         mov        al,0C5h                ; Index of bank switch register
  863.         mov        dx,3C4h
  864.         out        dx,al
  865.         inc        dx
  866.         in        al,dx                ; Read old value
  867.         and        al,0Fh                ; Mask out old read bank values
  868.         or        al,ah
  869.         out        dx,al                ; Set the register value
  870.         pop        dx
  871.         pop        ax
  872.         sti
  873.         ret
  874.  
  875. P2000_rbank:
  876.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  877.         cli
  878.         push    ax
  879.         push    dx
  880.         mov        dx,3D7h
  881.         out        dx,al                ; Set read bank
  882.         pop        dx
  883.         pop        ax
  884.         sti
  885.         ret
  886.  
  887. RT3106_rbank:
  888.         mov        [CurBank],0FFh        ; Trash CurBank with invalid value
  889.         cli
  890.         push    ax
  891.         push    dx
  892.         mov        dx,3D6h
  893.         out        dx,al                ; Set read bank register
  894.         pop        ax
  895.         pop        dx
  896.         sti
  897.         ret
  898.  
  899. ;----------------------------------------------------------------------------
  900. ; InitBank    Initialise the SuperVGA card for bank switching if required
  901. ;----------------------------------------------------------------------------
  902. ;
  903. ; Peforms any initialisations required by the SuperVGA card prior to bank
  904. ; switching (accessing extended registers, setting the mode etc).
  905. ;
  906. ; Note:    All register may be used without concern for saving their values
  907. ;
  908. ; Registers:    All.
  909. ;
  910. ;----------------------------------------------------------------------------
  911.  
  912. PROC    NONE_init    near
  913.         ret
  914. ENDP    NONE_init
  915.  
  916. ;----------------------------------------------------------------------------
  917. ; VESA_init
  918. ;----------------------------------------------------------------------------
  919. ; We have a VESA SuperVGA adapter, so determine the granularity and address
  920. ; of the VESA bank switching routine. We simply determine whether we are
  921. ; in 16 or 256 color video modes, and get information about these modes.
  922. ;----------------------------------------------------------------------------
  923. PROC    VESA_init    near
  924.  
  925.         push    cs
  926.         pop        es
  927.         mov        di,offset VesaBuf    ; ES:DI -> Buffer for VESA info
  928.         mov        bx,[CntMode]
  929.         mov        si,offset VesaModes    ; CS:SI -> Table of VESA video modes
  930.  
  931.         mov        cx,102h                ; 800 x 600 16 color
  932.         cmp        bx,grVGA_640x480x16
  933.         jle        @@NonVESA
  934.         mov        cx,101h                ; 640 x 480 256 color
  935.         cmp        bx,grVGA_320x200x256
  936.         je        @@NonVESA
  937.  
  938. @@ModeLoop:
  939.         lods    [WORD cs:si]
  940.         mov        cx,ax                ; CX := VESA Mode Number
  941.         jcxz    @@Exit                ; Fall through if no match
  942.         lods    [WORD cs:si]
  943.         cmp        ax,bx
  944.         jne        @@ModeLoop
  945.  
  946.         mov        ax,4F01h
  947.         int        10h                    ; Call the video BIOS to get info
  948.  
  949.         mov        ax,[CntMode]
  950.         mov        bx,[WORD VesaBuf+16]
  951.         call    setBytesPerLine
  952.         mov        [BytesPerLine],bx
  953.         jmp        @@SaveValues
  954.  
  955. @@NonVESA:
  956.         mov        ax,4F01h
  957.         int        10h
  958.  
  959. @@SaveValues:
  960.         mov        ax,[WORD VesaBuf+12]; Save pointer to bank switching routine
  961.         mov        [WORD VesaBank],ax
  962.         mov        ax,[WORD VesaBuf+14]
  963.         mov        [WORD VesaBank+2],ax
  964.  
  965.         mov        cx,[WORD VesaBuf+4]    ; Load VESA granularity value
  966.         mov        al,1
  967.         cmp        cx,0                ; Some BIOS'S fuck this up!
  968.         je        @@NoDivide
  969.         mov        ax,64
  970.         div        cl
  971. @@NoDivide:
  972.         mov     [VesaGran],al        ; Save the granularity scale factor
  973.  
  974. ; Now determine if this video card supports multiple banks
  975.  
  976.         mov        ax,[WORD VesaBuf+2]    ; Get Window attributes
  977.         and        ah,0111b            ; Mask out appropriate bits
  978.         cmp        ah,0011b            ; Check if second window is only readable
  979.         jne        @@Exit                ; No, so we are done
  980.  
  981.         mov        [TwoBanks],true
  982.         mov        [ReadBank],offset VESA_rbank
  983.  
  984. @@Exit:
  985.         ret
  986.  
  987. ENDP    VESA_init
  988.  
  989. ;----------------------------------------------------------------------------
  990. ; ATI_init
  991. ;----------------------------------------------------------------------------
  992. ; We have an ATI video card. The 18800-1 and 28800 chips support the dual
  993. ; paging mode, but the old 18800 chip does not.
  994. ;----------------------------------------------------------------------------
  995. PROC    ATI_init near
  996.  
  997.         push    bp
  998.  
  999.         cmp        [CntChipID],grATI_18800
  1000.         jne        @@Not18800
  1001.  
  1002. ; We have an 18800 based ATI SuperVGA, so modify to not use separate read
  1003. ; write banks.
  1004.  
  1005.         mov        [TwoBanks],false
  1006.         mov        [ReadBank],offset ATI_bank
  1007.         jmp        @@Exit
  1008.  
  1009. ; We have an 18800-1 or 28800 Chip, so setup for dual bank mode
  1010.  
  1011. @@Not18800:
  1012.         modinx    1CEh, 0BEh, 01000b, 01000b    ; Set bit 3 ATI Register E
  1013.  
  1014. @@Exit:
  1015.         pop        bp
  1016.         ret
  1017.  
  1018. ENDP    ATI_init
  1019.  
  1020. ;----------------------------------------------------------------------------
  1021. ; AHEAD_init
  1022. ;----------------------------------------------------------------------------
  1023. ; We have an Ahead A or B SuperVGA. We simply enable the extended registers
  1024. ; to save time during bank switching.
  1025. ;----------------------------------------------------------------------------
  1026. PROC    AHEAD_init    near
  1027.  
  1028.         outp    3CEh, 0Fh, 20h        ; Enable extended registers
  1029.         modinx    3CEh, 0Ch, 20h, 20h    ; Enable enhanced mode
  1030.         ret
  1031.  
  1032. ENDP    AHEAD_init
  1033.  
  1034. ;----------------------------------------------------------------------------
  1035. ; CHIPS_init
  1036. ;----------------------------------------------------------------------------
  1037. ; We have a Chips & Technologies 82c451/452/453. To save time during
  1038. ; bank switching, we enable the SuperVGA extended registers here.
  1039. ; We also determine the type of chipset installed and setup bank switching
  1040. ; and page flipping according to the chip type.
  1041. ;----------------------------------------------------------------------------
  1042. PROC    CHIPS_init    near
  1043.  
  1044.         outp    46E8h, 1Eh            ; Place chip in setup mode
  1045.         outp    103h, 80h            ; Enable extended registers
  1046.         outp    46E8h, 0Eh            ; Bring chip out of setup mode
  1047.         modinx    3D6h, 4, 4, 4        ; Enable bank access and extended CRTC
  1048.         modinx    3D6h, 0Dh, 3, 1        ; Enable extended paging
  1049.  
  1050. ; Set the bank switching code according to the C&T chipset type
  1051.  
  1052.         mov        bx,[CntChipID]        ; BX := chip id
  1053.  
  1054.         cmp        bx,grCHIPS_82c451
  1055.         je        @@Chips451            ; Done for 82c451
  1056.         cmp        bx,grCHIPS_82c452
  1057.         je        @@Chips452
  1058.  
  1059.         mov        [NewBank],offset CHIPS453_bank
  1060.         mov        [ReadBank],offset CHIPS453_bank
  1061.         jmp        @@Exit
  1062.  
  1063. @@Chips452:
  1064.         mov        [NewBank],offset CHIPS452_bank
  1065.         mov        [ReadBank],offset CHIPS452_bank
  1066.         jmp        @@Exit
  1067.  
  1068. ; Extended page flipping is not available on 82c451 chips, so disable it
  1069.  
  1070. @@Chips451:
  1071.         mov        [WORD cs:CHIPSPageOfs],offset NONE_page
  1072.  
  1073. @@Exit:
  1074.         ret
  1075.  
  1076. ENDP    CHIPS_init
  1077.  
  1078. ;----------------------------------------------------------------------------
  1079. ; EVEREX_init
  1080. ;----------------------------------------------------------------------------
  1081. ; Some Everex video boards are based on Trident or ET4000 chips. Detect
  1082. ; them here, and setup to use the correct bank switching and page flipping
  1083. ; routines.
  1084. ;----------------------------------------------------------------------------
  1085. PROC    EVEREX_init        near
  1086.  
  1087.         mov        ax,[CntChipID]        ; AX := chipset ID
  1088.         cmp        ax,grEVEREX_Ev236    ; UltraGraphics - Trident Chip
  1089.         je        @@TridentChip
  1090.         cmp        ax,grEVEREX_Ev620    ; Vision VGA - Trident Chip
  1091.         je        @@TridentChip
  1092.         cmp        ax,grEVEREX_Ev629    ; ViewPoint TC - ET4000 Chip
  1093.         je        @@ET4000Chip
  1094.         cmp        ax,grEVEREX_Ev673    ; EVGA - Trident Chip
  1095.         je        @@TridentChip
  1096.         cmp        ax,grEVEREX_Ev678    ; Viewpoint - Trident Chip
  1097.         jne        @@Exit                ; Normal Everex chip, all done
  1098.  
  1099. ; Based on Trident chip, so determine the type (8800 or 8900).
  1100.  
  1101. @@TridentChip:
  1102.         mov        [TwoBanks],false
  1103.         mov        [NewBank],offset TRIDENT_bank
  1104.         mov        [ReadBank],offset TRIDENT_bank
  1105.         mov        [WORD cs:EVEREXPageOfs],offset TRIDENT88_page
  1106.  
  1107.         wrinx    3C4h, 0Bh, 0        ; Force old definitions
  1108.         inp        3C5h                ; Force new definitions
  1109.         and        al,0Fh
  1110.         cmp        al,2
  1111.         je        @@Exit                ; Done for Trident 8800
  1112.         mov        [WORD cs:EVEREXPageOfs],offset TRIDENT89_page
  1113.         jmp        @@Exit
  1114.  
  1115. @@ET4000Chip:
  1116.         mov        [TwoBanks],true
  1117.         mov        [NewBank],offset ET4000_bank
  1118.         mov        [ReadBank],offset ET4000_rbank
  1119.         mov        [WORD cs:EVEREXPageOfs],offset ET4000_page
  1120.         jmp        @@Exit
  1121.  
  1122. @@Exit:
  1123.         ret
  1124.  
  1125. ENDP    EVEREX_init
  1126.  
  1127. ;----------------------------------------------------------------------------
  1128. ; PARADISE_init
  1129. ;----------------------------------------------------------------------------
  1130. ; We have a Paradise PVGA1A or WD90Cxx SuperVGA. We simply enable access
  1131. ; to the extended registers to save time during bank switching.
  1132. ;----------------------------------------------------------------------------
  1133. PROC    PARADISE_init    near
  1134.  
  1135. ; Enable paradise extensions
  1136.  
  1137.         wrinx    3CEh, 0Fh, 5        ; Turn off write protect on VGA registers
  1138.         wrinx    3C4h, 6h, 48h        ; Unlock extended sequencer regs
  1139.         wrinx    3D4h, 29h, 85h        ; Turn on access to PR10-17
  1140.  
  1141. ; Turn off the standard VGA mem bit, to allow access to all of the SuperVGA
  1142. ; video memory for extended page flipping.
  1143.  
  1144.         modinx    3D4h, 2Fh, 2, 0        ; Clear out the VGA MEM bit
  1145.  
  1146. ; Now determine the Paradise Chipset type. The WD90C10 and above chipsets
  1147. ; support the dual banking mode.
  1148.  
  1149.         cmp        [CntChipID],grPARA_90C10
  1150.         jge        @@HaveDualMode
  1151.  
  1152. ; Have an old PVGA1 or WD90C00 video card without dual banking support
  1153.  
  1154.         mov        [TwoBanks],false
  1155.         mov        [NewBank],offset PARADISEPVGA_bank
  1156.         mov        [ReadBank],offset PARADISEPVGA_bank
  1157.         jmp        @@Exit
  1158.  
  1159. ; We have a WD90C1x/3x chipset, so set up for dual banking
  1160. ; operation (read/write operation).
  1161.  
  1162. @@HaveDualMode:
  1163.         modinx    3CEh, 0Bh, 8, 8        ; Enable both PROA and PROB
  1164.         modinx    3C4h, 11h, 80h, 80h    ; Set PROA for read, PROB for write
  1165.  
  1166. @@Exit:
  1167.         ret
  1168.  
  1169. ENDP    PARADISE_init
  1170.  
  1171. ;----------------------------------------------------------------------------
  1172. ; TRIDENT_init
  1173. ;----------------------------------------------------------------------------
  1174. ; We have a Trident 8800 or 8900 SuperVGA. Setup for a pagesize of 64k
  1175. ; before doing bank switching.
  1176. ;----------------------------------------------------------------------------
  1177. PROC    TRIDENT_init
  1178.  
  1179.         modinx    3CEh, 6, 4, 4        ;  Set pagesize to 64k
  1180.         ret
  1181.  
  1182. ENDP    TRIDENT_init
  1183.  
  1184. ;----------------------------------------------------------------------------
  1185. ; VIDEO7_init
  1186. ;----------------------------------------------------------------------------
  1187. ; We have a Video7 V7VGA SuperVGA. Enable access to the extended registers
  1188. ; to save time during bank switching.
  1189. ;----------------------------------------------------------------------------
  1190. PROC    VIDEO7_init
  1191.  
  1192.         outp    3C4h, 6, 0EAh        ; Enable extended registers
  1193.  
  1194. ; Determine if the chip is revision five or later, so we can support
  1195. ; dual read/write bank operation.
  1196.  
  1197.         rdinx    3C4h, 08Eh            ; Read Chip Revision register
  1198.         cmp        al,05Ah                ; Is this a version 5 chip?
  1199.         jl        @@HaveV5            ; We have a version 5 or later chip
  1200.  
  1201. ; If the card is a 1024i, I am not sure if it has a version 4 or version 5
  1202. ; chip in it. I assume here that it has a version 5 chip. If it does not,
  1203. ; (or does not seem to work), uncomment the following code and replace
  1204. ; the above line:
  1205. ;
  1206. ;        jg        @@NotV5                ; version 1-3 V7VGA's
  1207. ;        cmp        al,050h
  1208. ;        jge        @@HaveV5            ; Yes, version 5 chip
  1209.  
  1210. @@NotV5:
  1211.         mov        [TwoBanks],false
  1212.         mov        [NewBank],offset VIDEO7_bank
  1213.         mov        [ReadBank],offset VIDEO7_bank
  1214.         jmp        @@Exit
  1215.  
  1216. ; We have a V7VGA revision 5 or later chip, so setup for dual paging
  1217. ; mode
  1218.  
  1219. @@HaveV5:
  1220.         modinx    3C4h, 0E0h, 80h, 80h    ; Set split bank mode
  1221.  
  1222. @@Exit:
  1223.         ret
  1224.  
  1225. ENDP    VIDEO7_init
  1226.  
  1227. ;----------------------------------------------------------------------------
  1228. ; ET4000_init
  1229. ;----------------------------------------------------------------------------
  1230. ; We have an ET4000 video card, so enable access to extended registers
  1231. ; before bank switching.
  1232. ;----------------------------------------------------------------------------
  1233. PROC    ET4000_init
  1234.  
  1235.         outp    3BFh, 3
  1236.         outp    3D8h, 0A0h            ; Enable ET4000 extensions
  1237.  
  1238. ; Check the type of video board, modifying the 24 bit mode tables if
  1239. ; we have a Speedstar 24 or Genoa 7900 board.
  1240.  
  1241.         cmp        [CntChipID],grET4000_MEGAEVA
  1242.         je        @@Done
  1243.  
  1244. ; We have a Speedstar 24 or Genoa 7900, both which only support the
  1245. ; 640x480 video modes. Note that on both these cards, the bytes per line
  1246. ; value for the mode is 2048, not 1920 (so you don't have problems with
  1247. ; pixels crossing bank boundaries!!).
  1248.  
  1249.         mov        [DWORD cs:ET4_640x350x16m],0
  1250.         mov        [DWORD cs:ET4_640x400x16m],0
  1251.         mov        bx,2048
  1252.         mov        ax,grSVGA_640x480x16m
  1253.         call    setBytesPerLine
  1254.  
  1255.         cmp        [CntChipID],grET4000_SPEEDSTAR
  1256.         jne        @@HaveGenoa
  1257.  
  1258.         mov        [DWORD cs:ET4_640x480x16m],02E10E0h
  1259.         jmp        @@Done
  1260.  
  1261. @@HaveGenoa:
  1262.         mov        [DWORD cs:ET4_640x480x16m],03E10F0h
  1263.  
  1264. @@Done:
  1265.         ret
  1266.  
  1267. ENDP
  1268.  
  1269. ;----------------------------------------------------------------------------
  1270. ; NCR_init
  1271. ;----------------------------------------------------------------------------
  1272. ; We have an NCR 77C22E SuperVGA, so set up for dual banking mode of
  1273. ; operation. We also program the low portions of the bank switching
  1274. ; registers with zeroes.
  1275. ;----------------------------------------------------------------------------
  1276. PROC    NCR_init
  1277.  
  1278.         modinx    3C4h, 1Eh, 010100b, 010100b
  1279.         wrinx    3C4h, 19h, 0    ; Set primary offset low to 0
  1280.         wrinx    3C4h, 1Dh, 0    ; Set secondary offset low to 0
  1281.         ret
  1282.  
  1283. ENDP
  1284.  
  1285. ;----------------------------------------------------------------------------
  1286. ; S3_init
  1287. ;----------------------------------------------------------------------------
  1288. ; We have an S3 based video card, so set up a few things specific to this
  1289. ; card.
  1290. ;----------------------------------------------------------------------------
  1291. PROC    S3_init
  1292.  
  1293. ; The S3 Chipset uses large bytes per line values in 256, 32k and 64k
  1294. ; color video modes to make the copper's life a little easier (and ours
  1295. ; a little harder :-). Change the bytes per line values in the table
  1296. ; to the correct values.
  1297.  
  1298.         call    ModifyS3BytesPerLine
  1299.         ret
  1300.  
  1301. ENDP    S3_init
  1302.  
  1303. ;----------------------------------------------------------------------------
  1304. ; CIRRUS_init
  1305. ;----------------------------------------------------------------------------
  1306. ; We have a Cirrus 5422 SuperVGA, so enable access to extended registers.
  1307. ;----------------------------------------------------------------------------
  1308. PROC    CIRRUS_init
  1309.  
  1310.         wrinx    3C4h, 6, 12h        ; Enable extended registers
  1311.         ret
  1312.  
  1313. ENDP    CIRRUS_init
  1314.  
  1315. ;----------------------------------------------------------------------------
  1316. ; ACUMOS_init
  1317. ;----------------------------------------------------------------------------
  1318. ; We have an AcuMos SuperVGA, so enable access to extended registers.
  1319. ;----------------------------------------------------------------------------
  1320. PROC    ACUMOS_init
  1321.  
  1322.         wrinx    3C4h, 6, 12h        ; Enable extended registers
  1323.         ret
  1324.  
  1325. ENDP    ACUMOS_init
  1326.  
  1327. ;----------------------------------------------------------------------------
  1328. ; AL2101_init
  1329. ;----------------------------------------------------------------------------
  1330. ; We have an Advance Logic 2101 SuperVGA, so set up for separate read
  1331. ; write bank switching. This is supposed to work according to the
  1332. ; docs on the AL2101, but it doesn't (it works for the RealTek instead!)
  1333. ; Very wierd!!
  1334. ;----------------------------------------------------------------------------
  1335. PROC    AL2101_init
  1336.  
  1337. ;        modinx    3CEh, 0Fh, 4, 4    ; Set bit 2 of Extended function register
  1338.         ret
  1339.  
  1340. ENDP    AL2101_init
  1341.  
  1342. ;----------------------------------------------------------------------------
  1343. ; MXIC_init
  1344. ;----------------------------------------------------------------------------
  1345. ; We have an MXIC SuperVGA, so enable access to extended registers.
  1346. ;----------------------------------------------------------------------------
  1347. PROC    MXIC_init
  1348.  
  1349.         wrinx    3C4h, 0A7h, 087h    ; Enable extended registers
  1350.         ret
  1351.  
  1352. ENDP    MXIC_init
  1353.  
  1354. ;----------------------------------------------------------------------------
  1355. ; RT3106_init
  1356. ;----------------------------------------------------------------------------
  1357. ; We have a RealTek 3106 SuperVGA. This code is supposed to work on the
  1358. ; advance logic's ALG2101 chip, but apparantly works on the RT3106!
  1359. ;----------------------------------------------------------------------------
  1360. PROC    RT3106_init
  1361.  
  1362.         modinx    3CEh, 0Fh, 4, 4    ; Set bit 2 of Extended function register
  1363.         ret
  1364.  
  1365. ENDP    RT3106_init
  1366.  
  1367. ;----------------------------------------------------------------------------
  1368. ; ExitBank    Deinitialises the SuperVGA card back to normal operation.
  1369. ;----------------------------------------------------------------------------
  1370. ;
  1371. ; Returns the SuperVGA card back to it's default state, such as turning
  1372. ; off access to all extended registers that were set by the initialisation
  1373. ; routines.
  1374. ;
  1375. ; Note:    All register may be used without concern for saving their values
  1376. ;
  1377. ; Registers:    All.
  1378. ;
  1379. ;----------------------------------------------------------------------------
  1380.  
  1381. PROC    NONE_exit    near
  1382.         ret
  1383. ENDP    NONE_exit
  1384.  
  1385. PROC    AHEAD_exit    near
  1386.  
  1387.         outp    3CEh, 0Fh, 0        ; Disable extended registers
  1388.         ret
  1389.  
  1390. ENDP    AHEAD_exit
  1391.  
  1392. PROC    CHIPS_exit    near
  1393.  
  1394.         outp    46E8h, 1Eh            ; Place chip in setup mode
  1395.         outp    103h, 0                ; Disable extended registers
  1396.         outp    46E8h, 0Eh            ; Bring chip out of setup mode
  1397.         ret
  1398.  
  1399. ENDP    CHIPS_exit
  1400.  
  1401. PROC    PARADISE_exit    near
  1402.  
  1403.         wrinx    3CEh, 0Fh, 0        ; Turn on write protect on VGA registers
  1404.         wrinx    3CEh, 6h, 0            ; Turn on write protect on extended seq
  1405.         ret
  1406.  
  1407. ENDP    PARADISE_exit
  1408.  
  1409. PROC    VIDEO7_exit
  1410.  
  1411.         outp    3C4h, 6, 0AEh        ; Disable extended registers
  1412.         ret
  1413.  
  1414. ENDP    VIDEO7_exit
  1415.  
  1416. PROC    CIRRUS_exit
  1417.  
  1418.         wrinx    3C4h, 6, 0            ; Disable extended registers
  1419.         ret
  1420.  
  1421. ENDP    CIRRUS_exit
  1422.  
  1423. PROC    ACUMOS_exit
  1424.  
  1425.         wrinx    3C4h, 6, 0            ; Disable extended registers
  1426.         ret
  1427.  
  1428. ENDP    ACUMOS_exit
  1429.  
  1430. PROC    MXIC_exit
  1431.  
  1432.         wrinx    3C4h, 0A7h, 0        ; Disable extended registers
  1433.         ret
  1434.  
  1435. ENDP    MXIC_exit
  1436.