COBE 0.1 ALPHA
|
00001 #include <stdio.h> 00002 #include <stdarg.h> 00003 #include <sysfunc.h> 00004 #include <keyboard.h> 00005 #include <stdarg.h> 00006 #include <cmos.h> 00007 #include <io.h> 00008 #include <pic.h> 00009 00010 char *VideoMem = (char*)0xB8000; 00011 char color = 0x07; 00012 short position_x = 0; 00013 short position_y = 0; 00014 int qChar = 0; 00015 extern char* curr_dir; 00016 00018 00019 int kputchar(char c) { 00020 //----------Der Cursor wird außerhalb des Sichtbereiches gesetzt---------- 00021 00022 abs_pos = position_y * 80 + position_x; 00023 if(c == '\n') { newline(); return 0; } //----------Newline Escape-Sequenz---------- 00024 if(c == '\t') { for(int i = 0; i < 4; i++) kputchar(' '); return 0; } //----------Tabulator Escape-Sequenz---------- 00025 00026 //----------Schreibe Zeichen in das erste Byte, das Aussehen in das Attribut-Byte---------- 00027 VideoMem[2*(abs_pos)] = c; 00028 VideoMem[2*(abs_pos)+1] = color; 00029 00030 position_x++; 00031 00032 //----------Bei Überschreitung der X-Achse, gehe in neue Zeile, bei Überschreitung der Y-Achse fang wieder oben an---------- 00033 if(position_x >= 80) newline(); 00034 if(position_y >= 25) 00035 { 00036 clrscr(); 00037 setcolor(0xF2); 00038 kprintf("\tCOBE - Computer Betriebsystem 0.1 ALPHA - Shell 0.1\t\t"); time(); kprintf("\n"); 00039 setcolor(0x0F); 00040 position_y = 2; 00041 position_x = 1; 00042 } 00043 return 0; 00044 } 00045 00047 00048 int kputx(unsigned int x, int basis) { //Credits to pgahlen 00049 //----------Der Cursor wird außerhalb des Sichtbereiches gesetzt---------- 00050 00051 00052 char buf[65]; 00053 const char* digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 00054 char* p; 00055 00056 if (basis > 36) return 0; 00057 00058 p = buf + 64; 00059 *p = '\0'; 00060 if(x == 0) *--p = 0; 00061 do { 00062 *--p = digits[x % basis]; 00063 x /= basis; 00064 } while (x); 00065 00066 kprintf(p); 00067 return 0; 00068 } 00069 00071 00072 int kputstring(char* string) { 00073 while(*string) kputchar(*string++); //----------Gibt den String im Parameter aus---------- 00074 return 0; 00075 } 00076 00078 00079 int kprintf(char* text, ...) { 00080 00081 va_list arg_list; //----------Erzeugt eine Argument-Liste---------- 00082 va_start(arg_list, text); //----------Der erste Argument-Eintrag ist das bekannte Argument---------- 00083 while(*text) 00084 { 00085 if(*text == '%') //----------Wenn es sich im einen Platzhalter handelt---------- 00086 { 00087 text++; 00088 switch(*text) 00089 { 00090 //----------String-Ausgabe---------- 00091 case 's': 00092 kputstring(va_arg(arg_list, char*)); 00093 break; 00094 00095 //----------Char-Ausgabe---------- 00096 case 'c': 00097 kputchar(va_arg(arg_list, int)); 00098 break; 00099 00100 //----------Hex-Zahl Ausgabe---------- 00101 case 'x': 00102 case 'p': 00103 kputx(va_arg(arg_list, unsigned long int), 16); 00104 break; 00105 00106 //----------Dezimal-Zahl Ausgabe---------- 00107 case 'd': 00108 case 'u': 00109 kputx(va_arg(arg_list, unsigned long int), 10); 00110 break; 00111 00112 //----------Prozentzeichen-Ausgabe---------- 00113 case '%': 00114 kputchar('%'); 00115 break; 00116 00117 //----------Ende des Strings---------- 00118 case '\0': 00119 va_end(arg_list); 00120 return 0; 00121 break; 00122 00123 //----------Unbekannter Platzhalter oder kein Platzhalter---------- 00124 default: 00125 kputchar('%'); 00126 kputchar(*text); 00127 break; 00128 00129 } 00130 } 00131 else kputchar(*text); //----------Gibt den String aus---------- 00132 text++; 00133 } 00134 va_end(arg_list); //----------Ende der Argument-Liste---------- 00135 return 0; 00136 } 00137 00139 00140 int kstrlen(char *Text) { 00141 int len = 0; 00142 while(Text[len] != 0) //----------Solange die binäre Null nicht erreicht ist, erhöhe den Counter---------- 00143 { 00144 len++; 00145 } 00146 return len; 00147 } 00148 00150 00151 void newline() { 00152 position_y++; 00153 position_x = 0; 00154 return; 00155 } 00156 00158 char* kgets(char* buf) { 00159 pic_mask_irqs(0x0); //----------Schaltet die Tastatur frei---------- 00160 caps = 0; 00161 string_i = 0; 00162 endgets = 0; 00163 string[0] = '\0'; 00164 00165 move_cursor(position_y,position_x); 00166 move_cursor(5,5); 00167 while(1) { 00168 if(endgets == 1) 00169 { 00170 position_x = 0; 00171 position_y++; 00172 move_cursor(-1,-1); 00173 pic_mask_irqs(0x2); //----------Sperrt die Tastatur---------- 00174 string[string_i] = '\0'; 00175 kstrcpy(string, buf); //----------Die Eingabe wird in den angegebenen Buffer kopiert---------- 00176 return string; 00177 } 00178 } 00179 return 0; 00180 } 00181 00183 00184 void *kmemset(void *ptr, int val, size_t num) { 00185 size_t i; 00186 uint8_t *byte_ptr = (uint8_t*) ptr; 00187 for(i = 0; i < num; i++) //----------Der Anzahl num nach, wird die Konstante val in den angegebenen Speicher geschrieben---------- 00188 { 00189 byte_ptr[i] = val; 00190 } 00191 return ptr; 00192 } 00193 00195 00196 void *kmemcpy(void* dest_ptr, const void* val_ptr, size_t num) { 00197 uint8_t* dest = dest_ptr; 00198 const uint8_t* val = val_ptr; 00199 while(num--) *dest++ = *val++; //----------Solange num nicht 0 ist, kopiere den Inhalt von val in dest und erhöhe beide Pointer---------- 00200 return dest_ptr; 00201 } 00202 00204 00205 int kstrcmp(char *a, char *b) { 00206 while(*a && *b) //----------Solange einer der beiden Strings nicht 0 ist, prüfe ob beide Werte gleich sind, wenn nicht, gib 1 zurück. Wenn doch erhöhe die Pointer---------- 00207 { 00208 if(*a != *b) return 1; 00209 a++; b++; 00210 } 00211 return 0; 00212 } 00213 00215 00216 void setcolor(char settedcolor) { color = settedcolor; return;} 00217 00219 00220 char getkey_oncursor(int x, int y) { 00221 int temp1 = position_x; 00222 int temp2 = position_y; 00223 00224 position_x = x; 00225 position_y = y; 00226 abs_pos = position_y * 80 + position_x; 00227 00228 char zeichen = VideoMem[2*(abs_pos)]; 00229 position_x = temp1; 00230 position_y = temp2; 00231 return zeichen; 00232 } 00233 00235 00236 int kstr2int(char* zahl) { 00237 int wert = 0; 00238 while(*zahl) wert = (wert*10) + (int)(*zahl - '0'); 00239 return wert; 00240 } 00241 00243 00244 void kstrcpy(char* source, char* dest) { 00245 while(*source) { //----------Solange die source nicht 0 ist, kopiere source in dest, danach erhöhe beide Pointer---------- 00246 *dest = *source; 00247 source++; dest++; 00248 } 00249 *dest = '\0'; 00250 return; 00251 } 00252 00254 00255 void activate_16background() { 00256 inb(0x3DA); uint8_t temp = inb(0x3C0); outb(0x3C0,0x10); uint8_t ModeSelectReg = inb(0x3C1); ModeSelectReg &= ~(1 << 3); outb(0x3C0,ModeSelectReg); outb(0x3C0,temp); inb(0x3D4); 00257 } 00258 00260 00261 void deactivate_16background() { 00262 inb(0x3DA); uint8_t temp = inb(0x3C0); outb(0x3C0,0x10); uint8_t ModeSelectReg = inb(0x3C1); ModeSelectReg |= (1 << 3); outb(0x3C0,ModeSelectReg); outb(0x3C0,temp); inb(0x3D4); 00263 } 00264 00266 00267 void move_cursor(int y, int x) { 00268 uint16_t position = (y* 80) + x; 00269 outb(0x3D4, 15); 00270 outb(0x3D5, (uint8_t)position); 00271 outb(0x3D4, 14); 00272 outb(0x3D5, (uint8_t)position >> 8); 00273 } 00274 00276 00277 void delete_rep_character(char* string, char chara, bool back) { 00278 if(back == true) for(uint32_t i = kstrlen(string); i > 0; i--) if(string[i] == chara) string[i] = '\0'; else return; 00279 else for(uint32_t i = 0; i < kstrlen(string); i++) if(string[i] == chara) string[i] = string[i+1]; else return; 00280 } 00281 00283 00284 void low_to_up(char* string) { 00285 for(uint32_t i = 0; i < kstrlen(string); i++) { 00286 if(string[i] < 0x7B && string[i] > 0x60) string[i] = (string[i] - 0x20); 00287 } 00288 } 00289 00291 00292 void up_to_low(char* string) { 00293 for(uint32_t i = 0; i < kstrlen(string); i++) { 00294 if(string[i] < 0x5B && string[i] > 0x40) string[i] = (string[i] + 0x20); 00295 } 00296 } 00297