#ifndef X86_TTY_H
#define X86_TTY_H
+
+#include <stdint.h>
+
+#define VGA_COLOR_BLACK 0x0
+#define VGA_COLOR_BLUE 0x1
+#define VGA_COLOR_GREEN 0x2
+#define VGA_COLOR_TEAL 0x3
+#define VGA_COLOR_DARK_RED 0x4
+#define VGA_COLOR_MAGENTA 0x5
+#define VGA_COLOR_BROWN 0x6
+#define VGA_COLOR_LIGHT_GRAY 0x7
+#define VGA_COLOR_DARK_GRAY 0x8
+#define VGA_COLOR_PURPLE 0x9
+#define VGA_COLOR_LIME 0xA
+#define VGA_COLOR_CYAN 0xB
+#define VGA_COLOR_BRIGHT_RED 0xC
+#define VGA_COLOR_PINK 0xD
+#define VGA_COLOR_YELLOW 0xE
+#define VGA_COLOR_WHITE 0xF
+
extern void screen_clear(void);
-extern void kprint(const char *string);
+extern void kprint(const char *string, uint8_t color);
+extern void kprintb(const uint8_t byte);
+extern void kprintw(const uint16_t word);
+extern void kprintd(const uint32_t dword);
#endif
+#include <io.h>
+#include <tty.h>
+#include <stdint.h>
+
#define VGA_WIDTH 80
#define VGA_HEIGHT 25
volatile char *video_memory = (char *) 0xB8000; /* VGA VRAM starts at 0xB8000 */
-static int cursor_x = 0;
+static int cursor_x = 0; /* keep track of where cursor is */
static int cursor_y = 0;
+char *hex_chars = "0123456789ABCDEF";
+
void screen_clear(void)
{
int x, y;
for ( y = 0; y < VGA_HEIGHT; y++ ) {
for ( x = 0; x < VGA_WIDTH; x++ ) {
- video_memory[(y * VGA_WIDTH + x) * 2 + 1] = 0x07;
+ video_memory[(y * VGA_WIDTH + x) * 2 + 1] = VGA_COLOR_LIGHT_GRAY;
video_memory[(y * VGA_WIDTH + x) * 2] = ' ';
}
}
cursor_y = VGA_HEIGHT - 1;
}
-void kprint(const char *string)
+void kprint(const char *string, uint8_t color)
{
char next_char;
+ uint8_t vga_misc_output;
+ uint16_t crtc_port;
next_char = *string;
while ( next_char != 0 ) {
if ( next_char == '\n') { cursor_x = 0; cursor_y++; }
- else { video_memory[(cursor_y * VGA_WIDTH + cursor_x++) * 2] = next_char; }
+ else { video_memory[(cursor_y * VGA_WIDTH + cursor_x) * 2] = next_char; video_memory[((cursor_y * VGA_WIDTH + cursor_x++) * 2)+ 1] = color != 0 ? color : VGA_COLOR_LIGHT_GRAY; }
if ( cursor_x >= VGA_WIDTH ) { cursor_x = 0; cursor_y++; }
if ( cursor_y >= VGA_HEIGHT ) { scroll_up(); }
next_char = *++string;
}
+
+ vga_misc_output = inb(0x3CC);
+ if (vga_misc_output & 0x1 == 0) {
+ crtc_port = 0x3B4;
+ } else {
+ crtc_port = 0x3D4;
+ }
+
+ outb(crtc_port, 0xE);
+ outb(crtc_port + 1, (cursor_y * VGA_WIDTH + cursor_x) >> 8);
+ outb(crtc_port, 0xF);
+ outb(crtc_port + 1, (cursor_y * VGA_WIDTH + cursor_x) & 0xFF);
+}
+
+void kprintc(const char character, uint8_t color)
+{
+ uint8_t vga_misc_output;
+ uint16_t crtc_port;
+
+ if ( character == '\n') { cursor_x = 0; cursor_y++; }
+ else { video_memory[(cursor_y * VGA_WIDTH + cursor_x) * 2] = character; video_memory[((cursor_y * VGA_WIDTH + cursor_x++) * 2)+ 1] = color != 0 ? color : VGA_COLOR_LIGHT_GRAY; }
+ if ( cursor_x >= VGA_WIDTH ) { cursor_x = 0; cursor_y++; }
+ if ( cursor_y >= VGA_HEIGHT ) { scroll_up(); }
+
+ vga_misc_output = inb(0x3CC);
+ if (vga_misc_output & 0x1 == 0) {
+ crtc_port = 0x3B4;
+ } else {
+ crtc_port = 0x3D4;
+ }
+
+ outb(crtc_port, 0xE);
+ outb(crtc_port + 1, (cursor_y * VGA_WIDTH + cursor_x) >> 8);
+ outb(crtc_port, 0xF);
+ outb(crtc_port + 1, (cursor_y * VGA_WIDTH + cursor_x) & 0xFF);
+
+}
+
+void kprintb(uint8_t byte)
+{
+ uint8_t temp;
+ temp = byte >> 4;
+ kprint("0x", VGA_COLOR_LIGHT_GRAY);
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = byte & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+}
+
+void kprintw(uint16_t word)
+{
+ uint8_t temp;
+ temp = word >> 12;
+ kprint("0x", VGA_COLOR_LIGHT_GRAY);
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = (word >> 8) & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = (word >> 4) & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = word & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+}
+
+void kprintd(uint32_t dword)
+{
+ uint8_t temp;
+ temp = dword >> 28;
+ kprint("0x", VGA_COLOR_LIGHT_GRAY);
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = (dword >> 24) & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = (dword >> 20) & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = (dword >> 16) & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = (dword >> 12) & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = (dword >> 8) & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = (dword >> 4) & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
+ temp = dword & 0xF;
+ kprintc(hex_chars[temp], VGA_COLOR_LIGHT_GRAY);
}
#include <tty.h>
+#include <io.h>
+#include <stdint.h>
const char *string = "Hello there!\n\n\
Hopefully your machine manages to print this text.\n\
void _start(void)
{
screen_clear();
- kprint(string);
+ /*kprint(string, 0x07);*/
+ kprint("Color 0x01\n", VGA_COLOR_BLUE);
+ kprint("Color 0x02\n", VGA_COLOR_GREEN);
+ kprint("Color 0x03\n", VGA_COLOR_TEAL);
+ kprint("Color 0x04\n", VGA_COLOR_DARK_RED);
+ kprint("Color 0x05\n", VGA_COLOR_MAGENTA);
+ kprint("Color 0x06\n", VGA_COLOR_BROWN);
+ kprint("Color 0x07\n", VGA_COLOR_LIGHT_GRAY);
+ kprint("Color 0x08\n", VGA_COLOR_DARK_GRAY);
+ kprint("Color 0x09\n", VGA_COLOR_PURPLE);
+ kprint("Color 0x0A\n", VGA_COLOR_LIME);
+ kprint("Color 0x0B\n", VGA_COLOR_CYAN);
+ kprint("Color 0x0C\n", VGA_COLOR_BRIGHT_RED);
+ kprint("Color 0x0D\n", VGA_COLOR_PINK);
+ kprint("Color 0x0E\n", VGA_COLOR_YELLOW);
+ kprint("Color 0x0F\n", VGA_COLOR_WHITE);
+ kprintb(0xAE);
+ kprint("\n", 0);
+ kprintw(0xDEAD);
+ kprint("\n", 0);
+ kprintd(0x89ABCDEF);
}