X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=vm-dcpu16.c;h=df86455070e7c91b008456579eeb2360b0425959;hb=df965ac8eeee9115d8f8c7e35e8a470b315d3fb4;hp=522682a6732e871ff50157323a227b85e619e76e;hpb=395837ab88bd03a3dca10338b4cb0d53b4fa9587;p=dcpu16 diff --git a/vm-dcpu16.c b/vm-dcpu16.c index 522682a..df86455 100644 --- a/vm-dcpu16.c +++ b/vm-dcpu16.c @@ -43,7 +43,8 @@ void sigint_handler_(int sig) { #define VERBOSE_PRINTF(...) do { if (opt_.verbose) printf(__VA_ARGS__); } while (0) -static void usage_(char *prog, unsigned int full) { +static +void usage_(char *prog, unsigned int full) { FILE *f = full ? stdout : stderr; char *x = strrchr(prog, '/'); @@ -130,13 +131,17 @@ int buf_tok_vect_(char ***v, int *c, char *buf) { return 0; } -/* resets the instance and loads an image into ram starting at addr */ +/* + resets the vm if addr is zero then + loads an image from filename into ram starting at addr +*/ static int file_load_(struct dcpu16 *vm, char *filename, DCPU16_WORD addr) { FILE *f; size_t r; - dcpu16_reset(vm); + if (!addr) + dcpu16_reset(vm); f = fopen(filename, "rb"); if (f == NULL) { @@ -196,6 +201,21 @@ COMMAND_HELP(quit) { } +COMMAND_IMPL(reset) { + (void)arg_count, (void)arg_vector; + + dcpu16_reset(vm); + printf("initialized\n"); + return 0; +} +COMMAND_HELP(reset) { + fprintf(f, "\treset\n"); + if (summary) return; + + fprintf(f, "Clears and reinitializes emulator.\n"); +} + + COMMAND_IMPL(load) { int addr = 0; @@ -230,8 +250,8 @@ COMMAND_IMPL(dump) { int i; for (i = 1; i < arg_count; i++) { - addr[i] = str_to_word_(arg_vector[i]); - if (addr[i] < 0) { + addr[i-1] = str_to_word_(arg_vector[i]); + if (addr[i-1] < 0) { fprintf(stderr, "address '%s' is not a valid word: %s\n", arg_vector[i], strerror(errno)); return 0; } @@ -261,8 +281,8 @@ COMMAND_IMPL(disassemble) { int i; for (i = 1; i < arg_count; i++) { - addr[i] = str_to_word_(arg_vector[i]); - if (addr[i] < 0) { + addr[i-1] = str_to_word_(arg_vector[i]); + if (addr[i-1] < 0) { fprintf(stderr, "address '%s' is not a valid word: %s\n", arg_vector[i], strerror(errno)); return 0; } @@ -275,8 +295,11 @@ COMMAND_IMPL(disassemble) { return 0; } - for (i = addr[0]; i <= addr[1]; i++) - dcpu16_disassemble_print(vm, i), printf("\n"); + for (i = addr[0]; i <= addr[1]; /* */ ) { + printf("0x%04x: ", i); + i += dcpu16_disassemble_print(vm, i); + printf("\n"); + } return 0; } @@ -376,6 +399,7 @@ static struct command_ command_table_[] = { COMMAND_ENTRY(disassemble, 0, 2), COMMAND_ENTRY(step, 0, 1), COMMAND_ENTRY(run, 0, 0), + COMMAND_ENTRY(reset, 0, 0), { NULL, 0, 0, NULL, NULL } };