Возник другой вопрос, почему то когда курсор устанавливается, после установки вызывается перерисовка и выводятся строки загрузки, хотя должен быть отрисован мой текст и курсор в положении 0 0.
Курсор прыгает на другую позицию
как было
https://snag.gy/saWYFH.jpgкак становится
https://snag.gy/x7KVGe.jpgэти два экрана меняются постоянно и курсор прыгает то вначало то на позицию на скриншотах.
как исправить?
куда копать?
вот исходники
Код:
void Clear(const char _color);
void DrawChar(const char _char,const unsigned int _x,const unsigned int _y,const char _color);
void DrawText(const char* _text,const unsigned int _x,const unsigned int _y,const char _color);
void SetCursor();
void kernel(void)
{
Clear(0b00010000);
DrawText("KVonosan Operating System version 14.02.2018",0,0,0b00011110);
//DrawChar('B',1,1,0b00011110);
SetCursor();
for(;;)
{
}
}
Код:
#define VIDEO_RAM 0x000B8000
void Clear(const char _color)
{
unsigned int i=0;
char* address=0;
address=(char*)VIDEO_RAM;
for(i=0;i<80*25*2;i+=2)
{
*(address+i)=' ';
*(address+i+1)=_color;
}
}
void DrawChar(const char _char,const unsigned int _x,const unsigned int _y,const char _color)
{
unsigned int i=0;
char* address=0;
i=160*_y+2*_x;
address=(char*)VIDEO_RAM;
*(address+i) = _char;
*(address+i+1) = _color;
}
void DrawText(const char* _text,const unsigned int _x,const unsigned int _y,const char _color)
{
unsigned int i=0;
unsigned int j=0;
unsigned int length=0;
char* address=0;
i=160*_y+2*_x;
address=(char*)VIDEO_RAM;
while(_text[length]) length++;
while(length)
{
*(address+i) = _text[j];
*(address+i+1) = _color;
i+=2;
j++;
length--;
}
}
void SetCursor()
{
char a;
asm(
".intel_syntax;"
"mov ah, 0x02;"
"mov dh, 0x00;"
"mov dl, 0x00;"
"mov bh, 0x00;"
"int 0x10;"
:
: "r"(a)
: "ah", "dx"
);
}