diff options
Diffstat (limited to 'src/mame/drivers/twins.c')
-rw-r--r-- | src/mame/drivers/twins.c | 314 |
1 files changed, 314 insertions, 0 deletions
diff --git a/src/mame/drivers/twins.c b/src/mame/drivers/twins.c new file mode 100644 index 00000000000..0f935a72283 --- /dev/null +++ b/src/mame/drivers/twins.c @@ -0,0 +1,314 @@ +/* + +Twins +Electronic Devices, 1994 + +PCB Layout +---------- + +This is a very tiny PCB, +only about 6 inches square. + +|-----------------------| +| 6116 16MHz 62256| +|TEST 6116 24C02 | +| PAL 62256| +|J 62256 |--------| | +|A |TPC1020 | 2 | +|M 62256 |AFN-084C| | +|M | | 1 | +|A |--------| | +| AY3-8910 | +| D70116| +|-----------------------| +Notes: + V30 clock : 8.000MHz (16/2) + AY3-8910 clock : 2.000MHz (16/8) + VSync : 50Hz + + + +seems a similar board to hotblocks + +same TPC1020 AFN-084C chip +same 24c02 eeprom +V30 instead of I8088 +AY3-8910 instead of YM2149 (compatible) + +video is not banked in this case instead palette data is sent to the ports +strange palette format. + +todo: +hook up eeprom +takes a long time to boot (eeprom?) + + +Electronic Devices was printed on rom labels +1994 date string is in ROM + +*/ + +#include "driver.h" +#include "sound/ay8910.h" + +static UINT16 *twins_videoram; +static UINT16 *twins_pal; +static UINT16 paloff = 0; + +/* port 4 is eeprom */ +static READ16_HANDLER( twins_port4_r ) +{ + return 0xffff; +} + +static WRITE16_HANDLER( twins_port4_w ) +{ +} + +static WRITE16_HANDLER( port6_pal0_w ) +{ + COMBINE_DATA(&twins_pal[paloff]); + paloff = (paloff + 1) & 0xff; +} + +/* ??? weird ..*/ +static WRITE16_HANDLER( porte_paloff0_w ) +{ + paloff = 0; +} + +static ADDRESS_MAP_START( twins_map, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x00000, 0x0ffff) AM_RAM + AM_RANGE(0x10000, 0x1ffff) AM_RAM AM_BASE(&twins_videoram) + AM_RANGE(0x20000, 0xfffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( twins_io, ADDRESS_SPACE_IO, 16 ) + AM_RANGE(0x0000, 0x0001) AM_WRITE(AY8910_control_port_0_lsb_w) + AM_RANGE(0x0002, 0x0003) AM_READ(AY8910_read_port_0_lsb_r) AM_WRITE(AY8910_write_port_0_lsb_w) + AM_RANGE(0x0004, 0x0005) AM_READWRITE(twins_port4_r, twins_port4_w) + AM_RANGE(0x0006, 0x0007) AM_WRITE(port6_pal0_w) + AM_RANGE(0x000e, 0x000f) AM_WRITE(porte_paloff0_w) +ADDRESS_MAP_END + +static VIDEO_START(twins) +{ + twins_pal = auto_malloc(0x100*2); +} + +static VIDEO_UPDATE(twins) +{ + int y,x,count; + int i; + static int xxx=320,yyy=204; + + fillbitmap(bitmap, get_black_pen(machine), 0); + + for (i=0;i<0x100;i++) + { + int dat,r,g,b; + dat = twins_pal[i]; + + r = dat & 0x1f; + r = BITSWAP8(r,7,6,5,0,1,2,3,4); + + g = (dat>>5) & 0x1f; + g = BITSWAP8(g,7,6,5,0,1,2,3,4); + + b = (dat>>10) & 0x1f; + b = BITSWAP8(b,7,6,5,0,1,2,3,4); + + palette_set_color_rgb(machine,i, pal5bit(r),pal5bit(g),pal5bit(b)); + } + + count=0; + for (y=0;y<yyy;y++) + { + for(x=0;x<xxx;x++) + { + *BITMAP_ADDR16(bitmap, y, x) = ((UINT8 *)twins_videoram)[BYTE_XOR_LE(count)]; + count++; + } + } + return 0; +} + + +static INPUT_PORTS_START(twins) + PORT_START /* 8bit */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + + PORT_START /* 8bit */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_8WAY + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) +INPUT_PORTS_END + + +static struct AY8910interface ay8910_interface = +{ + input_port_0_r, + input_port_1_r +}; + +static MACHINE_DRIVER_START( twins ) + /* basic machine hardware */ + MDRV_CPU_ADD(V30, 8000000) + MDRV_CPU_PROGRAM_MAP(twins_map, 0) + MDRV_CPU_IO_MAP(twins_io,0) + MDRV_CPU_VBLANK_INT(nmi_line_pulse,1) + + MDRV_SCREEN_REFRESH_RATE(50) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(320,256) + MDRV_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) + MDRV_PALETTE_LENGTH(0x100) + + MDRV_VIDEO_START(twins) + MDRV_VIDEO_UPDATE(twins) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(AY8910, 2000000) + MDRV_SOUND_CONFIG(ay8910_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) +MACHINE_DRIVER_END + +/* The second set has different palette hardware and a different port map */ + + +static VIDEO_START(twinsa) +{ + twins_pal = auto_malloc(0x1000*2); +} + +static VIDEO_UPDATE(twinsa) +{ + int y,x,count; + int i; + static int xxx=320,yyy=204; + + fillbitmap(bitmap, get_black_pen(machine), 0); + + for (i=0;i<0x1000-3;i+=3) + { + int r,g,b; + r = twins_pal[i]; + g = twins_pal[i+1]; + b = twins_pal[i+2]; + + palette_set_color_rgb(machine,i/3, pal6bit(r), pal6bit(g), pal6bit(b)); + } + + count=0; + for (y=0;y<yyy;y++) + { + for(x=0;x<xxx;x++) + { + *BITMAP_ADDR16(bitmap, y, x) = ((UINT8 *)twins_videoram)[BYTE_XOR_LE(count)]; + count++; + } + } + return 0; +} + +static WRITE16_HANDLER( twinsa_port4_w ) +{ + twins_pal[paloff&0xfff] = data; + paloff++; +// printf("paloff %04x\n",paloff); +} + +static READ16_HANDLER( twinsa_unk_r ) +{ + return 0xffff; +} + +static ADDRESS_MAP_START( twinsa_io, ADDRESS_SPACE_IO, 16 ) + AM_RANGE(0x0000, 0x0001) AM_READWRITE(twinsa_unk_r, porte_paloff0_w) + AM_RANGE(0x0002, 0x0003) AM_WRITE(porte_paloff0_w) + AM_RANGE(0x0004, 0x0005) AM_WRITE(twinsa_port4_w) // palette on this set + AM_RANGE(0x0008, 0x0009) AM_WRITE(AY8910_control_port_0_lsb_w) + AM_RANGE(0x0010, 0x0011) AM_READWRITE(AY8910_read_port_0_lsb_r, AY8910_write_port_0_lsb_w) + AM_RANGE(0x0018, 0x0019) AM_READ(twins_port4_r) AM_WRITE(twins_port4_w) +ADDRESS_MAP_END + + +static MACHINE_DRIVER_START( twinsa ) + /* basic machine hardware */ + MDRV_CPU_ADD(V30, 8000000) + MDRV_CPU_PROGRAM_MAP(twins_map, 0) + MDRV_CPU_IO_MAP(twinsa_io,0) + MDRV_CPU_VBLANK_INT(nmi_line_pulse,1) + + MDRV_SCREEN_REFRESH_RATE(50) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(320,256) + MDRV_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) + MDRV_PALETTE_LENGTH(0x1000) + + MDRV_VIDEO_START(twinsa) + MDRV_VIDEO_UPDATE(twinsa) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(AY8910, 2000000) + MDRV_SOUND_CONFIG(ay8910_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) +MACHINE_DRIVER_END + + +ROM_START( twins ) + ROM_REGION( 0x100000, REGION_CPU1, 0 ) + ROM_LOAD16_BYTE( "1.bin", 0x000000, 0x080000, CRC(d5ef7b0d) SHA1(7261dca5bb0aef755b4f2b85a159b356e7ac8219) ) + ROM_LOAD16_BYTE( "2.bin", 0x000001, 0x080000, CRC(8a5392f4) SHA1(e6a2ecdb775138a87d27aa4ad267bdec33c26baa) ) +ROM_END + +/* +Shang Hay Twins +Electronic Devices + +1x nec9328n8-v30-d70116c-8 (main) +2x ay-3-8910a (sound) +1x blank (z80?) +1x oscillator 8.000 + +2x M27c4001 + +1x jamma edge connector +1x trimmer (volume) + +hmm, we're only emulating 1x ay-3-8910, is the other at port 0 on this? + +*/ + +ROM_START( twinsa ) + ROM_REGION( 0x100000, REGION_CPU1, 0 ) + ROM_LOAD16_BYTE( "lp.bin", 0x000000, 0x080000, CRC(4f07862e) SHA1(fbda1973f79c6938c7f026a4db706e78781c2df8) ) + ROM_LOAD16_BYTE( "hp.bin", 0x000001, 0x080000, CRC(aaf74b83) SHA1(09bd76b9fc5cb7ba6ffe1a2581ffd5633fe440b3) ) +ROM_END + +GAME( 1994, twins, 0, twins, twins, 0, ROT0, "Electronic Devices", "Twins (set 1)", 0 ) +GAME( 1994, twinsa, twins, twinsa, twins, 0, ROT0, "Electronic Devices", "Twins (set 2)", 0 ) |