Writing (debug output) to screen
This commit is contained in:
parent
b9e9df32f5
commit
4f00d428bf
@ -2,6 +2,7 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
#include <serial.h>
|
||||
#include <vga.h>
|
||||
|
||||
// TODO: Temporary declarations
|
||||
void vga_write(char c);
|
||||
|
@ -1,36 +1,13 @@
|
||||
#include <memory.h>
|
||||
#include <serial.h>
|
||||
#include <vga.h>
|
||||
#include <debug.h>
|
||||
|
||||
void clear_screen()
|
||||
{
|
||||
unsigned char *vidmem = P2V(0xB8000);
|
||||
for(int i=0; i < 80*24*2; i++)
|
||||
*vidmem++ = 0;
|
||||
}
|
||||
|
||||
void print_string(char *str)
|
||||
{
|
||||
unsigned char *vidmem = P2V(0xB8000);
|
||||
while(*str)
|
||||
{
|
||||
*vidmem++ = *str++;
|
||||
*vidmem++ = 0x7;
|
||||
}
|
||||
}
|
||||
|
||||
void vga_write(char c)
|
||||
{
|
||||
// TODO: DUMMY
|
||||
(void)c;
|
||||
}
|
||||
|
||||
void kmain()
|
||||
{
|
||||
clear_screen();
|
||||
print_string("Hello from c, world!");
|
||||
|
||||
serial_init(PORT_COM1);
|
||||
vga_init();
|
||||
|
||||
debug_printf("Hello from debug printing function!\n");
|
||||
debug_printf("A number:%d\n", 12345);
|
||||
for(;;);
|
||||
|
37
src/kernel/drivers/vga.c
Normal file
37
src/kernel/drivers/vga.c
Normal file
@ -0,0 +1,37 @@
|
||||
#include <vga.h>
|
||||
#include <memory.h>
|
||||
|
||||
void *vidmem;
|
||||
struct {
|
||||
uint8_t character;
|
||||
uint8_t format;
|
||||
}__attribute__((packed)) buffer[VGA_SIZE];
|
||||
|
||||
uint64_t cursor;
|
||||
|
||||
void vga_init()
|
||||
{
|
||||
vidmem = VGA_MEMORY;
|
||||
memset(vidmem, 0, VGA_SIZE*2);
|
||||
}
|
||||
|
||||
void flush()
|
||||
{
|
||||
memcpy(vidmem, buffer, sizeof(buffer));
|
||||
}
|
||||
|
||||
void vga_write(char c)
|
||||
{
|
||||
switch(c)
|
||||
{
|
||||
case '\n':
|
||||
cursor += VGA_COLS;
|
||||
cursor -= VGA_COL(cursor);
|
||||
break;
|
||||
default:
|
||||
buffer[cursor].character = c;
|
||||
buffer[cursor].format = 0x7;
|
||||
cursor++;
|
||||
}
|
||||
flush();
|
||||
}
|
79
src/kernel/drivers/vga.tt
Normal file
79
src/kernel/drivers/vga.tt
Normal file
@ -0,0 +1,79 @@
|
||||
// vim: ft=c
|
||||
#include <ttest.h>
|
||||
|
||||
#include <vga.h>
|
||||
#undef VGA_MEMORY
|
||||
#define VGA_MEMORY calloc(80*24,3)
|
||||
#include "vga.c"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct cell
|
||||
{
|
||||
uint8_t c;
|
||||
uint8_t f;
|
||||
}__attribute__((packed));
|
||||
|
||||
struct cell *cells;
|
||||
|
||||
BEFORE()
|
||||
{
|
||||
vga_init();
|
||||
cells = vidmem;
|
||||
cells[VGA_COLS*VGA_ROWS].c = '$';
|
||||
}
|
||||
|
||||
#define VGA_ASSERT_EQ(pos, ch) ASSERT_EQ_CHR(cells[(pos)].c, (ch))
|
||||
|
||||
|
||||
TEST(vga_starts_with_a_clear_screen)
|
||||
{
|
||||
VGA_ASSERT_EQ(VGA_COLS*VGA_ROWS-1, '\0');
|
||||
}
|
||||
|
||||
TEST(vga_write_adds_character_to_vidmem)
|
||||
{
|
||||
vga_write('a');
|
||||
VGA_ASSERT_EQ(0, 'a');
|
||||
}
|
||||
|
||||
TEST(vga_output_is_visible)
|
||||
{
|
||||
vga_write('a');
|
||||
ASSERT_NEQ_INT(cells[0].f, 0);
|
||||
}
|
||||
|
||||
TEST(vga_write_adds_multiple_characters_to_vidmem)
|
||||
{
|
||||
vga_write('a');
|
||||
vga_write('b');
|
||||
VGA_ASSERT_EQ(1, 'b');
|
||||
}
|
||||
|
||||
TEST(vga_writes_entire_screen_full)
|
||||
{
|
||||
for(int i = 0; i < VGA_COLS*VGA_ROWS; i++)
|
||||
vga_write('x');
|
||||
|
||||
VGA_ASSERT_EQ(VGA_POS(VGA_ROWS-1, VGA_COLS-1), 'x');
|
||||
}
|
||||
TEST(vga_does_not_overflow_memory_area)
|
||||
{
|
||||
for(int i = 0; i < (VGA_COLS*VGA_ROWS+1); i++)
|
||||
vga_write('x');
|
||||
VGA_ASSERT_EQ(VGA_COLS*VGA_ROWS, '$');
|
||||
}
|
||||
|
||||
TEST(newline_moves_down_one_line_when_at_beginning)
|
||||
{
|
||||
vga_write('\n');
|
||||
vga_write('a');
|
||||
VGA_ASSERT_EQ(VGA_POS(1,0), 'a');
|
||||
}
|
||||
TEST(newline_moves_to_beginning_of_line)
|
||||
{
|
||||
vga_write('a');
|
||||
vga_write('\n');
|
||||
vga_write('b');
|
||||
VGA_ASSERT_EQ(VGA_POS(1,0), 'b');
|
||||
}
|
14
src/kernel/include/vga.h
Normal file
14
src/kernel/include/vga.h
Normal file
@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
#define VGA_COLS 80
|
||||
#define VGA_ROWS 24
|
||||
#define VGA_SIZE (VGA_COLS*VGA_ROWS)
|
||||
|
||||
#define VGA_ROW(pos) ((pos)/VGA_COLS)
|
||||
#define VGA_COL(pos) ((pos)%VGA_COLS)
|
||||
#define VGA_POS(row, col) ((row)*VGA_COLS + (col))
|
||||
|
||||
#define VGA_MEMORY P2V(0xB8000)
|
||||
|
||||
void vga_init();
|
||||
void vga_write(char c);
|
Loading…
x
Reference in New Issue
Block a user