diff --git a/.gitignore b/.gitignore index cba7efc..bff5ad2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ a.out +out.bin diff --git a/ROM.bin b/ROM.bin new file mode 100644 index 0000000..df658f2 --- /dev/null +++ b/ROM.bin @@ -0,0 +1 @@ +trupi \ No newline at end of file diff --git a/example.bin b/example.bin new file mode 100644 index 0000000..2fac045 --- /dev/null +++ b/example.bin @@ -0,0 +1 @@ +zupa \ No newline at end of file diff --git a/main.c b/main.c index 4b389e2..ae12953 100644 --- a/main.c +++ b/main.c @@ -2,9 +2,26 @@ #include #include +long GetFileSize(FILE* f){ + fseek(f, 0, SEEK_END); + long size = ftell(f); + fseek(f, 0, SEEK_SET); + return size; +} + +void DumpMemory(char *memory, FILE *filename){ + FILE *dump = fopen(filename, "wb"); + fwrite(memory, 1, mem_size, dump); + fclose(dump); +} + int main(int argc, char **argv){ long mem_size = 0; + char filename[255]; + + FILE *rom = fopen("ROM.bin","rb"); + mem_size = mem_size + GetFileSize(rom); //Handling arguments if(argc < 2){ @@ -15,23 +32,57 @@ int main(int argc, char **argv){ if(strcmp(argv[i], "-m") == 0 || strcmp(argv[i], "--memory") == 0){ char *endptr; long convert = strtol(argv[i+1], &endptr, 10); - mem_size = &endptr != NULL ? convert : mem_size; + mem_size = &endptr != NULL ? mem_size + convert : mem_size; } if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0){ - printf("Usage: %s [OPTIONS] file\nOptions:\n%s-m, --memory: specify RAM size\n%s-h, --help: print this message\n\n",argv[0]," "," "); + printf("Usage: %s [OPTIONS] --file filename\nOptions:\n%s-m, --memory: specify RAM size\n%s-h, --help: print this message\n\n",argv[0]," "," "); return 0; } + if(strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "--file") == 0){ + for(int j = 0; j < strlen(argv[i+1]); j++){ + filename[j] = argv[i+1][j]; + } + } } + FILE *program = fopen(filename, "rb"); + if(program == NULL){ + printf("ERROR: file does not exist"); + return 2; + } + long program_size = GetFileSize(program); + mem_size = mem_size + program_size; + //Intializing memory and stuff long PC = 0; //program counter - char *mem_pointer = malloc(mem_size * sizeof(char)); //allocate RAM - if(mem_pointer == NULL){ + char *memory = (char *)malloc(mem_size * sizeof(char)); //Allocating RAM + if(memory == NULL){ printf("ERROR: Memory allocation failed (Buy more RAM)"); - return 2; + return 3; } + //Copying program to memory + { + char buffer[program_size]; + fread(buffer, 1, program_size, program); + for(int i = 0; i <= program_size; i++){ + memory[mem_size-i] = buffer[program_size-i]; + } + } + fclose(program); + //Copying ROM to memory + { + long size = GetFileSize(rom); + char buffer[size]; + fread(buffer, 1, size, rom); + for(int i = 0; i < size; i++){ + memory[mem_size-program_size-1-i] = buffer[size-i]; + } + } + fclose(rom); - free(mem_pointer); + DumpMemory(memory, "out.bin"); + + free(memory); return 0; }