/**************************************************************************************
Copyright (c) 2002
The UbixOS Project
$Id$
**************************************************************************************/
#include <ubixos/io.h>
#include <drivers/video.h>
unsigned char *videoBuffer = (char *)0xB8000;
int printColor = defaultColor;
void kprint(char *string) {
unsigned int bufferOffset = 0,character = 0,i = 0;
/* We Need To Get The Y Position */
outportByte(0x3d4, 0x0e);
bufferOffset = inportByte(0x3d5);
bufferOffset <<= 8; /* Shift Address Left 8 Bits */
/* Then We Need To Add The X Position */
outportByte(0x3d4, 0x0f);
bufferOffset += inportByte(0x3d5);
bufferOffset <<= 1; /* Shift Address Left 1 Bits */
while ((character=*string++)) {
switch(character) {
case '\n':
bufferOffset = (bufferOffset/160)*160 + 160;
break;
default:
videoBuffer[bufferOffset++] = character;
videoBuffer[bufferOffset++] = printColor;
break;
}
/* Check To See If We Are Out Of Bounds */
if (bufferOffset >= 160*25) {
for (i = 0; i < 160*24; i++) {
videoBuffer[i] = videoBuffer[i+160];
}
for (i = 0; i < 80; i++) {
videoBuffer[(160*24)+(i*2)] = 0x20;
videoBuffer[(160*24)+(i*2)+1] = printColor;
}
bufferOffset -= 160;
}
}
bufferOffset >>= 1; /* Set the new cursor position */
outportByte(0x3d4, 0x0f);
outportByte(0x3d5, bufferOffset & 0x0ff);
outportWord(0x3d4, 0x0e);
outportByte(0x3d5, bufferOffset >> 8);
}
/* Clears The Screen */
void clearScreen() {
unsigned int i;
for (i = 0; i < (80*25); i++) { /* Fill the screen with */
/* background Color */
videoBuffer[i*2] = 0x20;
videoBuffer[i*2+1] = defaultColor;
}
outportByte(0x3d4, 0x0f); /* Set the cursor to the */
outportByte(0x3d5, 0); /* upper-left corner of the */
outportWord(0x3d4, 0x0e); /* screen */
outportByte(0x3d5, 0);
}