diff options
author | Dirk Best <mail@dirk-best.de> | 2017-09-16 14:42:43 +0200 |
---|---|---|
committer | Dirk Best <mail@dirk-best.de> | 2017-09-16 14:43:10 +0200 |
commit | f1294ab5903e6d3a655b0d55ace402328a17d8e2 (patch) | |
tree | 0bddba2b71a4cf16247e2c8c8162768448681efe | |
parent | 3ab7403225aa77d2799b1adf3b93c66dc6c267b6 (diff) |
deco_irq: Use a device map, move screen include to header
-rw-r--r-- | src/mame/drivers/cninja.cpp | 8 | ||||
-rw-r--r-- | src/mame/drivers/deco32.cpp | 6 | ||||
-rw-r--r-- | src/mame/machine/deco_irq.cpp | 131 | ||||
-rw-r--r-- | src/mame/machine/deco_irq.h | 15 |
4 files changed, 80 insertions, 80 deletions
diff --git a/src/mame/drivers/cninja.cpp b/src/mame/drivers/cninja.cpp index 2bbd743b187..6790570ad9a 100644 --- a/src/mame/drivers/cninja.cpp +++ b/src/mame/drivers/cninja.cpp @@ -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 */ diff --git a/src/mame/drivers/deco32.cpp b/src/mame/drivers/deco32.cpp index 88404a9805f..844937b2fce 100644 --- a/src/mame/drivers/deco32.cpp +++ b/src/mame/drivers/deco32.cpp @@ -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 diff --git a/src/mame/machine/deco_irq.cpp b/src/mame/machine/deco_irq.cpp index 3724f493813..b9d04aa2797 100644 --- a/src/mame/machine/deco_irq.cpp +++ b/src/mame/machine/deco_irq.cpp @@ -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; - - case 2: - m_raster_irq = false; - m_raster1_irq_cb(CLEAR_LINE); - m_raster2_irq_cb(CLEAR_LINE); - return 0xff; - - case 3: - uint8_t data = 0; - - // 7------- unknown - // -6------ lightgun irq - // --5----- raster irq - // ---4---- vblank irq - // ----32-- unknown - // ------1- vblank - // -------0 hblank? - - 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; - - return data; - } + // 765----- unused? + // ---4---- raster irq target + // ----3--- unused? + // -----2-- unknown + // ------1- raster irq mask + // -------0 unused? + + m_raster_irq_target = BIT(data, 4); + m_raster_irq_masked = bool(BIT(data, 1)); + + if (m_raster_irq_masked) + raster_irq_ack_r(space, 0); +} - logerror("Read from invalid offset %x\n", offset); - return 0xff; +READ8_MEMBER( deco_irq_device::scanline_r ) +{ + return m_raster_irq_scanline; } -WRITE8_MEMBER( deco_irq_device::write ) +WRITE8_MEMBER( deco_irq_device::scanline_w ) { - switch (offset) - { - 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); - m_raster_irq_masked = bool(BIT(data, 1)); - - if (m_raster_irq_masked) - { - m_raster_irq = false; - m_raster1_irq_cb(CLEAR_LINE); - m_raster2_irq_cb(CLEAR_LINE); - } + m_raster_irq_scanline = data; +} - return; +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); - case 1: - m_raster_irq_scanline = data; - return; + return 0xff; +} - case 2: - m_vblank_irq = false; - m_vblank_irq_cb(CLEAR_LINE); - return; - } +WRITE8_MEMBER( deco_irq_device::vblank_irq_ack_w ) +{ + m_vblank_irq = false; + m_vblank_irq_cb(CLEAR_LINE); +} - logerror("Write %02x to invalid offset %x\n", data, offset); +READ8_MEMBER( deco_irq_device::status_r ) +{ + uint8_t data = 0; + + // 7------- unknown + // -6------ lightgun irq + // --5----- raster irq + // ---4---- vblank irq + // ----32-- unknown + // ------1- vblank + // -------0 hblank? + + 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; + + 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); } - diff --git a/src/mame/machine/deco_irq.h b/src/mame/machine/deco_irq.h index d8b4138a5b4..69a319dba81 100644 --- a/src/mame/machine/deco_irq.h +++ b/src/mame/machine/deco_irq.h @@ -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 |