selfmade-os

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