diff --git a/sys/include/types.h b/sys/include/types.h index e801fc4..ce548bd 100644 --- a/sys/include/types.h +++ b/sys/include/types.h @@ -16,4 +16,9 @@ typedef char s8; typedef unsigned int size_t; typedef int ssize_t; +typedef unsigned char *va_list; +#define va_start(list, param) (list = (((va_list)¶m) + sizeof(param))) +#define va_arg(list, type) (*(type *)((list += sizeof(type)) - sizeof(type))) +#define va_end(list) (list = NULL) + #endif diff --git a/sys/lib.c b/sys/lib.c index 785c472..1c401d5 100644 --- a/sys/lib.c +++ b/sys/lib.c @@ -1,4 +1,5 @@ #include +static char strbuf[32]; u32 strlen(const char *str) @@ -10,11 +11,86 @@ strlen(const char *str) return i; } +char* +itoa(s32 num, char *str, s32 base) +{ + s32 i = 0; + + if (num < 0 && base == 10) { + str[i++] = '-'; + num = -num; + } + + while (num != 0) { + s32 remainder = num % base; + str[i++] = (remainder < 10) ? remainder + '0' : remainder + 'a' - 10; + num/=base; + } + + str[i] = '\0'; + + return str; +} + +char* +utoa(u32 num, char *str, s32 base) +{ + s32 i = 0; + + while (num != 0) { + s32 remainder = num % base; + str[i++] = (remainder < 10) ? remainder + '0' : remainder + 'a' - 10; + num/=base; + } + + str[i] = '\0'; + + return str; +} + s32 printf(const char *format, ...) { - const u32 len = strlen(format); + const u32 len = sizeof(format); + va_list list; + va_start(list, len); - vga_write(format, len, 0x0f); - return len; + for (u32 i = 0; i < len; i++) { + if (format[i] == '%') { + if (format[i + 1] == 'd' || format[i + 1] == 'i') { + //integer numbers + const s32 num = va_arg(list, s32); + const char* str = itoa(num, strbuf, 10); + vga_write(str, sizeof(str), 0x0f); + } else if (format[i + 1] == 'o') { + //octal numbers + const s32 num = va_arg(list, s32); + const char *str = itoa(num, strbuf, 8); + vga_write(str, sizeof(str), 0x0f); + } else if (format[i + 1] == 'u') { + //unsigned integers + const u32 num = va_arg(list, u32); + const char *str = utoa(num, strbuf, 10); + vga_write(str, sizeof(str), 0x0f); + } else if (format[i + 1] == 'x') { + //hexadecimal numbers + const u32 num = va_arg(list, u32); + const char* str = utoa(num, strbuf, 16); + vga_write(str, sizeof(str), 0x0f); + } else if (format[i + 1] == 's') { + //strings + const char *str = va_arg(list, char*); + vga_write(str, strlen(str), 0x0f); + } else if (format[i + 1] == 'c') { + //one character + vga_write(va_arg(list, char), 1, 0x0f); + } else if (format[i + 1] == '%') { + vga_write('%', 1, 0x0f); + } + } else if (format[i] == '\\' && format[i + 1] == '%') { + vga_write('%', 1, 0x0f); + } else { + vga_write(format[i], 1, 0x0f); + } + } } diff --git a/sys/sysinit.c b/sys/sysinit.c index f1c7b91..a5c35b5 100644 --- a/sys/sysinit.c +++ b/sys/sysinit.c @@ -8,6 +8,48 @@ sysinit(void) char *howdy = "Om Smart."; vga_clearscreen(); + /* + for (s16 i = 0; i < 100; i++) { + vga_write(howdy, strlen(howdy), 0x1f); + vga_write(howday, strlen(howday), 0x0f); + } + + vga_write("sid", 3, 0x07); + vga_write("did", 3, 0x07); + vga_write("fid", 3, 0x07); + */ + + vga_write( +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter.Om Smart.Om Smarter." +"bob", 2003, 0x0F); + vga_write("indian", 6, 0x07); + vga_write("indian", 6, 0x07); + + printf("%s%x", "Omh", 0x2a); vga_write("Starting omOS...", 16, 0x0F); memory_init();