From f59776e7929db9c43da559171eb1058c5a464dae Mon Sep 17 00:00:00 2001 From: Sam Buckley Date: Tue, 16 Jul 2024 22:42:49 +0100 Subject: [PATCH] Update string lib for num format - Trees --- kernel/src/holeybytes/ecah.rs | 4 +- sysdata/libraries/stn/src/string.hb | 46 ++++++++++++++++- sysdata/limine.cfg | 2 +- sysdata/programs/time_driver/meta.toml | 11 ++++ sysdata/programs/time_driver/src/main.hb | 64 ++++++++++++++++++++++++ sysdata/system_config.toml | 7 ++- 6 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 sysdata/programs/time_driver/meta.toml create mode 100644 sysdata/programs/time_driver/src/main.hb diff --git a/kernel/src/holeybytes/ecah.rs b/kernel/src/holeybytes/ecah.rs index fbf0f103..846957b7 100644 --- a/kernel/src/holeybytes/ecah.rs +++ b/kernel/src/holeybytes/ecah.rs @@ -177,7 +177,9 @@ pub fn handler(vm: &mut Vm) { unsafe fn x86_out(address: u16, value: u32) { x86_64::instructions::port::Port::new(address).write(value); } - vm.registers[3] = hbvm::value::Value(unsafe { x86_in(r2 as u16) } as u64); + let x = hbvm::value::Value(unsafe { x86_in(r2 as u16) } as u64); + info!("Read {:?} from Port {:?}", x, r2); + vm.registers[3] = x } } // 5 diff --git a/sysdata/libraries/stn/src/string.hb b/sysdata/libraries/stn/src/string.hb index 3ee31a61..ab4e5fe3 100644 --- a/sysdata/libraries/stn/src/string.hb +++ b/sysdata/libraries/stn/src/string.hb @@ -5,4 +5,48 @@ length := fn(ptr: ^u8): int { ptr += 1; } return len; -} \ No newline at end of file +} + +display_int := fn(num: int): ^u8 { + p := page; + i := 0; + if num == 0 { + set(p, 48); + return p; + } + loop { + if num == 0 break; + set(p + i, num % 10 + 48); + num /= 10; + i += 1; + } + reverse(p); + //null terminate + set(p + i, 0); + return p; +} + +reverse := fn(s: ^u8): void { + //reverse a string, don't remove digits + len := 0; + loop { + if *(s + len) == 0 break; + len += 1; + } + i := 0; + j := len - 1; + loop { + if i >= j break; + temp := *(s + i); + *(s + i) = *(s + j); + *(s + j) = temp; + i += 1; + j -= 1; + } + return; +} + +set := fn(change: ^int, new: int): void { + *(change) = new; + return; +} diff --git a/sysdata/limine.cfg b/sysdata/limine.cfg index 14ad16ea..18ec894c 100644 --- a/sysdata/limine.cfg +++ b/sysdata/limine.cfg @@ -37,4 +37,4 @@ TERM_BACKDROP=008080 MODULE_CMDLINE="height=10 width=10 arch=${ARCH}" MODULE_PATH=boot:///serial_driver.hbf - MODULE_CMDLINE="arch=${ARCH}" \ No newline at end of file + MODULE_CMDLINE="arch=${ARCH}" diff --git a/sysdata/programs/time_driver/meta.toml b/sysdata/programs/time_driver/meta.toml new file mode 100644 index 00000000..84cc97e6 --- /dev/null +++ b/sysdata/programs/time_driver/meta.toml @@ -0,0 +1,11 @@ +[package] +name = "time_driver" +authors = ["SamBuckley"] + +[dependants.libraries] + +[dependants.binaries] +hblang.version = "1.0.0" + +[build] +command = "hblang src/main.hb" diff --git a/sysdata/programs/time_driver/src/main.hb b/sysdata/programs/time_driver/src/main.hb new file mode 100644 index 00000000..78a24960 --- /dev/null +++ b/sysdata/programs/time_driver/src/main.hb @@ -0,0 +1,64 @@ +stn := @use("../../../libraries/stn/src/lib.hb"); +log := stn.log; +mem := stn.memory; +page := 0 + +main := fn(): void { + page += mem.request_page(1); + port_str := "\0\{46}\0"; + a := @eca(u8, 3, 3, port_str, 2); + log.debug(&a); + n := 5000000; + loop { + if n == 0 break; + n -= 1; + stack_reclamation_edge_case := 0; + } + td := display_int(100); + log.debug(td); + return; +} + +display_int := fn(num: int): ^u8 { + p := page; + i := 0; + if num == 0 { + set(p, 48); + return p; + } + loop { + if num == 0 break; + set(p + i, num % 10 + 48); + num /= 10; + i += 1; + } + reverse(p); + //null terminate + set(p + i, 0); + return p; +} + +reverse := fn(s: ^u8): void { + //reverse a string, don't remove digits + len := 0; + loop { + if *(s + len) == 0 break; + len += 1; + } + i := 0; + j := len - 1; + loop { + if i >= j break; + temp := *(s + i); + *(s + i) = *(s + j); + *(s + j) = temp; + i += 1; + j -= 1; + } + return; +} + +set := fn(change: ^int, new: int): void { + *(change) = new; + return; +} diff --git a/sysdata/system_config.toml b/sysdata/system_config.toml index 553cc875..d7975bf6 100644 --- a/sysdata/system_config.toml +++ b/sysdata/system_config.toml @@ -24,5 +24,8 @@ path = "boot:///tests.hbf" # [boot.limine.ableos.modules.diskio_driver] # path = "boot:///diskio_driver.hbf" -[boot.limine.ableos.modules.fb_driver] -path = "boot:///fb_driver.hbf" +# [boot.limine.ableos.modules.fb_driver] +# path = "boot:///fb_driver.hbf" + +[boot.limine.ableos.modules.time_driver] +path = "boot:///time_driver.hbf" \ No newline at end of file