src/mess/machine/c2040.c
| r7248 | r7249 | |
| 646 | 646 | via6522_interface via_intf um3 |
| 647 | 647 | -------------------------------------------------*/ |
| 648 | 648 | |
| 649 | static void read_current_track(c2040_t *c2040, int unit) |
| 650 | { |
| 651 | c2040->unit[unit].track_len = G64_BUFFER_SIZE; |
| 652 | c2040->unit[unit].buffer_pos = G64_DATA_START; |
| 653 | c2040->unit[unit].bit_pos = 7; |
| 654 | c2040->bit_count = 0; |
| 655 | |
| 656 | /* read track data */ |
| 657 | floppy_drive_read_track_data_info_buffer(c2040->unit[unit].image, c2040->side, c2040->unit[unit].track_buffer, &c2040->unit[unit].track_len); |
| 658 | |
| 659 | /* extract track length */ |
| 660 | c2040->unit[unit].track_len = G64_DATA_START + ((c2040->unit[unit].track_buffer[1] << 8) | c2040->unit[unit].track_buffer[0]); |
| 661 | } |
| 662 | |
| 663 | static void step_motor(c2040_t *c2040, int unit, int stp) |
| 664 | { |
| 665 | if (c2040->unit[unit].stp != stp) |
| 666 | { |
| 667 | int tracks = 0; |
| 668 | |
| 669 | switch (c2040->unit[unit].stp) |
| 670 | { |
| 671 | case 0: if (stp == 1) tracks++; else if (stp == 3) tracks--; break; |
| 672 | case 1: if (stp == 2) tracks++; else if (stp == 0) tracks--; break; |
| 673 | case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break; |
| 674 | case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break; |
| 675 | } |
| 676 | |
| 677 | if (tracks != 0) |
| 678 | { |
| 679 | /* step read/write head */ |
| 680 | floppy_drive_seek(c2040->unit[unit].image, tracks); |
| 681 | |
| 682 | /* read new track data */ |
| 683 | read_current_track(c2040, unit); |
| 684 | } |
| 685 | |
| 686 | c2040->unit[unit].stp = stp; |
| 687 | } |
| 688 | } |
| 689 | |
| 649 | 690 | static READ8_DEVICE_HANDLER( via_pa_r ) |
| 650 | 691 | { |
| 651 | 692 | /* |
| r7248 | r7249 | |
| 692 | 733 | return 0; |
| 693 | 734 | } |
| 694 | 735 | |
| 695 | | static void step_motor(c2040_t *c2040, int unit, int stp) |
| 696 | | { |
| 697 | | if (c2040->unit[unit].stp != stp) |
| 698 | | { |
| 699 | | int tracks = 0; |
| 700 | | |
| 701 | | switch (c2040->unit[unit].stp) |
| 702 | | { |
| 703 | | case 0: if (stp == 1) tracks++; else if (stp == 3) tracks--; break; |
| 704 | | case 1: if (stp == 2) tracks++; else if (stp == 0) tracks--; break; |
| 705 | | case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break; |
| 706 | | case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break; |
| 707 | | } |
| 708 | | |
| 709 | | if (tracks != 0) |
| 710 | | { |
| 711 | | c2040->unit[unit].track_len = G64_BUFFER_SIZE; |
| 712 | | c2040->unit[unit].buffer_pos = G64_DATA_START; |
| 713 | | c2040->unit[unit].bit_pos = 7; |
| 714 | | c2040->bit_count = 0; |
| 715 | | |
| 716 | | /* step read/write head */ |
| 717 | | floppy_drive_seek(c2040->unit[unit].image, tracks); |
| 718 | | |
| 719 | | /* read track data */ |
| 720 | | floppy_drive_read_track_data_info_buffer(c2040->unit[unit].image, c2040->side, c2040->unit[unit].track_buffer, &c2040->unit[unit].track_len); |
| 721 | | |
| 722 | | /* extract track length */ |
| 723 | | c2040->unit[unit].track_len = G64_DATA_START + ((c2040->unit[unit].track_buffer[1] << 8) | c2040->unit[unit].track_buffer[0]); |
| 724 | | } |
| 725 | | |
| 726 | | c2040->unit[unit].stp = stp; |
| 727 | | } |
| 728 | | } |
| 729 | | |
| 730 | 736 | static WRITE8_DEVICE_HANDLER( via_pb_w ) |
| 731 | 737 | { |
| 732 | 738 | /* |
| r7248 | r7249 | |
| 824 | 830 | via6522_interface c8050_via_intf um3 |
| 825 | 831 | -------------------------------------------------*/ |
| 826 | 832 | |
| 833 | static void c8050_step_motor(c2040_t *c2040, int unit, int stp) |
| 834 | { |
| 835 | if (c2040->unit[unit].stp != stp) |
| 836 | { |
| 837 | int tracks = 0; |
| 838 | |
| 839 | switch (c2040->unit[unit].stp) |
| 840 | { |
| 841 | case 0: if (stp == 1) tracks++; else if (stp == 2) tracks--; break; |
| 842 | case 1: if (stp == 3) tracks++; else if (stp == 0) tracks--; break; |
| 843 | case 2: if (stp == 0) tracks++; else if (stp == 3) tracks--; break; |
| 844 | case 3: if (stp == 2) tracks++; else if (stp == 1) tracks--; break; |
| 845 | } |
| 846 | |
| 847 | if (tracks != 0) |
| 848 | { |
| 849 | /* step read/write head */ |
| 850 | floppy_drive_seek(c2040->unit[unit].image, tracks); |
| 851 | |
| 852 | /* read new track data */ |
| 853 | read_current_track(c2040, unit); |
| 854 | } |
| 855 | |
| 856 | c2040->unit[unit].stp = stp; |
| 857 | } |
| 858 | } |
| 859 | |
| 827 | 860 | static READ8_DEVICE_HANDLER( c8050_via_pb_r ) |
| 828 | 861 | { |
| 829 | 862 | /* |
| r7248 | r7249 | |
| 868 | 901 | |
| 869 | 902 | */ |
| 870 | 903 | |
| 871 | | via_pb_w(device, offset, data); |
| 904 | c2040_t *c2040 = get_safe_token(device->owner); |
| 872 | 905 | |
| 906 | /* stepper motor 1 */ |
| 907 | int s1 = data & 0x03; |
| 908 | c8050_step_motor(c2040, 1, s1); |
| 909 | |
| 910 | /* stepper motor 0 */ |
| 911 | int s0 = (data >> 2) & 0x03; |
| 912 | c8050_step_motor(c2040, 0, s0); |
| 913 | |
| 914 | /* spindle motor 1 */ |
| 915 | int mtr1 = BIT(data, 4); |
| 916 | floppy_mon_w(c2040->unit[1].image, !mtr1); |
| 917 | |
| 918 | /* spindle motor 0 */ |
| 919 | int mtr0 = BIT(data, 5); |
| 920 | floppy_mon_w(c2040->unit[0].image, !mtr0); |
| 921 | |
| 922 | timer_enable(c2040->bit_timer, mtr1 | mtr0); |
| 923 | |
| 873 | 924 | /* TODO pull sync */ |
| 874 | 925 | } |
| 875 | 926 | |