1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /*************************************************************************
4 
5     Atari System 1 hardware
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_ATARISY1_H
9 #define MAME_INCLUDES_ATARISY1_H
10 
11 #pragma once
12 
13 #include "machine/6522via.h"
14 #include "machine/74259.h"
15 #include "machine/adc0808.h"
16 #include "machine/gen_latch.h"
17 #include "machine/input_merger.h"
18 #include "machine/slapstic.h"
19 #include "machine/timer.h"
20 #include "sound/tms5220.h"
21 #include "sound/ym2151.h"
22 #include "video/atarimo.h"
23 #include "emupal.h"
24 #include "screen.h"
25 #include "tilemap.h"
26 
27 class atarisy1_state : public driver_device
28 {
29 public:
atarisy1_state(const machine_config & mconfig,device_type type,const char * tag)30 	atarisy1_state(const machine_config &mconfig, device_type type, const char *tag)
31 		: driver_device(mconfig, type, tag)
32 		, m_maincpu(*this, "maincpu")
33 		, m_audiocpu(*this, "audiocpu")
34 		, m_soundlatch(*this, "soundlatch")
35 		, m_mainlatch(*this, "mainlatch")
36 		, m_slapstic(*this, "slapstic")
37 		, m_gfxdecode(*this, "gfxdecode")
38 		, m_screen(*this, "screen")
39 		, m_mob(*this, "mob")
40 		, m_palette(*this, "palette")
41 		, m_adc(*this, "adc")
42 		, m_ajsint(*this, "ajsint")
43 		, m_playfield_tilemap(*this, "playfield")
44 		, m_alpha_tilemap(*this, "alpha")
45 		, m_xscroll(*this, "xscroll")
46 		, m_yscroll(*this, "yscroll")
47 		, m_yscroll_reset_timer(*this, "yreset_timer")
48 		, m_scanline_timer(*this, "scan_timer")
49 		, m_int3off_timer(*this, "int3off_timer")
50 		, m_tms(*this, "tms")
51 		, m_outlatch(*this, "outlatch")
52 		, m_via(*this, "via")
53 	{ }
54 
55 	void indytemp(machine_config &config);
56 	void roadb110(machine_config &config);
57 	void peterpak(machine_config &config);
58 	void roadrunn(machine_config &config);
59 	void roadb109(machine_config &config);
60 	void marble(machine_config &config);
61 
62 	void init_roadblst();
63 	void init_peterpak();
64 	void init_marble();
65 	void init_roadrunn();
66 	void init_indytemp();
67 
68 protected:
69 	virtual void machine_start() override;
70 	virtual void machine_reset() override;
71 	virtual void video_start() override;
72 
73 	required_device<cpu_device> m_maincpu;
74 	required_device<cpu_device> m_audiocpu;
75 	required_device<generic_latch_8_device> m_soundlatch;
76 	required_device<generic_latch_8_device> m_mainlatch;
77 	required_device<atari_slapstic_device> m_slapstic;
78 
79 	required_device<gfxdecode_device> m_gfxdecode;
80 	required_device<screen_device> m_screen;
81 	required_device<atari_motion_objects_device> m_mob;
82 	required_device<palette_device> m_palette;
83 
84 	uint8_t           m_joystick_type;
85 	uint8_t           m_trackball_type;
86 
87 	optional_device<adc0808_device> m_adc;
88 	optional_device<input_merger_device> m_ajsint;
89 
90 	/* playfield parameters */
91 	required_device<tilemap_device> m_playfield_tilemap;
92 	required_device<tilemap_device> m_alpha_tilemap;
93 	required_shared_ptr<uint16_t> m_xscroll;
94 	required_shared_ptr<uint16_t> m_yscroll;
95 	uint16_t          m_playfield_lookup[256];
96 	uint8_t           m_playfield_tile_bank;
97 	uint16_t          m_playfield_priority_pens;
98 	required_device<timer_device> m_yscroll_reset_timer;
99 
100 	/* INT3 tracking */
101 	int             m_next_timer_scanline;
102 	required_device<timer_device> m_scanline_timer;
103 	required_device<timer_device> m_int3off_timer;
104 	uint8_t           m_scanline_int_state;
105 
106 	/* speech */
107 	optional_device<tms5220_device> m_tms;
108 
109 	required_device<ls259_device> m_outlatch;
110 	optional_device<via6522_device> m_via;
111 
112 	/* graphics bank tracking */
113 	uint8_t           m_bank_gfx[3][8];
114 	uint8_t           m_bank_color_shift[MAX_GFX_ELEMENTS];
115 	uint8_t           m_bankselect;
116 
117 	uint8_t           m_cur[2][2];
118 
119 	void video_int_ack_w(uint8_t data = 0);
120 	template<int Input> uint8_t digital_joystick_r();
121 	uint8_t adc_r(offs_t offset);
122 	void adc_w(offs_t offset, uint8_t data);
123 	uint16_t trakball_r(offs_t offset);
124 	uint8_t switch_6502_r();
125 	DECLARE_WRITE_LINE_MEMBER(coin_counter_right_w);
126 	DECLARE_WRITE_LINE_MEMBER(coin_counter_left_w);
127 	void via_pb_w(uint8_t data);
128 	uint8_t via_pb_r();
129 	TILE_GET_INFO_MEMBER(get_alpha_tile_info);
130 	TILE_GET_INFO_MEMBER(get_playfield_tile_info);
131 	uint32_t screen_update_atarisy1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
132 	TIMER_DEVICE_CALLBACK_MEMBER(reset_yscroll_callback);
133 	TIMER_DEVICE_CALLBACK_MEMBER(int3off_callback);
134 	TIMER_DEVICE_CALLBACK_MEMBER(int3_callback);
135 	virtual void update_timers(int scanline);
136 	void decode_gfx(uint16_t *pflookup, uint16_t *molookup);
137 	int get_bank(uint8_t prom1, uint8_t prom2, int bpp);
138 	uint16_t atarisy1_int3state_r();
139 	void atarisy1_spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
140 	void bankselect_w(uint8_t data);
141 	void atarisy1_xscroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
142 	void atarisy1_yscroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
143 	void atarisy1_priority_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
144 
145 	static const atari_motion_objects_config s_mob_config;
146 	void add_adc(machine_config &config);
147 	void add_speech(machine_config &config);
148 	void atarisy1(machine_config &config);
149 
150 	void main_map(address_map &map);
151 	void sound_map(address_map &map);
152 	void sound_ext_map(address_map &map);
153 };
154 
155 class atarisy1r_state : public atarisy1_state
156 {
157 public:
158 	using atarisy1_state::atarisy1_state;
159 
160 	virtual void update_timers(int scanline) override;
161 };
162 
163 #endif // MAME_INCLUDES_ATARISY1_H
164