From 02a43177b4ea6566ae4f9959987c590aaede5bfc Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 14 May 2016 18:55:25 +0300 Subject: [PATCH] IVS Trumpcard Pro. (incomplete) --- expansion.cpp | 9 ++++++ include/rommgr.h | 5 +-- include/scsi.h | 3 ++ rommgr.cpp | 12 +++++-- scsi.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++------ 5 files changed, 96 insertions(+), 14 deletions(-) diff --git a/expansion.cpp b/expansion.cpp index e9270680..bd5eba10 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -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, diff --git a/include/rommgr.h b/include/rommgr.h index dcfb7040..19a359bc 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -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 diff --git a/include/scsi.h b/include/scsi.h index c40ea0ef..ea71b80d 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -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); diff --git a/rommgr.cpp b/rommgr.cpp index b53068ac..25681e13 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -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) diff --git a/scsi.cpp b/scsi.cpp index 78f1a658..58a2d126 100644 --- 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); -- 2.47.3