mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
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:
parent
995033214d
commit
f882605d74
@ -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)
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user