-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkernel.c
More file actions
53 lines (47 loc) · 2.07 KB
/
Copy pathkernel.c
File metadata and controls
53 lines (47 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// o buffer de texto do VGA é o nosso "frame_buffer" principal, podendo setá-lo fora dos escopos.
// 0xb8000 é o endereço dele, do buffer de texto do VGA;
// sendo computado, cada byte, como um array de tamanho 2:
// vga_text[0] = CHAR; // 4 bits
// vga_text[1] = COLOR; // 4 bits
char *vga_text = (char *)0xb8000;
void k_clean_screen() {
// como computa por toda a tela do terminal, o padrão básico é 80x25 = 2000. por ser 2 bytes, 4000
// aqui não é pra printar nada, mas para limpar a tela.
for ( unsigned int i = 0; i < 80 * 25 * 2; /* */ ) {
vga_text[i] = ' '; // espaço em branco
vga_text[i + 1] = 0x07; // 0x07 é cinza
// como trabalhamos a cada 2 bytes, i cresce por 2
i += 2;
}
}
// precisamos de um cursor, que passa por todo o buffer
// esse cursor é global, por isso adere static e fica de fora do escopo, evitando ser resetado
static int cursor = 0;
void k_printf( char* string ) {
for ( unsigned int i = 0; string[i] != '\0'; i++ ) {
// assim como limpamos toda nossa tela no k_clean_screen(),
// a cada byte precisamos atribuir alguma coisa
// primeiramente, caso nosso char seja algum escape, por exemplo de pular linha
if ( string[i] == '\n' ) {
// basicamente:
// pos_real = cursor / 2 // anda de 2 em 2 bytes, lembra disso
// coluna_atual = pos_real % 80 // partindo da primeira linha, pega a coluna atual
// res = (total_coluna - coluna_atual) // pega a quantidade necessária para chegar ao começo da próxima linha
// total_bytes = res * 2 // anda de 2 em 2 bytes, lembra ?
cursor += (80 - (cursor / 2) % 80) * 2;
continue;
}
vga_text[cursor++] = string[i]; // CHAR
vga_text[cursor++] = 0x0f; // branco fundo preto
}
}
// nesse caso, o nosso main vira o main do kernel.
void k_main() {
// e, como todo processo tem um gráfico bem feito, assim descrito em /Jwxs/fish_terminal,
// o mais básico é:
// 1. limpar a tela
k_clean_screen();
// 2. aplicar, na tela - de uma só vez - , tudo o que é necessário
// no caso, apenas um simples texto tá bom;;
k_printf( "Protótipo de kernel rodando! Parabéns!\n" );
}