From: Matt Harlum Date: Fri, 29 May 2026 11:04:39 +0000 (+1200) Subject: Add AIDE X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=0d9efe2cd8990ea7e20004eb31afa47c4cc0f6f6;p=francis%2Fwinuae.git Add AIDE --- diff --git a/expansion.cpp b/expansion.cpp index 91ca594b..57c0ae55 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -6128,6 +6128,14 @@ const struct expansionromtype expansionroms[] = { false, 2, NULL, { 0xd2, 0x07, 0x00, 0x00, 0x14, 0x4A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08 } }, + { + _T("aide"), _T("AIDE"), _T("Matthias Heinrichs"), + NULL, aide_init, NULL, aide_add_ide_unit, ROMTYPE_AIDE | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true, + NULL, 0, + false, EXPANSIONTYPE_IDE, + 0, 0, 0, false, NULL, + false, 0, NULL + }, /* PC Bridgeboards */ #ifdef WITH_X86 diff --git a/idecontrollers.cpp b/idecontrollers.cpp index f7fcf26a..0b30bb28 100644 --- a/idecontrollers.cpp +++ b/idecontrollers.cpp @@ -60,7 +60,8 @@ #define DEV_IDE (DOTTO_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) #define RIPPLE_IDE (DEV_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) #define XSURF_IDE (RIPPLE_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS) -#define TOTAL_IDE (XSURF_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) +#define AIDE_IDE (XSURF_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) +#define TOTAL_IDE (AIDE_IDE + MAX_DUPLICATE_EXPANSION_BOARDS) #define ALF_ROM_OFFSET 0x0100 #define GVP_IDE_ROM_OFFSET 0x8000 @@ -128,6 +129,7 @@ static struct ide_board *dotto_board[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ide_board *dev_board[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ide_board *ripple_board[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ide_board *xsurf_board[MAX_DUPLICATE_EXPANSION_BOARDS]; +static struct ide_board *aide_board[MAX_DUPLICATE_EXPANSION_BOARDS]; static struct ide_hdf *idecontroller_drive[TOTAL_IDE * 2]; static struct ide_thread_state idecontroller_its; @@ -680,6 +682,19 @@ static int get_ripple_reg(uaecptr addr, struct ide_board *board, int *portnum) return reg; } + +static int get_aide_reg(uaecptr addr, struct ide_board *board) +{ + int reg = -1; + if (addr & 0x3000) { + reg = (addr >> 2) & 7; + if (addr & 0x1000) + reg |= IDE_SECONDARY; + } + + return reg; +} + static int getidenum(struct ide_board *board, struct ide_board **arr) { for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) { @@ -1142,6 +1157,11 @@ static uae_u32 ide_read_byte2(struct ide_board *board, uaecptr addr) v = get_ide_reg_multi(board,regnum,portnum,1); } + } else if (board->type == AIDE_IDE) { + int regnum = get_aide_reg(addr,board); + if (regnum >= 0) + v = get_ide_reg(board,regnum); + } return v; @@ -1495,6 +1515,11 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr) v = get_ide_reg_multi(board, regnum, portnum, 1); } + } else if (board->type == AIDE_IDE) { + int regnum = get_aide_reg(addr,board); + if (regnum == IDE_DATA) { + v = get_ide_reg_multi(board, regnum, 0, 1); + } } } @@ -1932,6 +1957,12 @@ static void ide_write_byte(struct ide_board *board, uaecptr addr, uae_u8 v) if (board->ide[portnum] && reg >= 0) { put_ide_reg_multi(board,reg,v,portnum,1); } + + } else if (board->type == AIDE_IDE) { + int reg = get_aide_reg(addr,board); + if (reg >= 0) { + put_ide_reg(board,reg,v); + } } } } @@ -2164,6 +2195,11 @@ static void ide_write_word(struct ide_board *board, uaecptr addr, uae_u16 v) if (reg >= 0 && board->ide[portnum]) put_ide_reg_multi(board,reg,v,portnum,1); } + + } else if (board->type == AIDE_IDE) { + int reg = get_aide_reg(addr, board); + if (reg >= 0) + put_ide_reg_multi(board,reg,v,0,1); } } } @@ -3431,6 +3467,39 @@ void ripple_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig add_ide_standard_unit(ch, ci, rc, ripple_board, RIPPLE_IDE, false, false, 4); } +bool aide_init(struct autoconfig_info *aci) +{ + + aci->zorro = 0; + aci->start = 0xEF0000; + aci->size = 0x10000; + ide_add_reset(); + + if (!aci->doinit) { + return true; + } + + struct ide_board *ide = getide(aci); + if (!ide) + return false; + + ide->configured = 1; + ide->bank = &ide_bank_generic; + ide->type = AIDE_IDE; + ide->intena = false; + ide->baseaddress = aci->start; + ide->mask = 65535; + + map_banks(ide->bank, aci->start >> 16, aci->size >> 16, 0); + + return true; +} + +void aide_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc) +{ + add_ide_standard_unit(ch, ci, rc, aide_board, AIDE_IDE, false, false, 2); +} + bool xsurf_init_ide(struct autoconfig_info *aci) { // xsurf_init() handles autoconfig stuff diff --git a/include/idecontrollers.h b/include/idecontrollers.h index 5e03248a..be933098 100644 --- a/include/idecontrollers.h +++ b/include/idecontrollers.h @@ -75,6 +75,9 @@ bool xsurf_init_ide(struct autoconfig_info *aci); uae_u32 xsurf_ide_read(uaecptr addr, int size); void xsurf_ide_write(uaecptr addr, int size, uae_u32 val); +void aide_add_ide_unit(int ch, struct uaedev_config_info* ci, struct romconfig* rc); +bool aide_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 314e549c..57995f30 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -219,6 +219,7 @@ extern int decode_cloanto_rom_do(uae_u8 *mem, int size, int real_size); #define ROMTYPE_KBMCU 0x00100094 #define ROMTYPE_RIPPLE 0x00100095 #define ROMTYPE_512KWOM 0x00100096 +#define ROMTYPE_AIDE 0x00100097 #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000