From c24c0e7fa8a88547381efb4080f0298f1dc0b14e Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 11 Dec 2015 00:48:17 +0100 Subject: [PATCH] konamigx.cpp: Replaced CCU with device version, including pixel clock select mechanism. [Angelo Salese] k053252.cpp: Implemented preliminary vertical position count. [Angelo Salese] (Everything works except Racing Force crashing and Type 3/4 video code not liking the new arrangement for whatever reason) --- src/devices/machine/k053252.cpp | 9 ++- src/devices/machine/k053252.h | 1 + src/mame/drivers/konamigx.cpp | 106 ++++++++++++++++---------------- src/mame/includes/konamigx.h | 7 ++- 4 files changed, 66 insertions(+), 57 deletions(-) diff --git a/src/devices/machine/k053252.cpp b/src/devices/machine/k053252.cpp index fe2239eed52..6e3a612a1e8 100644 --- a/src/devices/machine/k053252.cpp +++ b/src/devices/machine/k053252.cpp @@ -54,6 +54,7 @@ TODO: - dual screen support (for Konami GX types 3/4) - viostorm and dbz reads the VCT port, but their usage is a side effect to send an irq ack thru the same port: i.e. first one uses move.b $26001d.l, $26001d.l, second one clr.b +- le2 sets int-time but never ever enables hblank irq? ***************************************************************************************************************************/ @@ -143,11 +144,12 @@ READ8_MEMBER( k053252_device::read ) //TODO: debugger_access() switch(offset) { - /* VCT read-back (TODO: values not extensively tested) */ + /* VCT read-back */ + // TODO: correct? case 0x0e: - return (m_screen->vpos() >> 8) & 1; + return ((m_screen->vpos()-m_vc) >> 8) & 1; case 0x0f: - return m_screen->vpos() & 0xff; + return (m_screen->vpos()-m_vc) & 0xff; default: //popmessage("Warning: k053252 read %02x, contact MAMEdev",offset); break; @@ -238,6 +240,7 @@ WRITE8_MEMBER( k053252_device::write ) logerror("%02x VSW / %02x HSW set\n",m_vsw,m_hsw); res_change(); break; + //case 0x0d: m_int_time(data); break; case 0x0e: m_int1_ack_cb(1); break; case 0x0f: m_int2_ack_cb(1); break; diff --git a/src/devices/machine/k053252.h b/src/devices/machine/k053252.h index 27740f3fd9b..70ec6f4f376 100644 --- a/src/devices/machine/k053252.h +++ b/src/devices/machine/k053252.h @@ -56,6 +56,7 @@ protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; + virtual void device_clock_changed() override { res_change(); } private: // internal state diff --git a/src/mame/drivers/konamigx.cpp b/src/mame/drivers/konamigx.cpp index e3e2a9818fc..60760cda621 100644 --- a/src/mame/drivers/konamigx.cpp +++ b/src/mame/drivers/konamigx.cpp @@ -106,7 +106,9 @@ #include "includes/konamigx.h" #include "rendlay.h" - +// TODO: check on PCB +#define MASTER_CLOCK XTAL_24MHz +#define SUB_CLOCK XTAL_16MHz /**********************************************************************************/ /* @@ -175,6 +177,7 @@ 000e0002 002e0080 - Sexy Parodius: sets up p1 as 2 at start of stage 1, 4 during stage 3A (attract mode), p4 is autoincremented at each gameplay frame. Related to missing effects? + - Tokimeki Memorial: wrong horizontal flip for mode select arrows; */ static struct sprite_entry { @@ -501,7 +504,9 @@ WRITE32_MEMBER(konamigx_state::eeprom_w) } WRITE32_MEMBER(konamigx_state::control_w) -{ +{ + // TODO: derive from reported PCB XTALs + const UINT32 pixclock[4] = { XTAL_6MHz, XTAL_8MHz, XTAL_12MHz, XTAL_16MHz}; //logerror("write %x to control register (mask=%x)\n", data, mem_mask); // known controls: @@ -540,6 +545,8 @@ WRITE32_MEMBER(konamigx_state::control_w) m_k055673->k053246_set_objcha_line((data&0x100000) ? ASSERT_LINE : CLEAR_LINE); m_gx_wrport2 = (data>>16)&0xff; + + m_k053252->set_unscaled_clock(pixclock[m_gx_wrport2 & 3]); } } @@ -547,41 +554,6 @@ WRITE32_MEMBER(konamigx_state::control_w) /**********************************************************************************/ /* IRQ controllers */ -READ8_MEMBER(konamigx_state::ccu_r) -{ - // the routine at 204abe in opengolf polls to see if we're in vblank (it wants values between 0x111 and 0x1df) - if (offset == 0x1c/2) - return 0x01; - - if (offset == 0x1e/2) - return 0x20; - -// logerror("Read unhandled CCU register %x\n", offset); - return 0; -} - -WRITE8_MEMBER(konamigx_state::ccu_w) -{ - switch(offset) - { - case 0x1a/2: - printf("%d INT-TIME\n",data); - break; - - // vblank interrupt ACK - case 0x1c/2: - m_maincpu->set_input_line(1, CLEAR_LINE); - m_gx_syncen |= 0x20; - break; - - // hblank interrupt ACK - case 0x1e/2: - m_maincpu->set_input_line(2, CLEAR_LINE); - m_gx_syncen |= 0x40; - break; - } -} - TIMER_CALLBACK_MEMBER(konamigx_state::boothack_callback) { // Restore main CPU normal operating frequency @@ -632,7 +604,7 @@ void konamigx_state::dmastart_callback(int data) } // simulate DMA delay - m_dmadelay_timer->adjust(attotime::from_usec(120)); + m_dmadelay_timer->adjust(attotime::from_usec(m_gx_wrport2 & 1 ? (256+32) : (342+42))); } @@ -1017,7 +989,7 @@ static ADDRESS_MAP_START( gx_base_memmap, AS_PROGRAM, 32, konamigx_state ) AM_RANGE(0xd48000, 0xd48007) AM_DEVWRITE16("k055673", k055673_device, k053246_word_w, 0xffffffff) AM_RANGE(0xd4a000, 0xd4a00f) AM_DEVREAD16("k055673", k055673_device, k055673_rom_word_r, 0xffffffff) AM_RANGE(0xd4a010, 0xd4a01f) AM_DEVWRITE16("k055673", k055673_device, k055673_reg_word_w, 0xffffffff) - AM_RANGE(0xd4c000, 0xd4c01f) AM_READWRITE8(ccu_r, ccu_w,0xff00ff00) + AM_RANGE(0xd4c000, 0xd4c01f) AM_DEVREADWRITE8("k053252", k053252_device, read, write, 0xff00ff00) AM_RANGE(0xd4e000, 0xd4e01f) AM_WRITENOP // left-over for "secondary" CCU, apparently (used by type 3/4 for slave screen?) AM_RANGE(0xd50000, 0xd500ff) AM_DEVWRITE("k055555", k055555_device, K055555_long_w) AM_RANGE(0xd52000, 0xd5201f) AM_DEVREADWRITE8("k056800", k056800_device, host_r, host_w, 0xff00ff00) @@ -1606,18 +1578,36 @@ static GFXDECODE_START( type4 ) GFXDECODE_ENTRY( "gfx3", 0, bglayout_8bpp, 0x1800, 8 ) GFXDECODE_END +WRITE_LINE_MEMBER(konamigx_state::vblank_irq_ack_w) +{ + m_maincpu->set_input_line(1, CLEAR_LINE); + m_gx_syncen |= 0x20; +} + +WRITE_LINE_MEMBER(konamigx_state::hblank_irq_ack_w) +{ + m_maincpu->set_input_line(2, CLEAR_LINE); + m_gx_syncen |= 0x40; +} + static MACHINE_CONFIG_START( konamigx, konamigx_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M68EC020, 24000000) + MCFG_CPU_ADD("maincpu", M68EC020, MASTER_CLOCK) MCFG_CPU_PROGRAM_MAP(gx_type2_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", konamigx_state, konamigx_type2_vblank_irq) - MCFG_CPU_ADD("soundcpu", M68000, 8000000) + MCFG_CPU_ADD("soundcpu", M68000, SUB_CLOCK/2) MCFG_CPU_PROGRAM_MAP(gxsndmap) - MCFG_CPU_ADD("dasp", TMS57002, 24000000/2) + MCFG_CPU_ADD("dasp", TMS57002, MASTER_CLOCK/2) MCFG_CPU_DATA_MAP(gxtmsmap) + MCFG_DEVICE_ADD("k053252", K053252, MASTER_CLOCK/4) + MCFG_K053252_OFFSETS(24, 16) + MCFG_K053252_INT1_ACK_CB(WRITELINE(konamigx_state, vblank_irq_ack_w)) + MCFG_K053252_INT2_ACK_CB(WRITELINE(konamigx_state, hblank_irq_ack_w)) + MCFG_VIDEO_SET_SCREEN("screen") + MCFG_QUANTUM_TIME(attotime::from_hz(6000)) MCFG_MACHINE_START_OVERRIDE(konamigx_state,konamigx) @@ -1712,9 +1702,11 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( dragoonj, konamigx ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(40, 40+384-1, 16, 16+224-1) MCFG_VIDEO_START_OVERRIDE(konamigx_state, dragoonj) + MCFG_DEVICE_MODIFY("k053252") + MCFG_K053252_OFFSETS(24+16, 16) + MCFG_DEVICE_MODIFY("k056832") MCFG_K056832_CONFIG("gfx1", 0, K056832_BPP_5, 1, 0, "none") @@ -1773,11 +1765,14 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( racinfrc, konamigx ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_RAW_PARAMS(8000000, 384+24+64+40, 0, 383, 224+16+8+16, 0, 223) - MCFG_SCREEN_VISIBLE_AREA(32, 32+384-1, 16, 16+224-1) + //MCFG_SCREEN_RAW_PARAMS(6000000, 384+24+64+40, 0, 383, 224+16+8+16, 0, 223) + //MCFG_SCREEN_VISIBLE_AREA(32, 32+384-1, 16, 16+224-1) MCFG_GFXDECODE_MODIFY("gfxdecode", racinfrc) MCFG_VIDEO_START_OVERRIDE(konamigx_state, racinfrc) + MCFG_DEVICE_MODIFY("k053252") + MCFG_K053252_OFFSETS(24-8+16, 16-16) + MCFG_DEVICE_MODIFY("k056832") MCFG_K056832_CONFIG("gfx1", 0, K056832_BPP_6, 0, 0, "none") @@ -1838,8 +1833,8 @@ static MACHINE_CONFIG_DERIVED( gxtype4, konamigx ) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK | VIDEO_ALWAYS_UPDATE) - MCFG_SCREEN_SIZE(128*8, 264) - MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 16, 32*8-1-16) + //MCFG_SCREEN_SIZE(128*8, 264) + //MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 16, 32*8-1-16) MCFG_SCREEN_UPDATE_DRIVER(konamigx_state, screen_update_konamigx_left) MCFG_SCREEN_ADD("screen2", RASTER) @@ -1867,10 +1862,14 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( gxtype4_vsn, gxtype4 ) MCFG_DEFAULT_LAYOUT(layout_dualhsxs) - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_SIZE(128*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0, 576-1, 16, 32*8-1-16) + //MCFG_SCREEN_MODIFY("screen") + //MCFG_SCREEN_SIZE(128*8, 32*8) + //MCFG_SCREEN_VISIBLE_AREA(0, 576-1, 16, 32*8-1-16) + MCFG_DEVICE_MODIFY("k053252") + MCFG_K053252_OFFSETS(0, 16) + + MCFG_SCREEN_MODIFY("screen2") MCFG_SCREEN_SIZE(128*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 576-1, 16, 32*8-1-16) @@ -1892,9 +1891,12 @@ static MACHINE_CONFIG_DERIVED( gxtype4sd2, gxtype4 ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( winspike, konamigx ) - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(38, 38+384-1, 16, 16+224-1) + //MCFG_SCREEN_MODIFY("screen") + //MCFG_SCREEN_VISIBLE_AREA(38, 38+384-1, 16, 16+224-1) + MCFG_DEVICE_MODIFY("k053252") + MCFG_K053252_OFFSETS(24+15, 16) + MCFG_DEVICE_MODIFY("k056832") MCFG_K056832_CB(konamigx_state, alpha_tile_callback) MCFG_K056832_CONFIG("gfx1", 0, K056832_BPP_8, 0, 2, "none") diff --git a/src/mame/includes/konamigx.h b/src/mame/includes/konamigx.h index e13455a88be..0b9e81c975b 100644 --- a/src/mame/includes/konamigx.h +++ b/src/mame/includes/konamigx.h @@ -4,6 +4,7 @@ #include "sound/k054539.h" #include "cpu/tms57002/tms57002.h" #include "machine/adc083x.h" +#include "machine/k053252.h" #include "video/k054156_k054157_k056832.h" #include "video/k053246_k053247_k055673.h" #include "video/k055555.h" @@ -18,6 +19,7 @@ public: m_maincpu(*this,"maincpu"), m_soundcpu(*this, "soundcpu"), m_dasp(*this, "dasp"), + m_k053252(*this, "k053252"), m_k055673(*this, "k055673"), m_k055555(*this, "k055555"), m_k056832(*this, "k056832"), @@ -50,6 +52,7 @@ public: required_device m_maincpu; optional_device m_soundcpu; optional_device m_dasp; + required_device m_k053252; required_device m_k055673; required_device m_k055555; required_device m_k056832; @@ -77,8 +80,6 @@ public: DECLARE_WRITE32_MEMBER(eeprom_w); DECLARE_WRITE32_MEMBER(control_w); DECLARE_READ32_MEMBER(waitskip_r); - DECLARE_READ8_MEMBER(ccu_r); - DECLARE_WRITE8_MEMBER(ccu_w); DECLARE_READ32_MEMBER(sound020_r); DECLARE_WRITE32_MEMBER(sound020_w); DECLARE_READ32_MEMBER(le2_gun_H_r); @@ -102,6 +103,8 @@ public: DECLARE_WRITE32_MEMBER(konamigx_tilebank_w); DECLARE_WRITE32_MEMBER(konamigx_t1_psacmap_w); DECLARE_WRITE32_MEMBER(konamigx_t4_psacmap_w); + DECLARE_WRITE_LINE_MEMBER(vblank_irq_ack_w); + DECLARE_WRITE_LINE_MEMBER(hblank_irq_ack_w); DECLARE_CUSTOM_INPUT_MEMBER(gx_rdport1_3_r); DECLARE_DRIVER_INIT(konamigx); TILE_GET_INFO_MEMBER(get_gx_psac_tile_info);