mirror of
https://github.com/holub/mame
synced 2025-06-07 13:23:50 +03:00
tecmo16.cpp - improve IRQ ack mechanism
* riot - don't trigger multiple interrupts per frame * 1943.cpp - don't draw past end of spriteram * flip 'free play' switch in quasar based on observed behavior (maybe freeplay isn't the best name for this)
This commit is contained in:
parent
24cef6fd40
commit
d4c18136b8
@ -15112,7 +15112,7 @@ GAME( 1982, mimonscra, mimonkey, mimonscr, mimonkey, galaxian_state, init_
|
|||||||
Sound Board: A970
|
Sound Board: A970
|
||||||
*/
|
*/
|
||||||
GAME( 1982, anteater, 0, anteater, anteater, galaxian_state, init_anteater, ROT90, "Tago Electronics", "Anteater", MACHINE_SUPPORTS_SAVE )
|
GAME( 1982, anteater, 0, anteater, anteater, galaxian_state, init_anteater, ROT90, "Tago Electronics", "Anteater", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1982, anteateruk, anteater, anteateruk, anteateruk, galaxian_state, init_anteateruk, ROT90, "Tago Electronics (Free Enterprise Games license", "The Anteater (UK)", MACHINE_SUPPORTS_SAVE ) // distributed in 1983
|
GAME( 1982, anteateruk, anteater, anteateruk, anteateruk, galaxian_state, init_anteateruk, ROT90, "Tago Electronics (Free Enterprise Games license)", "The Anteater (UK)", MACHINE_SUPPORTS_SAVE ) // distributed in 1983
|
||||||
GAME( 1982, anteaterg, anteater, anteaterg, anteateruk, galaxian_state, init_anteateruk, ROT90, "Tago Electronics (TV-Tuning license from Free Enterprise Games)", "Ameisenbaer (German)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1982, anteaterg, anteater, anteaterg, anteateruk, galaxian_state, init_anteateruk, ROT90, "Tago Electronics (TV-Tuning license from Free Enterprise Games)", "Ameisenbaer (German)", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1982, anteatergg, anteater, anteatergg, anteatergg, galaxian_state, init_galaxian, ROT90, "bootleg", "Ameisenbaer (German, Galaxian hardware)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1982, anteatergg, anteater, anteatergg, anteatergg, galaxian_state, init_galaxian, ROT90, "bootleg", "Ameisenbaer (German, Galaxian hardware)", MACHINE_SUPPORTS_SAVE )
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
- Phase 3 - seems awfully hard - dip settings ?
|
- Phase 3 - seems awfully hard - dip settings ?
|
||||||
- Hook up Coin Counter
|
- Hook up Coin Counter
|
||||||
- Test/Service Mode - not working?
|
- Test/Service Mode - not working?
|
||||||
|
- No attract demo? is this correct?
|
||||||
|
|
||||||
************************************************************************
|
************************************************************************
|
||||||
|
|
||||||
@ -195,9 +196,9 @@ static INPUT_PORTS_START( quasar )
|
|||||||
PORT_DIPSETTING( 0x10, "4" )
|
PORT_DIPSETTING( 0x10, "4" )
|
||||||
PORT_DIPSETTING( 0x20, "5" )
|
PORT_DIPSETTING( 0x20, "5" )
|
||||||
PORT_DIPSETTING( 0x30, "6" )
|
PORT_DIPSETTING( 0x30, "6" )
|
||||||
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Free_Play ) )
|
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Free_Play ) ) // requires initial coin, but doesn't decrease coins on game over
|
||||||
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
|
||||||
PORT_DIPNAME( 0x80, 0x80, "Test Mode" ) /* confirmed */
|
PORT_DIPNAME( 0x80, 0x80, "Test Mode" ) /* confirmed */
|
||||||
PORT_DIPSETTING( 0x00, "Collisions excluded" )
|
PORT_DIPSETTING( 0x00, "Collisions excluded" )
|
||||||
PORT_DIPSETTING( 0x80, "Collisions included" )
|
PORT_DIPSETTING( 0x80, "Collisions included" )
|
||||||
|
@ -17,8 +17,12 @@ TODO:
|
|||||||
fstarfrc relies on the interrupt being held for a while,
|
fstarfrc relies on the interrupt being held for a while,
|
||||||
otherwise the titlescreen background goes wrong.
|
otherwise the titlescreen background goes wrong.
|
||||||
If I had to guess: 24/4(6MHz) pixel clock, 384 hclocks, 264 scanlines
|
If I had to guess: 24/4(6MHz) pixel clock, 384 hclocks, 264 scanlines
|
||||||
|
riot does not like multiple interrupts per frame and will start to
|
||||||
|
fail towards the end of level 1 (bad palette) then randomly lock up
|
||||||
|
on level 2, see irq_150021_w / irq_150031_w for notes
|
||||||
- there could be some priorities problems in riot
|
- there could be some priorities problems in riot
|
||||||
(more noticeable in level 2)
|
(more noticeable in level 2)
|
||||||
|
- check layer offsets
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
- To enter into service mode in Final Star Force press and hold start
|
- To enter into service mode in Final Star Force press and hold start
|
||||||
@ -41,49 +45,44 @@ Notes:
|
|||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
void tecmo16_state::fstarfrc_map(address_map &map)
|
|
||||||
|
/*
|
||||||
|
(without setting D0)
|
||||||
|
move.b D0, $150031.l (start of interupt)
|
||||||
|
move.b D0, $150021.l (end of interrupt in riot, straight after above in ginkun, not used in fstarfrc?)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void tecmo16_state::irq_150021_w(offs_t offset, uint16_t data, uint16_t mem_mask)
|
||||||
|
{
|
||||||
|
// does this disable the vblank IRQ until next frame? fstarfrc expects multiple interrupts per
|
||||||
|
// frame and never writes it, while the others do. riot will start to glitch towards the end
|
||||||
|
// of stage 1, locking up on stage 2 if you allow multiple interrupts per frame.
|
||||||
|
m_maincpu->set_input_line(5, CLEAR_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tecmo16_state::irq_150031_w(offs_t offset, uint16_t data, uint16_t mem_mask)
|
||||||
|
{
|
||||||
|
// all games write this at the start of interrupt, is it the basic 'irq ack' (but without
|
||||||
|
// disabling further interrupts?) could also be some kind of DMA trigger (palette or similar)
|
||||||
|
}
|
||||||
|
|
||||||
|
void tecmo16_state::common_map(address_map& map)
|
||||||
{
|
{
|
||||||
map(0x000000, 0x07ffff).rom();
|
map(0x000000, 0x07ffff).rom();
|
||||||
map(0x100000, 0x103fff).ram(); /* Main RAM */
|
map(0x100000, 0x103fff).ram(); /* Main RAM */
|
||||||
map(0x110000, 0x110fff).ram().w(FUNC(tecmo16_state::charram_w)).share("charram");
|
|
||||||
map(0x120000, 0x1207ff).ram().w(FUNC(tecmo16_state::videoram_w)).share("videoram");
|
// tilemap sizes differ between games, probably configurable
|
||||||
map(0x120800, 0x120fff).ram().w(FUNC(tecmo16_state::colorram_w)).share("colorram");
|
// but for now we add them in different maps
|
||||||
map(0x121000, 0x1217ff).ram().w(FUNC(tecmo16_state::videoram2_w)).share("videoram2");
|
|
||||||
map(0x121800, 0x121fff).ram().w(FUNC(tecmo16_state::colorram2_w)).share("colorram2");
|
|
||||||
map(0x122000, 0x127fff).ram(); /* work area */
|
|
||||||
map(0x130000, 0x130fff).ram().share("spriteram");
|
map(0x130000, 0x130fff).ram().share("spriteram");
|
||||||
map(0x140000, 0x141fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
map(0x140000, 0x141fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||||
map(0x150000, 0x150001).w(FUNC(tecmo16_state::flipscreen_w));
|
map(0x150000, 0x150001).w(FUNC(tecmo16_state::flipscreen_w));
|
||||||
map(0x150011, 0x150011).w("soundlatch", FUNC(generic_latch_8_device::write));
|
map(0x150011, 0x150011).w("soundlatch", FUNC(generic_latch_8_device::write));
|
||||||
map(0x150030, 0x150031).portr("DSW2").nopw(); /* ??? */
|
map(0x150020, 0x150021).portr("EXTRA").w(FUNC(tecmo16_state::irq_150021_w));
|
||||||
|
map(0x150030, 0x150031).portr("DSW2").w(FUNC(tecmo16_state::irq_150031_w));
|
||||||
map(0x150040, 0x150041).portr("DSW1");
|
map(0x150040, 0x150041).portr("DSW1");
|
||||||
map(0x150050, 0x150051).portr("P1_P2");
|
map(0x150050, 0x150051).portr("P1_P2");
|
||||||
// map(0x160000, 0x160001).nopr(); /* ??? Read at every scene changes */
|
// map(0x160000, 0x160001).nopr(); /* ??? Read at every scene changes */
|
||||||
map(0x160000, 0x160001).w(FUNC(tecmo16_state::scroll_char_x_w));
|
|
||||||
map(0x16000c, 0x16000d).w(FUNC(tecmo16_state::scroll_x_w));
|
|
||||||
map(0x160012, 0x160013).w(FUNC(tecmo16_state::scroll_y_w));
|
|
||||||
map(0x160018, 0x160019).w(FUNC(tecmo16_state::scroll2_x_w));
|
|
||||||
map(0x16001e, 0x16001f).w(FUNC(tecmo16_state::scroll2_y_w));
|
|
||||||
}
|
|
||||||
|
|
||||||
void tecmo16_state::ginkun_map(address_map &map)
|
|
||||||
{
|
|
||||||
map(0x000000, 0x07ffff).rom();
|
|
||||||
map(0x100000, 0x103fff).ram(); /* Main RAM */
|
|
||||||
map(0x110000, 0x110fff).ram().w(FUNC(tecmo16_state::charram_w)).share("charram");
|
|
||||||
map(0x120000, 0x120fff).ram().w(FUNC(tecmo16_state::videoram_w)).share("videoram");
|
|
||||||
map(0x121000, 0x121fff).ram().w(FUNC(tecmo16_state::colorram_w)).share("colorram");
|
|
||||||
map(0x122000, 0x122fff).ram().w(FUNC(tecmo16_state::videoram2_w)).share("videoram2");
|
|
||||||
map(0x123000, 0x123fff).ram().w(FUNC(tecmo16_state::colorram2_w)).share("colorram2");
|
|
||||||
map(0x124000, 0x124fff).ram(); /* extra RAM for Riot */
|
|
||||||
map(0x130000, 0x130fff).ram().share("spriteram");
|
|
||||||
map(0x140000, 0x141fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
|
||||||
map(0x150000, 0x150001).w(FUNC(tecmo16_state::flipscreen_w));
|
|
||||||
map(0x150011, 0x150011).w("soundlatch", FUNC(generic_latch_8_device::write));
|
|
||||||
map(0x150020, 0x150021).portr("EXTRA").nopw(); /* ??? */
|
|
||||||
map(0x150030, 0x150031).portr("DSW2").nopw(); /* ??? */
|
|
||||||
map(0x150040, 0x150041).portr("DSW1");
|
|
||||||
map(0x150050, 0x150051).portr("P1_P2");
|
|
||||||
map(0x160000, 0x160001).w(FUNC(tecmo16_state::scroll_char_x_w));
|
map(0x160000, 0x160001).w(FUNC(tecmo16_state::scroll_char_x_w));
|
||||||
map(0x160006, 0x160007).w(FUNC(tecmo16_state::scroll_char_y_w));
|
map(0x160006, 0x160007).w(FUNC(tecmo16_state::scroll_char_y_w));
|
||||||
map(0x16000c, 0x16000d).w(FUNC(tecmo16_state::scroll_x_w));
|
map(0x16000c, 0x16000d).w(FUNC(tecmo16_state::scroll_x_w));
|
||||||
@ -92,6 +91,32 @@ void tecmo16_state::ginkun_map(address_map &map)
|
|||||||
map(0x16001e, 0x16001f).w(FUNC(tecmo16_state::scroll2_y_w));
|
map(0x16001e, 0x16001f).w(FUNC(tecmo16_state::scroll2_y_w));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void tecmo16_state::fstarfrc_map(address_map &map)
|
||||||
|
{
|
||||||
|
map(0x110000, 0x110fff).ram().w(FUNC(tecmo16_state::charram_w)).share("charram");
|
||||||
|
map(0x120000, 0x1207ff).ram().w(FUNC(tecmo16_state::videoram_w)).share("videoram");
|
||||||
|
map(0x120800, 0x120fff).ram().w(FUNC(tecmo16_state::colorram_w)).share("colorram");
|
||||||
|
map(0x121000, 0x1217ff).ram().w(FUNC(tecmo16_state::videoram2_w)).share("videoram2");
|
||||||
|
map(0x121800, 0x121fff).ram().w(FUNC(tecmo16_state::colorram2_w)).share("colorram2");
|
||||||
|
map(0x122000, 0x127fff).ram(); /* work area */
|
||||||
|
|
||||||
|
common_map(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tecmo16_state::ginkun_map(address_map &map)
|
||||||
|
{
|
||||||
|
map(0x110000, 0x110fff).ram().w(FUNC(tecmo16_state::charram_w)).share("charram");
|
||||||
|
map(0x120000, 0x120fff).ram().w(FUNC(tecmo16_state::videoram_w)).share("videoram");
|
||||||
|
map(0x121000, 0x121fff).ram().w(FUNC(tecmo16_state::colorram_w)).share("colorram");
|
||||||
|
map(0x122000, 0x122fff).ram().w(FUNC(tecmo16_state::videoram2_w)).share("videoram2");
|
||||||
|
map(0x123000, 0x123fff).ram().w(FUNC(tecmo16_state::colorram2_w)).share("colorram2");
|
||||||
|
map(0x124000, 0x124fff).ram(); /* extra RAM for Riot */
|
||||||
|
|
||||||
|
common_map(map);
|
||||||
|
}
|
||||||
|
|
||||||
void tecmo16_state::sound_map(address_map &map)
|
void tecmo16_state::sound_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x0000, 0xefff).rom();
|
map(0x0000, 0xefff).rom();
|
||||||
@ -169,6 +194,9 @@ static INPUT_PORTS_START( fstarfrc )
|
|||||||
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
|
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
|
||||||
PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_COIN1 )
|
PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||||
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_COIN2 )
|
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||||
|
|
||||||
|
PORT_START("EXTRA")
|
||||||
|
/* Not used */
|
||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
static INPUT_PORTS_START( ginkun )
|
static INPUT_PORTS_START( ginkun )
|
||||||
@ -331,7 +359,7 @@ GFXDECODE_END
|
|||||||
#define MASTER_CLOCK XTAL(24'000'000)
|
#define MASTER_CLOCK XTAL(24'000'000)
|
||||||
#define OKI_CLOCK XTAL(8'000'000)
|
#define OKI_CLOCK XTAL(8'000'000)
|
||||||
|
|
||||||
void tecmo16_state::fstarfrc(machine_config &config)
|
void tecmo16_state::base(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
M68000(config, m_maincpu, MASTER_CLOCK/2); /* 12MHz */
|
M68000(config, m_maincpu, MASTER_CLOCK/2); /* 12MHz */
|
||||||
@ -385,7 +413,7 @@ void tecmo16_state::fstarfrc(machine_config &config)
|
|||||||
|
|
||||||
void tecmo16_state::ginkun(machine_config &config)
|
void tecmo16_state::ginkun(machine_config &config)
|
||||||
{
|
{
|
||||||
fstarfrc(config);
|
base(config);
|
||||||
|
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &tecmo16_state::ginkun_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &tecmo16_state::ginkun_map);
|
||||||
|
|
||||||
@ -649,9 +677,9 @@ ROM_END
|
|||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
GAME( 1992, fstarfrc, 0, fstarfrc, fstarfrc, tecmo16_state, empty_init, ROT90, "Tecmo", "Final Star Force (US)", MACHINE_SUPPORTS_SAVE ) // Has 'Recycle it, don't trash it" and 'Winners don't use drugs' screens after first attract cycle
|
GAME( 1992, fstarfrc, 0, base, fstarfrc, tecmo16_state, empty_init, ROT90, "Tecmo", "Final Star Force (US)", MACHINE_SUPPORTS_SAVE ) // Has 'Recycle it, don't trash it" and 'Winners don't use drugs' screens after first attract cycle
|
||||||
GAME( 1992, fstarfrcj, fstarfrc, fstarfrc, fstarfrc, tecmo16_state, empty_init, ROT90, "Tecmo", "Final Star Force (Japan)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1992, fstarfrcj, fstarfrc, base, fstarfrc, tecmo16_state, empty_init, ROT90, "Tecmo", "Final Star Force (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1992, fstarfrcw, fstarfrc, fstarfrc, fstarfrc, tecmo16_state, empty_init, ROT90, "Tecmo", "Final Star Force (World?)", MACHINE_SUPPORTS_SAVE ) // more similar the to the Japanese version than to the US one, not the parent because not sure it's the world version
|
GAME( 1992, fstarfrcw, fstarfrc, base, fstarfrc, tecmo16_state, empty_init, ROT90, "Tecmo", "Final Star Force (World?)", MACHINE_SUPPORTS_SAVE ) // more similar the to the Japanese version than to the US one, not the parent because not sure it's the world version
|
||||||
GAME( 1992, riot, 0, riot, riot, tecmo16_state, empty_init, ROT0, "NMK", "Riot", MACHINE_SUPPORTS_SAVE )
|
GAME( 1992, riot, 0, riot, riot, tecmo16_state, empty_init, ROT0, "NMK", "Riot", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1992, riotw, riot, riot, riot, tecmo16_state, empty_init, ROT0, "Woong Bi", "Riot (Woong Bi license)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1992, riotw, riot, riot, riot, tecmo16_state, empty_init, ROT0, "Woong Bi", "Riot (Woong Bi license)", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1995, ginkun, 0, ginkun, ginkun, tecmo16_state, empty_init, ROT0, "Tecmo", "Ganbare Ginkun", MACHINE_SUPPORTS_SAVE )
|
GAME( 1995, ginkun, 0, ginkun, ginkun, tecmo16_state, empty_init, ROT0, "Tecmo", "Ganbare Ginkun", MACHINE_SUPPORTS_SAVE )
|
||||||
|
@ -32,8 +32,8 @@ public:
|
|||||||
m_spriteram(*this, "spriteram")
|
m_spriteram(*this, "spriteram")
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
void base(machine_config &config);
|
||||||
void ginkun(machine_config &config);
|
void ginkun(machine_config &config);
|
||||||
void fstarfrc(machine_config &config);
|
|
||||||
void riot(machine_config &config);
|
void riot(machine_config &config);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -81,6 +81,9 @@ private:
|
|||||||
void scroll_char_x_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
|
void scroll_char_x_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
|
||||||
void scroll_char_y_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
|
void scroll_char_y_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
|
||||||
|
|
||||||
|
void irq_150021_w(offs_t offset, uint16_t data, uint16_t mem_mask);
|
||||||
|
void irq_150031_w(offs_t offset, uint16_t data, uint16_t mem_mask);
|
||||||
|
|
||||||
TILE_GET_INFO_MEMBER(fg_get_tile_info);
|
TILE_GET_INFO_MEMBER(fg_get_tile_info);
|
||||||
TILE_GET_INFO_MEMBER(bg_get_tile_info);
|
TILE_GET_INFO_MEMBER(bg_get_tile_info);
|
||||||
TILE_GET_INFO_MEMBER(tx_get_tile_info);
|
TILE_GET_INFO_MEMBER(tx_get_tile_info);
|
||||||
@ -93,7 +96,7 @@ private:
|
|||||||
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
|
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
|
||||||
|
|
||||||
void save_state();
|
void save_state();
|
||||||
|
void common_map(address_map& map);
|
||||||
void fstarfrc_map(address_map &map);
|
void fstarfrc_map(address_map &map);
|
||||||
void ginkun_map(address_map &map);
|
void ginkun_map(address_map &map);
|
||||||
void sound_map(address_map &map);
|
void sound_map(address_map &map);
|
||||||
|
@ -284,7 +284,7 @@ void _1943_state::_1943_drawgfx(bitmap_ind16 &dest_bmp,const rectangle &clip,gfx
|
|||||||
|
|
||||||
void _1943_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
|
void _1943_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
for (int offs = 0; offs <= m_spriteram.bytes(); offs += 32)
|
for (int offs = 0; offs < m_spriteram.bytes(); offs += 32)
|
||||||
{
|
{
|
||||||
const u8 attr = m_spriteram[offs + 1];
|
const u8 attr = m_spriteram[offs + 1];
|
||||||
const u32 code = m_spriteram[offs] + ((attr & 0xe0) << 3);
|
const u32 code = m_spriteram[offs] + ((attr & 0xe0) << 3);
|
||||||
|
Loading…
Reference in New Issue
Block a user