trunk/src/emu/machine/wd_fdc.c
| r32313 | r32314 | |
| 38 | 38 | #define TRACE_COMP 0 |
| 39 | 39 | |
| 40 | 40 | // Shows command invocation |
| 41 | | #define TRACE_COMMAND 1 |
| 41 | #define TRACE_COMMAND 0 |
| 42 | 42 | |
| 43 | 43 | // Shows sync actions |
| 44 | 44 | #define TRACE_SYNC 0 |
| r32313 | r32314 | |
| 203 | 203 | |
| 204 | 204 | void wd_fdc_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 205 | 205 | { |
| 206 | | if (TRACE_EVENT) logerror("%s: Event fired for timer %d\n", tag(), (int)id); |
| 206 | if (TRACE_EVENT) logerror("%s: Event fired for timer %s\n", tag(), (id==TM_GEN)? "TM_GEN" : (id==TM_CMD)? "TM_CMD" : (id==TM_TRACK)? "TM_TRACK" : "TM_SECTOR"); |
| 207 | 207 | live_sync(); |
| 208 | 208 | |
| 209 | 209 | switch(id) { |
| r32313 | r32314 | |
| 273 | 273 | } |
| 274 | 274 | |
| 275 | 275 | if(main_state == SEEK && track == data) { |
| 276 | | logerror("track=%d data=%d\n", track, data); |
| 277 | 276 | sub_state = SEEK_DONE; |
| 278 | 277 | } |
| 279 | 278 | |
| r32313 | r32314 | |
| 304 | 303 | return; |
| 305 | 304 | |
| 306 | 305 | case SEEK_WAIT_STEP_TIME_DONE: { |
| 307 | | if (TRACE_STATE) logerror("%s: SEEK_WAIT_STEP_TIME\n", tag()); |
| 306 | if (TRACE_STATE) logerror("%s: SEEK_WAIT_STEP_TIME_DONE\n", tag()); |
| 308 | 307 | bool done = false; |
| 309 | 308 | switch(main_state) { |
| 310 | 309 | case RESTORE: |
| r32313 | r32314 | |
| 392 | 391 | bool wd_fdc_t::sector_matches() const |
| 393 | 392 | { |
| 394 | 393 | if(TRACE_MATCH) |
| 395 | | logerror("%s: matching %02x %02x %02x %02x - %02x %02x\n", tag(), |
| 394 | logerror("%s: matching read T=%02x H=%02x S=%02x L=%02x - searched T=%02x S=%02x\n", tag(), |
| 396 | 395 | cur_live.idbuf[0], cur_live.idbuf[1], cur_live.idbuf[2], cur_live.idbuf[3], |
| 397 | 396 | track, sector); |
| 398 | 397 | |
| r32313 | r32314 | |
| 1490 | 1489 | for(;;) { |
| 1491 | 1490 | switch(cur_live.state) { |
| 1492 | 1491 | case SEARCH_ADDRESS_MARK_HEADER: |
| 1493 | | if (TRACE_STATE) logerror("%s: SEARCH_ADDRESS_MARK_HEADER\n", tag()); |
| 1494 | 1492 | if(read_one_bit(limit)) |
| 1495 | 1493 | return; |
| 1496 | 1494 | |
| r32313 | r32314 | |
| 1524 | 1522 | break; |
| 1525 | 1523 | |
| 1526 | 1524 | case READ_HEADER_BLOCK_HEADER: { |
| 1527 | | if (TRACE_STATE) logerror("%s: READ_HEADER_BLOCK_HEADER\n", tag()); |
| 1528 | | |
| 1529 | 1525 | if(read_one_bit(limit)) |
| 1530 | 1526 | return; |
| 1531 | 1527 | |
| r32313 | r32314 | |
| 1566 | 1562 | } |
| 1567 | 1563 | |
| 1568 | 1564 | case READ_ID_BLOCK_TO_LOCAL: { |
| 1569 | | if (TRACE_STATE) logerror("%s: READ_ID_BLOCK_TO_LOCAL\n", tag()); |
| 1570 | 1565 | if(read_one_bit(limit)) |
| 1571 | 1566 | return; |
| 1572 | 1567 | if(cur_live.bit_counter & 15) |
| r32313 | r32314 | |
| 1582 | 1577 | } |
| 1583 | 1578 | |
| 1584 | 1579 | case READ_ID_BLOCK_TO_DMA: |
| 1585 | | if (TRACE_STATE) logerror("%s: READ_ID_BLOCK_TO_DMA\n", tag()); |
| 1586 | 1580 | if(read_one_bit(limit)) |
| 1587 | 1581 | return; |
| 1588 | 1582 | if(cur_live.bit_counter & 15) |
| r32313 | r32314 | |
| 1591 | 1585 | return; |
| 1592 | 1586 | |
| 1593 | 1587 | case READ_ID_BLOCK_TO_DMA_BYTE: |
| 1594 | | if (TRACE_STATE) logerror("%s: READ_ID_BLOCK_TO_DMA_BYTE\n", tag()); |
| 1595 | 1588 | data = cur_live.data_reg; |
| 1596 | 1589 | if(cur_live.bit_counter == 16) |
| 1597 | 1590 | sector = data; |
| r32313 | r32314 | |
| 1612 | 1605 | break; |
| 1613 | 1606 | |
| 1614 | 1607 | case SEARCH_ADDRESS_MARK_DATA: |
| 1615 | | if (TRACE_STATE) logerror("%s: SEARCH_ADDRESS_MARK_DATA\n", tag()); |
| 1616 | 1608 | if(read_one_bit(limit)) |
| 1617 | 1609 | return; |
| 1618 | 1610 | |
| r32313 | r32314 | |
| 1660 | 1652 | break; |
| 1661 | 1653 | |
| 1662 | 1654 | case READ_DATA_BLOCK_HEADER: { |
| 1663 | | if (TRACE_STATE) logerror("%s: READ_DATA_BLOCK_HEADER\n", tag()); |
| 1664 | 1655 | if(read_one_bit(limit)) |
| 1665 | 1656 | return; |
| 1666 | 1657 | |
| r32313 | r32314 | |
| 1698 | 1689 | } |
| 1699 | 1690 | |
| 1700 | 1691 | case SEARCH_ADDRESS_MARK_DATA_FAILED: |
| 1701 | | if (TRACE_STATE) logerror("%s: SEARCH_ADDRESS_MARK_DATA_FAILED\n", tag()); |
| 1702 | 1692 | status |= S_RNF; |
| 1703 | 1693 | cur_live.state = IDLE; |
| 1704 | 1694 | return; |
| 1705 | 1695 | |
| 1706 | 1696 | case READ_SECTOR_DATA: { |
| 1707 | | if (TRACE_STATE) logerror("%s: READ_SECTOR_DATA\n", tag()); |
| 1708 | 1697 | if(read_one_bit(limit)) |
| 1709 | 1698 | return; |
| 1710 | 1699 | if(cur_live.bit_counter & 15) |
| r32313 | r32314 | |
| 1726 | 1715 | } |
| 1727 | 1716 | |
| 1728 | 1717 | case READ_SECTOR_DATA_BYTE: |
| 1729 | | if (TRACE_STATE) logerror("%s: READ_SECTOR_DATA_BYTE\n", tag()); |
| 1730 | 1718 | data = cur_live.data_reg; |
| 1731 | 1719 | set_drq(); |
| 1732 | 1720 | cur_live.state = READ_SECTOR_DATA; |
| r32313 | r32314 | |
| 1734 | 1722 | break; |
| 1735 | 1723 | |
| 1736 | 1724 | case READ_TRACK_DATA: { |
| 1737 | | if (TRACE_STATE) logerror("%s: READ_TRACK_DATA\n", tag()); |
| 1738 | 1725 | if(read_one_bit(limit)) |
| 1739 | 1726 | return; |
| 1740 | 1727 | if(cur_live.bit_counter != 16 |
| r32313 | r32314 | |
| 1764 | 1751 | } |
| 1765 | 1752 | |
| 1766 | 1753 | case READ_TRACK_DATA_BYTE: |
| 1767 | | if (TRACE_STATE) logerror("%s: READ_TRACK_DATA_BYTE\n", tag()); |
| 1768 | 1754 | data = cur_live.data_reg; |
| 1769 | 1755 | set_drq(); |
| 1770 | 1756 | cur_live.state = READ_TRACK_DATA; |
| r32313 | r32314 | |
| 1772 | 1758 | break; |
| 1773 | 1759 | |
| 1774 | 1760 | case WRITE_TRACK_DATA: |
| 1775 | | if (TRACE_STATE) logerror("%s: WRITE_TRACK_DATA\n", tag()); |
| 1776 | 1761 | if(drq) { |
| 1777 | 1762 | status |= S_LOST; |
| 1778 | 1763 | data = 0; |
| r32313 | r32314 | |
| 1823 | 1808 | cur_live.previous_type = live_info::PT_NONE; |
| 1824 | 1809 | break; |
| 1825 | 1810 | case 0xfc: |
| 1826 | | live_write_raw(0xcf63); |
| 1811 | live_write_raw(0xf77a); |
| 1827 | 1812 | cur_live.previous_type = live_info::PT_NONE; |
| 1828 | 1813 | break; |
| 1829 | 1814 | case 0xfe: |
| r32313 | r32314 | |
| 1870 | 1855 | break; |
| 1871 | 1856 | |
| 1872 | 1857 | case WRITE_BYTE: |
| 1873 | | if (TRACE_STATE) logerror("%s: WRITE_BYTE\n", tag()); |
| 1874 | 1858 | if(write_one_bit(limit)) |
| 1875 | 1859 | return; |
| 1876 | 1860 | if(cur_live.bit_counter == 0) { |
| r32313 | r32314 | |
| 1882 | 1866 | case WRITE_BYTE_DONE: |
| 1883 | 1867 | switch(sub_state) { |
| 1884 | 1868 | case TRACK_DONE: |
| 1885 | | if (TRACE_STATE) logerror("%s: WRITE_BYTE_DONE / TRACK_DONE\n", tag()); |
| 1886 | 1869 | if(cur_live.previous_type == live_info::PT_CRC_1) { |
| 1887 | 1870 | cur_live.previous_type = live_info::PT_CRC_2; |
| 1888 | 1871 | if(dden) |
| r32313 | r32314 | |
| 1897 | 1880 | break; |
| 1898 | 1881 | |
| 1899 | 1882 | case SECTOR_WRITE: |
| 1900 | | if (TRACE_STATE) logerror("%s: WRITE_BYTE_DONE / SECTOR_WRITE\n", tag()); |
| 1901 | 1883 | cur_live.state = WRITE_BYTE; |
| 1902 | 1884 | cur_live.bit_counter = 16; |
| 1903 | 1885 | cur_live.byte_counter++; |
| r32313 | r32314 | |
| 1976 | 1958 | break; |
| 1977 | 1959 | |
| 1978 | 1960 | case WRITE_SECTOR_PRE: |
| 1979 | | if (TRACE_STATE) logerror("%s: WRITE_SECTOR_PRE\n", tag()); |
| 1980 | 1961 | if(read_one_bit(limit)) |
| 1981 | 1962 | return; |
| 1982 | 1963 | if(cur_live.bit_counter != 16) |
| r32313 | r32314 | |
| 1985 | 1966 | return; |
| 1986 | 1967 | |
| 1987 | 1968 | case WRITE_SECTOR_PRE_BYTE: |
| 1988 | | if (TRACE_STATE) logerror("%s: WRITE_SECTOR_PRE_BYTE\n", tag()); |
| 1989 | 1969 | cur_live.state = WRITE_SECTOR_PRE; |
| 1990 | 1970 | cur_live.byte_counter++; |
| 1991 | 1971 | cur_live.bit_counter = 0; |
| r32313 | r32314 | |
| 1995 | 1975 | checkpoint(); |
| 1996 | 1976 | break; |
| 1997 | 1977 | |
| 1998 | | // MZ: There is an inconsistency in the wd177x specs. |
| 1999 | | // The flow chart of wd177x for sector writing (page 1-12) |
| 2000 | | // says that after the sector header there is a 11 byte delay |
| 2001 | | // before the DR check and another 1 byte delay to the start of |
| 2002 | | // writing 0x00 (for FM). For MFM we have an additional 11 byte |
| 2003 | | // delay before the 0x00 sequence. |
| 2004 | | // However, the text of the section "Write sector" (1-9) and |
| 2005 | | // pages 1-17 and 1-18 imply that in Gap 2, the 0x00 sequence |
| 2006 | | // starts 11 bytes after the CRC field in FM and 22 bytes after |
| 2007 | | // the CRC field in MFM. |
| 1978 | // MZ: There is an inconsistency in the wd177x specs; compare |
| 1979 | // the flow chart and the text of the section "Write sector" (1-9) and |
| 1980 | // pages 1-17 and 1-18. |
| 2008 | 1981 | // |
| 2009 | 1982 | // I suppose the sum of the delays in the flow chart should be |
| 2010 | 1983 | // 11 and 22, so we shorten the 9-byte delay to 8 bytes. |