VGA programmierung

Hallo NG!

Kann mir vielleicht irgendjemand von euch erklären (oder eine erklärende Webseite nennen) wie ich die Register einer VGA Grafikkarte genau programmieren muss um in den Grafikmodus 640x480 bei 16 Farben zu kommen? Gerne auch 256 Farben, das sollte meine Karte unterstützten, da sie 512K RAM hat, aber da erwarte ich schon gar keinen "Strandard mehr", da es nicht mehr zum VGA Standard gehört. Ich bin hier schier am verzweifeln, da blickt doch niemand mehr durch was jetzt wo wie und warum in welchem Register eingeschaltet werden muss... Ich hab auch schon probiert unter Win98 in obigem Mode alle VGA Register auszulesen und unter Linux in der Kommandozeile (Textmode) wieder genauso reinzuschreiben, das Ergebnis ist aber nur, dass der Monitor kein Signal mehr erhält... An Bit 5 im Attributes Index Register hab ich gedacht... Im Prinzip tätes vermutlich auch ein Listung vom VGA BIOS int 10h oder ne Angabe wo das genau im Linux Kernel gemacht wird...

Gruss, Michael

Reply to
Michael Dreschmann
Loading thread data ...

Am 07.10.2008, 15:43 Uhr, schrieb Michael Dreschmann :

Im Framebuffer-Treiber? Im Vesa-VGA-Treiber? Die Auswahl dürfte nicht so groß sein...

Ansgar

--
Mails an die angegebene Adresse erreichen mich - oder auch nicht.  
Nützliche Adresse gibt's bei Bedarf!
Mail to the given address may or may not reach me - useful address will be  
given when required!
Reply to
Ansgar Strickerschmidt

Michael Dreschmann schrieb:

/usr/src/linux/drivers/video/vga16fb.c

Viele Grüße, Johannes

-- "Meine Gegenklage gegen dich lautet dann auf bewusste Verlogenheit, verlästerung von Gott, Bibel und mir und bewusster Blasphemie." -- Prophet und Visionär Hans Joss aka HJP in de.sci.physik

Reply to
Johannes Bauer

arte

Viele Informationen zu der Registerprogrammierung von vielen alten SVGA-Karten gibt es in dem vgadoc4b-Paket (frag Google).

Das d=C3=BCrften dann aber SVGA-Modi sein, und Du musst auch alle erweite= rten Register Deiner Grafikkarte auslesen. Je nach Grafikkarte ist das wegen Sperrregistern und doppelt belegten Adressen (insb. Trident) recht aufw=C3=A4ndig.

oder

drivers/video/vga16fb.c. Oder die svgalib-Quellcodes (f=C3=BCr fast jede = antike SVGA-Karte...)

dito

Reply to
Michael Karcher

Per BIOS-Aufruf ist das am einfachsten, all die Register will man nicht von Hand beschreiben, zumal ich mir auch nicht sicher wäre, ob das bei modernen Grafikkarten überhaupt noch so geht. Das BIOS wird es aber wohl noch eine Weile geben, schon damit die verschiedenen Bootloader funktionieren.

Unten ein kleines Programm, was nie zu einem Projekt geworden ist und der Anfang eines Bootloaders ist, der ein Logo anzeigt (muß zum Programm hinzukopiert werden), wenn er von Diskette gestartet wird. Sowas neumodisches wie VESA habe ich noch nie ausprobiert :-)

Wenn du tatsächlich alle Register selber setzen willst, gibt es vielleicht hier was für dich:

formatting link

%define LOGO_WIDTH 200 %define LOGO_HEIGHT 40 %define LOGO_SIZE LOGO_WIDTH*LOGO_HEIGHT+48 %define SCREEN_WIDTH 640 %define SCREEN_HEIGHT 400

bits 16 section .text org 0x7C00

start: cli jmp short main_start

;=================== for floppy FAT12 filesystem ====================== bsOEM db "DBBOOT10" ; OEM String bsSectSize dw 512 ; Bytes per sector bsClustSize db 1 ; Sectors per cluster bsRessect dw 1 ; # of reserved sectors bsFatCnt db 2 ; # of fat copies bsRootSize dw 224 ; size of root directory bsTotalSect dw 2880 ; total # of sectors if < 32 meg bsMedia db 0xF0 ; Media Descriptor bsFatSize dw 9 ; Size of each FAT bsTrackSect dw 18 ; Sectors per track bsHeadCnt dw 2 ; number of read-write heads bsHidenSect dd 0 ; number of hidden sectors bsHugeSect dd 0 ; if bsTotalSect is 0 this value is ; the number of sectors bsBootDrv db 0 ; holds drive that the bs came from bsReserv db 0 ; not used for anything bsBootSign db 29h ; boot signature 29h bsVolID dd 0 ; Disk volume ID also used for temp ; sector # / # sectors to load bsVoLabel db "BOOTMANAGER" ; Volume Label bsFSType db "FAT12 " ; File System type

;====================================================================

; ; dl = current driver id ; main_start: xor ax, ax mov ss, ax mov sp, start mov si, sp push ax pop es push ax pop ds sti cld

; load logo mov ah, 2 ; funtion 2 (load sector) mov dx, 0 ; floppy disk 0, head 0 mov cx, 2 ; track 0, sector 2 mov al, (LOGO_SIZE + 511) / 512 ; number of sectors mov bx, LOGO int 0x13 jnc load_ok

; print error string lea si, [load_error] print_error_loop: lodsb or al, al jz halt mov bx, 7 mov ah, 0x0e int 0x10 jmp short print_error_loop halt: hlt load_error db "Bootmanager: can't load sector", 0x0d, 0x0a, 0

load_ok: ; switch to graphic mode call setvideomode

; show logo mov si, LOGO cld mov dx, (SCREEN_HEIGHT - LOGO_HEIGHT) / 2 next_line: mov cx, (SCREEN_WIDTH - LOGO_WIDTH) / 2 next_pixel: lodsb call setcolor call setpixel inc cx cmp cx, (SCREEN_WIDTH - LOGO_WIDTH) / 2 + LOGO_WIDTH jne next_pixel inc dx cmp dx, (SCREEN_HEIGHT - LOGO_HEIGHT) / 2 + LOGO_HEIGHT jne next_line

end: jmp end ; set video mode to 640x480, return old mode in ax ; in: - ; out: ax setvideomode: push bx push cx push dx ; get old video mode mov ah, 0xf int 0x10 xor ah, ah push ax ; set new mode mov ax, 0x12 int 0x10 mov dx, 0x03ce ; graphics controller mov ax, 0x0f01 ; enable set/reset-register: combine latches mit reg.0 out dx,ax mov al, 3 ; function select-register: replace bits out dx,al mov al, 5 ; mode-Register: read mode 0, write mode 0 out dx, al pop ax ; return value in ax: old video mode pop dx pop cx pop bx ret

; set color for subsequent set pixel calls ; in: ax: color ; out: - setcolor: push ax push dx mov dx, 0x3ce ; graphics controller mov ah, al ; color to ah mov al, 0 ; set/reset register out dx, ax pop dx pop ax ret

; set pixel with current color ; in: cx: x coord, dx: y coord ; out: - setpixel: pusha push dx pop si mov dx, 0x3ce ; graphics controller mov bx, cx ; copy x coord and cl, 7 mov ah, 128 shr ah, cl ; calulate pixel position mov al, 8 ; bit mask-register out dx, ax shr bx, 1 ; x coord / 8 shr bx, 1 shr bx, 1 mov cx, si shl cx, 1 shl cx, 1 ; x coord * 4 add cx, si ; + y coord = y * 5 shl cx, 1 shl cx, 1 shl cx, 1 shl cx, 1 ; result * 16 = 5 * 16 = 80 add bx, cx ; add to x offset mov ax, 0xa000 mov es, ax ; init graphic segment or [es:bx], al ; read to load latches and write color popa ret

LOGO:

times 510-($-$$) db 0 dw 0aa55h

section .bss

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Ich vermute, er will die GraKa aber irgendwann ausserhalb des PCs nutzen (und derzeit nur die Programmierung testen), da nutzt ihm dann das BIOS recht wenig.

Bernd

Reply to
Bernd Laengerich

Ist schon eine Weile her, aber gibt es nicht ein BIOS auf der Grafikkarte?

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Frank Buss schrieb:

Ja, mit x86-Maschinencode...

Gruß Henning

--
henning paul home:  http://home.arcor.de/henning.paul
PM: henningpaul@gmx.de , ICQ: 111044613
Reply to
Henning Paul

Das will aber auch von einem x86 ausgeführt werden...

Falk

Reply to
Falk Willberg

So what?

Das ist ja schließlich keine kryptographisch gesicherte Botschaft, sondern selbstkommentierender Quelltext.

Man muß ihn halt nur lesen können, das ist alles.

Reply to
Heiko Nocon

Das BIOS? Könnte man wohl mit einem Disassembler ansehen, falls der Code und Datenbereiche gut trennen kann, aber von gut lesbarem Quelltext wäre es noch meilenweit entfernt und selbstkommentierend ist das auch nicht, insbesondere wenn es z.B. ursprünglich in C geschrieben wurde und der Compiler dann noch unlesbareren Assembler erzeugt hat.

Die Idee sich vga16fb.c von Linux anzusehen ist wahrscheinlich das beste, zusammen mit einer Erklärung der Register.

Ich hätte hier auch noch ein Buch "PC/XT/AT Referenzhandbuch" (handlich ist bei der Wälzer allerdings nicht), was ich schon Jahre nicht mehr gebraucht habe, da stände das auch alles drin. Wenn's einer haben möchte, verschicke ich es gegen Versandkostenerstattung.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Hallo Michael,

den Grafikmodus ohne BIOS zu ändern wird ein schwieriges unterfangen ohne die genaue Grafikkarte zu nennen. Ich würde es sogar ganz lassen, verwende das BIOS dazu. 640*480 bei 16 Farben kann jede alte Grafikkarte.

Gruß

Reply to
MyName

MyName schrieb:

...und ist ziemlich das gruseligste, was man sich antun kann. Das ist ein EGA-Modus, bei dem jeweils vier benachbarte Pixel als sogenannte "planes" auf vier völlig verschiedenen Speicherbereichen landen -- ein Tribut an die langsamen Zugriffszeiten der 1980er Jahre, die man durch das Ineinanderschachteln von vier Speicherbausteinen umgangen hat.

Leider ist das der einzige Modus jenseits von 320x200x8, der noch im uralten VGA-Standard auf Registerebene genormt war.

Inwiefern seit VESA-Zeiten auch modernere Modi registermäßig (also /ohne/ x86-BIOS-Zugriffe) standardisiert sind, entzieht sich meiner Kenntnis, da ich mich um derartige Dinge seit Mitte der 1990er Jahre auch nicht mehr selbst gekümmert habe.

--
cheers, J"org               .-.-.   --... ...--   -.. .  DL8DTL

http://www.sax.de/~joerg/                        NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
Reply to
Joerg Wunsch

Gab da allerdings ein paar interessante Zugriffsmethoden, wie man es sich sparen konnte, jede Plane einzeln anzusprechen. Meine setpixel-Funktion demonstriert das, im Zusammenhang mit der Initialisierung der entsprechenden VGA-Register in dem Posting hier nebenan. Ist aber schon recht lange her, daß ich das geschrieben habe und so schön einfach wie der

320x200 Modus oder ein SVGA-Modus war es nicht gerade.
--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Herzlichen Dank, da weiss ich, womit ich mir die Nacht um die Ohren schlage. ;)

Gruss

Reply to
Michael Dreschmann

Ich hab (dank Jörg) auch das Datenblatt vom VGA Controller (F65535) und da sind ja alle Register aufgeführt. Neben den DAC Registern sind das die Sequencer, CRT, Graphis Controller und Attributes Controller Register und die fand ich auch so in den algemeinen VGA Dokus im Web. Weiter hat die Karte noch Extensionregister für Flatpanels usw. die aber ausser ein passender Treiber kein Windows kennen dürfte. Ich hab alles ausgelesen und wieder reingeschrieben. Komischerweise werden im CRT Registersatz nicht alle Werte exakt übernommen wenn ich's im Textmodus von Linux versuche, ein paar Registerwerte weichen beim anschiessenden Readback ab, vor allem CR0 bis CR5.

Gruss

Reply to
Michael Dreschmann

Nicht ganz, aber ich will deren Adressen umbiegen, so dass drei dieser Karten in einem Rechner laufen. Und da wird das BIOS auch nix mehr machen können.

Gruss

Reply to
Michael Dreschmann

Naja, ich sehe das so als Basis von der ich dann weiter versuchen kann in den 256 Farben Modus zu kommen. Dummerweise steht davon überhaupt nix im Datenblatt vom Grafikcontroller. Allerdings hat er die Möglichkeit den ganzen Videospeicher (512K) linear im Adressraum > 1MB einblenden zu lassen. Das sieht ganz interessant aus. Aber um das zu testen muss ich erstmal von diesem Cursorblinke Niveau weg ;)

Gruss

Reply to
Michael Dreschmann

U.U. koennte auch das Datenblatt des 6845 helfen. Dessen Funktionen sind meines Wissens bis heute in jeder Grafikkarte zu finden.

Gerrit

Reply to
Gerrit Heitsch

Es klappt, die Linuxtreiber Idee war super, inbesondere die Zeilen: /* deprotect CRT registers 0-7 */ outb(0x11, VGA_CRT_IC); outb(par->crtc[0x11], VGA_CRT_DC);

So, jetzt stehen die 256 Farben an... sachdienliche Hinweise immer willkommen ;)

Gruss

Reply to
Michael Dreschmann

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.