Перемещение курсора в текстовом режиме не работает

Я работал над перемещением курсора в текстовом режиме в операционной системе, которую я сейчас разрабатываю. У меня проблемы с тем, чтобы он вообще появился. Вот код, который я использую для обновления курсора:

   void update_cursor()
{
unsigned char cursor_loc = (y_pos*Cols)+x_pos;
// cursor LOW port to vga INDEX register
outb(0x3D4, 0x0F);
outb(0x3D5, (unsigned char)(cursor_loc));
// cursor HIGH port to vga INDEX register
outb(0x3D4, 0x0E);
outb(0x3D5, (unsigned char)((cursor_loc>>8)));}
static inline void outb(unsigned short port, unsigned char value)
{
asm volatile ( "outb %0, %1" : : "a"(value), "Nd"(port) );

}
static inline unsigned char inb(unsigned short port)
{
unsigned char ret;
asm volatile ( "inb %1, %0" : "=a"(ret) : "Nd"(port) );

return ret;
}

Я использую gcc версии 4.8.3 (GCC) для компиляции моего основного файла. Я полностью потерян. У кого-нибудь есть предложения относительно того, в чем может быть проблема с этим?
Если вы хотите увидеть полный источник, он находится здесь: https://github.com/AnonymousUser1337/Anmu/blob/master/Kernel/kernel.cpp

РЕДАКТИРОВАТЬ: Я использую виртуальную коробку для запуска

Заранее спасибо.

1

Решение

Вы выбрали неправильные регистры VGA. Вы должны использовать 0x0F для низкого и 0x0E для высокого (у вас есть 0x0A для обоих).

Редактировать: Если ваш курсор отключен, вот как это сделать:

void enable_cursor() {
outb(0x3D4, 0x0A);
char curstart = inb(0x3D5) & 0x1F; // get cursor scanline start

outb(0x3D4, 0x0A);
outb(0x3D5, curstart | 0x20); // set enable bit
}

Также проверьте эта ссылка для списка регистрационных номеров и использования.

Edit2: Ваша переменная местоположения курсора недостаточно широка, чтобы сохранить местоположение курсора. unsigned char cursor_loc должно быть unsigned short cursor_loc,

2

Другие решения

Ваша функция outb имеет порт и значение в неправильных местах. Вместо:

asm volatile ( "outb %0, %1" : : "a"(value), "Nd"(port) );

Пытаться:

asm volatile ("outb %1, %0" : : "dN" (port), "a" (value));

Надеюсь, поможет 🙂

0

По вопросам рекламы [email protected]