1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #ifndef MAME_INCLUDES_TANDY2K_H
4 #define MAME_INCLUDES_TANDY2K_H
5 
6 #include "bus/centronics/ctronics.h"
7 #include "bus/rs232/rs232.h"
8 #include "cpu/i86/i186.h"
9 #include "cpu/mcs48/mcs48.h"
10 #include "formats/tandy2k_dsk.h"
11 #include "imagedev/floppy.h"
12 #include "imagedev/harddriv.h"
13 #include "machine/i8255.h"
14 #include "machine/i8251.h"
15 #include "machine/pckeybrd.h"
16 #include "machine/pit8253.h"
17 #include "machine/pic8259.h"
18 #include "machine/ram.h"
19 #include "machine/tandy2kb.h"
20 #include "machine/timer.h"
21 #include "machine/upd765.h"
22 #include "machine/bankdev.h"
23 #include "sound/spkrdev.h"
24 #include "video/crt9007.h"
25 #include "video/crt9021.h"
26 #include "video/crt9212.h"
27 #include "emupal.h"
28 
29 #define SCREEN_TAG      "screen"
30 #define I80186_TAG      "u76"
31 #define I8255A_TAG      "u75"
32 #define I8251A_TAG      "u41"
33 #define I8253_TAG       "u40"
34 #define I8259A_0_TAG    "u42"
35 #define I8259A_1_TAG    "u43"
36 #define I8272A_TAG      "u121"
37 #define CRT9007_TAG     "u16"
38 #define CRT9212_0_TAG   "u55"
39 #define CRT9212_1_TAG   "u15"
40 #define CRT9021B_TAG    "u14"
41 #define WD1010_TAG      "u18"
42 #define WD1100_11_TAG   "u12"
43 #define CENTRONICS_TAG  "centronics"
44 #define RS232_TAG       "rs232"
45 
46 class tandy2k_state : public driver_device
47 {
48 public:
tandy2k_state(const machine_config & mconfig,device_type type,const char * tag)49 	tandy2k_state(const machine_config &mconfig, device_type type, const char *tag) :
50 		driver_device(mconfig, type, tag),
51 		m_maincpu(*this, I80186_TAG),
52 		m_uart(*this, I8251A_TAG),
53 		m_i8255a(*this, I8255A_TAG),
54 		m_pit(*this, I8253_TAG),
55 		m_fdc(*this, I8272A_TAG),
56 		m_pic0(*this, I8259A_0_TAG),
57 		m_pic1(*this, I8259A_1_TAG),
58 		m_vpac(*this, CRT9007_TAG),
59 		m_drb0(*this, CRT9212_0_TAG),
60 		m_drb1(*this, CRT9212_1_TAG),
61 		m_vac(*this, CRT9021B_TAG),
62 		m_colpal(*this, "colpal"),
63 		m_vrambank(*this, "vrambank"),
64 		m_timer_vidldsh(*this, "vidldsh"),
65 		m_centronics(*this, CENTRONICS_TAG),
66 		m_speaker(*this, "speaker"),
67 		m_ram(*this, RAM_TAG),
68 		m_floppy0(*this, I8272A_TAG ":0:525qd"),
69 		m_floppy1(*this, I8272A_TAG ":1:525qd"),
70 		m_rs232(*this, RS232_TAG),
71 		m_kb(*this, TANDY2K_KEYBOARD_TAG),
72 		m_hires_ram(*this, "hires_ram"),
73 		m_char_ram(*this, "char_ram"),
74 		m_pc_keyboard(*this, "pc_keyboard"),
75 		m_dma_mux(0),
76 		m_kbdclk(0),
77 		m_kbddat(0),
78 		m_kbdin(0),
79 		m_extclk(0),
80 		m_rxrdy(0),
81 		m_txrdy(0),
82 		m_pb_sel(0),
83 		m_vram_base(0),
84 		m_vidouts(0),
85 		m_clkspd(-1),
86 		m_clkcnt(-1),
87 		m_blc(0),
88 		m_bkc(0),
89 		m_cblank(0),
90 		m_dblc(0),
91 		m_dbkc(0),
92 		m_dblank(0),
93 		m_slg(0),
94 		m_sld(0),
95 		m_cgra(0),
96 		m_vidla(0),
97 		m_outspkr(0),
98 		m_spkrdata(0),
99 		m_centronics_ack(0),
100 		m_centronics_fault(0),
101 		m_centronics_select(0),
102 		m_centronics_perror(0),
103 		m_centronics_busy(0),
104 		m_buttons(*this, "MOUSEBTN"),
105 		m_x_axis(*this, "MOUSEX"),
106 		m_y_axis(*this, "MOUSEY")
107 	{
108 		for (auto & elem : m_busdmarq)
109 		{
110 			elem = CLEAR_LINE;
111 		}
112 	}
113 
114 	void tandy2k_hd(machine_config &config);
115 	void tandy2k(machine_config &config);
116 	DECLARE_INPUT_CHANGED_MEMBER(input_changed);
117 
118 private:
119 	required_device<i80186_cpu_device> m_maincpu;
120 	required_device<i8251_device> m_uart;
121 	required_device<i8255_device> m_i8255a;
122 	required_device<pit8253_device> m_pit;
123 	required_device<i8272a_device> m_fdc;
124 	required_device<pic8259_device> m_pic0;
125 	required_device<pic8259_device> m_pic1;
126 	required_device<crt9007_device> m_vpac;
127 	required_device<crt9212_device> m_drb0;
128 	required_device<crt9212_device> m_drb1;
129 	required_device<crt9021_device> m_vac;
130 	required_device<palette_device> m_colpal;
131 	required_device<address_map_bank_device> m_vrambank;
132 	required_device<timer_device> m_timer_vidldsh;
133 	required_device<centronics_device> m_centronics;
134 	required_device<speaker_sound_device> m_speaker;
135 	required_device<ram_device> m_ram;
136 	required_device<floppy_image_device> m_floppy0;
137 	required_device<floppy_image_device> m_floppy1;
138 	required_device<rs232_port_device> m_rs232;
139 	required_device<tandy2k_keyboard_device> m_kb;
140 	required_shared_ptr<uint16_t> m_hires_ram;
141 	optional_shared_ptr<uint8_t> m_char_ram;
142 	required_device<pc_keyboard_device> m_pc_keyboard; // temporary until the tandy keyboard has a rom dump
143 
144 	virtual void machine_start() override;
145 	virtual void machine_reset() override;
146 	virtual void device_reset_after_children() override;
147 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
148 
149 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
150 
151 	void update_drq();
152 	void dma_request(int line, int state);
153 	void speaker_update();
154 
155 	uint8_t char_ram_r(offs_t offset);
156 	void char_ram_w(offs_t offset, uint8_t data);
157 	uint8_t videoram_r(offs_t offset);
158 	uint8_t enable_r();
159 	void enable_w(uint8_t data);
160 	void dma_mux_w(uint8_t data);
161 	uint8_t kbint_clr_r();
162 	uint8_t fldtc_r();
163 	void fldtc_w(uint8_t data);
164 	void addr_ctrl_w(uint8_t data);
165 	DECLARE_WRITE_LINE_MEMBER( rxrdy_w );
166 	DECLARE_WRITE_LINE_MEMBER( txrdy_w );
167 	DECLARE_WRITE_LINE_MEMBER( outspkr_w );
168 	DECLARE_WRITE_LINE_MEMBER( intbrclk_w );
169 	DECLARE_WRITE_LINE_MEMBER( rfrqpulse_w );
170 	uint8_t ppi_pb_r();
171 	void ppi_pc_w(uint8_t data);
172 	DECLARE_WRITE_LINE_MEMBER( vpac_vlt_w );
173 	DECLARE_WRITE_LINE_MEMBER( vpac_drb_w );
174 	DECLARE_WRITE_LINE_MEMBER( vpac_wben_w );
175 	DECLARE_WRITE_LINE_MEMBER( vpac_cblank_w );
176 	DECLARE_WRITE_LINE_MEMBER( vpac_slg_w );
177 	DECLARE_WRITE_LINE_MEMBER( vpac_sld_w );
178 	uint8_t hires_status_r();
179 	void hires_plane_w(uint8_t data);
180 	void vidla_w(uint8_t data);
181 	void drb_attr_w(uint8_t data);
182 	DECLARE_WRITE_LINE_MEMBER( kbdclk_w );
183 	DECLARE_WRITE_LINE_MEMBER( kbddat_w );
184 	uint8_t clkmouse_r(offs_t offset);
185 	void clkmouse_w(offs_t offset, uint8_t data);
186 	uint8_t irq_callback(offs_t offset);
187 	DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
188 	DECLARE_WRITE_LINE_MEMBER( fdc_hdl_w );
189 	DECLARE_WRITE_LINE_MEMBER(write_centronics_ack);
190 	DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
191 	DECLARE_WRITE_LINE_MEMBER(write_centronics_perror);
192 	DECLARE_WRITE_LINE_MEMBER(write_centronics_select);
193 	DECLARE_WRITE_LINE_MEMBER(write_centronics_fault);
194 	CRT9021_DRAW_CHARACTER_MEMBER( vac_draw_character );
195 	TIMER_DEVICE_CALLBACK_MEMBER( vidldsh_tick );
196 	DECLARE_FLOPPY_FORMATS( floppy_formats );
197 	static rgb_t IRGB(uint32_t raw);
198 
199 	enum
200 	{
201 		LPINEN = 0,
202 		KBDINEN,
203 		PORTINEN
204 	};
205 
206 	/* DMA state */
207 	uint8_t m_dma_mux;
208 	int m_busdmarq[4];
209 
210 	/* keyboard state */
211 	int m_kbdclk;
212 	int m_kbddat;
213 	uint8_t m_kbdin;
214 
215 	/* serial state */
216 	int m_extclk;
217 	int m_rxrdy;
218 	int m_txrdy;
219 
220 	/* PPI state */
221 	int m_pb_sel;
222 
223 	/* video state */
224 	uint8_t m_vram_base;
225 	int m_vidouts;
226 	int m_clkspd;
227 	int m_clkcnt;
228 	int m_blc;
229 	int m_bkc;
230 	int m_cblank;
231 	uint8_t m_dblc;
232 	uint8_t m_dbkc;
233 	uint8_t m_dblank;
234 	int m_slg;
235 	int m_sld;
236 	uint8_t m_cgra;
237 	uint8_t m_vidla;
238 	uint8_t m_hires_en;
239 
240 	/* sound state */
241 	int m_outspkr;
242 	int m_spkrdata;
243 
244 	int m_centronics_ack;
245 	int m_centronics_fault;
246 	int m_centronics_select;
247 	int m_centronics_perror;
248 	int m_centronics_busy;
249 
250 	enum
251 	{
252 		MO_IRQ = 1,
253 		BT_IRQ = 2
254 	};
255 
256 	enum
257 	{
258 		MOUS_TIMER,
259 		MCU_DELAY
260 	};
261 
262 	uint8_t m_clkmouse_cmd[8];
263 	int m_clkmouse_cnt;
264 	uint8_t m_clkmouse_irq;
265 	uint16_t m_mouse_x, m_mouse_y;
266 	emu_timer *m_mouse_timer;
267 	emu_timer *m_mcu_delay;
268 
269 	void tandy2k_hd_io(address_map &map);
270 	void tandy2k_io(address_map &map);
271 	void tandy2k_mem(address_map &map);
272 	void vpac_mem(address_map &map);
273 	void vrambank_mem(address_map &map);
274 
275 	required_ioport m_buttons, m_x_axis, m_y_axis;
276 };
277 
278 #endif // MAME_INCLUDES_TANDY2K_H
279