]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
IVS Trumpcard Pro. (incomplete)
authorToni Wilen <twilen@winuae.net>
Sat, 14 May 2016 15:55:25 +0000 (18:55 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 14 May 2016 15:55:25 +0000 (18:55 +0300)
expansion.cpp
include/rommgr.h
include/scsi.h
rommgr.cpp
scsi.cpp

index e927068013ecd9b657799c31bb44e14119edd350..bd5eba10cb355bcfd3c90426523aabb3213d1bda 100644 (file)
@@ -3167,6 +3167,15 @@ const struct expansionromtype expansionroms[] = {
                true,
                adscsi2000_settings
        },
+       {
+               _T("trumpcardpro"), _T("Grand Slam"), _T("IVS"),
+               trumpcardpro_init, NULL, trumpcardpro_add_scsi_unit, ROMTYPE_IVSTPRO, 0, 0, BOARD_AUTOCONFIG_Z2, false,
+               NULL, 0,
+               false, EXPANSIONTYPE_SCSI,
+               2112, 4, 0, false, NULL,
+               false, NULL,
+               {  0xd1, 2, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
+       },
        {
                _T("kommos"), _T("A500/A2000 SCSI"), _T("Jürgen Kommos"),
                kommos_init, NULL, kommos_add_scsi_unit, ROMTYPE_KOMMOS, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
index dcfb7040bb8568d169c58101fc0d18392fc93498..19a359bc6ac012512e29a8092d0e2d90115b34d6 100644 (file)
@@ -105,6 +105,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_MEVOLUTION     0x00100037
 #define ROMTYPE_GOLEMFAST      0x00100038
 #define ROMTYPE_PHOENIXB       0x00100039
+#define ROMTYPE_IVSTPRO                0x0010003A
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
@@ -134,7 +135,7 @@ struct romdata {
        int id;
        int cpu;
        int cloanto;
-       int type;
+       uae_u32 type;
        int group;
        int title;
        const TCHAR *partnumber;
@@ -198,7 +199,7 @@ void set_device_rom(struct uae_prefs *p, const TCHAR *path, int romtype, int dev
 const struct expansionromtype *get_device_expansion_rom(int romtype);
 const struct expansionromtype *get_unit_expansion_rom(int hdunit);
 struct boardromconfig *get_device_rom_new(struct uae_prefs *p, int romtype, int devnum, int *index);
-void clear_device_rom(struct uae_prefs *p, int romtype, int devnum);
+void clear_device_rom(struct uae_prefs *p, int romtype, int devnum, bool deleteDevice);
 struct boardromconfig *get_boardromconfig(struct uae_prefs *p, int romtype, int *index);
 
 #define LOADROM_FILL 1
index c40ea0efadf118382bf17bce794d4b8a8250792f..ea71b80d269c218fae689a874a049538b394befc 100644 (file)
@@ -243,6 +243,9 @@ void omtiadapter_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconf
 addrbank *phoenixboard_init(struct romconfig *rc);
 void phoenixboard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
+addrbank *trumpcardpro_init(struct romconfig*);
+void trumpcardpro_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 b53068ace234527830a1fa43258781ce37af1a3e..25681e135dca86cd8c2d05d80bda08eacaf7b22c 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 161
+#define NEXT_ROM_ID 162
 
 #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 },
@@ -435,6 +435,8 @@ static struct romdata roms[] = {
        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("IVS GramdSlam/Trumpcard Pro v4.9"), 4, 9, 4, 9, _T("IVSPRO\0"), 16384, 161, 0, 0, ROMTYPE_IVSTPRO, 0, 0, NULL,
+       0x4a15f224, 0x29500b47, 0x289e84ac, 0x575e3c7d, 0x82199b45, 0x605d8fc9, 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") },
@@ -1748,13 +1750,17 @@ struct boardromconfig *get_device_rom_new(struct uae_prefs *p, int romtype, int
        return brc;
 }
 
-void clear_device_rom(struct uae_prefs *p, int romtype, int devnum)
+void clear_device_rom(struct uae_prefs *p, int romtype, int devnum, bool deleteDevice)
 {
        int index;
        struct boardromconfig *brc = get_device_rom(p, romtype, devnum, &index);
        if (!brc)
                return;
-       memset(&brc->roms[index], 0, sizeof(struct romconfig));
+       if (deleteDevice) {
+               memset(brc, 0, sizeof(struct boardromconfig));
+       } else {
+               memset(&brc->roms[index], 0, sizeof(struct romconfig));
+       }
 }
 
 struct boardromconfig *get_device_rom(struct uae_prefs *p, int romtype, int devnum, int *index)
index 78f1a65867c6a0f23d68bb80711f96a525ae223d..58a2d1262901a7113327ab0a0d7ba42bfe8df0a2 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -54,7 +54,8 @@
 #define OMTI_ADAPTER 23
 #define OMTI_X86 24
 #define NCR5380_PHOENIXBOARD 25
-#define NCR_LAST 26
+#define NCR5380_TRUMPCARDPRO 26
+#define NCR_LAST 27
 
 extern int log_scsiemu;
 
@@ -1091,8 +1092,8 @@ static uae_u8 raw_scsi_get_data_2(struct raw_scsi *rs, bool next, bool nodebug)
                break;
                case SCSI_SIGNAL_PHASE_STATUS:
 #if RAW_SCSI_DEBUG
-               if (!nodebug)
-                       write_log(_T("raw_scsi: status byte read %02x\n"), sd->status);
+               if (!nodebug || next)
+                       write_log(_T("raw_scsi: status byte read %02x. Next=%d\n"), sd->status, next);
 #endif
                v = sd->status;
                if (next) {
@@ -1102,8 +1103,8 @@ static uae_u8 raw_scsi_get_data_2(struct raw_scsi *rs, bool next, bool nodebug)
                break;
                case SCSI_SIGNAL_PHASE_MESSAGE_IN:
 #if RAW_SCSI_DEBUG
-               if (!nodebug)
-                       write_log(_T("raw_scsi: message byte read %02x\n"), sd->status);
+               if (!nodebug || next)
+                       write_log(_T("raw_scsi: message byte read %02x. Next=%d\n"), sd->status, next);
 #endif
                v = sd->status;
                rs->status = v;
@@ -1211,6 +1212,7 @@ static void raw_scsi_write_data(struct raw_scsi *rs, uae_u8 data)
                break;
                default:
                write_log(_T("raw_scsi_put_data but bus phase is %d!\n"), rs->bus_phase);
+               //raw_scsi_get_data_2(rs, true, false);
                break;
        }
 }
@@ -1480,7 +1482,7 @@ uae_u8 ncr5380_bget(struct soft_scsi *scsi, int reg)
                        if (scsi->irq) {
                                v |= 1 << 4;
                        }
-                       if (scsi->dma_active && !scsi->dma_controller) {
+                       if (scsi->dma_active && !scsi->dma_controller && r->bus_phase == (scsi->regs[3] & 7)) {
                                v |= 1 << 6;
                        }
                        if (scsi->regs[2] & 4) {
@@ -1605,7 +1607,9 @@ void ncr5380_bput(struct soft_scsi *scsi, int reg, uae_u8 v)
 #endif
                break;
                case 8: // fake dma port
-               raw_scsi_put_data(r, v, true);
+               if (r->bus_phase == (scsi->regs[3] & 7)) {
+                       raw_scsi_put_data(r, v, true);
+               }
                ncr5380_check_phase(scsi);
                break;
        }
@@ -2111,6 +2115,20 @@ static int phoenixboard_reg(struct soft_scsi *ncr, uaecptr addr)
        return addr;
 }
 
+static int trumpcardpro_reg(struct soft_scsi *ncr, uaecptr addr)
+{
+       if (addr & 1)
+               return -1;
+       if (addr & 0x8000)
+               return -1;
+       if ((addr & 0xe0) == 0x60)
+               return 8;
+       if ((addr & 0xe0) != 0x40)
+               return -1;
+       addr >>= 1;
+       addr &= 7;
+       return addr;
+}
 static uae_u8 read_supra_dma(struct soft_scsi *ncr, uaecptr addr)
 {
        uae_u8 val = 0;
@@ -2610,9 +2628,22 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size)
                } else if (addr < 0x8000) {
                        v = ncr->rom[addr];
                }
+
+       } else if (ncr->type == NCR5380_TRUMPCARDPRO) {
+
+               reg = trumpcardpro_reg(ncr, addr);
+               if (reg >= 0) {
+                       v = ncr5380_bget(ncr, reg);
+               } else if (addr & 0x8000) {
+                       v = ncr->rom[addr & 0x7fff];
+               } else if ((addr & 0xe0) == 0xc0) {
+                       v = ncr->irq && ncr->intena ? 4 : 0;
+               }
+
        }
+
 #if NCR5380_DEBUG > 1
-       if ((origaddr >= 0xf00000 && size == 1) || (origaddr < 0xf00000))
+       if (!(origaddr & 0x8000))
                write_log(_T("GET %08x %02x %d %08x %d\n"), origaddr, v, reg, M68K_GETPC, regs.intmask);
 #endif
 
@@ -2859,10 +2890,17 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si
                        ncr5380_bput(ncr, reg, val);
                }
 
+       } else if (ncr->type == NCR5380_TRUMPCARDPRO) {
+
+               reg = trumpcardpro_reg(ncr, addr);
+               if (reg >= 0) {
+                       ncr5380_bput(ncr, reg, val);
+               }
        }
 
 #if NCR5380_DEBUG > 1
-       write_log(_T("PUT %08x %02x %d %08x %d\n"), origddr, val, reg, M68K_GETPC, regs.intmask);
+       if (1)
+               write_log(_T("PUT %08x %02x %d %08x %d\n"), origddr, val, reg, M68K_GETPC, regs.intmask);
 #endif
 }
 
@@ -3322,6 +3360,31 @@ void adscsi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
        generic_soft_scsi_add(ch, ci, rc, NCR5380_ADSCSI, 65536, 65536, ROMTYPE_ADSCSI);
 }
 
+addrbank *trumpcardpro_init(struct romconfig *rc)
+{
+       struct soft_scsi *scsi = getscsi(rc);
+
+       if (!scsi)
+               return &expamem_null;
+
+       scsi->intena = true;
+
+       load_rom_rc(rc, ROMTYPE_IVSTPRO, 16384, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+
+       const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_IVSTPRO);
+       for (int i = 0; i < 16; i++) {
+               uae_u8 b = ert->autoconfig[i];
+               ew(scsi, i * 4, b);
+       }
+
+       return scsi->bank;
+}
+
+void trumpcardpro_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       generic_soft_scsi_add(ch, ci, rc, NCR5380_TRUMPCARDPRO, 65536, 32768, NCR5380_TRUMPCARDPRO);
+}
+
 bool rochard_scsi_init(struct romconfig *rc, uaecptr baseaddress)
 {
        struct soft_scsi *scsi = getscsi(rc);