COBE 0.1 ALPHA

D:/COBE-Packet/cobe/system/stdio.c

gehe zur Dokumentation dieser Datei
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 
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Makrodefinitionen