1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /*************************************************************************
4 
5     Atari System 2 hardware
6 
7 *************************************************************************/
8 
9 #include "cpu/m6502/m6502.h"
10 #include "cpu/t11/t11.h"
11 #include "machine/bankdev.h"
12 #include "machine/gen_latch.h"
13 #include "machine/slapstic.h"
14 #include "machine/timer.h"
15 #include "machine/watchdog.h"
16 #include "sound/ym2151.h"
17 #include "sound/pokey.h"
18 #include "sound/tms5220.h"
19 #include "video/atarimo.h"
20 #include "emupal.h"
21 #include "screen.h"
22 #include "tilemap.h"
23 
24 class atarisy2_state : public driver_device
25 {
26 public:
atarisy2_state(const machine_config & mconfig,device_type type,const char * tag)27 	atarisy2_state(const machine_config &mconfig, device_type type, const char *tag)
28 		: driver_device(mconfig, type, tag)
29 		, m_maincpu(*this, "maincpu")
30 		, m_audiocpu(*this, "audiocpu")
31 		, m_gfxdecode(*this, "gfxdecode")
32 		, m_screen(*this, "screen")
33 		, m_mob(*this, "mob")
34 		, m_slapstic_base(*this, "slapstic_base")
35 		, m_vrambank(*this, "vrambank")
36 		, m_playfield_tilemap(*this, "playfield")
37 		, m_alpha_tilemap(*this, "alpha")
38 		, m_xscroll(*this, "xscroll")
39 		, m_yscroll(*this, "yscroll")
40 		, m_soundlatch(*this, "soundlatch")
41 		, m_mainlatch(*this, "mainlatch")
42 		, m_ym2151(*this, "ymsnd")
43 		, m_pokey(*this, "pokey%u", 1U)
44 		, m_tms5220(*this, "tms")
45 		, m_rombank(*this, "rombank%u", 1U)
46 		, m_slapstic(*this, "slapstic")
47 		, m_leds(*this, "led%u", 0U)
48 	{ }
49 
50 	void init_ssprint();
51 	void init_apb();
52 	void init_csprint();
53 	void init_paperboy();
54 	void init_720();
55 
56 	void atarisy2(machine_config &config);
57 	void apb(machine_config &config);
58 	void paperboy(machine_config &config);
59 	void ssprint(machine_config &config);
60 	void _720(machine_config &config);
61 	void csprint(machine_config &config);
62 
63 protected:
64 	virtual void machine_start() override;
65 	virtual void machine_reset() override;
66 	virtual void device_post_load() override;
67 	virtual void video_start() override;
68 
69 private:
70 	void update_interrupts();
71 
72 	required_device<t11_device> m_maincpu;
73 	required_device<m6502_device> m_audiocpu;
74 	required_device<gfxdecode_device> m_gfxdecode;
75 	required_device<screen_device> m_screen;
76 	required_device<atari_motion_objects_device> m_mob;
77 	required_shared_ptr<uint16_t> m_slapstic_base;
78 	required_device<address_map_bank_device> m_vrambank;
79 
80 	uint8_t           m_interrupt_enable;
81 
82 	required_device<tilemap_device> m_playfield_tilemap;
83 	required_device<tilemap_device> m_alpha_tilemap;
84 	required_shared_ptr<uint16_t> m_xscroll;
85 	required_shared_ptr<uint16_t> m_yscroll;
86 
87 	int8_t            m_pedal_count;
88 
89 	required_device<generic_latch_8_device> m_soundlatch;
90 	required_device<generic_latch_8_device> m_mainlatch;
91 	required_device<ym2151_device> m_ym2151;
92 	required_device_array<pokey_device, 2> m_pokey;
93 	optional_device<tms5220_device> m_tms5220;
94 
95 	bool            m_scanline_int_state;
96 	bool            m_video_int_state;
97 	bool            m_p2portwr_state;
98 	bool            m_p2portrd_state;
99 
100 	required_memory_bank_array<2> m_rombank;
101 	required_device<atari_slapstic_device> m_slapstic;
102 
103 	uint8_t           m_sound_reset_state;
104 
105 	emu_timer *     m_yscroll_reset_timer;
106 	uint32_t          m_playfield_tile_bank[2];
107 
108 	// 720 fake joystick
109 	double          m_joy_last_angle;
110 	int             m_joy_rotations;
111 
112 	// 720 fake spinner
113 	uint32_t          m_spin_last_rotate_count;
114 	int32_t           m_spin_pos;                 /* track fake position of spinner */
115 	uint32_t          m_spin_center_count;
116 
117 	output_finder<2> m_leds;
118 
119 	void scanline_int_ack_w(uint8_t data);
120 	void video_int_ack_w(uint8_t data);
121 	void int0_ack_w(uint8_t data);
122 	void sound_reset_w(uint8_t data);
123 	void int_enable_w(uint8_t data);
124 	INTERRUPT_GEN_MEMBER(sound_irq_gen);
125 	void sound_irq_ack_w(uint8_t data);
126 	DECLARE_WRITE_LINE_MEMBER(boost_interleave_hack);
127 	void bankselect_w(offs_t offset, uint16_t data);
128 	uint16_t switch_r();
129 	uint8_t switch_6502_r();
130 	void switch_6502_w(uint8_t data);
131 	uint8_t leta_r(offs_t offset);
132 	void mixer_w(uint8_t data);
133 	void sndrst_6502_w(uint8_t data);
134 	uint16_t sound_r();
135 	void sound_6502_w(uint8_t data);
136 	uint8_t sound_6502_r();
137 	void tms5220_w(uint8_t data);
138 	void tms5220_strobe_w(offs_t offset, uint8_t data);
139 	void coincount_w(uint8_t data);
140 
141 	TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
142 
143 	TILE_GET_INFO_MEMBER(get_alpha_tile_info);
144 	TILE_GET_INFO_MEMBER(get_playfield_tile_info);
145 	uint32_t screen_update_atarisy2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
146 	DECLARE_WRITE_LINE_MEMBER(vblank_int);
147 	TIMER_CALLBACK_MEMBER(delayed_int_enable_w);
148 	TIMER_CALLBACK_MEMBER(reset_yscroll_callback);
149 	uint16_t slapstic_r(address_space &space, offs_t offset);
150 	void slapstic_w(address_space &space, offs_t offset, uint16_t data);
151 	void yscroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
152 	void xscroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
153 	void spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
154 	static rgb_t RRRRGGGGBBBBIIII(uint32_t raw);
155 
156 	static const atari_motion_objects_config s_mob_config;
157 	void main_map(address_map &map);
158 	void sound_map(address_map &map);
159 	void vrambank_map(address_map &map);
160 };
161