{ KAI ROHRBACHER >> VGA Text mode (which is just an all-points-not-addressable mode, >> whereas the Graphics modes we're all familiar With are called all- >> points-addressable. The point is that whether all the points are >> addressable or not is irrevelant, but rather the "points" are >> there period.) No. The width of a normal 256 color Graphics mode counts twice compared to the pixel frequency of a 16 color mode (Text or Graphic): a 320 pixel resolution in 256 colors needs the same clock rate as a 640 pixel resolution in 16 color mode. >> Anyway, the VGA Text mode consists of 80 Characters wide >> each which are 9 points wide. Do you see where I'm going...the VGA >> ISSSSS capable of 720 pixels wide. > I wouldn't doubt it since we've seen 640x480x16 on a regular VGA. > 720 isn't far from 640. That's why it is so easy to trick the VGA into 360x400x256 or 360x480x256 modes: 80 Text columns * 9 pixels = 720 pixels. 720/2=360. Here's a small Program, demonstrating some Graphics mode; it's taken from a German computer magazine, I just ported it from "C" to TP. Note that For the same reason, I doubt that the claimed resolution 640x400x256 will run on a standard VGA: it would require a dot frequency of 1280 pixels in a 16 color mode! } Program vgademo; Uses Dos, Crt; Const maxPar = 23; Type parameter = Array [0..maxPar] of Byte; Const CrtRegVal320x240 : parameter { Static } = (95,79,80,130,84,128,13,62,0,65,0,0,0,0,0,0,234,172,223,40,0,231,6,227); CrtRegVal320x400 : parameter { Static } = (95,79,80,130,84,128,191,31,0,64,0,0,0,0,0,0,156,142,143,40,0,150,185,227); CrtRegVal360x480 : parameter { Static } = (107,89,90,142,94,138,13,62,0,64,0,0,0,0,0,0,234,172,223,45,0,231,6,227); CrtRegVal640x400 : parameter { Static } = (95,79,80,130,84,128,191,31,0,64,0,0,0,0,0,0,156,142,143,40,0,150,185,163); actualMode :Byte = 0; R640x400 = 4; R360x480 = 3; R320x400 = 2; R320x240 = 1; { die moeglichen Aufloesungen } Var ch : Char; VideoRam, zb4, {ein 1/4 der Bytes je Grafikzeile} max_X, max_Y : Word; regs : Registers; Function ReadMode : Byte; begin regs.ah := $f; intr($10, regs); ReadMode := regs.al; end; Procedure OldMode(OldMod : Byte); begin regs.ah := 0; regs.al := OldMod; intr($10, regs); end; Procedure Mode(Resolution : Word); Var Read_1, RegNumber : Word; begin regs.ax := $0012; intr($10, regs); regs.ax := $0013; intr($10, regs); portw[$3c4] := $0604; port[$3d4] := $11; Read_1 := port[$03d5] And $7f; port[$03d5] := Read_1; Case Resolution Of R320x240 : begin actualMode := R320x240; portw[$03c4] := $0100; port[$03c2] := $e3; portw[$03c4] := $0300; For RegNumber := 0 to maxPar DO portw[$03d4] := CrtRegVal320x240[RegNumber] SHL 8 + RegNumber; zb4 := 80; max_X := 319; max_Y := 239; end; R320x400 : begin actualMode := R320x400; For RegNumber := 0 to maxPar DO portw[$03d4] := CrtRegVal320x400[RegNumber] SHL 8 + RegNumber; zb4 := 80; max_X := 319; max_Y := 399; end; R360x480 : begin actualMode := R360x480; portw[$03c4] := $0100; port[$03c2] := $e7; portw[$03c4] := $0300; For RegNumber := 0 to maxPar DO portw[$03d4] := CrtRegVal360x480[RegNumber] SHL 8 + RegNumber; zb4 := 90; max_X := 359; max_Y := 479; end; R640x400 : begin actualMode := R640x400; {hier!} portw[$03c4] := $0100; port[$03c2] := $e7; portw[$03c4] := $0300; For RegNumber := 0 to maxPar DO portw[$03d4] := CrtRegVal640x400[RegNumber] SHL 8 + RegNumber; zb4 := 160; max_X := 639; max_Y := 399; end end; VideoRam := $a000; end; Procedure Paint(Resolution, Side : Word); begin Case Resolution Of R320x240 : Case Side Of 1 : VideoRam := $a000; 2 : VideoRam := $a4b0; 3 : VideoRam := $a960; else VideoRam := $a000; end; R320x400 : Case Side Of 1 : VideoRam := $a000; 2 : VideoRam := $a800; else VideoRam := $a000; end; R360x480, R640x400 : VideoRam := $a000; else VideoRam := $a000; end; end; Procedure Show(Resolution, Side : Word); Var Start : Word; begin Case Resolution Of R320x240 : Case Side Of 1 : Start := 0; 2 : Start := $4b; 3 : Start := $96; else { Default } Start := 0; end; R320x400: Case Side Of 1 : Start := 0; 2 : Start := $80; else { Default } Start := 0; end; R360x480, R640x400 : Start := 0; else { Default } Start := 0; end; portw[$03d4] := Start SHL 8 + $0c; end; Procedure SetPoint(x, y, Color : Word); Var Offset : Word; begin { if actualMode=R640x400 then Offset:=(y*zb4)+ (x shr 1 and $FE) else} Offset := (y * zb4) + (x Shr 2); portw[$03c4] := (1 Shl ((x And 3) + 8)) + 2; mem[VideoRam : Offset] := Color; end; Function GetPoint(x, y : Word) : Word; Var Offset : Word; begin { if actualMode=R640x400 then Offset:=(y*zb4)+ (x shr 1 and $FE) else} Offset := (y * zb4) + (x Shr 2); portw[$03ce] := (x And 3) SHL 8 + 4; GetPoint := mem[VideoRam : Offset]; end; { Demo-HauptProgramm } Procedure main; Var x, y, c, OldMod : Word; begin OldMod := ReadMode; { speichert alten Videomodus in Oldmod } Writeln('VGASTAR'); Writeln('320x240 (3 Seiten), 320x400 (2 Seiten ) 360x480 oder'); Writeln('640x400 Pixel in 256 Farben auf Standard-VGA mit 256K'); Writeln('1991 Ingo Spitczok von Brisinski, c''t 12/91'); Writeln(' Modus 1: 320 x 240 Pixel mit 3 Seiten'); Write('Bitte Return-Taste druecken'); ch := ReadKey; Mode(R320x240); Show(R320x240, 1); Paint(R320x240, 1); x := 0; While (x <= max_X) Do begin y := 0; While (y <= max_Y) Do begin { male in 256 Farben } SetPoint(x, y, ((x + y) And 255)); y := Succ(y) end; x := Succ(x) end; Show(R320x240, 2); Paint(R320x240, 2); x := 100; While (x < 201) Do begin y := 100; While (y < 201) Do begin { Quadrat 100x100 Pixel } SetPoint(x, y, ((x + y) And 255)); y := Succ(y) end; x := Succ(x) end; Paint(R320x240, 3); c := 0; While (c <= max_Y) Do begin SetPoint(c, c, 10); c := Succ(c) end; ch := ReadKey; Show(R320x240, 3); ch := ReadKey; Show(R320x240, 1); ch := ReadKey; OldMode(OldMod); Writeln(' Modus 2: 320 x 400 Pixel, 2 Seiten'); ch := ReadKey; Mode(R320x400); Show(R320x400, 1); Paint(R320x400, 1); x := 0; While (x <= max_X) Do begin y := 0; While (y < 200) Do begin SetPoint(x, y, ((x + y) And 255)); y := Succ(y) end; x := Succ(x) end; x := 0; While (x < 320) Do begin y := 200; While (y < 400) Do begin SetPoint(x, y, 22); y := Succ(y) end; x := Succ(x) end; Paint(R320x400, 2); x := 80; While (x < 220) Do begin y := 0; While (y <= max_Y) Do begin SetPoint(x, y, ((x + y) And 255)); y := Succ(y) end; x := Succ(x) end; ch := ReadKey; Show(R320x400, 2); ch := ReadKey; Show(R320x400, 3); Paint(R320x400, 1); x := 100; While (x < 200) Do begin y := 0; While (y < 50) Do begin c := GetPoint(x, y); { Lies die Farbe } SetPoint(x, y + 250, c); { Male die gelesene Farbe } ; y := Succ(y) end; x := Succ(x) end { For }; ch := ReadKey; OldMode(OldMod); Writeln(' Modus 3: 360 x 400 Pixel, 1 Seite'); ch := ReadKey; Mode(R360x480); x := 0; While (x < 320) Do begin y := 0; While (y < 200) Do begin SetPoint(x, y, (x And 255)); y := Succ(y) end; x := Succ(x) end; x := 0; While (x <= max_X) Do begin y := 200; While (y <= max_Y) Do begin SetPoint(x, y, y And 255); y := Succ(y) end; x := Succ(x) end; x := 320; While (x <= max_X) Do begin y := 0; While (y <= max_Y) Do begin SetPoint(x, y, 25); y := Succ(y) end; x := Succ(x) end; x := 0; While (x <= max_X) Do begin y := 400; While (y <= max_Y) Do begin SetPoint(x, y, 26); y := Succ(y) end; x := Succ(x) end; ch := ReadKey; OldMode(OldMod); Writeln(' Modus 4: 640 x 400 Pixel, 1 Seite'); ch := ReadKey; Mode(R640x400); x := 0; While (x <= max_X) Do begin y := 0; While (y <= max_Y) Do begin { male in 256 Farben }; SetPoint(x, y, ((x+y) And 255)); y := Succ(y) end; x := Succ(x) end; x := 0; While (x < 400) Do begin y := x; While (y < 400) Do begin c := GetPoint(x, y); SetPoint(x, y, 255-c); { aendere Farbe}; y := Succ(y) end; x := Succ(x) end; ch := ReadKey; OldMode(OldMod); end; Procedure SetPix(x, y, Color : Word); Var Offset : Word; begin if actualMode = R640x400 then Offset := (y * zb4) + (x shr 1 and $FE) else Offset := (y * zb4) + (x Shr 2); portw[$03c4] := (1 Shl ((x And 3) + 8)) + 2; mem[VideoRam : Offset] := Color; end; Function GetPix(x, y : Word) : Word; Var Offset : Word; begin { if actualMode=R640x400 then Offset := (y*zb4)+ (x shr 1 and $FE) else} Offset := (y * zb4) + (x Shr 2); portw[$03ce] := (x And 3) SHL 8 + 4; GetPix := mem[VideoRam : Offset]; end; begin main; end.