Added -l command line argument to specify load address

This commit is contained in:
Rob McMullen 2017-12-19 11:44:17 -08:00
parent aa189bc44a
commit 138531960f
3 changed files with 15 additions and 10 deletions

View File

@ -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
View File

@ -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;

2
6502.h
View File

@ -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);