summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/nes/irem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/nes/irem.cpp')
-rw-r--r--src/devices/bus/nes/irem.cpp172
1 files changed, 68 insertions, 104 deletions
diff --git a/src/devices/bus/nes/irem.cpp b/src/devices/bus/nes/irem.cpp
index c55cb588506..d7454402b05 100644
--- a/src/devices/bus/nes/irem.cpp
+++ b/src/devices/bus/nes/irem.cpp
@@ -21,12 +21,11 @@
#include "irem.h"
#ifdef NES_PCB_DEBUG
-#define VERBOSE 1
+#define VERBOSE (LOG_GENERAL)
#else
-#define VERBOSE 0
+#define VERBOSE (0)
#endif
-
-#define LOG_MMC(x) do { if (VERBOSE) logerror x; } while (0)
+#include "logmacro.h"
//-------------------------------------------------
@@ -40,38 +39,38 @@ DEFINE_DEVICE_TYPE(NES_G101, nes_g101_device, "nes_g101", "NES Cart
DEFINE_DEVICE_TYPE(NES_H3001, nes_h3001_device, "ns_h3001", "NES Cart Irem H-3001 PCB")
-nes_lrog017_device::nes_lrog017_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_lrog017_device::nes_lrog017_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_LROG017, tag, owner, clock)
{
}
-nes_holydivr_device::nes_holydivr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_holydivr_device::nes_holydivr_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_HOLYDIVR, tag, owner, clock)
{
}
-nes_tam_s1_device::nes_tam_s1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_tam_s1_device::nes_tam_s1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_TAM_S1, tag, owner, clock)
{
}
-nes_g101_device::nes_g101_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_G101, tag, owner, clock), m_latch(0)
+nes_g101_device::nes_g101_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 prg_mask)
+ : nes_nrom_device(mconfig, type, tag, owner, clock), m_latch(0), m_reg(0), m_prg_mask(prg_mask)
{
}
-nes_h3001_device::nes_h3001_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_H3001, tag, owner, clock), m_irq_count(0), m_irq_count_latch(0), m_irq_enable(0), irq_timer(nullptr)
+nes_g101_device::nes_g101_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_g101_device(mconfig, NES_G101, tag, owner, clock, 0x1f)
{
}
+nes_h3001_device::nes_h3001_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_g101_device(mconfig, NES_H3001, tag, owner, clock, 0x3f), m_irq_count(0), m_irq_count_latch(0), m_irq_enable(0), irq_timer(nullptr)
+{
+}
-void nes_lrog017_device::device_start()
-{
- common_start();
-}
void nes_lrog017_device::pcb_reset()
{
@@ -82,52 +81,40 @@ void nes_lrog017_device::pcb_reset()
chr2_6(2, CHRRAM);
}
-void nes_holydivr_device::device_start()
-{
- common_start();
-}
-
void nes_holydivr_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
prg16_89ab(0);
prg16_cdef(m_prg_chunks - 1);
chr8(0, m_chr_source);
}
-void nes_tam_s1_device::device_start()
-{
- common_start();
-}
-
void nes_tam_s1_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
prg16_89ab(m_prg_chunks - 1);
prg16_cdef(0);
- chr8(0, m_chr_source);
}
void nes_g101_device::device_start()
{
common_start();
save_item(NAME(m_latch));
+ save_item(NAME(m_reg));
}
void nes_g101_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
prg16_89ab(0);
prg16_cdef(m_prg_chunks - 1);
chr8(0, m_chr_source);
m_latch = 0;
+ m_reg = 0;
}
void nes_h3001_device::device_start()
{
- common_start();
- irq_timer = timer_alloc(TIMER_IRQ);
+ nes_g101_device::device_start();
+ irq_timer = timer_alloc(FUNC(nes_h3001_device::irq_timer_tick), this);
irq_timer->adjust(attotime::zero, 0, clocks_to_attotime(1));
save_item(NAME(m_irq_enable));
@@ -137,11 +124,7 @@ void nes_h3001_device::device_start()
void nes_h3001_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg16_89ab(0);
- prg16_cdef(m_prg_chunks - 1);
- chr8(0, m_chr_source);
-
+ nes_g101_device::pcb_reset();
m_irq_enable = 0;
m_irq_count = 0;
m_irq_count_latch = 0;
@@ -166,15 +149,15 @@ void nes_h3001_device::pcb_reset()
-------------------------------------------------*/
-void nes_lrog017_device::write_h(offs_t offset, uint8_t data)
+void nes_lrog017_device::write_h(offs_t offset, u8 data)
{
- LOG_MMC(("lrog017 write_h, offset: %04x, data: %02x\n", offset, data));
+ LOG("lrog017 write_h, offset: %04x, data: %02x\n", offset, data);
// this pcb is subject to bus conflict
data = account_bus_conflict(offset, data);
prg32(data);
- chr2_0((data >> 4), CHRROM);
+ chr2_0(data >> 4, CHRROM);
}
/*-------------------------------------------------
@@ -185,9 +168,9 @@ void nes_lrog017_device::write_h(offs_t offset, uint8_t data)
-------------------------------------------------*/
-void nes_holydivr_device::write_h(offs_t offset, uint8_t data)
+void nes_holydivr_device::write_h(offs_t offset, u8 data)
{
- LOG_MMC(("holy diver write_h, offset: %04x, data: %02x\n", offset, data));
+ LOG("holy diver write_h, offset: %04x, data: %02x\n", offset, data);
// this pcb is subject to bus conflict
data = account_bus_conflict(offset, data);
@@ -205,19 +188,16 @@ void nes_holydivr_device::write_h(offs_t offset, uint8_t data)
iNES: mapper 97
- In MESS: Supported.
+ In MAME: Supported.
-------------------------------------------------*/
-void nes_tam_s1_device::write_h(offs_t offset, uint8_t data)
+void nes_tam_s1_device::write_h(offs_t offset, u8 data)
{
- LOG_MMC(("tam s1 write_h, offset: %04x, data: %02x\n", offset, data));
+ LOG("tam s1 write_h, offset: %04x, data: %02x\n", offset, data);
if (offset < 0x4000)
{
- // this pcb is subject to bus conflict
- data = account_bus_conflict(offset, data);
-
set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
prg16_cdef(data);
}
@@ -227,40 +207,41 @@ void nes_tam_s1_device::write_h(offs_t offset, uint8_t data)
Irem G-101 board emulation
- Major League uses hardwired mirroring
+ Major League has hardwired mirroring and PRG mode latch
iNES: mapper 32
-------------------------------------------------*/
-void nes_g101_device::write_h(offs_t offset, uint8_t data)
+void nes_g101_device::set_prg()
{
- LOG_MMC(("g101 write_h, offset: %04x, data: %02x\n", offset, data));
+ prg8_x(0 ^ m_latch, m_reg);
+ prg8_x(2 ^ m_latch, m_prg_mask - 1);
+}
+
+void nes_g101_device::write_h(offs_t offset, u8 data)
+{
+ LOG("g101 write_h, offset: %04x, data: %02x\n", offset, data);
switch (offset & 0x7000)
{
case 0x0000:
- if (m_latch)
- {
- prg8_89(0xfe);
- prg8_cd(data & 0x1f);
- }
- else
- {
- prg8_89(data & 0x1f);
- prg8_cd(0xfe);
- }
+ m_reg = data & m_prg_mask;
+ set_prg();
break;
case 0x1000:
- m_latch = BIT(data, 1);
if (m_pcb_ctrl_mirror)
+ {
+ m_latch = data & 0x02;
+ set_prg();
set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+ }
break;
case 0x2000:
- prg8_ab(data & 0x1f);
+ prg8_ab(data & m_prg_mask);
break;
case 0x3000:
- chr1_x(offset & 0x07, data & 0x7f, CHRROM);
+ chr1_x(offset & 0x07, data, CHRROM);
break;
}
}
@@ -274,77 +255,60 @@ void nes_g101_device::write_h(offs_t offset, uint8_t data)
iNES: mapper 65
- In MESS: Supported.
+ In MAME: Supported.
-------------------------------------------------*/
-
-void nes_h3001_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+TIMER_CALLBACK_MEMBER(nes_h3001_device::irq_timer_tick)
{
- if (id == TIMER_IRQ)
+ if (m_irq_enable)
{
- if (m_irq_enable)
- {
- // 16bit counter, IRQ fired when the counter reaches 0
- // after firing, the counter is *not* reloaded and does not wrap
- if (m_irq_count > 0)
- m_irq_count--;
+ // 16bit counter, IRQ fired when the counter reaches 0
+ // after firing, the counter is *not* reloaded and does not wrap
+ if (m_irq_count)
+ m_irq_count--;
- if (!m_irq_count)
- {
- set_irq_line(ASSERT_LINE);
- m_irq_enable = 0;
- }
+ if (!m_irq_count)
+ {
+ set_irq_line(ASSERT_LINE);
+ m_irq_enable = 0;
}
}
}
-void nes_h3001_device::write_h(offs_t offset, uint8_t data)
+void nes_h3001_device::write_h(offs_t offset, u8 data)
{
- LOG_MMC(("h3001 write_h, offset %04x, data: %02x\n", offset, data));
+ LOG("h3001 write_h, offset %04x, data: %02x\n", offset, data);
- switch (offset & 0x7fff)
+ switch (offset & 0x7007)
{
- case 0x0000:
- prg8_89(data);
+ default:
+ nes_g101_device::write_h(offset, data);
+ break;
+ case 0x1000:
+ m_latch = (data & 0x80) >> 6;
+ set_prg();
break;
-
case 0x1001:
- set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+ set_nt_mirroring(BIT(data, 6) ? PPU_MIRROR_LOW : (BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT));
+ break;
+ case 0x1002:
break;
-
case 0x1003:
m_irq_enable = data & 0x80;
set_irq_line(CLEAR_LINE);
break;
-
case 0x1004:
m_irq_count = m_irq_count_latch;
set_irq_line(CLEAR_LINE);
break;
-
case 0x1005:
m_irq_count_latch = (m_irq_count_latch & 0x00ff) | (data << 8);
break;
-
case 0x1006:
m_irq_count_latch = (m_irq_count_latch & 0xff00) | data;
break;
-
- case 0x2000:
- prg8_ab(data);
- break;
-
- case 0x3000: case 0x3001: case 0x3002: case 0x3003:
- case 0x3004: case 0x3005: case 0x3006: case 0x3007:
- chr1_x(offset & 0x07, data, CHRROM);
- break;
-
- case 0x4000:
- prg8_cd(data);
- break;
-
- default:
+ case 0x1007:
break;
}
}