]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
AccessX emulation.
authorToni Wilen <twilen@winuae.net>
Wed, 22 Aug 2018 18:35:45 +0000 (21:35 +0300)
committerToni Wilen <twilen@winuae.net>
Wed, 22 Aug 2018 18:35:45 +0000 (21:35 +0300)
expansion.cpp
idecontrollers.cpp
include/ide.h
include/idecontrollers.h
include/rommgr.h
rommgr.cpp

index cad10c360dbecc3fecf83f4d95458cd5209e1e7f..7fd7493b45739801555fe1b2b096829edf2e9180 100644 (file)
@@ -4814,6 +4814,12 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_SCSI
        },
+       {
+               _T("accessx500"), _T("AccessX 500"), _T("Breitfeld Computersysteme"),
+               NULL, accessx_init, NULL, accessx_add_ide_unit, ROMTYPE_ACCESSX, 0, 0, BOARD_AUTOCONFIG_Z2, false,
+               NULL, 0,
+               true, EXPANSIONTYPE_IDE
+       },
        {
                _T("oktagon2008"), _T("Oktagon 2008"), _T("BSC/Alfa Data"),
                NULL, ncr_oktagon_autoconfig_init, NULL, oktagon_add_scsi_unit, ROMTYPE_OKTAGON, 0, 0, BOARD_AUTOCONFIG_Z2, false,
index c7df0f6ed0c3137b29e60e57793d5c650fe2e398..9983d604116826140bda1d148bc33b3143353764 100644 (file)
@@ -51,7 +51,8 @@
 #define ATEAM_IDE (DATAFLYERPLUS_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
 #define FASTATA4K_IDE (ATEAM_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
 #define ELSATHD_IDE (FASTATA4K_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS)
-#define TOTAL_IDE (ELSATHD_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
+#define ACCESSX_IDE (ELSATHD_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS)
+#define TOTAL_IDE (ACCESSX_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
 
 #define ALF_ROM_OFFSET 0x0100
 #define GVP_IDE_ROM_OFFSET 0x8000
@@ -108,6 +109,7 @@ static struct ide_board *ateam_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ide_board *arriba_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ide_board *fastata4k_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ide_board *elsathd_board[MAX_DUPLICATE_EXPANSION_BOARDS];
+static struct ide_board *accessx_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 
 static struct ide_hdf *idecontroller_drive[TOTAL_IDE * 2];
 static struct ide_thread_state idecontroller_its;
@@ -260,7 +262,7 @@ void idecontroller_rethink(void)
                        }
                } else {
                        if (ide_rethink(ide_boards[i], false))
-                               safe_interrupt_set(IRQ_SOURCE_IDE, i, false);
+                               safe_interrupt_set(IRQ_SOURCE_IDE, i, ide_boards[i]->intlev6);
                }
        }
 }
@@ -557,6 +559,21 @@ static int get_fastata4k_reg(uaecptr addr, struct ide_board *board, int *portnum
        return addr;
 }
 
+static int get_accessx_reg(uaecptr addr, struct ide_board *board)
+{
+       if (!(addr & 0x8000))
+               return -1;
+       if ((addr & 1))
+               return -1;
+       if (addr & 0x400) {
+               int reg = (addr >> 6) & 7;
+               if (addr & 0x200)
+                       reg |= IDE_SECONDARY;
+               return reg;
+       }
+       return -1;
+}
+
 static int getidenum(struct ide_board *board, struct ide_board **arr)
 {
        for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) {
@@ -861,6 +878,17 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr)
                                v = board->rom[(offset + 0) & board->rom_mask];
                        }
                }
+
+       } else if (board->type == ACCESSX_IDE) {
+
+               int reg = get_accessx_reg(addr, board);
+               if (reg >= 0) {
+                       v = get_ide_reg(board, reg);
+               } else if (board->rom && !(addr & 0x8000)) {
+                       int offset = addr & 0x7fff;
+                       v = board->rom[offset];
+               }
+
        }
 
        return v;
@@ -1102,6 +1130,19 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr)
                                v |= board->rom[(offset + 1) & board->rom_mask];
                        }
 
+               } else if (board->type == ACCESSX_IDE) {
+
+                       int reg = get_accessx_reg(addr, board);
+                       if (reg == 0) {
+                               v = get_ide_reg_multi(board, IDE_DATA, 0, 1);
+                       } else if (reg > 0) {
+                               v = get_ide_reg(board, reg);
+                       } else if (board->rom && !(addr & 0x8000)) {
+                               int offset = addr & 0x7fff;
+                               v = board->rom[(offset + 0) & board->rom_mask];
+                               v <<= 8;
+                               v |= board->rom[(offset + 1) & board->rom_mask];
+                       }
                }
 
        }
@@ -1358,6 +1399,13 @@ 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 == ACCESSX_IDE) {
+
+                       int reg = get_accessx_reg(addr, board);
+                       if (reg >= 0) {
+                               put_ide_reg(board, reg, v);
+                       }
+
                }
 
        }
@@ -1526,6 +1574,15 @@ static void ide_write_word(struct ide_board *board, uaecptr addr, uae_u16 v)
                        if (reg == 0) {
                                put_ide_reg_multi(board, IDE_DATA, v, portnum, 1);
                        }
+
+               } else if (board->type == ACCESSX_IDE) {
+
+                       int reg = get_accessx_reg(addr, board);
+                       if (!reg) {
+                               put_ide_reg_multi(board, IDE_DATA, v, 0, 1);
+                       } else if (reg > 0) {
+                               put_ide_reg(board, reg, v & 0xff);
+                       }
                }
        }
 }
@@ -2348,6 +2405,75 @@ void elsathd_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfi
        add_ide_standard_unit(ch, ci, rc, elsathd_board, ELSATHD_IDE, true, false, 2);
 }
 
+bool accessx_init(struct autoconfig_info *aci)
+{
+       uae_u8 *rom;
+       int rom_size = 32768;
+
+       rom = xcalloc(uae_u8, rom_size);
+       memset(rom, 0xff, rom_size);
+       load_rom_rc(aci->rc, ROMTYPE_ACCESSX, 32768, aci->rc->autoboot_disabled ? 0x4000 : 0x0000, rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+
+       if ((rom[0] != 0xd0 && rom[2] != 0x10) && (rom[0] != 0xc0 && rom[2] != 0x10)) {
+               // descramble
+               uae_u8 rom2[32768];
+               memcpy(rom2, rom, 32768);
+               for (int i = 0; i < 16384; i++) {
+                       int addr = 0;
+                       addr |= ((i >>  5) & 1) <<  0;
+                       addr |= ((i >>  4) & 1) <<  1;
+                       addr |= ((i >>  3) & 1) <<  2;
+                       addr |= ((i >>  6) & 1) <<  3;
+                       addr |= ((i >>  1) & 1) <<  4;
+                       addr |= ((i >>  0) & 1) <<  5;
+                       addr |= ((i >>  9) & 1) <<  6;
+                       addr |= ((i >> 11) & 1) <<  7;
+                       addr |= ((i >> 10) & 1) <<  8;
+                       addr |= ((i >>  8) & 1) <<  9;
+                       addr |= ((i >>  2) & 1) << 10;
+                       addr |= ((i >>  7) & 1) << 11;
+                       addr |= ((i >> 13) & 1) << 12;
+                       addr |= ((i >> 12) & 1) << 13;
+                       addr |= ((i >> 14) & 1) << 14;
+                       uae_u8 b = rom2[addr * 2];
+                       uae_u8 v = 0;
+                       v |= ((b >> 0) & 1) << 1;
+                       v |= ((b >> 1) & 1) << 2;
+                       v |= ((b >> 2) & 1) << 3;
+                       v |= ((b >> 3) & 1) << 0;
+                       rom[i * 2] = v << 4;
+               }
+       }
+
+       if (!aci->doinit) {
+               memcpy(aci->autoconfig_raw, rom, sizeof aci->autoconfig_raw);
+               xfree(rom);
+               return true;
+       }
+
+       struct ide_board *ide = getide(aci);
+
+       ide->configured = 0;
+       ide->intena = true;
+       ide->intlev6 = true;
+       ide->keepautoconfig = false;
+       ide->bank = &ide_bank_generic;
+       ide->mask = 65536 - 1;
+
+       ide->rom = rom;
+       ide->rom_size = rom_size;
+       ide->rom_mask = rom_size - 1;
+       memcpy(ide->acmemory, ide->rom, sizeof ide->acmemory);
+
+       aci->addrbank = ide->bank;
+       return true;
+}
+
+void accessx_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       add_ide_standard_unit(ch, ci, rc, accessx_board, ACCESSX_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 34aa6ea7a64d209874e019cd3ae036b6598d56fa..3df6270c3c2748a18ab9451efded35f985da51f7 100644 (file)
@@ -46,6 +46,7 @@ struct ide_board
        bool irq;
        bool intena;
        bool enabled;
+       bool intlev6;
        int state;
        uae_u8 state2[8];
        int type;
index fe6a23d1f84a3a98499f0e40e581881899045a8e..d80726f7e1dac4e267498553d41c60f500eeef5b 100644 (file)
@@ -54,6 +54,9 @@ void arriba_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig
 bool elsathd_init(struct autoconfig_info *aci);
 void elsathd_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
+bool accessx_init(struct autoconfig_info *aci);
+void accessx_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 b93dddb5a23e079364b9141a914d9b19478f93e5..2fca5d304651182939cb3f99339c2efcd29fa7f4 100644 (file)
@@ -178,6 +178,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_CDTVSRAM       0x00100074
 #define ROMTYPE_SBISA          0x00100075
 #define ROMTYPE_X86MOUSE       0x00100076
+#define ROMTYPE_ACCESSX                0x00100077
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
index c856735501126dff1ea29cfd0aaf8f12b187083f..26d603bd3252cc4b0bc293d3e6352503d4fbe917 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 242
+#define NEXT_ROM_ID 244
 
 #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 },
@@ -596,6 +596,10 @@ static struct romdata roms[] = {
        0xc5ae45d4, 0x8d682bc1,0x72bd2d35,0x4ba2db5c,0x9f6745a4,0x8937782c, NULL, NULL },
        { _T("C-Ltd Kronos"), 1, 0, 1, 0, _T("KRONOS\0"), 8192, 235, 0, 0, ROMTYPE_KRONOS, 0, 0, NULL,
        0x9366d357, 0x7113add0,0x4c782ed7,0xa56a74ba,0x3378d55c,0x5605eaf6, NULL, NULL },
+       { _T("AccessX 500 v2.1"), 2, 1, 2, 1, _T("ACCESSX\0"), 32768, 242, 0, 0, ROMTYPE_ACCESSX, 0, 0, NULL,
+       0x039a14a7, 0x1a710b94, 0xcc1bd217, 0xb0c310af, 0x4b0f6d0a, 0x1125b05a, NULL, NULL },
+       { _T("AccessX 500 v2.1 (descrambled)"), 2, 1, 2, 1, _T("ACCESSX\0"), 32768, 243, 0, 0, ROMTYPE_ACCESSX, 0, 0, NULL,
+       0x415a5cae, 0x15c8c15f, 0x3700e867, 0xd1dbe2ee, 0xcbb7c7cd, 0x245555fa, 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") },