]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
AccessX 2000 ROM scrambling support.
authorToni Wilen <twilen@winuae.net>
Sun, 1 Dec 2019 16:09:43 +0000 (18:09 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 1 Dec 2019 16:09:43 +0000 (18:09 +0200)
expansion.cpp
idecontrollers.cpp
rommgr.cpp

index cec19ee123a2d1abd5f0f264831180dd3878df4a..66bec658eb39f9243a4490275033990092fd82ce 100644 (file)
@@ -4240,6 +4240,18 @@ static const struct expansionboardsettings trifecta_settings[] = {
        }
 };
 
+static const struct expansionsubromtype accessx_sub[] = {
+       {
+               _T("AccessX 500"), _T("accessx500"), ROMTYPE_ACCESSX,
+       },
+       {
+               _T("AccessX 2000"), _T("accessx2000"), ROMTYPE_ACCESSX,
+       },
+       {
+               NULL
+       }
+};
+
 static const struct expansionsubromtype supra_sub[] = {
        {
                _T("A500 ByteSync/XP"), _T("bytesync"), ROMTYPE_NONE | ROMTYPE_SUPRA,
@@ -5120,9 +5132,9 @@ const struct expansionromtype expansionroms[] = {
                false, EXPANSIONTYPE_SCSI
        },
        {
-               _T("accessx500"), _T("AccessX 500"), _T("Breitfeld Computersysteme"),
+               _T("accessx"), _T("AccessX"), _T("Breitfeld Computersysteme"),
                NULL, accessx_init, NULL, accessx_add_ide_unit, ROMTYPE_ACCESSX, 0, 0, BOARD_AUTOCONFIG_Z2, false,
-               NULL, 0,
+               accessx_sub, 0,
                true, EXPANSIONTYPE_IDE,
                0, 0, 0, true, NULL,
                false, 2
index 2b2039fa284c4fd1602279210058f54256aac3f4..216b00b1f542b333aa9623255669977067bfd694 100644 (file)
@@ -2644,39 +2644,81 @@ bool accessx_init(struct autoconfig_info *aci)
 
        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);
+       load_rom_rc(aci->rc, ROMTYPE_ACCESSX, 32768, 0, rom, 32768, LOADROM_FILL);
+       uae_u8 rom2[32768];
+       memcpy(rom2, rom, 32768);
 
-       if ((rom[0] != 0xd0 && rom[2] != 0x10) && (rom[0] != 0xc0 && rom[2] != 0x10)) {
+       if ((rom[0] != 0xd0 && rom[1] != 0x10) && (rom[0] != 0xc0 && rom[1] != 0x10)) {
                // descramble
-               uae_u8 rom2[32768];
-               memcpy(rom2, rom, 32768);
+               if (aci->rc->subtype == 1) {
+                       // 2000 variant
+                       for (int i = 0; i < 32768; i += 2) {
+                               int addr = 0;
+                               addr |= ((i >> 7) & 1) << 0;
+                               addr |= ((i >> 10) & 1) << 1;
+                               addr |= ((i >> 9) & 1) << 2;
+                               addr |= ((i >> 8) & 1) << 3;
+                               addr |= ((i >> 1) & 1) << 4;
+                               addr |= ((i >> 2) & 1) << 5;
+                               addr |= ((i >> 3) & 1) << 6;
+                               addr |= ((i >> 4) & 1) << 7;
+                               addr |= ((i >> 13) & 1) << 8;
+                               addr |= ((i >> 14) & 1) << 9;
+                               if (!aci->rc->autoboot_disabled)
+                                       addr |= 1 << 10;
+                               addr |= ((i >> 11) & 1) << 11;
+                               addr |= ((i >> 6) & 1) << 12;
+                               addr |= ((i >> 12) & 1) << 13;
+                               addr |= ((i >> 5) & 1) << 14;
+                               uae_u8 b = rom2[addr];
+                               uae_u8 v = 0;
+                               v |= ((b >> 4) & 1) << 1;
+                               v |= ((b >> 5) & 1) << 2;
+                               v |= ((b >> 6) & 1) << 0;
+                               v |= ((b >> 7) & 1) << 3;
+                               rom[i + 0] = v << 4;
+                               rom[i + 1] = 0xff;
+                       }
+
+               } else {
+                       // 500 variant
+                       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;
+                               if (aci->rc->autoboot_disabled)
+                                       addr |= 1 << 14;
+                               uae_u8 b = rom2[addr];
+                               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 + 0] = v << 4;
+                               rom[i * 2 + 1] = 0xff;
+                       }
+               }
+       } else {
+               int offset = aci->rc->autoboot_disabled ? 16384 : 0;
                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;
+                       rom[i * 2 + 0] = rom2[i + offset];
+                       rom[i * 2 + 1] = 0xff;
                }
        }
 
+
        ide_add_reset();
        if (!aci->doinit) {
                memcpy(aci->autoconfig_raw, rom, sizeof aci->autoconfig_raw);
index 9bbb9552af415784b2c3a8786bd53647df4268bf..966af453e1ee343da40532b8bd7b511befd4bd8b 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 255
+#define NEXT_ROM_ID 256
 
 #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 },
@@ -610,9 +610,11 @@ 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,
+       { _T("AccessX 500 v2.1"), 2, 1, 2, 1, _T("ACCESSX500\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,
+       { _T("AccessX 2000 v2.1"), 2, 1, 2, 1, _T("ACCESSX2000\0"), 32768, 255, 0, 0, ROMTYPE_ACCESSX, 0, 0, NULL,
+       0xd1b7ab32, 0x09da8da3, 0x12310256, 0x42f761da, 0xc2af7f49, 0x84db4c31, NULL, NULL },
+       { _T("AccessX 500/2000 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("Pacific Peripherals Overdrive v1.5"), 1, 5, 1, 5, _T("OVERDRIVE\0"), 8192, 246, 0, 0, ROMTYPE_OVERDRIVE, 0, 0, NULL,
        0x086e2716b, 0x075b50cb,0x166e00ac,0x4016ef7f,0x02532e86,0xe73b7711, NULL, NULL },