Add game port device with 6 I/O ports for the Crystal CS4237/8B
This commit is contained in:
@@ -45,6 +45,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct _gameport_ {
|
typedef struct _gameport_ {
|
||||||
uint16_t addr;
|
uint16_t addr;
|
||||||
|
uint8_t len;
|
||||||
struct _joystick_instance_ *joystick;
|
struct _joystick_instance_ *joystick;
|
||||||
struct _gameport_ *next;
|
struct _gameport_ *next;
|
||||||
} gameport_t;
|
} gameport_t;
|
||||||
@@ -314,7 +315,7 @@ gameport_remap(void *priv, uint16_t address)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
io_removehandler(dev->addr, (dev->addr & 1) ? 1 : 8,
|
io_removehandler(dev->addr, dev->len,
|
||||||
gameport_read, NULL, NULL, gameport_write, NULL, NULL, dev);
|
gameport_read, NULL, NULL, gameport_write, NULL, NULL, dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,7 +335,7 @@ gameport_remap(void *priv, uint16_t address)
|
|||||||
other_dev->next = dev;
|
other_dev->next = dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
io_sethandler(dev->addr, (dev->addr & 1) ? 1 : 8,
|
io_sethandler(dev->addr, dev->len,
|
||||||
gameport_read, NULL, NULL, gameport_write, NULL, NULL, dev);
|
gameport_read, NULL, NULL, gameport_write, NULL, NULL, dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -358,7 +359,7 @@ gameport_add(const device_t *gameport_type)
|
|||||||
{
|
{
|
||||||
/* Prevent a standalone game port from being added later on, unless this
|
/* Prevent a standalone game port from being added later on, unless this
|
||||||
is an unused Super I/O game port (no MACHINE_GAMEPORT machine flag). */
|
is an unused Super I/O game port (no MACHINE_GAMEPORT machine flag). */
|
||||||
if (!(gameport_type->local & 0x10000) || (machines[machine].flags & MACHINE_GAMEPORT))
|
if (!(gameport_type->local & 0x1000000) || (machines[machine].flags & MACHINE_GAMEPORT))
|
||||||
standalone_gameport_type = NULL;
|
standalone_gameport_type = NULL;
|
||||||
|
|
||||||
/* Add game port device. */
|
/* Add game port device. */
|
||||||
@@ -401,6 +402,7 @@ gameport_init(const device_t *info)
|
|||||||
dev->joystick = joystick_instance;
|
dev->joystick = joystick_instance;
|
||||||
|
|
||||||
/* Map game port to the default address. Not applicable on PnP-only ports. */
|
/* Map game port to the default address. Not applicable on PnP-only ports. */
|
||||||
|
dev->len = (info->local >> 16) & 0xff;
|
||||||
gameport_remap(dev, info->local & 0xffff);
|
gameport_remap(dev, info->local & 0xffff);
|
||||||
|
|
||||||
/* Register ISAPnP if this is a standard game port card. */
|
/* Register ISAPnP if this is a standard game port card. */
|
||||||
@@ -433,7 +435,7 @@ gameport_close(void *priv)
|
|||||||
|
|
||||||
const device_t gameport_device = {
|
const device_t gameport_device = {
|
||||||
"Game port",
|
"Game port",
|
||||||
0, 0x200,
|
0, 0x080200,
|
||||||
gameport_init,
|
gameport_init,
|
||||||
gameport_close,
|
gameport_close,
|
||||||
NULL, { NULL }, NULL,
|
NULL, { NULL }, NULL,
|
||||||
@@ -442,7 +444,7 @@ const device_t gameport_device = {
|
|||||||
|
|
||||||
const device_t gameport_201_device = {
|
const device_t gameport_201_device = {
|
||||||
"Game port (port 201h only)",
|
"Game port (port 201h only)",
|
||||||
0, 0x201,
|
0, 0x010201,
|
||||||
gameport_init,
|
gameport_init,
|
||||||
gameport_close,
|
gameport_close,
|
||||||
NULL, { NULL }, NULL,
|
NULL, { NULL }, NULL,
|
||||||
@@ -451,7 +453,16 @@ const device_t gameport_201_device = {
|
|||||||
|
|
||||||
const device_t gameport_pnp_device = {
|
const device_t gameport_pnp_device = {
|
||||||
"Game port (Plug and Play only)",
|
"Game port (Plug and Play only)",
|
||||||
0, 0,
|
0, 0x080000,
|
||||||
|
gameport_init,
|
||||||
|
gameport_close,
|
||||||
|
NULL, { NULL }, NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const device_t gameport_pnp_6io_device = {
|
||||||
|
"Game port (Plug and Play only, 6 I/O ports)",
|
||||||
|
0, 0x060000,
|
||||||
gameport_init,
|
gameport_init,
|
||||||
gameport_close,
|
gameport_close,
|
||||||
NULL, { NULL }, NULL,
|
NULL, { NULL }, NULL,
|
||||||
@@ -460,7 +471,7 @@ const device_t gameport_pnp_device = {
|
|||||||
|
|
||||||
const device_t gameport_sio_device = {
|
const device_t gameport_sio_device = {
|
||||||
"Game port (Super I/O)",
|
"Game port (Super I/O)",
|
||||||
0, 0x10000,
|
0, 0x1080000,
|
||||||
gameport_init,
|
gameport_init,
|
||||||
gameport_close,
|
gameport_close,
|
||||||
NULL, { NULL }, NULL,
|
NULL, { NULL }, NULL,
|
||||||
|
@@ -108,6 +108,7 @@ extern "C" {
|
|||||||
extern const device_t gameport_device;
|
extern const device_t gameport_device;
|
||||||
extern const device_t gameport_201_device;
|
extern const device_t gameport_201_device;
|
||||||
extern const device_t gameport_pnp_device;
|
extern const device_t gameport_pnp_device;
|
||||||
|
extern const device_t gameport_pnp_6io_device;
|
||||||
extern const device_t gameport_sio_device;
|
extern const device_t gameport_sio_device;
|
||||||
|
|
||||||
extern const device_t *standalone_gameport_type;
|
extern const device_t *standalone_gameport_type;
|
||||||
|
@@ -720,6 +720,10 @@ cs423x_init(const device_t *info)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize game port. The '7B and '8B game port only responds to 6 I/O ports; the remaining
|
||||||
|
2 ports are reserved on those chips, and probably connected to the Digital Assist feature. */
|
||||||
|
dev->gameport = gameport_add((dev->type == CRYSTAL_CS4236B) ? &gameport_pnp_device : &gameport_pnp_6io_device);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -731,9 +735,6 @@ cs423x_init(const device_t *info)
|
|||||||
cs423x_reset(dev);
|
cs423x_reset(dev);
|
||||||
sound_add_handler(cs423x_get_buffer, dev);
|
sound_add_handler(cs423x_get_buffer, dev);
|
||||||
|
|
||||||
/* Initialize game port. */
|
|
||||||
dev->gameport = gameport_add(&gameport_pnp_device);
|
|
||||||
|
|
||||||
/* Initialize I2C bus for the EEPROM. */
|
/* Initialize I2C bus for the EEPROM. */
|
||||||
dev->i2c = i2c_gpio_init("nvr_cs423x");
|
dev->i2c = i2c_gpio_init("nvr_cs423x");
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user