Added -l command line argument to specify load address
This commit is contained in:
parent
aa189bc44a
commit
138531960f
10
6502-emu.c
10
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;
|
||||
}
|
||||
|
|
13
6502.c
13
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;
|
||||
|
|
Loading…
Reference in New Issue