Все вечер добрый. Господа всея знающие, помогите пожалуйста разобраться с проблемой: есть код tty.h
#ifndef __TTY_H__
#define __TTY_H__
#include <types.h>
#define VIDEO_WIDTH 80 //ширина экрана
#define VIDEO_HEIGHT 25 //высота экрана
#define VIDEO_SIZE VIDEO_WIDTH * VIDEO_HEIGHT * 2
#define VIDEO_RAM 0xb8000 //адрес видеопамяти
void init_tty();
extern void set_text_attribute(ui8);
extern void clrscr();
extern void putchar(ui8);
extern void puts(ui8*);
#endif // __TTY_H__
#include <tty.h>
volatile static ui32 cursor; //положение курсора
volatile static ui8 attribute; //текущий аттрибут символа
//Инициализация tty
void init_tty() {
cursor = 0;
attribute = 3;
}
//Смена текущего аттрибута символа
extern void set_text_attribute(ui8 c) {
attribute = c;
}
//Очистка экрана
extern void clrscr() {
ui8 *video = VIDEO_RAM;
//attribute = 0x35;
for( ui32 i = 0; i < VIDEO_SIZE; i += 2 ) {
video[ i ] = attribute;
video[ i + 1] = ' ';
// video[ i ] = 0x0f;
// video[ i + 1] = attribute;
}
cursor = 0;
}
//Вывод одного символа в режиме телетайпа
extern void putchar(ui8 ch) {
ui8 *video = VIDEO_RAM;
ui32 i;
switch( ch ) {
case '\n': //Если это символ новой строки
cursor += VIDEO_WIDTH;
cursor -= cursor % VIDEO_WIDTH;
break;
default:
video[ cursor * 2 + 1 ] = ch;
cursor += 1;
break;
}
//Если курсор вышел за границу экрана, сдвинем экран вверх на одну строку
if( cursor > VIDEO_WIDTH * VIDEO_HEIGHT ) {
for( i = VIDEO_WIDTH * 2; i <= VIDEO_WIDTH * VIDEO_HEIGHT * 2 + VIDEO_WIDTH * 2; i++ ) {
*( video + i - VIDEO_WIDTH * 2 ) = *( video + i );
}
cursor-=VIDEO_WIDTH;
}
}
//Вывод строки, заканчивающейся нуль-символом
extern void puts(ui8 *s) {
init_tty();
while(*s) {
putchar(*s);
s++;
}
}
Обе глобальные переменные (cursor и attribute) ну никак не хотят менять свои значения, в коде функции clrscr (закоментил) производил проверку присвоения значения переменной, но на экран все равно попадает '\0'
компилю с такими флагами:
-O0 -fomit-frame-pointer -ffreestanding -finline-functions -nostdinc -fno-builtin -nostdlib -std=c99
з. ы. Ах да, как вы уже наверное догадались, все это делается в программе, запущенной из-под самописного загрузчика, тестирую на vmware