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