mirror of
https://github.com/holub/mame
synced 2025-04-24 01:11:11 +03:00
03908 - ddragon2, ddragon2u: [possible] Missing graphics when starting 2-Player [Phil Bennett]
00416 - ddragonw1: When finishing the game its reset and so go to check rom screen again and freezes! [Phil Bennett] 02106 - ddragon2, ddragon2u: [possible] The game slows down in the first level, after the helicopter appears [Phil Bennett] ddragon.c - Cleanup based on Double Dragon schematics [Phil Bennett]
This commit is contained in:
parent
4ae539edbb
commit
b58b2b3fa4
@ -8,30 +8,12 @@ Toffy / Super Toffy added by David Haywood
|
||||
Thanks to Bryan McPhail for spotting the Toffy program rom encryption
|
||||
Toffy / Super Toffy sound hooked up by R. Belmont.
|
||||
|
||||
BM, 8/1/2006:
|
||||
|
||||
Double Dragon has a crash which sometimes occurs at the very end of the game
|
||||
(right before the final animation sequence). It occurs because of a jump look up
|
||||
table:
|
||||
|
||||
BAD3: LDY #$BADD
|
||||
BAD7: JSR [A,Y]
|
||||
|
||||
At the point of the crash A is 0x3e which causes a jump to 0x3401 (background tile
|
||||
ram) which obviously doesn't contain proper code and causes a crash. The jump
|
||||
table has 32 entries, and only the last contains an invalid jump vector. A is set
|
||||
to 0x3e as a result of code at 0x625f - it reads from the shared spriteram (0x2049
|
||||
in main cpu memory space), copies the value to 0x523 (main ram) where it is later
|
||||
fetched and shifted to make 0x3e.
|
||||
|
||||
So.. it's not clear where the error is - the 0x1f value is actually written to
|
||||
shared RAM by the main CPU - perhaps the MCU should modify it before the main CPU
|
||||
reads it back? Perhaps 0x1f should never be written at all? If you want to trace
|
||||
this further please submit a proper fix! In the meantime I have patched the error
|
||||
by making sure the invalid jump is never taken - this fixes the crash (see
|
||||
ddragon_spriteram_r).
|
||||
|
||||
Modifications by Phil Bennett Sep 2013:
|
||||
|
||||
Cleanups based on Double Dragon schematics.
|
||||
Fixed sub CPU interrupt handling and common RAM access.
|
||||
Removed now-unnecessary workarounds.
|
||||
|
||||
Modifications by Bryan McPhail, June-November 2003:
|
||||
|
||||
@ -80,10 +62,10 @@ Dip locations verified with manual for ddragon & ddragon2
|
||||
#include "includes/ddragon.h"
|
||||
|
||||
|
||||
#define MAIN_CLOCK XTAL_12MHz
|
||||
#define SOUND_CLOCK XTAL_3_579545MHz
|
||||
#define MCU_CLOCK MAIN_CLOCK / 3
|
||||
#define PIXEL_CLOCK MAIN_CLOCK / 2
|
||||
#define MAIN_CLOCK XTAL_12MHz
|
||||
#define SOUND_CLOCK XTAL_3_579545MHz
|
||||
#define MCU_CLOCK MAIN_CLOCK / 3
|
||||
#define PIXEL_CLOCK MAIN_CLOCK / 2
|
||||
|
||||
|
||||
/*************************************
|
||||
@ -93,7 +75,7 @@ Dip locations verified with manual for ddragon & ddragon2
|
||||
*************************************/
|
||||
|
||||
/*
|
||||
Based on the Solar Warrior schematics, vertical timing counts as follows:
|
||||
Vertical timing counts as follows:
|
||||
|
||||
08,09,0A,0B,...,FC,FD,FE,FF,E8,E9,EA,EB,...,FC,FD,FE,FF,
|
||||
08,09,....
|
||||
@ -150,25 +132,25 @@ MACHINE_START_MEMBER(ddragon_state,ddragon)
|
||||
membank("bank1")->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000);
|
||||
|
||||
/* register for save states */
|
||||
save_item(NAME(m_dd_sub_cpu_busy));
|
||||
save_item(NAME(m_scrollx_hi));
|
||||
save_item(NAME(m_scrolly_hi));
|
||||
save_item(NAME(m_adpcm_pos));
|
||||
save_item(NAME(m_adpcm_end));
|
||||
save_item(NAME(m_adpcm_idle));
|
||||
save_item(NAME(m_adpcm_data));
|
||||
save_item(NAME(m_ddragon_sub_port));
|
||||
}
|
||||
|
||||
|
||||
MACHINE_RESET_MEMBER(ddragon_state,ddragon)
|
||||
{
|
||||
m_dd_sub_cpu_busy = 1;
|
||||
m_scrollx_hi = 0;
|
||||
m_scrolly_hi = 0;
|
||||
m_ddragon_sub_port = 0;
|
||||
m_adpcm_pos[0] = m_adpcm_pos[1] = 0;
|
||||
m_adpcm_end[0] = m_adpcm_end[1] = 0;
|
||||
m_adpcm_idle[0] = m_adpcm_idle[1] = 1;
|
||||
m_adpcm_data[0] = m_adpcm_data[1] = -1;
|
||||
m_scrollx_hi = 0;
|
||||
m_scrolly_hi = 0;
|
||||
}
|
||||
|
||||
|
||||
@ -181,30 +163,32 @@ MACHINE_RESET_MEMBER(ddragon_state,ddragon)
|
||||
|
||||
WRITE8_MEMBER(ddragon_state::ddragon_bankswitch_w)
|
||||
{
|
||||
m_scrollx_hi = (data & 0x01);
|
||||
m_scrolly_hi = ((data & 0x02) >> 1);
|
||||
/*
|
||||
76543210
|
||||
.......x X-scroll D9 (H9BT)
|
||||
......x. Y-scroll D9 (V9BT)
|
||||
.....x.. /Screen flip (*1P/2P)
|
||||
....x... /Sub CPU reset (*RESET)
|
||||
...x.... /Sub CPU halt (*HALT)
|
||||
xxx..... ROM bank (*BANK)
|
||||
*/
|
||||
m_scrollx_hi = data & 0x01;
|
||||
m_scrolly_hi = (data & 0x02) >> 1;
|
||||
flip_screen_set(~data & 0x04);
|
||||
|
||||
/* bit 3 unknown */
|
||||
|
||||
if (data & 0x10)
|
||||
m_dd_sub_cpu_busy = 0;
|
||||
else if (m_dd_sub_cpu_busy == 0)
|
||||
m_subcpu->set_input_line(m_sprite_irq, (m_sprite_irq == INPUT_LINE_NMI) ? PULSE_LINE : HOLD_LINE);
|
||||
|
||||
m_subcpu->set_input_line(INPUT_LINE_RESET, data & 0x08 ? CLEAR_LINE : ASSERT_LINE);
|
||||
m_subcpu->set_input_line(INPUT_LINE_HALT, data & 0x10 ? ASSERT_LINE : CLEAR_LINE);
|
||||
membank("bank1")->set_entry((data & 0xe0) >> 5);
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(ddragon_state::toffy_bankswitch_w)
|
||||
{
|
||||
m_scrollx_hi = (data & 0x01);
|
||||
m_scrolly_hi = ((data & 0x02) >> 1);
|
||||
m_scrollx_hi = data & 0x01;
|
||||
m_scrolly_hi = (data & 0x02) >> 1;
|
||||
|
||||
// flip_screen_set(machine(), ~data & 0x04);
|
||||
|
||||
/* bit 3 unknown */
|
||||
|
||||
/* I don't know ... */
|
||||
membank("bank1")->set_entry((data & 0x20) >> 5);
|
||||
}
|
||||
@ -252,20 +236,16 @@ WRITE8_MEMBER(ddragon_state::darktowr_mcu_bank_w)
|
||||
|
||||
WRITE8_MEMBER(ddragon_state::darktowr_bankswitch_w)
|
||||
{
|
||||
int oldbank = membank("bank1")->entry();
|
||||
int newbank = (data & 0xe0) >> 5;
|
||||
|
||||
m_scrollx_hi = (data & 0x01);
|
||||
m_scrolly_hi = ((data & 0x02) >> 1);
|
||||
|
||||
// flip_screen_set(machine(), ~data & 0x04);
|
||||
|
||||
/* bit 3 unknown */
|
||||
m_subcpu->set_input_line(INPUT_LINE_RESET, data & 0x08 ? CLEAR_LINE : ASSERT_LINE);
|
||||
m_subcpu->set_input_line(INPUT_LINE_HALT, data & 0x10 ? ASSERT_LINE : CLEAR_LINE);
|
||||
|
||||
if (data & 0x10)
|
||||
m_dd_sub_cpu_busy = 0;
|
||||
else if (m_dd_sub_cpu_busy == 0)
|
||||
m_subcpu->set_input_line(m_sprite_irq, (m_sprite_irq == INPUT_LINE_NMI) ? PULSE_LINE : HOLD_LINE);
|
||||
int oldbank = membank("bank1")->entry();
|
||||
int newbank = (data & 0xe0) >> 5;
|
||||
|
||||
membank("bank1")->set_entry(newbank);
|
||||
if (newbank == 4 && oldbank != 4)
|
||||
@ -282,7 +262,7 @@ WRITE8_MEMBER(ddragon_state::darktowr_bankswitch_w)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
WRITE8_MEMBER(ddragon_state::ddragon_interrupt_w)
|
||||
void ddragon_state::ddragon_interrupt_ack(address_space &space, offs_t offset, UINT8 data)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
@ -298,21 +278,35 @@ WRITE8_MEMBER(ddragon_state::ddragon_interrupt_w)
|
||||
m_maincpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
|
||||
break;
|
||||
|
||||
case 3: /* 380e - SND irq */
|
||||
case 3: /* 380e - SND IRQ and latch */
|
||||
soundlatch_byte_w(space, 0, data);
|
||||
m_soundcpu->set_input_line(m_sound_irq, (m_sound_irq == INPUT_LINE_NMI) ? PULSE_LINE : HOLD_LINE);
|
||||
m_soundcpu->set_input_line(m_sound_irq, ASSERT_LINE);
|
||||
break;
|
||||
|
||||
case 4: /* 380f - ? */
|
||||
/* Not sure what this is - almost certainly related to the sprite mcu */
|
||||
case 4: /* 380f - MCU IRQ */
|
||||
if (m_subcpu)
|
||||
m_subcpu->set_input_line(m_sprite_irq, ASSERT_LINE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
READ8_MEMBER(ddragon_state::ddragon_interrupt_r)
|
||||
{
|
||||
ddragon_interrupt_ack(space, offset, 0xff);
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(ddragon_state::ddragon_interrupt_w)
|
||||
{
|
||||
ddragon_interrupt_ack(space, offset, data);
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(ddragon_state::ddragon2_sub_irq_ack_w)
|
||||
{
|
||||
m_subcpu->set_input_line(m_sprite_irq, CLEAR_LINE );
|
||||
m_subcpu->set_input_line(m_sprite_irq, CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
@ -324,7 +318,26 @@ WRITE8_MEMBER(ddragon_state::ddragon2_sub_irq_w)
|
||||
|
||||
WRITE_LINE_MEMBER(ddragon_state::irq_handler)
|
||||
{
|
||||
m_soundcpu->set_input_line(m_ym_irq , state ? ASSERT_LINE : CLEAR_LINE );
|
||||
m_soundcpu->set_input_line(m_ym_irq, state ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
READ8_MEMBER(ddragon_state::soundlatch_ack_r)
|
||||
{
|
||||
m_soundcpu->set_input_line(m_sound_irq, CLEAR_LINE);
|
||||
return soundlatch_byte_r(space, 0);
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(ddragon_state::ddragonba_port_w)
|
||||
{
|
||||
if ((data & 0x8) == 0)
|
||||
m_subcpu->set_input_line(m_sprite_irq, CLEAR_LINE);
|
||||
|
||||
if (!(m_ddragon_sub_port & 0x10) && (data & 0x10))
|
||||
m_maincpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
|
||||
|
||||
m_ddragon_sub_port = data;
|
||||
}
|
||||
|
||||
|
||||
@ -335,9 +348,13 @@ WRITE_LINE_MEMBER(ddragon_state::irq_handler)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
CUSTOM_INPUT_MEMBER(ddragon_state::sub_cpu_busy)
|
||||
CUSTOM_INPUT_MEMBER(ddragon_state::subcpu_bus_free)
|
||||
{
|
||||
return m_dd_sub_cpu_busy;
|
||||
// Corresponds to BA (Bus Available) on the HD63701
|
||||
if (m_subcpu)
|
||||
return m_subcpu->suspended(SUSPEND_REASON_RESET | SUSPEND_REASON_HALT);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -357,17 +374,16 @@ READ8_MEMBER(ddragon_state::ddragon_hd63701_internal_registers_r)
|
||||
|
||||
WRITE8_MEMBER(ddragon_state::ddragon_hd63701_internal_registers_w)
|
||||
{
|
||||
/* I don't know why port 0x17 is used.. Doesn't seem to be a standard MCU port */
|
||||
// Port 6
|
||||
if (offset == 0x17)
|
||||
{
|
||||
/* This is a guess, but makes sense.. The mcu definitely interrupts the main cpu.
|
||||
I don't know what bit is the assert and what is the clear though (in comparison
|
||||
it's quite obvious from the Double Dragon 2 code, below). */
|
||||
if (data & 3)
|
||||
{
|
||||
m_maincpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
|
||||
if ((data & 0x1) == 0)
|
||||
m_subcpu->set_input_line(m_sprite_irq, CLEAR_LINE);
|
||||
}
|
||||
|
||||
if (!(m_ddragon_sub_port & 0x2) && (data & 0x2))
|
||||
m_maincpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
|
||||
|
||||
m_ddragon_sub_port = data;
|
||||
}
|
||||
}
|
||||
|
||||
@ -379,22 +395,22 @@ WRITE8_MEMBER(ddragon_state::ddragon_hd63701_internal_registers_w)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
READ8_MEMBER(ddragon_state::ddragon_spriteram_r)
|
||||
READ8_MEMBER(ddragon_state::ddragon_comram_r)
|
||||
{
|
||||
/* Double Dragon crash fix - see notes above */
|
||||
if (offset == 0x49 && space.device().safe_pc() == 0x6261 && m_spriteram[offset] == 0x1f)
|
||||
return 0x1;
|
||||
// Access to shared RAM is prevented when the sub CPU is active
|
||||
if (!m_subcpu->suspended(SUSPEND_REASON_RESET | SUSPEND_REASON_HALT))
|
||||
return 0xff;
|
||||
|
||||
return m_spriteram[offset];
|
||||
return m_comram[offset];
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(ddragon_state::ddragon_spriteram_w)
|
||||
WRITE8_MEMBER(ddragon_state::ddragon_comram_w)
|
||||
{
|
||||
if (&space.device() == m_subcpu && offset == 0)
|
||||
m_dd_sub_cpu_busy = 1;
|
||||
if (!m_subcpu->suspended(SUSPEND_REASON_RESET | SUSPEND_REASON_HALT))
|
||||
return;
|
||||
|
||||
m_spriteram[offset] = data;
|
||||
m_comram[offset] = data;
|
||||
}
|
||||
|
||||
|
||||
@ -481,9 +497,9 @@ static ADDRESS_MAP_START( ddragon_map, AS_PROGRAM, 8, ddragon_state )
|
||||
AM_RANGE(0x0000, 0x0fff) AM_RAM AM_SHARE("rambase")
|
||||
AM_RANGE(0x1000, 0x11ff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_byte_split_lo_w) AM_SHARE("paletteram")
|
||||
AM_RANGE(0x1200, 0x13ff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_byte_split_hi_w) AM_SHARE("paletteram2")
|
||||
AM_RANGE(0x1400, 0x17ff) AM_RAM
|
||||
AM_RANGE(0x1800, 0x1fff) AM_RAM_WRITE(ddragon_fgvideoram_w) AM_SHARE("fgvideoram")
|
||||
AM_RANGE(0x2000, 0x2fff) AM_READWRITE(ddragon_spriteram_r, ddragon_spriteram_w) AM_SHARE("spriteram")
|
||||
AM_RANGE(0x2000, 0x21ff) AM_READWRITE(ddragon_comram_r, ddragon_comram_w) AM_SHARE("comram") AM_MIRROR(0x0600)
|
||||
AM_RANGE(0x2800, 0x2fff) AM_RAM AM_SHARE("spriteram")
|
||||
AM_RANGE(0x3000, 0x37ff) AM_RAM_WRITE(ddragon_bgvideoram_w) AM_SHARE("bgvideoram")
|
||||
AM_RANGE(0x3800, 0x3800) AM_READ_PORT("P1")
|
||||
AM_RANGE(0x3801, 0x3801) AM_READ_PORT("P2")
|
||||
@ -493,7 +509,7 @@ static ADDRESS_MAP_START( ddragon_map, AS_PROGRAM, 8, ddragon_state )
|
||||
AM_RANGE(0x3808, 0x3808) AM_WRITE(ddragon_bankswitch_w)
|
||||
AM_RANGE(0x3809, 0x3809) AM_WRITEONLY AM_SHARE("scrollx_lo")
|
||||
AM_RANGE(0x380a, 0x380a) AM_WRITEONLY AM_SHARE("scrolly_lo")
|
||||
AM_RANGE(0x380b, 0x380f) AM_WRITE(ddragon_interrupt_w)
|
||||
AM_RANGE(0x380b, 0x380f) AM_READWRITE(ddragon_interrupt_r, ddragon_interrupt_w)
|
||||
AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1")
|
||||
AM_RANGE(0x8000, 0xffff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
@ -502,7 +518,8 @@ ADDRESS_MAP_END
|
||||
static ADDRESS_MAP_START( dd2_map, AS_PROGRAM, 8, ddragon_state )
|
||||
AM_RANGE(0x0000, 0x17ff) AM_RAM
|
||||
AM_RANGE(0x1800, 0x1fff) AM_RAM_WRITE(ddragon_fgvideoram_w) AM_SHARE("fgvideoram")
|
||||
AM_RANGE(0x2000, 0x2fff) AM_READWRITE(ddragon_spriteram_r, ddragon_spriteram_w) AM_SHARE("spriteram")
|
||||
AM_RANGE(0x2000, 0x21ff) AM_READWRITE(ddragon_comram_r, ddragon_comram_w) AM_SHARE("comram") AM_MIRROR(0x0600)
|
||||
AM_RANGE(0x2800, 0x2fff) AM_RAM AM_SHARE("spriteram")
|
||||
AM_RANGE(0x3000, 0x37ff) AM_RAM_WRITE(ddragon_bgvideoram_w) AM_SHARE("bgvideoram")
|
||||
AM_RANGE(0x3800, 0x3800) AM_READ_PORT("P1")
|
||||
AM_RANGE(0x3801, 0x3801) AM_READ_PORT("P2")
|
||||
@ -512,7 +529,7 @@ static ADDRESS_MAP_START( dd2_map, AS_PROGRAM, 8, ddragon_state )
|
||||
AM_RANGE(0x3808, 0x3808) AM_WRITE(ddragon_bankswitch_w)
|
||||
AM_RANGE(0x3809, 0x3809) AM_WRITEONLY AM_SHARE("scrollx_lo")
|
||||
AM_RANGE(0x380a, 0x380a) AM_WRITEONLY AM_SHARE("scrolly_lo")
|
||||
AM_RANGE(0x380b, 0x380f) AM_WRITE(ddragon_interrupt_w)
|
||||
AM_RANGE(0x380b, 0x380f) AM_READWRITE(ddragon_interrupt_r, ddragon_interrupt_w)
|
||||
AM_RANGE(0x3c00, 0x3dff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_byte_split_lo_w) AM_SHARE("paletteram")
|
||||
AM_RANGE(0x3e00, 0x3fff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_byte_split_hi_w) AM_SHARE("paletteram2")
|
||||
AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1")
|
||||
@ -530,31 +547,25 @@ ADDRESS_MAP_END
|
||||
static ADDRESS_MAP_START( sub_map, AS_PROGRAM, 8, ddragon_state )
|
||||
AM_RANGE(0x0000, 0x001f) AM_READWRITE(ddragon_hd63701_internal_registers_r, ddragon_hd63701_internal_registers_w)
|
||||
AM_RANGE(0x001f, 0x0fff) AM_RAM
|
||||
AM_RANGE(0x8000, 0x8fff) AM_READWRITE(ddragon_spriteram_r, ddragon_spriteram_w)
|
||||
AM_RANGE(0x8000, 0x81ff) AM_RAM AM_SHARE("comram")
|
||||
AM_RANGE(0xc000, 0xffff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
static ADDRESS_MAP_START( ddragonba_sub_map, AS_PROGRAM, 8, ddragon_state )
|
||||
AM_RANGE(0x0000, 0x0fff) AM_RAM
|
||||
AM_RANGE(0x8000, 0x8fff) AM_READWRITE(ddragon_spriteram_r, ddragon_spriteram_w)
|
||||
AM_RANGE(0x8000, 0x81ff) AM_RAM AM_SHARE("comram")
|
||||
AM_RANGE(0xc000, 0xffff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
static ADDRESS_MAP_START( dd2_sub_map, AS_PROGRAM, 8, ddragon_state )
|
||||
AM_RANGE(0x0000, 0xbfff) AM_ROM
|
||||
AM_RANGE(0xc000, 0xc3ff) AM_READWRITE(ddragon_spriteram_r, ddragon_spriteram_w)
|
||||
AM_RANGE(0xc000, 0xc3ff) AM_RAM AM_SHARE("comram")
|
||||
AM_RANGE(0xd000, 0xd000) AM_WRITE(ddragon2_sub_irq_ack_w)
|
||||
AM_RANGE(0xe000, 0xe000) AM_WRITE(ddragon2_sub_irq_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/* might not be 100% accurate, check bits written */
|
||||
WRITE8_MEMBER(ddragon_state::ddragonba_port_w)
|
||||
{
|
||||
m_maincpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
|
||||
m_subcpu->set_input_line(m_sprite_irq, CLEAR_LINE );
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START( ddragonba_sub_portmap, AS_IO, 8, ddragon_state )
|
||||
AM_RANGE(0x0000, 0xffff) AM_WRITE(ddragonba_port_w)
|
||||
@ -570,7 +581,7 @@ ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, ddragon_state )
|
||||
AM_RANGE(0x0000, 0x0fff) AM_RAM
|
||||
AM_RANGE(0x1000, 0x1000) AM_READ(soundlatch_byte_r)
|
||||
AM_RANGE(0x1000, 0x1000) AM_READ(soundlatch_ack_r)
|
||||
AM_RANGE(0x1800, 0x1800) AM_READ(dd_adpcm_status_r)
|
||||
AM_RANGE(0x2800, 0x2801) AM_DEVREADWRITE("fmsnd", ym2151_device, read, write)
|
||||
AM_RANGE(0x3800, 0x3807) AM_WRITE(dd_adpcm_w)
|
||||
@ -583,7 +594,7 @@ static ADDRESS_MAP_START( dd2_sound_map, AS_PROGRAM, 8, ddragon_state )
|
||||
AM_RANGE(0x8000, 0x87ff) AM_RAM
|
||||
AM_RANGE(0x8800, 0x8801) AM_DEVREADWRITE("fmsnd", ym2151_device, read, write)
|
||||
AM_RANGE(0x9800, 0x9800) AM_DEVREADWRITE("oki", okim6295_device, read, write)
|
||||
AM_RANGE(0xA000, 0xA000) AM_READ(soundlatch_byte_r)
|
||||
AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_ack_r)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
@ -682,10 +693,8 @@ static INPUT_PORTS_START( ddragon )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, ddragon_state,sub_cpu_busy, NULL)
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, ddragon_state, subcpu_bus_free, NULL)
|
||||
PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
@ -967,7 +976,7 @@ static MACHINE_CONFIG_START( ddragon, ddragon_state )
|
||||
MCFG_CPU_ADD("soundcpu", M6809, MAIN_CLOCK / 8) /* 1.5 MHz */
|
||||
MCFG_CPU_PROGRAM_MAP(sound_map)
|
||||
|
||||
MCFG_QUANTUM_TIME(attotime::from_hz(60000)) /* heavy interleaving to sync up sprite<->main cpu's */
|
||||
MCFG_QUANTUM_TIME(attotime::from_hz(60000)) /* heavy interleaving to sync up sprite<->main CPUs */
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(ddragon_state,ddragon)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(ddragon_state,ddragon)
|
||||
@ -986,15 +995,15 @@ static MACHINE_CONFIG_START( ddragon, ddragon_state )
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MCFG_YM2151_ADD("fmsnd", SOUND_CLOCK)
|
||||
MCFG_YM2151_IRQ_HANDLER(WRITELINE(ddragon_state,irq_handler))
|
||||
MCFG_YM2151_IRQ_HANDLER(WRITELINE(ddragon_state, irq_handler))
|
||||
MCFG_SOUND_ROUTE(0, "mono", 0.60)
|
||||
MCFG_SOUND_ROUTE(1, "mono", 0.60)
|
||||
|
||||
MCFG_SOUND_ADD("adpcm1", MSM5205, MAIN_CLOCK/32)
|
||||
MCFG_SOUND_ADD("adpcm1", MSM5205, MAIN_CLOCK / 32)
|
||||
MCFG_SOUND_CONFIG(msm5205_config_1)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
|
||||
|
||||
MCFG_SOUND_ADD("adpcm2", MSM5205, MAIN_CLOCK/32)
|
||||
MCFG_SOUND_ADD("adpcm2", MSM5205, MAIN_CLOCK / 32)
|
||||
MCFG_SOUND_CONFIG(msm5205_config_2)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
|
||||
MACHINE_CONFIG_END
|
||||
@ -1003,7 +1012,7 @@ MACHINE_CONFIG_END
|
||||
static MACHINE_CONFIG_DERIVED( ddragonb, ddragon )
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_REPLACE("sub", M6809, MAIN_CLOCK / 8) /* 1.5Mhz */
|
||||
MCFG_CPU_REPLACE("sub", M6809, MAIN_CLOCK / 8) /* 1.5MHz */
|
||||
MCFG_CPU_PROGRAM_MAP(sub_map)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
@ -1011,7 +1020,7 @@ MACHINE_CONFIG_END
|
||||
static MACHINE_CONFIG_DERIVED( ddragonba, ddragon )
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_REPLACE("sub", M6803, MAIN_CLOCK / 2) /* 6Mhz / 4 internally */
|
||||
MCFG_CPU_REPLACE("sub", M6803, MAIN_CLOCK / 2) /* 6MHz / 4 internally */
|
||||
MCFG_CPU_PROGRAM_MAP(ddragonba_sub_map)
|
||||
MCFG_CPU_IO_MAP(ddragonba_sub_portmap)
|
||||
MACHINE_CONFIG_END
|
||||
@ -1030,7 +1039,7 @@ static MACHINE_CONFIG_START( ddragon6809, ddragon_state )
|
||||
MCFG_CPU_ADD("soundcpu", M6809, MAIN_CLOCK / 8) /* 1.5 MHz */
|
||||
MCFG_CPU_PROGRAM_MAP(sound_map)
|
||||
|
||||
MCFG_QUANTUM_TIME(attotime::from_hz(60000)) /* heavy interleaving to sync up sprite<->main cpu's */
|
||||
MCFG_QUANTUM_TIME(attotime::from_hz(60000)) /* heavy interleaving to sync up sprite<->main CPUs */
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(ddragon_state,ddragon)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(ddragon_state,ddragon)
|
||||
@ -1076,7 +1085,7 @@ static MACHINE_CONFIG_START( ddragon2, ddragon_state )
|
||||
MCFG_CPU_ADD("soundcpu", Z80, 3579545)
|
||||
MCFG_CPU_PROGRAM_MAP(dd2_sound_map)
|
||||
|
||||
MCFG_QUANTUM_TIME(attotime::from_hz(60000)) /* heavy interleaving to sync up sprite<->main cpu's */
|
||||
MCFG_QUANTUM_TIME(attotime::from_hz(60000)) /* heavy interleaving to sync up sprite<->main CPUs */
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(ddragon_state,ddragon)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(ddragon_state,ddragon)
|
||||
@ -1170,7 +1179,7 @@ ROM_START( ddragon )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* Layer priority */
|
||||
ROM_END
|
||||
|
||||
ROM_START( ddragonw )
|
||||
@ -1210,8 +1219,8 @@ ROM_START( ddragonw )
|
||||
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
ROM_START( ddragonw1 )
|
||||
@ -1251,8 +1260,8 @@ ROM_START( ddragonw1 )
|
||||
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
ROM_START( ddragonu )
|
||||
@ -1292,8 +1301,8 @@ ROM_START( ddragonu )
|
||||
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
ROM_START( ddragonua )
|
||||
@ -1333,8 +1342,8 @@ ROM_START( ddragonua )
|
||||
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
|
||||
@ -1375,8 +1384,8 @@ ROM_START( ddragonub )
|
||||
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
|
||||
@ -1417,8 +1426,8 @@ ROM_START( ddragonb ) /* Same program roms as the World set */
|
||||
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
ROM_START( ddragonba )
|
||||
@ -1458,8 +1467,8 @@ ROM_START( ddragonba )
|
||||
ROM_LOAD( "7.bin", 0x10000, 0x10000, CRC(f9311f72) SHA1(aa554ef020e04dc896e5495bcddc64e489d0ffff) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
ROM_START( ddragonb2 )
|
||||
@ -1499,8 +1508,8 @@ ROM_START( ddragonb2 )
|
||||
ROM_LOAD( "2.bin", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
/* this is a well known italian bootleg of Double Dragon it can be identified by the following gameplay trait
|
||||
@ -1673,7 +1682,7 @@ ROM_START( ddragon2 )
|
||||
ROM_LOAD( "26j7-0.bin", 0x20000, 0x20000, CRC(bc6a48d5) SHA1(04c434f8cd42a8f82a263548183569396f9b684d) )
|
||||
|
||||
ROM_REGION( 0x0200, "proms", 0 )
|
||||
ROM_LOAD( "prom.16", 0x0000, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown (same as ddragon) */
|
||||
ROM_LOAD( "prom.16", 0x0000, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing (same as ddragon) */
|
||||
ROM_END
|
||||
|
||||
ROM_START( ddragon2u )
|
||||
@ -1709,7 +1718,7 @@ ROM_START( ddragon2u )
|
||||
ROM_LOAD( "26j7-0.bin", 0x20000, 0x20000, CRC(bc6a48d5) SHA1(04c434f8cd42a8f82a263548183569396f9b684d) )
|
||||
|
||||
ROM_REGION( 0x0200, "proms", 0 )
|
||||
ROM_LOAD( "prom.16", 0x0000, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown (same as ddragon) */
|
||||
ROM_LOAD( "prom.16", 0x0000, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing (same as ddragon) */
|
||||
ROM_END
|
||||
|
||||
|
||||
@ -1753,8 +1762,8 @@ ROM_START( tstrike )
|
||||
ROM_LOAD( "tstrike.95", 0x10000, 0x08000, CRC(1812eecb) SHA1(9b7d526f30a86682cdf088600b25ea5a56b112ef) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
ROM_START( tstrikea )
|
||||
@ -1797,8 +1806,8 @@ ROM_START( tstrikea )
|
||||
ROM_LOAD( "tstrike.95", 0x10000, 0x08000, CRC(1812eecb) SHA1(9b7d526f30a86682cdf088600b25ea5a56b112ef) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
|
||||
@ -1833,8 +1842,8 @@ ROM_START( ddungeon )
|
||||
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) ) /* at IC94 */
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* at IC101 */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* at IC16 */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
/* the only differences with this set are 2x graphic roms, and the sound program.
|
||||
@ -1872,8 +1881,8 @@ ROM_START( ddungeone )
|
||||
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) )
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
|
||||
@ -1917,8 +1926,8 @@ ROM_START( darktowr )
|
||||
ROM_LOAD( "21j-7", 0x10000, 0x10000, CRC(904de6f8) SHA1(3623e5ea05fd7c455992b7ed87e605b87c3850aa) ) /* from ddragon */
|
||||
|
||||
ROM_REGION( 0x0300, "proms", 0 )
|
||||
ROM_LOAD( "21j-k-0", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* unknown */ /* from ddragon */
|
||||
ROM_LOAD( "21j-l-0", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* unknown */ /* from ddragon */
|
||||
ROM_LOAD( "21j-k-0.101", 0x0000, 0x0100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* layer priorities */
|
||||
ROM_LOAD( "21j-l-0.16", 0x0100, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing */
|
||||
ROM_END
|
||||
|
||||
|
||||
@ -2064,6 +2073,8 @@ DRIVER_INIT_MEMBER(ddragon_state,ddragon6809)
|
||||
m_technos_video_hw = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Game drivers
|
||||
|
@ -13,6 +13,7 @@ public:
|
||||
m_rambase(*this, "rambase"),
|
||||
m_bgvideoram(*this, "bgvideoram"),
|
||||
m_fgvideoram(*this, "fgvideoram"),
|
||||
m_comram(*this, "comram"),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_scrollx_lo(*this, "scrollx_lo"),
|
||||
m_scrolly_lo(*this, "scrolly_lo"),
|
||||
@ -27,22 +28,21 @@ public:
|
||||
optional_shared_ptr<UINT8> m_rambase;
|
||||
required_shared_ptr<UINT8> m_bgvideoram;
|
||||
required_shared_ptr<UINT8> m_fgvideoram;
|
||||
optional_shared_ptr<UINT8> m_comram;
|
||||
required_shared_ptr<UINT8> m_spriteram;
|
||||
required_shared_ptr<UINT8> m_scrollx_lo;
|
||||
required_shared_ptr<UINT8> m_scrolly_lo;
|
||||
optional_shared_ptr<UINT8> m_darktowr_mcu_ports;
|
||||
// UINT8 * m_paletteram; // currently this uses generic palette handling
|
||||
// UINT8 * m_paletteram_2; // currently this uses generic palette handling
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *m_fg_tilemap;
|
||||
tilemap_t *m_bg_tilemap;
|
||||
tilemap_t *m_fg_tilemap;
|
||||
tilemap_t *m_bg_tilemap;
|
||||
UINT8 m_technos_video_hw;
|
||||
UINT8 m_scrollx_hi;
|
||||
UINT8 m_scrolly_hi;
|
||||
|
||||
/* misc */
|
||||
UINT8 m_dd_sub_cpu_busy;
|
||||
UINT8 m_ddragon_sub_port;
|
||||
UINT8 m_sprite_irq;
|
||||
UINT8 m_sound_irq;
|
||||
UINT8 m_ym_irq;
|
||||
@ -69,43 +69,54 @@ public:
|
||||
optional_device<cpu_device> m_subcpu;
|
||||
optional_device<msm5205_device> m_adpcm1;
|
||||
optional_device<msm5205_device> m_adpcm2;
|
||||
|
||||
|
||||
int scanline_to_vcount(int scanline);
|
||||
void ddragon_interrupt_ack(address_space &space, offs_t offset, UINT8 data);
|
||||
void dd_adpcm_int(msm5205_device *device, int chip);
|
||||
|
||||
/* video/ddragon.c */
|
||||
TILEMAP_MAPPER_MEMBER(background_scan);
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_fg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_fg_16color_tile_info);
|
||||
void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
|
||||
UINT32 screen_update_ddragon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
DECLARE_MACHINE_START(ddragon);
|
||||
DECLARE_MACHINE_RESET(ddragon);
|
||||
DECLARE_VIDEO_START(ddragon);
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(ddragon_scanline);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_handler);
|
||||
DECLARE_WRITE8_MEMBER(ddragon_bgvideoram_w);
|
||||
DECLARE_WRITE8_MEMBER(ddragon_fgvideoram_w);
|
||||
DECLARE_CUSTOM_INPUT_MEMBER(sub_cpu_busy);
|
||||
DECLARE_CUSTOM_INPUT_MEMBER(subcpu_bus_free);
|
||||
DECLARE_WRITE8_MEMBER(ddragon_bankswitch_w);
|
||||
DECLARE_WRITE8_MEMBER(toffy_bankswitch_w);
|
||||
DECLARE_READ8_MEMBER(darktowr_mcu_bank_r);
|
||||
DECLARE_READ8_MEMBER(soundlatch_ack_r);
|
||||
DECLARE_WRITE8_MEMBER(darktowr_mcu_bank_w);
|
||||
DECLARE_WRITE8_MEMBER(darktowr_bankswitch_w);
|
||||
DECLARE_READ8_MEMBER(ddragon_interrupt_r);
|
||||
DECLARE_WRITE8_MEMBER(ddragon_interrupt_w);
|
||||
DECLARE_WRITE8_MEMBER(ddragon2_sub_irq_ack_w);
|
||||
DECLARE_WRITE8_MEMBER(ddragon2_sub_irq_w);
|
||||
DECLARE_WRITE8_MEMBER(darktowr_mcu_w);
|
||||
DECLARE_READ8_MEMBER(ddragon_hd63701_internal_registers_r);
|
||||
DECLARE_WRITE8_MEMBER(ddragon_hd63701_internal_registers_w);
|
||||
DECLARE_READ8_MEMBER(ddragon_spriteram_r);
|
||||
DECLARE_WRITE8_MEMBER(ddragon_spriteram_w);
|
||||
DECLARE_READ8_MEMBER(ddragon_comram_r);
|
||||
DECLARE_WRITE8_MEMBER(ddragon_comram_w);
|
||||
DECLARE_WRITE8_MEMBER(dd_adpcm_w);
|
||||
DECLARE_READ8_MEMBER(dd_adpcm_status_r);
|
||||
DECLARE_WRITE8_MEMBER(ddragonba_port_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(dd_adpcm_int_1);
|
||||
DECLARE_WRITE_LINE_MEMBER(dd_adpcm_int_2);
|
||||
|
||||
DECLARE_DRIVER_INIT(toffy);
|
||||
DECLARE_DRIVER_INIT(darktowr);
|
||||
DECLARE_DRIVER_INIT(ddragon2);
|
||||
DECLARE_DRIVER_INIT(ddragon);
|
||||
DECLARE_DRIVER_INIT(ddragon6809);
|
||||
TILEMAP_MAPPER_MEMBER(background_scan);
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_fg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_fg_16color_tile_info);
|
||||
DECLARE_MACHINE_START(ddragon);
|
||||
DECLARE_MACHINE_RESET(ddragon);
|
||||
DECLARE_VIDEO_START(ddragon);
|
||||
UINT32 screen_update_ddragon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(ddragon_scanline);
|
||||
void draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect );
|
||||
int scanline_to_vcount( int scanline );
|
||||
void dd_adpcm_int(msm5205_device *device, int chip);
|
||||
DECLARE_WRITE_LINE_MEMBER(dd_adpcm_int_1);
|
||||
DECLARE_WRITE_LINE_MEMBER(dd_adpcm_int_2);
|
||||
};
|
||||
|
@ -28,11 +28,11 @@ Top Tile layout.
|
||||
Sprite layout.
|
||||
0 1 2 3 4
|
||||
---- ---- ---- ---- ---- xxxx xxxx xxxx ---- ---- = Sprite number
|
||||
---- ---- ---- ---- -xxx ---- ---- ---- ---- ---- = Color
|
||||
---- ---- ---- ---- xxxx ---- ---- ---- ---- ---- = Color
|
||||
xxxx xxxx ---- ---- ---- ---- ---- ---- ---- ---- = Y position
|
||||
---- ---- ---- ---x ---- ---- ---- ---- ---- ---- = Y MSb position ???
|
||||
---- ---- ---- ---- ---- ---- ---- ---- xxxx xxxx = X position
|
||||
---- ---- ---- --x- ---- ---- ---- ---- ---- ---- = X MSb position ???
|
||||
---- ---- ---- --x- ---- ---- ---- ---- ---- ---- = X position MSb
|
||||
---- ---- ---- -x-- ---- ---- ---- ---- ---- ---- = Y Flip
|
||||
---- ---- ---- x--- ---- ---- ---- ---- ---- ---- = X Flip
|
||||
---- ---- --xx ---- ---- ---- ---- ---- ---- ---- = Sprite Dimension
|
||||
@ -105,6 +105,7 @@ VIDEO_START_MEMBER(ddragon_state,ddragon)
|
||||
m_bg_tilemap->set_scrolldy(-8, -8);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Memory handlers
|
||||
@ -134,19 +135,13 @@ WRITE8_MEMBER(ddragon_state::ddragon_fgvideoram_w)
|
||||
cliprect,gfx, \
|
||||
(which + order),color,flipx,flipy,sx,sy,0);
|
||||
|
||||
void ddragon_state::draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect )
|
||||
void ddragon_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
|
||||
{
|
||||
gfx_element *gfx = machine().gfx[1];
|
||||
const UINT8 *src = m_spriteram;
|
||||
const UINT32 bytes = m_spriteram.bytes();
|
||||
|
||||
UINT8 *src;
|
||||
int i;
|
||||
|
||||
if (m_technos_video_hw == 1) /* China Gate Sprite RAM */
|
||||
src = (UINT8 *) (m_spriteram);
|
||||
else
|
||||
src = (UINT8 *) (&(m_spriteram[0x800]));
|
||||
|
||||
for (i = 0; i < (64 * 5); i += 5)
|
||||
for (UINT32 i = 0; i < bytes; i += 5)
|
||||
{
|
||||
int attr = src[i + 1];
|
||||
if (attr & 0x80) /* visible */
|
||||
@ -154,16 +149,16 @@ void ddragon_state::draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprec
|
||||
int sx = 240 - src[i + 4] + ((attr & 2) << 7);
|
||||
int sy = 232 - src[i + 0] + ((attr & 1) << 8);
|
||||
int size = (attr & 0x30) >> 4;
|
||||
int flipx = (attr & 8);
|
||||
int flipy = (attr & 4);
|
||||
int dx = -16,dy = -16;
|
||||
int flipx = attr & 8;
|
||||
int flipy = attr & 4;
|
||||
int dx = -16, dy = -16;
|
||||
|
||||
int which;
|
||||
int color;
|
||||
|
||||
if (m_technos_video_hw == 2) /* Double Dragon 2 */
|
||||
{
|
||||
color = (src[i + 2] >> 5);
|
||||
color = src[i + 2] >> 5;
|
||||
which = src[i + 3] + ((src[i + 2] & 0x1f) << 8);
|
||||
}
|
||||
else
|
||||
@ -173,7 +168,7 @@ void ddragon_state::draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprec
|
||||
if ((sx < -7) && (sx > -16)) sx += 256; /* fix sprite clip */
|
||||
if ((sy < -7) && (sy > -16)) sy += 256; /* fix sprite clip */
|
||||
}
|
||||
color = (src[i + 2] >> 4) & 0x07;
|
||||
color = src[i + 2] >> 4;
|
||||
which = src[i + 3] + ((src[i + 2] & 0x0f) << 8);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user