trunk/src/emu/bus/msx_cart/disk.h
| r31616 | r31617 | |
| 11 | 11 | extern const device_type MSX_CART_VY0010; |
| 12 | 12 | extern const device_type MSX_CART_FSFD1; |
| 13 | 13 | extern const device_type MSX_CART_FSFD1A; |
| 14 | extern const device_type MSX_CART_FSCF351; |
| 14 | 15 | |
| 15 | 16 | |
| 16 | 17 | class msx_cart_disk : public device_t |
| r31616 | r31617 | |
| 63 | 64 | }; |
| 64 | 65 | |
| 65 | 66 | |
| 67 | class msx_cart_disk_type2 : public msx_cart_disk_wd |
| 68 | { |
| 69 | public: |
| 70 | msx_cart_disk_type2(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname); |
| 71 | |
| 72 | // device-level overrides |
| 73 | virtual void device_start(); |
| 74 | virtual void device_reset(); |
| 75 | |
| 76 | virtual DECLARE_READ8_MEMBER(read_cart); |
| 77 | virtual DECLARE_WRITE8_MEMBER(write_cart); |
| 78 | |
| 79 | void post_load(); |
| 80 | |
| 81 | protected: |
| 82 | UINT8 m_control; |
| 83 | |
| 84 | void set_control(UINT8 data); |
| 85 | }; |
| 86 | |
| 87 | |
| 66 | 88 | class msx_cart_vy0010 : public msx_cart_disk_type1 |
| 67 | 89 | { |
| 68 | 90 | public: |
| r31616 | r31617 | |
| 81 | 103 | }; |
| 82 | 104 | |
| 83 | 105 | |
| 106 | class msx_cart_fscf351 : public msx_cart_disk_type2 |
| 107 | { |
| 108 | public: |
| 109 | msx_cart_fscf351(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 110 | |
| 111 | virtual machine_config_constructor device_mconfig_additions() const; |
| 112 | }; |
| 113 | |
| 114 | |
| 84 | 115 | class msx_cart_disk_tc8566 : public msx_cart_disk |
| 85 | 116 | { |
| 86 | 117 | public: |
trunk/src/emu/bus/msx_cart/cartridge.c
| r31616 | r31617 | |
| 39 | 39 | SLOT_INTERFACE_INTERNAL("superloderunner", MSX_CART_SUPERLODERUNNER) |
| 40 | 40 | SLOT_INTERFACE_INTERNAL("synthesizer", MSX_CART_SYNTHESIZER) |
| 41 | 41 | SLOT_INTERFACE_INTERNAL("cross_blaim", MSX_CART_CROSSBLAIM) |
| 42 | | // SLOT_INTERFACE_INTERNAL("disk_rom", MSX_CART_DISK_ROM) |
| 43 | 42 | SLOT_INTERFACE_INTERNAL("korean_80in1", MSX_CART_KOREAN_80IN1) |
| 44 | 43 | SLOT_INTERFACE_INTERNAL("korean_90in1", MSX_CART_KOREAN_90IN1) |
| 45 | 44 | SLOT_INTERFACE_INTERNAL("korean_126in1", MSX_CART_KOREAN_126IN1) |
| r31616 | r31617 | |
| 58 | 57 | SLOT_INTERFACE_INTERNAL("disk_vy0010", MSX_CART_VY0010) |
| 59 | 58 | SLOT_INTERFACE_INTERNAL("disk_fsfd1", MSX_CART_FSFD1) |
| 60 | 59 | SLOT_INTERFACE_INTERNAL("disk_fsfd1a", MSX_CART_FSFD1A) |
| 60 | SLOT_INTERFACE_INTERNAL("disk_fscf351", MSX_CART_FSCF351) |
| 61 | 61 | SLOT_INTERFACE("bm_012", MSX_CART_BM_012) |
| 62 | 62 | SLOT_INTERFACE_END |
| 63 | 63 | |
trunk/src/emu/bus/msx_cart/disk.c
| r31616 | r31617 | |
| 3 | 3 | * MSX Floopy drive interface add-on cartridges |
| 4 | 4 | * |
| 5 | 5 | * Currently supported: |
| 6 | | * - Philips VY-0010 (Interface cartridge + 1 3.5" SS floppy drive) |
| 6 | * - National FS-CF351 + FS-FD351 - MB8877A - DSDD 3.5" Floppy drive + interface |
| 7 | 7 | * - Panasonic FS-FD1 - WD2793? - DSDD 3.5" Floppy drive + interface |
| 8 | 8 | * - Panasonic FS-FD1A - TC8566F - DSDD 3.5" Floppy drive with builtin interface |
| 9 | 9 | * - Rom label reads: "FDC BIOS V1.0 / COPYRIGHT MEI / 1987 DASFD1AA1" |
| 10 | * - Philips VY-0010 (Interface cartridge + 1 3.5" SS floppy drive) |
| 10 | 11 | * |
| 11 | 12 | * Not supported yet: |
| 12 | 13 | * - Canon VF-100 - DSDD 3.5" Floppy drive + interface + 1 floppy disk containing MSX-DOS |
| 13 | | * - National FS-FD351 - MB8877A - DSDD 3.5" Floppy drive + interface |
| 14 | 14 | * - Talent DPF-550/5 - WD1772 - DSDD 5.25" Floppy drive (360KB) plus interface (manufactured by Daewoo) |
| 15 | 15 | * - Rom label markings: MSX DISK / DPF 555D |
| 16 | 16 | * |
| r31616 | r31617 | |
| 106 | 106 | const device_type MSX_CART_VY0010 = &device_creator<msx_cart_vy0010>; |
| 107 | 107 | const device_type MSX_CART_FSFD1 = &device_creator<msx_cart_fsfd1>; |
| 108 | 108 | const device_type MSX_CART_FSFD1A = &device_creator<msx_cart_fsfd1a>; |
| 109 | const device_type MSX_CART_FSCF351 = &device_creator<msx_cart_fscf351>; |
| 109 | 110 | |
| 110 | 111 | |
| 111 | 112 | FLOPPY_FORMATS_MEMBER( msx_cart_disk::floppy_formats ) |
| r31616 | r31617 | |
| 142 | 143 | { |
| 143 | 144 | } |
| 144 | 145 | |
| 146 | |
| 147 | msx_cart_disk_type2::msx_cart_disk_type2(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname) |
| 148 | : msx_cart_disk_wd(mconfig, type, name, tag, owner, clock, shortname) |
| 149 | , m_control(0) |
| 150 | { |
| 151 | } |
| 152 | |
| 153 | |
| 145 | 154 | msx_cart_vy0010::msx_cart_vy0010(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 146 | 155 | : msx_cart_disk_type1(mconfig, MSX_CART_VY0010, "MSX Cartridge - VY0010", tag, owner, clock, "msx_cart_vy0010") |
| 147 | 156 | { |
| r31616 | r31617 | |
| 154 | 163 | } |
| 155 | 164 | |
| 156 | 165 | |
| 166 | msx_cart_fscf351::msx_cart_fscf351(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 167 | : msx_cart_disk_type2(mconfig, MSX_CART_FSCF351, "MSX Cartridge - FS-CF351", tag, owner, clock, "msx_cart_fscf351") |
| 168 | { |
| 169 | } |
| 170 | |
| 171 | |
| 157 | 172 | msx_cart_disk_tc8566::msx_cart_disk_tc8566(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname) |
| 158 | 173 | : msx_cart_disk(mconfig, type, name, tag, owner, clock, shortname) |
| 159 | 174 | , m_fdc(*this, "fdc") |
| r31616 | r31617 | |
| 244 | 259 | } |
| 245 | 260 | |
| 246 | 261 | |
| 262 | static MACHINE_CONFIG_FRAGMENT( fscf351 ) |
| 263 | MCFG_MB8877x_ADD("fdc", XTAL_4MHz / 4) |
| 264 | MCFG_WD_FDC_FORCE_READY |
| 265 | |
| 266 | // Double sided 3.5" floppy drive |
| 267 | MCFG_FLOPPY_DRIVE_ADD("fdc:0", msx_floppies, "35dd", msx_cart_disk::floppy_formats) |
| 268 | |
| 269 | // Attach software lists |
| 270 | // We do not know in what kind of machine the user has inserted the floppy interface |
| 271 | // so we list all msx floppy software lists. |
| 272 | // |
| 273 | MCFG_SOFTWARE_LIST_ADD("flop_list","msx2_flop") |
| 274 | MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_flop_list","msx1_flop") |
| 275 | MACHINE_CONFIG_END |
| 276 | |
| 277 | |
| 278 | machine_config_constructor msx_cart_fscf351::device_mconfig_additions() const |
| 279 | { |
| 280 | return MACHINE_CONFIG_NAME( fscf351 ); |
| 281 | } |
| 282 | |
| 283 | |
| 247 | 284 | void msx_cart_disk_type1::device_start() |
| 248 | 285 | { |
| 249 | 286 | save_item(NAME(m_side_control)); |
| r31616 | r31617 | |
| 400 | 437 | } |
| 401 | 438 | |
| 402 | 439 | |
| 440 | void msx_cart_disk_type2::device_start() |
| 441 | { |
| 442 | save_item(NAME(m_control)); |
| 443 | |
| 444 | machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_disk_type2::post_load), this)); |
| 445 | } |
| 446 | |
| 447 | |
| 448 | void msx_cart_disk_type2::device_reset() |
| 449 | { |
| 450 | m_fdc->dden_w(false); |
| 451 | } |
| 452 | |
| 453 | |
| 454 | void msx_cart_disk_type2::post_load() |
| 455 | { |
| 456 | UINT8 data = m_control; |
| 457 | |
| 458 | // To make sure the FDD busy led status gets set correctly |
| 459 | m_control ^= 0x40; |
| 460 | |
| 461 | set_control(data); |
| 462 | } |
| 463 | |
| 464 | |
| 465 | void msx_cart_disk_type2::set_control(UINT8 data) |
| 466 | { |
| 467 | UINT8 old_m_control = m_control; |
| 468 | |
| 469 | m_control = data; |
| 470 | |
| 471 | switch (m_control & 3) |
| 472 | { |
| 473 | case 1: |
| 474 | m_floppy = m_floppy0 ? m_floppy0->get_device() : NULL; |
| 475 | break; |
| 476 | |
| 477 | case 2: |
| 478 | m_floppy = m_floppy1 ? m_floppy1->get_device() : NULL; |
| 479 | break; |
| 480 | |
| 481 | default: |
| 482 | m_floppy = NULL; |
| 483 | break; |
| 484 | } |
| 485 | |
| 486 | if (m_floppy) |
| 487 | { |
| 488 | m_floppy->mon_w((m_control & 0x08) ? 0 : 1); |
| 489 | m_floppy->ss_w((m_control & 0x04) ? 1 : 0); |
| 490 | } |
| 491 | |
| 492 | m_fdc->set_floppy(m_floppy); |
| 493 | |
| 494 | if ((old_m_control ^ m_control) & 0x40) |
| 495 | { |
| 496 | set_led_status(machine(), 0, !(m_control & 0x40)); |
| 497 | } |
| 498 | } |
| 499 | |
| 500 | |
| 501 | READ8_MEMBER(msx_cart_disk_type2::read_cart) |
| 502 | { |
| 503 | switch (offset) |
| 504 | { |
| 505 | case 0x7fb8: |
| 506 | case 0xbfb8: |
| 507 | return m_fdc->status_r(); |
| 508 | |
| 509 | case 0x7fb9: |
| 510 | case 0xbfb9: |
| 511 | return m_fdc->track_r(); |
| 512 | |
| 513 | case 0x7fba: |
| 514 | case 0xbfba: |
| 515 | return m_fdc->sector_r(); |
| 516 | |
| 517 | case 0x7fbb: |
| 518 | case 0xbfbb: |
| 519 | return m_fdc->data_r(); |
| 520 | |
| 521 | case 0x7fbc: |
| 522 | case 0xbfbc: |
| 523 | return 0x3f | (m_fdc->drq_r() ? 0 : 0x40) | (m_fdc->intrq_r() ? 0x80 : 0); |
| 524 | } |
| 525 | |
| 526 | if (offset >= 0x4000 && offset < 0x8000) |
| 527 | { |
| 528 | return get_rom_base()[offset & 0x3fff]; |
| 529 | } |
| 530 | return 0xff; |
| 531 | } |
| 532 | |
| 533 | |
| 534 | WRITE8_MEMBER(msx_cart_disk_type2::write_cart) |
| 535 | { |
| 536 | switch (offset) |
| 537 | { |
| 538 | case 0x7fb8: |
| 539 | case 0xbfb8: |
| 540 | m_fdc->cmd_w(data); |
| 541 | break; |
| 542 | |
| 543 | case 0x7fb9: |
| 544 | case 0xbfb9: |
| 545 | m_fdc->track_w(data); |
| 546 | break; |
| 547 | |
| 548 | case 0x7fba: |
| 549 | case 0xbfba: |
| 550 | m_fdc->sector_w(data); |
| 551 | break; |
| 552 | |
| 553 | case 0x7fbb: |
| 554 | case 0xbfbb: |
| 555 | m_fdc->data_w(data); |
| 556 | break; |
| 557 | |
| 558 | case 0x7fbc: |
| 559 | case 0xbfbc: |
| 560 | set_control(data); |
| 561 | break; |
| 562 | |
| 563 | default: |
| 564 | logerror("msx_cart_disk_type2::write_cart: Unmapped write writing %02x to %04x\n", data, offset); |
| 565 | break; |
| 566 | } |
| 567 | } |
| 568 | |
| 569 | |
| 570 | |
| 571 | |
| 403 | 572 | void msx_cart_fsfd1a::device_start() |
| 404 | 573 | { |
| 405 | 574 | } |