00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 #include <sys/io.h>
00031 #include <sys/video.h>
00032 #include <ubixos/types.h>
00033 #include <ubixos/spinlock.h>
00034 #include <ubixos/tty.h>
00035 
00036 static unsigned char  *videoBuffer = (char *)0xB8000;
00037 int                    printColor = defaultColor;
00038 
00039 
00040 void backSpace() {
00041   uInt32 bufferOffset = 0x0;
00042   outportByte(0x3d4, 0x0e);
00043   bufferOffset = inportByte(0x3d5);
00044   bufferOffset <<= 0x8; 
00045   outportByte(0x3d4, 0x0f);
00046   bufferOffset += inportByte(0x3d5);
00047   bufferOffset <<= 0x1; 
00048   videoBuffer[bufferOffset--] = 0x20;
00049   videoBuffer[bufferOffset--] = printColor;
00050   videoBuffer[bufferOffset]   = 0x20;
00051   bufferOffset >>= 0x1;
00052   tty_foreground->tty_x = (bufferOffset &  0xFF);
00053   tty_foreground->tty_y = (bufferOffset >> 0x8);
00054   outportByte(0x3D4, 0x0f);
00055   outportByte(0x3D5, tty_foreground->tty_x);
00056   outportByte(0x3D4, 0x0e);
00057   outportByte(0x3D5, tty_foreground->tty_y);
00058   return;
00059   }
00060 
00061 void 
00062 kprint(char *string)
00063 {
00064 
00065   unsigned int    bufferOffset = 0x0, character = 0x0, i = 0x0;
00066 
00067   
00068   if (NULL != tty_foreground)
00069   {
00070       tty_print(string,tty_find(0));
00071       return;
00072   }
00073 
00074   
00075   outportByte(0x3D4, 0x0e);
00076   bufferOffset = inportByte(0x3D5);
00077   bufferOffset <<= 8;           
00078   
00079   outportByte(0x3D4, 0x0f);
00080   bufferOffset += inportByte(0x3D5);
00081   bufferOffset <<= 1;           
00082 
00083   while ((character = *string++)) {
00084     switch (character) {
00085     case '\n':
00086       bufferOffset = (bufferOffset / 160) * 160 + 160;
00087       break;
00088     default:
00089       videoBuffer[bufferOffset++] = character;
00090       videoBuffer[bufferOffset++] = printColor;
00091       break;
00092     }                           
00093     
00094     if (bufferOffset >= 160 * 25) {
00095       for (i = 0; i < 160 * 24; i++) {
00096         videoBuffer[i] = videoBuffer[i + 160];
00097       }                         
00098       for (i = 0; i < 80; i++) {
00099         videoBuffer[(160 * 24) + (i * 2)] = 0x20;
00100         videoBuffer[(160 * 24) + (i * 2) + 1] = printColor;
00101       }                         
00102       bufferOffset -= 160;
00103     }                           
00104   }                             
00105   bufferOffset >>= 1;           
00106   outportByte(0x3D4, 0x0f);
00107   outportByte(0x3D5, ((bufferOffset & 0x0ff) & 0xFF));
00108   outportByte(0x3D4, 0x0e);
00109   outportByte(0x3D5, ((bufferOffset >> 8) & 0xFF));
00110 
00111   return;
00112 }
00113 
00114 
00115 void clearScreen() {
00116   short i = 0x0;
00117 
00118   for (i = 0x0; i < (80 * 25); i++) {
00119     videoBuffer[i * 2] = 0x20;
00120     videoBuffer[i * 2 + 1] = defaultColor;
00121     }
00122   outportByte(0x3D4, 0x0f);
00123   outportByte(0x3D5, 0);
00124   outportByte(0x3D4, 0x0e);
00125   outportByte(0x3D5, 0);
00126   }
00127 
00128 
00129 
00130