Autor Thema: VESA-Mode - Initialisiert und jetzt?  (Gelesen 20629 mal)

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #20 am: 11. March 2005, 15:57 »
Zitat von: joachim_neu
ja, aber es ist zu 99,999 % standardisiert (RGB oder ARGB), deswegen beachte ich das nichtmehr...


warum sagst du mir dann ich soll es ändern wenn es zu 99.999% so ist ?!  :wink:

dann wird bochs wahrscheindlich das nicht anders haben (also das vga bios)

welches vgabios benutzt du?

könnte es auch sein das zb. alle rotwerte an 0xSoundso kommen und alle grünwerte 0xSoundso+1024 und alle blau werte an 0xSoundso+2048. also alle farben getrennt... (als beispiel)?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #21 am: 11. March 2005, 16:05 »
1. ich sage net, du sollst es ändern, weil es zu 0,001 % anderst sein kann, sondern, wegen Big und sonstwas Endian.
2. Ich benutz "VGABIOS-elpin-2.40"...
3. nein, so ist es nicht, nur die anordnung in den 24bits oder 32bits könnte anderst sein.
4. geh mal bei ICQ on, da kann man besser schreiben :D

J!N
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #22 am: 14. March 2005, 14:05 »
was ist den big oder endian... sorry no plan...

ich habe mal das VGABIOS-elpin-2.40 getestet, und da sagt mein kernel "Vesa 2.0 not supportetd"

vielleicht hab ich da ein fehler beim setzen vom vesa modus.
hier ma der code:
;===============================================================
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;--------------------Set Vesa-----------------------------------
SetVesaMode:
.0:
pusha
push es

mov ax, 0x7c0 ; Vesa Info Block @ 0x7c00
mov es, ax
xor di, di
mov DWORD [es:di], 'VBE2'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Test if Vesa 2 is supported;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.1:
mov ax, 0x4F00 ; Get Vesa Informations
mov di, 0
int 0x10

cmp ax,0x004F ; ah: 00 -> Successfuly al: 01 -> Function supported
je .2 ;
mov si, msg_VesaErrVer ;
call VesaError

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Get Mode Info;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.2:
mov ax, 0x4F01
mov cx, 0x118
mov bx, 0x7e0 ; Vesa Mode Info Block @ 0x7e00
mov es, bx
mov di, 0
int 0x10

cmp ax,0x004F
je .3
mov si, msg_VesaErrInfo
call VesaError

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Enable Vesa Mode;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.3:
mov ax, 0x4F02
mov bx, 0x4118
int 0x10

cmp ax,0x004F
je .4
mov si, msg_VesaErrSet
call VesaError

.4:
pop es
popa
ret


;===============================================================
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;--------------------Set Vesa-----------------------------------
VesaError:
.0:
call PrintString
cli
hlt


joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #23 am: 14. March 2005, 14:08 »
big und little endian sind die formate, wie der computer bytes im speicher vertauscht, wenn er z.B. ein dword oder ein word ablegt. der legt die net fein normal ab, sondern vermischt die:

word besteht aus 2 bytes, 1 und 2:
das normalerweise so aufgebaute word: 12 wird zu dem hier (soweit ich weiß): 21
und bei dwords ist es ja normalerweise 1234, das wird aber zu 4321 oder so gemacht... nicht gerade logisch, ka, wer sich das ausgedacht hat und wozu. und das musste eben beachten, wenn du mit bytes statt words oder dwords arbeitest, also mit nem anderen datentyp ließt als geschrieben hast.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #24 am: 14. March 2005, 14:49 »
ah so, nun versteh ich das. z.b schreibt ich byteweise 0x11 0x22 0x33, das in einem dword so aussehen würde 0x00112233 und dann nimmt bochs z.b 0x001122 weil er dachte das ich das dword im 1234 format abgespeichert habe (als beispiel)...

was meinst du zu meinem vga-bios problem?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #25 am: 14. March 2005, 15:14 »
nein, ich meine, wenn du ein dword (0x11223344) in den ram schreibst mit stosd und dann in bytes ausließt bekommste 0x44, 0x33, 0x22 und 0x11...

EDIT: und wenn du dann ein byte schreibst, und bochs das in dwords ausließt, bzw das vga-bios, dann werden die verkehrt...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #26 am: 14. March 2005, 15:17 »
ja schon aber ich schreibe es byte für byte ein und und wie es bochs oder was auch immer dann ausliesst weis ich nicht...

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 14. March 2005, 16:41 »
Wenn wir schon einen aktiven VESA-Thread haben, erlaube ich mir zu fragen, wie man im PM in die verschiedenen VGA/VESA/XGA-Modi schalten kann. Ich möchte nicht auf eine einmalige Grafikmoduswahl noch im RM beschränkt sein.

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #28 am: 14. March 2005, 16:56 »
es gibt da verschiedene möglichkeiten (aber net sehr viele):

1. Vesa 3.0
2.  Zurück zum RM und Int
3. V68

gibt glaube ich noch mehr, hab die aber vergessen ^^

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 14. March 2005, 18:20 »
Wie schafft es dann das BIOS?
Ist das ein riesiges Verfahren, das nicht neugeschrieben werden kann? Gibt es da für jede Graka unterschiedliche Initialisierungsverfahren für VGA?

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #30 am: 15. March 2005, 10:03 »
@elfish_rider: k.A. frag joachim_neu ^^

@all:

ich habe nun mein treiber soweit, dass ich rechtecke malen kann etc. sogar mit den richtigen farben ^^

hier meine video.c:
/*
;
;---------------------------------------------------------------+
;       .__               __                           ¦
;______ |__|___________ _/  |_            ____  ______ ¦
;\____ \|  \_  __ \__  \\   __\  ______  /  _ \/  ___/ ¦
;|  |_> >  ||  | \// __ \|  |   /_____/ (  <_> )___ \ ¦
;|   __/|__||__|  (____  /__|            \____/____  > ¦
;|__|                  \/                          \/ ¦
;---------------------------------------------------------------+
;
;[1] Informations
;
; Last Modified: 25. Januar 2005
; Begin: 15. Juni 2004
; Version: 0.000
; Coder: z4ck
;
;
;[2] Tasks
;
; Task Done Coder
;----------------------------------------------------------------
; -                   [  0%] z4ck
;----------------------------------------------------------------
; TOTAL [  0%] z4ck
;================================================================
*/

#include <video.h>

#define VesaMode 0x118



/********************************************/
/* VbeModeInfoBlock Struktur                */
/********************************************/
typedef struct {
unsigned short VbeModeModeAttributes;
unsigned char VbeModeWinAAttributes;
unsigned char VbeModeWinBAttributes;
unsigned short VbeModeWinGranularity;
unsigned short VbeModeWinSize;
unsigned short VbeModeWinASegment;
unsigned short VbeModeWinBSegment;
unsigned long VbeModeWinFuncPtr;
unsigned short VbeModeBytesPerScanLine;
unsigned short VbeModeXResolution;
unsigned short VbeModeYResolution;
unsigned char VbeModeXCharSize;
unsigned char VbeModeYCharSize;
unsigned char VbeModeNumberOfPlanes;
unsigned char VbeModeBitsPerPixel;
unsigned char VbeModeNumberOfBanks;
unsigned char VbeModeMemoryModel;
unsigned char VbeModeBankSize;
unsigned char VbeModeNumberOfImagePages;
unsigned char VbeModeReserved_page;
unsigned char VbeModeRedMaskSize;
unsigned char VbeModeRedMaskPos;
unsigned char VbeModeGreenMaskSize;
unsigned char VbeModeGreenMaskPos;
unsigned char VbeModeBlueMaskSize;
unsigned char VbeModeBlueMaskPos;
unsigned char VbeModeReservedMaskSize;
unsigned char VbeModeReservedMaskPos;
unsigned char VbeModeDirectColorModeInfo;
unsigned long VbeModePhysBasePtr;
unsigned long VbeModeOffScreenMemOffset;
unsigned short VbeModeOffScreenMemSize;
unsigned short VbeModeLinBytesPerScanLine;
unsigned char VbeModeBnkNumberOfPages;
unsigned char VbeModeLinNumberOfPages;
unsigned char VbeModeLinRedMaskSize;
unsigned char VbeModeLinRedFieldPos;
unsigned char VbeModeLinGreenMaskSize;
unsigned char VbeModeLinGreenFieldPos;
unsigned char VbeModeLinBlueMaskSize;
unsigned char VbeModeLinBlueFieldPos;
unsigned char VbeModeLinRsvdMaskSize;
unsigned char VbeModeLinRsvdFieldPos;
unsigned char VbeModeMaxPixelClock;
unsigned char VbeModeReserved[190];

} __attribute__ ((packed)) VbeModeInfoBlock;



/********************************************/
/* Global Vars                              */
/********************************************/
VbeModeInfoBlock *VbeMIB = (VbeModeInfoBlock *) 0x7e00; // This one ist set in kernel16.asm @ setvesa...
unsigned char *VideoMem; // saved in the VbeModeInfoBlock

/********************************************/
/* Screen Settings                          */
/********************************************/
unsigned long ScrWidth, ScrHeight;
unsigned char BitsPerPixel;


/********************************************/
/* COLORS                                   */
/********************************************/
unsigned long BGColor = 0x0011A8C6;
unsigned long FontColor = 0x00FFFFFF;
unsigned long FontShadowColor = 0x00EEEEEE;


/********************************************/
/* Init the video                           */
/********************************************/
void SetupVideo()
{
ScrWidth  =  VbeMIB->VbeModeXResolution;
ScrHeight  =  VbeMIB->VbeModeYResolution;
BitsPerPixel  =  VbeMIB->VbeModeBitsPerPixel;

VideoMem  = (unsigned char *)(VbeMIB->VbeModePhysBasePtr);

ClearScreen();

DrawRectangle(50, 50, 500, 300, 0x00FFFFFF, 0x00000000);
DrawRectangle(100, 100, 300, 500, 0x00FFFFFF, 0x00000000);
};


/********************************************/
/* Clear Screen whit BGColor                */
/********************************************/
void ClearScreen ()
{
unsigned long i = 0;
for (;i < ScrHeight; i++)
{
unsigned long u = 0;
for (; u < ScrWidth; u++)
DrawPixel(u, i, BGColor);
};

};


void printf (char *_string, long _color)
{

};

void printc (char _character, long _color)
{

};

void Num2String(int _number)
{

};


/********************************************/
/* Draw a Pixel                             */
/********************************************/
void DrawPixel (unsigned long _x, unsigned long _y, unsigned long _RGB)
{
unsigned char A   =  _RGB >> 0x18; //Alpha
unsigned char R   = (_RGB & 0x00FF0000) >> 0x10; //Red
unsigned char G   = (_RGB & 0x0000FF00) >> 0x08; //Green
unsigned char B   = (_RGB & 0x000000FF); //Blue
unsigned long pos = ((_y*ScrWidth)+_x)*(BitsPerPixel/8);

if (pos > (ScrWidth*ScrHeight*BitsPerPixel/8)) return;

switch(BitsPerPixel)
{
case 8:
case 16:
break;

case 24:
VideoMem[pos]   = B;
VideoMem[++pos] = G;
VideoMem[++pos] = R;
break;

case 32:
VideoMem[pos] = A;
VideoMem[++pos] = B;
VideoMem[++pos] = G;
VideoMem[++pos] = R;
break;
};
};

void DrawLine (unsigned long _x1, unsigned long _y1, unsigned long _x2, unsigned long _y2, unsigned long _RGB)
{
unsigned long tmpWidth = (_x2 > _x1)?(_x2 - _x1):(_x1 - _x2);
unsigned long tmpHeight = (_y2 > _y1)?(_y2 - _y1):(_y1 - _y2);
unsigned long i = 0;

if (tmpHeight == 0)
{
for (;i<=tmpWidth; i++)
{
DrawPixel(_x1+i, _y1, _RGB);
}
return;
}

if (tmpWidth == 0)
{
for (;i<=tmpHeight; i++)
{
DrawPixel(_x1, _y1+i, _RGB);
}
return;
}
};

void DrawRectangle (unsigned long _x1, unsigned long _y1, unsigned long _x2, unsigned long _y2, unsigned long _LineRGB, unsigned long _FillRGB)
{
DrawLine(_x1, _y1, _x2, _y1, _LineRGB); //left to right; up
DrawLine(_x1, _y2, _x2, _y2, _LineRGB); //left to right; down
DrawLine(_x1, _y1, _x1, _y2, _LineRGB); //up to down; left
DrawLine(_x2, _y1, _x2, _y2, _LineRGB); //up to down; right

unsigned tmpHeight = _y2-_y1;
unsigned tmpWidth  = _x2-_x1;
unsigned i = 1, u = 1;

for (;i < tmpHeight; i++)
{
for (u = 1; u < tmpWidth; u++)
{
DrawPixel (_x1+u, _y1+i, _FillRGB);
}
}


};



hoffe es hilft jemandem...

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 15. March 2005, 13:19 »
Zitat von: elfish_rider
Wie schafft es dann das BIOS?
Ist das ein riesiges Verfahren, das nicht neugeschrieben werden kann? Gibt es da für jede Graka unterschiedliche Initialisierungsverfahren für VGA?

Wenn du es schaffst, an die technischen Daten aller Grafikkarten ranzukommen, duerftest du auch Treiber dafuer schreiben können. Aber da das nicht möglich ist ... wirst du wohl oder uebel das Vesabios benutzen muessen.
Jede Grafikkarte hat andere Register, andere Initialisierungs- und Rueckgabewerte sowie auch andere Fähigkeiten.
Was glaubst du, warum Linux immernoch keinen gebrauchbaren Hardwaretreiber fuer nVidia/ATI-Karten hat? Weil diese Daten Rueckschluesse auf den Aufbau der Karten fuehren könnten. Was wiederum der Konkurrenz grosse Vorteile geben wuerde etc.pp.

Einzigste Variante - irgendwo (frag nicht, wo :D) gab es mal die technischen Daten von einigen alten ISA-Grafikkarten (z.B. Trident etc) die noch kein Vesabios hatten. Wenn du diese ausreizen können willst (Stichwort 486er) dann musst du dafuer Treiber schreiben - oder dich mit Standard-VGA zufriedengeben.

Mvh Svenska

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #32 am: 15. March 2005, 14:46 »
Selbst wenn man die Dokus der Grakas hat braucht man noch die SPezi's für PCI und AGP die kosten auch Geld, denn irgendwelche dokus dazu gibt es defacto nicht
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #33 am: 15. March 2005, 15:14 »
ein kleiner nachtrag zu big und little endian:

damit ist die ausrichtung der bits in einem speicherteil gemeint. littleendian meint, dass das unwichtigste bit vorne ist, bei bigendian ist das wichtigste bit, also dass, bei dessen veränderung man die größte zahlenveränderung hat vorne ist, so, wie wir auch zahlen schreiben. in dezimal könnte man sich das so vorstellen, als würde man in einer zweistelligen zahl einfach einer und zehnerstelle vertauschen. das währe dann littleendian, die unwichtigste stelle (die einer) zuerst. bigendian ist, wie wir es machen würden, also die wichtigste stelle zuerst (die zehner).
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 15. March 2005, 17:11 »
Zitat von: Svenska
Zitat von: elfish_rider
Wie schafft es dann das BIOS?
Ist das ein riesiges Verfahren, das nicht neugeschrieben werden kann? Gibt es da für jede Graka unterschiedliche Initialisierungsverfahren für VGA?

Wenn du es schaffst, an die technischen Daten aller Grafikkarten ranzukommen, duerftest du auch Treiber dafuer schreiben können. Aber da das nicht möglich ist ... wirst du wohl oder uebel das Vesabios benutzen muessen.
Jede Grafikkarte hat andere Register, andere Initialisierungs- und Rueckgabewerte sowie auch andere Fähigkeiten.
Was glaubst du, warum Linux immernoch keinen gebrauchbaren Hardwaretreiber fuer nVidia/ATI-Karten hat? Weil diese Daten Rueckschluesse auf den Aufbau der Karten fuehren könnten. Was wiederum der Konkurrenz grosse Vorteile geben wuerde etc.pp.

Einzigste Variante - irgendwo (frag nicht, wo :D) gab es mal die technischen Daten von einigen alten ISA-Grafikkarten (z.B. Trident etc) die noch kein Vesabios hatten. Wenn du diese ausreizen können willst (Stichwort 486er) dann musst du dafuer Treiber schreiben - oder dich mit Standard-VGA zufriedengeben.

Mvh Svenska


Und nur das VESA-3-BIOS kann über den PM angesteuert werden? Jetzt regt mich diese RM-Kompatibilität auch langsam auf.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #35 am: 17. March 2005, 10:14 »
Zitat von: Roshl
Selbst wenn man die Dokus der Grakas hat braucht man noch die SPezi's für PCI und AGP die kosten auch Geld, denn irgendwelche dokus dazu gibt es defacto nicht

Im PC-Hardwarebuch wird die PCI-Schnittstelle ganz gut erklärt, wenn ich mich nicht irre... und AGP ist ja auch nur eine "erweiterte" PCI-Schnittstelle. D.h. wenn du PCI eingebaut hast, kannst du auch AGP ansprechen (mit Einbußen allerdings).
Korrekt?

Svenska

Scorpion

  • Beiträge: 57
    • Profil anzeigen
Gespeichert
« Antwort #36 am: 17. March 2005, 14:11 »
[schild=1]Immer weiter so....[/schild]
Ich habe dadurch immer mehr gelernt! Danke!

MfG, Scorpion!

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 18. March 2005, 20:31 »
Tja, bei mir funzt das Mode-Switchen ohne Probs aber pixeln geht mit Bochs nicht (auf dem real PC schon!) ...Modus ist 0x101 und gepixelt sollte so werden:

mov edi, [VbeModePhysBasePtr]
mov ecx, 640*480
mov eax, 0xCC
rep stosb

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #38 am: 18. March 2005, 21:52 »
Zitat von: Another Stupid Coder
Tja, bei mir funzt das Mode-Switchen ohne Probs aber pixeln geht mit Bochs nicht (auf dem real PC schon!) ...Modus ist 0x101 und gepixelt sollte so werden:

mov edi, [VbeModePhysBasePtr]
mov ecx, 640*480
mov eax, 0xCC
rep stosb


welche graka in real?
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #39 am: 18. March 2005, 22:17 »
NVidia Geforce MX 2 440  aber da funzts ja...

 

Einloggen