#define VIDEO_ROM_SIZE 0x1000
uint8_t video_rom[VIDEO_ROM_SIZE];
-#define CD_ROM_SIZE 0x2000
-uint8_t cd_rom[CD_ROM_SIZE];
-
-#define EF_ROM_SIZE 0x2000
-uint8_t ef_rom[EF_ROM_SIZE];
-#define MEM_SIZE 0x20000
+#define MEM_SIZE 0x24000
#else
-#define F8_ROM_SIZE 0x800
-uint8_t f8_rom[F8_ROM_SIZE];
-
#define CG_ROM_SIZE 0x800
uint8_t cg_rom[CG_ROM_SIZE];
-#define MEM_SIZE 0x10000
+#define MEM_SIZE 0x14000
#endif
uint8_t mem[MEM_SIZE];
}
}
-#if APPLE_IIE
uint8_t mem_read(uint16_t addr0, bool isDbg) {
int addr = addr0;
-#else
-uint8_t mem_read(uint16_t addr, bool isDbg) {
-#endif
if ((addr & 0xff00) != IO_PAGE) {
#if APPLE_IIE
if (addr < 0x200) {
else if (c00x_soft_switches & C00X_SOFT_SWITCH_RDCARDRAM)
addr |= 0x10000;
}
- else if (addr < 0xd000)
- return cd_rom[addr & 0x1fff];
else if (
- (lc_state & LC_SELECT) == LC_SELECT_ROM_WE ||
+ addr < 0xd000 ||
+ (lc_state & LC_SELECT) == LC_SELECT_ROM_WE ||
(lc_state & LC_SELECT) == LC_SELECT_ROM_WP
)
- return (addr < 0xe000 ? cd_rom : ef_rom)[addr & 0x1fff];
+ addr += 0x20000 - 0xc000;
+ else {
+ if (addr < 0xe000 && (lc_state & LC_BANK) == LC_BANK2)
+ addr -= 0x1000;
+ if (c00x_soft_switches & C00X_SOFT_SWITCH_RDCARDRAM)
+ addr |= 0x10000;
+ }
#else
if (addr < 0xc000)
;
- else if (addr < 0xd000)
- return 0xff; // unimplemented ROM for now
else if (
- (lc_state & LC_SELECT) == LC_SELECT_ROM_WE ||
+ addr < 0xd000 ||
+ (lc_state & LC_SELECT) == LC_SELECT_ROM_WE ||
(lc_state & LC_SELECT) == LC_SELECT_ROM_WP
)
- return addr < 0xf800 ? 0xff : f8_rom[addr & 0x7ff];
-#endif
+ addr += 0x10000 - 0xc000;
else if (addr < 0xe000 && (lc_state & LC_BANK) == LC_BANK2)
addr -= 0x1000;
+#endif
#if 0 // breakpoint
//if (addr >= 0x8c08 && addr < 0x8e00) { // data fetch
#if MEM_TRACE
{
- int pc = vrEmu6502GetPC(cpu);
+ int pc = cpu ? vrEmu6502GetPC(cpu) : 0;
fprintf(stderr, "pc=%04x addr=%05x rd=%02x\n", pc, addr, mem[addr]);
}
#endif
case IO_CLRAN3 : // 0xc05f
c05x_soft_switches |= 1 << ((addr >> 1) & 7);
break;
+ case IO_PB0:
+ case IO_PB1:
+ return 0; // needed for proper boot with IIe ROM
case IO_LC_BANK2_RAM_WP: // 0xc080
case IO_LC_BANK2_ROM_WE: // 0xc081
case IO_LC_BANK2_ROM_WP: // 0xc082
return 0xff;
}
-#if APPLE_IIE
void mem_write(uint16_t addr0, uint8_t val) {
int addr = addr0;
-#else
-void mem_write(uint16_t addr, uint8_t val) {
-#endif
#if 0 // vectors
if (addr >= 4 && addr < 0x80) {
int pc = vrEmu6502GetPC(cpu);
else if (c00x_soft_switches & C00X_SOFT_SWITCH_WRCARDRAM)
addr |= 0x10000;
}
+ else if (
+ addr < 0xd000 ||
+ (lc_state & LC_SELECT) == LC_SELECT_RAM_WP ||
+ (lc_state & LC_SELECT) == LC_SELECT_ROM_WP
+ ) {
+#if MEM_TRACE
+ int pc = cpu ? vrEmu6502GetPC(cpu): 0;
+ addr += 0x20000 - 0xc000;
+ fprintf(stderr, "pc=%04x addr=%05x wr=%02x (nop)\n", pc, addr, mem[addr]);
+#endif
+ return;
+ }
+ else {
+ if (addr < 0xe000 && (lc_state & LC_BANK) == LC_BANK2)
+ addr -= 0x1000;
+ if (c00x_soft_switches & C00X_SOFT_SWITCH_WRCARDRAM)
+ addr |= 0x10000;
+ }
#else
if (addr < 0xc000)
;
-#endif
- else if (addr < 0xd000)
- return; // writing to ROM -- no-op
else if (
- (lc_state & LC_SELECT) == LC_SELECT_RAM_WP ||
+ addr < 0xd000 ||
+ (lc_state & LC_SELECT) == LC_SELECT_RAM_WP ||
(lc_state & LC_SELECT) == LC_SELECT_ROM_WP
- )
- return; // write protected RAM -- no-op
+ ) {
+#if MEM_TRACE
+ int pc = cpu ? vrEmu6502GetPC(cpu) : 0;
+ addr += 0x10000 - 0xc000;
+ fprintf(stderr, "pc=%04x addr=%05x wr=%02x (nop)\n", pc, addr, mem[addr]);
+#endif
+ }
else if (addr < 0xe000 && (lc_state & LC_BANK) == LC_BANK2)
addr -= 0x1000;
+#endif
mem[addr] = val;
#if MEM_TRACE
{
- int pc = vrEmu6502GetPC(cpu);
+ int pc = cpu ? vrEmu6502GetPC(cpu) : 0;
fprintf(stderr, "pc=%04x addr=%05x wr=%02x\n", pc, addr, mem[addr]);
}
#endif
"Apple IIe EF Enhanced - 342-0303-A - 2764.bin";
bool timing = false;
while (argn < argc) {
+ if (strcmp(argv[argn], "--help") == 0) {
+ printf("usage: %s [--video_rom=file.bin] [--cd_rom=file.bin] [--ef_rom=file.bin] [--timing] [program.obj[,aNNNN] ...] [-- child_executable [child_argument ...]]\n", argv[0]);
+ exit(EXIT_FAILURE);
+ }
if (memcmp(argv[argn], "--video_rom=", 12) == 0)
video_rom_file = argv[argn] + 12;
else if (memcmp(argv[argn], "--cd_rom=", 9) == 0)
++argn;
}
- if (argn >= argc) {
- printf("usage: %s [--video_rom=file.bin] [--cd_rom=file.bin] [--ef_rom=file.bin] [--timing] [utility.obj[,aNNNN] ...] program.obj[,aNNNN] [-- child_executable [child_argument ...]]\n", argv[0]);
- exit(EXIT_FAILURE);
- }
-
rom_load(video_rom_file, video_rom, VIDEO_ROM_SIZE);
- rom_load(cd_rom_file, cd_rom, CD_ROM_SIZE);
- rom_load(ef_rom_file, ef_rom, EF_ROM_SIZE);
+
+ rom_load(cd_rom_file, mem + 0x20000, 0x2000);
+ rom_load(ef_rom_file, mem + 0x22000, 0x2000);
#else
char *cg_rom_file =
"Apple II+ - 7341-0036 - Character Generator Rev7+ - 2716.bin";
+ char *d0_rom_file =
+ "Apple II+ - 341-0011 - Applesoft BASIC D000 - 2716.bin";
+ char *d8_rom_file =
+ "Apple II+ - 341-0012 - Applesoft BASIC D800 - 2716.bin";
+ char *e0_rom_file =
+ "Apple II+ - 341-0013 - Applesoft BASIC E000 - 2716.bin";
+ char *e8_rom_file =
+ "Apple II+ - 341-0014 - Applesoft BASIC E800 - 2716.bin";
+ char *f0_rom_file =
+ "Apple II+ - 341-0015 - Applesoft BASIC F000 - 2716.bin";
char *f8_rom_file =
"Apple II+ - 341-0020 - Applesoft BASIC Autostart Monitor F800 - 2716.bin";
bool timing = false;
while (argn < argc) {
+ if (strcmp(argv[argn], "--help") == 0) {
+ printf("usage: %s [--cg_rom=file.bin] [--d0_rom=file.bin] [--d8_rom=file.bin] [--e0_rom=file.bin] [--e8_rom=file.bin] [--f0_rom=file.bin] [--f8_rom=file.bin] [--timing] [program.obj[,aNNNN] ...] [-- child_executable [child_argument ...]]\n", argv[0]);
+ exit(EXIT_FAILURE);
+ }
if (memcmp(argv[argn], "--cg_rom=", 9) == 0)
cg_rom_file = argv[argn] + 9;
+ else if (memcmp(argv[argn], "--d0_rom=", 9) == 0)
+ d0_rom_file = argv[argn] + 9;
+ else if (memcmp(argv[argn], "--d8_rom=", 9) == 0)
+ d8_rom_file = argv[argn] + 9;
+ else if (memcmp(argv[argn], "--e0_rom=", 9) == 0)
+ e0_rom_file = argv[argn] + 9;
+ else if (memcmp(argv[argn], "--e8_rom=", 9) == 0)
+ e8_rom_file = argv[argn] + 9;
+ else if (memcmp(argv[argn], "--f0_rom=", 9) == 0)
+ f0_rom_file = argv[argn] + 9;
else if (memcmp(argv[argn], "--f8_rom=", 9) == 0)
f8_rom_file = argv[argn] + 9;
else if (strcmp(argv[argn], "--timing") == 0)
++argn;
}
- if (argn >= argc) {
- printf("usage: %s [--cg_rom=file.bin] [--f8_rom=file.bin] [--timing] [utility.obj[,aNNNN] ...] program.obj[,aNNNN] [-- child_executable [child_argument ...]]\n", argv[0]);
- exit(EXIT_FAILURE);
- }
-
rom_load(cg_rom_file, cg_rom, CG_ROM_SIZE);
- rom_load(f8_rom_file, f8_rom, F8_ROM_SIZE);
+
+ memset(mem + 0x10000, 0xff, 0x1000);
+ rom_load(d0_rom_file, mem + 0x11000, 0x800);
+ rom_load(d8_rom_file, mem + 0x11800, 0x800);
+ rom_load(e0_rom_file, mem + 0x12000, 0x800);
+ rom_load(e8_rom_file, mem + 0x12800, 0x800);
+ rom_load(f0_rom_file, mem + 0x13000, 0x800);
+ rom_load(f8_rom_file, mem + 0x13800, 0x800);
#endif
int load_address = -1;
// do this before creating the CPU
if (load_address != -1) {
#if APPLE_IIE
- ef_rom[RESET_VECTOR & 0x1fff] = (uint8_t)(load_address & 0xff);
- ef_rom[(RESET_VECTOR + 1) & 0x1fff] = (uint8_t)(load_address >> 8);
+ mem[RESET_VECTOR + 0x20000 - 0xc000] = (uint8_t)(load_address & 0xff);
+ mem[RESET_VECTOR + 1 + 0x20000 - 0xc000] = (uint8_t)(load_address >> 8);
#else
- f8_rom[RESET_VECTOR & 0x7ff] = (uint8_t)(load_address & 0xff);
- f8_rom[(RESET_VECTOR + 1) & 0x7ff] = (uint8_t)(load_address >> 8);
+ mem[RESET_VECTOR + 0x10000 - 0xc000] = (uint8_t)(load_address & 0xff);
+ mem[RESET_VECTOR + 1 + 0x10000 - 0xc000] = (uint8_t)(load_address >> 8);
#endif
}
// while GAME OVER is displayed, try without it
//key_waiting = 0x92; // ctrl-r
break;
-#endif
case 'b':
case 'B':
// full bomb
mem[0xbc] = 4;
mem[0xbd] = 0;
break;
+#endif
default:
key_waiting = i | 0x80;
break;
if (c05x_soft_switches & C05X_SOFT_SWITCH_HIRES) {
// hires
+#if APPLE_IIE
int line = (
(c05x_soft_switches & C05X_SOFT_SWITCH_PAGE2) &&
(c00x_soft_switches & C00X_SOFT_SWITCH_80COL) == 0 ?
APPLE_HIRES2 :
APPLE_HIRES1
) | base | (row << 10);
+#else
+ int line = (
+ (c05x_soft_switches & C05X_SOFT_SWITCH_PAGE2) ?
+ APPLE_HIRES2 :
+ APPLE_HIRES1
+ ) | base | (row << 10);
+#endif
#if APPLE_IIE
if (c00x_soft_switches & C00X_SOFT_SWITCH_80VID) {
// dhgr -- no support for SETDHIRES soft switch yet
}
}
else {
- // text or gr (only text for now; MSB first)
+ // text or gr (only text for now)
+#if APPLE_IIE
int line = (
(c05x_soft_switches & C05X_SOFT_SWITCH_PAGE2) &&
(c00x_soft_switches & C00X_SOFT_SWITCH_80COL) == 0 ?
APPLE_TEXT2 :
APPLE_TEXT1
) | base;
+#else
+ int line = (
+ (c05x_soft_switches & C05X_SOFT_SWITCH_PAGE2) ?
+ APPLE_TEXT2 :
+ APPLE_TEXT1
+ ) | base;
+#endif
for (int j = 0; j < 40; ++j) {
-#if APPLE_IIE
+#if APPLE_IIE // inverted, LSB first
int data = video_rom[(mem[line + j] << 3) | row];
for (int k = 0; k < 7; ++k) {
- if (data & 1) {
+ if ((data & 1) == 0) {
int l = (j * 7 + k) << 1;
buf[l >> 5] |= 1 << (l & 0x1f);
++l;
}
data >>= 1;
}
-#else
+#else // MSB first
int data = cg_rom[(mem[line + j] << 3) | row];
for (int k = 0; k < 7; ++k) {
if (data & 0x40) {