Mercurial > selfmade-os
diff io.c @ 1:42ba76f77035 default tip
the kernel with output and mem alloc
author | meillo@marmaro.de |
---|---|
date | Sun, 01 Nov 2009 23:50:51 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/io.c Sun Nov 01 23:50:51 2009 +0100 @@ -0,0 +1,151 @@ +#include <stdarg.h> +#include "io.h" + +void prints(const char* str); + +static unsigned short* vidmem = (unsigned short*) 0xb8000; +static unsigned short color = 0x0700; +static int pos = 0; + +void +cls(void) +{ + unsigned short* v; + + for (v = vidmem; v < vidmem+(80*25); v++) { + *v = 0; + } + pos = 0; +} + + +void +setcolor(int fg, int bg) +{ + color = (char) ((fg<<2) & (bg<<3)); +} + +void +setpos(int line, int col) +{ + pos = line * 80 + col; +} + +void +relpos(int move) +{ + pos += move; +} + + +void +printp(unsigned int n) +{ + int i, h; + char str[11]; + //int n = (int) p; + + str[0] = '0'; + str[1] = 'x'; + str[10] = '\0'; + for (i=9; i>1; i--) { + h = n % 16; + str[i] = ('0' + h); + if (h > 9) { + str[i] += 'a' - '9' - 1; + } + n /= 16; + } + prints(str); +} + + + + +void +printc(char c) +{ + putchar(c); +} + +void +prints(const char* str) +{ + const char* c; + + for (c = str; *c; c++) { + printc(*c); + } +} + +void +printd(int n) +{ + int i; + char str[32]; + + str[31] = '\0'; + for (i=30; i>0; i--) { + str[i] = ('0' + n%10); + if (n == 0) { + i++; + break; + } + n /= 10; + } + prints(&str[i]); +} + + +int +putchar(int c) +{ + if (c == '\n') { + pos = ((pos/80)+1) * 80; + } else { + vidmem[pos++] = (unsigned short)c | color; + } + return (unsigned char)c; +} + +int +puts(const char* s) +{ + prints(s); + putchar('\n'); + return 1; +} + +int +printf(const char* fmt, ...) +{ + va_list ap; + int i; + + va_start(ap, fmt); + for (i=0; fmt[i]; i++) { + if (fmt[i] != '%') { + printc(fmt[i]); + continue; + } + switch (fmt[++i]) { + case '%': + printc('%'); + break; + case 'c': + printc((char)va_arg(ap, int)); + break; + case 's': + prints(va_arg(ap, char*)); + break; + case 'd': + printd(va_arg(ap, int)); + break; + case 'p': + printp(va_arg(ap, unsigned int)); + break; + } + } + va_end(ap); + return 0; +}