selfmade-os

annotate 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
rev   line source
meillo@1 1 #include <stdarg.h>
meillo@1 2 #include "io.h"
meillo@1 3
meillo@1 4 void prints(const char* str);
meillo@1 5
meillo@1 6 static unsigned short* vidmem = (unsigned short*) 0xb8000;
meillo@1 7 static unsigned short color = 0x0700;
meillo@1 8 static int pos = 0;
meillo@1 9
meillo@1 10 void
meillo@1 11 cls(void)
meillo@1 12 {
meillo@1 13 unsigned short* v;
meillo@1 14
meillo@1 15 for (v = vidmem; v < vidmem+(80*25); v++) {
meillo@1 16 *v = 0;
meillo@1 17 }
meillo@1 18 pos = 0;
meillo@1 19 }
meillo@1 20
meillo@1 21
meillo@1 22 void
meillo@1 23 setcolor(int fg, int bg)
meillo@1 24 {
meillo@1 25 color = (char) ((fg<<2) & (bg<<3));
meillo@1 26 }
meillo@1 27
meillo@1 28 void
meillo@1 29 setpos(int line, int col)
meillo@1 30 {
meillo@1 31 pos = line * 80 + col;
meillo@1 32 }
meillo@1 33
meillo@1 34 void
meillo@1 35 relpos(int move)
meillo@1 36 {
meillo@1 37 pos += move;
meillo@1 38 }
meillo@1 39
meillo@1 40
meillo@1 41 void
meillo@1 42 printp(unsigned int n)
meillo@1 43 {
meillo@1 44 int i, h;
meillo@1 45 char str[11];
meillo@1 46 //int n = (int) p;
meillo@1 47
meillo@1 48 str[0] = '0';
meillo@1 49 str[1] = 'x';
meillo@1 50 str[10] = '\0';
meillo@1 51 for (i=9; i>1; i--) {
meillo@1 52 h = n % 16;
meillo@1 53 str[i] = ('0' + h);
meillo@1 54 if (h > 9) {
meillo@1 55 str[i] += 'a' - '9' - 1;
meillo@1 56 }
meillo@1 57 n /= 16;
meillo@1 58 }
meillo@1 59 prints(str);
meillo@1 60 }
meillo@1 61
meillo@1 62
meillo@1 63
meillo@1 64
meillo@1 65 void
meillo@1 66 printc(char c)
meillo@1 67 {
meillo@1 68 putchar(c);
meillo@1 69 }
meillo@1 70
meillo@1 71 void
meillo@1 72 prints(const char* str)
meillo@1 73 {
meillo@1 74 const char* c;
meillo@1 75
meillo@1 76 for (c = str; *c; c++) {
meillo@1 77 printc(*c);
meillo@1 78 }
meillo@1 79 }
meillo@1 80
meillo@1 81 void
meillo@1 82 printd(int n)
meillo@1 83 {
meillo@1 84 int i;
meillo@1 85 char str[32];
meillo@1 86
meillo@1 87 str[31] = '\0';
meillo@1 88 for (i=30; i>0; i--) {
meillo@1 89 str[i] = ('0' + n%10);
meillo@1 90 if (n == 0) {
meillo@1 91 i++;
meillo@1 92 break;
meillo@1 93 }
meillo@1 94 n /= 10;
meillo@1 95 }
meillo@1 96 prints(&str[i]);
meillo@1 97 }
meillo@1 98
meillo@1 99
meillo@1 100 int
meillo@1 101 putchar(int c)
meillo@1 102 {
meillo@1 103 if (c == '\n') {
meillo@1 104 pos = ((pos/80)+1) * 80;
meillo@1 105 } else {
meillo@1 106 vidmem[pos++] = (unsigned short)c | color;
meillo@1 107 }
meillo@1 108 return (unsigned char)c;
meillo@1 109 }
meillo@1 110
meillo@1 111 int
meillo@1 112 puts(const char* s)
meillo@1 113 {
meillo@1 114 prints(s);
meillo@1 115 putchar('\n');
meillo@1 116 return 1;
meillo@1 117 }
meillo@1 118
meillo@1 119 int
meillo@1 120 printf(const char* fmt, ...)
meillo@1 121 {
meillo@1 122 va_list ap;
meillo@1 123 int i;
meillo@1 124
meillo@1 125 va_start(ap, fmt);
meillo@1 126 for (i=0; fmt[i]; i++) {
meillo@1 127 if (fmt[i] != '%') {
meillo@1 128 printc(fmt[i]);
meillo@1 129 continue;
meillo@1 130 }
meillo@1 131 switch (fmt[++i]) {
meillo@1 132 case '%':
meillo@1 133 printc('%');
meillo@1 134 break;
meillo@1 135 case 'c':
meillo@1 136 printc((char)va_arg(ap, int));
meillo@1 137 break;
meillo@1 138 case 's':
meillo@1 139 prints(va_arg(ap, char*));
meillo@1 140 break;
meillo@1 141 case 'd':
meillo@1 142 printd(va_arg(ap, int));
meillo@1 143 break;
meillo@1 144 case 'p':
meillo@1 145 printp(va_arg(ap, unsigned int));
meillo@1 146 break;
meillo@1 147 }
meillo@1 148 }
meillo@1 149 va_end(ap);
meillo@1 150 return 0;
meillo@1 151 }