trunk/src/emu/bus/a8sio/cassette.c
| r242664 | r242665 | |
| 26 | 26 | //************************************************************************** |
| 27 | 27 | |
| 28 | 28 | const device_type A8SIO_CASSETTE = &device_creator<a8sio_cassette_device>; |
| 29 | const device_timer_id TIMER_CASSETTE_READ = 1; |
| 29 | 30 | |
| 30 | 31 | static MACHINE_CONFIG_FRAGMENT( cassette ) |
| 31 | 32 | MCFG_CASSETTE_ADD("cassette") |
| 32 | | MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED) |
| 33 | //MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED) |
| 34 | MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY) |
| 33 | 35 | MCFG_CASSETTE_INTERFACE("atari8bit_cass") |
| 34 | 36 | MACHINE_CONFIG_END |
| 35 | 37 | |
| r242664 | r242665 | |
| 46 | 48 | : device_t(mconfig, A8SIO_CASSETTE, "Atari 8 bit cassette", tag, owner, clock, "a8sio_cass", __FILE__) |
| 47 | 49 | , device_a8sio_card_interface(mconfig, *this) |
| 48 | 50 | , m_cassette(*this, "cassette") |
| 51 | , m_old_cass_signal(0) |
| 52 | , m_signal_count(0) |
| 49 | 53 | { |
| 50 | 54 | } |
| 51 | 55 | |
| r242664 | r242665 | |
| 53 | 57 | : device_t(mconfig, type, name, tag, owner, clock, shortname, source) |
| 54 | 58 | , device_a8sio_card_interface(mconfig, *this) |
| 55 | 59 | , m_cassette(*this, "cassette") |
| 60 | , m_old_cass_signal(0) |
| 61 | , m_signal_count(0) |
| 56 | 62 | { |
| 57 | 63 | } |
| 58 | 64 | |
| 59 | 65 | void a8sio_cassette_device::device_start() |
| 60 | 66 | { |
| 61 | 67 | set_a8sio_device(); |
| 68 | |
| 69 | save_item(NAME(m_old_cass_signal)); |
| 70 | save_item(NAME(m_signal_count)); |
| 71 | |
| 72 | m_read_timer = timer_alloc(TIMER_CASSETTE_READ); |
| 62 | 73 | } |
| 63 | 74 | |
| 64 | 75 | void a8sio_cassette_device::device_reset() |
| r242664 | r242665 | |
| 68 | 79 | WRITE_LINE_MEMBER( a8sio_cassette_device::motor_w ) |
| 69 | 80 | { |
| 70 | 81 | //printf("a8sio_cassette::motor_w %d\n", state); |
| 82 | if (!state) |
| 83 | { |
| 84 | m_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR); |
| 85 | m_read_timer->adjust(attotime::zero, 0, attotime::from_hz(44100)); |
| 86 | } |
| 87 | else |
| 88 | { |
| 89 | m_cassette->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR); |
| 90 | m_read_timer->reset(); |
| 91 | } |
| 71 | 92 | } |
| 72 | 93 | |
| 94 | void a8sio_cassette_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 95 | { |
| 96 | switch (id) |
| 97 | { |
| 98 | case TIMER_CASSETTE_READ: |
| 99 | UINT8 cass_signal = m_cassette->input() < 0 ? 0 : 1; |
| 100 | |
| 101 | if (m_signal_count < 20) |
| 102 | { |
| 103 | m_signal_count++; |
| 104 | } |
| 105 | |
| 106 | if (cass_signal != m_old_cass_signal) |
| 107 | { |
| 108 | //printf("cass_signal: %d, count: %d, data: %d\n", cass_signal, m_signal_count, m_signal_count < 5 ? 1 : 0); |
| 109 | // ~4 kHz -> 0 |
| 110 | // ~5 kHz -> 1 |
| 111 | m_a8sio->data_in_w((m_signal_count < 5) ? 1 : 0); |
| 112 | m_signal_count = 0; |
| 113 | m_old_cass_signal = cass_signal; |
| 114 | } |
| 115 | break; |
| 116 | } |
| 117 | } |
| 118 | |