Add scrolling function for int

This commit is contained in:
Mathieu Maret 2018-07-18 15:35:49 +02:00
parent 0e37c3d426
commit ee414bc4aa
5 changed files with 42 additions and 22 deletions

View File

@ -2,11 +2,11 @@
#include "vga.h" #include "vga.h"
// Need GCC > 6 // Need GCC > 6
__attribute__ ((interrupt)) __attribute__((interrupt)) void print_handler(struct interrupt_frame *frame, ulong error_code)
void print_handler(struct interrupt_frame *frame, ulong error_code){ {
printStringDetails("EXCEPTION", RED, BLACK, 0, 20); printStringDetails("EXCEPTION", RED, BLACK, 0, VGA_HEIGHT - 1);
printInt(error_code, RED, BLACK, 11, 20); printIntDetails(error_code, RED, BLACK, 11, VGA_HEIGHT - 1);
(void) frame; (void)frame;
(void) error_code; (void)error_code;
} }

View File

@ -1,8 +1,8 @@
#include "interrupt.h" #include "interrupt.h"
#include "vga.h"
#include "io.h" #include "io.h"
#include "pic.h"
#include "irq.h" #include "irq.h"
#include "pic.h"
#include "vga.h"
// Need GCC > 6 // Need GCC > 6
__attribute__((interrupt)) void keyboard_handler(struct interrupt_frame *frame) __attribute__((interrupt)) void keyboard_handler(struct interrupt_frame *frame)
@ -11,9 +11,8 @@ __attribute__((interrupt)) void keyboard_handler(struct interrupt_frame *frame)
char c = 0; char c = 0;
if (inb(0x60) != c) { if (inb(0x60) != c) {
c = inb(0x60); c = inb(0x60);
if (c > 0){ if (c > 0) {
printChar(c); printInt(c);
printChar('\n');
} }
} }
(void)frame; (void)frame;
@ -23,6 +22,6 @@ __attribute__((interrupt)) void timer_handler(struct interrupt_frame *frame)
{ {
static int timeCnt = 0; static int timeCnt = 0;
EOIIrq(IRQ_TIMER); EOIIrq(IRQ_TIMER);
printInt(timeCnt++, RED, BLACK, 20, VGA_HEIGHT -1 ); printIntDetails(timeCnt++, RED, BLACK, 20, VGA_HEIGHT - 1);
(void)frame; (void)frame;
} }

2
main.c
View File

@ -31,7 +31,7 @@ void kmain()
asm volatile("sti\n"); asm volatile("sti\n");
int count = 0; int count = 0;
while (1) { while (1) {
printInt(count++, GREEN, BLACK, 0, VGA_HEIGHT - 1); printIntDetails(count++, GREEN, BLACK, 0, VGA_HEIGHT - 1);
} }
printString("exiting\n"); printString("exiting\n");
} }

32
vga.c
View File

@ -26,7 +26,26 @@ void clearScreen(uint bgColor)
} }
} }
void printInt(int integer, uint color, uint bgColor, int startX, int startY) void printInt(int integer)
{
char num[sizeof(int) *
3]; // int max is 2^(sizeof(int)*8) which is (2^3)^(sizeof(int)*8/3) =
// 8^(sizeof(int)*8/3) ~ 10^(sizeof(int)*8/3)
int i = 0, k = 0;
if (integer < 0) {
printChar('-');
}
while (integer != 0) {
int digit = integer % 10;
num[i++] = (digit > 0) ? digit : -digit;
integer = integer / 10;
}
for (k = i - 1; k >= 0; k--) {
printChar(num[k] + '0');
}
}
void printIntDetails(int integer, uint color, uint bgColor, int startX, int startY)
{ {
char num[sizeof(int) * char num[sizeof(int) *
3]; // int max is 2^(sizeof(int)*8) which is (2^3)^(sizeof(int)*8/3) = 3]; // int max is 2^(sizeof(int)*8) which is (2^3)^(sizeof(int)*8/3) =
@ -57,20 +76,21 @@ void vgaScrollUp(void)
{ {
long int colorAttr = vgaBgColor << 12; long int colorAttr = vgaBgColor << 12;
volatile short *vga = (short *)VGA_ADDR; volatile short *vga = (short *)VGA_ADDR;
for (int i = 1; i < VGA_HEIGHT - 2; i++) { // last line is status line. Do not scroll it 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], memcpy((void *)&vga[VGA_WIDTH * (i - 1)], (void *)&vga[VGA_WIDTH * i],
VGA_WIDTH * sizeof(short)); VGA_WIDTH * sizeof(short));
} }
for(int i = 0; i < VGA_WIDTH; i++){ for (int i = 0; i < VGA_WIDTH; i++) {
vga[(VGA_HEIGHT - 1) * VGA_WIDTH + i] = colorAttr; vga[(VGA_HEIGHT - 1) * VGA_WIDTH + i] = colorAttr;
} }
} }
void printString(const char *str) { void printString(const char *str)
{
while (*str) { while (*str) {
printChar(*(str++)); printChar(*(str++));
} }
} }
void printChar(const char str) void printChar(const char str)
@ -87,7 +107,7 @@ void printChar(const char str)
vgaScrollUp(); vgaScrollUp();
line--; line--;
} }
if(str == '\n') if (str == '\n')
return; return;
printCharDetails(str, vgaColor, vgaBgColor, col++, line); printCharDetails(str, vgaColor, vgaBgColor, col++, line);
} }

3
vga.h
View File

@ -18,7 +18,8 @@
int initVGA(uint bgColor, uint color); int initVGA(uint bgColor, uint color);
void clearScreen(uint bgColor); void clearScreen(uint bgColor);
void printInt(int integer, uint color, uint bgColor, int startX, int startY); void printInt(int integer);
void printIntDetails(int integer, uint color, uint bgColor, int startX, int startY);
void printCharDetails(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 printStringDetails(const char *str, uint color, uint bgColor, int startX, int startY);
void printString(const char *str); void printString(const char *str);