1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /***************************************************************************
4 
5     Gaelco 3D serial hardware
6 
7 ***************************************************************************/
8 #ifndef MAME_MACHINE_GAELCO3D_H
9 #define MAME_MACHINE_GAELCO3D_H
10 
11 #pragma once
12 
13 
14 /***************************************************************************
15     DEVICE INTERFACE TYPE
16 ***************************************************************************/
17 
18 /* ----- device interface ----- */
19 
20 class gaelco_serial_device : public device_t
21 {
22 public:
23 	static constexpr unsigned EXT_STATUS_MASK = 0x03;
24 
25 	gaelco_serial_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
26 
irq_handler()27 	auto irq_handler() { return m_irq_handler.bind(); }
28 
29 	uint8_t status_r();
30 	void data_w(uint8_t data);
31 	uint8_t data_r();
32 	DECLARE_WRITE_LINE_MEMBER(rts_w);
33 	/* Set to 1 during transmit, 0 for receive */
34 	DECLARE_WRITE_LINE_MEMBER(tr_w);
35 
36 
37 	/* Big questions marks, related to serial i/o */
38 
39 	/* Not used in surfplnt, but in radikalb
40 	 * Set at beginning of transfer sub, cleared at end
41 	 */
42 	DECLARE_WRITE_LINE_MEMBER(unknown_w);
43 
44 
45 	/* only used in radikalb, set at beginning of receive isr, cleared at end */
46 	DECLARE_WRITE_LINE_MEMBER(irq_enable);
47 
48 protected:
49 	// device-level overrides
50 	virtual void device_start() override;
51 	virtual void device_stop() override;
52 	virtual void device_reset() override;
53 
54 private:
55 	struct buf_t
56 	{
57 		volatile uint8_t data;
58 		volatile uint8_t stat;
59 		volatile int cnt;
60 		volatile int data_cnt;
61 	};
62 
63 	struct shmem_t
64 	{
65 		buf_t               buf[2];
66 	};
67 
68 	struct osd_shared_mem
69 	{
70 		char *fn;
71 		size_t size;
72 		void *ptr;
73 		int creator;
74 	};
75 
76 	static osd_shared_mem *osd_sharedmem_alloc(const char *path, int create, size_t size);
77 	static void osd_sharedmem_free(osd_shared_mem *os_shmem);
78 	static void *osd_sharedmem_ptr(osd_shared_mem *os_shmem);
79 
80 	static void buf_reset(buf_t *buf);
81 
82 	// internal state
83 	devcb_write_line m_irq_handler;
84 
85 	uint8_t m_status;
86 	int m_last_in_msg_cnt;
87 	int m_slack_cnt;
88 
89 	emu_timer *m_sync_timer;
90 
91 	buf_t *m_in_ptr;
92 	buf_t *m_out_ptr;
93 	osd_shared_mem *m_os_shmem;
94 	shmem_t *m_shmem;
95 	std::mutex m_mutex;
96 
97 	TIMER_CALLBACK_MEMBER( set_status_cb );
98 	TIMER_CALLBACK_MEMBER( link_cb );
99 	void set_status(uint8_t mask, uint8_t set, int wait);
100 	void process_in();
101 	void sync_link();
102 };
103 
104 DECLARE_DEVICE_TYPE(GAELCO_SERIAL, gaelco_serial_device)
105 
106 #endif // MAME_MACHINE_GAELCO3D_H
107