...
This commit is contained in:
@@ -1,52 +1,6 @@
|
||||
#include "print.h"
|
||||
|
||||
/**
|
||||
* C++ version 0.4 char* style "itoa":
|
||||
* Written by Lukás Chmela
|
||||
* Released under GPLv3.
|
||||
*/
|
||||
char* itoa(int value, char* result, int base)
|
||||
{
|
||||
// check that the base if valid
|
||||
if (base < 2 || base > 36)
|
||||
{
|
||||
*result = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
char *ptr = result, *ptr1 = result, tmp_char;
|
||||
int tmp_value;
|
||||
|
||||
do
|
||||
{
|
||||
tmp_value = value;
|
||||
value /= base;
|
||||
*ptr++ =
|
||||
"zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
|
||||
} while (value);
|
||||
|
||||
// Apply negative sign
|
||||
if (tmp_value < 0)
|
||||
*ptr++ = '-';
|
||||
*ptr-- = '\0';
|
||||
|
||||
// Reverse the string
|
||||
while (ptr1 < ptr)
|
||||
{
|
||||
tmp_char = *ptr;
|
||||
*ptr-- = *ptr1;
|
||||
*ptr1++ = tmp_char;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void kernel_init(void)
|
||||
{
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
// char buf[10];
|
||||
// itoa(i, buf, 10);
|
||||
// kernel_print(buf);
|
||||
kernel_print("Starting nub-osStarting");
|
||||
}
|
||||
print("Starting nub-os\n");
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#include "print.h"
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#define ROWS 25
|
||||
#define COLUMNS 80
|
||||
@@ -47,14 +46,80 @@ typedef struct
|
||||
uint8_t color;
|
||||
} vga_char;
|
||||
|
||||
static vga_char* print_buf = (vga_char*)BUF_START;
|
||||
static vga_char* vga_buffer = (vga_char*)BUF_START;
|
||||
static int cursor_row = 0;
|
||||
static int cursor_col = 0;
|
||||
|
||||
void kernel_print(const char* string)
|
||||
void scroll(void)
|
||||
{
|
||||
for (int i = 0; string[i]; i++)
|
||||
for (int row = 1; row < ROWS; row++)
|
||||
{
|
||||
// todo(nub): scroll if overflowing
|
||||
for (int col = 0; col < COLUMNS; col++)
|
||||
{
|
||||
vga_buffer[(row - 1) * COLUMNS + col] = vga_buffer[row * COLUMNS + col];
|
||||
}
|
||||
}
|
||||
|
||||
*print_buf++ = (vga_char){ string[i], FG_WHITE | BG_BLACK << 4 };
|
||||
for (int col = 0; col < COLUMNS; col++)
|
||||
{
|
||||
vga_buffer[(ROWS - 1) * COLUMNS + col] = (vga_char){ ' ', FG_WHITE | BG_BLACK << 4 };
|
||||
}
|
||||
}
|
||||
|
||||
void put_char(char c, uint8_t color)
|
||||
{
|
||||
if (c == '\n')
|
||||
{
|
||||
cursor_col = 0;
|
||||
cursor_row++;
|
||||
}
|
||||
else
|
||||
{
|
||||
vga_buffer[cursor_row * COLUMNS + cursor_col] = (vga_char){ c, color };
|
||||
cursor_col++;
|
||||
}
|
||||
|
||||
if (cursor_col >= COLUMNS)
|
||||
{
|
||||
cursor_col = 0;
|
||||
cursor_row++;
|
||||
}
|
||||
|
||||
if (cursor_row >= ROWS)
|
||||
{
|
||||
scroll();
|
||||
cursor_row = ROWS - 1;
|
||||
}
|
||||
}
|
||||
|
||||
void print(const char* string)
|
||||
{
|
||||
uint8_t color = FG_WHITE | BG_BLACK << 4;
|
||||
|
||||
for (int i = 0; string[i]; i++)
|
||||
{
|
||||
put_char(string[i], color);
|
||||
}
|
||||
}
|
||||
|
||||
void clear_screen(void)
|
||||
{
|
||||
uint8_t color = FG_WHITE | BG_BLACK << 4;
|
||||
|
||||
for (int i = 0; i < ROWS * COLUMNS; i++)
|
||||
{
|
||||
vga_buffer[i] = (vga_char){ ' ', color };
|
||||
}
|
||||
|
||||
cursor_row = 0;
|
||||
cursor_col = 0;
|
||||
}
|
||||
|
||||
void set_cursor_position(int row, int col)
|
||||
{
|
||||
if (row >= 0 && row < ROWS && col >= 0 && col < COLUMNS)
|
||||
{
|
||||
cursor_row = row;
|
||||
cursor_col = col;
|
||||
}
|
||||
}
|
||||
@@ -1 +1,8 @@
|
||||
#include <stdint.h>
|
||||
|
||||
void kernel_print(const char* string);
|
||||
|
||||
void put_char(char c, uint8_t color);
|
||||
void print(const char* string);
|
||||
void clear_screen(void);
|
||||
void set_cursor_position(int row, int col);
|
||||
Reference in New Issue
Block a user