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