trunk/src/mame/drivers/kurukuru.c
| r0 | r19507 | |
| 1 | /************************************************************************** |
| 2 | |
| 3 | KURU KURU PYON PYON |
| 4 | Taiyo Jidoki / Success |
| 5 | |
| 6 | |
| 7 | Driver by Roberto Fresca. |
| 8 | |
| 9 | |
| 10 | This hardware seems to be a derivative of MSX2 'on steroids'. |
| 11 | |
| 12 | Depending how complex is turning the emulation, this driver |
| 13 | could be merged later with tonton.c, since the platforms are |
| 14 | sharing the hardware base... |
| 15 | |
| 16 | Special thanks to hap, that implemented the correct graphics bankswitch. |
| 17 | |
| 18 | |
| 19 | *************************************************************************** |
| 20 | |
| 21 | KURU KURU PYON PYON |
| 22 | (c)SUCCESS / CABINET :TAIYO JIDOKI |
| 23 | |
| 24 | CPU : 2x Sharp LH0080A Z80A |
| 25 | |
| 26 | MEM : 1x Sharp LH5116H-10 (2KB SRAM) + battery |
| 27 | 1x Fairchild 8464A-10L (8KB SRAM) |
| 28 | 6x Sharp LH2464-15 (192KB Video DRAM total) |
| 29 | |
| 30 | SOUND : 1x Yamaha YM2149F |
| 31 | 1x OKI M5205 |
| 32 | |
| 33 | VIDEO : 1x Unknown 64-legs VDP (seems to be from V9938/58 family). |
| 34 | |
| 35 | XTAL : 1x 21477.27KHz |
| 36 | |
| 37 | 1x Texas Instruments RC4558P (Dual General-Purpose Operational Amplifier, DIP8) |
| 38 | 1x Fairchild MB3712 (5,7 Watt Audio Power Amplifier, SIP8). |
| 39 | 2x 8 DIP switches banks. |
| 40 | |
| 41 | 3x PAL16L8A (IC12, IC26 & IC27) |
| 42 | 1x PAL12L6 (IC32) |
| 43 | |
| 44 | |
| 45 | *************************************************************************** |
| 46 | |
| 47 | Notes.... |
| 48 | |
| 49 | The game name could be translated as "Croak Croak Hop Hop" |
| 50 | Kuru is the frog sound, and Pyon is the sound of jumps. |
| 51 | |
| 52 | The game is playable, even when you can't see some graphics. |
| 53 | |
| 54 | Coin 1 (key 5) is not working properly and could hang the system. |
| 55 | For now, use Coin 2 (key 6) and Service (key 8) for credits... |
| 56 | |
| 57 | If you pressed Coin 1 and the game is not responding anymore, press RESET |
| 58 | (key 0) and the game will reset to default values. |
| 59 | |
| 60 | |
| 61 | *************************************************************************** |
| 62 | |
| 63 | TODO: |
| 64 | |
| 65 | - Graphics banking (or figure out how to load them). |
| 66 | - Audio CPU interrupts and connections/latches. |
| 67 | - M5205 ADPCM system. |
| 68 | - Hook up AY8910 output ports. |
| 69 | - Find why the use of coin 1 hangs the game. |
| 70 | |
| 71 | |
| 72 | ***************************************************************************/ |
| 73 | |
| 74 | #include "emu.h" |
| 75 | #include "cpu/z80/z80.h" |
| 76 | #include "sound/ay8910.h" |
| 77 | #include "sound/msm5205.h" |
| 78 | #include "video/v9938.h" |
| 79 | #include "machine/nvram.h" |
| 80 | |
| 81 | class kurukuru_state : public driver_device |
| 82 | { |
| 83 | public: |
| 84 | kurukuru_state(const machine_config &mconfig, device_type type, const char *tag) |
| 85 | : driver_device(mconfig, type, tag), |
| 86 | m_v9938(*this, "v9938") { } |
| 87 | |
| 88 | required_device<v9938_device> m_v9938; |
| 89 | |
| 90 | DECLARE_WRITE8_MEMBER(kurukuru_bankswitch_w); |
| 91 | DECLARE_WRITE8_MEMBER(kurukuru_outport_w); |
| 92 | |
| 93 | virtual void machine_start(); |
| 94 | virtual void machine_reset(); |
| 95 | TIMER_DEVICE_CALLBACK_MEMBER(kurukuru_interrupt); |
| 96 | }; |
| 97 | |
| 98 | #define MAIN_CLOCK XTAL_21_4772MHz |
| 99 | |
| 100 | #define VDP_MEM 0x30000 |
| 101 | |
| 102 | #define MSX2_XBORDER_PIXELS 16 |
| 103 | #define MSX2_YBORDER_PIXELS 28 |
| 104 | #define MSX2_TOTAL_XRES_PIXELS 256 * 2 + (MSX2_XBORDER_PIXELS * 2) |
| 105 | #define MSX2_TOTAL_YRES_PIXELS 212 * 2 + (MSX2_YBORDER_PIXELS * 2) |
| 106 | #define MSX2_VISIBLE_XBORDER_PIXELS 8 * 2 |
| 107 | #define MSX2_VISIBLE_YBORDER_PIXELS 14 * 2 |
| 108 | |
| 109 | |
| 110 | /************************************************* |
| 111 | * Video Hardware * |
| 112 | *************************************************/ |
| 113 | |
| 114 | static void kurukuru_vdp0_interrupt(device_t *, v99x8_device &device, int i) |
| 115 | { |
| 116 | device.machine().device("maincpu")->execute().set_input_line(0, (i ? HOLD_LINE : CLEAR_LINE)); |
| 117 | } |
| 118 | |
| 119 | |
| 120 | /************************************************* |
| 121 | * I/O * |
| 122 | *************************************************/ |
| 123 | |
| 124 | WRITE8_MEMBER(kurukuru_state::kurukuru_bankswitch_w) |
| 125 | { |
| 126 | // d4,d5: bank |
| 127 | membank("bank1")->set_entry(data >> 4 & 3); |
| 128 | |
| 129 | // d3: ? |
| 130 | // other bits: always set |
| 131 | } |
| 132 | |
| 133 | |
| 134 | WRITE8_MEMBER(kurukuru_state::kurukuru_outport_w) |
| 135 | { |
| 136 | // logerror("%02x\n", data); |
| 137 | } |
| 138 | |
| 139 | |
| 140 | /************************************************* |
| 141 | * Memory Map * |
| 142 | *************************************************/ |
| 143 | |
| 144 | static ADDRESS_MAP_START( kurukuru_map, AS_PROGRAM, 8, kurukuru_state ) |
| 145 | AM_RANGE(0x0000, 0x3fff) AM_ROM |
| 146 | AM_RANGE(0x6000, 0xdfff) AM_ROMBANK("bank1") |
| 147 | AM_RANGE(0xe000, 0xe3ff) AM_RAM AM_SHARE("nvram") |
| 148 | // AM_RANGE(0xe400, 0xefff) AM_RAM |
| 149 | AM_RANGE(0xf000, 0xffff) AM_RAM AM_SHARE("share") |
| 150 | ADDRESS_MAP_END |
| 151 | |
| 152 | static ADDRESS_MAP_START( kurukuru_io, AS_IO, 8, kurukuru_state ) |
| 153 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 154 | AM_RANGE(0x00, 0x00) AM_WRITENOP //seems for switch cpu... or irq? |
| 155 | AM_RANGE(0x10, 0x10) AM_READ_PORT("DSW1") |
| 156 | AM_RANGE(0x80, 0x83) AM_DEVREADWRITE( "v9938", v9938_device, read, write ) |
| 157 | AM_RANGE(0x90, 0x90) AM_WRITE(kurukuru_bankswitch_w) |
| 158 | AM_RANGE(0xa0, 0xa0) AM_READ_PORT("IN0") |
| 159 | AM_RANGE(0xb0, 0xb0) AM_READ_PORT("IN1") |
| 160 | AM_RANGE(0xc0, 0xc0) AM_DEVWRITE_LEGACY("aysnd", ay8910_address_w) |
| 161 | AM_RANGE(0xc8, 0xc8) AM_READ_PORT("DSW2") |
| 162 | AM_RANGE(0xd0, 0xd0) AM_DEVWRITE_LEGACY("aysnd", ay8910_data_w) |
| 163 | ADDRESS_MAP_END |
| 164 | |
| 165 | |
| 166 | static ADDRESS_MAP_START( audio_map, AS_PROGRAM, 8, kurukuru_state ) |
| 167 | AM_RANGE(0x0000, 0xbfff) AM_ROM |
| 168 | AM_RANGE(0xf000, 0xffff) AM_RAM AM_SHARE("share") |
| 169 | ADDRESS_MAP_END |
| 170 | |
| 171 | static ADDRESS_MAP_START( audio_io, AS_IO, 8, kurukuru_state ) |
| 172 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 173 | // AM_RANGE(0x00, 0x00) seems for switch cpu... or irqack? |
| 174 | // AM_RANGE(0xff, 0xff) AM_WRITE(kurukuru_outport_w) |
| 175 | ADDRESS_MAP_END |
| 176 | |
| 177 | /* |
| 178 | 0x50 Write 0x0b |
| 179 | 0x60 Read |
| 180 | 0x70 Read |
| 181 | */ |
| 182 | |
| 183 | |
| 184 | /************************************************* |
| 185 | * Input Ports Definitions * |
| 186 | *************************************************/ |
| 187 | |
| 188 | static INPUT_PORTS_START( kurukuru ) |
| 189 | PORT_START("IN0") |
| 190 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(KEYCODE_Z) PORT_NAME("1st") |
| 191 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(KEYCODE_X) PORT_NAME("2nd") |
| 192 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_C) PORT_NAME("3rd") |
| 193 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_CODE(KEYCODE_V) PORT_NAME("4th") |
| 194 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_CODE(KEYCODE_B) PORT_NAME("5th") |
| 195 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_CODE(KEYCODE_N) PORT_NAME("unknown N") |
| 196 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_CODE(KEYCODE_M) PORT_NAME("unknown M") |
| 197 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) |
| 198 | |
| 199 | PORT_START("IN1") |
| 200 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_9) PORT_NAME("Bookkeeping") |
| 201 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_8) PORT_NAME("Service") |
| 202 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_0) PORT_NAME("Reset Button") |
| 203 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) |
| 204 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_A) PORT_NAME("Unknown 1") |
| 205 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) // coin 1 not incrementing and hang the game |
| 206 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_NAME("Unknown 2") |
| 207 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) |
| 208 | |
| 209 | PORT_START("DSW1") |
| 210 | PORT_DIPNAME( 0x07, 0x03, "Coinage A (100 Y)" ) PORT_DIPLOCATION("DSW1:1,2,3") |
| 211 | PORT_DIPSETTING( 0x02, "1 Coin / 3 Medal" ) |
| 212 | PORT_DIPSETTING( 0x06, "1 Coin / 4 Medal" ) |
| 213 | PORT_DIPSETTING( 0x01, "1 Coin / 5 Medal" ) |
| 214 | PORT_DIPSETTING( 0x05, "1 Coin / 6 Medal" ) |
| 215 | PORT_DIPSETTING( 0x03, "1 Coin / 10 Medal" ) |
| 216 | PORT_DIPSETTING( 0x07, "1 Coin / 11 Medal" ) |
| 217 | PORT_DIPSETTING( 0x04, "1 Coin / 20 Medal" ) |
| 218 | PORT_DIPSETTING( 0x00, "1 Coin / 50 Medal" ) |
| 219 | PORT_DIPNAME( 0x18, 0x08, "Coinage B (10 Y)" ) PORT_DIPLOCATION("DSW1:4,5") |
| 220 | PORT_DIPSETTING( 0x00, "3 Coin / 1 Medal" ) |
| 221 | PORT_DIPSETTING( 0x10, "2 Coin / 1 Medal" ) |
| 222 | PORT_DIPSETTING( 0x18, "1 Coin / 1 Medal" ) |
| 223 | PORT_DIPSETTING( 0x08, "1 Coin / 2 Medal" ) |
| 224 | PORT_DIPNAME( 0x20, 0x20, "Service Coinage" ) PORT_DIPLOCATION("DSW1:6") |
| 225 | PORT_DIPSETTING( 0x20, "1 Pulse / 1 Medal" ) |
| 226 | PORT_DIPSETTING( 0x00, "1 Pulse / 2 Medal" ) |
| 227 | PORT_DIPNAME( 0x40, 0x00, "Payout Mode" ) PORT_DIPLOCATION("DSW1:7") |
| 228 | PORT_DIPSETTING( 0x40, "Manual" ) |
| 229 | PORT_DIPSETTING( 0x00, "Automatic" ) |
| 230 | PORT_DIPNAME( 0x80, 0x00, "Repeat Bet") PORT_DIPLOCATION("DSW1:8") |
| 231 | PORT_DIPSETTING( 0x80, DEF_STR( No ) ) |
| 232 | PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) |
| 233 | |
| 234 | PORT_START("DSW2") |
| 235 | PORT_DIPNAME( 0x07, 0x01, "Percentage" ) PORT_DIPLOCATION("DSW2:1,2,3") |
| 236 | PORT_DIPSETTING( 0x07, "50%" ) |
| 237 | PORT_DIPSETTING( 0x03, "60%" ) |
| 238 | PORT_DIPSETTING( 0x05, "70%" ) |
| 239 | PORT_DIPSETTING( 0x01, "75%" ) |
| 240 | PORT_DIPSETTING( 0x06, "80%" ) |
| 241 | PORT_DIPSETTING( 0x02, "85%" ) |
| 242 | PORT_DIPSETTING( 0x04, "90%" ) |
| 243 | PORT_DIPSETTING( 0x00, "95%" ) |
| 244 | PORT_DIPNAME( 0x08, 0x08, "Winwave" ) PORT_DIPLOCATION("DSW2:4") |
| 245 | PORT_DIPSETTING( 0x08, "Small" ) |
| 246 | PORT_DIPSETTING( 0x00, "Big" ) |
| 247 | PORT_DIPNAME( 0x10, 0x10, "M.Medal" ) PORT_DIPLOCATION("DSW2:5") |
| 248 | PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) |
| 249 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 250 | PORT_DIPNAME( 0x60, 0x60, "HG" ) PORT_DIPLOCATION("DSW2:6,7") |
| 251 | PORT_DIPSETTING( 0x60, "10-1" ) |
| 252 | PORT_DIPSETTING( 0x20, "20-1" ) |
| 253 | PORT_DIPSETTING( 0x40, "50-1" ) |
| 254 | PORT_DIPSETTING( 0x00, "100-1" ) |
| 255 | PORT_DIPNAME( 0x80, 0x80, "Bet Max" ) PORT_DIPLOCATION("DSW2:8") |
| 256 | PORT_DIPSETTING( 0x80, "5" ) |
| 257 | PORT_DIPSETTING( 0x00, "10" ) |
| 258 | |
| 259 | INPUT_PORTS_END |
| 260 | |
| 261 | |
| 262 | /************************************************* |
| 263 | * Machine Start & Reset Routines * |
| 264 | *************************************************/ |
| 265 | |
| 266 | void kurukuru_state::machine_start() |
| 267 | { |
| 268 | membank("bank1")->configure_entries(0, 4, memregion("maincpu")->base(), 0x8000); |
| 269 | } |
| 270 | |
| 271 | void kurukuru_state::machine_reset() |
| 272 | { |
| 273 | //membank("bank1")->set_entry(2); |
| 274 | } |
| 275 | |
| 276 | |
| 277 | /************************************************* |
| 278 | * R/W Handlers and Interrupt Routines * |
| 279 | *************************************************/ |
| 280 | |
| 281 | TIMER_DEVICE_CALLBACK_MEMBER(kurukuru_state::kurukuru_interrupt) |
| 282 | { |
| 283 | m_v9938->set_resolution(0); |
| 284 | m_v9938->interrupt(); |
| 285 | } |
| 286 | |
| 287 | |
| 288 | /************************************************* |
| 289 | * Sound Interfaces * |
| 290 | *************************************************/ |
| 291 | |
| 292 | static const ay8910_interface ay8910_intf = |
| 293 | { |
| 294 | AY8910_LEGACY_OUTPUT, |
| 295 | AY8910_DEFAULT_LOADS, |
| 296 | DEVCB_UNMAPPED, |
| 297 | DEVCB_UNMAPPED, |
| 298 | DEVCB_UNMAPPED, // some writes... |
| 299 | DEVCB_UNMAPPED // some writes... |
| 300 | }; |
| 301 | |
| 302 | |
| 303 | /************************************************* |
| 304 | * Machine Driver * |
| 305 | *************************************************/ |
| 306 | |
| 307 | static MACHINE_CONFIG_START( kurukuru, kurukuru_state ) |
| 308 | |
| 309 | /* basic machine hardware */ |
| 310 | MCFG_CPU_ADD("maincpu",Z80,MAIN_CLOCK/6) |
| 311 | MCFG_CPU_PROGRAM_MAP(kurukuru_map) |
| 312 | MCFG_CPU_IO_MAP(kurukuru_io) |
| 313 | MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kurukuru_state, kurukuru_interrupt, "screen", 0, 1) |
| 314 | |
| 315 | MCFG_CPU_ADD("audiocpu", Z80, MAIN_CLOCK/6) |
| 316 | MCFG_CPU_PROGRAM_MAP(audio_map) |
| 317 | MCFG_CPU_IO_MAP(audio_io) |
| 318 | // need interrupts... |
| 319 | |
| 320 | MCFG_NVRAM_ADD_0FILL("nvram") |
| 321 | |
| 322 | |
| 323 | /* video hardware */ |
| 324 | MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) |
| 325 | |
| 326 | MCFG_V9938_ADD("v9938", "screen", VDP_MEM) |
| 327 | MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(kurukuru_vdp0_interrupt) |
| 328 | |
| 329 | MCFG_SCREEN_ADD("screen",RASTER) |
| 330 | MCFG_SCREEN_REFRESH_RATE(60) |
| 331 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) |
| 332 | |
| 333 | MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, MSX2_TOTAL_YRES_PIXELS) |
| 334 | MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1) |
| 335 | MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update) |
| 336 | |
| 337 | MCFG_PALETTE_LENGTH(512) |
| 338 | MCFG_PALETTE_INIT( v9938 ) |
| 339 | |
| 340 | /* sound hardware */ |
| 341 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 342 | MCFG_SOUND_ADD("aysnd", YM2149, MAIN_CLOCK/12) |
| 343 | MCFG_SOUND_CONFIG(ay8910_intf) |
| 344 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) |
| 345 | MACHINE_CONFIG_END |
| 346 | |
| 347 | |
| 348 | /*************************************************************************** |
| 349 | |
| 350 | Game driver(s) |
| 351 | |
| 352 | ***************************************************************************/ |
| 353 | |
| 354 | ROM_START( kurukuru ) |
| 355 | ROM_REGION( 0x28000, "maincpu", 0 ) |
| 356 | ROM_LOAD( "kp_17l.ic17", 0x00000, 0x08000, CRC(9b552ebc) SHA1(07d0e62b7fdad381963a345376b72ad31eb7b96d) ) // program code |
| 357 | ROM_LOAD( "10.ic10", 0x08000, 0x10000, CRC(3d6012bc) SHA1(2764f70e0e0bef3f2f71dd6c78e0a4189057beca) ) // title + text + ingame gfx |
| 358 | ROM_LOAD( "18.ic18", 0x18000, 0x10000, CRC(afb13c6a) SHA1(ac3cd40fad081f7a2b3d1fc72ea96282b9d1f4a3) ) // big frog gfx |
| 359 | |
| 360 | ROM_REGION( 0x10000, "audiocpu", 0 ) |
| 361 | ROM_LOAD( "4.ic4", 0x00000, 0x10000, CRC(85d86f32) SHA1(f2aa93d702e6577f8f2204c74c44ac26d05be699) ) // code & adpcm samples |
| 362 | |
| 363 | ROM_REGION( 0x800, "plds", 0 ) |
| 364 | ROM_LOAD( "51.ic26", 0x0000, 0x0104, CRC(ce4a601b) SHA1(07f5bbb327b220e5846927cbb91149174dd07b36) ) |
| 365 | ROM_LOAD( "52.ic27", 0x0200, 0x0104, CRC(e23296a5) SHA1(4747923d201fcc5e0e752acbf50b41f0414e4ca8) ) |
| 366 | ROM_LOAD( "53.ic12", 0x0400, 0x0104, CRC(2ac654f2) SHA1(18668c73781a55dcffc4bf4c107026b0e72a75d1) ) |
| 367 | ROM_LOAD( "7908b-4.ic32", 0x0600, 0x0034, CRC(bddf925e) SHA1(861cf5966444d0c0392241e5cfa08db475fb439a) ) |
| 368 | ROM_END |
| 369 | |
| 370 | |
| 371 | /* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */ |
| 372 | GAME( 199?, kurukuru, 0, kurukuru, kurukuru, driver_device, 0, ROT0, "Success / Taiyo Jidoki", "Kuru Kuru Pyon Pyon (Japan)", GAME_IMPERFECT_SOUND ) |