From 1e4a254674f668839e5de273916024c16814b045 Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Sun, 13 Sep 2020 03:19:57 -0400 Subject: (basic, not much tested) keyboard, better panic --- src/user/knob/block.c | 17 +++++++ src/user/knob/entry.asm | 1 + src/user/knob/quit.c | 25 +---------- src/user/knob/task.c | 16 ++++++- src/user/knob/user.c | 116 ++++++++++++++++++++++++++++++++++-------------- 5 files changed, 116 insertions(+), 59 deletions(-) create mode 100644 src/user/knob/block.c (limited to 'src/user/knob') diff --git a/src/user/knob/block.c b/src/user/knob/block.c new file mode 100644 index 0000000..e890fa1 --- /dev/null +++ b/src/user/knob/block.c @@ -0,0 +1,17 @@ +#include +#include + +//unsophisticated, should copy by dwords where available +void blockcpy(void *to, const void *from, uint32_t size) { + for (uint32_t i = 0; i < size; ++i) + *(uint8_t *)(to++) = *(const uint8_t *)(from++); +} + +//unsophisticated, should check by dwords wheere available +__attribute__ ((__pure__)) +bool blockequ(void *a, void *b, uint32_t size) { + for (uint32_t i = 0; i < size; ++i) + if (*(uint8_t *)(a++) != *(uint8_t *)(b++)) + return false; + return true; +} \ No newline at end of file diff --git a/src/user/knob/entry.asm b/src/user/knob/entry.asm index ae024c4..18faf7f 100644 --- a/src/user/knob/entry.asm +++ b/src/user/knob/entry.asm @@ -10,6 +10,7 @@ extern current_disk section .text _entry: mov esp, stack + push edx ;TODO: heap stuff? ;TODO: determine current_disk diff --git a/src/user/knob/quit.c b/src/user/knob/quit.c index a2ef5aa..7c20bdd 100644 --- a/src/user/knob/quit.c +++ b/src/user/knob/quit.c @@ -1,29 +1,6 @@ #include -#include - -struct quit_list_node { - struct quit_list_node *prev; - void (*f)(); -}; - -static struct quit_list_node head = { - .f = &_exit_task -}; - -static struct quit_list_node *last = &head; - -void on_quit(void (*run_f)()) { - struct quit_list_node *new = get_block(sizeof(struct quit_list_node)); - new->prev = last; - new->f = run_f; - last = new; -} __attribute__ ((noreturn)) void quit() { - struct quit_list_node *node = last; - while (1) { - node->f(); - node = node->prev; - } + _exit_task(); } \ No newline at end of file diff --git a/src/user/knob/task.c b/src/user/knob/task.c index aa18eab..598bee2 100644 --- a/src/user/knob/task.c +++ b/src/user/knob/task.c @@ -1,11 +1,25 @@ #include #include #include +#include +#include bool try_run_command(const char *path) { uint8_t dn; path = remove_prefix(path, &dn); - return _start_task(dn, path); + + for (const char *ptr = path; *ptr; ++ptr) + if (*ptr == ' ') { + char *new_path = get_block(ptr - path + 1); + blockcpy(new_path, path, ptr - path); + new_path[ptr - path] = '\0'; + + bool succeded = _start_task(dn, new_path, ptr + 1); + free_block(new_path); + return succeded; + } + + return _start_task(dn, path, ""); } void yield_task() { diff --git a/src/user/knob/user.c b/src/user/knob/user.c index fb39851..4ef3321 100644 --- a/src/user/knob/user.c +++ b/src/user/knob/user.c @@ -19,9 +19,25 @@ static const uint8_t caps_and_shift[] = { 0x7e, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, - 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00 - - //TODO: higher + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const uint8_t caps_no_shift[] = { @@ -41,9 +57,25 @@ static const uint8_t caps_no_shift[] = { 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, - 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00 - - //TODO: higher + 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const uint8_t shifted[] = { @@ -63,28 +95,39 @@ static const uint8_t shifted[] = { 0x7e, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, - 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00 - - //TODO: higher + 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static char get_key_char() { _key_code_t key; while (!(key = _get_key())) _yield_task(); - return (char)( - (key & (_KEY_ALT | _KEY_CTRL | _KEY_META)) - ? 0 - : (key & _KEY_CAPS) - ? (key & _KEY_SHIFT) - ? caps_and_shift[key & 0xff] - : caps_no_shift[key & 0xff] - : (key & _KEY_SHIFT) - ? shifted[key & 0xff] - : (key & 0x80) - ? 0 - : (key & 0x7f) - ); + return + key & _KEY_CAPS + ? key & _KEY_SHIFT + ? caps_and_shift[key & 0xff] + : caps_no_shift[key & 0xff] + : key & _KEY_SHIFT + ? shifted[key & 0xff] + : key & 0xff; } void tell_user_sz(const char *sz) { @@ -115,18 +158,23 @@ uint32_t ask_user_line_sz(char *sz, uint32_t max_length) { uint32_t i; for (i = 0; i != max_length; ++i) { - char key = get_key_char(); - if (key) { - log_buf[0] = key; - _log_string(log_buf); - - if (key == '\b') - i -= i ? 2 : 1; - else if (key == '\n') - break; - else - sz[i] = key; - } + char key; + replace: + key = get_key_char(); + if (!key) + goto replace; + if (key & 0x80) + goto replace;//TODO + + log_buf[0] = key; + _log_string(log_buf); + + if (key == '\b') + i -= i ? 2 : 1; + else if (key == '\n') + break; + else + sz[i] = key; } sz[i] = '\0'; -- cgit v1.2.3