Merge pull request #23 from E-Almqvist/dev

VGA & Strings
pull/25/head
Elias Almqvist 3 years ago committed by GitHub
commit 81c9c75be1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      Makefile
  2. 3
      TODO.md
  3. 7
      src/kernel/kernel.c
  4. 8
      src/kernel/lib/string.c
  5. 50
      src/kernel/lib/vga.c

@ -3,6 +3,8 @@ all: os-image
run: all run: all
qemu-system-x86_64 os-image qemu-system-x86_64 os-image
drun: clean run
grub: eOS.iso grub: eOS.iso
qemu-system-x86_64 eOS.iso qemu-system-x86_64 eOS.iso
@ -32,4 +34,3 @@ clean:
kernel.dis : kernel.bin kernel.dis : kernel.bin
ndisasm -b 32 $< > $@ ndisasm -b 32 $< > $@

@ -0,0 +1,3 @@
# TO DO
- Multiboot support (for grub etc)
- Expand os-image so there is no error 0x8b00!

@ -4,7 +4,8 @@ void main() {
// Do kernel stuff // Do kernel stuff
char* vidmem = (char*)0xb8000; char* vidmem = (char*)0xb8000;
*vidmem = 'X'; *vidmem = 'X';
for( int i = 0; i < 16; i++ ) {
println("C-Printing test!", 16); clear_screen();
} set_cursor_pos(24, 0);
println("\t eOS Version 0.0 2021", 0xf0);
} }

@ -0,0 +1,8 @@
// Generic String Library
#define INDEX(s, c) (int)(c-s)
unsigned int length(char* str) {
char* p;
for( p = str; *p != '\0'; p++ ) {}
return (unsigned int)(p-str);
}

@ -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)
} }

Loading…
Cancel
Save