]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Add AIDE
authorMatt Harlum <matt@harlum.net>
Fri, 29 May 2026 11:04:39 +0000 (23:04 +1200)
committerMatt Harlum <matt@harlum.net>
Wed, 3 Jun 2026 11:25:29 +0000 (23:25 +1200)
expansion.cpp
idecontrollers.cpp
include/idecontrollers.h
include/rommgr.h

index 91ca594bf078db4839e047b2cf93deaf61bfcea2..57c0ae558e37c3453f23d67d1dee218ea6ccdb2b 100644 (file)
@@ -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
index f7fcf26a96279b67cb474810c33cf40b4abd7e1a..0b30bb28632e57904628c6b1eb237bf16e720026 100644 (file)
@@ -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
index 5e03248a141845603681921c1b8dd08ce6bb1ba3..be93309829c46f51f1eaa856bab62e00d8ccc588 100644 (file)
@@ -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;
index 314e549c211f4ba9badaf90e1e7ac7d50fa2e27b..57995f3061812d942497a653e7d278dd3acb8fcb 100644 (file)
@@ -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