From 56d1d70da5bd8b72160e979e66fbbd13c7356aa3 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 10 Mar 2019 11:51:51 +0200 Subject: [PATCH] Tandem IDE controller. --- expansion.cpp | 9 +++++++++ idecontrollers.cpp | 42 +++++++++++++++++++++++++++++++++------- include/idecontrollers.h | 3 +++ include/rommgr.h | 1 + 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/expansion.cpp b/expansion.cpp index a3a3885d..f4b000c7 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -4976,6 +4976,15 @@ const struct expansionromtype expansionroms[] = { false, EXPANSIONTYPE_IDE, 2092, 8, 0 }, + { + _T("tandem"), _T("Tandem"), _T("BSC"), + NULL, tandem_init, NULL, tandem_add_ide_unit, ROMTYPE_TANDEM | ROMTYPE_NOT, 0, 0, BOARD_AUTOCONFIG_Z2, false, + NULL, 0, + false, EXPANSIONTYPE_IDE, + 0, 0, 0, false, NULL, + false, 0, NULL, + { 0xc1, 6, 0x00, 0x00, 0x08, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + }, { _T("malibu"), _T("Malibu"), _T("California Access"), NULL, malibu_init, NULL, malibu_add_scsi_unit, ROMTYPE_MALIBU, 0, 0, BOARD_AUTOCONFIG_Z2, false, diff --git a/idecontrollers.cpp b/idecontrollers.cpp index 321c5ec9..d129ab4d 100644 --- a/idecontrollers.cpp +++ b/idecontrollers.cpp @@ -54,7 +54,8 @@ #define ACCESSX_IDE (ELSATHD_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) #define IVST500AT_IDE (ACCESSX_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS) #define TRIFECTA_IDE (IVST500AT_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) -#define TOTAL_IDE (TRIFECTA_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) +#define TANDEM_IDE (TRIFECTA_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) +#define TOTAL_IDE (TANDEM_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) #define ALF_ROM_OFFSET 0x0100 #define GVP_IDE_ROM_OFFSET 0x8000 @@ -117,6 +118,7 @@ static struct ide_board *elsathd_board[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ide_board *accessx_board[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ide_board *ivst500at_board[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ide_board *trifecta_board[MAX_DUPLICATE_EXPANSION_BOARDS]; +static struct ide_board *tandem_board[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ide_hdf *idecontroller_drive[TOTAL_IDE * 2]; static struct ide_thread_state idecontroller_its; @@ -651,7 +653,7 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr) v = board->rom[addr & board->rom_mask]; } - } else if (board->type == ALF_IDE) { + } else if (board->type == ALF_IDE || board->type == TANDEM_IDE) { if (addr < 0x1100 || (addr & 1)) { if (board->rom) @@ -1026,7 +1028,7 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr) v |= ide_read_byte(board, addr + 1); } - } else if (board->type == ALF_IDE) { + } else if (board->type == ALF_IDE || board->type == TANDEM_IDE) { int regnum = get_alf_reg(addr, board); if (regnum == IDE_DATA) { @@ -1313,7 +1315,7 @@ static void ide_write_byte(struct ide_board *board, uaecptr addr, uae_u8 v) board->userdata = v; } - } else if (board->type == ALF_IDE) { + } else if (board->type == ALF_IDE || board->type == TANDEM_IDE) { int regnum = get_alf_reg(addr, board); if (regnum >= 0) @@ -1565,7 +1567,7 @@ static void ide_write_word(struct ide_board *board, uaecptr addr, uae_u16 v) ide_write_byte(board, addr + 1, v); } - } else if (board->type == ALF_IDE) { + } else if (board->type == ALF_IDE || board->type == TANDEM_IDE) { int regnum = get_alf_reg(addr, board); if (regnum == IDE_DATA) { @@ -1954,8 +1956,6 @@ bool alf_init(struct autoconfig_info *aci) if (!ide) return false; - ide->configured = 0; - ide->configured = 0; ide->bank = &ide_bank_generic; ide->type = ALF_IDE; @@ -2714,6 +2714,34 @@ void trumpcard500at_add_ide_unit(int ch, struct uaedev_config_info *ci, struct r add_ide_standard_unit(ch, ci, rc, ivst500at_board, IVST500AT_IDE, true, false, 2); } + +bool tandem_init(struct autoconfig_info *aci) +{ + const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_TANDEM); + if (!aci->doinit) { + aci->autoconfigp = ert->autoconfig; + return true; + } + + struct ide_board *ide = getide(aci); + + ide->bank = &ide_bank_generic; + ide->mask = 65536 - 1; + + for (int i = 0; i < 16; i++) { + uae_u8 b = ert->autoconfig[i]; + ew(ide, i * 4, b); + } + + aci->addrbank = ide->bank; + return true; +} + +void tandem_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + add_ide_standard_unit(ch, ci, rc, tandem_board, TANDEM_IDE, false, false, 2); +} + extern void x86_xt_ide_bios(struct zfile*, struct romconfig*); static bool x86_at_hd_init(struct autoconfig_info *aci, int type) { diff --git a/include/idecontrollers.h b/include/idecontrollers.h index 194785c2..68a8ee79 100644 --- a/include/idecontrollers.h +++ b/include/idecontrollers.h @@ -63,6 +63,9 @@ void accessx_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfi bool trumpcard500at_init(struct autoconfig_info *aci); void trumpcard500at_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +bool tandem_init(struct autoconfig_info *aci); +void tandem_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); + uae_u32 REGPARAM3 apollo_ide_lget (uaecptr addr) REGPARAM; uae_u32 REGPARAM3 apollo_ide_wget (uaecptr addr) REGPARAM; uae_u32 REGPARAM3 apollo_ide_bget (uaecptr addr) REGPARAM; diff --git a/include/rommgr.h b/include/rommgr.h index eeceb137..91679794 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -186,6 +186,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_TRIFECTA 0x0010007b #define ROMTYPE_PRELUDE 0x0010007c #define ROMTYPE_PRELUDE1200 0x0010007d +#define ROMTYPE_TANDEM 0x0010007e #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 -- 2.47.3