mirror of
https://github.com/holub/mame
synced 2025-05-25 23:35:26 +03:00
game promoted to working
------------------- Kung-Fu Roushi [hap]
This commit is contained in:
parent
e22af46237
commit
bb82acbe4d
@ -1,17 +1,9 @@
|
||||
/***************************************************************************
|
||||
|
||||
TODO:
|
||||
- understand the 7segs properly;
|
||||
- inputs;
|
||||
- lamps;
|
||||
- Fix sound index/sound stop for the ADPCM sound chips;
|
||||
|
||||
===========================================================================
|
||||
|
||||
KUNG-FU ROUSHI
|
||||
(c)1987 NAMCO
|
||||
|
||||
6809 (4Mhz?)
|
||||
6809 (4MHz?)
|
||||
RAM 2016x1
|
||||
MSM5205 x 2 (2 SPEAKERS)
|
||||
8255 x 2
|
||||
@ -27,8 +19,38 @@ http://www.wshin.com/games/review/ka/kung-fu-roushi.htm
|
||||
http://www.youtube.com/watch?v=ssEfw-RbSjs
|
||||
http://www.youtube.com/watch?v=1YacVjpUG8g
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Game Panel:
|
||||
|
||||
tokuten honjitsu yuuryoukiroku
|
||||
(score) (today's best scores)
|
||||
XX #1 XX points
|
||||
#2 XX points
|
||||
dankai #3 XX points
|
||||
(level)
|
||||
1 2 3 4 5
|
||||
|
||||
hannoujikan heikinhannoujikan shuuryou
|
||||
(reaction time) (average reaction time) (finished, complete)
|
||||
X.XX seconds X.XX seconds
|
||||
|
||||
|
||||
Control Panel:
|
||||
|
||||
washi no kakegoe no toori ni botan wo osunojazoi!
|
||||
(hit the buttons as I call them out)
|
||||
|
||||
over 8, or 10 points --> level 1
|
||||
" 16, or 20 " --> level 2
|
||||
" 28, or 35 " --> level 3
|
||||
" 42, or 52 " --> level 4
|
||||
" 52, or 73(?) " --> level 5
|
||||
menkyokaiden(full certification)
|
||||
|
||||
The 4 buttons are labeled:
|
||||
mae(forward), migi(right), ushiro(back), hidari(left)
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
@ -46,164 +68,149 @@ public:
|
||||
kungfur_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag) { }
|
||||
|
||||
UINT8 m_led[0x10];
|
||||
UINT8 m_mux_data;
|
||||
UINT8 m_latch[3];
|
||||
UINT8 m_control;
|
||||
|
||||
UINT32 m_adpcm_pos[2];
|
||||
UINT8 m_adpcm_idle[2];
|
||||
UINT8 m_trigger1;
|
||||
UINT8 m_adpcm_data1;
|
||||
UINT8 m_trigger2;
|
||||
UINT8 m_adpcm_data2;
|
||||
UINT8 m_adpcm_data[2];
|
||||
UINT8 m_adpcm_sel[2];
|
||||
};
|
||||
|
||||
|
||||
static VIDEO_START( kungfur )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/* TODO: I believe that f segment is incorrectly connected (the following is just copied from acommand.c).*/
|
||||
/*
|
||||
a
|
||||
---
|
||||
f | | b
|
||||
-g-
|
||||
e | | c
|
||||
---
|
||||
d
|
||||
a & 1
|
||||
b & 2
|
||||
c & 4
|
||||
d & 8
|
||||
e & 10
|
||||
f & 20
|
||||
g & 40
|
||||
7f
|
||||
*/
|
||||
|
||||
#define LED_ON 0x0001
|
||||
#define LED_OFF 0x0000
|
||||
|
||||
static void draw_led(bitmap_ind16 &bitmap, int x, int y,UINT8 value)
|
||||
{
|
||||
bitmap.plot_box(x, y, 6, 10, 0x00000000);
|
||||
|
||||
/*a*/
|
||||
bitmap.pix16(y+0, x+1) = ((value & 0x01) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+0, x+2) = ((value & 0x01) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+0, x+3) = ((value & 0x01) ? LED_ON : LED_OFF);
|
||||
/*b*/
|
||||
bitmap.pix16(y+1, x+4) = ((value & 0x02) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+2, x+4) = ((value & 0x02) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+3, x+4) = ((value & 0x02) ? LED_ON : LED_OFF);
|
||||
/*c*/
|
||||
bitmap.pix16(y+5, x+4) = ((value & 0x04) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+6, x+4) = ((value & 0x04) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+7, x+4) = ((value & 0x04) ? LED_ON : LED_OFF);
|
||||
/*d*/
|
||||
bitmap.pix16(y+8, x+1) = ((value & 0x08) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+8, x+2) = ((value & 0x08) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+8, x+3) = ((value & 0x08) ? LED_ON : LED_OFF);
|
||||
/*e*/
|
||||
bitmap.pix16(y+5, x+0) = ((value & 0x10) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+6, x+0) = ((value & 0x10) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+7, x+0) = ((value & 0x10) ? LED_ON : LED_OFF);
|
||||
/*f*/
|
||||
bitmap.pix16(y+1, x+0) = ((value & 0x20) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+2, x+0) = ((value & 0x20) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+3, x+0) = ((value & 0x20) ? LED_ON : LED_OFF);
|
||||
/*g*/
|
||||
bitmap.pix16(y+4, x+1) = ((value & 0x40) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+4, x+2) = ((value & 0x40) ? LED_ON : LED_OFF);
|
||||
bitmap.pix16(y+4, x+3) = ((value & 0x40) ? LED_ON : LED_OFF);
|
||||
/*"point" (just for debugging)*/
|
||||
bitmap.pix16(y+9, x+4) = ((value & 0x80) ? LED_ON : LED_OFF);
|
||||
}
|
||||
|
||||
/* actually debugging purpose, it will be converted to the artwork system at some point. */
|
||||
static SCREEN_UPDATE_IND16( kungfur )
|
||||
{
|
||||
kungfur_state *state = screen.machine().driver_data<kungfur_state>();
|
||||
// popmessage("%02x %02x %02x %02x %02x %02x",io_data[0],io_data[1],io_data[2],io_data[3],io_data[4],io_data[5]);
|
||||
int i;
|
||||
|
||||
for(i=0;i<16;i++)
|
||||
draw_led(bitmap, (i*8)+2, 100, state->m_led[i]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static WRITE8_DEVICE_HANDLER( test0_w )
|
||||
static INTERRUPT_GEN( kungfur_irq )
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
state->m_mux_data = data & 7; /* multiplexer selector? (00-06) */
|
||||
|
||||
state->m_mux_data|= (data & 0x10)>>1;
|
||||
// printf("%02x MUX W\n",data);
|
||||
if (state->m_control & 0x10)
|
||||
device_set_input_line(device, M6809_IRQ_LINE, ASSERT_LINE);
|
||||
}
|
||||
|
||||
static WRITE8_DEVICE_HANDLER( test1_w )
|
||||
{
|
||||
// io_data[1] = data; /* the whole port should be NULL */
|
||||
// printf("%02x Unk 1 W\n",data);
|
||||
}
|
||||
|
||||
static WRITE8_DEVICE_HANDLER( test2_w )
|
||||
/***************************************************************************
|
||||
|
||||
I/O
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static WRITE8_DEVICE_HANDLER( kungfur_output_w )
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
// io_data[2] = data; /* lower nibble should be NULL */
|
||||
state->m_led[state->m_mux_data] = data;
|
||||
// printf("%02x Unk 2 W\n",data);
|
||||
|
||||
// d0-d2: output led7seg
|
||||
static const int lut_digits[24] =
|
||||
{
|
||||
0, 2, 4, 6, 9, 12,14,0,
|
||||
0, 1, 3, 5, 8, 11,13,0,
|
||||
0, 0, 0, 0, 7, 10,0, 0
|
||||
};
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
int offs = i << 3 | (data & 7);
|
||||
if (lut_digits[offs])
|
||||
output_set_digit_value(lut_digits[offs] - 1, state->m_latch[i]);
|
||||
}
|
||||
|
||||
// 2.6 goes to level lamps
|
||||
if ((data & 7) == 6)
|
||||
{
|
||||
for (int i = 0; i < 5; i++)
|
||||
output_set_lamp_value(i, state->m_latch[2] >> i & 1);
|
||||
}
|
||||
|
||||
// d7: game-over lamp, d3-d4: marquee lamps
|
||||
output_set_lamp_value(5, data >> 7 & 1);
|
||||
output_set_lamp_value(6, data >> 3 & 1);
|
||||
output_set_lamp_value(7, data >> 4 & 1);
|
||||
|
||||
// d5: N/C?
|
||||
// d6: coincounter
|
||||
coin_counter_w(device->machine(), 0, data & 0x40);
|
||||
}
|
||||
|
||||
static WRITE8_DEVICE_HANDLER( test3_w )
|
||||
{
|
||||
// io_data[3] = data;
|
||||
// printf("%02x Unk 3 W\n",data);
|
||||
}
|
||||
|
||||
/*mux is always 0*/
|
||||
static WRITE8_DEVICE_HANDLER( test4_w )
|
||||
// lamp output latches
|
||||
static WRITE8_DEVICE_HANDLER( kungfur_latch1_w )
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
// io_data[4] = data;
|
||||
state->m_led[state->m_mux_data] = data;
|
||||
state->m_latch[0] = data;
|
||||
}
|
||||
|
||||
/* this looks like lamps. */
|
||||
static WRITE8_DEVICE_HANDLER( test5_w )
|
||||
static WRITE8_DEVICE_HANDLER( kungfur_latch2_w )
|
||||
{
|
||||
// io_data[5] = data;
|
||||
// printf("%02x Unk 5 W\n",data);
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
state->m_latch[1] = data;
|
||||
}
|
||||
|
||||
static WRITE8_DEVICE_HANDLER( kungfur_latch3_w )
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
state->m_latch[2] = data;
|
||||
}
|
||||
|
||||
|
||||
static WRITE8_DEVICE_HANDLER( kungfur_control_w )
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
|
||||
// d0-d3: N/C
|
||||
// d4: irq ack
|
||||
if (~data & 0x10)
|
||||
cputag_set_input_line(device->machine(), "maincpu", M6809_IRQ_LINE, CLEAR_LINE);
|
||||
|
||||
// d5: ?
|
||||
// d6-d7: sound trigger (edge)
|
||||
if ((data ^ state->m_control) & 0x40)
|
||||
{
|
||||
msm5205_reset_w(device->machine().device("adpcm1"), data >> 6 & 1);
|
||||
state->m_adpcm_pos[0] = state->m_adpcm_data[0] * 0x400;
|
||||
state->m_adpcm_sel[0] = 0;
|
||||
}
|
||||
if ((data ^ state->m_control) & 0x80)
|
||||
{
|
||||
msm5205_reset_w(device->machine().device("adpcm2"), data >> 7 & 1);
|
||||
state->m_adpcm_pos[1] = state->m_adpcm_data[1] * 0x400;
|
||||
state->m_adpcm_sel[1] = 0;
|
||||
}
|
||||
|
||||
state->m_control = data;
|
||||
}
|
||||
|
||||
// adpcm latches
|
||||
static WRITE8_DEVICE_HANDLER( kungfur_adpcm1_w )
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
state->m_adpcm_pos[0] = 0x40000+(data & 0xff) * 0x100;
|
||||
state->m_adpcm_idle[0] = 0;
|
||||
msm5205_reset_w(device->machine().device("adpcm1"),0);
|
||||
state->m_adpcm_data[0] = data;
|
||||
}
|
||||
|
||||
static WRITE8_DEVICE_HANDLER( kungfur_adpcm2_w )
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
state->m_adpcm_pos[1] = (data & 0xff) * 0x400;
|
||||
state->m_adpcm_idle[1] = 0;
|
||||
msm5205_reset_w(device->machine().device("adpcm2"),0);
|
||||
state->m_adpcm_data[1] = data;
|
||||
}
|
||||
|
||||
/*
|
||||
// adpcm callbacks
|
||||
static void kfr_adpcm1_int(device_t *device)
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
UINT8 *ROM = device->machine().region("adpcm1")->base();
|
||||
UINT8 data = ROM[state->m_adpcm_pos[0] & 0x1ffff];
|
||||
|
||||
msm5205_data_w(device, state->m_adpcm_sel[0] ? data & 0xf : data >> 4 & 0xf);
|
||||
state->m_adpcm_pos[0] += state->m_adpcm_sel[0];
|
||||
state->m_adpcm_sel[0] ^= 1;
|
||||
}
|
||||
|
||||
static void kfr_adpcm2_int(device_t *device)
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
UINT8 *ROM = device->machine().region("adpcm2")->base();
|
||||
UINT8 data = ROM[state->m_adpcm_pos[1] & 0x3ffff];
|
||||
|
||||
msm5205_data_w(device, state->m_adpcm_sel[1] ? data & 0xf : data >> 4 & 0xf);
|
||||
state->m_adpcm_pos[1] += state->m_adpcm_sel[1];
|
||||
state->m_adpcm_sel[1] ^= 1;
|
||||
}
|
||||
|
||||
0000-07FF ; RW ; Working RAM.
|
||||
4000-4000 ; W ; M5205?
|
||||
4004-4004 ; W ; M5205?
|
||||
4008-400B ; RW ; PPI8255_0. PPI mode 0 - Ports B & lower C as Input.
|
||||
400C-400F ; W ; PPI8255_1. PPI mode 0 - All ports as output.
|
||||
C000-FFFF ; R ; ROM space.
|
||||
|
||||
*/
|
||||
static ADDRESS_MAP_START( kungfur_map, AS_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x07ff) AM_RAM
|
||||
AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("adpcm1", kungfur_adpcm1_w)
|
||||
@ -214,181 +221,123 @@ static ADDRESS_MAP_START( kungfur_map, AS_PROGRAM, 8 )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( kungfur )
|
||||
/***************************************************************************
|
||||
|
||||
Inputs
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static INPUT_PORTS_START( kungfur )
|
||||
PORT_START("IN0")
|
||||
PORT_DIPNAME( 0x01, 0x01, "SYSTEM" )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("Migi (Right)")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("Hidari (Left)")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_NAME("Ushiro (Back)")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY PORT_NAME("Mae (Front)")
|
||||
|
||||
PORT_START("IN1")
|
||||
PORT_DIPNAME( 0x01, 0x01, "SYSTEM" )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) )
|
||||
PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) )
|
||||
PORT_DIPSETTING( 0x06, DEF_STR( 2C_1C ) )
|
||||
PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) )
|
||||
PORT_DIPSETTING( 0x03, DEF_STR( 1C_2C ) )
|
||||
// PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) // dupe
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) )
|
||||
// PORT_DIPSETTING( 0x00, DEF_STR( 1C_3C ) ) // dupe
|
||||
// PORT_DIPSETTING( 0x04, DEF_STR( 0C_0C ) ) // invalid
|
||||
PORT_SERVICE( 0x08, IP_ACTIVE_LOW )
|
||||
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Machine Config
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static const ppi8255_interface ppi8255_intf[2] =
|
||||
/* Unused ports are still hooked for a easy visibility of the port writes */
|
||||
{
|
||||
{/* PPI mode 0 - ports B & lower C as Input - (4008) */
|
||||
DEVCB_NULL, /* Port A read */
|
||||
DEVCB_INPUT_PORT("IN0"), /* Port B read */
|
||||
DEVCB_INPUT_PORT("IN1"), /* Port C (lower) read */
|
||||
DEVCB_HANDLER(test0_w), /* Port A write */
|
||||
DEVCB_HANDLER(test1_w), /* Port B write */
|
||||
DEVCB_HANDLER(test2_w) /* Port C (higher) write */
|
||||
// $4008 - always $83 (PPI mode 0, ports B & lower C as input)
|
||||
{
|
||||
DEVCB_NULL,
|
||||
DEVCB_INPUT_PORT("IN0"),
|
||||
DEVCB_INPUT_PORT("IN1"),
|
||||
DEVCB_HANDLER(kungfur_output_w),
|
||||
DEVCB_NULL,
|
||||
DEVCB_HANDLER(kungfur_control_w)
|
||||
},
|
||||
{/* PPI mode 0 - All ports as output - (400c) */
|
||||
DEVCB_NULL, /* Port A read */
|
||||
DEVCB_NULL, /* Port B read */
|
||||
DEVCB_NULL, /* Port C read */
|
||||
DEVCB_HANDLER(test3_w), /* Port A write */
|
||||
DEVCB_HANDLER(test4_w), /* Port B write */
|
||||
DEVCB_HANDLER(test5_w) /* Port C write */
|
||||
// $400c - always $80 (PPI mode 0, all ports as output)
|
||||
{
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_HANDLER(kungfur_latch1_w),
|
||||
DEVCB_HANDLER(kungfur_latch2_w),
|
||||
DEVCB_HANDLER(kungfur_latch3_w)
|
||||
}
|
||||
};
|
||||
|
||||
static void kfr_adpcm1_int(device_t *device)
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
|
||||
if (state->m_adpcm_pos[0] >= 0x40000 || state->m_adpcm_idle[0])
|
||||
{
|
||||
msm5205_reset_w(device->machine().device("adpcm1"),1);
|
||||
state->m_trigger1 = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT8 *ROM = device->machine().region("adpcm1")->base();
|
||||
|
||||
state->m_adpcm_data1 = ((state->m_trigger1 ? (ROM[state->m_adpcm_pos[0]] & 0x0f) : (ROM[state->m_adpcm_pos[0]] & 0xf0)>>4) );
|
||||
msm5205_data_w(device->machine().device("adpcm1"), state->m_adpcm_data1 & 0xf);
|
||||
state->m_trigger1 ^= 1;
|
||||
if(state->m_trigger1 == 0)
|
||||
{
|
||||
state->m_adpcm_pos[0]++;
|
||||
if((ROM[state->m_adpcm_pos[0]] & 0xff) == 0xff)
|
||||
state->m_adpcm_idle[0] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void kfr_adpcm2_int(device_t *device)
|
||||
{
|
||||
kungfur_state *state = device->machine().driver_data<kungfur_state>();
|
||||
|
||||
if (state->m_adpcm_pos[1] >= 0x10000 || state->m_adpcm_idle[1])
|
||||
{
|
||||
msm5205_reset_w(device->machine().device("adpcm2"),1);
|
||||
state->m_trigger2 = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT8 *ROM = device->machine().region("adpcm2")->base();
|
||||
|
||||
state->m_adpcm_data2 = ((state->m_trigger2 ? (ROM[state->m_adpcm_pos[1]] & 0x0f) : (ROM[state->m_adpcm_pos[1]] & 0xf0)>>4) );
|
||||
msm5205_data_w(device->machine().device("adpcm2"), state->m_adpcm_data2 & 0xf);
|
||||
state->m_trigger2 ^= 1;
|
||||
if(state->m_trigger2 == 0)
|
||||
{
|
||||
state->m_adpcm_pos[1]++;
|
||||
if((ROM[state->m_adpcm_pos[1]] & 0xff) == 0xff)
|
||||
state->m_adpcm_idle[1] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static const msm5205_interface msm5205_config_1 =
|
||||
{
|
||||
kfr_adpcm1_int, /* interrupt function */
|
||||
MSM5205_S48_4B /* 8kHz */
|
||||
kfr_adpcm1_int,
|
||||
MSM5205_S48_4B
|
||||
};
|
||||
|
||||
static const msm5205_interface msm5205_config_2 =
|
||||
{
|
||||
kfr_adpcm2_int, /* interrupt function */
|
||||
MSM5205_S48_4B /* 8kHz */
|
||||
kfr_adpcm2_int,
|
||||
MSM5205_S48_4B
|
||||
};
|
||||
|
||||
static MACHINE_START( kungfur )
|
||||
{
|
||||
kungfur_state *state = machine.driver_data<kungfur_state>();
|
||||
|
||||
state->save_item(NAME(state->m_control));
|
||||
state->save_item(NAME(state->m_latch));
|
||||
|
||||
state->save_item(NAME(state->m_adpcm_pos));
|
||||
state->save_item(NAME(state->m_adpcm_data));
|
||||
state->save_item(NAME(state->m_adpcm_sel));
|
||||
}
|
||||
|
||||
static MACHINE_RESET( kungfur )
|
||||
{
|
||||
kungfur_state *state = machine.driver_data<kungfur_state>();
|
||||
state->m_adpcm_pos[0] = state->m_adpcm_pos[1] = 0;
|
||||
state->m_adpcm_idle[0] = state->m_adpcm_idle[1] = 1;
|
||||
}
|
||||
|
||||
static INTERRUPT_GEN( kungfur_irq )
|
||||
{
|
||||
cputag_set_input_line(device->machine(), "maincpu", M6809_IRQ_LINE, HOLD_LINE);
|
||||
state->m_control = 0;
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( kungfur, kungfur_state )
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu",M6809,8000000/2)
|
||||
MCFG_CPU_ADD("maincpu", M6809, 8000000/2) // 4MHz?
|
||||
MCFG_CPU_PROGRAM_MAP(kungfur_map)
|
||||
MCFG_CPU_VBLANK_INT("screen",kungfur_irq)
|
||||
MCFG_CPU_PERIODIC_INT(kungfur_irq, 975) // close approximation
|
||||
|
||||
MCFG_PPI8255_ADD( "ppi8255_0", ppi8255_intf[0] )
|
||||
MCFG_PPI8255_ADD( "ppi8255_1", ppi8255_intf[1] )
|
||||
|
||||
MCFG_MACHINE_RESET( kungfur )
|
||||
MCFG_MACHINE_START(kungfur)
|
||||
MCFG_MACHINE_RESET(kungfur)
|
||||
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
MCFG_SCREEN_REFRESH_RATE(60)
|
||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
||||
MCFG_SCREEN_SIZE(32*8, 32*8)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
|
||||
MCFG_SCREEN_UPDATE_STATIC(kungfur)
|
||||
MCFG_PALETTE_LENGTH(512)
|
||||
|
||||
MCFG_VIDEO_START(kungfur)
|
||||
/* no video! */
|
||||
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
MCFG_SOUND_ADD("adpcm1", MSM5205, 400000)
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
MCFG_SOUND_ADD("adpcm1", MSM5205, XTAL_384kHz) // clock verified with recording
|
||||
MCFG_SOUND_CONFIG(msm5205_config_1)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
|
||||
|
||||
MCFG_SOUND_ADD("adpcm2", MSM5205, 400000)
|
||||
MCFG_SOUND_ADD("adpcm2", MSM5205, XTAL_384kHz) // clock verified with recording
|
||||
MCFG_SOUND_CONFIG(msm5205_config_2)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Game driver(s)
|
||||
@ -397,16 +346,16 @@ MACHINE_CONFIG_END
|
||||
|
||||
ROM_START( kungfur )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "kr1.bin", 0xc000, 0x4000, CRC(f5b93cc7) SHA1(ed962915aeafea823a6562e6f284a88422f09a08) )
|
||||
ROM_LOAD( "kr1.bin", 0x0c000, 0x04000, CRC(f5b93cc7) SHA1(ed962915aeafea823a6562e6f284a88422f09a08) )
|
||||
|
||||
ROM_REGION( 0x40000, "adpcm1", 0 )
|
||||
ROM_REGION( 0x20000, "adpcm1", 0 )
|
||||
ROM_LOAD( "kr2.bin", 0x00000, 0x10000, CRC(13f5eba8) SHA1(a3ae2d54ec60d48bfff6192e61033ec583e3603f) )
|
||||
ROM_LOAD( "kr3.bin", 0x10000, 0x10000, CRC(05fd1301) SHA1(6871d872315ffb025fea7d2ccd9a203863dc142d) )
|
||||
ROM_LOAD( "kr4.bin", 0x20000, 0x10000, CRC(58929279) SHA1(d90f68dd8cf2ddc5e73ed40eb31ebbb0be7e35a4) )
|
||||
ROM_LOAD( "kr5.bin", 0x30000, 0x10000, CRC(31ed39c8) SHA1(8da50b2183a287fe3a41ec13078aff7fb40c43a3) )
|
||||
|
||||
ROM_REGION( 0x10000, "adpcm2", 0 )
|
||||
ROM_LOAD( "kr6.bin", 0x00000, 0x10000, CRC(9ea75d4a) SHA1(57445ccb961acb11a25cdac81f2e543d92bcb7f9) )
|
||||
ROM_REGION( 0x40000, "adpcm2", 0 )
|
||||
ROM_LOAD( "kr4.bin", 0x00000, 0x10000, CRC(58929279) SHA1(d90f68dd8cf2ddc5e73ed40eb31ebbb0be7e35a4) )
|
||||
ROM_LOAD( "kr5.bin", 0x10000, 0x10000, CRC(31ed39c8) SHA1(8da50b2183a287fe3a41ec13078aff7fb40c43a3) )
|
||||
ROM_LOAD( "kr6.bin", 0x20000, 0x10000, CRC(9ea75d4a) SHA1(57445ccb961acb11a25cdac81f2e543d92bcb7f9) )
|
||||
ROM_END
|
||||
|
||||
GAMEL(1987, kungfur, 0, kungfur, kungfur, 0, ROT0, "Namco", "Kung-Fu Roshi", GAME_NOT_WORKING, layout_kungfur)
|
||||
GAMEL(1987, kungfur, 0, kungfur, kungfur, 0, ROT0, "Namco", "Kung-Fu Roushi", GAME_SUPPORTS_SAVE, layout_kungfur )
|
||||
|
@ -1,15 +1,349 @@
|
||||
<?xml version="1.0"?>
|
||||
<mamelayout version="2">
|
||||
|
||||
<element name="static_black">
|
||||
<rect>
|
||||
<color red="0.0" green="0.0" blue="0.0" />
|
||||
</rect>
|
||||
</element>
|
||||
<element name="static_green">
|
||||
<rect>
|
||||
<color red="0.0" green="0.22" blue="0.22" />
|
||||
</rect>
|
||||
</element>
|
||||
<element name="static_yellow">
|
||||
<rect>
|
||||
<color red="0.85" green="0.85" blue="0.2" />
|
||||
</rect>
|
||||
</element>
|
||||
|
||||
<element name="digit" defstate="0">
|
||||
<led7seg>
|
||||
<color red="1.0" green="0.0" blue="0.0" />
|
||||
<color red="1.0" green="0.1" blue="0.1" />
|
||||
</led7seg>
|
||||
</element>
|
||||
|
||||
|
||||
<!-- define level lamps -->
|
||||
|
||||
<element name="level1" defstate="0">
|
||||
<disk state="1">
|
||||
<color red="1.0" green="0.3" blue="0.3" />
|
||||
</disk>
|
||||
<disk state="0">
|
||||
<color red="0.2" green="0.0" blue="0.0" />
|
||||
</disk>
|
||||
<text string="1">
|
||||
<color red="0.0" green="0.0" blue="0.0" />
|
||||
<bounds x="0" y="0.25" width="1" height="0.5" />
|
||||
</text>
|
||||
</element>
|
||||
<element name="level2" defstate="0">
|
||||
<disk state="1">
|
||||
<color red="1.0" green="0.3" blue="0.3" />
|
||||
</disk>
|
||||
<disk state="0">
|
||||
<color red="0.2" green="0.0" blue="0.0" />
|
||||
</disk>
|
||||
<text string="2">
|
||||
<color red="0.0" green="0.0" blue="0.0" />
|
||||
<bounds x="0" y="0.25" width="1" height="0.5" />
|
||||
</text>
|
||||
</element>
|
||||
<element name="level3" defstate="0">
|
||||
<disk state="1">
|
||||
<color red="1.0" green="0.3" blue="0.3" />
|
||||
</disk>
|
||||
<disk state="0">
|
||||
<color red="0.2" green="0.0" blue="0.0" />
|
||||
</disk>
|
||||
<text string="3">
|
||||
<color red="0.0" green="0.0" blue="0.0" />
|
||||
<bounds x="0" y="0.25" width="1" height="0.5" />
|
||||
</text>
|
||||
</element>
|
||||
<element name="level4" defstate="0">
|
||||
<disk state="1">
|
||||
<color red="1.0" green="0.3" blue="0.3" />
|
||||
</disk>
|
||||
<disk state="0">
|
||||
<color red="0.2" green="0.0" blue="0.0" />
|
||||
</disk>
|
||||
<text string="4">
|
||||
<color red="0.0" green="0.0" blue="0.0" />
|
||||
<bounds x="0" y="0.25" width="1" height="0.5" />
|
||||
</text>
|
||||
</element>
|
||||
<element name="level5" defstate="0">
|
||||
<disk state="1">
|
||||
<color red="1.0" green="0.3" blue="0.3" />
|
||||
</disk>
|
||||
<disk state="0">
|
||||
<color red="0.2" green="0.0" blue="0.0" />
|
||||
</disk>
|
||||
<text string="5">
|
||||
<color red="0.0" green="0.0" blue="0.0" />
|
||||
<bounds x="0" y="0.25" width="1" height="0.5" />
|
||||
</text>
|
||||
</element>
|
||||
|
||||
|
||||
<!-- define text -->
|
||||
|
||||
<element name="text_score">
|
||||
<rect>
|
||||
<color red="0.0" green="0.22" blue="0.22" />
|
||||
</rect>
|
||||
<text string="SCORE">
|
||||
<color red="1.0" green="1.0" blue="1.0" />
|
||||
<bounds x="0.03" y="0" width="0.94" height="1" />
|
||||
</text>
|
||||
</element>
|
||||
|
||||
<element name="text_level">
|
||||
<rect>
|
||||
<color red="0.0" green="0.22" blue="0.22" />
|
||||
</rect>
|
||||
<text string="LEVEL">
|
||||
<color red="1.0" green="1.0" blue="1.0" />
|
||||
<bounds x="0.03" y="0" width="0.94" height="1" />
|
||||
</text>
|
||||
</element>
|
||||
|
||||
<element name="text_reaction">
|
||||
<rect>
|
||||
<color red="0.0" green="0.22" blue="0.22" />
|
||||
</rect>
|
||||
<text string="REACTION TIME">
|
||||
<color red="1.0" green="1.0" blue="1.0" />
|
||||
<bounds x="0.02" y="0" width="0.96" height="1" />
|
||||
</text>
|
||||
</element>
|
||||
|
||||
<element name="text_average">
|
||||
<rect>
|
||||
<color red="0.0" green="0.22" blue="0.22" />
|
||||
</rect>
|
||||
<text string="AVERAGE">
|
||||
<color red="1.0" green="1.0" blue="1.0" />
|
||||
<bounds x="0.03" y="0" width="0.94" height="1" />
|
||||
</text>
|
||||
</element>
|
||||
|
||||
<element name="text_today">
|
||||
<rect>
|
||||
<color red="0.0" green="0.22" blue="0.22" />
|
||||
</rect>
|
||||
<text string="TODAY'S BEST">
|
||||
<bounds x="0.025" y="0" width="0.95" height="1" />
|
||||
<color red="1.0" green="1.0" blue="1.0" />
|
||||
</text>
|
||||
</element>
|
||||
|
||||
<element name="text_1">
|
||||
<text string="1ST">
|
||||
<color red="1.0" green="1.0" blue="1.0" />
|
||||
</text>
|
||||
</element>
|
||||
<element name="text_2">
|
||||
<text string="2ND">
|
||||
<color red="1.0" green="1.0" blue="1.0" />
|
||||
</text>
|
||||
</element>
|
||||
<element name="text_3">
|
||||
<text string="3RD">
|
||||
<color red="1.0" green="1.0" blue="1.0" />
|
||||
</text>
|
||||
</element>
|
||||
|
||||
<element name="text_gameover" defstate="0">
|
||||
<text string="GAME OVER" state="1">
|
||||
<color red="1.0" green="0.3" blue="0.3" />
|
||||
</text>
|
||||
<text string="GAME OVER" state="0">
|
||||
<color red="0.2" green="0.0" blue="0.0" />
|
||||
</text>
|
||||
</element>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<view name="Simple LEDs">
|
||||
<screen index="0">
|
||||
<bounds left="0" right="200" top="0" bottom="200" />
|
||||
</screen>
|
||||
<bounds left="0" right="147" top="0" bottom="100" />
|
||||
<bezel element="static_green">
|
||||
<bounds left="0" right="147" top="0" bottom="100" />
|
||||
</bezel>
|
||||
|
||||
|
||||
<!-- today's highscores -->
|
||||
|
||||
<bezel element="static_yellow">
|
||||
<bounds x="97" y="5" width="45" height="75" />
|
||||
</bezel>
|
||||
<bezel element="static_green">
|
||||
<bounds x="98" y="6" width="43" height="73" />
|
||||
</bezel>
|
||||
|
||||
<bezel element="text_today">
|
||||
<bounds x="105" y="3" width="29" height="5" />
|
||||
</bezel>
|
||||
|
||||
<bezel element="text_1">
|
||||
<bounds x="98.8" y="21" width="10" height="5" />
|
||||
</bezel>
|
||||
<bezel element="static_black">
|
||||
<bounds x="109" y="9" width="22" height="17" />
|
||||
</bezel>
|
||||
|
||||
<bezel name="digit0" element="digit">
|
||||
<bounds x="110" y="10" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit1" element="digit">
|
||||
<bounds x="120" y="10" width="10" height="15" />
|
||||
</bezel>
|
||||
|
||||
<bezel element="text_2">
|
||||
<bounds x="99" y="46" width="10" height="5" />
|
||||
</bezel>
|
||||
<bezel element="static_black">
|
||||
<bounds x="109" y="34" width="22" height="17" />
|
||||
</bezel>
|
||||
|
||||
<bezel name="digit2" element="digit">
|
||||
<bounds x="110" y="35" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit3" element="digit">
|
||||
<bounds x="120" y="35" width="10" height="15" />
|
||||
</bezel>
|
||||
|
||||
<bezel element="text_3">
|
||||
<bounds x="99" y="71" width="10" height="5" />
|
||||
</bezel>
|
||||
<bezel element="static_black">
|
||||
<bounds x="109" y="59" width="22" height="17" />
|
||||
</bezel>
|
||||
|
||||
<bezel name="digit4" element="digit">
|
||||
<bounds x="110" y="60" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit5" element="digit">
|
||||
<bounds x="120" y="60" width="10" height="15" />
|
||||
</bezel>
|
||||
|
||||
|
||||
<!-- reaction time -->
|
||||
|
||||
<bezel element="static_yellow">
|
||||
<bounds x="5" y="70" width="90" height="25" />
|
||||
</bezel>
|
||||
<bezel element="static_green">
|
||||
<bounds x="6" y="71" width="88" height="23" />
|
||||
</bezel>
|
||||
|
||||
<bezel element="text_reaction">
|
||||
<bounds x="9.5" y="68" width="33" height="5" />
|
||||
</bezel>
|
||||
<bezel element="text_average">
|
||||
<bounds x="56" y="68" width="19.5" height="5" />
|
||||
</bezel>
|
||||
|
||||
<bezel element="static_black">
|
||||
<bounds x="9" y="74" width="32" height="17" />
|
||||
</bezel>
|
||||
|
||||
<bezel name="digit6" element="digit">
|
||||
<bounds x="10" y="75" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit7" element="digit">
|
||||
<bounds x="20" y="75" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit8" element="digit">
|
||||
<bounds x="30" y="75" width="10" height="15" />
|
||||
</bezel>
|
||||
|
||||
<bezel element="static_black">
|
||||
<bounds x="49" y="74" width="32" height="17" />
|
||||
</bezel>
|
||||
|
||||
<bezel name="digit9" element="digit">
|
||||
<bounds x="50" y="75" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit10" element="digit">
|
||||
<bounds x="60" y="75" width="10" height="15" />
|
||||
</bezel>
|
||||
<bezel name="digit11" element="digit">
|
||||
<bounds x="70" y="75" width="10" height="15" />
|
||||
</bezel>
|
||||
|
||||
|
||||
<!-- score -->
|
||||
|
||||
<bezel element="static_yellow">
|
||||
<bounds x="5" y="5" width="90" height="40" />
|
||||
</bezel>
|
||||
<bezel element="static_green">
|
||||
<bounds x="6" y="6" width="88" height="38" />
|
||||
</bezel>
|
||||
|
||||
<bezel element="text_score">
|
||||
<bounds x="43" y="3" width="15" height="5" />
|
||||
</bezel>
|
||||
|
||||
<bezel element="static_black">
|
||||
<bounds x="29" y="9" width="42" height="32" />
|
||||
</bezel>
|
||||
|
||||
<bezel name="digit12" element="digit">
|
||||
<bounds x="30" y="10" width="20" height="30" />
|
||||
</bezel>
|
||||
<bezel name="digit13" element="digit">
|
||||
<bounds x="50" y="10" width="20" height="30" />
|
||||
</bezel>
|
||||
|
||||
|
||||
<!-- level -->
|
||||
|
||||
<bezel element="static_yellow">
|
||||
<bounds x="5" y="47" width="90" height="21" />
|
||||
</bezel>
|
||||
<bezel element="static_green">
|
||||
<bounds x="6" y="48" width="88" height="19" />
|
||||
</bezel>
|
||||
|
||||
<bezel element="text_level">
|
||||
<bounds x="43" y="45" width="13" height="5" />
|
||||
</bezel>
|
||||
|
||||
<bezel name="lamp0" element="level1">
|
||||
<bounds x="10" y="52.5" width="10" height="10" />
|
||||
</bezel>
|
||||
<bezel name="lamp1" element="level2">
|
||||
<bounds x="27.5" y="52.5" width="10" height="10" />
|
||||
</bezel>
|
||||
<bezel name="lamp2" element="level3">
|
||||
<bounds x="45" y="52.5" width="10" height="10" />
|
||||
</bezel>
|
||||
<bezel name="lamp3" element="level4">
|
||||
<bounds x="62.5" y="52.5" width="10" height="10" />
|
||||
</bezel>
|
||||
<bezel name="lamp4" element="level5">
|
||||
<bounds x="80" y="52.5" width="10" height="10" />
|
||||
</bezel>
|
||||
|
||||
|
||||
<!-- gameover -->
|
||||
|
||||
<bezel element="static_yellow">
|
||||
<bounds x="97" y="82" width="45" height="13" />
|
||||
</bezel>
|
||||
<bezel element="static_green">
|
||||
<bounds x="98" y="83" width="43" height="11" />
|
||||
</bezel>
|
||||
|
||||
<bezel name="lamp5" element="text_gameover">
|
||||
<bounds x="97" y="86" width="45" height="5" />
|
||||
</bezel>
|
||||
|
||||
|
||||
</view>
|
||||
|
Loading…
Reference in New Issue
Block a user