Implemented a preliminary Konami k053252 device emulation, adds accurate refresh rate timings to Hexion and Dragonball Z games [Angelo Salese]

This commit is contained in:
Angelo Salese 2011-05-15 18:49:30 +00:00
parent 995033214d
commit f882605d74
8 changed files with 62 additions and 14 deletions

View File

@ -241,7 +241,7 @@ static MACHINE_CONFIG_START( hexion, hexion_state )
MCFG_CPU_PROGRAM_MAP(hexion_map)
MCFG_TIMER_ADD_SCANLINE("scantimer", hexion_scanline, "screen", 0, 1)
MCFG_K053252_ADD("k053252", 24000000/4, hexion_k053252_intf)
MCFG_K053252_ADD("k053252", 24000000/2, hexion_k053252_intf)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)

View File

@ -165,7 +165,7 @@ static ADDRESS_MAP_START( overdriv_master_map, AS_PROGRAM, 16 )
AM_RANGE(0x0c0000, 0x0c0001) AM_READ_PORT("INPUTS")
AM_RANGE(0x0c0002, 0x0c0003) AM_READ_PORT("SYSTEM")
AM_RANGE(0x0e0000, 0x0e0001) AM_WRITENOP /* unknown (always 0x30) */
AM_RANGE(0x100000, 0x10001f) AM_DEVREADWRITE8("k053252",k053252_r,k053252_w,0x00ff) /* 053252? (LSB) */
// AM_RANGE(0x100000, 0x10001f) AM_DEVREADWRITE8("k053252",k053252_r,k053252_w,0x00ff) /* 053252? (LSB) */
AM_RANGE(0x140000, 0x140001) AM_WRITENOP //watchdog reset?
AM_RANGE(0x180000, 0x180001) AM_READ_PORT("PADDLE")
AM_RANGE(0x1c0000, 0x1c001f) AM_DEVWRITE8("k051316_1", k051316_ctrl_w, 0xff00)
@ -350,6 +350,7 @@ static const k053250_interface overdriv_k053252_intf =
"screen"
};
static MACHINE_CONFIG_START( overdriv, overdriv_state )
/* basic machine hardware */

View File

@ -346,7 +346,7 @@ static ADDRESS_MAP_START( qdrmfgp_map, AS_PROGRAM, 16 )
AM_RANGE(0x180000, 0x183fff) AM_RAM AM_SHARE("nvram") /* backup ram */
AM_RANGE(0x280000, 0x280fff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x300000, 0x30003f) AM_DEVWRITE("k056832", k056832_word_w) /* video reg */
AM_RANGE(0x320000, 0x32001f) AM_DEVREADWRITE8("k053252", k053252_r, k053252_w,0x00ff) /* ccu */
// AM_RANGE(0x320000, 0x32001f) AM_DEVREADWRITE8("k053252", k053252_r, k053252_w,0x00ff) /* ccu */
AM_RANGE(0x330000, 0x330001) AM_READ_PORT("SENSOR") /* battery power & service sw */
AM_RANGE(0x340000, 0x340001) AM_READ_PORT("340000") /* inputport */
AM_RANGE(0x350000, 0x350001) AM_WRITENOP /* unknown */
@ -369,7 +369,7 @@ static ADDRESS_MAP_START( qdrmfgp2_map, AS_PROGRAM, 16 )
AM_RANGE(0x180000, 0x183fff) AM_RAM AM_SHARE("nvram") /* backup ram */
AM_RANGE(0x280000, 0x280fff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x300000, 0x30003f) AM_DEVWRITE("k056832", k056832_word_w) /* video reg */
AM_RANGE(0x320000, 0x32001f) AM_DEVREADWRITE8("k053252", k053252_r, k053252_w,0x00ff) /* ccu */
// AM_RANGE(0x320000, 0x32001f) AM_DEVREADWRITE8("k053252", k053252_r, k053252_w,0x00ff) /* ccu */
AM_RANGE(0x330000, 0x330001) AM_READ_PORT("SENSOR") /* battery power & service */
AM_RANGE(0x340000, 0x340001) AM_READ_PORT("340000") /* inputport */
AM_RANGE(0x350000, 0x350001) AM_WRITENOP /* unknown */

View File

@ -91,7 +91,7 @@ static ADDRESS_MAP_START( rollerg_map, AS_PROGRAM, 8 )
AM_RANGE(0x0053, 0x0053) AM_READ_PORT("DSW1")
AM_RANGE(0x0060, 0x0060) AM_READ_PORT("DSW2")
AM_RANGE(0x0061, 0x0061) AM_READ(pip_r) /* ????? */
AM_RANGE(0x0100, 0x010f) AM_DEVREADWRITE("k053252",k053252_r,k053252_w) /* 053252? */
// AM_RANGE(0x0100, 0x010f) AM_DEVREADWRITE("k053252",k053252_r,k053252_w) /* 053252? */
AM_RANGE(0x0200, 0x020f) AM_DEVWRITE("k051316", k051316_ctrl_w)
AM_RANGE(0x0300, 0x030f) AM_DEVREADWRITE("k053244", k053244_r, k053244_w)
AM_RANGE(0x0800, 0x0fff) AM_READ(rollerg_k051316_r) AM_DEVWRITE("k051316", k051316_w)
@ -296,7 +296,7 @@ static MACHINE_CONFIG_START( rollerg, rollerg_state )
MCFG_K053244_ADD("k053244", rollerg_k05324x_intf)
MCFG_K051316_ADD("k051316", rollerg_k051316_intf)
MCFG_K053252_ADD("k053252", 3000000/2, rollerg_k053252_intf)
MCFG_K053252_ADD("k053252", 3000000*2, rollerg_k053252_intf)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -188,7 +188,7 @@ static ADDRESS_MAP_START( rungun_map, AS_PROGRAM, 16 )
AM_RANGE(0x380000, 0x39ffff) AM_RAM // work RAM
AM_RANGE(0x400000, 0x43ffff) AM_READNOP // AM_READ( K053936_0_rom_r ) // '936 ROM readback window
AM_RANGE(0x480000, 0x48001f) AM_READWRITE(rng_sysregs_r, rng_sysregs_w) AM_BASE_MEMBER(rungun_state, m_sysreg)
AM_RANGE(0x4c0000, 0x4c001f) AM_DEVREADWRITE8("k053252", k053252_r, k053252_w,0x00ff) // CCU (for scanline and vblank polling)
// AM_RANGE(0x4c0000, 0x4c001f) AM_DEVREADWRITE8("k053252", k053252_r, k053252_w,0x00ff) // CCU (for scanline and vblank polling)
AM_RANGE(0x540000, 0x540001) AM_WRITE(sound_irq_w)
AM_RANGE(0x58000c, 0x58000d) AM_WRITE(sound_cmd1_w)
AM_RANGE(0x58000e, 0x58000f) AM_WRITE(sound_cmd2_w)
@ -434,7 +434,7 @@ static MACHINE_CONFIG_START( rng, rungun_state )
MCFG_K053936_ADD("k053936", rng_k053936_intf)
MCFG_K055673_ADD("k055673", rng_k055673_intf)
MCFG_K053252_ADD("k053252", 16000000/4, rng_k053252_intf)
MCFG_K053252_ADD("k053252", 16000000/2, rng_k053252_intf)
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")

View File

@ -270,7 +270,7 @@ static ADDRESS_MAP_START( esckids_map, AS_PROGRAM, 8 )
AM_RANGE(0x3f93, 0x3f93) AM_READ_PORT("SERVICE")
AM_RANGE(0x3fa0, 0x3fa7) AM_DEVWRITE("k053246", k053246_w) // 053246 (Sprite)
AM_RANGE(0x3fb0, 0x3fbf) AM_DEVWRITE("k053251", k053251_w) // 053251 (Priority Encoder)
AM_RANGE(0x3fc0, 0x3fcf) AM_DEVREADWRITE("k053252",k053252_r,k053252_w) // Not Emulated (053252 ???)
// AM_RANGE(0x3fc0, 0x3fcf) AM_DEVREADWRITE("k053252",k053252_r,k053252_w) // Not Emulated (053252 ???)
AM_RANGE(0x3fd0, 0x3fd0) AM_WRITE(vendetta_5fe0_w) // Coin Counter, 052109 RMRD, 053246 OBJCHA
AM_RANGE(0x3fd2, 0x3fd2) AM_WRITE(vendetta_eeprom_w) // EEPROM, Video banking
AM_RANGE(0x3fd4, 0x3fd4) AM_READWRITE(vendetta_sound_interrupt_r, z80_irq_w) // Sound
@ -565,7 +565,7 @@ static MACHINE_CONFIG_DERIVED( esckids, vendetta )
MCFG_K052109_ADD("k052109", esckids_k052109_intf)
MCFG_DEVICE_REMOVE("k053246")
MCFG_K053246_ADD("k053246", esckids_k053246_intf)
MCFG_K053252_ADD("k053252", 6000000/2, esckids_k053252_intf)
MCFG_K053252_ADD("k053252", 6000000, esckids_k053252_intf)
MACHINE_CONFIG_END

View File

@ -338,7 +338,7 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16 )
AM_RANGE(0x0c8000, 0x0c800f) AM_DEVREADWRITE("k053250", k053250_r, k053250_w)
AM_RANGE(0x0ca000, 0x0ca01f) AM_DEVWRITE("k054338", k054338_word_w) // CLTC
AM_RANGE(0x0cc000, 0x0cc01f) AM_DEVWRITE("k053251", k053251_lsb_w) // priority encoder
AM_RANGE(0x0d0000, 0x0d001f) AM_DEVREADWRITE8("k053252", k053252_r,k053252_w,0x00ff) // CCU
// AM_RANGE(0x0d0000, 0x0d001f) AM_DEVREADWRITE8("k053252", k053252_r,k053252_w,0x00ff) // CCU
AM_RANGE(0x0d4000, 0x0d4001) AM_WRITE(sound_irq_w)
AM_RANGE(0x0d600c, 0x0d600d) AM_WRITE(sound_cmd1_w)
AM_RANGE(0x0d600e, 0x0d600f) AM_WRITE(sound_cmd2_w)
@ -362,7 +362,6 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16 )
AM_RANGE(0x0c2000, 0x0c2007) AM_DEVREAD("k053246", k053246_reg_word_r)
AM_RANGE(0x0ca000, 0x0ca01f) AM_DEVREAD("k054338", k054338_word_r)
AM_RANGE(0x0cc000, 0x0cc01f) AM_DEVREAD("k053251", k053251_lsb_r)
AM_RANGE(0x0d0000, 0x0d001f) AM_DEVREAD("k053252", k053252_word_r)
AM_RANGE(0x0d8000, 0x0d8007) AM_DEVREAD("k056832", k056832_b_word_r)
#endif
@ -548,7 +547,7 @@ static MACHINE_CONFIG_START( xexex, xexex_state )
MCFG_SCREEN_ADD("screen", RASTER)
// MCFG_SCREEN_REFRESH_RATE(8000000/512/288)
MCFG_SCREEN_RAW_PARAMS(32000000/4, 384+33+40+55, 0, 383, 256+12+6+14, 0, 255)
MCFG_SCREEN_RAW_PARAMS(8000000, 384+33+40+55, 0, 383, 256+12+6+14, 0, 255)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
MCFG_SCREEN_SIZE(64*8, 32*8)

View File

@ -9038,6 +9038,8 @@ struct _k053252_state
UINT16 hc,hfp,hbp;
UINT16 vc,vfp,vbp;
UINT8 vsw,hsw;
screen_device *screen;
};
/*****************************************************************************
@ -9052,6 +9054,13 @@ INLINE k053252_state *k053252_get_safe_token( device_t *device )
return (k053252_state *)downcast<legacy_device_base *>(device)->token();
}
INLINE const k053252_interface *k053252_get_interface( device_t *device )
{
assert(device != NULL);
assert((device->type() == K053252));
return (const k053252_interface *) device->static_config();
}
/*****************************************************************************
DEVICE HANDLERS
*****************************************************************************/
@ -9062,6 +9071,35 @@ READ8_DEVICE_HANDLER( k053252_r )
return k053252->regs[offset];
}
static void k053252_res_change( device_t *device )
{
k053252_state *k053252 = k053252_get_safe_token(device);
if(k053252->screen != NULL)
{
if(k053252->hc && k053252->vc &&
k053252->hbp && k053252->hfp &&
k053252->vbp && k053252->vfp &&
k053252->hsw && k053252->vsw) //safety checks
{
rectangle visarea;
//(HC+1) - HFP - HBP - 8*(HSW+1)
//VC - VFP - VBP - (VSW+1)
attoseconds_t refresh = HZ_TO_ATTOSECONDS(device->clock()) * (k053252->hc) * k053252->vc;
printf("H %d %d %d %d\n",k053252->hc,k053252->hfp,k053252->hbp,k053252->hsw);
printf("V %d %d %d %d\n",k053252->vc,k053252->vfp,k053252->vbp,k053252->vsw);
visarea.min_x = 0;
visarea.min_y = 0;
visarea.max_x = k053252->hc - k053252->hfp - k053252->hbp - 8*(k053252->hsw) - 1;
visarea.max_y = k053252->vc - k053252->vfp - k053252->vbp - (k053252->vsw) - 1;
k053252->screen->configure(k053252->hc, k053252->vc, visarea, refresh);
}
}
}
WRITE8_DEVICE_HANDLER( k053252_w )
{
k053252_state *k053252 = k053252_get_safe_token(device);
@ -9078,38 +9116,44 @@ WRITE8_DEVICE_HANDLER( k053252_w )
k053252->hc |= ((k053252->regs[0]&0x03)<<8);
k053252->hc ++;
logerror("%d (%04x) HC set\n",k053252->hc,k053252->hc);
k053252_res_change(device);
break;
case 0x02:
case 0x03:
k053252->hfp = (k053252->regs[3]&0xff);
k053252->hfp |= ((k053252->regs[2]&0x01)<<8);
logerror("%d (%04x) HFP set\n",k053252->hfp,k053252->hfp);
k053252_res_change(device);
break;
case 0x04:
case 0x05:
k053252->hbp = (k053252->regs[5]&0xff);
k053252->hbp |= ((k053252->regs[4]&0x01)<<8);
logerror("%d (%04x) HBP set\n",k053252->hbp,k053252->hbp);
k053252_res_change(device);
break;
case 0x08:
case 0x09:
k053252->vc = (k053252->regs[9]&0xff);
k053252->vc |= ((k053252->regs[8]&0x01)<<8);
k053252->vc ++;
logerror("%d (%04x) VC set\n",k053252->vc,k053252->vc);
k053252_res_change(device);
break;
case 0x0a:
k053252->vfp = (k053252->regs[0x0a]&0xff);
logerror("%d (%04x) VFP set\n",k053252->vfp,k053252->vfp);
k053252_res_change(device);
break;
case 0x0b:
k053252->vbp = (k053252->regs[0x0b]&0xff);
logerror("%d (%04x) VBP set\n",k053252->vbp,k053252->vbp);
k053252_res_change(device);
break;
case 0x0c:
k053252->vsw = ((k053252->regs[0x0c]&0xf0) >> 4) + 1;
k053252->hsw = ((k053252->regs[0x0c]&0x0f) >> 0) + 1;
logerror("%02x VSW / %02x HSW set\n",k053252->vsw,k053252->hsw);
k053252_res_change(device);
break;
}
}
@ -9123,8 +9167,10 @@ WRITE8_DEVICE_HANDLER( k053252_w )
static DEVICE_START( k053252 )
{
k053252_state *k053252 = k053252_get_safe_token(device);
const k053252_interface *intf = k053252_get_interface(device);
device->save_item(NAME(k053252->regs));
k053252->screen = device->machine().device<screen_device>(intf->screen);
}
static DEVICE_RESET( k053252 )
@ -9134,6 +9180,8 @@ static DEVICE_RESET( k053252 )
for (i = 0; i < 16; i++)
k053252->regs[i] = 0;
k053252->regs[0x08] = 1; // Xexex apparently does a wrong assignment for VC (sets up the INT enable register instead)
}