Merge pull request #1945 from ajrhacker/munchmo_irq

munchmo.cpp: IRQ cleanups (nw)
This commit is contained in:
Vas Crabb 2017-01-09 20:40:10 +11:00 committed by GitHub
commit 210cfad161
3 changed files with 61 additions and 54 deletions

View File

@ -37,45 +37,48 @@ Stephh's notes (based on the game Z80 code and some tests) :
* *
*************************************/ *************************************/
WRITE8_MEMBER(munchmo_state::mnchmobl_nmi_enable_w) WRITE8_MEMBER(munchmo_state::nmi_enable_w)
{ {
m_nmi_enable = data; m_nmi_enable = data;
} }
/* trusted thru schematics, NMI and IRQ triggers at vblank, at the same time (!) */ /* trusted thru schematics, NMI and IRQ triggers at vblank, at the same time (!) */
INTERRUPT_GEN_MEMBER(munchmo_state::mnchmobl_vblank_irq) void munchmo_state::vblank_irq(screen_device &screen, bool vblank_state)
{ {
if (m_nmi_enable) if (vblank_state)
m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); {
if (m_nmi_enable)
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
m_maincpu->set_input_line(0, HOLD_LINE); m_maincpu->set_input_line(0, ASSERT_LINE);
m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
} }
INTERRUPT_GEN_MEMBER(munchmo_state::mnchmobl_sound_irq) IRQ_CALLBACK_MEMBER(munchmo_state::generic_irq_ack)
{ {
device.execute().set_input_line(INPUT_LINE_NMI, ASSERT_LINE); device.execute().set_input_line(0, CLEAR_LINE);
return 0xff;
} }
WRITE8_MEMBER(munchmo_state::mnchmobl_soundlatch_w) WRITE8_MEMBER(munchmo_state::nmi_ack_w)
{ {
m_soundlatch->write(space, 0, data); m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
m_audiocpu->set_input_line(0, HOLD_LINE );
} }
WRITE8_MEMBER(munchmo_state::sound_nmi_ack_w) WRITE8_MEMBER(munchmo_state::sound_nmi_ack_w)
{ {
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
} }
READ8_MEMBER(munchmo_state::munchmo_ay1reset_r) READ8_MEMBER(munchmo_state::ay1reset_r)
{ {
ay8910_device *ay8910 = machine().device<ay8910_device>("ay1"); ay8910_device *ay8910 = machine().device<ay8910_device>("ay1");
ay8910->reset_w(space,0,0); ay8910->reset_w(space,0,0);
return 0; return 0;
} }
READ8_MEMBER(munchmo_state::munchmo_ay2reset_r) READ8_MEMBER(munchmo_state::ay2reset_r)
{ {
ay8910_device *ay8910 = machine().device<ay8910_device>("ay2"); ay8910_device *ay8910 = machine().device<ay8910_device>("ay2");
ay8910->reset_w(space,0,0); ay8910->reset_w(space,0,0);
@ -96,19 +99,20 @@ static ADDRESS_MAP_START( mnchmobl_map, AS_PROGRAM, 8, munchmo_state )
AM_RANGE(0xb800, 0xb8ff) AM_MIRROR(0x0100) AM_RAM AM_SHARE("videoram") AM_RANGE(0xb800, 0xb8ff) AM_MIRROR(0x0100) AM_RAM AM_SHARE("videoram")
AM_RANGE(0xbaba, 0xbaba) AM_WRITENOP /* ? */ AM_RANGE(0xbaba, 0xbaba) AM_WRITENOP /* ? */
AM_RANGE(0xbc00, 0xbc7f) AM_RAM AM_SHARE("status_vram") AM_RANGE(0xbc00, 0xbc7f) AM_RAM AM_SHARE("status_vram")
AM_RANGE(0xbe00, 0xbe00) AM_WRITE(mnchmobl_soundlatch_w) AM_RANGE(0xbe00, 0xbe00) AM_DEVWRITE("soundlatch", generic_latch_8_device, write)
AM_RANGE(0xbe01, 0xbe01) AM_WRITE(mnchmobl_palette_bank_w) AM_RANGE(0xbe01, 0xbe01) AM_WRITE(palette_bank_w)
AM_RANGE(0xbe02, 0xbe02) AM_READ_PORT("DSW1") AM_RANGE(0xbe02, 0xbe02) AM_READ_PORT("DSW1")
AM_RANGE(0xbe03, 0xbe03) AM_READ_PORT("DSW2") AM_RANGE(0xbe03, 0xbe03) AM_READ_PORT("DSW2")
AM_RANGE(0xbe11, 0xbe11) AM_WRITENOP /* ? */ AM_RANGE(0xbe11, 0xbe11) AM_WRITENOP /* ? */
AM_RANGE(0xbe21, 0xbe21) AM_WRITENOP /* ? */ AM_RANGE(0xbe21, 0xbe21) AM_WRITENOP /* ? */
AM_RANGE(0xbe31, 0xbe31) AM_WRITENOP /* ? */ AM_RANGE(0xbe31, 0xbe31) AM_WRITENOP /* ? */
AM_RANGE(0xbe41, 0xbe41) AM_WRITE(mnchmobl_flipscreen_w) AM_RANGE(0xbe41, 0xbe41) AM_WRITE(flipscreen_w)
AM_RANGE(0xbe61, 0xbe61) AM_WRITE(mnchmobl_nmi_enable_w) /* ENI 1-10C */ AM_RANGE(0xbe61, 0xbe61) AM_WRITE(nmi_enable_w) // ENI 1-10C
AM_RANGE(0xbf00, 0xbf07) AM_WRITEONLY AM_SHARE("vreg") /* MY0 1-8C */ AM_RANGE(0xbf00, 0xbf00) AM_WRITE(nmi_ack_w) // CNI 1-8C
AM_RANGE(0xbf01, 0xbf01) AM_READ_PORT("SYSTEM") AM_RANGE(0xbf01, 0xbf01) AM_READ_PORT("SYSTEM")
AM_RANGE(0xbf02, 0xbf02) AM_READ_PORT("P1") AM_RANGE(0xbf02, 0xbf02) AM_READ_PORT("P1")
AM_RANGE(0xbf03, 0xbf03) AM_READ_PORT("P2") AM_RANGE(0xbf03, 0xbf03) AM_READ_PORT("P2")
AM_RANGE(0xbf04, 0xbf07) AM_WRITEONLY AM_SHARE("vreg") // MY0 1-8C
ADDRESS_MAP_END ADDRESS_MAP_END
/* memory map provided thru schematics */ /* memory map provided thru schematics */
@ -119,9 +123,9 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, munchmo_state )
AM_RANGE(0x5000, 0x5fff) AM_DEVWRITE("ay1", ay8910_device, address_w) AM_RANGE(0x5000, 0x5fff) AM_DEVWRITE("ay1", ay8910_device, address_w)
AM_RANGE(0x6000, 0x6fff) AM_DEVWRITE("ay2", ay8910_device, data_w) AM_RANGE(0x6000, 0x6fff) AM_DEVWRITE("ay2", ay8910_device, data_w)
AM_RANGE(0x7000, 0x7fff) AM_DEVWRITE("ay2", ay8910_device, address_w) AM_RANGE(0x7000, 0x7fff) AM_DEVWRITE("ay2", ay8910_device, address_w)
AM_RANGE(0x8000, 0x9fff) AM_READ(munchmo_ay1reset_r) AM_DEVWRITE("ay1", ay8910_device, reset_w) AM_RANGE(0x8000, 0x9fff) AM_READ(ay1reset_r) AM_DEVWRITE("ay1", ay8910_device, reset_w)
AM_RANGE(0xa000, 0xbfff) AM_READ(munchmo_ay2reset_r) AM_DEVWRITE("ay2", ay8910_device, reset_w) AM_RANGE(0xa000, 0xbfff) AM_READ(ay2reset_r) AM_DEVWRITE("ay2", ay8910_device, reset_w)
AM_RANGE(0xc000, 0xdfff) AM_WRITE(sound_nmi_ack_w) AM_RANGE(0xc000, 0xdfff) AM_WRITE(sound_nmi_ack_w) // NCL 1-8H
AM_RANGE(0xe000, 0xe7ff) AM_MIRROR(0x1800) AM_RAM // is mirror ok? AM_RANGE(0xe000, 0xe7ff) AM_MIRROR(0x1800) AM_RAM // is mirror ok?
ADDRESS_MAP_END ADDRESS_MAP_END
@ -320,14 +324,13 @@ void munchmo_state::machine_reset()
static MACHINE_CONFIG_START( mnchmobl, munchmo_state ) static MACHINE_CONFIG_START( mnchmobl, munchmo_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_15MHz/4) /* ? */ MCFG_CPU_ADD("maincpu", Z80, XTAL_15MHz/4) // from pin 13 of XTAL-driven 163
MCFG_CPU_PROGRAM_MAP(mnchmobl_map) MCFG_CPU_PROGRAM_MAP(mnchmobl_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", munchmo_state, mnchmobl_vblank_irq) MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(munchmo_state, generic_irq_ack) // IORQ clears flip-flop at 1-2C
MCFG_CPU_ADD("audiocpu", Z80, XTAL_15MHz/4) /* ? */ MCFG_CPU_ADD("audiocpu", Z80, XTAL_15MHz/8) // from pin 12 of XTAL-driven 163
MCFG_CPU_PROGRAM_MAP(sound_map) MCFG_CPU_PROGRAM_MAP(sound_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", munchmo_state, mnchmobl_sound_irq) MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(munchmo_state, generic_irq_ack) // IORQ clears flip-flop at 1-7H
/* video hardware */ /* video hardware */
MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_ADD("screen", RASTER)
@ -335,7 +338,8 @@ static MACHINE_CONFIG_START( mnchmobl, munchmo_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(256+32+32, 256) MCFG_SCREEN_SIZE(256+32+32, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 255+32+32,0, 255-16) MCFG_SCREEN_VISIBLE_AREA(0, 255+32+32,0, 255-16)
MCFG_SCREEN_UPDATE_DRIVER(munchmo_state, screen_update_mnchmobl) MCFG_SCREEN_UPDATE_DRIVER(munchmo_state, screen_update)
MCFG_SCREEN_VBLANK_DRIVER(munchmo_state, vblank_irq)
MCFG_SCREEN_PALETTE("palette") MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", mnchmobl) MCFG_GFXDECODE_ADD("gfxdecode", "palette", mnchmobl)
@ -346,12 +350,15 @@ static MACHINE_CONFIG_START( mnchmobl, munchmo_state )
MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_GENERIC_LATCH_8_ADD("soundlatch") MCFG_GENERIC_LATCH_8_ADD("soundlatch")
MCFG_GENERIC_LATCH_DATA_PENDING_CB(ASSERTLINE("audiocpu", 0))
/* AY clock speeds confirmed to match known recording */ /* AY clock speeds confirmed to match known recording */
MCFG_SOUND_ADD("ay1", AY8910, XTAL_15MHz/4/2) MCFG_SOUND_ADD("ay1", AY8910, XTAL_15MHz/8)
//MCFG_AY8910_OUTPUT_TYPE(AY8910_SINGLE_OUTPUT)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MCFG_SOUND_ADD("ay2", AY8910, XTAL_15MHz/4/2) MCFG_SOUND_ADD("ay2", AY8910, XTAL_15MHz/8)
//MCFG_AY8910_OUTPUT_TYPE(AY8910_SINGLE_OUTPUT)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MACHINE_CONFIG_END MACHINE_CONFIG_END

View File

@ -26,12 +26,12 @@ public:
m_soundlatch(*this, "soundlatch") { } m_soundlatch(*this, "soundlatch") { }
/* memory pointers */ /* memory pointers */
required_shared_ptr<uint8_t> m_sprite_xpos; required_shared_ptr<u8> m_sprite_xpos;
required_shared_ptr<uint8_t> m_sprite_tile; required_shared_ptr<u8> m_sprite_tile;
required_shared_ptr<uint8_t> m_sprite_attr; required_shared_ptr<u8> m_sprite_attr;
required_shared_ptr<uint8_t> m_videoram; required_shared_ptr<u8> m_videoram;
required_shared_ptr<uint8_t> m_status_vram; required_shared_ptr<u8> m_status_vram;
required_shared_ptr<uint8_t> m_vreg; required_shared_ptr<u8> m_vreg;
/* video-related */ /* video-related */
std::unique_ptr<bitmap_ind16> m_tmpbitmap; std::unique_ptr<bitmap_ind16> m_tmpbitmap;
@ -48,20 +48,20 @@ public:
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch; required_device<generic_latch_8_device> m_soundlatch;
DECLARE_WRITE8_MEMBER(mnchmobl_nmi_enable_w); DECLARE_WRITE8_MEMBER(nmi_enable_w);
DECLARE_WRITE8_MEMBER(mnchmobl_soundlatch_w); DECLARE_WRITE8_MEMBER(nmi_ack_w);
DECLARE_WRITE8_MEMBER(sound_nmi_ack_w); DECLARE_WRITE8_MEMBER(sound_nmi_ack_w);
DECLARE_WRITE8_MEMBER(mnchmobl_palette_bank_w); DECLARE_WRITE8_MEMBER(palette_bank_w);
DECLARE_WRITE8_MEMBER(mnchmobl_flipscreen_w); DECLARE_WRITE8_MEMBER(flipscreen_w);
DECLARE_READ8_MEMBER(munchmo_ay1reset_r); DECLARE_READ8_MEMBER(ay1reset_r);
DECLARE_READ8_MEMBER(munchmo_ay2reset_r); DECLARE_READ8_MEMBER(ay2reset_r);
virtual void machine_start() override; virtual void machine_start() override;
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void video_start() override; virtual void video_start() override;
DECLARE_PALETTE_INIT(munchmo); DECLARE_PALETTE_INIT(munchmo);
uint32_t screen_update_mnchmobl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(mnchmobl_vblank_irq); void vblank_irq(screen_device &screen, bool vblank_state);
INTERRUPT_GEN_MEMBER(mnchmobl_sound_irq); IRQ_CALLBACK_MEMBER(generic_irq_ack);
void draw_status( bitmap_ind16 &bitmap, const rectangle &cliprect ); void draw_status( bitmap_ind16 &bitmap, const rectangle &cliprect );
void draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect ); void draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect );
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ); void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );

View File

@ -6,7 +6,7 @@
PALETTE_INIT_MEMBER(munchmo_state, munchmo) PALETTE_INIT_MEMBER(munchmo_state, munchmo)
{ {
const uint8_t *color_prom = memregion("proms")->base(); const u8 *color_prom = memregion("proms")->base();
int i; int i;
for (i = 0; i < palette.entries(); i++) for (i = 0; i < palette.entries(); i++)
@ -32,12 +32,12 @@ PALETTE_INIT_MEMBER(munchmo_state, munchmo)
} }
} }
WRITE8_MEMBER(munchmo_state::mnchmobl_palette_bank_w) WRITE8_MEMBER(munchmo_state::palette_bank_w)
{ {
m_palette_bank = data & 0x3; m_palette_bank = data & 0x3;
} }
WRITE8_MEMBER(munchmo_state::mnchmobl_flipscreen_w) WRITE8_MEMBER(munchmo_state::flipscreen_w)
{ {
m_flipscreen = data; m_flipscreen = data;
} }
@ -56,7 +56,7 @@ void munchmo_state::draw_status( bitmap_ind16 &bitmap, const rectangle &cliprect
for (row = 0; row < 4; row++) for (row = 0; row < 4; row++)
{ {
int sy, sx = (row & 1) * 8; int sy, sx = (row & 1) * 8;
const uint8_t *source = m_status_vram + (~row & 1) * 32; const u8 *source = m_status_vram + (~row & 1) * 32;
if (row <= 1) if (row <= 1)
{ {
source += 2 * 32; source += 2 * 32;
@ -80,7 +80,7 @@ void munchmo_state::draw_background( bitmap_ind16 &bitmap, const rectangle &clip
ROM B1.2C contains 256 tilemaps defining 4x4 configurations of ROM B1.2C contains 256 tilemaps defining 4x4 configurations of
the tiles in ROM B2.2B the tiles in ROM B2.2B
*/ */
uint8_t *rom = memregion("gfx2")->base(); u8 *rom = memregion("gfx2")->base();
gfx_element *gfx = m_gfxdecode->gfx(1); gfx_element *gfx = m_gfxdecode->gfx(1);
int offs; int offs;
@ -105,7 +105,7 @@ void munchmo_state::draw_background( bitmap_ind16 &bitmap, const rectangle &clip
} }
{ {
int scrollx = -(m_vreg[6] *2 + (m_vreg[7] >> 7)) - 64 - 128 - 16; int scrollx = -(m_vreg[2] *2 + (m_vreg[3] >> 7)) - 64 - 128 - 16;
int scrolly = 0; int scrolly = 0;
copyscrollbitmap(bitmap, *m_tmpbitmap, 1, &scrollx, 1, &scrolly, cliprect); copyscrollbitmap(bitmap, *m_tmpbitmap, 1, &scrollx, 1, &scrolly, cliprect);
@ -114,14 +114,14 @@ void munchmo_state::draw_background( bitmap_ind16 &bitmap, const rectangle &clip
void munchmo_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) void munchmo_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{ {
int scroll = m_vreg[6]; int scroll = m_vreg[2];
int flags = m_vreg[7]; /* XB?????? */ int flags = m_vreg[3]; /* XB?????? */
int xadjust = - 128 - 16 - ((flags & 0x80) ? 1 : 0); int xadjust = - 128 - 16 - ((flags & 0x80) ? 1 : 0);
int bank = (flags & 0x40) ? 1 : 0; int bank = (flags & 0x40) ? 1 : 0;
gfx_element *gfx = m_gfxdecode->gfx(2 + bank); gfx_element *gfx = m_gfxdecode->gfx(2 + bank);
int color_base = m_palette_bank * 4 + 3; int color_base = m_palette_bank * 4 + 3;
int i, j; int i, j;
int firstsprite = m_vreg[4] & 0x3f; int firstsprite = m_vreg[0] & 0x3f;
for (i = firstsprite; i < firstsprite + 0x40; i++) for (i = firstsprite; i < firstsprite + 0x40; i++)
{ {
for (j = 0; j < 8; j++) for (j = 0; j < 8; j++)
@ -146,7 +146,7 @@ void munchmo_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec
} }
} }
uint32_t munchmo_state::screen_update_mnchmobl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) u32 munchmo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
draw_background(bitmap, cliprect); draw_background(bitmap, cliprect);
draw_sprites(bitmap, cliprect); draw_sprites(bitmap, cliprect);