1 // license:BSD-3-Clause
2 // copyright-holders:Sandro Ronco
3 /****************************************************************************
4 
5     pce220_ser.h
6 
7     Sharp PC-E220/PC-G850V Serial I/O
8 
9 ****************************************************************************/
10 
11 #ifndef MAME_MACHINE_PCE220_SER_H
12 #define MAME_MACHINE_PCE220_SER_H
13 
14 #pragma once
15 
16 
17 /***************************************************************************
18     TYPE DEFINITIONS
19 ***************************************************************************/
20 
21 // ======================> pce220_serial_device
22 
23 class pce220_serial_device :    public device_t,
24 								public device_image_interface
25 {
26 public:
27 	// construction/destruction
28 	pce220_serial_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
29 	virtual ~pce220_serial_device();
30 
31 	// image-level overrides
32 	virtual image_init_result call_load() override;
33 	virtual void call_unload() override;
34 	virtual image_init_result call_create(int format_type, util::option_resolution *format_options) override;
35 
image_type()36 	virtual iodevice_t image_type() const noexcept override { return IO_SERIAL; }
37 
is_readable()38 	virtual bool is_readable()  const noexcept override { return true; }
is_writeable()39 	virtual bool is_writeable() const noexcept override { return true; }
is_creatable()40 	virtual bool is_creatable() const noexcept override { return true; }
must_be_loaded()41 	virtual bool must_be_loaded() const noexcept override { return false; }
is_reset_on_load()42 	virtual bool is_reset_on_load() const noexcept override { return false; }
file_extensions()43 	virtual const char *file_extensions() const noexcept override { return "txt,ihx"; }
44 
45 	// specific implementation
in_xin(void)46 	uint8_t in_xin(void) { return m_xin & 0x01; }
in_din(void)47 	uint8_t in_din(void) { return m_din & 0x01; }
in_ack(void)48 	uint8_t in_ack(void) { return m_ack & 0x01; }
out_busy(uint8_t state)49 	void out_busy(uint8_t state)  { m_busy = state & 0x01; }
out_dout(uint8_t state)50 	void out_dout(uint8_t state)  { m_dout = state & 0x01; }
out_xout(uint8_t state)51 	void out_xout(uint8_t state)  { m_xout = state & 0x01; }
enable_interface(uint8_t state)52 	void enable_interface(uint8_t state)  { m_enabled = state & 0x01; }
53 
54 protected:
55 	// internal helpers
56 	int calc_parity(uint8_t data);
57 	int get_next_state();
58 
59 	// device-level overrides
60 	virtual void device_start() override;
61 	virtual void device_reset() override;
62 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
63 
64 private:
65 	// internal device state
66 	static const device_timer_id TIMER_SEND    = 0;
67 	static const device_timer_id TIMER_RECEIVE = 1;
68 
69 	emu_timer*  m_send_timer;       // timer for send data
70 	emu_timer*  m_receive_timer;    // timer for receive data
71 	uint8_t       m_state;            // transfer status
72 	uint32_t      m_bytes_count;      // number of bytes transferred
73 	uint8_t       m_current_byte;     // byte in transfer
74 	uint8_t       m_enabled;          // enable/disable
75 
76 	uint8_t       m_busy;             // CTS
77 	uint8_t       m_dout;             // DTR
78 	uint8_t       m_xout;             // TXD
79 	uint8_t       m_xin;              // RXD
80 	uint8_t       m_din;              // DSR
81 	uint8_t       m_ack;              // RTS
82 };
83 
84 // device type definition
85 DECLARE_DEVICE_TYPE(PCE220SERIAL, pce220_serial_device)
86 
87 /***************************************************************************
88     DEVICE CONFIGURATION MACROS
89 ***************************************************************************/
90 #define PCE220SERIAL_TAG        "serial"
91 
92 #endif // MAME_MACHINE_PCE220_SER_H
93