/************************************************************************************** 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] = 0x07; } 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); }