deco_irq: Use a device map, move screen include to header

This commit is contained in:
Dirk Best 2017-09-16 14:42:43 +02:00
parent 3ab7403225
commit f1294ab590
4 changed files with 74 additions and 74 deletions

View File

@ -122,7 +122,7 @@ static ADDRESS_MAP_START( cninja_map, AS_PROGRAM, 16, cninja_state )
AM_RANGE(0x15e000, 0x15e7ff) AM_RAM AM_SHARE("pf4_rowscroll") AM_RANGE(0x15e000, 0x15e7ff) AM_RAM AM_SHARE("pf4_rowscroll")
AM_RANGE(0x184000, 0x187fff) AM_RAM AM_SHARE("ram") AM_RANGE(0x184000, 0x187fff) AM_RAM AM_SHARE("ram")
AM_RANGE(0x190000, 0x190007) AM_DEVREADWRITE8("irq", deco_irq_device, read, write, 0x00ff) AM_RANGE(0x190000, 0x190007) AM_DEVICE8("irq", deco_irq_device, map, 0x00ff)
AM_RANGE(0x19c000, 0x19dfff) AM_RAM_DEVWRITE("deco_common", decocomn_device, nonbuffered_palette_w) AM_SHARE("paletteram") AM_RANGE(0x19c000, 0x19dfff) AM_RAM_DEVWRITE("deco_common", decocomn_device, nonbuffered_palette_w) AM_SHARE("paletteram")
AM_RANGE(0x1a4000, 0x1a47ff) AM_RAM AM_SHARE("spriteram") /* Sprites */ AM_RANGE(0x1a4000, 0x1a47ff) AM_RAM AM_SHARE("spriteram") /* Sprites */
@ -158,7 +158,7 @@ static ADDRESS_MAP_START( cninjabl_map, AS_PROGRAM, 16, cninja_state )
AM_RANGE(0x180000, 0x187fff) AM_RAM // more ram on bootleg? AM_RANGE(0x180000, 0x187fff) AM_RAM // more ram on bootleg?
AM_RANGE(0x190000, 0x190007) AM_DEVREADWRITE8("irq", deco_irq_device, read, write, 0x00ff) AM_RANGE(0x190000, 0x190007) AM_DEVICE8("irq", deco_irq_device, map, 0x00ff)
AM_RANGE(0x19c000, 0x19dfff) AM_RAM_DEVWRITE("deco_common", decocomn_device, nonbuffered_palette_w) AM_SHARE("paletteram") AM_RANGE(0x19c000, 0x19dfff) AM_RAM_DEVWRITE("deco_common", decocomn_device, nonbuffered_palette_w) AM_SHARE("paletteram")
AM_RANGE(0x1b4000, 0x1b4001) AM_DEVWRITE("spriteram", buffered_spriteram16_device, write) /* DMA flag */ AM_RANGE(0x1b4000, 0x1b4001) AM_DEVWRITE("spriteram", buffered_spriteram16_device, write) /* DMA flag */
@ -230,7 +230,7 @@ static ADDRESS_MAP_START( edrandy_map, AS_PROGRAM, 16, cninja_state )
AM_RANGE(0x1a0000, 0x1a3fff) AM_READWRITE(sshangha_protection_region_8_146_r,sshangha_protection_region_8_146_w) AM_RANGE(0x1a0000, 0x1a3fff) AM_READWRITE(sshangha_protection_region_8_146_r,sshangha_protection_region_8_146_w)
AM_RANGE(0x1a4000, 0x1a4007) AM_DEVREADWRITE8("irq", deco_irq_device, read, write, 0x00ff) AM_RANGE(0x1a4000, 0x1a4007) AM_DEVICE8("irq", deco_irq_device, map, 0x00ff)
AM_RANGE(0x1ac000, 0x1ac001) AM_DEVWRITE("spriteram", buffered_spriteram16_device, write) /* DMA flag */ AM_RANGE(0x1ac000, 0x1ac001) AM_DEVWRITE("spriteram", buffered_spriteram16_device, write) /* DMA flag */
AM_RANGE(0x1bc000, 0x1bc7ff) AM_RAM AM_SHARE("spriteram") /* Sprites */ AM_RANGE(0x1bc000, 0x1bc7ff) AM_RAM AM_SHARE("spriteram") /* Sprites */
AM_RANGE(0x1bc800, 0x1bcfff) AM_WRITENOP /* Another bug in game code? Sprite list can overrun. Doesn't seem to mirror */ AM_RANGE(0x1bc800, 0x1bcfff) AM_WRITENOP /* Another bug in game code? Sprite list can overrun. Doesn't seem to mirror */
@ -261,7 +261,7 @@ static ADDRESS_MAP_START( robocop2_map, AS_PROGRAM, 16, cninja_state )
AM_RANGE(0x198000, 0x198001) AM_DEVWRITE("spriteram", buffered_spriteram16_device, write) /* DMA flag */ AM_RANGE(0x198000, 0x198001) AM_DEVWRITE("spriteram", buffered_spriteram16_device, write) /* DMA flag */
AM_RANGE(0x1a8000, 0x1a9fff) AM_RAM_DEVWRITE("deco_common", decocomn_device, nonbuffered_palette_w) AM_SHARE("paletteram") AM_RANGE(0x1a8000, 0x1a9fff) AM_RAM_DEVWRITE("deco_common", decocomn_device, nonbuffered_palette_w) AM_SHARE("paletteram")
AM_RANGE(0x1b0000, 0x1b0007) AM_DEVREADWRITE8("irq", deco_irq_device, read, write, 0x00ff) AM_RANGE(0x1b0000, 0x1b0007) AM_DEVICE8("irq", deco_irq_device, map, 0x00ff)
AM_RANGE(0x1b8000, 0x1bbfff) AM_RAM AM_SHARE("ram") /* Main ram */ AM_RANGE(0x1b8000, 0x1bbfff) AM_RAM AM_SHARE("ram") /* Main ram */
AM_RANGE(0x1f0000, 0x1f0001) AM_DEVWRITE("deco_common", decocomn_device, priority_w) AM_RANGE(0x1f0000, 0x1f0001) AM_DEVWRITE("deco_common", decocomn_device, priority_w)
AM_RANGE(0x1f8000, 0x1f8001) AM_READ_PORT("DSW3") /* Dipswitch #3 */ AM_RANGE(0x1f8000, 0x1f8001) AM_READ_PORT("DSW3") /* Dipswitch #3 */

View File

@ -746,7 +746,7 @@ static ADDRESS_MAP_START( captaven_map, AS_PROGRAM, 32, deco32_state )
AM_RANGE(0x128000, 0x12ffff) AM_READWRITE16(dg_protection_region_0_146_r, dg_protection_region_0_146_w, 0x0000ffff) AM_RANGE(0x128000, 0x12ffff) AM_READWRITE16(dg_protection_region_0_146_r, dg_protection_region_0_146_w, 0x0000ffff)
AM_RANGE(0x130000, 0x131fff) AM_RAM_WRITE(nonbuffered_palette_w) AM_SHARE("paletteram") /* Palette RAM */ AM_RANGE(0x130000, 0x131fff) AM_RAM_WRITE(nonbuffered_palette_w) AM_SHARE("paletteram") /* Palette RAM */
AM_RANGE(0x148000, 0x14800f) AM_DEVREADWRITE8("irq", deco_irq_device, read, write, 0x000000ff) AM_RANGE(0x148000, 0x14800f) AM_DEVICE8("irq", deco_irq_device, map, 0x000000ff)
AM_RANGE(0x160000, 0x167fff) AM_RAM /* Extra work RAM */ AM_RANGE(0x160000, 0x167fff) AM_RAM /* Extra work RAM */
AM_RANGE(0x168000, 0x168003) AM_READ(captaven_soundcpu_r) AM_RANGE(0x168000, 0x168003) AM_READ(captaven_soundcpu_r)
@ -903,7 +903,7 @@ static ADDRESS_MAP_START( dragngun_map, AS_PROGRAM, 32, dragngun_state )
AM_RANGE(0x0120000, 0x0127fff) AM_READWRITE16(dg_protection_region_0_146_r, dg_protection_region_0_146_w, 0x0000ffff) AM_RANGE(0x0120000, 0x0127fff) AM_READWRITE16(dg_protection_region_0_146_r, dg_protection_region_0_146_w, 0x0000ffff)
// AM_RANGE(0x01204c0, 0x01204c3) AM_WRITE(sound_w) // AM_RANGE(0x01204c0, 0x01204c3) AM_WRITE(sound_w)
AM_RANGE(0x0128000, 0x012800f) AM_DEVREADWRITE8("irq", deco_irq_device, read, write, 0x000000ff) AM_RANGE(0x0128000, 0x012800f) AM_DEVICE8("irq", deco_irq_device, map, 0x000000ff)
AM_RANGE(0x0130000, 0x0131fff) AM_RAM_WRITE(buffered_palette_w) AM_SHARE("paletteram") AM_RANGE(0x0130000, 0x0131fff) AM_RAM_WRITE(buffered_palette_w) AM_SHARE("paletteram")
AM_RANGE(0x0138000, 0x0138003) AM_NOP /* Palette dma complete in bit 0x8? ack? return 0 else tight loop */ AM_RANGE(0x0138000, 0x0138003) AM_NOP /* Palette dma complete in bit 0x8? ack? return 0 else tight loop */
AM_RANGE(0x0138008, 0x013800b) AM_WRITE(palette_dma_w) AM_RANGE(0x0138008, 0x013800b) AM_WRITE(palette_dma_w)
@ -965,7 +965,7 @@ static ADDRESS_MAP_START( lockload_map, AS_PROGRAM, 32, dragngun_state )
// AM_RANGE(0x1204c0, 0x1204c3) AM_WRITE(sound_w) // AM_RANGE(0x1204c0, 0x1204c3) AM_WRITE(sound_w)
AM_RANGE(0x120000, 0x127fff) AM_READWRITE16(dg_protection_region_0_146_r, dg_protection_region_0_146_w, 0x0000ffff) AM_RANGE(0x120000, 0x127fff) AM_READWRITE16(dg_protection_region_0_146_r, dg_protection_region_0_146_w, 0x0000ffff)
AM_RANGE(0x128000, 0x12800f) AM_DEVREADWRITE8("irq", deco_irq_device, read, write, 0x000000ff) AM_RANGE(0x128000, 0x12800f) AM_DEVICE8("irq", deco_irq_device, map, 0x000000ff)
AM_RANGE(0x130000, 0x131fff) AM_RAM_WRITE(buffered_palette_w) AM_SHARE("paletteram") AM_RANGE(0x130000, 0x131fff) AM_RAM_WRITE(buffered_palette_w) AM_SHARE("paletteram")
AM_RANGE(0x138000, 0x138003) AM_READONLY AM_WRITENOP //palette dma complete in bit 0x8? ack? return 0 else tight loop AM_RANGE(0x138000, 0x138003) AM_READONLY AM_WRITENOP //palette dma complete in bit 0x8? ack? return 0 else tight loop

View File

@ -10,7 +10,6 @@
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "screen.h"
#include "deco_irq.h" #include "deco_irq.h"
@ -141,82 +140,77 @@ TIMER_CALLBACK_MEMBER( deco_irq_device::scanline_callback )
// INTERFACE // INTERFACE
//************************************************************************** //**************************************************************************
READ8_MEMBER( deco_irq_device::read ) DEVICE_ADDRESS_MAP_START(map, 8, deco_irq_device)
AM_RANGE(0x0, 0x0) AM_WRITE(control_w)
AM_RANGE(0x1, 0x1) AM_READWRITE(scanline_r, scanline_w)
AM_RANGE(0x2, 0x2) AM_READWRITE(raster_irq_ack_r, vblank_irq_ack_w)
AM_RANGE(0x3, 0x3) AM_READ(status_r)
ADDRESS_MAP_END
WRITE8_MEMBER( deco_irq_device::control_w )
{ {
switch (offset) // 765----- unused?
{ // ---4---- raster irq target
case 1: // ----3--- unused?
return m_raster_irq_scanline; // -----2-- unknown
// ------1- raster irq mask
// -------0 unused?
case 2: m_raster_irq_target = BIT(data, 4);
m_raster_irq = false; m_raster_irq_masked = bool(BIT(data, 1));
m_raster1_irq_cb(CLEAR_LINE);
m_raster2_irq_cb(CLEAR_LINE);
return 0xff;
case 3: if (m_raster_irq_masked)
uint8_t data = 0; raster_irq_ack_r(space, 0);
}
// 7------- unknown READ8_MEMBER( deco_irq_device::scanline_r )
// -6------ lightgun irq {
// --5----- raster irq return m_raster_irq_scanline;
// ---4---- vblank irq }
// ----32-- unknown
// ------1- vblank
// -------0 hblank?
data |= 1 << 7; WRITE8_MEMBER( deco_irq_device::scanline_w )
data |= (m_lightgun_irq ? 1 : 0) << 6; {
data |= (m_raster_irq ? 1 : 0) << 5; m_raster_irq_scanline = data;
data |= (m_vblank_irq ? 1 : 0) << 4; }
data |= 0 << 3;
data |= 0 << 2;
data |= m_screen->vblank() << 1;
// data |= (m_screen->hblank() & m_screen->vblank()) << 0;
data |= m_screen->hblank() << 0;
return data; READ8_MEMBER( deco_irq_device::raster_irq_ack_r )
} {
m_raster_irq = false;
m_raster1_irq_cb(CLEAR_LINE);
m_raster2_irq_cb(CLEAR_LINE);
logerror("Read from invalid offset %x\n", offset);
return 0xff; return 0xff;
} }
WRITE8_MEMBER( deco_irq_device::write ) WRITE8_MEMBER( deco_irq_device::vblank_irq_ack_w )
{ {
switch (offset) m_vblank_irq = false;
{ m_vblank_irq_cb(CLEAR_LINE);
case 0: }
// 765----- unused?
// ---4---- raster irq target
// ----3--- unused?
// -----2-- unknown
// ------1- raster irq mask
// -------0 unused?
m_raster_irq_target = BIT(data, 4); READ8_MEMBER( deco_irq_device::status_r )
m_raster_irq_masked = bool(BIT(data, 1)); {
uint8_t data = 0;
if (m_raster_irq_masked) // 7------- unknown
{ // -6------ lightgun irq
m_raster_irq = false; // --5----- raster irq
m_raster1_irq_cb(CLEAR_LINE); // ---4---- vblank irq
m_raster2_irq_cb(CLEAR_LINE); // ----32-- unknown
} // ------1- vblank
// -------0 hblank?
return; data |= 1 << 7;
data |= (m_lightgun_irq ? 1 : 0) << 6;
data |= (m_raster_irq ? 1 : 0) << 5;
data |= (m_vblank_irq ? 1 : 0) << 4;
data |= 0 << 3;
data |= 0 << 2;
data |= m_screen->vblank() << 1;
// data |= (m_screen->hblank() & m_screen->vblank()) << 0;
data |= m_screen->hblank() << 0;
case 1: return data;
m_raster_irq_scanline = data;
return;
case 2:
m_vblank_irq = false;
m_vblank_irq_cb(CLEAR_LINE);
return;
}
logerror("Write %02x to invalid offset %x\n", data, offset);
} }
WRITE_LINE_MEMBER( deco_irq_device::lightgun1_trigger_w ) WRITE_LINE_MEMBER( deco_irq_device::lightgun1_trigger_w )
@ -236,4 +230,3 @@ WRITE_LINE_MEMBER( deco_irq_device::lightgun_irq_ack_w )
m_lightgun_irq = false; m_lightgun_irq = false;
m_lightgun_irq_cb(CLEAR_LINE); m_lightgun_irq_cb(CLEAR_LINE);
} }

View File

@ -11,6 +11,8 @@
#pragma once #pragma once
#include "screen.h"
//************************************************************************** //**************************************************************************
// INTERFACE CONFIGURATION MACROS // INTERFACE CONFIGURATION MACROS
@ -59,7 +61,6 @@ public:
template <class Object> static devcb_base &set_lightgun_irq_callback(device_t &device, Object &&cb) template <class Object> static devcb_base &set_lightgun_irq_callback(device_t &device, Object &&cb)
{ return downcast<deco_irq_device &>(device).m_lightgun_irq_cb.set_callback(std::forward<Object>(cb)); } { return downcast<deco_irq_device &>(device).m_lightgun_irq_cb.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_raster1_irq_callback(device_t &device, Object &&cb) template <class Object> static devcb_base &set_raster1_irq_callback(device_t &device, Object &&cb)
{ return downcast<deco_irq_device &>(device).m_raster1_irq_cb.set_callback(std::forward<Object>(cb)); } { return downcast<deco_irq_device &>(device).m_raster1_irq_cb.set_callback(std::forward<Object>(cb)); }
@ -69,14 +70,19 @@ public:
template <class Object> static devcb_base &set_vblank_irq_callback(device_t &device, Object &&cb) template <class Object> static devcb_base &set_vblank_irq_callback(device_t &device, Object &&cb)
{ return downcast<deco_irq_device &>(device).m_vblank_irq_cb.set_callback(std::forward<Object>(cb)); } { return downcast<deco_irq_device &>(device).m_vblank_irq_cb.set_callback(std::forward<Object>(cb)); }
// static configuration // static configuration
static void set_screen_tag(device_t &device, const char *tag); static void set_screen_tag(device_t &device, const char *tag);
TIMER_CALLBACK_MEMBER(scanline_callback); TIMER_CALLBACK_MEMBER(scanline_callback);
DECLARE_READ8_MEMBER(read); DECLARE_ADDRESS_MAP(map, 8);
DECLARE_WRITE8_MEMBER(write);
DECLARE_WRITE8_MEMBER(control_w);
DECLARE_READ8_MEMBER(scanline_r);
DECLARE_WRITE8_MEMBER(scanline_w);
DECLARE_READ8_MEMBER(raster_irq_ack_r);
DECLARE_WRITE8_MEMBER(vblank_irq_ack_w);
DECLARE_READ8_MEMBER(status_r);
DECLARE_WRITE_LINE_MEMBER(lightgun1_trigger_w); DECLARE_WRITE_LINE_MEMBER(lightgun1_trigger_w);
DECLARE_WRITE_LINE_MEMBER(lightgun2_trigger_w); DECLARE_WRITE_LINE_MEMBER(lightgun2_trigger_w);
@ -118,4 +124,5 @@ private:
// device type definition // device type definition
DECLARE_DEVICE_TYPE(DECO_IRQ, deco_irq_device) DECLARE_DEVICE_TYPE(DECO_IRQ, deco_irq_device)
#endif // MAME_MACHINE_DECO_IRQ_H #endif // MAME_MACHINE_DECO_IRQ_H