trunk/src/emu/machine/upd765.c
| r19277 | r19278 | |
| 127 | 127 | |
| 128 | 128 | if(ready_polled) { |
| 129 | 129 | poll_timer = timer_alloc(TIMER_DRIVE_READY_POLLING); |
| 130 | | poll_timer->adjust(attotime::from_usec(1024), 0, attotime::from_usec(1024)); |
| 130 | poll_timer->adjust(attotime::from_usec(100), 0, attotime::from_usec(1024)); |
| 131 | 131 | } else |
| 132 | 132 | poll_timer = NULL; |
| 133 | 133 | |
| r19277 | r19278 | |
| 171 | 171 | |
| 172 | 172 | check_irq(); |
| 173 | 173 | if(ready_polled) |
| 174 | | poll_timer->adjust(attotime::from_usec(1024), 0, attotime::from_usec(1024)); |
| 174 | poll_timer->adjust(attotime::from_usec(100), 0, attotime::from_usec(1024)); |
| 175 | 175 | } |
| 176 | 176 | |
| 177 | 177 | void upd765_family_device::tc_w(bool _tc) |
| r19277 | r19278 | |
| 295 | 295 | for(int i=0; i<4; i++) |
| 296 | 296 | if(flopi[i].main_state == RECALIBRATE || flopi[i].main_state == SEEK) { |
| 297 | 297 | msr |= 1<<i; |
| 298 | | msr |= MSR_CB; |
| 298 | //msr |= MSR_CB; |
| 299 | 299 | } |
| 300 | 300 | |
| 301 | 301 | if(data_irq) { |
| r19277 | r19278 | |
| 1493 | 1493 | command[4]++; |
| 1494 | 1494 | if(command[4] > command[6]) { |
| 1495 | 1495 | command[4] = 1; |
| 1496 | command[3] = command[3] ^ 1; |
| 1496 | 1497 | if(command[0] & 0x80) { |
| 1497 | | command[3] = command[3] ^ 1; |
| 1498 | 1498 | if(fi.dev) |
| 1499 | 1499 | fi.dev->ss_w(command[3] & 1); |
| 1500 | | } |
| 1501 | | if(!(command[0] & 0x80) || !(command[3] & 1)) { |
| 1502 | | command[2]++; |
| 1503 | | if(!tc_done) { |
| 1504 | | st0 |= ST0_FAIL; |
| 1505 | | st1 |= ST1_EN; |
| 1500 | if(!command[3]) { |
| 1501 | done = true; |
| 1502 | command[2]++; |
| 1506 | 1503 | } |
| 1504 | } else { |
| 1507 | 1505 | done = true; |
| 1506 | if(!command[3]) |
| 1507 | command[2]++; |
| 1508 | 1508 | } |
| 1509 | if(!tc_done && done) { |
| 1510 | st0 |= ST0_FAIL; |
| 1511 | st1 |= ST1_EN; |
| 1512 | } |
| 1509 | 1513 | } |
| 1510 | 1514 | if(!done) { |
| 1511 | 1515 | fi.sub_state = SEEK_DONE; |
| r19277 | r19278 | |
| 1605 | 1609 | command[4]++; |
| 1606 | 1610 | if(command[4] > command[6]) { |
| 1607 | 1611 | command[4] = 1; |
| 1612 | command[3] = command[3] ^ 1; |
| 1608 | 1613 | if(command[0] & 0x80) { |
| 1609 | | command[3] = command[3] ^ 1; |
| 1610 | 1614 | if(fi.dev) |
| 1611 | 1615 | fi.dev->ss_w(command[3] & 1); |
| 1612 | | } |
| 1613 | | if(!(command[0] & 0x80) || !(command[3] & 1)) { |
| 1614 | | command[2]++; |
| 1615 | | if(!tc_done) { |
| 1616 | | st0 |= ST0_FAIL; |
| 1617 | | st1 |= ST1_EN; |
| 1616 | if(!command[3]) { |
| 1617 | done = true; |
| 1618 | command[2]++; |
| 1618 | 1619 | } |
| 1620 | } else { |
| 1619 | 1621 | done = true; |
| 1622 | if(!command[3]) |
| 1623 | command[2]++; |
| 1620 | 1624 | } |
| 1625 | if(!tc_done && done) { |
| 1626 | st0 |= ST0_FAIL; |
| 1627 | st1 |= ST1_EN; |
| 1628 | } |
| 1621 | 1629 | } |
| 1622 | 1630 | if(!done) { |
| 1623 | 1631 | fi.sub_state = HEAD_LOAD_DONE; |
trunk/src/mess/machine/pc_fdc.c
| r19277 | r19278 | |
| 16 | 16 | |
| 17 | 17 | const device_type PC_FDC_XT = &device_creator<pc_fdc_xt_device>; |
| 18 | 18 | const device_type PC_FDC_AT = &device_creator<pc_fdc_at_device>; |
| 19 | | const device_type PC_FDC_JR = &device_creator<pc_fdc_jr_device>; |
| 20 | 19 | |
| 21 | 20 | static MACHINE_CONFIG_FRAGMENT( cfg ) |
| 22 | 21 | MCFG_UPD765A_ADD("upd765", false, false) |
| r19277 | r19278 | |
| 42 | 41 | AM_RANGE(0x7, 0x7) AM_READWRITE(dir_r, ccr_w) |
| 43 | 42 | ADDRESS_MAP_END |
| 44 | 43 | |
| 45 | | |
| 46 | | |
| 47 | 44 | pc_fdc_family_device::pc_fdc_family_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) : pc_fdc_interface(mconfig, type, name, tag, owner, clock), fdc(*this, "upd765") |
| 48 | 45 | { |
| 49 | 46 | } |
| r19277 | r19278 | |
| 199 | 196 | m_shortname = "pc_fdc_at"; |
| 200 | 197 | } |
| 201 | 198 | |
| 202 | | pc_fdc_jr_device::pc_fdc_jr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : pc_fdc_family_device(mconfig, PC_FDC_JR, "PC FDC JR", tag, owner, clock) |
| 203 | | { |
| 204 | | m_shortname = "pc_fdc_jr"; |
| 205 | | } |
| 206 | | |
| 207 | 199 | #if 0 |
| 208 | 200 | |
| 209 | 201 | |
trunk/src/mess/machine/pc_fdc.h
| r19277 | r19278 | |
| 17 | 17 | #define MCFG_PC_FDC_AT_ADD(_tag) \ |
| 18 | 18 | MCFG_DEVICE_ADD(_tag, PC_FDC_AT, 0) |
| 19 | 19 | |
| 20 | | #define MCFG_PC_FDC_JR_ADD(_tag) \ |
| 21 | | MCFG_DEVICE_ADD(_tag, PC_FDC_JR, 0) |
| 22 | | |
| 23 | | |
| 24 | 20 | class pc_fdc_family_device : public pc_fdc_interface { |
| 25 | 21 | public: |
| 26 | 22 | pc_fdc_family_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); |
| r19277 | r19278 | |
| 74 | 70 | virtual DECLARE_ADDRESS_MAP(map, 8); |
| 75 | 71 | }; |
| 76 | 72 | |
| 77 | | class pc_fdc_jr_device : public pc_fdc_family_device { |
| 78 | | public: |
| 79 | | pc_fdc_jr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 80 | | }; |
| 81 | | |
| 82 | | |
| 83 | 73 | extern const device_type PC_FDC_XT; |
| 84 | 74 | extern const device_type PC_FDC_AT; |
| 85 | | extern const device_type PC_FDC_JR; |
| 86 | 75 | |
| 87 | | |
| 88 | 76 | #if 0 |
| 89 | 77 | /* interface has been seperated, so that it can be used in the super i/o chip */ |
| 90 | 78 | |
trunk/src/mess/machine/pc.c
| r19277 | r19278 | |
| 1171 | 1171 | pc_set_irq_line( machine, 1, state ); |
| 1172 | 1172 | } |
| 1173 | 1173 | |
| 1174 | TIMER_CALLBACK_MEMBER(pc_state::pcjr_fdc_watchdog) |
| 1175 | { |
| 1176 | if(m_pcjr_dor & 0x20) |
| 1177 | fdc_interrupt(1); |
| 1178 | else |
| 1179 | fdc_interrupt(0); |
| 1180 | } |
| 1181 | |
| 1182 | WRITE8_MEMBER(pc_state::pcjr_fdc_dor_w) |
| 1183 | { |
| 1184 | logerror("fdc: dor = %02x\n", data); |
| 1185 | UINT8 pdor = m_pcjr_dor; |
| 1186 | upd765a_device *fdc = machine().device<upd765a_device>("upd765"); |
| 1187 | floppy_image_device *floppy = machine().device<floppy_connector>("upd765:0")->get_device(); |
| 1188 | m_pcjr_dor = data; |
| 1189 | |
| 1190 | if(floppy) |
| 1191 | floppy->mon_w(!(m_pcjr_dor & 1)); |
| 1192 | |
| 1193 | if(m_pcjr_dor & 1) |
| 1194 | fdc->set_floppy(floppy); |
| 1195 | else |
| 1196 | fdc->set_floppy(NULL); |
| 1197 | |
| 1198 | if((pdor^m_pcjr_dor) & 0x80) |
| 1199 | fdc->reset(); |
| 1200 | |
| 1201 | if(m_pcjr_dor & 0x20) { |
| 1202 | if((pdor & 0x40) && !(m_pcjr_dor & 0x40)) |
| 1203 | m_pcjr_watchdog->adjust(attotime::from_seconds(3)); |
| 1204 | } else { |
| 1205 | m_pcjr_watchdog->adjust(attotime::never); |
| 1206 | fdc_interrupt(0); |
| 1207 | } |
| 1208 | } |
| 1209 | |
| 1174 | 1210 | /* |
| 1175 | 1211 | * MC1502 uses a FD1793 clone instead of uPD765 |
| 1176 | 1212 | */ |
| r19277 | r19278 | |
| 1428 | 1464 | |
| 1429 | 1465 | MACHINE_START_MEMBER(pc_state,pcjr) |
| 1430 | 1466 | { |
| 1431 | | pc_fdc_interface *fdc = machine().device<pc_fdc_interface>("fdc"); |
| 1432 | | fdc->setup_intrq_cb(pc_fdc_interface::line_cb(FUNC(pc_state::fdc_interrupt), this)); |
| 1433 | 1467 | pc_int_delay_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pcjr_delayed_pic8259_irq),this)); |
| 1434 | | m_maincpu = machine().device<cpu_device>("maincpu" ); |
| 1468 | m_pcjr_watchdog = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pcjr_fdc_watchdog),this)); |
| 1469 | pcjr_keyb.keyb_signal_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pcjr_keyb_signal_callback),this)); |
| 1470 | m_maincpu = machine().device<cpu_device>("maincpu"); |
| 1435 | 1471 | m_maincpu->set_irq_acknowledge_callback(pc_irq_callback); |
| 1436 | 1472 | |
| 1473 | machine().device<upd765a_device>("upd765")->set_ready_line_connected(false); |
| 1474 | |
| 1475 | |
| 1437 | 1476 | m_pic8259 = machine().device("pic8259"); |
| 1438 | 1477 | m_dma8237 = NULL; |
| 1439 | 1478 | m_pit8253 = machine().device("pit8253"); |
| r19277 | r19278 | |
| 1459 | 1498 | m_ppi_data_signal = 0; |
| 1460 | 1499 | m_ppi_shift_register = 0; |
| 1461 | 1500 | m_ppi_shift_enable = 0; |
| 1501 | m_pcjr_dor = 0; |
| 1462 | 1502 | speaker_level_w( speaker, 0 ); |
| 1463 | 1503 | |
| 1464 | 1504 | pcjr_keyb_init(machine()); |
trunk/src/mess/includes/pc.h
| r19277 | r19278 | |
| 39 | 39 | UINT8 m_dma_offset[2][4]; |
| 40 | 40 | UINT8 m_pc_spkrdata; |
| 41 | 41 | UINT8 m_pc_input; |
| 42 | UINT8 m_pcjr_dor; |
| 43 | emu_timer *m_pcjr_watchdog; |
| 42 | 44 | |
| 43 | 45 | int m_ppi_portc_switch_high; |
| 44 | 46 | int m_ppi_speaker; |
| r19277 | r19278 | |
| 87 | 89 | DECLARE_MACHINE_START(mc1502); |
| 88 | 90 | TIMER_CALLBACK_MEMBER(pcjr_delayed_pic8259_irq); |
| 89 | 91 | TIMER_CALLBACK_MEMBER(pcjr_keyb_signal_callback); |
| 92 | TIMER_CALLBACK_MEMBER(pcjr_fdc_watchdog); |
| 90 | 93 | TIMER_CALLBACK_MEMBER(mc1502_keyb_signal_callback); |
| 91 | 94 | TIMER_CALLBACK_MEMBER(pc_rtc_timer); |
| 92 | 95 | TIMER_DEVICE_CALLBACK_MEMBER(pc_frame_interrupt); |
| r19277 | r19278 | |
| 127 | 130 | DECLARE_WRITE8_MEMBER(mc1502_wd17xx_aux_w); |
| 128 | 131 | DECLARE_READ8_MEMBER(mc1502_wd17xx_drq_r); |
| 129 | 132 | DECLARE_READ8_MEMBER(mc1502_wd17xx_motor_r); |
| 133 | DECLARE_WRITE8_MEMBER(pcjr_fdc_dor_w); |
| 130 | 134 | |
| 131 | 135 | void fdc_interrupt(bool state); |
| 132 | 136 | void fdc_dma_drq(bool state); |
trunk/src/mess/drivers/pc.c
| r19277 | r19278 | |
| 456 | 456 | AM_RANGE(0x0080, 0x0087) AM_READWRITE(pc_page_r, pc_page_w) |
| 457 | 457 | AM_RANGE(0x00a0, 0x00a0) AM_READWRITE(pcjr_nmi_enable_r, pc_nmi_enable_w ) |
| 458 | 458 | AM_RANGE(0x00c0, 0x00c0) AM_DEVWRITE("sn76496", sn76496_device, write) |
| 459 | | AM_RANGE(0x00f0, 0x00f7) AM_DEVICE("fdc", pc_fdc_interface, map) |
| 459 | AM_RANGE(0x00f2, 0x00f2) AM_WRITE(pcjr_fdc_dor_w) |
| 460 | AM_RANGE(0x00f4, 0x00f5) AM_DEVICE("upd765", upd765a_device, map) |
| 460 | 461 | AM_RANGE(0x0200, 0x0207) AM_READWRITE_LEGACY(pc_JOY_r, pc_JOY_w) |
| 461 | 462 | AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE("ins8250_1", ins8250_device, ins8250_r, ins8250_w) |
| 462 | 463 | AM_RANGE(0x0378, 0x037f) AM_READWRITE_LEGACY(pc_t1t_p37x_r, pc_t1t_p37x_w) |
| r19277 | r19278 | |
| 1296 | 1297 | /* cassette */ |
| 1297 | 1298 | MCFG_CASSETTE_ADD( CASSETTE_TAG, ibm5150_cassette_interface ) |
| 1298 | 1299 | |
| 1299 | | MCFG_PC_FDC_JR_ADD("fdc") |
| 1300 | MCFG_UPD765A_ADD("upd765", false, false) |
| 1300 | 1301 | |
| 1301 | | MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) |
| 1302 | MCFG_FLOPPY_DRIVE_ADD("upd765:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) |
| 1302 | 1303 | |
| 1303 | 1304 | /* cartridge */ |
| 1304 | 1305 | MCFG_CARTSLOT_ADD("cart1") |