AccessX 2000 ROM scrambling support.

This commit is contained in:
Toni Wilen 2019-12-01 18:09:43 +02:00
parent b3a25c0064
commit 0496025aad
3 changed files with 88 additions and 32 deletions

View 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

View 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);

View 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 },