Mercurial > selfmade-os
comparison 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 |
comparison
equal
deleted
inserted
replaced
0:99db6262c157 | 1:42ba76f77035 |
---|---|
1 #include <stdarg.h> | |
2 #include "io.h" | |
3 | |
4 void prints(const char* str); | |
5 | |
6 static unsigned short* vidmem = (unsigned short*) 0xb8000; | |
7 static unsigned short color = 0x0700; | |
8 static int pos = 0; | |
9 | |
10 void | |
11 cls(void) | |
12 { | |
13 unsigned short* v; | |
14 | |
15 for (v = vidmem; v < vidmem+(80*25); v++) { | |
16 *v = 0; | |
17 } | |
18 pos = 0; | |
19 } | |
20 | |
21 | |
22 void | |
23 setcolor(int fg, int bg) | |
24 { | |
25 color = (char) ((fg<<2) & (bg<<3)); | |
26 } | |
27 | |
28 void | |
29 setpos(int line, int col) | |
30 { | |
31 pos = line * 80 + col; | |
32 } | |
33 | |
34 void | |
35 relpos(int move) | |
36 { | |
37 pos += move; | |
38 } | |
39 | |
40 | |
41 void | |
42 printp(unsigned int n) | |
43 { | |
44 int i, h; | |
45 char str[11]; | |
46 //int n = (int) p; | |
47 | |
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 } | |
61 | |
62 | |
63 | |
64 | |
65 void | |
66 printc(char c) | |
67 { | |
68 putchar(c); | |
69 } | |
70 | |
71 void | |
72 prints(const char* str) | |
73 { | |
74 const char* c; | |
75 | |
76 for (c = str; *c; c++) { | |
77 printc(*c); | |
78 } | |
79 } | |
80 | |
81 void | |
82 printd(int n) | |
83 { | |
84 int i; | |
85 char str[32]; | |
86 | |
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 } | |
98 | |
99 | |
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 } | |
110 | |
111 int | |
112 puts(const char* s) | |
113 { | |
114 prints(s); | |
115 putchar('\n'); | |
116 return 1; | |
117 } | |
118 | |
119 int | |
120 printf(const char* fmt, ...) | |
121 { | |
122 va_list ap; | |
123 int i; | |
124 | |
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 } |