Brueggi hat geschrieben:So, ich wende mich mal an die zahlreichen Freaks hier. Es geht um die Programmierung der 16-Farb-Modi, genauer um 640x480 einer VGA-Karte. Es interessiert vielleicht auch andere. Wie genau programmiere ich denn diesen modus? Ich hab mal gelesen, es gibt ein Latch-Register, mit dem man die "Planes" auswählt, auf welche man zugreift.
Wie sieht das in der Praxis aus? Welche Tricks gibt es, das ggf. zu beschleunigen? Vielleicht könnte man hier mal eine Art Tutorial zusammentragen, über das Einschalten der Grafik bis zum Setzen von Punkten usw. Ich habe schon im PC-Intern gelesen aber das kapier ich nicht so recht. Da geht das irgendwie "durcheinander" bzw. ohne Register-Bezüge.
Vielen Dank schonmal im Voraus für Eure Hilfe.
Am Anfang wusste ich es noch nicht wie einfach alle anderen Grafikmodi zu verwenden sind.
Hätte ich das schon gewusst, dann hätte ich niemals damit anfangen wollen 16 Farb-Modi zu verwenden.
So habe ich mich aber doch damit durchgequält und erst danach andere Videomodi ausprobiert.
Das ist auch schon eine Weile her und gut erklären kann ich es wohl auch nicht.
Für jeden Pixel muss ein Portzugriff gemacht werden und ein Dummyzugriff.
Hier ist ein Pixelsetzer für verschiedene 16 Farben Modi und mit Bankumschaltung für ET4000 bei SVGA.
Code: Alles auswählen
;┌───────────────────────────────────────────────────────────────────┐
;│ P I X E L - S E T Z E R │
;└───────────────────────────────────────────────────────────────────┘
PIXEL: pusha
add bp, XMIN
add bx, YMIN
mov cx, bp ; Bildschirm-Offset
shr cx, 3
mov ax, PS ; Anzahl Pixel pro Zeile
mul bx ; * Y
add ax, cx ; + (X/8)
mov di, ax ; = Adresse
cmp BYTE PTR[FLAG_2], 5 ; SVGA ?
jb VGA
mov al, dl ; Bankumschaltung ET4000
shl al, 4 ; bei SVGA: 1024x768 und 1280x1024
add al, dl ; Ueberlauf 64K Grenze
mov dx, 3CDh ; Portadresse für ET4000 Bankumschaltung
out dx, al
VGA: inc cx ; Bit (Pixel) berechnen !
shl cx, 3
sub cx, bp
dec cx
mov ah, 1 ; 2 ^ (((X/8) + 1) * 8 - X) - 1
shl ah, cl ; = Pixel pos.
mov dx, 3CEh ; Pixel-Mask-Register
mov al, 8
out dx, ax
mov al, fs:[di] ; Dummy-READ (Adresse holen)
EBENE: mov BYTE PTR fs:[di], 1 ; Pixel setzen
popa
ret
Verschiedene Unter-Routinen zum Wechseln von 16 Farben Videomodi für ET4000:
Code: Alles auswählen
SCHALTE: mov ax, 0Dh ; schaltet in den ausgewählten Video-Mode│
int 10h ;────────────────────────────────────────┘
mov WORD PTR[PS], 28h ; 16 / 320 x 200 A000
mov DWORD PTR[ZEUG], 00020000h ; Verzögerungs Index
ret ;
modelen = ($-SCHALTE) ;-----------------------------------------
mov ax, 0Eh ; 16 / 640 x 200 A000
int 10h ;
mov WORD PTR[PS], 50h ;
mov DWORD PTR[ZEUG], 00018000h ; Verzögerungs Index
ret ;-----------------------------------------
mov ax, 10h ; 16 / 640 x 350 A000
int 10h ;
mov WORD PTR[PS], 50h ;
mov DWORD PTR[ZEUG], 00010000h ; Verzögerungs Index
ret ;-----------------------------------------
mov ax, 12h ; 16 / 640 x 480 A000
int 10h ;
mov WORD PTR[PS], 50h ;
mov DWORD PTR[ZEUG], 00008000h ; Verzögerungs Index
ret ;-----------------------------------------
mov ax, 29h ; 16/ 800 x 600 A000
int 10h ;54h=ATIWOND /6Ah=CHIP&TE/VEGA/ZYMOS/VESA
mov WORD PTR[PS], 64h ;79h=GENOA /58h=PARADIS/WESTERN DIGITAL
mov DWORD PTR[ZEUG], 00000001h ; Verzögerungs Index
ret ;-----------------------------------------
mov ax, 37h ; 16/ 1024 x 786 A000
int 10h ;55h=ATI / 18h=TECMAR
mov WORD PTR[PS], 80h ;72h=CHIP&TECH/ 37h=TSENG/ORCHID/SIGMA
mov DWORD PTR[ZEUG], 00000001h ; Verzögerungs Index
ret ;-----------------------------------------
mov ax, 3Dh ; 16 / 1280 x 1024 A000
int 10h ;03Dh = TSENG / ORCHID / SIGMA
mov WORD PTR[PS], 100h ;106h = VESA
mov DWORD PTR[ZEUG], 00000001h ; Verzögerungs Index
mov dx, 3D4h ;ET4000:Rasterzeilen fuer Bankgrenzen
mov ax, 8013h ; Wert/2 im 16 Farbmodus
out dx, ax ;Alt=160 Bytes je Zeile = X/8 Pixel
ret ;Neu=256 Bytes je Zeile = X/8 Pixel
Programmiert für einen Intel 80386 @40mhz mit ET4000 kann man das ganze in einem schlichten Grafik-Demo, wo ein paar Linen gezeichnet werden sich ansehen. Vorher kann man in einem Menü u.A. eine von den folgenden Auflösungen dafür ausgewählt werden.
┌───────┐
│ M a t r i x │
├───────┤
│ 320 x 200 │
│ 640 x 200 │
│ 640 x 350 │
│ 640 x 480 │
│ 800 x 600 │
│ 1024 x 768 │
│ 1280 x 1024 │
└────────┘
http://www.alice-dsl.net/freecracmaps/Tool/Quix96.zip
Wie schon erwänht das Demo ist für einen 80386 mit 40 mhz. Bei schnelleren CPUs wird im Menü der Cursorbalken wohl zu schnell durchlaufen, um das Menüs mit den fix eingestellten Verzögerung-Werten dafür noch sinnvoll benutzen zu können.
Dirk