OSDN Git Service

51d6aae47ebafc78a5bd5c0f1664dd26f26a314f
[vaneos/vaneosmain.git] / Kernel / stdio.c~
1 /*
2 *stdio for Charactor Shell
3 *(C) 2014 VOSystems.
4 */
5
6 #include<stdio.h>
7 #include<string.h>
8 #include<KeyBoard.h>
9 #include<scancode.h>
10 #include<stdarg.h>
11 /*
12 COLOR
13
14 BRACK, BLUE, GREEN, CIAN, RED, MASENTA
15 BRAWN, GLAY, D_GLAY, CH_BLUE, CH_GREE
16 CH_CIAN, PINK, CH_MAS, YELLOW, WHITE
17 */
18
19 #define COLUMNS (80)
20 #define LINES (24)
21 #define ATTRIBUTE (7)
22
23 int asm_move_cursol(int ebp);
24
25 unsigned short* screen;
26 char attr;
27 unsigned int X,Y;
28
29 int kbhit(void)
30 {
31         return Generate_Scancode_To_ASCII_Code();
32 }
33 void scanf(const char* fmt,...)
34 {
35         va_list arg;
36         va_start(arg,char*,fmt);
37         char ch=*fmt++;
38         unsigned int count=0;
39         
40         while(ch!='\0'){
41         
42                 if(ch=='%'){
43                         ch=*fmt++;
44                         
45                         if(ch=='d'){
46                                 int buf=0;      char chbuf=0;
47                                 count=0;
48                                 while(1){
49                                         chbuf=getch();
50                                         buf*=10;
51                                         
52                                         if(chbuf=='1'){
53                                                 buf+=1;
54                                                 putchar(chbuf);
55                                                 ++count;
56                                         }else if(chbuf=='2'){
57                                                 buf+=2;
58                                                 putchar(chbuf);
59                                                 ++count;
60                                         }else if(chbuf=='3'){
61                                                 buf+=3;
62                                                 putchar(chbuf);
63                                                 ++count;
64                                         }else if(chbuf=='4'){
65                                                 buf+=4;
66                                                 putchar(chbuf);
67                                                 ++count;
68                                         }else if(chbuf=='5'){
69                                                 buf+=5;
70                                                 putchar(chbuf);
71                                                 ++count;
72                                         }else if(chbuf=='6'){
73                                                 buf+=6;
74                                                 putchar(chbuf);
75                                                 ++count;
76                                         }else if(chbuf=='7'){
77                                                 buf+=7;
78                                                 putchar(chbuf);
79                                                 ++count;
80                                         }else if(chbuf=='8'){
81                                                 buf+=8;
82                                                 putchar(chbuf);
83                                                 ++count;
84                                         }else if(chbuf=='9'){
85                                                 buf+=9;
86                                                 putchar(chbuf);
87                                                 ++count;
88                                         }else if(chbuf=='0'){
89                                                 buf+=0;
90                                                 putchar(chbuf);
91                                                 ++count;
92                                         }else if(chbuf=='\b' && count>=0){
93                                                 buf/=10;
94                                                 putchar(chbuf);
95                                                 --count;
96                                         }else{
97                                                 buf/=10;
98                                                 va_arg(arg,int)=buf;
99                                                 break;
100                                         }
101                                 }
102                         }else if(ch=='s'){
103                                 char *cmd;      cmd=va_arg(arg,char*);
104                                 count=0;
105                                 do{
106                                         *cmd=getch();
107                                         if(*cmd=='\n'){
108                                                 putchar(*cmd);
109                                                 *cmd='\0';
110                                                 break;
111                                                 
112                                         }else if(*cmd==' '){
113                                                 putchar(' ');
114                                                 *cmd='\0';
115                                                 break;
116                                                 
117                                         }else if(*cmd=='\b' && count>0){
118                                                 *cmd-- = '\0';
119                                                 count--;
120                                                 putchar('\b');
121                                                 
122                                         }else{
123                                                 putchar(*cmd);
124                                                 count++;
125                                                 cmd++;
126                                                 
127                                         }
128                                 }while(1);
129                         
130                         }else if(ch=='c'){
131                                 va_arg(arg,char)=getchar();
132                         }
133                 }
134                 ch=*fmt++;
135         }
136 }
137
138 char getchar(void)
139 {
140         char code=0;
141         while(code==0)
142         {
143                 code=Generate_Scancode_To_ASCII_Code();
144         }
145         putchar(code);
146         return code;
147 }
148
149 char getch(void)
150 {
151         char code=0;
152         while(code==0)
153         {
154                 code=Generate_Scancode_To_ASCII_Code();
155         }
156         return code;
157 }
158
159 void ClearScreen(void)
160 {
161         screen=(unsigned short*)0xb8000;
162         X=0;Y=0;
163         while(screen<(unsigned short*)0xc0000)
164         {
165                 *screen++ =NUM_NULL;
166         }
167         screen=(unsigned short*)0xb8000;
168         return;
169 }
170
171 void puts(const char* msg)
172 {
173         
174         char ch;
175         ch=*msg++;
176         
177         while(ch!='\0')
178         {
179                 putchar(ch);
180                 ch=*msg++;
181         }
182         return;
183 }
184
185 void putchar(const char ch)
186 {
187         if(ch=='\n'){
188                 screen+=(80-X);/*80 charactors * 2byte - X charactors * 2 byte*/
189                 Y+=1;
190                 X=0;
191                 
192         }else if(ch=='\t'){
193                 *screen++ = (((attr)<<8) | ' ');
194                 *screen++ = (((attr)<<8) | ' ');
195                 X+=2;
196                 
197         }else if(ch=='\r'){
198                 while(X>0)
199                 {
200                         *screen-- = (unsigned short)NUM_NULL;
201                         --X;
202                 }
203         
204         }else if(ch=='\b'){
205                 screen--;
206                 *screen = (unsigned short)NUM_NULL;
207                 --X;
208                 
209         }else{
210                 *screen++ = (((attr)<<8) | ch);
211                 X+=1;
212         }
213         return;
214 }
215
216 void printTASK(const char* msg)
217 {
218         puts("[....]");
219         attr=WHITE;
220         puts(msg);
221         return;
222 }
223
224 void printOK(const char* msg)
225 {
226         putchar('\r');
227         attr=WHITE;
228         puts("[ ");
229         attr=GREEN;
230         puts("ok");
231         attr=WHITE;
232         puts(" ]");
233
234         attr=WHITE;
235         puts(msg);
236         puts("done.\n");
237         return;
238 }
239
240 void printFAIL(const char* msg)
241 {
242         putchar('\r');
243         attr=WHITE;
244         puts("[");
245         attr=RED;
246         puts("fail");
247         attr=WHITE;
248         puts("]");
249
250         attr=WHITE;
251         puts(msg);
252         puts("done.\n");
253         return;
254 }
255
256 void printWARN(const char* msg)
257 {
258         putchar('\r');
259         attr=WHITE;
260         puts("[");
261         attr=YELLOW;
262         puts("warn");
263         attr=YELLOW;
264         puts("]");
265
266         attr=WHITE;
267         puts(msg);
268         puts("done.\n");
269         return;
270 }
271
272 void printINFO(const char* msg)
273 {
274         putchar('\r');
275         attr=WHITE;
276         puts("[");
277         attr=CH_BLUE;
278         puts("info");
279         attr=WHITE;
280         puts("]");
281
282         attr=WHITE;
283         puts(msg);
284         return;
285 }
286
287 char * uint_to_str_big_hex(char *buf, unsigned src, int base) {
288   char *p = buf;
289   char *p1, *p2;
290
291   do {
292     *p++ = "0123456789ABCDEF"[src%base];
293   } while(src /= base);
294
295   // Terminate BUF
296   *p = 0;
297
298   // Reverse BUF
299   for(p1=buf, p2=p-1; p1 < p2; p1++, p2--) {
300     char tmp = *p1;
301     *p1 = *p2;
302     *p2 = tmp;
303   }
304
305   return buf;
306 }
307
308 char * uint_to_str_small_hex(char *buf, unsigned src, int base) {
309   char *p = buf;
310   char *p1, *p2;
311
312   do {
313     *p++ = "0123456789abcdef"[src%base];
314   } while(src /= base);
315
316   // Terminate BUF
317   *p = 0;
318
319   // Reverse BUF
320   for(p1=buf, p2=p-1; p1 < p2; p1++, p2--) {
321     char tmp = *p1;
322     *p1 = *p2;
323     *p2 = tmp;
324   }
325
326   return buf;
327 }
328
329 void printf(char* fmt, ...)
330 {
331         char **arg = (char **) &fmt;
332         char c;
333         arg++;
334
335         while((c = *fmt++) != 0) {
336                 if(c != '%'){
337                         putchar(c);
338                         
339                 }else{
340                         char buf[64];
341                         char *p;
342                         c = *fmt++;
343                         
344                         if(c=='d'){
345                                 // if value is minus, put '-' in the head
346                                 if( 0 > *((int *) arg) ) {
347                                         putchar('-');
348                                         *((int *) arg) *= -1;
349                                 }
350                                 p = uint_to_str_small_hex(buf, *((unsigned *) arg++), 10);
351                                 puts(p);
352         
353                         }else if(c=='x'){
354                                 p = uint_to_str_small_hex(buf, *((unsigned *) arg++), 16);
355                                 puts(p);
356                 
357                 }else if(c=='X'){
358                         p = uint_to_str_big_hex(buf, *((unsigned *) arg++), 16);
359                                 puts(p);
360                 
361                         }else if(c=='s'){
362                                 p = *arg++;
363                                 puts(p);
364                 }else if(c=='c'){
365                         p=*arg++;
366                         char send=*p;
367                         putchar(send);
368                         }else{
369                                 putchar(c);
370                 }       
371                 }
372         }
373 }