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)
This commit is contained in:
angelosa 2015-12-11 00:48:17 +01:00
parent 2e47a293dd
commit c24c0e7fa8
4 changed files with 66 additions and 57 deletions

View File

@ -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;

View File

@ -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

View File

@ -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")

View File

@ -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<cpu_device> m_maincpu;
optional_device<cpu_device> m_soundcpu;
optional_device<tms57002_device> m_dasp;
required_device<k053252_device> m_k053252;
required_device<k055673_device> m_k055673;
required_device<k055555_device> m_k055555;
required_device<k056832_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);