}
};
+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,
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
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);
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 },
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 },