[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{RV³ok i would like some info on how to remove a tsr added to memory by a
³i'd like some info on ext. VGA screens. For examplw i know that in
³320x200x256 that one Byte is equal to one pixel. i need this Type of
³info For =< 640x480
Mode $10 (ie 640x350x16)
-------------------------
In this mode, the 256K display memory is divided into 4 bit planes of
64K each. Each pixel is produced by 4 bits, one from each bit plane, which
are combined into a 4-bit value that determines which of the 16 colors will
appear on the screen For that pixel.
There is a one-to-one correspondense between the bits in each bit plane and
the pixel on the screen. For example, bit 7 of the first Byte in each bit
plane correspond to the pixel in the upper left-hand corner of the screen.
The display memory For the 640x350 Graphics mode is mapped into memory as
a 64K block starting at A000h, With each 64K bit plane occupying the same
address space (ie: in parallel).
Because of the one-to-one relationship of bits in bit planes With the pixels
on the screen, it's straightForward to calculate the address needed to
access a particular pixel. There are 640 bits = 80 Bytes per line on the
screen. Thus the Byte address corresponding to a particular X,Y coordinate
is given by 80*Y + X/8. A desired pixel can then be picked out of the Byte
using the bit mask register.
}
Procedure PutPixel(X,Y:Integer; Color:Byte);
Var
Byte_address : Word;
wanted_pixel : Byte;
begin
Port[$3CE] := 5; (* mode register *)
Port[$3CF] := 2; (* select Write mode 2 *)
Port[$3CE] := 8; (* bit mask register *)
(* calculate pixel's Byte address *)
Byte_address := (80 * Y) + (X div 8);
(* set the bit we want *)
wanted_pixel := (1 SHL (7 - (X MOD 8)));
(* mask pixel we want *)
Port[$3CF] := $FF and wanted_pixel;
(* turn the pixel we want on *)
Mem[$A000:Byte_address] := Mem[$A000:Byte_address] or Color
end; (* PutPixel *)
Function ActiveMode : Byte;
(* Returns the current display mode *)
Var
Regs : Registers; (* Registers from Dos Unit *)
begin
Regs.AH := $0F; (* get current video mode service *)
Intr($10,Regs); (* call bios *)
ActiveMode := Reg.AL (* current display mode returns in AL *)
end;
{
Some video numbers:
CGA04 = $04; (* CGA 320x200x4 *)
CGA06 = $06; (* CGA 640x200x2 *)
EGA0D = $0D; (* 320x200x16,EGA,2 pages (64K), A0000*)
EGA0E = $0E; (* 640x200x16,EGA,4 pages(64K) " *)
EGA0F = $0F; (* 640x350 B&W,EGA,2 " " " *)
EGA10 = $10; (* 640x350x16 EGA,2 " (128K) " *)
VGA11 = $11; (* 640x480x2 B&W VGA, 4 pages (256K) " *)
VGA12 = $12; (* 640x480x16 VGA 1 page (256K) " *)
VGA13 = $13; (* 320x200x256 VGA 4 pages (256K) " *)
Example:
...
if (ActiveMode = VGA13) then
begin
....
ShowPCX256
....
end
...
}
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]