From 0d0bb0355d419b9a11c59b68577a3305236ccccd Mon Sep 17 00:00:00 2001 From: beeanyew Date: Fri, 29 Jan 2021 01:37:40 +0100 Subject: [PATCH] [WIP] PiSCSI boot ROM experiments --- emulator.c | 58 +++++++++++----- m68kcpu.c | 42 ++++++++++++ platforms/amiga/amiga-autoconf.c | 12 ++-- platforms/amiga/amiga-platform.c | 26 ++++++++ .../piscsi/device_driver_amiga/makerom.c | 6 ++ platforms/amiga/piscsi/piscsi-enums.h | 2 +- platforms/amiga/piscsi/piscsi.c | 63 ++++++++++++++++-- platforms/amiga/piscsi/piscsi.rom | Bin 3936 -> 16384 bytes .../amiga/rtg/rtg_driver_amiga/PiGFX.info | Bin 0 -> 522 bytes 9 files changed, 180 insertions(+), 29 deletions(-) create mode 100644 platforms/amiga/rtg/rtg_driver_amiga/PiGFX.info diff --git a/emulator.c b/emulator.c index 845a80c..2fe2069 100644 --- a/emulator.c +++ b/emulator.c @@ -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 diff --git a/m68kcpu.c b/m68kcpu.c index 36573dd..0c03692 100644 --- 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; diff --git a/platforms/amiga/amiga-autoconf.c b/platforms/amiga/amiga-autoconf.c index de9d933..aaad909 100644 --- a/platforms/amiga/amiga-autoconf.c +++ b/platforms/amiga/amiga-autoconf.c @@ -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; diff --git a/platforms/amiga/amiga-platform.c b/platforms/amiga/amiga-platform.c index 269acb5..76621cd 100644 --- a/platforms/amiga/amiga-platform.c +++ b/platforms/amiga/amiga-platform.c @@ -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); } diff --git a/platforms/amiga/piscsi/device_driver_amiga/makerom.c b/platforms/amiga/piscsi/device_driver_amiga/makerom.c index 4bf7e1e..2c94fbe 100644 --- a/platforms/amiga/piscsi/device_driver_amiga/makerom.c +++ b/platforms/amiga/piscsi/device_driver_amiga/makerom.c @@ -4,6 +4,7 @@ #include #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); diff --git a/platforms/amiga/piscsi/piscsi-enums.h b/platforms/amiga/piscsi/piscsi-enums.h index 1cd6fee..af9a7b0 100644 --- a/platforms/amiga/piscsi/piscsi-enums.h +++ b/platforms/amiga/piscsi/piscsi-enums.h @@ -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 diff --git a/platforms/amiga/piscsi/piscsi.c b/platforms/amiga/piscsi/piscsi.c index 145b353..c7239ae 100644 --- a/platforms/amiga/piscsi/piscsi.c +++ b/platforms/amiga/piscsi/piscsi.c @@ -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; diff --git a/platforms/amiga/piscsi/piscsi.rom b/platforms/amiga/piscsi/piscsi.rom index 8473c03841a6ff1716dd7be012a8e9dbc0f9ebb5..203c0b600ec8bc7d9eef80f4e96b67c7601fed83 100644 GIT binary patch delta 143 dcmaDL*U-SYA%TCh1k)?V%?3=D29hvg1OOcpFzEmQ delta 8 PcmZo@V0<9AA%PzN4@CnX diff --git a/platforms/amiga/rtg/rtg_driver_amiga/PiGFX.info b/platforms/amiga/rtg/rtg_driver_amiga/PiGFX.info new file mode 100644 index 0000000000000000000000000000000000000000..5b1825574af23037b546bc8dbf29b07c05e51653 GIT binary patch literal 522 zcmaDXz`)1=0>2q1Gbl3%Gq3{rjBIQR!GahBBQsctjbn=rkntUeI}mCFAWV=cOae@{ z9T2tuf#3l{15i$Zp*1u#M1f&yXlN+uBt$R79Eh3BKN$ZoFmNz{d;qe$fk7T90a5`1 z^+5Ikh614M0fq!1pL7zU7h(>`L?B@Q2O|Fe2U7e%^TA>eLIp?(yE%Hh`Z