Scolling screen

This commit is contained in:
Mathieu Maret 2018-07-18 15:06:31 +02:00
parent 3b875b209e
commit 0e37c3d426
8 changed files with 104 additions and 32 deletions

View File

@ -5,7 +5,8 @@
__attribute__ ((interrupt))
void print_handler(struct interrupt_frame *frame, ulong error_code){
printString("EXCEPTION", RED, BLACK, 0, 6);
printStringDetails("EXCEPTION", RED, BLACK, 0, 20);
printInt(error_code, RED, BLACK, 11, 20);
(void) frame;
(void) error_code;
}

View File

@ -11,8 +11,10 @@ __attribute__((interrupt)) void keyboard_handler(struct interrupt_frame *frame)
char c = 0;
if (inb(0x60) != c) {
c = inb(0x60);
if (c > 0)
printChar(c, RED, BLACK, 0, 8);
if (c > 0){
printChar(c);
printChar('\n');
}
}
(void)frame;
}
@ -21,6 +23,6 @@ __attribute__((interrupt)) void timer_handler(struct interrupt_frame *frame)
{
static int timeCnt = 0;
EOIIrq(IRQ_TIMER);
printInt(timeCnt++, RED, BLACK, 0, 9);
printInt(timeCnt++, RED, BLACK, 20, VGA_HEIGHT -1 );
(void)frame;
}

11
klibc.c Normal file
View File

@ -0,0 +1,11 @@
#include "klibc.h"
void *memcpy(void *dst, const void *src, size_t n)
{
char *dstChar = dst;
const char *srcChar = src;
for (size_t i = 0; i < n; i++) {
*(dstChar++) = *(srcChar++);
}
return dst;
}

4
klibc.h Normal file
View File

@ -0,0 +1,4 @@
#pragma once
#include "types.h"
void *memcpy(void *dest, const void *src, size_t n );

26
main.c
View File

@ -8,18 +8,6 @@
#include "types.h"
#include "vga.h"
char getScancode()
{
char c = 0;
do {
if (inb(0x60) != c) {
c = inb(0x60);
if (c > 0)
return c;
}
} while (1);
}
void cpuid(int code, uint32_t *a, uint32_t *d)
{
asm volatile("cpuid" : "=a"(*a), "=d"(*d) : "0"(code) : "ebx", "ecx");
@ -27,25 +15,23 @@ void cpuid(int code, uint32_t *a, uint32_t *d)
void kmain()
{
const short color = GREEN;
clearScreen(BLACK);
printString("Setting up IDT", color, BLACK, 0, 0);
initVGA(BLACK, GREEN);
printString("Setting up IDT\n");
gdtSetup();
idtSetup();
printString("Setting up IRQ", color, BLACK, 0, 1);
irqSetup();
initPit(100);
printString("Setting up IRQ handlers", color, BLACK, 0, 1);
printString("Setting up IRQ handlers\n");
irqSetRoutine(IRQ_KEYBOARD, keyboard_handler);
irqSetRoutine(IRQ_TIMER, timer_handler);
printString("Enabling HW interrupts", color, BLACK, 0, 2);
printString("Enabling HW interrupts\n");
exceptionSetRoutine(EXCEPTION_DOUBLE_FAULT, print_handler);
// Enabling the HW interrupts
asm volatile("sti\n");
int count = 0;
while (1) {
printInt(count++, color, BLACK, 0, 6);
printInt(count++, GREEN, BLACK, 0, VGA_HEIGHT - 1);
}
printString("exiting", color, BLACK, 0, 4);
printString("exiting\n");
}

View File

@ -37,3 +37,11 @@ typedef __s64 int64_t;
typedef enum { FALSE=0, TRUE } bool_t;
#define NULL ((void*)0)
#if __x86_64__
typedef unsigned long size_t;
typedef long ssize_t;
#else
typedef unsigned int size_t;
typedef int ssize_t;
#endif

68
vga.c
View File

@ -1,4 +1,21 @@
#include "vga.h"
#include "io.h"
#include "klibc.h"
#include "tools.h"
static uint vgaBgColor;
static uint vgaColor;
static uint line, col;
int initVGA(uint bgColor, uint color)
{
vgaBgColor = bgColor;
vgaColor = color;
clearScreen(bgColor);
line = 0;
col = 0;
return 0;
}
void clearScreen(uint bgColor)
{
@ -17,7 +34,7 @@ void printInt(int integer, uint color, uint bgColor, int startX, int startY)
int x = startX;
int i = 0, k = 0;
if (integer < 0) {
printChar('-', color, bgColor, x++, startY);
printCharDetails('-', color, bgColor, x++, startY);
}
while (integer != 0) {
int digit = integer % 10;
@ -25,24 +42,63 @@ void printInt(int integer, uint color, uint bgColor, int startX, int startY)
integer = integer / 10;
}
for (k = i - 1; k >= 0; k--) {
printChar(num[k] + '0', color, bgColor, x++, startY);
printCharDetails(num[k] + '0', color, bgColor, x++, startY);
}
}
void printChar(const char str, uint color, uint bgColor, int startX, int startY)
void printCharDetails(const char str, uint color, uint bgColor, int startX, int startY)
{
volatile short *vga = (short *)VGA_ADDR;
long int colorAttr = (bgColor << 4 | (color & 0x0f)) << 8;
vga[80 * startY + startX] = colorAttr | str;
vga[VGA_WIDTH * startY + startX] = colorAttr | str;
}
void printString(const char *str, uint color, uint bgColor, int startX, int startY)
void vgaScrollUp(void)
{
long int colorAttr = vgaBgColor << 12;
volatile short *vga = (short *)VGA_ADDR;
for (int i = 1; i < VGA_HEIGHT - 2; i++) { // last line is status line. Do not scroll it
memcpy((void *)&vga[VGA_WIDTH * (i - 1)], (void *)&vga[VGA_WIDTH * i],
VGA_WIDTH * sizeof(short));
}
for(int i = 0; i < VGA_WIDTH; i++){
vga[(VGA_HEIGHT - 1) * VGA_WIDTH + i] = colorAttr;
}
}
void printString(const char *str) {
while (*str) {
printChar(*(str++));
}
}
void printChar(const char str)
{
if (str == '\n') {
line++;
col = 0;
}
if (col == VGA_WIDTH) {
col = 0;
line++;
}
if (line >= VGA_HEIGHT) {
vgaScrollUp();
line--;
}
if(str == '\n')
return;
printCharDetails(str, vgaColor, vgaBgColor, col++, line);
}
void printStringDetails(const char *str, uint color, uint bgColor, int startX, int startY)
{
volatile short *vga = (short *)VGA_ADDR;
int i = 0;
long int colorAttr = (bgColor << 4 | (color & 0x0f)) << 8;
while (*str) {
vga[80 * startY + startX + i] = colorAttr | *str;
vga[VGA_WIDTH * startY + startX + i] = colorAttr | *str;
str++;
i++;
}

8
vga.h
View File

@ -16,7 +16,11 @@
#define VGA_WIDTH 80
#define VGA_HEIGHT 25
int initVGA(uint bgColor, uint color);
void clearScreen(uint bgColor);
void printInt(int integer, uint color, uint bgColor, int startX, int startY);
void printChar(char str, uint color, uint bgColor, int startX, int startY);
void printString(const char *str, uint color, uint bgColor, int startX, int startY);
void printCharDetails(char str, uint color, uint bgColor, int startX, int startY);
void printStringDetails(const char *str, uint color, uint bgColor, int startX, int startY);
void printString(const char *str);
void printChar(const char str);
void vgaScrollUp(void);