From 8d1c7fcc817d5e7709dabbf9de3dd4c042190ade Mon Sep 17 00:00:00 2001 From: mamehaze <140764005+mamehaze@users.noreply.github.com> Date: Sat, 21 Oct 2023 16:57:48 +0100 Subject: jaleco/megasys1.cpp: Emulate microcontroller for bigstrik. (#11629) [Sergio Galiano, Recreativos Piscis, David Haywood] * cpu/tlcs90: Added I/O ports and halt support. * jaleco/megasys1.cpp: Started splitting up driver state class, and hooked up microcontroller. * jaleco/ms1_tmap.cpp: Trigger screen update on scroll register write (visible in stdragon). New working clones -------------- Hachoo! (set 2) [unknown] Chimera Beast (Japan, prototype, set 2) [unknown] --- src/devices/cpu/tlcs90/tlcs90.cpp | 154 ++++++++++-- src/devices/cpu/tlcs90/tlcs90.h | 9 + src/mame/jaleco/megasys1.cpp | 498 +++++++++++++++++++++++++++++--------- src/mame/jaleco/megasys1.h | 225 ++++++++++++----- src/mame/jaleco/megasys1_v.cpp | 165 ++++++------- src/mame/jaleco/ms1_tmap.cpp | 4 + src/mame/jaleco/ms1_tmap.h | 3 + src/mame/mame.lst | 2 + 8 files changed, 770 insertions(+), 290 deletions(-) diff --git a/src/devices/cpu/tlcs90/tlcs90.cpp b/src/devices/cpu/tlcs90/tlcs90.cpp index a6acf14cd66..be2f05a181a 100644 --- a/src/devices/cpu/tlcs90/tlcs90.cpp +++ b/src/devices/cpu/tlcs90/tlcs90.cpp @@ -34,11 +34,11 @@ void tlcs90_device::tmp90840_regs(address_map &map) { map(0xffc0, 0xffef).rw(FUNC(tlcs90_device::reserved_r), FUNC(tlcs90_device::reserved_w)); //map(0xffc0, 0xffc0).rw(FUNC(tlcs90_device::p0_r), FUNC(tlcs90_device::p0_w)); - //map(0xffc1, 0xffc1).rw(FUNC(tlcs90_device::p1_r), FUNC(tlcs90_device::p1_w)); - //map(0xffc2, 0xffc2).rw(FUNC(tlcs90_device::irfl_r), FUNC(tlcs90_device::p01cr_w)); + map(0xffc1, 0xffc1).rw(FUNC(tlcs90_device::p1_r), FUNC(tlcs90_device::p1_w)); + map(0xffc2, 0xffc2). /*r(FUNC(tlcs90_device::irfl_r)).*/ w(FUNC(tlcs90_device::p01cr_w)); map(0xffc3, 0xffc3). /*r(FUNC(tlcs90_device::irfh_r)).*/ w(FUNC(tlcs90_device::irf_clear_w)); - //map(0xffc4, 0xffc4).rw(FUNC(tlcs90_device::p2_r), FUNC(tlcs90_device::p2_w)); - //map(0xffc5, 0xffc5).w(FUNC(tlcs90_device::p2cr_w)); + map(0xffc4, 0xffc4).rw(FUNC(tlcs90_device::p2_r), FUNC(tlcs90_device::p2_w)); + map(0xffc5, 0xffc5).w(FUNC(tlcs90_device::p2cr_w)); map(0xffc6, 0xffc6).rw(FUNC(tlcs90_device::p3_r), FUNC(tlcs90_device::p3_w)); //map(0xffc7, 0xffc7).w(FUNC(tlcs90_device::p3cr_w)); map(0xffc8, 0xffc8).rw(FUNC(tlcs90_device::p4_r), FUNC(tlcs90_device::p4_w)); @@ -109,8 +109,8 @@ void tlcs90_device::tmp90844_regs(address_map &map) //map(0xffc1, 0xffc1).w(FUNC(tlcs90_device::p0cr_w)); //map(0xffc2, 0xffc2).rw(FUNC(tlcs90_device::p1_r), FUNC(tlcs90_device::p1_w)); //map(0xffc3, 0xffc3).w(FUNC(tlcs90_device::p1cr_w)); - //map(0xffc4, 0xffc4).rw(FUNC(tlcs90_device::p2_r), FUNC(tlcs90_device::p2_w)); - //map(0xffc5, 0xffc5).w(FUNC(tlcs90_device::p2cr_w)); + map(0xffc4, 0xffc4).rw(FUNC(tlcs90_device::p2_r), FUNC(tlcs90_device::p2_w)); + map(0xffc5, 0xffc5).w(FUNC(tlcs90_device::p2cr_w)); map(0xffc6, 0xffc6).rw(FUNC(tlcs90_device::p3_r), FUNC(tlcs90_device::p3_w)); //map(0xffc7, 0xffc7).w(FUNC(tlcs90_device::p3cr_w)); map(0xffc8, 0xffc8).rw(FUNC(tlcs90_device::p4_r), FUNC(tlcs90_device::p4_w)); @@ -211,7 +211,7 @@ device_memory_interface::space_config_vector tlcs90_device::memory_space_config( enum { T90_B, T90_C, T90_D, T90_E, T90_H, T90_L, T90_A, T90_BC, T90_DE, T90_HL, T90_XX, T90_IX, T90_IY, T90_SP, - T90_AF, T90_PC + T90_AF, T90_PC, T90_HA }; // Regs @@ -1103,7 +1103,7 @@ uint16_t tlcs90_device::r8( const uint16_t r ) case L: return m_hl.b.l; default: - fatalerror("%04x: unimplemented r8 register index = %d\n",m_pc.w.l,r); + fatalerror("%04x: unimplemented r8 register index = %d\n",m_prvpc.w.l,r); } } @@ -1120,7 +1120,7 @@ void tlcs90_device::w8( const uint16_t r, uint16_t value ) case L: m_hl.b.l = value; return; default: - fatalerror("%04x: unimplemented w8 register index = %d\n",m_pc.w.l,r); + fatalerror("%04x: unimplemented w8 register index = %d\n",m_prvpc.w.l,r); } } @@ -1141,7 +1141,7 @@ uint16_t tlcs90_device::r16( const uint16_t r ) case PC: return m_pc.w.l; default: - fatalerror("%04x: unimplemented r16 register index = %d\n",m_pc.w.l,r); + fatalerror("%04x: unimplemented r16 register index = %d\n",m_prvpc.w.l,r); } } @@ -1160,7 +1160,7 @@ void tlcs90_device::w16( const uint16_t r, uint16_t value ) case PC: m_pc.d = value; return; default: - fatalerror("%04x: unimplemented w16 register index = %d\n",m_pc.w.l,r); + fatalerror("%04x: unimplemented w16 register index = %d\n",m_prvpc.w.l,r); } } @@ -1293,7 +1293,7 @@ int tlcs90_device::Test( uint8_t cond ) case NZ: return !(F & ZF); case NC: return !(F & CF); default: - fatalerror("%04x: unimplemented condition = %d\n",m_pc.w.l,cond); + fatalerror("%04x: unimplemented condition = %d\n",m_prvpc.w.l,cond); } // never executed @@ -1346,12 +1346,19 @@ INT2 P82 Rising Edge - *************************************************************************************************************/ +void tlcs90_device::halt() +{ + LOG("%04X: halt\n", m_prvpc.w.l); + m_halt = 1; +} + void tlcs90_device::leave_halt() { if( m_halt ) { + LOG("%04X: leave_halt\n", m_pc.w.l); m_halt = 0; - m_pc.w.l++; + //m_pc.w.l++; } } @@ -1394,8 +1401,10 @@ void tlcs90_device::check_interrupts() { mask = (1 << irq); if(irq >= INT0) mask &= m_irq_mask; + if (m_irq_state & mask) { + LOG("%04X: check_interrupts: taking interrupt: %d. Current state: %x. Current mask: %x\n", m_pc.w.l, irq, m_irq_state, mask); take_interrupt( irq ); return; } @@ -1452,14 +1461,20 @@ void tlcs90_device::execute_run() do { - m_prvpc.d = m_pc.d; - debugger_instruction_hook(m_pc.d); - check_interrupts(); - m_addr = m_pc.d; - decode(); - m_pc.d = m_addr; + // when in HALT state, the fetched opcode is not dispatched (aka a NOP) and the PC is not increased + if (m_halt) + m_op = NOP; + else + { + m_prvpc.d = m_pc.d; + debugger_instruction_hook(m_pc.d); + + m_addr = m_pc.d; + decode(); + m_pc.d = m_addr; + } switch ( m_op ) { @@ -1633,9 +1648,10 @@ void tlcs90_device::execute_run() Cyc(); break; -// case HALT: -// Cyc(); -// break; + case HALT: + halt(); + Cyc(); + break; case DI: m_after_EI = 0; F &= ~IF; @@ -2081,6 +2097,8 @@ void tlcs90_device::execute_run() void tlcs90_device::device_reset() { + leave_halt(); + m_irq_state = 0; m_irq_mask = 0; m_pc.d = 0x0000; @@ -2094,6 +2112,8 @@ void tlcs90_device::device_reset() */ std::fill(std::begin(m_port_latch), std::end(m_port_latch), 0); + m_p01cr = 0; + m_p2cr = 0; m_p4cr = 0; m_p67cr = 0; m_p8cr = 0; @@ -2387,6 +2407,89 @@ FFED BX R/W Reset Description *************************************************************************************************************/ +uint8_t tlcs90_device::p1_r() +{ + if ((m_p01cr & 0x04) != 0) + { + if (!machine().side_effects_disabled()) + logerror("%04X: Read from P1 but it's configured as part of address bus\n", m_prvpc.w.l); + + return 0; + } + + if ((m_p01cr & 0x02) != 0) + { + if (!machine().side_effects_disabled()) + logerror("%04X: Read from P1 but it's configured as output\n", m_prvpc.w.l); + + return 0; + } + + return m_port_read_cb[1](); +} + +void tlcs90_device::p1_w(uint8_t data) +{ + if ((m_p01cr & 0x04) != 0) + { + if (!machine().side_effects_disabled()) + logerror("%04X: Read from P1 but it's configured as part of address bus\n", m_prvpc.w.l); + + return; + } + + if ((m_p01cr & 0x02) == 0) + { + if (!machine().side_effects_disabled()) + logerror("%04X: Write to P1 but it's configured as input\n", m_prvpc.w.l); + + return; + } + + m_port_write_cb[1](m_port_latch[1]); +} + +void tlcs90_device::p01cr_w(uint8_t data) +{ + m_p01cr = data; +} + +uint8_t tlcs90_device::p2_r() +{ + if ((m_p01cr & 0x04) != 0) + { + if (!machine().side_effects_disabled()) + logerror("%04X: Read from P2 but it's configured as part of address bus\n", m_prvpc.w.l); + + return 0; + } + + return m_port_read_cb[2](); +} + +void tlcs90_device::p2_w(uint8_t data) +{ + if ((m_p01cr & 0x04) != 0) + { + if (!machine().side_effects_disabled()) + logerror("%04X: Read from P1 but it's configured as part of address bus\n", m_prvpc.w.l); + + return; + } + + m_port_latch[2] = data; + uint8_t out_mask = m_p2cr; + if (out_mask) + { + m_port_write_cb[2](m_port_latch[2] & out_mask); + } +} + +void tlcs90_device::p2cr_w(uint8_t data) +{ + m_p2cr = data; +} + uint8_t tlcs90_device::p3_r() { // 7,4,1,0 @@ -2675,14 +2778,14 @@ uint8_t tlcs90_device::reserved_r(offs_t offset) { uint16_t iobase = 0xffc0; if (!machine().side_effects_disabled()) - logerror("%04X: Read from unimplemented SFR at %04X\n", m_pc.w.l, iobase + offset); + logerror("%04X: Read from unimplemented SFR at %04X\n", m_prvpc.w.l, iobase + offset); return 0; } void tlcs90_device::reserved_w(offs_t offset, uint8_t data) { uint16_t iobase = 0xffc0; - logerror("%04X: Write %02X to unimplemented SFR at %04X\n", m_pc.w.l, data, iobase + offset); + logerror("%04X: Write %02X to unimplemented SFR at %04X\n", m_prvpc.w.l, data, iobase + offset); } void tlcs90_device::t90_start_timer(int i) @@ -2874,6 +2977,8 @@ void tlcs90_device::device_start() save_item(NAME(m_extra_cycles)); save_item(NAME(m_port_latch)); + save_item(NAME(m_p01cr)); + save_item(NAME(m_p2cr)); save_item(NAME(m_p4cr)); save_item(NAME(m_p67cr)); save_item(NAME(m_p8cr)); @@ -2969,6 +3074,7 @@ void tlcs90_device::device_start() state_add( T90_HL, "HL", m_hl.w.l).formatstr("%04X"); state_add( T90_IX, "IX", m_ix.w.l).formatstr("%04X"); state_add( T90_IY, "IY", m_iy.w.l).formatstr("%04X"); + state_add( T90_HA, "HALT", m_halt).formatstr("%01X"); state_add(STATE_GENPC, "GENPC", m_pc.w.l).formatstr("%04X").noshow(); state_add(STATE_GENPCBASE, "CURPC", m_prvpc.w.l).formatstr("%04X").noshow(); diff --git a/src/devices/cpu/tlcs90/tlcs90.h b/src/devices/cpu/tlcs90/tlcs90.h index c1ef052dfe8..d42eb719255 100644 --- a/src/devices/cpu/tlcs90/tlcs90.h +++ b/src/devices/cpu/tlcs90/tlcs90.h @@ -57,6 +57,12 @@ protected: virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; // internal registers + uint8_t p1_r(); + void p1_w(uint8_t data); + void p01cr_w(uint8_t data); + uint8_t p2_r(); + void p2_w(uint8_t data); + void p2cr_w(uint8_t data); uint8_t p3_r(); void p3_w(uint8_t data); uint8_t p4_r(); @@ -121,6 +127,8 @@ private: uint8_t m_port_latch[MAX_PORTS]; + uint8_t m_p01cr; + uint8_t m_p2cr; uint8_t m_p4cr; uint8_t m_p67cr; uint8_t m_p8cr; @@ -179,6 +187,7 @@ private: inline int Test( uint8_t cond ); inline void Push( uint16_t rr ); inline void Pop( uint16_t rr ); + inline void halt(); inline void leave_halt(); inline void raise_irq(int irq); inline void clear_irq(int irq); diff --git a/src/mame/jaleco/megasys1.cpp b/src/mame/jaleco/megasys1.cpp index f352e61739e..20c260f254d 100644 --- a/src/mame/jaleco/megasys1.cpp +++ b/src/mame/jaleco/megasys1.cpp @@ -140,20 +140,34 @@ RAM RW 0e0000-0effff* < < #define SOUND_CPU_CLOCK XTAL(7'000'000) /* clock for sound 68000 */ #define OKI4_SOUND_CLOCK XTAL(4'000'000) +#define VERBOSE 0 +#include "logmacro.h" -MACHINE_RESET_MEMBER(megasys1_state,megasys1) +void megasys1_state::machine_reset() { m_ignore_oki_status = 1; /* ignore oki status due 'protection' */ - m_ip_latched = 0x0006; /* reset protection - some games expect this initial read without sending anything */ m_mcu_hs = 0; } -MACHINE_RESET_MEMBER(megasys1_state,megasys1_hachoo) +void megasys1_bc_iosim_state::machine_reset() { - MACHINE_RESET_CALL_MEMBER(megasys1); - m_ignore_oki_status = 0; /* strangely hachoo need real oki status */ + megasys1_state::machine_reset(); + m_ip_latched = 0x0006; /* reset protection - some games expect this initial read without sending anything */ } +void megasys1_bc_iomcu_state::machine_reset() +{ + megasys1_state::machine_reset(); + m_mcu_input_data = 0x00; + m_mcu_io_data = 0x0; +} + + +void megasys1_hachoo_state::machine_reset() +{ + megasys1_state::machine_reset(); + m_ignore_oki_status = 0; // strangely hachoo need real oki status +} /************************************* @@ -183,13 +197,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(megasys1_state::megasys1A_scanline) // soldam: irq 1 & 3 RTE, irq 2 valid // edfp: irq 1?, 2 sets vregs etc, 3 RTE - if(scanline == 240) // vblank-out irq + if(scanline == 224+16) // vblank-out irq m_maincpu->set_input_line(2, HOLD_LINE); - if(scanline == 16) + if(scanline == 80+16) m_maincpu->set_input_line(1, HOLD_LINE); - if(scanline == 128) + if(scanline == 0+16) m_maincpu->set_input_line(3, HOLD_LINE); } @@ -207,7 +221,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(megasys1_state::megasys1A_iganinju_scanline) m_maincpu->set_input_line(2, HOLD_LINE); } -void megasys1_state::megasys1Z_map(address_map &map) +void megasys1_typez_state::megasys1Z_map(address_map &map) +{ + megasys_base_map(map); + map(0x084308, 0x084309).w(FUNC(megasys1_typez_state::soundlatch_z_w)); +} + +void megasys1_state::megasys_base_map(address_map &map) { map.global_mask(0xfffff); map(0x000000, 0x03ffff).rom(); @@ -217,19 +237,19 @@ void megasys1_state::megasys1Z_map(address_map &map) map(0x080006, 0x080007).portr("DSW"); map(0x084200, 0x084205).rw("scroll0", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w)); map(0x084208, 0x08420d).rw("scroll1", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w)); - map(0x084300, 0x084301).w(FUNC(megasys1_state::screen_flag_w)); - map(0x084308, 0x084309).w(FUNC(megasys1_state::soundlatch_z_w)); + map(0x084300, 0x084301).w(FUNC(megasys1_typez_state::screen_flag_w)); map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x08e000, 0x08ffff).ram().share("objectram"); map(0x090000, 0x093fff).ram().w("scroll0", FUNC(megasys1_tilemap_device::write)).share("scroll0"); map(0x094000, 0x097fff).ram().w("scroll1", FUNC(megasys1_tilemap_device::write)).share("scroll1"); - map(0x0f0000, 0x0fffff).ram().w(FUNC(megasys1_state::ram_w)).share("ram"); + map(0x0f0000, 0x0fffff).ram().w(FUNC(megasys1_typez_state::ram_w)).share("ram"); + } void megasys1_state::megasys1A_map(address_map &map) { map.global_mask(0xfffff); - megasys1Z_map(map); + megasys_base_map(map); map(0x000000, 0x07ffff).rom(); map(0x080008, 0x080009).r(m_soundlatch[1], FUNC(generic_latch_16_device::read)); /* from sound cpu */ map(0x084000, 0x084001).w(FUNC(megasys1_state::active_layers_w)); @@ -267,14 +287,14 @@ TIMER_DEVICE_CALLBACK_MEMBER(megasys1_state::megasys1B_scanline) in that order. */ -u16 megasys1_state::ip_select_r() // FROM MCU +u16 megasys1_bc_iosim_state::ip_select_r() // FROM MCU { return m_ip_latched; } -void megasys1_state::ip_select_w(u16 data) // TO MCU +void megasys1_bc_iosim_state::ip_select_w(u16 data) // TO MCU { int i; @@ -307,7 +327,6 @@ void megasys1_state::ip_select_w(u16 data) // TO MCU m_maincpu->set_input_line(2, HOLD_LINE); } - void megasys1_state::megasys1B_map(address_map &map) { map.global_mask(0xfffff); @@ -326,7 +345,12 @@ void megasys1_state::megasys1B_map(address_map &map) map(0x058000, 0x05bfff).ram().w("scroll2", FUNC(megasys1_tilemap_device::write)).share("scroll2"); map(0x060000, 0x07ffff).ram().w(FUNC(megasys1_state::ram_w)).share("ram"); map(0x080000, 0x0bffff).rom(); - map(0x0e0000, 0x0e0001).rw(FUNC(megasys1_state::ip_select_r), FUNC(megasys1_state::ip_select_w)); +} + +void megasys1_bc_iosim_state::megasys1B_iosim_map(address_map &map) +{ + megasys1B_map(map); + map(0x0e0000, 0x0e0001).rw(FUNC(megasys1_bc_iosim_state::ip_select_r), FUNC(megasys1_bc_iosim_state::ip_select_w)); } void megasys1_state::megasys1B_edfbl_map(address_map &map) @@ -365,6 +389,44 @@ void megasys1_state::megasys1B_monkelf_map(address_map &map) #define INTERRUPT_NUM_C INTERRUPT_NUM_B #define interrupt_C interrupt_B +void megasys1_state::megasys1c_handle_scanline_irq(int scanline) +{ + if(scanline == 224) // vblank-out irq + m_maincpu->set_input_line(4, HOLD_LINE); + + if(scanline == 80) + m_maincpu->set_input_line(1, HOLD_LINE); +} + +TIMER_DEVICE_CALLBACK_MEMBER(megasys1_state::megasys1C_scanline) +{ + int scanline = param; + + megasys1c_handle_scanline_irq(scanline); + + if(scanline == 0) + m_maincpu->set_input_line(2, HOLD_LINE); + +} +TIMER_DEVICE_CALLBACK_MEMBER(megasys1_bc_iomcu_state::megasys1C_bigstrik_scanline) +{ + int scanline = param; + + megasys1c_handle_scanline_irq(scanline); + + if(scanline == 0) // end of vblank (rising edge) + { + LOG("%s: megasys1C_bigstrik_scanline: Send INT1 to MCU: (scanline %03d)\n", machine().describe_context(), scanline); + m_iomcu->set_input_line(INPUT_LINE_IRQ1, ASSERT_LINE); + } + + if(scanline == 224) // start of vblank (falling edge) + { + LOG("%s: megasys1C_bigstrik_scanline: Clear INT1 to MCU: (scanline %03d)\n", machine().describe_context(), scanline); + m_iomcu->set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE); + } +} + void megasys1_state::ram_w(offs_t offset, u16 data) { // DON'T use COMBINE_DATA @@ -389,7 +451,6 @@ void megasys1_state::megasys1C_map(address_map &map) map(0x0c2308, 0x0c2309).w(FUNC(megasys1_state::screen_flag_w)); map(0x0c8000, 0x0c8001).r(m_soundlatch[1], FUNC(generic_latch_16_device::read)).w(FUNC(megasys1_state::soundlatch_c_w)); map(0x0d2000, 0x0d3fff).ram().share("objectram"); - map(0x0d8000, 0x0d8001).rw(FUNC(megasys1_state::ip_select_r), FUNC(megasys1_state::ip_select_w)); // 64th Street actively uses 0xe4*** for breakable objects. map(0x0e0000, 0x0e3fff).mirror(0x4000).ram().w("scroll0", FUNC(megasys1_tilemap_device::write)).share("scroll0"); map(0x0e8000, 0x0ebfff).mirror(0x4000).ram().w("scroll1", FUNC(megasys1_tilemap_device::write)).share("scroll1"); @@ -398,6 +459,103 @@ void megasys1_state::megasys1C_map(address_map &map) map(0x1c0000, 0x1cffff).mirror(0x30000).ram().w(FUNC(megasys1_state::ram_w)).share("ram"); //0x1f****, Cybattler reads attract mode inputs at 0x1d**** } +void megasys1_bc_iosim_state::megasys1C_iosim_map(address_map &map) +{ + megasys1C_map(map); + map(0x0d8000, 0x0d8001).rw(FUNC(megasys1_bc_iosim_state::ip_select_r), FUNC(megasys1_bc_iosim_state::ip_select_w)); +} + +/* + Used by IO MCU to read data from different inputs (DSW1, DSW2, P1, P2, COIN) depending on + which one was previously selected by the MCU itself using the offset. + It also sends the IRQ2 to the main CPU for some case +*/ +u8 megasys1_bc_iomcu_state::mcu_capture_inputs_r(offs_t offset) +{ + u8 input_data = 0x00; + u8 bank = offset >> 16; + + switch (bank) + { + case 0x01: input_data = m_io_p1->read(); break; + case 0x02: input_data = m_io_p2->read(); break; + case 0x03: input_data = m_io_dsw1->read(); break; + case 0x04: input_data = m_io_dsw2->read(); break; + case 0x05: input_data = m_io_system->read(); break; + case 0x07: + m_maincpu->set_input_line(2, HOLD_LINE); + LOG("%s: mcu_capture_inputs_r: Send IRQ2 to main CPU (address %06x)\n", machine().describe_context(), offset); + return input_data; + default: LOG("%s: mcu_capture_inputs_r: Invalid input selected (data %02x)\n", machine().describe_context(), bank); return input_data; + } + + LOG("%s: mcu_capture_inputs_r: Read data from inputs: (data %02x)\n", machine().describe_context(), input_data); + + return input_data; +} + +/* + Used by IO MCU to read data from the main CPU when INT0 is triggered +*/ +u8 megasys1_bc_iomcu_state::mcu_port1_r() +{ + LOG("%s: mcu_port1_r: Read data from CPU: (data %02x)\n", machine().describe_context(), m_mcu_input_data); + + return m_mcu_input_data; +} + +/* + Used by IO MCU to send data to the main CPU when INT0 is triggered +*/ +void megasys1_bc_iomcu_state::mcu_port2_w(u8 data) +{ + LOG("%s: mcu_port2_w: Send data to CPU: (data %02x)\n", machine().describe_context(), data); + + m_mcu_io_data = data; +} + +/* + Unknown purpose, but the IO MCU writes into the bit 3 of the port 6 +*/ +void megasys1_bc_iomcu_state::mcu_port6_w(u8 data) +{ + LOG("%s: mcu_port6_w: Write data to port 6: (data %02x)\n", machine().describe_context(), data); +} + +/* + Read handler triggered by the main CPU at some specific address. Used to read data from port 2 of IO MCU +*/ +u16 megasys1_bc_iomcu_state::ip_select_bigstrik_r() // FROM MCU +{ + LOG("%s: ip_select_bigstrik_r: Read data from MCU: (data %02x)\n", machine().describe_context(), m_mcu_io_data); + + return m_mcu_io_data; +} + +/* + Write handler triggered by the main CPU at some specific address. Used to write data to port 1 of IO MCU and send irq0 +*/ +void megasys1_bc_iomcu_state::ip_select_bigstrik_w(u16 data) // TO MCU +{ + LOG("%s: ip_select_bigstrik_w: Send data to MCU: (data %02x)\n", machine().describe_context(), data); + + m_mcu_input_data = data; + + m_iomcu->pulse_input_line(INPUT_LINE_IRQ0, attotime::from_ticks(1, m_maincpu->clock())); +} + +void megasys1_bc_iomcu_state::iomcu_map(address_map &map) +{ + // 0x000000- 0x003fff is hidden by internal ROM, as are some 0x00fxxx addresses by RAM + map(0x000000, 0x0fffff).r(FUNC(megasys1_bc_iomcu_state::mcu_capture_inputs_r)); +} + +void megasys1_bc_iomcu_state::megasys1C_bigstrik_map(address_map &map) +{ + megasys1C_map(map); + map(0x0d8000, 0x0d8001).rw(FUNC(megasys1_bc_iomcu_state::ip_select_bigstrik_r), FUNC(megasys1_bc_iomcu_state::ip_select_bigstrik_w)); +} + /*************************************************************************** [ Main CPU - System D ] @@ -602,7 +760,7 @@ void megasys1_state::megasys1B_sound_map(address_map &map) -void megasys1_state::z80_sound_map(address_map &map) +void megasys1_typez_state::z80_sound_map(address_map &map) { map(0x0000, 0x3fff).rom(); map(0xc000, 0xc7ff).ram(); @@ -610,7 +768,7 @@ void megasys1_state::z80_sound_map(address_map &map) map(0xf000, 0xf000).nopw(); /* ?? */ } -void megasys1_state::z80_sound_io_map(address_map &map) +void megasys1_typez_state::z80_sound_io_map(address_map &map) { map.global_mask(0xff); map(0x00, 0x01).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); @@ -1703,15 +1861,13 @@ void megasys1_state::system_A(machine_config &config) /* basic machine hardware */ M68000(config, m_maincpu, SYS_A_CPU_CLOCK); /* 6MHz verified */ m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1A_map); - TIMER(config, m_scantimer).configure_scanline(FUNC(megasys1_state::megasys1A_scanline), "screen", 0, 1); + TIMER(config, m_scantimer).configure_scanline(FUNC(megasys1_state::megasys1A_scanline), m_screen, 0, 1); M68000(config, m_audiocpu, SOUND_CPU_CLOCK); /* 7MHz verified */ m_audiocpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1A_sound_map); config.set_maximum_quantum(attotime::from_hz(120000)); - MCFG_MACHINE_RESET_OVERRIDE(megasys1_state,megasys1) - /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); //m_screen->set_refresh_hz(56.18); // same as nmk16.cpp based on YT videos. @@ -1723,11 +1879,13 @@ void megasys1_state::system_A(machine_config &config) GFXDECODE(config, m_gfxdecode, m_palette, gfx_abc); PALETTE(config, m_palette, FUNC(megasys1_state::megasys1_palette)).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x800/2); - MCFG_VIDEO_START_OVERRIDE(megasys1_state,megasys1) MEGASYS1_TILEMAP(config, m_tmap[0], m_palette, 256*0); + m_tmap[0]->set_screen_tag(m_screen); MEGASYS1_TILEMAP(config, m_tmap[1], m_palette, 256*1); + m_tmap[1]->set_screen_tag(m_screen); MEGASYS1_TILEMAP(config, m_tmap[2], m_palette, 256*2); + m_tmap[2]->set_screen_tag(m_screen); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -1750,16 +1908,10 @@ void megasys1_state::system_A(machine_config &config) m_oki[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.30); } -void megasys1_state::system_A_hachoo(machine_config &config) -{ - system_A(config); - MCFG_MACHINE_RESET_OVERRIDE(megasys1_state,megasys1_hachoo) -} - void megasys1_state::system_A_iganinju(machine_config &config) { system_A(config); - TIMER(config.replace(), m_scantimer).configure_scanline(FUNC(megasys1_state::megasys1A_iganinju_scanline), "screen", 0, 1); + TIMER(config.replace(), m_scantimer).configure_scanline(FUNC(megasys1_state::megasys1A_iganinju_scanline), m_screen, 0, 1); } void megasys1_state::system_A_soldam(machine_config &config) @@ -1818,23 +1970,30 @@ void megasys1_state::p47b(machine_config &config) m_p47b_adpcm[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); } -void megasys1_state::system_B(machine_config &config) +void megasys1_bc_iosim_state::system_B(machine_config &config) { system_A(config); /* basic machine hardware */ m_maincpu->set_clock(SYS_B_CPU_CLOCK); /* 8MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1B_map); - m_scantimer->set_callback(FUNC(megasys1_state::megasys1B_scanline)); + m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_bc_iosim_state::megasys1B_iosim_map); + m_scantimer->set_callback(FUNC(megasys1_bc_iosim_state::megasys1B_scanline)); - m_audiocpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1B_sound_map); + m_audiocpu->set_addrmap(AS_PROGRAM, &megasys1_bc_iosim_state::megasys1B_sound_map); } void megasys1_state::system_B_monkelf(machine_config &config) { - system_B(config); + system_A(config); + + /* basic machine hardware */ + + m_maincpu->set_clock(SYS_B_CPU_CLOCK); /* 8MHz */ m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1B_monkelf_map); + m_scantimer->set_callback(FUNC(megasys1_state::megasys1B_scanline)); + + m_audiocpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1B_sound_map); } void megasys1_state::system_Bbl(machine_config &config) @@ -1842,9 +2001,7 @@ void megasys1_state::system_Bbl(machine_config &config) /* basic machine hardware */ M68000(config, m_maincpu, 12_MHz_XTAL / 2); // edfbl has lower clock, verified on PCB m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1B_edfbl_map); - TIMER(config, m_scantimer).configure_scanline(FUNC(megasys1_state::megasys1B_scanline), "screen", 0, 1); - - MCFG_MACHINE_RESET_OVERRIDE(megasys1_state,megasys1) + TIMER(config, m_scantimer).configure_scanline(FUNC(megasys1_state::megasys1B_scanline), m_screen, 0, 1); /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); @@ -1859,11 +2016,13 @@ void megasys1_state::system_Bbl(machine_config &config) GFXDECODE(config, m_gfxdecode, m_palette, gfx_abc); PALETTE(config, m_palette, FUNC(megasys1_state::megasys1_palette)).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x800/2); - MCFG_VIDEO_START_OVERRIDE(megasys1_state,megasys1) MEGASYS1_TILEMAP(config, m_tmap[0], m_palette, 256*0); + m_tmap[0]->set_screen_tag(m_screen); MEGASYS1_TILEMAP(config, m_tmap[1], m_palette, 256*1); + m_tmap[1]->set_screen_tag(m_screen); MEGASYS1_TILEMAP(config, m_tmap[2], m_palette, 256*2); + m_tmap[2]->set_screen_tag(m_screen); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -1875,7 +2034,7 @@ void megasys1_state::system_Bbl(machine_config &config) m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.30); } -void megasys1_state::system_B_hayaosi1(machine_config &config) +void megasys1_bc_iosim_state::system_B_hayaosi1(machine_config &config) { system_B(config); @@ -1897,12 +2056,37 @@ void megasys1_state::system_C(machine_config &config) /* basic machine hardware */ m_maincpu->set_clock(SYS_C_CPU_CLOCK); /* 12MHz */ m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1C_map); - m_scantimer->set_callback(FUNC(megasys1_state::megasys1B_scanline)); + m_scantimer->set_callback(FUNC(megasys1_state::megasys1C_scanline)); + + /* video hardware */ + m_screen->set_raw(SYS_A_CPU_CLOCK, 384, 0, 256, 278, 16, 240); +// m_screen->set_raw(SYS_A_CPU_CLOCK, 406, 0, 256, 263, 16, 240); m_audiocpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1B_sound_map); } +void megasys1_bc_iosim_state::system_C_iosim(machine_config &config) +{ + system_C(config); + m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_bc_iosim_state::megasys1C_iosim_map); +} + + +void megasys1_bc_iomcu_state::system_C_bigstrik(machine_config &config) +{ + system_C(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_bc_iomcu_state::megasys1C_bigstrik_map); + m_scantimer->set_callback(FUNC(megasys1_bc_iomcu_state::megasys1C_bigstrik_scanline)); + + TMP91640(config, m_iomcu, SYS_C_CPU_CLOCK); // Toshiba TMP91640, with 16Kbyte internal ROM, 512bytes internal RAM + m_iomcu->set_addrmap(AS_PROGRAM, &megasys1_bc_iomcu_state::iomcu_map); + m_iomcu->port_read<1>().set(FUNC(megasys1_bc_iomcu_state::mcu_port1_r)); + m_iomcu->port_write<2>().set(FUNC(megasys1_bc_iomcu_state::mcu_port2_w)); + m_iomcu->port_write<6>().set(FUNC(megasys1_bc_iomcu_state::mcu_port6_w)); + +} /*************************************************************************** [ Mega System 1 D ] @@ -1921,8 +2105,6 @@ void megasys1_state::system_D(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1D_map); m_maincpu->set_vblank_int("screen", FUNC(megasys1_state::megasys1D_irq)); - MCFG_MACHINE_RESET_OVERRIDE(megasys1_state,megasys1) - /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh_hz(56.18); // same as nmk16.cpp based on YT videos. @@ -1935,10 +2117,11 @@ void megasys1_state::system_D(machine_config &config) GFXDECODE(config, m_gfxdecode, m_palette, gfx_abc); PALETTE(config, m_palette, FUNC(megasys1_state::megasys1_palette)).set_format(palette_device::RGBx_555, 0x800/2); - MCFG_VIDEO_START_OVERRIDE(megasys1_state,megasys1) MEGASYS1_TILEMAP(config, m_tmap[0], m_palette, 256*0); + m_tmap[0]->set_screen_tag(m_screen); MEGASYS1_TILEMAP(config, m_tmap[1], m_palette, 256*1); + m_tmap[1]->set_screen_tag(m_screen); /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -1962,16 +2145,16 @@ void megasys1_state::system_D(machine_config &config) ***************************************************************************/ -void megasys1_state::system_Z(machine_config &config) +void megasys1_typez_state::system_Z(machine_config &config) { /* basic machine hardware */ M68000(config, m_maincpu, SYS_A_CPU_CLOCK); /* 6MHz (12MHz / 2) */ - m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1Z_map); - TIMER(config, m_scantimer).configure_scanline(FUNC(megasys1_state::megasys1A_scanline), "screen", 0, 1); + m_maincpu->set_addrmap(AS_PROGRAM, &megasys1_typez_state::megasys1Z_map); + TIMER(config, m_scantimer).configure_scanline(FUNC(megasys1_typez_state::megasys1A_scanline), m_screen, 0, 1); Z80(config, m_audiocpu, 3000000); /* OSC 12MHz divided by 4 ??? */ - m_audiocpu->set_addrmap(AS_PROGRAM, &megasys1_state::z80_sound_map); - m_audiocpu->set_addrmap(AS_IO, &megasys1_state::z80_sound_io_map); + m_audiocpu->set_addrmap(AS_PROGRAM, &megasys1_typez_state::z80_sound_map); + m_audiocpu->set_addrmap(AS_IO, &megasys1_typez_state::z80_sound_io_map); /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); @@ -1979,15 +2162,16 @@ void megasys1_state::system_Z(machine_config &config) m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); m_screen->set_size(32*8, 32*8); m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1); - m_screen->set_screen_update(FUNC(megasys1_state::screen_update)); + m_screen->set_screen_update(FUNC(megasys1_typez_state::screen_update)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_z); PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x800/2); - MCFG_VIDEO_START_OVERRIDE(megasys1_state,megasys1_z) MEGASYS1_TILEMAP(config, m_tmap[0], m_palette, 256*0); + m_tmap[0]->set_screen_tag(m_screen); MEGASYS1_TILEMAP(config, m_tmap[1], m_palette, 256*2); + m_tmap[1]->set_screen_tag(m_screen); /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -2054,8 +2238,8 @@ ROM_START( 64street ) ROM_LOAD16_BYTE( "64th_08.rom", 0x000000, 0x010000, CRC(632be0c1) SHA1(626073037249d96ac70b2d11b2dd72b22bac49c7) ) ROM_LOAD16_BYTE( "64th_07.rom", 0x000001, 0x010000, CRC(13595d01) SHA1(e730a530ca232aab883217fa12804075cb2aa640) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, M50747? */ - ROM_LOAD( "64street.mcu", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "64street.mcu", 0x00000, 0x04000, NO_DUMP ) ROM_REGION( 0x80000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "64th_01.rom", 0x000000, 0x080000, CRC(06222f90) SHA1(52b6cb88b9d2209c16d1633c83c0224b6ebf29dc) ) @@ -2089,8 +2273,8 @@ ROM_START( 64streetja ) ROM_LOAD16_BYTE( "64th_08.rom", 0x000000, 0x010000, CRC(632be0c1) SHA1(626073037249d96ac70b2d11b2dd72b22bac49c7) ) ROM_LOAD16_BYTE( "64th_07.rom", 0x000001, 0x010000, CRC(13595d01) SHA1(e730a530ca232aab883217fa12804075cb2aa640) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, M50747? */ - ROM_LOAD( "64street.mcu", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "64street.mcu", 0x00000, 0x04000, NO_DUMP ) ROM_REGION( 0x80000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "64th_01.rom", 0x000000, 0x080000, CRC(06222f90) SHA1(52b6cb88b9d2209c16d1633c83c0224b6ebf29dc) ) @@ -2124,8 +2308,8 @@ ROM_START( 64streetj ) ROM_LOAD16_BYTE( "64th_08.rom", 0x000000, 0x010000, CRC(632be0c1) SHA1(626073037249d96ac70b2d11b2dd72b22bac49c7) ) ROM_LOAD16_BYTE( "64th_07.rom", 0x000001, 0x010000, CRC(13595d01) SHA1(e730a530ca232aab883217fa12804075cb2aa640) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, m50747? */ - ROM_LOAD( "64street.mcu", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "64street.mcu", 0x00000, 0x04000, NO_DUMP ) ROM_REGION( 0x80000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "64th_01.rom", 0x000000, 0x080000, CRC(06222f90) SHA1(52b6cb88b9d2209c16d1633c83c0224b6ebf29dc) ) @@ -2469,8 +2653,8 @@ ROM_START( avspirit ) ROM_LOAD16_BYTE( "spirit01.rom", 0x000000, 0x020000, CRC(d02ec045) SHA1(465b61d89ca06e7e0a42c42efb6919c964ad0f93) ) ROM_LOAD16_BYTE( "spirit02.rom", 0x000001, 0x020000, CRC(30213390) SHA1(9334978d3568b36215ed29789501f7cbaf6651ea) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code */ - ROM_LOAD( "m50747", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "avspirit.mcu", 0x00000, 0x04000, NO_DUMP ) ROM_REGION( 0x80000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "spirit12.rom", 0x000000, 0x080000, CRC(728335d4) SHA1(bbf13378ac0bff5e732eb30081b421ed89d12fa2) ) @@ -2645,8 +2829,8 @@ ROM_START( bigstrik ) ROM_LOAD16_BYTE( "91105v10.8", 0x000000, 0x010000, CRC(7dd69ece) SHA1(e8dc3cbce8cb3f549384cd114f8fc0e6c72462f3) ) ROM_LOAD16_BYTE( "91105v10.7", 0x000001, 0x010000, CRC(bc2c1508) SHA1(110dece929f9b452eb287c736d394d1022a09d75) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, M50747 */ - ROM_LOAD( "bigstrik.mcu", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "mo-91021.mcu", 0x00000, 0x04000, CRC(dbda258a) SHA1(2ba7a652dde83d79939a97a3aec63ce7c76a238f) ) ROM_REGION( 0x80000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "91021-01.1", 0x000000, 0x080000, CRC(f1945858) SHA1(3ed3881d3a93f34de5a15c287e076db209477259) ) @@ -2693,8 +2877,8 @@ ROM_START( chimerab ) ROM_LOAD16_BYTE( "prg8.bin", 0x000000, 0x010000, CRC(a682b1ca) SHA1(66f5d5a73f5e8cba87eac09c55eee59117d94f7b) ) ROM_LOAD16_BYTE( "prg7.bin", 0x000001, 0x010000, CRC(83b9982d) SHA1(68e7d344ebfffe19822c4cf9f7b13cb51f23537a) ) - ROM_REGION( 0x1000, "cpu2", 0 ) /* MCU Internal Code, m50747? */ - ROM_LOAD( "chimerab.mcu", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "chimerab.mcu", 0x00000, 0x04000, NO_DUMP ) ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "s1.bin", 0x000000, 0x080000, CRC(e4c2ac77) SHA1(db4bff3c02f22cc59a67b103fd176f4d88531f93) ) @@ -2719,6 +2903,40 @@ ROM_START( chimerab ) ROM_LOAD( "pr-91044", 0x0000, 0x0200, BAD_DUMP CRC(c69423d6) SHA1(ba9644a9899df2d73a5a16bf7ceef1954c2e25f3) ) // guess, but 99% sure it's meant to be the same as 64street/hayaosi1 based on analysis of game and previous handcrafted data ROM_END +ROM_START( chimeraba ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* Main CPU Code */ + ROM_LOAD16_BYTE( "chim3.bin", 0x000000, 0x040000, CRC(d3b83ca9) SHA1(cef69684db90bfca69e088718636d8c1404ea647) ) + ROM_LOAD16_BYTE( "chim2.bin", 0x000001, 0x040000, CRC(4e66e630) SHA1(b1f1c30e97a80383a7b6cc6c968ee9a6438687e2) ) + + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Sound CPU Code */ + ROM_LOAD16_BYTE( "prg8.bin", 0x000000, 0x010000, CRC(a682b1ca) SHA1(66f5d5a73f5e8cba87eac09c55eee59117d94f7b) ) + ROM_LOAD16_BYTE( "prg7.bin", 0x000001, 0x010000, CRC(83b9982d) SHA1(68e7d344ebfffe19822c4cf9f7b13cb51f23537a) ) + + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "chimerab.mcu", 0x00000, 0x04000, NO_DUMP ) + + ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ + ROM_LOAD( "s1.bin", 0x000000, 0x080000, CRC(e4c2ac77) SHA1(db4bff3c02f22cc59a67b103fd176f4d88531f93) ) + + ROM_REGION( 0x080000, "scroll1", 0 ) /* Scroll 1 */ + ROM_LOAD( "s2.bin", 0x000000, 0x080000, CRC(fafb37a5) SHA1(e36c4d18209add696982e36e84397ec51b9a9e7e) ) + + ROM_REGION( 0x020000, "scroll2", 0 ) /* Scroll 2 */ + ROM_LOAD( "scr3.bin", 0x000000, 0x020000, CRC(5fe38a83) SHA1(0492be1a92baacb80ed5bdc0167beda3e9163d76) ) + + ROM_REGION( 0x100000, "sprites", 0 ) /* Sprites */ + ROM_LOAD( "b2.bin", 0x000000, 0x080000, CRC(6e7f1778) SHA1(ac93f56c998f28e3f453fcdbf85f3217c9ae97de) ) + ROM_LOAD( "b1.bin", 0x080000, 0x080000, CRC(29c0385e) SHA1(4416cb17d3121ec00bceff2614dc424a359f127a) ) + + ROM_REGION( 0x040000, "oki1", 0 ) /* Samples */ + ROM_LOAD( "voi11.bin", 0x000000, 0x040000, CRC(14b3afe6) SHA1(6d8659d0fc6980ffc1661702fc787737448dce9d) ) + + ROM_REGION( 0x040000, "oki2", 0 ) /* Samples */ + ROM_LOAD( "voi10.bin", 0x000000, 0x040000, CRC(67498914) SHA1(8d89fa90f38fd102b15f26f71491ea833ec32cb2) ) + + ROM_REGION( 0x0200, "proms", 0 ) /* Priority PROM */ + ROM_LOAD( "pr-91044", 0x0000, 0x0200, BAD_DUMP CRC(c69423d6) SHA1(ba9644a9899df2d73a5a16bf7ceef1954c2e25f3) ) // guess, but 99% sure it's meant to be the same as 64street/hayaosi1 based on analysis of game and previous handcrafted data +ROM_END /*************************************************************************** @@ -2781,8 +2999,8 @@ ROM_START( cybattlr ) ROM_LOAD16_BYTE( "cb_08.rom", 0x000000, 0x010000, CRC(bf7b3558) SHA1(6046b965d61560e0227437f00f1ff1f7dbc16232) ) ROM_LOAD16_BYTE( "cb_07.rom", 0x000001, 0x010000, CRC(85d219d7) SHA1(a9628efc5eddefad739363ff0b2f37a2d095df86) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, m50747? */ - ROM_LOAD( "cybattlr.mcu", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "cybattlr.mcu", 0x00000, 0x04000, NO_DUMP ) ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "cb_m01.rom", 0x000000, 0x080000, CRC(1109337f) SHA1(ab294d87c9b4eb54401da5ad6ea171e4c0a700b5) ) @@ -2843,8 +3061,8 @@ ROM_START( edf ) ROM_LOAD16_BYTE( "edf1.f5", 0x000000, 0x020000, CRC(2290ea19) SHA1(64c9394bd4d5569d68833d2e57abaf2f1af5be97) ) ROM_LOAD16_BYTE( "edf2.f3", 0x000001, 0x020000, CRC(ce93643e) SHA1(686bf0ec104af8c97624a782e0d60afe170fd945) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, 64 pin DIP surface scratched, m50747? */ - ROM_LOAD( "edf.mcu", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "edf.mcu", 0x00000, 0x04000, NO_DUMP ) ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "edf_m04.rom", 0x000000, 0x080000, CRC(6744f406) SHA1(3b8f13ca968456186d9ad61f34611b7eab62ea86) ) @@ -2882,8 +3100,8 @@ ROM_START( edfa ) ROM_LOAD16_BYTE( "edf1.f5", 0x000000, 0x020000, CRC(2290ea19) SHA1(64c9394bd4d5569d68833d2e57abaf2f1af5be97) ) ROM_LOAD16_BYTE( "edf2.f3", 0x000001, 0x020000, CRC(ce93643e) SHA1(686bf0ec104af8c97624a782e0d60afe170fd945) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, 64 pin DIP surface scratched, m50747? */ - ROM_LOAD( "edf.mcu", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "edf.mcu", 0x00000, 0x04000, NO_DUMP ) ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "edf_m04.rom", 0x000000, 0x080000, CRC(6744f406) SHA1(3b8f13ca968456186d9ad61f34611b7eab62ea86) ) @@ -2921,8 +3139,8 @@ ROM_START( edfu ) ROM_LOAD16_BYTE( "edf1.f5", 0x000000, 0x020000, CRC(2290ea19) SHA1(64c9394bd4d5569d68833d2e57abaf2f1af5be97) ) ROM_LOAD16_BYTE( "edf2.f3", 0x000001, 0x020000, CRC(ce93643e) SHA1(686bf0ec104af8c97624a782e0d60afe170fd945) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, 64 pin DIP surface scratched, m50747? */ - ROM_LOAD( "edf.mcu", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "edf.mcu", 0x00000, 0x04000, NO_DUMP ) ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "edf_m04.rom", 0x000000, 0x080000, CRC(6744f406) SHA1(3b8f13ca968456186d9ad61f34611b7eab62ea86) ) @@ -3093,6 +3311,50 @@ ROM_START( hachoo ) ROM_LOAD( "ht.14m", 0x0000, 0x0200, CRC(85302b15) SHA1(8184c1184a71706cdb981e3c4f90a08521413e72) ) ROM_END +ROM_START( hachooa ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* Main CPU Code */ + // This set had 2nd half of the ROMs blank (bad dumps, wrong device type used) + // It has been repaired to boot using 2nd half of other set but still fails service mode (START1+START2 on startup) ROM check + // so is marked as bad dump. It's clearly a different revision though. + ROM_LOAD16_BYTE( "rom-2", 0x000000, 0x020000, BAD_DUMP CRC(3ea2f1cd) SHA1(5196a7c6b51c54f9b39e76fb1c5e081e1927ff59) ) + ROM_LOAD16_BYTE( "rom-1", 0x000001, 0x020000, BAD_DUMP CRC(3cdffa03) SHA1(9fa6dd64ebff7170875ab1cd012f59698b7ecbc8) ) + + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Sound CPU Code */ + ROM_LOAD16_BYTE( "hacho05.rom", 0x000000, 0x010000, CRC(6271f74f) SHA1(2fe0f8adf3cdafe13a9107c36f24f1a525d06a05) ) + ROM_LOAD16_BYTE( "hacho06.rom", 0x000001, 0x010000, CRC(db9e743c) SHA1(77a3691b48eed389bfcdead5f307415dce47247e) ) + + ROM_REGION( 0x1000, "mcu", 0 ) /* M50747 MCU Code */ + ROM_LOAD( "m50747", 0x0000, 0x1000, NO_DUMP ) + + ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ + ROM_LOAD( "hacho14.rom", 0x000000, 0x080000, CRC(10188483) SHA1(43bf08ac777c42351b04e2c35b1a119f524b4388) ) + + ROM_REGION( 0x080000, "scroll1", 0 ) /* Scroll 1 */ + ROM_LOAD( "hacho15.rom", 0x000000, 0x020000, CRC(e559347e) SHA1(1d71c83f4946af80083bbd059e55c2d57f2f9647) ) + ROM_LOAD( "hacho16.rom", 0x020000, 0x020000, CRC(105fd8b5) SHA1(41aafcf6e29417a39ca0945f47a90646da2cbf3c) ) + ROM_LOAD( "hacho17.rom", 0x040000, 0x020000, CRC(77f46174) SHA1(81d923069191c153773aaeb2d0eab6ab0076a386) ) + ROM_LOAD( "hacho18.rom", 0x060000, 0x020000, CRC(0be21111) SHA1(45beb7e9f6cfe56893e0c5b052a1922e3d73275b) ) + + ROM_REGION( 0x020000, "scroll2", 0 ) /* Scroll 2 */ + ROM_LOAD( "hacho19.rom", 0x000000, 0x020000, CRC(33bc9de3) SHA1(8bbfda0fea742177e00dd5fff226f85233537cb3) ) + + ROM_REGION( 0x080000, "sprites", 0 ) /* Sprites */ + ROM_LOAD( "hacho20.rom", 0x000000, 0x020000, CRC(2ae2011e) SHA1(f294ebfd87816c7b179fcaba3869e3402b2560a9) ) + ROM_LOAD( "hacho21.rom", 0x020000, 0x020000, CRC(6dcfb8d5) SHA1(a478fea81acf1f317fe82ec84d4d21227db7432b) ) + ROM_LOAD( "hacho22.rom", 0x040000, 0x020000, CRC(ccabf0e0) SHA1(3b9d95d8dee6155b484d85cc3f12e20a8ae3c9be) ) + ROM_LOAD( "hacho23.rom", 0x060000, 0x020000, CRC(ff5f77aa) SHA1(e9fc71ac3499ee5b4636a3bdf1f3fbbe2623b0db) ) + + ROM_REGION( 0x040000, "oki1", 0 ) /* Samples */ + ROM_LOAD( "hacho09.rom", 0x000000, 0x020000, CRC(e9f35c90) SHA1(1a1dd6a7777bbad1475ad65f8797818c9b4f0937) ) + ROM_LOAD( "hacho10.rom", 0x020000, 0x020000, CRC(1aeaa188) SHA1(40827435c948a2fd448137eb3f8c33fc84da3b82) ) + + ROM_REGION( 0x040000, "oki2", 0 ) /* Samples */ + ROM_LOAD( "hacho07.rom", 0x000000, 0x020000, CRC(06e6ca7f) SHA1(a15a1b754b0d47285a023ecfc4b762ab592f8262) ) + ROM_LOAD( "hacho08.rom", 0x020000, 0x020000, CRC(888a6df1) SHA1(71d70633ecf7255287e55e92f8d2f186fe58f4b4) ) + + ROM_REGION( 0x0200, "proms", 0 ) /* Priority PROM */ + ROM_LOAD( "ht.14m", 0x0000, 0x0200, CRC(85302b15) SHA1(8184c1184a71706cdb981e3c4f90a08521413e72) ) +ROM_END /*************************************************************************** @@ -3103,7 +3365,7 @@ JALECO ED9075 EB90004-20027 CPU: HD68000PS8 x2 -MCU: M50747? (labeled "MO-91044") +MCU: TMP91640 (labeled "MO-91044") Sound: YM2151 YM3012 M6295x2 Custom: GS-9000401 (44pin QFP) GS-9000403 (44pin QFP, x2) @@ -3143,8 +3405,8 @@ ROM_START( hayaosi1 ) ROM_LOAD16_BYTE( "1", 0x00000, 0x20000, CRC(b088b27e) SHA1(198e2520ce4f9b19ea108e09ff00f7e27768f290) ) ROM_LOAD16_BYTE( "2", 0x00001, 0x20000, CRC(cebc7b16) SHA1(18b166560ffff7c43cec3d52e4b2da79256dfb2e) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, M50747 */ - ROM_LOAD( "mo-91044.mcu", 0x000000, 0x1000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ + ROM_LOAD( "mo-91044.mcu", 0x00000, 0x04000, NO_DUMP ) ROM_REGION( 0x80000, "scroll0", ROMREGION_ERASEFF) /* Scroll 0 */ ROM_LOAD( "7", 0x000000, 0x80000, CRC(3629c455) SHA1(c216b600750861b073062c165f36e6949db10d78) ) @@ -3978,7 +4240,7 @@ ROM_START( peekaboo ) ROM_LOAD16_BYTE( "peek a boo j ver 1.1 - 3.ic29", 0x000000, 0x020000, CRC(f5f4cf33) SHA1(f135f2b627347255bb0811e9a4a213e3b447c199) ) ROM_LOAD16_BYTE( "peek a boo j ver 1.1 - 2.ic28", 0x000001, 0x020000, CRC(7b3d430d) SHA1(8b48101929da4938a61dfd0eda845368c4184831) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, M50747 */ + ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, M50747? */ ROM_LOAD( "mo-90233.mcu", 0x000000, 0x1000, NO_DUMP ) ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ @@ -4002,7 +4264,7 @@ ROM_START( peekaboou ) ROM_LOAD16_BYTE( "pb92127a_3_ver1.0.ic29", 0x000000, 0x020000, CRC(4603176a) SHA1(bbdc3fa439b32bdaaef5ca374af89e25fc4d9c1a) ) ROM_LOAD16_BYTE( "pb92127a_2_ver1.0.ic28", 0x000001, 0x020000, CRC(7bf4716b) SHA1(f2c0bfa32426c9816d9d3fbd73560566a497912d) ) - ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, M50747 */ + ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, M50747? */ ROM_LOAD( "mo-90233.mcu", 0x000000, 0x1000, NO_DUMP ) ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ @@ -4822,7 +5084,7 @@ void megasys1_state::stdragona_gfx_unmangle(const char *region) m_mcu_hs_ram[4/2] == _3_ && \ m_mcu_hs_ram[6/2] == _4_) -void megasys1_state::init_64street() +void megasys1_bc_iosim_state::init_64street() { // u16 *ROM = (u16 *) memregion("maincpu")->base(); // ROM[0x006b8/2] = 0x6004; // d8001 test @@ -4903,7 +5165,7 @@ void megasys1_state::init_lordofkbp() } } -void megasys1_state::init_avspirit() +void megasys1_bc_iosim_state::init_avspirit() { m_ip_select_values[0] = 0x37; m_ip_select_values[1] = 0x35; @@ -4915,29 +5177,21 @@ void megasys1_state::init_avspirit() m_ip_select_values[6] = 0x06; - // has twice less RAM + // has half as much RAM m_maincpu->space(AS_PROGRAM).unmap_readwrite(0x060000, 0x06ffff); m_maincpu->space(AS_PROGRAM).install_ram(0x070000, 0x07ffff, m_ram); save_item(NAME(m_ip_latched)); } -void megasys1_state::init_bigstrik() +void megasys1_bc_iomcu_state::init_bigstrik() { - m_ip_select_values[0] = 0x58; - m_ip_select_values[1] = 0x54; - m_ip_select_values[2] = 0x55; - m_ip_select_values[3] = 0x56; - m_ip_select_values[4] = 0x57; - - m_ip_select_values[5] = 0xfb; - m_ip_select_values[6] = 0x06; - - save_item(NAME(m_ip_latched)); save_item(NAME(m_sprite_bank)); + save_item(NAME(m_mcu_input_data)); + save_item(NAME(m_mcu_io_data)); } -void megasys1_state::init_chimerab() +void megasys1_bc_iosim_state::init_chimerab() { /* same as cybattlr */ m_ip_select_values[0] = 0x56; @@ -4953,7 +5207,23 @@ void megasys1_state::init_chimerab() save_item(NAME(m_sprite_bank)); } -void megasys1_state::init_cybattlr() +void megasys1_bc_iosim_state::init_chimeraba() +{ + m_ip_select_values[0] = 0x56; + m_ip_select_values[1] = 0x52; + m_ip_select_values[2] = 0x53; + m_ip_select_values[3] = 0x55; + m_ip_select_values[4] = 0x54; + + m_ip_select_values[5] = 0xfa; + m_ip_select_values[6] = 0x06; + + save_item(NAME(m_ip_latched)); + save_item(NAME(m_sprite_bank)); +} + + +void megasys1_bc_iosim_state::init_cybattlr() { m_ip_select_values[0] = 0x56; m_ip_select_values[1] = 0x52; @@ -4968,7 +5238,7 @@ void megasys1_state::init_cybattlr() save_item(NAME(m_sprite_bank)); } -void megasys1_state::init_edf() +void megasys1_bc_iosim_state::init_edf() { m_ip_select_values[0] = 0x20; m_ip_select_values[1] = 0x21; @@ -4987,7 +5257,7 @@ void megasys1_state::init_edfp() phantasm_rom_decode(machine(), "maincpu"); } -void megasys1_state::init_hayaosi1() +void megasys1_bc_iosim_state::init_hayaosi1() { m_ip_select_values[0] = 0x51; m_ip_select_values[1] = 0x52; @@ -5204,7 +5474,9 @@ void megasys1_state::init_stdragonb() void megasys1_state::init_monkelf() { - init_avspirit(); + // has half as much RAM + m_maincpu->space(AS_PROGRAM).unmap_readwrite(0x060000, 0x06ffff); + m_maincpu->space(AS_PROGRAM).install_ram(0x070000, 0x07ffff, m_ram); m_rom_maincpu[0x00744/2] = 0x4e71; // weird check, 0xe000e R is a port-based trap? @@ -5225,8 +5497,8 @@ void megasys1_state::init_monkelf() *************************************/ // Type Z -GAME( 1988, lomakai, 0, system_Z, lomakai, megasys1_state, empty_init, ROT0, "Jaleco", "Legend of Makai (World)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, makaiden, lomakai, system_Z, lomakai, megasys1_state, empty_init, ROT0, "Jaleco", "Makai Densetsu (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, lomakai, 0, system_Z, lomakai, megasys1_typez_state, empty_init, ROT0, "Jaleco", "Legend of Makai (World)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, makaiden, lomakai, system_Z, lomakai, megasys1_typez_state, empty_init, ROT0, "Jaleco", "Makai Densetsu (Japan)", MACHINE_SUPPORTS_SAVE ) // Type A GAME( 1988, p47, 0, system_A, p47, megasys1_state, empty_init, ROT0, "Jaleco", "P-47 - The Phantom Fighter (World)", MACHINE_SUPPORTS_SAVE ) @@ -5245,7 +5517,8 @@ GAME( 1989, astyanaxa, astyanax, system_A, astyanax, megasys1_state, i GAME( 1989, lordofk, astyanax, system_A, astyanax, megasys1_state, init_astyanax, ROT0, "Jaleco", "The Lord of King (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, lordofkb, astyanax, system_A, astyanax, megasys1_state, empty_init, ROT0, "bootleg","The Lord of King (bootleg, not protected)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, lordofkbp, astyanax, system_A, astyanax, megasys1_state, init_lordofkbp,ROT0, "bootleg","The Lord of King (bootleg, protected)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, hachoo, 0, system_A_hachoo, hachoo, megasys1_state, init_astyanax, ROT0, "Jaleco", "Hachoo!", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, hachoo, 0, system_A, hachoo, megasys1_hachoo_state, init_astyanax, ROT0, "Jaleco", "Hachoo! (set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, hachooa, hachoo, system_A, hachoo, megasys1_hachoo_state, init_astyanax, ROT0, "Jaleco", "Hachoo! (set 2)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, jitsupro, 0, system_A_jitsupro, jitsupro, megasys1_state, init_jitsupro, ROT0, "Jaleco", "Jitsuryoku!! Pro Yakyuu (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, plusalph, 0, system_A, plusalph, megasys1_state, init_astyanax, ROT270, "Jaleco", "Plus Alpha", MACHINE_SUPPORTS_SAVE ) GAME( 1989, stdragon, 0, system_A, stdragon, megasys1_state, init_stdragon, ROT0, "Jaleco", "Saint Dragon (set 1)", MACHINE_SUPPORTS_SAVE ) @@ -5264,21 +5537,22 @@ GAME( 1992, soldam, 0, system_A_soldam, soldam, megasys1_state, i GAME( 1992, soldamj, soldam, system_A_soldam, soldam, megasys1_state, init_soldamj, ROT0, "Jaleco", "Soldam (Japan)", MACHINE_SUPPORTS_SAVE ) // Type B -GAME( 1991, avspirit, 0, system_B, avspirit, megasys1_state, init_avspirit, ROT0, "Jaleco", "Avenging Spirit", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, monkelf, avspirit, system_B_monkelf, avspirit, megasys1_state, init_monkelf, ROT0, "bootleg","Monky Elf (Korean bootleg of Avenging Spirit)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, edf, 0, system_B, edf, megasys1_state, init_edf, ROT0, "Jaleco", "E.D.F. : Earth Defense Force (set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, edfa, edf, system_B, edf, megasys1_state, init_edf, ROT0, "Jaleco", "E.D.F. : Earth Defense Force (set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, edfu, edf, system_B, edf, megasys1_state, init_edf, ROT0, "Jaleco", "E.D.F. : Earth Defense Force (North America)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, edfbl, edf, system_Bbl, edf, megasys1_state, empty_init, ROT0, "bootleg","E.D.F. : Earth Defense Force (bootleg)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1993, hayaosi1, 0, system_B_hayaosi1, hayaosi1, megasys1_state, init_hayaosi1, ROT0, "Jaleco", "Hayaoshi Quiz Ouza Ketteisen - The King Of Quiz", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1991, avspirit, 0, system_B, avspirit, megasys1_bc_iosim_state, init_avspirit, ROT0, "Jaleco", "Avenging Spirit", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, monkelf, avspirit, system_B_monkelf, avspirit, megasys1_state, init_monkelf, ROT0, "bootleg","Monky Elf (Korean bootleg of Avenging Spirit)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, edf, 0, system_B, edf, megasys1_bc_iosim_state, init_edf, ROT0, "Jaleco", "E.D.F. : Earth Defense Force (set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, edfa, edf, system_B, edf, megasys1_bc_iosim_state, init_edf, ROT0, "Jaleco", "E.D.F. : Earth Defense Force (set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, edfu, edf, system_B, edf, megasys1_bc_iosim_state, init_edf, ROT0, "Jaleco", "E.D.F. : Earth Defense Force (North America)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, edfbl, edf, system_Bbl, edf, megasys1_state, empty_init, ROT0, "bootleg","E.D.F. : Earth Defense Force (bootleg)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, hayaosi1, 0, system_B_hayaosi1, hayaosi1, megasys1_bc_iosim_state, init_hayaosi1, ROT0, "Jaleco", "Hayaoshi Quiz Ouza Ketteisen - The King Of Quiz", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // Type C -GAME( 1991, 64street, 0, system_C, 64street, megasys1_state, init_64street, ROT0, "Jaleco", "64th. Street - A Detective Story (World)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, 64streetj, 64street, system_C, 64street, megasys1_state, init_64street, ROT0, "Jaleco", "64th. Street - A Detective Story (Japan, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, 64streetja, 64street, system_C, 64street, megasys1_state, init_64street, ROT0, "Jaleco", "64th. Street - A Detective Story (Japan, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, bigstrik, 0, system_C, bigstrik, megasys1_state, init_bigstrik, ROT0, "Jaleco", "Big Striker", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, chimerab, 0, system_C, chimerab, megasys1_state, init_chimerab, ROT0, "Jaleco", "Chimera Beast (Japan, prototype)", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, cybattlr, 0, system_C, cybattlr, megasys1_state, init_cybattlr, ROT90, "Jaleco", "Cybattler", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, 64street, 0, system_C_iosim, 64street, megasys1_bc_iosim_state, init_64street, ROT0, "Jaleco", "64th. Street - A Detective Story (World)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, 64streetj, 64street, system_C_iosim, 64street, megasys1_bc_iosim_state, init_64street, ROT0, "Jaleco", "64th. Street - A Detective Story (Japan, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, 64streetja, 64street, system_C_iosim, 64street, megasys1_bc_iosim_state, init_64street, ROT0, "Jaleco", "64th. Street - A Detective Story (Japan, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, bigstrik, 0, system_C_bigstrik, bigstrik, megasys1_bc_iomcu_state, init_bigstrik, ROT0, "Jaleco", "Big Striker", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, chimerab, 0, system_C_iosim, chimerab, megasys1_bc_iosim_state, init_chimerab, ROT0, "Jaleco", "Chimera Beast (Japan, prototype, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, chimeraba, chimerab, system_C_iosim, chimerab, megasys1_bc_iosim_state, init_chimeraba,ROT0, "Jaleco", "Chimera Beast (Japan, prototype, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, cybattlr, 0, system_C_iosim, cybattlr, megasys1_bc_iosim_state, init_cybattlr, ROT90, "Jaleco", "Cybattler", MACHINE_SUPPORTS_SAVE ) // Type D GAME( 1993, peekaboo, 0, system_D, peekaboo, megasys1_state, init_peekaboo, ROT0, "Jaleco", "Peek-a-Boo! (Japan, ver. 1.1)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/jaleco/megasys1.h b/src/mame/jaleco/megasys1.h index d84156de2da..aac0f64ec74 100644 --- a/src/mame/jaleco/megasys1.h +++ b/src/mame/jaleco/megasys1.h @@ -12,6 +12,7 @@ #pragma once +#include "cpu/tlcs90/tlcs90.h" #include "machine/gen_latch.h" #include "machine/timer.h" #include "sound/msm5205.h" @@ -26,33 +27,34 @@ class megasys1_state : public driver_device public: megasys1_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_objectram(*this, "objectram"), - m_tmap(*this, "scroll%u", 0), - m_ram(*this, "ram"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), - m_oki(*this, "oki%u", 1U), - m_ymsnd(*this, "ymsnd"), - m_p47b_adpcm(*this, "msm%u", 1U), + m_soundlatch(*this, "soundlatch%u", 1U), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), m_screen(*this, "screen"), - m_soundlatch(*this, "soundlatch%u", 1U), - m_scantimer(*this, "scantimer"), - m_rom_maincpu(*this, "maincpu"), - m_okibank(*this, "okibank"), + m_tmap(*this, "scroll%u", 0), + m_oki(*this, "oki%u", 1U), + m_ram(*this, "ram"), m_io_system(*this, "SYSTEM"), m_io_p1(*this, "P1"), m_io_p2(*this, "P2"), m_io_dsw(*this, "DSW"), m_io_dsw1(*this, "DSW1"), - m_io_dsw2(*this, "DSW2") - { } + m_io_dsw2(*this, "DSW2"), + m_scantimer(*this, "scantimer"), + m_objectram(*this, "objectram"), + m_ymsnd(*this, "ymsnd"), + m_p47b_adpcm(*this, "msm%u", 1U), + m_rom_maincpu(*this, "maincpu"), + m_okibank(*this, "okibank") + { + m_hardware_type_z = 0; + } void system_A_soldam(machine_config &config); void system_B_monkelf(machine_config &config); void system_A_iganinju(machine_config &config); - void system_A_hachoo(machine_config &config); void kickoffb(machine_config &config); void p47b(machine_config &config); void system_D(machine_config &config); @@ -60,69 +62,78 @@ public: void system_Bbl(machine_config &config); void system_A(machine_config &config); void system_A_jitsupro(machine_config &config); - void system_B(machine_config &config); - void system_B_hayaosi1(machine_config &config); - void system_Z(machine_config &config); - void init_64street(); - void init_chimerab(); void init_peekaboo(); void init_soldam(); void init_astyanax(); void init_stdragon(); - void init_hayaosi1(); void init_soldamj(); void init_phantasm(); void init_jitsupro(); void init_iganinju(); - void init_cybattlr(); void init_rodlandj(); void init_rittam(); void init_rodlandjb(); - void init_avspirit(); void init_monkelf(); - void init_edf(); void init_edfp(); - void init_bigstrik(); void init_rodland(); - void init_edfbl(); void init_stdragona(); void init_stdragonb(); - void init_systemz(); void init_lordofkbp(); -private: - required_shared_ptr m_objectram; - optional_device_array m_tmap; - required_shared_ptr m_ram; +protected: + virtual void machine_reset() override; + virtual void video_start() override; + required_device m_maincpu; optional_device m_audiocpu; - optional_device_array m_oki; - optional_device m_ymsnd; - optional_device_array m_p47b_adpcm; + optional_device_array m_soundlatch; required_device m_gfxdecode; required_device m_palette; required_device m_screen; - optional_device_array m_soundlatch; - optional_device m_scantimer; - required_region_ptr m_rom_maincpu; - optional_memory_bank m_okibank; + optional_device_array m_tmap; + optional_device_array m_oki; + required_shared_ptr m_ram; required_ioport m_io_system; required_ioport m_io_p1; required_ioport m_io_p2; optional_ioport m_io_dsw; optional_ioport m_io_dsw1; optional_ioport m_io_dsw2; + optional_device m_scantimer; + + void megasys1B_map(address_map &map); + void megasys1C_map(address_map &map); + + void megasys1c_handle_scanline_irq(int scanline); + TIMER_DEVICE_CALLBACK_MEMBER(megasys1A_scanline); + TIMER_DEVICE_CALLBACK_MEMBER(megasys1B_scanline); + + void megasys_base_map(address_map &map); + void megasys1B_sound_map(address_map &map); + + virtual void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect); + void mix_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void partial_clear_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u8 param); + inline void draw_16x16_priority_sprite(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect, s32 code, s32 color, s32 sx, s32 sy, s32 flipx, s32 flipy, u8 mosaic, u8 mosaicsol, s32 priority); + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void screen_flag_w(offs_t offset, u16 data, u16 mem_mask = ~0); - // configuration - u16 m_ip_select_values[7]{}; // System B and C int m_hardware_type_z = 0; // System Z - int m_layers_order[16]{}; + u8 m_ignore_oki_status = 0; + // System C + u16 m_sprite_bank = 0; + + // soldam + u16 *m_spriteram = nullptr; + + u16 m_screen_flag = 0; + // all bitmap_ind16 m_sprite_buffer_bitmap; - u16 m_screen_flag = 0; std::unique_ptr m_buffer_objectram; std::unique_ptr m_buffer2_objectram; std::unique_ptr m_buffer_spriteram16; @@ -132,11 +143,15 @@ private: u16 m_active_layers = 0; u16 m_sprite_flag = 0; - // System B and C - u16 m_ip_latched = 0; +private: + required_shared_ptr m_objectram; + optional_device m_ymsnd; + optional_device_array m_p47b_adpcm; + required_region_ptr m_rom_maincpu; + optional_memory_bank m_okibank; - // System C - u16 m_sprite_bank = 0; + // configuration + int m_layers_order[16]{}; // System A only int m_mcu_hs = 0; @@ -145,12 +160,7 @@ private: // peekaboo u16 m_protection_val = 0; - // soldam - u16 *m_spriteram = nullptr; - void sound_irq(int state); - u16 ip_select_r(); - void ip_select_w(u16 data); u16 protection_peekaboo_r(); void protection_peekaboo_w(offs_t offset, u16 data, u16 mem_mask = ~0); u16 megasys1A_mcu_hs_r(offs_t offset, u16 mem_mask = ~0); @@ -165,35 +175,23 @@ private: void sprite_bank_w(offs_t offset, u16 data, u16 mem_mask = ~0); u16 sprite_flag_r(); void sprite_flag_w(offs_t offset, u16 data, u16 mem_mask = ~0); - void screen_flag_w(offs_t offset, u16 data, u16 mem_mask = ~0); void soundlatch_w(u16 data); - void soundlatch_z_w(u16 data); void soundlatch_c_w(u16 data); void monkelf_scroll0_w(offs_t offset, u16 data, u16 mem_mask = ~0); void monkelf_scroll1_w(offs_t offset, u16 data, u16 mem_mask = ~0); - void megasys1_set_vreg_flag(int which, int data); template u8 oki_status_r(); void ram_w(offs_t offset, u16 data); void p47b_adpcm_w(offs_t offset, u8 data); - DECLARE_MACHINE_RESET(megasys1); - DECLARE_VIDEO_START(megasys1); - DECLARE_VIDEO_START(megasys1_z); + void megasys1_palette(palette_device &palette); - DECLARE_MACHINE_RESET(megasys1_hachoo); - u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void screen_vblank(int state); INTERRUPT_GEN_MEMBER(megasys1D_irq); - TIMER_DEVICE_CALLBACK_MEMBER(megasys1A_scanline); TIMER_DEVICE_CALLBACK_MEMBER(megasys1A_iganinju_scanline); - TIMER_DEVICE_CALLBACK_MEMBER(megasys1B_scanline); + TIMER_DEVICE_CALLBACK_MEMBER(megasys1C_scanline); void priority_create(); - void mix_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void partial_clear_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u8 param); - void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect); - inline void draw_16x16_priority_sprite(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect, s32 code, s32 color, s32 sx, s32 sy, s32 flipx, s32 flipy, u8 mosaic, u8 mosaicsol, s32 priority); void rodland_gfx_unmangle(const char *region); void jitsupro_gfx_unmangle(const char *region); void stdragona_gfx_unmangle(const char *region); @@ -205,15 +203,110 @@ private: void megasys1A_sound_map(address_map &map); void megasys1A_jitsupro_sound_map(address_map &map); void megasys1B_edfbl_map(address_map &map); - void megasys1B_map(address_map &map); void megasys1B_monkelf_map(address_map &map); - void megasys1B_sound_map(address_map &map); - void megasys1C_map(address_map &map); void megasys1D_map(address_map &map); void megasys1D_oki_map(address_map &map); +}; + +class megasys1_hachoo_state : public megasys1_state +{ +public: + megasys1_hachoo_state(const machine_config &mconfig, device_type type, const char *tag) : + megasys1_state(mconfig, type, tag) + { } + +protected: + virtual void machine_reset() override; +}; + +class megasys1_typez_state : public megasys1_state +{ +public: + megasys1_typez_state(const machine_config &mconfig, device_type type, const char *tag) : + megasys1_state(mconfig, type, tag) + { + m_hardware_type_z = 1; + } + + void system_Z(machine_config &config); + +protected: + virtual void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect) override; + +private: + void soundlatch_z_w(u16 data); + void megasys1Z_map(address_map &map); void z80_sound_io_map(address_map &map); void z80_sound_map(address_map &map); }; + +class megasys1_bc_iosim_state : public megasys1_state +{ +public: + megasys1_bc_iosim_state(const machine_config &mconfig, device_type type, const char *tag) : + megasys1_state(mconfig, type, tag) + { } + + void init_avspirit(); + void init_64street(); + void init_chimerab(); + void init_chimeraba(); + void init_cybattlr(); + void init_hayaosi1(); + void init_edf(); + + void system_B(machine_config &config); + void system_B_hayaosi1(machine_config &config); + void system_C_iosim(machine_config &config); + +protected: + virtual void machine_reset() override; + + u16 m_ip_select_values[7]{}; // System B and C + + u16 m_ip_latched = 0; + + void megasys1B_iosim_map(address_map &map); + void megasys1C_iosim_map(address_map &map); + + u16 ip_select_r(); + void ip_select_w(u16 data); +}; + +class megasys1_bc_iomcu_state : public megasys1_state +{ +public: + megasys1_bc_iomcu_state(const machine_config &mconfig, device_type type, const char *tag) : + megasys1_state(mconfig, type, tag), + m_iomcu(*this, "iomcu") + { } + + void init_bigstrik(); + + void system_C_bigstrik(machine_config &config); + +protected: + virtual void machine_reset() override; + +private: + required_device m_iomcu; + + u16 ip_select_bigstrik_r(); + void ip_select_bigstrik_w(u16 data); + u8 mcu_capture_inputs_r(offs_t offset); + u8 mcu_port1_r(); + void mcu_port2_w(u8 data); + void mcu_port6_w(u8 data); + + u8 m_mcu_input_data; + u8 m_mcu_io_data; + + void megasys1C_bigstrik_map(address_map &map); + void iomcu_map(address_map &map); + + TIMER_DEVICE_CALLBACK_MEMBER(megasys1C_bigstrik_scanline); +}; + #endif // MAME_JALECO_MEGASYS1_H diff --git a/src/mame/jaleco/megasys1_v.cpp b/src/mame/jaleco/megasys1_v.cpp index d02b4d67fe1..7ed221f69df 100644 --- a/src/mame/jaleco/megasys1_v.cpp +++ b/src/mame/jaleco/megasys1_v.cpp @@ -199,7 +199,7 @@ actual code sent to the hardware. -VIDEO_START_MEMBER(megasys1_state,megasys1) +void megasys1_state::video_start() { m_spriteram = &m_ram[0x8000/2]; @@ -210,8 +210,6 @@ VIDEO_START_MEMBER(megasys1_state,megasys1) m_active_layers = m_sprite_bank = m_screen_flag = m_sprite_flag = 0; - m_hardware_type_z = 0; - m_screen->register_screen_bitmap(m_sprite_buffer_bitmap); save_pointer(NAME(m_buffer_objectram), 0x2000); @@ -223,11 +221,7 @@ VIDEO_START_MEMBER(megasys1_state,megasys1) save_item(NAME(m_sprite_flag)); } -VIDEO_START_MEMBER(megasys1_state,megasys1_z) -{ - VIDEO_START_CALL_MEMBER(megasys1); - m_hardware_type_z = 1; -} + /*************************************************************************** @@ -279,7 +273,7 @@ void megasys1_state::soundlatch_w(u16 data) m_audiocpu->set_input_line(4, HOLD_LINE); } -void megasys1_state::soundlatch_z_w(u16 data) +void megasys1_typez_state::soundlatch_z_w(u16 data) { m_soundlatch[0]->write(data & 0xff); m_audiocpu->set_input_line(5, HOLD_LINE); @@ -429,115 +423,110 @@ inline void megasys1_state::draw_16x16_priority_sprite(screen_device &screen, bi } -void megasys1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect) +// Legend of Makai / Makai Densetsu only +void megasys1_typez_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect) { int color,code,sx,sy,flipx,flipy,attr,sprite; + u16 *spriteram16 = m_spriteram; + /* MS1-Z just draws Sprite Data, and in reverse order */ - -/* objram: 0x100*4 entries spritedata: 0x80 entries */ - - /* sprite order is from first in Sprite Data RAM (frontmost) to last */ - - if (m_hardware_type_z == 0) /* standard sprite hardware */ + for (sprite = 0x80-1;sprite >= 0;sprite--) { - if (!(m_sprite_flag&0x10)) - m_sprite_buffer_bitmap.fill(0x7fff, cliprect); - else - { - // P47 sprite trails effect.. not quite right tho - // I think the low 4 bits are used to clear specific pens? - // when the hardware wants to clear the trails from the screen - // it increases the value from 0x00 to 0x0e - //printf("m_sprite_flag %02x\n", m_sprite_flag); - partial_clear_sprite_bitmap(screen, bitmap, cliprect, m_sprite_flag&0x0f); - } - - s32 color_mask = (m_sprite_flag & 0x100) ? 0x07 : 0x0f; + u16 *spritedata = &spriteram16[ sprite * 0x10/2]; - u16 *objectram = (u16*)m_buffer2_objectram.get(); - u16 *spriteram = (u16*)m_buffer2_spriteram16.get(); + attr = spritedata[ 8/2 ]; - for (s32 offs = (0x800-8)/2; offs >= 0; offs -= 4) - { - for (s32 sprite = 0; sprite < 4 ; sprite ++) - { - u16 *objectdata = &objectram[offs + (0x800/2) * sprite]; - u16 *spritedata = &spriteram[(objectdata[0] & 0x7f) * 8]; + sx = spritedata[0x0A/2] % 512; + sy = spritedata[0x0C/2] % 512; - s32 attr = spritedata[4]; - if (((attr & 0xc0) >> 6) != sprite) continue; + if (sx > 256-1) sx -= 512; + if (sy > 256-1) sy -= 512; - s32 sx = (spritedata[5] + objectdata[1]) & 0x1ff; - s32 sy = (spritedata[6] + objectdata[2]) & 0x1ff; + code = spritedata[0x0E/2]; + color = (attr & 0x0F); - if (sx > 255) sx -= 512; - if (sy > 255) sy -= 512; + flipx = attr & 0x40; + flipy = attr & 0x80; - s32 code = spritedata[7] + objectdata[3]; - s32 color = attr & color_mask; + if (m_screen_flag & 1) + { + flipx = !flipx; flipy = !flipy; + sx = 240-sx; sy = 240-sy; + } - s32 flipx = attr & 0x40; - s32 flipy = attr & 0x80; - //s32 pri = (attr & 0x08) ? 0x0c : 0x0a; - s32 pri = (attr & 0x08)>>3; - s32 mosaic = (attr & 0x0f00)>>8; - s32 mossol = (attr & 0x1000)>>8; + m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect, + code, + color, + flipx, flipy, + sx, sy, + screen.priority(), + (attr & 0x08) ? 0x0c : 0x0a,15); + } /* sprite */ +} - code = (code & 0xfff) + ((m_sprite_bank & 1) << 12); +void megasys1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect) +{ + /* objram: 0x100*4 entries spritedata: 0x80 entries */ - if (m_screen_flag & 1) - { - flipx = !flipx; - flipy = !flipy; - sx = 240 - sx; - sy = 240 - sy; - } + /* sprite order is from first in Sprite Data RAM (frontmost) to last */ - draw_16x16_priority_sprite(screen,bitmap,cliprect,code, color, sx, sy - 16, flipx, flipy, mosaic, mossol, pri); - } - } - } /* non Z hw */ + if (!(m_sprite_flag&0x10)) + m_sprite_buffer_bitmap.fill(0x7fff, cliprect); else { - u16 *spriteram16 = m_spriteram; + // P47 sprite trails effect.. not quite right tho + // I think the low 4 bits are used to clear specific pens? + // when the hardware wants to clear the trails from the screen + // it increases the value from 0x00 to 0x0e + //printf("m_sprite_flag %02x\n", m_sprite_flag); + partial_clear_sprite_bitmap(screen, bitmap, cliprect, m_sprite_flag&0x0f); + } + + s32 color_mask = (m_sprite_flag & 0x100) ? 0x07 : 0x0f; - /* MS1-Z just draws Sprite Data, and in reverse order */ + u16 *objectram = (u16*)m_buffer2_objectram.get(); + u16 *spriteram = (u16*)m_buffer2_spriteram16.get(); - for (sprite = 0x80-1;sprite >= 0;sprite--) + for (s32 offs = (0x800-8)/2; offs >= 0; offs -= 4) + { + for (s32 sprite = 0; sprite < 4 ; sprite ++) { - u16 *spritedata = &spriteram16[ sprite * 0x10/2]; + u16 *objectdata = &objectram[offs + (0x800/2) * sprite]; + u16 *spritedata = &spriteram[(objectdata[0] & 0x7f) * 8]; + + s32 attr = spritedata[4]; + if (((attr & 0xc0) >> 6) != sprite) continue; - attr = spritedata[ 8/2 ]; + s32 sx = (spritedata[5] + objectdata[1]) & 0x1ff; + s32 sy = (spritedata[6] + objectdata[2]) & 0x1ff; - sx = spritedata[0x0A/2] % 512; - sy = spritedata[0x0C/2] % 512; + if (sx > 255) sx -= 512; + if (sy > 255) sy -= 512; - if (sx > 256-1) sx -= 512; - if (sy > 256-1) sy -= 512; + s32 code = spritedata[7] + objectdata[3]; + s32 color = attr & color_mask; - code = spritedata[0x0E/2]; - color = (attr & 0x0F); + s32 flipx = attr & 0x40; + s32 flipy = attr & 0x80; + //s32 pri = (attr & 0x08) ? 0x0c : 0x0a; + s32 pri = (attr & 0x08)>>3; + s32 mosaic = (attr & 0x0f00)>>8; + s32 mossol = (attr & 0x1000)>>8; - flipx = attr & 0x40; - flipy = attr & 0x80; + code = (code & 0xfff) + ((m_sprite_bank & 1) << 12); if (m_screen_flag & 1) { - flipx = !flipx; flipy = !flipy; - sx = 240-sx; sy = 240-sy; + flipx = !flipx; + flipy = !flipy; + sx = 240 - sx; + sy = 240 - sy; } - m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect, - code, - color, - flipx, flipy, - sx, sy, - screen.priority(), - (attr & 0x08) ? 0x0c : 0x0a,15); - } /* sprite */ - } /* Z hw */ - + draw_16x16_priority_sprite(screen,bitmap,cliprect,code, color, sx, sy - 16, flipx, flipy, mosaic, mossol, pri); + } + } } diff --git a/src/mame/jaleco/ms1_tmap.cpp b/src/mame/jaleco/ms1_tmap.cpp index 303478ac4c6..53d4b3dfa96 100644 --- a/src/mame/jaleco/ms1_tmap.cpp +++ b/src/mame/jaleco/ms1_tmap.cpp @@ -49,6 +49,7 @@ megasys1_tilemap_device::megasys1_tilemap_device(const machine_config &mconfig, : device_t(mconfig, MEGASYS1_TILEMAP, tag, owner, clock), device_gfx_interface(mconfig, *this), m_scrollram(*this, DEVICE_SELF), + m_screen(*this, finder_base::DUMMY_TAG), m_8x8_scroll_factor(1), m_16x16_scroll_factor(4), m_bits_per_color_code(4), @@ -242,6 +243,9 @@ uint16_t megasys1_tilemap_device::scroll_r(offs_t offset) void megasys1_tilemap_device::scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask) { + if (m_screen) + m_screen->update_partial(m_screen->vpos()-1); + switch (offset) { case 0: diff --git a/src/mame/jaleco/ms1_tmap.h b/src/mame/jaleco/ms1_tmap.h index b84a3bf80d0..1541f8ba3a3 100644 --- a/src/mame/jaleco/ms1_tmap.h +++ b/src/mame/jaleco/ms1_tmap.h @@ -13,6 +13,7 @@ #pragma once +#include "screen.h" #include "tilemap.h" @@ -41,6 +42,7 @@ public: void set_16x16_scroll_factor(int scroll_factor) { m_16x16_scroll_factor = scroll_factor; } void set_bits_per_color_code(int bits) { m_bits_per_color_code = bits; } void set_colorbase(uint16_t colorbase) { m_colorbase = colorbase; } + template void set_screen_tag(T &&tag) { m_screen.set_tag(std::forward(tag)); } // memory handlers void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); @@ -62,6 +64,7 @@ protected: private: // shared memory finder required_shared_ptr m_scrollram; + optional_device m_screen; // configuration int m_8x8_scroll_factor; diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 15f76701fb4..fd82079b11c 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -21403,6 +21403,7 @@ astyanaxa // (c) 1989 avspirit // (c) 1991 bigstrik // (c) 1992 chimerab // (c) 1993 +chimeraba // (c) 1993 cybattlr // (c) 1993 edf // (c) 1991 edfa // (c) 1991 @@ -21410,6 +21411,7 @@ edfbl // (c) 1991 edfu // (c) 1991 (North America) edfp // (c) 1991 (Japan, Prototype) hachoo // (c) 1989 +hachooa // (c) 1989 hayaosi1 // (c) 1993 iganinju // (c) 1988 (Japan) iganinjub // bootleg -- cgit v1.2.3