Autor Thema: GRUB and Video  (Gelesen 6325 mal)

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« am: 04. November 2006, 13:11 »
Ich find's immer wieder witzig...

Hab mal schnell auf GRUB umgestellt, wegen comfort und meiner angeborenen Faulheit (meine RAM-size usw.) Dabei musste ich feststellen, dass keine Zeichen mehr ausgegeben werden. Weder bei 0xB8000 (farb-text) noch bei 0xB0000 (mono-text). Der Code funktioniert so weit, zum einen weil's der selbe wie immer ist, zum anderen weil ich sehen kann, dass der Cursor bewegt wird. Aber, wie gesagt, es wird kein einziges Zeichen ausgegeben. Nicht mal bei direkter Beschreibung des Spechers im Assemblerteil. Ich bin echt ratlos.
Hab auch alle Sektionen nach dem linken überprüft und so weiter, aber es ist alles korrekt. Deshalb habe ich GRUB als den schuldigen identifiziert und glaube irgendwie, dass da irgendwas nicht stimmt.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 04. November 2006, 15:21 »
Ist dir bewusst, dass du im 32bit Protected-Mode bist? Welches Dateiformat verwendest du? Bist du dir sicher, dass dein Code überhaupt ausgeführt wird bzw. an die richtige Adresse geladen wird?
Du könntest ja deinen Sourcecode mal posten :wink: So kann ich dir nur versichern, dass grub funktioniert und ich danach auch Text ausgeben kann :-P
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #2 am: 04. November 2006, 15:37 »
Den gesamten source? Hier? Das is 'ne ganze Menge...

Uhh... aber in 'ner zip könnt ihr den haben...
http://scanish.dyndns.org/scen/kernel.zip

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #3 am: 06. November 2006, 16:07 »
Also ehrlich, selbst wenn euch das runterladen jetzt zu viel ist.
Der Unterschied zum normalen Code is gleich Null. Ich hab auch die Linker Daten doppelt gecheckt, sogar underschiedliche Versionen von GRUB genommen. Ich hab echt keine Idee, warum der nicht auf den Speicher schreibt. Nicht mal die leiseste Ahnung...
Is da irgendwie ein Switch oder was auch immer, den ich aktivieren muss? Liegt es am ELF format?

Edit: Also, wenn ich in der main.c auf den speicher zugreife, klappt es. Aber nur dort...
« Letzte Änderung: 06. November 2006, 16:41 von FalShen »

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 06. November 2006, 16:43 »
Zeig mal die Codezeile, welche den Speicher beschreibt.

Nooooooooos

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 06. November 2006, 17:08 »
Edit: Also, wenn ich in der main.c auf den speicher zugreife, klappt es. Aber nur dort...
heißt das, dass '#' ausgegeben wird?
"Scen online (V0.0.1 C)" aber nicht?

EDIT: Also bei der Version hier (weiß nämlich nicht ob die noch aktuell ist, der Link funkzt nit mehr)
nt kmain(multiboot_info_t *mbinfo)
{
install_video();

video_mem[0] = '#';
video_mem[1] = 0x07;

print("\nScen online (V0.0.1 C)\n");

return 0;
}
« Letzte Änderung: 06. November 2006, 17:11 von M.Nemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #6 am: 06. November 2006, 17:09 »
Dies hier ist die main.c, hier funktioniert

#include <multiboot.h>
#include <system.h>
#include <video.h>

//extern unsigned short *video_mem;

#define VIDEO_MEM ((unsigned short*)(0xB8000))

int kmain(multiboot_info_t *mbinfo)
{
install_video();

putc('#');

print("\nScen online (V0.0.1 C)\n");

VIDEO_MEM[1] = 0x0782;

return 0;
}

Nur die zeile VIDEO_MEM[1] = 0x0782 funktioniert. Die putc Funktion greift genau auf die selbe weise auf den Speicher zu.

void putc(char c)
{
if(c == '\n')
{
pos_y++;
pos_x = 0;
}
else if(c == '\r') pos_x = 0;
else if(c == '\t') pos_x = (pos_x + 8) & ~(8-1);
else if(c == '\b') if(pos_x > 0) pos_x--;
else if(c >= ' ')
{
VIDEO_MEM[pos_y * SCREEN_W + pos_x] = c | (colour << 8);
pos_x++;
}

if(pos_x >= SCREEN_W)
{
pos_y++;
pos_x = 0;
}

update_cursor();
}

Sonst is eigentlich kein Code beteiligt...

@M.Nemo: Exakt. (Mit dem link liegt wahrscheinlich an meinem router... der machts manchmal, manchmal nicht...)
« Letzte Änderung: 06. November 2006, 17:20 von FalShen »

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 06. November 2006, 18:15 »
versuchs ma so
Zitat
void putc(char c)
{
  ..
 else if(c == '\b')
 {          <---=
   if(pos_x > 0) pos_x--;
}           <--- =
 else if(c >= ' ')
...

}

weil gcc hat else if(c >= ' ')
{
VIDEO_MEM[pos_y * SCREEN_W + pos_x] = c | (colour << 8);
pos_x++;
}
einfach weggelassen
« Letzte Änderung: 06. November 2006, 18:21 von M.Nemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #8 am: 06. November 2006, 18:32 »
*blush*
Nun geht's... mann... dumme anfängerfehler... und dass, obwohl ich nun schon seit 3 Jahren C++ programmiere...

Danke sehr!!

 

Einloggen