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...
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!
-- "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
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...)
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:
;=================== 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
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
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.
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
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.
...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. ;-)
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
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.
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.
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 ;)
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 ;)
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.