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 <ubixos/tty.h>
00031 #include <ubixos/kpanic.h>
00032 #include <ubixos/spinlock.h>
00033 #include <lib/kprintf.h>
00034 #include <lib/kmalloc.h>
00035 #include <sys/io.h>
00036 #include <string.h>
00037 
00038 static tty_term  *terms          = 0x0;
00039 tty_term         *tty_foreground = 0x0;
00040 static spinLock_t tty_spinLock   = SPIN_LOCK_INITIALIZER;
00041 
00042 int tty_init() {
00043   int i = 0x0;
00044 
00045   
00046   terms = (tty_term *)kmalloc(sizeof(tty_term)*TTY_MAX_TERMS);
00047   if (terms == 0x0)
00048     kpanic("tty_init: Failed to allocate memory. File: %s, Line: %i\n",__FILE__,__LINE__);
00049 
00050   
00051   for (i = 0;i < TTY_MAX_TERMS;i++) {
00052     terms[i].tty_buffer = (char *)kmalloc(80*60*2);
00053     if (terms[i].tty_buffer == 0x0)
00054       kpanic("tty_init: Failed to allocate buffer memory. File: %s, Line: %i\n",__FILE__,__LINE__);
00055 
00056     terms[i].tty_pointer = terms[i].tty_buffer;   
00057     terms[i].tty_x       = 0x0;                   
00058     terms[i].tty_y       = 0x0;                   
00059     terms[i].tty_colour  = 0x0A + i;              
00060     }
00061 
00062   
00063   outportByte(0x3D4, 0x0e);
00064   terms[0].tty_y = inportByte(0x3D5);
00065   outportByte(0x3D4, 0x0f);
00066   terms[0].tty_x = inportByte(0x3D5);
00067 
00068 
00069   
00070   tty_foreground = &terms[0];
00071 
00072   
00073   tty_foreground->tty_pointer = (char *)0xB8000;
00074 
00075   
00076   kprintf("tty0 - Initialized\n");
00077 
00078   return(0x0);
00079   }
00080 
00081 
00082  
00083 
00084 
00085 
00086 
00087 int tty_change(uInt16 tty) {
00088 
00089   if (tty > TTY_MAX_TERMS)
00090     kpanic("Error: Changing to an invalid tty. File: %s, Line: %i\n",__FILE__,__LINE__);
00091 
00092   
00093   memcpy(tty_foreground->tty_buffer,(char *)0xB8000,(80*60*2));
00094 
00095   
00096   memcpy((char *)0xB8000,terms[tty].tty_buffer,(80*60*2));
00097 
00098   
00099 
00100 
00101 
00102   tty_foreground->tty_pointer = tty_foreground->tty_buffer;
00103 
00104   terms[tty].tty_pointer = (char *)0xB8000;
00105 
00106   
00107   tty_foreground = &terms[tty];
00108 
00109   
00110   outportByte(0x3D4, 0x0F);
00111   outportByte(0x3D5, tty_foreground->tty_x);
00112   outportByte(0x3D4, 0x0E);
00113   outportByte(0x3D5, tty_foreground->tty_y);
00114 
00115   return(0x0);
00116   }
00117 
00118 int tty_print(char *string,tty_term *term) {
00119   unsigned int    bufferOffset = 0x0, character = 0x0, i = 0x0;
00120   spinLock(&tty_spinLock);
00121 
00122   
00123   bufferOffset = term->tty_y;
00124   bufferOffset <<= 8;
00125 
00126   
00127   bufferOffset += term->tty_x;
00128   bufferOffset <<= 1;
00129 
00130   while ((character = *string++)) {
00131     switch (character) {
00132     case '\n':
00133       bufferOffset = (bufferOffset / 160) * 160 + 160;
00134       break;
00135     default:
00136       term->tty_pointer[bufferOffset++] = character;
00137       term->tty_pointer[bufferOffset++] = term->tty_colour;
00138       break;
00139     }  
00140 
00141     
00142     if (bufferOffset >= 160 * 25) {
00143       for (i = 0; i < 160 * 24; i++) {
00144         term->tty_pointer[i] = term->tty_pointer[i + 160];
00145         }
00146       for (i = 0; i < 80; i++) {
00147         term->tty_pointer[(160 * 24) + (i * 2)] = 0x20;
00148         term->tty_pointer[(160 * 24) + (i * 2) + 1] = term->tty_colour;
00149         }
00150       bufferOffset -= 160;
00151       }
00152     }
00153 
00154   bufferOffset >>= 1;  
00155   term->tty_x = (bufferOffset &  0xFF);
00156   term->tty_y = (bufferOffset >> 0x8);
00157 
00158   if (term == tty_foreground) {
00159     outportByte(0x3D4, 0x0f);
00160     outportByte(0x3D5, term->tty_x);
00161     outportByte(0x3D4, 0x0e);
00162     outportByte(0x3D5, term->tty_y);
00163     }
00164 
00165   spinUnlock(&tty_spinLock);
00166 
00167   return(0x0);
00168   }
00169 
00170 tty_term *tty_find(uInt16 tty) {
00171   return(&terms[tty]);
00172   }
00173 
00174 
00175 
00176