From bb775dfa5b437e9bafeb16d37cb1c9055b93a979 Mon Sep 17 00:00:00 2001 From: xamidev <121681048+xamidev@users.noreply.github.com> Date: Sun, 26 May 2024 15:43:30 +0200 Subject: [PATCH] Add: semi-working printf implementation --- io.h | 3 + io.s | 20 +++++ iso/boot/kernel.elf | Bin 9960 -> 10320 bytes kernel.elf | Bin 9960 -> 10320 bytes kmain.c | 3 +- os.iso | Bin 485376 -> 487424 bytes stdint.h | 20 +++++ stdio.c | 189 ++++++++++++++++++++++++++++++++++++++++++++ stdio.h | 17 ++++ 9 files changed, 250 insertions(+), 2 deletions(-) create mode 100644 stdint.h diff --git a/io.h b/io.h index 17894e6..24fba56 100644 --- a/io.h +++ b/io.h @@ -1,7 +1,10 @@ #ifndef INCLUDE_IO_H #define INCLUDE_IO_H +#include "stdint.h" + void outb(unsigned short port, unsigned char data); unsigned char inb(unsigned short port); +void x86_div64_32(uint64_t dividend, uint32_t divisor, uint64_t* quotientOut, uint32_t* remainderOut); #endif diff --git a/io.s b/io.s index 1cac568..bb131d9 100644 --- a/io.s +++ b/io.s @@ -12,3 +12,23 @@ inb: mov dx, [esp + 4] in al, dx ret + +global x86_div64_32 + +x86_div64_32: + mov eax, [bp+8] + mov ecx, [bp+12] + xor edx, edx + div ecx + + mov bx, [bp+16] + mov [bx+4], eax + + mov eax, [bp+4] + div ecx + + mov [bx], eax + mov bx, [bp+18] + mov [bx], edx + + ret diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index dda24bd89165578d1c290ae666c8e83a7df3082d..a1339134860d6110359e6abbe13fef65ce43e872 100755 GIT binary patch literal 10320 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 Ui&mvQM$bEq!+5_&!dK({2XPyK6aWAK delta 1906 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 Ui&mvQM$bEq!+5_&!dK({2XPyK6aWAK delta 1906 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 LH#syH9lYaT8iS9a diff --git a/stdint.h b/stdint.h new file mode 100644 index 0000000..1da6019 --- /dev/null +++ b/stdint.h @@ -0,0 +1,20 @@ +#ifndef INCLUDE_STDINT_H +#define INCLUDE_STDINT_H + +typedef signed char int8_t; +typedef unsigned char uint8_t; + +typedef signed short int16_t; +typedef unsigned short uint16_t; + +typedef signed long int int32_t; +typedef unsigned long int uint32_t; + +typedef signed long long int int64_t; +typedef unsigned long long int uint64_t; + +typedef uint8_t bool; +#define true 1 +#define false 0 + +#endif diff --git a/stdio.c b/stdio.c index 7c67037..27e43d0 100644 --- a/stdio.c +++ b/stdio.c @@ -1,6 +1,7 @@ #include "io.h" #include "stdio.h" #include "string.h" +#include "stdint.h" char* fb = (char *) 0x000B8000; const unsigned VGA_WIDTH = 80; @@ -110,3 +111,191 @@ void puts(const char* str) } } +void printf(const char* fmt, ...) +{ + int* argp = (int*) &fmt; + int state = PRINTF_STATE_START; + int length = PRINTF_LENGTH_START; + int radix = 10; + bool sign = false; + + argp++; + while (*fmt) + { + switch(state) { + case PRINTF_STATE_START: + if (*fmt == '%') + { + state = PRINTF_STATE_LENGTH; + } + else { + putc(*fmt); + } + break; + case PRINTF_STATE_LENGTH: + if (*fmt == 'h') + { + length = PRINTF_LENGTH_SHORT; + state = PRINTF_STATE_SHORT; + } + else if (*fmt == 'l') + { + length = PRINTF_LENGTH_LONG; + state = PRINTF_STATE_LONG; + } + else { + goto PRINTF_STATE_SPEC_; + } + break; + case PRINTF_STATE_SHORT: + if (*fmt == 'h') + { + length = PRINTF_LENGTH_SHORT_SHORT; + state = PRINTF_STATE_SPEC; + } + else { + goto PRINTF_STATE_SPEC_; + } + break; + case PRINTF_STATE_LONG: + if (*fmt == 'l') + { + length = PRINTF_LENGTH_LONG_LONG; + state = PRINTF_STATE_SPEC; + } + else { + goto PRINTF_STATE_SPEC_; + } + break; + case PRINTF_STATE_SPEC: + PRINTF_STATE_SPEC_: + switch(*fmt) + { + case 'c': + putc((char)*argp); + argp++; + break; + case 's': + puts(*(const char **)argp); + argp++; + break; + case '%': + putc('%'); + break; + case 'd': + case 'i': + radix = 10; + sign = true; + argp = printf_number(argp, length, sign, radix); + break; + case 'u': + radix = 10; + sign = false; + argp = printf_number(argp, length, sign, radix); + break; + case 'X': + case 'x': + case 'p': + radix = 16; + sign = false; + argp = printf_number(argp, length, sign, radix); + break; + case 'o': + radix = 8; + sign = false; + argp = printf_number(argp, length, sign, radix); + break; + default: + break; + } + state = PRINTF_STATE_START; + length = PRINTF_LENGTH_START; + radix = 10; + sign = false; + break; + } + fmt++; + } +} + +const char charset[] = "0123456789abcdef"; + +int* printf_number(int* argp, int length, bool sign, int radix) +{ + char buffer[32]; + unsigned long long number; + int number_sign = 1; + int pos = 0; + + switch(length) + { + case PRINTF_LENGTH_SHORT_SHORT: + case PRINTF_LENGTH_SHORT: + case PRINTF_LENGTH_START: + if (sign) + { + int n = *argp; + if (n < 0) + { + n = -n; + number_sign = -1; + } + number = (unsigned long long) n; + } + else { + number = *(unsigned int*) argp; + } + argp++; + break; + case PRINTF_LENGTH_LONG: + if (sign) + { + long int n = *(long int*)argp; + if (n < 0) + { + n = -n; + number_sign = -1; + } + number = (unsigned long long) n; + } + else { + number = *(unsigned long int*) argp; + } + argp += 2; + break; + case PRINTF_LENGTH_LONG_LONG: + if (sign) + { + long long int n = *(long long int*)argp; + if (n < 0) + { + n = -n; + number_sign = -1; + } + number = (unsigned long long) n; + } + else { + number = *(unsigned long long int*) argp; + } + argp += 4; + break; + } + + do { + uint32_t rem; + x86_div64_32(number, radix, &number, &rem); + buffer[pos++] = charset[rem]; + } while (number > 0); + + if (sign && number_sign < 0) + { + buffer[pos++] = '-'; + } + + while (--pos >= 0) + { + putc(buffer[pos]); + } + + return argp; +} diff --git a/stdio.h b/stdio.h index a3a427f..f1c2106 100644 --- a/stdio.h +++ b/stdio.h @@ -1,6 +1,8 @@ #ifndef INCLUDE_STDIO_H #define INCLUDE_STDIO_H +#include "stdint.h" + #define FB_GREEN 2 #define FB_DARK_GREY 8 @@ -19,4 +21,19 @@ unsigned int getcolor(int x, int y); void scroll(int lines); void putc(char c); +#define PRINTF_STATE_START 0 +#define PRINTF_STATE_LENGTH 1 +#define PRINTF_STATE_SHORT 2 +#define PRINTF_STATE_LONG 3 +#define PRINTF_STATE_SPEC 4 + +#define PRINTF_LENGTH_START 0 +#define PRINTF_LENGTH_SHORT_SHORT 1 +#define PRINTF_LENGTH_SHORT 2 +#define PRINTF_LENGTH_LONG 3 +#define PRINTF_LENGTH_LONG_LONG 4 + +void printf(const char* fmt, ...); +int* printf_number(int* argp, int length, bool sign, int radix); + #endif