trunk/src/mame/drivers/kurukuru.c
| r19672 | r19673 | |
| 4 | 4 | Taiyo Jidoki / Success |
| 5 | 5 | |
| 6 | 6 | |
| 7 | | Driver by Roberto Fresca. |
| 7 | Driver by Roberto Fresca & hap. |
| 8 | 8 | |
| 9 | 9 | |
| 10 | 10 | This hardware seems to be a derivative of MSX2 'on steroids'. |
| r19672 | r19673 | |
| 13 | 13 | could be merged later with tonton.c, since the platforms are |
| 14 | 14 | sharing the hardware base... |
| 15 | 15 | |
| 16 | | Special thanks to hap, that implemented the correct graphics bankswitch. |
| 17 | 16 | |
| 18 | | |
| 19 | 17 | *************************************************************************** |
| 20 | 18 | |
| 21 | 19 | KURU KURU PYON PYON |
| r19672 | r19673 | |
| 179 | 177 | |
| 180 | 178 | TODO: |
| 181 | 179 | |
| 182 | | - Audio CPU interrupts and connections/latches. |
| 183 | | - M5205 ADPCM system. |
| 184 | 180 | - Hook up AY8910 output ports. Or unused? |
| 185 | 181 | - Find why the use of coin 1 always jams. Hopper? |
| 186 | 182 | |
| r19672 | r19673 | |
| 207 | 203 | required_device<v9938_device> m_v9938; |
| 208 | 204 | |
| 209 | 205 | UINT8 m_sound_irq_cause; |
| 210 | | UINT8 m_sound_irq_mask; |
| 206 | UINT8 m_adpcm_data; |
| 211 | 207 | |
| 212 | 208 | DECLARE_WRITE8_MEMBER(kurukuru_bankswitch_w); |
| 213 | 209 | DECLARE_WRITE8_MEMBER(kurukuru_soundlatch_w); |
| 214 | 210 | DECLARE_READ8_MEMBER(kurukuru_soundlatch_r); |
| 215 | | DECLARE_WRITE8_MEMBER(kurukuru_sound_irqmask_w); |
| 216 | | DECLARE_READ8_MEMBER(kurukuru_sound_timer_irqack_r); |
| 211 | DECLARE_WRITE8_MEMBER(kurukuru_adpcm_reset_w); |
| 212 | DECLARE_READ8_MEMBER(kurukuru_adpcm_timer_irqack_r); |
| 213 | DECLARE_WRITE8_MEMBER(kurukuru_adpcm_data_w); |
| 217 | 214 | |
| 218 | 215 | void update_sound_irq(UINT8 cause); |
| 219 | 216 | virtual void machine_start(); |
| 220 | 217 | virtual void machine_reset(); |
| 221 | 218 | TIMER_DEVICE_CALLBACK_MEMBER(kurukuru_vdp_scanline); |
| 222 | | INTERRUPT_GEN_MEMBER(kurukuru_sound_timer_irq); |
| 223 | 219 | }; |
| 224 | 220 | |
| 225 | 221 | #define MAIN_CLOCK XTAL_21_4772MHz |
| r19672 | r19673 | |
| 227 | 223 | |
| 228 | 224 | #define VDP_MEM 0x30000 |
| 229 | 225 | |
| 226 | /* from MSX2 driver, may be not accurate for this HW */ |
| 230 | 227 | #define MSX2_XBORDER_PIXELS 16 |
| 231 | 228 | #define MSX2_YBORDER_PIXELS 28 |
| 232 | 229 | #define MSX2_TOTAL_XRES_PIXELS 256 * 2 + (MSX2_XBORDER_PIXELS * 2) |
| r19672 | r19673 | |
| 255 | 252 | void kurukuru_state::update_sound_irq(UINT8 cause) |
| 256 | 253 | { |
| 257 | 254 | m_sound_irq_cause = cause & 3; |
| 258 | | UINT8 mask = m_sound_irq_cause & m_sound_irq_mask; |
| 259 | | if (mask) |
| 255 | if (m_sound_irq_cause) |
| 260 | 256 | { |
| 261 | 257 | // use bit 0 for latch irq, and bit 1 for timer irq |
| 262 | 258 | // latch irq vector is $ef (rst $28) |
| 263 | 259 | // timer irq vector is $f7 (rst $30) |
| 264 | 260 | // if both are asserted, the vector becomes $f7 AND $ef = $e7 (rst $20) |
| 265 | 261 | const UINT8 irq_vector[4] = { 0x00, 0xef, 0xf7, 0xe7 }; |
| 266 | | m_audiocpu->set_input_line_and_vector(0, ASSERT_LINE, irq_vector[mask]); |
| 262 | m_audiocpu->set_input_line_and_vector(0, ASSERT_LINE, irq_vector[m_sound_irq_cause]); |
| 267 | 263 | } |
| 268 | 264 | else |
| 269 | 265 | { |
| r19672 | r19673 | |
| 272 | 268 | } |
| 273 | 269 | |
| 274 | 270 | |
| 275 | | INTERRUPT_GEN_MEMBER(kurukuru_state::kurukuru_sound_timer_irq) |
| 271 | static void kurukuru_msm5205_vck(device_t *device) |
| 276 | 272 | { |
| 277 | | update_sound_irq(m_sound_irq_cause | 2); |
| 273 | kurukuru_state *state = device->machine().driver_data<kurukuru_state>(); |
| 274 | state->update_sound_irq(state->m_sound_irq_cause | 2); |
| 275 | msm5205_data_w(device, state->m_adpcm_data); |
| 278 | 276 | } |
| 279 | 277 | |
| 280 | 278 | |
| r19672 | r19673 | |
| 306 | 304 | |
| 307 | 305 | static ADDRESS_MAP_START( kurukuru_io, AS_IO, 8, kurukuru_state ) |
| 308 | 306 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 309 | | // AM_RANGE(0x00, 0x00) AM_WRITENOP // seems for switch cpu... or irq? or hopper? |
| 307 | // AM_RANGE(0x00, 0x00) AM_WRITENOP // hopper? |
| 310 | 308 | AM_RANGE(0x10, 0x10) AM_READ_PORT("DSW1") |
| 311 | 309 | AM_RANGE(0x20, 0x20) AM_WRITE(kurukuru_soundlatch_w) |
| 312 | 310 | AM_RANGE(0x80, 0x83) AM_DEVREADWRITE( "v9938", v9938_device, read, write ) |
| r19672 | r19673 | |
| 319 | 317 | ADDRESS_MAP_END |
| 320 | 318 | |
| 321 | 319 | /* |
| 322 | | 0x00 Writes... 2nd cpu related. |
| 320 | 0x00 Writes... assume hopper related. |
| 323 | 321 | 01 when coin 1 (jams) |
| 324 | 322 | 20 when coin 2 |
| 325 | 323 | 40 when payout (jams) ...check |
| 326 | | |
| 327 | | 0x20 Writes... # sample to trigger |
| 328 | | 00, 08, 03, 04, 05 for bets 1-2-3-4-5 respectively. |
| 329 | | 0d while reels are running. |
| 330 | 324 | */ |
| 331 | 325 | |
| 332 | 326 | |
| 333 | 327 | // Audio CPU |
| 334 | 328 | |
| 335 | | WRITE8_MEMBER(kurukuru_state::kurukuru_sound_irqmask_w) |
| 329 | WRITE8_MEMBER(kurukuru_state::kurukuru_adpcm_data_w) |
| 336 | 330 | { |
| 337 | | // d0: sound latch irq enable |
| 338 | | // d1: sound timer irq enable |
| 331 | m_adpcm_data = data & 0xf; |
| 332 | } |
| 333 | |
| 334 | WRITE8_MEMBER(kurukuru_state::kurukuru_adpcm_reset_w) |
| 335 | { |
| 336 | // d0: reset adpcm chip |
| 339 | 337 | // other bits: ? |
| 340 | | m_sound_irq_mask = data; |
| 338 | msm5205_reset_w(machine().device("adpcm"), data & 1); |
| 341 | 339 | update_sound_irq(m_sound_irq_cause); |
| 342 | 340 | } |
| 343 | 341 | |
| r19672 | r19673 | |
| 347 | 345 | return soundlatch_byte_r(space, 0); |
| 348 | 346 | } |
| 349 | 347 | |
| 350 | | READ8_MEMBER(kurukuru_state::kurukuru_sound_timer_irqack_r) |
| 348 | READ8_MEMBER(kurukuru_state::kurukuru_adpcm_timer_irqack_r) |
| 351 | 349 | { |
| 352 | 350 | update_sound_irq(m_sound_irq_cause & ~2); |
| 353 | 351 | return 0; |
| r19672 | r19673 | |
| 361 | 359 | |
| 362 | 360 | static ADDRESS_MAP_START( audio_io, AS_IO, 8, kurukuru_state ) |
| 363 | 361 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 364 | | // AM_RANGE(0x40, 0x40) AM_WRITENOP |
| 365 | | AM_RANGE(0x50, 0x50) AM_WRITE(kurukuru_sound_irqmask_w) |
| 362 | AM_RANGE(0x40, 0x40) AM_WRITE(kurukuru_adpcm_data_w) |
| 363 | AM_RANGE(0x50, 0x50) AM_WRITE(kurukuru_adpcm_reset_w) |
| 366 | 364 | AM_RANGE(0x60, 0x60) AM_READ(kurukuru_soundlatch_r) |
| 367 | | AM_RANGE(0x70, 0x70) AM_READ(kurukuru_sound_timer_irqack_r) |
| 365 | AM_RANGE(0x70, 0x70) AM_READ(kurukuru_adpcm_timer_irqack_r) |
| 368 | 366 | ADDRESS_MAP_END |
| 369 | 367 | |
| 370 | 368 | |
| r19672 | r19673 | |
| 457 | 455 | |
| 458 | 456 | void kurukuru_state::machine_reset() |
| 459 | 457 | { |
| 460 | | m_sound_irq_mask = 0; |
| 461 | 458 | update_sound_irq(0); |
| 462 | 459 | } |
| 463 | 460 | |
| r19672 | r19673 | |
| 476 | 473 | DEVCB_UNMAPPED // some writes... |
| 477 | 474 | }; |
| 478 | 475 | |
| 476 | static const msm5205_interface msm5205_config = |
| 477 | { |
| 478 | kurukuru_msm5205_vck, |
| 479 | MSM5205_S48_4B /* 8 kHz? */ |
| 480 | }; |
| 479 | 481 | |
| 482 | |
| 480 | 483 | /************************************************* |
| 481 | 484 | * Machine Driver * |
| 482 | 485 | *************************************************/ |
| r19672 | r19673 | |
| 492 | 495 | MCFG_CPU_ADD("audiocpu", Z80, MAIN_CLOCK/6) |
| 493 | 496 | MCFG_CPU_PROGRAM_MAP(audio_map) |
| 494 | 497 | MCFG_CPU_IO_MAP(audio_io) |
| 495 | | MCFG_CPU_PERIODIC_INT_DRIVER(kurukuru_state, kurukuru_sound_timer_irq, 4*60) // from M5205? need to fix that |
| 496 | 498 | |
| 497 | 499 | MCFG_NVRAM_ADD_0FILL("nvram") |
| 498 | 500 | |
| r19672 | r19673 | |
| 518 | 520 | MCFG_SOUND_ADD("aysnd", YM2149, MAIN_CLOCK/12) |
| 519 | 521 | MCFG_SOUND_CONFIG(ay8910_intf) |
| 520 | 522 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) |
| 523 | |
| 524 | MCFG_SOUND_ADD("adpcm", MSM5205, XTAL_384kHz) |
| 525 | MCFG_SOUND_CONFIG(msm5205_config) |
| 526 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) |
| 521 | 527 | MACHINE_CONFIG_END |
| 522 | 528 | |
| 523 | 529 | |
| r19672 | r19673 | |
| 545 | 551 | |
| 546 | 552 | |
| 547 | 553 | /* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */ |
| 548 | | GAME( 199?, kurukuru, 0, kurukuru, kurukuru, driver_device, 0, ROT0, "Success / Taiyo Jidoki", "Kuru Kuru Pyon Pyon (Japan)", GAME_IMPERFECT_SOUND ) |
| 554 | GAME( 199?, kurukuru, 0, kurukuru, kurukuru, driver_device, 0, ROT0, "Success / Taiyo Jidoki", "Kuru Kuru Pyon Pyon (Japan)", 0 ) |