trunk/src/mess/machine/upd765.c
| r19065 | r19066 | |
| 505 | 505 | fifo_push(data, false); |
| 506 | 506 | } |
| 507 | 507 | |
| 508 | | void upd765_family_device::live_start(floppy_info &fi, int state, bool mfm) |
| 508 | void upd765_family_device::live_start(floppy_info &fi, int state) |
| 509 | 509 | { |
| 510 | 510 | cur_live.tm = machine().time(); |
| 511 | 511 | cur_live.state = state; |
| r19065 | r19066 | |
| 630 | 630 | cur_live.bit_counter); |
| 631 | 631 | #endif |
| 632 | 632 | |
| 633 | | if(cur_live.shift_reg == 0x4489) { |
| 633 | if(mfm && cur_live.shift_reg == 0x4489) { |
| 634 | 634 | cur_live.crc = 0x443b; |
| 635 | 635 | cur_live.data_separator_phase = false; |
| 636 | 636 | cur_live.bit_counter = 0; |
| 637 | 637 | cur_live.state = READ_HEADER_BLOCK_HEADER; |
| 638 | 638 | } |
| 639 | |
| 640 | if(!mfm && cur_live.shift_reg == 0xf57e) { |
| 641 | cur_live.crc = 0xef21; |
| 642 | cur_live.data_separator_phase = false; |
| 643 | cur_live.bit_counter = 0; |
| 644 | cur_live.state = READ_ID_BLOCK; |
| 645 | } |
| 639 | 646 | break; |
| 640 | 647 | |
| 641 | 648 | case READ_HEADER_BLOCK_HEADER: { |
| r19065 | r19066 | |
| 674 | 681 | break; |
| 675 | 682 | } |
| 676 | 683 | |
| 677 | | case SEARCH_ADDRESS_MARK_HEADER_FM: |
| 678 | | if(read_one_bit(limit)) |
| 679 | | return; |
| 680 | | #if 0 |
| 681 | | fprintf(stderr, "%s: shift = %04x data=%02x c=%d\n", tts(cur_live.tm).cstr(), cur_live.shift_reg, |
| 682 | | (cur_live.shift_reg & 0x4000 ? 0x80 : 0x00) | |
| 683 | | (cur_live.shift_reg & 0x1000 ? 0x40 : 0x00) | |
| 684 | | (cur_live.shift_reg & 0x0400 ? 0x20 : 0x00) | |
| 685 | | (cur_live.shift_reg & 0x0100 ? 0x10 : 0x00) | |
| 686 | | (cur_live.shift_reg & 0x0040 ? 0x08 : 0x00) | |
| 687 | | (cur_live.shift_reg & 0x0010 ? 0x04 : 0x00) | |
| 688 | | (cur_live.shift_reg & 0x0004 ? 0x02 : 0x00) | |
| 689 | | (cur_live.shift_reg & 0x0001 ? 0x01 : 0x00), |
| 690 | | cur_live.bit_counter); |
| 691 | | #endif |
| 692 | | |
| 693 | | if(cur_live.shift_reg == 0xf57e) { |
| 694 | | cur_live.crc = 0xef21; |
| 695 | | cur_live.data_separator_phase = false; |
| 696 | | cur_live.bit_counter = 0; |
| 697 | | cur_live.state = READ_ID_BLOCK; |
| 698 | | } |
| 699 | | break; |
| 700 | | |
| 701 | 684 | case READ_ID_BLOCK: { |
| 702 | 685 | if(read_one_bit(limit)) |
| 703 | 686 | return; |
| r19065 | r19066 | |
| 730 | 713 | (cur_live.shift_reg & 0x0001 ? 0x01 : 0x00), |
| 731 | 714 | cur_live.bit_counter >> 4, cur_live.bit_counter & 15); |
| 732 | 715 | #endif |
| 733 | | // Large tolerance due to perpendicular recording at extended density |
| 734 | | if(cur_live.bit_counter > 62*16) { |
| 735 | | live_delay(SEARCH_ADDRESS_MARK_DATA_FAILED); |
| 736 | | return; |
| 716 | |
| 717 | if(mfm) { |
| 718 | // Large tolerance due to perpendicular recording at extended density |
| 719 | if(cur_live.bit_counter > 62*16) { |
| 720 | live_delay(SEARCH_ADDRESS_MARK_DATA_FAILED); |
| 721 | return; |
| 722 | } |
| 723 | |
| 724 | if(cur_live.bit_counter >= 28*16 && cur_live.shift_reg == 0x4489) { |
| 725 | cur_live.crc = 0x443b; |
| 726 | cur_live.data_separator_phase = false; |
| 727 | cur_live.bit_counter = 0; |
| 728 | cur_live.state = READ_DATA_BLOCK_HEADER; |
| 729 | } |
| 730 | |
| 731 | } else { |
| 732 | if(cur_live.bit_counter > 23*16) { |
| 733 | live_delay(SEARCH_ADDRESS_MARK_DATA_FAILED); |
| 734 | return; |
| 735 | } |
| 736 | |
| 737 | if(cur_live.bit_counter >= 11*16 && (cur_live.shift_reg == 0xf56a || cur_live.shift_reg == 0xf56f)) { |
| 738 | cur_live.crc = cur_live.shift_reg == 0xf56a ? 0x8fe7 : 0xbf84; |
| 739 | cur_live.data_separator_phase = false; |
| 740 | cur_live.bit_counter = 0; |
| 741 | cur_live.state = READ_SECTOR_DATA; |
| 742 | } |
| 737 | 743 | } |
| 738 | 744 | |
| 739 | | if(cur_live.bit_counter >= 28*16 && cur_live.shift_reg == 0x4489) { |
| 740 | | cur_live.crc = 0x443b; |
| 741 | | cur_live.data_separator_phase = false; |
| 742 | | cur_live.bit_counter = 0; |
| 743 | | cur_live.state = READ_DATA_BLOCK_HEADER; |
| 744 | | } |
| 745 | 745 | break; |
| 746 | 746 | |
| 747 | 747 | case READ_DATA_BLOCK_HEADER: { |
| r19065 | r19066 | |
| 787 | 787 | cur_live.state = IDLE; |
| 788 | 788 | return; |
| 789 | 789 | |
| 790 | | case SEARCH_ADDRESS_MARK_DATA_FM: |
| 791 | | if(read_one_bit(limit)) |
| 792 | | return; |
| 793 | | #if 0 |
| 794 | | fprintf(stderr, "%s: shift = %04x data=%02x c=%d.%x\n", tts(cur_live.tm).cstr(), cur_live.shift_reg, |
| 795 | | (cur_live.shift_reg & 0x4000 ? 0x80 : 0x00) | |
| 796 | | (cur_live.shift_reg & 0x1000 ? 0x40 : 0x00) | |
| 797 | | (cur_live.shift_reg & 0x0400 ? 0x20 : 0x00) | |
| 798 | | (cur_live.shift_reg & 0x0100 ? 0x10 : 0x00) | |
| 799 | | (cur_live.shift_reg & 0x0040 ? 0x08 : 0x00) | |
| 800 | | (cur_live.shift_reg & 0x0010 ? 0x04 : 0x00) | |
| 801 | | (cur_live.shift_reg & 0x0004 ? 0x02 : 0x00) | |
| 802 | | (cur_live.shift_reg & 0x0001 ? 0x01 : 0x00), |
| 803 | | cur_live.bit_counter >> 4, cur_live.bit_counter & 15); |
| 804 | | #endif |
| 805 | | if(cur_live.bit_counter > 23*16) { |
| 806 | | live_delay(SEARCH_ADDRESS_MARK_DATA_FAILED); |
| 807 | | return; |
| 808 | | } |
| 809 | | |
| 810 | | if(cur_live.bit_counter >= 11*16 && (cur_live.shift_reg == 0xf56a || cur_live.shift_reg == 0xf56f)) { |
| 811 | | cur_live.crc = cur_live.shift_reg == 0xf56a ? 0x8fe7 : 0xbf84; |
| 812 | | cur_live.data_separator_phase = false; |
| 813 | | cur_live.bit_counter = 0; |
| 814 | | cur_live.state = READ_SECTOR_DATA; |
| 815 | | } |
| 816 | | break; |
| 817 | | |
| 818 | 790 | case READ_SECTOR_DATA: { |
| 819 | 791 | if(read_one_bit(limit)) |
| 820 | 792 | return; |
| r19065 | r19066 | |
| 853 | 825 | case WRITE_SECTOR_SKIP_GAP2_BYTE: |
| 854 | 826 | if(read_one_bit(limit)) |
| 855 | 827 | return; |
| 856 | | if(cur_live.bit_counter != 22*16) |
| 828 | if(mfm && cur_live.bit_counter != 22*16) |
| 857 | 829 | break; |
| 830 | if(!mfm && cur_live.bit_counter != 11*16) |
| 831 | break; |
| 858 | 832 | cur_live.bit_counter = 0; |
| 859 | 833 | cur_live.byte_counter = 0; |
| 860 | 834 | live_delay(WRITE_SECTOR_DATA); |
| 861 | 835 | return; |
| 862 | 836 | |
| 863 | 837 | case WRITE_SECTOR_DATA: |
| 864 | | if(cur_live.byte_counter < 12) |
| 865 | | live_write_mfm(0x00); |
| 866 | | else if(cur_live.byte_counter < 15) |
| 867 | | live_write_raw(0x4489); |
| 868 | | else if(cur_live.byte_counter < 16) { |
| 869 | | cur_live.crc = 0xcdb4; |
| 870 | | live_write_mfm(command[0] & 0x08 ? 0xf8 : 0xfb); |
| 871 | | } else if(cur_live.byte_counter < 16+sector_size) |
| 872 | | live_write_mfm(tc_done && !fifo_pos? 0x00 : fifo_pop(true)); |
| 873 | | else if(cur_live.byte_counter < 16+sector_size+2) |
| 874 | | live_write_mfm(cur_live.crc >> 8); |
| 875 | | else if(cur_live.byte_counter < 16+sector_size+2+command[7]) |
| 876 | | live_write_mfm(0x4e); |
| 877 | | else { |
| 878 | | cur_live.pll.stop_writing(cur_live.fi->dev, cur_live.tm); |
| 879 | | cur_live.state = IDLE; |
| 880 | | return; |
| 838 | if(mfm) { |
| 839 | if(cur_live.byte_counter < 12) |
| 840 | live_write_mfm(0x00); |
| 841 | else if(cur_live.byte_counter < 15) |
| 842 | live_write_raw(0x4489); |
| 843 | else if(cur_live.byte_counter < 16) { |
| 844 | cur_live.crc = 0xcdb4; |
| 845 | live_write_mfm(command[0] & 0x08 ? 0xf8 : 0xfb); |
| 846 | } else if(cur_live.byte_counter < 16+sector_size) |
| 847 | live_write_mfm(tc_done && !fifo_pos? 0x00 : fifo_pop(true)); |
| 848 | else if(cur_live.byte_counter < 16+sector_size+2) |
| 849 | live_write_mfm(cur_live.crc >> 8); |
| 850 | else if(cur_live.byte_counter < 16+sector_size+2+command[7]) |
| 851 | live_write_mfm(0x4e); |
| 852 | else { |
| 853 | cur_live.pll.stop_writing(cur_live.fi->dev, cur_live.tm); |
| 854 | cur_live.state = IDLE; |
| 855 | return; |
| 856 | } |
| 857 | |
| 858 | } else { |
| 859 | if(cur_live.byte_counter < 6) |
| 860 | live_write_fm(0x00); |
| 861 | else if(cur_live.byte_counter < 7) { |
| 862 | cur_live.crc = 0xffff; |
| 863 | live_write_raw(command[0] & 0x08 ? 0xf56a : 0xf56f); |
| 864 | } else if(cur_live.byte_counter < 7+sector_size) |
| 865 | live_write_fm(tc_done && !fifo_pos? 0x00 : fifo_pop(true)); |
| 866 | else if(cur_live.byte_counter < 7+sector_size+2) |
| 867 | live_write_fm(cur_live.crc >> 8); |
| 868 | else if(cur_live.byte_counter < 7+sector_size+2+command[7]) |
| 869 | live_write_fm(0xff); |
| 870 | else { |
| 871 | cur_live.pll.stop_writing(cur_live.fi->dev, cur_live.tm); |
| 872 | cur_live.state = IDLE; |
| 873 | return; |
| 874 | } |
| 881 | 875 | } |
| 882 | 876 | cur_live.state = WRITE_SECTOR_DATA_BYTE; |
| 883 | 877 | cur_live.bit_counter = 16; |
| r19065 | r19066 | |
| 887 | 881 | case WRITE_TRACK_PRE_SECTORS: |
| 888 | 882 | if(!cur_live.byte_counter && command[3]) |
| 889 | 883 | fifo_expect(4, true); |
| 890 | | if(cur_live.byte_counter < 80) |
| 891 | | live_write_mfm(0x4e); |
| 892 | | else if(cur_live.byte_counter < 92) |
| 893 | | live_write_mfm(0x00); |
| 894 | | else if(cur_live.byte_counter < 95) |
| 895 | | live_write_raw(0x5224); |
| 896 | | else if(cur_live.byte_counter < 96) |
| 897 | | live_write_mfm(0xfc); |
| 898 | | else if(cur_live.byte_counter < 146) |
| 899 | | live_write_mfm(0x4e); |
| 900 | | else { |
| 901 | | cur_live.state = WRITE_TRACK_SECTOR; |
| 902 | | cur_live.byte_counter = 0; |
| 903 | | break; |
| 884 | if(mfm) { |
| 885 | if(cur_live.byte_counter < 80) |
| 886 | live_write_mfm(0x4e); |
| 887 | else if(cur_live.byte_counter < 92) |
| 888 | live_write_mfm(0x00); |
| 889 | else if(cur_live.byte_counter < 95) |
| 890 | live_write_raw(0x5224); |
| 891 | else if(cur_live.byte_counter < 96) |
| 892 | live_write_mfm(0xfc); |
| 893 | else if(cur_live.byte_counter < 146) |
| 894 | live_write_mfm(0x4e); |
| 895 | else { |
| 896 | cur_live.state = WRITE_TRACK_SECTOR; |
| 897 | cur_live.byte_counter = 0; |
| 898 | break; |
| 899 | } |
| 900 | } else { |
| 901 | if(cur_live.byte_counter < 40) |
| 902 | live_write_fm(0xff); |
| 903 | else if(cur_live.byte_counter < 46) |
| 904 | live_write_fm(0x00); |
| 905 | else if(cur_live.byte_counter < 47) |
| 906 | live_write_raw(0xf77a); |
| 907 | else if(cur_live.byte_counter < 73) |
| 908 | live_write_fm(0xff); |
| 909 | else { |
| 910 | cur_live.state = WRITE_TRACK_SECTOR; |
| 911 | cur_live.byte_counter = 0; |
| 912 | break; |
| 913 | } |
| 904 | 914 | } |
| 905 | 915 | cur_live.state = WRITE_TRACK_PRE_SECTORS_BYTE; |
| 906 | 916 | cur_live.bit_counter = 16; |
| r19065 | r19066 | |
| 913 | 923 | if(command[3]) |
| 914 | 924 | fifo_expect(4, true); |
| 915 | 925 | } |
| 916 | | if(cur_live.byte_counter < 12) |
| 917 | | live_write_mfm(0x00); |
| 918 | | else if(cur_live.byte_counter < 15) |
| 919 | | live_write_raw(0x4489); |
| 920 | | else if(cur_live.byte_counter < 16) { |
| 921 | | cur_live.crc = 0xcdb4; |
| 922 | | live_write_mfm(0xfe); |
| 923 | | } else if(cur_live.byte_counter < 20) |
| 924 | | live_write_mfm(fifo_pop(true)); |
| 925 | | else if(cur_live.byte_counter < 22) |
| 926 | | live_write_mfm(cur_live.crc >> 8); |
| 927 | | else if(cur_live.byte_counter < 44) |
| 928 | | live_write_mfm(0x4e); |
| 929 | | else if(cur_live.byte_counter < 56) |
| 930 | | live_write_mfm(0x00); |
| 931 | | else if(cur_live.byte_counter < 59) |
| 932 | | live_write_raw(0x4489); |
| 933 | | else if(cur_live.byte_counter < 60) { |
| 934 | | cur_live.crc = 0xcdb4; |
| 935 | | live_write_mfm(0xfb); |
| 936 | | } else if(cur_live.byte_counter < 60+sector_size) |
| 937 | | live_write_mfm(command[5]); |
| 938 | | else if(cur_live.byte_counter < 62+sector_size) |
| 939 | | live_write_mfm(cur_live.crc >> 8); |
| 940 | | else if(cur_live.byte_counter < 62+sector_size+command[4]) |
| 941 | | live_write_mfm(0x4e); |
| 942 | | else { |
| 943 | | cur_live.byte_counter = 0; |
| 944 | | cur_live.state = command[3] ? WRITE_TRACK_SECTOR : WRITE_TRACK_POST_SECTORS; |
| 945 | | break; |
| 926 | if(mfm) { |
| 927 | if(cur_live.byte_counter < 12) |
| 928 | live_write_mfm(0x00); |
| 929 | else if(cur_live.byte_counter < 15) |
| 930 | live_write_raw(0x4489); |
| 931 | else if(cur_live.byte_counter < 16) { |
| 932 | cur_live.crc = 0xcdb4; |
| 933 | live_write_mfm(0xfe); |
| 934 | } else if(cur_live.byte_counter < 20) |
| 935 | live_write_mfm(fifo_pop(true)); |
| 936 | else if(cur_live.byte_counter < 22) |
| 937 | live_write_mfm(cur_live.crc >> 8); |
| 938 | else if(cur_live.byte_counter < 44) |
| 939 | live_write_mfm(0x4e); |
| 940 | else if(cur_live.byte_counter < 56) |
| 941 | live_write_mfm(0x00); |
| 942 | else if(cur_live.byte_counter < 59) |
| 943 | live_write_raw(0x4489); |
| 944 | else if(cur_live.byte_counter < 60) { |
| 945 | cur_live.crc = 0xcdb4; |
| 946 | live_write_mfm(0xfb); |
| 947 | } else if(cur_live.byte_counter < 60+sector_size) |
| 948 | live_write_mfm(command[5]); |
| 949 | else if(cur_live.byte_counter < 62+sector_size) |
| 950 | live_write_mfm(cur_live.crc >> 8); |
| 951 | else if(cur_live.byte_counter < 62+sector_size+command[4]) |
| 952 | live_write_mfm(0x4e); |
| 953 | else { |
| 954 | cur_live.byte_counter = 0; |
| 955 | cur_live.state = command[3] ? WRITE_TRACK_SECTOR : WRITE_TRACK_POST_SECTORS; |
| 956 | break; |
| 957 | } |
| 958 | |
| 959 | } else { |
| 960 | if(cur_live.byte_counter < 6) |
| 961 | live_write_fm(0x00); |
| 962 | else if(cur_live.byte_counter < 7) { |
| 963 | cur_live.crc = 0xffff; |
| 964 | live_write_raw(0xf57e); |
| 965 | } else if(cur_live.byte_counter < 11) |
| 966 | live_write_fm(fifo_pop(true)); |
| 967 | else if(cur_live.byte_counter < 13) |
| 968 | live_write_fm(cur_live.crc >> 8); |
| 969 | else if(cur_live.byte_counter < 24) |
| 970 | live_write_fm(0xff); |
| 971 | else if(cur_live.byte_counter < 30) |
| 972 | live_write_fm(0x00); |
| 973 | else if(cur_live.byte_counter < 31) { |
| 974 | cur_live.crc = 0xffff; |
| 975 | live_write_raw(0xf56f); |
| 976 | } else if(cur_live.byte_counter < 31+sector_size) |
| 977 | live_write_fm(command[5]); |
| 978 | else if(cur_live.byte_counter < 33+sector_size) |
| 979 | live_write_fm(cur_live.crc >> 8); |
| 980 | else if(cur_live.byte_counter < 33+sector_size+command[4]) |
| 981 | live_write_fm(0xff); |
| 982 | else { |
| 983 | cur_live.byte_counter = 0; |
| 984 | cur_live.state = command[3] ? WRITE_TRACK_SECTOR : WRITE_TRACK_POST_SECTORS; |
| 985 | break; |
| 986 | } |
| 946 | 987 | } |
| 947 | 988 | cur_live.state = WRITE_TRACK_SECTOR_BYTE; |
| 948 | 989 | cur_live.bit_counter = 16; |
| r19065 | r19066 | |
| 950 | 991 | break; |
| 951 | 992 | |
| 952 | 993 | case WRITE_TRACK_POST_SECTORS: |
| 953 | | live_write_mfm(0x4e); |
| 994 | if(mfm) |
| 995 | live_write_mfm(0x4e); |
| 996 | else |
| 997 | live_write_fm(0xff); |
| 954 | 998 | cur_live.state = WRITE_TRACK_POST_SECTORS_BYTE; |
| 955 | 999 | cur_live.bit_counter = 16; |
| 956 | 1000 | checkpoint(); |
| r19065 | r19066 | |
| 1319 | 1363 | { |
| 1320 | 1364 | fi.main_state = READ_DATA; |
| 1321 | 1365 | fi.sub_state = HEAD_LOAD_DONE; |
| 1366 | mfm = command[0] & 0x40; |
| 1322 | 1367 | logerror("%s: command read%s data%s%s%s%s cmd=%02x sel=%x chrn=(%d, %d, %d, %d) eot=%02x gpl=%02x dtl=%02x rate=%d\n", |
| 1323 | 1368 | tag(), |
| 1324 | 1369 | command[0] & 0x08 ? " deleted" : "", |
| r19065 | r19066 | |
| 1389 | 1434 | case SEEK_DONE: |
| 1390 | 1435 | fi.counter = 0; |
| 1391 | 1436 | fi.sub_state = SCAN_ID; |
| 1392 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1437 | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1393 | 1438 | return; |
| 1394 | 1439 | |
| 1395 | 1440 | case SCAN_ID: |
| r19065 | r19066 | |
| 1410 | 1455 | fi.sub_state = COMMAND_DONE; |
| 1411 | 1456 | break; |
| 1412 | 1457 | } |
| 1413 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1458 | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1414 | 1459 | return; |
| 1415 | 1460 | } |
| 1416 | 1461 | logerror("%s: reading sector %02x %02x %02x %02x\n", |
| r19065 | r19066 | |
| 1422 | 1467 | sector_size = calc_sector_size(cur_live.idbuf[3]); |
| 1423 | 1468 | fifo_expect(sector_size, false); |
| 1424 | 1469 | fi.sub_state = SECTOR_READ; |
| 1425 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_DATA : SEARCH_ADDRESS_MARK_DATA_FM, command[0] & 0x40); |
| 1470 | live_start(fi, SEARCH_ADDRESS_MARK_DATA); |
| 1426 | 1471 | return; |
| 1427 | 1472 | |
| 1428 | 1473 | case SCAN_ID_FAILED: |
| r19065 | r19066 | |
| 1494 | 1539 | { |
| 1495 | 1540 | fi.main_state = WRITE_DATA; |
| 1496 | 1541 | fi.sub_state = HEAD_LOAD_DONE; |
| 1542 | mfm = command[0] & 0x40; |
| 1497 | 1543 | logerror("%s: command write%s data%s%s cmd=%02x sel=%x chrn=(%d, %d, %d, %d) eot=%02x gpl=%02x dtl=%02x rate=%d\n", |
| 1498 | 1544 | tag(), |
| 1499 | 1545 | command[0] & 0x08 ? " deleted" : "", |
| r19065 | r19066 | |
| 1527 | 1573 | case HEAD_LOAD_DONE: |
| 1528 | 1574 | fi.counter = 0; |
| 1529 | 1575 | fi.sub_state = SCAN_ID; |
| 1530 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1576 | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1531 | 1577 | return; |
| 1532 | 1578 | |
| 1533 | 1579 | case SCAN_ID: |
| 1534 | 1580 | if(!sector_matches()) { |
| 1535 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1581 | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1536 | 1582 | return; |
| 1537 | 1583 | } |
| 1538 | 1584 | if(cur_live.crc) { |
| r19065 | r19066 | |
| 1545 | 1591 | sector_size = calc_sector_size(cur_live.idbuf[3]); |
| 1546 | 1592 | fifo_expect(sector_size, true); |
| 1547 | 1593 | fi.sub_state = SECTOR_WRITTEN; |
| 1548 | | live_start(fi, WRITE_SECTOR_SKIP_GAP2, command[0] & 0x40); |
| 1594 | live_start(fi, WRITE_SECTOR_SKIP_GAP2); |
| 1549 | 1595 | return; |
| 1550 | 1596 | |
| 1551 | 1597 | case SCAN_ID_FAILED: |
| r19065 | r19066 | |
| 1605 | 1651 | { |
| 1606 | 1652 | fi.main_state = READ_TRACK; |
| 1607 | 1653 | fi.sub_state = HEAD_LOAD_DONE; |
| 1654 | mfm = command[0] & 0x40; |
| 1608 | 1655 | |
| 1609 | 1656 | logerror("%s: command read track%s cmd=%02x sel=%x chrn=(%d, %d, %d, %d) eot=%02x gpl=%02x dtl=%02x rate=%d\n", |
| 1610 | 1657 | tag(), |
| r19065 | r19066 | |
| 1667 | 1714 | case SEEK_DONE: |
| 1668 | 1715 | fi.counter = 0; |
| 1669 | 1716 | fi.sub_state = SCAN_ID; |
| 1670 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1717 | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1671 | 1718 | return; |
| 1672 | 1719 | |
| 1673 | 1720 | case SCAN_ID: |
| 1674 | 1721 | if(cur_live.crc) { |
| 1675 | 1722 | fprintf(stderr, "Header CRC error\n"); |
| 1676 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1723 | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1677 | 1724 | return; |
| 1678 | 1725 | } |
| 1679 | 1726 | sector_size = calc_sector_size(cur_live.idbuf[3]); |
| 1680 | 1727 | fifo_expect(sector_size, false); |
| 1681 | 1728 | fi.sub_state = SECTOR_READ; |
| 1682 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_DATA : SEARCH_ADDRESS_MARK_DATA_FM, command[0] & 0x40); |
| 1729 | live_start(fi, SEARCH_ADDRESS_MARK_DATA); |
| 1683 | 1730 | return; |
| 1684 | 1731 | |
| 1685 | 1732 | case SCAN_ID_FAILED: |
| r19065 | r19066 | |
| 1725 | 1772 | { |
| 1726 | 1773 | fi.main_state = FORMAT_TRACK; |
| 1727 | 1774 | fi.sub_state = HEAD_LOAD_DONE; |
| 1775 | mfm = command[0] & 0x40; |
| 1728 | 1776 | |
| 1729 | 1777 | logerror("%s: command format track %s h=%02x n=%02x sc=%02x gpl=%02x d=%02x\n", |
| 1730 | 1778 | tag(), |
| r19065 | r19066 | |
| 1753 | 1801 | logerror("%s: index found, writing track\n", tag()); |
| 1754 | 1802 | fi.sub_state = TRACK_DONE; |
| 1755 | 1803 | cur_live.pll.start_writing(machine().time()); |
| 1756 | | live_start(fi, WRITE_TRACK_PRE_SECTORS, command[0] & 0x40); |
| 1804 | live_start(fi, WRITE_TRACK_PRE_SECTORS); |
| 1757 | 1805 | return; |
| 1758 | 1806 | |
| 1759 | 1807 | case TRACK_DONE: |
| r19065 | r19066 | |
| 1780 | 1828 | { |
| 1781 | 1829 | fi.main_state = READ_ID; |
| 1782 | 1830 | fi.sub_state = HEAD_LOAD_DONE; |
| 1831 | mfm = command[0] & 0x40; |
| 1783 | 1832 | |
| 1784 | 1833 | logerror("%s: command read id%s, rate=%d\n", |
| 1785 | 1834 | tag(), |
| r19065 | r19066 | |
| 1806 | 1855 | case HEAD_LOAD_DONE: |
| 1807 | 1856 | fi.counter = 0; |
| 1808 | 1857 | fi.sub_state = SCAN_ID; |
| 1809 | | live_start(fi, command[0] & 0x40 ? SEARCH_ADDRESS_MARK_HEADER : SEARCH_ADDRESS_MARK_HEADER_FM, command[0] & 0x40); |
| 1858 | live_start(fi, SEARCH_ADDRESS_MARK_HEADER); |
| 1810 | 1859 | return; |
| 1811 | 1860 | |
| 1812 | 1861 | case SCAN_ID: |
| r19065 | r19066 | |
| 1929 | 1978 | floppy_info &fi = flopi[fid]; |
| 1930 | 1979 | if(fi.dev != floppy) |
| 1931 | 1980 | continue; |
| 1981 | fprintf(stderr, "floppy %d index %d sub_state %d\n", fid, state, fi.sub_state); |
| 1932 | 1982 | |
| 1933 | 1983 | if(fi.live) |
| 1934 | 1984 | live_sync(); |
| r19065 | r19066 | |
| 2081 | 2131 | |
| 2082 | 2132 | void upd765_family_device::live_write_fm(UINT8 fm) |
| 2083 | 2133 | { |
| 2084 | | bool context = cur_live.data_bit_context; |
| 2085 | | UINT16 raw = 0; |
| 2086 | | for(int i=0; i<8; i++) { |
| 2087 | | bool bit = fm & (0x80 >> i); |
| 2088 | | raw |= 0x8000 >> (2*i); |
| 2089 | | if(bit) |
| 2134 | UINT16 raw = 0xaaaa; |
| 2135 | for(int i=0; i<8; i++) |
| 2136 | if(fm & (0x80 >> i)) |
| 2090 | 2137 | raw |= 0x4000 >> (2*i); |
| 2091 | | context = bit; |
| 2092 | | } |
| 2093 | 2138 | cur_live.data_reg = fm; |
| 2094 | 2139 | cur_live.shift_reg = raw; |
| 2095 | | cur_live.data_bit_context = context; |
| 2140 | cur_live.data_bit_context = fm & 1; |
| 2096 | 2141 | // logerror("write %02x %04x %04x\n", fm, cur_live.crc, raw); |
| 2097 | 2142 | } |
| 2098 | 2143 | |