|
|
@ -3,20 +3,52 @@ |
|
|
|
// VGA base address: 0xb8000
|
|
|
|
// VGA base address: 0xb8000
|
|
|
|
// Charpos = 0xb8000 + 2(row*80 + col)
|
|
|
|
// Charpos = 0xb8000 + 2(row*80 + col)
|
|
|
|
|
|
|
|
|
|
|
|
#define VIDEO_MEM (char*)0xb8000 |
|
|
|
// Memory
|
|
|
|
#define GET_INDEX(s, c) (int)(c-s) |
|
|
|
#define VIDEO_MEM (char*)0xb8000 |
|
|
|
static int cursor_y = 0; |
|
|
|
#define VIDEO_MEM_MAX (char*)0xb8fa0 |
|
|
|
|
|
|
|
|
|
|
|
char* get_cursor_pos(unsigned int col, unsigned int row) {
|
|
|
|
// Global
|
|
|
|
|
|
|
|
static unsigned int cursor_row = 0; |
|
|
|
|
|
|
|
static unsigned int cursor_col = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
VGA & Memory Functions |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
char* get_vga_charpos_pointer(unsigned int col, unsigned int row) {
|
|
|
|
return (char*)(VIDEO_MEM + 2*((row*80) + col));
|
|
|
|
return (char*)(VIDEO_MEM + 2*((row*80) + col));
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void print(char* str, unsigned int str_len) { |
|
|
|
void putc(char c, unsigned int col, unsigned int row, int colorcode) { |
|
|
|
|
|
|
|
char* mem = get_vga_charpos_pointer(col, row); |
|
|
|
|
|
|
|
*mem = c; // Write the character
|
|
|
|
|
|
|
|
*(mem+1) = colorcode; // Write the colorcode
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
Graphics Functions |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
void clear_screen() { |
|
|
|
|
|
|
|
// Make all the characters spaces
|
|
|
|
|
|
|
|
for( char* c = VIDEO_MEM; c <= VIDEO_MEM_MAX; c += 2 ) |
|
|
|
|
|
|
|
*c = 0x20; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
General Printing Functions |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
void set_cursor_pos(unsigned int x, unsigned int y) { |
|
|
|
|
|
|
|
cursor_col = x; |
|
|
|
|
|
|
|
cursor_row = y; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void print(char* str, int colorcode) { |
|
|
|
for( char* c = str; *c != '\0'; c++ )
|
|
|
|
for( char* c = str; *c != '\0'; c++ )
|
|
|
|
*get_cursor_pos( GET_INDEX(str, c), cursor_y ) = *c; |
|
|
|
putc(*c, (unsigned int)(c - str) + cursor_col, cursor_row, colorcode); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void println(char* str, unsigned int str_len) { |
|
|
|
void println(char* str, int colorcode) { |
|
|
|
print(str, str_len); |
|
|
|
print(str, colorcode); |
|
|
|
cursor_y++; // Increment to next y-pos (newline)
|
|
|
|
cursor_row++; // Increment to next y-pos (newline)
|
|
|
|
} |
|
|
|
} |
|
|
|