From: Toni Wilen Date: Sat, 9 Jan 2021 14:58:48 +0000 (+0200) Subject: Combitec HD20A/HD40A X-Git-Tag: 4900~216 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=f8b416ef354bf1558ecdd8b2549798e7b9c31540;p=francis%2Fwinuae.git Combitec HD20A/HD40A --- diff --git a/expansion.cpp b/expansion.cpp index 80861e80..db98be0a 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -5671,7 +5671,13 @@ const struct expansionromtype expansionroms[] = { { _T("omtiadapter"), _T("OMTI-Adapter"), _T("C't"), - NULL, omtiadapter_init, NULL, omtiadapter_scsi_unit, ROMTYPE_OMTIADAPTER | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true, + NULL, omtiadapter_init, NULL, omtiadapter_add_scsi_unit, ROMTYPE_OMTIADAPTER | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true, + NULL, 0, + false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI + }, + { + _T("hd20a"), _T("HD 20 A/HD 40 A"), _T("Combitec"), + NULL, hd20_init, NULL, hd20_add_scsi_unit, ROMTYPE_HD20A, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true, NULL, 0, false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI }, diff --git a/include/rommgr.h b/include/rommgr.h index 71e0b63f..a5e9c897 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -200,6 +200,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_VOODOO3 0x00100088 #define ROMTYPE_S3VIRGE 0x00100089 #define ROMTYPE_VOODOO5 0x0010008a +#define ROMTYPE_HD20A 0x0010008b #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 diff --git a/include/scsi.h b/include/scsi.h index 0646b25c..0a2acd62 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -255,7 +255,10 @@ bool system2000_init(struct autoconfig_info *aci); void system2000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); bool omtiadapter_init(struct autoconfig_info *aci); -void omtiadapter_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +void omtiadapter_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); + +bool hd20_init(struct autoconfig_info *aci); +void hd20_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); bool phoenixboard_init(struct autoconfig_info *aci); void phoenixboard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); diff --git a/rommgr.cpp b/rommgr.cpp index f0f656ef..78383d06 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 267 +#define NEXT_ROM_ID 268 #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 }, @@ -650,6 +650,8 @@ static struct romdata roms[] = { 0xb475ff5f, 0x63609553,0x98b06812,0x23ade9ac,0x6ee31364,0x5375fce3, NULL, NULL }, { _T("Hardital Synthesis"), 0, 0, 0, 0, _T("SYNTHESIS\0"), 32768, 266, 0, 0, ROMTYPE_SYNTHESIS, 0, 0, NULL, 0x667c7616, 0x0eb1cb38,0x3133f070,0x7cb57944,0xc516f236,0xbad4d4f6, NULL, NULL }, + { _T("Combitec HD20A/HD40A"), 0, 0, 0, 0, _T("HD20A\0"), 32768, 267, 0, 0, ROMTYPE_HD20A, 0, 0, NULL, + 0x0e7391b4, 0x7c365adb,0x3496c479,0x5e94a166,0xd834254a,0x6112d91c, 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 0cc2ae68..29dda9c4 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -79,7 +79,8 @@ #define OMTI_ALF2 44 #define NCR5380_SYNTHESIS 45 // clone of ICD AdSCSI #define NCR5380_FIREBALL 46 -#define NCR_LAST 47 +#define OMTI_HD20 47 +#define NCR_LAST 48 extern int log_scsiemu; @@ -3449,7 +3450,7 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size) if (reg >= 0) v = omti_bget(ncr, reg); - } else if (ncr->type == OMTI_ALF2) { + } else if (ncr->type == OMTI_ALF2 || ncr->type == OMTI_HD20) { reg = alf2_reg(ncr, origaddr, false); if (reg >= 0) { @@ -3918,7 +3919,7 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si if (reg >= 0) omti_bput(ncr, reg, val); - } else if (ncr->type == OMTI_ALF2) { + } else if (ncr->type == OMTI_ALF2 || ncr->type == OMTI_HD20) { reg = alf2_reg(ncr, origaddr, true); if (reg >= 0) @@ -5089,6 +5090,37 @@ void alf2_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig generic_soft_scsi_add(ch, ci, rc, OMTI_ALF2, 65536, 32768, ROMTYPE_ALF2); } +bool hd20_init(struct autoconfig_info *aci) +{ + aci->start = 0xf00000; + aci->size = 0x10000; + scsi_add_reset(); + if (!aci->doinit) + return true; + + struct soft_scsi *scsi = getscsi(aci->rc); + if (!scsi) + return false; + + load_rom_rc(aci->rc, ROMTYPE_HD20A, 32768, 0, scsi->rom, 32768, 0); + + scsi->baseaddress = 0xf00000; + scsi->baseaddress2 = 0x810000; + scsi->board_mask = 65535; + + map_banks(scsi->bank, scsi->baseaddress >> 16, 1, 0); + map_banks(scsi->bank, scsi->baseaddress2 >> 16, 1, 0); + + scsi->configured = 1; + aci->addrbank = scsi->bank; + return true; +} + +void hd20_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + generic_soft_scsi_add(ch, ci, rc, OMTI_HD20, 65536, 32768, ROMTYPE_HD20A); +} + bool promigos_init(struct autoconfig_info *aci) { aci->start = 0xf40000; @@ -5208,7 +5240,7 @@ bool omtiadapter_init(struct autoconfig_info *aci) return true; } -void omtiadapter_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +void omtiadapter_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) { generic_soft_scsi_add(ch, ci, rc, OMTI_ADAPTER, 65536, 0, ROMTYPE_OMTIADAPTER); }