]> git.sesse.net Git - pistorm/commitdiff
[WIP] PiSCSI boot ROM experiments
authorbeeanyew <beeanyew@gmail.com>
Fri, 29 Jan 2021 00:37:40 +0000 (01:37 +0100)
committerbeeanyew <beeanyew@gmail.com>
Fri, 29 Jan 2021 00:37:40 +0000 (01:37 +0100)
emulator.c
m68kcpu.c
platforms/amiga/amiga-autoconf.c
platforms/amiga/amiga-platform.c
platforms/amiga/piscsi/device_driver_amiga/makerom.c
platforms/amiga/piscsi/piscsi-enums.h
platforms/amiga/piscsi/piscsi.c
platforms/amiga/piscsi/piscsi.rom
platforms/amiga/rtg/rtg_driver_amiga/PiGFX.info [new file with mode: 0644]

index 845a80c8766d74015774716c4c0161d6ef5f8fc6..2fe20690e5c3e42fa454b7e93562011ed89379a4 100644 (file)
@@ -49,6 +49,7 @@ extern volatile unsigned int *gpio;
 extern volatile uint16_t srdata;
 extern uint8_t realtime_graphics_debug;
 uint8_t realtime_disassembly;
+uint32_t do_disasm = 0;
 
 char disasm_buf[4096];
 
@@ -61,6 +62,12 @@ int gayle_emulation_enabled = 1;
 int irq;
 int gayleirq;
 
+// Configurable emulator options
+unsigned int cpu_type = M68K_CPU_TYPE_68000;
+unsigned int loop_cycles = 300;
+struct emulator_config *cfg = NULL;
+char keyboard_file[256] = "/dev/input/event1";
+
 void *iplThread(void *args) {
   printf("IPL thread running\n");
 
@@ -86,12 +93,21 @@ void *iplThread(void *args) {
   return args;
 }
 
+void stop_cpu_emulation(uint8_t disasm_cur) {
+  m68k_end_timeslice();
+  if (disasm_cur) {
+    m68k_disassemble(disasm_buf, m68k_get_reg(NULL, M68K_REG_PC), cpu_type);
+    printf("REGA: 0:$%.8X 1:$%.8X 2:$%.8X 3:$%.8X 4:$%.8X 5:$%.8X 6:$%.8X 7:$%.8X\n", m68k_get_reg(NULL, M68K_REG_A0), m68k_get_reg(NULL, M68K_REG_A1), m68k_get_reg(NULL, M68K_REG_A2), m68k_get_reg(NULL, M68K_REG_A3), \
+            m68k_get_reg(NULL, M68K_REG_A4), m68k_get_reg(NULL, M68K_REG_A5), m68k_get_reg(NULL, M68K_REG_A6), m68k_get_reg(NULL, M68K_REG_A7));
+    printf("REGD: 0:$%.8X 1:$%.8X 2:$%.8X 3:$%.8X 4:$%.8X 5:$%.8X 6:$%.8X 7:$%.8X\n", m68k_get_reg(NULL, M68K_REG_D0), m68k_get_reg(NULL, M68K_REG_D1), m68k_get_reg(NULL, M68K_REG_D2), m68k_get_reg(NULL, M68K_REG_D3), \
+            m68k_get_reg(NULL, M68K_REG_D4), m68k_get_reg(NULL, M68K_REG_D5), m68k_get_reg(NULL, M68K_REG_D6), m68k_get_reg(NULL, M68K_REG_D7));
+    printf("%.8X (%.8X)]] %s\n", m68k_get_reg(NULL, M68K_REG_PC), (m68k_get_reg(NULL, M68K_REG_PC) & 0xFFFFFF), disasm_buf);
+    realtime_disassembly = 1;
+  }
 
-// Configurable emulator options
-unsigned int cpu_type = M68K_CPU_TYPE_68000;
-unsigned int loop_cycles = 300;
-struct emulator_config *cfg = NULL;
-char keyboard_file[256] = "/dev/input/event1";
+  cpu_emulation_running = 0;
+  do_disasm = 0;
+}
 
 //unsigned char g_kick[524288];
 //unsigned char g_ram[FASTSIZE + 1]; /* RAM */
@@ -239,20 +255,22 @@ int main(int argc, char *argv[]) {
       get_mouse_status(&mouse_dx, &mouse_dy, &mouse_buttons);
     }
 
-    if (cpu_emulation_running)
-      m68k_execute(loop_cycles);
-
-disasm_run:;
-    if (realtime_disassembly) {
-      m68k_execute(1);
+    if (realtime_disassembly && (do_disasm || cpu_emulation_running)) {
       m68k_disassemble(disasm_buf, m68k_get_reg(NULL, M68K_REG_PC), cpu_type);
-      /*printf("REGA: 0:$%.8X 1:$%.8X 2:$%.8X 3:$%.8X 4:$%.8X 5:$%.8X 6:$%.8X 7:$%.8X\n", m68k_get_reg(NULL, M68K_REG_A0), m68k_get_reg(NULL, M68K_REG_A1), m68k_get_reg(NULL, M68K_REG_A2), m68k_get_reg(NULL, M68K_REG_A3), \
+      printf("REGA: 0:$%.8X 1:$%.8X 2:$%.8X 3:$%.8X 4:$%.8X 5:$%.8X 6:$%.8X 7:$%.8X\n", m68k_get_reg(NULL, M68K_REG_A0), m68k_get_reg(NULL, M68K_REG_A1), m68k_get_reg(NULL, M68K_REG_A2), m68k_get_reg(NULL, M68K_REG_A3), \
               m68k_get_reg(NULL, M68K_REG_A4), m68k_get_reg(NULL, M68K_REG_A5), m68k_get_reg(NULL, M68K_REG_A6), m68k_get_reg(NULL, M68K_REG_A7));
       printf("REGD: 0:$%.8X 1:$%.8X 2:$%.8X 3:$%.8X 4:$%.8X 5:$%.8X 6:$%.8X 7:$%.8X\n", m68k_get_reg(NULL, M68K_REG_D0), m68k_get_reg(NULL, M68K_REG_D1), m68k_get_reg(NULL, M68K_REG_D2), m68k_get_reg(NULL, M68K_REG_D3), \
-              m68k_get_reg(NULL, M68K_REG_D4), m68k_get_reg(NULL, M68K_REG_D5), m68k_get_reg(NULL, M68K_REG_D6), m68k_get_reg(NULL, M68K_REG_D7));*/
+              m68k_get_reg(NULL, M68K_REG_D4), m68k_get_reg(NULL, M68K_REG_D5), m68k_get_reg(NULL, M68K_REG_D6), m68k_get_reg(NULL, M68K_REG_D7));
       printf("%.8X (%.8X)]] %s\n", m68k_get_reg(NULL, M68K_REG_PC), (m68k_get_reg(NULL, M68K_REG_PC) & 0xFFFFFF), disasm_buf);
+      if (do_disasm)
+        do_disasm--;
+      m68k_execute(1);
     }
-    
+    else {
+      if (cpu_emulation_running)
+        m68k_execute(loop_cycles);
+    }
+
     if (irq) {
       unsigned int status = read_reg();
       m68k_set_irq((status & 0xe000) >> 13);
@@ -323,14 +341,18 @@ disasm_run:;
         }
         if (c == 'd') {
           realtime_disassembly ^= 1;
+          do_disasm = 1;
           printf("Real time disassembly is now %s\n", realtime_disassembly ? "on" : "off");
         }
+        if (c == 's' && realtime_disassembly) {
+          do_disasm = 1;
+        }
+        if (c == 'S' && realtime_disassembly) {
+          do_disasm = 128;
+        }
       }
     }
 
-    if (realtime_disassembly)
-      goto disasm_run;
-
     //gpio_handle_irq();
     //GPIO_HANDLE_IRQ;
   }
@@ -351,6 +373,8 @@ void cpu_pulse_reset(void) {
   usleep(100000);
   write_reg(0x02);
   // printf("Status Reg%x\n",read_reg());
+  if (cfg->platform->handle_reset)
+    cfg->platform->handle_reset(cfg);
 
   ovl = 1;
   m68k_write_memory_8(0xbfe201, 0x0001);  // AMIGA OVL
index 36573dd100b7c80391bd8d7387ad6ff6562fa88c..0c036925369ba301f91f9c0c6325fbb6f255fb50 100644 (file)
--- a/m68kcpu.c
+++ b/m68kcpu.c
@@ -1173,6 +1173,27 @@ void m68k_set_context(void* src)
 
 void m68k_add_ram_range(uint32_t addr, uint32_t upper, unsigned char *ptr)
 {
+       if ((addr == 0 && upper == 0) || upper < addr)
+               return;
+
+       for (int i = 0; i < write_ranges; i++) {
+               if (write_addr[i] == addr) {
+                       uint8_t changed = 0;
+                       if (write_upper[i] != upper) {
+                               write_upper[i] = upper;
+                               changed = 1;
+                       }
+                       if (write_data[i] != ptr) {
+                               write_data[i] = ptr;
+                               changed = 1;
+                       }
+                       if (changed) {
+                               printf("[MUSASHI] Adjusted mapped write range %d: %.8X-%.8X (%p)\n", write_ranges, addr, upper, ptr);
+                       }
+                       return;
+               }
+       }
+
        if (read_ranges + 1 < 8) {
                read_addr[read_ranges] = addr;
                read_upper[read_ranges] = upper;
@@ -1197,6 +1218,27 @@ void m68k_add_ram_range(uint32_t addr, uint32_t upper, unsigned char *ptr)
 
 void m68k_add_rom_range(uint32_t addr, uint32_t upper, unsigned char *ptr)
 {
+       if ((addr == 0 && upper == 0) || upper < addr)
+               return;
+
+       for (int i = 0; i < read_ranges; i++) {
+               if (read_addr[i] == addr) {
+                       uint8_t changed = 0;
+                       if (read_upper[i] != upper) {
+                               read_upper[i] = upper;
+                               changed = 1;
+                       }
+                       if (read_data[i] != ptr) {
+                               read_data[i] = ptr;
+                               changed = 1;
+                       }
+                       if (changed) {
+                               printf("[MUSASHI] Adjusted mapped read range %d: %.8X-%.8X (%p)\n", read_ranges, addr, upper, ptr);
+                       }
+                       return;
+               }
+       }
+
        if (read_ranges + 1 < 8) {
                read_addr[read_ranges] = addr;
                read_upper[read_ranges] = upper;
index de9d933d45cfbbfb3e9af1fe0442a06b291adb72..aaad909e69b8749b791b35ba9f0e3b8e61c0fa7e 100644 (file)
@@ -25,7 +25,7 @@ unsigned char ac_piscsi_rom[] = {
     0x0, 0x0,                               // 0c/0e, reserved
     0x0, 0x7, 0xD, 0xB,                     // 10/12/14/16, mfg id
     0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, 0x1, // 18/.../26, serial
-    0x0, 0x0, 0x0, 0x0,                     // Optional BOOT ROM vector
+    0x4, 0x0, 0x0, 0x0,                     // Optional BOOT ROM vector
 };
 
 static unsigned char ac_a314_rom[] = {
@@ -275,7 +275,7 @@ unsigned int autoconfig_read_memory_8(struct emulator_config *cfg, unsigned int
     //printf("Read byte %d from Z2 autoconf for PIC %d (%.2X).\n", address/2, ac_z2_current_pic, val);
   }
   val <<= 4;
-  if (address != 0 && address != 2 && address != 40 && address != 42)
+  if (address != 0 && address != 2 && address != 0x40 && address != 0x42)
     val ^= 0xff;
   
   return (unsigned int)val;
@@ -324,17 +324,17 @@ void autoconfig_write_memory_8(struct emulator_config *cfg, unsigned int address
   }
 
   if (done) {
-    cfg->map_offset[index] = ac_base[ac_z2_current_pic];
-    cfg->map_high[index] = cfg->map_offset[index] + cfg->map_size[index];
     switch (ac_z2_type[ac_z2_current_pic]) {
       case ACTYPE_MAPFAST_Z2:
+        cfg->map_offset[index] = ac_base[ac_z2_current_pic];
+        cfg->map_high[index] = cfg->map_offset[index] + cfg->map_size[index];
         printf("Address of Z2 autoconf RAM assigned to $%.8x\n", ac_base[ac_z2_current_pic]);
         m68k_add_ram_range(cfg->map_offset[index], cfg->map_high[index], cfg->map_data[index]);
         printf("Z2 PIC %d at $%.8lX-%.8lX, Size: %d MB\n", ac_z2_current_pic, cfg->map_offset[index], cfg->map_high[index], cfg->map_size[index] / SIZE_MEGA);
         break;
       case ACTYPE_PSICSI:
-        printf("PiSCSI Z2 device assigned to $%.8x\n", ac_base[ac_z2_current_pic]);
-        m68k_add_rom_range(piscsi_base + (16 * SIZE_KILO), piscsi_base + (32 * SIZE_KILO), piscsi_rom_ptr);
+        printf("PiSCSI Z2 device assigned to $%.8x\n", piscsi_base);
+        //m68k_add_rom_range(piscsi_base + (16 * SIZE_KILO), piscsi_base + (32 * SIZE_KILO), piscsi_rom_ptr);
         break;
       default:
         break;
index 269acb5aa25909a274bf990f2bb53af86149c458..76621cd76c1c94cceb7db3b30c8cb020e5916940 100644 (file)
@@ -16,11 +16,13 @@ int handle_register_read_amiga(unsigned int addr, unsigned char type, unsigned i
 int handle_register_write_amiga(unsigned int addr, unsigned int value, unsigned char type);
 int init_rtg_data();
 
+extern int ac_z2_current_pic;
 extern int ac_z2_done;
 extern int ac_z2_pic_count;
 extern int ac_z2_type[AC_PIC_LIMIT];
 extern int ac_z2_index[AC_PIC_LIMIT];
 
+extern int ac_z3_current_pic;
 extern int ac_z3_pic_count;
 extern int ac_z3_done;
 extern int ac_z3_type[AC_PIC_LIMIT];
@@ -42,6 +44,11 @@ extern unsigned char cdtv_sram[32 * SIZE_KILO];
 
 static uint8_t rtg_enabled = 0, piscsi_enabled = 0, pinet_enabled = 0;
 
+extern uint32_t piscsi_base;
+extern uint8_t piscsi_diag_read = 0;
+
+extern void stop_cpu_emulation(uint8_t disasm_cur);
+
 inline int custom_read_amiga(struct emulator_config *cfg, unsigned int addr, unsigned int *val, unsigned char type) {
     if (!ac_z2_done && addr >= AC_Z2_BASE && addr < AC_Z2_BASE + AC_SIZE) {
         if (ac_z2_pic_count == 0) {
@@ -70,6 +77,13 @@ inline int custom_read_amiga(struct emulator_config *cfg, unsigned int addr, uns
         }
     }
 
+    if (addr >= piscsi_base && addr < piscsi_base + (64 * SIZE_KILO)) {
+        printf("[Amiga-Custom] %s read from PISCSI base @$%.8X.\n", op_type_names[type], addr);
+        stop_cpu_emulation(1);
+        *val = handle_piscsi_read(addr, type);
+        return 1;
+    }
+
     return -1;
 }
 
@@ -108,6 +122,12 @@ inline int custom_write_amiga(struct emulator_config *cfg, unsigned int addr, un
         }
     }
 
+    if (addr >= piscsi_base && addr < piscsi_base + (64 * SIZE_KILO)) {
+        printf("[Amiga-Custom] %s write to PISCSI base @$%.8x: %.8X\n", op_type_names[type], addr, val);
+        handle_piscsi_write(addr, val, type);
+        return 1;
+    }
+
     return -1;
 }
 
@@ -158,6 +178,9 @@ void adjust_ranges_amiga(struct emulator_config *cfg) {
         else
             cfg->custom_low = min(cfg->custom_low, PISCSI_OFFSET);
         cfg->custom_high = max(cfg->custom_high, PISCSI_UPPER);
+        if (piscsi_base != 0) {
+            cfg->custom_low = min(cfg->custom_low, piscsi_base);
+        }
     }
     if (pinet_enabled) {
         if (cfg->custom_low == 0)
@@ -373,6 +396,9 @@ void setvar_amiga(struct emulator_config *cfg, char *var, char *val) {
 void handle_reset_amiga(struct emulator_config *cfg) {
     ac_z3_done = 0;
     ac_z2_done = 0;
+    ac_z2_current_pic = 0;
+    ac_z3_current_pic = 0;
+    piscsi_diag_read = 0;
 
     adjust_ranges_amiga(cfg);
 }
index 4bf7e1e02a7cea22ea0e89d1b40291c18e04c633..2c94fbe2f8237214be943377820f3d49db97cc4f 100644 (file)
@@ -4,6 +4,7 @@
 #include <stdlib.h>
 
 #define BOOTLDR_SIZE 0x400
+#define DIAG_TOTAL_SIZE 0x4000
 
 char *rombuf, *zerobuf, *devicebuf;
 
@@ -48,6 +49,11 @@ int main(int argc, char *argv[]) {
     fwrite(zerobuf, pad_size, 1, out);
     fwrite(devicebuf, device_size, 1, out);
 
+    free(zerobuf);
+    zerobuf = malloc(DIAG_TOTAL_SIZE - (rom_size + pad_size + device_size));
+    memset(zerobuf, 0x00, DIAG_TOTAL_SIZE - (rom_size + pad_size + device_size));
+    fwrite(zerobuf, DIAG_TOTAL_SIZE - (rom_size + pad_size + device_size), 1, out);
+
     printf("piscsi.rom successfully created.\n");
 
     free(rombuf);
index 1cd6fee46f356eda7188441f4d37eb553b4cf5bc..af9a7b0410fbcf5a6fe56543f03cfd88de5bdd93 100644 (file)
@@ -30,5 +30,5 @@ enum piscsi_cmds {
     PISCSI_CMD_ADDR2    = 0x14,
     PISCSI_CMD_ADDR3    = 0x18,
     PISCSI_CMD_ADDR4    = 0x1C,
-    PISCSI_CMD_ROM      = 0x8000,
+    PISCSI_CMD_ROM      = 0x4000,
 };
\ No newline at end of file
index 145b353f477ef792bef16b09c5b320b537030af3..c7239aea55fa9e2d9e5a4b9c1f7cab1493575f3f 100644 (file)
@@ -173,23 +173,76 @@ void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type) {
     }
 }
 
+uint8_t piscsi_diag_area[] = {
+    0x90,
+    0x00,
+    0x00, 0x40,
+    0x2C, 0x00,
+    0x2C, 0x00,
+    0x00, 0x00,
+    0x00, 0x00,
+    0x00, 0x00,
+};
+
+uint8_t fastata_diag_area[] = {
+    0x90,
+    0x00,
+    0x00, 0x10,
+    0x9e, 0x08,
+    0x00, 0x00,
+    0x00, 0x00,
+    0x00, 0x02,
+    0x00, 0x00,
+};
+
+uint8_t piscsi_diag_read;
+
+#define PIB 0x00
+
 uint32_t handle_piscsi_read(uint32_t addr, uint8_t type) {
     if (type) {}
+    uint8_t *diag_area = piscsi_diag_area;
 
     if ((addr & 0xFFFF) >= PISCSI_CMD_ROM) {
         uint32_t romoffs = (addr & 0xFFFF) - PISCSI_CMD_ROM;
-        if (romoffs < piscsi_rom_size) {
-            printf("[PISCSI] %s read from Boot ROM @$%.4X (%.8X)\n", op_type_names[type], romoffs, addr);
+        if (romoffs < 14 && !piscsi_diag_read) {
+            printf("[PISCSI] %s read from DiagArea @$%.4X: ", op_type_names[type], romoffs);
+            uint32_t v = 0;
+            switch (type) {
+                case OP_TYPE_BYTE:
+                    v = diag_area[romoffs];
+                    printf("%.2X\n", v);
+                    break;
+                case OP_TYPE_WORD:
+                    v = *((uint16_t *)&diag_area[romoffs]);
+                    printf("%.4X\n", v);
+                    break;
+                case OP_TYPE_LONGWORD:
+                    v = (*((uint16_t *)&diag_area[romoffs]) << 16) | *((uint16_t *)&diag_area[romoffs + 2]);
+                    //v = *((uint32_t *)&diag_area[romoffs]);
+                    printf("%.8X\n", v);
+                    break;
+            }
+            if (romoffs == 0x0D)
+                piscsi_diag_read = 1;
+            return v;   
+        }
+        if (romoffs < (piscsi_rom_size + PIB)) {
+            printf("[PISCSI] %s read from Boot ROM @$%.4X (%.8X): ", op_type_names[type], romoffs, addr);
             uint32_t v = 0;
             switch (type) {
                 case OP_TYPE_BYTE:
-                    v = piscsi_rom_ptr[romoffs];
+                    v = piscsi_rom_ptr[romoffs - PIB];
+                    printf("%.2X\n", v);
                     break;
                 case OP_TYPE_WORD:
-                    v = *((uint16_t *)&piscsi_rom_ptr[romoffs]);
+                    v = be16toh(*((uint16_t *)&piscsi_rom_ptr[romoffs - PIB]));
+                    printf("%.4X\n", v);
                     break;
                 case OP_TYPE_LONGWORD:
-                    v = *((uint32_t *)&piscsi_rom_ptr[romoffs]);
+                    //v = (*((uint16_t *)&diag_area[romoffs - 14]) << 16) | *((uint16_t *)&diag_area[romoffs - 12]);
+                    v = be32toh(*((uint32_t *)&diag_area[romoffs - PIB]));
+                    printf("%.8X\n", v);
                     break;
             }
             return v;
index 8473c03841a6ff1716dd7be012a8e9dbc0f9ebb5..203c0b600ec8bc7d9eef80f4e96b67c7601fed83 100644 (file)
Binary files a/platforms/amiga/piscsi/piscsi.rom and b/platforms/amiga/piscsi/piscsi.rom differ
diff --git a/platforms/amiga/rtg/rtg_driver_amiga/PiGFX.info b/platforms/amiga/rtg/rtg_driver_amiga/PiGFX.info
new file mode 100644 (file)
index 0000000..5b18255
Binary files /dev/null and b/platforms/amiga/rtg/rtg_driver_amiga/PiGFX.info differ