diff --git a/main.c b/main.c index 69e8485..636d79e 100644 --- a/main.c +++ b/main.c @@ -262,7 +262,7 @@ static void list_statement() { print_newline(); while ((next_line = get_next_line(line)) != 0) { - print_int(get_line_number(line)); + print_uint(get_line_number(line)); print_char(' '); print_detokenized(line + 4); diff --git a/runtime.c b/runtime.c index 0f1e576..2e2e45d 100644 --- a/runtime.c +++ b/runtime.c @@ -223,11 +223,12 @@ void print(uint8_t *s) { /** * Print an unsigned integer. */ -void print_int(uint16_t i) { +void print_uint(uint16_t i) { // Is this the best way to do this? I've seen it done backwards, where // digits are added to a buffer least significant digit first, then reversed, // but this seems faster. char printed = 0; + if (i >= 10000) { int16_t r = i / 10000; print_char('0' + r); @@ -254,6 +255,18 @@ void print_int(uint16_t i) { print_char('0' + i); } +/** + * Print a signed integer. + */ +void print_int(int16_t i) { + if ((i & 0x8000) != 0) { + print_char('-'); + i = -i; + } + + print_uint((uint16_t) i); +} + /** * Print an error message, optionally with a line number if it's * not INVALID_LINE_NUMBER. @@ -264,7 +277,7 @@ static void generic_error_message(uint8_t *message, uint16_t line_number) { if (line_number != INVALID_LINE_NUMBER) { print(" IN "); - print_int(line_number); + print_uint(line_number); } } diff --git a/runtime.h b/runtime.h index c131b4b..c9f9e19 100644 --- a/runtime.h +++ b/runtime.h @@ -34,7 +34,8 @@ void home(void); void print(uint8_t *s); void print_char(uint8_t c); -void print_int(uint16_t i); +void print_uint(uint16_t i); +void print_int(int16_t i); void print_newline(void); void for_statement(uint16_t line_number, uint16_t var_address, int16_t end_value, int16_t step,