]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Kupke Golem HD3000 emulation.
authorToni Wilen <twilen@winuae.net>
Sun, 29 Oct 2017 11:32:08 +0000 (13:32 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 29 Oct 2017 11:32:08 +0000 (13:32 +0200)
expansion.cpp
include/rommgr.h
include/scsi.h
rommgr.cpp
scsi.cpp

index 21a161909600642ab70eeabc280470718ceaa8a8..52fed2f9ec997ab861bac194cc8d9f22fe865463 100644 (file)
@@ -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,
index 4f9401c523b7e440f052324fb1c645ea5603e9d2..76c9ad6837633d03cf036ab57cbfa4ce22c9fe80 100644 (file)
@@ -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
index f05d8c06b1689e60de7e27dfcb245879fed3406d..de0b15160ea941574bc6ab2fdc4fd2a3c266454a 100644 (file)
@@ -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);
 
index 11dc993a99e12d0bc4ec1e3b92eedf33c51f7b1a..2e00429dc294072b5372457004c09e29e8e44717 100644 (file)
@@ -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);
+                       }
+               }
        }
 }
 
index 725fe2701ca2eee602b8fd817a12614ee31e1c9f..a0d786ee9c6cfc62b8287317bf310711b256ff1c 100644 (file)
--- 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);
+}