summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author 0kmg <9137159+0kmg@users.noreply.github.com>2022-01-11 03:45:41 -0900
committer GitHub <noreply@github.com>2022-01-11 07:45:41 -0500
commit4ae94c4b89f591e115a52cb52d2f5daad066e1fa (patch)
tree9901e63be05e644bb46330bd43156ef319c4b184 /src
parenta3410e0b3150aa452562a94bb0ba4644d6ee697c (diff)
bus/nes: Simplified Kay A9711 board and fixed multicart support. (#9133)
Software list items promoted to working (nes.xml) --------------------------------------- Super 3 in 1 (NT-934) [kmg]
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/nes/mmc3_clones.cpp150
-rw-r--r--src/devices/bus/nes/mmc3_clones.h16
2 files changed, 59 insertions, 107 deletions
diff --git a/src/devices/bus/nes/mmc3_clones.cpp b/src/devices/bus/nes/mmc3_clones.cpp
index 8849eb72a84..982314fc575 100644
--- a/src/devices/bus/nes/mmc3_clones.cpp
+++ b/src/devices/bus/nes/mmc3_clones.cpp
@@ -217,7 +217,7 @@ nes_sgboog_device::nes_sgboog_device(const machine_config &mconfig, const char *
{
}
-nes_kay_device::nes_kay_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_kay_device::nes_kay_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_txrom_device(mconfig, NES_KAY, tag, owner, clock), m_low_reg(0)
{
}
@@ -562,9 +562,9 @@ void nes_kay_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- memset(m_reg, 0, sizeof(m_reg));
+ std::fill(std::begin(m_reg), std::end(m_reg), 0x00);
m_low_reg = 0;
- mmc3_common_initialize(0xff, 0xff, 0);
+ mmc3_common_initialize(0x1f, 0xff, 0);
}
@@ -1561,7 +1561,7 @@ void nes_sglionk_device::write_h(offs_t offset, u8 data)
/*-------------------------------------------------
- Bootleg Board by Kay (for Panda Prince)
+ A9711/A9713 Bootleg Boards by Kay (for Panda Prince)
Games: The Panda Prince, Sonic 3d Blast 6, SFZ2 '97, YuYu '97
(and its title hack MK6), UMK3, Super Lion King 2
@@ -1570,137 +1570,89 @@ void nes_sglionk_device::write_h(offs_t offset, u8 data)
iNES: mapper 121
- In MESS: Most game works, with some graphical issues.
+ In MAME: Supported.
+
+ TODO: Most of the fighting games have graphical issues
+ with backgrounds on some stages. Due to common timing
+ issue with PPU/MMC3? Super Lion King 2's title screen
+ is also inexplicably broken.
-------------------------------------------------*/
-void nes_kay_device::write_l(offs_t offset, uint8_t data)
+void nes_kay_device::write_l(offs_t offset, u8 data)
{
LOG_MMC(("kay write_l, offset: %04x, data: %02x\n", offset, data));
- offset += 0x100;
+ offset += 0x100;
if (offset >= 0x1000)
+ m_low_reg = data & 0x03;
+
+ if ((offset & 0x1180) == 0x1180) // only written by Super 3-in-1
{
- switch (data & 0x03)
- {
- case 0x00:
- case 0x01:
- m_low_reg = 0x83;
- break;
- case 0x02:
- m_low_reg = 0x42;
- break;
- case 0x03:
- m_low_reg = 0x00;
- break;
- }
+ m_prg_base = (data & 0x80) >> 2;
+ set_prg(m_prg_base, m_prg_mask);
+ m_chr_base = m_prg_base << 3;
+ set_chr(m_chr_source, m_chr_base, m_chr_mask);
}
}
-uint8_t nes_kay_device::read_l(offs_t offset)
+u8 nes_kay_device::read_l(offs_t offset)
{
LOG_MMC(("kay read_l, offset: %04x\n", offset));
- offset += 0x100;
+ static constexpr u8 prot_table[4] = {0x83, 0x83, 0x42, 0x00};
+
+ offset += 0x100;
if (offset >= 0x1000)
- return m_low_reg;
+ return prot_table[m_low_reg];
else
- return 0xff;
+ return get_open_bus();
}
-void nes_kay_device::update_regs()
+void nes_kay_device::chr_cb(int start, int bank, int source)
{
- switch (m_reg[5] & 0x3f)
- {
- case 0x20:
- case 0x29:
- case 0x2b:
- case 0x3f:
- m_reg[7] = 1;
- m_reg[1] = m_reg[6];
- break;
- case 0x26:
- m_reg[7] = 0;
- m_reg[1] = m_reg[6];
- break;
- case 0x2c:
- m_reg[7] = 1;
- if (m_reg[6])
- m_reg[1] = m_reg[6];
- break;
-
- case 0x28:
- m_reg[7] = 0;
- m_reg[2] = m_reg[6];
- break;
-
- case 0x2a:
- m_reg[7] = 0;
- m_reg[3] = m_reg[6];
- break;
-
- case 0x2f:
- break;
-
- default:
- m_reg[5] = 0;
- break;
- }
+ bank |= (m_latch << 1) & (start << 6) & 0x100;
+ chr1_x(start, bank, source);
}
-void nes_kay_device::prg_cb(int start, int bank)
+void nes_kay_device::set_prg(int prg_base, int prg_mask)
{
- if (m_reg[5] & 0x3f)
+ nes_txrom_device::set_prg(prg_base, prg_mask);
+
+ if (BIT(m_reg[4], 5))
{
- prg8_x(start, bank & 0x3f);
- prg8_ef(m_reg[1]);
- prg8_cd(m_reg[2]);
- prg8_ab(m_reg[3]);
+ prg8_ab(prg_base | m_reg[0]);
+ prg8_cd(prg_base | m_reg[1]);
+ prg8_ef(prg_base | m_reg[2]);
}
- else
- prg8_x(start, bank & 0x3f);
}
-void nes_kay_device::chr_cb(int start, int bank, int source)
-{
- uint8_t chr_page = (m_latch & 0x80) >> 5;
-
- if ((start & 0x04) == chr_page)
- bank |= 0x100;
-
- chr1_x(start, bank, source);
-}
-
-void nes_kay_device::write_h(offs_t offset, uint8_t data)
+void nes_kay_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("kay write_h, offset: %04x, data: %02x\n", offset, data));
+ txrom_write(offset, data);
+
switch (offset & 0x6003)
{
- case 0x0000:
- txrom_write(offset, data);
- set_prg(m_prg_base, m_prg_mask);
- break;
-
case 0x0001:
- m_reg[6] = (BIT(data, 0) << 5) | (BIT(data, 1) << 4) | (BIT(data, 2) << 3)
- | (BIT(data, 3) << 2) | (BIT(data, 4) << 1) | BIT(data, 5);
- if (!m_reg[7])
- update_regs();
- txrom_write(offset, data);
- set_prg(m_prg_base, m_prg_mask);
+ m_reg[3] = bitswap<6>(data, 0, 1, 2, 3, 4, 5);
+ switch (m_reg[4])
+ {
+ case 0x26:
+ case 0x28:
+ case 0x2a:
+ m_reg[(0x2a - m_reg[4]) / 2] = m_reg[3];
+ set_prg(m_prg_base, m_prg_mask);
+ break;
+ }
break;
-
case 0x0003:
- m_reg[5] = data;
- update_regs();
- txrom_write(0x0000, data);
+ m_reg[4] = data & 0x3f;
+ if (BIT(m_reg[4], 5) && m_reg[3])
+ m_reg[2] = m_reg[3];
set_prg(m_prg_base, m_prg_mask);
break;
-
- default:
- txrom_write(offset, data);
- break;
}
}
diff --git a/src/devices/bus/nes/mmc3_clones.h b/src/devices/bus/nes/mmc3_clones.h
index 4d93985b04f..b0d6dfee3bd 100644
--- a/src/devices/bus/nes/mmc3_clones.h
+++ b/src/devices/bus/nes/mmc3_clones.h
@@ -251,12 +251,11 @@ class nes_kay_device : public nes_txrom_device
{
public:
// construction/destruction
- nes_kay_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_kay_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual uint8_t read_l(offs_t offset) override;
- virtual void write_l(offs_t offset, uint8_t data) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
- virtual void prg_cb(int start, int bank) override;
+ virtual u8 read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, u8 data) override;
+ virtual void write_h(offs_t offset, u8 data) override;
virtual void chr_cb(int start, int bank, int source) override;
virtual void pcb_reset() override;
@@ -265,10 +264,11 @@ protected:
// device-level overrides
virtual void device_start() override;
+ virtual void set_prg(int prg_base, int prg_mask) override;
+
private:
- void update_regs();
- uint8_t m_reg[8];
- uint8_t m_low_reg;
+ u8 m_reg[5];
+ u8 m_low_reg;
};