src/mess/drivers/mz2500.c
| r7663 | r7664 | |
| 29 | 29 | #include "cpu/z80/z80.h" |
| 30 | 30 | #include "machine/z80pio.h" |
| 31 | 31 | #include "machine/wd17xx.h" |
| 32 | #include "sound/2203intf.h" |
| 33 | |
| 32 | 34 | //#include "devices/cassette.h" |
| 33 | 35 | #include "devices/flopdrv.h" |
| 34 | 36 | #include "formats/flopimg.h" |
| r7663 | r7664 | |
| 272 | 274 | irq_vector[3] = data; //RP5c15 |
| 273 | 275 | } |
| 274 | 276 | |
| 277 | #if 0 |
| 275 | 278 | static READ8_HANDLER( mz2500_fdc_r ) |
| 276 | 279 | { |
| 277 | 280 | running_device* dev = devtag_get_device(space->machine,"fdc"); |
| r7663 | r7664 | |
| 291 | 294 | |
| 292 | 295 | return 0xff; |
| 293 | 296 | } |
| 297 | #endif |
| 294 | 298 | |
| 295 | 299 | static WRITE8_HANDLER( mz2500_fdc_w ) |
| 296 | 300 | { |
| 297 | | running_device* dev = devtag_get_device(space->machine,"fdc"); |
| 301 | running_device* dev = devtag_get_device(space->machine,"mb8877a"); |
| 298 | 302 | |
| 299 | | switch(offset+0xd8) |
| 303 | switch(offset+0xdc) |
| 300 | 304 | { |
| 305 | #if 0 |
| 301 | 306 | case 0xd8: |
| 302 | 307 | wd17xx_command_w(dev,offset,data); |
| 303 | 308 | break; |
| r7663 | r7664 | |
| 310 | 315 | case 0xdb: |
| 311 | 316 | wd17xx_data_w(dev,offset,data); |
| 312 | 317 | break; |
| 318 | #endif |
| 313 | 319 | case 0xdc: |
| 314 | 320 | wd17xx_set_drive(dev,data & 3); |
| 315 | | floppy_mon_w(floppy_get_device(space->machine, data & 3), data & 0x80); |
| 316 | | floppy_drive_set_ready_state(floppy_get_device(space->machine, data & 3), data & 0x80,0); |
| 321 | floppy_mon_w(floppy_get_device(space->machine, data & 3), (data & 0x80) ? ASSERT_LINE : CLEAR_LINE); |
| 322 | floppy_drive_set_ready_state(floppy_get_device(space->machine, data & 3), 1,1); |
| 317 | 323 | break; |
| 318 | 324 | case 0xdd: |
| 319 | 325 | wd17xx_set_side(dev,(data & 1)); |
| r7663 | r7664 | |
| 371 | 377 | } |
| 372 | 378 | #endif |
| 373 | 379 | |
| 380 | static UINT32 rom_index; |
| 381 | |
| 382 | static READ8_HANDLER( mz2500_rom_r ) |
| 383 | { |
| 384 | UINT8 *rom = memory_region(space->machine, "rom"); |
| 385 | UINT8 res; |
| 386 | |
| 387 | res = rom[rom_index]; |
| 388 | rom_index++; |
| 389 | |
| 390 | return res; |
| 391 | } |
| 392 | |
| 393 | static WRITE8_HANDLER( mz2500_rom_w ) |
| 394 | { |
| 395 | // printf("%02x\n",data); |
| 396 | rom_index = (data << 8) | (rom_index & 0xff00ff); |
| 397 | //printf("%02x\n",data); |
| 398 | } |
| 399 | |
| 374 | 400 | static ADDRESS_MAP_START(mz2500_io, ADDRESS_SPACE_IO, 8) |
| 375 | 401 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 376 | 402 | // AM_RANGE(0x60, 0x63) AM_WRITE(w3100a_w) |
| 377 | 403 | // AM_RANGE(0x63, 0x63) AM_READ(w3100a_r) |
| 378 | 404 | // AM_RANGE(0xa0, 0xa3) AM_READWRITE(sio_r,sio_w) |
| 379 | 405 | // AM_RANGE(0xa4, 0xa5) AM_READWRITE(sasi_r, sasi_w) |
| 380 | | // AM_RANGE(0xa8, 0xa8) AM_WRITE(rom_w) |
| 381 | | // AM_RANGE(0xa9, 0xa9) AM_READ(rom_r) |
| 406 | AM_RANGE(0xa8, 0xa8) AM_WRITE(mz2500_rom_w) |
| 407 | AM_RANGE(0xa9, 0xa9) AM_READ(mz2500_rom_r) |
| 382 | 408 | // AM_RANGE(0xac, 0xad) AM_WRITE(emm_w) |
| 383 | 409 | // AM_RANGE(0xad, 0xad) AM_READ(emm_r) |
| 384 | 410 | // AM_RANGE(0xae, 0xae) AM_WRITE(crtc_w) |
| r7663 | r7664 | |
| 389 | 415 | // AM_RANGE(0xbc, 0xbd) AM_READWRITE(crtc_r,crtc_w) |
| 390 | 416 | AM_RANGE(0xc6, 0xc6) AM_WRITE(mz2500_irq_sel_w) |
| 391 | 417 | AM_RANGE(0xc7, 0xc7) AM_WRITE(mz2500_irq_data_w) |
| 392 | | // AM_RANGE(0xc8, 0xc9) AM_READWRITE(opn_r,opn_w) |
| 393 | | // AM_RANGE(0xc8, 0xc9) AM_READ(kludge_r) |
| 418 | AM_RANGE(0xc8, 0xc9) AM_DEVREADWRITE("ym", ym2203_r, ym2203_w) |
| 394 | 419 | // AM_RANGE(0xca, 0xca) AM_READWRITE(voice_r,voice_w) |
| 395 | 420 | // AM_RANGE(0xcc, 0xcc) AM_READWRITE(calendar_r,calendar_w) |
| 396 | 421 | // AM_RANGE(0xce, 0xce) AM_WRITE(mz2500_dictionary_bank_w) |
| 397 | 422 | AM_RANGE(0xcf, 0xcf) AM_WRITE(mz2500_kanji_bank_w) |
| 398 | | AM_RANGE(0xd8, 0xdd) AM_READWRITE(mz2500_fdc_r,mz2500_fdc_w) |
| 423 | AM_RANGE(0xd8, 0xdb) AM_DEVREADWRITE("mb8877a", wd17xx_r, wd17xx_w) |
| 424 | AM_RANGE(0xdc, 0xdd) AM_WRITE(mz2500_fdc_w) |
| 399 | 425 | AM_RANGE(0xe0, 0xe1) AM_DEVREADWRITE("z80pio_0", z80pio_c_r, z80pio_c_w) |
| 400 | 426 | AM_RANGE(0xe2, 0xe3) AM_DEVREADWRITE("z80pio_0", z80pio_d_r, z80pio_d_w) |
| 401 | 427 | // AM_RANGE(0xe4, 0xe7) AM_READWRITE(pit_r,pit_w) |
| r7663 | r7664 | |
| 409 | 435 | |
| 410 | 436 | /* Input ports */ |
| 411 | 437 | static INPUT_PORTS_START( mz2500 ) |
| 438 | PORT_START("DSW0") |
| 439 | PORT_DIPNAME( 0x01, 0x00, "DSW0" ) |
| 440 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 441 | PORT_DIPSETTING( 0x01, DEF_STR( On ) ) |
| 442 | PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) |
| 443 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 444 | PORT_DIPSETTING( 0x02, DEF_STR( On ) ) |
| 445 | PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) |
| 446 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 447 | PORT_DIPSETTING( 0x04, DEF_STR( On ) ) |
| 448 | PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) |
| 449 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 450 | PORT_DIPSETTING( 0x08, DEF_STR( On ) ) |
| 451 | PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) |
| 452 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 453 | PORT_DIPSETTING( 0x10, DEF_STR( On ) ) |
| 454 | PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) |
| 455 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 456 | PORT_DIPSETTING( 0x20, DEF_STR( On ) ) |
| 457 | PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) |
| 458 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 459 | PORT_DIPSETTING( 0x40, DEF_STR( On ) ) |
| 460 | PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) |
| 461 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 462 | PORT_DIPSETTING( 0x80, DEF_STR( On ) ) |
| 463 | |
| 464 | PORT_START("DSW1") |
| 465 | PORT_DIPNAME( 0x01, 0x00, "DSW1" ) |
| 466 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 467 | PORT_DIPSETTING( 0x01, DEF_STR( On ) ) |
| 468 | PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) |
| 469 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 470 | PORT_DIPSETTING( 0x02, DEF_STR( On ) ) |
| 471 | PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) |
| 472 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 473 | PORT_DIPSETTING( 0x04, DEF_STR( On ) ) |
| 474 | PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) |
| 475 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 476 | PORT_DIPSETTING( 0x08, DEF_STR( On ) ) |
| 477 | PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) |
| 478 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 479 | PORT_DIPSETTING( 0x10, DEF_STR( On ) ) |
| 480 | PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) |
| 481 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 482 | PORT_DIPSETTING( 0x20, DEF_STR( On ) ) |
| 483 | PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) |
| 484 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 485 | PORT_DIPSETTING( 0x40, DEF_STR( On ) ) |
| 486 | PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) |
| 487 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 488 | PORT_DIPSETTING( 0x80, DEF_STR( On ) ) |
| 412 | 489 | INPUT_PORTS_END |
| 413 | 490 | |
| 414 | 491 | |
| r7663 | r7664 | |
| 561 | 638 | DEVCB_NULL |
| 562 | 639 | }; |
| 563 | 640 | |
| 641 | static const ym2203_interface ym2203_interface_1 = |
| 642 | { |
| 643 | { |
| 644 | AY8910_LEGACY_OUTPUT, |
| 645 | AY8910_DEFAULT_LOADS, |
| 646 | DEVCB_INPUT_PORT("DSW0"), // read A |
| 647 | DEVCB_INPUT_PORT("DSW1"), // read B |
| 648 | DEVCB_NULL, // write A |
| 649 | DEVCB_NULL // write B |
| 650 | }, |
| 651 | NULL |
| 652 | }; |
| 564 | 653 | |
| 565 | 654 | static MACHINE_DRIVER_START( mz2500 ) |
| 566 | 655 | /* basic machine hardware */ |
| r7663 | r7664 | |
| 574 | 663 | MDRV_Z80PIO_ADD( "z80pio_0", 6000000/4, mz2500_pio0_intf ) // unknown clock / divider |
| 575 | 664 | MDRV_Z80PIO_ADD( "z80pio_1", 6000000/4, mz2500_pio1_intf ) |
| 576 | 665 | |
| 577 | | MDRV_MB8877_ADD("fdc",mz2500_mb8877a_interface) |
| 666 | MDRV_MB8877_ADD("mb8877a",mz2500_mb8877a_interface) |
| 578 | 667 | MDRV_FLOPPY_4_DRIVES_ADD(mz2500_floppy_config) |
| 579 | 668 | |
| 580 | 669 | |
| r7663 | r7664 | |
| 589 | 678 | |
| 590 | 679 | MDRV_VIDEO_START(mz2500) |
| 591 | 680 | MDRV_VIDEO_UPDATE(mz2500) |
| 681 | |
| 682 | MDRV_SPEAKER_STANDARD_MONO("mono") |
| 683 | |
| 684 | MDRV_SOUND_ADD("ym", YM2203, 6000000/4) //unknown clock / divider |
| 685 | MDRV_SOUND_CONFIG(ym2203_interface_1) |
| 686 | MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) |
| 592 | 687 | MACHINE_DRIVER_END |
| 593 | 688 | |
| 594 | 689 | |
| r7663 | r7664 | |
| 611 | 706 | ROM_LOAD( "dict.rom", 0x00000, 0x40000, CRC(aa957c2b) SHA1(19a5ba85055f048a84ed4e8d471aaff70fcf0374) ) |
| 612 | 707 | |
| 613 | 708 | ROM_REGION( 0x2000, "pcg", ROMREGION_ERASEFF ) |
| 709 | |
| 710 | ROM_REGION( 0x8000, "rom", ROMREGION_ERASEFF ) |
| 711 | ROM_LOAD( "file.rom", 0x00000, 0x8000, CRC(a7bf39ce) SHA1(3f4a237fc4f34bac6fe2bbda4ce4d16d42400081) ) //optional? |
| 614 | 712 | ROM_END |
| 615 | 713 | |
| 616 | 714 | /* Driver */ |