From: Toni Wilen Date: Sun, 29 Oct 2017 11:32:08 +0000 (+0200) Subject: Kupke Golem HD3000 emulation. X-Git-Tag: 3600~76 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=c0da0dea3e7f5a3501dd96bd12643f74dd9dfbaa;p=francis%2Fwinuae.git Kupke Golem HD3000 emulation. --- diff --git a/expansion.cpp b/expansion.cpp index 21a16190..52fed2f9 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -4801,6 +4801,12 @@ const struct expansionromtype expansionroms[] = { NULL, 0, false, EXPANSIONTYPE_SCSI }, + { + _T("golem"), _T("HD3000"), _T("Kupke"), + NULL, hd3000_init, NULL, hd3000_add_scsi_unit, ROMTYPE_GOLEMHD3000, 0, 0, BOARD_AUTOCONFIG_Z2, true, + NULL, 0, + true, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI + }, { _T("golem"), _T("Golem SCSI II"), _T("Kupke"), NULL, golem_init, NULL, golem_add_scsi_unit, ROMTYPE_GOLEM, 0, 0, BOARD_AUTOCONFIG_Z2, false, diff --git a/include/rommgr.h b/include/rommgr.h index 4f9401c5..76c9ad68 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -159,6 +159,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_INMATE 0x00100069 #define ROMTYPE_EMPLANT 0x0010006a #define ROMTYPE_CUBO 0x0010006b +#define ROMTYPE_GOLEMHD3000 0x0010006c #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 diff --git a/include/scsi.h b/include/scsi.h index f05d8c06..de0b1516 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -274,6 +274,9 @@ void inmate_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi bool emplant_init(struct autoconfig_info*); void emplant_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +bool hd3000_init(struct autoconfig_info *aci); +void hd3000_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 11dc993a..2e00429d 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 220 +#define NEXT_ROM_ID 221 #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 }, @@ -539,6 +539,10 @@ static struct romdata roms[] = { 0xa2e0cfb8, 0xfa7199d2,0xea343b01,0x4b0f6eb6,0x992d2e95,0x40fce61b, NULL, NULL }, { _T("Vortex System 2000"), 1, 0, 1, 0, _T("SYSTEM2000\0"), 16384, 219, 0, 0, ROMTYPE_SYSTEM2000, 0, 0, NULL, 0x053097c3, 0xee87f26c,0xf858b63a,0xd6bff74b,0x802cea03,0x97281fad, NULL, NULL }, + { _T("Kupke Golem HD3000 v1.4"), 1, 4, 1, 4, _T("GOLEMHD3000\0"), 16384, 220, 0, 0, ROMTYPE_GOLEMHD3000, 0, 0, NULL, + 0x93ba65c7, 0x33ba9d1e,0x27e9c210,0xa27ee6d3,0x855d3feb,0x1649ddc2, NULL, NULL }, + ALTROMPN(220, 1, 1, 8192, ROMTYPE_ODD | ROMTYPE_8BIT, NULL, 0x2af75b4c, 0xe25be651, 0x56eef3bc, 0xa036d76c, 0xca3903a9, 0x469f0de5) + ALTROMPN(220, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x8283dc0c, 0xe3820358, 0x1d130b40, 0x9c333f41, 0xdfd6afcd, 0xf3fabb81) { _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") }, @@ -2186,17 +2190,26 @@ struct romconfig *get_device_romconfig(struct uae_prefs *p, int romtype, int dev void board_prefs_changed(int romtype, int devnum) { - int idx1, idx2; - struct boardromconfig *brc1 = get_device_rom(&currprefs, romtype, devnum, &idx1); - struct boardromconfig *brc2 = get_device_rom(&changed_prefs, romtype, devnum, &idx2); - if (brc1 && brc2) { - memcpy(brc1, brc2, sizeof(struct boardromconfig)); - } else if (brc1 && !brc2) { - clear_device_rom(&currprefs, romtype, devnum, true); - } else if (!brc1 && brc2) { - brc1 = get_device_rom_new(&currprefs, romtype, devnum, &idx1); - if (brc1) + if (romtype != -1) { + int idx1, idx2; + struct boardromconfig *brc1 = get_device_rom(&currprefs, romtype, devnum, &idx1); + struct boardromconfig *brc2 = get_device_rom(&changed_prefs, romtype, devnum, &idx2); + if (brc1 && brc2) { memcpy(brc1, brc2, sizeof(struct boardromconfig)); + } else if (brc1 && !brc2) { + clear_device_rom(&currprefs, romtype, devnum, true); + } else if (!brc1 && brc2) { + brc1 = get_device_rom_new(&currprefs, romtype, devnum, &idx1); + if (brc1) + memcpy(brc1, brc2, sizeof(struct boardromconfig)); + } + } else { + for (int i = 0; expansionroms[i].name; i++) { + const struct expansionromtype *ert = &expansionroms[i]; + for (int j = 0; j < MAX_BOARD_ROMS; j++) { + board_prefs_changed(ert->romtype, j); + } + } } } diff --git a/scsi.cpp b/scsi.cpp index 725fe270..a0d786ee 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -64,7 +64,8 @@ #define NCR5380_ADDHARD 33 #define NONCR_INMATE 34 #define NCR5380_EMPLANT 35 -#define NCR_LAST 36 +#define OMTI_HD3000 36 +#define NCR_LAST 37 extern int log_scsiemu; @@ -2350,6 +2351,15 @@ static int xebec_reg(struct soft_scsi *ncr, uaecptr addr) return -1; } +static int hd3000_reg(struct soft_scsi *ncr, uaecptr addr, bool write) +{ + if (!(addr & 1)) + return -1; + if (!(addr & 0x4000)) + return -1; + return (addr / 2) & 7; +} + static int hda506_reg(struct soft_scsi *ncr, uaecptr addr, bool write) { if ((addr & 0x7fe1) != 0x7fe0) @@ -3053,6 +3063,16 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size) if (reg >= 0) v = sasi_microforge_bget(ncr, reg); + } else if (ncr->type == OMTI_HD3000) { + + if (addr < 0x4000) { + v = ncr->rom[addr]; + } else { + reg = hd3000_reg(ncr, addr, false); + if (reg >= 0) + v = omti_bget(ncr, reg); + } + } else if (ncr->type == OMTI_HDA506) { reg = hda506_reg(ncr, addr, false); @@ -3448,6 +3468,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_HD3000) { + + reg = hd3000_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); @@ -4753,3 +4779,27 @@ void emplant_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconf { generic_soft_scsi_add(ch, ci, rc, NCR5380_EMPLANT, 65536, 16384, ROMTYPE_EMPLANT); } + +bool hd3000_init(struct autoconfig_info *aci) +{ + const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_GOLEMHD3000); + + if (!aci->doinit) { + load_rom_rc(aci->rc, ROMTYPE_GOLEMHD3000, 8192, aci->ert->autoboot_jumper ? 0 : 8192, aci->autoconfig_raw, 128, 0); + return true; + } + + struct soft_scsi *scsi = getscsi(aci->rc); + if (!scsi) + return false; + + load_rom_rc(aci->rc, ROMTYPE_GOLEMHD3000, 8192, aci->ert->autoboot_jumper ? 0 : 8192, scsi->rom, 65536, 0); + memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory); + aci->addrbank = scsi->bank; + return true; +} + +void hd3000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + generic_soft_scsi_add(ch, ci, rc, OMTI_HD3000, 65536, 16384, ROMTYPE_GOLEMHD3000); +}