]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Phoenix Board SCSI emulation.
authorToni Wilen <twilen@winuae.net>
Sun, 13 Dec 2015 17:59:49 +0000 (19:59 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 13 Dec 2015 17:59:49 +0000 (19:59 +0200)
expansion.cpp
include/rommgr.h
include/scsi.h
rommgr.cpp
scsi.cpp

index 24702e8a3378f03bc832a24266f406ab6e9fca0b..1c9e7bf5fe681e0fbee7b7045ebd98e5bec790b5 100644 (file)
@@ -3090,6 +3090,12 @@ const struct expansionromtype expansionroms[] = {
                false, EXPANSIONTYPE_SCSI,
                8512, 10, 0, false, fastlane_memory_callback
        },
+       {
+               _T("phoenixboard"), _T("Phoenix Board SCSI"), _T("Phoenix Microtechnologies"),
+               phoenixboard_init, NULL, phoenixboard_add_scsi_unit, ROMTYPE_PHOENIXB, 0, 0, BOARD_AUTOCONFIG_Z2, true,
+               NULL, 0,
+               true, EXPANSIONTYPE_SCSI,
+       },
        {
                _T("ptnexus"), _T("Nexus"), _T("Preferred Technologies"),
                ptnexus_init, NULL, ptnexus_add_scsi_unit, ROMTYPE_PTNEXUS | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
index 9fc6a92251cb9fa605c987bf2fdde8a78a52a767..4fe1b6617fde3de7d450145885c62e1e70b2b6f0 100644 (file)
@@ -103,6 +103,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_APOLLOHD       0x00100036
 #define ROMTYPE_MEVOLUTION     0x00100037
 #define ROMTYPE_GOLEMFAST      0x00100038
+#define ROMTYPE_PHOENIXB       0x00100039
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
index d525097fef5ab918e2f73d7481634271e8b13c80..9c577ac83510f5bb7effcef9e89250c90cf38285 100644 (file)
@@ -238,6 +238,9 @@ void system2000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romc
 addrbank *omtiadapter_init(struct romconfig *rc);
 void omtiadapter_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
+addrbank *phoenixboard_init(struct romconfig *rc);
+void phoenixboard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+
 void x86_xt_hd_bput(int, uae_u8);
 uae_u8 x86_xt_hd_bget(int);
 addrbank *x86_xt_hd_init(struct romconfig *rc);
index e7912b0aece9f38b75c87e1fb3f6ef215966c9e2..7a5f4333d896a54bc6439777289f72aaf28c46fb 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 159
+#define NEXT_ROM_ID 160
 
 #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 },
@@ -431,6 +431,8 @@ static struct romdata roms[] = {
        0x5e94ee56, 0xf83dae55, 0x49f9b735, 0x52d5c6e0, 0x41da4c6c, 0x995a7f47, NULL, NULL },
        ALTROMPN(157, 1, 1, 8192, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xec13fda0, 0x6af1447c, 0x4363c46d, 0x05697458, 0x01daa30c, 0x03c01c9f)
        ALTROMPN(157, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x39b0075e, 0xf6644ea0, 0x6c3ed349, 0xfb0fb6b4, 0xa9f07655, 0x0b104179)
+       { _T("Phoenix Board SCSI v.J"), 3, 1, 3, 1, _T("PBSCSI\0"), 32768, 159, 0, 0, ROMTYPE_PHOENIXB, 0, 0, NULL,
+       0x1f672e4b, 0xb20d50b8, 0x31ec9823, 0xfa732fc6, 0x522ecc6a, 0xae36ec33, 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 fd9d87de3044e166f403b85f44e977e2c5f8e7bd..8ae11adc1532bb9db090bc7a72a985adcde3df00 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -53,7 +53,8 @@
 #define OMTI_SYSTEM2000 22
 #define OMTI_ADAPTER 23
 #define OMTI_X86 24
-#define NCR_LAST 25
+#define NCR5380_PHOENIXBOARD 25
+#define NCR_LAST 26
 
 extern int log_scsiemu;
 
@@ -2085,6 +2086,17 @@ static int microforge_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
        return reg;
 }
 
+static int phoenixboard_reg(struct soft_scsi *ncr, uaecptr addr)
+{
+       if (addr & 1)
+               return -1;
+       if (addr & 0xc000)
+               return -1;
+       addr >>= 1;
+       addr &= 7;
+       return addr;
+}
+
 static uae_u8 read_supra_dma(struct soft_scsi *ncr, uaecptr addr)
 {
        uae_u8 val = 0;
@@ -2576,6 +2588,14 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size)
                        }
                }
 
+       } else if (ncr->type == NCR5380_PHOENIXBOARD) {
+
+               reg = phoenixboard_reg(ncr, addr);
+               if (reg >= 0) {
+                       v = ncr5380_bget(ncr, reg);
+               } else if (addr < 0x8000) {
+                       v = ncr->rom[addr];
+               }
        }
 #if NCR5380_DEBUG > 1
        if ((origaddr >= 0xf00000 && size == 1) || (origaddr < 0xf00000))
@@ -2818,6 +2838,13 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si
                        }
                }
 
+       } else if (ncr->type == NCR5380_PHOENIXBOARD) {
+
+               reg = phoenixboard_reg(ncr, addr);
+               if (reg >= 0) {
+                       ncr5380_bput(ncr, reg, val);
+               }
+
        }
 
 #if NCR5380_DEBUG > 1
@@ -3061,6 +3088,24 @@ uae_u32 soft_scsi_get(uaecptr addr, int size)
        return v;
 }
 
+void soft_scsi_free(void)
+{
+       parallel_port_scsi = false;
+       parallel_port_scsi_data = NULL;
+       x86_hd_data = NULL;
+       for (int i = 0; soft_scsi_devices[i]; i++) {
+               soft_scsi_free_unit(soft_scsi_devices[i]);
+               soft_scsi_devices[i] = NULL;
+       }
+}
+
+void soft_scsi_reset(void)
+{
+       for (int i = 0; soft_scsi_devices[i]; i++) {
+               raw_scsi_reset(&soft_scsi_devices[i]->rscsi);
+       }
+}
+
 /*
        $8380 select unit (unit mask)
 
@@ -3358,7 +3403,7 @@ static void expansion_add_protoautoconfig_data(uae_u8 *p, uae_u16 manufacturer_i
        memset(p, 0, 4096);
        p[0x02] = product_id;
        p[0x08] = manufacturer_id >> 8;
-       p[0x0a] = manufacturer_id;
+       p[0x0a] = (uae_u8)manufacturer_id;
 }
 
 static void expansion_add_protoautoconfig_box(uae_u8 *p, int box_size, uae_u16 manufacturer_id, uae_u8 product_id)
@@ -3620,20 +3665,23 @@ void x86_add_xt_hd_unit(int ch, struct uaedev_config_info *ci, struct romconfig
        generic_soft_scsi_add(ch, ci, rc, OMTI_X86, 0, 0, ROMTYPE_X86_HD);
 }
 
-void soft_scsi_free(void)
+addrbank *phoenixboard_init(struct romconfig *rc)
 {
-       parallel_port_scsi = false;
-       parallel_port_scsi_data = NULL;
-       x86_hd_data = NULL;
-       for (int i = 0; soft_scsi_devices[i]; i++) {
-               soft_scsi_free_unit(soft_scsi_devices[i]);
-               soft_scsi_devices[i] = NULL;
-       }
+       struct soft_scsi *scsi = getscsi(rc);
+
+       if (!scsi)
+               return NULL;
+
+       const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_PHOENIXB);
+       load_rom_rc(rc, ROMTYPE_PHOENIXB, 8192, rc->autoboot_disabled ? 0 : 8192, scsi->rom, 16384, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+       load_rom_rc(rc, ROMTYPE_PHOENIXB, 16384, 16384, scsi->rom + 16384, 16384, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+       memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
+
+       return scsi->bank;
 }
 
-void soft_scsi_reset(void)
+void phoenixboard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
-       for (int i = 0; soft_scsi_devices[i]; i++) {
-               raw_scsi_reset(&soft_scsi_devices[i]->rscsi);
-       }
+       generic_soft_scsi_add(ch, ci, rc, NCR5380_PHOENIXBOARD, 65536, 32768, ROMTYPE_PHOENIXB);
 }
+