From fc28d074dab994c77840ccfb01b2c351a115c939 Mon Sep 17 00:00:00 2001 From: cam900 Date: Tue, 25 Jun 2019 00:05:23 +0900 Subject: m72.cpp : Updates (nw) (#5283) * m72.cpp : Updates (nw) Use buffered_spriteram16_device for buffered spriteram, Reduce duplicates, Runtime tag lookups, Unnecessary lines, Simplify handlers, Use seperated address map related to config, Use shorter / correct type values, Correct PCM sample rates, Add notes * m72.cpp : Rounding fixes --- src/mame/drivers/m72.cpp | 258 ++++++++++++++++++++++++---------------- src/mame/includes/m72.h | 121 +++++++++---------- src/mame/video/m72.cpp | 303 ++++++++++++++++------------------------------- 3 files changed, 312 insertions(+), 370 deletions(-) diff --git a/src/mame/drivers/m72.cpp b/src/mame/drivers/m72.cpp index 7e20a0982d8..bd9ed392fcf 100644 --- a/src/mame/drivers/m72.cpp +++ b/src/mame/drivers/m72.cpp @@ -305,9 +305,9 @@ The protection device does TIMER_CALLBACK_MEMBER(m72_state::delayed_ram16_w) { - uint16_t val = param & 0xffff; - uint16_t offset = (param >> 16) & 0x07ff; - uint16_t mem_mask = (BIT(param, 28) ? 0xff00 : 0x0000) | (BIT(param, 27) ? 0x00ff : 0x0000); + const u16 val = param & 0xffff; + const u16 offset = (param >> 16) & 0x07ff; + const u16 mem_mask = (BIT(param, 28) ? 0xff00 : 0x0000) | (BIT(param, 27) ? 0x00ff : 0x0000); logerror("MB8421/MB8431 left_w(0x%03x, 0x%04x, 0x%04x)\n", offset, val, mem_mask); m_dpram->left_w(offset, val, mem_mask); @@ -315,8 +315,8 @@ TIMER_CALLBACK_MEMBER(m72_state::delayed_ram16_w) TIMER_CALLBACK_MEMBER(m72_state::delayed_ram8_w) { - uint8_t val = param & 0xff; - uint16_t offset = (param >> 9) & 0x07ff; + const u8 val = param & 0xff; + const u16 offset = (param >> 9) & 0x07ff; if (BIT(param, 8)) m_dpram->right_w(offset, val << 8, 0xff00); @@ -325,29 +325,30 @@ TIMER_CALLBACK_MEMBER(m72_state::delayed_ram8_w) } -WRITE16_MEMBER(m72_state::main_mcu_w) +void m72_state::main_mcu_w(offs_t offset, u16 data, u16 mem_mask) { machine().scheduler().synchronize(timer_expired_delegate(FUNC(m72_state::delayed_ram16_w), this), offset << 16 | data | (mem_mask & 0x0180) << 20); } -WRITE8_MEMBER(m72_state::mcu_data_w) +void m72_state::mcu_data_w(offs_t offset, u8 data) { - machine().scheduler().synchronize(timer_expired_delegate(FUNC(m72_state::delayed_ram8_w), this), offset << 8 | uint32_t(data)); + machine().scheduler().synchronize(timer_expired_delegate(FUNC(m72_state::delayed_ram8_w), this), offset << 8 | u32(data)); } -READ8_MEMBER(m72_state::mcu_data_r) +u8 m72_state::mcu_data_r(offs_t offset) { return (m_dpram->right_r(offset >> 1) >> (BIT(offset, 0) ? 8 : 0)) & 0xff; } -READ8_MEMBER(m72_state::mcu_sample_r) +u8 m72_state::mcu_sample_r() { - uint8_t sample; - sample = memregion("samples")->base()[m_mcu_sample_addr++]; + const u8 sample = m_samples_region[m_mcu_sample_addr]; + if (!machine().side_effects_disabled()) + m_mcu_sample_addr++; return sample; } -WRITE8_MEMBER(m72_state::mcu_port1_w) +void m72_state::mcu_port1_w(u8 data) { m_mcu_sample_latch = data; @@ -355,19 +356,19 @@ WRITE8_MEMBER(m72_state::mcu_port1_w) m_soundcpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); } -WRITE8_MEMBER(m72_state::mcu_low_w) +void m72_state::mcu_low_w(u8 data) { m_mcu_sample_addr = (m_mcu_sample_addr & 0xffe000) | (data<<5); - logerror("low: %02x %02x %08x\n", offset, data, m_mcu_sample_addr); + logerror("low: %02x %08x\n", data, m_mcu_sample_addr); } -WRITE8_MEMBER(m72_state::mcu_high_w) +void m72_state::mcu_high_w(u8 data) { m_mcu_sample_addr = (m_mcu_sample_addr & 0x1fff) | (data<<(8+5)); - logerror("high: %02x %02x %08x\n", offset, data, m_mcu_sample_addr); + logerror("high: %02x %08x\n", data, m_mcu_sample_addr); } -READ8_MEMBER(m72_state::snd_cpu_sample_r) +u8 m72_state::snd_cpu_sample_r() { return m_mcu_sample_latch; } @@ -377,11 +378,6 @@ void m72_state::init_m72_8751() save_item(NAME(m_mcu_sample_latch)); save_item(NAME(m_mcu_sample_addr)); - /* sound cpu */ - address_space &sndio = m_soundcpu->space(AS_IO); - sndio.install_write_handler(0x82, 0x82, write8_delegate(FUNC(dac_byte_interface::data_w),(dac_byte_interface *)m_dac)); - sndio.install_read_handler (0x84, 0x84, read8_delegate(FUNC(m72_state::snd_cpu_sample_r),this)); - /* lohtb2 */ #if 0 /* running the mcu at twice the speed, the following @@ -390,7 +386,7 @@ void m72_state::init_m72_8751() * prefetching on the V30. */ { - uint8_t *rom=memregion("mcu")->base(); + u8 *rom=memregion("mcu")->base(); rom[0x12d+5] += 1; printf(" 5: %d\n", rom[0x12d+5]); rom[0x12d+8] += 5; printf(" 8: %d\n", rom[0x12d+8]); @@ -430,17 +426,16 @@ the NMI handler in the other games. #if 0 int m72_state::find_sample(int num) { - uint8_t *rom = memregion("samples")->base(); - int len = memregion("samples")->bytes(); + int len = m_samples_region.length(); int addr = 0; while (num--) { /* find end of sample */ - while (addr < len && rom[addr]) addr++; + while (addr < len && m_samples_region[addr]) addr++; /* skip 0 filler between samples */ - while (addr < len && !rom[addr]) addr++; + while (addr < len && !m_samples_region[addr]) addr++; } return addr; @@ -552,7 +547,7 @@ running, but they have not been derived from the real 8751 code. #define CRC_LEN 18 /* Battle Chopper / Mr. Heli */ -static const uint8_t bchopper_code[CODE_LEN] = +static const u8 bchopper_code[CODE_LEN] = { 0x68,0x00,0xa0, // push 0a000h 0x1f, // pop ds @@ -572,11 +567,11 @@ static const uint8_t bchopper_code[CODE_LEN] = 0x1f, // pop ds 0xea,0x68,0x01,0x40,0x00 // jmp 0040:$0168 }; -static const uint8_t bchopper_crc[CRC_LEN] = { 0x1a,0x12,0x5c,0x08, 0x84,0xb6,0x73,0xd1, +static const u8 bchopper_crc[CRC_LEN] = { 0x1a,0x12,0x5c,0x08, 0x84,0xb6,0x73,0xd1, 0x54,0x91,0x94,0xeb, 0x00,0x00 }; /* Ninja Spirit */ -static const uint8_t nspirit_code[CODE_LEN] = +static const u8 nspirit_code[CODE_LEN] = { 0x68,0x00,0xa0, // push 0a000h 0x1f, // pop ds @@ -595,10 +590,10 @@ static const uint8_t nspirit_code[CODE_LEN] = 0x1f, // pop ds 0xea,0x00,0x00,0x40,0x00 // jmp 0040:$0000 }; -static const uint8_t nspirit_crc[CRC_LEN] = { 0xfe,0x94,0x6e,0x4e, 0xc8,0x33,0xa7,0x2d, +static const u8 nspirit_crc[CRC_LEN] = { 0xfe,0x94,0x6e,0x4e, 0xc8,0x33,0xa7,0x2d, 0xf2,0xa3,0xf9,0xe1, 0xa9,0x6c,0x02,0x95, 0x00,0x00 }; /* Image Fight */ -static const uint8_t imgfight_code[CODE_LEN] = +static const u8 imgfight_code[CODE_LEN] = { 0x68,0x00,0xa0, // push 0a000h 0x1f, // pop ds @@ -623,11 +618,11 @@ static const uint8_t imgfight_code[CODE_LEN] = }; // these are for the japan set where we have the mcu anyway... -static const uint8_t imgfightj_crc[CRC_LEN] = { 0x7e,0xcc,0xec,0x03, 0x04,0x33,0xb6,0xc5, +static const u8 imgfightj_crc[CRC_LEN] = { 0x7e,0xcc,0xec,0x03, 0x04,0x33,0xb6,0xc5, 0xbf,0x37,0x92,0x94, 0x00,0x00 }; /* Legend of Hero Tonma */ -static const uint8_t loht_code[CODE_LEN] = +static const u8 loht_code[CODE_LEN] = { 0x68,0x00,0xa0, // push 0a000h 0x1f, // pop ds @@ -645,21 +640,21 @@ static const uint8_t loht_code[CODE_LEN] = 0xea,0x5d,0x01,0x40,0x00 // jmp 0040:$015d }; -static const uint8_t loht_crc[CRC_LEN] = { 0x39,0x00,0x82,0xae, 0x2c,0x9d,0x4b,0x73, +static const u8 loht_crc[CRC_LEN] = { 0x39,0x00,0x82,0xae, 0x2c,0x9d,0x4b,0x73, 0xfb,0xac,0xd4,0x6d, 0x6d,0x5b,0x77,0xc0, 0x00,0x00 }; /* Dragon Breed */ -static const uint8_t dbreedm72_code[CODE_LEN] = +static const u8 dbreedm72_code[CODE_LEN] = { 0xea,0x6c,0x00,0x00,0x00 // jmp 0000:$006c }; -static const uint8_t dbreedm72_crc[CRC_LEN] = { 0xa4,0x96,0x5f,0xc0, 0xab,0x49,0x9f,0x19, +static const u8 dbreedm72_crc[CRC_LEN] = { 0xa4,0x96,0x5f,0xc0, 0xab,0x49,0x9f,0x19, 0x84,0xe6,0xd6,0xca, 0x00,0x00 }; /* Air Duel */ -static const uint8_t airduelm72_code[CODE_LEN] = +static const u8 airduelm72_code[CODE_LEN] = { 0x68,0x00,0xd0, // push 0d000h 0x1f, // pop ds @@ -669,20 +664,20 @@ static const uint8_t airduelm72_code[CODE_LEN] = 0xc6,0x06,0xc0,0x1c,0x57, // mov [1cc0h], byte 057h 0xea,0x69,0x0b,0x00,0x00 // jmp 0000:$0b69 }; -static const uint8_t airduelm72_crc[CRC_LEN] = { 0x72,0x9c,0xca,0x85, 0xc9,0x12,0xcc,0xea, +static const u8 airduelm72_crc[CRC_LEN] = { 0x72,0x9c,0xca,0x85, 0xc9,0x12,0xcc,0xea, 0x00,0x00 }; /* Daiku no Gensan */ -static const uint8_t dkgenm72_code[CODE_LEN] = +static const u8 dkgenm72_code[CODE_LEN] = { 0xea,0x3d,0x00,0x00,0x10 // jmp 1000:$003d }; -static const uint8_t dkgenm72_crc[CRC_LEN] = { 0xc8,0xb4,0xdc,0xf8, 0xd3,0xba,0x48,0xed, +static const u8 dkgenm72_crc[CRC_LEN] = { 0xc8,0xb4,0xdc,0xf8, 0xd3,0xba,0x48,0xed, 0x79,0x08,0x1c,0xb3, 0x00,0x00 }; -void m72_state::copy_le(uint16_t *dest, const uint8_t *src, uint8_t bytes) +void m72_state::copy_le(u16 *dest, const u8 *src, u8 bytes) { int i; @@ -707,9 +702,9 @@ WRITE16_MEMBER(m72_state::protection_w) copy_le(&m_protection_ram[0x0fe0],m_protection_crc,CRC_LEN); } -void m72_state::install_protection_handler(const uint8_t *code,const uint8_t *crc) +void m72_state::install_protection_handler(const u8 *code,const u8 *crc) { - m_protection_ram = std::make_unique(0x1000/2); + m_protection_ram = std::make_unique(0x1000/2); m_protection_code = code; m_protection_crc = crc; m_maincpu->space(AS_PROGRAM).install_read_bank(0xb0000, 0xb0fff, "bank1"); @@ -746,7 +741,7 @@ void m72_state::init_loht() m_maincpu->space(AS_IO).install_write_handler(0xc0, 0xc1, write16_delegate(FUNC(m72_state::loht_sample_trigger_w),this)); /* since we skip the startup tests, clear video RAM to prevent garbage on title screen */ - memset(m_videoram2,0,0x4000); + memset(m_videoram[1],0,0x4000); } @@ -774,28 +769,64 @@ void m72_state::init_gallop() } +template +u16 m72_state::palette_r(offs_t offset) +{ + /* A9 isn't connected, so 0x200-0x3ff mirrors 0x000-0x1ff etc. */ + offset &= ~0x100; + + return m_paletteram[N][offset] | 0xffe0; /* only D0-D4 are connected */ +} +inline void m72_state::changecolor(offs_t color, u8 r, u8 g, u8 b) +{ + m_palette->set_pen_color(color,pal5bit(r),pal5bit(g),pal5bit(b)); +} +template +void m72_state::palette_w(offs_t offset, u16 data, u16 mem_mask) +{ + /* A9 isn't connected, so 0x200-0x3ff mirrors 0x000-0x1ff etc. */ + offset &= ~0x100; + COMBINE_DATA(&m_paletteram[N][offset]); + offset &= 0x0ff; + changecolor(offset + (N << 8), + m_paletteram[N][offset + 0x000], + m_paletteram[N][offset + 0x200], + m_paletteram[N][offset + 0x400]); +} -READ16_MEMBER(m72_state::soundram_r) +template +void m72_state::scrollx_w(offs_t offset, u16 data, u16 mem_mask) { - return m_soundram[offset * 2 + 0] | (m_soundram[offset * 2 + 1] << 8); + m_screen->update_partial(m_screen->vpos()); + COMBINE_DATA(&m_scrollx[N]); } -WRITE16_MEMBER(m72_state::soundram_w) +template +void m72_state::scrolly_w(offs_t offset, u16 data, u16 mem_mask) { - if (ACCESSING_BITS_0_7) - m_soundram[offset * 2 + 0] = data; - if (ACCESSING_BITS_8_15) - m_soundram[offset * 2 + 1] = data >> 8; + m_screen->update_partial(m_screen->vpos()); + COMBINE_DATA(&m_scrolly[N]); +} + + +u8 m72_state::soundram_r(offs_t offset) +{ + return m_soundram[offset]; +} + +void m72_state::soundram_w(offs_t offset, u8 data) +{ + m_soundram[offset] = data; } void m72_state::m72_cpu1_common_map(address_map &map) { map(0xc0000, 0xc03ff).ram().share("spriteram"); - map(0xc8000, 0xc8bff).rw(FUNC(m72_state::palette1_r), FUNC(m72_state::palette1_w)).share("paletteram"); - map(0xcc000, 0xccbff).rw(FUNC(m72_state::palette2_r), FUNC(m72_state::palette2_w)).share("paletteram2"); + map(0xc8000, 0xc8bff).rw(FUNC(m72_state::palette_r<0>), FUNC(m72_state::palette_w<0>)).share("paletteram1"); + map(0xcc000, 0xccbff).rw(FUNC(m72_state::palette_r<1>), FUNC(m72_state::palette_w<1>)).share("paletteram2"); map(0xd0000, 0xd3fff).ram().w(FUNC(m72_state::videoram1_w)).share("videoram1"); map(0xd8000, 0xdbfff).ram().w(FUNC(m72_state::videoram2_w)).share("videoram2"); map(0xe0000, 0xeffff).rw(FUNC(m72_state::soundram_r), FUNC(m72_state::soundram_w)); @@ -842,8 +873,8 @@ void m72_state::m81_cpu1_common_map(address_map &map) map(0x00000, 0x7ffff).rom(); map(0xb0ffe, 0xb0fff).writeonly(); /* leftover from protection?? */ map(0xc0000, 0xc03ff).ram().share("spriteram"); - map(0xc8000, 0xc8bff).rw(FUNC(m72_state::palette1_r), FUNC(m72_state::palette1_w)).share("paletteram"); - map(0xcc000, 0xccbff).rw(FUNC(m72_state::palette2_r), FUNC(m72_state::palette2_w)).share("paletteram2"); + map(0xc8000, 0xc8bff).rw(FUNC(m72_state::palette_r<0>), FUNC(m72_state::palette_w<0>)).share("paletteram1"); + map(0xcc000, 0xccbff).rw(FUNC(m72_state::palette_r<1>), FUNC(m72_state::palette_w<1>)).share("paletteram2"); map(0xd0000, 0xd3fff).ram().w(FUNC(m72_state::videoram1_w)).share("videoram1"); map(0xd8000, 0xdbfff).ram().w(FUNC(m72_state::videoram2_w)).share("videoram2"); map(0xffff0, 0xfffff).rom(); @@ -872,7 +903,7 @@ void m72_state::m84_cpu1_common_map(address_map &map) map(0x00000, 0x7ffff).rom(); map(0xb0000, 0xb0001).w(FUNC(m72_state::irq_line_w)); map(0xb4000, 0xb4001).nopw(); /* ??? */ - map(0xbc000, 0xbc001).w(FUNC(m72_state::dmaon_w)); + map(0xbc000, 0xbc000).w(FUNC(m72_state::dmaon_w)); map(0xb0ffe, 0xb0fff).writeonly(); /* leftover from protection?? */ map(0xc0000, 0xc03ff).ram().share("spriteram"); map(0xe0000, 0xe3fff).ram(); /* work RAM */ @@ -884,8 +915,8 @@ void m72_state::rtype2_map(address_map &map) m84_cpu1_common_map(map); map(0xd0000, 0xd3fff).ram().w(FUNC(m72_state::videoram1_w)).share("videoram1"); map(0xd4000, 0xd7fff).ram().w(FUNC(m72_state::videoram2_w)).share("videoram2"); - map(0xc8000, 0xc8bff).rw(FUNC(m72_state::palette1_r), FUNC(m72_state::palette1_w)).share("paletteram"); - map(0xd8000, 0xd8bff).rw(FUNC(m72_state::palette2_r), FUNC(m72_state::palette2_w)).share("paletteram2"); + map(0xc8000, 0xc8bff).rw(FUNC(m72_state::palette_r<0>), FUNC(m72_state::palette_w<0>)).share("paletteram1"); + map(0xd8000, 0xd8bff).rw(FUNC(m72_state::palette_r<1>), FUNC(m72_state::palette_w<1>)).share("paletteram2"); } void m72_state::hharryu_map(address_map &map) @@ -893,8 +924,8 @@ void m72_state::hharryu_map(address_map &map) m84_cpu1_common_map(map); map(0xd0000, 0xd3fff).ram().w(FUNC(m72_state::videoram1_w)).share("videoram1"); map(0xd4000, 0xd7fff).ram().w(FUNC(m72_state::videoram2_w)).share("videoram2"); - map(0xa0000, 0xa0bff).rw(FUNC(m72_state::palette1_r), FUNC(m72_state::palette1_w)).share("paletteram"); - map(0xa8000, 0xa8bff).rw(FUNC(m72_state::palette2_r), FUNC(m72_state::palette2_w)).share("paletteram2"); + map(0xa0000, 0xa0bff).rw(FUNC(m72_state::palette_r<0>), FUNC(m72_state::palette_w<0>)).share("paletteram1"); + map(0xa8000, 0xa8bff).rw(FUNC(m72_state::palette_r<1>), FUNC(m72_state::palette_w<1>)).share("paletteram2"); } void m72_state::kengo_map(address_map &map) @@ -902,8 +933,8 @@ void m72_state::kengo_map(address_map &map) m84_cpu1_common_map(map); map(0x80000, 0x83fff).ram().w(FUNC(m72_state::videoram1_w)).share("videoram1"); map(0x84000, 0x87fff).ram().w(FUNC(m72_state::videoram2_w)).share("videoram2"); - map(0xa0000, 0xa0bff).rw(FUNC(m72_state::palette1_r), FUNC(m72_state::palette1_w)).share("paletteram"); - map(0xa8000, 0xa8bff).rw(FUNC(m72_state::palette2_r), FUNC(m72_state::palette2_w)).share("paletteram2"); + map(0xa0000, 0xa0bff).rw(FUNC(m72_state::palette_r<0>), FUNC(m72_state::palette_w<0>)).share("paletteram1"); + map(0xa8000, 0xa8bff).rw(FUNC(m72_state::palette_r<1>), FUNC(m72_state::palette_w<1>)).share("paletteram2"); } @@ -911,16 +942,16 @@ void m72_state::m82_map(address_map &map) { map(0x00000, 0x7ffff).rom(); map(0xa0000, 0xa03ff).ram().share("majtitle_rowscr"); - map(0xa4000, 0xa4bff).rw(FUNC(m72_state::palette2_r), FUNC(m72_state::palette2_w)).share("paletteram2"); + map(0xa4000, 0xa4bff).rw(FUNC(m72_state::palette_r<1>), FUNC(m72_state::palette_w<1>)).share("paletteram2"); map(0xac000, 0xaffff).ram().w(FUNC(m72_state::videoram1_w)).share("videoram1"); map(0xb0000, 0xbffff).ram().w(FUNC(m72_state::videoram2_w)).share("videoram2"); /* larger than the other games */ map(0xc0000, 0xc03ff).ram().share("spriteram"); map(0xc8000, 0xc83ff).ram().share("spriteram2"); - map(0xcc000, 0xccbff).rw(FUNC(m72_state::palette1_r), FUNC(m72_state::palette1_w)).share("paletteram"); + map(0xcc000, 0xccbff).rw(FUNC(m72_state::palette_r<0>), FUNC(m72_state::palette_w<0>)).share("paletteram1"); map(0xd0000, 0xd3fff).ram(); /* work RAM */ map(0xe0000, 0xe0001).w(FUNC(m72_state::irq_line_w)); map(0xe4000, 0xe4001).writeonly(); /* playfield enable? 1 during screen transitions, 0 otherwise */ - map(0xec000, 0xec001).w(FUNC(m72_state::dmaon_w)); + map(0xec000, 0xec000).w(FUNC(m72_state::dmaon_w)); map(0xffff0, 0xfffff).rom(); } @@ -934,13 +965,13 @@ void m72_state::m72_portmap(address_map &map) map(0x04, 0x05).portr("DSW"); map(0x00, 0x00).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x02, 0x02).w(FUNC(m72_state::port02_w)); /* coin counters, reset sound cpu, other stuff? */ - map(0x04, 0x05).w(FUNC(m72_state::dmaon_w)); + map(0x04, 0x04).w(FUNC(m72_state::dmaon_w)); map(0x06, 0x07).w(FUNC(m72_state::irq_line_w)); map(0x40, 0x43).rw(m_upd71059c, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); - map(0x80, 0x81).w(FUNC(m72_state::scrolly1_w)); - map(0x82, 0x83).w(FUNC(m72_state::scrollx1_w)); - map(0x84, 0x85).w(FUNC(m72_state::scrolly2_w)); - map(0x86, 0x87).w(FUNC(m72_state::scrollx2_w)); + map(0x80, 0x81).w(FUNC(m72_state::scrolly_w<0>)); + map(0x82, 0x83).w(FUNC(m72_state::scrollx_w<0>)); + map(0x84, 0x85).w(FUNC(m72_state::scrolly_w<1>)); + map(0x86, 0x87).w(FUNC(m72_state::scrollx_w<1>)); /* { 0xc0, 0xc0 trigger sample, filled by init_ function */ } @@ -958,10 +989,10 @@ void m72_state::m84_portmap(address_map &map) map(0x00, 0x00).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x02, 0x02).w(FUNC(m72_state::rtype2_port02_w)); map(0x40, 0x43).rw(m_upd71059c, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); - map(0x80, 0x81).w(FUNC(m72_state::scrolly1_w)); - map(0x82, 0x83).w(FUNC(m72_state::scrollx1_w)); - map(0x84, 0x85).w(FUNC(m72_state::scrolly2_w)); - map(0x86, 0x87).w(FUNC(m72_state::scrollx2_w)); + map(0x80, 0x81).w(FUNC(m72_state::scrolly_w<0>)); + map(0x82, 0x83).w(FUNC(m72_state::scrollx_w<0>)); + map(0x84, 0x85).w(FUNC(m72_state::scrolly_w<1>)); + map(0x86, 0x87).w(FUNC(m72_state::scrollx_w<1>)); } void m72_state::m84_v33_portmap(address_map &map) @@ -971,10 +1002,10 @@ void m72_state::m84_v33_portmap(address_map &map) map(0x04, 0x05).portr("DSW"); map(0x00, 0x00).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x02, 0x02).w(FUNC(m72_state::rtype2_port02_w)); - map(0x80, 0x81).w(FUNC(m72_state::scrolly1_w)); - map(0x82, 0x83).w(FUNC(m72_state::scrollx1_w)); - map(0x84, 0x85).w(FUNC(m72_state::scrolly2_w)); - map(0x86, 0x87).w(FUNC(m72_state::scrollx2_w)); + map(0x80, 0x81).w(FUNC(m72_state::scrolly_w<0>)); + map(0x82, 0x83).w(FUNC(m72_state::scrollx_w<0>)); + map(0x84, 0x85).w(FUNC(m72_state::scrolly_w<1>)); + map(0x86, 0x87).w(FUNC(m72_state::scrollx_w<1>)); // AM_RANGE(0x8c, 0x8f) AM_WRITENOP /* ??? */ } @@ -988,10 +1019,10 @@ void m72_state::poundfor_portmap(address_map &map) map(0x00, 0x00).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x02, 0x02).w(FUNC(m72_state::poundfor_port02_w)); map(0x40, 0x43).rw(m_upd71059c, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); - map(0x80, 0x81).w(FUNC(m72_state::scrolly1_w)); - map(0x82, 0x83).w(FUNC(m72_state::scrollx1_w)); - map(0x84, 0x85).w(FUNC(m72_state::scrolly2_w)); - map(0x86, 0x87).w(FUNC(m72_state::scrollx2_w)); + map(0x80, 0x81).w(FUNC(m72_state::scrolly_w<0>)); + map(0x82, 0x83).w(FUNC(m72_state::scrollx_w<0>)); + map(0x84, 0x85).w(FUNC(m72_state::scrolly_w<1>)); + map(0x86, 0x87).w(FUNC(m72_state::scrollx_w<1>)); } void m72_state::m82_portmap(address_map &map) @@ -1002,10 +1033,10 @@ void m72_state::m82_portmap(address_map &map) map(0x00, 0x00).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x02, 0x02).w(FUNC(m72_state::rtype2_port02_w)); map(0x40, 0x43).rw(m_upd71059c, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); - map(0x80, 0x81).w(FUNC(m72_state::scrolly1_w)); - map(0x82, 0x83).w(FUNC(m72_state::scrollx1_w)); - map(0x84, 0x85).w(FUNC(m72_state::scrolly2_w)); - map(0x86, 0x87).w(FUNC(m72_state::scrollx2_w)); + map(0x80, 0x81).w(FUNC(m72_state::scrolly_w<0>)); + map(0x82, 0x83).w(FUNC(m72_state::scrollx_w<0>)); + map(0x84, 0x85).w(FUNC(m72_state::scrolly_w<1>)); + map(0x86, 0x87).w(FUNC(m72_state::scrollx_w<1>)); // these ports control the tilemap sizes, rowscroll etc. that m82 has, exact bit usage not known (maybe one for each layer?) map(0x8c, 0x8d).w(FUNC(m72_state::m82_tm_ctrl_w)); @@ -1019,13 +1050,13 @@ void m72_state::m81_portmap(address_map &map) map(0x04, 0x05).portr("DSW"); map(0x00, 0x00).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x02, 0x02).w(FUNC(m72_state::rtype2_port02_w)); /* coin counters, reset sound cpu, other stuff? */ - map(0x04, 0x05).w(FUNC(m72_state::dmaon_w)); + map(0x04, 0x04).w(FUNC(m72_state::dmaon_w)); map(0x06, 0x07).w(FUNC(m72_state::irq_line_w)); map(0x40, 0x43).rw(m_upd71059c, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); - map(0x80, 0x81).w(FUNC(m72_state::scrolly1_w)); - map(0x82, 0x83).w(FUNC(m72_state::scrollx1_w)); - map(0x84, 0x85).w(FUNC(m72_state::scrolly2_w)); - map(0x86, 0x87).w(FUNC(m72_state::scrollx2_w)); + map(0x80, 0x81).w(FUNC(m72_state::scrolly_w<0>)); + map(0x82, 0x83).w(FUNC(m72_state::scrollx_w<0>)); + map(0x84, 0x85).w(FUNC(m72_state::scrolly_w<1>)); + map(0x86, 0x87).w(FUNC(m72_state::scrollx_w<1>)); } @@ -1051,14 +1082,20 @@ void m72_state::rtype_sound_portmap(address_map &map) void m72_state::sound_portmap(address_map &map) { + rtype_sound_portmap(map); map.global_mask(0xff); - map(0x00, 0x01).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); - map(0x02, 0x02).r("soundlatch", FUNC(generic_latch_8_device::read)); - map(0x06, 0x06).w("soundlatch", FUNC(generic_latch_8_device::acknowledge_w)); map(0x82, 0x82).w(m_audio, FUNC(m72_audio_device::sample_w)); map(0x84, 0x84).r(m_audio, FUNC(m72_audio_device::sample_r)); } +void m72_state::sound_protected_portmap(address_map &map) +{ + rtype_sound_portmap(map); + map.global_mask(0xff); + map(0x82, 0x82).w(m_dac, FUNC(dac_byte_interface::data_w)); + map(0x84, 0x84).r(FUNC(m72_state::snd_cpu_sample_r)); +} + void m72_state::rtype2_sound_portmap(address_map &map) { map.global_mask(0xff); @@ -1848,6 +1885,8 @@ void m72_state::m72_base(machine_config &config) m_upd71059c->out_int_callback().set_inputline(m_maincpu, 0); /* video hardware */ + BUFFERED_SPRITERAM16(config, m_spriteram); + GFXDECODE(config, m_gfxdecode, m_palette, gfx_m72); PALETTE(config, m_palette).set_entries(512); @@ -1865,7 +1904,7 @@ void m72_state::m72(machine_config &config) { m72_base(config); /* Sample rate verified (Gallop : https://youtu.be/aozd0dbPzOw) */ - m_soundcpu->set_periodic_int(FUNC(m72_state::fake_nmi), attotime::from_hz(32000000/8/512)); + m_soundcpu->set_periodic_int(FUNC(m72_state::fake_nmi), attotime::from_hz(MASTER_CLOCK/8/512)); /* IRQs are generated by main Z80 and YM2151 */ } @@ -1875,6 +1914,8 @@ void m72_state::m72_8751(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::m72_protected_map); m_maincpu->set_addrmap(AS_IO, &m72_state::m72_protected_portmap); + m_soundcpu->set_addrmap(AS_IO, &m72_state::sound_protected_portmap); + MB8421_MB8431_16BIT(config, m_dpram); //m_dpram->intl_callback().set(m_upd71059c, FUNC(pic8259_device::ir3_w)); // not actually used? m_dpram->intr_callback().set_inputline("mcu", MCS51_INT0_LINE); @@ -1916,7 +1957,7 @@ void m72_state::m72_xmultipl(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::xmultiplm72_map); /* Sample rate verified (Gallop : https://youtu.be/aozd0dbPzOw) */ - m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(32000000/8/512)); + m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(MASTER_CLOCK/8/512)); /* IRQs are generated by main Z80 and YM2151 */ } @@ -1926,7 +1967,7 @@ void m72_state::m72_dbreed(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::dbreedm72_map); /* Sample rate verified (Gallop : https://youtu.be/aozd0dbPzOw) */ - m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(32000000/8/512)); + m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(MASTER_CLOCK/8/512)); /* IRQs are generated by main Z80 and YM2151 */ } @@ -1944,7 +1985,7 @@ void m72_state::m81_hharry(machine_config &config) m_soundcpu->set_addrmap(AS_PROGRAM, &m72_state::sound_rom_map); m_soundcpu->set_addrmap(AS_IO, &m72_state::rtype2_sound_portmap); - m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(128*55)); + m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(MASTER_CLOCK/8/512)); MCFG_VIDEO_START_OVERRIDE(m72_state,hharry) @@ -1980,13 +2021,15 @@ void m72_state::rtype2(machine_config &config) Z80(config, m_soundcpu, SOUND_CLOCK); m_soundcpu->set_addrmap(AS_PROGRAM, &m72_state::sound_rom_map); m_soundcpu->set_addrmap(AS_IO, &m72_state::rtype2_sound_portmap); - m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(128*55)); /* clocked by V1? (Vigilante) */ + m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(MASTER_CLOCK/8/512)); /* verified (https://youtu.be/lUszf9Ong7U) */ /* IRQs are generated by main Z80 and YM2151 */ PIC8259(config, m_upd71059c, 0); m_upd71059c->out_int_callback().set_inputline(m_maincpu, 0); /* video hardware */ + BUFFERED_SPRITERAM16(config, m_spriteram); + GFXDECODE(config, m_gfxdecode, m_palette, gfx_rtype2); PALETTE(config, m_palette).set_entries(512); @@ -2023,7 +2066,7 @@ void m72_state::cosmccop(machine_config &config) Z80(config, m_soundcpu, SOUND_CLOCK); m_soundcpu->set_addrmap(AS_PROGRAM, &m72_state::sound_rom_map); m_soundcpu->set_addrmap(AS_IO, &m72_state::rtype2_sound_portmap); - m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(128*55)); /* clocked by V1? (Vigilante) */ + m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(MASTER_CLOCK/8/512)); /* verified (https://youtu.be/Sol2Yq2S5hQ) */ /* IRQs are generated by main Z80 and YM2151 */ MCFG_MACHINE_START_OVERRIDE(m72_state,kengo) @@ -2032,6 +2075,8 @@ void m72_state::cosmccop(machine_config &config) // upd71059c isn't needed because the V35 has its own IRQ controller /* video hardware */ + BUFFERED_SPRITERAM16(config, m_spriteram); + GFXDECODE(config, m_gfxdecode, m_palette, gfx_rtype2); PALETTE(config, m_palette).set_entries(512); @@ -2067,16 +2112,19 @@ void m72_state::m82(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::m82_map); m_maincpu->set_addrmap(AS_IO, &m72_state::m82_portmap); m_maincpu->set_irq_acknowledge_callback("upd71059c", FUNC(pic8259_device::inta_cb)); + Z80(config, m_soundcpu, SOUND_CLOCK); m_soundcpu->set_addrmap(AS_PROGRAM, &m72_state::sound_rom_map); m_soundcpu->set_addrmap(AS_IO, &m72_state::rtype2_sound_portmap); - m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(128*55)); /* clocked by V1? (Vigilante) */ + m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(MASTER_CLOCK/8/512)); /* verified (https://youtu.be/lLQDPe-8Ha0) */ /* IRQs are generated by main Z80 and YM2151 */ PIC8259(config, m_upd71059c, 0); m_upd71059c->out_int_callback().set_inputline(m_maincpu, 0); /* video hardware */ + BUFFERED_SPRITERAM16(config, m_spriteram); + GFXDECODE(config, m_gfxdecode, m_palette, gfx_majtitle); PALETTE(config, m_palette).set_entries(512); @@ -2106,7 +2154,7 @@ void m72_state::poundfor(machine_config &config) Z80(config, m_soundcpu, SOUND_CLOCK); m_soundcpu->set_addrmap(AS_PROGRAM, &m72_state::sound_rom_map); m_soundcpu->set_addrmap(AS_IO, &m72_state::poundfor_sound_portmap); - m_soundcpu->set_periodic_int(FUNC(m72_state::fake_nmi), attotime::from_hz(128*55)); /* clocked by V1? (Vigilante) */ + m_soundcpu->set_periodic_int(FUNC(m72_state::fake_nmi), attotime::from_hz(MASTER_CLOCK/8/512)); /* clocked by V1? (Vigilante) */ /* IRQs are generated by main Z80 and YM2151 */ PIC8259(config, m_upd71059c, 0); @@ -2121,6 +2169,8 @@ void m72_state::poundfor(machine_config &config) m_upd4701[1]->set_porty_tag("TRACK1_Y"); /* video hardware */ + BUFFERED_SPRITERAM16(config, m_spriteram); + GFXDECODE(config, m_gfxdecode, m_palette, gfx_rtype2); PALETTE(config, m_palette).set_entries(512); diff --git a/src/mame/includes/m72.h b/src/mame/includes/m72.h index 50dc9fbbdf7..f49eb4f74f4 100644 --- a/src/mame/includes/m72.h +++ b/src/mame/includes/m72.h @@ -15,6 +15,7 @@ #include "machine/mb8421.h" #include "machine/pic8259.h" #include "machine/upd4701.h" +#include "video/bufsprite.h" #include "sound/dac.h" #include "emupal.h" #include "screen.h" @@ -46,15 +47,15 @@ public: m_screen(*this, "screen"), m_palette(*this, "palette"), m_spriteram(*this, "spriteram"), - m_videoram1(*this, "videoram1"), - m_videoram2(*this, "videoram2"), + m_videoram(*this, "videoram%u", 1U), m_m82_rowscrollram(*this, "majtitle_rowscr"), m_spriteram2(*this, "spriteram2"), m_soundram(*this, "soundram"), - m_generic_paletteram_16(*this, "paletteram"), - m_generic_paletteram2_16(*this, "paletteram2"), + m_paletteram(*this, "paletteram%u", 1U), m_upd71059c(*this, "upd71059c"), m_upd4701(*this, {"upd4701l", "upd4701h"}), + m_samples_region(*this, "samples"), + m_io_dsw(*this, "DSW"), m_fg_source(0), m_bg_source(0), m_m81_b_b_j3(*this, "JumperJ3"), @@ -100,32 +101,32 @@ private: required_device m_gfxdecode; required_device m_screen; required_device m_palette; + required_device m_spriteram; + + required_shared_ptr_array m_videoram; + optional_shared_ptr m_m82_rowscrollram; + optional_shared_ptr m_spriteram2; + optional_shared_ptr m_soundram; + required_shared_ptr_array m_paletteram; - required_shared_ptr m_spriteram; - required_shared_ptr m_videoram1; - required_shared_ptr m_videoram2; - optional_shared_ptr m_m82_rowscrollram; - optional_shared_ptr m_spriteram2; - optional_shared_ptr m_soundram; - required_shared_ptr m_generic_paletteram_16; - required_shared_ptr m_generic_paletteram2_16; optional_device m_upd71059c; optional_device_array m_upd4701; - std::unique_ptr m_protection_ram; + optional_region_ptr m_samples_region; + + optional_ioport m_io_dsw; + + std::unique_ptr m_protection_ram; emu_timer *m_scanline_timer; - const uint8_t *m_protection_code; - const uint8_t *m_protection_crc; - uint32_t m_raster_irq_position; - std::unique_ptr m_buffered_spriteram; + const u8 *m_protection_code; + const u8 *m_protection_crc; + u32 m_raster_irq_position; tilemap_t *m_fg_tilemap; tilemap_t *m_bg_tilemap; tilemap_t *m_bg_tilemap_large; - int32_t m_scrollx1; - int32_t m_scrolly1; - int32_t m_scrollx2; - int32_t m_scrolly2; - int32_t m_video_off; + s32 m_scrollx[2]; + s32 m_scrolly[2]; + s32 m_video_off; int m_fg_source; int m_bg_source; @@ -133,39 +134,36 @@ private: // majtitle specific int m_m82_rowscroll; - uint16_t m_m82_tmcontrol; + u16 m_m82_tmcontrol; // m72_i8751 specific - uint8_t m_mcu_sample_latch; - uint32_t m_mcu_sample_addr; + u8 m_mcu_sample_latch; + u32 m_mcu_sample_addr; // common - DECLARE_READ16_MEMBER(palette1_r); - DECLARE_READ16_MEMBER(palette2_r); - DECLARE_WRITE16_MEMBER(palette1_w); - DECLARE_WRITE16_MEMBER(palette2_w); - DECLARE_WRITE16_MEMBER(videoram1_w); - DECLARE_WRITE16_MEMBER(videoram2_w); - DECLARE_READ16_MEMBER(soundram_r); - DECLARE_WRITE16_MEMBER(soundram_w); + template u16 palette_r(offs_t offset); + template void palette_w(offs_t offset, u16 data, u16 mem_mask); + void videoram1_w(offs_t offset, u16 data, u16 mem_mask); + void videoram2_w(offs_t offset, u16 data, u16 mem_mask); + void irq_line_w(u16 data); + template void scrollx_w(offs_t offset, u16 data, u16 mem_mask); + template void scrolly_w(offs_t offset, u16 data, u16 mem_mask); + void dmaon_w(u8 data); + void port02_w(u8 data); + u8 soundram_r(offs_t offset); + void soundram_w(offs_t offset, u8 data); // m72_i8751 specific DECLARE_WRITE16_MEMBER(main_mcu_sound_w); - DECLARE_WRITE16_MEMBER(main_mcu_w); - DECLARE_WRITE8_MEMBER(mcu_data_w); - DECLARE_READ8_MEMBER(mcu_data_r); - DECLARE_READ8_MEMBER(mcu_sample_r); - DECLARE_WRITE8_MEMBER(mcu_port1_w); - DECLARE_WRITE8_MEMBER(mcu_low_w); - DECLARE_WRITE8_MEMBER(mcu_high_w); - DECLARE_READ8_MEMBER(snd_cpu_sample_r); - DECLARE_WRITE16_MEMBER(irq_line_w); - DECLARE_WRITE16_MEMBER(scrollx1_w); - DECLARE_WRITE16_MEMBER(scrollx2_w); - DECLARE_WRITE16_MEMBER(scrolly1_w); - DECLARE_WRITE16_MEMBER(scrolly2_w); - DECLARE_WRITE16_MEMBER(dmaon_w); - DECLARE_WRITE8_MEMBER(port02_w); + void main_mcu_w(offs_t offset, u16 data, u16 mem_mask); + void mcu_data_w(offs_t offset, u8 data); + u8 mcu_data_r(offs_t offset); + u8 mcu_sample_r(); + void mcu_port1_w(u8 data); + void mcu_low_w(u8 data); + void mcu_high_w(u8 data); + u8 snd_cpu_sample_r(); + DECLARE_READ16_MEMBER(protection_r); DECLARE_WRITE16_MEMBER(protection_w); @@ -178,16 +176,15 @@ private: DECLARE_WRITE16_MEMBER(airduelm72_sample_trigger_w); DECLARE_WRITE16_MEMBER(dkgenm72_sample_trigger_w); DECLARE_WRITE16_MEMBER(gallop_sample_trigger_w); - DECLARE_WRITE8_MEMBER(rtype2_port02_w); - DECLARE_WRITE8_MEMBER(poundfor_port02_w); - DECLARE_WRITE16_MEMBER(m82_gfx_ctrl_w); - DECLARE_WRITE16_MEMBER(m82_tm_ctrl_w); + void rtype2_port02_w(u8 data); + void poundfor_port02_w(u8 data); + void m82_gfx_ctrl_w(offs_t offset, u16 data, u16 mem_mask); + void m82_tm_ctrl_w(offs_t offset, u16 data, u16 mem_mask); TILE_GET_INFO_MEMBER(get_bg_tile_info); TILE_GET_INFO_MEMBER(get_fg_tile_info); - TILE_GET_INFO_MEMBER(rtype2_get_bg_tile_info); - TILE_GET_INFO_MEMBER(rtype2_get_fg_tile_info); + template TILE_GET_INFO_MEMBER(rtype2_get_tile_info); TILEMAP_MAPPER_MEMBER(m82_scan_rows); @@ -210,17 +207,16 @@ private: TIMER_CALLBACK_MEMBER(delayed_ram16_w); TIMER_CALLBACK_MEMBER(delayed_ram8_w); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_m81(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_m82(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - inline void m72_m81_get_tile_info(tile_data &tileinfo,int tile_index,const uint16_t *vram,int gfxnum); - inline void m82_m84_get_tile_info(tile_data &tileinfo,int tile_index,const uint16_t *vram,int gfxnum); + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_m81(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_m82(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + inline void m72_m81_get_tile_info(tile_data &tileinfo,int tile_index,const u16 *vram,int gfxnum); void register_savestate(); - inline void changecolor(int color,int r,int g,int b); + inline void changecolor(offs_t color, u8 r, u8 g, u8 b); void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect); void majtitle_draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect); - void copy_le(uint16_t *dest, const uint8_t *src, uint8_t bytes); - void install_protection_handler(const uint8_t *code,const uint8_t *crc); + void copy_le(u16 *dest, const u8 *src, u8 bytes); + void install_protection_handler(const u8 *code,const u8 *crc); void dbreed_map(address_map &map); void dbreedm72_map(address_map &map); @@ -248,6 +244,7 @@ private: void rtype_map(address_map &map); void rtype_sound_portmap(address_map &map); void sound_portmap(address_map &map); + void sound_protected_portmap(address_map &map); void sound_ram_map(address_map &map); void sound_rom_map(address_map &map); void xmultipl_map(address_map &map); diff --git a/src/mame/video/m72.cpp b/src/mame/video/m72.cpp index 6cc92c031c6..888144f09cc 100644 --- a/src/mame/video/m72.cpp +++ b/src/mame/video/m72.cpp @@ -10,9 +10,9 @@ ***************************************************************************/ -inline void m72_state::m72_m81_get_tile_info(tile_data &tileinfo,int tile_index,const uint16_t *vram,int gfxnum) +inline void m72_state::m72_m81_get_tile_info(tile_data &tileinfo,int tile_index,const u16 *vram,int gfxnum) { - int code,attr,color,pri; + int pri; // word 0 word 1 // fftt tttt tttt tttt ---- ---- zz-? pppp @@ -22,76 +22,62 @@ inline void m72_state::m72_m81_get_tile_info(tile_data &tileinfo,int tile_index, tile_index *= 2; - code = vram[tile_index] & 0xff; - attr = vram[tile_index] >> 8; - color = vram[tile_index+1] & 0xff; + const u16 code = vram[tile_index]; + const u16 attr = vram[tile_index+1]; - if (color & 0x80) pri = 2; - else if (color & 0x40) pri = 1; + if (attr & 0x0080) pri = 2; + else if (attr & 0x0040) pri = 1; else pri = 0; -/* color & 0x10 is used in bchopper and hharry, more priority? */ +/* attr & 0x0010 is used in bchopper and hharry, more priority? */ SET_TILE_INFO_MEMBER(gfxnum, - code + ((attr & 0x3f) << 8), - color & 0x0f, - TILE_FLIPYX((attr & 0xc0) >> 6)); + code & 0x3fff, + attr & 0x000f, + TILE_FLIPYX((code & 0xc000) >> 14)); tileinfo.group = pri; } -inline void m72_state::m82_m84_get_tile_info(tile_data &tileinfo,int tile_index,const uint16_t *vram,int gfxnum) + +TILE_GET_INFO_MEMBER(m72_state::get_bg_tile_info) +{ + m72_m81_get_tile_info(tileinfo,tile_index,m_videoram[1],m_bg_source); +} + +TILE_GET_INFO_MEMBER(m72_state::get_fg_tile_info) +{ + m72_m81_get_tile_info(tileinfo,tile_index,m_videoram[0],m_fg_source); +} + +template +TILE_GET_INFO_MEMBER(m72_state::rtype2_get_tile_info) { - int code,attr,color,pri; + int pri; // word 0 word 1 // tttt tttt tttt tttt ---- ---z zff- pppp // f = flips, t = tilenum, z = pri, p = palette - tile_index *= 2; - code = vram[tile_index]; - color = vram[tile_index+1] & 0xff; - attr = vram[tile_index+1] >> 8; + const u16 code = m_videoram[N][tile_index]; + const u16 attr = m_videoram[N][tile_index+1]; - if (attr & 0x01) pri = 2; - else if (color & 0x80) pri = 1; + if (attr & 0x0100) pri = 2; + else if (attr & 0x0080) pri = 1; else pri = 0; -/* (vram[tile_index+2] & 0x10) is used by majtitle on the green, but it's not clear for what */ -/* (vram[tile_index+3] & 0xfe) are used as well */ +/* (m_videoram[N][tile_index+2] & 0x10) is used by majtitle on the green, but it's not clear for what */ +/* (m_videoram[N][tile_index+3] & 0xfe) are used as well */ - SET_TILE_INFO_MEMBER(gfxnum, + SET_TILE_INFO_MEMBER(1, code, - color & 0x0f, - TILE_FLIPYX((color & 0x60) >> 5)); + attr & 0x000f, + TILE_FLIPYX((attr & 0x0060) >> 5)); tileinfo.group = pri; } -TILE_GET_INFO_MEMBER(m72_state::get_bg_tile_info) -{ - m72_m81_get_tile_info(tileinfo,tile_index,m_videoram2,m_bg_source); -} - -TILE_GET_INFO_MEMBER(m72_state::get_fg_tile_info) -{ - m72_m81_get_tile_info(tileinfo,tile_index,m_videoram1,m_fg_source); -} - -TILE_GET_INFO_MEMBER(m72_state::rtype2_get_bg_tile_info) -{ - m82_m84_get_tile_info(tileinfo,tile_index,m_videoram2,1); -} - -TILE_GET_INFO_MEMBER(m72_state::rtype2_get_fg_tile_info) -{ - m82_m84_get_tile_info(tileinfo,tile_index,m_videoram1,1); -} - - - - /*************************************************************************** Start the video hardware emulation. @@ -102,11 +88,8 @@ void m72_state::register_savestate() { save_item(NAME(m_raster_irq_position)); save_item(NAME(m_video_off)); - save_item(NAME(m_scrollx1)); - save_item(NAME(m_scrolly1)); - save_item(NAME(m_scrollx2)); - save_item(NAME(m_scrolly2)); - save_pointer(NAME(m_buffered_spriteram), m_spriteram.bytes()/2); + save_item(NAME(m_scrollx)); + save_item(NAME(m_scrolly)); } @@ -115,8 +98,6 @@ VIDEO_START_MEMBER(m72_state,m72) m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::get_bg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::get_fg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); - m_buffered_spriteram = std::make_unique(m_spriteram.bytes()/2); - m_fg_tilemap->set_transmask(0,0xffff,0x0001); m_fg_tilemap->set_transmask(1,0x00ff,0xff01); m_fg_tilemap->set_transmask(2,0x0001,0xffff); @@ -129,7 +110,7 @@ VIDEO_START_MEMBER(m72_state,m72) //m_bg_tilemap->set_transmask(2,0x001f,0xffe0); // needed for nspiritj japan warning to look correct // not sure what is needed to be able to see the imgfghto warning message - memset(m_buffered_spriteram.get(),0,m_spriteram.bytes()); + memset(m_spriteram->buffer(),0,m_spriteram->bytes()); m_fg_tilemap->set_scrolldx(0,0); m_fg_tilemap->set_scrolldy(-128,-128); @@ -183,11 +164,11 @@ TILEMAP_MAPPER_MEMBER(m72_state::m82_scan_rows) VIDEO_START_MEMBER(m72_state,m82) { - m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_fg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); - m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); + m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_tile_info<0>),this),TILEMAP_SCAN_ROWS,8,8,64,64); + m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_tile_info<1>),this),TILEMAP_SCAN_ROWS,8,8,64,64); // The tilemap can be 256x64, but seems to be used at 128x64 (scroll wraparound). // The layout ramains 256x64, the right half is just not displayed. - m_bg_tilemap_large = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(m72_state::m82_scan_rows),this),8,8,128,64); + m_bg_tilemap_large = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_tile_info<1>),this),tilemap_mapper_delegate(FUNC(m72_state::m82_scan_rows),this),8,8,128,64); m_fg_tilemap->set_transmask(0,0xffff,0x0001); m_fg_tilemap->set_transmask(1,0x00ff,0xff01); @@ -210,8 +191,7 @@ VIDEO_START_MEMBER(m72_state,m82) m_bg_tilemap_large->set_scrolldx(4,0); m_bg_tilemap_large->set_scrolldy(-128,-128); - m_buffered_spriteram = std::make_unique(m_spriteram.bytes()/2); - memset(m_buffered_spriteram.get(),0,m_spriteram.bytes()); + memset(m_spriteram->buffer(),0,m_spriteram->bytes()); register_savestate(); save_item(NAME(m_m82_rowscroll)); @@ -222,10 +202,8 @@ VIDEO_START_MEMBER(m72_state,m82) // M84 VIDEO_START_MEMBER(m72_state,rtype2) { - m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); - m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_fg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); - - m_buffered_spriteram = std::make_unique(m_spriteram.bytes()/2); + m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_tile_info<1>),this),TILEMAP_SCAN_ROWS,8,8,64,64); + m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_tile_info<0>),this),TILEMAP_SCAN_ROWS,8,8,64,64); m_fg_tilemap->set_transmask(0,0xffff,0x0001); m_fg_tilemap->set_transmask(1,0x00ff,0xff01); @@ -235,7 +213,7 @@ VIDEO_START_MEMBER(m72_state,rtype2) m_bg_tilemap->set_transmask(1,0x00ff,0xff00); m_bg_tilemap->set_transmask(2,0x0001,0xfffe); - memset(m_buffered_spriteram.get(),0,m_spriteram.bytes()); + memset(m_spriteram->buffer(),0,m_spriteram->bytes()); m_fg_tilemap->set_scrolldx(4,0); m_fg_tilemap->set_scrolldy(-128,16); @@ -276,62 +254,15 @@ VIDEO_START_MEMBER(m72_state,poundfor) ***************************************************************************/ -READ16_MEMBER(m72_state::palette1_r) -{ - /* A9 isn't connected, so 0x200-0x3ff mirrors 0x000-0x1ff etc. */ - offset &= ~0x100; - - return m_generic_paletteram_16[offset] | 0xffe0; /* only D0-D4 are connected */ -} - -READ16_MEMBER(m72_state::palette2_r) +void m72_state::videoram1_w(offs_t offset, u16 data, u16 mem_mask) { - /* A9 isn't connected, so 0x200-0x3ff mirrors 0x000-0x1ff etc. */ - offset &= ~0x100; - - return m_generic_paletteram2_16[offset] | 0xffe0; /* only D0-D4 are connected */ -} - -inline void m72_state::changecolor(int color,int r,int g,int b) -{ - m_palette->set_pen_color(color,pal5bit(r),pal5bit(g),pal5bit(b)); -} - -WRITE16_MEMBER(m72_state::palette1_w) -{ - /* A9 isn't connected, so 0x200-0x3ff mirrors 0x000-0x1ff etc. */ - offset &= ~0x100; - - COMBINE_DATA(&m_generic_paletteram_16[offset]); - offset &= 0x0ff; - changecolor(offset, - m_generic_paletteram_16[offset + 0x000], - m_generic_paletteram_16[offset + 0x200], - m_generic_paletteram_16[offset + 0x400]); -} - -WRITE16_MEMBER(m72_state::palette2_w) -{ - /* A9 isn't connected, so 0x200-0x3ff mirrors 0x000-0x1ff etc. */ - offset &= ~0x100; - - COMBINE_DATA(&m_generic_paletteram2_16[offset]); - offset &= 0x0ff; - changecolor(offset + 256, - m_generic_paletteram2_16[offset + 0x000], - m_generic_paletteram2_16[offset + 0x200], - m_generic_paletteram2_16[offset + 0x400]); -} - -WRITE16_MEMBER(m72_state::videoram1_w) -{ - COMBINE_DATA(&m_videoram1[offset]); + COMBINE_DATA(&m_videoram[0][offset]); m_fg_tilemap->mark_tile_dirty(offset/2); } -WRITE16_MEMBER(m72_state::videoram2_w) +void m72_state::videoram2_w(offs_t offset, u16 data, u16 mem_mask) { - COMBINE_DATA(&m_videoram2[offset]); + COMBINE_DATA(&m_videoram[1][offset]); m_bg_tilemap->mark_tile_dirty(offset/2); // m82 has selectable tilemap size @@ -340,7 +271,7 @@ WRITE16_MEMBER(m72_state::videoram2_w) } -WRITE16_MEMBER(m72_state::irq_line_w) +void m72_state::irq_line_w(u16 data) { // KNA70H015(11): ISET m_raster_irq_position = data & 0x1ff; @@ -353,38 +284,13 @@ WRITE16_MEMBER(m72_state::irq_line_w) m_maincpu->set_input_line(NEC_INPUT_LINE_INTP2, CLEAR_LINE); } -WRITE16_MEMBER(m72_state::scrollx1_w) +void m72_state::dmaon_w(u8 data) { - m_screen->update_partial(m_screen->vpos()); - COMBINE_DATA(&m_scrollx1); + m_spriteram->copy(); } -WRITE16_MEMBER(m72_state::scrollx2_w) -{ - m_screen->update_partial(m_screen->vpos()); - COMBINE_DATA(&m_scrollx2); -} -WRITE16_MEMBER(m72_state::scrolly1_w) -{ - m_screen->update_partial(m_screen->vpos()); - COMBINE_DATA(&m_scrolly1); -} - -WRITE16_MEMBER(m72_state::scrolly2_w) -{ - m_screen->update_partial(m_screen->vpos()); - COMBINE_DATA(&m_scrolly2); -} - -WRITE16_MEMBER(m72_state::dmaon_w) -{ - if (ACCESSING_BITS_0_7) - memcpy(m_buffered_spriteram.get(), m_spriteram, m_spriteram.bytes()); -} - - -WRITE8_MEMBER(m72_state::port02_w) +void m72_state::port02_w(u8 data) { if (data & 0xe0) logerror("write %02x to port 02\n",data); @@ -393,7 +299,7 @@ WRITE8_MEMBER(m72_state::port02_w) machine().bookkeeping().coin_counter_w(1,data & 0x02); /* bit 2 is flip screen (handled both by software and hardware) */ - flip_screen_set(((data & 0x04) >> 2) ^ ((~ioport("DSW")->read() >> 8) & 1)); + flip_screen_set(((data & 0x04) >> 2) ^ ((~m_io_dsw->read() >> 8) & 1)); /* bit 3 is display disable */ m_video_off = data & 0x08; @@ -407,7 +313,7 @@ WRITE8_MEMBER(m72_state::port02_w) /* bit 5 = "bank"? */ } -WRITE8_MEMBER(m72_state::rtype2_port02_w) +void m72_state::rtype2_port02_w(u8 data) { if (data & 0xe0) logerror("write %02x to port 02\n",data); @@ -416,7 +322,7 @@ WRITE8_MEMBER(m72_state::rtype2_port02_w) machine().bookkeeping().coin_counter_w(1,data & 0x02); /* bit 2 is flip screen (handled both by software and hardware) */ - flip_screen_set(((data & 0x04) >> 2) ^ ((~ioport("DSW")->read() >> 8) & 1)); + flip_screen_set(((data & 0x04) >> 2) ^ ((~m_io_dsw->read() >> 8) & 1)); /* bit 3 is display disable */ m_video_off = data & 0x08; @@ -424,7 +330,7 @@ WRITE8_MEMBER(m72_state::rtype2_port02_w) /* other bits unknown */ } -WRITE8_MEMBER(m72_state::poundfor_port02_w) +void m72_state::poundfor_port02_w(u8 data) { // bit 5 resets both uPD4701A? m_upd4701[0]->resetx_w(BIT(data, 5)); @@ -432,13 +338,13 @@ WRITE8_MEMBER(m72_state::poundfor_port02_w) m_upd4701[1]->resetx_w(BIT(data, 5)); m_upd4701[1]->resety_w(BIT(data, 5)); - rtype2_port02_w(space, 0, data & 0xbf); + rtype2_port02_w(data & 0xbf); } /* the following is mostly a kludge. This register seems to be used for something else */ -WRITE16_MEMBER(m72_state::m82_gfx_ctrl_w) +void m72_state::m82_gfx_ctrl_w(offs_t offset, u16 data, u16 mem_mask) { if (ACCESSING_BITS_8_15) { @@ -449,7 +355,7 @@ WRITE16_MEMBER(m72_state::m82_gfx_ctrl_w) } -WRITE16_MEMBER(m72_state::m82_tm_ctrl_w) +void m72_state::m82_tm_ctrl_w(offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(&m_m82_tmcontrol); // printf("tmcontrol %04x\n", m_m82_tmcontrol); @@ -464,24 +370,20 @@ WRITE16_MEMBER(m72_state::m82_tm_ctrl_w) void m72_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) { - uint16_t *spriteram = m_buffered_spriteram.get(); - int offs; + u16 *spriteram = m_spriteram->buffer(); + int offs = 0; - offs = 0; - while (offs < m_spriteram.bytes()/2) + while (offs < m_spriteram->bytes()/2) { - int code,color,sx,sy,flipx,flipy,w,h,x,y; - - - code = spriteram[offs+1]; - color = spriteram[offs+2] & 0x0f; - sx = -256+(spriteram[offs+3] & 0x3ff); - sy = 384-(spriteram[offs+0] & 0x1ff); - flipx = spriteram[offs+2] & 0x0800; - flipy = spriteram[offs+2] & 0x0400; - - w = 1 << ((spriteram[offs+2] & 0xc000) >> 14); - h = 1 << ((spriteram[offs+2] & 0x3000) >> 12); + const int code = spriteram[offs+1]; + const u32 color = spriteram[offs+2] & 0x0f; + int sx = -256+(spriteram[offs+3] & 0x3ff); + int sy = 384-(spriteram[offs+0] & 0x1ff); + int flipx = spriteram[offs+2] & 0x0800; + int flipy = spriteram[offs+2] & 0x0400; + + const int w = 1 << ((spriteram[offs+2] & 0xc000) >> 14); + const int h = 1 << ((spriteram[offs+2] & 0x3000) >> 12); sy -= 16 * h; if (flip_screen()) @@ -492,9 +394,9 @@ void m72_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) flipy = !flipy; } - for (x = 0;x < w;x++) + for (int x = 0; x < w; x++) { - for (y = 0;y < h;y++) + for (int y = 0; y < h; y++) { int c = code; @@ -517,23 +419,19 @@ void m72_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) void m72_state::majtitle_draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) { - uint16_t *spriteram16_2 = m_spriteram2; - int offs; + u16 *spriteram16_2 = m_spriteram2; - for (offs = 0;offs < m_spriteram.bytes();offs += 4) + for (int offs = 0; offs < m_spriteram2.bytes(); offs += 4) { - int code,color,sx,sy,flipx,flipy,w,h,x,y; - - - code = spriteram16_2[offs+1]; - color = spriteram16_2[offs+2] & 0x0f; - sx = -256+(spriteram16_2[offs+3] & 0x3ff); - sy = 384-(spriteram16_2[offs+0] & 0x1ff); - flipx = spriteram16_2[offs+2] & 0x0800; - flipy = spriteram16_2[offs+2] & 0x0400; - - w = 1;// << ((spriteram16_2[offs+2] & 0xc000) >> 14); - h = 1 << ((spriteram16_2[offs+2] & 0x3000) >> 12); + const int code = spriteram16_2[offs+1]; + const u32 color = spriteram16_2[offs+2] & 0x0f; + int sx = -256+(spriteram16_2[offs+3] & 0x3ff); + int sy = 384-(spriteram16_2[offs+0] & 0x1ff); + int flipx = spriteram16_2[offs+2] & 0x0800; + int flipy = spriteram16_2[offs+2] & 0x0400; + + const int w = 1;// << ((spriteram16_2[offs+2] & 0xc000) >> 14); + const int h = 1 << ((spriteram16_2[offs+2] & 0x3000) >> 12); sy -= 16 * h; if (flip_screen()) @@ -544,9 +442,9 @@ void m72_state::majtitle_draw_sprites(bitmap_ind16 &bitmap,const rectangle &clip flipy = !flipy; } - for (x = 0;x < w;x++) + for (int x = 0; x < w; x++) { - for (y = 0;y < h;y++) + for (int y = 0; y < h; y++) { int c = code; @@ -565,7 +463,7 @@ void m72_state::majtitle_draw_sprites(bitmap_ind16 &bitmap,const rectangle &clip } } -uint32_t m72_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 m72_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { if (m_video_off) { @@ -573,11 +471,11 @@ uint32_t m72_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c return 0; } - m_fg_tilemap->set_scrollx(0,m_scrollx1); - m_fg_tilemap->set_scrolly(0,m_scrolly1); + m_fg_tilemap->set_scrollx(0,m_scrollx[0]); + m_fg_tilemap->set_scrolly(0,m_scrolly[0]); - m_bg_tilemap->set_scrollx(0,m_scrollx2); - m_bg_tilemap->set_scrolly(0,m_scrolly2); + m_bg_tilemap->set_scrollx(0,m_scrollx[1]); + m_bg_tilemap->set_scrolly(0,m_scrolly[1]); m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); m_fg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); @@ -587,11 +485,11 @@ uint32_t m72_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c return 0; } -uint32_t m72_state::screen_update_m81(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 m72_state::screen_update_m81(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { // on M81 the FG data always comes from the Ax roms // the source of the BG data however depends on Jumper J3 - int J3 = m_m81_b_b_j3->read(); + const int J3 = m_m81_b_b_j3->read(); if (J3 == 0) m_bg_source = 1; else m_bg_source = 2; @@ -599,39 +497,36 @@ uint32_t m72_state::screen_update_m81(screen_device &screen, bitmap_ind16 &bitma } -uint32_t m72_state::screen_update_m82(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 m72_state::screen_update_m82(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int i; - tilemap_t* tm; if (m_m82_tmcontrol & 0x40) tm = m_bg_tilemap_large; else tm = m_bg_tilemap; - if (m_video_off) { bitmap.fill(m_palette->black_pen(), cliprect); return 0; } - m_fg_tilemap->set_scrollx(0,m_scrollx1); - m_fg_tilemap->set_scrolly(0,m_scrolly1); + m_fg_tilemap->set_scrollx(0,m_scrollx[0]); + m_fg_tilemap->set_scrolly(0,m_scrolly[0]); if (m_m82_rowscroll) { tm->set_scroll_rows(512); - for (i = 0;i < 512;i++) - tm->set_scrollx((i+m_scrolly2)&0x1ff, + for (int i = 0; i < 512; i++) + tm->set_scrollx((i+m_scrolly[1])&0x1ff, 256 + m_m82_rowscrollram[i]); } else { tm->set_scroll_rows(1); - tm->set_scrollx(0,256 + m_scrollx2); + tm->set_scrollx(0,256 + m_scrollx[1]); } - tm->set_scrolly(0,m_scrolly2); + tm->set_scrolly(0,m_scrolly[1]); tm->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); m_fg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); majtitle_draw_sprites(bitmap,cliprect); -- cgit v1.2.3