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