summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/pengo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/pengo.cpp')
-rw-r--r--src/mame/drivers/pengo.cpp77
1 files changed, 76 insertions, 1 deletions
diff --git a/src/mame/drivers/pengo.cpp b/src/mame/drivers/pengo.cpp
index 62ddcb73538..2bfa09d35b1 100644
--- a/src/mame/drivers/pengo.cpp
+++ b/src/mame/drivers/pengo.cpp
@@ -927,7 +927,7 @@ void pengo_state::init_penta()
void pengo_state::decode_schick_extra(int size, uint8_t* rom)
{
// schick has an extra layer of encryption in addition to the penta encryption
- for (int A = 0x0000; A < 0x10000; A++)
+ for (int A = 0x0000; A < 0x8000; A++)
{
uint8_t srcdec = rom[A];
@@ -943,6 +943,81 @@ void pengo_state::decode_schick_extra(int size, uint8_t* rom)
rom[A] = srcdec;
}
+
+ for (int A = 0x8000; A < 0x10000; A++)
+ {
+ uint8_t srcdec = rom[A];
+
+ /* if we assume only bits we've seen changed by the 2nd layer are chagned by this then our bitswap possibilities are
+
+ 6, 4, 0
+ 6, 0, 4
+ 4, 6, 0
+ 4, 0, 6
+ 0, 4, 6
+ 0, 6, 4
+
+ and XOR possibilities are
+
+ 00
+ 01
+ 10
+ 11
+ 40
+ 41
+ 50
+ 51
+
+ */
+
+ // copy+paste these + modify
+ //rom[A] = bitswap<8>(srcdec ^ xx, 7, 0, 5, 6, 3, 2, 1, 4);
+ //rom[A] = bitswap<8>(srcdec ^ xx, 7, 0, 5, 4, 3, 2, 1, 6);
+ //rom[A] = bitswap<8>(srcdec ^ xx, 7, 4, 5, 0, 3, 2, 1, 6);
+ //rom[A] = bitswap<8>(srcdec ^ xx, 7, 4, 5, 6, 3, 2, 1, 0);
+ //rom[A] = bitswap<8>(srcdec ^ xx, 7, 6, 5, 0, 3, 2, 1, 4);
+ //rom[A] = bitswap<8>(srcdec ^ xx, 7, 6, 5, 4, 3, 2, 1, 0); // no swap
+
+ if (rom == m_decrypted_opcodes)
+ {
+ // these are wrong
+ if (A & 0x1000) // might be more conditions too, but there's certainly a boundary at efff-f000 (jump table)
+ {
+ //rom[A] = bitswap<8>(srcdec ^ 0x10, 7, 0, 5, 6, 3, 2, 1, 4); // NO
+ rom[A] = bitswap<8>(srcdec ^ 0x10, 7, 0, 5, 4, 3, 2, 1, 6); // potential, but no
+ //rom[A] = bitswap<8>(srcdec ^ 0x10, 7, 4, 5, 0, 3, 2, 1, 6); // NO
+ //rom[A] = bitswap<8>(srcdec ^ 0x10, 7, 4, 5, 6, 3, 2, 1, 0); // NO
+ //rom[A] = bitswap<8>(srcdec ^ 0x10, 7, 6, 5, 0, 3, 2, 1, 4); // NO
+ //rom[A] = bitswap<8>(srcdec ^ 0x10, 7, 6, 5, 4, 3, 2, 1, 0); // potential, but no (no swap)
+
+ //rom[A] = bitswap<8>(srcdec ^ 0x11, 7, 0, 5, 6, 3, 2, 1, 4); // NO(?)
+ //rom[A] = bitswap<8>(srcdec ^ 0x11, 7, 0, 5, 4, 3, 2, 1, 6); // NO
+ //rom[A] = bitswap<8>(srcdec ^ 0x11, 7, 4, 5, 0, 3, 2, 1, 6); // NO
+ //rom[A] = bitswap<8>(srcdec ^ 0x11, 7, 4, 5, 6, 3, 2, 1, 0); // NO
+ //rom[A] = bitswap<8>(srcdec ^ 0x11, 7, 6, 5, 0, 3, 2, 1, 4); // NO
+ //rom[A] = bitswap<8>(srcdec ^ 0x11, 7, 6, 5, 4, 3, 2, 1, 0);
+ }
+ else
+ {
+ //rom[A] = bitswap<8>(srcdec ^ 0x51, 7, 0, 5, 6, 3, 2, 1, 4); // NO
+ rom[A] = bitswap<8>(srcdec ^ 0x51, 7, 0, 5, 4, 3, 2, 1, 6); // promising, but no
+ //rom[A] = bitswap<8>(srcdec ^ 0x51, 7, 4, 5, 0, 3, 2, 1, 6); // NO
+ //rom[A] = bitswap<8>(srcdec ^ 0x51, 7, 4, 5, 6, 3, 2, 1, 0); // NO
+ //rom[A] = bitswap<8>(srcdec ^ 0x51, 7, 6, 5, 0, 3, 2, 1, 4); // NO
+ // rom[A] = bitswap<8>(srcdec ^ 0x51, 7, 6, 5, 4, 3, 2, 1, 0); promising, but no (no swap)
+ }
+ }
+ else
+ {
+ // these are correct(?) give good text, good jump locations etc.
+ if (A & 0x10)
+ srcdec = bitswap<8>(srcdec ^ 0x11, 7, 0, 5, 6, 3, 2, 1, 4);
+ else
+ srcdec = bitswap<8>(srcdec ^ 0x51, 7, 4, 5, 0, 3, 2, 1, 6);
+
+ rom[A] = srcdec;
+ }
+ }
}
void pengo_state::init_schick()