From 91bfa94b365adc2244c68d7a8bfbfadd1c654585 Mon Sep 17 00:00:00 2001 From: Stefan Arentz Date: Wed, 16 Nov 2016 19:06:14 -0500 Subject: [PATCH] Fixes #20 - Introduce machine profiles --- ewm.c | 118 +++++++++++++++++++++++++++++++++++----- roms/a2p.rom | Bin 0 -> 12288 bytes roms/applesoft-lite.bin | Bin 0 -> 8192 bytes roms/krusader.rom | Bin 0 -> 8192 bytes 4 files changed, 104 insertions(+), 14 deletions(-) create mode 100644 roms/a2p.rom create mode 100644 roms/applesoft-lite.bin create mode 100755 roms/krusader.rom diff --git a/ewm.c b/ewm.c index 3727096..759ee98 100644 --- a/ewm.c +++ b/ewm.c @@ -23,12 +23,14 @@ #include #include #include +#include +#include #include "cpu.h" #include "mem.h" #include "pia.h" -static uint8_t monitor[256] = { +static uint8_t woz_monitor[256] = { 0xD8, 0x58, 0xA0, 0x7F, 0x8C, 0x12, 0xD0, 0xA9, 0xA7, 0x8D, 0x11, 0xD0, 0x8D, 0x13, 0xD0, 0xC9, 0xDF, 0xF0, 0x13, 0xC9, 0x9B, 0xF0, 0x03, 0xC8, @@ -63,18 +65,106 @@ static uint8_t monitor[256] = { 0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, 0x00, 0x00 }; -int main(int argc, char **argv) { - struct pia_t pia; - pia_init(&pia); - pia_trace(&pia, 0); +// Apple 1 / 8K RAM / WOZ Monitor - struct cpu_t cpu; - cpu_init(&cpu); - cpu_add_ram(&cpu, 0x0000, 0x4000); - cpu_add_rom(&cpu, 0xff00, 0x0100, monitor); - cpu_add_iom(&cpu, 0xd000, 0x1000, &pia, pia_read, pia_write); - cpu_trace(&cpu, 0); - cpu_boot(&cpu); - - return 0; +static int setup_apple1(struct cpu_t *cpu) { + struct pia_t *pia = malloc(sizeof(struct pia_t)); + pia_init(pia); + pia_trace(pia, 0); + cpu_add_ram(cpu, 0x0000, 8 * 1024); + cpu_add_rom_data(cpu, 0xff00, 0x0100, woz_monitor); + cpu_add_iom(cpu, EWM_A1_PIA6820_ADDR, EWM_A1_PIA6820_LENGTH, pia, pia_read, pia_write); + return 0; +} + +// Replica 1 / 32K RAM / Krusader Assembler & Monitor + +static int setup_replica1(struct cpu_t *cpu) { + struct pia_t *pia = malloc(sizeof(struct pia_t)); + pia_init(pia); + pia_trace(pia, 0); + cpu_add_ram(cpu, 0x0000, 32 * 1024); + cpu_add_rom_file(cpu, 0xe000, "roms/krusader.rom"); + cpu_add_iom(cpu, EWM_A1_PIA6820_ADDR, EWM_A1_PIA6820_LENGTH, pia, pia_read, pia_write); + return 0; +} + +// Apple ][+ / 48K RAM / Original ROMs + +static int setup_apple2plus(struct cpu_t *cpu) { + cpu_add_ram(cpu, 0x0000, 48 * 1024); + cpu_add_rom_file(cpu, 0xd000, "roms/a2p.rom"); + return 0; +} + +// Machine Setup + +typedef int (*ewm_machine_setup_f)(struct cpu_t *cpu); + +struct ewm_machine_t { + char *name; + char *description; + ewm_machine_setup_f setup; +}; + +static struct ewm_machine_t machines[] = { + { "apple1", "Apple 1", setup_apple1 }, + { "replica1", "Replica 1", setup_replica1 }, + { "apple2plus", "Apple ][+", setup_apple2plus }, + { NULL, NULL, NULL } +}; + +static struct option options[] = { + { "machine", required_argument, NULL, 'm' }, + { NULL, 0, NULL, 0 } +}; + +static struct ewm_machine_t *machine_with_name(char *name) { + for (struct ewm_machine_t *m = machines; m->name != NULL; m++) { + if (strcmp(m->name, name) == 0) { + return m; + } + } + return NULL; +} + +int main(int argc, char **argv) { + struct ewm_machine_t *machine = NULL; + + char ch; + while ((ch = getopt_long(argc, argv, "m:", options, NULL)) != -1) { + switch (ch) { + case 'm': + machine = machine_with_name(optarg); + break; + } + } + + argc -= optind; + argv += optind; + + if (machine == NULL) { + fprintf(stderr, "Usage: ewm --machine apple1|replica1|apple2plus\n"); + exit(1); + } + + struct cpu_t cpu; + cpu_init(&cpu); + + (void) setup_replica1(&cpu); + + switch (cpu_boot(&cpu)) { + case EWM_CPU_ERR_UNIMPLEMENTED_INSTRUCTION: + fprintf(stderr, "CPU: Exited because of unimplemented instructions 0x%.2x at 0x%.4x\n", + mem_get_byte(&cpu, cpu.state.pc), cpu.state.pc); + break; + case EWM_CPU_ERR_STACK_OVERFLOW: + fprintf(stderr, "CPU: Exited because of stack overflow at 0x%.4x\n", cpu.state.pc); + break; + case EWM_CPU_ERR_STACK_UNDERFLOW: + fprintf(stderr, "CPU: Exited because of stack underflow at 0x%.4x\n", cpu.state.pc); + break; + } + + return 0; } diff --git a/roms/a2p.rom b/roms/a2p.rom new file mode 100644 index 0000000000000000000000000000000000000000..cb94b9f045b776a6529567d5178c3c8d26c4641f GIT binary patch literal 12288 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 Q-H8)#Xa+UQ@4OKHKm2p-{r~^~ literal 0 HcmV?d00001 diff --git a/roms/applesoft-lite.bin b/roms/applesoft-lite.bin new file mode 100644 index 0000000000000000000000000000000000000000..8ef1e59a5518006c3767b30ee45e7e4e87496072 GIT binary patch literal 8192 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