Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: sfan am 04. January 2011, 11:11

Titel: printf
Beitrag von: sfan 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--;
}
  }
}
Titel: Re:printf
Beitrag von: DerHartmut 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 (http://gitorious.org/niwohlos/niwohlos/blobs/master/src/kernel/kprintf.c#line88).
Titel: Re:printf
Beitrag von: sfan 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.
Titel: Re:printf
Beitrag von: sfan 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++;
}
  }
}
(http://sfan.funpic.de/screen.png)