Lowlevel

OffZone => Offtopic => Thema gestartet von: JG am 24. February 2005, 16:40

Titel: Problem in C
Beitrag von: JG am 24. February 2005, 16:40
Hallo,
wenn ich in C nen zeiger auf den Video-Speicher habe char *VideoMem = (char*)0xB8000; und dann den Bildschirm leeren will, dann mach ich das ja am besten mit einer while schleife,

char *VideoMem = (char*)0xB8000;

void ClearScreen(int i)
{
while(i=4000)
{
}
}

nur wie mach ich das, dass char *VideoMem nun auf das nächste byte zeigt, also auf VideoMem + die zählervariable i?
Ich hoffe man kan verstehen, was ich will
Titel: Problem in C
Beitrag von: joachim_neu am 24. February 2005, 17:51
einfach den pointer erhöhen... soweit ich das mitbekommen habe ist mit "VideoMem" die adresse und mit "*VideoMem" der inhalt gemeint. also einfach "VideoMem++;". kann sein, dass ich mich täusche, bin net gut in C und pointer hab ich schon immer gehasst ;-)

EDIT: nunr kannst du also mit "*VideoMem" den inhalt ansprechen und dadurch mit:

char *VideoMem = (char*)0xB8000;

void ClearScreen(int i)
{
   while(i=8000)
   {
*VideoMem = 0
VideoMem++;
   }
}

den speicher leeren.
Titel: Problem in C
Beitrag von: JG am 24. February 2005, 17:55
ich auch  :wink:
Ja, den pointer erhöhen, schon klar, aber ich will ihn ja genau 4000mal erhöhen, aber ich weiß net wie des mit i machen soll
Titel: Problem in C
Beitrag von: joachim_neu am 24. February 2005, 17:57
Zitat von: JG
ich auch  :wink:
Ja, den pointer erhöhen, schon klar, aber ich will ihn ja genau 4000mal erhöhen, aber ich weiß net wie des mit i machen soll


wozu mit i? kannst es auch nur so machen, is net so aufwändig.
Titel: Problem in C
Beitrag von: JG am 24. February 2005, 18:20
Ich hab grad mal im Code voon Pirat-os (z4ck) nachgeguckt und da is es so:

void ClearScreen (int _color)
{
int i;
for (i=0; i<(80*25*2); i++)
{
videomem[i] = '  ';
i++;
videomem[i] = _color;
}
posy=0;
posx=0;

};

Ich werd mal z4ck fragen, ob ich des übernehmen darf
Titel: Problem in C
Beitrag von: zacK am 24. February 2005, 23:05
klar wenn du willst... ;)

ist aber nicht so ne optimale funktion... man könnte anstatt [ein byte schreiben, i erhöhen, ein byte schreiben] auch gerade [ein word schreiben und dann erhöhen] nehmen...
etc..

aber ist halt individuell ;)
Titel: Problem in C
Beitrag von: JG am 25. February 2005, 09:05
ok, danke
Titel: Problem in C
Beitrag von: JG am 25. February 2005, 15:16
So, ich hab nur ne Frage:
geht die Funktion, oder sind da Fehler?

char *VideoMem = (char*)0xB8000;

void print (char *string)
{
for(*VideoMem = *string; *VideoMem =! '/0'; *VideoMem++)
{
*VideoMem++;
*string++;
*VideoMem = '7';
};
};
Titel: Problem in C
Beitrag von: stultus am 25. February 2005, 15:30
bin mir nich ganz sicher, denk aber das du die funktion max. 1 mal aufrufen kannst und es nachm 2ten mal zu fehlern kommt (nichtlöschung des bildschirms und überschreiben eines anderen speicherbereichs), falls dem tatsächlich so is benenn VideoMem in der funktion einfach um (überschreibt dann nähmlich einfach das original - is ja global)
Titel: Problem in C
Beitrag von: TeeJay am 25. February 2005, 15:50
Ich habs so gelöst, das ich eine extra Variable habe die "Buch" darüber führt, an welcher Stelle sich der Cursor derzeit befindet.


char* pVideoMem = (char*)0xB8000;
unsigned int iVideo_ptr = 0;

void TextOut(char *pText, char cColor)
{
while(*pText)
{
if(*pText == '\r')
{
iVideo_ptr = (iVideo_ptr / 160) * 160;
}
else if(*pText == '\n')
{
iVideo_ptr = (((iVideo_ptr / 160) + 1) * 160) + (iVideo_ptr % 160);
}
else if(*pText == '\t')
{
iVideo_ptr += 8;
}
else
{
pVideoMem[iVideo_ptr] = *pText;
iVideo_ptr++;
pVideoMem[iVideo_ptr] = cColor;
iVideo_ptr++;
}

pText++;
}
}

Titel: Problem in C
Beitrag von: JG am 25. February 2005, 16:39
So, ich hab den Code mal geändeet, so müsste es nun gehen, oder?

char *VideoMem = (char*)0xB8000;
int xPos=0;
int yPos=0;

void ClearScreen()
{
int i;
for (i=0; i==4000; i++)
{
videomem[i] = ' ';
i++;
videomem[i] = 7;
}
yPos=0;
xPos=0;

};

void print (char *string)
{
for(*VideoMem = *string; *VideoMem =! '/0'; *VideoMem++)
{
*VideoMem++;
*string++;
*VideoMem = '7';
if (xPos==80)
{
xPos=1;
if (yPos==25)
{
ClearScreen();
yPos=1;
};
else
{
yPos++;
};
xPos++;
};
};



Danke schon mal
Titel: Problem in C
Beitrag von: JG am 26. February 2005, 16:03
Weiß das keiner?
Titel: Problem in C
Beitrag von: joachim_neu am 26. February 2005, 16:24
Zitat von: JG
Weiß das keiner?


versuchs, dann siehst dus  8)
Titel: Problem in C
Beitrag von: JG am 26. February 2005, 16:27
ich arbeite ja noch amm kernel, der is noch net mal zum teil fertig