]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Hardital Dotto IDE controller.
authorToni Wilen <twilen@winuae.net>
Sun, 2 Feb 2020 10:16:16 +0000 (12:16 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 2 Feb 2020 10:16:16 +0000 (12:16 +0200)
expansion.cpp
idecontrollers.cpp
include/idecontrollers.h
include/rommgr.h
rommgr.cpp

index 526caa7ab10078b0b36372d7f2738877b3d72286..e2aad7c2985b250c01afe2c84307a36af2e71622 100644 (file)
@@ -5377,6 +5377,12 @@ const struct expansionromtype expansionroms[] = {
                true, EXPANSIONTYPE_SCSI,
                2017, 10, 0
        },
+       {
+               _T("dotto"), _T("Dotto"), _T("Hardital"),
+               NULL, dotto_init, NULL, dotto_add_ide_unit, ROMTYPE_DOTTO, 0, 0, BOARD_AUTOCONFIG_Z2, false,
+               NULL, 0,
+               true, EXPANSIONTYPE_IDE
+       },
        {
                _T("vector"), _T("Vector Falcon 8000"), _T("HK-Computer"),
                NULL, vector_init, NULL, vector_add_scsi_unit, ROMTYPE_VECTOR, 0, 0, BOARD_AUTOCONFIG_Z2, false,
index 216b00b1f542b333aa9623255669977067bfd694..2058137fc4d8c6552e41acd3b91040f75b7ea5dc 100644 (file)
@@ -55,7 +55,8 @@
 #define IVST500AT_IDE (ACCESSX_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS)
 #define TRIFECTA_IDE (IVST500AT_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
 #define TANDEM_IDE (TRIFECTA_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
-#define TOTAL_IDE (TANDEM_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
+#define DOTTO_IDE (TANDEM_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
+#define TOTAL_IDE (DOTTO_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
 
 #define ALF_ROM_OFFSET 0x0100
 #define GVP_IDE_ROM_OFFSET 0x8000
@@ -119,6 +120,7 @@ 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_board *dotto_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 
 static struct ide_hdf *idecontroller_drive[TOTAL_IDE * 2];
 static struct ide_thread_state idecontroller_its;
@@ -953,6 +955,18 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr)
                        v = ide_irq_check(board->ide[0], false) ? 1 : 0;
                }
 
+       } else if (board->type == DOTTO_IDE) {
+
+               int offset = addr;
+               v = board->rom[offset];
+               if (board->configured) {
+                       int regnum = get_adide_reg(addr, board);
+                       if (regnum >= 0) {
+                               v = get_ide_reg(board, regnum);
+                               v = adide_decode_word(v);
+                       }
+               }
+
        }
 
        return v;
@@ -1237,6 +1251,24 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr)
                                v |= board->rom[(offset + 1) & board->rom_mask];
                        }
 
+               } else if (board->type == DOTTO_IDE) {
+
+                       int offset = addr;
+                       v = board->rom[(offset + 0) & board->rom_mask];
+                       v <<= 8;
+                       v |= board->rom[(offset + 1) & board->rom_mask];
+                       if (board->configured) {
+                               int regnum = get_adide_reg(addr, board);
+                               if (regnum >= 0) {
+                                       if (regnum == IDE_DATA) {
+                                               v = get_ide_reg(board, IDE_DATA);
+                                       } else {
+                                               v = get_ide_reg(board, regnum) << 8;
+                                               v = adide_decode_word(v);
+                                       }
+                               }
+                       }
+
                }
 
        }
@@ -1527,6 +1559,14 @@ static void ide_write_byte(struct ide_board *board, uaecptr addr, uae_u8 v)
                                put_ide_reg_multi(board, reg, v, portnum, 1);
                        }
 
+               } else if (board->type == DOTTO_IDE) {
+
+                       if (board->configured) {
+                               int regnum = get_adide_reg(addr, board);
+                               v = adide_encode_word(v);
+                               put_ide_reg(board, regnum, v);
+                       }
+
                }
 
        }
@@ -1720,6 +1760,16 @@ static void ide_write_word(struct ide_board *board, uaecptr addr, uae_u16 v)
                        if (!reg || addr == 0 || addr == 2) {
                                put_ide_reg_multi(board, IDE_DATA, v, portnum, 1);
                        }
+
+               } else if (board->type == DOTTO_IDE) {
+
+                       int regnum = get_adide_reg(addr, board);
+                       if (regnum == IDE_DATA) {
+                               put_ide_reg(board, IDE_DATA, v);
+                       } else {
+                               v = adide_encode_word(v);
+                               put_ide_reg(board, regnum, v >> 8);
+                       }
                }
        }
 }
@@ -2815,6 +2865,40 @@ void tandem_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig
        add_ide_standard_unit(ch, ci, rc, tandem_board, TANDEM_IDE, false, false, 2);
 }
 
+bool dotto_init(struct autoconfig_info *aci)
+{
+       const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_DOTTO);
+       ide_add_reset();
+
+       uae_u8 *rom = xcalloc(uae_u8, 65536);
+       load_rom_rc(aci->rc, ROMTYPE_DOTTO, 32768, 0, rom, 65536, LOADROM_EVENONLY_ODDONE);
+
+       if (!aci->doinit) {
+               memcpy(aci->autoconfig_raw, rom, sizeof aci->autoconfig_raw);
+               xfree(rom);
+               return true;
+       }
+       struct ide_board *ide = getide(aci);
+
+       ide->bank = &ide_bank_generic;
+       ide->mask = 65536 - 1;
+       ide->rom_size = 65536;
+       ide->rom_mask = 65536 - 1;
+       ide->keepautoconfig = false;
+
+       ide->rom = rom;
+       memcpy(ide->acmemory, ide->rom, sizeof ide->acmemory);
+
+       aci->addrbank = ide->bank;
+       return true;
+}
+
+void dotto_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       add_ide_standard_unit(ch, ci, rc, dotto_board, DOTTO_IDE, false, true, 2);
+}
+
+
 extern void x86_xt_ide_bios(struct zfile*, struct romconfig*);
 static bool x86_at_hd_init(struct autoconfig_info *aci, int type)
 {
index 224b70f3b44d8120775696856cfd3f48212d3e3e..d0c414b763b1708fb888fd30bea73e58900d6c2d 100644 (file)
@@ -61,6 +61,9 @@ void trumpcard500at_add_ide_unit(int ch, struct uaedev_config_info *ci, struct r
 bool tandem_init(struct autoconfig_info *aci);
 void tandem_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
+void dotto_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+bool dotto_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 92935aa04069e473afda983cdca393d072986b4e..b061c3eb0579472677785d35efbb6c94103ba85a 100644 (file)
@@ -192,6 +192,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_PCMCIAIDE      0x00100081
 #define ROMTYPE_SSQUIRREL      0x00100082
 #define ROMTYPE_MASTERCARD     0x00100083
+#define ROMTYPE_DOTTO          0x00100084
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
index 1833a20b0b9ac78d0c7270e45eb87ed30686892a..65c39a0441394446fc1958cc3a7e005ef04839f8 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 257
+#define NEXT_ROM_ID 258
 
 #define ALTROM(id,grp,num,size,flags,crc32,a,b,c,d,e) \
 { _T("X"), 0, 0, 0, 0, 0, size, id, 0, 0, flags, (grp << 16) | num, 0, NULL, crc32, a, b, c, d, e },
@@ -632,6 +632,8 @@ static struct romdata roms[] = {
        0x591c3cd4, 0x681b8a67,0x3775dd0c,0x8f13b641,0x8852a51e,0xf3a29da3, NULL, NULL },
        { _T("Mastercard v2.3"), 0, 0, 0, 0, _T("MTECMASTERCARD\0"), 65536, 254, 0, 0, ROMTYPE_MASTERCARD, 0, 0, NULL,
        0x4837cc3d, 0xeea5e9ab,0xb3ffb4ed,0xdf09825c,0x7e8de75d,0x0d08c01f, NULL, NULL },
+       { _T("Hardital Dotto"), 0, 0, 0, 0, _T("DOTTO\0"), 32768, 257, 0, 0, ROMTYPE_DOTTO, 0, 0, NULL,
+       0xee803484, 0x62822cb9,0x0b095efa,0x455496ea,0xd5b22740,0x77d86375, NULL, NULL },
 
        { _T("CyberStorm MK I 68040"), 0, 0, 0, 0, _T("CSMKI\0"), 32768, 95, 0, 0, ROMTYPE_CB_CSMK1, 0, 0, NULL,
          0, 0, 0, 0, 0, 0, NULL, _T("cyberstormmk1_040.rom") },