From d5fc14175cd92cabf61de564e4077e3e42c82d11 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 23 Jul 2017 12:06:14 +0300 Subject: [PATCH] Vortex System 2000 ROM, partial Sprit Technology InMate support. --- expansion.cpp | 8 ++++++- include/rommgr.h | 1 + include/scsi.h | 4 ++++ rommgr.cpp | 6 ++++- scsi.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 74 insertions(+), 5 deletions(-) diff --git a/expansion.cpp b/expansion.cpp index b02fa187..a6f9e456 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -4800,6 +4800,12 @@ const struct expansionromtype expansionroms[] = { 2144, 2, 0, false, NULL, false, 2, NULL }, + { + _T("inmate"), _T("InMate"), _T("Spirit Technology"), + NULL, inmate_init, NULL, inmate_add_scsi_unit, ROMTYPE_INMATE | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false, + NULL, 0, + true, EXPANSIONTYPE_SCSI + }, { _T("supradrive"), _T("SupraDrive"), _T("Supra Corporation"), NULL, supra_init, NULL, supra_add_scsi_unit, ROMTYPE_SUPRA | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false, @@ -4842,7 +4848,7 @@ const struct expansionromtype expansionroms[] = { }, { _T("system2000"), _T("System 2000"), _T("Vortex"), - NULL, system2000_init, NULL, system2000_add_scsi_unit, ROMTYPE_SYSTEM2000 | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true, + system2000_preinit, system2000_init, NULL, system2000_add_scsi_unit, ROMTYPE_SYSTEM2000 | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true, NULL, 0, false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI }, diff --git a/include/rommgr.h b/include/rommgr.h index 6b894545..c7e852c0 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -156,6 +156,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_ADDHARD 0x00100066 #define ROMTYPE_A2090B 0x00100067 #define ROMTYPE_FASTATA4K 0x00100068 +#define ROMTYPE_INMATE 0x00100069 #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 diff --git a/include/scsi.h b/include/scsi.h index 1c1fa7f9..49634c32 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -240,6 +240,7 @@ void alf1_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig bool promigos_init(struct autoconfig_info *aci); void promigos_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +bool system2000_preinit(struct autoconfig_info *aci); bool system2000_init(struct autoconfig_info *aci); void system2000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); @@ -267,6 +268,9 @@ void malibu_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi bool addhard_init(struct autoconfig_info*); void addhard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +bool inmate_init(struct autoconfig_info*); +void inmate_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 32a9b638..089c7aff 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 218 +#define NEXT_ROM_ID 220 #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 }, @@ -535,6 +535,10 @@ static struct romdata roms[] = { 0xe60b1ce6, 0xa7c4b709, 0x494f4034, 0x42b8ec11, 0x090dc1d0, 0x18098ebc, NULL, NULL }, { _T("Ashcom Design AddHard v2.0"), 1, 0, 1, 0, _T("ADDHARD\0"), 16384, 209, 0, 0, ROMTYPE_ADDHARD, 0, 0, NULL, 0xe9ad804a, 0x9ebabbeb,0xc1e5ce9e,0xd8e43870,0xdd810524,0x770ba6b4, NULL, NULL }, + { _T("Spirite Technology InMate"), 1, 0, 1, 0, _T("INMATE\0"), 32768, 218, 0, 0, ROMTYPE_INMATE, 0, 0, NULL, + 0xa2e0cfb8, 0xfa7199d2,0xea343b01,0x4b0f6eb6,0x992d2e95,0x40fce61b, NULL, NULL }, + { _T("Vortex System 2000"), 1, 0, 1, 0, _T("SYSTEM2000\0"), 32768, 219, 0, 0, ROMTYPE_SYSTEM2000, 0, 0, NULL, + 0x053097c3, 0xee87f26c,0xf858b63a,0xd6bff74b,0x802cea03,0x97281fad, 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 79a540ec..68a12310 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -62,7 +62,8 @@ #define NONCR_HARDFRAME 31 #define NCR5380_MALIBU 32 #define NCR5380_ADDHARD 33 -#define NCR_LAST 34 +#define NONCR_INMATE 34 +#define NCR_LAST 35 extern int log_scsiemu; @@ -213,10 +214,11 @@ bool scsi_emulate_analyze (struct scsi_data *sd) return true; } if (data_len < 0) { - if (cmd_len == 6) + if (cmd_len == 6) { sd->data_len = sd->cmd[4]; - else + } else { sd->data_len = (sd->cmd[7] << 8) | sd->cmd[8]; + } } else { sd->data_len = data_len; } @@ -2654,6 +2656,18 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size) v = ncr->rom[addr]; } + } else if (ncr->type == NONCR_INMATE) { + + if (!(addr & 0x8000)) { + if (addr == 0x80) { + v = aic_bget_reg(ncr); + } else if (addr == 0x82) { + v = aic_bget_data(ncr); + } + } else { + v = ncr->rom[addr]; + } + } else if (ncr->type == NCR5380_SUPRA) { if (ncr->subtype == 4) { @@ -3134,6 +3148,14 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si write_684xx_dma(ncr, addr & 31, val); } + } else if (ncr->type == NONCR_INMATE) { + + if (addr == 0x80) { + aic_bput_reg(ncr, val); + } else if (addr == 0x82) { + aic_bput_data(ncr, val); + } + } else if (ncr->type == NCR5380_SUPRA) { if (ncr->subtype == 4) { @@ -4320,6 +4342,16 @@ bool system2000_init(struct autoconfig_info *aci) if (!scsi) return false; + return true; +} + +bool system2000_preinit(struct autoconfig_info *aci) +{ + struct soft_scsi *scsi = getscsi(aci->rc); + + if (!scsi) + return false; + map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0); scsi->board_mask = aci->size - 1; scsi->baseaddress = aci->start; @@ -4540,6 +4572,28 @@ void hardframe_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romco generic_soft_scsi_add(ch, ci, rc, NONCR_HARDFRAME, 65536, 65536, ROMTYPE_HARDFRAME); } +bool inmate_init(struct autoconfig_info *aci) +{ + if (!aci->doinit) { + load_rom_rc(aci->rc, ROMTYPE_INMATE, 32768, 0, 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_INMATE, 32768, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE); + memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory); + aci->addrbank = scsi->bank; + return true; +} + +void inmate_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + generic_soft_scsi_add(ch, ci, rc, NONCR_INMATE, 65536, 65536, ROMTYPE_INMATE); +} + bool malibu_init(struct autoconfig_info *aci) { const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_MALIBU); -- 2.47.3