1 // license:BSD-3-Clause
2 // copyright-holders:Samuele Zannoli
3 /***************************************************************************
4 
5     XBOX (c) 2001 Microsoft
6 
7 ***************************************************************************/
8 
9 
10 #include "emu.h"
11 #include "machine/pci.h"
12 #include "machine/idectrl.h"
13 #include "includes/xbox_pci.h"
14 #include "includes/xbox.h"
15 
16 #include "cpu/i386/i386.h"
17 #include "bus/ata/atapicdr.h"
18 #include "bus/ata/idehd.h"
19 
20 #include "debug/debugcmd.h"
21 #include "debug/debugcon.h"
22 #include "debugger.h"
23 #include "speaker.h"
24 
25 #include "bitmap.h"
26 
27 
28 #define CPU_DIV 64
29 
30 class xbox_state : public xbox_base_state
31 {
32 public:
xbox_state(const machine_config & mconfig,device_type type,const char * tag)33 	xbox_state(const machine_config &mconfig, device_type type, const char *tag)
34 		: xbox_base_state(mconfig, type, tag)
35 		, m_ide(*this, "pci:09.0:ide1")
36 		, m_devh(*this, "pci:09.0:ide1:0:hdd")
37 		, m_devc(*this, "pci:09.0:ide1:1:cdrom")
38 	{ }
39 
40 	void xbox(machine_config &config);
41 protected:
42 	void xbox_map(address_map &map);
43 
44 	// driver_device overrides
45 	virtual void machine_start() override;
46 	virtual void machine_reset() override;
47 	virtual void video_start() override;
48 
49 	virtual void hack_eeprom() override;
50 
51 	// devices
52 	optional_device<bus_master_ide_controller_device> m_ide;
53 	required_device<ata_mass_storage_device> m_devh;
54 	required_device<atapi_cdrom_device> m_devc;
55 };
56 
video_start()57 void xbox_state::video_start()
58 {
59 }
60 
xbox_map(address_map & map)61 void xbox_state::xbox_map(address_map &map)
62 {
63 	map(0xff000000, 0xff0fffff).rom().region("bios", 0).mirror(0x00f00000);
64 }
65 
66 static INPUT_PORTS_START( xbox )
67 	/* dummy active high structure */
68 	PORT_START("SYSA")
69 	PORT_DIPNAME( 0x01, 0x00, "SYSA" )
DEF_STR(Off)70 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
71 	PORT_DIPSETTING(    0x01, DEF_STR( On ) )
72 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
73 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
74 	PORT_DIPSETTING(    0x02, DEF_STR( On ) )
75 	PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
76 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
77 	PORT_DIPSETTING(    0x04, DEF_STR( On ) )
78 	PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
79 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
80 	PORT_DIPSETTING(    0x08, DEF_STR( On ) )
81 	PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
82 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
83 	PORT_DIPSETTING(    0x10, DEF_STR( On ) )
84 	PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
85 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
86 	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
87 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
88 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
89 	PORT_DIPSETTING(    0x40, DEF_STR( On ) )
90 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
91 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
92 	PORT_DIPSETTING(    0x80, DEF_STR( On ) )
93 
94 	/* dummy active low structure */
95 	PORT_START("DSWA")
96 	PORT_DIPNAME( 0x01, 0x01, "DSWA" )
97 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
98 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
99 	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
100 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
101 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
102 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
103 	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
104 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
105 	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
106 	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
107 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
108 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
109 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
110 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
111 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
112 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
113 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
114 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
115 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
116 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
117 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
118 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
119 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
120 INPUT_PORTS_END
121 
122 
123 void xbox_state::hack_eeprom()
124 {
125 	// 8004e5da,4e5da=0xc3
126 	m_maincpu->space(0).write_byte(0x4e5da, 0xc3); // remove audio wait
127 	// 8006e654,6e654=0
128 	m_maincpu->space(0).write_byte(0x6e654, 0); // disable boot animation
129 	// 800375f0,375f0=0
130 	m_maincpu->space(0).write_byte(0x375f0, m_maincpu->space(0).read_byte(0x375f0) & 0xfe); // internal hub not used
131 }
132 
machine_start()133 void xbox_state::machine_start()
134 {
135 	xbox_base_state::machine_start();
136 	// savestates
137 	//save_item(NAME(item));
138 }
139 
machine_reset()140 void xbox_state::machine_reset()
141 {
142 	uint16_t *id;
143 
144 	// set some needed parameters
145 	id = m_devh->identify_device_buffer();
146 	id[88] |= (1 << 2); // ultra dma mode 2 supported
147 	id[128] |= 2; // bits 2-1=01 drive already unlocked
148 
149 	id = m_devc->identify_device_buffer();
150 	id[64] |= (1 << 1);
151 	id[88] |= (1 << 2); // ultra dma mode 2 supported
152 }
153 
usb_xbox(device_slot_interface & device)154 void usb_xbox(device_slot_interface &device)
155 {
156 	device.option_add("xbox_controller", OHCI_GAME_CONTROLLER);
157 }
158 
xbox_ata_devices(device_slot_interface & device)159 void xbox_ata_devices(device_slot_interface &device)
160 {
161 	device.option_add("hdd", IDE_HARDDISK);
162 	device.option_add("cdrom", ATAPI_CDROM);
163 }
164 
xbox(machine_config & config)165 void xbox_state::xbox(machine_config &config)
166 {
167 	xbox_base(config);
168 	m_maincpu->set_addrmap(AS_PROGRAM, &xbox_state::xbox_map);
169 
170 	subdevice<ide_controller_32_device>(":pci:09.0:ide1")->options(xbox_ata_devices, "hdd", "cdrom", true);
171 
172 	OHCI_USB_CONNECTOR(config, ":pci:02.0:port1", usb_xbox, nullptr, false);
173 	OHCI_USB_CONNECTOR(config, ":pci:02.0:port2", usb_xbox, nullptr, false);
174 	OHCI_USB_CONNECTOR(config, ":pci:02.0:port3", usb_xbox, "xbox_controller", false);
175 	OHCI_USB_CONNECTOR(config, ":pci:02.0:port4", usb_xbox, nullptr, false);
176 
177 	/* sound hardware */
178 	SPEAKER(config, "mono").front_center();
179 
180 	OHCI_GAME_CONTROLLER(config, "ohci_gamepad", 0);
181 }
182 
183 
184 /***************************************************************************
185 
186   Machine driver(s)
187 
188 ***************************************************************************/
189 #define ROM_LOAD_BIOS(bios,name,offset,length,hash) \
190 		ROMX_LOAD(name, offset, length, hash, ROM_BIOS(bios))
191 
192 ROM_START( xbox )
193 	ROM_REGION( 0x400, "mcpx", 0 )
194 	ROM_LOAD( "mcpx_1_0.bin", 0, 0x200, CRC(0b07d1f1) SHA1(5d270675b54eb8071b480e42d22a3015ac211cef) )
195 	ROM_LOAD( "mcpx_1_1.bin", 0x200, 0x200, CRC(94ce376b) SHA1(6c875f17f773aaec51eb434068bb6c657c4343c0) )
196 
197 	ROM_REGION32_LE( 0x100000, "bios", 0)
198 	ROM_SYSTEM_BIOS(0, "bios0", "Chihiro Bios 4134 1024k") \
199 	ROM_LOAD_BIOS(0, "4134_1024k.bin", 0x000000, 0x100000, CRC(49d8055a) SHA1(d46cef771a63dc8024fe36d7ab5b959087ac999f)) \
200 	ROM_SYSTEM_BIOS(1, "bios1", "Chihiro Bios 3944 1024k") \
201 	ROM_LOAD_BIOS(1, "3944_1024k.bin", 0x000000, 0x100000, CRC(32a9ecb6) SHA1(67054fc88bda94e33e86f1b19be60efec0724fb6)) \
202 	ROM_SYSTEM_BIOS(2, "bios2", "Chihiro Bios 4034 1024k") \
203 	ROM_LOAD_BIOS(2, "4034_1024k.bin", 0x000000, 0x100000, CRC(0d6fc88f) SHA1(ab676b712204fb1728bf89f9cd541a8f5a64ab97)) \
204 	ROM_SYSTEM_BIOS(3, "bios3", "Chihiro Bios 4817 1024k") \
205 	ROM_LOAD_BIOS(3, "4817_1024k.bin", 0x000000, 0x100000, CRC(3f30863a) SHA1(dc955bd4d3ca71e01214a49e5d0aba615270c03c))
206 	ROM_COPY( "mcpx", 0, 0x3fe00, 0x200)
207 	ROM_COPY( "mcpx", 0, 0x7fe00, 0x200)
208 	ROM_COPY( "mcpx", 0, 0xbfe00, 0x200)
209 	ROM_COPY( "mcpx", 0, 0xffe00, 0x200)
210 
211 
212 	ROM_REGION( 0x1000000, "tbp", 0 ) // To Be Processed, of course
213 	ROM_LOAD( "5101_256k.bin", 0x000000, 0x040000, CRC(e8a9224e) SHA1(5108e1025f48071c07a6823661d708c66dee97a9) )
214 	ROM_LOAD( "xbox-5530.bin", 0x040000, 0x040000, CRC(9569c4d3) SHA1(40fa73277013be3168135e1768b09623a987ff63) )
215 	ROM_LOAD( "xbox-5713.bin", 0x080000, 0x040000, CRC(58fd8173) SHA1(8b7ccc4648ccd78cdb7b65cfca09621eaf2d4238) )
216 	ROM_LOAD( "5838_256k.bin", 0x0C0000, 0x040000, CRC(5be2413d) SHA1(b9489e883c650b5e5fe2f83a32237dbf74f0e9f1) )
217 ROM_END
218 
219 
220 CONS( 2001, xbox, 0, 0, xbox,  xbox, xbox_state, empty_init, "Microsoft", "XBOX", MACHINE_IS_SKELETON )
221