1 // license:LGPL-2.1+
2 // copyright-holders:Angelo Salese, Olivier Galibert, David Haywood, Samuele Zannoli, R. Belmont, ElSemi
3 /*
4 
5 naomi.h -> NAOMI includes
6 
7 */
8 #include "machine/eepromser.h"
9 #include "machine/intelfsh.h"
10 #include "cpu/arm7/arm7.h"
11 #include "cpu/z80/z80.h"
12 #include "machine/x76f100.h"
13 #include "machine/maple-dc.h"
14 #include "machine/dc-ctrl.h"
15 #include "machine/mie.h"
16 #include "machine/naomirom.h"
17 #include "machine/naomigd.h"
18 #include "machine/naomim1.h"
19 #include "machine/naomim2.h"
20 #include "machine/naomim4.h"
21 #include "machine/awboard.h"
22 #include "machine/nvram.h"
23 #include "cpu/sh/sh4.h"
24 #include "cpu/arm7/arm7core.h"
25 #include "sound/aica.h"
26 #include "machine/aicartc.h"
27 #include "machine/jvsdev.h"
28 #include "machine/jvs13551.h"
29 #include "machine/m3comm.h"
30 #include "machine/gunsense.h"
31 #include "dc.h"
32 
33 enum {
34 	JVSBD_DEFAULT = 0,
35 	JVSBD_ADSTICK,
36 	JVSBD_LIGHTGUN,
37 	JVSBD_MAHJONG,
38 	JVSBD_KEYBOARD
39 };
40 
41 class naomi_state : public dc_state
42 {
43 	public:
naomi_state(const machine_config & mconfig,device_type type,const char * tag)44 		naomi_state(const machine_config &mconfig, device_type type, const char *tag)
45 		: dc_state(mconfig, type, tag),
46 		m_eeprom(*this, "main_eeprom"),
47 		m_rombase(*this, "rombase"),
48 		m_mp(*this, "KEY%u", 1U)
49 		{ }
50 
51 	void naomi_base(machine_config &config);
52 	void naomim2(machine_config &config);
53 	void naomim2_kb(machine_config &config);
54 	void naomim2_gun(machine_config &config);
55 	void naomi(machine_config &config);
56 	void naomim1(machine_config &config);
57 	void naomigd(machine_config &config);
58 	void naomigd_kb(machine_config &config);
59 	void naomim4(machine_config &config);
60 
61 	void init_naomigd();
62 	void init_ggxx();
63 	void init_ggxxrl();
64 	void init_ggxxsla();
65 	void init_naomi();
66 	void init_naomigd_mp();
67 	void init_sfz3ugd();
68 	void init_hotd2();
69 	void init_naomi_mp();
70 
71 	DECLARE_CUSTOM_INPUT_MEMBER(naomi_mp_r);
72 	DECLARE_CUSTOM_INPUT_MEMBER(suchie3_mp_r);
73 	DECLARE_CUSTOM_INPUT_MEMBER(naomi_kb_r);
74 	DECLARE_INPUT_CHANGED_MEMBER(naomi_mp_w);
75 
76 	uint64_t naomi2_biose_idle_skip_r();
77 
78 protected:
79 	required_device<eeprom_serial_93cxx_device> m_eeprom;
80 	optional_shared_ptr<uint64_t> m_rombase;
81 	optional_ioport_array<5> m_mp;
82 
83 	DECLARE_MACHINE_RESET(naomi);
84 	DECLARE_WRITE_LINE_MEMBER(external_reset);
85 
86 	uint16_t naomi_g2bus_r(offs_t offset);
87 	uint64_t eeprom_93c46a_r();
88 	void eeprom_93c46a_w(uint64_t data);
89 
90 	uint8_t m_mp_mux;
91 
92 	uint8_t asciihex_to_dec(uint8_t in);
93 	void create_pic_from_retdat();
94 
95 	uint64_t naomi_biose_idle_skip_r();
96 	uint64_t naomi_biosh_idle_skip_r();
97 	uint64_t naomigd_ggxxsla_idle_skip_r();
98 	uint64_t naomigd_ggxx_idle_skip_r();
99 	uint64_t naomigd_ggxxrl_idle_skip_r();
100 	uint64_t naomigd_sfz3ugd_idle_skip_r();
101 	uint64_t hotd2_idle_skip_r();
102 
103 	void naomi_map(address_map &map);
104 	void naomi_port(address_map &map);
105 
106 	void set_drc_options();
107 };
108 
109 class naomi2_state : public naomi_state
110 {
111 public:
naomi2_state(const machine_config & mconfig,device_type type,const char * tag)112 	naomi2_state(const machine_config &mconfig, device_type type, const char *tag)
113 		: naomi_state(mconfig, type, tag),
114 		m_pvr2_texture_ram(*this, "textureram2"),
115 		m_pvr2_framebuffer_ram(*this, "frameram2"),
116 		m_elan_ram(*this, "elan_ram"),
117 		m_powervr2_slave(*this, "powervr2_slave") { }
118 
119 	void naomi2_base(machine_config &config);
120 	void naomi2m2(machine_config &config);
121 	void naomi2gd(machine_config &config);
122 	void naomi2m1(machine_config &config);
123 
124 	void init_naomi2();
125 
126 private:
127 	required_shared_ptr<uint64_t> m_pvr2_texture_ram;
128 	required_shared_ptr<uint64_t> m_pvr2_framebuffer_ram;
129 	required_shared_ptr<uint64_t> m_elan_ram;
130 	required_device<powervr2_device> m_powervr2_slave;
131 
132 	void both_pvr2_ta_w(address_space &space, offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
133 	void naomi2_map(address_map &map);
134 };
135 
136 class atomiswave_state : public dc_state
137 {
138 public:
atomiswave_state(const machine_config & mconfig,device_type type,const char * tag)139 	atomiswave_state(const machine_config &mconfig, device_type type, const char *tag)
140 		: dc_state(mconfig, type, tag),
141 		m_awflash(*this, "awflash")
142 	   { }
143 
144 	void aw_base(machine_config &config);
145 	void aw1c(machine_config &config);
146 	void aw2c(machine_config &config);
147 
148 	void init_atomiswave();
149 	void init_xtrmhnt2();
150 
151 private:
152 	required_device<macronix_29l001mc_device> m_awflash;
153 
154 	uint64_t aw_flash_r(offs_t offset);
155 	void aw_flash_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
156 	uint64_t aw_modem_r(offs_t offset, uint64_t mem_mask = ~0);
157 	void aw_modem_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0);
158 
159 	uint64_t xtrmhnt2_hack_r();
160 
161 	void aw_map(address_map &map);
162 	void aw_port(address_map &map);
163 
164 	uint8_t aw_ctrl_type;
165 	inline int decode_reg32_64(uint32_t offset, uint64_t mem_mask, uint64_t *shift);
166 };
167 
168 INPUT_PORTS_EXTERN( naomi_debug );
169