[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]

    {
     Hi, would anyone like to tell me how to get the tweaked video
     mode With 4 pages to work With because I'm tired of the 16 color
     2 page demos I'm making.

    Sure, here's an adaptation of some code from Dr. Dobbs magazine on Mode-X.
    I've only posted the routine to set the VGA to 360x240x256 With 3 pages of
    Graphics.  Only 3 pages since the increase in resolution Uses more RAM.
    }

    Procedure InitVGA360x240;

    Const
      GC_inDEX    = $03CE;    { VGA Graphics Controller }
      SC_inDEX    = $03C4;    { VGA Sequence controller }
      CrtC_inDEX  = $03D4;    { VGA Crt Controller      }
      MISC_OUTPUT = $03C2;    { VGA Misc Register       }
      MAP_MASK    = $02;      { Map Register #          }
      READ_MAP    = $04;      { Read Map Register #     }

      VMODE_DATA  : Array[1..17] of Word =
                       ($6B00,    { Horizontal total          }
                        $5901,    { Horizontal displayed      }
                        $5A02,    { Start horizontal blanking }
                        $8E03,    { end horizontal blanking   }
                        $5E04,    { Start H sync.             }
                        $8A05,    { end H sync.               }
                        $0D06,    { Vertical total            }
                        $3E07,    { Overflow                  }
                        $4109,    { Cell height               }
                        $EA10,    { V sync. start             }
                        $AC11,    { V sync. end/Prot CR0 CR7  }
                        $DF12,    { Vertical displayed        }
                        $2D13,    { offset                    }
                        $0014,    { DWord mode off            }
                        $E715,    { V Blank start             }
                        $0616,    { V Blank end               }
                        $E317);   { Turn on Byte mode         }

    begin
      Asm
       mov   ax, $13
       int   $10

       mov   dx, SC_inDEX           { Sequencer Register }
       mov   ax, $0604              { Disable Chain 4 Mode }
       out   dx, ax

       mov   ax, $0100              { (A)synchronous Reset }
       out   dx, ax

       mov   dx, MISC_OUTPUT        { VGA Misc Register }
       mov   al, $E7                { Use 28Mhz Clock & 60Hz }
       out   dx, al

       mov   dx, SC_inDEX           { Sequencer Register }
       mov   ax, $0300              { Restart Sequencer }
       out   dx, ax

       {
         Diasable Write protect For CrtC Registers 0-7, since we are
         about to change the horizontal & vertical timing settings.
       }
       mov   dx, CrtC_inDEX         { VGA CrtC Registers }
       mov   al, $11                { CrtC register 11h }
       out   dx, al                 { Load current value }
       inc   dx                     { Point to data }
       in    al, dx                 { Get CrtC register 11h }
       and   al, $7F                { Mask out Write protect }
       out   dx, al                 { and send it back }

       { Send CrtC data in VMODE_DATA Array to the CrtC. }
       mov   dx, CrtC_inDEX         { VGA CrtC Registers }
       cld                          { Forward block load }
       mov   si, offset VMODE_DATA  { Get parameter data }
       mov   cx, 17                 { Number of entries in block }

       @@1:
         mov   ax, ds:[si]      { Get next parameter value }
         inc   si               { Advance to next Word }
         inc   si
         out   dx, ax           { Output next value }
         loop  @@1              { Process next value }

       { Clear all VGA memory to black. }
       mov   dx, SC_inDEX     { Select all planes }
       mov   ax, $0F02
       out   dx, ax

       mov   ax, VGA_SEG      { Point to VGA memory }
       mov   es, ax
       mov   di, 0

       xor   ax, ax           { clear 256K }
       mov   cx, $8000        { 32K * 2 * 4 planes }
       rep   stosw
      end;
    end;
    {
    That's about it.  The video memory in this mode is organised a bit differently
    than CGA/HERC.  It is a lot like the 16 color modes you're probably used to, in
    that you must go through the EGA/VGA Registers to access the memory, by setting
    MAP MASK & PLANE SELECT, etc.
    }

[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]