1 // license:GPL-2.0+
2 // copyright-holders:Dirk Best
3 /***************************************************************************
4 
5     Commodore A2232
6 
7     Zorro-II Serial Card
8 
9     Provides the Amiga with 7 additional RS232 ports.
10 
11 ***************************************************************************/
12 
13 #ifndef MAME_BUS_AMIGA_ZORRO_A2232_H
14 #define MAME_BUS_AMIGA_ZORRO_A2232_H
15 
16 #pragma once
17 
18 #include "zorro.h"
19 #include "machine/autoconfig.h"
20 #include "cpu/m6502/m65ce02.h"
21 #include "machine/input_merger.h"
22 #include "machine/mos6551.h"
23 #include "machine/mos6526.h"
24 #include "bus/rs232/rs232.h"
25 
26 
27 namespace bus { namespace amiga { namespace zorro {
28 
29 //**************************************************************************
30 //  TYPE DEFINITIONS
31 //**************************************************************************
32 
33 // ======================> a2232_device
34 
35 class a2232_device : public device_t, public device_zorro2_card_interface, public amiga_autoconfig
36 {
37 public:
38 	// construction/destruction
39 	a2232_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
40 
41 	// zorro slot
42 	uint16_t shared_ram_r(offs_t offset, uint16_t mem_mask = ~0);
43 	void shared_ram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
44 	uint16_t irq_ack_r();
45 	void irq_ack_w(uint16_t data);
46 	uint16_t reset_low_r();
47 	void reset_low_w(uint16_t data);
48 	uint16_t irq_r();
49 	void irq_w(uint16_t data);
50 	uint16_t reset_high_r(offs_t offset, uint16_t mem_mask = ~0);
51 	void reset_high_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
52 
53 	void iocpu_map(address_map &map);
54 
55 protected:
56 	virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
57 	virtual void device_start() override ATTR_COLD;
58 	virtual void device_reset_after_children() override;
59 
60 	// device_zorro2_card_interface overrides
61 	virtual DECLARE_WRITE_LINE_MEMBER( cfgin_w ) override;
62 
63 	// amiga_autoconfig overrides
64 	virtual void autoconfig_base_address(offs_t address) override;
65 
66 private:
67 	// cpu
68 	void int2_w(uint8_t data);
69 	void irq_ack8_w(uint8_t data);
70 
71 	// acia
72 	template<int N> uint8_t acia_r(offs_t offset);
73 	template<int N> void acia_w(offs_t offset, uint8_t data);
74 
75 	// cia
76 	uint8_t cia_port_a_r();
77 	uint8_t cia_port_b_r();
78 	void cia_port_b_w(uint8_t data);
79 	uint8_t cia_r(offs_t offset);
80 	void cia_w(offs_t offset, uint8_t data);
81 
82 	// rs232
83 	DECLARE_WRITE_LINE_MEMBER( rs232_1_rxd_w );
84 	DECLARE_WRITE_LINE_MEMBER( rs232_1_dcd_w );
85 	DECLARE_WRITE_LINE_MEMBER( rs232_1_cts_w );
86 	DECLARE_WRITE_LINE_MEMBER( rs232_2_dcd_w );
87 	DECLARE_WRITE_LINE_MEMBER( rs232_2_cts_w );
88 	DECLARE_WRITE_LINE_MEMBER( rs232_3_dcd_w );
89 	DECLARE_WRITE_LINE_MEMBER( rs232_3_cts_w );
90 	DECLARE_WRITE_LINE_MEMBER( rs232_4_dcd_w );
91 	DECLARE_WRITE_LINE_MEMBER( rs232_4_cts_w );
92 	DECLARE_WRITE_LINE_MEMBER( rs232_5_dcd_w );
93 	DECLARE_WRITE_LINE_MEMBER( rs232_5_cts_w );
94 	DECLARE_WRITE_LINE_MEMBER( rs232_6_dcd_w );
95 	DECLARE_WRITE_LINE_MEMBER( rs232_6_cts_w );
96 	DECLARE_WRITE_LINE_MEMBER( rs232_7_dcd_w );
97 	DECLARE_WRITE_LINE_MEMBER( rs232_7_cts_w );
98 
99 	required_device<m65ce02_device> m_iocpu;
100 	required_device<input_merger_device> m_ioirq;
101 	required_device_array<mos6551_device, 7> m_acia;
102 	required_device<mos8520_device> m_cia;
103 	required_shared_ptr<uint8_t> m_shared_ram;
104 
105 	uint8_t m_cia_port_a;
106 	uint8_t m_cia_port_b;
107 };
108 
109 } } } // namespace bus::amiga::zorro
110 
111 // device type definition
112 DECLARE_DEVICE_TYPE_NS(ZORRO_A2232, bus::amiga::zorro, a2232_device)
113 
114 #endif // MAME_BUS_AMIGA_ZORRO_A2232_H
115