mirror of
https://github.com/holub/mame
synced 2025-06-23 21:06:38 +03:00
kungfur: styling (nw)
This commit is contained in:
parent
cd5e994b86
commit
e5b54b7038
@ -60,14 +60,19 @@ mae(forward), migi(right), ushiro(back), hidari(left)
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
|
|
||||||
#include "cpu/m6809/m6809.h"
|
#include "cpu/m6809/m6809.h"
|
||||||
#include "machine/i8255.h"
|
#include "machine/i8255.h"
|
||||||
#include "sound/msm5205.h"
|
#include "sound/msm5205.h"
|
||||||
|
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
|
|
||||||
|
// internal artwork
|
||||||
#include "kungfur.lh"
|
#include "kungfur.lh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
class kungfur_state : public driver_device
|
class kungfur_state : public driver_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -80,50 +85,76 @@ public:
|
|||||||
m_lamps(*this, "lamp%u", 0U)
|
m_lamps(*this, "lamp%u", 0U)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
// machine drivers
|
||||||
void kungfur(machine_config &config);
|
void kungfur(machine_config &config);
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
DECLARE_WRITE8_MEMBER(kungfur_output_w);
|
|
||||||
DECLARE_WRITE8_MEMBER(kungfur_latch1_w);
|
|
||||||
DECLARE_WRITE8_MEMBER(kungfur_latch2_w);
|
|
||||||
DECLARE_WRITE8_MEMBER(kungfur_latch3_w);
|
|
||||||
DECLARE_WRITE8_MEMBER(kungfur_control_w);
|
|
||||||
DECLARE_WRITE8_MEMBER(kungfur_adpcm1_w);
|
|
||||||
DECLARE_WRITE8_MEMBER(kungfur_adpcm2_w);
|
|
||||||
INTERRUPT_GEN_MEMBER(kungfur_irq);
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(kfr_adpcm1_int);
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(kfr_adpcm2_int);
|
|
||||||
void kungfur_map(address_map &map);
|
|
||||||
|
|
||||||
uint8_t m_latch[3];
|
|
||||||
uint8_t m_control;
|
|
||||||
uint32_t m_adpcm_pos[2];
|
|
||||||
uint8_t m_adpcm_data[2];
|
|
||||||
uint8_t m_adpcm_sel[2];
|
|
||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// devices/pointers
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<msm5205_device> m_adpcm1;
|
required_device<msm5205_device> m_adpcm1;
|
||||||
required_device<msm5205_device> m_adpcm2;
|
required_device<msm5205_device> m_adpcm2;
|
||||||
output_finder<14> m_digits;
|
output_finder<14> m_digits;
|
||||||
output_finder<8> m_lamps;
|
output_finder<8> m_lamps;
|
||||||
|
|
||||||
|
// address maps
|
||||||
|
void main_map(address_map &map);
|
||||||
|
|
||||||
|
// I/O handlers
|
||||||
|
INTERRUPT_GEN_MEMBER(interrupt);
|
||||||
|
DECLARE_WRITE8_MEMBER(output_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(latch1_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(latch2_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(latch3_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(control_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(adpcm1_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(adpcm2_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(adpcm1_int);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(adpcm2_int);
|
||||||
|
|
||||||
|
u8 m_control = 0;
|
||||||
|
u8 m_digit_data[3] = { 0, 0, 0 };
|
||||||
|
|
||||||
|
u32 m_adpcm_pos[2] = { 0, 0 };
|
||||||
|
u8 m_adpcm_data[2] = { 0, 0 };
|
||||||
|
u8 m_adpcm_sel[2] = { 0, 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void kungfur_state::machine_start()
|
||||||
|
{
|
||||||
|
m_digits.resolve();
|
||||||
|
m_lamps.resolve();
|
||||||
|
|
||||||
INTERRUPT_GEN_MEMBER(kungfur_state::kungfur_irq)
|
// register for savestates
|
||||||
|
save_item(NAME(m_control));
|
||||||
|
save_item(NAME(m_digit_data));
|
||||||
|
|
||||||
|
save_item(NAME(m_adpcm_pos));
|
||||||
|
save_item(NAME(m_adpcm_data));
|
||||||
|
save_item(NAME(m_adpcm_sel));
|
||||||
|
}
|
||||||
|
|
||||||
|
void kungfur_state::machine_reset()
|
||||||
|
{
|
||||||
|
m_control = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
I/O
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
INTERRUPT_GEN_MEMBER(kungfur_state::interrupt)
|
||||||
{
|
{
|
||||||
if (m_control & 0x10)
|
if (m_control & 0x10)
|
||||||
device.execute().set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
|
device.execute().set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRITE8_MEMBER(kungfur_state::output_w)
|
||||||
/***************************************************************************
|
|
||||||
|
|
||||||
I/O
|
|
||||||
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
WRITE8_MEMBER(kungfur_state::kungfur_output_w)
|
|
||||||
{
|
{
|
||||||
// d0-d2: output led7seg
|
// d0-d2: output led7seg
|
||||||
static const u8 lut_digits[24] =
|
static const u8 lut_digits[24] =
|
||||||
@ -136,14 +167,14 @@ WRITE8_MEMBER(kungfur_state::kungfur_output_w)
|
|||||||
{
|
{
|
||||||
u8 offs = i << 3 | (data & 7);
|
u8 offs = i << 3 | (data & 7);
|
||||||
if (lut_digits[offs])
|
if (lut_digits[offs])
|
||||||
m_digits[lut_digits[offs] - 1] = m_latch[i];
|
m_digits[lut_digits[offs] - 1] = m_digit_data[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2.6 goes to level lamps
|
// 2.6 goes to level lamps
|
||||||
if ((data & 7) == 6)
|
if ((data & 7) == 6)
|
||||||
{
|
{
|
||||||
for (u8 i = 0; i < 5; i++)
|
for (u8 i = 0; i < 5; i++)
|
||||||
m_lamps[i] = BIT(m_latch[2], i);
|
m_lamps[i] = BIT(m_digit_data[2], i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// d7: game-over lamp, d3-d4: marquee lamps
|
// d7: game-over lamp, d3-d4: marquee lamps
|
||||||
@ -158,23 +189,23 @@ WRITE8_MEMBER(kungfur_state::kungfur_output_w)
|
|||||||
|
|
||||||
|
|
||||||
// lamp output latches
|
// lamp output latches
|
||||||
WRITE8_MEMBER(kungfur_state::kungfur_latch1_w)
|
WRITE8_MEMBER(kungfur_state::latch1_w)
|
||||||
{
|
{
|
||||||
m_latch[0] = data;
|
m_digit_data[0] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER(kungfur_state::kungfur_latch2_w)
|
WRITE8_MEMBER(kungfur_state::latch2_w)
|
||||||
{
|
{
|
||||||
m_latch[1] = data;
|
m_digit_data[1] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER(kungfur_state::kungfur_latch3_w)
|
WRITE8_MEMBER(kungfur_state::latch3_w)
|
||||||
{
|
{
|
||||||
m_latch[2] = data;
|
m_digit_data[2] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WRITE8_MEMBER(kungfur_state::kungfur_control_w)
|
WRITE8_MEMBER(kungfur_state::control_w)
|
||||||
{
|
{
|
||||||
// d0-d3: N/C
|
// d0-d3: N/C
|
||||||
// d4: irq ack
|
// d4: irq ack
|
||||||
@ -200,31 +231,31 @@ WRITE8_MEMBER(kungfur_state::kungfur_control_w)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// adpcm latches
|
// adpcm latches
|
||||||
WRITE8_MEMBER(kungfur_state::kungfur_adpcm1_w)
|
WRITE8_MEMBER(kungfur_state::adpcm1_w)
|
||||||
{
|
{
|
||||||
m_adpcm_data[0] = data;
|
m_adpcm_data[0] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER(kungfur_state::kungfur_adpcm2_w)
|
WRITE8_MEMBER(kungfur_state::adpcm2_w)
|
||||||
{
|
{
|
||||||
m_adpcm_data[1] = data;
|
m_adpcm_data[1] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// adpcm callbacks
|
// adpcm callbacks
|
||||||
WRITE_LINE_MEMBER(kungfur_state::kfr_adpcm1_int)
|
WRITE_LINE_MEMBER(kungfur_state::adpcm1_int)
|
||||||
{
|
{
|
||||||
uint8_t *ROM = memregion("adpcm1")->base();
|
u8 *ROM = memregion("adpcm1")->base();
|
||||||
uint8_t data = ROM[m_adpcm_pos[0] & 0x1ffff];
|
u8 data = ROM[m_adpcm_pos[0] & 0x1ffff];
|
||||||
|
|
||||||
m_adpcm1->write_data(m_adpcm_sel[0] ? data & 0xf : data >> 4 & 0xf);
|
m_adpcm1->write_data(m_adpcm_sel[0] ? data & 0xf : data >> 4 & 0xf);
|
||||||
m_adpcm_pos[0] += m_adpcm_sel[0];
|
m_adpcm_pos[0] += m_adpcm_sel[0];
|
||||||
m_adpcm_sel[0] ^= 1;
|
m_adpcm_sel[0] ^= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER(kungfur_state::kfr_adpcm2_int)
|
WRITE_LINE_MEMBER(kungfur_state::adpcm2_int)
|
||||||
{
|
{
|
||||||
uint8_t *ROM = memregion("adpcm2")->base();
|
u8 *ROM = memregion("adpcm2")->base();
|
||||||
uint8_t data = ROM[m_adpcm_pos[1] & 0x3ffff];
|
u8 data = ROM[m_adpcm_pos[1] & 0x3ffff];
|
||||||
|
|
||||||
m_adpcm2->write_data(m_adpcm_sel[1] ? data & 0xf : data >> 4 & 0xf);
|
m_adpcm2->write_data(m_adpcm_sel[1] ? data & 0xf : data >> 4 & 0xf);
|
||||||
m_adpcm_pos[1] += m_adpcm_sel[1];
|
m_adpcm_pos[1] += m_adpcm_sel[1];
|
||||||
@ -232,22 +263,26 @@ WRITE_LINE_MEMBER(kungfur_state::kfr_adpcm2_int)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void kungfur_state::kungfur_map(address_map &map)
|
|
||||||
|
/******************************************************************************
|
||||||
|
Address Maps
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
void kungfur_state::main_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x0000, 0x07ff).ram();
|
map(0x0000, 0x07ff).ram();
|
||||||
map(0x4000, 0x4000).w(FUNC(kungfur_state::kungfur_adpcm1_w));
|
map(0x4000, 0x4000).w(FUNC(kungfur_state::adpcm1_w));
|
||||||
map(0x4004, 0x4004).w(FUNC(kungfur_state::kungfur_adpcm2_w));
|
map(0x4004, 0x4004).w(FUNC(kungfur_state::adpcm2_w));
|
||||||
map(0x4008, 0x400b).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write));
|
map(0x4008, 0x400b).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||||
map(0x400c, 0x400f).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write));
|
map(0x400c, 0x400f).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||||
map(0xc000, 0xffff).rom();
|
map(0xc000, 0xffff).rom();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
|
|
||||||
Inputs
|
/******************************************************************************
|
||||||
|
Input Ports
|
||||||
***************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
static INPUT_PORTS_START( kungfur )
|
static INPUT_PORTS_START( kungfur )
|
||||||
PORT_START("IN0")
|
PORT_START("IN0")
|
||||||
@ -275,52 +310,33 @@ static INPUT_PORTS_START( kungfur )
|
|||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
|
|
||||||
Machine Config
|
/******************************************************************************
|
||||||
|
Machine Drivers
|
||||||
***************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
void kungfur_state::machine_start()
|
|
||||||
{
|
|
||||||
m_digits.resolve();
|
|
||||||
m_lamps.resolve();
|
|
||||||
|
|
||||||
save_item(NAME(m_control));
|
|
||||||
save_item(NAME(m_latch));
|
|
||||||
|
|
||||||
save_item(NAME(m_adpcm_pos));
|
|
||||||
save_item(NAME(m_adpcm_data));
|
|
||||||
save_item(NAME(m_adpcm_sel));
|
|
||||||
}
|
|
||||||
|
|
||||||
void kungfur_state::machine_reset()
|
|
||||||
{
|
|
||||||
m_control = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void kungfur_state::kungfur(machine_config &config)
|
void kungfur_state::kungfur(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
MC6809(config, m_maincpu, 4000000); // 4MHz?
|
MC6809(config, m_maincpu, 4000000); // 4MHz?
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &kungfur_state::kungfur_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &kungfur_state::main_map);
|
||||||
|
|
||||||
const attotime irq_period = attotime::from_hz(4000000 / 0x1000); // = 976.5Hz, accurate
|
const attotime irq_period = attotime::from_hz(4000000 / 0x1000); // = 976.5Hz, accurate
|
||||||
m_maincpu->set_periodic_int(FUNC(kungfur_state::kungfur_irq), irq_period);
|
m_maincpu->set_periodic_int(FUNC(kungfur_state::interrupt), irq_period);
|
||||||
|
|
||||||
i8255_device &ppi0(I8255A(config, "ppi8255_0"));
|
i8255_device &ppi0(I8255A(config, "ppi8255_0"));
|
||||||
// $4008 - always $83 (PPI mode 0, ports B & lower C as input)
|
// $4008 - always $83 (PPI mode 0, ports B & lower C as input)
|
||||||
ppi0.out_pa_callback().set(FUNC(kungfur_state::kungfur_output_w));
|
ppi0.out_pa_callback().set(FUNC(kungfur_state::output_w));
|
||||||
ppi0.tri_pa_callback().set_constant(0);
|
ppi0.tri_pa_callback().set_constant(0);
|
||||||
ppi0.in_pb_callback().set_ioport("IN0");
|
ppi0.in_pb_callback().set_ioport("IN0");
|
||||||
ppi0.in_pc_callback().set_ioport("IN1");
|
ppi0.in_pc_callback().set_ioport("IN1");
|
||||||
ppi0.out_pc_callback().set(FUNC(kungfur_state::kungfur_control_w));
|
ppi0.out_pc_callback().set(FUNC(kungfur_state::control_w));
|
||||||
|
|
||||||
i8255_device &ppi1(I8255A(config, "ppi8255_1"));
|
i8255_device &ppi1(I8255A(config, "ppi8255_1"));
|
||||||
// $400c - always $80 (PPI mode 0, all ports as output)
|
// $400c - always $80 (PPI mode 0, all ports as output)
|
||||||
ppi1.out_pa_callback().set(FUNC(kungfur_state::kungfur_latch1_w));
|
ppi1.out_pa_callback().set(FUNC(kungfur_state::latch1_w));
|
||||||
ppi1.out_pb_callback().set(FUNC(kungfur_state::kungfur_latch2_w));
|
ppi1.out_pb_callback().set(FUNC(kungfur_state::latch2_w));
|
||||||
ppi1.out_pc_callback().set(FUNC(kungfur_state::kungfur_latch3_w));
|
ppi1.out_pc_callback().set(FUNC(kungfur_state::latch3_w));
|
||||||
|
|
||||||
/* no video! */
|
/* no video! */
|
||||||
|
|
||||||
@ -328,22 +344,21 @@ void kungfur_state::kungfur(machine_config &config)
|
|||||||
SPEAKER(config, "mono").front_center(); // 2 speakers, but likely mono sound mix
|
SPEAKER(config, "mono").front_center(); // 2 speakers, but likely mono sound mix
|
||||||
|
|
||||||
MSM5205(config, m_adpcm1, 384_kHz_XTAL); // clock verified with recording
|
MSM5205(config, m_adpcm1, 384_kHz_XTAL); // clock verified with recording
|
||||||
m_adpcm1->vck_legacy_callback().set(FUNC(kungfur_state::kfr_adpcm1_int));
|
m_adpcm1->vck_legacy_callback().set(FUNC(kungfur_state::adpcm1_int));
|
||||||
m_adpcm1->set_prescaler_selector(msm5205_device::S48_4B);
|
m_adpcm1->set_prescaler_selector(msm5205_device::S48_4B);
|
||||||
m_adpcm1->add_route(ALL_OUTPUTS, "mono", 1.0);
|
m_adpcm1->add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||||
|
|
||||||
MSM5205(config, m_adpcm2, 384_kHz_XTAL); // clock verified with recording
|
MSM5205(config, m_adpcm2, 384_kHz_XTAL); // clock verified with recording
|
||||||
m_adpcm2->vck_legacy_callback().set(FUNC(kungfur_state::kfr_adpcm2_int));
|
m_adpcm2->vck_legacy_callback().set(FUNC(kungfur_state::adpcm2_int));
|
||||||
m_adpcm2->set_prescaler_selector(msm5205_device::S48_4B);
|
m_adpcm2->set_prescaler_selector(msm5205_device::S48_4B);
|
||||||
m_adpcm2->add_route(ALL_OUTPUTS, "mono", 1.0);
|
m_adpcm2->add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
|
|
||||||
Game driver(s)
|
/******************************************************************************
|
||||||
|
ROM Definitions
|
||||||
***************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
ROM_START( kungfur )
|
ROM_START( kungfur )
|
||||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||||
@ -359,4 +374,13 @@ ROM_START( kungfur )
|
|||||||
ROM_LOAD( "kr6.bin", 0x20000, 0x10000, CRC(9ea75d4a) SHA1(57445ccb961acb11a25cdac81f2e543d92bcb7f9) )
|
ROM_LOAD( "kr6.bin", 0x20000, 0x10000, CRC(9ea75d4a) SHA1(57445ccb961acb11a25cdac81f2e543d92bcb7f9) )
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
Drivers
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* YEAR NAME PARENT MACHINE INPUT CLASS INIT MONITOR COMPANY, FULLNAME, FLAGS */
|
||||||
GAMEL( 1987, kungfur, 0, kungfur, kungfur, kungfur_state, empty_init, ROT0, "Namco", "Kung-Fu Roushi", MACHINE_SUPPORTS_SAVE, layout_kungfur )
|
GAMEL( 1987, kungfur, 0, kungfur, kungfur, kungfur_state, empty_init, ROT0, "Namco", "Kung-Fu Roushi", MACHINE_SUPPORTS_SAVE, layout_kungfur )
|
||||||
|
Loading…
Reference in New Issue
Block a user