diff --git a/fill.cur b/fill.cur new file mode 100644 index 0000000..88bb3f0 Binary files /dev/null and b/fill.cur differ diff --git a/img/makefile b/img/makefile index 3178f88..13696bb 100644 --- a/img/makefile +++ b/img/makefile @@ -18,11 +18,12 @@ v5: xfs_v5_ftype1_s05k_b2k_n8k.img xfs_v5_files_s05k_b4k_n8k.img coverage: jfs.img xfs_borg_bit.img xfs_short_dir_i8.img -kolibri.img: ../default.skn +kolibri.img: ../default.skn ../fill.cur touch $@ fallocate -z -o 0 -l 1440KiB $@ mkfs.vfat -n KOLIBRIOS -F 12 $@ - mcopy -vmoi $@ $< ::DEFAULT.SKN + mcopy -vmoi $@ ../default.skn ::DEFAULT.SKN + mcopy -vmoi $@ ../fill.cur ::FILL.CUR jfs.img: fallocate -l 16MiB $@ diff --git a/shell.c b/shell.c index 03c0442..5fdb8ae 100644 --- a/shell.c +++ b/shell.c @@ -179,6 +179,20 @@ print_hash(uint8_t *x, size_t len) { fputc('\n', fout); } +void *host_load_file(const char *fname) { + FILE *f = fopen(fname, "r"); + if (!f) { + return NULL; + } + fseek(f, 0, SEEK_END); + size_t fsize = ftell(f); + rewind(f); + void *fdata = malloc(fsize); + fread(fdata, 1, fsize, f); + fclose(f); + return fdata; +} + static const char * get_last_dir(const char *path) { const char *last = strrchr(path, '/'); @@ -239,10 +253,38 @@ split_args(char *s, char **argv) { return argc; } +static void +shell_send_scancode(int argc, char **argv) { + const char *usage = \ + "usage: send_scancode ...\n" + " code dec or hex number\n"; + + if (argc < 2) { + fputs(usage, fout); + return; + } + argc -= 1; + argv += 1; + + while (argc) { + char *endptr; + size_t code = strtoul(argv[0], &endptr, 0); + if (*endptr == '\0') { + umka_set_keyboard_data(code); + argc--; + argv++; + } else { + fprintf(fout, "not an integer: %s\n", argv[0]); + fputs(usage, fout); + return; + } + } +} + static void shell_umka_init(int argc, char **argv) { const char *usage = \ - "usage: umka_init"; + "usage: umka_init\n"; (void)argv; if (argc < 0) { fputs(usage, fout); @@ -258,7 +300,7 @@ shell_umka_set_boot_params(int argc, char **argv) { const char *usage = \ "usage: umka_set_boot_params [--x_res ] [--y_res ]\n" " --x_res screen width\n" - " --y_res screen height"; + " --y_res screen height\n"; argc -= 1; argv += 1; @@ -276,9 +318,9 @@ shell_umka_set_boot_params(int argc, char **argv) { argv += 2; continue; } else { - printf("bad option: %s\n", argv[0]); - puts(usage); - exit(1); + fprintf(fout, "bad option: %s\n", argv[0]); + fputs(usage, fout); + return; } } @@ -288,7 +330,7 @@ static void shell_i40(int argc, char **argv) { const char *usage = \ "usage: i40 [ebx [ecx [edx [esi [edi [ebp]]]]]]...\n" - " see '/kernel/docs/sysfuncs.txt' for details"; + " see '/kernel/docs/sysfuncs.txt' for details\n"; if (argc < 2 || argc > 8) { fputs(usage, fout); return; @@ -334,7 +376,7 @@ static void shell_ramdisk_init(int argc, char **argv) { const char *usage = \ "usage: ramdisk_init \n" - " absolute or relative path"; + " absolute or relative path\n"; if (argc != 2) { fputs(usage, fout); return; @@ -367,7 +409,7 @@ shell_disk_add(int argc, char **argv) { "usage: disk_add [option]...\n" " absolute or relative path\n" " disk name, e.g. hd0 or rd\n" - " -c cache size size of disk cache in bytes"; + " -c cache size size of disk cache in bytes\n"; if (argc < 3) { fputs(usage, fout); return; @@ -425,7 +467,7 @@ static void shell_disk_del(int argc, char **argv) { const char *usage = \ "usage: disk_del \n" - " name disk name, i.e. rd or hd0"; + " name disk name, i.e. rd or hd0\n"; if (argc != 2) { fputs(usage, fout); return; @@ -438,7 +480,7 @@ shell_disk_del(int argc, char **argv) { static void shell_pwd(int argc, char **argv) { const char *usage = \ - "usage: pwd"; + "usage: pwd\n"; if (argc != 1) { fputs(usage, fout); return; @@ -459,7 +501,7 @@ shell_set_pixel(int argc, char **argv) { " x x window coordinate\n" " y y window coordinate\n" " color argb in hex\n" - " -i inverted color"; + " -i inverted color\n"; if (argc < 4) { fputs(usage, fout); return; @@ -488,7 +530,7 @@ shell_write_text(int argc, char **argv) { " font_and_enc font size and string encoding\n" " draw_to_buf draw to the buffer pointed to by the next param\n" " length length of the string if it is non-asciiz\n" - " bg_color_or_buf argb or pointer"; + " bg_color_or_buf argb or pointer\n"; if (argc != 12) { fputs(usage, fout); return; @@ -511,12 +553,43 @@ shell_write_text(int argc, char **argv) { COVERAGE_OFF(); } +static void +shell_get_key(int argc, char **argv) { + (void)argv; + const char *usage = \ + "usage: get_key\n"; + if (argc > 1) { + fputs(usage, fout); + return; + } + fprintf(fout, "0x%8.8" PRIx32 "\n", umka_get_key()); +} + +static void +shell_dump_key_buff(int argc, char **argv) { + const char *usage = \ + "usage: dump_key_buff [count]\n" + " count how many items to dump (all by default)\n"; + if (argc > 2) { + fputs(usage, fout); + return; + } + int count = INT_MAX; + if (argc > 1) { + count = strtol(argv[1], NULL, 0); + } + for (int i = 0; i < count && i < kos_key_count; i++) { + fprintf(fout, "%3i 0x%2.2x 0x%2.2x\n", i, kos_key_buff[i], + kos_key_buff[120+2+i]); + } +} + static void shell_dump_win_stack(int argc, char **argv) { const char *usage = \ "usage: dump_win_stack [count]\n" - " count how many items to dump"; - if (argc < 1) { + " count how many items to dump\n"; + if (argc > 2) { fputs(usage, fout); return; } @@ -533,7 +606,7 @@ static void shell_dump_win_pos(int argc, char **argv) { const char *usage = \ "usage: dump_win_pos [count]\n" - " count how many items to dump"; + " count how many items to dump\n"; if (argc < 1) { fputs(usage, fout); return; @@ -549,8 +622,9 @@ shell_dump_win_pos(int argc, char **argv) { static void shell_dump_win_map(int argc, char **argv) { +// TODO: area const char *usage = \ - "usage: dump_win_map"; + "usage: dump_win_map\n"; (void)argv; if (argc < 0) { fputs(usage, fout); @@ -569,7 +643,7 @@ shell_dump_appdata(int argc, char **argv) { const char *usage = \ "usage: dump_appdata [-p]\n" " index index into appdata array to dump\n" - " -p print fields that are pointers"; + " -p print fields that are pointers\n"; if (argc < 2) { fputs(usage, fout); return; @@ -631,7 +705,7 @@ static void shell_switch_to_thread(int argc, char **argv) { const char *usage = \ "usage: switch_to_thread \n" - " thread id to switch to"; + " thread id to switch to\n"; if (argc != 2) { fputs(usage, fout); return; @@ -641,12 +715,39 @@ shell_switch_to_thread(int argc, char **argv) { kos_current_slot = kos_slot_base + tid; } +static void +shell_get(int argc, char **argv) { + const char *usage = \ + "usage: get \n" + " variable to get\n"; + if (argc != 2) { + fputs(usage, fout); + return; + } + const char *var = argv[1]; + if (!strcmp(var, "redraw_background")) { + fprintf(fout, "%i\n", kos_redraw_background); + } else if (!strcmp(var, "key_count")) { + fprintf(fout, "%i\n", kos_key_count); + } else if (!strcmp(var, "syslang")) { + fprintf(fout, "%i\n", kos_syslang); + } else if (!strcmp(var, "keyboard")) { + fprintf(fout, "%i\n", kos_keyboard); + } else if (!strcmp(var, "keyboard_mode")) { + fprintf(fout, "%i\n", kos_keyboard_mode); + } else { + fprintf(fout, "no such variable: %s\n", var); + fputs(usage, fout); + return; + } +} + static void shell_set(int argc, char **argv) { const char *usage = \ "usage: set \n" " variable to set\n" - " decimal or hex value"; + " decimal or hex value\n"; if (argc != 3) { fputs(usage, fout); return; @@ -655,17 +756,24 @@ shell_set(int argc, char **argv) { size_t value = strtoul(argv[2], NULL, 0); if (!strcmp(var, "redraw_background")) { kos_redraw_background = value; + } else if (!strcmp(var, "syslang")) { + kos_syslang = value; + } else if (!strcmp(var, "keyboard")) { + kos_keyboard = value; + } else if (!strcmp(var, "keyboard_mode")) { + kos_keyboard_mode = value; } else { - printf("bad option: %s\n", argv[0]); - puts(usage); - exit(1); + fprintf(fout, "bad option: %s\n", argv[1]); + fputs(usage, fout); + return; } } static void shell_new_sys_thread(int argc, char **argv) { +// FIXME const char *usage = \ - "usage: new_sys_thread"; + "usage: new_sys_thread\n"; if (!argc) { fputs(usage, fout); return; @@ -767,7 +875,7 @@ static void shell_process_info(int argc, char **argv) { const char *usage = \ "usage: process_info \n" - " pid process id to dump, -1 for self"; + " pid process id to dump, -1 for self\n"; if (argc != 2) { fputs(usage, fout); return; @@ -812,7 +920,7 @@ shell_display_number(int argc, char **argv) { " font 0 = 6x9, 1 = 8x16\n" " draw_to_buf 0/1\n" " scale_factor 0 = x1, ..., 7 = x8\n" - " bg_color_or_buf depending on flags fill_bg and draw_to_buf"; + " bg_color_or_buf depending on flags fill_bg and draw_to_buf\n"; if (argc != 15) { fputs(usage, fout); return; @@ -849,7 +957,7 @@ shell_set_window_colors(int argc, char **argv) { "usage: set_window_colors " " " " \n" - " * all colors are in hex"; + " * all colors are in hex\n"; if (argc != (1 + sizeof(system_colors_t)/4)) { fputs(usage, fout); return; @@ -873,7 +981,7 @@ shell_set_window_colors(int argc, char **argv) { static void shell_get_window_colors(int argc, char **argv) { const char *usage = \ - "usage: get_window_colors"; + "usage: get_window_colors\n"; if (argc != 1) { fputs(usage, fout); return; @@ -900,7 +1008,7 @@ shell_get_window_colors(int argc, char **argv) { static void shell_get_skin_height(int argc, char **argv) { const char *usage = \ - "usage: get_skin_height"; + "usage: get_skin_height\n"; if (argc != 1) { fputs(usage, fout); return; @@ -915,7 +1023,7 @@ shell_get_skin_height(int argc, char **argv) { static void shell_get_screen_area(int argc, char **argv) { const char *usage = \ - "usage: get_screen_area"; + "usage: get_screen_area\n"; if (argc != 1) { fputs(usage, fout); return; @@ -938,7 +1046,7 @@ shell_set_screen_area(int argc, char **argv) { " left left x coord\n" " top top y coord\n" " right right x coord (not length!)\n" - " bottom bottom y coord"; + " bottom bottom y coord\n"; if (argc != 5) { fputs(usage, fout); return; @@ -956,7 +1064,7 @@ shell_set_screen_area(int argc, char **argv) { static void shell_get_skin_margins(int argc, char **argv) { const char *usage = \ - "usage: get_skin_margins"; + "usage: get_skin_margins\n"; if (argc != 1) { fputs(usage, fout); return; @@ -976,7 +1084,7 @@ static void shell_set_button_style(int argc, char **argv) { const char *usage = \ "usage: set_button_style