kprintf and kprint_float
This commit is contained in:
parent
6208ae369d
commit
2564aa6aba
4 changed files with 28 additions and 2 deletions
|
|
@ -4,12 +4,16 @@ _start:
|
||||||
la sp, stack_top # Set up the stack pointer
|
la sp, stack_top # Set up the stack pointer
|
||||||
la t0, trap_entry # Set up the trap handler
|
la t0, trap_entry # Set up the trap handler
|
||||||
csrw mtvec, t0 # Set the trap vector to our trap handler
|
csrw mtvec, t0 # Set the trap vector to our trap handler
|
||||||
|
li t0, 0x00006000 # Load the mask for FS bits. enable float
|
||||||
|
csrs mstatus, t0 # Set the FS bits to 11 (Dirty/Initial). enable float
|
||||||
call kmain # Jump to our C code
|
call kmain # Jump to our C code
|
||||||
loop:
|
loop:
|
||||||
wfi # Wait for Interrupt (saves CPU)
|
wfi # Wait for Interrupt (saves CPU)
|
||||||
j loop # Infinite loop if C returns
|
j loop # Infinite loop if C returns
|
||||||
.align 4
|
.align 4
|
||||||
trap_entry:
|
trap_entry:
|
||||||
|
csrr a0, mcause # Argument 1: mcause
|
||||||
|
csrr a1, mepc # Argument 2: mepc
|
||||||
j handle_trap
|
j handle_trap
|
||||||
.section .bss
|
.section .bss
|
||||||
.align 16
|
.align 16
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,22 @@ void kprint_int(int num) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kprint_float(float num) {
|
||||||
|
if (num < 0) {
|
||||||
|
kputchar('-');
|
||||||
|
num = -num;
|
||||||
|
}
|
||||||
|
int int_part = (int)num;
|
||||||
|
float frac_part = num - int_part;
|
||||||
|
kprint_int(int_part);
|
||||||
|
kputchar('.');
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
frac_part *= 10.0f;
|
||||||
|
}
|
||||||
|
int fraction = (int)(frac_part + 0.5f); // Round to nearest
|
||||||
|
kprint_int(fraction);
|
||||||
|
}
|
||||||
|
|
||||||
void kprint_hex(uint64_t val) {
|
void kprint_hex(uint64_t val) {
|
||||||
char *digits = "0123456789ABCDEF";
|
char *digits = "0123456789ABCDEF";
|
||||||
char buffer[16]; // 64-bit hex is 16 chars
|
char buffer[16]; // 64-bit hex is 16 chars
|
||||||
|
|
@ -79,6 +95,11 @@ void kprintf(const char *format, ...) {
|
||||||
kprint_int(d);
|
kprint_int(d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'f': {
|
||||||
|
double f = va_arg(args, double);
|
||||||
|
kprint_float((float)f);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 'x': // Hex
|
case 'x': // Hex
|
||||||
case 'p': { // Pointer
|
case 'p': { // Pointer
|
||||||
uint64_t x = va_arg(args, uint64_t);
|
uint64_t x = va_arg(args, uint64_t);
|
||||||
|
|
@ -97,5 +118,5 @@ void kprintf(const char *format, ...) {
|
||||||
kputchar(*p);
|
kputchar(*p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
knewline();
|
||||||
}
|
}
|
||||||
|
|
@ -7,6 +7,7 @@ int kputchar(int ch);
|
||||||
void kprint_hex(uint64_t val);
|
void kprint_hex(uint64_t val);
|
||||||
void kprint_int(int num);
|
void kprint_int(int num);
|
||||||
void kprintf(const char *format, ...);
|
void kprintf(const char *format, ...);
|
||||||
|
void kprint_float(float num);
|
||||||
void knewline();
|
void knewline();
|
||||||
void kputs(const char *str);
|
void kputs(const char *str);
|
||||||
void kprint(const char *str);
|
void kprint(const char *str);
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
#include <kernel/memory.h>
|
#include <kernel/memory.h>
|
||||||
|
|
||||||
void kmain() {
|
void kmain() {
|
||||||
kputs("Hello, OS World!");
|
kprintf("Hello, from %s v%f!" , "SquidgeOS", 0.5);
|
||||||
kputs("-------------------");
|
kputs("-------------------");
|
||||||
knewline();
|
knewline();
|
||||||
page_init();
|
page_init();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue