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(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(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(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(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(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(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 */
@ -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(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(0x1f0000, 0x1f0001) AM_DEVWRITE("deco_common", decocomn_device, priority_w)
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(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(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(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(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)
@ -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(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(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 "screen.h"
#include "deco_irq.h"
@ -141,82 +140,77 @@ TIMER_CALLBACK_MEMBER( deco_irq_device::scanline_callback )
// 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)
{
case 1:
return m_raster_irq_scanline;
// 765----- unused?
// ---4---- raster irq target
// ----3--- unused?
// -----2-- unknown
// ------1- raster irq mask
// -------0 unused?
case 2:
m_raster_irq = false;
m_raster1_irq_cb(CLEAR_LINE);
m_raster2_irq_cb(CLEAR_LINE);
return 0xff;
m_raster_irq_target = BIT(data, 4);
m_raster_irq_masked = bool(BIT(data, 1));
case 3:
uint8_t data = 0;
if (m_raster_irq_masked)
raster_irq_ack_r(space, 0);
}
// 7------- unknown
// -6------ lightgun irq
// --5----- raster irq
// ---4---- vblank irq
// ----32-- unknown
// ------1- vblank
// -------0 hblank?
READ8_MEMBER( deco_irq_device::scanline_r )
{
return m_raster_irq_scanline;
}
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;
WRITE8_MEMBER( deco_irq_device::scanline_w )
{
m_raster_irq_scanline = data;
}
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;
}
WRITE8_MEMBER( deco_irq_device::write )
WRITE8_MEMBER( deco_irq_device::vblank_irq_ack_w )
{
switch (offset)
{
case 0:
// 765----- unused?
// ---4---- raster irq target
// ----3--- unused?
// -----2-- unknown
// ------1- raster irq mask
// -------0 unused?
m_vblank_irq = false;
m_vblank_irq_cb(CLEAR_LINE);
}
m_raster_irq_target = BIT(data, 4);
m_raster_irq_masked = bool(BIT(data, 1));
READ8_MEMBER( deco_irq_device::status_r )
{
uint8_t data = 0;
if (m_raster_irq_masked)
{
m_raster_irq = false;
m_raster1_irq_cb(CLEAR_LINE);
m_raster2_irq_cb(CLEAR_LINE);
}
// 7------- unknown
// -6------ lightgun irq
// --5----- raster irq
// ---4---- vblank irq
// ----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:
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);
return data;
}
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_cb(CLEAR_LINE);
}

View File

@ -11,6 +11,8 @@
#pragma once
#include "screen.h"
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
@ -59,7 +61,6 @@ public:
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)); }
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)); }
@ -69,14 +70,19 @@ public:
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)); }
// static configuration
static void set_screen_tag(device_t &device, const char *tag);
TIMER_CALLBACK_MEMBER(scanline_callback);
DECLARE_READ8_MEMBER(read);
DECLARE_WRITE8_MEMBER(write);
DECLARE_ADDRESS_MAP(map, 8);
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(lightgun2_trigger_w);
@ -118,4 +124,5 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(DECO_IRQ, deco_irq_device)
#endif // MAME_MACHINE_DECO_IRQ_H