From da127ee6b2f224b1f847da5bfccf36c60871272d Mon Sep 17 00:00:00 2001 From: xamidev Date: Thu, 8 Aug 2024 13:28:47 +0200 Subject: [PATCH] Small fixes: uptime, printf %f, math, and readme --- README.md | 15 +++++++++++++-- iso/boot/kernel.elf | Bin 30312 -> 26216 bytes src/kernel/kmain.c | 1 + src/libc/stdio.c | 1 - src/programs/math.c | 30 ++++++------------------------ src/programs/misc.c | 4 +++- 6 files changed, 23 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index d4b8286..71ef680 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,16 @@ The long-term goal of this OS is to be capable of running user programs and havi ## Usage +Download the latest BlankOS ISO image from the "Releases" tab, and emulate it directly using the QEMU emulator: + +``` +qemu-system-i386 blankOS-i386-1.4.45.iso +``` + +Alternatively, burn the image on a USB stick and use it on a machine (see section "Real Hardware"). + +## Building from source + ### Dependencies For Debian-based distros: @@ -42,7 +52,7 @@ A cross-compiler is needed to build the system. More info on why [here](https:// Why didn't I use one sooner? Can't tell. Maybe I was too lazy. This is actually problematic because I wasn't able to use some libraries and I had to put in a bunch of weird compilation flags. It's better like this. -## Building and running +To clone and build, do: ``` git clone https://github.com/xamidev/blankos @@ -50,7 +60,8 @@ make make run ``` -This will start a new Bochs debugger instance. To proceed with the kernel execution, you will have to type `c` in the shell spawning Bochs. Serial output will be saved under the `com1.out` file, this way you can debug the kernel by viewing its log messages. To quit, type `q`. Feel free to open issues or pull requests. +This will start a new Bochs debugger instance. To proceed with the kernel execution, you will have to type `c` in the shell spawning Bochs. Serial output will be saved under the `com1.out` file, this way you can debug the kernel by viewing its log messages. To quit, type `q`. +You can try out QEMU too. ## Running on real hardware diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index ef91c7e0f6ef6730be5a95475c0756bfb93e1e71..58988fc2044cb503ad0553329ab21de0647b2d6c 100755 GIT binary patch delta 5956 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 G{QWP9toob) diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index 2483599..2557363 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -3,6 +3,7 @@ #include "gdt.h" #include "idt.h" #include "system.h" +//#include char* ascii_title = "\n" diff --git a/src/libc/stdio.c b/src/libc/stdio.c index 70a8555..31d1c7f 100644 --- a/src/libc/stdio.c +++ b/src/libc/stdio.c @@ -183,7 +183,6 @@ void dtostrf(double val, char *buffer, int precision) double fractional_part = val - whole_part; if (fractional_part < 0) fractional_part = -fractional_part; - char *start = buffer; if (whole_part == 0) { *buffer++ = '0'; diff --git a/src/programs/math.c b/src/programs/math.c index 70d20c1..9f96c9e 100644 --- a/src/programs/math.c +++ b/src/programs/math.c @@ -87,7 +87,6 @@ Token lexer_get_next_token(Lexer *lexer) } lexer->current_token.type = TOKEN_NUMBER; lexer->current_token.value = value; - //printf("NUMBER %f\n", value); return lexer->current_token; } @@ -95,7 +94,6 @@ Token lexer_get_next_token(Lexer *lexer) { lexer_advance(lexer); lexer->current_token.type = TOKEN_PLUS; - printf("PLUS\n"); return lexer->current_token; } @@ -103,7 +101,6 @@ Token lexer_get_next_token(Lexer *lexer) { lexer_advance(lexer); lexer->current_token.type = TOKEN_MINUS; - printf("MINUS\n"); return lexer->current_token; } @@ -111,7 +108,6 @@ Token lexer_get_next_token(Lexer *lexer) { lexer_advance(lexer); lexer->current_token.type = TOKEN_MULTIPLY; - printf("MULTIPLY\n"); return lexer->current_token; } @@ -119,7 +115,6 @@ Token lexer_get_next_token(Lexer *lexer) { lexer_advance(lexer); lexer->current_token.type = TOKEN_DIVIDE; - printf("DIVIDE\n"); return lexer->current_token; } @@ -127,7 +122,6 @@ Token lexer_get_next_token(Lexer *lexer) { lexer_advance(lexer); lexer->current_token.type = TOKEN_LPAREN; - printf("LPAREN\n"); return lexer->current_token; } @@ -135,16 +129,14 @@ Token lexer_get_next_token(Lexer *lexer) { lexer_advance(lexer); lexer->current_token.type = TOKEN_RPAREN; - printf("RPAREN\n"); return lexer->current_token; } - printf("Unknown character %c\n", current_char); - //shell_install(); + printf("\nUnknown character %c\n", current_char); + shell_install(); } lexer->current_token.type = TOKEN_END; - printf("END\n"); return lexer->current_token; } @@ -166,8 +158,8 @@ void parser_eat(Parser *parser, TokenType type) { parser->current_token = lexer_get_next_token(&parser->lexer); } else { - printf("Unexpected token %d\n", parser->current_token.type); - //shell_install(); + printf("\nUnexpected token %d\n", parser->current_token.type); + shell_install(); } } @@ -181,17 +173,15 @@ double parser_factor(Parser *parser) if (token.type == TOKEN_NUMBER) { parser_eat(parser, TOKEN_NUMBER); - //printf("Factor: %f\n", token.value); return token.value; } else if (token.type == TOKEN_LPAREN) { parser_eat(parser, TOKEN_LPAREN); double result = parser_expression(parser); parser_eat(parser, TOKEN_RPAREN); - //printf("Factor (expression): %f\n", result); return result; } else { - printf("Unexpected token in factor %d\n", token.type); - //shell_install(); + printf("\nUnexpected token in factor %d\n", token.type); + shell_install(); } return -1; } @@ -199,7 +189,6 @@ double parser_factor(Parser *parser) double parser_term(Parser *parser) { double result = parser_factor(parser); - //printf("Initial term: %f\n", result); while (parser->current_token.type == TOKEN_MULTIPLY || parser->current_token.type == TOKEN_DIVIDE) { @@ -208,11 +197,9 @@ double parser_term(Parser *parser) { parser_eat(parser, TOKEN_MULTIPLY); result *= parser_factor(parser); - //printf("Term after multiply: %f\n", result); } else if (token.type == TOKEN_DIVIDE) { parser_eat(parser, TOKEN_DIVIDE); result /= parser_factor(parser); - //printf("Term after divide: %f\n", result); } } return result; @@ -221,7 +208,6 @@ double parser_term(Parser *parser) double parser_expression(Parser *parser) { double result = parser_term(parser); - //printf("Initial expression: %f\n", result); while (parser->current_token.type == TOKEN_PLUS || parser->current_token.type == TOKEN_MINUS) { @@ -230,11 +216,9 @@ double parser_expression(Parser *parser) { parser_eat(parser, TOKEN_PLUS); result += parser_term(parser); - //printf("Expression after plus: %f\n", result); } else if (token.type == TOKEN_MINUS) { parser_eat(parser, TOKEN_MINUS); result -= parser_term(parser); - //printf("Expression after minus: %f\n", result); } } return result; @@ -245,7 +229,6 @@ double parse(const char* text) Parser parser; parser_init(&parser, text); double result = parser_expression(&parser); - //printf("Final result: %f\n", result); return result; } @@ -254,7 +237,6 @@ void program_math() char input_buffer[BUFFER_SIZE]; puts("Expression? "); get_input(input_buffer, BUFFER_SIZE); - printf("Input: %s\n", input_buffer); double result = parse(input_buffer); printf("\n%f\n", result); } diff --git a/src/programs/misc.c b/src/programs/misc.c index 321c9a6..c255492 100644 --- a/src/programs/misc.c +++ b/src/programs/misc.c @@ -35,5 +35,7 @@ void program_clear() void program_uptime() { - printf("%d ticks\n", uptime()); + int ticks = uptime(); + double seconds = ticks/18.2065; // PIC channel 0 freq + printf("%d ticks\t%f seconds\n", ticks, seconds); }