fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

cassette: Delay turning off the motor

+97 -52
+12 -5
src/arch/ibmpc/ibmpc.c
··· 844 844 static 845 845 void pc_setup_cassette (ibmpc_t *pc, ini_sct_t *ini) 846 846 { 847 - const char *read_name, *write_name; 848 - int enable; 849 - ini_sct_t *sct; 847 + int enable; 848 + const char *read_name, *write_name; 849 + unsigned long delay; 850 + ini_sct_t *sct; 850 851 851 852 pc->cas = NULL; 852 853 ··· 867 868 ini_get_string (sct, "file", &write_name, NULL); 868 869 ini_get_string (sct, "write", &write_name, write_name); 869 870 ini_get_string (sct, "read", &read_name, NULL); 871 + ini_get_uint32 (sct, "motor_delay", &delay, 0); 870 872 871 - pce_log_tag (MSG_INF, "CASSETTE:", "read=%s write=%s\n", 873 + pce_log_tag (MSG_INF, "CASSETTE:", "read=%s write=%s motor_delay=%lu\n", 872 874 (read_name != NULL) ? read_name : "<none>", 873 - (write_name != NULL) ? write_name : "<none>" 875 + (write_name != NULL) ? write_name : "<none>", 876 + delay 874 877 ); 875 878 876 879 if ((pc->cas = cas_new()) == NULL) { ··· 878 881 return; 879 882 } 880 883 884 + delay = (unsigned long) (((double) delay * PCE_IBMPC_CLK2) / 1000.0); 885 + 881 886 cas_set_clock (pc->cas, PCE_IBMPC_CLK2); 887 + cas_set_motor_delay (pc->cas, delay); 888 + 882 889 cas_set_auto_play (pc->cas, 1); 883 890 884 891 pti_set_default_clock (PCE_IBMPC_CLK2);
+3
src/arch/vic20/pce-vic20.cfg.in
··· 64 64 #read = "cassette.pti" 65 65 66 66 #write = "cassette-new.pti" 67 + 68 + # The motor off delay in milliseconds. 69 + motor_delay = 50 67 70 } 68 71 69 72 rom {
+10 -4
src/arch/vic20/setup.c
··· 212 212 static 213 213 void v20_setup_datasette (vic20_t *sim, ini_sct_t *ini) 214 214 { 215 - const char *read_name, *write_name; 216 - ini_sct_t *sct; 215 + const char *read_name, *write_name; 216 + unsigned long delay; 217 + ini_sct_t *sct; 217 218 218 219 cas_init (&sim->cas); 219 220 ··· 224 225 ini_get_string (sct, "file", &write_name, NULL); 225 226 ini_get_string (sct, "write", &write_name, write_name); 226 227 ini_get_string (sct, "read", &read_name, write_name); 228 + ini_get_uint32 (sct, "motor_delay", &delay, 50); 227 229 228 - pce_log_tag (MSG_INF, "CASSETTE:", "read=%s write=%s\n", 230 + pce_log_tag (MSG_INF, "CASSETTE:", "read=%s write=%s motor_delay=%lu\n", 229 231 (read_name != NULL) ? read_name : "<none>", 230 - (write_name != NULL) ? write_name : "<none>" 232 + (write_name != NULL) ? write_name : "<none>", 233 + delay 231 234 ); 232 235 236 + delay = (unsigned long) (((double) delay * sim->clock) / 1000.0); 237 + 233 238 cas_set_inp_fct (&sim->cas, sim, v20_cas_set_inp); 234 239 cas_set_play_fct (&sim->cas, sim, v20_cas_set_play); 235 240 cas_set_run_fct (&sim->cas, sim, v20_set_speed_tape); 236 241 237 242 cas_set_clock (&sim->cas, sim->clock); 243 + cas_set_motor_delay (&sim->cas, delay); 238 244 239 245 pti_set_default_clock (sim->clock); 240 246
+67 -42
src/devices/cassette.c
··· 288 288 289 289 cas->set_run = NULL; 290 290 cas->set_run_ext = NULL; 291 - cas->set_run_val = 0; 292 291 293 292 cas->read_img = NULL; 294 293 cas->read_name = NULL; ··· 299 298 cas->modified = 0; 300 299 cas->eof = 0; 301 300 301 + cas->run = 0; 302 302 cas->motor = 0; 303 303 cas->play = 0; 304 304 cas->record = 0; ··· 312 312 cas->clock = 0; 313 313 cas->remainder = 0; 314 314 cas->position = 0; 315 + 316 + cas->motor_delay = 0; 317 + cas->motor_delay_count = 0; 315 318 316 319 cas->counter = 0; 317 320 } ··· 381 384 void cas_set_auto_motor (cassette_t *cas, int val) 382 385 { 383 386 cas->auto_motor = (val != 0); 387 + } 388 + 389 + void cas_set_motor_delay (cassette_t *cas, unsigned long val) 390 + { 391 + cas->motor_delay = val; 384 392 } 385 393 386 394 static ··· 642 650 static 643 651 void cas_write_pulse_flush (cassette_t *cas) 644 652 { 645 - if ((cas->motor == 0) || (cas->record == 0)) { 653 + if ((cas->run == 0) || (cas->record == 0)) { 646 654 return; 647 655 } 648 656 ··· 653 661 } 654 662 655 663 static 656 - void cas_set_run (cassette_t *cas) 664 + void cas_run_stop (cassette_t *cas) 657 665 { 658 - unsigned char val; 666 + int run; 659 667 660 - val = (cas->motor && cas->play); 668 + run = (cas->motor && cas->play) || (cas->motor_delay_count > 0); 661 669 662 - if (cas->set_run_val == val) { 670 + if (cas->run == run) { 663 671 return; 664 672 } 665 673 666 - cas->set_run_val = val; 674 + if (cas->run && cas->record) { 675 + cas_write_pulse_flush (cas); 676 + } 677 + 678 + cas->run = run; 667 679 668 680 if (cas->set_run != NULL) { 669 - cas->set_run (cas->set_run_ext, val); 681 + cas->set_run (cas->set_run_ext, run); 682 + } 683 + 684 + if (cas->record) { 685 + cas->eof = 0; 686 + } 687 + 688 + cas_print_state (cas); 689 + 690 + if (cas->run) { 691 + cas->counter = 0; 692 + cas->remainder = 0; 670 693 } 671 694 } 672 695 ··· 679 702 } 680 703 681 704 cas->play = val; 705 + cas->motor_delay_count = 0; 682 706 683 - cas->counter = 0; 684 - cas->remainder = 0; 685 - cas->eof = 0; 707 + if (cas->auto_motor) { 708 + cas->motor = cas->play || cas->record; 709 + } 686 710 687 711 if (cas->set_play != NULL) { 688 712 cas->set_play (cas->set_play_ext, cas->play); 689 713 } 690 714 691 - if (cas->auto_motor) { 692 - cas->motor = cas->play || cas->record; 693 - } 694 - 695 - cas_set_run (cas); 715 + cas_run_stop (cas); 696 716 } 697 717 698 718 void cas_set_record (cassette_t *cas, int val) ··· 703 723 return; 704 724 } 705 725 706 - if ((cas->record != 0) && (val == 0)) { 726 + if (cas->run && cas->record) { 707 727 cas_write_pulse_flush (cas); 708 728 } 709 729 710 730 cas->record = val; 711 - 712 - cas->counter = 0; 713 - cas->remainder = 0; 714 - cas->eof = 0; 731 + cas->motor_delay_count = 0; 715 732 716 733 if (cas->auto_motor) { 717 734 cas->motor = cas->play || cas->record; 718 735 } 719 736 720 - cas_set_run (cas); 737 + cas_run_stop (cas); 721 738 } 722 739 723 740 void cas_press_keys (cassette_t *cas, int play, int record) ··· 752 769 if (cas->eof) { 753 770 state = "EOF"; 754 771 } 755 - else if (cas->motor && cas->play) { 772 + else if (cas->run) { 756 773 state = cas->record ? "SAVE" : "LOAD"; 757 774 } 758 775 else { ··· 772 789 { 773 790 val = (val != 0); 774 791 792 + if (cas->auto_motor) { 793 + val |= cas->play || cas->record; 794 + } 795 + 775 796 if (cas->motor == val) { 776 797 return; 777 798 } 778 799 779 - if ((cas->motor != 0) && (val == 0)) { 780 - cas_write_pulse_flush (cas); 781 - } 782 - 783 800 cas->motor = val; 784 801 785 - cas->counter = 0; 786 - cas->remainder = 0; 787 - cas->eof = 0; 802 + if (cas->run && (cas->motor == 0)) { 803 + cas->motor_delay_count = cas->motor_delay; 804 + } 805 + else { 806 + cas->motor_delay_count = 0; 807 + } 788 808 789 - cas_set_run (cas); 790 - cas_print_state (cas); 809 + cas_run_stop (cas); 791 810 } 792 811 793 812 static ··· 813 832 814 833 void cas_set_out (cassette_t *cas, int val) 815 834 { 816 - if ((cas->motor == 0) || (cas->record == 0)) { 817 - return; 818 - } 819 - 820 835 val = (val != 0); 821 836 822 837 if (cas->out_val == val) { 823 838 return; 824 839 } 825 840 841 + if ((cas->run == 0) || (cas->record == 0)) { 842 + cas->out_val = val; 843 + return; 844 + } 845 + 826 846 cas_write_pulse (cas, cas->counter, cas->out_val ? 1 : -1); 827 847 828 848 cas->counter = 0; ··· 834 854 { 835 855 int v; 836 856 837 - if ((cas->motor == 0) || (cas->play == 0)) { 857 + if (cas->run == 0) { 838 858 return; 839 859 } 840 860 861 + if (cas->motor_delay_count > 0) { 862 + cas->motor_delay_count -= 1; 863 + 864 + if (cas->motor_delay_count == 0) { 865 + cas_run_stop (cas); 866 + } 867 + } 868 + 841 869 if (cas->record) { 842 870 cas->counter += 1; 843 871 return; ··· 849 877 } 850 878 851 879 if (cas_read_pulse (cas, &cas->counter, &v)) { 852 - if (cas->eof == 0) { 853 - cas_press_keys (cas, 0, 0); 854 - cas->eof = 1; 855 - cas_print_state (cas); 856 - } 880 + cas->eof = 1; 881 + cas_press_keys (cas, 0, 0); 857 882 return; 858 883 } 859 884
+5 -1
src/devices/cassette.h
··· 36 36 37 37 void *set_run_ext; 38 38 void (*set_run) (void *ext, unsigned char val); 39 - unsigned char set_run_val; 40 39 41 40 pti_img_t *read_img; 42 41 char *read_name; ··· 47 46 char modified; 48 47 char eof; 49 48 49 + char run; 50 50 char motor; 51 51 char play; 52 52 char record; ··· 61 61 unsigned long remainder; 62 62 unsigned long position; 63 63 64 + unsigned long motor_delay; 65 + unsigned long motor_delay_count; 66 + 64 67 unsigned long counter; 65 68 } cassette_t; 66 69 ··· 81 84 82 85 void cas_set_auto_play (cassette_t *cas, int val); 83 86 void cas_set_auto_motor (cassette_t *cas, int val); 87 + void cas_set_motor_delay (cassette_t *cas, unsigned long val); 84 88 85 89 int cas_set_read_name (cassette_t *cas, const char *fname); 86 90 int cas_set_write_name (cassette_t *cas, const char *fname, int create);