From f50a5aa17e130828bb1d44f69e604fdf1065a18e Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Thu, 18 Jun 2015 20:34:51 +0300 Subject: [PATCH] Expansion device handling updates. --- a2065.cpp | 14 +- a2091.cpp | 17 ++- cfgfile.cpp | 21 ++- expansion.cpp | 359 ++++++++++++++++++++++++++++----------------- filesys.cpp | 29 ++-- include/a2091.h | 1 + include/autoconf.h | 8 +- include/memory.h | 3 +- include/ncr_scsi.h | 5 + include/rommgr.h | 8 +- memory.cpp | 34 ++++- ncr9x_scsi.cpp | 6 +- ncr_scsi.cpp | 21 ++- rommgr.cpp | 8 +- scsi.cpp | 4 +- sndboard.cpp | 2 +- 16 files changed, 369 insertions(+), 171 deletions(-) diff --git a/a2065.cpp b/a2065.cpp index 227775cd..127bfa59 100644 --- a/a2065.cpp +++ b/a2065.cpp @@ -557,14 +557,21 @@ void a2065_hsync_handler (void) void rethink_a2065 (void) { + bool was = (uae_int_requested & 4) != 0; uae_int_requested &= ~4; if (!configured) return; csr[0] &= ~CSR0_INTR; if (csr[0] & (CSR0_BABL | CSR0_MISS | CSR0_MERR | CSR0_RINT | CSR0_TINT | CSR0_IDON)) csr[0] |= CSR0_INTR; - if ((csr[0] & (CSR0_INTR | CSR0_INEA)) == (CSR0_INTR | CSR0_INEA)) + if ((csr[0] & (CSR0_INTR | CSR0_INEA)) == (CSR0_INTR | CSR0_INEA)) { uae_int_requested |= 4; + if (!was && log_a2065 > 2) + write_log(_T("A2065 +IRQ\n")); + } + if (log_a2065 && was && !(uae_int_requested & 4)) { + write_log(_T("A2065 -IRQ\n")); + } } static void chip_init (void) @@ -913,6 +920,11 @@ static addrbank *a2065_config (void) td = NULL; if (ethernet_enumerate (&td, currprefs.a2065name)) { memcpy (realmac, td->mac, sizeof realmac); + if (!td->mac[0] && !td->mac[1] && !td->mac[2]) { + realmac[0] = 0x00; + realmac[1] = 0x80; + realmac[2] = 0x10; + } write_log (_T("A2065: '%s' %02X:%02X:%02X:%02X:%02X:%02X\n"), td->name, td->mac[0], td->mac[1], td->mac[2], td->mac[3], td->mac[4], td->mac[5]); } else { diff --git a/a2091.cpp b/a2091.cpp index b37af47b..3dd0b8f9 100644 --- a/a2091.cpp +++ b/a2091.cpp @@ -266,6 +266,7 @@ static struct wd_state *wd_a2090[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct wd_state *wd_a3000; static struct wd_state *wd_gvps1[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct wd_state *wd_gvps2[MAX_DUPLICATE_EXPANSION_BOARDS]; +static struct wd_state *wd_gvps2accel; struct wd_state *wd_cdtv; static struct wd_state *scsi_units[MAX_SCSI_UNITS + 1]; @@ -1410,6 +1411,7 @@ void scsi_hsync (void) scsi_hsync2_gvp(wd_gvps1[i]); scsi_hsync2_gvp(wd_gvps2[i]); } + scsi_hsync2_gvp(wd_gvps2accel); scsi_hsync2_a2091(wd_a3000); scsi_hsync2_a2091(wd_cdtv); } @@ -2940,7 +2942,8 @@ static uae_u32 REGPARAM2 dmac_gvp_lgeti (uaecptr addr) } static int REGPARAM2 dmac_gvp_check(uaecptr addr, uae_u32 size) { - return 1; + struct wd_state *wd = getscsiboard(addr); + return wd ? 1 : 0; } static uae_u8 *REGPARAM2 dmac_gvp_xlate(uaecptr addr) { @@ -3324,7 +3327,7 @@ void a3000scsi_reset (void) wd->enabled = true; wd->configured = -1; wd->dmac_type = COMMODORE_SDMAC; - map_banks (&mbdmac_a3000_bank, 0xDD, 1, 0); + map_banks(&mbdmac_a3000_bank, 0xDD, 1, 0); wd_cmd_reset (&wd->wc, false); reset_dmac(wd); } @@ -3376,6 +3379,14 @@ void gvp_s2_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi add_scsi_device(&wd->scsis[ch], ch, ci, rc); } +void gvp_s2_add_accelerator_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + struct wd_state *wd = allocscsi(&wd_gvps2accel, rc, ch); + if (!wd || ch < 0) + return; + add_scsi_device(&wd->scsis[ch], ch, ci, rc); +} + void a2091_free_device (struct wd_state *wd) { freencrunit(wd); @@ -3563,6 +3574,7 @@ void gvp_free (void) gvp_free_device(wd_gvps1[i]); gvp_free_device(wd_gvps2[i]); } + gvp_free_device(wd_gvps2accel); } static void gvp_reset_device(struct wd_state *wd) @@ -3585,6 +3597,7 @@ void gvp_reset (void) gvp_reset_device(wd_gvps1[i]); gvp_reset_device(wd_gvps2[i]); } + gvp_reset_device(wd_gvps2accel); } static const uae_u8 gvp_scsi_i_autoconfig_1[16] = { 0xd1, 0x01, 0x00, 0x00, 0x07, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 }; diff --git a/cfgfile.cpp b/cfgfile.cpp index 3480cb89..1d1fe8fd 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -202,6 +202,7 @@ static const TCHAR *cdmodes[] = { _T("disabled"), _T(""), _T("image"), _T("ioctl static const TCHAR *cdconmodes[] = { _T(""), _T("uae"), _T("ide"), _T("scsi"), _T("cdtv"), _T("cd32"), 0 }; static const TCHAR *specialmonitors[] = { _T("none"), _T("autodetect"), _T("a2024"), _T("graffiti"), _T("ham_e"), _T("ham_e_plus"), _T("videodac18"), _T("avideo12"), _T("avideo24"), _T("firecracker24"), _T("dctv"), 0 }; +static const TCHAR *genlockmodes[] = { _T("none"), _T("noise"), _T("testcard"), NULL }; static const TCHAR *rtgtype[] = { _T("ZorroII"), _T("ZorroIII"), _T("PicassoII"), @@ -1313,6 +1314,9 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_write_bool (f, _T("bsdsocket_emu"), p->socket_emu); if (p->a2065name[0]) cfgfile_write_str (f, _T("a2065"), p->a2065name); + if (p->ne2000pciname[0]) + cfgfile_write_str(f, _T("ne2000_pci"), p->ne2000pciname); + #ifdef WITH_SLIRP tmp[0] = 0; for (i = 0; i < MAX_SLIRP_REDIRS; i++) { @@ -1507,7 +1511,9 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_dwrite_str (f, _T("waiting_blits"), waitblits[p->waiting_blits]); cfgfile_write_bool (f, _T("ntsc"), p->ntscmode); cfgfile_write_bool (f, _T("genlock"), p->genlock); - cfgfile_dwrite_str (f, _T("monitoremu"), specialmonitors[p->monitoremu]); + cfgfile_dwrite_str(f, _T("genlockmode"), genlockmodes[p->genlock_image]); + cfgfile_dwrite_str(f, _T("genlock_image"), p->genlock_image_file); + cfgfile_dwrite_str(f, _T("monitoremu"), specialmonitors[p->monitoremu]); cfgfile_dwrite_bool (f, _T("show_leds"), !!(p->leds_on_screen & STATUSLINE_CHIPSET)); cfgfile_dwrite_bool (f, _T("show_leds_rtg"), !!(p->leds_on_screen & STATUSLINE_RTG)); @@ -4104,7 +4110,9 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH return 1; } - if (cfgfile_string (option, value, _T("a2065"), p->a2065name, sizeof p->a2065name / sizeof (TCHAR))) + if (cfgfile_string(option, value, _T("a2065"), p->a2065name, sizeof p->a2065name / sizeof(TCHAR))) + return 1; + if (cfgfile_string(option, value, _T("ne2000_pci"), p->ne2000pciname, sizeof p->ne2000pciname / sizeof(TCHAR))) return 1; if (cfgfile_yesno (option, value, _T("immediate_blits"), &p->immediate_blits) @@ -4222,7 +4230,8 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH || cfgfile_strval (option, value, _T("comp_trustnaddr"), &p->comptrustnaddr, compmode, 0) || cfgfile_strval (option, value, _T("collision_level"), &p->collision_level, collmode, 0) || cfgfile_strval (option, value, _T("parallel_matrix_emulation"), &p->parallel_matrix_emulation, epsonprinter, 0) - || cfgfile_strval (option, value, _T("monitoremu"), &p->monitoremu, specialmonitors, 0) + || cfgfile_strval(option, value, _T("monitoremu"), &p->monitoremu, specialmonitors, 0) + || cfgfile_strval(option, value, _T("genlockmode"), &p->genlock_image, genlockmodes, 0) || cfgfile_strval (option, value, _T("waiting_blits"), &p->waiting_blits, waitblits, 0) || cfgfile_strval (option, value, _T("floppy_auto_extended_adf"), &p->floppy_auto_ext2, autoext2, 0) || cfgfile_strval (option, value, _T("z3mapping"), &p->z3_mapping_mode, z3mapping, 0) @@ -4240,8 +4249,9 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH || cfgfile_path (option, value, _T("flash_file"), p->flashfile, sizeof p->flashfile / sizeof (TCHAR), &p->path_rom) || cfgfile_path (option, value, _T("cart_file"), p->cartfile, sizeof p->cartfile / sizeof (TCHAR), &p->path_rom) || cfgfile_path (option, value, _T("rtc_file"), p->rtcfile, sizeof p->rtcfile / sizeof (TCHAR), &p->path_rom) - || cfgfile_path (option, value, _T("picassoiv_rom_file"), p->picassoivromfile, sizeof p->picassoivromfile / sizeof (TCHAR), &p->path_rom) - || cfgfile_string (option, value, _T("pci_devices"), p->pci_devices, sizeof p->pci_devices / sizeof (TCHAR)) + || cfgfile_path(option, value, _T("picassoiv_rom_file"), p->picassoivromfile, sizeof p->picassoivromfile / sizeof(TCHAR), &p->path_rom) + || cfgfile_string(option, value, _T("genlock_image"), p->genlock_image_file, sizeof p->genlock_image_file / sizeof(TCHAR)) + || cfgfile_string(option, value, _T ("pci_devices"), p->pci_devices, sizeof p->pci_devices / sizeof(TCHAR)) || cfgfile_string (option, value, _T("ghostscript_parameters"), p->ghostscript_parameters, sizeof p->ghostscript_parameters / sizeof (TCHAR))) return 1; @@ -6036,6 +6046,7 @@ void default_prefs (struct uae_prefs *p, int type) p->blitter_cycle_exact = 0; p->chipset_mask = CSMASK_ECS_AGNUS; p->genlock = 0; + p->genlock_image = 0; p->ntscmode = 0; p->filesys_limit = 0; p->filesys_max_name = 107; diff --git a/expansion.cpp b/expansion.cpp index 110ff0bc..0404c764 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -38,6 +38,7 @@ #include "uae/ppc.h" #include "autoconf.h" #include "specialmonitors.h" +#include "pci.h" #define EXP_DEBUG 0 @@ -1080,83 +1081,71 @@ static addrbank *expamem_map_fastcard_2 (int boardnum) return ab; } -static const uae_u8 a2630_autoconfig[] = { 0xe7, 0x51, 0x40, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - -static addrbank *expamem_init_fastcard(int boardnum) +static void fastmem_autoconfig(int boardnum, int zorro, uae_u8 type, uae_u32 serial, int allocated) { uae_u16 mid = 0; uae_u8 pid; - uae_u8 type = add_memory | zorroII; - int allocated = boardnum ? fastmem2_bank.allocated : fastmem_bank.allocated; - uae_u32 serial = 1; + uae_u8 flags = care_addr; DEVICE_MEMORY_CALLBACK dmc = NULL; struct romconfig *dmc_rc = NULL; uae_u8 ac[16] = { 0 }; - if (allocated == 0) - return &expamem_null; - - expamem_init_clear (); - if (allocated == 65536) - type |= Z2_MEM_64KB; - else if (allocated == 131072) - type |= Z2_MEM_128KB; - else if (allocated == 262144) - type |= Z2_MEM_256KB; - else if (allocated == 524288) - type |= Z2_MEM_512KB; - else if (allocated == 0x100000) - type |= Z2_MEM_1MB; - else if (allocated == 0x200000) - type |= Z2_MEM_2MB; - else if (allocated == 0x400000) - type |= Z2_MEM_4MB; - else if (allocated == 0x800000) - type |= Z2_MEM_8MB; - - if (ISCPUBOARD(BOARD_COMMODORE, BOARD_COMMODORE_SUB_A26x0) && boardnum != 0) { - for (int i = 1; i < 16; i++) - expamem_write(i * 4, a2630_autoconfig[i]); - type &= 7; - type |= a2630_autoconfig[0] & ~7; - expamem_write(0, type); - return NULL; - } - for (int i = 0; expansionroms[i].name; i++) { - const struct expansionromtype *erc = &expansionroms[i]; - if (erc->zorro == 2 && cfgfile_board_enabled(&currprefs, erc->romtype, 0)) { - struct romconfig *rc = get_device_romconfig(&currprefs, erc->romtype, 0); - if (erc->subtypes) { - const struct expansionsubromtype *srt = &erc->subtypes[rc->subtype]; - if (srt->memory_mid) { - mid = srt->memory_mid; - pid = srt->memory_pid; - serial = srt->memory_serial; - if (!srt->memory_after) - type |= chainedconfig; + if (boardnum == 1) { + const struct cpuboardsubtype *cst = &cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype]; + if (cst->memory_mid) { + mid = cst->memory_mid; + pid = cst->memory_pid; + serial = cst->memory_serial; + } + } else if (boardnum == 0) { + for (int i = 0; expansionroms[i].name; i++) { + const struct expansionromtype *erc = &expansionroms[i]; + if (erc->zorro == zorro && cfgfile_board_enabled(&currprefs, erc->romtype, 0)) { + struct romconfig *rc = get_device_romconfig(&currprefs, erc->romtype, 0); + if (erc->subtypes) { + const struct expansionsubromtype *srt = &erc->subtypes[rc->subtype]; + if (srt->memory_mid) { + mid = srt->memory_mid; + pid = srt->memory_pid; + serial = srt->memory_serial; + if (!srt->memory_after) + type |= chainedconfig; + } } - } else { - if (erc->memory_mid) { - mid = erc->memory_mid; - pid = erc->memory_pid; - serial = erc->memory_serial; - if (!erc->memory_after) - type |= chainedconfig; + else { + if (erc->memory_mid) { + mid = erc->memory_mid; + pid = erc->memory_pid; + serial = erc->memory_serial; + if (!erc->memory_after) + type |= chainedconfig; + } } + dmc = erc->memory_callback; + dmc_rc = rc; + break; } - dmc = erc->memory_callback; - dmc_rc = rc; - break; } } + if (!mid) { - pid = currprefs.maprom && !currprefs.cpuboard_type ? 1 : 81; + if (zorro <= 2) { + pid = currprefs.maprom && !currprefs.cpuboard_type ? 1 : 81; + } else { + int subsize = (allocated == 0x100000 ? Z3_SS_MEM_1MB + : allocated == 0x200000 ? Z3_SS_MEM_2MB + : allocated == 0x400000 ? Z3_SS_MEM_4MB + : allocated == 0x800000 ? Z3_SS_MEM_8MB + : Z3_SS_MEM_SAME); + pid = currprefs.maprom && !currprefs.cpuboard_type ? 3 : 83; + flags |= force_z3 | (allocated > 0x800000 ? ext_size : subsize); + } mid = uae_id; } ac[0x00 / 4] = type; ac[0x04 / 4] = pid; - ac[0x08 / 4] = care_addr; + ac[0x08 / 4] = flags; ac[0x10 / 4] = mid >> 8; ac[0x14 / 4] = mid; ac[0x18 / 4] = serial >> 24; @@ -1182,10 +1171,61 @@ static addrbank *expamem_init_fastcard(int boardnum) expamem_write(0x2c, 0x00); /* ROM-Offset lo */ expamem_write(0x40, 0x00); /* Ctrl/Statusreg.*/ +} + +static const uae_u8 a2630_autoconfig[] = { 0xe7, 0x51, 0x40, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +static addrbank *expamem_init_fastcard_2(int boardnum) +{ + uae_u8 type = add_memory | zorroII; + int allocated = boardnum ? fastmem2_bank.allocated : fastmem_bank.allocated; + uae_u32 serial = 1; + + if (allocated == 0) + return &expamem_null; + + expamem_init_clear (); + if (allocated == 65536) + type |= Z2_MEM_64KB; + else if (allocated == 131072) + type |= Z2_MEM_128KB; + else if (allocated == 262144) + type |= Z2_MEM_256KB; + else if (allocated == 524288) + type |= Z2_MEM_512KB; + else if (allocated == 0x100000) + type |= Z2_MEM_1MB; + else if (allocated == 0x200000) + type |= Z2_MEM_2MB; + else if (allocated == 0x400000) + type |= Z2_MEM_4MB; + else if (allocated == 0x800000) + type |= Z2_MEM_8MB; + + if (boardnum == 1) { + if (ISCPUBOARD(BOARD_COMMODORE, BOARD_COMMODORE_SUB_A26x0)) { + for (int i = 1; i < 16; i++) + expamem_write(i * 4, a2630_autoconfig[i]); + type &= 7; + type |= a2630_autoconfig[0] & ~7; + expamem_write(0, type); + return NULL; + } + } + + fastmem_autoconfig(boardnum, 2, type, serial, allocated); return NULL; } +static addrbank *expamem_init_fastcard(int boardnum) +{ + return expamem_init_fastcard_2(0); +} +static addrbank *expamem_init_fastcard2(int boardnum) +{ + return expamem_init_fastcard_2(1); +} static addrbank *expamem_map_fastcard (void) { return expamem_map_fastcard_2 (0); @@ -1317,7 +1357,7 @@ static addrbank *expamem_map_z3fastmem2 (void) return expamem_map_z3fastmem_2 (&z3fastmem2_bank, &z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated, 0); } -static addrbank *expamem_init_z3fastmem_2(addrbank *bank, uae_u32 start, uae_u32 size, uae_u32 allocated) +static addrbank *expamem_init_z3fastmem_2(int boardnum, addrbank *bank, uae_u32 start, uae_u32 size, uae_u32 allocated) { int code = (allocated == 0x100000 ? Z2_MEM_1MB : allocated == 0x200000 ? Z2_MEM_2MB @@ -1330,45 +1370,22 @@ static addrbank *expamem_init_z3fastmem_2(addrbank *bank, uae_u32 start, uae_u32 : allocated == 0x10000000 ? Z3_MEM_256MB : allocated == 0x20000000 ? Z3_MEM_512MB : Z3_MEM_1GB); - int subsize = (allocated == 0x100000 ? Z3_SS_MEM_1MB - : allocated == 0x200000 ? Z3_SS_MEM_2MB - : allocated == 0x400000 ? Z3_SS_MEM_4MB - : allocated == 0x800000 ? Z3_SS_MEM_8MB - : Z3_SS_MEM_SAME); if (allocated < 0x1000000) code = Z3_MEM_16MB; /* Z3 physical board size is always at least 16M */ expamem_init_clear (); - expamem_write (0x00, add_memory | zorroIII | code); - - expamem_write (0x08, care_addr | force_z3 | (allocated > 0x800000 ? ext_size : subsize)); - - expamem_write (0x04, currprefs.maprom && !currprefs.cpuboard_type ? 3 : 83); - - expamem_write (0x10, uae_id >> 8); - expamem_write (0x14, uae_id & 0xff); - - expamem_write (0x18, 0x00); /* ser.no. Byte 0 */ - expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */ - expamem_write (0x20, 0x00); /* ser.no. Byte 2 */ - expamem_write (0x24, 0x01); /* ser.no. Byte 3 */ - - expamem_write (0x28, 0x00); /* ROM-Offset hi */ - expamem_write (0x2c, 0x00); /* ROM-Offset lo */ - - expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/ - + fastmem_autoconfig(boardnum, 3, add_memory | zorroIII | code, 1, allocated); map_banks (bank, start >> 16, size >> 16, allocated); return NULL; } static addrbank *expamem_init_z3fastmem (int devnum) { - return expamem_init_z3fastmem_2 (&z3fastmem_bank, z3fastmem_bank.start, currprefs.z3fastmem_size, z3fastmem_bank.allocated); + return expamem_init_z3fastmem_2 (0, &z3fastmem_bank, z3fastmem_bank.start, currprefs.z3fastmem_size, z3fastmem_bank.allocated); } static addrbank *expamem_init_z3fastmem2(int devnum) { - return expamem_init_z3fastmem_2 (&z3fastmem2_bank, z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated); + return expamem_init_z3fastmem_2 (1, &z3fastmem2_bank, z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated); } #ifdef PICASSO96 @@ -1763,12 +1780,21 @@ static void add_expansions(int zorro) if (rc) { if (zorro == 1) { ert->init(rc); + if (ert->init2) + ert->init2(rc); } else { cards[cardno].flags = 0; cards[cardno].name = ert->name; cards[cardno].initrc = ert->init; cards[cardno].rc = rc; cards[cardno++].map = NULL; + if (ert->init2) { + cards[cardno].flags = 0; + cards[cardno].name = ert->name; + cards[cardno].initrc = ert->init2; + cards[cardno].rc = rc; + cards[cardno++].map = NULL; + } } } } @@ -1828,7 +1854,7 @@ void expamem_reset (void) if (fastmem2_bank.baseaddr != NULL && (fastmem2_bank.allocated <= 262144 || currprefs.chipmem_size <= 2 * 1024 * 1024)) { cards[cardno].flags = 0; cards[cardno].name = _T("Z2Fast2"); - cards[cardno].initnum = expamem_init_fastcard; + cards[cardno].initnum = expamem_init_fastcard2; cards[cardno++].map = expamem_map_fastcard2; } } else { @@ -2207,12 +2233,12 @@ static const struct expansionsubromtype a2090_sub[] = { #endif static const struct expansionsubromtype a2091_sub[] = { { - _T("DMAC-01"), _T("dmac01"), + _T("DMAC-01"), _T("dmac01"), 0, commodore, commodore_a2091_ram, 0, true, { 0 }, }, { - _T("DMAC-02"), _T("dmac02"), + _T("DMAC-02"), _T("dmac02"), 0, commodore, commodore_a2091_ram, 0, true, { 0 }, }, @@ -2222,17 +2248,17 @@ static const struct expansionsubromtype a2091_sub[] = { }; static const struct expansionsubromtype gvp1_sub[] = { { - _T("Impact A2000-1/X"), _T("a2000-1"), + _T("Impact A2000-1/X"), _T("a2000-1"), 0, 1761, 8, 0, false, { 0 }, }, { - _T("Impact A2000-HC"), _T("a2000-hc"), + _T("Impact A2000-HC"), _T("a2000-hc"), 0, 1761, 8, 0, false, { 0 }, }, { - _T("Impact A2000-HC+2"), _T("a2000-hc+"), + _T("Impact A2000-HC+2"), _T("a2000-hc+"), 0, 1761, 8, 0, false, { 0 }, }, @@ -2242,12 +2268,12 @@ static const struct expansionsubromtype gvp1_sub[] = { }; static const struct expansionsubromtype masoboshi_sub[] = { { - _T("MC-302"), _T("mc-302"), + _T("MC-302"), _T("mc-302"), 0, 2157, 3, 0, false, { 0 }, }, { - _T("MC-702"), _T("mc-702"), + _T("MC-702"), _T("mc-702"), 0, 2157, 3, 0, false, { 0 }, }, @@ -2257,12 +2283,12 @@ static const struct expansionsubromtype masoboshi_sub[] = { }; static const struct expansionsubromtype rochard_sub[] = { { - _T("IDE"), _T("ide"), + _T("IDE"), _T("ide"), 0, 2144, 2, 0, false, { 0 }, }, { - _T("IDE+SCSI"), _T("scsi"), + _T("IDE+SCSI"), _T("scsi"), 0, 2144, 2, 0, false, { 0 }, }, @@ -2272,27 +2298,27 @@ static const struct expansionsubromtype rochard_sub[] = { }; static const struct expansionsubromtype supra_sub[] = { { - _T("A500 ByteSync/XP"), _T("bytesync"), + _T("A500 ByteSync/XP"), _T("bytesync"), ROMTYPE_NONE | ROMTYPE_SUPRA, 1056, 9, 0, false, { 0xd1, 13, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 }, }, { - _T("A2000 Word Sync"), _T("wordsync"), + _T("A2000 Word Sync"), _T("wordsync"), ROMTYPE_NONE | ROMTYPE_SUPRA, 1056, 9, 0, false, { 0xd1, 12, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 }, }, { - _T("A500 Autoboot"), _T("500"), + _T("A500 Autoboot"), _T("500"), ROMTYPE_NONE | ROMTYPE_SUPRA, 1056, 5, 0, false, { 0xd1, 8, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 }, }, { - _T("Non Autoboot (4x4)"), _T("4x4"), + _T("Non Autoboot (4x4)"), _T("4x4"), ROMTYPE_NOT | ROMTYPE_SUPRA, 1056, 2, 0, false, { 0xc1, 1, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, { - _T("A2000 DMA"), _T("dma"), + _T("A2000 DMA"), _T("dma"), ROMTYPE_NONE | ROMTYPE_SUPRADMA, 1056, 2, 0, false, { 0xd1, 3, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00 }, }, @@ -2300,6 +2326,54 @@ static const struct expansionsubromtype supra_sub[] = { NULL } }; + +static const struct expansionsubromtype pcibridge_sub[] = { + { + _T("Prometheus"), _T("prometheus"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE + }, + { + _T("G-REX"), _T("grex"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE + }, + { + _T("Mediator 1200TX 4M"), _T("mediator1200tx4m"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE + }, + { + _T("Mediator 1200TX 8M"), _T("mediator1200tx8m"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE + }, + { + _T("Mediator 4000MK2 256M"), _T("mediator4000mkii256m"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE + }, + { + _T("Mediator 4000MK2 512M"), _T("mediator4000mkii512m"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE + }, + { + _T("CVision/BVision"), _T("cbvision"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE + }, + { + NULL + } +}; + + +static void fastlane_memory_callback(struct romconfig *rc, uae_u8 *ac, int size) +{ + struct zfile *z = read_device_from_romconfig(rc, NULL); + if (z) { + // load autoconfig data from rom file + uae_u8 act[16] = { 0 }; + zfile_fseek(z, 0x80, SEEK_SET); + zfile_fread(act, 1, 16, z); + zfile_fclose(z); + for(int i = 1; i < 16; i++) { + ac[i] = ~act[i]; + act[i] = ~act[i]; + } + // don't overwrite uae configured memory size + ac[0] = (ac[0] & 7) | (act[0] & 0xf8); + ac[2] = (ac[2] & 0x0f) | (act[2] & 0xf0); + } +} + static void nexus_memory_callback(struct romconfig *rc, uae_u8 *ac, int size) { if (rc->device_settings & 1) @@ -2333,32 +2407,38 @@ static const struct expansionboardsettings adscsi2000_settings[] = { const struct expansionromtype expansionroms[] = { { _T("cpuboard"), _T("Accelerator"), _T("Accelerator"), - NULL, add_cpuboard_unit, ROMTYPE_CPUBOARD, 0, 0, 0, true, + NULL, NULL, add_cpuboard_unit, ROMTYPE_CPUBOARD, 0, 0, 0, true, NULL, 0, false, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE }, { _T("cpuboard_ext"), _T("SCSI Kit IV"), _T("Blizzard"), - NULL, NULL, ROMTYPE_CPUBOARDEXT, ROMTYPE_CPUBOARD, 0, 0, true, + NULL, NULL, NULL, ROMTYPE_CPUBOARDEXT, ROMTYPE_CPUBOARD, 0, 0, true, NULL, 0, false, EXPANSIONTYPE_SCSI }, + { + _T("pcibridge"), _T("PCI Bridges"), _T(""), + pcibridge_init, pcibridge_init2, NULL, ROMTYPE_PCIBRIDGE | ROMTYPE_NONE, 0, 0, 3, false, + pcibridge_sub, 0, + false, 0, + }, { _T("a2090a"), _T("A2090a"), _T("Commodore"), - a2090_init, a2090_add_scsi_unit, ROMTYPE_A2090 | ROMTYPE_NONE, 0, 0, 2, false, + a2090_init, NULL, a2090_add_scsi_unit, ROMTYPE_A2090 | ROMTYPE_NONE, 0, 0, 2, false, NULL, 0, true, EXPANSIONTYPE_SCSI }, { _T("a2091"), _T("A590/A2091"), _T("Commodore"), - a2091_init, a2091_add_scsi_unit, ROMTYPE_A2091 | ROMTYPE_NONE, 0, 0, 2, false, + a2091_init, NULL, a2091_add_scsi_unit, ROMTYPE_A2091 | ROMTYPE_NONE, 0, 0, 2, false, a2091_sub, 1, true, EXPANSIONTYPE_SCSI, 0, 0, 0, true, NULL }, { _T("a4091"), _T("A4091"), _T("Commodore"), - ncr710_a4091_autoconfig_init, a4091_add_scsi_unit, ROMTYPE_A4091, 0, 0, 3, false, + ncr710_a4091_autoconfig_init, NULL, a4091_add_scsi_unit, ROMTYPE_A4091, 0, 0, 3, false, NULL, 0, false, EXPANSIONTYPE_SCSI, 0, 0, 0, false, NULL, @@ -2366,78 +2446,79 @@ const struct expansionromtype expansionroms[] = { }, { _T("fastlane"), _T("Fastlane"), _T("Phase 5"), - ncr_fastlane_autoconfig_init, fastlane_add_scsi_unit, ROMTYPE_FASTLANE, 0, 0, 3, false, + ncr_fastlane_autoconfig_init, NULL, fastlane_add_scsi_unit, ROMTYPE_FASTLANE, 0, 0, 3, false, NULL, 0, - false, EXPANSIONTYPE_SCSI + false, EXPANSIONTYPE_SCSI, + 8512, 10, 0, false, fastlane_memory_callback }, { _T("gvp1"), _T("Series I"), _T("GVP"), - gvp_init_s1, gvp_s1_add_scsi_unit, ROMTYPE_GVPS1 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, 2, false, + gvp_init_s1, NULL, gvp_s1_add_scsi_unit, ROMTYPE_GVPS1 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, 2, false, gvp1_sub, 1, true, EXPANSIONTYPE_SCSI }, { _T("gvp"), _T("Series II"), _T("GVP"), - gvp_init_s2, gvp_s2_add_scsi_unit, ROMTYPE_GVPS2 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, 2, false, + gvp_init_s2, NULL, gvp_s2_add_scsi_unit, ROMTYPE_GVPS2 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, 2, false, NULL, 0, true, EXPANSIONTYPE_SCSI, 2017, 10, 0 }, { _T("oktagon2008"), _T("Oktagon 2008"), _T("BSC/Alfa Data"), - ncr_oktagon_autoconfig_init, oktagon_add_scsi_unit, ROMTYPE_OKTAGON, 0, 0, 2, false, + ncr_oktagon_autoconfig_init, NULL, oktagon_add_scsi_unit, ROMTYPE_OKTAGON, 0, 0, 2, false, NULL, 0, true, EXPANSIONTYPE_SCSI }, { _T("alfapower"), _T("AlfaPower/AT-Bus 2008"), _T("BSC/Alfa Data"), - alf_init, alf_add_ide_unit, ROMTYPE_ALFA, 0, 0, 2, false, + alf_init, NULL, alf_add_ide_unit, ROMTYPE_ALFA, 0, 0, 2, false, NULL, 0, false, EXPANSIONTYPE_IDE, 2092, 8, 0 }, { _T("alfapowerplus"), _T("AlfaPower Plus"), _T("BSC/Alfa Data"), - alf_init, alf_add_ide_unit, ROMTYPE_ALFAPLUS, 0, 0, 2, false, + alf_init, NULL, alf_add_ide_unit, ROMTYPE_ALFAPLUS, 0, 0, 2, false, NULL, 0, false, EXPANSIONTYPE_IDE, 2092, 8, 0 }, { _T("apollo"), _T("Apollo"), _T("ACT"), - apollo_init_hd, apollo_add_scsi_unit, ROMTYPE_APOLLO, 0, 0, 2, false, + apollo_init_hd, NULL, apollo_add_scsi_unit, ROMTYPE_APOLLO, 0, 0, 2, false, NULL, 0, false, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE, 8738, 0, 0 }, { _T("masoboshi"), _T("MasterCard"), _T("Masoboshi"), - masoboshi_init, masoboshi_add_idescsi_unit, ROMTYPE_MASOBOSHI | ROMTYPE_NONE, 0, 0, 2, false, + masoboshi_init, NULL, masoboshi_add_idescsi_unit, ROMTYPE_MASOBOSHI | ROMTYPE_NONE, 0, 0, 2, false, masoboshi_sub, 0, true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE }, { _T("supradrive"), _T("SupraDrive"), _T("Supra"), - supra_init, supra_add_scsi_unit, ROMTYPE_SUPRA | ROMTYPE_NONE, 0, 0, 2, false, + supra_init, NULL, supra_add_scsi_unit, ROMTYPE_SUPRA | ROMTYPE_NONE, 0, 0, 2, false, supra_sub, 0, true, EXPANSIONTYPE_SCSI }, { _T("golem"), _T("Golem"), _T("Kupke"), - golem_init, golem_add_scsi_unit, ROMTYPE_GOLEM, 0, 0, 2, false, + golem_init, NULL, golem_add_scsi_unit, ROMTYPE_GOLEM, 0, 0, 2, false, NULL, 0, true, EXPANSIONTYPE_SCSI, 2079, 3, 0 }, { _T("adide"), _T("AdIDE"), _T("ICD"), - adide_init, adide_add_ide_unit, ROMTYPE_ADIDE | ROMTYPE_NONE, 0, 0, 2, false, + adide_init, NULL, adide_add_ide_unit, ROMTYPE_ADIDE | ROMTYPE_NONE, 0, 0, 2, false, NULL, 0, true, EXPANSIONTYPE_IDE }, { _T("adscsi2000"), _T("AdSCSI Advantage 2000"), _T("ICD"), - adscsi_init, adscsi_add_scsi_unit, ROMTYPE_ADSCSI, 0, 0, 2, false, + adscsi_init, NULL, adscsi_add_scsi_unit, ROMTYPE_ADSCSI, 0, 0, 2, false, NULL, 0, false, EXPANSIONTYPE_SCSI, 0, 0, 0, false, NULL, @@ -2446,20 +2527,20 @@ const struct expansionromtype expansionroms[] = { }, { _T("mtecat"), _T("AT 500"), _T("M-Tec"), - mtec_init, mtec_add_ide_unit, ROMTYPE_MTEC, 0, 0, 2, false, + mtec_init, NULL, mtec_add_ide_unit, ROMTYPE_MTEC, 0, 0, 2, false, NULL, 0, true, EXPANSIONTYPE_IDE }, { _T("protar"), _T("A500 HD"), _T("Protar"), - protar_init, protar_add_ide_unit, ROMTYPE_PROTAR, 0, 0, 2, false, + protar_init, NULL, protar_add_ide_unit, ROMTYPE_PROTAR, 0, 0, 2, false, NULL, 0, true, EXPANSIONTYPE_SCSI, 4149, 51, 0 }, { _T("stardrive"), _T("StarDrive"), _T("Microbotics"), - stardrive_init, stardrive_add_scsi_unit, ROMTYPE_STARDRIVE | ROMTYPE_NONE, 0, 0, 2, true, + stardrive_init, NULL, stardrive_add_scsi_unit, ROMTYPE_STARDRIVE | ROMTYPE_NOT, 0, 0, 2, true, NULL, 0, false, EXPANSIONTYPE_SCSI, 1010, 0, 0, false, NULL, @@ -2469,33 +2550,33 @@ const struct expansionromtype expansionroms[] = { }, { _T("kommos"), _T("A500/A2000 SCSI"), _T("Jürgen Kommos"), - kommos_init, kommos_add_scsi_unit, ROMTYPE_KOMMOS, 0, 0, 1, true, + kommos_init, NULL, kommos_add_scsi_unit, ROMTYPE_KOMMOS, 0, 0, 1, true, NULL, 0, false, EXPANSIONTYPE_SCSI }, { _T("vector"), _T("Vector Falcon 8000"), _T("HK-Computer"), - vector_init, vector_add_scsi_unit, ROMTYPE_VECTOR, 0, 0, 2, false, + vector_init, NULL, vector_add_scsi_unit, ROMTYPE_VECTOR, 0, 0, 2, false, NULL, 0, false, EXPANSIONTYPE_SCSI }, { _T("add500"), _T("ADD-500"), _T("Archos"), - add500_init, add500_add_scsi_unit, ROMTYPE_ADD500, 0, 0, 2, false, + add500_init, NULL, add500_add_scsi_unit, ROMTYPE_ADD500, 0, 0, 2, false, NULL, 0, false, EXPANSIONTYPE_SCSI, 8498, 27, 0, true, NULL }, { _T("rochard"), _T("RocHard RH800C"), _T("Roctec"), - rochard_init, rochard_add_idescsi_unit, ROMTYPE_ROCHARD | ROMTYPE_NONE, 0, 0, 2, false, + rochard_init, NULL, rochard_add_idescsi_unit, ROMTYPE_ROCHARD | ROMTYPE_NONE, 0, 0, 2, false, rochard_sub, 0, true, EXPANSIONTYPE_IDE | EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE_PORT_DOUBLED, 2144, 2, 0 }, { _T("cltda1000scsi"), _T("A1000/A2000 SCSI"), _T("C-Ltd"), - cltda1000scsi_init, cltda1000scsi_add_scsi_unit, ROMTYPE_CLTDSCSI | ROMTYPE_NONE, 0, 0, 2, false, + cltda1000scsi_init, NULL, cltda1000scsi_add_scsi_unit, ROMTYPE_CLTDSCSI | ROMTYPE_NOT, 0, 0, 2, false, NULL, 0, false, EXPANSIONTYPE_SCSI, 0, 0, 0, false, NULL, @@ -2504,7 +2585,7 @@ const struct expansionromtype expansionroms[] = { }, { _T("ptnexus"), _T("Nexus"), _T("Preferred Technologies"), - ptnexus_init, ptnexus_add_scsi_unit, ROMTYPE_PTNEXUS | ROMTYPE_NONE, 0, 0, 2, false, + ptnexus_init, NULL, ptnexus_add_scsi_unit, ROMTYPE_PTNEXUS | ROMTYPE_NONE, 0, 0, 2, false, NULL, 0, false, EXPANSIONTYPE_SCSI, 2102, 4, 0, false, nexus_memory_callback, @@ -2513,7 +2594,7 @@ const struct expansionromtype expansionroms[] = { }, { _T("dataflyerscsiplus"), _T("DataFlyer SCSI+"), _T("Expansion Systems"), - dataflyer_init, dataflyer_add_scsi_unit, ROMTYPE_DATAFLYER | ROMTYPE_NONE, 0, 0, 1, true, + dataflyer_init, NULL, dataflyer_add_scsi_unit, ROMTYPE_DATAFLYER | ROMTYPE_NOT, 0, 0, 1, true, NULL, 0, false, EXPANSIONTYPE_SCSI, }, @@ -2529,7 +2610,7 @@ const struct expansionromtype expansionroms[] = { #endif { _T("amax"), _T("AMAX ROM dongle"), _T("ReadySoft"), - NULL, 0, NULL, NULL, ROMTYPE_AMAX | ROMTYPE_NONE, 0, 0, 0, false + NULL, 0, NULL, NULL, NULL, ROMTYPE_AMAX | ROMTYPE_NONE, 0, 0, 0, false }, { NULL @@ -2571,17 +2652,19 @@ static const struct cpuboardsubtype gvpboard_sub[] = { _T("A530"), _T("GVPA530"), ROMTYPE_GVPS2, 0, - gvp_s2_add_scsi_unit, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_24BIT, + gvp_s2_add_accelerator_scsi_unit, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_24BIT, BOARD_MEMORY_Z2, 8 * 1024 * 1024, 0, - gvp_init_accelerator, NULL, 2, 1 + gvp_init_accelerator, NULL, 2, 1, + NULL, NULL, + 2017, 9, 0, false }, { _T("G-Force 030"), _T("GVPGFORCE030"), ROMTYPE_GVPS2, ROMTYPE_GVPS12, - gvp_s2_add_scsi_unit, EXPANSIONTYPE_SCSI, + gvp_s2_add_accelerator_scsi_unit, EXPANSIONTYPE_SCSI, BOARD_MEMORY_25BITMEM, 128 * 1024 * 1024, 0, @@ -2734,6 +2817,16 @@ static const struct cpuboardsubtype dbk_sub[] = { 0, ncr_dkb_autoconfig_init, NULL, 2, 0 }, + { + _T("Wildfire"), + _T("wildfire"), + ROMTYPE_CB_DBK_WF, 0, + wildfire_add_scsi_unit, EXPANSIONTYPE_SCSI, + BOARD_MEMORY_HIGHMEM, + 128 * 1024 * 1024, + 0, + dkb_wildfire_pci_init, NULL, 2, 0 // fake board + }, { NULL } diff --git a/filesys.cpp b/filesys.cpp index 30b201ab..facc69a5 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -793,6 +793,11 @@ static void allocuci (struct uae_prefs *p, int nr, int idx) allocuci (p, nr, idx, -1); } +static const TCHAR *getunittype(struct uaedev_config_info *uci) +{ + return uci->type == UAEDEV_CD ? _T("CD") : (uci->type == UAEDEV_TAPE ? _T("TAPE") : _T("HD")); +} + static int cpuboard_hd; static romconfig cpuboard_dummy; @@ -804,9 +809,9 @@ void add_cpuboard_unit(int unit, struct uaedev_config_info *uci, struct romconfi if (cbt->subtypes) { if (cbt->subtypes[currprefs.cpuboard_subtype].add && (cbt->subtypes[currprefs.cpuboard_subtype].deviceflags & flags)) { if (unit >= 0) { - write_log(_T("Adding CPUBoard '%s' HD unit %d ('%s')\n"), + write_log(_T("Adding CPUBoard '%s' %s unit %d ('%s')\n"), cbt->subtypes[currprefs.cpuboard_subtype].name, - unit, uci->rootdir); + getunittype(uci), unit, uci->rootdir); } cbt->subtypes[currprefs.cpuboard_subtype].add(unit, uci, rc); cpuboard_hd = 1; @@ -825,9 +830,11 @@ static void add_cpuboard_unit_init(void) const struct cpuboardtype *cbt = &cpuboards[currprefs.cpuboard_type]; if (cbt->subtypes) { if (cbt->subtypes[currprefs.cpuboard_subtype].add) { + const struct cpuboardsubtype *cst = &cbt->subtypes[currprefs.cpuboard_subtype]; struct uaedev_config_info ci = { 0 }; - write_log(_T("Initializing CPUBoard '%s' HD controller\n"), cbt->subtypes[currprefs.cpuboard_subtype].name); - cbt->subtypes[currprefs.cpuboard_subtype].add(-1, &ci, rc); + write_log(_T("Initializing CPUBoard '%s' %s controller\n"), + cst->name, (cst->deviceflags & EXPANSIONTYPE_SCSI) ? _T("SCSI") : _T("IDE")); + cst->add(-1, &ci, rc); } } } @@ -876,8 +883,8 @@ static bool add_ide_unit(int type, int unit, struct uaedev_config_info *uci) bool added = false; if (type == HD_CONTROLLER_TYPE_IDE_MB) { if (ismainboardide()) { - write_log(_T("Adding mainboard IDE HD unit %d ('%s')\n"), - unit, uci->rootdir); + write_log(_T("Adding mainboard IDE %s unit %d ('%s')\n"), + getunittype(uci), unit, uci->rootdir); gayle_add_ide_unit(unit, uci); added = true; } @@ -889,7 +896,7 @@ static bool add_ide_unit(int type, int unit, struct uaedev_config_info *uci) cpuboard_hd = 1; if (ert->add) { struct romconfig *rc = get_device_romconfig(&currprefs, ert->romtype, uci->controller_type_unit); - write_log(_T("Adding IDE HD '%s' unit %d ('%s')\n"), + write_log(_T("Adding IDE %s '%s' unit %d ('%s')\n"), getunittype(uci), ert->name, unit, uci->rootdir); ert->add(unit, uci, rc); } @@ -908,7 +915,7 @@ static bool add_scsi_unit(int type, int unit, struct uaedev_config_info *uci) if (type == HD_CONTROLLER_TYPE_SCSI_A3000) { #ifdef A2091 if (isa3000scsi()) { - write_log(_T("Adding A3000 mainboard SCSI HD unit %d ('%s')\n"), + write_log(_T("Adding A3000 mainboard SCSI %s unit %d ('%s')\n"), getunittype(uci), unit, uci->rootdir); a3000_add_scsi_unit (unit, uci, NULL); added = true; @@ -917,7 +924,7 @@ static bool add_scsi_unit(int type, int unit, struct uaedev_config_info *uci) } else if (type == HD_CONTROLLER_TYPE_SCSI_A4000T) { #ifdef NCR if (isa4000tscsi()) { - write_log(_T("Adding A4000T mainboard SCSI HD unit %d ('%s')\n"), + write_log(_T("Adding A4000T mainboard SCSI %s unit %d ('%s')\n"), getunittype(uci), unit, uci->rootdir); a4000t_add_scsi_unit (unit, uci, NULL); added = true; @@ -926,7 +933,7 @@ static bool add_scsi_unit(int type, int unit, struct uaedev_config_info *uci) } else if (type == HD_CONTROLLER_TYPE_SCSI_CDTV) { #ifdef CDTV if (iscdtvscsi()) { - write_log(_T("Adding CDTV SCSI expansion HD unit %d ('%s')\n"), + write_log(_T("Adding CDTV SCSI expansion %s unit %d ('%s')\n"), getunittype(uci), unit, uci->rootdir); cdtv_add_scsi_unit (unit, uci, NULL); added = true; @@ -940,7 +947,7 @@ static bool add_scsi_unit(int type, int unit, struct uaedev_config_info *uci) cpuboard_hd = 1; if (ert->add) { struct romconfig *rc = get_device_romconfig(&currprefs, ert->romtype, uci->controller_type_unit); - write_log(_T("Adding SCSI HD '%s' unit %d ('%s')\n"), + write_log(_T("Adding SCSI %s '%s' unit %d ('%s')\n"), getunittype(uci), ert->name, unit, uci->rootdir); ert->add(unit, uci, rc); } diff --git a/include/a2091.h b/include/a2091.h index 1017daea..17866854 100644 --- a/include/a2091.h +++ b/include/a2091.h @@ -137,6 +137,7 @@ extern void a2090_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct ro extern void a2091_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); extern void gvp_s1_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); extern void gvp_s2_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +extern void gvp_s2_add_accelerator_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); extern void a3000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); extern int add_wd_scsi_hd (struct wd_state *wd, int ch, struct hd_hardfiledata *hfd, struct uaedev_config_info *ci, int scsi_level); diff --git a/include/autoconf.h b/include/autoconf.h index af9e42a6..65e1ab4f 100644 --- a/include/autoconf.h +++ b/include/autoconf.h @@ -120,6 +120,7 @@ struct expansionsubromtype { const TCHAR *name; const TCHAR *configname; + int romtype; int memory_mid, memory_pid; uae_u32 memory_serial; bool memory_after; @@ -130,7 +131,7 @@ struct expansionromtype const TCHAR *name; const TCHAR *friendlyname; const TCHAR *friendlymanufacturer; - DEVICE_INIT init; + DEVICE_INIT init, init2; DEVICE_ADD add; int romtype; int romtype_extra; @@ -165,6 +166,11 @@ struct cpuboardsubtype int initflag; const struct expansionboardsettings *settings; E8ACCESS e8; + // if includes Z2 or Z3 RAM + int memory_mid, memory_pid; + uae_u32 memory_serial; + bool memory_after; + uae_u8 autoconfig[16]; }; struct cpuboardtype { diff --git a/include/memory.h b/include/memory.h index a3c3a1c5..66996bf1 100644 --- a/include/memory.h +++ b/include/memory.h @@ -412,7 +412,8 @@ extern addrbank *get_mem_bank_real(uaecptr); extern void memory_init (void); extern void memory_cleanup (void); extern void map_banks (addrbank *bank, int first, int count, int realsize); -extern void map_banks_z2 (addrbank *bank, int first, int count); +extern void map_banks_z2(addrbank *bank, int first, int count); +extern void map_banks_z3(addrbank *bank, int first, int count); extern void map_banks_quick (addrbank *bank, int first, int count, int realsize); extern void map_banks_nojitdirect (addrbank *bank, int first, int count, int realsize); extern void map_banks_cond (addrbank *bank, int first, int count, int realsize); diff --git a/include/ncr_scsi.h b/include/ncr_scsi.h index c90fe19d..02ff459f 100644 --- a/include/ncr_scsi.h +++ b/include/ncr_scsi.h @@ -2,6 +2,10 @@ void ncr710_io_bput_a4000t(uaecptr, uae_u32); uae_u32 ncr710_io_bget_a4000t(uaecptr); +void ncr815_io_bput_wildfire(uaecptr addr, uae_u32 v); +uae_u32 ncr815_io_bget_wildfire(uaecptr addr); +void wildfire_ncr815_irq(int v); + extern addrbank ncr_bank_cyberstorm; extern addrbank ncr_bank_generic; @@ -22,4 +26,5 @@ extern void tekmagic_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct extern void cyberstorm_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); extern void blizzardppc_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); extern void a4091_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +extern void wildfire_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); diff --git a/include/rommgr.h b/include/rommgr.h index e1d21313..af69fe72 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -1,8 +1,8 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_SUB_MASK 0x000000ff -#define ROMTYPE_GROUP_MASK 0x00ffff00 -#define ROMTYPE_MASK 0x00ffffff +#define ROMTYPE_GROUP_MASK 0x003fff00 +#define ROMTYPE_MASK 0x003fffff #define ROMTYPE_KICK 0x00000100 #define ROMTYPE_KICKCD32 0x00000200 @@ -33,6 +33,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_CB_BLIZPPC 0x0004000f #define ROMTYPE_CB_GOLEM030 0x00040010 #define ROMTYPE_CB_ACA500 0x00040011 +#define ROMTYPE_CB_DBK_WF 0x00040012 #define ROMTYPE_FREEZER 0x00080000 #define ROMTYPE_AR 0x00080001 @@ -72,7 +73,10 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_CLTDSCSI 0x0010001b #define ROMTYPE_PTNEXUS 0x0010001c #define ROMTYPE_DATAFLYER 0x0010001d +#define ROMTYPE_SUPRADMA 0x0010001e +#define ROMTYPE_PCIBRIDGE 0x0010001f +#define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 #define ROMTYPE_EVEN 0x02000000 #define ROMTYPE_ODD 0x04000000 diff --git a/memory.cpp b/memory.cpp index 172a9b21..72faf29c 100644 --- a/memory.cpp +++ b/memory.cpp @@ -149,7 +149,7 @@ static void REGPARAM3 dummy_wput (uaecptr, uae_u32) REGPARAM; static void REGPARAM3 dummy_bput (uaecptr, uae_u32) REGPARAM; static int REGPARAM3 dummy_check (uaecptr addr, uae_u32 size) REGPARAM; -#define MAX_ILG 200 +#define MAX_ILG 1000 #define NONEXISTINGDATA 0 //#define NONEXISTINGDATA 0xffffffff @@ -1054,6 +1054,13 @@ static int be_cnt; uae_u8 *REGPARAM2 default_xlate (uaecptr addr) { + static int recursive; + + if (recursive) { + cpu_halt(CPU_HALT_OPCODE_FETCH_FROM_NON_EXISTING_ADDRESS); + return kickmem_xlate(2); + } + recursive++; int size = currprefs.cpu_model >= 68020 ? 4 : 2; if (quit_program == 0) { /* do this only in 68010+ mode, there are some tricky A500 programs.. */ @@ -1083,10 +1090,11 @@ uae_u8 *REGPARAM2 default_xlate (uaecptr addr) if (0 || (gary_toenb && (gary_nonrange(addr) || (size > 1 && gary_nonrange(addr + size - 1))))) { exception2 (addr, false, size, regs.s ? 4 : 0); } else { - cpu_halt(3); + cpu_halt(CPU_HALT_OPCODE_FETCH_FROM_NON_EXISTING_ADDRESS); } } } + recursive--; return kickmem_xlate (2); /* So we don't crash. */ } @@ -2765,25 +2773,41 @@ void map_banks (addrbank *bank, int start, int size, int realsize) #endif } +void map_banks_z3(addrbank *bank, int start, int size) +{ + if (start < 0x1000 || size <= 0 || size > 0x4000 || start + size > 0xf000) { + write_log(_T("Z3 invalid map_banks start=%08x size=%08x\n"), start, size); + cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT); + return; + } + map_banks(bank, start, size, 0); +} + void map_banks_z2 (addrbank *bank, int start, int size) { if (start < 0x20 || (start >= 0xa0 && start < 0xe9) || start >= 0xf0) { write_log(_T("Z2 map_banks with invalid start address %08X\n"), start << 16); + cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT); return; } if (start >= 0xe9) { if (start + size > 0xf0) { write_log(_T("Z2 map_banks with invalid region %08x - %08X\n"), start << 16, (start + size) << 16); - size = 0xf0 - start; + cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT); + return; } } else { if (start + size > 0xa0) { write_log(_T("Z2 map_banks with invalid region %08x - %08X\n"), start << 16, (start + size) << 16); - size = 0xa0 - start; + cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT); + return; } } - if (size <= 0) + if (size <= 0 || size > 0x80) { + write_log(_T("Z2 map_banks with invalid size %08x\n"), size); + cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT); return; + } map_banks (bank, start, size, 0); } diff --git a/ncr9x_scsi.cpp b/ncr9x_scsi.cpp index d1560044..5d132c90 100644 --- a/ncr9x_scsi.cpp +++ b/ncr9x_scsi.cpp @@ -1133,7 +1133,7 @@ static void REGPARAM2 ncr9x_wput(struct ncr9x_state *ncr, uaecptr addr, uae_u32 switch (addr) { case 0x44: - map_banks (ncr->bank, expamem_z3_pointer >> 16, FASTLANE_BOARD_SIZE >> 16, 0); + map_banks_z3(ncr->bank, expamem_z3_pointer >> 16, FASTLANE_BOARD_SIZE >> 16); ncr->baseaddress = expamem_z3_pointer; ncr->configured = 1; expamem_next (ncr->bank, NULL); @@ -1163,11 +1163,11 @@ static void REGPARAM2 ncr9x_bput(struct ncr9x_state *ncr, uaecptr addr, uae_u32 { case 0x48: if (isncr(ncr, ncr_oktagon2008_scsi)) { - map_banks (ncr->bank, expamem_z2_pointer >> 16, OKTAGON_BOARD_SIZE >> 16, 0); + map_banks_z2(ncr->bank, expamem_z2_pointer >> 16, OKTAGON_BOARD_SIZE >> 16); ncr->configured = 1; expamem_next (ncr->bank, NULL); } else if (ncr == ncr_dkb1200_scsi) { - map_banks (ncr->bank, expamem_z2_pointer >> 16, DKB_BOARD_SIZE >> 16, 0); + map_banks_z2(ncr->bank, expamem_z2_pointer >> 16, DKB_BOARD_SIZE >> 16); ncr->configured = 1; expamem_next (ncr->bank, NULL); } diff --git a/ncr_scsi.cpp b/ncr_scsi.cpp index febe2581..c583a9cc 100644 --- a/ncr_scsi.cpp +++ b/ncr_scsi.cpp @@ -160,6 +160,7 @@ static struct ncr_state *ncr_cpuboard; static struct ncr_state *ncr_we; static struct ncr_state *ncr_a4000t; static struct ncr_state *ncra4091[MAX_DUPLICATE_EXPANSION_BOARDS]; +static struct ncr_state *ncr_wildfire; extern void cyberstorm_mk3_ppc_irq(int); extern void blizzardppc_irq(int); @@ -548,7 +549,7 @@ static void REGPARAM2 ncr_wput (struct ncr_state *ncr, uaecptr addr, uae_u32 w) switch (addr) { case 0x44: - map_banks (ncr->bank, expamem_z3_pointer >> 16, BOARD_SIZE >> 16, 0); + map_banks_z3(ncr->bank, expamem_z3_pointer >> 16, BOARD_SIZE >> 16); ncr->board_mask = 0x00ffffff; ncr->baseaddress = expamem_z3_pointer; ncr->configured = 1; @@ -596,6 +597,15 @@ uae_u32 ncr710_io_bget_a4000t(uaecptr addr) return ncr710_io_bget(ncr_a4000t, addr); } +void ncr815_io_bput_wildfire(uaecptr addr, uae_u32 v) +{ + ncr_io_bput(ncr_wildfire, addr, v); +} +uae_u32 ncr815_io_bget_wildfire(uaecptr addr) +{ + return ncr_io_bget(ncr_wildfire, addr); +} + static void REGPARAM2 ncr_generic_bput (uaecptr addr, uae_u32 b) { struct ncr_state *ncr = getscsiboard(addr); @@ -957,4 +967,13 @@ void blizzardppc_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct rom ncr_bppc->baseaddress = 0xf40000; } +void wildfire_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + ncr_add_scsi_unit(&ncr_wildfire, ch, ci, rc, true); + ncr_wildfire->configured = -1; + ncr_wildfire->enabled = true; + ncr_wildfire->irq_func = wildfire_ncr815_irq; + ncr_wildfire->bank = &ncr_bank_generic; +} + #endif diff --git a/rommgr.cpp b/rommgr.cpp index 239f4267..75dd8dc1 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 142 +#define NEXT_ROM_ID 143 static struct romheader romheaders[] = { { _T("Freezer Cartridges"), 1 }, @@ -113,6 +113,8 @@ static struct romdata roms[] = { 0xffffffff, 0, 0, 0, 0, 0, _T("AROS") }, { _T(" ROM Disabled"), 0, 0, 0, 0, _T("NOROM\0"), 0, 87, 0, 0, ROMTYPE_NONE, 0, 0, NULL, 0xffffffff, 0, 0, 0, 0, 0, _T("NOROM") }, + { _T(" Enabled"), 0, 0, 0, 0, _T("ENABLED\0"), 0, 142, 0, 0, ROMTYPE_NOT, 0, 0, NULL, + 0xffffffff, 0, 0, 0, 0, 0, _T("ENABLED") }, { _T("Cloanto Amiga Forever ROM key"), 0, 0, 0, 0, 0, 2069, 0, 0, 1, ROMTYPE_KEY, 0, 0, NULL, 0x869ae1b1, 0x801bbab3,0x2e3d3738,0x6dd1636d,0x4f1d6fa7,0xe21d5874 }, @@ -1735,7 +1737,7 @@ struct zfile *read_device_from_romconfig(struct romconfig *rc, const int *roms) if (!_tcsicmp(rc->romfile, _T(":NOROM"))) return NULL; struct zfile *z = read_rom_name (rc->romfile); - if (!z) { + if (!z && roms) { struct romlist *rl = getromlistbyids(roms, rc->romfile); if (rl) { struct romdata *rd = rl->rd; @@ -1757,7 +1759,7 @@ struct zfile *read_device_rom(struct uae_prefs *p, int romtype, int devnum, int if (!_tcsicmp(romname, _T(":NOROM"))) return NULL; struct zfile *z = read_rom_name (romname); - if (!z) { + if (!z && roms) { struct romlist *rl = getromlistbyids(roms, romname); if (rl) { struct romdata *rd = rl->rd; diff --git a/scsi.cpp b/scsi.cpp index 5b7d6dce..9e19df30 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -1530,7 +1530,7 @@ static int suprareg(struct soft_scsi *ncr, uaecptr addr, bool write) // "dma" data in/out space reg = 8; if (!(ncr->regs[2] & 2)) - cpu_halt(6); + cpu_halt(CPU_HALT_FAKE_DMA); } return reg; } @@ -2215,7 +2215,7 @@ static void REGPARAM2 ncr80_bput(struct soft_scsi *ncr, uaecptr addr, uae_u32 b) switch (addr) { case 0x48: - map_banks (ncr->bank, expamem_z2_pointer >> 16, ncr->board_size >> 16, 0); + map_banks_z2(ncr->bank, expamem_z2_pointer >> 16, ncr->board_size >> 16); ncr->baseaddress = expamem_z2_pointer; ncr->configured = 1; expamem_next (ncr->bank, NULL); diff --git a/sndboard.cpp b/sndboard.cpp index 9bf7633c..5e21bf11 100644 --- a/sndboard.cpp +++ b/sndboard.cpp @@ -512,7 +512,7 @@ static void REGPARAM2 toccata_bput(uaecptr addr, uae_u32 b) switch (addr) { case 0x48: - map_banks(&toccata_bank, expamem_z2_pointer >> 16, BOARD_SIZE >> 16, 0); + map_banks_z2(&toccata_bank, expamem_z2_pointer >> 16, BOARD_SIZE >> 16); configured = 1; expamem_next(&toccata_bank, NULL); break; -- 2.47.3