trunk/src/mess/machine/c8280.c
| r19194 | r19195 | |
| 93 | 93 | static ADDRESS_MAP_START( c8280_fdc_mem, AS_PROGRAM, 8, c8280_device ) |
| 94 | 94 | ADDRESS_MAP_GLOBAL_MASK(0x1fff) |
| 95 | 95 | AM_RANGE(0x0000, 0x007f) AM_MIRROR(0x300) AM_RAM |
| 96 | | AM_RANGE(0x0080, 0x0081) AM_MIRROR(0x37e) AM_DEVREADWRITE_LEGACY(WD1797_TAG, wd17xx_r, wd17xx_w) |
| 96 | AM_RANGE(0x0080, 0x0083) AM_MIRROR(0x37c) AM_DEVREADWRITE(WD1797_TAG, fd1797_t, read, write) |
| 97 | 97 | AM_RANGE(0x0400, 0x07ff) AM_RAM AM_SHARE("share1") |
| 98 | 98 | AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("share2") |
| 99 | 99 | AM_RANGE(0x0c00, 0x0fff) AM_RAM AM_SHARE("share3") |
| r19194 | r19195 | |
| 300 | 300 | // wd17xx_interface fdc_intf |
| 301 | 301 | //------------------------------------------------- |
| 302 | 302 | |
| 303 | | static const floppy_interface c8280_floppy_interface = |
| 303 | static SLOT_INTERFACE_START( c8280_floppies ) |
| 304 | SLOT_INTERFACE( "8ssdd", FLOPPY_8_SSDD ) |
| 305 | SLOT_INTERFACE_END |
| 306 | |
| 307 | void c8280_device::fdc_intrq_w(bool state) |
| 304 | 308 | { |
| 305 | | DEVCB_NULL, |
| 306 | | DEVCB_NULL, |
| 307 | | DEVCB_NULL, |
| 308 | | DEVCB_NULL, |
| 309 | | DEVCB_NULL, |
| 310 | | FLOPPY_STANDARD_8_DSDD, |
| 311 | | LEGACY_FLOPPY_OPTIONS_NAME(default), |
| 312 | | "floppy_8", |
| 313 | | NULL |
| 314 | | }; |
| 309 | m_fdccpu->set_input_line(M6502_IRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE); |
| 310 | } |
| 315 | 311 | |
| 316 | | static struct wd17xx_interface fdc_intf = |
| 312 | void c8280_device::fdc_drq_w(bool state) |
| 317 | 313 | { |
| 318 | | DEVCB_NULL, |
| 319 | | DEVCB_CPU_INPUT_LINE(M6502_FDC_TAG, M6502_IRQ_LINE), |
| 320 | | DEVCB_CPU_INPUT_LINE(M6502_FDC_TAG, M6502_SET_OVERFLOW), |
| 321 | | { FLOPPY_0, FLOPPY_1, NULL, NULL } |
| 322 | | }; |
| 314 | m_fdccpu->set_input_line(M6502_SET_OVERFLOW, state ? ASSERT_LINE : CLEAR_LINE); |
| 315 | } |
| 323 | 316 | |
| 324 | 317 | |
| 325 | 318 | //------------------------------------------------- |
| r19194 | r19195 | |
| 336 | 329 | MCFG_CPU_ADD(M6502_FDC_TAG, M6502, XTAL_12MHz/8) |
| 337 | 330 | MCFG_CPU_PROGRAM_MAP(c8280_fdc_mem) |
| 338 | 331 | |
| 339 | | MCFG_FD1797_ADD(WD1797_TAG, fdc_intf) |
| 332 | MCFG_FD1797x_ADD(WD1797_TAG, XTAL_12MHz/8 *8) // clock? |
| 340 | 333 | |
| 341 | | MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(c8280_floppy_interface) |
| 334 | MCFG_FLOPPY_DRIVE_ADD(WD1797_TAG":0", c8280_floppies, "8ssdd", NULL, floppy_image_device::default_floppy_formats) |
| 335 | MCFG_FLOPPY_DRIVE_ADD(WD1797_TAG":1", c8280_floppies, "8ssdd", NULL, floppy_image_device::default_floppy_formats) |
| 342 | 336 | MACHINE_CONFIG_END |
| 343 | 337 | |
| 344 | 338 | |
| r19194 | r19195 | |
| 389 | 383 | m_riot0(*this, M6532_0_TAG), |
| 390 | 384 | m_riot1(*this, M6532_1_TAG), |
| 391 | 385 | m_fdc(*this, WD1797_TAG), |
| 392 | | m_image0(*this, FLOPPY_0), |
| 393 | | m_image1(*this, FLOPPY_1), |
| 386 | m_floppy0(*this, WD1797_TAG":0"), |
| 387 | m_floppy1(*this, WD1797_TAG":1"), |
| 394 | 388 | m_rfdo(1), |
| 395 | 389 | m_daco(1), |
| 396 | 390 | m_atna(1) |
| r19194 | r19195 | |
| 404 | 398 | |
| 405 | 399 | void c8280_device::device_start() |
| 406 | 400 | { |
| 401 | // floppy callbacks |
| 402 | m_fdc->setup_intrq_cb(fd1797_t::line_cb(FUNC(c8280_device::fdc_intrq_w), this)); |
| 403 | m_fdc->setup_drq_cb(fd1797_t::line_cb(FUNC(c8280_device::fdc_drq_w), this)); |
| 404 | |
| 407 | 405 | // state saving |
| 408 | 406 | save_item(NAME(m_rfdo)); |
| 409 | 407 | save_item(NAME(m_daco)); |
| r19194 | r19195 | |
| 429 | 427 | m_riot0->reset(); |
| 430 | 428 | m_riot1->reset(); |
| 431 | 429 | |
| 432 | | wd17xx_mr_w(m_fdc, 1); |
| 433 | | wd17xx_mr_w(m_fdc, 0); |
| 430 | m_fdc->reset(); |
| 434 | 431 | |
| 435 | 432 | m_fk5 = 0; |
| 436 | | wd17xx_dden_w(m_fdc, 0); |
| 437 | | floppy_mon_w(m_image0, 1); |
| 438 | | floppy_mon_w(m_image1, 1); |
| 433 | m_floppy = NULL; |
| 434 | m_fdc->set_floppy(m_floppy); |
| 435 | m_fdc->dden_w(0); |
| 439 | 436 | } |
| 440 | 437 | |
| 441 | 438 | |
| r19194 | r19195 | |
| 483 | 480 | |
| 484 | 481 | UINT8 data = m_fk5; |
| 485 | 482 | |
| 486 | | if (BIT(m_fk5, 0)) |
| 483 | if (m_floppy) |
| 487 | 484 | { |
| 488 | | data |= floppy_dskchg_r(m_image0) << 3; |
| 489 | | data |= floppy_twosid_r(m_image0) << 4; |
| 485 | data |= m_floppy->dskchg_r() << 3; |
| 486 | data |= m_floppy->twosid_r() << 4; |
| 490 | 487 | } |
| 491 | | else if (BIT(m_fk5, 1)) |
| 492 | | { |
| 493 | | data |= floppy_dskchg_r(m_image1) << 3; |
| 494 | | data |= floppy_twosid_r(m_image1) << 4; |
| 495 | | } |
| 496 | 488 | |
| 497 | 489 | return data; |
| 498 | 490 | } |
| r19194 | r19195 | |
| 517 | 509 | m_fk5 = data & 0x3f; |
| 518 | 510 | |
| 519 | 511 | // drive select |
| 520 | | if (BIT(data, 0)) wd17xx_set_drive(m_fdc, 0); |
| 521 | | if (BIT(data, 1)) wd17xx_set_drive(m_fdc, 1); |
| 512 | m_floppy = NULL; |
| 522 | 513 | |
| 523 | | // density select |
| 524 | | wd17xx_dden_w(m_fdc, BIT(data, 2)); |
| 514 | if (BIT(data, 0)) m_floppy = m_floppy0->get_device(); |
| 515 | if (BIT(data, 1)) m_floppy = m_floppy1->get_device(); |
| 525 | 516 | |
| 526 | | // motor enable |
| 527 | | floppy_mon_w(m_image0, !BIT(data, 5)); |
| 528 | | floppy_mon_w(m_image1, !BIT(data, 5)); |
| 517 | m_fdc->set_floppy(m_floppy); |
| 518 | |
| 519 | // density select |
| 520 | m_fdc->dden_w(BIT(data, 2)); |
| 529 | 521 | } |
trunk/src/mess/machine/c8280.h
| r19194 | r19195 | |
| 18 | 18 | #include "imagedev/flopdrv.h" |
| 19 | 19 | #include "machine/6532riot.h" |
| 20 | 20 | #include "machine/ieee488.h" |
| 21 | | #include "machine/wd17xx.h" |
| 21 | #include "machine/wd_fdc.h" |
| 22 | 22 | |
| 23 | 23 | |
| 24 | 24 | |
| r19194 | r19195 | |
| 48 | 48 | DECLARE_WRITE8_MEMBER( riot1_pb_w ); |
| 49 | 49 | DECLARE_READ8_MEMBER( fk5_r ); |
| 50 | 50 | DECLARE_WRITE8_MEMBER( fk5_w ); |
| 51 | void fdc_intrq_w(bool state); |
| 52 | void fdc_drq_w(bool state); |
| 51 | 53 | |
| 52 | 54 | protected: |
| 53 | 55 | // device-level overrides |
| r19194 | r19195 | |
| 66 | 68 | required_device<cpu_device> m_fdccpu; |
| 67 | 69 | required_device<riot6532_device> m_riot0; |
| 68 | 70 | required_device<riot6532_device> m_riot1; |
| 69 | | required_device<fd1797_device> m_fdc; |
| 70 | | required_device<legacy_floppy_image_device> m_image0; |
| 71 | | required_device<legacy_floppy_image_device> m_image1; |
| 71 | required_device<fd1797_t> m_fdc; |
| 72 | required_device<floppy_connector> m_floppy0; |
| 73 | required_device<floppy_connector> m_floppy1; |
| 74 | floppy_image_device *m_floppy; |
| 72 | 75 | |
| 73 | 76 | // IEEE-488 bus |
| 74 | 77 | int m_rfdo; // not ready for data output |