#define TANDEM_IDE (TRIFECTA_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
#define DOTTO_IDE (TANDEM_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
#define DEV_IDE (DOTTO_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
-#define TOTAL_IDE (DEV_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
+#define RIPPLE_IDE (DEV_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
+#define TOTAL_IDE (RIPPLE_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS)
#define ALF_ROM_OFFSET 0x0100
#define GVP_IDE_ROM_OFFSET 0x8000
static struct ide_board *tandem_board[MAX_DUPLICATE_EXPANSION_BOARDS];
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_hdf *idecontroller_drive[TOTAL_IDE * 2];
static struct ide_thread_state idecontroller_its;
return reg;
}
+static int get_ripple_reg(uaecptr addr, struct ide_board *board, int *portnum)
+{
+ int reg = -1;
+ *portnum = (addr & 0x2000) ? 1 : 0;
+
+ if (addr & 0x3000) {
+ reg = (addr >> 9) & 7;
+
+ if (addr & 0x4000) {
+ 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++) {
}
}
+ } else if (board->type == RIPPLE_IDE) {
+ if (board->rom && board->userdata == 0) {
+ v = board->rom[(addr & board->rom_mask)];
+ return v;
+ }
+ int portnum = 0;
+ int regnum = get_ripple_reg(addr,board,&portnum);
+ if (!ide_isdrive(board->ide[portnum]) && !ide_isdrive(board->ide[portnum]->pair)) {
+ v = 0xff;
+ return v;
+ }
+ if (regnum >= 0 && board->ide[portnum]) {
+ v = get_ide_reg_multi(board,regnum,portnum,1);
+ }
+
}
return v;
}
}
+ } else if (board->type == RIPPLE_IDE) {
+ if (board->rom && board->userdata == 0) {
+ v = board->rom[addr & board->rom_mask];
+ v <<= 8;
+ v |= board->rom[(addr + 1) & board->rom_mask];
+ return v;
+ }
+ int portnum = 0;
+ int regnum = get_ripple_reg(addr,board,&portnum);
+ if (regnum == IDE_DATA && board->ide[portnum]) {
+ v = get_ide_reg_multi(board, regnum, portnum, 1);
+ }
+
}
}
}
+ } else if (board->type == RIPPLE_IDE) {
+ if ((addr & 0x3000) && board->userdata == 0) board->userdata = 1;
+ int portnum = 0;
+ int reg = get_ripple_reg(addr,board,&portnum);
+ if (board->ide[portnum] && reg >= 0) {
+ put_ide_reg_multi(board,reg,v,portnum,1);
+ }
}
}
}
put_ide_reg(board, reg, v);
}
+ } else if (board->type == RIPPLE_IDE) {
+ if ((addr & 0x3000) && board->userdata == 0)
+ board->userdata = 1;
+ if (board->configured) {
+ int portnum = 0;
+ int reg = get_ripple_reg(addr, board, &portnum);
+ if (reg >= 0 && board->ide[portnum])
+ put_ide_reg_multi(board,reg,v,portnum,1);
+ }
}
}
}
add_ide_standard_unit(ch, ci, rc, dev_board, DEV_IDE, false, true, 2);
}
+bool ripple_init(struct autoconfig_info *aci)
+{
+ const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_RIPPLE);
+
+ ide_add_reset();
+ if (!aci->doinit) {
+ aci->autoconfigp = ert->autoconfig;
+ return true;
+ }
+
+ struct ide_board *ide = getide(aci);
+ if (!ide)
+ return false;
+
+ ide->configured = 0;
+ ide->bank = &ide_bank_generic;
+ ide->type = RIPPLE_IDE;
+ ide->rom_size = 131072;
+ ide->userdata = 0;
+ ide->intena = false;
+ ide->mask = 131072 - 1;
+ ide->keepautoconfig = false;
+
+ ide->rom = xcalloc(uae_u8, ide->rom_size);
+ if (ide->rom) {
+ memset(ide->rom, 0xff, ide->rom_size);
+ }
+
+ ide->rom_mask = ide->rom_size - 1;
+
+ for (int i = 0; i < 16; i++) {
+ uae_u8 b = ert->autoconfig[i];
+ if (i == 0 && aci->rc->autoboot_disabled)
+ b &= ~0x10;
+ ew(ide, i * 4, b);
+ }
+
+ load_rom_rc(aci->rc, ROMTYPE_RIPPLE, 65536, 0, ide->rom, 131072, LOADROM_EVENONLY_ODDONE);
+
+ aci->addrbank = ide->bank;
+ return true;
+}
+
+void ripple_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+ add_ide_standard_unit(ch, ci, rc, ripple_board, RIPPLE_IDE, false, false, 4);
+}
extern void x86_xt_ide_bios(struct zfile*, struct romconfig*);
static bool x86_at_hd_init(struct autoconfig_info *aci, int type)