trunk/src/emu/bus/kc/d004.c
| r31441 | r31442 | |
| 54 | 54 | FLOPPY_FORMATS_END |
| 55 | 55 | |
| 56 | 56 | static SLOT_INTERFACE_START( kc_d004_floppies ) |
| 57 | | SLOT_INTERFACE( "525hd", FLOPPY_525_HD ) |
| 57 | SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) |
| 58 | 58 | SLOT_INTERFACE_END |
| 59 | 59 | |
| 60 | 60 | static const z80_daisy_config kc_d004_daisy_chain[] = |
| r31441 | r31442 | |
| 77 | 77 | |
| 78 | 78 | MCFG_UPD765A_ADD(UPD765_TAG, false, false) |
| 79 | 79 | MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(kc_d004_device, fdc_irq)) |
| 80 | | MCFG_UPD765_DRQ_CALLBACK(WRITELINE(kc_d004_device, fdc_drq)) |
| 81 | | MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", kc_d004_floppies, "525hd", kc_d004_device::floppy_formats) |
| 82 | | MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", kc_d004_floppies, "525hd", kc_d004_device::floppy_formats) |
| 83 | | MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":2", kc_d004_floppies, "525hd", kc_d004_device::floppy_formats) |
| 84 | | MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":3", kc_d004_floppies, "525hd", kc_d004_device::floppy_formats) |
| 80 | MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", kc_d004_floppies, "525qd", kc_d004_device::floppy_formats) |
| 81 | MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", kc_d004_floppies, "525qd", kc_d004_device::floppy_formats) |
| 82 | MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":2", kc_d004_floppies, "525qd", kc_d004_device::floppy_formats) |
| 83 | MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":3", kc_d004_floppies, "525qd", kc_d004_device::floppy_formats) |
| 85 | 84 | MACHINE_CONFIG_END |
| 86 | 85 | |
| 87 | 86 | static MACHINE_CONFIG_FRAGMENT(kc_d004_gide) |
| r31441 | r31442 | |
| 134 | 133 | device_kcexp_interface( mconfig, *this ), |
| 135 | 134 | m_cpu(*this, Z80_TAG), |
| 136 | 135 | m_fdc(*this, UPD765_TAG), |
| 136 | m_floppy0(*this, UPD765_TAG ":0"), |
| 137 | m_floppy1(*this, UPD765_TAG ":1"), |
| 138 | m_floppy2(*this, UPD765_TAG ":2"), |
| 139 | m_floppy3(*this, UPD765_TAG ":3"), |
| 137 | 140 | m_koppel_ram(*this, "koppelram") |
| 138 | 141 | { |
| 139 | 142 | } |
| r31441 | r31442 | |
| 143 | 146 | device_kcexp_interface( mconfig, *this ), |
| 144 | 147 | m_cpu(*this, Z80_TAG), |
| 145 | 148 | m_fdc(*this, UPD765_TAG), |
| 149 | m_floppy0(*this, UPD765_TAG ":0"), |
| 150 | m_floppy1(*this, UPD765_TAG ":1"), |
| 151 | m_floppy2(*this, UPD765_TAG ":2"), |
| 152 | m_floppy3(*this, UPD765_TAG ":3"), |
| 146 | 153 | m_koppel_ram(*this, "koppelram") |
| 147 | 154 | { |
| 148 | 155 | } |
| r31441 | r31442 | |
| 156 | 163 | m_rom = memregion(Z80_TAG)->base(); |
| 157 | 164 | |
| 158 | 165 | m_reset_timer = timer_alloc(TIMER_RESET); |
| 159 | | m_tc_clear_timer = timer_alloc(TIMER_TC_CLEAR); |
| 160 | 166 | } |
| 161 | 167 | |
| 162 | 168 | //------------------------------------------------- |
| r31441 | r31442 | |
| 167 | 173 | { |
| 168 | 174 | m_rom_base = 0xc000; |
| 169 | 175 | m_enabled = m_connected = 0; |
| 170 | | m_floppy = subdevice<floppy_connector>(UPD765_TAG ":0")->get_device(); |
| 176 | m_floppy = m_floppy0->get_device(); |
| 171 | 177 | |
| 172 | 178 | // hold cpu at reset |
| 173 | 179 | m_reset_timer->adjust(attotime::zero); |
| r31441 | r31442 | |
| 202 | 208 | case TIMER_RESET: |
| 203 | 209 | m_cpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
| 204 | 210 | break; |
| 205 | | case TIMER_TC_CLEAR: |
| 206 | | m_fdc->tc_w(false); |
| 207 | | break; |
| 208 | 211 | } |
| 209 | 212 | } |
| 210 | 213 | |
| r31441 | r31442 | |
| 316 | 319 | READ8_MEMBER(kc_d004_device::hw_input_gate_r) |
| 317 | 320 | { |
| 318 | 321 | /* |
| 319 | | |
| 320 | 322 | bit 7: DMA Request (DRQ from FDC) |
| 321 | 323 | bit 6: Interrupt (INT from FDC) |
| 322 | 324 | bit 5: Drive Ready |
| 323 | 325 | bit 4: Index pulse from disc |
| 324 | | |
| 325 | 326 | */ |
| 326 | 327 | |
| 327 | | if (m_floppy->ready_r()) |
| 328 | | m_hw_input_gate |= 0x20; |
| 329 | | else |
| 330 | | m_hw_input_gate &= ~0x20; |
| 328 | UINT8 hw_input_gate = 0x0f; |
| 331 | 329 | |
| 332 | | if (m_floppy->idx_r()) |
| 333 | | m_hw_input_gate &= ~0x10; |
| 334 | | else |
| 335 | | m_hw_input_gate |= 0x10; |
| 330 | if (m_floppy && !m_floppy->idx_r()) |
| 331 | hw_input_gate |= 0x10; |
| 336 | 332 | |
| 337 | | return m_hw_input_gate | 0x0f; |
| 333 | if (m_floppy && !m_floppy->ready_r()) |
| 334 | hw_input_gate |= 0x20; |
| 335 | |
| 336 | if (!m_fdc->get_irq()) |
| 337 | hw_input_gate |= 0x40; |
| 338 | |
| 339 | if (!m_fdc->get_drq()) |
| 340 | hw_input_gate |= 0x80; |
| 341 | |
| 342 | return hw_input_gate; |
| 338 | 343 | } |
| 339 | 344 | |
| 340 | 345 | WRITE8_MEMBER(kc_d004_device::fdd_select_w) |
| 341 | 346 | { |
| 342 | 347 | if (data & 0x01) |
| 343 | | m_floppy = subdevice<floppy_connector>(UPD765_TAG ":0")->get_device(); |
| 348 | m_floppy = m_floppy0->get_device(); |
| 344 | 349 | else if (data & 0x02) |
| 345 | | m_floppy = subdevice<floppy_connector>(UPD765_TAG ":1")->get_device(); |
| 350 | m_floppy = m_floppy1->get_device(); |
| 346 | 351 | else if (data & 0x04) |
| 347 | | m_floppy = subdevice<floppy_connector>(UPD765_TAG ":2")->get_device(); |
| 352 | m_floppy = m_floppy2->get_device(); |
| 348 | 353 | else if (data & 0x08) |
| 349 | | m_floppy = subdevice<floppy_connector>(UPD765_TAG ":3")->get_device(); |
| 354 | m_floppy = m_floppy3->get_device(); |
| 350 | 355 | else |
| 351 | 356 | m_floppy = NULL; |
| 357 | |
| 358 | if (m_floppy) |
| 359 | m_floppy->mon_w(0); |
| 360 | |
| 352 | 361 | m_fdc->set_floppy(m_floppy); |
| 353 | 362 | } |
| 354 | 363 | |
| 355 | 364 | WRITE8_MEMBER(kc_d004_device::hw_terminal_count_w) |
| 356 | 365 | { |
| 357 | 366 | m_fdc->tc_w(true); |
| 358 | | |
| 359 | | m_tc_clear_timer->adjust(attotime::from_nsec(200)); |
| 360 | 367 | } |
| 361 | 368 | |
| 362 | 369 | WRITE_LINE_MEMBER(kc_d004_device::fdc_irq) |
| 363 | 370 | { |
| 364 | 371 | if (state) |
| 365 | | m_hw_input_gate &= ~0x40; |
| 366 | | else |
| 367 | | m_hw_input_gate |= 0x40; |
| 372 | m_fdc->tc_w(false); |
| 368 | 373 | } |
| 369 | 374 | |
| 370 | | WRITE_LINE_MEMBER(kc_d004_device::fdc_drq) |
| 371 | | { |
| 372 | | if (state) |
| 373 | | m_hw_input_gate &= ~0x80; |
| 374 | | else |
| 375 | | m_hw_input_gate |= 0x80; |
| 376 | | } |
| 377 | 375 | |
| 378 | 376 | |
| 379 | | |
| 380 | 377 | //************************************************************************** |
| 381 | 378 | // D004 Floppy Disk + GIDE Interface |
| 382 | 379 | //************************************************************************** |