réplica de
https://github.com/Arnau478/quark.git
synced 2024-11-23 12:58:07 +01:00
VGA print_string()
This commit is contained in:
pare
1816cefb47
commit
b941e48f4b
S'han modificat 3 arxius amb 67 adicions i 4 eliminacions
|
@ -1,6 +1,8 @@
|
||||||
#include "vga.h"
|
#include "vga.h"
|
||||||
#include "../arch/i686/io.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){
|
void set_char(int x, int y, char c){
|
||||||
VGA_MEMORY[(x+y*VGA_WIDTH)*2] = c;
|
VGA_MEMORY[(x+y*VGA_WIDTH)*2] = c;
|
||||||
}
|
}
|
||||||
|
@ -23,3 +25,64 @@ int get_cursor(){
|
||||||
offset += i686_inb(VGA_PORT_DATA); // Low byte
|
offset += i686_inb(VGA_PORT_DATA); // Low byte
|
||||||
return offset;
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -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_color(int x, int y, uint8_t color);
|
||||||
void set_cursor(int offset);
|
void set_cursor(int offset);
|
||||||
int get_cursor();
|
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);
|
||||||
|
|
|
@ -2,9 +2,6 @@
|
||||||
#include "drivers/vga.h"
|
#include "drivers/vga.h"
|
||||||
|
|
||||||
void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){
|
void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){
|
||||||
// Print a light cyan 'X' over green on the top left corner
|
print_string("Hello world!\n:D");
|
||||||
set_char(0, 0, 'X');
|
|
||||||
set_color(0, 0, VGA_COLOR_BG_GREEN | VGA_COLOR_FG_LIGHT_CYAN);
|
|
||||||
set_cursor(1);
|
|
||||||
for(;;); // Halt here
|
for(;;); // Halt here
|
||||||
}
|
}
|
||||||
|
|
Loading…
Referencia en una nova incidència