In /emu_65c02, extend the mem[] array to include a read-only area for the ROMs (allow...
authorNick Downing <nick@ndcode.org>
Sat, 18 Jun 2022 16:52:59 +0000 (02:52 +1000)
committerNick Downing <nick@ndcode.org>
Sat, 18 Jun 2022 16:52:59 +0000 (02:52 +1000)
emu_65c02/Makefile
emu_65c02/emu_65c02.c
orig/Makefile

index adeaf29..7eaac48 100644 (file)
@@ -4,6 +4,11 @@ LDFLAGS=-g
 .PHONY: all
 all: \
 emu_65c02 \
+Apple\ II+\ -\ 341-0011\ -\ Applesoft\ BASIC\ D000\ -\ 2716.bin \
+Apple\ II+\ -\ 341-0012\ -\ Applesoft\ BASIC\ D800\ -\ 2716.bin \
+Apple\ II+\ -\ 341-0013\ -\ Applesoft\ BASIC\ E000\ -\ 2716.bin \
+Apple\ II+\ -\ 341-0014\ -\ Applesoft\ BASIC\ E800\ -\ 2716.bin \
+Apple\ II+\ -\ 341-0015\ -\ Applesoft\ BASIC\ F000\ -\ 2716.bin \
 Apple\ II+\ -\ 341-0020\ -\ Applesoft\ BASIC\ Autostart\ Monitor\ F800\ -\ 2716.bin \
 Apple\ II+\ -\ 7341-0036\ -\ Character\ Generator\ Rev7+\ -\ 2716.bin \
 Apple\ IIe\ CD\ Enhanced\ -\ 342-0304-A\ -\ 2764.bin \
@@ -13,6 +18,36 @@ Apple\ IIe\ Video\ Enhanced\ -\ 342-0265-A\ -\ 2732.bin
 emu_65c02: emu_65c02.o stty_sane.o vrEmu6502/src/vrEmu6502.o
        ${CC} ${LDFLAGS} -o $@ $^ -lSDL2
 
+Apple\ II+\ -\ 341-0011\ -\ Applesoft\ BASIC\ D000\ -\ 2716.bin: \
+../orig/APPLE\ Computer\ and\ Peripheral\ Card\ Roms\ Collection.zip
+       rm -f "$@"
+       unzip "$<" "$@"
+       touch "$@"
+
+Apple\ II+\ -\ 341-0012\ -\ Applesoft\ BASIC\ D800\ -\ 2716.bin: \
+../orig/APPLE\ Computer\ and\ Peripheral\ Card\ Roms\ Collection.zip
+       rm -f "$@"
+       unzip "$<" "$@"
+       touch "$@"
+
+Apple\ II+\ -\ 341-0013\ -\ Applesoft\ BASIC\ E000\ -\ 2716.bin: \
+../orig/APPLE\ Computer\ and\ Peripheral\ Card\ Roms\ Collection.zip
+       rm -f "$@"
+       unzip "$<" "$@"
+       touch "$@"
+
+Apple\ II+\ -\ 341-0014\ -\ Applesoft\ BASIC\ E800\ -\ 2716.bin: \
+../orig/APPLE\ Computer\ and\ Peripheral\ Card\ Roms\ Collection.zip
+       rm -f "$@"
+       unzip "$<" "$@"
+       touch "$@"
+
+Apple\ II+\ -\ 341-0015\ -\ Applesoft\ BASIC\ F000\ -\ 2716.bin: \
+../orig/APPLE\ Computer\ and\ Peripheral\ Card\ Roms\ Collection.zip
+       rm -f "$@"
+       unzip "$<" "$@"
+       touch "$@"
+
 Apple\ II+\ -\ 341-0020\ -\ Applesoft\ BASIC\ Autostart\ Monitor\ F800\ -\ 2716.bin: \
 ../orig/APPLE\ Computer\ and\ Peripheral\ Card\ Roms\ Collection.zip
        rm -f "$@"
@@ -49,9 +84,4 @@ clean:
 *.bin \
 *.o \
 emu_65c02 \
-vrEmu6502/src/*.o \
-Apple\ II+\ -\ 341-0020\ -\ Applesoft\ BASIC\ Autostart\ Monitor\ F800\ -\ 2716.bin \
-Apple\ II+\ -\ 7341-0036\ -\ Character\ Generator\ Rev7+\ -\ 2716.bin \
-Apple\ IIe\ CD\ Enhanced\ -\ 342-0304-A\ -\ 2764.bin \
-Apple\ IIe\ EF\ Enhanced\ -\ 342-0303-A\ -\ 2764.bin \
-Apple\ IIe\ Video\ Enhanced\ -\ 342-0265-A\ -\ 2732.bin
+vrEmu6502/src/*.o
index 6e2f19a..36f3e9d 100644 (file)
@@ -152,20 +152,12 @@ VrEmu6502 *cpu;
 #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];
 
@@ -315,12 +307,8 @@ void dos(char *line) {
   }
 }
 
-#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) {
@@ -345,26 +333,30 @@ uint8_t mem_read(uint16_t addr, bool isDbg) {
       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
@@ -568,7 +560,7 @@ uint8_t mem_read(uint16_t addr, bool isDbg) {
 
 #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
@@ -625,6 +617,9 @@ uint8_t mem_read(uint16_t addr, bool isDbg) {
   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
@@ -684,12 +679,8 @@ uint8_t mem_read(uint16_t addr, bool isDbg) {
   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);
@@ -724,23 +715,45 @@ void mem_write(uint16_t addr, uint8_t val) {
       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
@@ -906,6 +919,10 @@ int main(int argc, char **argv) {
     "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)
@@ -919,23 +936,43 @@ int main(int argc, char **argv) {
     ++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)
@@ -945,13 +982,15 @@ int main(int argc, char **argv) {
     ++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;
@@ -965,11 +1004,11 @@ int main(int argc, char **argv) {
   // 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
   }
 
@@ -1235,7 +1274,6 @@ int main(int argc, char **argv) {
             // while GAME OVER is displayed, try without it
             //key_waiting = 0x92; // ctrl-r
             break;
-#endif
           case 'b':
           case 'B':
             // full bomb
@@ -1266,6 +1304,7 @@ int main(int argc, char **argv) {
             mem[0xbc] = 4;
             mem[0xbd] = 0;
             break;
+#endif
           default: 
             key_waiting = i | 0x80;
             break;
@@ -1287,12 +1326,20 @@ int main(int argc, char **argv) {
 
       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
@@ -1332,18 +1379,26 @@ int main(int argc, char **argv) {
         }
       }
       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;
@@ -1351,7 +1406,7 @@ int main(int argc, char **argv) {
             }
             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) {
index 217602e..efe8bc2 100644 (file)
@@ -4,6 +4,11 @@ APPLE\ Computer\ and\ Peripheral\ Card\ Roms\ Collection.zip \
 Apple_DOS_v3.3_1980_Apple.do \
 Star_Blazer_1981_Star_Craft.do
 
+# Apple II+ - 341-0011 - Applesoft BASIC D000 - 2716.bin  
+# Apple II+ - 341-0012 - Applesoft BASIC D800 - 2716.bin  
+# Apple II+ - 341-0013 - Applesoft BASIC E000 - 2716.bin  
+# Apple II+ - 341-0014 - Applesoft BASIC E800 - 2716.bin  
+# Apple II+ - 341-0015 - Applesoft BASIC F000 - 2716.bin  
 # Apple II+ - 341-0020 - Applesoft BASIC Autostart Monitor F800 - 2716.bin
 # Apple II+ - 7341-0036 - Character Generator Rev7+ - 2716.bin
 # Apple IIe CD Enhanced - 342-0304-A - 2764.bin