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 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;
|
int verbose, interactive, mem_dump;
|
||||||
long cycles;
|
long cycles;
|
||||||
int opt;
|
int opt;
|
||||||
|
@ -72,13 +72,14 @@ int main(int argc, char *argv[])
|
||||||
interactive = 0;
|
interactive = 0;
|
||||||
mem_dump = 0;
|
mem_dump = 0;
|
||||||
cycles = 0;
|
cycles = 0;
|
||||||
|
load_addr = 0xC000;
|
||||||
a = 0;
|
a = 0;
|
||||||
x = 0;
|
x = 0;
|
||||||
y = 0;
|
y = 0;
|
||||||
sp = 0;
|
sp = 0;
|
||||||
sr = 0;
|
sr = 0;
|
||||||
pc = -RST_VEC; // negative implies indirect
|
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) {
|
switch (opt) {
|
||||||
case 'v':
|
case 'v':
|
||||||
verbose = 1;
|
verbose = 1;
|
||||||
|
@ -111,6 +112,9 @@ int main(int argc, char *argv[])
|
||||||
case 'c':
|
case 'c':
|
||||||
cycles = atol(optarg);
|
cycles = atol(optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
load_addr = hextoint(optarg);
|
||||||
|
break;
|
||||||
default: /* '?' */
|
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",
|
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]);
|
argv[0]);
|
||||||
|
@ -122,7 +126,7 @@ int main(int argc, char *argv[])
|
||||||
fprintf(stderr, "Expected argument after options\n");
|
fprintf(stderr, "Expected argument after options\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
if (load_rom(argv[optind]) != 0) {
|
if (load_rom(argv[optind], load_addr) != 0) {
|
||||||
printf("Error loading \"%s\".\n", argv[optind]);
|
printf("Error loading \"%s\".\n", argv[optind]);
|
||||||
return EXIT_FAILURE;
|
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;
|
total_cycles = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_rom(char * filename)
|
int load_rom(char * filename, int load_addr)
|
||||||
{ // TODO allow more flexible loading
|
{
|
||||||
|
int loaded_size, max_size;
|
||||||
|
|
||||||
memset(memory, 0, sizeof(memory)); // clear ram first
|
memset(memory, 0, sizeof(memory)); // clear ram first
|
||||||
|
|
||||||
FILE * fp = fopen(filename, "r");
|
FILE * fp = fopen(filename, "r");
|
||||||
|
@ -935,10 +937,9 @@ int load_rom(char * filename)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fread(&memory[0xC000], 0x4000, 1, fp)) {
|
max_size = 0x10000 - load_addr;
|
||||||
printf("Error: ROM file too short.\n");
|
loaded_size = (int)fread(&memory[load_addr], 1, (size_t)max_size, fp);
|
||||||
return -1;
|
fprintf(stderr, "Loaded $%04x bytes: $%04x - $%04x\n", loaded_size, load_addr, load_addr + loaded_size - 1);
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
2
6502.h
2
6502.h
|
@ -70,7 +70,7 @@ void init_tables();
|
||||||
|
|
||||||
void reset_cpu(int _a, int _x, int _y, int _sp, int _sr, int _pc);
|
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);
|
int step_cpu(int verbose);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue