[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]