VGA print_string()

This commit is contained in:
Arnau Camprubí 2022-06-17 13:27:22 +02:00
pare 1816cefb47
commit b941e48f4b
S'han modificat 3 arxius amb 67 adicions i 4 eliminacions

Veure arxiu

@ -1,6 +1,8 @@
#include "vga.h"
#include "../arch/i686/io.h"
static uint8_t current_color = VGA_COLOR_BG_BLACK | VGA_COLOR_FG_WHITE;
void set_char(int x, int y, char c){
VGA_MEMORY[(x+y*VGA_WIDTH)*2] = c;
}
@ -23,3 +25,64 @@ int get_cursor(){
offset += i686_inb(VGA_PORT_DATA); // Low byte
return offset;
}
static int get_offset_y(int offset){
return offset / VGA_WIDTH;
}
static int get_offset_x(int offset){
return (offset - (get_offset_y(offset)*VGA_WIDTH));
}
int print_char(char c, int x, int y){
if(x >= VGA_WIDTH || y >= VGA_HEIGHT){ // Incorrect coords
VGA_MEMORY[2*VGA_WIDTH*VGA_HEIGHT-2] = 'E';
VGA_MEMORY[2*VGA_WIDTH*VGA_HEIGHT-1] = VGA_COLOR_BG_RED || VGA_COLOR_FG_BLACK;
return y*VGA_WIDTH+x;
}
int offset;
if(x >= 0 && y >= 0) offset = y*VGA_WIDTH+x;
else offset = get_cursor();
if(c == '\n'){
y = get_offset_y(offset);
offset = (y+1)*VGA_WIDTH;
}
else if(c == '\b'){
VGA_MEMORY[offset*2] = ' ';
VGA_MEMORY[offset*2+1] = current_color;
}
else{
VGA_MEMORY[offset*2] = c;
VGA_MEMORY[offset*2+1] = current_color;
offset++;
}
// TODO: Scroll
set_cursor(offset);
return offset;
}
void print_string_at(char *str, int x, int y){
int offset;
if(x >= 0 && y >= 0){
offset = y*VGA_WIDTH+x;
}
else{
offset = get_cursor();
x = get_offset_x(offset);
y = get_offset_y(offset);
}
while(*str){
offset = print_char(*(str++), x, y);
x = get_offset_x(offset);
y = get_offset_y(offset);
}
}
void print_string(char *str){
print_string_at(str, -1, -1);
}

Veure arxiu

@ -48,3 +48,6 @@ void set_char(int x, int y, char c);
void set_color(int x, int y, uint8_t color);
void set_cursor(int offset);
int get_cursor();
int print_char(char c, int x, int y);
void print_string_at(char *str, int x, int y);
void print_string(char *str);

Veure arxiu

@ -2,9 +2,6 @@
#include "drivers/vga.h"
void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){
// Print a light cyan 'X' over green on the top left corner
set_char(0, 0, 'X');
set_color(0, 0, VGA_COLOR_BG_GREEN | VGA_COLOR_FG_LIGHT_CYAN);
set_cursor(1);
print_string("Hello world!\n:D");
for(;;); // Halt here
}