From 0496025aad44b51ef5e3459893526dacfa1646dd Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 1 Dec 2019 18:09:43 +0200 Subject: [PATCH] AccessX 2000 ROM scrambling support. --- expansion.cpp | 16 +++++++- idecontrollers.cpp | 96 +++++++++++++++++++++++++++++++++------------- rommgr.cpp | 8 ++-- 3 files changed, 88 insertions(+), 32 deletions(-) diff --git a/expansion.cpp b/expansion.cpp index cec19ee1..66bec658 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -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 diff --git a/idecontrollers.cpp b/idecontrollers.cpp index 2b2039fa..216b00b1 100644 --- a/idecontrollers.cpp +++ b/idecontrollers.cpp @@ -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); diff --git a/rommgr.cpp b/rommgr.cpp index 9bbb9552..966af453 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -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 }, -- 2.47.3