summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/meijinsn.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/meijinsn.c')
-rw-r--r--src/mame/drivers/meijinsn.c367
1 files changed, 367 insertions, 0 deletions
diff --git a/src/mame/drivers/meijinsn.c b/src/mame/drivers/meijinsn.c
new file mode 100644
index 00000000000..b18ab8799e1
--- /dev/null
+++ b/src/mame/drivers/meijinsn.c
@@ -0,0 +1,367 @@
+/*
+ Meijinsen (snk/alpha)
+ ---------------------
+
+ driver by Tomasz Slanina
+
+It's something between typical alpha 68k hardware
+(alpha mcu, sound hw (same as in jongbou)) and
+old alpha shougi hardware (framebuffer).
+
+There's probably no upright cabinet, only
+cocktail table (controls in 2p mode are inverted).
+
+Buttons:
+ 1st = 'decision'
+ 2nd = 'promotion'
+
+ Service switch = memory clear
+
+--------------------------------------------------
+
+
+
+ p8 p7
+ 16mhz p6 p5
+ 5816 p4 p3
+ 5816 p2 p1
+ ?
+ 68000-8
+
+ 4416 4416 4416 4416
+ clr 8910
+ z80 p9 p10 2016
+
+
+
+5816 = Sony CXK5816-10L (Ram for video)
+2016 = Toshiba TMM2016AP-10 (SRAM for sound)
+4416 = TI TMS4416-15NL (DRAM for MC68000)
+clr = TI TBP18S030N (32*8 Bipolar PROM)
+Z80 = Sharp LH0080A Z80A-CPU-D
+8910 = GI AY-3-8910A (Sound chip)
+? = Chip with Surface Scratched ....
+
+"0" "1" MC68000 Program ROMs:
+p1 p2
+p3 p4
+p5 p6
+p7 p8
+
+P9 = Z80 Program
+P10 = AY-3-8910A Sounds
+
+Text inside P9:
+
+ALPHA DENSHI CO.,LTD JUNE / 24 / 1986 FOR
+* SHOUGI * GAME USED SOUND BOARD CONTROL
+SOFT PSG & VOICE BY M.C & S.H
+
+*/
+#include "driver.h"
+#include "video/resnet.h"
+#include "sound/ay8910.h"
+
+static UINT16 *shared_ram;
+static unsigned deposits1=0, deposits2=0, credits=0;
+
+static WRITE16_HANDLER( sound_w )
+{
+ if(ACCESSING_LSB)
+ soundlatch_w(0, data&0xff);
+}
+
+static READ16_HANDLER( alpha_mcu_r )
+{
+ static unsigned coinvalue=0;
+ static UINT8 coinage1[2][2]={{1,1},{1,2}};
+ static UINT8 coinage2[2][2]={{1,5},{2,1}};
+
+ static int latch;
+ int source=shared_ram[offset];
+
+ switch (offset)
+ {
+ case 0: /* Dipswitch 2 */
+ shared_ram[0] = (source&0xff00)|readinputportbytag("IN2");
+ return 0;
+
+ case 0x22: /* Coin value */
+ shared_ram[0x22] = (source&0xff00)|(credits&0x00ff);
+ return 0;
+
+ case 0x29: /* Query microcontroller for coin insert */
+
+ credits=0;
+
+ if ((readinputportbytag("IN3")&0x3)==3) latch=0;
+
+ if ((readinputportbytag("IN3")&0x1)==0 && !latch)
+ {
+ shared_ram[0x29] = (source&0xff00)|(0x22); // coinA
+ shared_ram[0x22] = (source&0xff00)|0x0;
+ latch=1;
+
+ coinvalue = (~readinputportbytag("IN2")>>3) & 1;
+
+ deposits1++;
+ if (deposits1 == coinage1[coinvalue][0])
+ {
+ credits = coinage1[coinvalue][1];
+ deposits1 = 0;
+ }
+ else
+ credits = 0;
+ }
+ else if ((readinputportbytag("IN3")&0x2)==0 && !latch)
+ {
+ shared_ram[0x29] = (source&0xff00)|(0x22); // coinA
+ shared_ram[0x22] = (source&0xff00)|0x0;
+ latch=1;
+
+ coinvalue = (~readinputportbytag("IN2")>>3) & 1;
+
+ deposits2++;
+ if (deposits2 == coinage2[coinvalue][0])
+ {
+ credits = coinage2[coinvalue][1];
+ deposits2 = 0;
+ }
+ else
+ credits = 0;
+ }
+ else
+ {
+ shared_ram[0x29] = (source&0xff00)|0x22;
+ }
+ return 0;
+ }
+ return 0;
+}
+
+
+
+static ADDRESS_MAP_START( meijinsn_map, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_ROM
+ AM_RANGE(0x080e00, 0x080fff) AM_READ(alpha_mcu_r) AM_WRITENOP
+ AM_RANGE(0x100000, 0x107fff) AM_READ(MRA16_RAM) AM_WRITE(MWA16_RAM) AM_BASE(&videoram16)
+ AM_RANGE(0x180000, 0x180dff) AM_RAM
+ AM_RANGE(0x180e00, 0x180fff) AM_RAM AM_BASE(&shared_ram)
+ AM_RANGE(0x181000, 0x181fff) AM_RAM
+ AM_RANGE(0x1c0000, 0x1c0001) AM_READ(input_port_1_word_r)
+ AM_RANGE(0x1a0000, 0x1a0001) AM_WRITE(sound_w) AM_READ(input_port_0_word_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( meijinsn_sound_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0x8000, 0x87ff) AM_RAM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( meijinsn_sound_io_map, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x00, 0x00) AM_WRITE(AY8910_control_port_0_w)
+ AM_RANGE(0x01, 0x01) AM_READWRITE(AY8910_read_port_0_r, AY8910_write_port_0_w)
+ AM_RANGE(0x02, 0x02) AM_WRITE(soundlatch_clear_w)
+ AM_RANGE(0x06, 0x06) AM_WRITE(MWA8_NOP)
+ADDRESS_MAP_END
+
+static INPUT_PORTS_START( meijinsn )
+PORT_START_TAG("IN0")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x7cc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_SERVICE )
+
+ PORT_START_TAG("IN1")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0xc0ff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START_TAG("IN2")
+ PORT_DIPNAME( 0x07, 0x00, "Game time (actual game)" )
+ PORT_DIPSETTING( 0x07, "1:00" )
+ PORT_DIPSETTING( 0x06, "2:00" )
+ PORT_DIPSETTING( 0x05, "3:00" )
+ PORT_DIPSETTING( 0x04, "4:00" )
+ PORT_DIPSETTING( 0x03, "5:00" )
+ PORT_DIPSETTING( 0x02, "10:00" )
+ PORT_DIPSETTING( 0x01, "20:00" )
+ PORT_DIPSETTING( 0x00, "0:30" )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x08, "A 1C/1C B 1C/5C" )
+ PORT_DIPSETTING( 0x00, "A 1C/2C B 2C/1C" )
+ PORT_DIPNAME( 0x10, 0x00, "2 Player" )
+ PORT_DIPSETTING( 0x00, "1C" )
+ PORT_DIPSETTING( 0x10, "2C" )
+ PORT_DIPNAME( 0x20, 0x00, "Game time (tsumeshougi)" )
+ PORT_DIPSETTING( 0x20, "1:00" )
+ PORT_DIPSETTING( 0x00, "2:00" )
+
+ PORT_START_TAG("IN3") /* Coin input to microcontroller */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+INPUT_PORTS_END
+
+static VIDEO_START(meijinsn)
+{
+}
+
+static PALETTE_INIT( meijinsn )
+{
+ int i;
+ static const int resistances_b[2] = { 470, 220 };
+ static const int resistances_rg[3] = { 1000, 470, 220 };
+ double weights_r[3], weights_g[3], weights_b[2];
+
+
+ compute_resistor_weights(0, 255, -1.0,
+ 3, resistances_rg, weights_r, 0, 1000+1000,
+ 3, resistances_rg, weights_g, 0, 1000+1000,
+ 2, resistances_b, weights_b, 0, 1000+1000);
+
+ for (i = 0;i < machine->drv->total_colors;i++)
+ {
+ int bit0,bit1,bit2,r,g,b;
+
+ /* red component */
+ bit0 = (color_prom[i] >> 0) & 0x01;
+ bit1 = (color_prom[i] >> 1) & 0x01;
+ bit2 = (color_prom[i] >> 2) & 0x01;
+ r = combine_3_weights(weights_r, bit0, bit1, bit2);
+
+ /* green component */
+ bit0 = (color_prom[i] >> 3) & 0x01;
+ bit1 = (color_prom[i] >> 4) & 0x01;
+ bit2 = (color_prom[i] >> 5) & 0x01;
+ g = combine_3_weights(weights_g, bit0, bit1, bit2);
+
+ /* blue component */
+ bit0 = (color_prom[i] >> 6) & 0x01;
+ bit1 = (color_prom[i] >> 7) & 0x01;
+ b = combine_2_weights(weights_b, bit0, bit1);
+
+ palette_set_color(machine,i,MAKE_RGB(r,g,b));
+ }
+}
+
+
+static VIDEO_UPDATE(meijinsn)
+{
+ int offs;
+
+ for (offs = 0;offs <0x4000; offs++)
+ {
+ int sx, sy, x, data1, data2, color, data;
+
+ sx = offs >> 8;
+ sy = offs & 0xff;
+
+ data1 = videoram16[offs]>>8;
+ data2 = videoram16[offs]&0xff;
+
+ for (x=0; x<4; x++)
+ {
+ color= ((data1>>x) & 1) | (((data1>>(4+x)) & 1)<<1);
+ data = ((data2>>x) & 1) | (((data2>>(4+x)) & 1)<<1);
+ *BITMAP_ADDR16(bitmap, sy, (sx*4 + (3-x))) = color*4 + data;
+ }
+ }
+ return 0;
+}
+
+
+static INTERRUPT_GEN( meijinsn_interrupt )
+{
+ if (cpu_getiloops() == 0)
+ cpunum_set_input_line(0, 1, HOLD_LINE);
+ else
+ cpunum_set_input_line(0, 2, HOLD_LINE);
+}
+
+static struct AY8910interface ay8910_interface =
+{
+ soundlatch_r
+};
+
+static MACHINE_RESET( meijinsn )
+{
+ deposits1 = 0;
+ deposits2 = 0;
+ credits = 0;
+}
+
+
+static MACHINE_DRIVER_START( meijinsn )
+ MDRV_CPU_ADD_TAG("main", M68000, 9000000 )
+ MDRV_CPU_PROGRAM_MAP(meijinsn_map, 0)
+ MDRV_CPU_VBLANK_INT(meijinsn_interrupt,2)
+
+ MDRV_CPU_ADD(Z80, 4000000)
+ MDRV_CPU_PROGRAM_MAP(meijinsn_sound_map,0)
+ MDRV_CPU_IO_MAP(meijinsn_sound_io_map,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold, 160)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ MDRV_MACHINE_RESET(meijinsn)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(32*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(12, 243, 2*8, 30*8-1)
+ MDRV_PALETTE_LENGTH(32)
+ MDRV_PALETTE_INIT(meijinsn)
+
+ MDRV_VIDEO_START(meijinsn)
+ MDRV_VIDEO_UPDATE(meijinsn)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(AY8910, 2000000)
+ MDRV_SOUND_CONFIG(ay8910_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
+
+MACHINE_DRIVER_END
+
+
+ROM_START( meijinsn )
+ ROM_REGION( 0x40000, REGION_CPU1, 0 )
+ ROM_LOAD16_BYTE( "p1", 0x00000, 0x04000, CRC(8c9697a3) SHA1(19258e20a6aaadd6ba3469079fef85bc6dba548c) )
+ ROM_CONTINUE ( 0x20000, 0x4000 )
+ ROM_LOAD16_BYTE( "p2", 0x00001, 0x04000, CRC(f7da3535) SHA1(fdbacd075d45abda782966b16b3ea1ad68d60f91) )
+ ROM_CONTINUE ( 0x20001, 0x4000 )
+ ROM_LOAD16_BYTE( "p3", 0x08000, 0x04000, CRC(0af0b266) SHA1(d68ed31bc932bc5e9c554b2c0df06a751dc8eb96) )
+ ROM_CONTINUE ( 0x28000, 0x4000 )
+ ROM_LOAD16_BYTE( "p4", 0x08001, 0x04000, CRC(aab159c5) SHA1(0c9cad8f9893f4080b498433068e9324c7f2e13c) )
+ ROM_CONTINUE ( 0x28001, 0x4000 )
+ ROM_LOAD16_BYTE( "p5", 0x10000, 0x04000, CRC(0ed10a47) SHA1(9e89ec69f1f4e1ffa712f2e0c590d067c8c63026) )
+ ROM_CONTINUE ( 0x30000, 0x4000 )
+ ROM_LOAD16_BYTE( "p6", 0x10001, 0x04000, CRC(60b58755) SHA1(1786fc1b4c6d1793fb8e9311356fa4119611cfae) )
+ ROM_CONTINUE ( 0x30001, 0x4000 )
+ ROM_LOAD16_BYTE( "p7", 0x18000, 0x04000, CRC(604c76f1) SHA1(37fdf904f5e4d69dc8cb711cf3dece8f3075254a) )
+ ROM_CONTINUE ( 0x38000, 0x4000 )
+ ROM_LOAD16_BYTE( "p8", 0x18001, 0x04000, CRC(e3eaef19) SHA1(b290922f252a790443109e5023c3c35b133275cc) )
+ ROM_CONTINUE ( 0x38001, 0x4000 )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Sound CPU */
+ ROM_LOAD( "p9", 0x00000, 0x04000, CRC(aedfefdf) SHA1(f9d35737a0e942fe7d483f87c52efa92a1bbb3e5) )
+ ROM_LOAD( "p10",0x04000, 0x04000, CRC(93b4d764) SHA1(4fedd3fd1f3ef6c5f60ca86219f877df68d3027d) )
+
+ ROM_REGION( 0x20, REGION_PROMS, 0 ) /* Colour PROM */
+ ROM_LOAD( "clr", 0x00, 0x20, CRC(7b95b5a7) SHA1(c15be28bcd6f5ffdde659f2d352ae409f04b2557) )
+ROM_END
+
+GAME( 1986, meijinsn, 0, meijinsn, meijinsn, 0, ROT0, "SNK Electronics corp.", "Meijinsen", 0 )