Add scrolling function for int
This commit is contained in:
parent
0e37c3d426
commit
ee414bc4aa
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
2
main.c
@ -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");
|
||||||
}
|
}
|
||||||
|
36
vga.c
36
vga.c
@ -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) =
|
||||||
@ -48,8 +67,8 @@ void printInt(int integer, uint color, uint bgColor, int startX, int startY)
|
|||||||
|
|
||||||
void printCharDetails(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;
|
volatile short *vga = (short *)VGA_ADDR;
|
||||||
long int colorAttr = (bgColor << 4 | (color & 0x0f)) << 8;
|
long int colorAttr = (bgColor << 4 | (color & 0x0f)) << 8;
|
||||||
vga[VGA_WIDTH * startY + startX] = colorAttr | str;
|
vga[VGA_WIDTH * startY + startX] = colorAttr | str;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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
3
vga.h
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user