trunk/src/mess/machine/s100_dj2db.c
| r19191 | r19192 | |
| 78 | 78 | // wd17xx_interface fdc_intf |
| 79 | 79 | //------------------------------------------------- |
| 80 | 80 | |
| 81 | | WRITE_LINE_MEMBER( s100_dj2db_device::fdc_intrq_w ) |
| 81 | static SLOT_INTERFACE_START( s100_dj2db_floppies ) |
| 82 | SLOT_INTERFACE( "8dsdd", FLOPPY_8_DSDD ) |
| 83 | SLOT_INTERFACE_END |
| 84 | |
| 85 | void s100_dj2db_device::fdc_intrq_w(bool state) |
| 82 | 86 | { |
| 83 | 87 | if (state) m_s100->rdy_w(CLEAR_LINE); |
| 84 | 88 | |
| r19191 | r19192 | |
| 96 | 100 | } |
| 97 | 101 | } |
| 98 | 102 | |
| 99 | | WRITE_LINE_MEMBER( s100_dj2db_device::fdc_drq_w ) |
| 103 | void s100_dj2db_device::fdc_drq_w(bool state) |
| 100 | 104 | { |
| 101 | 105 | if (state) m_s100->rdy_w(CLEAR_LINE); |
| 102 | 106 | } |
| 103 | 107 | |
| 104 | | static const wd17xx_interface fdc_intf = |
| 105 | | { |
| 106 | | DEVCB_NULL, |
| 107 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, s100_dj2db_device, fdc_intrq_w), |
| 108 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, s100_dj2db_device, fdc_drq_w), |
| 109 | | { FLOPPY_0, FLOPPY_1, NULL, NULL } |
| 110 | | }; |
| 111 | 108 | |
| 112 | | |
| 113 | 109 | //------------------------------------------------- |
| 114 | 110 | // MACHINE_CONFIG_FRAGMENT( s100_dj2db ) |
| 115 | 111 | //------------------------------------------------- |
| 116 | 112 | |
| 117 | 113 | static MACHINE_CONFIG_FRAGMENT( s100_dj2db ) |
| 118 | 114 | MCFG_COM8116_ADD(BR1941_TAG, XTAL_5_0688MHz, brg_intf) |
| 119 | | MCFG_MB8866_ADD(MB8866_TAG, fdc_intf) |
| 115 | MCFG_MB8866x_ADD(MB8866_TAG, 1000000 *8) // ? |
| 116 | |
| 117 | MCFG_FLOPPY_DRIVE_ADD(MB8866_TAG":0", s100_dj2db_floppies, "8dsdd", NULL, floppy_image_device::default_floppy_formats) |
| 118 | MCFG_FLOPPY_DRIVE_ADD(MB8866_TAG":1", s100_dj2db_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) |
| 119 | MCFG_FLOPPY_DRIVE_ADD(MB8866_TAG":2", s100_dj2db_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) |
| 120 | MCFG_FLOPPY_DRIVE_ADD(MB8866_TAG":3", s100_dj2db_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) |
| 120 | 121 | MACHINE_CONFIG_END |
| 121 | 122 | |
| 122 | 123 | |
| r19191 | r19192 | |
| 260 | 261 | device_s100_card_interface(mconfig, *this), |
| 261 | 262 | m_fdc(*this, MB8866_TAG), |
| 262 | 263 | m_dbrg(*this, BR1941_TAG), |
| 264 | m_floppy0(*this, MB8866_TAG":0"), |
| 265 | m_floppy1(*this, MB8866_TAG":1"), |
| 266 | m_floppy2(*this, MB8866_TAG":2"), |
| 267 | m_floppy3(*this, MB8866_TAG":3"), |
| 263 | 268 | m_drive(0), |
| 264 | 269 | m_head(1), |
| 265 | 270 | m_int_enbl(0), |
| r19191 | r19192 | |
| 281 | 286 | m_rom = memregion("dj2db")->base(); |
| 282 | 287 | m_ram = auto_alloc_array(machine(), UINT8, 0x400); |
| 283 | 288 | |
| 284 | | // find floppy devices |
| 285 | | m_floppy0 = machine().device(FLOPPY_0); |
| 286 | | m_floppy1 = machine().device(FLOPPY_1); |
| 289 | // floppy callbacks |
| 290 | m_fdc->setup_intrq_cb(fd1791_t::line_cb(FUNC(s100_dj2db_device::fdc_intrq_w), this)); |
| 291 | m_fdc->setup_drq_cb(fd1791_t::line_cb(FUNC(s100_dj2db_device::fdc_drq_w), this)); |
| 287 | 292 | |
| 288 | 293 | // state saving |
| 289 | 294 | //save_item(NAME()); |
| r19191 | r19192 | |
| 353 | 358 | */ |
| 354 | 359 | |
| 355 | 360 | data |= !m_head; |
| 356 | | data |= !wd17xx_drq_r(m_fdc) << 1; |
| 357 | | data |= !wd17xx_intrq_r(m_fdc) << 2; |
| 358 | | |
| 359 | | device_t *floppy = m_drive ? m_floppy1 : m_floppy0; |
| 360 | | data |= floppy_twosid_r(floppy) << 3; |
| 361 | | data |= floppy_index_r(floppy) << 4; |
| 362 | | data |= floppy_ready_r(floppy) << 7; |
| 361 | data |= !m_fdc->drq_r() << 1; |
| 362 | data |= !m_fdc->intrq_r() << 2; |
| 363 | data |= (m_floppy ? m_floppy->twosid_r() : 1) << 3; |
| 364 | data |= (m_floppy ? m_floppy->idx_r() : 1) << 4; |
| 365 | data |= (m_floppy ? m_floppy->ready_r() : 1) << 7; |
| 363 | 366 | } |
| 364 | 367 | else if ((offset >= 0xfbfc) && (offset < 0xfc00)) |
| 365 | 368 | { |
| 366 | 369 | m_s100->rdy_w(ASSERT_LINE); |
| 367 | 370 | |
| 368 | | data = wd17xx_r(m_fdc, space, offset & 0x03); |
| 371 | data = m_fdc->gen_r(offset & 0x03); |
| 369 | 372 | } |
| 370 | 373 | else if ((offset >= 0xfc00) && (offset < 0x10000)) |
| 371 | 374 | { |
| r19191 | r19192 | |
| 414 | 417 | */ |
| 415 | 418 | |
| 416 | 419 | // drive select |
| 417 | | if (BIT(data, 0)) m_drive = 0; |
| 418 | | if (BIT(data, 1)) m_drive = 1; |
| 419 | | //if (BIT(data, 2)) m_drive = 2; |
| 420 | | //if (BIT(data, 3)) m_drive = 3; |
| 421 | | wd17xx_set_drive(m_fdc, m_drive); |
| 422 | | floppy_mon_w(m_floppy0, CLEAR_LINE); |
| 423 | | floppy_mon_w(m_floppy1, CLEAR_LINE); |
| 420 | m_floppy = NULL; |
| 424 | 421 | |
| 422 | if (BIT(data, 0)) m_floppy = m_floppy0->get_device(); |
| 423 | if (BIT(data, 1)) m_floppy = m_floppy1->get_device(); |
| 424 | if (BIT(data, 2)) m_floppy = m_floppy2->get_device(); |
| 425 | if (BIT(data, 3)) m_floppy = m_floppy3->get_device(); |
| 426 | |
| 427 | m_fdc->set_floppy(m_floppy); |
| 428 | |
| 425 | 429 | // side select |
| 426 | | wd17xx_set_side(m_fdc, BIT(data, 4)); |
| 430 | if (m_floppy) |
| 431 | { |
| 432 | m_floppy->ss_w(BIT(data, 4)); |
| 433 | m_floppy->mon_w(0); |
| 434 | } |
| 427 | 435 | |
| 428 | 436 | // interrupt enable |
| 429 | 437 | m_int_enbl = BIT(data, 5); |
| r19191 | r19192 | |
| 432 | 440 | m_access_enbl = BIT(data, 6); |
| 433 | 441 | |
| 434 | 442 | // master reset |
| 435 | | wd17xx_mr_w(m_fdc, BIT(data, 7)); |
| 443 | if (!BIT(data, 7)) m_fdc->reset(); |
| 436 | 444 | } |
| 437 | 445 | else if (offset == 0xfbfa) // FUNCTION SEL |
| 438 | 446 | { |
| r19191 | r19192 | |
| 452 | 460 | */ |
| 453 | 461 | |
| 454 | 462 | // density select |
| 455 | | wd17xx_dden_w(m_fdc, BIT(data, 0)); |
| 463 | m_fdc->dden_w(BIT(data, 0)); |
| 456 | 464 | } |
| 457 | 465 | else if (offset == 0xfbfb) // WAIT ENBL |
| 458 | 466 | { |
| 459 | 467 | } |
| 460 | 468 | else if ((offset >= 0xfbfc) && (offset < 0xfc00)) |
| 461 | 469 | { |
| 462 | | wd17xx_w(m_fdc, space, offset & 0x03, data); |
| 470 | m_fdc->gen_w(offset & 0x03, data); |
| 463 | 471 | } |
| 464 | 472 | else if ((offset >= 0xfc00) && (offset < 0x10000)) |
| 465 | 473 | { |