]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Roctec RocHard RH800C.
authorToni Wilen <twilen@winuae.net>
Sat, 18 Apr 2015 11:25:40 +0000 (14:25 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 18 Apr 2015 11:25:40 +0000 (14:25 +0300)
idecontrollers.cpp
include/ide.h
include/idecontrollers.h
include/rommgr.h
rommgr.cpp

index cc6db4df764182febd58dcebfca46e09f4229425..14079090f62ba7efeb3ed377e16f5510b66ef752 100644 (file)
@@ -41,7 +41,8 @@
 #define ADIDE_IDE (MASOBOSHI_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
 #define MTEC_IDE (ADIDE_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
 #define PROTAR_IDE (MTEC_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
-#define TOTAL_IDE (PROTAR_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
+#define ROCHARD_IDE (PROTAR_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
+#define TOTAL_IDE (ROCHARD_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS)
 
 #define ALF_ROM_OFFSET 0x0100
 #define GVP_IDE_ROM_OFFSET 0x8000
@@ -89,6 +90,7 @@ static struct ide_board *masoboshi_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ide_board *adide_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ide_board *mtec_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ide_board *protar_board[MAX_DUPLICATE_EXPANSION_BOARDS];
+static struct ide_board *rochard_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 
 static struct ide_hdf *idecontroller_drive[TOTAL_IDE * 2];
 static struct ide_thread_state idecontroller_its;
@@ -104,7 +106,9 @@ static void freencrunit(struct ide_board *ide)
                        ide_boards[i] = NULL;
                }
        }
-       remove_ide_unit(&ide->ide, 0);
+       for(int i = 0; i < MAX_IDE_PORTS_BOARD; i++) {
+               remove_ide_unit(&ide->ide[i], 0);
+       }
        if (ide->self_ptr)
                *ide->self_ptr = NULL;
        xfree(ide->rom);
@@ -161,41 +165,50 @@ static struct ide_board *getideboard(uaecptr addr)
        return NULL;
 }
 
-static void init_ide(struct ide_board *board, int ide_num, bool byteswap, bool adide)
+static void init_ide(struct ide_board *board, int ide_num, int maxunit, bool byteswap, bool adide)
 {
-       struct ide_hdf **idetable = &idecontroller_drive[ide_num * 2];
-       alloc_ide_mem (idetable, 2, &idecontroller_its);
-       board->ide = idetable[0];
-       idetable[0]->board = board;
-       idetable[1]->board = board;
-       idetable[0]->byteswap = byteswap;
-       idetable[1]->byteswap = byteswap;
-       idetable[0]->adide = adide;
-       idetable[1]->adide = adide;
-       ide_initialize(idecontroller_drive, ide_num);
+       for (int i = 0; i < maxunit / 2; i++) {
+               struct ide_hdf **idetable = &idecontroller_drive[(ide_num + i) * 2];
+               alloc_ide_mem (idetable, 2, &idecontroller_its);
+               board->ide[i] = idetable[0];
+               idetable[0]->board = board;
+               idetable[1]->board = board;
+               idetable[0]->byteswap = byteswap;
+               idetable[1]->byteswap = byteswap;
+               idetable[0]->adide = adide;
+               idetable[1]->adide = adide;
+               ide_initialize(idecontroller_drive, ide_num + i);
+       }
        idecontroller_its.idetable = idecontroller_drive;
        idecontroller_its.idetotal = TOTAL_IDE * 2;
        start_ide_thread(&idecontroller_its);
 }
 
-static void add_ide_standard_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc, struct ide_board **ideboard, int idetype, bool byteswap, bool adide)
+static void add_ide_standard_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc, struct ide_board **ideboard, int idetype, bool byteswap, bool adide, int maxunit)
 {
        struct ide_hdf *ide;
        struct ide_board *ideb;
+       if (ch >= maxunit)
+               return;
        ideb = allocide(&ideboard[ci->controller_type_unit], rc, ch);
        if (!ideb)
                return;
        ideb->keepautoconfig = true;
        ideb->type = idetype;
        ide = add_ide_unit (&idecontroller_drive[(idetype + ci->controller_type_unit) * 2], 2, ch, ci, rc);
-       init_ide(ideb, idetype + ci->controller_type_unit, byteswap, adide);
+       init_ide(ideb, idetype + ci->controller_type_unit, maxunit, byteswap, adide);
 }
 
 static bool ide_interrupt_check(struct ide_board *board)
 {
        if (!board->configured)
                return false;
-       bool irq = ide_irq_check(board->ide);
+       bool irq = false;
+       for (int i = 0; i < MAX_IDE_PORTS_BOARD; i++) {
+               if (board->ide[i] && !irq) {
+                       irq = ide_irq_check(board->ide[i]);
+               }
+       }
 #if 0
        if (board->irq != irq)
                write_log(_T("IDE irq %d -> %d\n"), board->irq, irq);
@@ -231,7 +244,11 @@ void idecontroller_hsync(void)
        for (int i = 0; ide_boards[i]; i++) {
                struct ide_board *board = ide_boards[i];
                if (board->configured) {
-                       ide_interrupt_hsync(board->ide);
+                       for (int j = 0; j < MAX_IDE_PORTS_BOARD; j++) {
+                               if (board->ide[j]) {
+                                       ide_interrupt_hsync(board->ide[j]);
+                               }
+                       }
                        if (ide_interrupt_check(board)) {
                                idecontroller_rethink();
                        }
@@ -274,9 +291,11 @@ static bool is_gvp1_intreq(uaecptr addr)
        return false;
 }
 
-static uae_u32 get_ide_reg(struct ide_board *board, int reg)
+static uae_u32 get_ide_reg_multi(struct ide_board *board, int reg, int portnum)
 {
-       struct ide_hdf *ide = board->ide;
+       struct ide_hdf *ide = board->ide[portnum];
+       if (!ide)
+               return 0;
        if (ide->ide_drv)
                ide = ide->pair;
        if (reg == 0)
@@ -284,9 +303,11 @@ static uae_u32 get_ide_reg(struct ide_board *board, int reg)
        else
                return ide_read_reg(ide, reg);
 }
-static void put_ide_reg(struct ide_board *board, int reg, uae_u32 v)
+static void put_ide_reg_multi(struct ide_board *board, int reg, uae_u32 v, int portnum)
 {
-       struct ide_hdf *ide = board->ide;
+       struct ide_hdf *ide = board->ide[portnum];
+       if (!ide)
+               return;
        if (ide->ide_drv)
                ide = ide->pair;
        if (reg == 0)
@@ -294,6 +315,14 @@ static void put_ide_reg(struct ide_board *board, int reg, uae_u32 v)
        else
                ide_write_reg(ide, reg, v);
 }
+static uae_u32 get_ide_reg(struct ide_board *board, int reg)
+{
+       return get_ide_reg_multi(board, reg, 0);
+}
+static void put_ide_reg(struct ide_board *board, int reg, uae_u32 v)
+{
+       put_ide_reg_multi(board, reg, v, 0);
+}
 
 static int get_gvp_reg(uaecptr addr, struct ide_board *board)
 {
@@ -328,7 +357,6 @@ static int get_apollo_reg(uaecptr addr, struct ide_board *board)
                reg |= IDE_SECONDARY;
        if (reg != 0 && !(addr & 1))
                reg = -1;
-       write_log(_T("APOLLO %04x = %d\n"), addr, reg);
        return reg;
 }
 
@@ -371,6 +399,19 @@ static int get_adide_reg(uaecptr addr, struct ide_board *board)
        return reg;
 }
 
+static int get_rochard_reg(uaecptr addr, struct ide_board *board, int *portnum)
+{
+       int reg = -1;
+       if ((addr & 0x8001) != 0x8001)
+               return -1;
+       *portnum = (addr & 0x4000) ? 1 : 0;
+       reg = (addr >> 5) & 7;
+       if (addr & 0x2000)
+               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++) {
@@ -426,7 +467,7 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr)
                                v = masoboshi_ncr9x_scsi_get(oaddr, getidenum(board, masoboshi_board));
                } else if (addr == 0xf040) {
                        v = 1;
-                       if (ide_irq_check(board->ide)) {
+                       if (ide_irq_check(board->ide[0])) {
                                v |= 2;
                                board->irq = true;
                        }
@@ -540,7 +581,20 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr)
 
                v = board->rom[addr & board->rom_mask];
 
+       } else if (board->type == ROCHARD_IDE) {
+
+               if (addr & 0x8000) {
+                       int portnum;
+                       int regnum = get_rochard_reg(addr, board, &portnum);
+                       if (regnum >= 0 && board->ide[portnum])
+                               v = get_ide_reg_multi(board, regnum, portnum);
+               } else {
+                       v = board->rom[addr & board->rom_mask];
+               }
+
+
        }
+
        return v;
 }
 
@@ -569,8 +623,18 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr)
                                v |= board->rom[(addr + 1 - APOLLO_ROM_OFFSET) & board->rom_mask];
                        }
                }
-       }
 
+       } else if (board->type == ROCHARD_IDE) {
+
+               if (addr < 8192) {
+                       if (board->rom) {
+                               v = board->rom[(addr + 0) & board->rom_mask];
+                               v <<= 8;
+                               v |= board->rom[(addr + 1) & board->rom_mask];
+                       }
+               }
+
+       }
 
        if (board->configured) {
 
@@ -667,7 +731,14 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr)
                                        v = ide_read_byte(board, addr) << 8;
                        }
 
+               } else if (board->type == ROCHARD_IDE) {
+
+                       if (board->configured && (addr & 0x8020) == 0x8000) {
+                               v = get_ide_reg_multi(board, IDE_DATA, (addr & 0x4000) ? 1 : 0);
+                       }
+
                }
+
        }
 
 #if DEBUG_IDE
@@ -782,6 +853,15 @@ static void ide_write_byte(struct ide_board *board, uaecptr addr, uae_u8 v)
                                put_ide_reg(board, (addr >> 8) & 7, v);
                        }
 
+               } else if (board->type == ROCHARD_IDE) {
+
+                       if (board->configured && (addr & 0x8000)) {
+                               int portnum;
+                               int regnum = get_rochard_reg(addr, board, &portnum);
+                               if (regnum >= 0 && board->ide[portnum])
+                                       put_ide_reg_multi(board, regnum, v, portnum);
+                       }
+
                }
 
        }
@@ -881,6 +961,12 @@ static void ide_write_word(struct ide_board *board, uaecptr addr, uae_u16 v)
                                        ide_write_byte(board, addr, v >> 8);
                        }
 
+               } else if (board->type == ROCHARD_IDE) {
+
+                       if (board->configured && (addr & 0x8020) == 0x8000) {
+                               put_ide_reg_multi(board, IDE_DATA, v, (addr & 0x4000) ? 1 : 0);
+                       }
+
                }
        }
 }
@@ -980,7 +1066,7 @@ addrbank *gvp_ide_rom_autoconfig_init(struct romconfig *rc)
        if (ISCPUBOARD(BOARD_GVP, BOARD_GVP_SUB_A3001SI)) {
                ide->bank = &gvp_ide_rom_bank;
                autoconfig = gvp_ide1_controller_autoconfig;
-               init_ide(ide, GVP_IDE, true, false);
+               init_ide(ide, GVP_IDE, 2, true, false);
                ide->rom_size = 8192;
                gvp_ide_controller_board->intena = true;
                ide->intena = true;
@@ -1015,7 +1101,7 @@ addrbank *gvp_ide_controller_autoconfig_init(struct romconfig *rc)
 {
        struct ide_board *ide = getide(rc);
 
-       init_ide(ide, GVP_IDE, true, false);
+       init_ide(ide, GVP_IDE, 2, true, false);
        ide->configured = 0;
        ide->bank = &gvp_ide_controller_bank;
        memset(ide->acmemory, 0xff, sizeof ide->acmemory);
@@ -1098,7 +1184,7 @@ addrbank *alf_init(struct romconfig *rc)
 
 void alf_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
-       add_ide_standard_unit(ch, ci, rc, alf_board, ALF_IDE, false, false);
+       add_ide_standard_unit(ch, ci, rc, alf_board, ALF_IDE, false, false, 2);
 }
 
 // prod 0x22 = IDE + SCSI
@@ -1168,7 +1254,7 @@ addrbank *apollo_init_cpu(struct romconfig *rc)
 
 void apollo_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
-       add_ide_standard_unit(ch, ci, rc, apollo_board, APOLLO_IDE, false, false);
+       add_ide_standard_unit(ch, ci, rc, apollo_board, APOLLO_IDE, false, false, 2);
 }
 
 addrbank *masoboshi_init(struct romconfig *rc)
@@ -1209,7 +1295,7 @@ addrbank *masoboshi_init(struct romconfig *rc)
 
 static void masoboshi_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
-       add_ide_standard_unit(ch, ci, rc, masoboshi_board, MASOBOSHI_IDE, true, false);
+       add_ide_standard_unit(ch, ci, rc, masoboshi_board, MASOBOSHI_IDE, true, false, 2);
 }
 
 void masoboshi_add_idescsi_unit (int ch, struct uaedev_config_info *ci, struct romconfig *rc)
@@ -1257,7 +1343,7 @@ addrbank *adide_init(struct romconfig *rc)
 
 void adide_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
-       add_ide_standard_unit(ch, ci, rc, adide_board, ADIDE_IDE, false, true);
+       add_ide_standard_unit(ch, ci, rc, adide_board, ADIDE_IDE, false, true, 2);
 }
 
 addrbank *mtec_init(struct romconfig *rc)
@@ -1284,5 +1370,32 @@ addrbank *mtec_init(struct romconfig *rc)
 
 void mtec_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
-       add_ide_standard_unit(ch, ci, rc, mtec_board, MTEC_IDE, false, false);
+       add_ide_standard_unit(ch, ci, rc, mtec_board, MTEC_IDE, false, false, 2);
+}
+
+addrbank *rochard_init(struct romconfig *rc)
+{
+       struct ide_board *ide = getide(rc);
+       int roms[2];
+
+       roms[0] = 138;
+       roms[1] = -1;
+       ide->configured = 0;
+       ide->bank = &ide_bank_generic;
+       ide->rom_size = 32768;
+       ide->mask = 65536 - 1;
+
+       memset(ide->acmemory, 0xff, sizeof ide->acmemory);
+
+       ide->rom = xcalloc(uae_u8, ide->rom_size);
+       memset(ide->rom, 0xff, ide->rom_size);
+       ide->rom_mask = ide->rom_size - 1;
+       load_rom_rc(rc, roms, 8192, !rc->autoboot_disabled ? 8192 : 0, ide->rom, 16384, 0);
+       memcpy(ide->acmemory, ide->rom, sizeof ide->acmemory);
+       return ide->bank;
+}
+
+void rochard_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       add_ide_standard_unit(ch, ci, rc, rochard_board, ROCHARD_IDE, false, false, 4);
 }
index d27c6d06ecedcc79e0badba3d7388c7297038a95..4a6b34a90cf4ae8e19805ad82b3cd682ac6a0f75 100644 (file)
@@ -23,6 +23,7 @@ struct ide_registers
 struct ide_thread_state;
 struct ide_hdf;
 
+#define MAX_IDE_PORTS_BOARD 2
 struct ide_board
 {
        uae_u8 *rom;
@@ -34,7 +35,7 @@ struct ide_board
        bool keepautoconfig;
        int mask;
        addrbank *bank;
-       struct ide_hdf *ide;
+       struct ide_hdf *ide[MAX_IDE_PORTS_BOARD];
        bool irq;
        bool intena;
        bool enabled;
index 5080adc8eeac8a8c063a87912c2d291e1ff0aa79..9528736c1818674cf4085b881125019a0625ca51 100644 (file)
@@ -25,6 +25,9 @@ addrbank *adide_init(struct romconfig *rc);
 void mtec_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 addrbank *mtec_init(struct romconfig *rc);
 
+addrbank *rochard_init(struct romconfig *rc);
+void rochard_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 68871a4857662cd9118c797fad262847ac668de7..d77b23885067ab7af2cbc66908877aaf52275023 100644 (file)
@@ -68,6 +68,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_ADD500         0x00100017
 #define ROMTYPE_KRONOS         0x00100018
 #define ROMTYPE_ADSCSI         0x00100019
+#define ROMTYPE_ROCHARD                0x0010001a
 
 #define ROMTYPE_QUAD           0x01000000
 #define ROMTYPE_EVEN           0x02000000
index 79971966b8139cb67b88b3a593e10f92bae7c46f..262cca0822e00cdd8849479f317761ae485ffcf3 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 138
+#define NEXT_ROM_ID 139
 
 static struct romheader romheaders[] = {
        { _T("Freezer Cartridges"), 1 },
@@ -405,6 +405,10 @@ static struct romdata roms[] = {
        0xe8201bad, 0xdefea015,0x596fce32,0x11e84397,0x23046a31,0x5a7726dc, NULL, NULL },
        { _T("Masoboshi MC-702"), 2, 201, 2, 201, _T("MASOBOSHI\0"), 32768, 120, 0, 0, ROMTYPE_MASOBOSHI, 0, 0, NULL,
        0xcd99b98a, 0x3897e46a,0x66d5833f,0x849b8e81,0x30acb3cb,0x319a2fa0, NULL, NULL },
+       { _T("Roctec RocHard RH800C"), 1, 0, 1, 0, _T("ROCHARD\0"), 16384, 138, 0, 0, ROMTYPE_ROCHARD, 0, 0, NULL,
+       0x0e980aec, 0xbcafa14d,0xe80576cb,0xe3e0c638,0x1ca90379,0xe078a8bd, NULL, NULL },
+       ALTROMPN(138, 1, 1, 8192, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xde3a855b, 0xda2fe069, 0xd78c9ccc, 0xc221711f, 0x1e598298, 0x2bdabffd)
+       ALTROMPN(138, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xb0ed3006, 0x0a88d84e, 0x2094f9e5, 0x18d37f90, 0x34764f22, 0x9696c3d9)
 
        { _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") },