Mercurial > selfmade-os
view 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 source
#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; }