From 73217fd2d01133574600b23661aab5d5d1120f4a Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 11 Aug 2019 22:04:36 +0300 Subject: [PATCH] M-Tec Mastercard SCSI expansion. --- expansion.cpp | 6 ++++++ include/ncr9x_scsi.h | 2 ++ include/rommgr.h | 1 + ncr9x_scsi.cpp | 51 ++++++++++++++++++++++++++++++++++++++++---- rommgr.cpp | 4 +++- 5 files changed, 59 insertions(+), 5 deletions(-) diff --git a/expansion.cpp b/expansion.cpp index eea20618..069f5911 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -5417,6 +5417,12 @@ const struct expansionromtype expansionroms[] = { NULL, 0, true, EXPANSIONTYPE_IDE }, + { + _T("mtecmastercard"), _T("Mastercard"), _T("M-Tec"), + NULL, ncr_mtecmastercard_init, NULL, mtecmastercard_add_scsi_unit, ROMTYPE_MASTERCARD, 0, 0, BOARD_AUTOCONFIG_Z2, false, + NULL, 0, + true, EXPANSIONTYPE_SCSI + }, { _T("masoboshi"), _T("MasterCard"), _T("Masoboshi"), NULL, masoboshi_init, NULL, masoboshi_add_idescsi_unit, ROMTYPE_MASOBOSHI | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false, diff --git a/include/ncr9x_scsi.h b/include/ncr9x_scsi.h index 6d9b2aff..d12bc847 100644 --- a/include/ncr9x_scsi.h +++ b/include/ncr9x_scsi.h @@ -22,6 +22,7 @@ extern void rapidfire_add_scsi_unit(int ch, struct uaedev_config_info *ci, struc extern void alf3_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); extern void typhoon2scsi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); extern void squirrel_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +extern void mtecmastercard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); extern bool ncr_fastlane_autoconfig_init(struct autoconfig_info *aci); extern bool ncr_oktagon_autoconfig_init(struct autoconfig_info *aci); @@ -31,6 +32,7 @@ extern bool ncr_multievolution_init(struct autoconfig_info *aci); extern bool ncr_scram5394_init(struct autoconfig_info *aci); extern bool ncr_rapidfire_init(struct autoconfig_info *aci); extern bool ncr_alf3_autoconfig_init(struct autoconfig_info *aci); +extern bool ncr_mtecmastercard_init(struct autoconfig_info *aci); extern bool typhoon2scsi_init(struct autoconfig_info *aci); extern void cpuboard_ncr9x_scsi_put(uaecptr, uae_u32); diff --git a/include/rommgr.h b/include/rommgr.h index a94fb62e..92935aa0 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -191,6 +191,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_PCMCIASRAM 0x00100080 #define ROMTYPE_PCMCIAIDE 0x00100081 #define ROMTYPE_SSQUIRREL 0x00100082 +#define ROMTYPE_MASTERCARD 0x00100083 #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 diff --git a/ncr9x_scsi.cpp b/ncr9x_scsi.cpp index a4d70945..69ab2317 100644 --- a/ncr9x_scsi.cpp +++ b/ncr9x_scsi.cpp @@ -173,6 +173,7 @@ static struct ncr9x_state *ncr_scram5394_scsi[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ncr9x_state *ncr_rapidfire_scsi[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ncr9x_state *ncr_trifecta_scsi[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ncr9x_state *ncr_squirrel_scsi; +static struct ncr9x_state *ncr_mtec_mastercard; static struct ncr9x_state *ncr_units[MAX_NCR9X_UNITS + 1]; @@ -1176,7 +1177,7 @@ static void ncr9x_io_bput3(struct ncr9x_state *ncr, uaecptr addr, uae_u32 val, i write_log(_T("DKB IO %08X PUT %02x %08x\n"), addr, val & 0xff, M68K_GETPC); return; } - } else if (ISCPUBOARD(BOARD_MTEC, BOARD_MTEC_SUB_EMATRIX530) || ISCPUBOARD(BOARD_DCE, BOARD_DCE_SUB_TYPHOON2)) { + } else if (ISCPUBOARD(BOARD_MTEC, BOARD_MTEC_SUB_EMATRIX530) || ISCPUBOARD(BOARD_DCE, BOARD_DCE_SUB_TYPHOON2) || ncr == ncr_mtec_mastercard) { if ((addr & 0xf000) >= 0xe000) { if ((addr & 0x3ff) <= 7) { if (ncr->fakedma_data_offset < ncr->fakedma_data_size) { @@ -1194,7 +1195,7 @@ static void ncr9x_io_bput3(struct ncr9x_state *ncr, uaecptr addr, uae_u32 val, i return; if (addr & 1) return; - if (currprefs.cpuboard_settings & 1) + if ((currprefs.cpuboard_settings & 1) && ncr != ncr_mtec_mastercard) return; reg_shift = 3; } @@ -1535,7 +1536,7 @@ static uae_u32 ncr9x_io_bget3(struct ncr9x_state *ncr, uaecptr addr, int *reg) write_log(_T("DKB IO GET %08x %08x\n"), addr, M68K_GETPC); return 0; } - } else if (ISCPUBOARD(BOARD_MTEC, BOARD_MTEC_SUB_EMATRIX530) || ISCPUBOARD(BOARD_DCE, BOARD_DCE_SUB_TYPHOON2)) { + } else if (ISCPUBOARD(BOARD_MTEC, BOARD_MTEC_SUB_EMATRIX530) || ISCPUBOARD(BOARD_DCE, BOARD_DCE_SUB_TYPHOON2) || ncr == ncr_mtec_mastercard) { if ((addr & 0xf000) >= 0xe000) { if ((addr & 0x3ff) <= 7) { if (ncr->fakedma_data_offset >= ncr->fakedma_data_size) { @@ -1561,7 +1562,7 @@ static uae_u32 ncr9x_io_bget3(struct ncr9x_state *ncr, uaecptr addr, int *reg) } if (addr & 1) return 0x7f; - if (currprefs.cpuboard_settings & 1) + if ((currprefs.cpuboard_settings & 1) && ncr != ncr_mtec_mastercard) return 0x7f; if (addr < 0xc000 || addr >= 0xe000) return 0x7f; @@ -2342,6 +2343,41 @@ bool ncr_scram5394_init(struct autoconfig_info *aci) return true; } +bool ncr_mtecmastercard_init(struct autoconfig_info *aci) +{ + uae_u8 *rom = xcalloc(uae_u8, 65536); + load_rom_rc(aci->rc, ROMTYPE_MASTERCARD, 32768, 0, rom, 65536, LOADROM_EVENONLY_ODDONE); + memcpy(aci->autoconfig_raw, aci->rc->autoboot_disabled ? rom + 256 : rom, 128); + if (!aci->doinit) { + xfree(rom); + return true; + } + + struct ncr9x_state *ncr = getscsi(aci->rc); + if (!ncr) { + xfree(rom); + return false; + } + + xfree(ncr->rom); + ncr->rom = rom; + + ncr->enabled = true; + memcpy(ncr->acmemory, aci->autoconfig_raw, sizeof aci->autoconfig_raw); + ncr->rom_start = 0; + ncr->rom_offset = 0; + ncr->rom_end = 0x8000; + ncr->io_start = 0x8000; + ncr->io_end = 0x10000; + ncr->bank = &ncr9x_bank_generic; + ncr->board_mask = 65535; + + ncr9x_reset_board(ncr); + + aci->addrbank = ncr->bank; + return true; +} + bool ncr_rapidfire_init(struct autoconfig_info *aci) { const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_RAPIDFIRE); @@ -2566,4 +2602,11 @@ void squirrel_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romcon ncr9x_esp_scsi_init(ncr_squirrel_scsi, fake2_dma_read, fake2_dma_write, set_irq2, 0); esp_dma_enable(ncr_squirrel_scsi->devobject.lsistate, 1); } + +void mtecmastercard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + ncr9x_add_scsi_unit(&ncr_mtec_mastercard, ch, ci, rc); + ncr9x_esp_scsi_init(ncr_mtec_mastercard, fake_dma_read_ematrix, fake_dma_write_ematrix, set_irq2, 0); + esp_dma_enable(ncr_mtec_mastercard->devobject.lsistate, 1); +} #endif diff --git a/rommgr.cpp b/rommgr.cpp index 563c34b2..8951daef 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 254 +#define NEXT_ROM_ID 255 #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 }, @@ -626,6 +626,8 @@ static struct romdata roms[] = { 0x3eb87eb3, 0xff41889e,0x641114e5,0x5ec1f784,0xd79216ce,0xe9a74a40, NULL, NULL }, { _T("Trifecta v4.31"), 0, 0, 0, 0, _T("TRIFECTA\0"), 32768, 253, 0, 0, ROMTYPE_TRIFECTA, 0, 0, NULL, 0x591c3cd4, 0x681b8a67,0x3775dd0c,0x8f13b641,0x8852a51e,0xf3a29da3, NULL, NULL }, + { _T("Mastercard v2.3"), 0, 0, 0, 0, _T("MTECMASTERCARD\0"), 32768, 254, 0, 0, ROMTYPE_MASTERCARD, 0, 0, NULL, + 0xfb4d20c6, 0xdd1a38eb,0xe87a44f7,0x46cb400f,0xbd761d2e,0x9ebd31ef, 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") }, -- 2.47.3