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