diff --git a/6502-emu.c b/6502-emu.c index b9f2972..805ff4e 100644 --- a/6502-emu.c +++ b/6502-emu.c @@ -63,7 +63,7 @@ int hextoint(char *str) { int main(int argc, char *argv[]) { - int a, x, y, sp, sr, pc; + int a, x, y, sp, sr, pc, load_addr; int verbose, interactive, mem_dump; long cycles; int opt; @@ -72,13 +72,14 @@ int main(int argc, char *argv[]) interactive = 0; mem_dump = 0; cycles = 0; + load_addr = 0xC000; a = 0; x = 0; y = 0; sp = 0; sr = 0; pc = -RST_VEC; // negative implies indirect - while ((opt = getopt(argc, argv, "vima:x:y:r:p:s:g:c:")) != -1) { + while ((opt = getopt(argc, argv, "vima:x:y:r:p:s:g:c:l:")) != -1) { switch (opt) { case 'v': verbose = 1; @@ -111,6 +112,9 @@ int main(int argc, char *argv[]) case 'c': cycles = atol(optarg); break; + case 'l': + load_addr = hextoint(optarg); + break; default: /* '?' */ fprintf(stderr, "Usage: %s [-v] [-i] [-a HEX] [-x HEX] [-y HEX] [-s HEX] [-p HEX] [-g|-r ADDR] file.rom\nThe first 16k of \"file.rom\" is loaded into the last 16k of memory.\n", argv[0]); @@ -122,7 +126,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "Expected argument after options\n"); exit(EXIT_FAILURE); } - if (load_rom(argv[optind]) != 0) { + if (load_rom(argv[optind], load_addr) != 0) { printf("Error loading \"%s\".\n", argv[optind]); return EXIT_FAILURE; } diff --git a/6502.c b/6502.c index 49da8e3..c8deacc 100644 --- a/6502.c +++ b/6502.c @@ -925,8 +925,10 @@ void reset_cpu(int _a, int _x, int _y, int _sp, int _sr, int _pc) total_cycles = 0; } -int load_rom(char * filename) -{ // TODO allow more flexible loading +int load_rom(char * filename, int load_addr) +{ + int loaded_size, max_size; + memset(memory, 0, sizeof(memory)); // clear ram first FILE * fp = fopen(filename, "r"); @@ -935,10 +937,9 @@ int load_rom(char * filename) return -1; } - if (!fread(&memory[0xC000], 0x4000, 1, fp)) { - printf("Error: ROM file too short.\n"); - return -1; - } + max_size = 0x10000 - load_addr; + loaded_size = (int)fread(&memory[load_addr], 1, (size_t)max_size, fp); + fprintf(stderr, "Loaded $%04x bytes: $%04x - $%04x\n", loaded_size, load_addr, load_addr + loaded_size - 1); fclose(fp); return 0; diff --git a/6502.h b/6502.h index f460054..e865a36 100644 --- a/6502.h +++ b/6502.h @@ -70,7 +70,7 @@ void init_tables(); void reset_cpu(int _a, int _x, int _y, int _sp, int _sr, int _pc); -int load_rom(char * filename); +int load_rom(char * filename, int load_addr); int step_cpu(int verbose);