Autor Thema: printf  (Gelesen 5118 mal)

sfan

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« am: 04. January 2011, 11:11 »
Hi,

ich habe in meinem OS eine print-Funktion.
Allerdings funktioniert \n nicht.
Code im Header:
int csr_x = 0,csr_y = 0;
char *video = (char*)0xB8000;
void print(char *str,unsigned char fc,unsigned char bc);
Code unten:
void print(char *str,unsigned char fc,unsigned char bc) {
while (*str) {
if(*str >= ' ') {
char* vid = (char*) video;
vid += csr_y * 80 + csr_x;
          *vid = *str;
vid++;
csr_x++; //Wenn 'vid++' dann auch 'csr_x++'
*vid = (bc << 4) | (fc & 0x0F);
          str++;
csr_x++;
}
if(*str == '\n') {
csr_y++;
csr_y++;
csr_x = 0;
}
if(*str == '\r') {
csr_x = 0;
}
if(*str == '\b') {
csr_x--;
}
  }
}

DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #1 am: 04. January 2011, 11:14 »
Du hast ein csr_y++ zu viel (du würdest also zwei Newlines erzeugen) und du vergisst schlicht und ergreifend den Cursor neu zu zeichnen.

So haben wir das in niwohlOS gemacht: Guckst du hier.
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

sfan

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 04. January 2011, 11:20 »
Du hast ein csr_y++ zu viel (du würdest also zwei Newlines erzeugen) und du vergisst schlicht und ergreifend den Cursor neu zu zeichnen.

Danke!
Die Lösung wo ich dran gedacht habe machte eingentlich genau das gleiche nur komplizierter.

sfan

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. January 2011, 10:11 »
Hmmmmm!

Das geht irgendwie auch nicht :-(

Aber ich hab es anders gelöst :-D:
void print(char *str,unsigned char fc,unsigned char bc) {
int cnr;
while (*str) {
cnr = 0; // false
if(*str == '\n') {
csr_y++;
csr_y++;
csr_x = 0;
cnr = 1; //true
}
if(*str == '\r') {
csr_x = 0;
cnr = 1; //true
}
if(*str == '\b') {
csr_x--;
cnr = 1; //true
}
if(cnr == 1) { // Cursor neuschreiben
char* vid = (char*) video;
vid += csr_y * 80 + csr_x;
           *vid = 0x0;
vid++;
*vid = 0x07;
vid--;
str++;
}
if(*str >= ' ') {
char* vid = (char*) video;
vid += csr_y * 80 + csr_x;
   *vid = *str;
vid++;
csr_x++; //Wenn 'vid++' dann auch 'csr_x++'
*vid = (bc << 4) | (fc & 0x0F);
   str++;
csr_x++;
}
  }
}
« Letzte Änderung: 05. January 2011, 12:02 von sfan »

 

Einloggen