summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/laserbas.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/laserbas.c')
-rw-r--r--trunk/src/mame/drivers/laserbas.c283
1 files changed, 283 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/laserbas.c b/trunk/src/mame/drivers/laserbas.c
new file mode 100644
index 00000000000..2a2ac283a1e
--- /dev/null
+++ b/trunk/src/mame/drivers/laserbas.c
@@ -0,0 +1,283 @@
+/********************************************
+ Laser Base / Future Flash driver
+
+ IC marked as Z1 is probably protection device
+ mapped in memory region f800-fbff
+ (simil. to the one used in Parallel Turn)
+
+ Reads form this device depends on previous
+ writes (adr, data), address and previous
+ operation (read or write).
+ Pinout is almost identical to 2716 - type EPROM,
+ except separated /RD and /WR signals and lacks
+ of /CS
+
+ Tomasz Slanina analog [at] op.pl
+
+********************************************/
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "deprecat.h"
+
+class laserbas_state : public driver_device
+{
+public:
+ laserbas_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag) { }
+
+ /* misc */
+ int m_count;
+
+ /* video-related */
+ int m_vrambank;
+ UINT8 m_vram1[0x8000];
+ UINT8 m_vram2[0x8000];
+};
+
+
+static VIDEO_START(laserbas)
+{
+ laserbas_state *state = machine.driver_data<laserbas_state>();
+
+ state->save_item(NAME(state->m_vram1));
+ state->save_item(NAME(state->m_vram2));
+}
+
+static SCREEN_UPDATE(laserbas)
+{
+ laserbas_state *state = screen->machine().driver_data<laserbas_state>();
+ int x, y;
+
+ for (y = 0; y < 256; y++)
+ for(x = 0; x < 128; x++)
+ {
+ if (state->m_vram2[y * 128 + x] & 0xf)
+ *BITMAP_ADDR16(bitmap, y, x * 2) = (state->m_vram2[y * 128 + x] & 0xf) + 16;
+ else
+ *BITMAP_ADDR16(bitmap, y, x * 2) = (state->m_vram1[y * 128 + x] & 0xf) + 16;
+
+ if (state->m_vram2[y * 128 + x] >> 4)
+ *BITMAP_ADDR16(bitmap, y, x * 2 + 1) = (state->m_vram2[y * 128 + x] >> 4) + 16;
+ else
+ *BITMAP_ADDR16(bitmap, y, x * 2 + 1) = (state->m_vram1[y * 128 + x] >> 4) + 16;
+ }
+ return 0;
+}
+
+static READ8_HANDLER(vram_r)
+{
+ laserbas_state *state = space->machine().driver_data<laserbas_state>();
+
+ if(!state->m_vrambank)
+ return state->m_vram1[offset];
+ else
+ return state->m_vram2[offset];
+}
+
+static WRITE8_HANDLER(vram_w)
+{
+ laserbas_state *state = space->machine().driver_data<laserbas_state>();
+
+ if(!state->m_vrambank)
+ state->m_vram1[offset] = data;
+ else
+ state->m_vram2[offset] = data;
+}
+
+static READ8_HANDLER( read_unk )
+{
+ laserbas_state *state = space->machine().driver_data<laserbas_state>();
+
+ state->m_count ^= 0x80;
+ return state->m_count | 0x7f;
+}
+
+static WRITE8_HANDLER(palette_w)
+{
+ palette_set_color_rgb(space->machine(), offset, pal3bit(data >> 5), pal3bit(data >> 2), pal2bit(data));
+}
+
+static WRITE8_HANDLER(vrambank_w)
+{
+ laserbas_state *state = space->machine().driver_data<laserbas_state>();
+
+ if ((offset & 0xf1) == 0x10)
+ state->m_vrambank = data & 0x40;
+}
+
+static ADDRESS_MAP_START( laserbas_memory, AS_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x3fff) AM_ROM
+ AM_RANGE(0x4000, 0xbfff) AM_READWRITE(vram_r, vram_w)
+ AM_RANGE(0xc000, 0xf7ff) AM_ROM
+ AM_RANGE(0xf800, 0xfbff) AM_RAM /* protection device */
+ AM_RANGE(0xfc00, 0xffff) AM_RAM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( laserbas_io, AS_IO, 8 )
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0x00, 0x1f) AM_WRITE(vrambank_w)
+ AM_RANGE(0x20, 0x20) AM_READ(read_unk) AM_WRITENOP//write = ram/rom bank ? at fc00-f800 ?
+ AM_RANGE(0x21, 0x21) AM_READ_PORT("IN0")
+ AM_RANGE(0x80, 0x9f) AM_WRITE(palette_w)
+ADDRESS_MAP_END
+
+static INPUT_PORTS_START( laserbas )
+ PORT_START("IN0")
+ PORT_DIPNAME( 0x01, 0x00, "0-0" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, "0-1" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, "0-2" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_DIPNAME( 0x010, 0x10, "0-3" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x010, DEF_STR( On ) )
+ PORT_DIPNAME( 0x020, 0x20, "Test Mode" )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x000, DEF_STR( On ) )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
+INPUT_PORTS_END
+
+static INTERRUPT_GEN( laserbas_interrupt )
+{
+ if(device->machine().primary_screen->vblank())
+ device_set_input_line(device, 0, HOLD_LINE);
+ else
+ device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
+}
+
+static MACHINE_START( laserbas )
+{
+ laserbas_state *state = machine.driver_data<laserbas_state>();
+
+ state->save_item(NAME(state->m_vrambank));
+ state->save_item(NAME(state->m_count));
+}
+
+static MACHINE_RESET( laserbas )
+{
+ laserbas_state *state = machine.driver_data<laserbas_state>();
+
+ state->m_vrambank = 0;
+ state->m_count = 0;
+}
+
+static MACHINE_CONFIG_START( laserbas, laserbas_state )
+
+ MCFG_CPU_ADD("maincpu", Z80, 4000000)
+ MCFG_CPU_PROGRAM_MAP(laserbas_memory)
+ MCFG_CPU_IO_MAP(laserbas_io)
+ MCFG_CPU_VBLANK_INT_HACK(laserbas_interrupt,2)
+
+ MCFG_MACHINE_START(laserbas)
+ MCFG_MACHINE_RESET(laserbas)
+
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
+ MCFG_SCREEN_SIZE(32*8, 32*8)
+ MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
+ MCFG_SCREEN_UPDATE(laserbas)
+
+ MCFG_PALETTE_LENGTH(32)
+ MCFG_VIDEO_START(laserbas)
+MACHINE_CONFIG_END
+
+/*
+Amstar LaserBase 1981 (Hoei)
+
+XBC-101-00-1 - CPU board
+ Z80A (D780C-1)
+ 2 NB5K8253
+ 2 2114 Rams
+ 8 Dipswitches
+
+XBC-102-01-1 - RAM board?
+ HD46505R
+ 32 MB8118 Rams
+
+------------------------------------
+
+Filename Label Type CSum Description
+--------- ----- ------ ---- -----------------------------
+MB8532.1 1 2532 9316
+MB8532.2 2 2532 5662
+MB8532.3 3 2532 7E9F
+MB8532.4 4 2532 7CAD
+MB8532.5 5 2532 C7D4 (Marked F.F.)
+MB8532.6 6 2532 16BE
+MB8532.7 7 2532 CF6C (Marked F.F.)
+MB8716.8 8 2716 9601 (Marked F.F.)
+TI2716.Z1 Z1 TI2716 D925
+--------- ----- ------ ---- -----------------------------
+
+I believe the F.F. markings on these chips show that
+these roms have been changed to Future Flash.
+
+It is unknown what the Z1 chip is, but the label screened
+on the board under the socket says 2716. All the identifying
+numbers have been scratched off and has Z1 stamped on it.
+It appears that each one was then numbered by hand in red
+marker and stamped with white ink with Z1.
+
+The Z1 chip was read from 3 different boards, it is Valid.
+The chips were numbered 69, 82 & 624, all three read the same.
+Turns out it was a TI2716. The TI chip has A10 on a different
+pin than a standard 2716.
+
+*/
+
+ROM_START( laserbas )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "mb8532.1", 0x0000, 0x1000, CRC(ef85e0c5) SHA1(c26da919c206a23eb6e53ffe39acd5a5dfd47c18) )
+ ROM_LOAD( "mb8532.2", 0x1000, 0x1000, CRC(0ba2236c) SHA1(416e4be957c395b05537d2e513e0c4561d8ca7c5) )
+ ROM_LOAD( "mb8532.3", 0x2000, 0x1000, CRC(83998e0b) SHA1(ac435fb8dd67aec0737d6c750c527841b2b91a5b) )
+ ROM_LOAD( "mb8532.4", 0x3000, 0x1000, CRC(00f9d909) SHA1(90b800cc5fcea53454584f8ad93eebbd193bdd21) )
+ ROM_LOAD( "lb2532.5", 0xc000, 0x1000, CRC(6459073e) SHA1(78b8a23534826dd2d3b3c6c5d5708c8a78a4b6bf) )
+ ROM_LOAD( "lb2532.6", 0xd000, 0x1000, CRC(a2dc1e7e) SHA1(78643a3aa852c73dab12e09a6cfc53141c936d12) )
+ ROM_LOAD( "mb8532.7", 0xe000, 0x1000, CRC(9d2148d7) SHA1(24954d82a09d9fcfdc61e91b7c824daa5dd701c3) )
+ ROM_LOAD( "mb8516.8", 0xf000, 0x0800, CRC(623f558f) SHA1(be6c6565df658555f21c43a8c2459cf399794a84) )
+ROM_END
+
+ROM_START( laserbasa )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "2732.u1", 0x0000, 0x1000, CRC(f3ab00dc) SHA1(4730b13b55c93c71ed483463e180e71e506cfbd6) )
+ ROM_LOAD( "2732.u2", 0x1000, 0x1000, CRC(0ba2236c) SHA1(416e4be957c395b05537d2e513e0c4561d8ca7c5) )
+ ROM_LOAD( "mb8532.u3", 0x2000, 0x1000, CRC(c58a7745) SHA1(382e2235d89520860335c1c2760339e116c0466f) )
+ ROM_LOAD( "mbm2732.u4", 0x3000, 0x1000, CRC(00f9d909) SHA1(90b800cc5fcea53454584f8ad93eebbd193bdd21) )
+ ROM_LOAD( "2732.u5", 0xc000, 0x1000, CRC(6459073e) SHA1(78b8a23534826dd2d3b3c6c5d5708c8a78a4b6bf) )
+ ROM_LOAD( "2732.u6", 0xd000, 0x1000, CRC(a2dc1e7e) SHA1(78643a3aa852c73dab12e09a6cfc53141c936d12) )
+ ROM_LOAD( "2732.u7", 0xe000, 0x1000, CRC(9d2148d7) SHA1(24954d82a09d9fcfdc61e91b7c824daa5dd701c3) )
+ ROM_LOAD( "mb8516.u8", 0xf000, 0x0800, CRC(623f558f) SHA1(be6c6565df658555f21c43a8c2459cf399794a84) )
+ROM_END
+
+/*
+It was unclear what type of device FF.9 was. The silkscreen on the PCB said
+2716,
+but the device is a masked ROM with its identifying marks rubbed off.
+I dumped it
+as a 2716 (FF.9), a 2532 like the others (FF.9A) and a 2732 (FF.9B).
+*/
+
+ROM_START( futflash )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "ff.1", 0x0000, 0x1000, CRC(bcd6b998) SHA1(4a210c40ce6015e2b921558b7571b7f2a27e1815) )
+ ROM_LOAD( "ff.2", 0x1000, 0x1000, CRC(1b1f6953) SHA1(8cd7b7e2236700ce63c60b4d2286099c8091bdbd) )
+ ROM_LOAD( "ff.3", 0x2000, 0x1000, CRC(30008f04) SHA1(e03b2dbcb6d2615650cdd47ecf1d587906ce149b) )
+ ROM_LOAD( "ff.4", 0x3000, 0x1000, CRC(e559aa12) SHA1(0fecfb60b0147e8060c640f684f69503478200ff) )
+ ROM_LOAD( "ff.5", 0xc000, 0x1000, CRC(6459073e) SHA1(78b8a23534826dd2d3b3c6c5d5708c8a78a4b6bf) )
+ ROM_LOAD( "ff.6", 0xd000, 0x1000, CRC(a8b17f49) SHA1(aea349bd19d001233bfb1805e586c950275010b4) )
+ ROM_LOAD( "ff.7", 0xe000, 0x1000, CRC(9d2148d7) SHA1(24954d82a09d9fcfdc61e91b7c824daa5dd701c3) )
+ ROM_LOAD( "ff.8", 0xf000, 0x0800, CRC(623f558f) SHA1(be6c6565df658555f21c43a8c2459cf399794a84) )
+ROM_END
+
+GAME( 1981, laserbas, 0, laserbas, laserbas, 0, ROT270, "Hoei (Amstar license)", "Laser Base (set 1)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
+GAME( 1981, laserbasa,laserbas, laserbas, laserbas, 0, ROT270, "Hoei (Amstar license)", "Laser Base (set 2)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
+GAME( 1981, futflash, laserbas, laserbas, laserbas, 0, ROT270, "Hoei", "Future Flash", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )