mirror of
https://github.com/holub/mame
synced 2025-07-01 00:09:18 +03:00
deco_irq: Use a device map, move screen include to header
This commit is contained in:
parent
3ab7403225
commit
f1294ab590
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user