PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Grafikkartenspeicher


Lord_Otter
25.08.2002, 15:12
Hi Leute.
Da SetActivePage/SetVisualPage nicht funktioniert, habe ich mir mit hilfe von Büchern ein eigenes Grafik-System mit dem VGA-Videomodus 19 gebastelt.
Um nun mehrere Bildschirmseiten verwenden zu könen, muss ich den Grafikkartenspeicher verwenden. Weiß jemand, wie ich da ran komme ?
Ist der vieleicht bei der Adresse SegA000:0 zu finden ?
Danke im Vorraus.


Felix Kaiser
25.08.2002, 18:38
Du hast zwei Möglichkeiten, benötigen allerdings Bankswitching oder LFB (Linear Frame Buffering). Erste Möglichkeite kann immer eingesetzt werden und zwar:

Der Grafikspeicher ist in Speicherbänke aufgeteilt, alle je 64k groß. Nun kann man über die VESA VBE Funktionen auf Interrupt 10h Bankswitching Funktionen benutzen. Man kann abrufen, welche Bank wird gerade gemappt und kann auch eine wählen. Der Modus 320x200 hat genau eine Bank. Dagegen z.B. 320x400 2 Bänke. Die erste Bank deckt die ersten 65536 Pixel der Auflösung ab, wenn man auf die anderen zugreifen will, muss man die zweite Bank wählen. Der Zugriff läuft über Segment $A000 im Realmode bzw. die phys. Adresse $000A0000.

LFB erfordert VBE ab Version 2.0 und den Protected Mode. Man kann die phys. Adresse des Grafikspeichers abrufen über VBE und dann einen 32-Bit Datenselektor auf diese Adresse mappen. Man kann dann problemlos über diesen Selektor mit jedem gültigen Offset auf eines der Pixel der Auflösung zugreifen. Erst dadurch ist Grafikzugriff mit hohen Geschwindigkeiten möglich.

Lord_Otter
25.08.2002, 20:13
Ja, und meine Routinen zum Setzen eines Pixels sehen wie folgt aus und funktionieren auch:

procedure PutPixel(x,y: Word; Color: byte);ASSEMBLER
ASM
LES DI,CurVideo
ADD DI,x
MOV AX,MaxX { MaxX=X-Auflösung hier: 320 }
MUL y
ADD DI,AX
MOV AL,Color
STOSB
END;

CurBuffer ist dabei ein Zeiger auf die aktelle Bank.
Standartmäßig Ptr($A000,0) (im Realmode).

procedure Lock; { Namen von TV geklaut }
begin
CurVideo :=USVideo; { US=Unsichtbar }
Move(SVideo^,CurVideo^,$FA00);
end;

procedure UnLock; { Namen von TV geklaut }
begin
CurVideo :=SVideo; { S=Sichtbar }
Move(USVideo^,CurVideo^,$FA00);
end;

SVideo (=Sichtbar-Video) ist dabei Ptr($A000,0), aber für USVideo suche ich noch eine Adresse (Ptr($A001,0) klappt nicht).
Ich habe deutlich mehr als 64kB Speicher auf der Karte, darauf müssten doch noch weitere 64kB vorhanden sein, die ich für die zweite Bildschirmseite brauche.

Felix Kaiser
25.08.2002, 21:07
Die zweiten 64k liegen auf der zweiten Bank, also musst du über VESA VBE Funktionen auf Interrupt $10 die zweite Bank anwählen. Dann kannst du über $A000:0000 auf diese zugreifen.

$A001:0000 wäre umgerechnet nichts anderes als $A000:0010 ;)

Lord_Otter
26.08.2002, 09:45
Ja, danke.
Das mit $A001:0000 hat mich irritiert, da er das Bild nur verschoben hat.;)
Kannst du mir mal Code geben, wie ich den Interrupt 10H dafür nutzen kann ?

procedure ChangeSegA000;
begin
...
end;

Kannst du was einsetzen ?

Felix Kaiser
26.08.2002, 15:57
Ist in Ralf Brown's Interrupt Liste wunderbar beschrieben, daher werde ich es dir nicht erläutern. Falls du diese immernoch nicht hast, wirds Zeit ;)

Schlage unter Interrupt 10h nach bei AH = 4Fh (wars glaube), die VESA BIOS Extensions.

Lord_Otter
26.08.2002, 16:22
OK.
Ich habe diese Liste noch nicht, aber ich will sie mir besorgen.
Wo finde ich diese und kostet die was ?

Schutsch
19.09.2002, 18:17
Ich mag diese Planaren Modies auch nicht, aber für alte
Computer gibt es doch den Modex, welcher dann auch
320*240 erlauben würde !

Felix Kaiser
19.09.2002, 18:23
Toll, welch technische Verbesserung ;)

Solch alte Dinger kann man nur treten und ins Museum stellen. Denn selbst viele alte Non-VESA Karten verfügen über bis zu 1 oder 2MB RAM und unterstützen erste Bankswitching Funktionen.