1 // license:BSD-3-Clause
2 // copyright-holders:Lee Ward, Dirk Best, Curt Coder
3 /*************************************************************************
4 
5     Memotech MTX 500, MTX 512 and RS 128
6 
7 *************************************************************************/
8 
9 #ifndef MAME_INCLUDES_MTX_H
10 #define MAME_INCLUDES_MTX_H
11 
12 #include "imagedev/snapquik.h"
13 #include "imagedev/cassette.h"
14 #include "bus/centronics/ctronics.h"
15 #include "bus/generic/slot.h"
16 #include "bus/generic/carts.h"
17 #include "bus/mtx/exp.h"
18 #include "cpu/z80/z80.h"
19 #include "machine/z80daisy.h"
20 #include "machine/z80sio.h"
21 #include "machine/z80ctc.h"
22 #include "sound/sn76496.h"
23 #include "machine/ram.h"
24 #include "machine/timer.h"
25 
26 
27 class mtx_state : public driver_device
28 {
29 public:
mtx_state(const machine_config & mconfig,device_type type,const char * tag)30 	mtx_state(const machine_config &mconfig, device_type type, const char *tag)
31 		: driver_device(mconfig, type, tag)
32 		, m_cassold(0)
33 		, m_maincpu(*this, "z80")
34 		, m_sn(*this, "sn76489a")
35 		, m_z80ctc(*this, "z80ctc")
36 		, m_z80dart(*this, "z80dart")
37 		, m_cassette(*this, "cassette")
38 		, m_centronics(*this, "centronics")
39 		, m_ram(*this, RAM_TAG)
40 		, m_exp(*this, "exp")
41 		, m_extrom(*this, "extrom")
42 		, m_rompak(*this, "rompak")
43 	{ }
44 
45 	void rs128(machine_config &config);
46 	void mtx500(machine_config &config);
47 	void mtx512(machine_config &config);
48 
49 protected:
50 	virtual void machine_start() override;
51 	virtual void machine_reset() override;
52 
53 private:
54 	bool m_cassold;
55 	required_device<z80_device> m_maincpu;
56 	required_device<sn76489a_device> m_sn;
57 	required_device<z80ctc_device> m_z80ctc;
58 	optional_device<z80dart_device> m_z80dart;
59 	required_device<cassette_image_device> m_cassette;
60 	required_device<centronics_device> m_centronics;
61 	required_device<ram_device> m_ram;
62 	required_device<mtx_exp_slot_device> m_exp;
63 	required_device<generic_slot_device> m_extrom;
64 	required_device<generic_slot_device> m_rompak;
65 
66 	/* keyboard state */
67 	uint8_t m_key_sense;
68 
69 	/* video state */
70 	uint8_t *m_video_ram;
71 	uint8_t *m_attr_ram;
72 
73 	/* sound state */
74 	uint8_t m_sound_latch;
75 
76 	/* timers */
77 	device_t *m_cassette_timer;
78 
79 	int m_centronics_busy;
80 	int m_centronics_fault;
81 	int m_centronics_perror;
82 	int m_centronics_select;
83 
84 	void mtx_subpage_w(uint8_t data);
85 	void mtx_bankswitch_w(uint8_t data);
86 	void mtx_sound_latch_w(uint8_t data);
87 	void mtx_sense_w(uint8_t data);
88 	uint8_t mtx_key_lo_r();
89 	uint8_t mtx_key_hi_r();
90 	void hrx_address_w(offs_t offset, uint8_t data);
91 	uint8_t hrx_data_r();
92 	void hrx_data_w(uint8_t data);
93 	uint8_t hrx_attr_r();
94 	void hrx_attr_w(uint8_t data);
95 	TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick);
96 	TIMER_DEVICE_CALLBACK_MEMBER(cassette_tick);
97 	DECLARE_WRITE_LINE_MEMBER(ctc_trg1_w);
98 	DECLARE_WRITE_LINE_MEMBER(ctc_trg2_w);
99 	uint8_t mtx_strobe_r();
100 	uint8_t mtx_sound_strobe_r();
101 	void mtx_cst_w(uint8_t data);
102 	void mtx_cst_motor_w(uint8_t data);
103 	uint8_t mtx_prt_r();
104 	DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
105 	DECLARE_WRITE_LINE_MEMBER(write_centronics_fault);
106 	DECLARE_WRITE_LINE_MEMBER(write_centronics_perror);
107 	DECLARE_WRITE_LINE_MEMBER(write_centronics_select);
108 	void bankswitch(uint8_t data);
109 	DECLARE_DEVICE_IMAGE_LOAD_MEMBER(extrom_load);
110 	DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rompak_load);
111 	DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
112 	DECLARE_SNAPSHOT_LOAD_MEMBER(snapshot_cb);
113 
114 	void mtx_io(address_map &map);
115 	void mtx_mem(address_map &map);
116 	void rs128_io(address_map &map);
117 };
118 
119 #endif // MAME_INCLUDES_MTX_H
120