OS作成
今後デバッグがし易いようにvga.cでprintfモドキなAPIを実装。
可変長変数用マクロ定義のためstdarg.hも実装
stdarg.h
#ifndef _STDARG_H #define _STDARG_H #include "types.h" typedef char* va_list; #define __va_size(x) (sizeof(x) > sizeof(int32_t) ? sizeof(x):sizeof(int32_t)) //#define __va_size(x) ((sizeof(x) + sizeof(int)-1) & ~(sizeof(int) - 1)) #define va_start(ap, last) (ap = (va_list)((char *)(&last) + __va_size(last))) #define va_arg(ap, type) (*(type *)((ap += __va_size(type))-(__va_size(type)))) #define va_end(ap) ((void)0) #endif /* _STDARG_H */
vga.c
void sysPrintf(char *fmt, ...) { char *p; va_list ap; va_start(ap, fmt); for (p = fmt; *p != '\0'; p++) { if (*p == '%') { switch(*(++p)) { case 'x': { u_int32_t x = va_arg(ap, u_int32_t); if ((x & 0xffffff00) == 0) { sysPrintBin(x); } else if ((x & 0xffff0000) == 0) { sysPrintBin16(x); } else { sysPrintBin32(x); } } break; case 'c': { char c = va_arg(ap, char); sysPrintc(c); } break; case 's': { char* s = va_arg(ap, char*); sysPrints(s); } break; case '%': sysPrintc('%'); break; } } else { sysPrintc(*p); } } va_end(ap); }
kernel.c
テスト用コード
char c = 'b'; char *str = "aaa"; u_int8_t x8 = 0x88; u_int16_t x16 = 0x1616; u_int32_t x32 = 0x32323232; sysPrintf("char is %c, str is %s, int8 = %x, int16 = %x, int32 = %x\n" , c, str, x8, x16, x32);