hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/kernel/shell.rv
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-09-25 11:31:59 +0200
committerhachem <im@hachem.wtf>2026-09-25 11:31:59 +0200
commited285c9fc665e262ed21c7bf5734acb2b7a532db (patch)
treee51434e8069bc7219221cc1136515828d0293aca /kernel/shell.rv
parentd18d1da05a4d065d54787434d6bc46f3354626a5 (diff)
feat: load + run native ELF binaries
Diffstat (limited to 'kernel/shell.rv')
-rw-r--r--kernel/shell.rv55
1 files changed, 55 insertions, 0 deletions
diff --git a/kernel/shell.rv b/kernel/shell.rv
new file mode 100644
index 0000000..562f3c4
--- /dev/null
+++ b/kernel/shell.rv
@@ -0,0 +1,55 @@
+# this is just a simple prompt to test that shit is working
+fn cmd_help() puts("commands: help, clear, bars, echo <text>, time, run, zoom in|out\n")
+
+fn zoom_by(d) do
+ let s = con.scale + d
+ if s < 1 do s = 1 end
+ if s > 6 do s = 6 end
+ con.scale = s
+ cmd_clear()
+ puts("zoom " ~ s ~ "x\n")
+end
+
+fn cmd_zoom(words) do
+ const dir = if words:len() > 1 words[1] else ""
+ if dir == "in" do zoom_by(1) end
+ else if dir == "out" do zoom_by(-1) end
+ else do puts("usage: zoom in | zoom out\n") end
+end
+
+fn cmd_clear() do
+ fill_rect(0, 0, fb_width(), fb_height(), CON_BG)
+ con.col = 0
+ con.row = 0
+end
+
+fn cmd_bars() do
+ const bars = { 0xff5555, 0xffaa00, 0xffff55, 0x55ff55, 0x55ffff, 0x5599ff, 0xaa55ff, 0xffffff }
+ const bw = fb_width() / 8
+ for i in 0..8 do fill_rect(i * bw, 0, bw, 40, bars[i]) end
+ puts("painted 8 bars from revo\n")
+end
+
+fn bcd(b) (b shr 4) * 10 + (b band 15)
+fn rtc(reg) do
+ outb(0x70, reg)
+ inb(0x71)
+end
+fn cmd_time() puts("utc " ~ bcd(rtc(4)) ~ ":" ~ bcd(rtc(2)) ~ ":" ~ bcd(rtc(0)) ~ "\n")
+
+fn run(line) do
+ const words = line:split(" ")
+ const cmd = words[0]
+ if cmd == "help" do cmd_help() end
+ else if cmd == "clear" do cmd_clear() end
+ else if cmd == "bars" do cmd_bars() end
+ else if cmd == "time" do cmd_time() end
+ else if cmd == "run" do cmd_run() end
+ else if cmd == "zoom" do cmd_zoom(words) end
+ else if cmd == "echo" do
+ if line:len() > 5 puts(line:sub(5, line:len() - 5) ~ "\n") else puts("\n")
+ end
+ else if line:len() == 0 do :nil end
+ else do puts("unknown command: " ~ cmd ~ "\n") end
+ puts("> ")
+end