From ac30dbdbd1baacf2d38994378fb6324ced2d19f6 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 17 Mar 2018 16:03:17 +0200 Subject: [PATCH] Xetec FastTrak emulation. --- expansion.cpp | 7 +++++++ include/rommgr.h | 1 + include/scsi.h | 3 +++ rommgr.cpp | 4 +++- scsi.cpp | 50 +++++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 63 insertions(+), 2 deletions(-) diff --git a/expansion.cpp b/expansion.cpp index 70820e0c..2a87f6de 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -5161,6 +5161,13 @@ const struct expansionromtype expansionroms[] = { false, 0, NULL, { 0xc1, 0x04, 0x00, 0x00, 0x07, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { + _T("fasttrak"), _T("FastTrak"), _T("Xetec"), + NULL, fasttrak_init, NULL, fasttrak_add_scsi_unit, ROMTYPE_FASTTRAK, 0, 0, BOARD_AUTOCONFIG_Z2, false, + NULL, 0, + true, EXPANSIONTYPE_SCSI, + 2022, 2, 0 + }, { _T("amax"), _T("AMAX ROM dongle"), _T("ReadySoft"), NULL, NULL, NULL, NULL, ROMTYPE_AMAX | ROMTYPE_NONE, 0, 0, 0, false diff --git a/include/rommgr.h b/include/rommgr.h index 71ce34f7..e8a2861b 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -168,6 +168,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_PROFEX 0x00100070 #define ROMTYPE_ELSATHD 0x00100071 #define ROMTYPE_ALF3 0x00100072 +#define ROMTYPE_FASTTRAK 0x00100073 #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 diff --git a/include/scsi.h b/include/scsi.h index bef2757b..a4b428bf 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -291,6 +291,9 @@ void eveshamref_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romc bool profex_init(struct autoconfig_info *aci); void profex_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +bool fasttrak_init(struct autoconfig_info *aci); +void fasttrak_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); + uae_u8 idescsi_scsi_get(uaecptr addr); void idescsi_scsi_put(uaecptr addr, uae_u8 v); diff --git a/rommgr.cpp b/rommgr.cpp index eb04364a..b709fa8c 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 227 +#define NEXT_ROM_ID 228 #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 }, @@ -561,6 +561,8 @@ static struct romdata roms[] = { 0x1b854f6b, 0xc39d6202, 0xccb65f17, 0x63d1835e, 0x19d5b63d, 0x28f1b6a3, NULL, NULL }, ALTROMPN(224, 1, 1, 8192, ROMTYPE_ODD | ROMTYPE_8BIT, NULL, 0x3ba56b91, 0xef55760e, 0x8d5a5408, 0x7062f9ab, 0xc63ef067, 0x0b23f108) ALTROMPN(224, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x20c2cbb6, 0xb83d7406, 0x6c335a77, 0x0acb30d6, 0xff79a00f, 0x629a6953) + { _T("Xetec FastTrak"), 1, 42, 1, 42, _T("FASTTRACK\0"), 32768, 227, 0, 0, ROMTYPE_FASTTRAK, 0, 0, NULL, + 0xc5ae45d4, 0x8d682bc1,0x72bd2d35,0x4ba2db5c,0x9f6745a4,0x8937782c, 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 b13d6ea8..52c968c5 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -69,7 +69,8 @@ #define OMTI_WEDGE 37 #define NCR5380_EVESHAMREF 38 #define OMTI_PROFEX 39 -#define NCR_LAST 40 +#define NCR5380_FASTTRAK 40 +#define NCR_LAST 41 extern int log_scsiemu; @@ -2608,6 +2609,15 @@ static int eveshamref_reg(struct soft_scsi *ncr, uaecptr addr) return -1; } +static int fasttrak_reg(struct soft_scsi *ncr, uaecptr addr) +{ + if ((addr & 0xc010) == 0x4000) + return (addr >> 1) & 7; + if ((addr & 0xc010) == 0x4010) + return 8; + return -1; +} + static uae_u8 read_684xx_dma(struct soft_scsi *ncr, uaecptr addr) { uae_u8 val = 0; @@ -3295,6 +3305,15 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size) v = ncr->rom[addr & 0x7fff]; } + } else if (ncr->type == NCR5380_FASTTRAK) { + + reg = fasttrak_reg(ncr, addr); + if (reg >= 0) { + v = ncr5380_bget(ncr, reg); + } else { + v = ncr->rom[addr & 0x7fff]; + } + } #if NCR5380_DEBUG > 1 @@ -3681,6 +3700,12 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si reg = eveshamref_reg(ncr, addr); if (reg >= 0) ncr5380_bput(ncr, reg, val); + + } else if (ncr->type == NCR5380_FASTTRAK) { + + reg = fasttrak_reg(ncr, addr); + if (reg >= 0) + ncr5380_bput(ncr, reg, val); } #if NCR5380_DEBUG > 1 @@ -5025,3 +5050,26 @@ void profex_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi ss->rscsi.device[ch]->hfd->sector_buffer[1] = '5'; } } + + +bool fasttrak_init(struct autoconfig_info *aci) +{ + if (!aci->doinit) { + load_rom_rc(aci->rc, ROMTYPE_FASTTRAK, 65536, aci->rc->autoboot_disabled ? 0x4000 : 0x6000, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE); + return true; + } + + struct soft_scsi *scsi = getscsi(aci->rc); + if (!scsi) + return false; + + load_rom_rc(aci->rc, ROMTYPE_FASTTRAK, 65536, aci->rc->autoboot_disabled ? 0x4000 : 0x6000, scsi->rom, 0x4000, LOADROM_EVENONLY_ODDONE); + memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory); + aci->addrbank = scsi->bank; + return true; +} + +void fasttrak_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + generic_soft_scsi_add(ch, ci, rc, NCR5380_FASTTRAK, 65536, 65536, ROMTYPE_FASTTRAK); +} -- 2.47.3