selfmade-os
annotate io.c @ 1:42ba76f77035
the kernel with output and mem alloc
author | meillo@marmaro.de |
---|---|
date | Sun, 01 Nov 2009 23:50:51 +0100 |
parents | |
children |
rev | line source |
---|---|
meillo@1 | 1 #include <stdarg.h> |
meillo@1 | 2 #include "io.h" |
meillo@1 | 3 |
meillo@1 | 4 void prints(const char* str); |
meillo@1 | 5 |
meillo@1 | 6 static unsigned short* vidmem = (unsigned short*) 0xb8000; |
meillo@1 | 7 static unsigned short color = 0x0700; |
meillo@1 | 8 static int pos = 0; |
meillo@1 | 9 |
meillo@1 | 10 void |
meillo@1 | 11 cls(void) |
meillo@1 | 12 { |
meillo@1 | 13 unsigned short* v; |
meillo@1 | 14 |
meillo@1 | 15 for (v = vidmem; v < vidmem+(80*25); v++) { |
meillo@1 | 16 *v = 0; |
meillo@1 | 17 } |
meillo@1 | 18 pos = 0; |
meillo@1 | 19 } |
meillo@1 | 20 |
meillo@1 | 21 |
meillo@1 | 22 void |
meillo@1 | 23 setcolor(int fg, int bg) |
meillo@1 | 24 { |
meillo@1 | 25 color = (char) ((fg<<2) & (bg<<3)); |
meillo@1 | 26 } |
meillo@1 | 27 |
meillo@1 | 28 void |
meillo@1 | 29 setpos(int line, int col) |
meillo@1 | 30 { |
meillo@1 | 31 pos = line * 80 + col; |
meillo@1 | 32 } |
meillo@1 | 33 |
meillo@1 | 34 void |
meillo@1 | 35 relpos(int move) |
meillo@1 | 36 { |
meillo@1 | 37 pos += move; |
meillo@1 | 38 } |
meillo@1 | 39 |
meillo@1 | 40 |
meillo@1 | 41 void |
meillo@1 | 42 printp(unsigned int n) |
meillo@1 | 43 { |
meillo@1 | 44 int i, h; |
meillo@1 | 45 char str[11]; |
meillo@1 | 46 //int n = (int) p; |
meillo@1 | 47 |
meillo@1 | 48 str[0] = '0'; |
meillo@1 | 49 str[1] = 'x'; |
meillo@1 | 50 str[10] = '\0'; |
meillo@1 | 51 for (i=9; i>1; i--) { |
meillo@1 | 52 h = n % 16; |
meillo@1 | 53 str[i] = ('0' + h); |
meillo@1 | 54 if (h > 9) { |
meillo@1 | 55 str[i] += 'a' - '9' - 1; |
meillo@1 | 56 } |
meillo@1 | 57 n /= 16; |
meillo@1 | 58 } |
meillo@1 | 59 prints(str); |
meillo@1 | 60 } |
meillo@1 | 61 |
meillo@1 | 62 |
meillo@1 | 63 |
meillo@1 | 64 |
meillo@1 | 65 void |
meillo@1 | 66 printc(char c) |
meillo@1 | 67 { |
meillo@1 | 68 putchar(c); |
meillo@1 | 69 } |
meillo@1 | 70 |
meillo@1 | 71 void |
meillo@1 | 72 prints(const char* str) |
meillo@1 | 73 { |
meillo@1 | 74 const char* c; |
meillo@1 | 75 |
meillo@1 | 76 for (c = str; *c; c++) { |
meillo@1 | 77 printc(*c); |
meillo@1 | 78 } |
meillo@1 | 79 } |
meillo@1 | 80 |
meillo@1 | 81 void |
meillo@1 | 82 printd(int n) |
meillo@1 | 83 { |
meillo@1 | 84 int i; |
meillo@1 | 85 char str[32]; |
meillo@1 | 86 |
meillo@1 | 87 str[31] = '\0'; |
meillo@1 | 88 for (i=30; i>0; i--) { |
meillo@1 | 89 str[i] = ('0' + n%10); |
meillo@1 | 90 if (n == 0) { |
meillo@1 | 91 i++; |
meillo@1 | 92 break; |
meillo@1 | 93 } |
meillo@1 | 94 n /= 10; |
meillo@1 | 95 } |
meillo@1 | 96 prints(&str[i]); |
meillo@1 | 97 } |
meillo@1 | 98 |
meillo@1 | 99 |
meillo@1 | 100 int |
meillo@1 | 101 putchar(int c) |
meillo@1 | 102 { |
meillo@1 | 103 if (c == '\n') { |
meillo@1 | 104 pos = ((pos/80)+1) * 80; |
meillo@1 | 105 } else { |
meillo@1 | 106 vidmem[pos++] = (unsigned short)c | color; |
meillo@1 | 107 } |
meillo@1 | 108 return (unsigned char)c; |
meillo@1 | 109 } |
meillo@1 | 110 |
meillo@1 | 111 int |
meillo@1 | 112 puts(const char* s) |
meillo@1 | 113 { |
meillo@1 | 114 prints(s); |
meillo@1 | 115 putchar('\n'); |
meillo@1 | 116 return 1; |
meillo@1 | 117 } |
meillo@1 | 118 |
meillo@1 | 119 int |
meillo@1 | 120 printf(const char* fmt, ...) |
meillo@1 | 121 { |
meillo@1 | 122 va_list ap; |
meillo@1 | 123 int i; |
meillo@1 | 124 |
meillo@1 | 125 va_start(ap, fmt); |
meillo@1 | 126 for (i=0; fmt[i]; i++) { |
meillo@1 | 127 if (fmt[i] != '%') { |
meillo@1 | 128 printc(fmt[i]); |
meillo@1 | 129 continue; |
meillo@1 | 130 } |
meillo@1 | 131 switch (fmt[++i]) { |
meillo@1 | 132 case '%': |
meillo@1 | 133 printc('%'); |
meillo@1 | 134 break; |
meillo@1 | 135 case 'c': |
meillo@1 | 136 printc((char)va_arg(ap, int)); |
meillo@1 | 137 break; |
meillo@1 | 138 case 's': |
meillo@1 | 139 prints(va_arg(ap, char*)); |
meillo@1 | 140 break; |
meillo@1 | 141 case 'd': |
meillo@1 | 142 printd(va_arg(ap, int)); |
meillo@1 | 143 break; |
meillo@1 | 144 case 'p': |
meillo@1 | 145 printp(va_arg(ap, unsigned int)); |
meillo@1 | 146 break; |
meillo@1 | 147 } |
meillo@1 | 148 } |
meillo@1 | 149 va_end(ap); |
meillo@1 | 150 return 0; |
meillo@1 | 151 } |