selfmade-os
diff 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 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/io.c Sun Nov 01 23:50:51 2009 +0100 1.3 @@ -0,0 +1,151 @@ 1.4 +#include <stdarg.h> 1.5 +#include "io.h" 1.6 + 1.7 +void prints(const char* str); 1.8 + 1.9 +static unsigned short* vidmem = (unsigned short*) 0xb8000; 1.10 +static unsigned short color = 0x0700; 1.11 +static int pos = 0; 1.12 + 1.13 +void 1.14 +cls(void) 1.15 +{ 1.16 + unsigned short* v; 1.17 + 1.18 + for (v = vidmem; v < vidmem+(80*25); v++) { 1.19 + *v = 0; 1.20 + } 1.21 + pos = 0; 1.22 +} 1.23 + 1.24 + 1.25 +void 1.26 +setcolor(int fg, int bg) 1.27 +{ 1.28 + color = (char) ((fg<<2) & (bg<<3)); 1.29 +} 1.30 + 1.31 +void 1.32 +setpos(int line, int col) 1.33 +{ 1.34 + pos = line * 80 + col; 1.35 +} 1.36 + 1.37 +void 1.38 +relpos(int move) 1.39 +{ 1.40 + pos += move; 1.41 +} 1.42 + 1.43 + 1.44 +void 1.45 +printp(unsigned int n) 1.46 +{ 1.47 + int i, h; 1.48 + char str[11]; 1.49 + //int n = (int) p; 1.50 + 1.51 + str[0] = '0'; 1.52 + str[1] = 'x'; 1.53 + str[10] = '\0'; 1.54 + for (i=9; i>1; i--) { 1.55 + h = n % 16; 1.56 + str[i] = ('0' + h); 1.57 + if (h > 9) { 1.58 + str[i] += 'a' - '9' - 1; 1.59 + } 1.60 + n /= 16; 1.61 + } 1.62 + prints(str); 1.63 +} 1.64 + 1.65 + 1.66 + 1.67 + 1.68 +void 1.69 +printc(char c) 1.70 +{ 1.71 + putchar(c); 1.72 +} 1.73 + 1.74 +void 1.75 +prints(const char* str) 1.76 +{ 1.77 + const char* c; 1.78 + 1.79 + for (c = str; *c; c++) { 1.80 + printc(*c); 1.81 + } 1.82 +} 1.83 + 1.84 +void 1.85 +printd(int n) 1.86 +{ 1.87 + int i; 1.88 + char str[32]; 1.89 + 1.90 + str[31] = '\0'; 1.91 + for (i=30; i>0; i--) { 1.92 + str[i] = ('0' + n%10); 1.93 + if (n == 0) { 1.94 + i++; 1.95 + break; 1.96 + } 1.97 + n /= 10; 1.98 + } 1.99 + prints(&str[i]); 1.100 +} 1.101 + 1.102 + 1.103 +int 1.104 +putchar(int c) 1.105 +{ 1.106 + if (c == '\n') { 1.107 + pos = ((pos/80)+1) * 80; 1.108 + } else { 1.109 + vidmem[pos++] = (unsigned short)c | color; 1.110 + } 1.111 + return (unsigned char)c; 1.112 +} 1.113 + 1.114 +int 1.115 +puts(const char* s) 1.116 +{ 1.117 + prints(s); 1.118 + putchar('\n'); 1.119 + return 1; 1.120 +} 1.121 + 1.122 +int 1.123 +printf(const char* fmt, ...) 1.124 +{ 1.125 + va_list ap; 1.126 + int i; 1.127 + 1.128 + va_start(ap, fmt); 1.129 + for (i=0; fmt[i]; i++) { 1.130 + if (fmt[i] != '%') { 1.131 + printc(fmt[i]); 1.132 + continue; 1.133 + } 1.134 + switch (fmt[++i]) { 1.135 + case '%': 1.136 + printc('%'); 1.137 + break; 1.138 + case 'c': 1.139 + printc((char)va_arg(ap, int)); 1.140 + break; 1.141 + case 's': 1.142 + prints(va_arg(ap, char*)); 1.143 + break; 1.144 + case 'd': 1.145 + printd(va_arg(ap, int)); 1.146 + break; 1.147 + case 'p': 1.148 + printp(va_arg(ap, unsigned int)); 1.149 + break; 1.150 + } 1.151 + } 1.152 + va_end(ap); 1.153 + return 0; 1.154 +}