diff options
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 & Big Nose Freaks Out</description> + <year>199?</year> + <publisher><pirate></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 & Jungle Book</description> <year>19??</year> <publisher><pirate></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><pirate></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><pirate></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><pirate></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)); |