From: Toni Wilen Date: Sat, 6 Jan 2018 18:31:56 +0000 (+0200) Subject: Profex HD3300 emulation. X-Git-Tag: 3600~13 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=e04d741251657a7a585f4afd39f9841ea509b084;p=francis%2Fwinuae.git Profex HD3300 emulation. --- diff --git a/expansion.cpp b/expansion.cpp index abf54c20..c30eb2fd 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -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, diff --git a/hardfile.cpp b/hardfile.cpp index f82f7fef..114d1fe7 100644 --- a/hardfile.cpp +++ b/hardfile.cpp @@ -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; diff --git a/include/rommgr.h b/include/rommgr.h index 0e7a7c30..62fe8f02 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -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 diff --git a/include/scsi.h b/include/scsi.h index b0e4f424..bef2757b 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -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); diff --git a/rommgr.cpp b/rommgr.cpp index c67e17ee..38a2b77e 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -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") }, diff --git a/scsi.cpp b/scsi.cpp index c036db69..13bb903c 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -67,11 +67,12 @@ #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'; + } +}