From: Toni Wilen Date: Sun, 2 Feb 2020 10:16:16 +0000 (+0200) Subject: Hardital Dotto IDE controller. X-Git-Tag: 4400~144 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=007d7ad8378a135a406d67bc0146365dfff7058c;p=francis%2Fwinuae.git Hardital Dotto IDE controller. --- diff --git a/expansion.cpp b/expansion.cpp index 526caa7a..e2aad7c2 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -5377,6 +5377,12 @@ const struct expansionromtype expansionroms[] = { true, EXPANSIONTYPE_SCSI, 2017, 10, 0 }, + { + _T("dotto"), _T("Dotto"), _T("Hardital"), + NULL, dotto_init, NULL, dotto_add_ide_unit, ROMTYPE_DOTTO, 0, 0, BOARD_AUTOCONFIG_Z2, false, + NULL, 0, + true, EXPANSIONTYPE_IDE + }, { _T("vector"), _T("Vector Falcon 8000"), _T("HK-Computer"), NULL, vector_init, NULL, vector_add_scsi_unit, ROMTYPE_VECTOR, 0, 0, BOARD_AUTOCONFIG_Z2, false, diff --git a/idecontrollers.cpp b/idecontrollers.cpp index 216b00b1..2058137f 100644 --- a/idecontrollers.cpp +++ b/idecontrollers.cpp @@ -55,7 +55,8 @@ #define IVST500AT_IDE (ACCESSX_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS) #define TRIFECTA_IDE (IVST500AT_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) #define TANDEM_IDE (TRIFECTA_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) -#define TOTAL_IDE (TANDEM_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) +#define DOTTO_IDE (TANDEM_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) +#define TOTAL_IDE (DOTTO_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) #define ALF_ROM_OFFSET 0x0100 #define GVP_IDE_ROM_OFFSET 0x8000 @@ -119,6 +120,7 @@ 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_board *dotto_board[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ide_hdf *idecontroller_drive[TOTAL_IDE * 2]; static struct ide_thread_state idecontroller_its; @@ -953,6 +955,18 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr) v = ide_irq_check(board->ide[0], false) ? 1 : 0; } + } else if (board->type == DOTTO_IDE) { + + int offset = addr; + v = board->rom[offset]; + if (board->configured) { + int regnum = get_adide_reg(addr, board); + if (regnum >= 0) { + v = get_ide_reg(board, regnum); + v = adide_decode_word(v); + } + } + } return v; @@ -1237,6 +1251,24 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr) v |= board->rom[(offset + 1) & board->rom_mask]; } + } else if (board->type == DOTTO_IDE) { + + int offset = addr; + v = board->rom[(offset + 0) & board->rom_mask]; + v <<= 8; + v |= board->rom[(offset + 1) & board->rom_mask]; + if (board->configured) { + int regnum = get_adide_reg(addr, board); + if (regnum >= 0) { + if (regnum == IDE_DATA) { + v = get_ide_reg(board, IDE_DATA); + } else { + v = get_ide_reg(board, regnum) << 8; + v = adide_decode_word(v); + } + } + } + } } @@ -1527,6 +1559,14 @@ static void ide_write_byte(struct ide_board *board, uaecptr addr, uae_u8 v) put_ide_reg_multi(board, reg, v, portnum, 1); } + } else if (board->type == DOTTO_IDE) { + + if (board->configured) { + int regnum = get_adide_reg(addr, board); + v = adide_encode_word(v); + put_ide_reg(board, regnum, v); + } + } } @@ -1720,6 +1760,16 @@ static void ide_write_word(struct ide_board *board, uaecptr addr, uae_u16 v) if (!reg || addr == 0 || addr == 2) { put_ide_reg_multi(board, IDE_DATA, v, portnum, 1); } + + } else if (board->type == DOTTO_IDE) { + + int regnum = get_adide_reg(addr, board); + if (regnum == IDE_DATA) { + put_ide_reg(board, IDE_DATA, v); + } else { + v = adide_encode_word(v); + put_ide_reg(board, regnum, v >> 8); + } } } } @@ -2815,6 +2865,40 @@ void tandem_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig add_ide_standard_unit(ch, ci, rc, tandem_board, TANDEM_IDE, false, false, 2); } +bool dotto_init(struct autoconfig_info *aci) +{ + const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_DOTTO); + ide_add_reset(); + + uae_u8 *rom = xcalloc(uae_u8, 65536); + load_rom_rc(aci->rc, ROMTYPE_DOTTO, 32768, 0, rom, 65536, LOADROM_EVENONLY_ODDONE); + + if (!aci->doinit) { + memcpy(aci->autoconfig_raw, rom, sizeof aci->autoconfig_raw); + xfree(rom); + return true; + } + struct ide_board *ide = getide(aci); + + ide->bank = &ide_bank_generic; + ide->mask = 65536 - 1; + ide->rom_size = 65536; + ide->rom_mask = 65536 - 1; + ide->keepautoconfig = false; + + ide->rom = rom; + memcpy(ide->acmemory, ide->rom, sizeof ide->acmemory); + + aci->addrbank = ide->bank; + return true; +} + +void dotto_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + add_ide_standard_unit(ch, ci, rc, dotto_board, DOTTO_IDE, false, true, 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 224b70f3..d0c414b7 100644 --- a/include/idecontrollers.h +++ b/include/idecontrollers.h @@ -61,6 +61,9 @@ void trumpcard500at_add_ide_unit(int ch, struct uaedev_config_info *ci, struct r bool tandem_init(struct autoconfig_info *aci); void tandem_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +void dotto_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc); +bool dotto_init(struct autoconfig_info *aci); + 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 92935aa0..b061c3eb 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -192,6 +192,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_PCMCIAIDE 0x00100081 #define ROMTYPE_SSQUIRREL 0x00100082 #define ROMTYPE_MASTERCARD 0x00100083 +#define ROMTYPE_DOTTO 0x00100084 #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 diff --git a/rommgr.cpp b/rommgr.cpp index 1833a20b..65c39a04 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 257 +#define NEXT_ROM_ID 258 #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 }, @@ -632,6 +632,8 @@ static struct romdata roms[] = { 0x591c3cd4, 0x681b8a67,0x3775dd0c,0x8f13b641,0x8852a51e,0xf3a29da3, NULL, NULL }, { _T("Mastercard v2.3"), 0, 0, 0, 0, _T("MTECMASTERCARD\0"), 65536, 254, 0, 0, ROMTYPE_MASTERCARD, 0, 0, NULL, 0x4837cc3d, 0xeea5e9ab,0xb3ffb4ed,0xdf09825c,0x7e8de75d,0x0d08c01f, NULL, NULL }, + { _T("Hardital Dotto"), 0, 0, 0, 0, _T("DOTTO\0"), 32768, 257, 0, 0, ROMTYPE_DOTTO, 0, 0, NULL, + 0xee803484, 0x62822cb9,0x0b095efa,0x455496ea,0xd5b22740,0x77d86375, 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") },