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
#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
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;
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++) {
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;
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);
+ }
}
}
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);
+ }
}
}
}
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);
}
}
}
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