1 // license:BSD-3-Clause
2 // copyright-holders:Nathan Woods, Wilbert Pol, David Shah
3 /*****************************************************************************
4 
5     a2600.h
6 
7     Atari 2600
8 
9  ****************************************************************************/
10 
11 #ifndef MAME_INCLUDES_A2600_H
12 #define MAME_INCLUDES_A2600_H
13 
14 #pragma once
15 
16 #include "bus/vcs/compumat.h"
17 #include "bus/vcs/dpc.h"
18 #include "bus/vcs/harmony_melody.h"
19 #include "bus/vcs/rom.h"
20 #include "bus/vcs/scharger.h"
21 #include "bus/vcs/vcs_slot.h"
22 #include "bus/vcs_ctrl/ctrl.h"
23 #include "cpu/m6502/m6507.h"
24 #include "sound/tiaintf.h"
25 #include "video/tia.h"
26 
27 #define USE_NEW_RIOT 0
28 
29 #if USE_NEW_RIOT
30 #include "machine/mos6530n.h"
31 #else
32 #include "machine/6532riot.h"
33 #endif
34 
35 #define CONTROL1_TAG    "joyport1"
36 #define CONTROL2_TAG    "joyport2"
37 
38 
39 class a2600_base_state : public driver_device
40 {
41 protected:
a2600_base_state(const machine_config & mconfig,device_type type,const char * tag)42 	a2600_base_state(const machine_config &mconfig, device_type type, const char *tag) :
43 		driver_device(mconfig, type, tag),
44 		m_riot_ram(*this, "riot_ram"),
45 		m_tia(*this, "tia_video"),
46 		m_maincpu(*this, "maincpu"),
47 		m_riot(*this, "riot"),
48 		m_joy1(*this, CONTROL1_TAG),
49 		m_joy2(*this, CONTROL2_TAG),
50 		m_screen(*this, "screen")
51 	{ }
52 
53 	virtual void machine_start() override;
54 
55 	void switch_A_w(uint8_t data);
56 	uint8_t switch_A_r();
57 	void switch_B_w(uint8_t data);
58 	DECLARE_WRITE_LINE_MEMBER(irq_callback);
59 	uint16_t a2600_read_input_port(offs_t offset);
60 	uint8_t a2600_get_databus_contents(offs_t offset);
61 	void a2600_tia_vsync_callback(uint16_t data);
62 	void a2600_tia_vsync_callback_pal(uint16_t data);
63 
64 	void a2600_mem(address_map &map);
65 
66 	required_shared_ptr<uint8_t> m_riot_ram;
67 	required_device<tia_video_device> m_tia;
68 	required_device<m6507_device> m_maincpu;
69 #if USE_NEW_RIOT
70 	required_device<mos6532_new_device> m_riot;
71 #else
72 	required_device<riot6532_device> m_riot;
73 #endif
74 	required_device<vcs_control_port_device> m_joy1;
75 	required_device<vcs_control_port_device> m_joy2;
76 	required_device<screen_device> m_screen;
77 
78 private:
79 	uint16_t m_current_screen_height;
80 };
81 
82 
83 class a2600_state : public a2600_base_state
84 {
85 public:
a2600_state(const machine_config & mconfig,device_type type,const char * tag)86 	a2600_state(const machine_config &mconfig, device_type type, const char *tag) :
87 		a2600_base_state(mconfig, type, tag),
88 		m_cart(*this, "cartslot")
89 	{ }
90 
91 	void a2600(machine_config &config);
92 	void a2600p(machine_config &config);
93 
94 protected:
95 	virtual void machine_start() override;
96 
97 	void cart_over_tia_w(address_space &space, offs_t offset, uint8_t data);
98 	// investigate how the carts mapped here (Mapper JVP) interact with the RIOT device
99 	uint8_t cart_over_riot_r(address_space &space, offs_t offset);
100 	void cart_over_riot_w(address_space &space, offs_t offset, uint8_t data);
101 	uint8_t cart_over_all_r(address_space &space, offs_t offset);
102 	void cart_over_all_w(address_space &space, offs_t offset, uint8_t data);
103 
104 	void a2600_cartslot(machine_config &config);
105 
106 private:
107 	required_device<vcs_cart_slot_device> m_cart;
108 };
109 
110 #endif // MAME_INCLUDES_A2600_H
111