1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder, Olivier Galibert
3 #ifndef MAME_INCLUDES_ATARI_ST_H
4 #define MAME_INCLUDES_ATARI_ST_H
5 
6 #pragma once
7 
8 #include "bus/rs232/rs232.h"
9 #include "cpu/m68000/m68000.h"
10 #include "cpu/m6800/m6801.h"
11 #include "machine/6850acia.h"
12 #include "machine/8530scc.h"
13 #include "bus/centronics/ctronics.h"
14 #include "bus/generic/slot.h"
15 #include "bus/generic/carts.h"
16 #include "imagedev/floppy.h"
17 #include "machine/mc68901.h"
18 #include "machine/ram.h"
19 #include "machine/rescap.h"
20 #include "machine/rp5c15.h"
21 #include "machine/wd_fdc.h"
22 #include "sound/ay8910.h"
23 #include "sound/lmc1992.h"
24 #include "emupal.h"
25 #include "screen.h"
26 
27 #define M68000_TAG      "m68000"
28 #define HD6301V1_TAG    "hd6301"
29 #define YM2149_TAG      "ym2149"
30 #define MC6850_0_TAG    "mc6850_0"
31 #define MC6850_1_TAG    "mc6850_1"
32 #define Z8530_TAG       "z8530"
33 #define COP888_TAG      "u703"
34 #define RP5C15_TAG      "rp5c15"
35 #define YM3439_TAG      "ym3439"
36 #define MC68901_TAG     "mc68901"
37 #define LMC1992_TAG     "lmc1992"
38 #define WD1772_TAG      "wd1772"
39 #define SCREEN_TAG      "screen"
40 #define CENTRONICS_TAG  "centronics"
41 #define RS232_TAG       "rs232"
42 
43 // Atari ST
44 
45 #define Y1      XTAL(2'457'600)
46 
47 // STBook
48 
49 #define U517    XTAL(16'000'000)
50 #define Y200    XTAL(2'457'600)
51 #define Y700    XTAL(10'000'000)
52 
53 #define DMA_STATUS_DRQ              0x04
54 #define DMA_STATUS_SECTOR_COUNT     0x02
55 #define DMA_STATUS_ERROR            0x01
56 
57 #define DMA_MODE_READ_WRITE         0x100
58 #define DMA_MODE_FDC_HDC_ACK        0x080
59 #define DMA_MODE_ENABLED            0x040
60 #define DMA_MODE_SECTOR_COUNT       0x010
61 #define DMA_MODE_FDC_HDC_CS         0x008
62 #define DMA_MODE_A1                 0x004
63 #define DMA_MODE_A0                 0x002
64 #define DMA_MODE_ADDRESS_MASK       0x006
65 
66 #define DMA_SECTOR_SIZE             512
67 
68 enum
69 {
70 	IKBD_MOUSE_PHASE_STATIC = 0,
71 	IKBD_MOUSE_PHASE_POSITIVE,
72 	IKBD_MOUSE_PHASE_NEGATIVE
73 };
74 
75 class st_state : public driver_device
76 {
77 public:
78 	enum
79 	{
80 		TIMER_MOUSE_TICK,
81 		TIMER_SHIFTER_TICK,
82 		TIMER_GLUE_TICK,
83 		TIMER_BLITTER_TICK
84 	};
85 
st_state(const machine_config & mconfig,device_type type,const char * tag)86 	st_state(const machine_config &mconfig, device_type type, const char *tag)
87 		: driver_device(mconfig, type, tag),
88 			m_maincpu(*this, M68000_TAG),
89 			m_ikbd(*this, HD6301V1_TAG),
90 			m_fdc(*this, WD1772_TAG),
91 			m_floppy(*this, WD1772_TAG ":%u", 0U),
92 			m_mfp(*this, MC68901_TAG),
93 			m_acia(*this, {MC6850_0_TAG, MC6850_1_TAG}),
94 			m_centronics(*this, CENTRONICS_TAG),
95 			m_cart(*this, "cartslot"),
96 			m_ram(*this, RAM_TAG),
97 			m_rs232(*this, RS232_TAG),
98 			m_ymsnd(*this, YM2149_TAG),
99 			m_p31(*this, "P31"),
100 			m_p32(*this, "P32"),
101 			m_p33(*this, "P33"),
102 			m_p34(*this, "P34"),
103 			m_p35(*this, "P35"),
104 			m_p36(*this, "P36"),
105 			m_p37(*this, "P37"),
106 			m_p40(*this, "P40"),
107 			m_p41(*this, "P41"),
108 			m_p42(*this, "P42"),
109 			m_p43(*this, "P43"),
110 			m_p44(*this, "P44"),
111 			m_p45(*this, "P45"),
112 			m_p46(*this, "P46"),
113 			m_p47(*this, "P47"),
114 			m_joy0(*this, "IKBD_JOY0"),
115 			m_joy1(*this, "IKBD_JOY1"),
116 			m_mousex(*this, "IKBD_MOUSEX"),
117 			m_mousey(*this, "IKBD_MOUSEY"),
118 			m_config(*this, "config"),
119 			m_ikbd_mouse_x(0),
120 			m_ikbd_mouse_y(0),
121 			m_ikbd_mouse_px(IKBD_MOUSE_PHASE_STATIC),
122 			m_ikbd_mouse_py(IKBD_MOUSE_PHASE_STATIC),
123 			m_ikbd_mouse_pc(0),
124 			m_ikbd_joy(1),
125 			m_monochrome(1),
126 			m_palette(*this, "palette"),
127 			m_screen(*this, "screen"),
128 			m_led(*this, "led1")
129 	{ }
130 
131 	DECLARE_WRITE_LINE_MEMBER( write_monochrome );
132 
133 	void st(machine_config &config);
134 
135 protected:
136 	required_device<m68000_base_device> m_maincpu;
137 	required_device<cpu_device> m_ikbd;
138 	required_device<wd1772_device> m_fdc;
139 	required_device_array<floppy_connector, 2> m_floppy;
140 	required_device<mc68901_device> m_mfp;
141 	required_device_array<acia6850_device, 2> m_acia;
142 	required_device<centronics_device> m_centronics;
143 	required_device<generic_slot_device> m_cart;
144 	required_device<ram_device> m_ram;
145 	required_device<rs232_port_device> m_rs232;
146 	required_device<ym2149_device> m_ymsnd;
147 	required_ioport m_p31;
148 	required_ioport m_p32;
149 	required_ioport m_p33;
150 	required_ioport m_p34;
151 	required_ioport m_p35;
152 	required_ioport m_p36;
153 	required_ioport m_p37;
154 	required_ioport m_p40;
155 	required_ioport m_p41;
156 	required_ioport m_p42;
157 	required_ioport m_p43;
158 	required_ioport m_p44;
159 	required_ioport m_p45;
160 	required_ioport m_p46;
161 	required_ioport m_p47;
162 	optional_ioport m_joy0;
163 	optional_ioport m_joy1;
164 	optional_ioport m_mousex;
165 	optional_ioport m_mousey;
166 	optional_ioport m_config;
167 
168 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
169 
170 	// video
171 	uint8_t shifter_base_r(offs_t offset);
172 	uint8_t shifter_counter_r(offs_t offset);
173 	uint8_t shifter_sync_r();
174 	uint16_t shifter_palette_r(offs_t offset);
175 	uint8_t shifter_mode_r();
176 
177 	void shifter_base_w(offs_t offset, uint8_t data);
178 	void shifter_sync_w(uint8_t data);
179 	void shifter_palette_w(offs_t offset, uint16_t data);
180 	void shifter_mode_w(uint8_t data);
181 
182 	uint16_t blitter_halftone_r(offs_t offset);
183 	uint16_t blitter_src_inc_x_r();
184 	uint16_t blitter_src_inc_y_r();
185 	uint16_t blitter_src_r(offs_t offset);
186 	uint16_t blitter_end_mask_r(offs_t offset);
187 	uint16_t blitter_dst_inc_x_r();
188 	uint16_t blitter_dst_inc_y_r();
189 	uint16_t blitter_dst_r(offs_t offset);
190 	uint16_t blitter_count_x_r();
191 	uint16_t blitter_count_y_r();
192 	uint16_t blitter_op_r(offs_t offset, uint16_t mem_mask = ~0);
193 	uint16_t blitter_ctrl_r(offs_t offset, uint16_t mem_mask = ~0);
194 
195 	void blitter_halftone_w(offs_t offset, uint16_t data);
196 	void blitter_src_inc_x_w(uint16_t data);
197 	void blitter_src_inc_y_w(uint16_t data);
198 	void blitter_src_w(offs_t offset, uint16_t data);
199 	void blitter_end_mask_w(offs_t offset, uint16_t data);
200 	void blitter_dst_inc_x_w(uint16_t data);
201 	void blitter_dst_inc_y_w(uint16_t data);
202 	void blitter_dst_w(offs_t offset, uint16_t data);
203 	void blitter_count_x_w(uint16_t data);
204 	void blitter_count_y_w(uint16_t data);
205 	void blitter_op_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
206 	void blitter_ctrl_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
207 
208 	void mouse_tick();
209 	inline pen_t shift_mode_0();
210 	inline pen_t shift_mode_1();
211 	inline pen_t shift_mode_2();
212 	void shifter_tick();
213 	inline void shifter_load();
214 	inline void draw_pixel(int x, int y, u32 pen);
215 	void glue_tick();
216 	void set_screen_parameters();
217 	void blitter_source();
218 	uint16_t blitter_hop();
219 	void blitter_op(uint16_t s, uint32_t dstaddr, uint16_t mask);
220 	void blitter_tick();
221 
222 	// driver
223 	uint16_t fdc_data_r(offs_t offset);
224 	void fdc_data_w(offs_t offset, uint16_t data);
225 	uint16_t dma_status_r();
226 	void dma_mode_w(uint16_t data);
227 	uint8_t dma_counter_r(offs_t offset);
228 	void dma_base_w(offs_t offset, uint8_t data);
229 	uint8_t mmu_r();
230 	void mmu_w(uint8_t data);
231 	uint16_t berr_r();
232 	void berr_w(uint16_t data);
233 	uint8_t ikbd_port1_r();
234 	uint8_t ikbd_port2_r();
235 	void ikbd_port2_w(uint8_t data);
236 	void ikbd_port3_w(uint8_t data);
237 	uint8_t ikbd_port4_r();
238 	void ikbd_port4_w(uint8_t data);
239 
240 	DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
241 
242 	void psg_pa_w(uint8_t data);
243 
244 	DECLARE_WRITE_LINE_MEMBER( ikbd_tx_w );
245 
246 	DECLARE_WRITE_LINE_MEMBER( reset_w );
247 
248 	void toggle_dma_fifo();
249 	void flush_dma_fifo();
250 	void fill_dma_fifo();
251 	void fdc_dma_transfer();
252 
253 	void configure_memory();
254 	void state_save();
255 
256 	/* memory state */
257 	uint8_t m_mmu;
258 
259 	/* keyboard state */
260 	uint16_t m_ikbd_keylatch;
261 	uint8_t m_ikbd_mouse;
262 	uint8_t m_ikbd_mouse_x;
263 	uint8_t m_ikbd_mouse_y;
264 	uint8_t m_ikbd_mouse_px;
265 	uint8_t m_ikbd_mouse_py;
266 	uint8_t m_ikbd_mouse_pc;
267 	int m_ikbd_tx;
268 	int m_ikbd_joy;
269 	int m_midi_tx;
270 
271 	/* floppy state */
272 	uint32_t m_dma_base;
273 	uint16_t m_dma_error;
274 	uint16_t m_fdc_mode;
275 	uint8_t m_fdc_sectors;
276 	uint16_t m_fdc_fifo[2][8];
277 	int m_fdc_fifo_sel;
278 	int m_fdc_fifo_index;
279 	int m_fdc_fifo_msb;
280 	int m_fdc_fifo_empty[2];
281 	int m_fdc_dmabytes;
282 
283 	/* shifter state */
284 	uint32_t m_shifter_base;
285 	uint32_t m_shifter_ofs;
286 	uint8_t m_shifter_sync;
287 	uint8_t m_shifter_mode;
288 	uint16_t m_shifter_palette[16];
289 	uint16_t m_shifter_rr[4];
290 	uint16_t m_shifter_ir[4];
291 	int m_shifter_bitplane;
292 	int m_shifter_shift;
293 	int m_shifter_h;
294 	int m_shifter_v;
295 	int m_shifter_de;
296 	int m_shifter_x_start;
297 	int m_shifter_x_end;
298 	int m_shifter_y_start;
299 	int m_shifter_y_end;
300 	int m_shifter_hblank_start;
301 	int m_shifter_vblank_start;
302 
303 	/* blitter state */
304 	uint16_t m_blitter_halftone[16];
305 	int16_t m_blitter_src_inc_x;
306 	int16_t m_blitter_src_inc_y;
307 	int16_t m_blitter_dst_inc_x;
308 	int16_t m_blitter_dst_inc_y;
309 	uint32_t m_blitter_src;
310 	uint32_t m_blitter_dst;
311 	uint16_t m_blitter_endmask1;
312 	uint16_t m_blitter_endmask2;
313 	uint16_t m_blitter_endmask3;
314 	uint16_t m_blitter_xcount;
315 	uint16_t m_blitter_ycount;
316 	uint16_t m_blitter_xcountl;
317 	uint8_t m_blitter_hop;
318 	uint8_t m_blitter_op;
319 	uint8_t m_blitter_ctrl;
320 	uint8_t m_blitter_skew;
321 	uint32_t m_blitter_srcbuf;
322 
323 	/* timers */
324 	emu_timer *m_mouse_timer;
325 	emu_timer *m_glue_timer;
326 	emu_timer *m_shifter_timer;
327 
328 	bitmap_rgb32 m_bitmap;
329 
330 	DECLARE_FLOPPY_FORMATS(floppy_formats);
331 
332 	int m_monochrome;
333 	required_device<palette_device> m_palette;
334 	required_device<screen_device> m_screen;
335 
336 	void common(machine_config &config);
337 	void ikbd_map(address_map &map);
338 	void cpu_space_map(address_map &map);
339 	void st_map(address_map &map);
340 	void keyboard(machine_config &config);
341 
342 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
343 	virtual void machine_start() override;
344 	virtual void video_start() override;
345 
346 	output_finder<> m_led;
347 };
348 
349 class megast_state : public st_state
350 {
351 public:
megast_state(const machine_config & mconfig,device_type type,const char * tag)352 	megast_state(const machine_config &mconfig, device_type type, const char *tag)
353 		: st_state(mconfig, type, tag)
354 	{ }
355 
356 	uint16_t fpu_r();
357 	void fpu_w(uint16_t data);
358 	void megast(machine_config &config);
359 	void megast_map(address_map &map);
360 };
361 
362 class ste_state : public st_state
363 {
364 public:
365 	enum
366 	{
367 		TIMER_DMASOUND_TICK,
368 		TIMER_MICROWIRE_TICK
369 	};
370 
ste_state(const machine_config & mconfig,device_type type,const char * tag)371 	ste_state(const machine_config &mconfig, device_type type, const char *tag)
372 		: st_state(mconfig, type, tag),
373 			m_lmc1992(*this, LMC1992_TAG)
374 	{ }
375 
376 	optional_device<lmc1992_device> m_lmc1992;
377 
378 	uint8_t shifter_base_low_r();
379 	void shifter_base_low_w(uint8_t data);
380 	uint8_t shifter_counter_r(offs_t offset);
381 	void shifter_counter_w(offs_t offset, uint8_t data);
382 	void shifter_palette_w(offs_t offset, uint16_t data);
383 	uint8_t shifter_lineofs_r();
384 	void shifter_lineofs_w(uint8_t data);
385 	uint8_t shifter_pixelofs_r();
386 	void shifter_pixelofs_w(uint8_t data);
387 
388 	uint8_t sound_dma_control_r();
389 	uint8_t sound_dma_base_r(offs_t offset);
390 	uint8_t sound_dma_counter_r(offs_t offset);
391 	uint8_t sound_dma_end_r(offs_t offset);
392 	uint8_t sound_mode_r();
393 	void sound_dma_control_w(uint8_t data);
394 	void sound_dma_base_w(offs_t offset, uint8_t data);
395 	void sound_dma_end_w(offs_t offset, uint8_t data);
396 	void sound_mode_w(uint8_t data);
397 	uint16_t microwire_data_r();
398 	void microwire_data_w(uint16_t data);
399 	uint16_t microwire_mask_r();
400 	void microwire_mask_w(uint16_t data);
401 
402 	DECLARE_WRITE_LINE_MEMBER( write_monochrome );
403 
404 	void dmasound_set_state(int level);
405 	void dmasound_tick();
406 	void microwire_shift();
407 	void microwire_tick();
408 	void state_save();
409 
410 	// shifter state
411 	uint8_t m_shifter_lineofs;
412 	uint8_t m_shifter_pixelofs;
413 
414 	/* microwire state */
415 	uint16_t m_mw_data;
416 	uint16_t m_mw_mask;
417 	int m_mw_shift;
418 
419 	/* DMA sound state */
420 	uint32_t m_dmasnd_base;
421 	uint32_t m_dmasnd_end;
422 	uint32_t m_dmasnd_cntr;
423 	uint32_t m_dmasnd_baselatch;
424 	uint32_t m_dmasnd_endlatch;
425 	uint8_t m_dmasnd_ctrl;
426 	uint8_t m_dmasnd_mode;
427 	uint8_t m_dmasnd_fifo[8];
428 	uint8_t m_dmasnd_samples;
429 	int m_dmasnd_active;
430 
431 	// timers
432 	emu_timer *m_microwire_timer;
433 	emu_timer *m_dmasound_timer;
434 
435 	void falcon40(machine_config &config);
436 	void tt030(machine_config &config);
437 	void falcon(machine_config &config);
438 	void ste(machine_config &config);
439 	void ste_map(address_map &map);
440 protected:
441 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
442 	virtual void machine_start() override;
443 	virtual void video_start() override;
444 };
445 
446 class megaste_state : public ste_state
447 {
448 public:
megaste_state(const machine_config & mconfig,device_type type,const char * tag)449 	megaste_state(const machine_config &mconfig, device_type type, const char *tag)
450 		: ste_state(mconfig, type, tag)
451 	{ }
452 
453 	uint16_t cache_r();
454 	void cache_w(uint16_t data);
455 
456 	uint16_t m_cache;
457 	void megaste(machine_config &config);
458 	void megaste_map(address_map &map);
459 
460 protected:
461 	virtual void machine_start() override;
462 };
463 
464 class stbook_state : public ste_state
465 {
466 public:
stbook_state(const machine_config & mconfig,device_type type,const char * tag)467 	stbook_state(const machine_config &mconfig, device_type type, const char *tag)
468 		: ste_state(mconfig, type, tag),
469 			m_sw400(*this, "SW400")
470 	{ }
471 
472 	required_ioport m_sw400;
473 
474 	uint16_t config_r();
475 	void lcd_control_w(uint16_t data);
476 
477 	void psg_pa_w(uint8_t data);
478 	uint8_t mfp_gpio_r();
479 	void stbook_map(address_map &map);
480 protected:
481 	virtual void machine_start() override;
482 	virtual void video_start() override;
483 };
484 
485 #endif // MAME_INCLUDES_ATARI_ST_H
486