summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/drakton.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/drakton.c')
-rw-r--r--src/mame/machine/drakton.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/mame/machine/drakton.c b/src/mame/machine/drakton.c
new file mode 100644
index 00000000000..70a6556ac46
--- /dev/null
+++ b/src/mame/machine/drakton.c
@@ -0,0 +1,113 @@
+/***************************************************************************************
+ Drakton (c) 1984 Epos
+ decryption by Pierpaolo Prazzoli
+ based on decryptions of the other Epos games
+
+ For general documentation on how the encryption works, see machine/theglobp.c
+****************************************************************************************/
+
+#include "driver.h"
+#include "includes/dkong.h"
+
+static void drakton_decrypt_rom_8(void)
+{
+ UINT8 oldbyte,newbyte;
+ UINT8 *ROM;
+ int mem;
+
+ ROM = memory_region(REGION_CPU1);
+
+ for (mem=0;mem<0x4000;mem++)
+ {
+ oldbyte = ROM[mem];
+
+ /* Note: D2 is inverted and connected to D1, D5 is inverted and
+ connected to D0. The other six data bits are converted by a
+ PAL10H8 driven by the counter. */
+
+ newbyte = (oldbyte & 0x02) | (~oldbyte & ~0x02);
+ newbyte = BITSWAP8(newbyte,7,6,1,3,0,4,2,5);
+
+ ROM[mem + 0x10000] = newbyte;
+ }
+}
+
+static void drakton_decrypt_rom_9(void)
+{
+ UINT8 oldbyte,newbyte;
+ UINT8 *ROM;
+ int mem;
+
+ ROM = memory_region(REGION_CPU1);
+
+ for (mem=0;mem<0x4000;mem++)
+ {
+ oldbyte = ROM[mem];
+
+ /* Note: D2 is inverted and connected to D1, D5 is inverted and
+ connected to D0. The other six data bits are converted by a
+ PAL10H8 driven by the counter. */
+
+ newbyte = (oldbyte & 0x40) | (~oldbyte & ~0x40);
+ newbyte = BITSWAP8(newbyte,7,1,4,3,0,6,2,5);
+
+ ROM[mem + 0x14000] = newbyte;
+ }
+}
+
+static void drakton_decrypt_rom_A(void)
+{
+ UINT8 oldbyte,newbyte;
+ UINT8 *ROM;
+ int mem;
+
+ ROM = memory_region(REGION_CPU1);
+
+ for (mem=0;mem<0x4000;mem++)
+ {
+ oldbyte = ROM[mem];
+
+ /* Note: D2 is inverted and connected to D1, D5 is inverted and
+ connected to D0. The other six data bits are converted by a
+ PAL10H8 driven by the counter. */
+
+ newbyte = (oldbyte & 0x8a) | (~oldbyte & ~0x8a);
+ newbyte = BITSWAP8(newbyte,7,6,1,0,3,4,2,5);
+
+ ROM[mem + 0x18000] = newbyte;
+ }
+}
+
+static void drakton_decrypt_rom_B(void)
+{
+ UINT8 oldbyte,newbyte;
+ UINT8 *ROM;
+ int mem;
+
+ ROM = memory_region(REGION_CPU1);
+
+ for (mem=0;mem<0x4000;mem++)
+ {
+ oldbyte = ROM[mem];
+
+ /* Note: D2 is inverted and connected to D1, D5 is inverted and
+ connected to D0. The other six data bits are converted by a
+ PAL10H8 driven by the counter. */
+
+ newbyte = (oldbyte & 0xc8) | (~oldbyte & ~0xc8);
+ newbyte = BITSWAP8(newbyte,7,1,4,0,3,6,2,5);
+
+ ROM[mem + 0x1C000] = newbyte;
+ }
+}
+
+DRIVER_INIT( drakton )
+{
+ /* While the PAL supports up to 16 decryption methods, only four
+ are actually used in the PAL. Therefore, we'll take a little
+ memory overhead and decrypt the ROMs using each method in advance. */
+ drakton_decrypt_rom_8();
+ drakton_decrypt_rom_9();
+ drakton_decrypt_rom_A();
+ drakton_decrypt_rom_B();
+}