summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/bagman.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/bagman.c')
-rw-r--r--src/mame/machine/bagman.c242
1 files changed, 242 insertions, 0 deletions
diff --git a/src/mame/machine/bagman.c b/src/mame/machine/bagman.c
new file mode 100644
index 00000000000..6c9bedf4b0b
--- /dev/null
+++ b/src/mame/machine/bagman.c
@@ -0,0 +1,242 @@
+/***************************************************************************
+
+ machine.c
+
+ Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
+ I/O ports)
+
+***************************************************************************/
+
+#include "driver.h"
+
+
+/*Creation date: 98-02-18 */
+/* A few words of comment:
+**
+** What's inside of this file is a PAL16R6 emulator. Maybe someday we will
+**need to use it for some other game too. We will need to make it more exact
+**then (some of the functionality of this chip IS NOT implemented). However I
+**have bought a book about PALs and I'm able to improve it. Just LMK.
+** Jarek Burczynski
+** bujar at mame dot net
+*/
+
+
+/*table holds outputs of all ANDs (after AND map)*/
+static UINT8 andmap[64];
+
+/*table holds inputs (ie. not x, x, not q, q) to the AND map*/
+static UINT8 columnvalue[32];
+
+/*8 output pins (actually 6 output and 2 input/output)*/
+static UINT8 outvalue[8];
+
+/* 64 rows x 32 columns
+** 1 - fuse blown: disconnected from input (equal to 1)
+** 0 - fuse not blown: connected to input (ie. x, not x, q, not q accordingly)
+*/
+static UINT8 fusemap[64*32]=
+{
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,
+1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,
+1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,
+1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,
+1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,
+1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,
+1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,
+1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,
+1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,
+1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+
+static void update_pal(void)
+{
+UINT16 rowoffs;
+UINT8 row, column, val;
+
+/*calculate all rows ANDs*/
+ for (row = 0; row < 64; row++)
+ {
+ rowoffs = row*32;
+ val = 1; /*prepare for AND */
+ for (column = 0; column < 32; column++)
+ {
+ if ( fusemap[ rowoffs + column ] == 0 )
+ val &= columnvalue[column];
+ }
+ andmap[row] = val;
+ }
+
+/* I/O pin #19 */
+ val = 0; /*prepare for OR*/
+ for (row = 1; row < 8; row++)
+ val |= andmap[row];
+ if (andmap[0] == 1)
+ {
+ columnvalue[2] = 1-val;
+ columnvalue[3] = val;
+ outvalue[0] = 1-val;
+ }
+ else
+ {
+ /*pin is in INPUT configuration so it doesn't create output...*/
+ columnvalue[2] = 0;
+ columnvalue[3] = 1;
+ }
+
+/* O pin #18 (D1) */
+ val = 0; /*prepare for OR*/
+ for (row = 8; row < 16; row++)
+ val |= andmap[row];
+ columnvalue[6] = 1-val;
+ columnvalue[7] = val;
+ outvalue[1] = 1-val;
+
+/* O pin #17 (D2) */
+ val = 0; /*prepare for OR*/
+ for (row = 16; row < 24; row++)
+ val |= andmap[row];
+ columnvalue[10] = 1-val;
+ columnvalue[11] = val;
+ outvalue[2] = 1-val;
+
+/* O pin #16 (D3) */
+ val = 0; /*prepare for OR*/
+ for (row = 24; row < 32; row++)
+ val |= andmap[row];
+ columnvalue[14] = 1-val;
+ columnvalue[15] = val;
+ outvalue[3] = 1-val;
+
+/* O pin #15 (D4) */
+ val = 0; /*prepare for OR*/
+ for (row = 32; row < 40; row++)
+ val |= andmap[row];
+ columnvalue[18] = 1-val;
+ columnvalue[19] = val;
+ outvalue[4] = 1-val;
+
+/* O pin #14 (D5) */
+ val = 0; /*prepare for OR*/
+ for (row = 40; row < 48; row++)
+ val |= andmap[row];
+ columnvalue[22] = 1-val;
+ columnvalue[23] = val;
+ outvalue[5] = 1-val;
+
+/* O pin #13 (D6) */
+ val = 0; /*prepare for OR*/
+ for (row = 48; row < 56; row++)
+ val |= andmap[row];
+ columnvalue[26] = 1-val;
+ columnvalue[27] = val;
+ outvalue[6] = 1-val;
+
+/* I/O pin #12 */
+ val = 0; /*prepare for OR*/
+ for (row = 57; row < 64; row++)
+ val |= andmap[row];
+ if (andmap[56] == 1)
+ {
+ columnvalue[30] = 1-val;
+ columnvalue[31] = val;
+ outvalue[7] = 1-val;
+ }
+ else
+ {
+ /*pin is in INPUT configuration so it doesn't create output...*/
+ columnvalue[30] = 0;
+ columnvalue[31] = 1;
+ }
+
+}
+
+
+WRITE8_HANDLER( bagman_pal16r6_w )
+{
+UINT8 line;
+
+ line = offset*4;
+ columnvalue[line ] = data&1;
+ columnvalue[line+1] = 1-(data&1);
+}
+
+MACHINE_RESET( bagman )
+{
+ bagman_pal16r6_w(0,1); /*pin 2*/
+ bagman_pal16r6_w(1,1); /*pin 3*/
+ bagman_pal16r6_w(2,1); /*pin 4*/
+ bagman_pal16r6_w(3,1); /*pin 5*/
+ bagman_pal16r6_w(4,1); /*pin 6*/
+ bagman_pal16r6_w(5,1); /*pin 7*/
+ bagman_pal16r6_w(6,1); /*pin 8*/
+ bagman_pal16r6_w(7,1); /*pin 9*/
+ update_pal();
+}
+
+READ8_HANDLER( bagman_pal16r6_r )
+{
+ update_pal();
+ return (outvalue[6]) + (outvalue[5]<<1) + (outvalue[4]<<2) +
+ (outvalue[3]<<3) + (outvalue[2]<<4) + (outvalue[1]<<5);
+
+/* Bagman schematics show that this is right mapping order of PAL outputs to bits.
+** This is the PAL 16R6 shown almost in the middle of the schematics.
+** The /RD4 line goes low (active) whenever CPU reads from memory address a000.
+*/
+}