mirror of
https://github.com/holub/mame
synced 2025-06-05 20:33:45 +03:00
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:
parent
2e47a293dd
commit
c24c0e7fa8
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user