From: Toni Wilen Date: Sun, 13 Dec 2015 17:59:49 +0000 (+0200) Subject: Phoenix Board SCSI emulation. X-Git-Tag: 3220~16 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=2535046982bb14bb6cf0c582d4486b4c43d09f67;p=francis%2Fwinuae.git Phoenix Board SCSI emulation. --- diff --git a/expansion.cpp b/expansion.cpp index 24702e8a..1c9e7bf5 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -3090,6 +3090,12 @@ const struct expansionromtype expansionroms[] = { false, EXPANSIONTYPE_SCSI, 8512, 10, 0, false, fastlane_memory_callback }, + { + _T("phoenixboard"), _T("Phoenix Board SCSI"), _T("Phoenix Microtechnologies"), + phoenixboard_init, NULL, phoenixboard_add_scsi_unit, ROMTYPE_PHOENIXB, 0, 0, BOARD_AUTOCONFIG_Z2, true, + NULL, 0, + true, EXPANSIONTYPE_SCSI, + }, { _T("ptnexus"), _T("Nexus"), _T("Preferred Technologies"), ptnexus_init, NULL, ptnexus_add_scsi_unit, ROMTYPE_PTNEXUS | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false, diff --git a/include/rommgr.h b/include/rommgr.h index 9fc6a922..4fe1b661 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -103,6 +103,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_APOLLOHD 0x00100036 #define ROMTYPE_MEVOLUTION 0x00100037 #define ROMTYPE_GOLEMFAST 0x00100038 +#define ROMTYPE_PHOENIXB 0x00100039 #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 diff --git a/include/scsi.h b/include/scsi.h index d525097f..9c577ac8 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -238,6 +238,9 @@ void system2000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romc addrbank *omtiadapter_init(struct romconfig *rc); void omtiadapter_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +addrbank *phoenixboard_init(struct romconfig *rc); +void phoenixboard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); + void x86_xt_hd_bput(int, uae_u8); uae_u8 x86_xt_hd_bget(int); addrbank *x86_xt_hd_init(struct romconfig *rc); diff --git a/rommgr.cpp b/rommgr.cpp index e7912b0a..7a5f4333 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 159 +#define NEXT_ROM_ID 160 #define ALTROM(id,grp,num,size,flags,crc32,a,b,c,d,e) \ { _T("X"), 0, 0, 0, 0, 0, size, id, 0, 0, flags, (grp << 16) | num, 0, NULL, crc32, a, b, c, d, e }, @@ -431,6 +431,8 @@ static struct romdata roms[] = { 0x5e94ee56, 0xf83dae55, 0x49f9b735, 0x52d5c6e0, 0x41da4c6c, 0x995a7f47, NULL, NULL }, ALTROMPN(157, 1, 1, 8192, ROMTYPE_ODD | ROMTYPE_8BIT, NULL, 0xec13fda0, 0x6af1447c, 0x4363c46d, 0x05697458, 0x01daa30c, 0x03c01c9f) ALTROMPN(157, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x39b0075e, 0xf6644ea0, 0x6c3ed349, 0xfb0fb6b4, 0xa9f07655, 0x0b104179) + { _T("Phoenix Board SCSI v.J"), 3, 1, 3, 1, _T("PBSCSI\0"), 32768, 159, 0, 0, ROMTYPE_PHOENIXB, 0, 0, NULL, + 0x1f672e4b, 0xb20d50b8, 0x31ec9823, 0xfa732fc6, 0x522ecc6a, 0xae36ec33, NULL, NULL }, { _T("CyberStorm MK I 68040"), 0, 0, 0, 0, _T("CSMKI\0"), 32768, 95, 0, 0, ROMTYPE_CB_CSMK1, 0, 0, NULL, 0, 0, 0, 0, 0, 0, NULL, _T("cyberstormmk1_040.rom") }, diff --git a/scsi.cpp b/scsi.cpp index fd9d87de..8ae11adc 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -53,7 +53,8 @@ #define OMTI_SYSTEM2000 22 #define OMTI_ADAPTER 23 #define OMTI_X86 24 -#define NCR_LAST 25 +#define NCR5380_PHOENIXBOARD 25 +#define NCR_LAST 26 extern int log_scsiemu; @@ -2085,6 +2086,17 @@ static int microforge_reg(struct soft_scsi *ncr, uaecptr addr, bool write) return reg; } +static int phoenixboard_reg(struct soft_scsi *ncr, uaecptr addr) +{ + if (addr & 1) + return -1; + if (addr & 0xc000) + return -1; + addr >>= 1; + addr &= 7; + return addr; +} + static uae_u8 read_supra_dma(struct soft_scsi *ncr, uaecptr addr) { uae_u8 val = 0; @@ -2576,6 +2588,14 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size) } } + } else if (ncr->type == NCR5380_PHOENIXBOARD) { + + reg = phoenixboard_reg(ncr, addr); + if (reg >= 0) { + v = ncr5380_bget(ncr, reg); + } else if (addr < 0x8000) { + v = ncr->rom[addr]; + } } #if NCR5380_DEBUG > 1 if ((origaddr >= 0xf00000 && size == 1) || (origaddr < 0xf00000)) @@ -2818,6 +2838,13 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si } } + } else if (ncr->type == NCR5380_PHOENIXBOARD) { + + reg = phoenixboard_reg(ncr, addr); + if (reg >= 0) { + ncr5380_bput(ncr, reg, val); + } + } #if NCR5380_DEBUG > 1 @@ -3061,6 +3088,24 @@ uae_u32 soft_scsi_get(uaecptr addr, int size) return v; } +void soft_scsi_free(void) +{ + parallel_port_scsi = false; + parallel_port_scsi_data = NULL; + x86_hd_data = NULL; + for (int i = 0; soft_scsi_devices[i]; i++) { + soft_scsi_free_unit(soft_scsi_devices[i]); + soft_scsi_devices[i] = NULL; + } +} + +void soft_scsi_reset(void) +{ + for (int i = 0; soft_scsi_devices[i]; i++) { + raw_scsi_reset(&soft_scsi_devices[i]->rscsi); + } +} + /* $8380 select unit (unit mask) @@ -3358,7 +3403,7 @@ static void expansion_add_protoautoconfig_data(uae_u8 *p, uae_u16 manufacturer_i memset(p, 0, 4096); p[0x02] = product_id; p[0x08] = manufacturer_id >> 8; - p[0x0a] = manufacturer_id; + p[0x0a] = (uae_u8)manufacturer_id; } static void expansion_add_protoautoconfig_box(uae_u8 *p, int box_size, uae_u16 manufacturer_id, uae_u8 product_id) @@ -3620,20 +3665,23 @@ void x86_add_xt_hd_unit(int ch, struct uaedev_config_info *ci, struct romconfig generic_soft_scsi_add(ch, ci, rc, OMTI_X86, 0, 0, ROMTYPE_X86_HD); } -void soft_scsi_free(void) +addrbank *phoenixboard_init(struct romconfig *rc) { - parallel_port_scsi = false; - parallel_port_scsi_data = NULL; - x86_hd_data = NULL; - for (int i = 0; soft_scsi_devices[i]; i++) { - soft_scsi_free_unit(soft_scsi_devices[i]); - soft_scsi_devices[i] = NULL; - } + struct soft_scsi *scsi = getscsi(rc); + + if (!scsi) + return NULL; + + const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_PHOENIXB); + load_rom_rc(rc, ROMTYPE_PHOENIXB, 8192, rc->autoboot_disabled ? 0 : 8192, scsi->rom, 16384, LOADROM_EVENONLY_ODDONE | LOADROM_FILL); + load_rom_rc(rc, ROMTYPE_PHOENIXB, 16384, 16384, scsi->rom + 16384, 16384, LOADROM_EVENONLY_ODDONE | LOADROM_FILL); + memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory); + + return scsi->bank; } -void soft_scsi_reset(void) +void phoenixboard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) { - for (int i = 0; soft_scsi_devices[i]; i++) { - raw_scsi_reset(&soft_scsi_devices[i]->rscsi); - } + generic_soft_scsi_add(ch, ci, rc, NCR5380_PHOENIXBOARD, 65536, 32768, ROMTYPE_PHOENIXB); } +