trunk/src/mess/machine/upd765.c
| r19037 | r19038 | |
| 505 | 505 | fifo_push(data, false); |
| 506 | 506 | } |
| 507 | 507 | |
| 508 | | void upd765_family_device::live_start(floppy_info &fi, int state) |
| 508 | void upd765_family_device::live_start(floppy_info &fi, int state, bool mfm) |
| 509 | 509 | { |
| 510 | 510 | cur_live.tm = machine().time(); |
| 511 | 511 | cur_live.state = state; |
| r19037 | r19038 | |
| 520 | 520 | cur_live.data_bit_context = false; |
| 521 | 521 | cur_live.byte_counter = 0; |
| 522 | 522 | cur_live.pll.reset(cur_live.tm); |
| 523 | | cur_live.pll.set_clock(attotime::from_hz(cur_rate*2)); |
| 523 | cur_live.pll.set_clock(attotime::from_hz(mfm ? 2*cur_rate : cur_rate)); |
| 524 | 524 | checkpoint_live = cur_live; |
| 525 | 525 | fi.live = true; |
| 526 | 526 | |
| r19037 | r19038 | |
| 1389 | 1389 | case SEEK_DONE: |
| 1390 | 1390 | fi.counter = 0; |
| 1391 | 1391 | fi.sub_state = SCAN_ID; |
| 1392 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM); |
| 1392 | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1393 | 1393 | return; |
| 1394 | 1394 | |
| 1395 | 1395 | case SCAN_ID: |
| r19037 | r19038 | |
| 1410 | 1410 | fi.sub_state = COMMAND_DONE; |
| 1411 | 1411 | break; |
| 1412 | 1412 | } |
| 1413 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM); |
| 1413 | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1414 | 1414 | return; |
| 1415 | 1415 | } |
| 1416 | 1416 | logerror("%s: reading sector %02x %02x %02x %02x\n", |
| r19037 | r19038 | |
| 1422 | 1422 | sector_size = calc_sector_size(cur_live.idbuf[3]); |
| 1423 | 1423 | fifo_expect(sector_size, false); |
| 1424 | 1424 | fi.sub_state = SECTOR_READ; |
| 1425 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_DATA : SEARCH_ADDRESS_MARK_DATA_FM); |
| 1425 | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_DATA : SEARCH_ADDRESS_MARK_DATA_FM, command[0] & 0x40); |
| 1426 | 1426 | return; |
| 1427 | 1427 | |
| 1428 | 1428 | case SCAN_ID_FAILED: |
| r19037 | r19038 | |
| 1527 | 1527 | case HEAD_LOAD_DONE: |
| 1528 | 1528 | fi.counter = 0; |
| 1529 | 1529 | fi.sub_state = SCAN_ID; |
| 1530 | | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1530 | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1531 | 1531 | return; |
| 1532 | 1532 | |
| 1533 | 1533 | case SCAN_ID: |
| 1534 | 1534 | if(!sector_matches()) { |
| 1535 | | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1535 | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1536 | 1536 | return; |
| 1537 | 1537 | } |
| 1538 | 1538 | if(cur_live.crc) { |
| 1539 | 1539 | fprintf(stderr, "Header CRC error\n"); |
| 1540 | | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1540 | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1541 | 1541 | return; |
| 1542 | 1542 | } |
| 1543 | 1543 | sector_size = calc_sector_size(cur_live.idbuf[3]); |
| 1544 | 1544 | fifo_expect(sector_size, true); |
| 1545 | 1545 | fi.sub_state = SECTOR_WRITTEN; |
| 1546 | | live_start(fi, WRITE_SECTOR_SKIP_GAP2); |
| 1546 | live_start(fi, WRITE_SECTOR_SKIP_GAP2, command[0] & 0x40); |
| 1547 | 1547 | return; |
| 1548 | 1548 | |
| 1549 | 1549 | case SCAN_ID_FAILED: |
| r19037 | r19038 | |
| 1665 | 1665 | case SEEK_DONE: |
| 1666 | 1666 | fi.counter = 0; |
| 1667 | 1667 | fi.sub_state = SCAN_ID; |
| 1668 | | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1668 | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1669 | 1669 | return; |
| 1670 | 1670 | |
| 1671 | 1671 | case SCAN_ID: |
| 1672 | 1672 | if(cur_live.crc) { |
| 1673 | 1673 | fprintf(stderr, "Header CRC error\n"); |
| 1674 | | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1674 | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1675 | 1675 | return; |
| 1676 | 1676 | } |
| 1677 | 1677 | sector_size = calc_sector_size(cur_live.idbuf[3]); |
| 1678 | 1678 | fifo_expect(sector_size, false); |
| 1679 | 1679 | fi.sub_state = SECTOR_READ; |
| 1680 | | live_start(fi, SEARCH_ADDRESS_MARK_DATA); |
| 1680 | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_DATA : SEARCH_ADDRESS_MARK_DATA_FM, command[0] & 0x40); |
| 1681 | 1681 | return; |
| 1682 | 1682 | |
| 1683 | 1683 | case SCAN_ID_FAILED: |
| r19037 | r19038 | |
| 1751 | 1751 | logerror("%s: index found, writing track\n", tag()); |
| 1752 | 1752 | fi.sub_state = TRACK_DONE; |
| 1753 | 1753 | cur_live.pll.start_writing(machine().time()); |
| 1754 | | live_start(fi, WRITE_TRACK_PRE_SECTORS); |
| 1754 | live_start(fi, WRITE_TRACK_PRE_SECTORS, command[0] & 0x40); |
| 1755 | 1755 | return; |
| 1756 | 1756 | |
| 1757 | 1757 | case TRACK_DONE: |
| r19037 | r19038 | |
| 1804 | 1804 | case HEAD_LOAD_DONE: |
| 1805 | 1805 | fi.counter = 0; |
| 1806 | 1806 | fi.sub_state = SCAN_ID; |
| 1807 | | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1807 | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1808 | 1808 | return; |
| 1809 | 1809 | |
| 1810 | 1810 | case SCAN_ID: |