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;
}