From 0c5d5e4b1bce7f285face506d8884477fe3f7036 Mon Sep 17 00:00:00 2001 From: inixyz Date: Thu, 12 Oct 2023 23:57:38 +0300 Subject: [PATCH] command line arguments --- src/main.c | 57 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/src/main.c b/src/main.c index 370e83f..e5b412a 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "tinyriscv.h" void regdump(const trv_cpu* cpu){ @@ -17,48 +18,60 @@ void help(void){ printf(" --help Display this information.\n"); printf(" --bin Load into memory.\n"); printf(" --mem_size Set memory to have bytes.\n"); + printf(" --regdump Dump registers at execution halt.\n"); exit(0); } int main(int argc, char** argv){ - + char file_path[256] = ""; size_t mem_size = 4096; + unsigned int do_regdump = 0; - for(unsigned int i = 0; i < argc; i++){ - if(!strcmp(argv[i], "--help")) help(); - - else if(!strcmp(argv[i], "--mem_size")){ - if(!argv[i + 1]){ - printf("") - } - } mem_size = atoi(argv[i + 1]); - } - + //command line arguments if(argc < 2){ - //printf("USAGE: tinyricv \n"); - exit(0); + printf("Not enough arguments.\n"); + help(); } - - FILE* file = fopen(argv[1], "rb"); - if(!file){ - perror("ERROR: Can't open file: "); - exit(-1); + for(unsigned int i = 1; i < argc; i++){ + if(!strcmp(argv[i], "--help")) help(); + else if(!strcmp(argv[i], "--bin")){ + assert("Invalid file path." && argv[i + 1]); + strncpy(file_path, argv[i++ + 1], 256); + } + else if(!strcmp(argv[i], "--mem_size")){ + assert("Invalid [mem_size] value." && argv[i + 1]); + mem_size = atoi(argv[i++ + 1]); + } + else if(!strcmp(argv[i], "--regdump")) do_regdump = 1; + else{ + printf("Invalid argument: %s\n", argv[i]); + help(); + } } trv_cpu cpu; - cpu.mem = malloc(4096); + cpu.mem = malloc(mem_size); + //file handling + FILE* file = fopen(file_path, "rb"); + if(!file){ + perror("ERROR: Can't open file"); + exit(-1); + } + + //load program into memory fseek(file, 0, SEEK_END); - unsigned int file_size = ftell(file); + const unsigned int file_size = ftell(file); rewind(file); fread(cpu.mem, 1, file_size, file); fclose(file); + //program execution trv_init(&cpu); - while(cpu.pc < file_size + trv_MEM_OFFSET) trv_step(&cpu); - regdump(&cpu); + //cleanup + if(do_regdump) regdump(&cpu); free(cpu.mem); } \ No newline at end of file