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