]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Profex HD3300 emulation.
authorToni Wilen <twilen@winuae.net>
Sat, 6 Jan 2018 18:31:56 +0000 (20:31 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 6 Jan 2018 18:31:56 +0000 (20:31 +0200)
expansion.cpp
hardfile.cpp
include/rommgr.h
include/scsi.h
rommgr.cpp
scsi.cpp

index abf54c2072ccdd568ddbf0e38de15ab333cbe825..c30eb2fdd8dfd8a93398032067f522e9d34f5373 100644 (file)
@@ -4997,6 +4997,12 @@ const struct expansionromtype expansionroms[] = {
                false, 0, nexus_settings,
                { 0xd1, 0x01, 0x00, 0x00, 0x08, 0x36, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
        },
+       {
+               _T("profex"), _T("HD 3300"), _T("Profex Electronics"),
+               NULL, profex_init, NULL, profex_add_scsi_unit, ROMTYPE_PROFEX, 0, 0, BOARD_AUTOCONFIG_Z2, true,
+               NULL, 0,
+               true, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
+       },
        {
                _T("protar"), _T("A500 HD"), _T("Protar"),
                NULL, protar_init, NULL, protar_add_ide_unit, ROMTYPE_PROTAR, 0, 0, BOARD_AUTOCONFIG_Z2, false,
index f82f7fefe43bad98f16f5d90341659137201ddc9..114d1fe7162193f706599704210b27cfb0d29404 100644 (file)
@@ -1362,6 +1362,12 @@ int scsi_hd_emulate (struct hardfiledata *hfd, struct hd_hardfiledata *hdhfd, ua
                        }
                        write_log(_T("\n"));
                        goto scsi_done;
+                       case 0x11: // ASSIGN ALTERNATE TRACK
+                       if (nodisk(hfd))
+                               goto nodisk;
+                       // do nothing, swallow data
+                       scsi_len = 4;
+                       goto scsi_done;
                        case 0x12: /* INQUIRY */
                        {
                                int cyl, cylsec, head, tracksec;
index 0e7a7c30154192d81f4d486eca31365468842876..62fe8f02e07a8cdb60c1e9a82fd8696023da235a 100644 (file)
@@ -163,6 +163,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_WEDGE          0x0010006d
 #define ROMTYPE_ARRIBA         0x0010006e
 #define ROMTYPE_EVESHAMREF     0x0010006f
+#define ROMTYPE_PROFEX         0x00100070
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
index b0e4f424cfa01dc577c37d765359671cba2bee17..bef2757ba859c9481dba3e05c3dacd35b8ea3eea 100644 (file)
@@ -288,6 +288,9 @@ void wedge_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig
 bool eveshamref_init(struct autoconfig_info *aci);
 void eveshamref_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
+bool profex_init(struct autoconfig_info *aci);
+void profex_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 c67e17ee20b3c40d3008f0d9cee24c2691ecb29e..38a2b77e1ca95960955ecb7a6bed674023593b7a 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 223
+#define NEXT_ROM_ID 224
 
 #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 },
@@ -549,6 +549,8 @@ static struct romdata roms[] = {
        ALTROMPN(220, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x8283dc0c, 0xe3820358, 0x1d130b40, 0x9c333f41, 0xdfd6afcd, 0xf3fabb81)
        { _T("Evesham Micros Reference"), 1, 1, 1, 1, _T("EVESHAMREF\0"), 65536, 221, 0, 0, ROMTYPE_EVESHAMREF, 0, 0, NULL,
        0xb0225f48, 0x2b170b40, 0x2f60d28c, 0x344fc463, 0x7e99915f, 0x92e0e8f1, NULL, NULL },
+       { _T("Profex Electronics HD 3300"), 22, 0, 22, 0, _T("PROFEXHD3300\0"), 8192, 223, 0, 0, ROMTYPE_PROFEX, 0, 0, NULL,
+       0xfe4bf404, 0xc6c1e465, 0xc05e4794, 0xee76c9e2, 0x94def44d, 0x1c7560a1, 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 c036db69f710915e220192bbd255bd4f5dd9af41..13bb903cc91fc2b72f19175bad7a3cb4cf23cc63 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
 #define OMTI_HD3000 36
 #define OMTI_WEDGE 37
 #define NCR5380_EVESHAMREF 38
-#define NCR_LAST 39
+#define OMTI_PROFEX 39
+#define NCR_LAST 40
 
 extern int log_scsiemu;
 
-static const int outcmd[] = { 0x04, 0x0a, 0x0c, 0x2a, 0xaa, 0x15, 0x55, 0x0f, -1 };
+static const int outcmd[] = { 0x04, 0x0a, 0x0c, 0x11, 0x2a, 0xaa, 0x15, 0x55, 0x0f, -1 };
 static const int incmd[] = { 0x01, 0x03, 0x08, 0x0e, 0x12, 0x1a, 0x5a, 0x25, 0x28, 0x34, 0x37, 0x42, 0x43, 0xa8, 0x51, 0x52, 0xb9, 0xbd, 0xd8, 0xd9, 0xbe, -1 };
 static const int nonecmd[] = { 0x00, 0x05, 0x06, 0x07, 0x09, 0x0b, 0x10, 0x11, 0x16, 0x17, 0x19, 0x1b, 0x1d, 0x1e, 0x2b, 0x35, 0x45, 0x47, 0x48, 0x49, 0x4b, 0x4e, 0xa5, 0xa9, 0xba, 0xbc, 0xe0, 0xe3, 0xe4, -1 };
 static const int scsicmdsizes[] = { 6, 10, 10, 12, 16, 12, 10, 6 };
@@ -168,6 +169,11 @@ bool scsi_emulate_analyze (struct scsi_data *sd)
                data_len2 = (sd->cmd[4] == 0 ? 256 : sd->cmd[4]) * sd->blocksize;
                scsi_grow_buffer(sd, data_len2);
        break;
+       case 0x11: // ASSIGN ALTERNATE TRACK (SASI)
+               if (sd->hfd && sd->hfd->ci.unit_feature_level < HD_LEVEL_SASI)
+                       goto nocmd;
+               data_len = 4;
+               break;
        case 0x28: // READ(10)
                data_len2 = ((sd->cmd[7] << 8) | (sd->cmd[8] << 0)) * (uae_s64)sd->blocksize;
                scsi_grow_buffer(sd, data_len2);
@@ -903,7 +909,7 @@ static void ew(struct soft_scsi *scsi, int addr, uae_u32 value)
        }
 }
 
-static void generic_soft_scsi_add(int ch, struct uaedev_config_info *ci, struct romconfig *rc, int type, int boardsize, int romsize, int romtype)
+static struct soft_scsi *generic_soft_scsi_add(int ch, struct uaedev_config_info *ci, struct romconfig *rc, int type, int boardsize, int romsize, int romtype)
 {
        struct soft_scsi *ss = allocscsi(&soft_scsi_units[type * MAX_DUPLICATE_EXPANSION_BOARDS + ci->controller_type_unit], rc, ch);
        ss->type = type;
@@ -946,8 +952,9 @@ static void generic_soft_scsi_add(int ch, struct uaedev_config_info *ci, struct
        }
        raw_scsi_reset(&ss->rscsi);
        if (ch < 0)
-               return;
+               return ss;
        add_scsi_device(&ss->rscsi.device[ch], ch, ci, rc);
+       return ss;
 }
 
 static void raw_scsi_busfree(struct raw_scsi *rs)
@@ -2372,6 +2379,15 @@ static int hd3000_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
        return (addr / 2) & 7;
 }
 
+static int profex_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
+{
+       if (addr & 1)
+               return -1;
+       if (!(addr & 0x8000))
+               return -1;
+       return (addr / 2) & 7;
+}
+
 static int hda506_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
 {
        if ((addr & 0x7fe1) != 0x7fe0)
@@ -3107,6 +3123,16 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size)
                                v = omti_bget(ncr, reg);
                }
 
+       } else if (ncr->type == OMTI_PROFEX) {
+
+               if (addr < 0x4000) {
+                       v = ncr->rom[addr];
+               } else {
+                       reg = profex_reg(ncr, addr, false);
+                       if (reg >= 0)
+                               v = omti_bget(ncr, reg);
+               }
+
        } else if (ncr->type == OMTI_HDA506) {
 
                reg = hda506_reg(ncr, addr, false);
@@ -3235,7 +3261,7 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size)
        }
 
 #if NCR5380_DEBUG > 1
-       if (origaddr < 0x8000)
+       if (1 || origaddr < 0x8000)
                write_log(_T("GET %08x %02x %d %08x %d\n"), origaddr, v, reg, M68K_GETPC, regs.intmask);
 #endif
 
@@ -3524,6 +3550,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_PROFEX) {
+
+               reg = profex_reg(ncr, addr, true);
+               if (reg >= 0)
+                       omti_bput(ncr, reg, val);
+
        } else if (ncr->type == OMTI_ALF1 || ncr->type == OMTI_ADAPTER) {
 
                reg = alf1_reg(ncr, addr, true);
@@ -4923,3 +4955,36 @@ void eveshamref_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romc
 {
        generic_soft_scsi_add(ch, ci, rc, NCR5380_EVESHAMREF, 65536, 65536, ROMTYPE_EVESHAMREF);
 }
+
+bool profex_init(struct autoconfig_info *aci)
+{
+       const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_PROFEX);
+
+       if (!aci->doinit) {
+               load_rom_rc(aci->rc, ROMTYPE_PROFEX, 8192, 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
+               if (aci->rc->autoboot_disabled)
+                       aci->autoconfig_raw[0] &= ~0x10;
+               return true;
+       }
+
+       struct soft_scsi *scsi = getscsi(aci->rc);
+       if (!scsi)
+               return false;
+
+       load_rom_rc(aci->rc, ROMTYPE_PROFEX, 8192, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE);
+       if (aci->rc->autoboot_disabled)
+               scsi->rom[0] &= ~0x10;
+       memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
+       aci->addrbank = scsi->bank;
+       return true;
+}
+
+void profex_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       struct soft_scsi *ss = generic_soft_scsi_add(ch, ci, rc, OMTI_PROFEX, 65536, 16384, ROMTYPE_PROFEX);
+       if (ss && ch >= 0) {
+               // Boot ROM requires OMTI-55 "55" identifier.
+               ss->rscsi.device[ch]->hfd->sector_buffer[0] = '5';
+               ss->rscsi.device[ch]->hfd->sector_buffer[1] = '5';
+       }
+}