]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Tandem IDE controller.
authorToni Wilen <twilen@winuae.net>
Sun, 10 Mar 2019 09:51:51 +0000 (11:51 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 10 Mar 2019 09:51:51 +0000 (11:51 +0200)
expansion.cpp
idecontrollers.cpp
include/idecontrollers.h
include/rommgr.h

index a3a3885d8ac23763f7c65c61ddf20f0e99d75c7a..f4b000c7e8e1e21a12edd6a9fd1526bd26114416 100644 (file)
@@ -4976,6 +4976,15 @@ const struct expansionromtype expansionroms[] = {
                false, EXPANSIONTYPE_IDE,
                2092, 8, 0
        },
+       {
+               _T("tandem"), _T("Tandem"), _T("BSC"),
+               NULL, tandem_init, NULL, tandem_add_ide_unit, ROMTYPE_TANDEM | ROMTYPE_NOT, 0, 0, BOARD_AUTOCONFIG_Z2, false,
+               NULL, 0,
+               false, EXPANSIONTYPE_IDE,
+               0, 0, 0, false, NULL,
+               false, 0, NULL,
+               { 0xc1, 6, 0x00, 0x00, 0x08, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+       },
        {
                _T("malibu"), _T("Malibu"), _T("California Access"),
                NULL, malibu_init, NULL, malibu_add_scsi_unit, ROMTYPE_MALIBU, 0, 0, BOARD_AUTOCONFIG_Z2, false,
index 321c5ec9481e7d2a26f2140a081743225acfee2f..d129ab4d9f9db8826d5a4ae9862f5dd9e6af6d86 100644 (file)
@@ -54,7 +54,8 @@
 #define ACCESSX_IDE (ELSATHD_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
 #define IVST500AT_IDE (ACCESSX_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS)
 #define TRIFECTA_IDE (IVST500AT_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
-#define TOTAL_IDE (TRIFECTA_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
+#define TANDEM_IDE (TRIFECTA_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
+#define TOTAL_IDE (TANDEM_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
 
 #define ALF_ROM_OFFSET 0x0100
 #define GVP_IDE_ROM_OFFSET 0x8000
@@ -117,6 +118,7 @@ static struct ide_board *elsathd_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 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_hdf *idecontroller_drive[TOTAL_IDE * 2];
 static struct ide_thread_state idecontroller_its;
@@ -651,7 +653,7 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr)
                        v = board->rom[addr & board->rom_mask];
                }
 
-       } else if (board->type == ALF_IDE) {
+       } else if (board->type == ALF_IDE || board->type == TANDEM_IDE) {
 
                if (addr < 0x1100 || (addr & 1)) {
                        if (board->rom)
@@ -1026,7 +1028,7 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr)
                                v |= ide_read_byte(board, addr + 1);
                        }
                        
-               } else if (board->type == ALF_IDE) {
+               } else if (board->type == ALF_IDE || board->type == TANDEM_IDE) {
 
                        int regnum = get_alf_reg(addr, board);
                        if (regnum == IDE_DATA) {
@@ -1313,7 +1315,7 @@ static void ide_write_byte(struct ide_board *board, uaecptr addr, uae_u8 v)
                                board->userdata = v;
                        }
 
-               } else  if (board->type == ALF_IDE) {
+               } else  if (board->type == ALF_IDE || board->type == TANDEM_IDE) {
 
                        int regnum = get_alf_reg(addr, board);
                        if (regnum >= 0)
@@ -1565,7 +1567,7 @@ static void ide_write_word(struct ide_board *board, uaecptr addr, uae_u16 v)
                                ide_write_byte(board, addr + 1, v);
                        }
 
-               } else if (board->type == ALF_IDE) {
+               } else if (board->type == ALF_IDE || board->type == TANDEM_IDE) {
 
                        int regnum = get_alf_reg(addr, board);
                        if (regnum == IDE_DATA) {
@@ -1954,8 +1956,6 @@ bool alf_init(struct autoconfig_info *aci)
        if (!ide)
                return false;
 
-       ide->configured = 0;
-
        ide->configured = 0;
        ide->bank = &ide_bank_generic;
        ide->type = ALF_IDE;
@@ -2714,6 +2714,34 @@ void trumpcard500at_add_ide_unit(int ch, struct uaedev_config_info *ci, struct r
        add_ide_standard_unit(ch, ci, rc, ivst500at_board, IVST500AT_IDE, true, false, 2);
 }
 
+
+bool tandem_init(struct autoconfig_info *aci)
+{
+       const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_TANDEM);
+       if (!aci->doinit) {
+               aci->autoconfigp = ert->autoconfig;
+               return true;
+       }
+
+       struct ide_board *ide = getide(aci);
+
+       ide->bank = &ide_bank_generic;
+       ide->mask = 65536 - 1;
+
+       for (int i = 0; i < 16; i++) {
+               uae_u8 b = ert->autoconfig[i];
+               ew(ide, i * 4, b);
+       }
+
+       aci->addrbank = ide->bank;
+       return true;
+}
+
+void tandem_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       add_ide_standard_unit(ch, ci, rc, tandem_board, TANDEM_IDE, false, false, 2);
+}
+
 extern void x86_xt_ide_bios(struct zfile*, struct romconfig*);
 static bool x86_at_hd_init(struct autoconfig_info *aci, int type)
 {
index 194785c2e89c1bccd709a8bf5d931f3c2e39b327..68a8ee79d7d26b5aa98bfa9ddf3d2e811a1805cc 100644 (file)
@@ -63,6 +63,9 @@ void accessx_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 bool trumpcard500at_init(struct autoconfig_info *aci);
 void trumpcard500at_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
+bool tandem_init(struct autoconfig_info *aci);
+void tandem_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+
 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 eeceb137429c3986e495f4ea3c1bd72ab76d11c8..9167979480c5bfd96fa6386aa894c659cdadcbe4 100644 (file)
@@ -186,6 +186,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_TRIFECTA       0x0010007b
 #define ROMTYPE_PRELUDE                0x0010007c
 #define ROMTYPE_PRELUDE1200    0x0010007d
+#define ROMTYPE_TANDEM         0x0010007e
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000