From: Toni Wilen Date: Fri, 17 Jul 2020 19:09:35 +0000 (+0300) Subject: ALF2 (OMTI variant) emulation. X-Git-Tag: 4900~344 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=5ad699c3e9277c192bd388f4e4966d8cc613f786;p=francis%2Fwinuae.git ALF2 (OMTI variant) emulation. --- diff --git a/expansion.cpp b/expansion.cpp index 7cb2edd9..8dc55ac5 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -5669,6 +5669,12 @@ const struct expansionromtype expansionroms[] = { NULL, 0, false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI }, + { + _T("alf2"), _T("A.L.F.2"), _T("Elaborate Bytes"), + NULL, alf2_init, NULL, alf2_add_scsi_unit, ROMTYPE_ALF2, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true, + NULL, 0, + false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI + }, { _T("alf3"), _T("A.L.F.3"), _T("Elaborate Bytes"), NULL, ncr_alf3_autoconfig_init, NULL, alf3_add_scsi_unit, ROMTYPE_ALF3 | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false, diff --git a/include/rommgr.h b/include/rommgr.h index 220379f1..74bc441f 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -194,6 +194,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_SSQUIRREL 0x00100082 #define ROMTYPE_MASTERCARD 0x00100083 #define ROMTYPE_DOTTO 0x00100084 +#define ROMTYPE_ALF2 0x00100085 #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 diff --git a/include/scsi.h b/include/scsi.h index 80952214..2f0e1a44 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -244,6 +244,9 @@ void hda506_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi bool alf1_init(struct autoconfig_info *aci); void alf1_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +bool alf2_init(struct autoconfig_info *aci); +void alf2_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); + bool promigos_init(struct autoconfig_info *aci); void promigos_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); diff --git a/rommgr.cpp b/rommgr.cpp index 45164dca..f25ee9ca 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 264 +#define NEXT_ROM_ID 265 #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 }, @@ -644,6 +644,8 @@ static struct romdata roms[] = { 0x4837cc3d, 0xeea5e9ab,0xb3ffb4ed,0xdf09825c,0x7e8de75d,0x0d08c01f, NULL, NULL }, { _T("Hardital Dotto"), 0, 0, 0, 0, _T("DOTTO\0"), 32768, 257, 0, 0, ROMTYPE_DOTTO, 0, 0, NULL, 0xee803484, 0x62822cb9,0x0b095efa,0x455496ea,0xd5b22740,0x77d86375, NULL, NULL }, + { _T("A.L.F. 2"), 0, 0, 0, 0, _T("ALF2\0"), 65536, 264, 0, 0, ROMTYPE_ALF2, 0, 0, NULL, + 0x9cf8a7b7, 0x3df4667c,0xd3436367,0x7896da65,0x94994769,0x13bc6746, 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 a8b27a71..0e4f93a9 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -76,7 +76,8 @@ #define NCR5380_12GAUGE 41 #define NCR5380_OVERDRIVE 42 #define NCR5380_TRUMPCARD 43 -#define NCR_LAST 44 +#define OMTI_ALF2 44 +#define NCR_LAST 45 extern int log_scsiemu; @@ -2535,6 +2536,18 @@ static int alf1_reg(struct soft_scsi *ncr, uaecptr addr, bool write) return addr; } +static int alf2_reg(struct soft_scsi *ncr, uaecptr addr, bool write) +{ + if (!(addr & 0x10000)) + return -1; + addr &= 0xffff; + if ((addr & 0x7ff9) != 0x0641) + return -2; + addr >>= 1; + addr &= 3; + return addr; +} + static int wedge_reg(struct soft_scsi *ncr, uaecptr addr, int size, bool write) { if (size != 1) @@ -3325,6 +3338,15 @@ 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) { + + reg = alf2_reg(ncr, origaddr, false); + if (reg >= 0) { + v = omti_bget(ncr, reg); + } else if (reg == -1) { + v = ncr->rom[addr & 32767]; + } + } else if (ncr->type == OMTI_PROMIGOS) { reg = promigos_reg(ncr, addr, size, false); @@ -3774,6 +3796,12 @@ 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) { + + reg = alf2_reg(ncr, origaddr, true); + if (reg >= 0) + omti_bput(ncr, reg, val); + } else if (ncr->type == OMTI_PROMIGOS) { reg = promigos_reg(ncr, addr, size, true); @@ -3962,7 +3990,6 @@ static uae_u32 REGPARAM2 ncr80_bget(struct soft_scsi *ncr, uaecptr addr) { bool iaa = isautoconfigaddr(addr); uae_u32 v; - addr &= ncr->board_mask; if (!ncr->configured && iaa) { addr &= 65535; if (addr >= sizeof ncr->acmemory) @@ -3996,7 +4023,6 @@ static void REGPARAM2 ncr80_bput(struct soft_scsi *ncr, uaecptr addr, uae_u32 b) { bool iaa = isautoconfigaddr(addr); b &= 0xff; - addr &= ncr->board_mask; if (!ncr->configured && iaa) { addr &= 65535; switch (addr) @@ -4805,6 +4831,37 @@ void alf1_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig generic_soft_scsi_add(ch, ci, rc, OMTI_ALF1, 65536, 0, ROMTYPE_ALF1); } +bool alf2_init(struct autoconfig_info *aci) +{ + aci->start = 0xef0000; + aci->size = 0x20000; + 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_ALF2, 32768, 32768, scsi->rom, 32768, 0); + + scsi->baseaddress = 0xf00000; + scsi->baseaddress2 = 0xef0000; + 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 alf2_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + generic_soft_scsi_add(ch, ci, rc, OMTI_ALF2, 65536, 32768, ROMTYPE_ALF2); +} + bool promigos_init(struct autoconfig_info *aci) { aci->start = 0xf40000;