ウォンツテック

そでやまのーと

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);