diff --git a/include/knightos/display.h b/include/knightos/display.h index 37f5760..a2425e1 100644 --- a/include/knightos/display.h +++ b/include/knightos/display.h @@ -97,8 +97,20 @@ void draw_short(SCREEN *screen, unsigned char x, unsigned char y, unsigned short **/ void draw_byte(SCREEN *screen, unsigned char x, unsigned char y, unsigned char value); -/*.* +/** + * Draws a signed short at x, y +**/ +void draw_signed(SCREEN *screen, unsigned char x, unsigned char y, signed short value); + +/** + * Draws a float at x,y +**/ + +void draw_float(SCREEN* screen, unsigned char x, unsigned char y, float value); + +/** * Draws a long at x, y +* NYI **/ void draw_long(SCREEN *screen, unsigned char x, unsigned char y, unsigned long value); diff --git a/src/knightos/display.c b/src/knightos/display.c index a970f78..b2c4db3 100644 --- a/src/knightos/display.c +++ b/src/knightos/display.c @@ -330,6 +330,46 @@ void draw_short(SCREEN *screen, unsigned char x, unsigned char y, unsigned short screen; x; y; value; } +void draw_signed(SCREEN* screen, unsigned char x, unsigned char y, signed short value) { + if(value < 0){ + draw_char(screen, x, y, '-'); + x += 4; + value = -value; + } + draw_short(screen, x, y, value); + return; +} + +void draw_float(SCREEN* screen, unsigned char x, unsigned char y, float value){ + /* Implementation is weird and slow because of non-working snprintf. Indeed, %f format strings are not yet implemented */ + unsigned int integer_part; + unsigned int frac_part; + unsigned int integer_part_len; + bool sgn = (value < 0); + + + value = sgn ? -value : value; + + integer_part = (unsigned int)value; + frac_part = ((value - (float)integer_part)*10000); + + integer_part_len = (log10u(integer_part)) + 1; + + if(sgn){ + draw_char(screen, x, y, '-'); + x += 4; + } + + draw_short(screen, x, y, integer_part); + x += integer_part_len*4; + draw_char(screen, x, y, '.'); + + x += 4; + draw_short(screen, x, y, frac_part); + + return; +} + void invert_pixel(SCREEN *screen, char x, char y) { __asm POP BC ; return