]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Xetec FastTrak emulation.
authorToni Wilen <twilen@winuae.net>
Sat, 17 Mar 2018 14:03:17 +0000 (16:03 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 17 Mar 2018 14:03:17 +0000 (16:03 +0200)
expansion.cpp
include/rommgr.h
include/scsi.h
rommgr.cpp
scsi.cpp

index 70820e0c69985a10ae6a144d609bc3efaf9eeb2a..2a87f6de4e4a24c338e803434658e5e5e618b9af 100644 (file)
@@ -5161,6 +5161,13 @@ const struct expansionromtype expansionroms[] = {
                false, 0, NULL,
                { 0xc1, 0x04, 0x00, 0x00, 0x07, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
        },
+       {
+               _T("fasttrak"), _T("FastTrak"), _T("Xetec"),
+               NULL, fasttrak_init, NULL, fasttrak_add_scsi_unit, ROMTYPE_FASTTRAK, 0, 0, BOARD_AUTOCONFIG_Z2, false,
+               NULL, 0,
+               true, EXPANSIONTYPE_SCSI,
+               2022, 2, 0
+       },
        {
                _T("amax"), _T("AMAX ROM dongle"), _T("ReadySoft"),
                NULL, NULL, NULL, NULL, ROMTYPE_AMAX | ROMTYPE_NONE, 0, 0, 0, false
index 71ce34f71f131cded0c02e25908990582058e80c..e8a2861b47159711656b25a6520a963807783f30 100644 (file)
@@ -168,6 +168,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_PROFEX         0x00100070
 #define ROMTYPE_ELSATHD                0x00100071
 #define ROMTYPE_ALF3           0x00100072
+#define ROMTYPE_FASTTRAK       0x00100073
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
index bef2757ba859c9481dba3e05c3dacd35b8ea3eea..a4b428bf990729728773ff449fc2ed90dfbc3e88 100644 (file)
@@ -291,6 +291,9 @@ void eveshamref_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romc
 bool profex_init(struct autoconfig_info *aci);
 void profex_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
+bool fasttrak_init(struct autoconfig_info *aci);
+void fasttrak_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 eb04364aab3e29cff5ea5bea192f13988ee057c1..b709fa8cfdc292d097d808df7b20bc6f898a480e 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 227
+#define NEXT_ROM_ID 228
 
 #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 },
@@ -561,6 +561,8 @@ static struct romdata roms[] = {
        0x1b854f6b, 0xc39d6202, 0xccb65f17, 0x63d1835e, 0x19d5b63d, 0x28f1b6a3, NULL, NULL },
        ALTROMPN(224, 1, 1, 8192, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x3ba56b91, 0xef55760e, 0x8d5a5408, 0x7062f9ab, 0xc63ef067, 0x0b23f108)
        ALTROMPN(224, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x20c2cbb6, 0xb83d7406, 0x6c335a77, 0x0acb30d6, 0xff79a00f, 0x629a6953)
+       { _T("Xetec FastTrak"), 1, 42, 1, 42, _T("FASTTRACK\0"), 32768, 227, 0, 0, ROMTYPE_FASTTRAK, 0, 0, NULL,
+       0xc5ae45d4, 0x8d682bc1,0x72bd2d35,0x4ba2db5c,0x9f6745a4,0x8937782c, 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 b13d6ea84a26c7c35e3ff1a41a4d34fc95173132..52c968c57f360c0520bdaccf9b6dbb14b0209c8c 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -69,7 +69,8 @@
 #define OMTI_WEDGE 37
 #define NCR5380_EVESHAMREF 38
 #define OMTI_PROFEX 39
-#define NCR_LAST 40
+#define NCR5380_FASTTRAK 40
+#define NCR_LAST 41
 
 extern int log_scsiemu;
 
@@ -2608,6 +2609,15 @@ static int eveshamref_reg(struct soft_scsi *ncr, uaecptr addr)
        return -1;
 }
 
+static int fasttrak_reg(struct soft_scsi *ncr, uaecptr addr)
+{
+       if ((addr & 0xc010) == 0x4000)
+               return (addr >> 1) & 7;
+       if ((addr & 0xc010) == 0x4010)
+               return 8;
+       return -1;
+}
+
 static uae_u8 read_684xx_dma(struct soft_scsi *ncr, uaecptr addr)
 {
        uae_u8 val = 0;
@@ -3295,6 +3305,15 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size)
                        v = ncr->rom[addr & 0x7fff];
                }
 
+       } else if (ncr->type == NCR5380_FASTTRAK) {
+
+               reg = fasttrak_reg(ncr, addr);
+               if (reg >= 0) {
+                       v = ncr5380_bget(ncr, reg);
+               } else {
+                       v = ncr->rom[addr & 0x7fff];
+               }
+
        }
 
 #if NCR5380_DEBUG > 1
@@ -3681,6 +3700,12 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si
                reg = eveshamref_reg(ncr, addr);
                if (reg >= 0)
                        ncr5380_bput(ncr, reg, val);
+
+       } else if (ncr->type == NCR5380_FASTTRAK) {
+
+               reg = fasttrak_reg(ncr, addr);
+               if (reg >= 0)
+                       ncr5380_bput(ncr, reg, val);
        }
 
 #if NCR5380_DEBUG > 1
@@ -5025,3 +5050,26 @@ void profex_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
                ss->rscsi.device[ch]->hfd->sector_buffer[1] = '5';
        }
 }
+
+
+bool fasttrak_init(struct autoconfig_info *aci)
+{
+       if (!aci->doinit) {
+               load_rom_rc(aci->rc, ROMTYPE_FASTTRAK, 65536, aci->rc->autoboot_disabled ? 0x4000 : 0x6000, 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_FASTTRAK, 65536, aci->rc->autoboot_disabled ? 0x4000 : 0x6000, scsi->rom, 0x4000, LOADROM_EVENONLY_ODDONE);
+       memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
+       aci->addrbank = scsi->bank;
+       return true;
+}
+
+void fasttrak_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       generic_soft_scsi_add(ch, ci, rc, NCR5380_FASTTRAK, 65536, 65536, ROMTYPE_FASTTRAK);
+}