summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--hash/c64_cass.xml16
-rw-r--r--hash/entex_sag.xml14
-rw-r--r--hash/nes.xml31
-rw-r--r--hash/trs80_cass.xml12
-rw-r--r--scripts/target/mame/mess.lua2
-rw-r--r--src/devices/bus/nes/bootleg.cpp78
-rw-r--r--src/devices/bus/nes/bootleg.h15
-rw-r--r--src/devices/bus/nes/multigame.cpp47
-rw-r--r--src/devices/bus/nes/multigame.h22
-rw-r--r--src/devices/bus/nes/nes_carts.cpp1
-rw-r--r--src/devices/bus/nes/nes_ines.hxx2
-rw-r--r--src/devices/bus/nes/nes_pcb.hxx1
-rw-r--r--src/devices/bus/nes/nes_slot.h2
-rw-r--r--src/devices/cpu/f2mc16/f2mc16.cpp410
-rw-r--r--src/devices/cpu/f2mc16/f2mc16.h6
-rw-r--r--src/devices/cpu/f2mc16/f2mc16d.cpp77
-rw-r--r--src/devices/cpu/f2mc16/mb9061x.cpp20
-rw-r--r--src/devices/cpu/f2mc16/mb9061x.h14
-rw-r--r--src/devices/cpu/tx0/tx0.cpp30
-rw-r--r--src/devices/machine/hp_taco.cpp43
-rw-r--r--src/mame/drivers/apple2.cpp12
-rw-r--r--src/mame/drivers/apple2gs.cpp67
-rw-r--r--src/mame/drivers/apxen.cpp214
-rw-r--r--src/mame/drivers/dpsv55.cpp139
-rw-r--r--src/mame/drivers/hh_hmcs40.cpp136
-rw-r--r--src/mame/drivers/hh_sm510.cpp2
-rw-r--r--src/mame/drivers/hh_tms1k.cpp26
-rw-r--r--src/mame/drivers/megasys1.cpp59
-rw-r--r--src/mame/drivers/neogeo.cpp4
-rw-r--r--src/mame/drivers/pgm.cpp33
-rw-r--r--src/mame/drivers/sag.cpp2
-rw-r--r--src/mame/drivers/segas16b.cpp2
-rw-r--r--src/mame/drivers/system1.cpp232
-rw-r--r--src/mame/includes/system1.h1
-rw-r--r--src/mame/machine/n64.cpp17
-rw-r--r--src/mame/machine/nes.cpp4
-rw-r--r--src/mame/machine/pgmprot_igs027a_type3.cpp16
-rw-r--r--src/mame/machine/pgmprot_igs027a_type3.h1
-rw-r--r--src/mame/mame.lst11
-rw-r--r--src/mame/mess.flt2
-rw-r--r--src/mame/video/apple2.cpp64
-rw-r--r--src/mame/video/gime.cpp11
-rw-r--r--src/mame/video/n64.cpp624
-rw-r--r--src/mame/video/n64.h34
-rw-r--r--src/mame/video/rdptpipe.cpp4
45 files changed, 1992 insertions, 568 deletions
diff --git a/hash/c64_cass.xml b/hash/c64_cass.xml
index 3b24dcb2c5a..52fb9a15250 100644
--- a/hash/c64_cass.xml
+++ b/hash/c64_cass.xml
@@ -39,14 +39,14 @@ Some are based on the C64 Tape Archive at https://archive.org/download/c64tapes/
<part name="cass1" interface="cbm_cass">
<feature name="part_id" value="Side A: Superpipeline 2 / Mutant Monty / Henrys House / Gribblys Day Out / Snooker"/>
<dataarea name="cass" size="1756359">
- <rom name="10_Computer_Hits_2_Tape_A.tap (alt)" size="1756359" crc="a72d0c19" sha1="6cab4ab2a3f491d13670089a9b250249cd3079ed"/>
+ <rom name="10_Computer_Hits_2_Tape_A (alt).tap" size="1756359" crc="a72d0c19" sha1="6cab4ab2a3f491d13670089a9b250249cd3079ed"/>
</dataarea>
</part>
<part name="cass2" interface="cbm_cass">
<feature name="part_id" value="Side B: Mama Llama / Raskel / Aqua Racer / Frenzy / Circus"/>
<dataarea name="cass" size="1767233">
- <rom name="10_Computer_Hits_2_Tape_B.tap (alt)" size="1767233" crc="a4171a8f" sha1="22e60c455e7f764db3b4f632dd49e81f8f5b53f9"/>
+ <rom name="10_Computer_Hits_2_Tape_B (alt).tap" size="1767233" crc="a4171a8f" sha1="22e60c455e7f764db3b4f632dd49e81f8f5b53f9"/>
</dataarea>
</part>
</software>
@@ -227,7 +227,7 @@ Some are based on the C64 Tape Archive at https://archive.org/download/c64tapes/
<part name="cass1" interface="cbm_cass">
<dataarea name="cass" size="217093">
- <rom name="3D_Pool.tap (kixx)" size="217093" crc="3114cd62" sha1="2c77dddf4165f49ca517a6e0908da3815cd46218"/>
+ <rom name="3D_Pool (kixx).tap" size="217093" crc="3114cd62" sha1="2c77dddf4165f49ca517a6e0908da3815cd46218"/>
</dataarea>
</part>
</software>
@@ -344,7 +344,7 @@ Some are based on the C64 Tape Archive at https://archive.org/download/c64tapes/
<part name="cass1" interface="cbm_cass">
<dataarea name="cass" size="557418">
- <rom name="5th_Gear.tap (prism)" size="557418" crc="dd8af099" sha1="795512a880f8812799f4baa674eac1ea6fae52d7"/>
+ <rom name="5th_Gear (prism).tap" size="557418" crc="dd8af099" sha1="795512a880f8812799f4baa674eac1ea6fae52d7"/>
</dataarea>
</part>
</software>
@@ -760,7 +760,7 @@ Some are based on the C64 Tape Archive at https://archive.org/download/c64tapes/
<part name="cass" interface="cbm_cass">
<dataarea name="cass" size="489454">
- <rom name="Alleykat.tap (alt)" size="489454" crc="f8b33ba9" sha1="78392282306e82d5885a6291b1984dbdf0365156"/>
+ <rom name="Alleykat (alt).tap" size="489454" crc="f8b33ba9" sha1="78392282306e82d5885a6291b1984dbdf0365156"/>
</dataarea>
</part>
</software>
@@ -975,14 +975,14 @@ Some are based on the C64 Tape Archive at https://archive.org/download/c64tapes/
<part name="cass1" interface="cbm_cass">
<feature name="part_id" value="Side A"/>
<dataarea name="cass" size="582695">
- <rom name="APB_Side_1.tap (alt)" size="582695" crc="5feeaf42" sha1="adfe6390e092435638cb397d5b080b87c9e24b45"/>
+ <rom name="APB_Side_1 (alt).tap" size="582695" crc="5feeaf42" sha1="adfe6390e092435638cb397d5b080b87c9e24b45"/>
</dataarea>
</part>
<part name="cass2" interface="cbm_cass">
<feature name="part_id" value="Side B"/>
<dataarea name="cass" size="591908">
- <rom name="APB_Side_2.tap (alt)" size="591908" crc="6d6b5ea1" sha1="7cbd62ddb837e401722978c0e9b301e71d9ddecb"/>
+ <rom name="APB_Side_2 (alt).tap" size="591908" crc="6d6b5ea1" sha1="7cbd62ddb837e401722978c0e9b301e71d9ddecb"/>
</dataarea>
</part>
</software>
@@ -1114,7 +1114,7 @@ Some are based on the C64 Tape Archive at https://archive.org/download/c64tapes/
<part name="cass2" interface="cbm_cass">
<dataarea name="cass" size="640955">
- <rom name="Arkanoid_a1.tap (imagine)" size="640955" crc="bf774a67" sha1="a567a77a37f35ac00f38ad9f4511d8706ecd3767"/>
+ <rom name="Arkanoid_a1 (imagine).tap" size="640955" crc="bf774a67" sha1="a567a77a37f35ac00f38ad9f4511d8706ecd3767"/>
</dataarea>
</part>
</software>
diff --git a/hash/entex_sag.xml b/hash/entex_sag.xml
index 91bc0e63e62..abdcae6af64 100644
--- a/hash/entex_sag.xml
+++ b/hash/entex_sag.xml
@@ -5,8 +5,10 @@ license:CC0
-->
<!--
+
Cartridges(MCU+ROM) for Entex Select-A-Game Machine, note that the manual and
label calls one "Select-A-Game Cartridge" and not "Select-A-Game Machine Cartridge"
+
-->
<softwarelist name="entex_sag" description="Select-A-Game cartridges">
@@ -23,6 +25,18 @@ label calls one "Select-A-Game Cartridge" and not "Select-A-Game Machine Cartrid
</part>
</software>
+ <software name="baskb3">
+ <description>Basketball 3</description>
+ <year>1981</year>
+ <publisher>Entex</publisher>
+ <part name="cart" interface="sag_cart">
+ <dataarea name="rom" size="0x2000"> <!-- HD38800 MCU -->
+ <rom name="bask_hd38800a16" offset="0x0000" size="0x1000" crc="ccb3ecb0" sha1="a686bde6f678f2019ff8c971cf65adf92f9b46e1" />
+ <rom offset="0x1e80" size="0x0100" loadflag="continue" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="footb4">
<description>Football 4</description>
<year>1981</year>
diff --git a/hash/nes.xml b/hash/nes.xml
index e96c7850bf6..7569625f75d 100644
--- a/hash/nes.xml
+++ b/hash/nes.xml
@@ -4201,7 +4201,7 @@ license:CC0
</part>
</software>
- <software name="bignfo">
+ <software name="bignfo" supported="no">
<description>Big Nose Freaks Out (USA)</description>
<year>1992</year>
<publisher>Camerica</publisher>
@@ -61302,13 +61302,31 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
<!-- OTHER TAIWANESE ~ CHINESE ~ ASIAN PIRATES-->
+ <software name="2bignose" supported="partial">
+ <description>2 in 1 - Big Nose the Caveman &amp; Big Nose Freaks Out</description>
+ <year>199?</year>
+ <publisher>&lt;pirate&gt;</publisher>
+ <info name="serial" value="BC-019"/>
+ <info name="usage" value="Press reset to switch games."/>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="kn42" />
+ <feature name="mirroring" value="vertical" />
+ <dataarea name="prg" size="524288">
+ <rom name="2-in-1 high standard game (bc-019).prg" size="524288" crc="330623a4" sha1="ad189495ed8b6d60dddcbb970be17174b2389e63" status="baddump" />
+ </dataarea>
+ <!-- 8k VRAM on cartridge -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
<software name="2dkjb" supported="no">
<description>2 in 1 - Donkey Kong &amp; Jungle Book</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="n625092" />
- <feature name="pcb" value="UNL-N625092" /> <!-- Mapper 221 -->
+ <feature name="slot" value="jyc_b" />
+ <feature name="mirroring" value="vertical" />
<dataarea name="chr" size="262144">
<rom name="2-in-1 donkey kong + jungle book (unl).chr" size="262144" crc="52ea0000" sha1="7d437a553c7498e637c231dd1df51e73defc0905" offset="00000" status="baddump" />
</dataarea>
@@ -67208,8 +67226,8 @@ Also notice that VRAM & WRAM are probably incorrect for some of these sets, at t
</part>
</software>
-<!-- Whirlwind Manu has at least two version: LE10 and LF36. This earlier version apparently hangs at the end of world 4-4 on real hardware. -->
- <software name="smb2fdse" cloneof="smb2fds" supported="no">
+<!-- Whirlwind Manu has at least two versions: LE10 and LF36. This earlier version has a broken status bar that scrolls with the game. It also crashes at the end of world 4-4 on real hardware (and in MAME). -->
+ <software name="smb2fdse" cloneof="smb2fds">
<description>Super Mario Bros. 2 (LE10)</description>
<year>19??</year>
<publisher>Whirlwind Manu</publisher>
@@ -78732,6 +78750,7 @@ be better to redump them properly. -->
<description>4 in 1 (Alt 2)</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
+ <info name="usage" value="Press reset to switch games."/>
<part name="cart" interface="nes_cart">
<feature name="slot" value="bmc_reset4" />
<feature name="mirroring" value="vertical" />
@@ -78748,6 +78767,7 @@ be better to redump them properly. -->
<description>4 in 1 (Alt 3)</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
+ <info name="usage" value="Press reset to switch games."/>
<part name="cart" interface="nes_cart">
<feature name="slot" value="bmc_reset4" />
<dataarea name="chr" size="32768">
@@ -80849,6 +80869,7 @@ to check why this is different -->
<description>Reset Based 4 in 1</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
+ <info name="usage" value="Press reset to switch games."/>
<part name="cart" interface="nes_cart">
<feature name="slot" value="bmc_reset4" />
<feature name="pcb" value="BMC-RESETBASED-4IN1" />
diff --git a/hash/trs80_cass.xml b/hash/trs80_cass.xml
index 0af7a3c15f4..8538e929a5b 100644
--- a/hash/trs80_cass.xml
+++ b/hash/trs80_cass.xml
@@ -752,5 +752,17 @@ Note that trs80m4p doesn't physically have a cassette interface, so no tapes can
</dataarea>
</part>
</software>
+ <software name="hoppy">
+ <description>Hoppy</description>
+ <year>1981</year>
+ <publisher>Dubois and McNamara</publisher>
+ <info name="usage" value="(Model 3/4: Answer L at Cass? prompt), Enter, SYSTEM then HG then /" />
+ <sharedfeat name="compatibility" value="1,3,4,H" /><!-- sound only works on [3,4] -->
+ <part name="cass" interface="trs80_cass">
+ <dataarea name="cass" size="0x22c0">
+ <rom name="dandem.cas" size="0x22c0" crc="1698c5f5" sha1="e1fc8e3d72571723a25b51f7495822185a1dab2d"/>
+ </dataarea>
+ </part>
+ </software>
</softwarelist>
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 8262739869d..4ef88975da0 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -1676,6 +1676,7 @@ files {
MAME_DIR .. "src/mame/drivers/apricot.cpp",
MAME_DIR .. "src/mame/drivers/apricotf.cpp",
MAME_DIR .. "src/mame/drivers/apricotp.cpp",
+ MAME_DIR .. "src/mame/drivers/apxen.cpp",
MAME_DIR .. "src/mame/machine/apricotkb.cpp",
MAME_DIR .. "src/mame/machine/apricotkb.h",
MAME_DIR .. "src/mame/drivers/victor9k.cpp",
@@ -3782,6 +3783,7 @@ files {
MAME_DIR .. "src/mame/drivers/betacam.cpp",
MAME_DIR .. "src/mame/drivers/bvm.cpp",
MAME_DIR .. "src/mame/drivers/dfs500.cpp",
+ MAME_DIR .. "src/mame/drivers/dpsv55.cpp",
MAME_DIR .. "src/mame/drivers/pockstat.cpp",
MAME_DIR .. "src/mame/drivers/psx.cpp",
MAME_DIR .. "src/mame/machine/psxcd.cpp",
diff --git a/src/devices/bus/nes/bootleg.cpp b/src/devices/bus/nes/bootleg.cpp
index 29c41d9f6b9..6ec1f747b03 100644
--- a/src/devices/bus/nes/bootleg.cpp
+++ b/src/devices/bus/nes/bootleg.cpp
@@ -117,8 +117,8 @@ nes_0353_device::nes_0353_device(const machine_config &mconfig, const char *tag,
{
}
-nes_09034a_device::nes_09034a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_09034A, tag, owner, clock), m_reg(0)
+nes_09034a_device::nes_09034a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_09034A, tag, owner, clock), m_irq_count(0), m_irq_enable(0), m_reg(0), irq_timer(nullptr)
{
}
@@ -434,6 +434,11 @@ void nes_0353_device::pcb_reset()
void nes_09034a_device::device_start()
{
common_start();
+ irq_timer = timer_alloc(TIMER_IRQ);
+ irq_timer->adjust(attotime::zero, 0, clocks_to_attotime(1));
+
+ save_item(NAME(m_irq_enable));
+ save_item(NAME(m_irq_count));
save_item(NAME(m_reg));
}
@@ -442,6 +447,9 @@ void nes_09034a_device::pcb_reset()
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
prg32(0);
chr8(0, m_chr_source);
+
+ m_irq_enable = 0;
+ m_irq_count = 0;
m_reg = 0;
}
@@ -1304,30 +1312,76 @@ void nes_0353_device::write_h(offs_t offset, u8 data)
(UNL-)09-034A
Games: Zanac FDS conversion with two PRG chips and
- no CHRROM and Volleyball FDS conversion with two PRG
- chips and CHRROM.
- Originally dumps were marked as UNL-SMB2J pcb
+ no CHRROM, and SMB2 and Volleyball FDS conversions
+ with two PRG chips and CHRROM. Originally dumps
+ were marked as UNL-SMB2J PCB.
+
+ Only SMB2 uses the IRQ and it has been documented as
+ being broken on real hardware. Most notably the status
+ bar scrolls with the rest of the screen and the game
+ completely crashes between the "our princess" scene of
+ world 4-4 and the beginning of world 5-1. How the IRQ
+ functions is to be confirmed but it likely uses a 12-bit
+ counter just like the other SMB2 bootlegs. That is how
+ we presently emulate it here.
NES 2.0: mapper 304
- In MAME: Partially supported. Need to emulate IRQ
- (needed by smb2 conversion?)
+ In MAME: Supported.
-------------------------------------------------*/
-void nes_09034a_device::write_ex(offs_t offset, uint8_t data)
+void nes_09034a_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ if (id == TIMER_IRQ)
+ {
+ if (m_irq_enable)
+ {
+ m_irq_count = (m_irq_count + 1) & 0x0fff;
+ if (!m_irq_count)
+ set_irq_line(ASSERT_LINE);
+ }
+ }
+}
+
+void nes_09034a_device::write_ex(offs_t offset, u8 data)
{
LOG_MMC(("09-034a write_ex, offset: %04x, data: %02x\n", offset, data));
- if (offset == 7) // $4027
- m_reg = data & 1;
+ offset += 0x20;
+ switch (offset)
+ {
+ case 0x0027:
+ m_reg = data & 1;
+ break;
+ case 0x0068:
+ m_irq_enable = BIT(data, 0);
+ if (!m_irq_enable)
+ {
+ m_irq_count = 0;
+ set_irq_line(CLEAR_LINE);
+ }
+ break;
+ }
+}
+
+u8 nes_09034a_device::read_ex(offs_t offset)
+{
+ LOG_MMC(("09-034a read_ex, offset: %04x, data: %02x\n", offset));
+
+ offset += 0x20;
+ // SMB2 does not boot with the default open bus reads in this range
+ if (offset >= 0x42 && offset <= 0x55)
+ return 0xff;
+ else
+ return get_open_bus();
}
-uint8_t nes_09034a_device::read_m(offs_t offset)
+u8 nes_09034a_device::read_m(offs_t offset)
{
LOG_MMC(("09-034a read_m, offset: %04x\n", offset));
// in 0x6000-0x7fff is mapped the 2nd PRG chip which starts after 32K (hence the +4)
- return m_prg[((m_reg + 4) * 0x2000) + offset];
+ return m_prg[(((m_reg + 4) * 0x2000) + offset) & (m_prg_size - 1)];
}
/*-------------------------------------------------
diff --git a/src/devices/bus/nes/bootleg.h b/src/devices/bus/nes/bootleg.h
index 2c2bb296204..69ff54bdcb8 100644
--- a/src/devices/bus/nes/bootleg.h
+++ b/src/devices/bus/nes/bootleg.h
@@ -260,19 +260,26 @@ class nes_09034a_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_09034a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_09034a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual void write_ex(offs_t offset, uint8_t data) override;
- virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_ex(offs_t offset, u8 data) override;
+ virtual u8 read_ex(offs_t offset) override;
+ virtual u8 read_m(offs_t offset) override;
virtual void pcb_reset() override;
protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
- uint8_t m_reg;
+ u16 m_irq_count;
+ int m_irq_enable;
+ u8 m_reg;
+
+ static const device_timer_id TIMER_IRQ = 0;
+ emu_timer *irq_timer;
};
diff --git a/src/devices/bus/nes/multigame.cpp b/src/devices/bus/nes/multigame.cpp
index 10952516266..9bfd36078a4 100644
--- a/src/devices/bus/nes/multigame.cpp
+++ b/src/devices/bus/nes/multigame.cpp
@@ -32,6 +32,7 @@ DEFINE_DEVICE_TYPE(NES_ACTION52, nes_action52_device, "nes_action52"
DEFINE_DEVICE_TYPE(NES_CALTRON6IN1, nes_caltron_device, "nes_caltron", "NES Cart Caltron 6 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_RUMBLESTATION, nes_rumblestat_device, "nes_rumblestat", "NES Cart Rumblestation PCB")
DEFINE_DEVICE_TYPE(NES_SVISION16, nes_svision16_device, "nes_svision16", "NES Cart Supervision 16 in 1 PCB")
+DEFINE_DEVICE_TYPE(NES_KN42, nes_kn42_device, "nes_kn42", "NES Cart KN-42 PCB")
DEFINE_DEVICE_TYPE(NES_N625092, nes_n625092_device, "nes_n625092", "NES Cart N625092 PCB")
DEFINE_DEVICE_TYPE(NES_A65AS, nes_a65as_device, "nes_a65as", "NES Cart A65AS PCB")
DEFINE_DEVICE_TYPE(NES_T262, nes_t262_device, "nes_t262", "NES Cart T-262 PCB")
@@ -102,6 +103,11 @@ nes_svision16_device::nes_svision16_device(const machine_config &mconfig, const
{
}
+nes_kn42_device::nes_kn42_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_KN42, tag, owner, clock), m_latch(0)
+{
+}
+
nes_n625092_device::nes_n625092_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_nrom_device(mconfig, NES_N625092, tag, owner, clock), m_latch1(0), m_latch2(0)
{
@@ -406,6 +412,20 @@ void nes_svision16_device::pcb_reset()
m_latch2 = 0;
}
+void nes_kn42_device::device_start()
+{
+ common_start();
+ save_item(NAME(m_latch));
+}
+
+void nes_kn42_device::pcb_reset()
+{
+ m_latch ^= 0x10;
+ prg16_89ab(m_latch);
+ prg16_cdef(m_latch | 0x0f); // fixed to last bank for either game
+ chr8(0, CHRRAM);
+}
+
void nes_n625092_device::device_start()
{
common_start();
@@ -1217,6 +1237,32 @@ void nes_svision16_device::write_h(offs_t offset, uint8_t data)
/*-------------------------------------------------
+ Bootleg Board KN-42
+
+ Games: 2 in 1 - Big Nose & Big Nose Freaks Out
+
+ NES 2.0: mapper 381
+
+ In MAME: Supported.
+
+ TODO: Big Nose Freaks Out has timing issues like
+ many Camerica games. It happens with the singleton
+ dump and is unrelated to the bootleg board here.
+
+ -------------------------------------------------*/
+
+void nes_kn42_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("kn42 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ // this pcb is subject to bus conflict
+ data = account_bus_conflict(offset, data);
+
+ prg16_89ab(m_latch | (data & 0x07) << 1 | BIT(data, 4));
+}
+
+/*-------------------------------------------------
+
Bootleg Board N625092
Games: 400 in 1, 700 in 1, 1000 in 1
@@ -1265,7 +1311,6 @@ void nes_n625092_device::write_h(offs_t offset, uint8_t data)
}
}
-
/*-------------------------------------------------
Board BMC-A65AS
diff --git a/src/devices/bus/nes/multigame.h b/src/devices/bus/nes/multigame.h
index 65a2a756580..258a20fe98f 100644
--- a/src/devices/bus/nes/multigame.h
+++ b/src/devices/bus/nes/multigame.h
@@ -94,6 +94,27 @@ private:
};
+// ======================> nes_kn42_device
+
+class nes_kn42_device : public nes_nrom_device
+{
+public:
+ // construction/destruction
+ nes_kn42_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_h(offs_t offset, u8 data) override;
+
+ virtual void pcb_reset() override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ u8 m_latch;
+};
+
+
// ======================> nes_n625092_device
class nes_n625092_device : public nes_nrom_device
@@ -1018,6 +1039,7 @@ DECLARE_DEVICE_TYPE(NES_ACTION52, nes_action52_device)
DECLARE_DEVICE_TYPE(NES_CALTRON6IN1, nes_caltron_device)
DECLARE_DEVICE_TYPE(NES_RUMBLESTATION, nes_rumblestat_device)
DECLARE_DEVICE_TYPE(NES_SVISION16, nes_svision16_device)
+DECLARE_DEVICE_TYPE(NES_KN42, nes_kn42_device)
DECLARE_DEVICE_TYPE(NES_N625092, nes_n625092_device)
DECLARE_DEVICE_TYPE(NES_A65AS, nes_a65as_device)
DECLARE_DEVICE_TYPE(NES_T262, nes_t262_device)
diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp
index b89085092c8..5f4ea291fa7 100644
--- a/src/devices/bus/nes/nes_carts.cpp
+++ b/src/devices/bus/nes/nes_carts.cpp
@@ -352,6 +352,7 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("maxi15", NES_MAXI15); // mapper 234
device.option_add_internal("rumblestation", NES_RUMBLESTATION); // mapper 46
device.option_add_internal("svision16", NES_SVISION16); // mapper 53
+ device.option_add_internal("kn42", NES_KN42);
device.option_add_internal("n625092", NES_N625092);
device.option_add_internal("a65as", NES_A65AS);
device.option_add_internal("t262", NES_T262);
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index e5841d4796d..9b3d8b1579d 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -415,7 +415,7 @@ static const nes_mmc mmc_list[] =
// 378 8-in-1 multicart, which one?
// 379 35-in-1 multicart, similar to mapper 38
// 380 970630C multicart
- // 381 KN-42 2-in-1 with the Big Nose games
+ { 381, UNL_KN42 }, // 2-in-1 Big Nose games
// 382 830928C 5-in-1 and 9-in-1 multicarts
// 383 JY-014 multicart
// 384 4-in-1 VRC4 clone with Crisis Force
diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx
index affbb607295..11867d11165 100644
--- a/src/devices/bus/nes/nes_pcb.hxx
+++ b/src/devices/bus/nes/nes_pcb.hxx
@@ -237,6 +237,7 @@ static const nes_pcb pcb_list[] =
{ "caltron6in1", CALTRON_6IN1 },
{ "rumblestation", RUMBLESTATION_BOARD }, // mapper 46
{ "svision16", SVISION16_BOARD },
+ { "kn42", UNL_KN42 },
{ "n625092", UNL_N625092 },
{ "a65as", BMC_A65AS },
{ "t262", BMC_T262 },
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index cfb1c510ad7..6e255678279 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -102,7 +102,7 @@ enum
BMC_12IN1, BMC_4IN1RESET, BMC_42IN1RESET,
BMC_CTC09, BMC_K3046, BMC_SA005A, BMC_TJ03,
// Unlicensed
- UNL_8237, UNL_CC21, UNL_AX5705, UNL_KOF97,
+ UNL_8237, UNL_CC21, UNL_AX5705, UNL_KN42, UNL_KOF97,
UNL_N625092, UNL_SC127, UNL_SMB2J, UNL_T230, UNL_MMALEE,
UNL_UXROM, UNL_MK2, UNL_XIAOZY, UNL_KOF96, UNL_FS6,
UNL_SF3, UNL_RACERMATE, UNL_EDU2K,
diff --git a/src/devices/cpu/f2mc16/f2mc16.cpp b/src/devices/cpu/f2mc16/f2mc16.cpp
index dfd6c4fc0a2..d98c95a9fa7 100644
--- a/src/devices/cpu/f2mc16/f2mc16.cpp
+++ b/src/devices/cpu/f2mc16/f2mc16.cpp
@@ -822,8 +822,14 @@ void f2mc16_device::execute_run()
// MOV A, dir
case 0x40:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
- m_tmp32 |= (m_dpr<<8) | (m_dtb<<8);
+ m_tmp32 = read_8((m_pcb<<16) | (m_pc+1)) | (m_dpr<<8);
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp32 |= (m_prefix<<16);
+ }
+ else
+ m_tmp32 |= (m_dtb<<16);
m_tmp8 = read_8(m_tmp32);
m_acc <<= 16;
m_acc |= m_tmp8;
@@ -834,8 +840,14 @@ void f2mc16_device::execute_run()
// MOV dir, A
case 0x41:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
- m_tmp32 |= (m_dpr<<8) | (m_dtb<<8);
+ m_tmp32 = read_8((m_pcb<<16) | (m_pc+1)) | (m_dpr<<8);
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp32 |= (m_prefix<<16);
+ }
+ else
+ m_tmp32 |= (m_dtb<<16);
write_8(m_tmp32, m_acc & 0xff);
setNZ_8(m_acc & 0xff);
m_pc += 2;
@@ -870,7 +882,14 @@ void f2mc16_device::execute_run()
case 0x44:
m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmp32 |= (m_dpr<<8) | (m_dtb<<8);
+ m_tmp32 |= (m_dpr<<8);
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp32 |= (m_prefix<<16);
+ }
+ else
+ m_tmp32 |= (m_dtb<<16);
write_8(m_tmp32, m_tmp8);
m_pc += 3;
m_icount -= 5;
@@ -908,7 +927,14 @@ void f2mc16_device::execute_run()
// MOVW A, dir
case 0x48:
m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
- m_tmp32 |= (m_dpr<<8) | (m_dtb<<8);
+ m_tmp32 |= (m_dpr<<8);
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp32 |= (m_prefix<<16);
+ }
+ else
+ m_tmp32 |= (m_dtb<<16);
m_tmp16 = read_16(m_tmp32);
m_acc <<= 16;
m_acc |= m_tmp16;
@@ -920,7 +946,14 @@ void f2mc16_device::execute_run()
// MOVW dir, A
case 0x49:
m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
- m_tmp32 |= (m_dpr<<8) | (m_dtb<<8);
+ m_tmp32 |= (m_dpr<<8);
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp32 |= (m_prefix<<16);
+ }
+ else
+ m_tmp32 |= (m_dtb<<16);
write_16(m_tmp32, m_acc & 0xffff);
setNZ_16(m_acc & 0xffff);
m_pc += 2;
@@ -988,7 +1021,26 @@ void f2mc16_device::execute_run()
}
break;
- // MOV A, adr16
+ // MOV A, io
+ case 0x50:
+ m_tmp8 = read_8((m_pcb<<16) | (m_pc+1));
+ m_acc <<= 16;
+ m_acc |= read_8(m_tmp8);
+ setNZ_8(m_acc & 0xff);
+ m_pc += 2;
+ m_icount -= 3;
+ break;
+
+ // MOV io, A
+ case 0x51:
+ m_tmp8 = read_8((m_pcb<<16) | (m_pc+1));
+ write_8(m_tmp8, m_acc & 0xff);
+ setNZ_8(m_acc & 0xff);
+ m_pc += 2;
+ m_icount -= 3;
+ break;
+
+ // MOV A, addr16
case 0x52:
m_tmp16 = read_16((m_pcb<<16) | (m_pc+1));
m_acc <<= 16;
@@ -1006,7 +1058,7 @@ void f2mc16_device::execute_run()
m_icount -= 4;
break;
- // MOV adr16, A
+ // MOV addr16, A
case 0x53:
m_tmp16 = read_16((m_pcb<<16) | (m_pc+1));
if (m_prefix_valid)
@@ -1023,11 +1075,48 @@ void f2mc16_device::execute_run()
m_icount -= 4;
break;
+ // MOV io, #imm8
+ case 0x54:
+ m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
+ m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
+ write_8(m_tmp32, m_tmp8);
+ m_pc += 3;
+ m_icount -= 5;
+ break;
+
+ // MOVW io, #imm16
+ case 0x56:
+ m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
+ m_tmp16 = read_16((m_pcb<<16) | (m_pc+2));
+ write_16(m_tmp32, m_tmp16);
+ m_pc += 4;
+ m_icount -= 5;
+ break;
+
case 0x57:
// util::stream_format(stream, "MOVX A, $%04x", opcodes.r16(pc+1));
break;
- // MOVW A, adr16
+ // MOVW A, io
+ case 0x58:
+ m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
+ m_acc <<= 16;
+ m_acc |= read_16(m_tmp32);
+ setNZ_16(m_acc & 0xffff);
+ m_pc += 2;
+ m_icount -= 3;
+ break;
+
+ // MOVW io, A
+ case 0x59:
+ m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
+ write_16(m_tmp32, m_acc & 0xffff);
+ setNZ_16(m_acc & 0xffff);
+ m_pc += 2;
+ m_icount -= 3;
+ break;
+
+ // MOVW A, addr16
case 0x5a:
m_tmp16 = read_16((m_pcb<<16) | (m_pc+1));
m_acc <<= 16;
@@ -1045,7 +1134,7 @@ void f2mc16_device::execute_run()
m_icount -= 4;
break;
- // MOVW adr16, A
+ // MOVW addr16, A
case 0x5b:
m_tmp16 = read_16((m_pcb<<16) | (m_pc+1));
if (m_prefix_valid)
@@ -1112,7 +1201,7 @@ void f2mc16_device::execute_run()
// stream << "JMP @A";
break;
- // JMP #imm16
+ // JMP addr16
case 0x62:
m_pc = read_16((m_pcb<<16) | (m_pc+1));
m_icount -= 3;
@@ -1122,16 +1211,20 @@ void f2mc16_device::execute_run()
// util::stream_format(stream, "JMPP #$%06x", opcodes.r8(pc+3)<<16|opcodes.r8(pc+2)<<8|opcodes.r8(pc+1));
break;
+ // CALL addr16
case 0x64:
- // util::stream_format(stream, "CALL #$%04x", opcodes.r16(pc+1));
+ m_tmp16 = read_16((m_pcb << 16) | (m_pc + 1));
+ push_16(m_pc+3);
+ m_pc = m_tmp16;
+ m_icount -= 6;
break;
- // CALLP #imm24
+ // CALLP addr24
case 0x65:
+ m_tmp16 = read_16((m_pcb << 16) | (m_pc + 1));
+ m_tmp8 = read_8((m_pcb << 16) | (m_pc + 3));
push_16(m_pcb);
push_16(m_pc+4);
- m_tmp8 = read_8((m_pcb << 16) | (m_pc + 3));
- m_tmp16 = read_16((m_pcb << 16) | (m_pc + 1));
m_pcb = m_tmp8;
m_pc = m_tmp16;
m_icount -= 10;
@@ -1144,8 +1237,10 @@ void f2mc16_device::execute_run()
m_icount -= 5;
break;
+ // RET
case 0x67:
- // stream << "RET";
+ m_pc = pull_16();
+ m_icount -= 4;
break;
// RETI
@@ -1617,6 +1712,25 @@ void f2mc16_device::opcodes_str6e(u8 operand)
}
break;
+ // FILSI ADB
+ case 0xc2:
+ if (read_rwX(0) > 0)
+ {
+ u16 al = (m_acc & 0xffff);
+ u16 ah = (m_acc >> 16) & 0xffff;
+ write_8((m_adb<<16) | ah, al & 0xff);
+ ah++;
+ m_acc = (ah<<16) | al;
+ write_rwX(0, read_rwX(0) - 1);
+ m_icount -= 6;
+ }
+ else
+ {
+ m_pc += 2;
+ m_icount -= 6;
+ }
+ break;
+
default:
fatalerror("Unknown F2MC STR6E opcode %02x (PC=%x)\n", operand, (m_pcb<<16) | m_pc);
break;
@@ -1627,27 +1741,136 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
{
switch (operand)
{
- // CLRB adr16, bit
+ // MOVB A, dir:bp
+ case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
+ m_tmp16 = read_8((m_pcb<<16) | (m_pc+2));
+ m_tmp16 |= (m_dpr<<8);
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp8 = read_8((m_prefix<<16) | m_tmp16);
+ }
+ else
+ m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
+ m_acc &= 0xffff0000;
+ if (m_tmp8 & (1 << (operand & 7)))
+ m_acc |= 0xff;
+ setNZ_8(m_acc & 0xff);
+ m_pc += 3;
+ m_icount -= 7;
+ break;
+
+ // MOVB dir:bp, A
+ case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:
+ m_tmp16 = read_8((m_pcb<<16) | (m_pc+2));
+ m_tmp16 |= (m_dpr<<8);
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp8 = read_8((m_prefix<<16) | m_tmp16);
+ if (m_acc & 0xff)
+ m_tmp8 |= (1 << (operand & 7));
+ else
+ m_tmp8 &= ~(1 << (operand & 7));
+ write_8((m_prefix<<16) | m_tmp16, m_tmp8);
+ }
+ else
+ {
+ m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
+ if (m_acc & 0xff)
+ m_tmp8 |= (1 << (operand & 7));
+ else
+ m_tmp8 &= ~(1 << (operand & 7));
+ write_8((m_dtb<<16) | m_tmp16, m_tmp8);
+ }
+ setNZ_8(m_acc & 0xff);
+ m_pc += 3;
+ m_icount -= 7;
+ break;
+
+ // CLRB io:bp
+ case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:
+ m_tmp16 = read_8((m_pcb << 16) | (m_pc + 2));
+ m_tmp8 = read_8(m_tmp16);
+ m_tmp8 &= ~(1 << (operand & 7));
+ write_8(m_tmp16, m_tmp8);
+ m_pc += 3;
+ m_icount -= 7;
+ break;
+
+ // CLRB dir:bp
+ case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f:
+ m_tmp16 = read_8((m_pcb<<16) | (m_pc+2));
+ m_tmp16 |= (m_dpr<<8);
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp8 = read_8((m_prefix<<16) | m_tmp16);
+ m_tmp8 &= ~(1 << (operand & 7));
+ write_8((m_prefix<<16) | m_tmp16, m_tmp8);
+ }
+ else
+ {
+ m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
+ m_tmp8 &= ~(1 << (operand & 7));
+ write_8((m_dtb<<16) | m_tmp16, m_tmp8);
+ }
+ m_pc += 3;
+ m_icount -= 7;
+ break;
+
+ // CLRB addr16:bp
case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f:
m_tmp16 = read_16((m_pcb << 16) | (m_pc + 2));
if (m_prefix_valid)
{
m_prefix_valid = false;
m_tmp8 = read_8((m_prefix<<16) | m_tmp16);
+ m_tmp8 &= ~(1 << (operand & 7));
+ write_8((m_prefix<<16) | m_tmp16, m_tmp8);
+ }
+ else
+ {
+ m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
+ m_tmp8 &= ~(1 << (operand & 7));
+ write_8((m_dtb<<16) | m_tmp16, m_tmp8);
+ }
+ m_pc += 4;
+ m_icount -= 7;
+ break;
+
+ // SETB io:bp
+ case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67:
+ m_tmp16 = read_8((m_pcb << 16) | (m_pc + 2));
+ m_tmp8 = read_8(m_tmp16);
+ m_tmp8 |= (1 << (operand & 7));
+ write_8(m_tmp16, m_tmp8);
+ m_pc += 3;
+ m_icount -= 7;
+ break;
+
+ // SETB dir:bp
+ case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f:
+ m_tmp16 = read_8((m_pcb<<16) | (m_pc+2));
+ m_tmp16 |= (m_dpr<<8);
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp8 = read_8((m_prefix<<16) | m_tmp16);
m_tmp8 |= (1 << (operand & 7));
write_8((m_prefix<<16) | m_tmp16, m_tmp8);
}
else
{
- m_tmp8= read_8((m_dtb<<16) | m_tmp16);
+ m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
m_tmp8 |= (1 << (operand & 7));
write_8((m_dtb<<16) | m_tmp16, m_tmp8);
}
- m_pc += 2;
+ m_pc += 3;
m_icount -= 7;
break;
- // SETB adr16, bit
+ // SETB addr16:bp
case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
m_tmp16 = read_16((m_pcb << 16) | (m_pc + 2));
if (m_prefix_valid)
@@ -1659,19 +1882,41 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
}
else
{
- m_tmp8= read_8((m_dtb<<16) | m_tmp16);
+ m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
m_tmp8 |= (1 << (operand & 7));
write_8((m_dtb<<16) | m_tmp16, m_tmp8);
}
- m_pc += 2;
+ m_pc += 4;
m_icount -= 7;
break;
- // BBC dir8, bit, disp8
+ // BBC io:bp, disp8
+ case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
+ m_tmp32 = read_8((m_pcb<<16) | (m_pc+2));
+ m_tmp8 = read_8((m_pcb << 16) | (m_pc + 3));
+ m_ps &= ~F_Z;
+ m_pc += 4;
+ if (!(read_8(m_tmp32) & (1 << (operand & 7))))
+ {
+ m_ps |= F_Z;
+ m_pc += (s8)m_tmp8;
+ m_icount--;
+ }
+ m_icount -= 6;
+ break;
+
+ // BBC dir:bp, disp8
case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f:
m_tmp32 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmp32 |= (m_dpr<<8) | (m_dtb<<8);
- m_tmp8 = read_8(m_tmp32);
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp32 |= (m_prefix<<16) | (m_dpr<<8);
+ }
+ else
+ {
+ m_tmp32 |= (m_dtb<<16) | (m_dpr<<8);
+ }
m_tmp8 = read_8((m_pcb << 16) | (m_pc + 3));
m_ps &= ~F_Z;
m_pc += 4;
@@ -1684,7 +1929,7 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
m_icount -= 7;
break;
- // BBC adr16, bit, disp8
+ // BBC addr16:bp, disp8
case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
m_tmp16 = read_16((m_pcb << 16) | (m_pc + 2));
m_tmp8 = read_8((m_pcb << 16) | (m_pc + 4));
@@ -1709,7 +1954,52 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
m_icount -= 7;
break;
- // BBS adr16, bit, disp8
+ // BBS io:bp, disp8
+ case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7:
+ m_tmp32 = read_8((m_pcb<<16) | (m_pc+2));
+ m_tmp8 = read_8((m_pcb << 16) | (m_pc + 3));
+ m_ps &= ~F_Z;
+ m_pc += 4;
+ if (read_8(m_tmp32) & (1 << (operand & 7)))
+ {
+ m_pc += (s8)m_tmp8;
+ m_icount--;
+ }
+ else
+ {
+ m_ps |= F_Z;
+ }
+ m_icount -= 6;
+ break;
+
+ // BBS dir:bp, disp8
+ case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
+ m_tmp32 = read_8((m_pcb<<16) | (m_pc+2));
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp32 |= (m_prefix<<16) | (m_dpr<<8);
+ }
+ else
+ {
+ m_tmp32 |= (m_dtb<<16) | (m_dpr<<8);
+ }
+ m_tmp8 = read_8((m_pcb << 16) | (m_pc + 3));
+ m_ps &= ~F_Z;
+ m_pc += 4;
+ if (read_8(m_tmp32) & (1 << (operand & 7)))
+ {
+ m_pc += (s8)m_tmp8;
+ m_icount--;
+ }
+ else
+ {
+ m_ps |= F_Z;
+ }
+ m_icount -= 7;
+ break;
+
+ // BBS addr16:bp, disp8
case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf:
m_tmp16 = read_16((m_pcb << 16) | (m_pc + 2));
m_tmp8 = read_8((m_pcb << 16) | (m_pc + 4));
@@ -1979,6 +2269,45 @@ void f2mc16_device::opcodes_2b6f(u8 operand)
m_pc += 2;
break;
+ // LSR A, R0
+ case 0x2f:
+ m_tmp8 = read_rX(0);
+ if (m_tmp8 == 0)
+ {
+ // docs don't say if N is cleared in this case or not
+ m_ps &= ~(F_C|F_T);
+ m_ps |= F_Z;
+ m_pc += 2;
+ m_icount -= 6;
+ }
+ else
+ {
+ m_tmp16 = m_acc & 0xff;
+ for (u8 count = 0; count < m_tmp8; count++)
+ {
+ // T is set if either carry or T are set beforehand
+ if ((m_ps & F_C) || (m_ps & F_T))
+ {
+ m_ps |= F_T;
+ }
+ // C becomes the previous LSB
+ m_ps &= ~F_C;
+ if (m_tmp16 & 1)
+ {
+ m_ps |= F_C;
+ }
+
+ m_tmp16 >>= 1;
+ setNZ_8(m_tmp16);
+ m_icount -= 5;
+ }
+
+ m_acc &= 0xffffff00;
+ m_acc |= m_tmp16;
+ m_pc += 2;
+ }
+ break;
+
// MOV @RLx + #disp8, A
case 0x30: case 0x32: case 0x34: case 0x36:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
@@ -2158,6 +2487,29 @@ void f2mc16_device::opcodes_ea71(u8 operand)
m_icount -= 7;
break;
+ // INCL addr16
+ case 0x5f:
+ m_tmp32 = read_16((m_pcb<<16) | (m_pc+2));
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ m_tmp32 |= (m_prefix<<16);
+ }
+ else
+ m_tmp32 |= (m_dtb<<16);
+ m_tmp64 = read_32(m_tmp32);
+ m_tmp64++;
+ write_32(m_tmp32, m_tmp64 & 0xffffffff);
+ setNZ_32(m_tmp64 & 0xffffffff);
+ m_ps &= ~F_V;
+ if (m_tmp64 & 0x100000000)
+ {
+ m_ps |= F_V;
+ }
+ m_pc += 4;
+ m_icount -= 7;
+ break;
+
// MOVL A, RLx
case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
m_acc = read_rlX((operand>>1) & 3);
@@ -2186,7 +2538,7 @@ void f2mc16_device::opcodes_ea71(u8 operand)
m_icount -= 4;
break;
- // MOVL A, adr16
+ // MOVL A, addr16
case 0x9f:
m_tmp32 = read_16((m_pcb<<16) | (m_pc+2));
if (m_prefix_valid)
diff --git a/src/devices/cpu/f2mc16/f2mc16.h b/src/devices/cpu/f2mc16/f2mc16.h
index 1afe221d252..10dbc237734 100644
--- a/src/devices/cpu/f2mc16/f2mc16.h
+++ b/src/devices/cpu/f2mc16/f2mc16.h
@@ -322,7 +322,7 @@ private:
inline void doCMP_8(u8 lhs, u8 rhs)
{
u16 tmp16 = lhs - rhs;
- setNZ_16(tmp16 & 0xff);
+ setNZ_8(tmp16 & 0xff);
m_ps &= ~(F_C|F_V);
if (tmp16 & 0x100)
{
@@ -365,7 +365,7 @@ private:
inline u8 doSUB_8(u8 lhs, u8 rhs)
{
u16 tmp16 = lhs - rhs;
- setNZ_16(tmp16 & 0xff);
+ setNZ_8(tmp16 & 0xff);
m_ps &= ~(F_C|F_V);
if (tmp16 & 0x100)
{
@@ -376,7 +376,7 @@ private:
m_ps |= F_V;
}
- return m_tmp16 & 0xff;
+ return tmp16 & 0xff;
}
inline u16 doSUB_16(u16 lhs, u16 rhs)
{
diff --git a/src/devices/cpu/f2mc16/f2mc16d.cpp b/src/devices/cpu/f2mc16/f2mc16d.cpp
index 167ec0832de..705327c9ce4 100644
--- a/src/devices/cpu/f2mc16/f2mc16d.cpp
+++ b/src/devices/cpu/f2mc16/f2mc16d.cpp
@@ -1199,17 +1199,19 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const f
format_imm_signed(stream, s32(s8(opcodes.r8(pc + bytes++))));
break;
- case 0x18:
- util::stream_format(stream, "%-8sA, ", "ADDL");
- format_imm_signed(stream, s32(opcodes.r32(pc + bytes)));
- bytes += 4;
- break;
-
- case 0x19:
- util::stream_format(stream, "%-8sA, ", "SUBL");
- format_imm_signed(stream, s32(opcodes.r32(pc + bytes)));
+ case 0x18: case 0x19:
+ {
+ u32 operand = opcodes.r32(pc + bytes);
+ if (operand == 0x00000001)
+ util::stream_format(stream, "%-8sA", BIT(op, 0) ? "DECL" : "INCL");
+ else
+ {
+ util::stream_format(stream, "%-8sA, ", BIT(op, 0) ? "SUBL" : "ADDL");
+ format_imm_signed(stream, s32(operand));
+ }
bytes += 4;
break;
+ }
case 0x1a:
util::stream_format(stream, "%-8sILM, ", "MOV");
@@ -1222,20 +1224,14 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const f
bytes += 4;
break;
- case 0x20: case 0x30:
+ case 0x20:
util::stream_format(stream, "%-8sA, ", "ADD");
- if (BIT(op, 4))
- format_imm_signed(stream, s32(s8(opcodes.r8(pc + bytes++))));
- else
- format_dir(stream, segm, opcodes.r8(pc + bytes++));
+ format_dir(stream, segm, opcodes.r8(pc + bytes++));
break;
- case 0x21: case 0x31:
+ case 0x21:
util::stream_format(stream, "%-8sA, ", "SUB");
- if (BIT(op, 4))
- format_imm_signed(stream, s32(s8(opcodes.r8(pc + bytes++))));
- else
- format_dir(stream, segm, opcodes.r8(pc + bytes++));
+ format_dir(stream, segm, opcodes.r8(pc + bytes++));
break;
case 0x22:
@@ -1269,24 +1265,12 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const f
util::stream_format(stream, "%-8sA", "MULU");
break;
- case 0x28: case 0x38:
+ case 0x28:
util::stream_format(stream, "%-8sA", "ADDW");
- if (BIT(op, 4))
- {
- stream << ", ";
- format_imm_signed(stream, s32(s16(opcodes.r16(pc + bytes))));
- bytes += 2;
- }
break;
- case 0x29: case 0x39:
+ case 0x29:
util::stream_format(stream, "%-8sA", "SUBW");
- if (BIT(op, 4))
- {
- stream << ", ";
- format_imm_signed(stream, s32(s16(opcodes.r16(pc + bytes))));
- bytes += 2;
- }
break;
case 0x2a:
@@ -1341,6 +1325,19 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const f
util::stream_format(stream, "%-8sA", "MULUW");
break;
+ case 0x30: case 0x31:
+ {
+ u8 operand = opcodes.r8(pc + bytes++);
+ if (operand == 0x01)
+ util::stream_format(stream, "%-8sA", BIT(op, 0) ? "DEC" : "INC");
+ else
+ {
+ util::stream_format(stream, "%-8sA, ", BIT(op, 0) ? "SUB" : "ADD");
+ format_imm_signed(stream, s32(s8(operand)));
+ }
+ break;
+ }
+
case 0x32:
util::stream_format(stream, "%-8sA", "SUBC");
break;
@@ -1364,6 +1361,20 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const f
util::stream_format(stream, "%-8sA", "NOT");
break;
+ case 0x38: case 0x39:
+ {
+ u16 operand = opcodes.r16(pc + bytes);
+ if (operand == 0x0001)
+ util::stream_format(stream, "%-8sA", BIT(op, 0) ? "DECW" : "INCW");
+ else
+ {
+ util::stream_format(stream, "%-8sA, ", BIT(op, 0) ? "SUBW" : "ADDW");
+ format_imm_signed(stream, s32(s16(operand)));
+ }
+ bytes += 2;
+ break;
+ }
+
case 0x3a:
util::stream_format(stream, "%-8sA, ", "CWBNE");
format_imm16(stream, opcodes.r16(pc + bytes));
diff --git a/src/devices/cpu/f2mc16/mb9061x.cpp b/src/devices/cpu/f2mc16/mb9061x.cpp
index 3017633df3b..9a425f7ad95 100644
--- a/src/devices/cpu/f2mc16/mb9061x.cpp
+++ b/src/devices/cpu/f2mc16/mb9061x.cpp
@@ -18,6 +18,7 @@
DEFINE_DEVICE_TYPE(MB90610A, mb90610_device, "mb90610a", "Fujitsu MB90610A")
DEFINE_DEVICE_TYPE(MB90611A, mb90611_device, "mb90611a", "Fujitsu MB90611A")
+DEFINE_DEVICE_TYPE(MB90641A, mb90641_device, "mb90641a", "Fujitsu MB90641A")
//**************************************************************************
// LIVE DEVICE
@@ -420,3 +421,22 @@ mb90611_device::mb90611_device(const machine_config &mconfig, device_type type,
mb9061x_device(mconfig, type, tag, owner, clock, address_map_constructor(FUNC(mb90611_device::mb90611_map), this))
{
}
+
+/* MB90641 - no A/D, extra UART and timers, optional internal ROM */
+void mb90641_device::mb90641_map(address_map &map)
+{
+ map(0x0038, 0x003f).rw(FUNC(mb9061x_device::timer_r), FUNC(mb9061x_device::timer_w));
+ map(0x00a9, 0x00a9).rw(FUNC(mb9061x_device::tbtc_r), FUNC(mb9061x_device::tbtc_w));
+ map(0x00b0, 0x00bf).rw(FUNC(mb9061x_device::intc_r), FUNC(mb9061x_device::intc_w));
+ map(0x0100, 0x08ff).ram(); // 2K of internal RAM
+}
+
+mb90641_device::mb90641_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ mb90641_device(mconfig, MB90641A, tag, owner, clock)
+{
+}
+
+mb90641_device::mb90641_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ mb9061x_device(mconfig, type, tag, owner, clock, address_map_constructor(FUNC(mb90641_device::mb90641_map), this))
+{
+}
diff --git a/src/devices/cpu/f2mc16/mb9061x.h b/src/devices/cpu/f2mc16/mb9061x.h
index 5edb45ace9d..c09bdef1b96 100644
--- a/src/devices/cpu/f2mc16/mb9061x.h
+++ b/src/devices/cpu/f2mc16/mb9061x.h
@@ -15,12 +15,13 @@
// TYPE DEFINITIONS
//**************************************************************************
-// ======================> m5074x_device
+// ======================> mb9061x_device
class mb9061x_device : public f2mc16_device
{
friend class mb90610_device;
friend class mb90611_device;
+ friend class mb90641_device;
public:
const address_space_config m_program_config;
@@ -97,7 +98,18 @@ protected:
mb90611_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
};
+class mb90641_device : public mb9061x_device
+{
+public:
+ mb90641_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ void mb90641_map(address_map &map);
+protected:
+ mb90641_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+};
+
DECLARE_DEVICE_TYPE(MB90610A, mb90610_device)
DECLARE_DEVICE_TYPE(MB90611A, mb90611_device)
+DECLARE_DEVICE_TYPE(MB90641A, mb90641_device)
#endif // MAME_CPU_F2MC16_MB9061X_H
diff --git a/src/devices/cpu/tx0/tx0.cpp b/src/devices/cpu/tx0/tx0.cpp
index 1ad69693168..3f9bdcf2087 100644
--- a/src/devices/cpu/tx0/tx0.cpp
+++ b/src/devices/cpu/tx0/tx0.cpp
@@ -487,10 +487,10 @@ void tx0_64kw_device::execute_instruction_64kw()
/* (0.8) CLR = Clear the right nine digital positions of the AC */
AC &= 0777000;
- if (((MAR & 0030000) >> 12) == 1)
+ if (((MAR & 0030000) >> 12) == 2)
/* (0.8) IOS In-Out Stop = Stop machine so that an In-Out command
(specified by digits 6 7 8 of MAR) may be executed */
- m_ioh = 1;
+ m_ios = 0;
if (((MAR & 0007000) >> 9) != 0)
{
@@ -545,8 +545,6 @@ void tx0_64kw_device::execute_instruction_64kw()
AC = AC + MBR;
AC = (AC + (AC >> 18)) & 0777777; /* propagate carry around */
- if (AC == 0777777) /* check for -0 */
- AC = 0;
break;
case 2: /* TRansfer on Negative */
@@ -579,7 +577,6 @@ void tx0_64kw_device::execute_instruction_64kw()
if ((MAR & 0000003) == 2)
/* (1.3) LMB = Store the contents of the LR in the MBR. */
MBR = LR;
- break;
if (((MAR & 0000600) >> 7) == 1)
/* (1.3) MLR = Store the contents of the MBR (memory buffer
@@ -621,9 +618,6 @@ void tx0_64kw_device::execute_instruction_64kw()
AC = AC + MBR;
AC = (AC + (AC >> 18)) & 0777777; /* propagate carry around */
-
- if (AC == 0777777) /* check for -0 */
- AC = 0;
}
if (((MAR & 0030000) >> 12) == 3)
@@ -639,8 +633,6 @@ void tx0_device::indexed_address_eval()
{
MAR = MAR + XR;
MAR = (MAR + (MAR >> 14)) & 0037777; /* propagate carry around */
- //if (MAR == 0037777) /* check for -0 */
- // MAR = 0;
if (MAR & 0020000) /* fix negative (right???) */
MAR = (MAR + 1) & 0017777;
}
@@ -791,6 +783,7 @@ void tx0_8kw_device::execute_instruction_8kw()
/* (5 is undefined) */
int index = (MAR & 0007000) >> 9;
+ m_ios = 0;
call_io_handler(index);
m_ioh = 1;
}
@@ -837,15 +830,7 @@ void tx0_8kw_device::execute_instruction_8kw()
if (m_cycle)
{ /* cycle 1 */
AC = tx0_read(MAR) + 1;
-
- #if 0
- AC = (AC + (AC >> 18)) & 0777777; /* propagate carry around */
- if (AC == 0777777) /* check for -0 (right???) */
- AC = 0;
- #else
- if (AC >= 0777777)
- AC = (AC + 1) & 0777777;
- #endif
+ AC = (AC + (AC >> 18)) & 0777777; /* propagate carry around */
}
else
{ /* cycle 2 */
@@ -873,8 +858,6 @@ void tx0_8kw_device::execute_instruction_8kw()
AC = AC + MBR;
AC = (AC + (AC >> 18)) & 0777777; /* propagate carry around */
- if (AC == 0777777) /* check for -0 */
- AC = 0;
break;
case 10: /* LoaD indeX */
@@ -888,8 +871,6 @@ void tx0_8kw_device::execute_instruction_8kw()
XR = XR + ((MBR & 0017777) | ((MBR >> 4) & 0020000));
XR = (XR + (XR >> 14)) & 0037777; /* propagate carry around */
- //if (XR == 0037777) /* check for -0 */
- // XR = 0;
break;
case 13: /* Load Lr indeXed */
@@ -1027,9 +1008,6 @@ void tx0_8kw_device::execute_instruction_8kw()
AC = AC + MBR;
AC = (AC + (AC >> 18)) & 0777777; /* propagate carry around */
-
- if (AC == 0777777) /* check for -0 */
- AC = 0;
}
if ((! (MAR & 0000004)) && (MAR & 0000001))
diff --git a/src/devices/machine/hp_taco.cpp b/src/devices/machine/hp_taco.cpp
index 64e1cd9588c..5be1a1ebc9a 100644
--- a/src/devices/machine/hp_taco.cpp
+++ b/src/devices/machine/hp_taco.cpp
@@ -29,7 +29,7 @@
// - Handling of error conditions, R/W bits, tachometer ticks and gaps according to [1]
// What's not in:
// - Commands that are not used at all by the software I analyzed, especially those that
-// R/W tapes in HP9825 format. They could be added easily, though.
+// write tapes in HP9825 format. They could be added easily, though.
// - Accurate execution times of commands
// - Handling of FLG signal: the emulated chip always reports itself as ready for writing.
// - Read threshold is ignored. Real tapes could be read with either a low or high threshold.
@@ -269,10 +269,10 @@ enum cmd_t : uint8_t {
CMD_INT_STOP_N_TACH = 0b111000, // Interrupt and stop on N tach
CMD_INT_STOP_N_TACH1= 0b111001, // Interrupt and stop on N tach (int when stopped)
CMD_RD_6UPD = 0b111010, // Read 6% update
- CMD_RD_9825_6UPD = 0b111011, // Read 9825 6% update (*)
+ CMD_RD_9825_6UPD = 0b111011, // Read 9825 6% update
CMD_INT_N_TACH = 0b111100, // Interrupt on N tach
CMD_RD_CSUM_6UPD = 0b111110, // Read checksum 6% update
- CMD_RD_9825_CSUM6 = 0b111111 // Read checksum 9825 6% update (*)
+ CMD_RD_9825_CSUM6 = 0b111111 // Read checksum 9825 6% update
};
// Device type definition
@@ -469,7 +469,9 @@ WRITE_LINE_MEMBER(hp_taco_device::rd_bit_w)
if (m_cmd_state != CMD_IDLE) {
switch (get_cmd(m_cmd_reg)) {
case CMD_RD_6UPD:
+ case CMD_RD_9825_6UPD:
case CMD_RD_CSUM_6UPD:
+ case CMD_RD_9825_CSUM6:
if (m_cmd_state == CMD_PH1) {
if (m_bit_idx < 8) {
m_bit_idx++;
@@ -477,24 +479,29 @@ WRITE_LINE_MEMBER(hp_taco_device::rd_bit_w)
// Synchronized
LOG_RW("RD synced!\n");
m_cmd_state = CMD_PH2;
- m_bit_idx = 15;
+ m_bit_idx = BIT(m_cmd_reg , CMD_ST_G0) ? 16 : 15;
m_working_reg = 0;
}
} else if (m_cmd_state == CMD_PH2) {
- if (state) {
- BIT_SET(m_working_reg , m_bit_idx);
- }
- if (m_bit_idx) {
+ if (m_bit_idx == 16) {
+ // Skip 17th bit when reading in 9825 format
m_bit_idx--;
} else {
- m_data_reg = m_working_reg;
- m_bit_idx = 15;
- m_working_reg = 0;
- if (!BIT(m_cmd_reg , CMD_ST_G2)) {
- update_checksum(m_data_reg);
+ if (state) {
+ BIT_SET(m_working_reg , m_bit_idx);
+ }
+ if (m_bit_idx) {
+ m_bit_idx--;
+ } else {
+ m_data_reg = m_working_reg;
+ m_bit_idx = BIT(m_cmd_reg , CMD_ST_G0) ? 16 : 15;
+ m_working_reg = 0;
+ if (!BIT(m_cmd_reg , CMD_ST_G2)) {
+ update_checksum(m_data_reg);
+ }
+ LOG_RW("RD word %04x csum=%04x\n" , m_data_reg , m_checksum_reg);
+ irq_w(true);
}
- LOG_RW("RD word %04x csum=%04x\n" , m_data_reg , m_checksum_reg);
- irq_w(true);
}
}
break;
@@ -633,7 +640,9 @@ void hp_taco_device::device_timer(emu_timer &timer, device_timer_id id, int para
break;
case CMD_RD_6UPD:
+ case CMD_RD_9825_6UPD:
case CMD_RD_CSUM_6UPD:
+ case CMD_RD_9825_CSUM6:
// Gap in read error
set_error(false , true);
break;
@@ -900,7 +909,9 @@ void hp_taco_device::cmd_fsm()
break;
case CMD_RD_6UPD:
+ case CMD_RD_9825_6UPD:
case CMD_RD_CSUM_6UPD:
+ case CMD_RD_9825_CSUM6:
if (m_cmd_state == CMD_PH0 && is_at_slow_speed()) {
m_cmd_state = CMD_PH1;
start_rd();
@@ -1078,7 +1089,9 @@ void hp_taco_device::start_cmd_exec(uint16_t new_cmd_reg)
break;
case CMD_RD_6UPD:
+ case CMD_RD_9825_6UPD:
case CMD_RD_CSUM_6UPD:
+ case CMD_RD_9825_CSUM6:
// 1. Wait for tape to reach 22 ips
// 2. Wait for preamble
// 3. Read words
diff --git a/src/mame/drivers/apple2.cpp b/src/mame/drivers/apple2.cpp
index a3866e85930..712ea541113 100644
--- a/src/mame/drivers/apple2.cpp
+++ b/src/mame/drivers/apple2.cpp
@@ -561,11 +561,12 @@ u8 apple2_state::keyb_data_r()
u8 apple2_state::keyb_strobe_r()
{
- // reads any key down, clears strobe
- u8 rv = m_transchar | (m_anykeydown ? 0x80 : 0x00);
+ // reads floating bus, clears strobe
if (!machine().side_effects_disabled())
+ {
m_strobe = 0;
- return rv;
+ }
+ return read_floatingbus();
}
void apple2_state::keyb_strobe_w(u8 data)
@@ -1558,8 +1559,9 @@ ROM_START(prav82)
ROM_END
ROM_START(prav8m)
- ROM_REGION(0x0800,"gfx1",0)
- ROM_LOAD ( "pravetz8m.chr", 0x0000, 0x0800, BAD_DUMP CRC(8c55c984) SHA1(5a5a202000576b88b4ae2e180dd2d1b9b337b594)) // Taken from Agat computer
+ ROM_REGION(0x2000,"gfx1",0)
+ ROM_LOAD("pravetz8m_chr.bin", 0x000000, 0x002000, CRC(72244022) SHA1(4db7544e049bc7aeab4b4da2f8ef9fbeb3ceff24))
+
ROM_REGION(0x4000,"maincpu",0)
ROM_LOAD ( "pravetz8m.d0", 0x1000, 0x0800, CRC(6f05f949) SHA1(0287ebcef2c1ce11dc71be15a99d2d7e0e128b1e))
ROM_LOAD ( "pravetz8m.d8", 0x1800, 0x0800, CRC(654b6f7b) SHA1(f7b1457b48fe6974c4de7e976df3a8fca6b7b661))
diff --git a/src/mame/drivers/apple2gs.cpp b/src/mame/drivers/apple2gs.cpp
index 9297b828f8a..0e1b3022244 100644
--- a/src/mame/drivers/apple2gs.cpp
+++ b/src/mame/drivers/apple2gs.cpp
@@ -510,7 +510,7 @@ private:
bool m_ioudis;
u8 m_shadow, m_speed, m_textcol;
- u8 m_motors_active, m_slotromsel, m_intflag, m_vgcint, m_inten;
+ u8 m_motors_active, m_slotromsel, m_intflag, m_vgcint, m_inten, m_newvideo;
bool m_last_speed;
@@ -1520,6 +1520,7 @@ void apple2gs_state::machine_start()
save_item(NAME(m_accel_temp_slowdown));
save_item(NAME(m_accel_speed));
save_item(NAME(m_motoroff_time));
+ save_item(NAME(m_newvideo));
}
void apple2gs_state::machine_reset()
@@ -1541,6 +1542,7 @@ void apple2gs_state::machine_reset()
m_ramrd = false;
m_ramwrt = false;
m_ioudis = true;
+ m_newvideo = 0x01;
m_clock_frame = 0;
m_mouse_x = 0x00;
m_mouse_y = 0x00;
@@ -1777,8 +1779,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple2gs_state::apple2_interrupt)
if ((m_video->m_newvideo & 0x80) && (scanline >= (BORDER_TOP-1)) && (scanline < (200+BORDER_TOP-1)))
{
u8 scb;
+ const int shrline = scanline - BORDER_TOP + 1;
- scb = m_megaii_ram[0x19d00 + scanline - BORDER_TOP + 1];
+ if (shrline & 1)
+ {
+ scb = m_megaii_ram[0x19e80 + (shrline >> 1)];
+ }
+ else
+ {
+ scb = m_megaii_ram[0x15e80 + (shrline >> 1)];
+ }
if (scb & 0x40)
{
@@ -2476,7 +2486,7 @@ u8 apple2gs_state::c000_r(offs_t offset)
#endif
case 0x29: // NEWVIDEO
- return m_video->m_newvideo;
+ return m_newvideo;
case 0x2d: // SLOTROMSEL
return m_slotromsel;
@@ -2813,7 +2823,7 @@ void apple2gs_state::c000_w(offs_t offset, u8 data)
#endif
case 0x29: // NEWVIDEO
- m_video->m_newvideo = data;
+ m_video->m_newvideo = m_newvideo = data;
break;
case 0x2d: // SLOTROMSEL
@@ -3704,20 +3714,51 @@ u8 apple2gs_state::read_floatingbus()
u8 apple2gs_state::ram0000_r(offs_t offset) { slow_cycle(); return m_megaii_ram[offset]; }
void apple2gs_state::ram0000_w(offs_t offset, u8 data) { slow_cycle(); m_megaii_ram[offset] = data; }
-u8 apple2gs_state::auxram0000_r(offs_t offset) { slow_cycle(); return m_megaii_ram[offset+0x10000]; }
+u8 apple2gs_state::auxram0000_r(offs_t offset)
+{
+ slow_cycle();
+ if ((offset >= 0x2000) && (offset < 0xa000) && ((m_newvideo & 0xc0) != 0))
+ {
+ if (offset & 1)
+ {
+ offset = ((offset - 0x2000) >> 1) + 0x6000;
+ }
+ else
+ {
+ offset = ((offset - 0x2000) >> 1) + 0x2000;
+ }
+ }
+ return m_megaii_ram[offset+0x10000];
+}
+
void apple2gs_state::auxram0000_w(offs_t offset, u8 data)
{
+ u16 orig_addr = offset;
+
slow_cycle();
+
+ if ((offset >= 0x2000) && (offset < 0xa000) && ((m_newvideo & 0xc0) != 0))
+ {
+ if (offset & 1)
+ {
+ offset = ((offset - 0x2000) >> 1) + 0x6000;
+ }
+ else
+ {
+ offset = ((offset - 0x2000) >> 1) + 0x2000;
+ }
+ }
+
m_megaii_ram[offset+0x10000] = data;
- if ((offset >= 0x9e00) && (offset <= 0x9fff))
+ if ((orig_addr >= 0x9e00) && (orig_addr <= 0x9fff))
{
- int color = (offset - 0x9e00) >> 1;
+ int color = (orig_addr - 0x9e00) >> 1;
m_video->m_shr_palette[color] = rgb_t(
- ((m_megaii_ram[0x19E00 + (color * 2) + 1] >> 0) & 0x0F) * 17,
- ((m_megaii_ram[0x19E00 + (color * 2) + 0] >> 4) & 0x0F) * 17,
- ((m_megaii_ram[0x19E00 + (color * 2) + 0] >> 0) & 0x0F) * 17);
+ ((m_megaii_ram[0x19f00 + color] >> 0) & 0x0f) * 17,
+ ((m_megaii_ram[0x15f00 + color] >> 4) & 0x0f) * 17,
+ ((m_megaii_ram[0x15f00 + color] >> 0) & 0x0f) * 17);
}
}
@@ -3895,8 +3936,7 @@ void apple2gs_state::bank1_0000_sh_w(offs_t offset, u8 data)
case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f:
if ((!(m_shadow & SHAD_HIRESPG1) && !(m_shadow & SHAD_AUXHIRES)) || (!(m_shadow & SHAD_SUPERHIRES)))
{
- slow_cycle();
- m_megaii_ram[offset + 0x10000] = data;
+ auxram0000_w(offset, data);
}
break;
@@ -3907,8 +3947,7 @@ void apple2gs_state::bank1_0000_sh_w(offs_t offset, u8 data)
case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f:
if ((!(m_shadow & SHAD_HIRESPG2) && !(m_shadow & SHAD_AUXHIRES)) || (!(m_shadow & SHAD_SUPERHIRES)))
{
- slow_cycle();
- m_megaii_ram[offset + 0x10000] = data;
+ auxram0000_w(offset, data);
}
break;
diff --git a/src/mame/drivers/apxen.cpp b/src/mame/drivers/apxen.cpp
new file mode 100644
index 00000000000..2727a1d1a7d
--- /dev/null
+++ b/src/mame/drivers/apxen.cpp
@@ -0,0 +1,214 @@
+// license: BSD-3-Clause
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ ACT Apricot XEN
+
+ Codename "Candyfloss". The system is not IBM compatible but can run
+ MS-DOS (and Windows) as well as Xenix.
+
+ Models:
+ - XEN FD (512 KB RAM, 2x 720 KB floppy)
+ - XEN HD (1 MB RAM, 1x 720 KB or 1.2 MB floppy, 20M HDD)
+ - XEN WS (1 MB RAM, no drives)
+
+ TODO:
+ - Everything
+
+ Notes:
+ - Two graphics cards: Mono and colour boards
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/i86/i286.h"
+#include "machine/pic8259.h"
+#include "machine/wd_fdc.h"
+#include "machine/z80sio.h"
+#include "video/mc6845.h"
+#include "imagedev/floppy.h"
+#include "formats/apridisk.h"
+#include "emupal.h"
+#include "screen.h"
+
+
+namespace {
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class apxen_state : public driver_device
+{
+public:
+ apxen_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_pic(*this, "pic%u", 0U),
+ m_crtc(*this, "crtc"),
+ m_mono_palette(*this, "mono_palette")
+ { }
+
+ void apxen(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ required_device<i80286_cpu_device> m_maincpu;
+ required_device_array<pic8259_device, 2> m_pic;
+ required_device<hd6845s_device> m_crtc;
+ required_device<palette_device> m_mono_palette;
+
+ void mem_map(address_map &map);
+ void io_map(address_map &map);
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ MC6845_UPDATE_ROW(crtc_update_row);
+
+ uint8_t get_slave_ack(offs_t offset);
+};
+
+
+//**************************************************************************
+// ADDRESS MAPS
+//**************************************************************************
+
+void apxen_state::mem_map(address_map &map)
+{
+ map(0x000000, 0x07ffff).ram();
+ map(0x0f0000, 0x0fffff).rom().region("bios", 0);
+ map(0xff0000, 0xffffff).rom().region("bios", 0);
+}
+
+void apxen_state::io_map(address_map &map)
+{
+ map(0x068, 0x068).w(m_crtc, FUNC(hd6845s_device::address_w));
+ map(0x06a, 0x06a).rw(m_crtc, FUNC(hd6845s_device::register_r), FUNC(hd6845s_device::register_w));
+// map(0xc00, 0xc00) leds
+// map(0xc20, 0xc20) printer
+// map(0xc30, 0xc31) SN76489
+// map(0xc40, 0xc47) CIO
+// map(0xc50, 0xc57) SIO
+// map(0xc60, 0xc6f) MM5827 RTC
+// map(0xc80, 0xc87) FDC
+// map(0xc90, 0xc93) uPD7261 HDC
+ map(0xca0, 0xca3).rw(m_pic[0], FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
+ map(0xca4, 0xca7).rw(m_pic[1], FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
+// map(0xcb0, 0xcb7) PIT
+// map(0xcc0, 0xccd) uPD71071 DMA 1
+// map(0xcd0, 0xcdd) uPD71071 DMA 2
+// map(0xce0, 0xce0) cpu control
+// map(0xcf0, 0xcf0) cpu reset
+}
+
+
+//**************************************************************************
+// INPUT DEFINITIONS
+//**************************************************************************
+
+static INPUT_PORTS_START( apxen )
+INPUT_PORTS_END
+
+
+//**************************************************************************
+// VIDEO EMULATION
+//**************************************************************************
+
+uint32_t apxen_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+MC6845_UPDATE_ROW( apxen_state::crtc_update_row )
+{
+}
+
+
+//**************************************************************************
+// MACHINE EMULATION
+//**************************************************************************
+
+void apxen_state::machine_start()
+{
+}
+
+void apxen_state::machine_reset()
+{
+}
+
+uint8_t apxen_state::get_slave_ack(offs_t offset)
+{
+ if (offset == 2)
+ return m_pic[1]->acknowledge();
+
+ return 0x00;
+}
+
+
+//**************************************************************************
+// MACHINE DEFINTIONS
+//**************************************************************************
+
+void apxen_state::apxen(machine_config &config)
+{
+ I80286(config, m_maincpu, 15_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &apxen_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &apxen_state::io_map);
+ m_maincpu->set_irq_acknowledge_callback(m_pic[0], FUNC(pic8259_device::inta_cb));
+
+ PIC8259(config, m_pic[0], 0);
+ m_pic[0]->out_int_callback().set_inputline(m_maincpu, 0);
+ m_pic[0]->in_sp_callback().set_constant(1);
+ m_pic[0]->read_slave_ack_callback().set(FUNC(apxen_state::get_slave_ack));
+
+ PIC8259(config, m_pic[1], 0);
+ m_pic[1]->out_int_callback().set(m_pic[0], FUNC(pic8259_device::ir2_w));
+ m_pic[1]->in_sp_callback().set_constant(0);
+
+ // video hardware
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_color(rgb_t::green());
+ screen.set_size(800, 400);
+ screen.set_visarea(0, 800-1, 0, 400-1);
+ screen.set_refresh_hz(72);
+ screen.set_screen_update(FUNC(apxen_state::screen_update));
+
+ PALETTE(config, m_mono_palette, palette_device::MONOCHROME_HIGHLIGHT);
+
+ HD6845S(config, m_crtc, 24_MHz_XTAL / 20); // actually MB89321B
+ m_crtc->set_screen("screen");
+ m_crtc->set_show_border_area(false);
+ m_crtc->set_char_width(10);
+ m_crtc->set_update_row_callback(FUNC(apxen_state::crtc_update_row));
+}
+
+
+//**************************************************************************
+// ROM DEFINITIONS
+//**************************************************************************
+
+ROM_START( apxen )
+ ROM_REGION16_LE(0x10000, "bios", 0)
+ // LO-XEN 3.1.3 7143 (checksum matches)
+ ROM_LOAD16_BYTE("lo-xen_313.ic80", 0x0000, 0x8000, CRC(c2a1fd6e) SHA1(8dfc711dd910bc3d43c1120978ba199a13463068))
+ // HI-XEN 3.1.3 9BF0 (checksum matches)
+ ROM_LOAD16_BYTE("hi-xen_313.ic37", 0x0001, 0x8000, CRC(72ee2f09) SHA1(da11043d40a694802f6d3d27a4359067dd19c8e6))
+
+ // should probably be moved elsewhere
+ ROM_REGION(0x2000, "hdd", 0)
+ ROM_LOAD("rodime_ro3055.bin", 0x0000, 0x2000, CRC(61d1544a) SHA1(2177a4c6409c0ee3d3e3e6c659085adf236f8726))
+ROM_END
+
+
+} // anonymous namespace
+
+
+//**************************************************************************
+// SYSTEM DRIVERS
+//**************************************************************************
+
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
+COMP( 1985, apxen, 0, 0, apxen, apxen, apxen_state, empty_init, "ACT", "Apricot XEN", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/dpsv55.cpp b/src/mame/drivers/dpsv55.cpp
new file mode 100644
index 00000000000..4c5ce15a6d4
--- /dev/null
+++ b/src/mame/drivers/dpsv55.cpp
@@ -0,0 +1,139 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/****************************************************************************
+
+ Skeleton driver for Sony DPS-V55/V55M effects processor.
+
+ V55 and V55M are identical except for the power supply (120 V, 60 Hz for
+ the former, 230 V, 50/60 Hz for the latter).
+
+****************************************************************************/
+
+#include "emu.h"
+#include "cpu/f2mc16/mb9061x.h"
+#include "machine/nvram.h"
+#include "video/hd44780.h"
+#include "emupal.h"
+#include "screen.h"
+
+namespace {
+
+class dpsv55_state : public driver_device
+{
+public:
+ dpsv55_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_lcdc(*this, "lcdc")
+ , m_p5(0)
+ {
+ }
+
+ void dpsv55(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ HD44780_PIXEL_UPDATE(pixel_update);
+ u8 p5_r();
+ void p5_w(u8 data);
+
+ void mem_map(address_map &map);
+
+ required_device<cpu_device> m_maincpu;
+ required_device<hd44780_device> m_lcdc;
+
+ u8 m_p5;
+};
+
+void dpsv55_state::machine_start()
+{
+ save_item(NAME(m_p5));
+}
+
+HD44780_PIXEL_UPDATE(dpsv55_state::pixel_update)
+{
+ if (x < 5 && y < 8 && line < 2 && pos >= 4 && pos < 20)
+ bitmap.pix(line * 8 + y, (pos - 4) * 6 + x) = state;
+}
+
+u8 dpsv55_state::p5_r()
+{
+ return m_p5;
+}
+
+void dpsv55_state::p5_w(u8 data)
+{
+ m_lcdc->e_w(BIT(data, 3));
+ m_lcdc->rw_w(BIT(data, 2));
+ m_lcdc->rs_w(BIT(data, 1));
+
+ m_p5 = data;
+}
+
+
+void dpsv55_state::mem_map(address_map &map)
+{
+ map(0x000001, 0x000001).rw(m_lcdc, FUNC(hd44780_device::db_r), FUNC(hd44780_device::db_w));
+ map(0x000005, 0x000005).rw(FUNC(dpsv55_state::p5_r), FUNC(dpsv55_state::p5_w));
+ map(0x000023, 0x000023).nopr();
+ map(0xfc0000, 0xfc7fff).mirror(0x18000).ram().share("nvram"); // CS1
+ map(0xfe0000, 0xffffff).rom().region("eprom", 0); // CS0
+}
+
+
+static INPUT_PORTS_START(dpsv55)
+INPUT_PORTS_END
+
+void dpsv55_state::dpsv55(machine_config &config)
+{
+ MB90641A(config, m_maincpu, 4_MHz_XTAL); // MB90641APF-G-105BND
+ m_maincpu->set_addrmap(AS_PROGRAM, &dpsv55_state::mem_map);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // CY62256LL-70SNC-T2 + 3V lithium battery + M62021FP-600C reset generator + M5239L voltage detector
+
+ // LCD unit (LC0801)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("lcdc", FUNC(hd44780_device::screen_update));
+ screen.set_size(6*16, 8*2);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED);
+
+ HD44780(config, m_lcdc, 0);
+ m_lcdc->set_lcd_size(2, 20);
+ m_lcdc->set_pixel_update_cb(FUNC(dpsv55_state::pixel_update));
+
+ //CXD2707(config, "dsp", 49.152_MHz_XTAL);
+}
+
+/*
+Sony DPS-V55
+
+Version 1.02
+
+Chip: MX 27C1000DC-90
+
+Sticker:
+~~~~~~~~~~~~
+ DPS-V55/M
+ Ver.1.02
+ 759-499074
+~~~~~~~~~~~~
+
+Multi Processor DPS-V55
+Sony Corporation (c)1998
+*/
+
+ROM_START(dpsv55)
+ ROM_REGION(0x20000, "eprom", 0)
+ ROM_LOAD("dps-v55_m__ver.1.02__759-499-74.ic704", 0x00000, 0x20000, CRC(138c2fe0) SHA1(0916ccb1d7567639b382a19240a56274c5c2fa4a))
+ROM_END
+
+} // anonymous namespace
+
+SYST(1998, dpsv55, 0, 0, dpsv55, dpsv55, dpsv55_state, empty_init, "Sony", "DPS-V55 Multi-Effect Processor", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/hh_hmcs40.cpp b/src/mame/drivers/hh_hmcs40.cpp
index ba84e5c9a45..36c7e83331f 100644
--- a/src/mame/drivers/hh_hmcs40.cpp
+++ b/src/mame/drivers/hh_hmcs40.cpp
@@ -19,7 +19,7 @@ known chips:
*A67 HD38750 1982, Romtec Pucki & Monsters (ET-803)
@A04 HD38800 1980, Gakken Heiankyo Alien
- *A16 HD38800 1981, Entex Select-A-Game cartridge: Basketball 3 -> sag.cpp
+ A16 HD38800 1981, Entex Select-A-Game cartridge: Basketball 3 -> sag.cpp
*A20 HD38800 1981, Entex Super Space Invader 2
@A25 HD38800 1981, Coleco Alien Attack
@A27 HD38800 1981, Bandai Packri Monster
@@ -51,7 +51,7 @@ known chips:
@A23 HD38820 1981, Entex Pac Man 2
@A28 HD38820 1981, Coleco Pac-Man (ver 1)
@A29 HD38820 1981, Coleco Pac-Man (ver 2)
- *A32 HD38820 198?, Gakken Super Cobra
+ @A32 HD38820 1982, Gakken Super Cobra
*A38 HD38820 1982, Entex Crazy Climber
@A42 HD38820 1982, Entex Stargate
@A43 HD38820 1982, Entex Turtles
@@ -113,7 +113,7 @@ TODO:
games may manipulate VFD plate brightness by strobing it longer/shorter,
eg. cgalaxn when a ship explodes.
- bzaxxon 3D effect is difficult to simulate
-- improve/redo SVGs of: bzaxxon, bpengo, bbtime
+- improve/redo SVGs of: bzaxxon, bpengo, bbtime, gscobra
***************************************************************************/
@@ -139,7 +139,7 @@ TODO:
#include "msthawk.lh"
#include "packmon.lh"
-//#include "hh_hmcs40_test.lh" // common test-layout - no svg artwork(yet), use external artwork
+#include "hh_hmcs40_test.lh" // common test-layout - no svg artwork(yet), use external artwork
class hh_hmcs40_state : public driver_device
@@ -3406,6 +3406,133 @@ ROM_END
/***************************************************************************
+ Gakken Super Cobra
+ * PCB label SUPER COBRA 3000N
+ * Hitachi QFP HD38820A32 MCU
+ * cyan/red/green VFD display
+
+ There are 2 versions, a green one and a white one. They are assumed to have
+ the same MCU, the VFD has color differences though.
+
+***************************************************************************/
+
+class gscobra_state : public hh_hmcs40_state
+{
+public:
+ gscobra_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
+ { }
+
+ void plate_w(offs_t offset, u8 data);
+ void grid_w(u16 data);
+
+ void update_int0();
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); }
+ void gscobra(machine_config &config);
+};
+
+// handlers
+
+void gscobra_state::plate_w(offs_t offset, u8 data)
+{
+ // R0x-R6x(,D1-D3): vfd plate
+ int shift = offset * 4;
+ m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
+
+ // update display
+ m_display->matrix(m_grid, m_plate);
+}
+
+void gscobra_state::grid_w(u16 data)
+{
+ // D0: speaker out
+ m_speaker->level_w(data & 1);
+
+ // D10-D15: input mux
+ u8 inp_mux = data >> 10 & 0x3f;
+ if (inp_mux != m_inp_mux)
+ {
+ m_inp_mux = inp_mux;
+ update_int0();
+ }
+
+ // D4-D15: vfd grid
+ m_grid = data >> 4 & 0xfff;
+
+ // D1-D3: more plates (update display there)
+ plate_w(7, data >> 1 & 7);
+}
+
+void gscobra_state::update_int0()
+{
+ // INT0 on multiplexed inputs
+ set_interrupt(0, read_inputs(6));
+}
+
+// config
+
+static INPUT_PORTS_START( gscobra )
+ PORT_START("IN.0") // D10 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0)
+
+ PORT_START("IN.1") // D11 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0)
+
+ PORT_START("IN.2") // D12 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0)
+
+ PORT_START("IN.3") // D13 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0)
+
+ PORT_START("IN.4") // D14 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0)
+
+ PORT_START("IN.5") // D15 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0)
+INPUT_PORTS_END
+
+void gscobra_state::gscobra(machine_config &config)
+{
+ /* basic machine hardware */
+ HD38820(config, m_maincpu, 400000); // approximation
+ m_maincpu->write_r<0>().set(FUNC(gscobra_state::plate_w));
+ m_maincpu->write_r<1>().set(FUNC(gscobra_state::plate_w));
+ m_maincpu->write_r<2>().set(FUNC(gscobra_state::plate_w));
+ m_maincpu->write_r<3>().set(FUNC(gscobra_state::plate_w));
+ m_maincpu->write_r<4>().set(FUNC(gscobra_state::plate_w));
+ m_maincpu->write_r<5>().set(FUNC(gscobra_state::plate_w));
+ m_maincpu->write_r<6>().set(FUNC(gscobra_state::plate_w));
+ m_maincpu->write_d().set(FUNC(gscobra_state::grid_w));
+
+ /* video hardware */
+ //screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ //screen.set_refresh_hz(60);
+ config.set_default_layout(layout_hh_hmcs40_test);
+
+ PWM_DISPLAY(config, m_display).set_size(12, 31);
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( gscobra )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a32", 0x0000, 0x1000, CRC(7bbd130f) SHA1(91dd280e4108fad7ba99191355364bd3217b9d17) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 100000, "screen", 0)
+ ROM_LOAD( "gscobra.svg", 0, 100000, NO_DUMP )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
Gakken Dig Dug (manufactured in Japan)
* PCB label Gakken DIG-DAG KS-004283(A/B)
* Hitachi QFP HD38820A69 MCU
@@ -4338,6 +4465,7 @@ CONS( 1982, estargte, 0, 0, estargte, estargte, estargte_state, empty_in
CONS( 1980, ghalien, 0, 0, ghalien, ghalien, ghalien_state, empty_init, "Gakken", "Heiankyo Alien (Gakken)", MACHINE_SUPPORTS_SAVE )
CONS( 1982, gckong, 0, 0, gckong, gckong, gckong_state, empty_init, "Gakken", "Crazy Kong (Gakken)", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, gscobra, 0, 0, gscobra, gscobra, gscobra_state, empty_init, "Gakken", "Super Cobra (Gakken, green version)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
CONS( 1983, gdigdug, 0, 0, gdigdug, gdigdug, gdigdug_state, empty_init, "Gakken", "Dig Dug (Gakken)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, mwcbaseb, 0, 0, mwcbaseb, mwcbaseb, mwcbaseb_state, empty_init, "Mattel", "World Championship Baseball", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp
index cf50ab79d53..c6f703efa74 100644
--- a/src/mame/drivers/hh_sm510.cpp
+++ b/src/mame/drivers/hh_sm510.cpp
@@ -9638,7 +9638,7 @@ CONS( 1992, tbatmana, 0, 0, tbatmana, tbatmana, tbatmana_s
CONS( 1983, trshutvoy, 0, 0, trshutvoy, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Shuttle Voyage", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
CONS( 1983, tigarden, trshutvoy, 0, tigarden, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Thief in Garden", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
CONS( 1982, trsrescue, 0, 0, trsrescue, trsrescue, trsrescue_state, empty_init, "Tronica", "Space Rescue", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
-CONS( 1982, trspacmis, 0, 0, trspacmis, trspacmis, trspacmis_state, empty_init, "Tronica", "Space Mission", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+CONS( 1982, trspacmis, 0, 0, trspacmis, trspacmis, trspacmis_state, empty_init, "Tronica", "Space Mission (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
CONS( 1982, trspider, trspacmis, 0, trspider, trspacmis, trspacmis_state, empty_init, "Tronica", "Spider (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
// misc
diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp
index 91c90ef7cd1..24bde2e39a6 100644
--- a/src/mame/drivers/hh_tms1k.cpp
+++ b/src/mame/drivers/hh_tms1k.cpp
@@ -7,7 +7,7 @@ This driver is a collection of simple dedicated handheld and tabletop
toys based around the TMS1000 MCU series. Anything more complex or clearly
part of a series is (or will be) in its own driver, see:
- eva: Chrysler EVA-11 (and EVA-24)
-- microvsn: Milton Bradley MicroVision
+- microvsn: Milton Bradley Microvision
- sag: Entex Select-A-Game Machine
(contd.) hh_tms1k child drivers:
@@ -92,28 +92,28 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm
@MP3415 TMS1100 1978, Coleco Electronic Quarterback
@MP3435 TMS1100 1979, Coleco Zodiac
@MP3438A TMS1100 1979, Kenner Star Wars Electronic Battle Command
- MP3450A TMS1100 1979, MicroVision cartridge: Block Buster
- MP3454 TMS1100 1979, MicroVision cartridge: Star Trek Phaser Strike
- MP3455 TMS1100 1980, MicroVision cartridge: Pinball
- MP3457 TMS1100 1979, MicroVision cartridge: Mindbuster
+ MP3450A TMS1100 1979, Microvision cartridge: Block Buster
+ MP3454 TMS1100 1979, Microvision cartridge: Star Trek Phaser Strike
+ MP3455 TMS1100 1980, Microvision cartridge: Pinball
+ MP3457 TMS1100 1979, Microvision cartridge: Mindbuster
@MP3460 TMS1100 1979, Coleco Head to Head: Electronic Football
- MP3474 TMS1100 1979, MicroVision cartridge: Vegas Slots
- MP3475 TMS1100 1979, MicroVision cartridge: Bowling
+ MP3474 TMS1100 1979, Microvision cartridge: Vegas Slots
+ MP3475 TMS1100 1979, Microvision cartridge: Bowling
@MP3476 TMS1100 1979, Milton Bradley Super Simon
- MP3479 TMS1100 1980, MicroVision cartridge: Baseball
- MP3481 TMS1100 1979, MicroVision cartridge: Connect Four
+ MP3479 TMS1100 1980, Microvision cartridge: Baseball
+ MP3481 TMS1100 1979, Microvision cartridge: Connect Four
*MP3489 TMS1100 1980, Kenner Live Action Football
@MP3491 TMS1100 1979, Mattel Thoroughbred Horse Race Analyzer
*MP3493 TMS1100 1980, Milton Bradley OMNI Entertainment System (1/2)
*MP3494 TMS1100 1980, Milton Bradley OMNI Entertainment System (2/2)
- MP3496 TMS1100 1980, MicroVision cartridge: Sea Duel
- M34009 TMS1100 1981, MicroVision cartridge: Alien Raiders (note: MP3498, MP3499, M3400x..)
+ MP3496 TMS1100 1980, Microvision cartridge: Sea Duel
+ M34009 TMS1100 1981, Microvision cartridge: Alien Raiders (note: MP3498, MP3499, M3400x..)
@M34012 TMS1100 1980, Mattel Dungeons & Dragons - Computer Labyrinth Game
*M34014 TMS1100 1981, Coleco Bowlatronic
- M34017 TMS1100 1981, MicroVision cartridge: Cosmic Hunter
+ M34017 TMS1100 1981, Microvision cartridge: Cosmic Hunter
@M34018 TMS1100 1981, Coleco Head to Head: Electronic Boxing
@M34038 TMS1100 1982, Parker Brothers Lost Treasure
- M34047 TMS1100 1982, MicroVision cartridge: Super Blockbuster
+ M34047 TMS1100 1982, Microvision cartridge: Super Blockbuster
@M34078A TMS1100 1983, Milton Bradley Electronic Arcade Mania
*M34137 TMS1100? 1985, Technasonic Weight Talker
@MP4486A TMS1000C 1983, Vulcan XL 25
diff --git a/src/mame/drivers/megasys1.cpp b/src/mame/drivers/megasys1.cpp
index 784fa9861d5..cc2acbba098 100644
--- a/src/mame/drivers/megasys1.cpp
+++ b/src/mame/drivers/megasys1.cpp
@@ -78,19 +78,19 @@ Input Ports R 080000-080009 0e0000-0e0001** 0d8000-d80001** 100000-100001**
-Sound CPU RW MS1-A MS1-B MS1-C MS1-D
+Sound CPU RW MS1-A MS1-B MS1-C MS1-D
-----------------------------------------------------------------------------------
-ROM R 000000-01ffff 000000-01ffff 000000-01ffff No Sound CPU
-Latch #1 R 040000-040001 < 060000-060001
-Latch #2 W 060000-060001 < <
-2151 reg W 080000-080001 < <
-2151 data W 080002-080003 < <
-2151 status R 080002-080003 < <
-6295 #1 data W 0a0000-0a0003 < <
-6295 #1 status R 0a0000-0a0001 < <
-6295 #2 data W 0c0000-0c0003 < <
-6295 #2 status R 0c0000-0c0001 < <
-RAM RW 0f0000-0f3fff 0e0000-0effff* <
+ROM R 000000-01ffff 000000-01ffff 000000-01ffff No Sound CPU
+Latch #1 R 040000-040001 < 060000-060001
+Latch #2 W 060000-060001 < <
+2151 reg W 080000-080001 < <
+2151 data W 080002-080003 < <
+2151 status R 080002-080003 < <
+6295 #1 data W 0a0000-0a0003 < <
+6295 #1 status R 0a0000-0a0001 < <
+6295 #2 data W 0c0000-0c0003 < <
+6295 #2 status R 0c0000-0c0001 < <
+RAM RW 0e0000-0effff* < <
-----------------------------------------------------------------------------------
*Mirror at 0xf0000 (verified on hardware)
@@ -2940,7 +2940,8 @@ ROM_START( edfbl )
ROM_LOAD16_BYTE( "01.bin", 0x000001, 0x020000, CRC(fc893ad0) SHA1(6d7be560e2343f3943f52ccdae7bd255b7720b6e) )
ROM_CONTINUE ( 0x080001, 0x020000 )
- /* no 2nd 68k on this bootleg, is there a PIC? */
+ ROM_REGION( 0x2000, "mcu", 0 ) // PIC, 28 pin, part number scratched off
+ ROM_LOAD( "pic", 0x0000, 0x2000, NO_DUMP )
ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */
ROM_LOAD( "07.bin", 0x000000, 0x040000, CRC(4495c228) SHA1(2193561e193e696c66f27fa186f27ffbbdcb1826) )
@@ -3636,6 +3637,38 @@ ROM_START( p47 )
ROM_END
+/*
+The Japanese version of P-47 can be found in 2 different ROM board configurations:
+'Normal' rev - full split EPROMs
+Type B rev - 4x 2mb HN62312 and 1x HN62321 mask ROMs
+
+Type B on the left, normal on the right
+
+p-47_1_rom1.bin = p47j_1.bin | Main CPU
+p-47_3_rom2.bin = p47j_3.bin /
+
+p-47_9_rom8.bin = p47j_9.bin | Audio CPU
+p-47_19_rom7.bin = p47j_19.bin /
+
+rom4.bin = p47j_5.bin + p47j_6.bin | Scroll0
+p-47_7_rom3.bin = p47j_7.bin** /
+
+rom5.bin = p47j_23.bin | Scroll1
+rom6.bin = p47j_12.bin /
+
+p-47_16_rom12.bin = p47j_16.bin | Scroll2
+
+rom11.bin = p47j_27.bin + p47j_18.bin | Sprites
+p-47_26_rom13.bin = p47j_26.bin /
+
+rom9.bin = p47j_20.bin + p47j_21.bin | OKI1
+
+rom10.bin = p47j_10.bin + p47j_11.bin | OKI2
+
+p-47.14m = p-47.14m | PROMS
+
+**p-47_7_rom3.bin is a 27512 compatible mask rom. The existing P47j set is 1mb. The 2nd half of the data is not present on the type B boardset.
+*/
ROM_START( p47j )
ROM_REGION( 0x80000, "maincpu", 0 ) /* Main CPU Code */
ROM_LOAD16_BYTE( "p47j_3.bin", 0x000000, 0x020000, CRC(11c655e5) SHA1(a2bfd6538ac81a5f20fa77460ba045584313413a) )
diff --git a/src/mame/drivers/neogeo.cpp b/src/mame/drivers/neogeo.cpp
index 29a3f82c071..80e66732eaf 100644
--- a/src/mame/drivers/neogeo.cpp
+++ b/src/mame/drivers/neogeo.cpp
@@ -2924,7 +2924,7 @@ void mvs_led_state::sbp(machine_config &config)
MULTI PLAY MODE:
================
- The NeoGeo has three games which support MULTI PLAY MODE (Riding Hero / League Bowling / Trash Rally).
+ The NeoGeo has three games which support MULTI PLAY MODE (Riding Hero / League Bowling / Thrash Rally).
This allows you to 'link' 4 games (MVS) / 2 games (AES) using in game 'Multi-Play' option. To establish
a link between the carts you have to connect the carts to each other by a communicator cable. The communicator
cable is a regular headphone cable with stereo pin jack. It has been reported that you can also 'link' MVS <-> AES.
@@ -2932,7 +2932,7 @@ void mvs_led_state::sbp(machine_config &config)
All three games use a special PROG board for MULTI PLAY MODE support:
. Riding Hero (AES - NEO-AEG PROG-HERO / MVS NEO-MVS PROG-HERO)
. League Bowling (AES - NEO-AEG PROG-HERO / MVS NEO-MVS PROG-HERO)
- . Trash Rally (AES - NEO-AEG PROG42G-COM / NEO-MVS PROG42G-COM)
+ . Thrash Rally (AES - NEO-AEG PROG42G-COM / NEO-MVS PROG42G-COM)
A HD6301V1P MCU on the above boards is used for establishing the 'link'. The MCU has a 4kb internal ROM which
is not dumped.
diff --git a/src/mame/drivers/pgm.cpp b/src/mame/drivers/pgm.cpp
index 5422c7e9d54..4f2b075e888 100644
--- a/src/mame/drivers/pgm.cpp
+++ b/src/mame/drivers/pgm.cpp
@@ -4503,6 +4503,38 @@ ROM_START( svgtw )
ROM_LOAD( "igs_w05602b032.u7", 0xc00000, 0x400000, CRC(0685166d) SHA1(64dac49abd2a46d5fb58c678027aa5e23d672dc4) )
ROM_END
+ROM_START( svghk )
+ ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */
+ PGM_68K_BIOS
+ ROM_LOAD16_WORD_SWAP( "v101hk_u30.u30", 0x100000, 0x080000, CRC(8d0405e4) SHA1(b6175c9ffeaac531d28e7845cb34c673476e286a) ) // V100 03/14/05 20:04:08
+
+ ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ // marked H1
+ ROM_LOAD( "svgpcb_igs027a_execute_only_area", 0x0000, 0x00188, NO_DUMP )
+ ROM_LOAD( "svgcpb_igs027a_v100_japan.bin", 0x0188, 0x3e78, CRC(7a59da5d) SHA1(d67ba465db40ca716b4b901b1c8e762716fb954e) ) // this is from the Japan set, the cart this came from was Hong Kong
+
+ ROM_REGION32_LE( 0x800000, "user1", 0 ) /* Protection Data (encrypted external ARM data) */
+ ROM_LOAD( "v101hk_u26.u26", 0x000000, 0x400000, CRC(42b0d5a9) SHA1(1dd2b6530f982dbb720e4c017fca7f90cf441f57) ) // 06/20/05 11:36:15 V100
+ ROM_LOAD( "v101hk_u36.u36", 0x400000, 0x400000, CRC(bf15a47a) SHA1(822aadb222d4f0278b2e2375cb59d8b35667f5ef) )
+
+ ROM_REGION( 0x500000, "tiles", 0 ) /* 8x8 Text Tiles + 32x32 BG Tiles */
+ PGM_VIDEO_BIOS
+ ROM_LOAD( "igs_t05601w016.u29", 0x180000, 0x200000, CRC(03e110dc) SHA1(41c8f286e9303b24ba6235b341371c298226fb6a) )
+
+ ROM_REGION16_LE( 0x2000000, "sprcol", 0 ) /* Sprite Colour Data */
+ ROM_LOAD( "igs_a05601w064.u3", 0x0000000, 0x0800000, CRC(ea6453e4) SHA1(b5c82edafa8008ad59b5f2219511947d078d446e) )
+ ROM_LOAD( "igs_a05602w064.u4", 0x0800000, 0x0800000, CRC(6d00621b) SHA1(55a4bc357e14b975b0234a9cd49e2224f509dad9) )
+ ROM_LOAD( "igs_a05603w064.u6", 0x1000000, 0x0800000, CRC(7b71c64f) SHA1(bec7c7edf0634cf8351a54abb867c56af08ad2c3) )
+ ROM_LOAD( "igs_a05604w032.u8", 0x1800000, 0x0400000, CRC(9452a567) SHA1(01fdb8e1f131603843ef4c49ab76d7a56b2d6414) )
+
+ ROM_REGION16_LE( 0x1000000, "sprmask", 0 ) /* Sprite Masks + Colour Indexes */
+ ROM_LOAD( "igs_b05601w064.u9", 0x0000000, 0x0800000, CRC(35c0a489) SHA1(a7d5527da01f8eaa7499fb6785b57094521bce97) )
+ ROM_LOAD( "igs_b05602w064.u11", 0x0800000, 0x0800000, CRC(8aad3f85) SHA1(da6996d901d42b3a2ba7019ad014bb938a5e328b) )
+
+ ROM_REGION( 0x1000000, "ics", 0 ) /* Samples - (8 bit mono 11025Hz) - */
+ PGM_AUDIO_BIOS
+ ROM_LOAD( "igs_w05601b064.u5", 0x400000, 0x800000, CRC(bfe61a71) SHA1(e682ca8d57ca51c4d72f64fc091161f3dbdce871) )
+ ROM_LOAD( "igs_w05602b032.u7", 0xc00000, 0x400000, CRC(0685166d) SHA1(64dac49abd2a46d5fb58c678027aa5e23d672dc4) )
+ROM_END
ROM_START( svgpcb )
ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */
@@ -5504,6 +5536,7 @@ GAME( 2003, thegladpcba, theglad, pgm_arm_type3_33m, pgm, pgm_arm_
//圣魔世纪/Shèng mó shìjì (China)
//聖魔世紀/Shèng mó shìjì (Taiwan, Hong Kong)
GAME( 2005, svg, pgm, pgm_arm_type3_33m, svg, pgm_arm_type3_state, init_svg, ROT0, "IGS / Idea Factory", "S.V.G. - Spectral vs Generation / Sheng Mo Shiji (M68k label V200) (ARM label V200, ROM 10/11/05 S.V.G V201)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // ARM label was 200, but it's code rev 201? // ARM time: 10:07:20
+GAME( 2005, svghk, svg, pgm_arm_type3_33m, svghk, pgm_arm_type3_state, init_svgpcb, ROT0, "IGS / Idea Factory", "S.V.G. - Spectral vs Generation / Sheng Mo Shiji (M68k label V101HK) (ARM label V101HK, ROM 06/20/05 S.V.G V100)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // 68k label was 101 but it's same as v100
GAME( 2005, svgtw, svg, pgm_arm_type3_33m, svgtw, pgm_arm_type3_state, init_svgpcb, ROT0, "IGS / Idea Factory", "S.V.G. - Spectral vs Generation / Sheng Mo Shiji (M68k label V101TW) (ARM label V101TW, ROM 06/20/05 S.V.G V100)", MACHINE_NOT_WORKING ) // 68k label was 101 but it's same as v100
GAME( 2005, svgpcb, svg, pgm_arm_type3_33m, svgpcb, pgm_arm_type3_state, init_svgpcb, ROT0, "IGS / Idea Factory (AMI license)", "S.V.G. - Spectral vs Generation / Sheng Mo Shiji (M68k label V100JP) (ARM label V100JP, ROM 05/12/05 S.V.G V100) (Japan, JAMMA PCB)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )// ARM time: 15:31:35 // PCB version only released in Japan?
diff --git a/src/mame/drivers/sag.cpp b/src/mame/drivers/sag.cpp
index 69334c5be2d..9a530c24bfd 100644
--- a/src/mame/drivers/sag.cpp
+++ b/src/mame/drivers/sag.cpp
@@ -14,7 +14,7 @@ Hardware notes:
Games released, MCU: (*denotes undumped)
- Baseball 4 - HD38800
-- *Basketball 3 - HD38800
+- Basketball 3 - HD38800
- Football 4 - TMS1670
- *Pac-Man 2 - HD38800
- Pinball - HD38800
diff --git a/src/mame/drivers/segas16b.cpp b/src/mame/drivers/segas16b.cpp
index 61833ed9bc1..283d20577a3 100644
--- a/src/mame/drivers/segas16b.cpp
+++ b/src/mame/drivers/segas16b.cpp
@@ -10000,7 +10000,7 @@ GAME( 1990, atomicp, 0, atomicp, atomicp, segas16b_stat
GAME( 1990, snapper, 0, atomicp, snapper, segas16b_state, init_snapper, ROT0, "Philko", "Snapper (Korea)", 0) // korean clone board..
// board marked 'System 4' and has Philko custom chip - various hw changes (4bpp tiles for example)
GAME( 1991, lockonph, 0, lockonph, lockonph, segas16b_state, init_lockonph, ROT0, "Philko", "Lock On (Philko)", MACHINE_IMPERFECT_SOUND ) // Copyright not shown in game, but has 'PHILKO' in the startup warning and tiles / PCB. 1991 is the name entry for the lowest high score. Clipping issues on left edge in attract look like original game bugs.
-GAME( 199?, dfjail, 0, dfjail, dfjail, dfjail_state, init_generic_korean, ROT0, "Philko", "The Destroyer From Jail (Korea)", MACHINE_NO_COCKTAIL )
+GAME( 1991, dfjail, 0, dfjail, dfjail, dfjail_state, init_generic_korean, ROT0, "Philko", "The Destroyer From Jail (Korea)", MACHINE_NO_COCKTAIL ) // Regulatory approval document dated "1991. 3.28" based on submission of manual and photos
// decrypted bootleg / 'suicide repair' sets
diff --git a/src/mame/drivers/system1.cpp b/src/mame/drivers/system1.cpp
index eaaa0c91e41..d8b318c98a7 100644
--- a/src/mame/drivers/system1.cpp
+++ b/src/mame/drivers/system1.cpp
@@ -86,6 +86,7 @@ chopliftu 3x32k 1x32k 3x32k 4x32k yes 7154
chopliftbl 3x32k 1x32k 3x32k 4x32k yes bootleg
raflesia 3x16k 1x8k 6x8k 4x16k no pio 7413 7408
+raflesiau 6x8k 1x8k 6x8k 4x16k no ppi ???? ????
wboy2 6x8k 1x8k 6x8k 4x16k no ppi 7592 7485
wboy2u 6x8k 1x8k 6x8k 4x16k no ppi ????
@@ -206,7 +207,7 @@ Flicky sets version notes:
flicky, flickyo
---------------
-The both seem to be very similar programs. Difficulty is easier than the S1,S2 sets.
+They both seem to be very similar programs. Difficulty is easier than the S1,S2 sets.
DIPs are also shared 100% with each other.
flickys1, flickys2
@@ -294,14 +295,14 @@ static const u8 cc_ed[0x100] = {
8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
-12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2, 9*5+2*2,12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2, 9*5+2*2,
-12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2, 9*5+2*2,12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2, 9*5+2*2,
-12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2,18*5+2*2,12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2,18*5+2*2,
-12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2, 8*5+2*2,12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2, 8*5+2*2,
+ 12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2,8*5+2*2,14*5+2*2, 8*5+2*2, 9*5+2*2,12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2, 9*5+2*2,
+ 12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2,8*5+2*2,14*5+2*2, 8*5+2*2, 9*5+2*2,12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2, 9*5+2*2,
+ 12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2,8*5+2*2,14*5+2*2, 8*5+2*2,18*5+2*2,12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2,18*5+2*2,
+ 12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2,8*5+2*2,14*5+2*2, 8*5+2*2, 8*5+2*2,12*5+2*2,12*5+2*2,15*5+2*2,20*5+4*2, 8*5+2*2,14*5+2*2, 8*5+2*2, 8*5+2*2,
8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
-16*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
-16*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
+ 16*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2,8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
+ 16*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2,8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2,16*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2, 8*5+2*2,
@@ -309,41 +310,41 @@ static const u8 cc_ed[0x100] = {
};
static const u8 cc_xy[0x100] = {
-( 4+4)*5+2*2,(10+4)*5+4*2,( 7+4)*5+2*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(11+4)*5+2*2,( 7+4)*5+2*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,
-( 8+4)*5+3*2,(10+4)*5+4*2,( 7+4)*5+2*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,(12+4)*5+3*2,(11+4)*5+2*2,( 7+4)*5+2*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,
-( 7+4)*5+3*2,(10+4)*5+4*2,(16+4)*5+4*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,(16+4)*5+4*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,
-( 7+4)*5+3*2,(10+4)*5+4*2,(13+4)*5+4*2,( 6+4)*5+2*2,(23 )*5+3*2,(23 )*5+3*2,(19 )*5+4*2,( 4+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,(13+4)*5+4*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,
-( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
-( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
-( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
-(19 )*5+3*2,(19 )*5+3*2,(19 )*5+3*2,(19 )*5+3*2,(19 )*5+3*2,(19 )*5+3*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
-( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
-( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
-( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
-( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
-( 5+4)*5+2*2,(10+4)*5+2*2,(10+4)*5+4*2,(10+4)*5+4*2,(10+4)*5+4*2,(11+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,( 5+4)*5+2*2,(10+4)*5+2*2,(10+4)*5+4*2,( 0 )*5 ,(10+4)*5+4*2,(17+4)*5+4*2,( 7+4)*5+3*2,(11+4)*5+2*2,
-( 5+4)*5+2*2,(10+4)*5+2*2,(10+4)*5+4*2,(11+4)*5+3*2,(10+4)*5+4*2,(11+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,( 5+4)*5+2*2,( 4+4)*5+2*2,(10+4)*5+4*2,(11+4)*5+3*2,(10+4)*5+4*2,( 4 )*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,
-( 5+4)*5+2*2,(10+4)*5+2*2,(10+4)*5+4*2,(19+4)*5+2*2,(10+4)*5+4*2,(11+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,( 5+4)*5+2*2,( 4+4)*5+2*2,(10+4)*5+4*2,( 4+4)*5+2*2,(10+4)*5+4*2,( 4 )*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,
-( 5+4)*5+2*2,(10+4)*5+2*2,(10+4)*5+4*2,( 4+4)*5+2*2,(10+4)*5+4*2,(11+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,( 5+4)*5+2*2,( 6+4)*5+2*2,(10+4)*5+4*2,( 4+4)*5+2*2,(10+4)*5+4*2,( 4 )*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2
+ ( 4+4)*5+2*2,(10+4)*5+4*2,( 7+4)*5+2*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(11+4)*5+2*2,( 7+4)*5+2*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,
+ ( 8+4)*5+3*2,(10+4)*5+4*2,( 7+4)*5+2*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,(12+4)*5+3*2,(11+4)*5+2*2,( 7+4)*5+2*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,
+ ( 7+4)*5+3*2,(10+4)*5+4*2,(16+4)*5+4*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,(16+4)*5+4*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,
+ ( 7+4)*5+3*2,(10+4)*5+4*2,(13+4)*5+4*2,( 6+4)*5+2*2,(23 )*5+3*2,(23 )*5+3*2,(19 )*5+4*2,( 4+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,(13+4)*5+4*2,( 6+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 7+4)*5+3*2,( 4+4)*5+2*2,
+ ( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
+ ( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
+ ( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
+ (19 )*5+3*2,(19 )*5+3*2,(19 )*5+3*2,(19 )*5+3*2,(19 )*5+3*2,(19 )*5+3*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
+ ( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
+ ( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
+ ( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
+ ( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,( 4+4)*5+2*2,(19 )*5+3*2,( 4+4)*5+2*2,
+ ( 5+4)*5+2*2,(10+4)*5+2*2,(10+4)*5+4*2,(10+4)*5+4*2,(10+4)*5+4*2,(11+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,( 5+4)*5+2*2,(10+4)*5+2*2,(10+4)*5+4*2,( 0 )*5 ,(10+4)*5+4*2,(17+4)*5+4*2,( 7+4)*5+3*2,(11+4)*5+2*2,
+ ( 5+4)*5+2*2,(10+4)*5+2*2,(10+4)*5+4*2,(11+4)*5+3*2,(10+4)*5+4*2,(11+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,( 5+4)*5+2*2,( 4+4)*5+2*2,(10+4)*5+4*2,(11+4)*5+3*2,(10+4)*5+4*2,( 4 )*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,
+ ( 5+4)*5+2*2,(10+4)*5+2*2,(10+4)*5+4*2,(19+4)*5+2*2,(10+4)*5+4*2,(11+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,( 5+4)*5+2*2,( 4+4)*5+2*2,(10+4)*5+4*2,( 4+4)*5+2*2,(10+4)*5+4*2,( 4 )*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,
+ ( 5+4)*5+2*2,(10+4)*5+2*2,(10+4)*5+4*2,( 4+4)*5+2*2,(10+4)*5+4*2,(11+4)*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2,( 5+4)*5+2*2,( 6+4)*5+2*2,(10+4)*5+4*2,( 4+4)*5+2*2,(10+4)*5+4*2,( 4 )*5+2*2,( 7+4)*5+3*2,(11+4)*5+2*2
};
static const u8 cc_xycb[0x100] = {
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,
-20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,
-20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,
-20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
-23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,
+ 20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,
+ 20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,
+ 20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,20*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,
+ 23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2,23*5+4*2
};
/* extra cycles if jr/jp/call taken and 'interrupt latency' on rst 0-7 */
@@ -3044,7 +3045,7 @@ ROM_START( flickyo )
ROM_LOAD( "pr-5317.76", 0x0000, 0x0100, CRC(648350b8) SHA1(c7986aa9127ef5b50b845434cb4e81dff9861cd2) )
ROM_END
-// Coverted from and running on a Up n' Down board.
+// Converted from and running on a Up n' Down board.
ROM_START( flickyup )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "2764-ic29", 0x0000, 0x2000, CRC(59ba3107) SHA1(2d37f00b8a81b97e45aa78ae75449663c35acece) ) /* encrypted */
@@ -4139,8 +4140,38 @@ ROM_START( raflesia )
ROM_REGION( 0x0100, "lookup_proms", 0 )
ROM_LOAD( "pr-5317.76", 0x0000, 0x0100, CRC(648350b8) SHA1(c7986aa9127ef5b50b845434cb4e81dff9861cd2) ) /* pr-5317.106 */
- ROM_END
+ROM_END
+
+// Sega 834-5191 + 834-5540 + 834-5541. This set isn't exactly the same as the encrypted version (calls and jumps are moved around)
+ROM_START( raflesiau )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "ic129", 0x0000, 0x2000, CRC(6f4931b0) SHA1(4c02e052c01099478adb5bb595c035aff862dd45) )
+ ROM_LOAD( "ic130", 0x2000, 0x2000, CRC(ec46e21b) SHA1(7bba493c8493611952e029dc8782916cc25db82a) )
+ ROM_LOAD( "ic131", 0x4000, 0x2000, CRC(e035ff6b) SHA1(5bffdcdf543f47ccf2ed0cabf1ef9e42857d59f9) )
+ ROM_LOAD( "ic132", 0x6000, 0x2000, CRC(6527aae7) SHA1(aecf33c777e8f4a7323d72dd3f2ca5d12cc798e7) )
+ ROM_LOAD( "ic133", 0x8000, 0x2000, CRC(e13dd5e4) SHA1(a97654ff82ffa051ee14359733c2b9a952134d4e) )
+ ROM_LOAD( "ic134", 0xa000, 0x2000, CRC(a0aa4729) SHA1(c353ed4d21661ea0721d8b85d6bfefe502373d7b) )
+
+ ROM_REGION( 0x10000, "soundcpu", 0 )
+ ROM_LOAD( "ic3", 0x0000, 0x2000, CRC(7353cc2e) SHA1(c9246f156ecb1a266669cc9c1c900eece7e8c0d8) )
+
+ ROM_REGION( 0xc000, "tiles", 0 )
+ ROM_LOAD( "epr-7419.82", 0x0000, 0x2000, CRC(bfd5f34c) SHA1(78c4d380d5558212e535c3262223137447d64818) )
+ ROM_LOAD( "epr-7418.65", 0x2000, 0x2000, CRC(f8cbc9b6) SHA1(48be9337f704a11ac1fdeb64a3b3518c796bcdd0) )
+ ROM_LOAD( "epr-7417.81", 0x4000, 0x2000, CRC(e63501bc) SHA1(5cfd19241c54782c262bbb23c6f682534e77feb7) )
+ ROM_LOAD( "epr-7416.64", 0x6000, 0x2000, CRC(093e5693) SHA1(78bb1c4651bd63a9f776766d2eac4f1c09242ed5) )
+ ROM_LOAD( "epr-7415.80", 0x8000, 0x2000, CRC(1a8d6bd6) SHA1(b04ee35f603c6c9923ba888914eb43a8b7753d92) )
+ ROM_LOAD( "epr-7414.63", 0xa000, 0x2000, CRC(5d20f218) SHA1(bdc0185d133f7bbe287106882bacde846634ffa4) )
+ ROM_REGION( 0x10000, "sprites", 0 )
+ ROM_LOAD( "epr-7407.3", 0x0000, 0x4000, CRC(f09fc057) SHA1(c6f06144b708055b31fbcba9f38b63736db789d8) )
+ ROM_LOAD( "epr-7409.1", 0x4000, 0x4000, CRC(819fedb8) SHA1(e63f0422814423be91d8e1937a13d19693a1a5fc) )
+ ROM_LOAD( "epr-7408.4", 0x8000, 0x4000, CRC(3189f33c) SHA1(8476c2c01920f0492cf643929d4f023f3afe0164) )
+ ROM_LOAD( "epr-7410.2", 0xc000, 0x4000, CRC(ced74789) SHA1(d0ad845bfe83412ac8d43125e1c50d0581a5b47e) )
+
+ ROM_REGION( 0x0100, "lookup_proms", 0 )
+ ROM_LOAD( "pr-5317.76", 0x0000, 0x0100, CRC(648350b8) SHA1(c7986aa9127ef5b50b845434cb4e81dff9861cd2) )
+ROM_END
ROM_START( wboy )
ROM_REGION( 0x10000, "maincpu", 0 )
@@ -5303,7 +5334,7 @@ ROM_START( nob )
ROM_END
/* the bootleg has different protection.. */
- ROM_START( nobb )
+ROM_START( nobb )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "nobo-t.bin", 0x00000, 0x8000, CRC(176fd168) SHA1(f262521f07e5340f175019e2a06a54120a4aa3b7) )
ROM_LOAD( "nobo-r.bin", 0x10000, 0x8000, CRC(d61cf3c9) SHA1(0f80011d713c51e67853810813ebba579ade0303) )
@@ -5340,10 +5371,6 @@ ROM_END
*
*************************************/
-void system1_state::init_bank00()
-{
-}
-
void system1_state::init_bank44()
{
m_videomode_custom = &system1_state::bank44_custom_w;
@@ -5400,15 +5427,12 @@ void system1_state::init_myherok()
rom[A1] = temp;
}
}
-
- init_bank00();
}
void system1_state::init_blockgal()
{
- init_bank00();
downcast<mc8123_device &>(*m_maincpu).decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000);
}
@@ -5493,7 +5517,6 @@ void system1_state::init_nobb()
void system1_state::init_bootleg()
{
- init_bank00();
memcpy(m_decrypted_opcodes, m_maincpu_region->base() + 0x10000, 0x8000);
}
@@ -5531,65 +5554,66 @@ void system1_state::init_shtngmst()
*************************************/
/* PPI-based System 1 */
-GAME( 1983, starjack, 0, sys1ppis, starjack, system1_state, init_bank00, ROT270, "Sega", "Star Jacker (Sega)", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, starjacks, starjack, sys1ppis, starjacks, system1_state, init_bank00, ROT270, "Sega (Stern Electronics license)", "Star Jacker (Stern Electronics)", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, upndown, 0, sys1ppix_315_5098, upndown, system1_state, init_bank00, ROT270, "Sega", "Up'n Down (315-5030)", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, upndownu, upndown, sys1ppi, upndown, system1_state, init_bank00, ROT270, "Sega", "Up'n Down (not encrypted)", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, regulus, 0, sys1ppix_315_5033, regulus, system1_state, init_bank00, ROT270, "Sega", "Regulus (315-5033, Rev A.)", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, reguluso, regulus, sys1ppix_315_5033, reguluso, system1_state, init_bank00, ROT270, "Sega", "Regulus (315-5033)", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, regulusu, regulus, sys1ppi, regulus, system1_state, init_bank00, ROT270, "Sega", "Regulus (not encrypted)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, mrviking, 0, sys1ppisx_315_5041,mrviking, system1_state, init_bank00, ROT270, "Sega", "Mister Viking (315-5041)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, mrvikingj, mrviking, sys1ppisx_315_5041,mrvikingj, system1_state, init_bank00, ROT270, "Sega", "Mister Viking (315-5041, Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, swat, 0, sys1ppix_315_5048, swat, system1_state, init_bank00, ROT270, "Coreland / Sega", "SWAT (315-5048)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, flickyo, flicky, sys1ppix_315_5051, flicky, system1_state, init_bank00, ROT0, "Sega", "Flicky (64k Version, 315-5051, set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, flickys1, flicky, sys1ppix_315_5051, flickys1, system1_state, init_bank00, ROT0, "Sega", "Flicky (64k Version, 315-5051, set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, flickyup, flicky, sys1ppix_315_5051, flicky, system1_state, init_bank00, ROT0, "Sega", "Flicky (64k Version, on Up'n Down boardset)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, wmatch, 0, sys1ppisx_315_5064,wmatch, system1_state, init_bank00, ROT270, "Sega", "Water Match (315-5064)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, bullfgt, 0, sys1ppix_315_5065, bullfgt, system1_state, init_bank00, ROT0, "Coreland / Sega", "Bullfight (315-5065)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, nprinces, seganinj, sys1ppix_315_5051, seganinj, system1_state, init_bank00, ROT0, "bootleg?", "Ninja Princess (315-5051, 64k Ver. bootleg?)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, nprincesu, seganinj, sys1ppi, seganinj, system1_state, init_bank00, ROT0, "Sega", "Ninja Princess (64k Ver. not encrypted)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, wboy2, wboy, sys1ppix_315_5178, wboy, system1_state, init_bank00, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, 315-5178)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, wboy2u, wboy, sys1ppi, wboy, system1_state, init_bank00, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, not encrypted)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, wboy6, wboy, sys1ppix_315_5179, wboy, system1_state, init_bank00, ROT0, "Escape (Sega license)", "Wonder Boy (set 6, 315-5179)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, wbdeluxe, wboy, sys1ppi, wbdeluxe, system1_state, init_bank00, ROT0, "hack (Vision Electronics)", "Wonder Boy Deluxe", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, starjack, 0, sys1ppis, starjack, system1_state, empty_init, ROT270, "Sega", "Star Jacker (Sega)", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, starjacks, starjack, sys1ppis, starjacks, system1_state, empty_init, ROT270, "Sega (Stern Electronics license)", "Star Jacker (Stern Electronics)", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, upndown, 0, sys1ppix_315_5098, upndown, system1_state, empty_init, ROT270, "Sega", "Up'n Down (315-5030)", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, upndownu, upndown, sys1ppi, upndown, system1_state, empty_init, ROT270, "Sega", "Up'n Down (not encrypted)", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, regulus, 0, sys1ppix_315_5033, regulus, system1_state, empty_init, ROT270, "Sega", "Regulus (315-5033, Rev A.)", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, reguluso, regulus, sys1ppix_315_5033, reguluso, system1_state, empty_init, ROT270, "Sega", "Regulus (315-5033)", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, regulusu, regulus, sys1ppi, regulus, system1_state, empty_init, ROT270, "Sega", "Regulus (not encrypted)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, mrviking, 0, sys1ppisx_315_5041,mrviking, system1_state, empty_init, ROT270, "Sega", "Mister Viking (315-5041)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, mrvikingj, mrviking, sys1ppisx_315_5041,mrvikingj, system1_state, empty_init, ROT270, "Sega", "Mister Viking (315-5041, Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, swat, 0, sys1ppix_315_5048, swat, system1_state, empty_init, ROT270, "Coreland / Sega", "SWAT (315-5048)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, flickyo, flicky, sys1ppix_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (64k Version, 315-5051, set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, flickys1, flicky, sys1ppix_315_5051, flickys1, system1_state, empty_init, ROT0, "Sega", "Flicky (64k Version, 315-5051, set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, flickyup, flicky, sys1ppix_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (64k Version, on Up'n Down boardset)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, wmatch, 0, sys1ppisx_315_5064,wmatch, system1_state, empty_init, ROT270, "Sega", "Water Match (315-5064)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, bullfgt, 0, sys1ppix_315_5065, bullfgt, system1_state, empty_init, ROT0, "Coreland / Sega", "Bullfight (315-5065)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, nprinces, seganinj, sys1ppix_315_5051, seganinj, system1_state, empty_init, ROT0, "bootleg?", "Ninja Princess (315-5051, 64k Ver. bootleg?)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, nprincesu, seganinj, sys1ppi, seganinj, system1_state, empty_init, ROT0, "Sega", "Ninja Princess (64k Ver. not encrypted)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, wboy2, wboy, sys1ppix_315_5178, wboy, system1_state, empty_init, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, 315-5178)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, wboy2u, wboy, sys1ppi, wboy, system1_state, empty_init, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, not encrypted)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, wboy6, wboy, sys1ppix_315_5179, wboy, system1_state, empty_init, ROT0, "Escape (Sega license)", "Wonder Boy (set 6, 315-5179)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, wbdeluxe, wboy, sys1ppi, wbdeluxe, system1_state, empty_init, ROT0, "hack (Vision Electronics)", "Wonder Boy Deluxe", MACHINE_SUPPORTS_SAVE )
GAME( 1986, nob, 0, nobm, nob, system1_state, init_nob, ROT270, "Coreland / Data East Corporation", "Noboranka (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, nobb, nob, nob, nob, system1_state, init_nobb, ROT270, "bootleg (Game Electronics)", "Noboranka (Japan, bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, raflesiau, raflesia, sys1ppi, raflesia, system1_state, empty_init, ROT270, "Coreland / Sega", "Rafflesia (not encrypted)", MACHINE_SUPPORTS_SAVE )
/* PIO-based System 1 */
-GAME( 1984, flicky, 0, sys1piox_315_5051, flicky, system1_state, init_bank00, ROT0, "Sega", "Flicky (128k Version, 315-5051)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, flickya, flicky, sys1piox_315_5051, flicky, system1_state, init_bank00, ROT0, "Sega", "Flicky (128k Version, 315-5051, larger roms)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, flickys2, flicky, sys1pio, flickys2, system1_state, init_bank00, ROT0, "Sega", "Flicky (128k Version, not encrypted)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, thetogyu, bullfgt, sys1piox_315_5065, bullfgt, system1_state, init_bank00, ROT0, "Coreland / Sega", "The Togyu (315-5065, Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, spatter, 0, sys1piosx_315_spat,spatter, system1_state, init_bank00, ROT0, "Sega", "Spatter (315-5xxx)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, spattera, spatter, sys1piosx_315_5099,spatter, system1_state, init_bank00, ROT0, "Sega", "Spatter (315-5099)", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, ssanchan, spatter, sys1piosx_315_spat,spatter, system1_state, init_bank00, ROT0, "Sega", "Sanrin San Chan (Japan, 315-5xxx)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, pitfall2, 0, sys1piox_315_5093, pitfall2, system1_state, init_bank00, ROT0, "Sega", "Pitfall II (315-5093)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, pitfall2a, pitfall2, sys1piox_315_5093, pitfall2, system1_state, init_bank00, ROT0, "Sega", "Pitfall II (315-5093, Flicky Conversion)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, pitfall2u, pitfall2, sys1pio, pitfall2u, system1_state, init_bank00, ROT0, "Sega", "Pitfall II (not encrypted)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, seganinj, 0, sys1piox_315_5102, seganinj, system1_state, init_bank00, ROT0, "Sega", "Sega Ninja (315-5102)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, seganinju, seganinj, sys1pio, seganinj, system1_state, init_bank00, ROT0, "Sega", "Sega Ninja (not encrypted)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, seganinja, seganinj, sys1piox_315_5133, seganinj, system1_state, init_bank00, ROT0, "Sega", "Sega Ninja (315-5113)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, ninja, seganinj, sys1piox_315_5102, seganinj, system1_state, init_bank00, ROT0, "Sega", "Ninja (315-5102)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, nprinceso, seganinj, sys1piox_315_5098, seganinj, system1_state, init_bank00, ROT0, "Sega", "Ninja Princess (315-5098, 128k Ver.)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, nprincesb, seganinj, sys1piox_315_5051, seganinj, system1_state, init_bank00, ROT0, "bootleg?", "Ninja Princess (315-5051?, 128k Ver. bootleg?)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, imsorry, 0, sys1piox_315_5110, imsorry, system1_state, init_bank00, ROT0, "Coreland / Sega", "I'm Sorry (315-5110, US)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, imsorryj, imsorry, sys1piox_315_5110, imsorry, system1_state, init_bank00, ROT0, "Coreland / Sega", "Gonbee no I'm Sorry (315-5110, Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, teddybb, 0, sys1piox_315_5155, teddybb, system1_state, init_bank00, ROT0, "Sega", "TeddyBoy Blues (315-5115, New Ver.)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, teddybbo, teddybb, sys1piox_315_5155, teddybb, system1_state, init_bank00, ROT0, "Sega", "TeddyBoy Blues (315-5115, Old Ver.)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, teddybbobl, teddybb, sys1piox_315_5155, teddybb, system1_state, init_bank00, ROT0, "bootleg", "TeddyBoy Blues (Old Ver. bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, myhero, 0, sys1pio, myhero, system1_state, init_bank00, ROT0, "Coreland / Sega", "My Hero (US, not encrypted)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, sscandal, myhero, sys1piox_315_5132, myhero, system1_state, init_bank00, ROT0, "Coreland / Sega", "Seishun Scandal (315-5132, Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1985, myherobl, myhero, sys1piox_315_5132, myhero, system1_state, init_bank00, ROT0, "bootleg", "My Hero (bootleg, 315-5132 encryption)", MACHINE_SUPPORTS_SAVE ) // cloned 315-5132 encryption? might be a direct copy of an undumped original set
+GAME( 1984, flicky, 0, sys1piox_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (128k Version, 315-5051)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, flickya, flicky, sys1piox_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (128k Version, 315-5051, larger roms)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, flickys2, flicky, sys1pio, flickys2, system1_state, empty_init, ROT0, "Sega", "Flicky (128k Version, not encrypted)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, thetogyu, bullfgt, sys1piox_315_5065, bullfgt, system1_state, empty_init, ROT0, "Coreland / Sega", "The Togyu (315-5065, Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, spatter, 0, sys1piosx_315_spat,spatter, system1_state, empty_init, ROT0, "Sega", "Spatter (315-5xxx)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, spattera, spatter, sys1piosx_315_5099,spatter, system1_state, empty_init, ROT0, "Sega", "Spatter (315-5099)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, ssanchan, spatter, sys1piosx_315_spat,spatter, system1_state, empty_init, ROT0, "Sega", "Sanrin San Chan (Japan, 315-5xxx)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, pitfall2, 0, sys1piox_315_5093, pitfall2, system1_state, empty_init, ROT0, "Sega", "Pitfall II (315-5093)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, pitfall2a, pitfall2, sys1piox_315_5093, pitfall2, system1_state, empty_init, ROT0, "Sega", "Pitfall II (315-5093, Flicky Conversion)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, pitfall2u, pitfall2, sys1pio, pitfall2u, system1_state, empty_init, ROT0, "Sega", "Pitfall II (not encrypted)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, seganinj, 0, sys1piox_315_5102, seganinj, system1_state, empty_init, ROT0, "Sega", "Sega Ninja (315-5102)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, seganinju, seganinj, sys1pio, seganinj, system1_state, empty_init, ROT0, "Sega", "Sega Ninja (not encrypted)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, seganinja, seganinj, sys1piox_315_5133, seganinj, system1_state, empty_init, ROT0, "Sega", "Sega Ninja (315-5113)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, ninja, seganinj, sys1piox_315_5102, seganinj, system1_state, empty_init, ROT0, "Sega", "Ninja (315-5102)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, nprinceso, seganinj, sys1piox_315_5098, seganinj, system1_state, empty_init, ROT0, "Sega", "Ninja Princess (315-5098, 128k Ver.)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, nprincesb, seganinj, sys1piox_315_5051, seganinj, system1_state, empty_init, ROT0, "bootleg?", "Ninja Princess (315-5051?, 128k Ver. bootleg?)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, imsorry, 0, sys1piox_315_5110, imsorry, system1_state, empty_init, ROT0, "Coreland / Sega", "I'm Sorry (315-5110, US)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, imsorryj, imsorry, sys1piox_315_5110, imsorry, system1_state, empty_init, ROT0, "Coreland / Sega", "Gonbee no I'm Sorry (315-5110, Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, teddybb, 0, sys1piox_315_5155, teddybb, system1_state, empty_init, ROT0, "Sega", "TeddyBoy Blues (315-5115, New Ver.)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, teddybbo, teddybb, sys1piox_315_5155, teddybb, system1_state, empty_init, ROT0, "Sega", "TeddyBoy Blues (315-5115, Old Ver.)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, teddybbobl, teddybb, sys1piox_315_5155, teddybb, system1_state, empty_init, ROT0, "bootleg", "TeddyBoy Blues (Old Ver. bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, myhero, 0, sys1pio, myhero, system1_state, empty_init, ROT0, "Coreland / Sega", "My Hero (US, not encrypted)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, sscandal, myhero, sys1piox_315_5132, myhero, system1_state, empty_init, ROT0, "Coreland / Sega", "Seishun Scandal (315-5132, Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, myherobl, myhero, sys1piox_315_5132, myhero, system1_state, empty_init, ROT0, "bootleg", "My Hero (bootleg, 315-5132 encryption)", MACHINE_SUPPORTS_SAVE ) // cloned 315-5132 encryption? might be a direct copy of an undumped original set
GAME( 1985, myherok, myhero, sys1piox_315_5132, myhero, system1_state, init_myherok, ROT0, "Coreland / Sega", "Cheongchun Ilbeonji (Korea)", MACHINE_SUPPORTS_SAVE ) // possible bootleg, has extra encryption
-GAME( 1985, 4dwarrio, 0, sys1piox_315_5162, 4dwarrio, system1_state, init_bank00, ROT0, "Coreland / Sega", "4-D Warriors (315-5162)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, raflesia, 0, sys1piox_315_5162, raflesia, system1_state, init_bank00, ROT270, "Coreland / Sega", "Rafflesia (315-5162)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, wboy, 0, sys1piox_315_5177, wboy, system1_state, init_bank00, ROT0, "Escape (Sega license)", "Wonder Boy (set 1, 315-5177)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, wboyo, wboy, sys1piox_315_5135, wboy, system1_state, init_bank00, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, 315-5135)", MACHINE_SUPPORTS_SAVE ) // aka 317-0003
-GAME( 1986, wboy3, wboy, sys1piox_315_5135, wboy3, system1_state, init_bank00, ROT0, "Escape (Sega license)", "Wonder Boy (set 3, 315-5135)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, wboy4, wboy, sys1piox_315_5162, wboy, system1_state, init_bank00, ROT0, "Escape (Sega license)", "Wonder Boy (315-5162, 4-D Warriors Conversion)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, wboyu, wboy, sys1pio, wboyu, system1_state, init_bank00, ROT0, "Escape (Sega license)", "Wonder Boy (prototype?)", MACHINE_SUPPORTS_SAVE ) // appears to be a very early / unfinished version.
-GAME( 1986, wboy5, wboy, sys1piox_315_5135, wboy3, system1_state, init_bank00, ROT0, "bootleg", "Wonder Boy (set 5, bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, wboyub, wboy, sys1piox_315_5177, wboy, system1_state, init_bank00, ROT0, "bootleg", "Wonder Boy (US bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1985, 4dwarrio, 0, sys1piox_315_5162, 4dwarrio, system1_state, empty_init, ROT0, "Coreland / Sega", "4-D Warriors (315-5162)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, raflesia, 0, sys1piox_315_5162, raflesia, system1_state, empty_init, ROT270, "Coreland / Sega", "Rafflesia (315-5162)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, wboy, 0, sys1piox_315_5177, wboy, system1_state, empty_init, ROT0, "Escape (Sega license)", "Wonder Boy (set 1, 315-5177)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, wboyo, wboy, sys1piox_315_5135, wboy, system1_state, empty_init, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, 315-5135)", MACHINE_SUPPORTS_SAVE ) // aka 317-0003
+GAME( 1986, wboy3, wboy, sys1piox_315_5135, wboy3, system1_state, empty_init, ROT0, "Escape (Sega license)", "Wonder Boy (set 3, 315-5135)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, wboy4, wboy, sys1piox_315_5162, wboy, system1_state, empty_init, ROT0, "Escape (Sega license)", "Wonder Boy (315-5162, 4-D Warriors Conversion)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, wboyu, wboy, sys1pio, wboyu, system1_state, empty_init, ROT0, "Escape (Sega license)", "Wonder Boy (prototype?)", MACHINE_SUPPORTS_SAVE ) // appears to be a very early / unfinished version.
+GAME( 1986, wboy5, wboy, sys1piox_315_5135, wboy3, system1_state, empty_init, ROT0, "bootleg", "Wonder Boy (set 5, bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, wboyub, wboy, sys1piox_315_5177, wboy, system1_state, empty_init, ROT0, "bootleg", "Wonder Boy (US bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, blockgal, 0, blockgal, blockgal, system1_state, init_blockgal, ROT90, "Sega / Vic Tokai","Block Gal (MC-8123B, 317-0029)", MACHINE_SUPPORTS_SAVE)
/* PIO-based System 1 with ROM banking */
diff --git a/src/mame/includes/system1.h b/src/mame/includes/system1.h
index 6227f3bd851..b5a19eff7d6 100644
--- a/src/mame/includes/system1.h
+++ b/src/mame/includes/system1.h
@@ -93,7 +93,6 @@ public:
void sys1piox_315_5155(machine_config &config);
void sys2rowxb(machine_config &config);
- void init_bank00();
void init_bank0c();
void init_bank44();
diff --git a/src/mame/machine/n64.cpp b/src/mame/machine/n64.cpp
index f157cb104ed..1db37e4fe72 100644
--- a/src/mame/machine/n64.cpp
+++ b/src/mame/machine/n64.cpp
@@ -998,14 +998,14 @@ void n64_periphs::vi_recalculate_resolution()
int x_end = vi_hstart & 0x000003ff;
int y_start = ((vi_vstart & 0x03ff0000) >> 16) >> 1;
int y_end = (vi_vstart & 0x000003ff) >> 1;
- int width = ((vi_xscale & 0x00000fff) * (x_end - x_start)) / 0x400;
- int height = ((vi_yscale & 0x00000fff) * (y_end - y_start)) / 0x400;
+ int width = x_end - x_start;
+ int height = y_end - y_start;
rectangle visarea = screen().visible_area();
// DACRATE is the quarter pixel clock and period will be for a field, not a frame
attoseconds_t period = (vi_hsync & 0xfff) * (vi_vsync & 0xfff) * HZ_TO_ATTOSECONDS(DACRATE_NTSC) / 2;
- if (width == 0 || height == 0 || (vi_control & 3) == 0)
+ if (width <= 0 || height <= 0 || (vi_control & 3) == 0)
{
vi_blank = 1;
/*
@@ -1115,12 +1115,15 @@ void n64_periphs::vi_reg_w(offs_t offset, uint32_t data, uint32_t mem_mask)
break;
case 0x08/4: // VI_WIDTH_REG
- if (vi_width != data && data > 0)
{
- vi_recalculate_resolution();
+ uint32_t old_width = vi_width;
+ vi_width = data;
+ if (old_width != data && data > 0)
+ {
+ vi_recalculate_resolution();
+ }
+ break;
}
- vi_width = data;
- break;
case 0x0c/4: // VI_INTR_REG
vi_intr = data;
diff --git a/src/mame/machine/nes.cpp b/src/mame/machine/nes.cpp
index dcbda5e0413..901d41e2176 100644
--- a/src/mame/machine/nes.cpp
+++ b/src/mame/machine/nes.cpp
@@ -83,13 +83,13 @@ void nes_state::machine_start()
space.install_read_handler(0x8000, 0xffff, read8sm_delegate(*m_cartslot, FUNC(nes_cart_slot_device::read_h)));
}
- if (m_cartslot->get_pcb_id() == BTL_SMB2JB || m_cartslot->get_pcb_id() == UNL_AC08 || m_cartslot->get_pcb_id() == UNL_SMB2J || m_cartslot->get_pcb_id() == BTL_09034A)
+ if (m_cartslot->get_pcb_id() == BTL_SMB2JB || m_cartslot->get_pcb_id() == UNL_AC08 || m_cartslot->get_pcb_id() == UNL_SMB2J)
{
logerror("write_ex installed!\n");
space.install_write_handler(0x4020, 0x40ff, write8sm_delegate(*m_cartslot, FUNC(nes_cart_slot_device::write_ex)));
}
- if (m_cartslot->get_pcb_id() == KAISER_KS7017 || m_cartslot->get_pcb_id() == UNL_603_5052 || m_cartslot->get_pcb_id() == STD_DISKSYS)
+ if (m_cartslot->get_pcb_id() == BTL_09034A || m_cartslot->get_pcb_id() == KAISER_KS7017 || m_cartslot->get_pcb_id() == UNL_603_5052 || m_cartslot->get_pcb_id() == STD_DISKSYS)
{
logerror("write_ex & read_ex installed!\n");
space.install_read_handler(0x4020, 0x40ff, read8sm_delegate(*m_cartslot, FUNC(nes_cart_slot_device::read_ex)));
diff --git a/src/mame/machine/pgmprot_igs027a_type3.cpp b/src/mame/machine/pgmprot_igs027a_type3.cpp
index c153fc6f828..2c633b66394 100644
--- a/src/mame/machine/pgmprot_igs027a_type3.cpp
+++ b/src/mame/machine/pgmprot_igs027a_type3.cpp
@@ -166,6 +166,7 @@ void pgm_arm_type3_state::machine_reset()
if (!strcmp(machine().system().name, "svgpcb")) base = 0x3a8e;
if (!strcmp(machine().system().name, "svg")) base = 0x3c3e;
if (!strcmp(machine().system().name, "svgtw")) base = 0x3a8e;
+ if (!strcmp(machine().system().name, "svghk")) base = 0x3a8e;
if (base != -1)
{
@@ -627,6 +628,21 @@ INPUT_PORTS_START( svg )
PORT_CONFSETTING( 0x00ff, "Don't Change" ) // don't hack the region
INPUT_PORTS_END
+INPUT_PORTS_START( svghk )
+ PORT_INCLUDE ( pgm )
+
+ PORT_START("RegionHack") /* Region - actually supplied by protection device */
+ PORT_CONFNAME( 0x00ff, 0x0004, DEF_STR( Region ) )
+ PORT_CONFSETTING( 0x0000, DEF_STR( China ) )
+ PORT_CONFSETTING( 0x0001, DEF_STR( Taiwan ) )
+ PORT_CONFSETTING( 0x0002, "Japan (AMI license)" )
+ PORT_CONFSETTING( 0x0003, DEF_STR( Korea ) )
+ PORT_CONFSETTING( 0x0004, DEF_STR( Hong_Kong ) )
+ PORT_CONFSETTING( 0x0005, "Spanish Territories" )
+ PORT_CONFSETTING( 0x0006, DEF_STR( World ) )
+ PORT_CONFSETTING( 0x00ff, "Don't Change" ) // don't hack the region
+INPUT_PORTS_END
+
INPUT_PORTS_START( svgtw )
PORT_INCLUDE ( pgm )
diff --git a/src/mame/machine/pgmprot_igs027a_type3.h b/src/mame/machine/pgmprot_igs027a_type3.h
index 5d5f37b3972..5f138fc0d9c 100644
--- a/src/mame/machine/pgmprot_igs027a_type3.h
+++ b/src/mame/machine/pgmprot_igs027a_type3.h
@@ -74,5 +74,6 @@ INPUT_PORTS_EXTERN(theglad);
INPUT_PORTS_EXTERN(happy6);
INPUT_PORTS_EXTERN(happy6hk);
INPUT_PORTS_EXTERN(svg);
+INPUT_PORTS_EXTERN(svghk);
INPUT_PORTS_EXTERN(svgtw);
INPUT_PORTS_EXTERN(svgpcb);
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 4bf4631c161..315f8e012b2 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -1484,6 +1484,9 @@ f2 //
@source:apricotp.cpp
fp //
+@source:apxen.cpp
+apxen // 1985 ACT
+
@source:aquarium.cpp
aquarium // (c) 1996 Excellent System
aquariumj // (c) 1996 Excellent System
@@ -12558,6 +12561,9 @@ dpb7000 //
@source:dps1.cpp
dps1 //
+@source:dpsv55.cpp
+dpsv55 //
+
@source:dragon.cpp
d64plus // Dragon 64 + Compusense Plus addon
dgnalpha // Dragon Alpha
@@ -16280,6 +16286,7 @@ eturtles // Entex
gckong // Gakken
gdigdug // Gakken
ghalien // Gakken
+gscobra // Gakken
kingman // Tomy
machiman // Bandai
msthawk // Mattel
@@ -34709,6 +34716,7 @@ puzzli2s // (c) 2001 Puzzli 2 Super
py2k2 // (c) 2001 Photo Y2K2 (M101XX)
py2k2100 // (c) 2000 Photo Y2K2 (ver. 100)
svg // (c) 2003 Spectral vs Generation
+svghk //
svgpcb //
svgtw //
theglad // (c) 2003 The Gladiator
@@ -39852,7 +39860,8 @@ nprincesu // 834-5677 (c) 1985 (S1)
pitfall2 // 834-5627 [1985?] reprogrammed, (c) 1984 Activision (S1)
pitfall2a // 834-5627 [1985?] reprogrammed, (c) 1984 Activision (S1)
pitfall2u // 834-5627 [1985?] reprogrammed, (c) 1984 Activision (S1)
-raflesia // 834-5753 (c) 1985 Coreland / Sega (S1)
+raflesia // 834-5753 (c) 1986 Coreland / Sega (S1)
+raflesiau // 834-5191 (c) 1986 Coreland / Sega (S1)
regulus // 834-5328?(c) 1983 (S1)
reguluso // 834-5328?(c) 1983 (S1)
regulusu // 834-5328?(c) 1983 (S1)
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index 6c3d14e58de..c08748404cc 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -80,6 +80,7 @@ applix.cpp
apricot.cpp
apricotf.cpp
apricotp.cpp
+apxen.cpp
aquarius.cpp
arcadia.cpp
argo.cpp
@@ -247,6 +248,7 @@ dmv.cpp
dolphunk.cpp
dpb7000.cpp
dps1.cpp
+dpsv55.cpp
dragon.cpp
drumsta.cpp
dsb46.cpp
diff --git a/src/mame/video/apple2.cpp b/src/mame/video/apple2.cpp
index d99d3496a75..92590c9ae2d 100644
--- a/src/mame/video/apple2.cpp
+++ b/src/mame/video/apple2.cpp
@@ -1485,10 +1485,20 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 &
{
int const shrline = beamy - BORDER_TOP;
- uint8_t const scb = m_aux_ptr[0x9D00 + shrline];
+ uint8_t scb;
+ if (shrline & 1)
+ {
+ scb = m_aux_ptr[0x9e80 + (shrline >> 1)];
+ }
+ else
+ {
+ scb = m_aux_ptr[0x5e80 + (shrline >> 1)];
+ }
int const palette = ((scb & 0x0f) << 4);
- uint8_t const *const vram = &m_aux_ptr[0x2000 + (shrline * 160)];
+ uint8_t const *const vram = &m_aux_ptr[0x2000 + (shrline * 80)];
+ uint8_t const *const vram2 = &m_aux_ptr[0x6000 + (shrline * 80)];
+
uint32_t *const scanline = &bitmap.pix(beamy);
// draw left and right borders
@@ -1500,13 +1510,19 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 &
if (scb & 0x80) // 640 mode
{
- for (int col = 0; col < 160; col++)
+ for (int col = 0; col < 80; col++)
{
- uint8_t const b = vram[col];
- scanline[col * 4 + 0 + BORDER_LEFT] = m_shr_palette[palette + 0 + ((b >> 6) & 0x03)];
- scanline[col * 4 + 1 + BORDER_LEFT] = m_shr_palette[palette + 4 + ((b >> 4) & 0x03)];
- scanline[col * 4 + 2 + BORDER_LEFT] = m_shr_palette[palette + 8 + ((b >> 2) & 0x03)];
- scanline[col * 4 + 3 + BORDER_LEFT] = m_shr_palette[palette + 12 + ((b >> 0) & 0x03)];
+ uint8_t b = vram[col];
+ scanline[col * 8 + 0 + BORDER_LEFT] = m_shr_palette[palette + 0 + ((b >> 6) & 0x03)];
+ scanline[col * 8 + 1 + BORDER_LEFT] = m_shr_palette[palette + 4 + ((b >> 4) & 0x03)];
+ scanline[col * 8 + 2 + BORDER_LEFT] = m_shr_palette[palette + 8 + ((b >> 2) & 0x03)];
+ scanline[col * 8 + 3 + BORDER_LEFT] = m_shr_palette[palette + 12 + ((b >> 0) & 0x03)];
+
+ b = vram2[col];
+ scanline[col * 8 + 4 + BORDER_LEFT] = m_shr_palette[palette + 0 + ((b >> 6) & 0x03)];
+ scanline[col * 8 + 5 + BORDER_LEFT] = m_shr_palette[palette + 4 + ((b >> 4) & 0x03)];
+ scanline[col * 8 + 6 + BORDER_LEFT] = m_shr_palette[palette + 8 + ((b >> 2) & 0x03)];
+ scanline[col * 8 + 7 + BORDER_LEFT] = m_shr_palette[palette + 12 + ((b >> 0) & 0x03)];
}
}
else // 320 mode
@@ -1520,7 +1536,7 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 &
};
uint32_t last_pixel = fillmode_init[scb & 0x1f];
- for (int col = 0; col < 160; col++)
+ for (int col = 0; col < 80; col++)
{
uint8_t b;
uint32_t pixel;
@@ -1533,10 +1549,30 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 &
else
last_pixel = pixel;
pixel += palette;
- scanline[col * 4 + 0 + BORDER_LEFT] = m_shr_palette[pixel];
- scanline[col * 4 + 1 + BORDER_LEFT] = m_shr_palette[pixel];
+ scanline[col * 8 + 0 + BORDER_LEFT] = m_shr_palette[pixel];
+ scanline[col * 8 + 1 + BORDER_LEFT] = m_shr_palette[pixel];
+
+ pixel = (b >> 0) & 0x0f;
+
+ if ((scb & 0x20) && !pixel)
+ pixel = last_pixel;
+ else
+ last_pixel = pixel;
+ pixel += palette;
+ scanline[col * 8 + 2 + BORDER_LEFT] = m_shr_palette[pixel];
+ scanline[col * 8 + 3 + BORDER_LEFT] = m_shr_palette[pixel];
+
+ b = vram2[col];
+ pixel = (b >> 4) & 0x0f;
+
+ if ((scb & 0x20) && !pixel)
+ pixel = last_pixel;
+ else
+ last_pixel = pixel;
+ pixel += palette;
+ scanline[col * 8 + 4 + BORDER_LEFT] = m_shr_palette[pixel];
+ scanline[col * 8 + 5 + BORDER_LEFT] = m_shr_palette[pixel];
- b = vram[col];
pixel = (b >> 0) & 0x0f;
if ((scb & 0x20) && !pixel)
@@ -1544,8 +1580,8 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 &
else
last_pixel = pixel;
pixel += palette;
- scanline[col * 4 + 2 + BORDER_LEFT] = m_shr_palette[pixel];
- scanline[col * 4 + 3 + BORDER_LEFT] = m_shr_palette[pixel];
+ scanline[col * 8 + 6 + BORDER_LEFT] = m_shr_palette[pixel];
+ scanline[col * 8 + 7 + BORDER_LEFT] = m_shr_palette[pixel];
}
}
}
diff --git a/src/mame/video/gime.cpp b/src/mame/video/gime.cpp
index dc25538a73b..47745cd433d 100644
--- a/src/mame/video/gime.cpp
+++ b/src/mame/video/gime.cpp
@@ -77,6 +77,8 @@
ARKANOID: Abuses TIMER = 0 for ball ricochet sounds
+ POP*STAR PILOT: Timer is synchronized with scanlines.
+
**********************************************************************/
@@ -480,12 +482,12 @@ void gime_device::reset_timer(void)
if (timer_type() == GIME_TIMER_63USEC)
{
// master clock divided by 8, divided by 228, divided by 2
- m_gime_clock_timer->adjust(attotime::from_hz(clock()) * 3648 * m_timer_value);
+ m_gime_clock_timer->adjust(attotime::from_hz(clock()) * 3648 * m_timer_value / 2);
}
else
{
// master clock divided by 8, divided by 2
- m_gime_clock_timer->adjust(attotime::from_hz(clock()) * 16 * m_timer_value);
+ m_gime_clock_timer->adjust(attotime::from_hz(clock()) * 16 * m_timer_value / 2);
}
}
else
@@ -529,19 +531,16 @@ void gime_device::update_memory(int bank)
// bank 8 is really $FE00-$FEFF; it is weird so adjust for it
offs_t offset;
- bool force_ram;
bool enable_mmu = (m_gime_registers[0] & 0x40) ? true : false;
if (bank == 8)
{
bank = 7;
offset = 0x1E00;
- force_ram = (m_gime_registers[0] & 0x08);
enable_mmu = enable_mmu && !(m_gime_registers[0] & 0x08);
}
else
{
offset = 0x0000;
- force_ram = false;
}
// is the MMU enabled at $FF90?
@@ -566,7 +565,7 @@ void gime_device::update_memory(int bank)
// are we actually in ROM?
uint8_t *memory;
bool is_read_only;
- if (((block & 0x3F) >= 0x3C) && !(m_sam_state & SAM_STATE_TY) && !force_ram)
+ if (((block & 0x3F) >= 0x3C) && !(m_sam_state & SAM_STATE_TY))
{
// we're in ROM
const uint8_t rom_mode = m_gime_registers[0] & 3;
diff --git a/src/mame/video/n64.cpp b/src/mame/video/n64.cpp
index 1e4a0a75afe..5268e642323 100644
--- a/src/mame/video/n64.cpp
+++ b/src/mame/video/n64.cpp
@@ -171,7 +171,7 @@ WRITE_LINE_MEMBER(n64_state::screen_vblank_n64)
void n64_periphs::video_update(bitmap_rgb32 &bitmap)
{
- if(vi_control & 0x40) /* Interlace */
+ if (vi_control & 0x40) /* Interlace */
{
field ^= 1;
}
@@ -180,7 +180,7 @@ void n64_periphs::video_update(bitmap_rgb32 &bitmap)
field = 0;
}
- switch(vi_control & 0x3)
+ switch (vi_control & 0x3)
{
case PIXEL_SIZE_16BIT:
video_update16(bitmap);
@@ -210,58 +210,126 @@ void n64_periphs::video_update16(bitmap_rgb32 &bitmap)
//uint32_t hb = ((n64->vi_origin & 0xffffff) >> 2) >> 1;
//uint8_t* hidden_buffer = &m_hidden_bits[hb];
- int32_t hdiff = (vi_hstart & 0x3ff) - ((vi_hstart >> 16) & 0x3ff);
+ int32_t hend = vi_hstart & 0x3ff;
+ int32_t hstart = (vi_hstart >> 16) & 0x3ff;
+ int32_t hdiff = hend - hstart;
float hcoeff = ((float)(vi_xscale & 0xfff) / (1 << 10));
uint32_t hres = ((float)hdiff * hcoeff);
- int32_t invisiblewidth = vi_width - hres;
- int32_t vdiff = ((vi_vstart & 0x3ff) - ((vi_vstart >> 16) & 0x3ff)) >> 1;
+ int32_t vend = (vi_vstart & 0x3ff) >> 1;
+ int32_t vstart = ((vi_vstart >> 16) & 0x3ff) >> 1;
+ int32_t vdiff = vend - vstart;
float vcoeff = ((float)(vi_yscale & 0xfff) / (1 << 10));
uint32_t vres = ((float)vdiff * vcoeff);
+ fflush(stdout);
+
if (vdiff <= 0 || hdiff <= 0)
{
return;
}
- //if (hres > 640) // Needed by Top Gear Overdrive (E)
- //{
- // invisiblewidth += (hres - 640);
- // hres = 640;
- //}
-
if (vres > bitmap.height()) // makes Perfect Dark boot w/o crashing
{
vres = bitmap.height();
}
- uint32_t pixels = 0;
-
if (frame_buffer)
{
- for(int32_t j = 0; j < vres; j++)
+ const uint32_t aa_control = (vi_control >> 8) & 3;
+ float v0 = 0.0f;
+ if (aa_control < 3) // Resample pixels
{
- uint32_t *const d = &bitmap.pix(j);
+ for (int32_t j = 0; j < vdiff; j++, v0 += vcoeff)
+ {
+ uint32_t *const d = &bitmap.pix(j);
+
+ float u0 = (float)0.0f;
+
+ int iv0 = (int)v0;
+ int pix_v0_line = iv0 * vi_width;
+
+ int iv1 = (iv0 >= (vres - 1) ? iv0 : (iv0 + 1));
+ int pix_v1_line = iv1 * vi_width;
+
+ for (int32_t i = 0; i < hdiff; i++)
+ {
+ int iu0 = (int)u0;
+ int iu1 = (iu0 >= (hres - 1) ? iu0 : (iu0 + 1));
+ uint16_t pix00 = frame_buffer[(pix_v0_line + iu0) ^ WORD_ADDR_XOR];
+ uint16_t pix10 = frame_buffer[(pix_v0_line + iu1) ^ WORD_ADDR_XOR];
+ uint16_t pix01 = frame_buffer[(pix_v1_line + iu0) ^ WORD_ADDR_XOR];
+ uint16_t pix11 = frame_buffer[(pix_v1_line + iu1) ^ WORD_ADDR_XOR];
+
+ const uint8_t r00 = ((pix00 >> 8) & 0xf8) | (pix00 >> 13);
+ const uint8_t g00 = ((pix00 >> 3) & 0xf8) | ((pix00 >> 8) & 0x07);
+ const uint8_t b00 = ((pix00 << 2) & 0xf8) | ((pix00 >> 3) & 0x07);
+
+ const uint8_t r10 = ((pix10 >> 8) & 0xf8) | (pix10 >> 13);
+ const uint8_t g10 = ((pix10 >> 3) & 0xf8) | ((pix10 >> 8) & 0x07);
+ const uint8_t b10 = ((pix10 << 2) & 0xf8) | ((pix10 >> 3) & 0x07);
+
+ const uint8_t r01 = ((pix01 >> 8) & 0xf8) | (pix01 >> 13);
+ const uint8_t g01 = ((pix01 >> 3) & 0xf8) | ((pix01 >> 8) & 0x07);
+ const uint8_t b01 = ((pix01 << 2) & 0xf8) | ((pix01 >> 3) & 0x07);
- for(int32_t i = 0; i < hres; i++)
+ const uint8_t r11 = ((pix11 >> 8) & 0xf8) | (pix11 >> 13);
+ const uint8_t g11 = ((pix11 >> 3) & 0xf8) | ((pix11 >> 8) & 0x07);
+ const uint8_t b11 = ((pix11 << 2) & 0xf8) | ((pix11 >> 3) & 0x07);
+
+ const float ut = u0 - (int)u0;
+ const float vt = v0 - (int)v0;
+
+ float ur0 = (1.0f - ut) * r00 + ut * r10;
+ float ug0 = (1.0f - ut) * g00 + ut * g10;
+ float ub0 = (1.0f - ut) * b00 + ut * b10;
+
+ float ur1 = (1.0f - ut) * r01 + ut * r11;
+ float ug1 = (1.0f - ut) * g01 + ut * g11;
+ float ub1 = (1.0f - ut) * b01 + ut * b11;
+
+ float r = (1.0f - vt) * ur0 + vt * ur1;
+ float g = (1.0f - vt) * ug0 + vt * ug1;
+ float b = (1.0f - vt) * ub0 + vt * ub1;
+
+ uint8_t r8 = std::clamp((uint8_t)r, (uint8_t)0, (uint8_t)255);
+ uint8_t g8 = std::clamp((uint8_t)g, (uint8_t)0, (uint8_t)255);
+ uint8_t b8 = std::clamp((uint8_t)b, (uint8_t)0, (uint8_t)255);
+
+ d[i] = (r8 << 16) | (g8 << 8) | b8;
+
+ u0 += hcoeff;
+ }
+ }
+ }
+ else // Replicate pixels
+ {
+ for (int32_t j = 0; j < vdiff; j++, v0 += vcoeff)
{
- uint16_t pix = frame_buffer[pixels ^ WORD_ADDR_XOR];
+ uint32_t *const d = &bitmap.pix(j);
+
+ int iv0 = (int)v0;
+ int pix_v0_line = iv0 * vi_width;
- const uint8_t r = ((pix >> 8) & 0xf8) | (pix >> 13);
- const uint8_t g = ((pix >> 3) & 0xf8) | ((pix >> 8) & 0x07);
- const uint8_t b = ((pix << 2) & 0xf8) | ((pix >> 3) & 0x07);
- d[i] = (r << 16) | (g << 8) | b;
- pixels++;
+ for (int32_t i = 0; i < hdiff; i++)
+ {
+ int u0 = (int)(i * hcoeff);
+ uint16_t pix = frame_buffer[(pix_v0_line + u0) ^ WORD_ADDR_XOR];
+
+ const uint8_t r = ((pix >> 8) & 0xf8) | (pix >> 13);
+ const uint8_t g = ((pix >> 3) & 0xf8) | ((pix >> 8) & 0x07);
+ const uint8_t b = ((pix << 2) & 0xf8) | ((pix >> 3) & 0x07);
+ d[i] = (r << 16) | (g << 8) | b;
+ }
}
- pixels += invisiblewidth;
}
}
}
void n64_periphs::video_update32(bitmap_rgb32 &bitmap)
{
- int32_t gamma = (vi_control >> 3) & 1;
- int32_t gamma_dither = (vi_control >> 2) & 1;
+ //int32_t gamma = (vi_control >> 3) & 1;
+ //int32_t gamma_dither = (vi_control >> 2) & 1;
//int32_t vibuffering = ((n64->vi_control & 2) && fsaa && divot);
uint32_t* frame_buffer32 = (uint32_t*)&m_rdram[(vi_origin & 0xffffff) >> 2];
@@ -269,7 +337,6 @@ void n64_periphs::video_update32(bitmap_rgb32 &bitmap)
const int32_t hdiff = (vi_hstart & 0x3ff) - ((vi_hstart >> 16) & 0x3ff);
const float hcoeff = ((float)(vi_xscale & 0xfff) / (1 << 10));
uint32_t hres = ((float)hdiff * hcoeff);
- int32_t invisiblewidth = vi_width - hres;
const int32_t vdiff = ((vi_vstart & 0x3ff) - ((vi_vstart >> 16) & 0x3ff)) >> 1;
const float vcoeff = ((float)(vi_yscale & 0xfff) / (1 << 10));
@@ -280,60 +347,89 @@ void n64_periphs::video_update32(bitmap_rgb32 &bitmap)
return;
}
- //if (hres > 640) // Needed by Top Gear Overdrive (E)
- //{
- // invisiblewidth += (hres - 640);
- // hres = 640;
- //}
-
if (frame_buffer32)
{
- for (int32_t j = 0; j < vres; j++)
+ const uint32_t aa_control = (vi_control >> 8) & 3;
+ float v0 = 0.0f;
+ if (aa_control < 3) // Resample pixels
{
- uint32_t *const d = &bitmap.pix(j);
- for (int32_t i = 0; i < hres; i++)
+ for (int32_t j = 0; j < vdiff; j++, v0 += vcoeff)
{
- uint32_t pix = *frame_buffer32++;
- if (gamma || gamma_dither)
+ uint32_t *const d = &bitmap.pix(j);
+
+ float u0 = 0.0f;
+
+ int iv0 = (int)v0;
+ int pix_v0_line = iv0 * vi_width;
+
+ int iv1 = (iv0 >= (vres - 1) ? iv0 : (iv0 + 1));
+ int pix_v1_line = iv1 * vi_width;
+
+ for (int32_t i = 0; i < hdiff; i++)
{
- int32_t r = (pix >> 24) & 0xff;
- int32_t g = (pix >> 16) & 0xff;
- int32_t b = (pix >> 8) & 0xff;
- int32_t dith = 0;
- if (gamma_dither)
- {
- dith = get_random() & 0x3f;
- }
- if (gamma)
- {
- if (gamma_dither)
- {
- r = m_gamma_dither_table[(r << 6)| dith];
- g = m_gamma_dither_table[(g << 6)| dith];
- b = m_gamma_dither_table[(b << 6)| dith];
- }
- else
- {
- r = m_gamma_table[r];
- g = m_gamma_table[g];
- b = m_gamma_table[b];
- }
- }
- else if (gamma_dither)
- {
- if (r < 255)
- r += (dith & 1);
- if (g < 255)
- g += (dith & 1);
- if (b < 255)
- b += (dith & 1);
- }
- pix = (r << 24) | (g << 16) | (b << 8);
+ int iu0 = (int)u0;
+ int iu1 = (iu0 >= (hres - 1) ? iu0 : (iu0 + 1));
+ uint32_t pix00 = frame_buffer32[pix_v0_line + iu0];
+ uint32_t pix10 = frame_buffer32[pix_v0_line + iu1];
+ uint32_t pix01 = frame_buffer32[pix_v1_line + iu0];
+ uint32_t pix11 = frame_buffer32[pix_v1_line + iu1];
+
+ const uint8_t r00 = (uint8_t)(pix00 >> 16);
+ const uint8_t g00 = (uint8_t)(pix00 >> 8);
+ const uint8_t b00 = (uint8_t)pix00;
+
+ const uint8_t r10 = (uint8_t)(pix01 >> 16);
+ const uint8_t g10 = (uint8_t)(pix01 >> 8);
+ const uint8_t b10 = (uint8_t)pix01;
+
+ const uint8_t r01 = (uint8_t)(pix10 >> 16);
+ const uint8_t g01 = (uint8_t)(pix10 >> 8);
+ const uint8_t b01 = (uint8_t)pix10;
+
+ const uint8_t r11 = (uint8_t)(pix11 >> 16);
+ const uint8_t g11 = (uint8_t)(pix11 >> 8);
+ const uint8_t b11 = (uint8_t)pix11;
+
+ const float ut = u0 - (int)u0;
+ const float vt = v0 - (int)v0;
+
+ float ur0 = (1.0f - ut) * r00 + ut * r10;
+ float ug0 = (1.0f - ut) * g00 + ut * g10;
+ float ub0 = (1.0f - ut) * b00 + ut * b10;
+
+ float ur1 = (1.0f - ut) * r01 + ut * r11;
+ float ug1 = (1.0f - ut) * g01 + ut * g11;
+ float ub1 = (1.0f - ut) * b01 + ut * b11;
+
+ float r = (1.0f - vt) * ur0 + vt * ur1;
+ float g = (1.0f - vt) * ug0 + vt * ug1;
+ float b = (1.0f - vt) * ub0 + vt * ub1;
+
+ uint8_t r8 = std::clamp((uint8_t)r, (uint8_t)0, (uint8_t)255);
+ uint8_t g8 = std::clamp((uint8_t)g, (uint8_t)0, (uint8_t)255);
+ uint8_t b8 = std::clamp((uint8_t)b, (uint8_t)0, (uint8_t)255);
+
+ d[i] = (r8 << 16) | (g8 << 8) | b8;
+
+ u0 += hcoeff;
}
+ }
+ }
+ else // Replicate pixels
+ {
+ for (int32_t j = 0; j < vdiff; j++, v0 += vcoeff)
+ {
+ uint32_t *const d = &bitmap.pix(j);
- d[i] = (pix >> 8);
+ int iv0 = (int)v0;
+ int pix_v0_line = iv0 * vi_width;
+
+ for (int32_t i = 0; i < hdiff; i++)
+ {
+ int u0 = (int)(i * hcoeff);
+ d[i] = (frame_buffer32[pix_v0_line + u0] >> 8);
+ }
}
- frame_buffer32 += invisiblewidth;
}
}
}
@@ -603,18 +699,18 @@ void n64_rdp::set_blender_input(int32_t cycle, int32_t which, color_t** input_rg
uint8_t const n64_rdp::s_bayer_matrix[16] =
{ /* Bayer matrix */
- 0, 4, 1, 5,
- 6, 2, 7, 3,
- 1, 5, 0, 4,
- 7, 3, 6, 2
+ 0, 4, 1, 5,
+ 6, 2, 7, 3,
+ 1, 5, 0, 4,
+ 7, 3, 6, 2
};
uint8_t const n64_rdp::s_magic_matrix[16] =
{ /* Magic square matrix */
- 0, 6, 1, 7,
- 4, 2, 5, 3,
- 3, 5, 2, 4,
- 7, 1, 6, 0
+ 0, 4, 3, 7,
+ 6, 2, 5, 1,
+ 1, 5, 2, 6,
+ 7, 3, 4, 0
};
z_decompress_entry_t const n64_rdp::m_z_dec_table[8] =
@@ -3008,11 +3104,6 @@ void n64_rdp::cmd_set_color_image(uint64_t w1)
m_misc_state.m_fb_size = uint32_t(w1 >> 51) & 0x3;
m_misc_state.m_fb_width = (uint32_t(w1 >> 32) & 0x3ff) + 1;
m_misc_state.m_fb_address = uint32_t(w1) & 0x01ffffff;
-
- if (m_misc_state.m_fb_format < 2 || m_misc_state.m_fb_format > 32) // Jet Force Gemini sets the format to 4, Intensity. Protection?
- {
- m_misc_state.m_fb_format = 2;
- }
}
/*****************************************************************************/
@@ -3216,6 +3307,26 @@ n64_rdp::n64_rdp(n64_state &state, uint32_t* rdram, uint32_t* dmem) : poly_manag
m_compute_cvg[0] = &n64_rdp::compute_cvg_noflip;
m_compute_cvg[1] = &n64_rdp::compute_cvg_flip;
+
+ m_write_pixel[0] = &n64_rdp::write_pixel4;
+ m_write_pixel[1] = &n64_rdp::write_pixel8;
+ m_write_pixel[2] = &n64_rdp::write_pixel16;
+ m_write_pixel[3] = &n64_rdp::write_pixel32;
+
+ m_read_pixel[0] = &n64_rdp::read_pixel4;
+ m_read_pixel[1] = &n64_rdp::read_pixel8;
+ m_read_pixel[2] = &n64_rdp::read_pixel16;
+ m_read_pixel[3] = &n64_rdp::read_pixel32;
+
+ m_copy_pixel[0] = &n64_rdp::copy_pixel4;
+ m_copy_pixel[1] = &n64_rdp::copy_pixel8;
+ m_copy_pixel[2] = &n64_rdp::copy_pixel16;
+ m_copy_pixel[3] = &n64_rdp::copy_pixel32;
+
+ m_fill_pixel[0] = &n64_rdp::fill_pixel4;
+ m_fill_pixel[1] = &n64_rdp::fill_pixel8;
+ m_fill_pixel[2] = &n64_rdp::fill_pixel16;
+ m_fill_pixel[3] = &n64_rdp::fill_pixel32;
}
void n64_rdp::render_spans(int32_t start, int32_t end, int32_t tilenum, bool flip, extent_t* spans, bool rect, rdp_poly_state* object)
@@ -3333,185 +3444,234 @@ void n64_rdp::rgbaz_correct_triangle(int32_t offx, int32_t offy, int32_t* r, int
}
}
-inline void n64_rdp::write_pixel(uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object)
+void n64_rdp::write_pixel4(uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object)
{
- if (object.m_misc_state.m_fb_size == 2) // 16-bit framebuffer
- {
- const uint32_t fb = (object.m_misc_state.m_fb_address >> 1) + curpixel;
+ // Not yet implemented
+}
- uint16_t finalcolor;
- if (object.m_other_modes.color_on_cvg && !userdata->m_pre_wrap)
- {
- finalcolor = RREADIDX16(fb) & 0xfffe;
- }
- else
- {
- color.shr_imm(3);
- finalcolor = (color.get_r() << 11) | (color.get_g() << 6) | (color.get_b() << 1);
- }
+void n64_rdp::write_pixel8(uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object)
+{
+ const uint8_t c = (color.get_r() & 0xf8) | ((color.get_g() & 0xf8) >> 5);
+ if (c != 0)
+ RWRITEADDR8(object.m_misc_state.m_fb_address + curpixel, c);
+}
- switch (object.m_other_modes.cvg_dest)
- {
- case 0:
- if (userdata->m_blend_enable)
- {
- uint32_t finalcvg = userdata->m_current_pix_cvg + userdata->m_current_mem_cvg;
- if (finalcvg & 8)
- {
- finalcvg = 7;
- }
- RWRITEIDX16(fb, finalcolor | (finalcvg >> 2));
- HWRITEADDR8(fb, finalcvg & 3);
- }
- else
+void n64_rdp::write_pixel16(uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object)
+{
+ const uint32_t fb = (object.m_misc_state.m_fb_address >> 1) + curpixel;
+
+ uint16_t finalcolor;
+ if (object.m_other_modes.color_on_cvg && !userdata->m_pre_wrap)
+ {
+ finalcolor = RREADIDX16(fb) & 0xfffe;
+ }
+ else
+ {
+ color.shr_imm(3);
+ finalcolor = (color.get_r() << 11) | (color.get_g() << 6) | (color.get_b() << 1);
+ }
+
+ switch (object.m_other_modes.cvg_dest)
+ {
+ case 0:
+ if (userdata->m_blend_enable)
+ {
+ uint32_t finalcvg = userdata->m_current_pix_cvg + userdata->m_current_mem_cvg;
+ if (finalcvg & 8)
{
- const uint32_t finalcvg = (userdata->m_current_pix_cvg - 1) & 7;
- RWRITEIDX16(fb, finalcolor | (finalcvg >> 2));
- HWRITEADDR8(fb, finalcvg & 3);
+ finalcvg = 7;
}
- break;
- case 1:
+ RWRITEIDX16(fb, finalcolor | (finalcvg >> 2));
+ HWRITEADDR8(fb, finalcvg & 3);
+ }
+ else
{
- const uint32_t finalcvg = (userdata->m_current_pix_cvg + userdata->m_current_mem_cvg) & 7;
+ const uint32_t finalcvg = (userdata->m_current_pix_cvg - 1) & 7;
RWRITEIDX16(fb, finalcolor | (finalcvg >> 2));
HWRITEADDR8(fb, finalcvg & 3);
- break;
}
- case 2:
- RWRITEIDX16(fb, finalcolor | 1);
- HWRITEADDR8(fb, 3);
- break;
- case 3:
- RWRITEIDX16(fb, finalcolor | (userdata->m_current_mem_cvg >> 2));
- HWRITEADDR8(fb, userdata->m_current_mem_cvg & 3);
- break;
+ break;
+ case 1:
+ {
+ const uint32_t finalcvg = (userdata->m_current_pix_cvg + userdata->m_current_mem_cvg) & 7;
+ RWRITEIDX16(fb, finalcolor | (finalcvg >> 2));
+ HWRITEADDR8(fb, finalcvg & 3);
+ break;
}
+ case 2:
+ RWRITEIDX16(fb, finalcolor | 1);
+ HWRITEADDR8(fb, 3);
+ break;
+ case 3:
+ RWRITEIDX16(fb, finalcolor | (userdata->m_current_mem_cvg >> 2));
+ HWRITEADDR8(fb, userdata->m_current_mem_cvg & 3);
+ break;
}
- else // 32-bit framebuffer
- {
- const uint32_t fb = (object.m_misc_state.m_fb_address >> 2) + curpixel;
+}
- uint32_t finalcolor;
- if (object.m_other_modes.color_on_cvg && !userdata->m_pre_wrap)
- {
- finalcolor = RREADIDX32(fb) & 0xffffff00;
- }
- else
- {
- finalcolor = (color.get_r() << 24) | (color.get_g() << 16) | (color.get_b() << 8);
- }
+void n64_rdp::write_pixel32(uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object)
+{
+ const uint32_t fb = (object.m_misc_state.m_fb_address >> 2) + curpixel;
- switch (object.m_other_modes.cvg_dest)
- {
- case 0:
- if (userdata->m_blend_enable)
- {
- uint32_t finalcvg = userdata->m_current_pix_cvg + userdata->m_current_mem_cvg;
- if (finalcvg & 8)
- {
- finalcvg = 7;
- }
+ uint32_t finalcolor;
+ if (object.m_other_modes.color_on_cvg && !userdata->m_pre_wrap)
+ {
+ finalcolor = RREADIDX32(fb) & 0xffffff00;
+ }
+ else
+ {
+ finalcolor = (color.get_r() << 24) | (color.get_g() << 16) | (color.get_b() << 8);
+ }
- RWRITEIDX32(fb, finalcolor | (finalcvg << 5));
- }
- else
+ switch (object.m_other_modes.cvg_dest)
+ {
+ case 0:
+ if (userdata->m_blend_enable)
+ {
+ uint32_t finalcvg = userdata->m_current_pix_cvg + userdata->m_current_mem_cvg;
+ if (finalcvg & 8)
{
- RWRITEIDX32(fb, finalcolor | (((userdata->m_current_pix_cvg - 1) & 7) << 5));
+ finalcvg = 7;
}
- break;
- case 1:
- RWRITEIDX32(fb, finalcolor | (((userdata->m_current_pix_cvg + userdata->m_current_mem_cvg) & 7) << 5));
- break;
- case 2:
- RWRITEIDX32(fb, finalcolor | 0xE0);
- break;
- case 3:
- RWRITEIDX32(fb, finalcolor | (userdata->m_current_mem_cvg << 5));
- break;
- }
+
+ RWRITEIDX32(fb, finalcolor | (finalcvg << 5));
+ }
+ else
+ {
+ RWRITEIDX32(fb, finalcolor | (((userdata->m_current_pix_cvg - 1) & 7) << 5));
+ }
+ break;
+ case 1:
+ RWRITEIDX32(fb, finalcolor | (((userdata->m_current_pix_cvg + userdata->m_current_mem_cvg) & 7) << 5));
+ break;
+ case 2:
+ RWRITEIDX32(fb, finalcolor | 0xE0);
+ break;
+ case 3:
+ RWRITEIDX32(fb, finalcolor | (userdata->m_current_mem_cvg << 5));
+ break;
}
}
-inline void n64_rdp::read_pixel(uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object)
+void n64_rdp::read_pixel4(uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object)
+{
+ userdata->m_memory_color.set(0, 0, 0, 0);
+ userdata->m_current_mem_cvg = 7;
+}
+
+void n64_rdp::read_pixel8(uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object)
+{
+ const uint8_t fbyte = RREADADDR8(object.m_misc_state.m_fb_address + curpixel);
+ const uint8_t r8 = (fbyte & 0xf8) | (fbyte >> 5);
+ uint8_t g8 = (fbyte & 0x07);
+ g8 |= g8 << 3;
+ g8 |= g8 << 6;
+ userdata->m_memory_color.set(0, r8, g8, 0);
+ userdata->m_memory_color.set_a(0xff);
+ userdata->m_current_mem_cvg = 7;
+}
+
+void n64_rdp::read_pixel16(uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object)
{
- if (object.m_misc_state.m_fb_size == 2) // 16-bit framebuffer
+ const uint16_t fword = RREADIDX16((object.m_misc_state.m_fb_address >> 1) + curpixel);
+
+ userdata->m_memory_color.set(0, GETHICOL(fword), GETMEDCOL(fword), GETLOWCOL(fword));
+ if (object.m_other_modes.image_read_en)
{
- const uint16_t fword = RREADIDX16((object.m_misc_state.m_fb_address >> 1) + curpixel);
+ uint8_t hbyte = HREADADDR8((object.m_misc_state.m_fb_address >> 1) + curpixel);
+ userdata->m_memory_color.set_a(userdata->m_current_mem_cvg << 5);
+ userdata->m_current_mem_cvg = ((fword & 1) << 2) | (hbyte & 3);
+ }
+ else
+ {
+ userdata->m_memory_color.set_a(0xff);
+ userdata->m_current_mem_cvg = 7;
+ }
+}
- userdata->m_memory_color.set(0, GETHICOL(fword), GETMEDCOL(fword), GETLOWCOL(fword));
- if (object.m_other_modes.image_read_en)
- {
- uint8_t hbyte = HREADADDR8((object.m_misc_state.m_fb_address >> 1) + curpixel);
- userdata->m_memory_color.set_a(userdata->m_current_mem_cvg << 5);
- userdata->m_current_mem_cvg = ((fword & 1) << 2) | (hbyte & 3);
- }
- else
- {
- userdata->m_memory_color.set_a(0xff);
- userdata->m_current_mem_cvg = 7;
- }
+void n64_rdp::read_pixel32(uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object)
+{
+ const uint32_t mem = RREADIDX32((object.m_misc_state.m_fb_address >> 2) + curpixel);
+ userdata->m_memory_color.set(0, (mem >> 24) & 0xff, (mem >> 16) & 0xff, (mem >> 8) & 0xff);
+ if (object.m_other_modes.image_read_en)
+ {
+ userdata->m_memory_color.set_a(mem & 0xff);
+ userdata->m_current_mem_cvg = (mem >> 5) & 7;
}
- else // 32-bit framebuffer
+ else
{
- const uint32_t mem = RREADIDX32((object.m_misc_state.m_fb_address >> 2) + curpixel);
- userdata->m_memory_color.set(0, (mem >> 24) & 0xff, (mem >> 16) & 0xff, (mem >> 8) & 0xff);
- if (object.m_other_modes.image_read_en)
- {
- userdata->m_memory_color.set_a(mem & 0xff);
- userdata->m_current_mem_cvg = (mem >> 5) & 7;
- }
- else
- {
- userdata->m_memory_color.set_a(0xff);
- userdata->m_current_mem_cvg = 7;
- }
+ userdata->m_memory_color.set_a(0xff);
+ userdata->m_current_mem_cvg = 7;
}
}
-inline void n64_rdp::copy_pixel(uint32_t curpixel, color_t& color, const rdp_poly_state &object)
+void n64_rdp::copy_pixel4(uint32_t curpixel, color_t& color, const rdp_poly_state &object)
+{
+ // Not yet implemented
+}
+
+void n64_rdp::copy_pixel8(uint32_t curpixel, color_t& color, const rdp_poly_state &object)
+{
+ const uint8_t c = (color.get_r() & 0xf8) | ((color.get_g() & 0xf8) >> 5);
+ if (c != 0)
+ RWRITEADDR8(object.m_misc_state.m_fb_address + curpixel, c);
+}
+
+void n64_rdp::copy_pixel16(uint32_t curpixel, color_t& color, const rdp_poly_state &object)
{
const uint32_t current_pix_cvg = color.get_a() ? 7 : 0;
const uint8_t r = color.get_r(); // Vectorize me
const uint8_t g = color.get_g();
const uint8_t b = color.get_b();
- if (object.m_misc_state.m_fb_size == 2) // 16-bit framebuffer
- {
- RWRITEIDX16((object.m_misc_state.m_fb_address >> 1) + curpixel, ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1) | ((current_pix_cvg >> 2) & 1));
- HWRITEADDR8((object.m_misc_state.m_fb_address >> 1) + curpixel, current_pix_cvg & 3);
- }
- else // 32-bit framebuffer
- {
- RWRITEIDX32((object.m_misc_state.m_fb_address >> 2) + curpixel, (r << 24) | (g << 16) | (b << 8) | (current_pix_cvg << 5));
- }
+ RWRITEIDX16((object.m_misc_state.m_fb_address >> 1) + curpixel, ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1) | ((current_pix_cvg >> 2) & 1));
+ HWRITEADDR8((object.m_misc_state.m_fb_address >> 1) + curpixel, current_pix_cvg & 3);
+}
+
+void n64_rdp::copy_pixel32(uint32_t curpixel, color_t& color, const rdp_poly_state &object)
+{
+ const uint32_t current_pix_cvg = color.get_a() ? 7 : 0;
+ const uint8_t r = color.get_r(); // Vectorize me
+ const uint8_t g = color.get_g();
+ const uint8_t b = color.get_b();
+ RWRITEIDX32((object.m_misc_state.m_fb_address >> 2) + curpixel, (r << 24) | (g << 16) | (b << 8) | (current_pix_cvg << 5));
+}
+
+void n64_rdp::fill_pixel4(uint32_t curpixel, const rdp_poly_state &object)
+{
+ // Not yet implemented
}
-inline void n64_rdp::fill_pixel(uint32_t curpixel, const rdp_poly_state &object)
+void n64_rdp::fill_pixel8(uint32_t curpixel, const rdp_poly_state &object)
{
- if (object.m_misc_state.m_fb_size == 2) // 16-bit framebuffer
+ const uint8_t byte_shift = ((curpixel & 3) ^ BYTE_ADDR_XOR) << 3;
+ RWRITEADDR8(object.m_misc_state.m_fb_address + curpixel, (uint8_t)(object.m_fill_color >> byte_shift));
+}
+
+void n64_rdp::fill_pixel16(uint32_t curpixel, const rdp_poly_state &object)
+{
+ uint16_t val;
+ if (curpixel & 1)
{
- uint16_t val;
- if (curpixel & 1)
- {
- val = object.m_fill_color & 0xffff;
- }
- else
- {
- val = (object.m_fill_color >> 16) & 0xffff;
- }
- RWRITEIDX16((object.m_misc_state.m_fb_address >> 1) + curpixel, val);
- HWRITEADDR8((object.m_misc_state.m_fb_address >> 1) + curpixel, ((val & 1) << 1) | (val & 1));
+ val = object.m_fill_color & 0xffff;
}
- else // 32-bit framebuffer
+ else
{
- RWRITEIDX32((object.m_misc_state.m_fb_address >> 2) + curpixel, object.m_fill_color);
- HWRITEADDR8((object.m_misc_state.m_fb_address >> 1) + (curpixel << 1), (object.m_fill_color & 0x10000) ? 3 : 0);
- HWRITEADDR8((object.m_misc_state.m_fb_address >> 1) + (curpixel << 1) + 1, (object.m_fill_color & 0x1) ? 3 : 0);
+ val = (object.m_fill_color >> 16) & 0xffff;
}
+ RWRITEIDX16((object.m_misc_state.m_fb_address >> 1) + curpixel, val);
+ HWRITEADDR8((object.m_misc_state.m_fb_address >> 1) + curpixel, ((val & 1) << 1) | (val & 1));
+}
+
+void n64_rdp::fill_pixel32(uint32_t curpixel, const rdp_poly_state &object)
+{
+ RWRITEIDX32((object.m_misc_state.m_fb_address >> 2) + curpixel, object.m_fill_color);
+ HWRITEADDR8((object.m_misc_state.m_fb_address >> 1) + (curpixel << 1), (object.m_fill_color & 0x10000) ? 3 : 0);
+ HWRITEADDR8((object.m_misc_state.m_fb_address >> 1) + (curpixel << 1) + 1, (object.m_fill_color & 0x1) ? 3 : 0);
}
void n64_rdp::span_draw_1cycle(int32_t scanline, const extent_t &extent, const rdp_poly_state &object, int32_t threadid)
{
- assert(object.m_misc_state.m_fb_size >= 2 && object.m_misc_state.m_fb_size < 4);
+ assert(object.m_misc_state.m_fb_size < 4);
const int32_t clipx1 = object.m_scissor.m_xh;
const int32_t clipx2 = object.m_scissor.m_xl;
@@ -3593,7 +3753,7 @@ void n64_rdp::span_draw_1cycle(int32_t scanline, const extent_t &extent, const r
dzpix = object.m_span_base.m_span_dzpix;
}
- if (object.m_misc_state.m_fb_size < 2 || object.m_misc_state.m_fb_size > 4)
+ if (object.m_misc_state.m_fb_size > 4)
fatalerror("unsupported m_fb_size %d\n", object.m_misc_state.m_fb_size);
const int32_t blend_index = (object.m_other_modes.alpha_cvg_select ? 2 : 0) | ((object.m_other_modes.rgb_dither_sel < 3) ? 1 : 0);
@@ -3669,7 +3829,7 @@ void n64_rdp::span_draw_1cycle(int32_t scanline, const extent_t &extent, const r
const uint32_t zbcur = zb + curpixel;
const uint32_t zhbcur = zhb + curpixel;
- read_pixel(curpixel, userdata, object);
+ ((this)->*(m_read_pixel[object.m_misc_state.m_fb_size]))(curpixel, userdata, object);
if(z_compare(zbcur, zhbcur, sz, dzpix, userdata, object))
{
@@ -3682,7 +3842,7 @@ void n64_rdp::span_draw_1cycle(int32_t scanline, const extent_t &extent, const r
if (rendered)
{
- write_pixel(curpixel, blended_pixel, userdata, object);
+ ((this)->*(m_write_pixel[object.m_misc_state.m_fb_size]))(curpixel, blended_pixel, userdata, object);
if (object.m_other_modes.z_update_en)
{
z_store(object, zbcur, zhbcur, sz, userdata->m_dzpix_enc);
@@ -3709,7 +3869,7 @@ void n64_rdp::span_draw_1cycle(int32_t scanline, const extent_t &extent, const r
void n64_rdp::span_draw_2cycle(int32_t scanline, const extent_t &extent, const rdp_poly_state &object, int32_t threadid)
{
- assert(object.m_misc_state.m_fb_size >= 2 && object.m_misc_state.m_fb_size < 4);
+ assert(object.m_misc_state.m_fb_size < 4);
const int32_t clipx1 = object.m_scissor.m_xh;
const int32_t clipx2 = object.m_scissor.m_xl;
@@ -3803,7 +3963,7 @@ void n64_rdp::span_draw_2cycle(int32_t scanline, const extent_t &extent, const r
dzpix = object.m_span_base.m_span_dzpix;
}
- if (object.m_misc_state.m_fb_size < 2 || object.m_misc_state.m_fb_size > 4)
+ if (object.m_misc_state.m_fb_size > 4)
fatalerror("unsupported m_fb_size %d\n", object.m_misc_state.m_fb_size);
const int32_t blend_index = (object.m_other_modes.alpha_cvg_select ? 2 : 0) | ((object.m_other_modes.rgb_dither_sel < 3) ? 1 : 0);
@@ -3928,7 +4088,7 @@ void n64_rdp::span_draw_2cycle(int32_t scanline, const extent_t &extent, const r
const uint32_t zbcur = zb + curpixel;
const uint32_t zhbcur = zhb + curpixel;
- read_pixel(curpixel, userdata, object);
+ ((this)->*(m_read_pixel[object.m_misc_state.m_fb_size]))(curpixel, userdata, object);
if(z_compare(zbcur, zhbcur, sz, dzpix, userdata, object))
{
@@ -3939,7 +4099,7 @@ void n64_rdp::span_draw_2cycle(int32_t scanline, const extent_t &extent, const r
if (rendered)
{
- write_pixel(curpixel, blended_pixel, userdata, object);
+ ((this)->*(m_write_pixel[object.m_misc_state.m_fb_size]))(curpixel, blended_pixel, userdata, object);
if (object.m_other_modes.z_update_en)
{
z_store(object, zbcur, zhbcur, sz, userdata->m_dzpix_enc);
@@ -4000,9 +4160,9 @@ void n64_rdp::span_draw_copy(int32_t scanline, const extent_t &extent, const rdp
m_tex_pipe.copy(&userdata->m_texel0_color, sss, sst, tilenum, object, userdata);
uint32_t curpixel = fb_index + x;
- if ((userdata->m_texel0_color.get_a() != 0) || (!object.m_other_modes.alpha_compare_en))
+ if (userdata->m_texel0_color.get_a() != 0 || !object.m_other_modes.alpha_compare_en || object.m_misc_state.m_fb_size == 1)
{
- copy_pixel(curpixel, userdata->m_texel0_color, object);
+ ((this)->*(m_copy_pixel[object.m_misc_state.m_fb_size]))(curpixel, userdata->m_texel0_color, object);
}
}
@@ -4014,7 +4174,7 @@ void n64_rdp::span_draw_copy(int32_t scanline, const extent_t &extent, const rdp
void n64_rdp::span_draw_fill(int32_t scanline, const extent_t &extent, const rdp_poly_state &object, int32_t threadid)
{
- assert(object.m_misc_state.m_fb_size >= 2 && object.m_misc_state.m_fb_size < 4);
+ assert(object.m_misc_state.m_fb_size < 4);
const bool flip = object.flip;
@@ -4036,7 +4196,7 @@ void n64_rdp::span_draw_fill(int32_t scanline, const extent_t &extent, const rdp
{
if (x >= clipx1 && x < clipx2)
{
- fill_pixel(fb_index + x, object);
+ ((this)->*(m_fill_pixel[object.m_misc_state.m_fb_size]))(fb_index + x, object);
}
x += xinc;
diff --git a/src/mame/video/n64.h b/src/mame/video/n64.h
index 6193514433c..9225c804b22 100644
--- a/src/mame/video/n64.h
+++ b/src/mame/video/n64.h
@@ -323,18 +323,40 @@ private:
void compute_cvg_noflip(extent_t* spans, int32_t* majorx, int32_t* minorx, int32_t* majorxint, int32_t* minorxint, int32_t scanline, int32_t yh, int32_t yl, int32_t base);
void compute_cvg_flip(extent_t* spans, int32_t* majorx, int32_t* minorx, int32_t* majorxint, int32_t* minorxint, int32_t scanline, int32_t yh, int32_t yl, int32_t base);
- void write_pixel(uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object);
- void read_pixel(uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object);
- void copy_pixel(uint32_t curpixel, color_t& color, const rdp_poly_state &object);
- void fill_pixel(uint32_t curpixel, const rdp_poly_state &object);
+ void write_pixel4(uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object);
+ void write_pixel8(uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object);
+ void write_pixel16(uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object);
+ void write_pixel32(uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object);
+ void read_pixel4(uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object);
+ void read_pixel8(uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object);
+ void read_pixel16(uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object);
+ void read_pixel32(uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object);
+ void copy_pixel4(uint32_t curpixel, color_t& color, const rdp_poly_state &object);
+ void copy_pixel8(uint32_t curpixel, color_t& color, const rdp_poly_state &object);
+ void copy_pixel16(uint32_t curpixel, color_t& color, const rdp_poly_state &object);
+ void copy_pixel32(uint32_t curpixel, color_t& color, const rdp_poly_state &object);
+ void fill_pixel4(uint32_t curpixel, const rdp_poly_state &object);
+ void fill_pixel8(uint32_t curpixel, const rdp_poly_state &object);
+ void fill_pixel16(uint32_t curpixel, const rdp_poly_state &object);
+ void fill_pixel32(uint32_t curpixel, const rdp_poly_state &object);
void precalc_cvmask_derivatives(void);
void z_build_com_table(void);
typedef void (n64_rdp::*compute_cvg_t) (extent_t* spans, int32_t* majorx, int32_t* minorx, int32_t* majorxint, int32_t* minorxint, int32_t scanline, int32_t yh, int32_t yl, int32_t base);
- compute_cvg_t m_compute_cvg[2];
+ compute_cvg_t m_compute_cvg[2];
- running_machine* m_machine;
+ typedef void (n64_rdp::*write_pixel_t) (uint32_t curpixel, color_t& color, rdp_span_aux* userdata, const rdp_poly_state &object);
+ typedef void (n64_rdp::*read_pixel_t) (uint32_t curpixel, rdp_span_aux* userdata, const rdp_poly_state &object);
+ typedef void (n64_rdp::*copy_pixel_t) (uint32_t curpixel, color_t& color, const rdp_poly_state &object);
+ typedef void (n64_rdp::*fill_pixel_t) (uint32_t curpixel, const rdp_poly_state &object);
+
+ write_pixel_t m_write_pixel[4];
+ read_pixel_t m_read_pixel[4];
+ copy_pixel_t m_copy_pixel[4];
+ fill_pixel_t m_fill_pixel[4];
+
+ running_machine* m_machine;
uint32_t* m_rdram;
uint32_t* m_dmem;
n64_periphs* m_n64_periphs;
diff --git a/src/mame/video/rdptpipe.cpp b/src/mame/video/rdptpipe.cpp
index c0b35da82bd..e4df83ec228 100644
--- a/src/mame/video/rdptpipe.cpp
+++ b/src/mame/video/rdptpipe.cpp
@@ -950,9 +950,9 @@ void n64_texture_pipe_t::fetch_i4_tlut0(rgbaint_t& out, int32_t s, int32_t t, in
const uint8_t byteval = tc[taddr];
const uint8_t c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf);
- const uint16_t k = ((uint16_t*)(userdata->m_tmem + 0x800))[((tpal << 4) | c) << 2];
#if USE_64K_LUT
+ const uint16_t k = ((uint16_t*)(userdata->m_tmem + 0x800))[((tpal << 4) | c) << 2];
out.set(m_expand_16to32_table[k]);
#else
out.set((c & 1) * 0xff, GET_HI_RGBA16_TMEM(c), GET_MED_RGBA16_TMEM(c), GET_LOW_RGBA16_TMEM(c));
@@ -990,9 +990,9 @@ void n64_texture_pipe_t::fetch_i8_tlut0(rgbaint_t& out, int32_t s, int32_t t, in
const int32_t taddr = (((tbase << 3) + s) ^ sTexAddrSwap8[t & 1]) & 0x7ff;
const uint8_t c = tc[taddr];
- const uint16_t k = ((uint16_t*)(userdata->m_tmem + 0x800))[c << 2];
#if USE_64K_LUT
+ const uint16_t k = ((uint16_t*)(userdata->m_tmem + 0x800))[c << 2];
out.set(m_expand_16to32_table[k]);
#else
out.set((c & 1) * 0xff, GET_HI_RGBA16_TMEM(c), GET_MED_RGBA16_TMEM(c), GET_LOW_RGBA16_TMEM(c));