summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/chihiro.cpp100
-rw-r--r--src/mame/drivers/xbox.cpp18
-rw-r--r--src/mame/includes/xbox_pci.h8
-rw-r--r--src/mame/includes/xbox_usb.h36
-rw-r--r--src/mame/machine/xbox_pci.cpp28
-rw-r--r--src/mame/machine/xbox_usb.cpp38
6 files changed, 189 insertions, 39 deletions
diff --git a/src/mame/drivers/chihiro.cpp b/src/mame/drivers/chihiro.cpp
index 6a0586a8c40..8dd17281f4c 100644
--- a/src/mame/drivers/chihiro.cpp
+++ b/src/mame/drivers/chihiro.cpp
@@ -393,7 +393,10 @@ Thanks to Alex, Mr Mudkips, and Philip Burke for this info.
//#define LOG_BASEBOARD
//#define VERBOSE_MSG
-/////////////////////////
+/*
+ * Class declaration for jvs_master
+ */
+
DECLARE_DEVICE_TYPE(JVS_MASTER, jvs_master)
class jvs_master : public jvs_host
@@ -447,11 +450,13 @@ int jvs_master::received_packet(uint8_t *buffer)
return (int)length;
}
-/////////////////////////
+/*
+ * Class declaration for ohci_hlean2131qc_device
+ */
DECLARE_DEVICE_TYPE(OHCI_HLEAN2131QC, ohci_hlean2131qc_device)
-class ohci_hlean2131qc_device : public device_t, public ohci_function
+class ohci_hlean2131qc_device : public device_t, public ohci_function, public device_slot_card_interface
{
public:
ohci_hlean2131qc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
@@ -459,6 +464,7 @@ public:
int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) override;
int handle_bulk_pid(int endpoint, int pid, uint8_t *buffer, int size) override;
void set_region_base(uint8_t *data);
+ void set_region(const char *_region_tag, int _region_offset);
protected:
virtual void device_start() override;
@@ -482,6 +488,8 @@ private:
static const uint8_t strdesc1[];
static const uint8_t strdesc2[];
int maximum_send;
+ const char *region_tag;
+ int region_offset;
uint8_t *region;
struct
{
@@ -494,11 +502,18 @@ private:
} jvs;
};
-DEFINE_DEVICE_TYPE(OHCI_HLEAN2131QC, ohci_hlean2131qc_device, "ohci_hlean2131qc", "OHCI Hlean2131qc")
+DEFINE_DEVICE_TYPE(OHCI_HLEAN2131QC, ohci_hlean2131qc_device, "ohci_hlean2131qc", "OHCI an2131qc HLE")
+
+#define MCFG_OHCI_HLEAN2131QC_REGION(_region_tag, _region_offset) \
+ downcast<ohci_hlean2131qc_device *>(device)->set_region(_region_tag, _region_offset);
+
+/*
+ * Class declaration for ohci_hlean2131sc_device
+ */
DECLARE_DEVICE_TYPE(OHCI_HLEAN2131SC, ohci_hlean2131sc_device)
-class ohci_hlean2131sc_device : public device_t, public ohci_function
+class ohci_hlean2131sc_device : public device_t, public ohci_function, public device_slot_card_interface
{
public:
ohci_hlean2131sc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
@@ -506,6 +521,7 @@ public:
int handle_nonstandard_request(int endpoint, USBSetupPacket *setup) override;
int handle_bulk_pid(int endpoint, int pid, uint8_t *buffer, int size) override;
void set_region_base(uint8_t *data);
+ void set_region(const char *_region_tag, int _region_offset);
protected:
virtual void device_start() override;
@@ -524,6 +540,8 @@ private:
static const uint8_t strdesc0[];
static const uint8_t strdesc1[];
static const uint8_t strdesc2[];
+ const char *region_tag;
+ int region_offset;
uint8_t *region;
uint8_t midi_rs232;
uint8_t response[256];
@@ -532,7 +550,14 @@ private:
int step;
};
-DEFINE_DEVICE_TYPE(OHCI_HLEAN2131SC, ohci_hlean2131sc_device, "ohci_hlean2131sc", "OHCI Hlean2131sc")
+DEFINE_DEVICE_TYPE(OHCI_HLEAN2131SC, ohci_hlean2131sc_device, "ohci_hlean2131sc", "OHCI an2131sc HLE")
+
+#define MCFG_OHCI_HLEAN2131SC_REGION(_region_tag, _region_offset) \
+ downcast<ohci_hlean2131sc_device *>(device)->set_region(_region_tag, _region_offset);
+
+/*
+ * Class declaration for chihiro_state
+ */
class chihiro_state : public xbox_base_state
{
@@ -783,9 +808,12 @@ const uint8_t ohci_hlean2131qc_device::strdesc2[] = { 0x0E,0x03,0x42,0x00,0x41,0
ohci_hlean2131qc_device::ohci_hlean2131qc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, OHCI_HLEAN2131QC, tag, owner, clock),
- ohci_function()
+ ohci_function(),
+ device_slot_card_interface(mconfig, *this)
{
maximum_send = 0;
+ region_tag = nullptr;
+ region_offset = 0;
region = nullptr;
jvs.buffer_in_expected = 0;
jvs.buffer_out_used = 0;
@@ -821,6 +849,12 @@ void ohci_hlean2131qc_device::set_region_base(uint8_t *data)
region = data;
}
+void ohci_hlean2131qc_device::set_region(const char *_region_tag, int _region_offset)
+{
+ region_tag = _region_tag;
+ region_offset = _region_offset;
+}
+
int ohci_hlean2131qc_device::handle_nonstandard_request(int endpoint, USBSetupPacket *setup)
{
int sense;
@@ -1083,6 +1117,9 @@ void ohci_hlean2131qc_device::process_jvs_packet()
void ohci_hlean2131qc_device::device_start()
{
+ initialize(machine());
+ if (region_tag)
+ set_region_base(memregion(region_tag)->base() + region_offset);
}
//pc20
@@ -1101,9 +1138,12 @@ const uint8_t ohci_hlean2131sc_device::strdesc2[] = { 0x0E,0x03,0x42,0x00,0x41,0
ohci_hlean2131sc_device::ohci_hlean2131sc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, OHCI_HLEAN2131SC, tag, owner, clock),
- ohci_function()
+ ohci_function(),
+ device_slot_card_interface(mconfig, *this)
{
region = nullptr;
+ region_tag = nullptr;
+ region_offset = 0;
midi_rs232 = 0;
response_size = 0;
step = 0;
@@ -1114,6 +1154,12 @@ void ohci_hlean2131sc_device::set_region_base(uint8_t *data)
region = data;
}
+void ohci_hlean2131sc_device::set_region(const char *_region_tag, int _region_offset)
+{
+ region_tag = _region_tag;
+ region_offset = _region_offset;
+}
+
void ohci_hlean2131sc_device::initialize(running_machine &machine)
{
ohci_function::initialize(machine);
@@ -1403,6 +1449,9 @@ void ohci_hlean2131sc_device::process_packet()
void ohci_hlean2131sc_device::device_start()
{
+ initialize(machine());
+ if (region_tag)
+ set_region_base(memregion(region_tag)->base() + region_offset);
}
// ======================> ide_baseboard_device
@@ -1716,9 +1765,6 @@ static INPUT_PORTS_START(chihiro)
void chihiro_state::machine_start()
{
- ohci_hlean2131qc_device *usb_device1;
- ohci_hlean2131sc_device *usb_device2;
-
xbox_base_state::machine_start();
chihiro_devs.ide = machine().device<bus_master_ide_controller_device>("ide");
chihiro_devs.dimmboard = machine().device<naomi_gdrom_board>("rom_board");
@@ -1737,14 +1783,6 @@ void chihiro_state::machine_start()
break;
}
hack_counter = 0;
- usb_device1 = machine().device<ohci_hlean2131qc_device>("ohci_hlean2131qc");
- usb_device1->initialize(machine());
- usb_device1->set_region_base(memregion(":others")->base()); // temporary
- machine().device<mcpx_ohci_device>(":pci:02.0")->plug_usb_device(1, usb_device1); // connect
- usb_device2 = machine().device<ohci_hlean2131sc_device>("ohci_hlean2131sc");
- usb_device2->initialize(machine());
- usb_device2->set_region_base(memregion(":others")->base() + 0x2080); // temporary
- machine().device<mcpx_ohci_device>(":pci:02.0")->plug_usb_device(2, usb_device2); // connect
// savestates
save_item(NAME(hack_counter));
}
@@ -1753,6 +1791,20 @@ static SLOT_INTERFACE_START(ide_baseboard)
SLOT_INTERFACE("bb", IDE_BASEBOARD)
SLOT_INTERFACE_END
+SLOT_INTERFACE_START(usb_baseboard)
+ SLOT_INTERFACE("an2131qc", OHCI_HLEAN2131QC)
+ SLOT_INTERFACE("an2131sc", OHCI_HLEAN2131SC)
+ SLOT_INTERFACE("xbox_controller", OHCI_GAME_CONTROLLER)
+SLOT_INTERFACE_END
+
+static MACHINE_CONFIG_FRAGMENT(an2131qc_configuration)
+ MCFG_OHCI_HLEAN2131QC_REGION(":others", 0)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT(an2131sc_configuration)
+ MCFG_OHCI_HLEAN2131SC_REGION(":others", 0x2080)
+MACHINE_CONFIG_END
+
static MACHINE_CONFIG_DERIVED(chihiro_base, xbox_base)
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(chihiro_map)
@@ -1764,9 +1816,13 @@ static MACHINE_CONFIG_DERIVED(chihiro_base, xbox_base)
MCFG_DEVICE_MODIFY(":pci:09.0:ide:1")
MCFG_DEVICE_SLOT_INTERFACE(ide_baseboard, "bb", true)
- // next lines are temporary
- MCFG_DEVICE_ADD("ohci_hlean2131qc", OHCI_HLEAN2131QC, 0)
- MCFG_DEVICE_ADD("ohci_hlean2131sc", OHCI_HLEAN2131SC, 0)
+ MCFG_USB_PORT_ADD(":pci:02.0:port1", usb_baseboard, "an2131qc", true)
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("an2131qc", an2131qc_configuration)
+ MCFG_USB_PORT_ADD(":pci:02.0:port2", usb_baseboard, "an2131sc", true)
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("an2131sc", an2131sc_configuration)
+ MCFG_USB_PORT_ADD(":pci:02.0:port3", usb_baseboard, nullptr, false)
+ MCFG_USB_PORT_ADD(":pci:02.0:port4", usb_baseboard, nullptr, false)
+
MCFG_DEVICE_ADD("jvs_master", JVS_MASTER, 0)
MCFG_SEGA_837_13551_DEVICE_ADD("837_13551", "jvs_master", ":TILT", ":P1", ":P2", ":A0", ":A1", ":A2", ":A3", ":A4", ":A5", ":A6", ":A7", ":OUTPUT")
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/xbox.cpp b/src/mame/drivers/xbox.cpp
index fbbfbe708b5..c0906a553ea 100644
--- a/src/mame/drivers/xbox.cpp
+++ b/src/mame/drivers/xbox.cpp
@@ -130,15 +130,8 @@ void xbox_state::hack_eeprom()
void xbox_state::machine_start()
{
- ohci_game_controller_device *usb_device;
-
xbox_base_state::machine_start();
xbox_devs.ide = machine().device<bus_master_ide_controller_device>("ide");
- usb_device = machine().device<ohci_game_controller_device>("ohci_gamepad");
- if (usb_device != nullptr) {
- usb_device->initialize(machine());
- machine().device<mcpx_ohci_device>(":pci:02.0")->plug_usb_device(3, usb_device); // connect to root hub port 3, chihiro needs to use 1 and 2
- }
// savestates
//save_item(NAME(item));
}
@@ -160,6 +153,10 @@ void xbox_state::machine_reset()
id[88] |= (1 << 2); // ultra dma mode 2 supported
}
+SLOT_INTERFACE_START(usb_xbox)
+ SLOT_INTERFACE("xbox_controller", OHCI_GAME_CONTROLLER)
+SLOT_INTERFACE_END
+
SLOT_INTERFACE_START(xbox_ata_devices)
SLOT_INTERFACE("hdd", IDE_HARDDISK)
SLOT_INTERFACE("cdrom", ATAPI_CDROM)
@@ -175,7 +172,12 @@ static MACHINE_CONFIG_DERIVED(xbox, xbox_base)
MCFG_DEVICE_MODIFY(":pci:09.0:ide:1")
MCFG_DEVICE_SLOT_INTERFACE(xbox_ata_devices, "cdrom", true)
- /* sound hardware */
+ MCFG_USB_PORT_ADD(":pci:02.0:port1", usb_xbox, nullptr, false)
+ MCFG_USB_PORT_ADD(":pci:02.0:port2", usb_xbox, nullptr, false)
+ MCFG_USB_PORT_ADD(":pci:02.0:port3", usb_xbox, "xbox_controller", false)
+ MCFG_USB_PORT_ADD(":pci:02.0:port4", usb_xbox, nullptr, false)
+
+/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
// MCFG_SOUND_ADD("aysnd", AY8910, MAIN_CLOCK/4)
// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
diff --git a/src/mame/includes/xbox_pci.h b/src/mame/includes/xbox_pci.h
index 7c9f34b5d8d..90418ccc854 100644
--- a/src/mame/includes/xbox_pci.h
+++ b/src/mame/includes/xbox_pci.h
@@ -114,7 +114,7 @@ extern const device_type MCPX_SMBUS;
/*
* OHCI USB Controller
*/
-
+class usb_function_device;
class mcpx_ohci_device : public pci_device {
public:
mcpx_ohci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
@@ -129,6 +129,7 @@ public:
protected:
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_config_complete() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
@@ -137,6 +138,11 @@ private:
emu_timer *timer;
std::function<void(void)> hack_callback;
DECLARE_ADDRESS_MAP(ohci_mmio, 32);
+ struct dev_t {
+ ohci_function *dev;
+ int port;
+ } connecteds[4];
+ int connecteds_count;
};
extern const device_type MCPX_OHCI;
diff --git a/src/mame/includes/xbox_usb.h b/src/mame/includes/xbox_usb.h
index bf32b1ad2ab..d70017d756c 100644
--- a/src/mame/includes/xbox_usb.h
+++ b/src/mame/includes/xbox_usb.h
@@ -340,6 +340,10 @@ struct usb_device_configuration
std::forward_list<usb_device_interfac *> interfaces;
};
+/*
+ * OHCI Usb Controller
+ */
+
class ohci_function; // forward declaration
class ohci_usb_controller
@@ -397,6 +401,10 @@ private:
} ohcist;
};
+/*
+ * Base class for usb devices
+ */
+
class ohci_function {
public:
ohci_function();
@@ -455,9 +463,35 @@ protected:
usb_device_configuration *selected_configuration;
};
+/*
+ * Usb port connector
+ */
+
+class ohci_usb_connector : public device_t, public device_slot_interface
+{
+public:
+ ohci_usb_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual ~ohci_usb_connector();
+
+ ohci_function *get_device();
+
+protected:
+ virtual void device_start() override;
+};
+
+extern const device_type OHCI_USB_CONNECTOR;
+
+#define MCFG_USB_PORT_ADD(_tag, _slot_intf, _def_slot, _fixed) \
+ MCFG_DEVICE_ADD(_tag, OHCI_USB_CONNECTOR, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed)
+
+/*
+ * Game controller usb device
+ */
+
DECLARE_DEVICE_TYPE(OHCI_GAME_CONTROLLER, ohci_game_controller_device)
-class ohci_game_controller_device : public device_t, public ohci_function
+class ohci_game_controller_device : public device_t, public ohci_function, public device_slot_card_interface
{
public:
ohci_game_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/mame/machine/xbox_pci.cpp b/src/mame/machine/xbox_pci.cpp
index 33b86730cfc..25462638f47 100644
--- a/src/mame/machine/xbox_pci.cpp
+++ b/src/mame/machine/xbox_pci.cpp
@@ -229,14 +229,15 @@ mcpx_ohci_device::mcpx_ohci_device(const machine_config &mconfig, const char *ta
: pci_device(mconfig, MCPX_OHCI, tag, owner, clock),
ohci_usb(nullptr),
m_interrupt_handler(*this),
- timer(nullptr)
+ timer(nullptr),
+ connecteds_count(0)
{
}
void mcpx_ohci_device::plug_usb_device(int port, ohci_function *function)
{
function->set_bus_manager(ohci_usb);
- ohci_usb->usb_ohci_plug(port, function); // connect to root hub port 3, chihiro needs to use 1 and 2
+ ohci_usb->usb_ohci_plug(port, function);
}
void mcpx_ohci_device::device_start()
@@ -256,6 +257,8 @@ void mcpx_ohci_device::device_start()
timer = timer_alloc(0);
ohci_usb->set_timer(timer);
ohci_usb->start();
+ for (int i=0;i < connecteds_count;i++)
+ plug_usb_device(connecteds[i].port, connecteds[i].dev);
}
void mcpx_ohci_device::device_reset()
@@ -265,6 +268,27 @@ void mcpx_ohci_device::device_reset()
ohci_usb->reset();
}
+void mcpx_ohci_device::device_config_complete()
+{
+ char id[8];
+
+ for (int i = 1; i<=4; i++)
+ {
+ sprintf(id, "port%d", i);
+ ohci_usb_connector *conn = downcast<ohci_usb_connector *>(subdevice(id));
+ if (conn)
+ {
+ ohci_function *func = conn->get_device();
+ if (func)
+ {
+ connecteds[connecteds_count].dev = func;
+ connecteds[connecteds_count].port = i;
+ connecteds_count++;
+ }
+ }
+ }
+}
+
void mcpx_ohci_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
if (ohci_usb)
diff --git a/src/mame/machine/xbox_usb.cpp b/src/mame/machine/xbox_usb.cpp
index e8776dce19b..1211991f2e5 100644
--- a/src/mame/machine/xbox_usb.cpp
+++ b/src/mame/machine/xbox_usb.cpp
@@ -8,7 +8,7 @@
//#define LOG_OHCI
/*
- * Ohci usb controller
+ * OHCI usb controller
*/
#ifdef LOG_OHCI
@@ -721,11 +721,9 @@ void ohci_usb_controller::usb_ohci_interrupts()
{
if (((ohcist.hc_regs[HcInterruptStatus] & ohcist.hc_regs[HcInterruptEnable]) != 0) && ((ohcist.hc_regs[HcInterruptEnable] & MasterInterruptEnable) != 0))
{
- //m_interrupt_handler(1);
irq_callback(1);
} else
{
- //m_interrupt_handler(0);
irq_callback(0);
}
}
@@ -849,8 +847,8 @@ void ohci_usb_controller::usb_ohci_device_address_changed(int old_address, int n
}
/*
-* ohci device base class
-*/
+ * Base class for usb devices
+ */
ohci_function::ohci_function()
{
@@ -1322,6 +1320,35 @@ int ohci_function::execute_transfer(int endpoint, int pid, uint8_t *buffer, int
return size;
}
+/*
+ * Usb port connector
+ */
+
+DEFINE_DEVICE_TYPE(OHCI_USB_CONNECTOR, ohci_usb_connector, "usb_connector", "Usb Connector Abstraction");
+
+ohci_usb_connector::ohci_usb_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, OHCI_USB_CONNECTOR, tag, owner, clock),
+ device_slot_interface(mconfig, *this)
+{
+}
+
+ohci_usb_connector::~ohci_usb_connector()
+{
+}
+
+void ohci_usb_connector::device_start()
+{
+}
+
+ohci_function* ohci_usb_connector::get_device()
+{
+ return dynamic_cast<ohci_function *>(get_card_device());
+}
+
+/*
+ * Game controller usb device
+ */
+
INPUT_PORTS_START(xbox_controller)
PORT_START("ThumbstickLh") // left analog thumbstick horizontal movement
PORT_BIT(0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("ThumbstickLh") PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_MINMAX(0, 0xff)
@@ -1391,6 +1418,7 @@ DEFINE_DEVICE_TYPE(OHCI_GAME_CONTROLLER, ohci_game_controller_device, "ohci_gc",
ohci_game_controller_device::ohci_game_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, OHCI_GAME_CONTROLLER, tag, owner, clock),
ohci_function(),
+ device_slot_card_interface(mconfig, *this),
m_ThumbstickLh(*this, "ThumbstickLh"),
m_ThumbstickLv(*this, "ThumbstickLv"),
m_ThumbstickRh(*this, "ThumbstickRh"),