summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/toratora.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/toratora.cpp')
-rw-r--r--src/mame/drivers/toratora.cpp530
1 files changed, 0 insertions, 530 deletions
diff --git a/src/mame/drivers/toratora.cpp b/src/mame/drivers/toratora.cpp
deleted file mode 100644
index b53ba43f42c..00000000000
--- a/src/mame/drivers/toratora.cpp
+++ /dev/null
@@ -1,530 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nicola Salmoria
-/***************************************************************************
-
-Tora Tora (c) 1980 Game Plan
-
-driver by Nicola Salmoria, qwijibo
-
-deviations from schematics verified on set 2 pcb:
-
- main pcb:
- - U33.3 connected to /IRQ line via inverter U67.9,
- providing timer IRQ for input polling.
-
- - U43 removed from timer circuit, U52.9 wired directly to
- U32.5, increasing timer frequency to 250 Hz.
-
- audio pcb:
- - U6.10 wired to U14.21, cut from R14/16
- - R16 wired to R1 in series, R1 cut from GND
- - R14 wired to GND instead of U6.10
-
- - U5.10 wired to U15.21, cut from R13/15
- - R15 wired to R2 in series, R2 cut from GND
- - R13 wired to GND instead of U5.10
-
- - EXT VCO DACs (U11, U12) and surrounding logic not placed
- - Numerous changes to SN74677 timing component R & C values
-
-TODO:
-- The game reads some unmapped memory addresses, missing ROMs? There's an empty
- socket for U3 on the board, which should map at 5000-57ff, however the
- game reads mostly from 4800-4fff, which would be U6 according to the
- schematics.
-
-- The manual mentions dip switch settings and the schematics show the switches,
- the game reads them but ignores them, forcing 1C/1C and 3 lives.
- Maybe the dump is from a proto?
- Set 2 dump does read dip switches, so likely not a proto.
-
-- Bullet and explosion audio frequencies seem incorrect
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/m6800/m6800.h"
-#include "machine/6821pia.h"
-#include "sound/sn76477.h"
-#include "screen.h"
-#include "speaker.h"
-
-
-class toratora_state : public driver_device
-{
-public:
- toratora_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_videoram(*this, "videoram"),
- m_maincpu(*this, "maincpu"),
- m_sn1(*this, "sn1"),
- m_sn2(*this, "sn2"),
- m_pia_u1(*this, "pia_u1"),
- m_pia_u2(*this, "pia_u2"),
- m_pia_u3(*this, "pia_u3") { }
-
- void toratora(machine_config &config);
-
-private:
- /* memory pointers */
- required_shared_ptr<uint8_t> m_videoram;
-
- /* video-related */
- int m_timer;
- uint8_t m_clear_tv;
-
- /* devices */
- required_device<cpu_device> m_maincpu;
- required_device<sn76477_device> m_sn1;
- required_device<sn76477_device> m_sn2;
- required_device<pia6821_device> m_pia_u1;
- required_device<pia6821_device> m_pia_u2;
- required_device<pia6821_device> m_pia_u3;
- DECLARE_WRITE8_MEMBER(clear_tv_w);
- DECLARE_READ8_MEMBER(timer_r);
- DECLARE_WRITE8_MEMBER(clear_timer_w);
- DECLARE_WRITE_LINE_MEMBER(cb2_u2_w);
- DECLARE_WRITE8_MEMBER(port_b_u1_w);
- DECLARE_WRITE_LINE_MEMBER(main_cpu_irq);
- DECLARE_WRITE8_MEMBER(sn1_port_a_u3_w);
- DECLARE_WRITE8_MEMBER(sn1_port_b_u3_w);
- DECLARE_WRITE_LINE_MEMBER(sn1_ca2_u3_w);
- DECLARE_WRITE8_MEMBER(sn2_port_a_u2_w);
- DECLARE_WRITE8_MEMBER(sn2_port_b_u2_w);
- DECLARE_WRITE_LINE_MEMBER(sn2_ca2_u2_w);
- virtual void machine_start() override;
- virtual void machine_reset() override;
- uint32_t screen_update_toratora(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- INTERRUPT_GEN_MEMBER(toratora_timer);
- void main_map(address_map &map);
-};
-
-
-
-/*************************************
- *
- * Input handling
- *
- *************************************/
-
-WRITE_LINE_MEMBER(toratora_state::cb2_u2_w)
-{
- logerror("DIP tristate %sactive\n",(state & 1) ? "in" : "");
-}
-
-
-/*************************************
- *
- * Video hardware
- *
- *************************************/
-
-uint32_t toratora_state::screen_update_toratora(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
-{
- offs_t offs;
-
- for (offs = 0; offs < m_videoram.bytes(); offs++)
- {
- int i;
-
- uint8_t y = offs >> 5;
- uint8_t x = offs << 3;
- uint8_t data = m_videoram[offs];
-
- for (i = 0; i < 8; i++)
- {
- pen_t pen = (data & 0x80) ? rgb_t::white() : rgb_t::black();
- bitmap.pix32(y, x) = pen;
-
- data = data << 1;
- x = x + 1;
- }
-
- /* the video system clears as it writes out the pixels */
- if (m_clear_tv)
- m_videoram[offs] = 0;
- }
-
- m_clear_tv = 0;
-
- return 0;
-}
-
-
-WRITE8_MEMBER(toratora_state::clear_tv_w)
-{
- m_clear_tv = 1;
-}
-
-
-/*************************************
- *
- * Coin counter
- *
- *************************************/
-
-WRITE8_MEMBER(toratora_state::port_b_u1_w)
-{
- if (m_pia_u1->port_b_z_mask() & 0x20)
- machine().bookkeeping().coin_counter_w(0, 1);
- else
- machine().bookkeeping().coin_counter_w(0, data & 0x20);
-}
-
-
-/*************************************
- *
- * Interrupt generation
- *
- *************************************/
-
-WRITE_LINE_MEMBER(toratora_state::main_cpu_irq)
-{
- int combined_state = m_pia_u1->irq_a_state() | m_pia_u1->irq_b_state();
-
- logerror("GEN IRQ: %x\n", combined_state);
- m_maincpu->set_input_line(0, combined_state ? ASSERT_LINE : CLEAR_LINE);
-}
-
-
-INTERRUPT_GEN_MEMBER(toratora_state::toratora_timer)
-{
- /* timer counting at 250 Hz. (500 Hz / 2 via U52.9).
- * U43 removed from circuit, U52.9 wired to U32.5) */
- m_timer++;
-
- /* U33 bit 0 routed to /IRQ line after inverting through U67.9 */
- if(m_timer & 0x10)
- m_maincpu->set_input_line(0, ASSERT_LINE);
-
- /* also, when the timer overflows (16 seconds) watchdog would kick in */
- if (m_timer & 0x100)
- popmessage("watchdog!");
-
- m_pia_u1->write_porta(ioport("INPUT")->read() & 0x0f);
- m_pia_u1->ca1_w(ioport("INPUT")->read() & 0x10);
- m_pia_u1->ca2_w(ioport("INPUT")->read() & 0x20);
-}
-
-READ8_MEMBER(toratora_state::timer_r)
-{
- return m_timer;
-}
-
-WRITE8_MEMBER(toratora_state::clear_timer_w)
-{
- m_timer = 0;
- m_maincpu->set_input_line(0, CLEAR_LINE);
-}
-
-
-/*************************************
- *
- * Audio hardware
- *
- *************************************/
-
-
-WRITE8_MEMBER(toratora_state::sn1_port_a_u3_w)
-{
- m_sn1->vco_voltage_w(2.35 * (data & 0x7f) / 128.0);
- m_sn1->enable_w((data >> 7) & 0x01);
-}
-
-
-WRITE8_MEMBER(toratora_state::sn1_port_b_u3_w)
-{
- static const double resistances[] =
- {
- RES_INF, /* N/C */
- RES_INF, /* R39 not placed */
- RES_K(10) + RES_K(10) + RES_K(24) + RES_K(51) + RES_K(100) + RES_K(240),
- RES_K(10) + RES_K(10) + RES_K(24) + RES_K(51) + RES_K(100),
- RES_K(10) + RES_K(10) + RES_K(24) + RES_K(51),
- RES_K(10) + RES_K(10) + RES_K(24),
- RES_K(10) + RES_K(10),
- RES_INF
- };
-
- m_sn1->mixer_a_w ((data >> 0) & 0x01);
- m_sn1->mixer_b_w ((data >> 1) & 0x01);
- m_sn1->mixer_c_w ((data >> 2) & 0x01);
- m_sn1->envelope_1_w ((data >> 3) & 0x01);
- m_sn1->envelope_2_w ((data >> 4) & 0x01);
- m_sn1->slf_res_w(resistances[(data >> 5)]);
-
- /*
- * TODO: Determine proper 7441 output voltage here.
- * Datasheet lists 2.5 V max under worst conditions,
- * probably much lower in reality?
- * However, shot audio is muted if V < 1.0, as mixer state
- * is set to SLF & VCO. Should SLF FF state be inverted?
- */
- m_sn1->slf_cap_voltage_w((data >> 5) == 0x7 ? 2.5 : sn76477_device::EXTERNAL_VOLTAGE_DISCONNECT);
-}
-
-
-WRITE_LINE_MEMBER(toratora_state::sn1_ca2_u3_w)
-{
- m_sn1->vco_w(state);
-}
-
-WRITE8_MEMBER(toratora_state::sn2_port_a_u2_w)
-{
- m_sn2->vco_voltage_w(2.35 * (data & 0x7f) / 128.0);
- m_sn2->enable_w((data >> 7) & 0x01);
-}
-
-
-WRITE8_MEMBER(toratora_state::sn2_port_b_u2_w)
-{
- static const double resistances[] =
- {
- RES_INF, /* N/C */
- RES_K(10) + RES_K(10) + RES_K(24) + RES_K(51) + RES_K(100) + RES_M(240) + RES_M(2),
- RES_K(10) + RES_K(10) + RES_K(24) + RES_K(51) + RES_K(100) + RES_K(240),
- RES_K(10) + RES_K(10) + RES_K(24) + RES_K(51) + RES_K(100),
- RES_K(10) + RES_K(10) + RES_K(24) + RES_K(51),
- RES_K(10) + RES_K(10) + RES_K(24),
- RES_K(10) + RES_K(10),
- RES_INF
- };
-
- m_sn2->mixer_a_w ((data >> 0) & 0x01);
- m_sn2->mixer_b_w ((data >> 1) & 0x01);
- m_sn2->mixer_c_w ((data >> 2) & 0x01);
- m_sn2->envelope_1_w ((data >> 3) & 0x01);
- m_sn2->envelope_2_w ((data >> 4) & 0x01);
- m_sn2->slf_res_w(resistances[(data >> 5)]);
- m_sn2->slf_cap_voltage_w((data >> 5) == 0x7 ? 2.5 : sn76477_device::EXTERNAL_VOLTAGE_DISCONNECT);
-
- /* Seems like the output should be muted in this case, but unsure of exact mechanism */
- m_sn2->amplitude_res_w((data >> 5) == 0x0 ? RES_INF : RES_K(47));
-}
-
-
-WRITE_LINE_MEMBER(toratora_state::sn2_ca2_u2_w)
-{
- m_sn2->vco_w(state);
-}
-
-
-/*************************************
- *
- * Memory handlers
- *
- * No mirrors, all addresses are
- * fully decoded by the hardware!
- *
- *************************************/
-
-void toratora_state::main_map(address_map &map)
-{
- map(0x0000, 0x0fff).ram();
- map(0x1000, 0x7fff).rom(); /* not fully populated */
- map(0x8000, 0x9fff).ram().share("videoram");
- map(0xa000, 0xf047).noprw();
- map(0xf048, 0xf049).noprw();
- map(0xf04a, 0xf04a).w(FUNC(toratora_state::clear_tv_w)); /* the read is mark *LEDEN, but not used */
- map(0xf04b, 0xf04b).rw(FUNC(toratora_state::timer_r), FUNC(toratora_state::clear_timer_w));
- map(0xf04c, 0xf09f).noprw();
- map(0xf0a0, 0xf0a3).rw(m_pia_u1, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0xf0a4, 0xf0a7).rw(m_pia_u2, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0xf0a8, 0xf0ab).rw(m_pia_u3, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0xf0ac, 0xf7ff).noprw();
- map(0xf800, 0xffff).rom();
-}
-
-
-
-/*************************************
- *
- * Port definition
- *
- *************************************/
-
-static INPUT_PORTS_START( toratora )
- PORT_START("INPUT")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 )
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("DSW")
- PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2")
- PORT_DIPSETTING( 0x03, DEF_STR( 1C_5C ) )
- PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) )
- PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
- PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:3,4")
- PORT_DIPSETTING( 0x0c, DEF_STR( 1C_5C ) )
- PORT_DIPSETTING( 0x08, DEF_STR( 1C_3C ) )
- PORT_DIPSETTING( 0x04, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x02, DEF_STR( 1C_1C ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:5")
- PORT_DIPSETTING( 0x10, DEF_STR( On ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:6")
- PORT_DIPSETTING( 0x20, "4" )
- PORT_DIPSETTING( 0x00, "3" )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
-INPUT_PORTS_END
-
-
-
-/*************************************
- *
- * Machine driver
- *
- *************************************/
-
-void toratora_state::machine_start()
-{
- save_item(NAME(m_timer));
- save_item(NAME(m_clear_tv));
-}
-
-void toratora_state::machine_reset()
-{
- m_timer = 0xff;
- m_clear_tv = 0;
-}
-
-void toratora_state::toratora(machine_config &config)
-{
- /* basic machine hardware */
- M6800(config, m_maincpu, 5185000 / 8); /* 5.185 MHz XTAL divided by 8 (@ U94.12) */
- m_maincpu->set_addrmap(AS_PROGRAM, &toratora_state::main_map);
- m_maincpu->set_periodic_int(FUNC(toratora_state::toratora_timer), attotime::from_hz(250)); /* timer counting at 250 Hz */
-
- PIA6821(config, m_pia_u1, 0);
- m_pia_u1->writepb_handler().set(FUNC(toratora_state::port_b_u1_w));
- m_pia_u1->irqa_handler().set(FUNC(toratora_state::main_cpu_irq));
- m_pia_u1->irqb_handler().set(FUNC(toratora_state::main_cpu_irq));
-
- PIA6821(config, m_pia_u3, 0);
- m_pia_u3->writepa_handler().set(FUNC(toratora_state::sn1_port_a_u3_w));
- m_pia_u3->writepb_handler().set(FUNC(toratora_state::sn1_port_b_u3_w));
- m_pia_u3->ca2_handler().set(FUNC(toratora_state::sn1_ca2_u3_w));
-
- PIA6821(config, m_pia_u2, 0);
- m_pia_u2->readpb_handler().set_ioport("DSW");
- m_pia_u2->writepa_handler().set(FUNC(toratora_state::sn2_port_a_u2_w));
- m_pia_u2->writepb_handler().set(FUNC(toratora_state::sn2_port_b_u2_w));
- m_pia_u2->ca2_handler().set(FUNC(toratora_state::sn2_ca2_u2_w));
- m_pia_u2->cb2_handler().set(FUNC(toratora_state::cb2_u2_w));
-
- /* video hardware */
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_size(256, 256);
- screen.set_visarea(0,256-1,8,248-1);
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
- screen.set_screen_update(FUNC(toratora_state::screen_update_toratora));
-
- /* audio hardware */
- SPEAKER(config, "mono").front_center();
-
- SN76477(config, m_sn1);
- m_sn1->set_noise_params(RES_K(47), RES_K(470), CAP_P(470));
- m_sn1->set_decay_res(RES_M(2));
- m_sn1->set_attack_params(CAP_U(0.2), RES_K(3.3));
- m_sn1->set_amp_res(RES_K(47));
- m_sn1->set_feedback_res(RES_K(50));
- m_sn1->set_vco_params(0, CAP_U(0.1), RES_K(51));
- m_sn1->set_pitch_voltage(5.0);
- m_sn1->set_slf_params(CAP_U(1.0), RES_K(10));
- m_sn1->set_oneshot_params(CAP_U(0.1), RES_K(100));
- m_sn1->set_vco_mode(0);
- m_sn1->set_mixer_params(0, 0, 0);
- m_sn1->set_envelope_params(0, 0);
- m_sn1->set_enable(1);
- m_sn1->add_route(ALL_OUTPUTS, "mono", 0.50);
-
- SN76477(config, m_sn2);
- m_sn2->set_noise_params(RES_K(47), RES_K(470), CAP_P(470));
- m_sn2->set_decay_res(RES_M(2));
- m_sn2->set_attack_params(CAP_U(0.2), RES_K(3.3));
- m_sn2->set_amp_res(RES_K(47));
- m_sn2->set_feedback_res(RES_K(50));
- m_sn2->set_vco_params(0, CAP_U(0.1), RES_K(51));
- m_sn2->set_pitch_voltage(5.0);
- m_sn2->set_slf_params(CAP_U(1.0), RES_K(10));
- m_sn2->set_oneshot_params(CAP_U(0.1), RES_K(100));
- m_sn2->set_vco_mode(0);
- m_sn2->set_mixer_params(0, 0, 0);
- m_sn2->set_envelope_params(0, 0);
- m_sn2->set_enable(1);
- m_sn2->add_route(ALL_OUTPUTS, "mono", 0.50);
-}
-
-
-
-/*************************************
- *
- * ROM definition
- *
- *************************************/
-
-ROM_START( toratora )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "tora.u1", 0x1000, 0x0800, CRC(413c743a) SHA1(a887dfaaee557327a1699bb424488b934dab8612) )
- ROM_LOAD( "tora.u10", 0x1800, 0x0800, CRC(dc771b1c) SHA1(1bd81decb4d0a854878227c52d45ac0eea0602ec) )
- ROM_LOAD( "tora.u2", 0x2000, 0x0800, CRC(c574c664) SHA1(9f41a53ca51d04e5bec7525fe83c5f4bdfcf128d) )
- ROM_LOAD( "tora.u9", 0x2800, 0x0800, CRC(b67aa11f) SHA1(da9e77255640a4b32eed2be89b686b98a248bd72) )
- ROM_LOAD( "tora.u11", 0xf800, 0x0800, CRC(55135d6f) SHA1(c48f180a9d6e894aafe87b2daf74e9a082f4600e) )
-ROM_END
-
-/* Tora Tora? Game Plan?
-Etched in copper on top of board 20-00047C
- 20-10051A
-
-Etched in copper on back of daughter board 20-00048C
- 20-10052A
-
-ROM text showed TORA TOR* * was A with bit 7 set
- 1980 GAME PLAN,INC
-
-and war stuff (PLANE, BOMB, SQUAD, etc)
-
-.u2 2716 handwritten sticker U-2
-.u9 2716 handwritten sticker U-9
-.u10 2716 handwritten sticker U-10
-.u11 2716 handwritten sticker U-11
-
-open 24 pin socket @ U1 and U3
-open 40 pin socket @ U42
-
-Main board
-crystal with 5 185 on the top
-5280 x8
-socketed ds8833 x2
-socketed ds8t28 x2
-
-Daughter board
-open 40 pin socket @ U3 @ U2
-76477 X2 */
-
-ROM_START( toratorab )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "1027.u1", 0x1000, 0x0800, BAD_DUMP CRC(413c743a) SHA1(a887dfaaee557327a1699bb424488b934dab8612) ) /* rom u1 is missing in this set, using the toratora one */
- ROM_LOAD( "1027.u10", 0x1800, 0x0800, CRC(6a906292) SHA1(4ceff91b7dcd398e57cd19a91d2199c09cb37c39) )
- ROM_LOAD( "1027.u2", 0x2000, 0x0800, CRC(c1331648) SHA1(379101c6c1b8dab3e043ece01579cc96f6bb18a9) )
- ROM_LOAD( "1027.u9", 0x2800, 0x0800, CRC(59b021b5) SHA1(ea5a0c1f58c0e08231969ad161b79af6e1ae4431) )
- ROM_LOAD( "1027.u11", 0xf800, 0x0800, CRC(336f6659) SHA1(ea1151db54b68316908874da6983d6de5c94c29e) )
-ROM_END
-
-
-/*************************************
- *
- * Game driver
- *
- *************************************/
-
-GAME( 1980, toratora, 0, toratora, toratora, toratora_state, empty_init, ROT90, "Game Plan", "Tora Tora (prototype?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, toratorab,toratora, toratora, toratora, toratora_state, empty_init, ROT90, "Game Plan", "Tora Tora (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )