]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Vortex System 2000 ROM, partial Sprit Technology InMate support.
authorToni Wilen <twilen@winuae.net>
Sun, 23 Jul 2017 09:06:14 +0000 (12:06 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 23 Jul 2017 09:06:14 +0000 (12:06 +0300)
expansion.cpp
include/rommgr.h
include/scsi.h
rommgr.cpp
scsi.cpp

index b02fa187e8300826068f1f7cd4b48af4d6b34adf..a6f9e456846375dce470b0d3a70243ac306bc3c2 100644 (file)
@@ -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
        },
index 6b894545a136ea922588b2d9836b78e1c6a4ca9c..c7e852c079f2e5fda49e1ce73e0b7077d74de1fc 100644 (file)
@@ -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
index 1c1fa7f91fc5a943e453a952afe3a8aada44571e..49634c3286a957224f9f590fec787c41ec9f980b 100644 (file)
@@ -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);
 
index 32a9b638833e8cd4d78bb448f854ce5abfbfeba3..089c7aff40f4d65da480ffc0c7821a3f4deaf1fe 100644 (file)
@@ -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") },
index 79a540ecf20dc5ab087f33d954edb19083254d3c..68a123106aa1ece2d820324a4eb662b801751c26 100644 (file)
--- 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);