diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/console.rv | 11 | ||||
| -rw-r--r-- | kernel/input.rv | 3 | ||||
| -rw-r--r-- | kernel/shell.rv | 21 |
3 files changed, 20 insertions, 15 deletions
diff --git a/kernel/console.rv b/kernel/console.rv index a448ef9..a894141 100644 --- a/kernel/console.rv +++ b/kernel/console.rv @@ -30,7 +30,7 @@ end fn con_newline() do con.col = 0 - con.row = con.row + 1 + con.row += 1 if con.row >= con_rows() do fb_scroll(cell_h(), CON_BG) con.row = con_rows() - 1 @@ -44,21 +44,26 @@ fn con_putc(ch) do if code == 10 do con_newline() return :nil end # \n if code == 13 do con.col = 0 return :nil end # \r if code == 8 do # backspace: move left - if con.col > 0 con.col = con.col - 1 + if con.col > 0 con.col -= 1 return :nil end if code < 32 return :nil draw_glyph(con.col, con.row, ch) - con.col = con.col + 1 + con.col += 1 if con.col >= con_cols() con_newline() end fn puts(s) serial_puts(s) +const CUR = 0x50fa7b +fn cursor_paint(color) fill_rect(con.col * cell_w(), con.row * cell_h(), cell_w(), cell_h(), color) + global flush_console = fn() do + cursor_paint(CON_BG) let c = serial_next() while c >= 0 do con_putc(string.of_ascii(c)) c = serial_next() end + cursor_paint(CUR) end diff --git a/kernel/input.rv b/kernel/input.rv index 33cf65d..fde962d 100644 --- a/kernel/input.rv +++ b/kernel/input.rv @@ -42,6 +42,7 @@ global on_key = fn(code) do if code < 2 return :nil if code >= KBD:len() return :nil const ch = if sh.shift KBD_SHIFT[code] else KBD[code] - sh.line = sh.line ~ ch + if ch == " " and code != 0x39 return :nil + sh.line ~= ch puts(ch) end diff --git a/kernel/shell.rv b/kernel/shell.rv index 562f3c4..9d3d95d 100644 --- a/kernel/shell.rv +++ b/kernel/shell.rv @@ -38,18 +38,17 @@ end fn cmd_time() puts("utc " ~ bcd(rtc(4)) ~ ":" ~ bcd(rtc(2)) ~ ":" ~ bcd(rtc(0)) ~ "\n") fn run(line) do + if line:trim():len() == 0 do puts("> ") return :nil end 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 + match cmd + | "help" => cmd_help() + | "clear" => cmd_clear() + | "bars" => cmd_bars() + | "time" => cmd_time() + | "run" => cmd_run() + | "zoom" => cmd_zoom(words) + | "echo" => if line:len() > 5 puts(line:sub(5, line:len() - 5) ~ "\n") else puts("\n") + | _ => puts("unknown command: " ~ cmd ~ "\n") puts("> ") end |
