Optimize port_6x
Try to avoid branching as this is a hot path in some machines About 250% speedup
This commit is contained in:
@@ -71,20 +71,23 @@ port_6x_write(uint16_t port, uint8_t val, void *priv)
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
port_61_read_simple(uint16_t port, void *priv)
|
||||
{
|
||||
uint8_t ret = ppi.pb & 0x1f;
|
||||
|
||||
if (ppispeakon)
|
||||
ret |= 0x20;
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
port_6x_read(uint16_t port, void *priv)
|
||||
port_61_read(uint16_t port, void *priv)
|
||||
{
|
||||
port_6x_t *dev = (port_6x_t *) priv;
|
||||
uint8_t ret = 0xff;
|
||||
|
||||
port &= 3;
|
||||
|
||||
if ((port == 3) && (dev->flags & PORT_6X_MIRROR))
|
||||
port = 1;
|
||||
|
||||
switch (port) {
|
||||
case 1:
|
||||
if (dev->flags & PORT_6X_EXT_REF) {
|
||||
ret = ppi.pb & 0x0f;
|
||||
|
||||
@@ -98,9 +101,15 @@ port_6x_read(uint16_t port, void *priv)
|
||||
|
||||
if (dev->flags & PORT_6X_TURBO)
|
||||
ret = (ret & 0xfb) | (xi8088_turbo_get() ? 0x04 : 0x00);
|
||||
break;
|
||||
case 2:
|
||||
if (dev->flags & PORT_6X_SWA) {
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
port_62_read(uint16_t port, void *priv)
|
||||
{
|
||||
uint8_t ret = 0xff;
|
||||
|
||||
/* SWA on Olivetti M240 mainboard (off=1) */
|
||||
ret = 0x00;
|
||||
if (ppi.pb & 0x8) {
|
||||
@@ -128,14 +137,10 @@ port_6x_read(uint16_t port, void *priv)
|
||||
if (hasfpu)
|
||||
ret |= 0x02;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
port_6x_refresh(void *priv)
|
||||
{
|
||||
@@ -165,7 +170,16 @@ port_6x_init(const device_t *info)
|
||||
|
||||
dev->flags = info->local & 0xff;
|
||||
|
||||
io_sethandler(0x0061, 3, port_6x_read, NULL, NULL, port_6x_write, NULL, NULL, dev);
|
||||
if (!(dev->flags & PORT_6X_TURBO) || (dev->flags & PORT_6X_EXT_REF))
|
||||
io_sethandler(0x0061, 1, port_61_read_simple, NULL, NULL, port_6x_write, NULL, NULL, dev);
|
||||
else
|
||||
io_sethandler(0x0061, 1, port_61_read, NULL, NULL, port_6x_write, NULL, NULL, dev);
|
||||
|
||||
if (dev->flags & PORT_6X_SWA)
|
||||
io_sethandler(0x0062, 1, port_62_read, NULL, NULL, NULL, NULL, NULL, dev);
|
||||
|
||||
if (dev->flags & PORT_6X_MIRROR)
|
||||
io_sethandler(0x0063, 1, port_61_read, NULL, NULL, port_6x_write, NULL, NULL, dev);
|
||||
|
||||
if (dev->flags & PORT_6X_EXT_REF)
|
||||
timer_add(&dev->refresh_timer, port_6x_refresh, dev, 1);
|
||||
|
Reference in New Issue
Block a user