blob: 35fbb71756fd46c741b493994b4f2090543f26d0 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
/**********************************************************************
American Systems Inc. S2350 Universal Synchronous Receiver/Transmitter
**********************************************************************/
#ifndef MAME_MACHINE_S2350_H
#define MAME_MACHINE_S2350_H
#pragma once
#include "machine/timer.h"
//
// AMI S2350 USRT
//
class s2350_device : public device_t
{
public:
s2350_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual ~s2350_device();
// transmit bits
auto tx_handler() { return m_tx_cb.bind(); }
// transmit statuses
auto transmit_buffer_empty_cb() { return m_tbmt.bind(); }
auto fill_character_transmitted_cb() { return m_fct.bind(); }
// receive statuses
auto received_data_available_cb() { return m_rda.bind(); }
auto sync_character_received_cb() { return m_scr.bind(); }
auto receiver_overrun_cb() { return m_ror.bind(); }
auto receiver_parity_error_cb() { return m_rpe.bind(); }
void rx_w(int state);
void transmitter_holding_reg_w(uint8_t data);
void transmit_fill_reg_w(uint8_t data);
void receiver_sync_reg_w(uint8_t data);
u8 receiver_output_reg_r();
u8 status_word_r();
u8 receiver_sync_search();
void receiver_restart();
// transmitter clock
void tcp_w();
// receiver clock
void rcp_w();
protected:
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
void update_receiver_shift();
void set_transmit_buffer_empty(bool val);
void set_fill_char_transmitted(bool val);
void set_received_data_available(bool val);
void set_receiver_overrun(bool val);
void set_receiver_parity_error(bool val);
void set_sync_character_received(bool val);
void receive_byte(uint8_t data);
u8 m_serial_rx_line;
// transmit flags
bool m_transmit_buffer_empty;
bool m_fill_char_transmitted;
// transmit registers
u8 m_transmitter_holding_reg;
u8 m_transmitter_fill_reg;
u8 m_transmitter_shift_reg;
// transmit state (current bit being sent)
uint8_t m_serial_tx_state;
// transmit status callbacks
devcb_write_line m_tbmt; // Transmit Buffer Empty
devcb_write_line m_fct; // Fill Character Transmitted
// transmit data callback
devcb_write_line m_tx_cb;
// receive flags
bool m_received_data_available;
bool m_receiver_overrun;
bool m_receiver_parity_error; // not currently used
bool m_sync_character_received;
// receive registers
u8 m_receiver_output_reg;
u8 m_receiver_sync_reg;
u8 m_receiver_shift_reg;
// receiver state
u8 m_serial_rx_state; // current bit being received
bool m_sync_search_active;
bool m_in_sync;
// receiver status callbacks
devcb_write_line m_rda; // Received Data Available
devcb_write_line m_scr; // Sync Character Received
devcb_write_line m_ror; // Receiver Overrun
devcb_write_line m_rpe; // Receiver Parity Error
};
DECLARE_DEVICE_TYPE(S2350, s2350_device)
#endif // MAME_MACHINE_S2350_H
|