Autor Thema: Modus mit Ports setzten  (Gelesen 17144 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #20 am: 24. October 2005, 14:15 »
Vielen dank für deine Mühe. Wenn ich in den Modus 13h mit dem 10h schalte dann ist automatisch der komplette Bildschirm schwarz. Also müsste ich zu deinem Code einfach folgendes hinzufügen damit er das gleiche wie der int 10h tut oder?:

push 0A000h
pop es
mov dx,03C8h ;Farbnummer
xor al,al ;Null
out dx,al
inc dx
out dx,al ;schwarz
out dx,al
out dx,al
xor di,di
mov cx,320*200/2
xor ax,ax
rep stosw ;zeichne Bildschirm schwarz

danke
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 24. October 2005, 20:08 »
@WhiteDragon: Nicht schlecht. Respekt! Hast du echt meinen Code dafür genommen? Ich steig durch mein Teil nämlich selbst nicht durch (denn das Ding ist automatisch generiert), sondern würde mir das komplett neuerarbeiten, wenn ich es ändern müsste. ;)

@bitmaster: ja, aber ich glaube int 13h verändert nicht die palette, sondern akzeptiert es einfach, wenn der paletteneintrag 0 eine andere farbe darstellt. hab ich aber nicht getestet.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #22 am: 24. October 2005, 21:09 »
Zitat von: PorkChicken
@bitmaster: ja, aber ich glaube int 13h verändert nicht die palette, sondern akzeptiert es einfach, wenn der paletteneintrag 0 eine andere farbe darstellt. hab ich aber nicht getestet.
Na ist ja auch wurscht. Ich muss ja nicht ganz genau das machen wie der int 10h haubsache er schaltet in den 13h Modus im PM und fertig.
In the Future everyone will need OS-64!!!

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 25. October 2005, 06:08 »
Meines Wissens stehen die ersten 16 Index-Farben (EGA-Farben) fest. Du brauchst schwarz also nicht mehr extra bestimmen.

@PorkChicken: Du sagtest "automatisch generiert": Womit bitte? Fände ich schon interessant!

drccpp

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 25. October 2005, 19:33 »
Zitat von: PorkChicken
Ich steig durch mein Teil nämlich selbst nicht durch (denn das Ding ist automatisch generiert), sondern würde mir das komplett neuerarbeiten, wenn ich es ändern müsste. ;)

Hey ProkChicken: Lass mich raten:
Du hast mit Bochs die Ausführung des BIOS-Interupts verfolgt und hast alle Instruktionen mit in und out rausgefiltert und hast es noch assemblierbar gemacht (vielleicht per Perl-Skript?). Ziemlich genial. Die Idee hatte ich auch mal. Hatte aber nichts weiter als die Idee. :lol:
hast sicher auch bemerkt das etliche Aufrufe für die Paletten-Konfiguration draufgehen. Ja so kommt man auch zum Ziel.
Und danach systematisiert das einer (WhiteDragon). Das nenne ich Hacker-evolution, und kooperative zusammenarbeit!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 25. October 2005, 19:53 »
das aus den BIOS ausrufen rauszufummeln wär mir ein wenig zu aufwändig. vor allem auf das herauszuoperieren aus dem "rauschen" (z.B. das laden der palette) hätte ich keine lust gehabt. ich habs mir ein bisschen einfacher gemacht.

ich hab diesen code hier genommen: http://my.execpc.com/~geezer/osd/graphics/modes.c

und die funktionen inportb und outportb durch meine eigenen ersetzt, die in etwa so aussahen:

int dx = 0xFFFF;

void outportb(int port, int value)
{
if(dx != port) {
dx = port;
printf("mov dx, 0x%x\n", port);
}
if(value < 256)
printf("mov al, 0x%02x\nout dx, al\t\t; outportb(0x%x, 0x%02x)\n", value, port, value);
else
printf("out dx, al\t\t; outportb(0x%x, al)\n", port);
}

int inportb(int port)
{
if(dx != port) {
dx = port;
printf("mov dx, 0x%x\n", port);
}
printf("in al, dx\t\t; al = inportb(0x%x)\n", port);
return 0x1337;
}

int main()
{
write_regs(g_320x200x256);
}


im grunde genommen also nur der aufruf von printf, der die assembler-befehle ausgibt. die globale variable dx sorgt dafür, dass das register dx nicht unnötig oft mit dem selben wert geladen wird und das restliche drumherum ("return 0x1337;" und "if(value > 256)...") ist dazu da um den sonderfall mit outportb(..., inportb(...)); zu behandeln. also nichts wirklich spektakuläres.

hier sieht man auch, warum ich das or al, 0x80 und and al, 0x7f vergessen habe: weil es nämlich nicht automatisch generiert wird. deswegen musste ich es von hand einfügen und ich hab es halt vergessen.
Dieser Text wird unter jedem Beitrag angezeigt.

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 26. October 2005, 06:17 »
:shock:  :D  :P

Das ist echt zum Schießen: Du hast aus den Tabellen einzelne ASM-Befehle gemacht und ich pack das wieder in Tabellen rein...

Aber okay: Dann hab ich es ja offensichtlich korrekt gemacht.

Danke für den Code - dann kann ich mir die anderen Modi dort ja auch raus holen.

 :wink:

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #27 am: 26. October 2005, 17:21 »
setzte lieber dx immer neu, das ist billiger (bezogen auf die takte) als diese vielen compares.
Aber den Rückgabewert 1337(Leet) bei inportb finde ich lustig^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 26. October 2005, 17:52 »
Der Code der oben steht generiert den Code, den den Modus setzt. In dem generierten Code gibt es keine Compares.

 

Einloggen