1 // license:LGPL-2.1+
2 // copyright-holders:Michael Zapf
3 /***************************************************************************
4     Gromport (Cartridge port) of the TI-99 consoles
5     For details see gromport.cpp
6 
7     Michael Zapf
8 ***************************************************************************/
9 
10 #ifndef MAME_BUS_TI99_GROMPORT_GROMPORT_H
11 #define MAME_BUS_TI99_GROMPORT_GROMPORT_H
12 
13 #pragma once
14 
15 #define TI99_GROMPORT_TAG    "gromport"
16 
17 namespace bus { namespace ti99 { namespace gromport {
18 
19 struct pcb_type
20 {
21 	int id;
22 	const char* name;
23 };
24 
25 class ti99_cartridge_device;
26 class cartridge_connector_device;
27 
28 class gromport_device : public device_t, public device_slot_interface
29 {
30 public:
31 	template <typename U>
gromport_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock,U && opts,const char * dflt)32 	gromport_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, U &&opts, const char *dflt)
33 		: gromport_device(mconfig, tag, owner, clock)
34 	{
35 		option_reset();
36 		opts(*this);
37 		set_default_option(dflt);
38 		set_fixed(false);
39 	}
40 
41 	gromport_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
42 
43 	void readz(offs_t offset, uint8_t *value);
44 	void write(offs_t offset, uint8_t data);
45 	void crureadz(offs_t offset, uint8_t *value);
46 	void cruwrite(offs_t offset, uint8_t data);
47 	DECLARE_WRITE_LINE_MEMBER(ready_line);
48 	DECLARE_WRITE_LINE_MEMBER(romgq_line);
49 	void set_gromlines(line_state mline, line_state moline, line_state gsq);
50 	DECLARE_WRITE_LINE_MEMBER(gclock_in);
51 
52 	void    cartridge_inserted();
53 	bool    is_grom_idle();
54 
ready_cb()55 	auto ready_cb() { return m_console_ready.bind(); }
reset_cb()56 	auto reset_cb() { return m_console_reset.bind(); }
57 
58 	// Configure for 16K ROM space (TI-99/8 only)
extend()59 	gromport_device& extend() { m_mask = 0x3fff; return *this; }
60 
61 protected:
62 	void device_start() override;
63 	void device_reset() override;
64 	void device_config_complete() override;
65 	ioport_constructor device_input_ports() const override;
66 
67 private:
68 	cartridge_connector_device*    m_connector;
69 	bool                m_reset_on_insert;
70 	devcb_write_line   m_console_ready;
71 	devcb_write_line   m_console_reset;
72 	int m_romgq;
73 	int m_mask;
74 };
75 
76 class cartridge_connector_device : public device_t
77 {
78 public:
79 	virtual void readz(offs_t offset, uint8_t *value) = 0;
80 	virtual void write(offs_t offset, uint8_t data) = 0;
setaddress_dbin(offs_t offset,int state)81 	virtual void setaddress_dbin(offs_t offset, int state) { }
82 
83 	virtual void crureadz(offs_t offset, uint8_t *value) = 0;
84 	virtual void cruwrite(offs_t offset, uint8_t data) = 0;
85 
86 	virtual DECLARE_WRITE_LINE_MEMBER(romgq_line) = 0;
87 	virtual void set_gromlines(line_state mline, line_state moline, line_state gsq) =0;
88 
89 	virtual DECLARE_WRITE_LINE_MEMBER(gclock_in) = 0;
90 
91 	DECLARE_WRITE_LINE_MEMBER(ready_line);
92 
insert(int index,bus::ti99::gromport::ti99_cartridge_device * cart)93 	virtual void insert(int index, bus::ti99::gromport::ti99_cartridge_device* cart) { m_gromport->cartridge_inserted(); }
remove(int index)94 	virtual void remove(int index) { }
95 	virtual bool is_grom_idle() = 0;
96 
97 protected:
98 	cartridge_connector_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
99 	virtual void device_config_complete() override;
100 
101 	gromport_device*    m_gromport;
102 	bool     m_grom_selected;
103 };
104 
105 } } } // end namespace bus::ti99::gromport
106 
107 DECLARE_DEVICE_TYPE_NS(TI99_GROMPORT, bus::ti99::gromport, gromport_device)
108 
109 void ti99_gromport_options(device_slot_interface &device);
110 void ti99_gromport_options_998(device_slot_interface &device);
111 
112 #endif // MAME_BUS_TI99_GROMPORT_GROMPORT_H
113