summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/mspacman.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/mspacman.c')
-rw-r--r--src/mame/machine/mspacman.c195
1 files changed, 195 insertions, 0 deletions
diff --git a/src/mame/machine/mspacman.c b/src/mame/machine/mspacman.c
new file mode 100644
index 00000000000..c387f86a956
--- /dev/null
+++ b/src/mame/machine/mspacman.c
@@ -0,0 +1,195 @@
+#include "driver.h"
+#include "includes/pacman.h"
+
+
+/*
+ It turns out the bootleg is the decrypted version with the checksum check
+ removed and interrupt mode changed to 1.
+
+ u7= boot 4($3000-$3fff) other than 4 bytes(checksum check and interupt mode)
+ u6= boot 6($9000-$9fff). The second half of u6 gets mirrored to the second
+ half of boot5($8800-$8fff) where it is used.
+ u5= first half of boot5($8000-$87ff)
+
+ $8000-$81ef contain 8 byte patches that are overlayed on locations in $0000-$2fff
+
+ The Ms Pacman daughter board is not activated with the mainboard. As near as I
+ can tell it requires a sequence of bytes starting at around 3176 and ending with
+ 3196. The location of the bytes doesn't seem to matter, just that those bytes
+ are executed. That sequence of bytes includes a write to 5006 so I'm using that
+ to bankswitch, but that is not accurate. The actual change is I believe at $317D.
+ The daughterboard can also be deactivated. A read to any of the several 8 byte
+ chunks listed will cause the Ms Pac roms to disappear and Pacman to show up.
+ As a result I couldn't verify what they contained. They should be the same as the
+ pacman roms, but I don't see how it could matter. These areas can be accessed by
+ the random number generator at $2a23 and the board is deactivated but is
+ immediately reactivated. So the net result is no change. The exact trigger for
+ this is not yet known.
+
+ deactivation, 8 bytes starting at:
+ $38,$3b0,$1600,$2120,$3ff0,$8000
+
+ David Widel
+ d_widel@hotmail.com
+*/
+
+
+
+
+static UINT8 decryptd(UINT8 e)
+{
+ UINT8 d;
+
+ d = (e & 0x80) >> 3;
+ d |= (e & 0x40) >> 3;
+ d |= (e & 0x20) ;
+ d |= (e & 0x10) << 2;
+ d |= (e & 0x08) >> 1;
+ d |= (e & 0x04) >> 1;
+ d |= (e & 0x02) >> 1;
+ d |= (e & 0x01) << 7;
+
+ return d;
+}
+
+static UINT32 decrypta1(UINT32 e)
+{
+ UINT32 d;
+
+ d = (e & 0x800) ;
+ d |= (e & 0x400) >> 7;
+ d |= (e & 0x200) >> 2;
+ d |= (e & 0x100) << 1;
+ d |= (e & 0x80) << 3;
+ d |= (e & 0x40) << 2;
+ d |= (e & 0x20) << 1;
+ d |= (e & 0x10) << 1;
+ d |= (e & 0x08) << 1;
+ d |= (e & 0x04) ;
+ d |= (e & 0x02) ;
+ d |= (e & 0x01) ;
+
+ return d;
+}
+
+static UINT32 decrypta2(UINT32 e)
+{
+ UINT32 d;
+ d = (e & 0x800) ;
+ d |= (e & 0x400) >> 2;
+ d |= (e & 0x200) >> 2;
+ d |= (e & 0x100) >> 3;
+ d |= (e & 0x80) << 2;
+ d |= (e & 0x40) << 4;
+ d |= (e & 0x20) << 1;
+ d |= (e & 0x10) >> 1;
+ d |= (e & 0x08) << 1;
+ d |= (e & 0x04) ;
+ d |= (e & 0x02) ;
+ d |= (e & 0x01) ;
+
+ return d;
+}
+
+
+
+
+static void mspacman_decode(void)
+{
+ int i;
+ UINT8 *RAM;
+
+
+
+ /* CPU ROMs */
+
+ RAM = memory_region(REGION_CPU1);
+ for (i = 0; i < 0x1000; i++)
+ {
+ RAM[0x10000+i] = RAM[0x0000+i];
+ RAM[0x11000+i] = RAM[0x1000+i];
+ RAM[0x12000+i] = RAM[0x2000+i];
+ RAM[0x1a000+i] = RAM[0x2000+i]; /*not needed but it's there*/
+ RAM[0x1b000+i] = RAM[0x3000+i]; /*not needed but it's there*/
+
+ }
+
+
+ for (i = 0; i < 0x1000; i++)
+ {
+ RAM[decrypta1(i)+0x13000] = decryptd(RAM[0xb000+i]); /*u7*/
+ RAM[decrypta1(i)+0x19000] = decryptd(RAM[0x9000+i]); /*u6*/
+ }
+
+ for (i = 0; i < 0x800; i++)
+ {
+ RAM[decrypta2(i)+0x18000] = decryptd(RAM[0x8000+i]); /*u5*/
+ RAM[0x18800+i] = RAM[0x19800+i];
+ }
+
+
+
+ for (i = 0; i < 8; i++)
+ {
+ RAM[0x10410+i] = RAM[0x18008+i];
+ RAM[0x108E0+i] = RAM[0x181D8+i];
+ RAM[0x10A30+i] = RAM[0x18118+i];
+ RAM[0x10BD0+i] = RAM[0x180D8+i];
+ RAM[0x10C20+i] = RAM[0x18120+i];
+ RAM[0x10E58+i] = RAM[0x18168+i];
+ RAM[0x10EA8+i] = RAM[0x18198+i];
+
+ RAM[0x11000+i] = RAM[0x18020+i];
+ RAM[0x11008+i] = RAM[0x18010+i];
+ RAM[0x11288+i] = RAM[0x18098+i];
+ RAM[0x11348+i] = RAM[0x18048+i];
+ RAM[0x11688+i] = RAM[0x18088+i];
+ RAM[0x116B0+i] = RAM[0x18188+i];
+ RAM[0x116D8+i] = RAM[0x180C8+i];
+ RAM[0x116F8+i] = RAM[0x181C8+i];
+ RAM[0x119A8+i] = RAM[0x180A8+i];
+ RAM[0x119B8+i] = RAM[0x181A8+i];
+
+ RAM[0x12060+i] = RAM[0x18148+i];
+ RAM[0x12108+i] = RAM[0x18018+i];
+ RAM[0x121A0+i] = RAM[0x181A0+i];
+ RAM[0x12298+i] = RAM[0x180A0+i];
+ RAM[0x123E0+i] = RAM[0x180E8+i];
+ RAM[0x12418+i] = RAM[0x18000+i];
+ RAM[0x12448+i] = RAM[0x18058+i];
+ RAM[0x12470+i] = RAM[0x18140+i];
+ RAM[0x12488+i] = RAM[0x18080+i];
+ RAM[0x124B0+i] = RAM[0x18180+i];
+ RAM[0x124D8+i] = RAM[0x180C0+i];
+ RAM[0x124F8+i] = RAM[0x181C0+i];
+ RAM[0x12748+i] = RAM[0x18050+i];
+ RAM[0x12780+i] = RAM[0x18090+i];
+ RAM[0x127B8+i] = RAM[0x18190+i];
+ RAM[0x12800+i] = RAM[0x18028+i];
+ RAM[0x12B20+i] = RAM[0x18100+i];
+ RAM[0x12B30+i] = RAM[0x18110+i];
+ RAM[0x12BF0+i] = RAM[0x181D0+i];
+ RAM[0x12CC0+i] = RAM[0x180D0+i];
+ RAM[0x12CD8+i] = RAM[0x180E0+i];
+ RAM[0x12CF0+i] = RAM[0x181E0+i];
+ RAM[0x12D60+i] = RAM[0x18160+i];
+ }
+}
+
+
+MACHINE_RESET( mspacman )
+{
+ UINT8 *RAM = memory_region(REGION_CPU1);
+ mspacman_decode();
+
+ memory_configure_bank(1, 0, 2, &RAM[0x00000], 0x10000);
+ memory_set_bank(1, 0);
+}
+
+
+WRITE8_HANDLER( mspacman_activate_rom )
+{
+ if (data==1) memory_set_bank(1, 1);
+}
+
+