Я пытаюсь разработать собственное доказательство концепции операционной системы. Просто некоторые основы. Я только вошел в графику с VBE. Одна проблема у меня была получить поддерживаемые режимы видео. После интенсивных исследований я обнаружил, что vbe получает информацию о биосе (ax = 4f00 int 10) и реализовал ее следующим образом:
Это реальный режим
mov ax, 0
mov es, ax
mov ax, [vbe_info_structure]
mov di, ax
mov ax, 0x4f00
int 0x10
cmp ax, 0x004F
jne notOK
, и объявил структуру vbe_info следующим образом также в реальномmode
vbe_info_structure:
.signature db "VESA" ; indicate support for VBE 2.0+
.table_data: resb 512-4 ; reserve space for the table below
Затем я передал его адрес своему ядру в качестве параметра (32 бита !!!)
mov eax, [vbe_info_structure]
push eax
call _kmain
, и мой простой код ядра такой (32 бита))
struct VbeInfoBlock {
char VbeSignature[4]; // == "VESA"
uint16_t VbeVersion; // == 0x0300 for VBE 3.0
uint16_t OemStringPtr[2]; // isa vbeFarPtr
uint8_t Capabilities[4];
uint16_t VideoModePtr[2]; // isa vbeFarPtr
uint16_t TotalMemory; // as # of 64KB blocks
} __attribute__((packed));
int kmain(struct VbeInfoBlock *vbeinfo)
{
init_idt();
SetPITSpeed(100);
init_DTCursor();
printf(vbeinfo->VbeSignature[0]);
while(1);
}
Исключительным вводом из printf должно быть "V", но я получаю ненужный S и некоторые нежелательные символы только 2 символа.