From 5ec9cc709f8593d63fe666252840dc91082bceb3 Mon Sep 17 00:00:00 2001 From: Lauchmelder Date: Thu, 20 Jan 2022 16:38:03 +0100 Subject: [PATCH] added more int to string conversions --- include/convert.h | 6 +++++- src/boot.S | 4 +++- src/convert.c | 40 ++++++++++++++++++++++++++++++++-------- src/kernel.c | 30 +++++++++++++++--------------- 4 files changed, 55 insertions(+), 25 deletions(-) diff --git a/include/convert.h b/include/convert.h index 118a576..d4bb0f9 100644 --- a/include/convert.h +++ b/include/convert.h @@ -3,4 +3,8 @@ #include "stdint.h" int stoi(const char* string); -char* itoa(int number, char* string); \ No newline at end of file + +char* ultoa(unsigned long number, char* string, int base); +char* ltoa(long number, char* string, int base); +char* utoa(unsigned int number, char* string, int base); +char* itoa(int number, char* string, int base); \ No newline at end of file diff --git a/src/boot.S b/src/boot.S index ec7b34a..c08a0e4 100644 --- a/src/boot.S +++ b/src/boot.S @@ -24,6 +24,8 @@ _start: cbnz w2, 3b 4: # Jump to main() in C - ldr x4, =_start + ldr x0, =_start + ldr x1, =0x50000 + str x0, [x1] bl main b 1b \ No newline at end of file diff --git a/src/convert.c b/src/convert.c index 688a70a..8387603 100644 --- a/src/convert.c +++ b/src/convert.c @@ -21,8 +21,14 @@ int stoi(const char* string) return output; } -char* itoa(int number, char* string) +char* ultoa(unsigned long number, char* string, int base) { + if(base < 2 || base > 16) + { + string[0] = '\0'; + return string; + } + volatile char* temp = (volatile char*)0x40000000; int i = 0; if(number == 0) @@ -31,17 +37,12 @@ char* itoa(int number, char* string) } else { - for(int n = (number < 0 ? -number : number); n > 0; n /= 10) + for(; number > 0; number /= base) { - temp[i++] = '0' + (n % 10); + temp[i++] = '0' + (number % base); } } - if(number < 0) - { - temp[i++] = '-'; - } - temp[i] = '\0'; string[i] = '\0'; @@ -51,4 +52,27 @@ char* itoa(int number, char* string) } return string; +} + +char* ltoa(long number, char* string, int base) +{ + char* old_string = string; + if(number < 0) + { + number *= -1; + *string++ = '-'; + } + + itoa(number, string, base); + return old_string; +} + +char* utoa(unsigned int number, char* string, int base) +{ + return ultoa(number, string, base); +} + +char* itoa(int number, char* string, int base) +{ + return ltoa(number, string, base); } \ No newline at end of file diff --git a/src/kernel.c b/src/kernel.c index bc9fd97..bb43f1b 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -3,29 +3,24 @@ #include "string.h" void print_clippy(); +char* get_user_input(char* buffer); void main() { const char* hex_chars = "0123456789ABCDEF"; - register int* start_address asm ("x4"); - long int start = (long int)start_address; + long int start = *(volatile long int*)0x50000; + char buffer[1024]; uart_init(); print_clippy(); uart_puts("Boot successful! \n"); uart_puts("Started execution at 0x"); - for(int i = 0; i < 8; i++) - { - uart_putchar(hex_chars[start & 0xF]); - start >>= 4; - } + uart_puts(ultoa(start, buffer, 16)); - char buffer[1024]; for(;;) { uart_puts("\n\nPlease enter first operand\n"); - uart_puts("📎 "); - uart_gets(buffer); + get_user_input(buffer); if(!strcmp(buffer, "clippy")) { @@ -36,18 +31,23 @@ void main() int a = stoi(buffer); uart_puts("\nPlease enter second operand\n"); - uart_puts("📎 "); - int b = stoi(uart_gets(buffer)); + int b = stoi(get_user_input(buffer)); uart_puts("\n"); - uart_puts(itoa(a, buffer)); + uart_puts(itoa(a, buffer, 10)); uart_puts(" * "); - uart_puts(itoa(b, buffer)); + uart_puts(itoa(b, buffer, 10)); uart_puts(" = "); - uart_puts(itoa(a * b, buffer)); + uart_puts(itoa(a * b, buffer, 10)); } } +char* get_user_input(char* buffer) +{ + uart_puts("📎 "); + return uart_gets(buffer); +} + void print_clippy() { uart_puts(" ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \n");