]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
ALF2 (OMTI variant) emulation.
authorToni Wilen <twilen@winuae.net>
Fri, 17 Jul 2020 19:09:35 +0000 (22:09 +0300)
committerToni Wilen <twilen@winuae.net>
Fri, 17 Jul 2020 19:09:35 +0000 (22:09 +0300)
expansion.cpp
include/rommgr.h
include/scsi.h
rommgr.cpp
scsi.cpp

index 7cb2edd9cb11f48174e2e317dec895e0eae06786..8dc55ac505bc0a03cc55bd10e132569c9a388c0c 100644 (file)
@@ -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,
index 220379f10b4ff318ce4225dc642a1b07760befda..74bc441f141a892e1b0cd626554bbeb244c8bbef 100644 (file)
@@ -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
index 80952214a4daf15f1c5c121a9c97c1986777e285..2f0e1a44317f4c01135929db49f5bafdaead18ad 100644 (file)
@@ -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);
 
index 45164dca9cb0553ad04309d5f01209b7c271076e..f25ee9ca1f532510b9f72388c324dc7a888ed319 100644 (file)
@@ -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") },
index a8b27a71c59ad0caa08f0b16878cd6fd15e82df9..0e4f93a95f8c51e3daa6eb275a683342a06bbaee 100644 (file)
--- 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;