Multi-line support in printf

This commit is contained in:
Fergal Moran
2020-06-08 12:35:51 +01:00
parent 0bd937afb5
commit c1e6d245b1
3 changed files with 39 additions and 8 deletions

View File

@@ -11,9 +11,34 @@
void printf(char* str) {
static uint16_t* VideoMemory = (uint16_t*)0xb8000;
static uint8_t x = 0, y = 0;
for (int i = 0; str[i] != '\0'; ++i)
VideoMemory[i] = (VideoMemory[i] & 0xFF00) | str[i];
for (int i = 0; str[i] != '\0'; ++i) {
switch (str[i]) {
case '\n':
y++;
x = 0;
break;
default:
VideoMemory[80 * y + x] = (VideoMemory[80 * y + x] & 0xFF00) | str[i];
x++;
break;
}
//line feed after 80 chars (terminal width)
if (x >= 80) {
y++;
x = 0;
}
//we've reached max screen rows
if (y > 25) {
for (y = 0; y < 25; y++) {
for (x - 0; x < 80; x++) {
VideoMemory[80 * y + x] = (VideoMemory[80 * y + x] & 0xFF00) | ' ';
}
}
}
}
}
typedef void (*constructor)();
@@ -25,7 +50,10 @@ extern "C" void call_constructors() {
}
extern "C" void ferglos_Main(const void* multiboot_structure, uint32_t /*mb_mag*/) {
printf("Welcome to FerglOS v0.0.1!");
printf("Welcome to FerglOS v0.0.2!\n");
printf("Hitler blinks.");
GlobalDescriptorTable gdt;
while (1)
;
}