vegas: Add denver uarts, gearshift, and update input dips for various games. (nw)

vrc5074: Clean up timer code. (nw)
smc91c9x: Adjust tx interrupt status to mirror tx buffer empty.  Fixes linking boot hang on cartfury. (nw)
midzeus: Map proper * key to keypad. (nw)
This commit is contained in:
Ted Green 2017-08-30 17:56:52 -06:00
parent 32070d327c
commit cfe71cfe3a
5 changed files with 224 additions and 92 deletions

View File

@ -387,7 +387,8 @@ void smc91c9x_device::process_command(uint16_t data)
logerror(" RESET TX FIFOS\n");
break;
}
m_reg[EREG_MMU_COMMAND] &= ~0x0001;
// Set Busy (clear on next read)
m_reg[EREG_MMU_COMMAND] |= 0x0001;
}
@ -412,6 +413,11 @@ READ16_MEMBER( smc91c9x_device::read )
switch (offset)
{
case EREG_MMU_COMMAND:
// Clear busy
m_reg[EREG_MMU_COMMAND] &= ~0x0001;
break;
case EREG_PNR_ARR:
if (ACCESSING_BITS_8_15)
{
@ -556,6 +562,9 @@ WRITE16_MEMBER( smc91c9x_device::write )
case EREG_INTERRUPT:
m_reg[EREG_INTERRUPT] &= ~(data & 0x56);
// Need to clear tx int here for vegas cartfury
if (m_reg[EREG_FIFO_PORTS] & 0x0080)
m_reg[EREG_INTERRUPT] &= ~EINT_TX;
update_ethernet_irq();
break;
}

View File

@ -241,6 +241,7 @@ void vrc5074_device::device_start()
save_item(NAME(m_nile_irq_state));
save_item(NAME(m_sdram_addr));
save_item(NAME(m_uart_irq));
save_item(NAME(m_timer_period));
machine().save().register_postload(save_prepost_delegate(FUNC(vrc5074_device::postload), this));
}
@ -745,16 +746,7 @@ TIMER_CALLBACK_MEMBER(vrc5074_device::nile_timer_callback)
/* adjust the timer to fire again */
{
uint32_t scale = regs[0];
if (regs[1] & 2) {
uint32_t scaleSrc = (regs[1] >> 2) & 0x3;
uint32_t *scaleReg = &m_cpu_regs[NREG_T0CTRL + scaleSrc * 4];
scale *= scaleReg[0];
//logerror("Unexpected value: timer %d is prescaled\n", which);
logerror("Timer Scaling value: timer %d is prescaled from %08X to %08X\n", which, regs[0], scale);
}
if (scale != 0)
m_timer[which]->adjust(TIMER_PERIOD * scale, which);
m_timer[which]->adjust(attotime::from_double(m_timer_period[which]), which);
}
/* trigger the interrupt */
@ -837,15 +829,8 @@ READ32_MEMBER(vrc5074_device::cpu_reg_r)
which = (offset - NREG_T0CNTR) / 4;
if (m_cpu_regs[offset - 1] & 1)
{
//if (m_cpu_regs[offset - 1] & 2)
// logerror("Unexpected value: timer %d is prescaled\n", which);
uint32_t scale = 1;
if (m_cpu_regs[offset - 1] & 2) {
uint32_t scaleSrc = (m_cpu_regs[offset - 1] >> 2) & 0x3;
scale = m_cpu_regs[NREG_T0CTRL + scaleSrc * 4];
logerror("Timer value: timer %d is prescaled by \n", which, scale);
}
result = m_cpu_regs[offset + 1] = m_timer[which]->remaining().as_double() * (double)SYSTEM_CLOCK / scale;
// Should check for cascaded timer
result = m_cpu_regs[offset] = m_timer[which]->remaining().as_double() * SYSTEM_CLOCK;
}
if (LOG_TIMERS) logerror("%08X:NILE READ: timer %d counter(%03X) = %08X\n", m_cpu_space->device().safe_pc(), which, offset * 4, result);
@ -961,37 +946,26 @@ WRITE32_MEMBER(vrc5074_device::cpu_reg_w)
case NREG_T2CTRL + 1: /* general purpose timer control (control bits) */
case NREG_T3CTRL + 1: /* watchdog timer control (control bits) */
which = (offset - NREG_T0CTRL) / 4;
if (LOG_NILE) logerror("%08X:NILE WRITE: timer %d control(%03X) = %08X & %08X\n", m_cpu_space->device().safe_pc(), which, offset * 4, data, mem_mask);
if (LOG_NILE | LOG_TIMERS) logerror("%08X:NILE WRITE: timer %d control(%03X) = %08X & %08X\n", m_cpu_space->device().safe_pc(), which, offset * 4, data, mem_mask);
logit = 0;
m_timer_period[which] = (uint64_t(m_cpu_regs[NREG_T0CTRL + which * 4]) + 1) * attotime::from_hz(SYSTEM_CLOCK).as_double();
if (m_cpu_regs[offset] & 2) {
// Cascade timer
uint32_t scaleSrc = (m_cpu_regs[offset] >> 2) & 0x3;
m_timer_period[which] += (uint64_t(m_cpu_regs[NREG_T0CTRL + scaleSrc * 4]) + 1) * attotime::from_hz(SYSTEM_CLOCK).as_double();
logerror("Timer scale: timer %d is scaled by %08X\n", which, m_cpu_regs[NREG_T0CTRL + which * 4]);
}
/* timer just enabled? */
if (!(olddata & 1) && (m_cpu_regs[offset] & 1))
{
uint32_t scale = m_cpu_regs[offset - 1];
//if (m_cpu_regs[offset] & 2)
// logerror("Unexpected value: timer %d is prescaled\n", which);
if (m_cpu_regs[offset] & 2) {
uint32_t scaleSrc = (m_cpu_regs[offset] >> 2) & 0x3;
scale *= m_cpu_regs[NREG_T0CTRL + scaleSrc * 4];
logerror("Timer scale: timer %d is scaled by %08X\n", which, m_cpu_regs[NREG_T0CTRL + which * 4]);
}
if (scale != 0)
m_timer[which]->adjust(TIMER_PERIOD * scale, which);
if (LOG_TIMERS) logerror("Starting timer %d at a rate of %f Hz scale = %08X\n", which, ATTOSECONDS_TO_HZ((TIMER_PERIOD * (m_cpu_regs[offset + 1] + 1)).attoseconds()), scale);
m_timer[which]->adjust(attotime::from_double(m_timer_period[which]), which);
if (LOG_TIMERS) logerror("Starting timer %d at a rate of %f Hz\n", which, ATTOSECONDS_TO_HZ(attotime::from_double(m_timer_period[which]).as_attoseconds()));
}
/* timer disabled? */
else if ((olddata & 1) && !(m_cpu_regs[offset] & 1))
{
//if (m_cpu_regs[offset] & 2)
// logerror("Unexpected value: timer %d is prescaled\n", which);
uint32_t scale = 1;
if (m_cpu_regs[offset] & 2) {
uint32_t scaleSrc = (m_cpu_regs[offset] >> 2) & 0x3;
scale = m_cpu_regs[NREG_T0CTRL + scaleSrc * 4];
logerror("Timer scale: timer %d is scaled by %08X\n", which, scale);
}
m_cpu_regs[offset + 1] = m_timer[which]->remaining().as_double() * SYSTEM_CLOCK / scale;
m_cpu_regs[offset + 1] = m_timer[which]->remaining().as_double() * SYSTEM_CLOCK;
m_timer[which]->adjust(attotime::never, which);
}
break;
@ -1006,15 +980,7 @@ WRITE32_MEMBER(vrc5074_device::cpu_reg_w)
if (m_cpu_regs[offset - 1] & 1)
{
//if (m_cpu_regs[offset - 1] & 2)
// logerror("Unexpected value: timer %d is prescaled\n", which);
uint32_t scale = 1;
if (m_cpu_regs[offset - 1] & 2) {
uint32_t scaleSrc = (m_cpu_regs[offset - 1] >> 2) & 0x3;
scale = m_cpu_regs[NREG_T0CTRL + scaleSrc * 4];
logerror("Timer scale: timer %d is scaled by %08X\n", which, scale);
}
m_timer[which]->adjust(TIMER_PERIOD * m_cpu_regs[offset] * scale, which);
m_timer[which]->adjust(attotime::from_hz(SYSTEM_CLOCK) * m_cpu_regs[offset], which);
}
break;
}

View File

@ -24,8 +24,6 @@
class vrc5074_device : public pci_host_device {
public:
static constexpr unsigned SYSTEM_CLOCK = 100000000;
vrc5074_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
required_device<ns16550_device> m_uart;
@ -79,6 +77,9 @@ protected:
virtual void device_reset() override;
private:
// This value is not verified to be correct
static constexpr unsigned SYSTEM_CLOCK = 100000000;
enum
{
AS_PCI_MEM = 1,
@ -99,6 +100,7 @@ private:
emu_timer* m_dma_timer;
TIMER_CALLBACK_MEMBER(dma_transfer);
emu_timer *m_timer[4];
double m_timer_period[4];
TIMER_CALLBACK_MEMBER(nile_timer_callback);
required_memory_region m_romRegion;

View File

@ -1229,7 +1229,7 @@ static INPUT_PORTS_START( thegrid )
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) /* keypad 1 */
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) /* keypad 4 */
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) /* keypad 7 */
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_NAME("Keypad *") PORT_CODE(KEYCODE_MINUS_PAD) /* keypad * */
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_NAME("Keypad *") PORT_CODE(KEYCODE_ASTERISK) /* keypad * */
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) /* keypad 2 */
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) /* keypad 5 */
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) /* keypad 8 */

View File

@ -289,6 +289,9 @@
#include "machine/pci-ide.h"
#include "video/voodoo_pci.h"
#include "screen.h"
#include "machine/ins8250.h"
#include "bus/rs232/rs232.h"
#include "machine/terminal.h"
#include "sf2049.lh"
@ -308,7 +311,7 @@
*************************************/
#define PCI_ID_NILE ":pci:00.0"
#define PCI_ID_VIDEO ":pci:04.0"
#define PCI_ID_VIDEO ":pci:03.0"
#define PCI_ID_IDE ":pci:05.0"
class vegas_state : public driver_device
@ -322,9 +325,13 @@ public:
m_ethernet(*this, "ethernet"),
m_dcs(*this, "dcs"),
m_ioasic(*this, "ioasic"),
m_uart0(*this, "uart0"),
m_uart1(*this, "uart1"),
m_uart2(*this, "uart2"),
m_io_analog(*this, "AN.%u", 0),
m_a2d_shift(0)
{ }
static constexpr unsigned SYSTEM_CLOCK = 100000000;
required_device<mips3_device> m_maincpu;
required_device<vrc5074_device> m_nile;
@ -332,6 +339,9 @@ public:
required_device<smc91c94_device> m_ethernet;
required_device<dcs_audio_device> m_dcs;
required_device<midway_ioasic_device> m_ioasic;
optional_device<generic_terminal_device> m_uart0;
optional_device<ns16550_device> m_uart1;
optional_device<ns16550_device> m_uart2;
optional_ioport_array<8> m_io_analog;
int m_a2d_shift;
uint8_t m_vblank_state;
@ -346,7 +356,10 @@ public:
uint8_t m_dcs_idma_cs;
uint32_t m_i40_data;
uint32_t m_keypad_select;
uint32_t m_gear;
DECLARE_WRITE_LINE_MEMBER(uart1_irq_cb);
DECLARE_WRITE_LINE_MEMBER(uart2_irq_cb);
DECLARE_WRITE_LINE_MEMBER(vblank_assert);
DECLARE_DRIVER_INIT(gauntleg);
DECLARE_DRIVER_INIT(cartfury);
@ -388,9 +401,12 @@ public:
DECLARE_WRITE_LINE_MEMBER(ethernet_interrupt);
DECLARE_WRITE_LINE_MEMBER(ioasic_irq);
DECLARE_READ32_MEMBER(unknown_r);
DECLARE_READ8_MEMBER(parallel_r);
DECLARE_WRITE8_MEMBER(parallel_w);
DECLARE_WRITE32_MEMBER(i40_w);
DECLARE_CUSTOM_INPUT_MEMBER(i40_r);
DECLARE_CUSTOM_INPUT_MEMBER(keypad_r);
DECLARE_CUSTOM_INPUT_MEMBER(gearshift_r);
DECLARE_WRITE32_MEMBER(wheel_board_w);
std::string sioIRQString(uint8_t data);
@ -437,6 +453,7 @@ void vegas_state::machine_start()
save_item(NAME(m_cmos_unlocked));
save_item(NAME(m_i40_data));
save_item(NAME(m_keypad_select));
save_item(NAME(m_gear));
}
@ -455,6 +472,7 @@ void vegas_state::machine_reset()
reset_sio();
m_i40_data = 0;
m_keypad_select = 0;
m_gear = 1;
}
/*************************************
@ -463,13 +481,13 @@ void vegas_state::machine_reset()
#define WD_IRQ 0x1
WRITE_LINE_MEMBER(vegas_state::watchdog_irq)
{
logerror("%s: vegas_state::watchdog_irq state = %i\n", machine().describe_context(), state);
if (state && !(m_sio_irq_state & WD_IRQ)) {
logerror("%s: vegas_state::watchdog_irq state = %i\n", machine().describe_context(), state);
m_sio_irq_state |= WD_IRQ;
update_sio_irqs();
}
else if (!state && (m_sio_irq_state & WD_IRQ)) {
//logerror("%s: vegas_state::watchdog_irq state = %i\n", machine().describe_context(), state);
logerror("%s: vegas_state::watchdog_irq state = %i\n", machine().describe_context(), state);
m_sio_irq_state &= ~WD_IRQ;
update_sio_irqs();
}
@ -481,7 +499,7 @@ WRITE_LINE_MEMBER(vegas_state::watchdog_irq)
WRITE_LINE_MEMBER(vegas_state::watchdog_reset)
{
if (state) {
//printf("vegas_state::watchdog_reset!!!\n");
printf("vegas_state::watchdog_reset!!!\n");
logerror("vegas_state::watchdog_reset!!!\n");
machine().schedule_soft_reset();
}
@ -563,6 +581,23 @@ void vegas_state::update_sio_irqs()
}
}
WRITE_LINE_MEMBER(vegas_state::uart1_irq_cb)
{
if (state)
m_sio_irq_state |= (1 << 4);
else
m_sio_irq_state &= ~(1 << 4);
update_sio_irqs();
}
WRITE_LINE_MEMBER(vegas_state::uart2_irq_cb)
{
if (state)
m_sio_irq_state |= (1 << 4);
else
m_sio_irq_state &= ~(1 << 4);
update_sio_irqs();
}
WRITE_LINE_MEMBER(vegas_state::vblank_assert)
{
@ -881,7 +916,7 @@ READ32_MEMBER( vegas_state::ethernet_r )
result |= m_ethernet->read(space, offset * 2 + 0, mem_mask);
if (ACCESSING_BITS_16_31)
result |= m_ethernet->read(space, offset * 2 + 1, mem_mask >> 16) << 16;
logerror("ethernet_r: offset %08x = %08x & %08x\n", offset, result, mem_mask);
//logerror("ethernet_r: offset %08x = %08x & %08x\n", offset, result, mem_mask);
return result;
}
@ -892,7 +927,7 @@ WRITE32_MEMBER( vegas_state::ethernet_w )
m_ethernet->write(space, offset * 2 + 0, data, mem_mask);
if (ACCESSING_BITS_16_31)
m_ethernet->write(space, offset * 2 + 1, data >> 16, mem_mask >> 16);
logerror("ethernet_w: offset %08x = %08x & %08x\n", offset, data, mem_mask);
//logerror("ethernet_w: offset %08x = %08x & %08x\n", offset, data, mem_mask);
}
@ -909,6 +944,21 @@ READ32_MEMBER(vegas_state::unknown_r)
return result;
}
/*************************************
* Parallel Port
*************************************/
READ8_MEMBER(vegas_state::parallel_r)
{
uint8_t result = 0x3;
logerror("%06X: parallel_r %08x = %02x\n", machine().device("maincpu")->safe_pc(), offset, result);
return result;
}
WRITE8_MEMBER(vegas_state::parallel_w)
{
logerror("%06X: parallel_w %08x = %02x\n", machine().device("maincpu")->safe_pc(), offset, data);
}
/*************************************
* Optical 49 Way Joystick I40 Board
*************************************/
@ -1016,6 +1066,23 @@ CUSTOM_INPUT_MEMBER(vegas_state::keypad_r)
return 0x7;
}
/*************************************
*
* Gearshift
*
*************************************/
DECLARE_CUSTOM_INPUT_MEMBER(vegas_state::gearshift_r)
{
// Check for gear change and save gear selection
uint32_t gear = ioport("GEAR")->read();
for (int i = 0; i < 4; i++)
{
if (gear & (1 << i))
m_gear = 1 << i;
}
return m_gear;
}
/*************************************
*
* Input ports
@ -1316,7 +1383,9 @@ static INPUT_PORTS_START( nbashowt )
PORT_DIPSETTING( 0x0020, DEF_STR( French ) )
PORT_DIPSETTING( 0x0010, DEF_STR( German ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
PORT_DIPUNUSED( 0x0040, 0x0000 )
PORT_DIPNAME( 0x0040, 0x0040, "Select Game" )
PORT_DIPSETTING( 0x0040, DEF_STR(Yes))
PORT_DIPSETTING( 0x0000, DEF_STR(No))
PORT_DIPNAME( 0x0080, 0x0080, "Game Powerup" )
PORT_DIPSETTING( 0x0080, "NBA Showtime" )
PORT_DIPSETTING( 0x0000, "NFL Blitz" )
@ -1400,7 +1469,7 @@ static INPUT_PORTS_START( sf2049 )
PORT_DIPNAME( 0x0080, 0x0080, "PM Dump" )
PORT_DIPSETTING( 0x0080, "Watchdog resets only" )
PORT_DIPSETTING( 0x0000, "All resets" )
PORT_DIPNAME( 0x0300, 0x0200, "Resolution" )
PORT_DIPNAME( 0x0300, 0x0000, "Resolution" )
PORT_DIPSETTING( 0x0300, "Standard Res 512x256" )
PORT_DIPSETTING( 0x0200, "Medium Res 512x384" )
PORT_DIPSETTING( 0x0000, "VGA Res 640x480" )
@ -1415,10 +1484,13 @@ static INPUT_PORTS_START( sf2049 )
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON11 ) PORT_NAME("View 3") PORT_PLAYER(1) /* view 3 */
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON12 ) PORT_NAME("Music") PORT_PLAYER(1) /* music */
PORT_BIT( 0x0070, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, vegas_state, keypad_r, "KEYPAD" )
PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("1st Gear") PORT_PLAYER(1) /* 1st gear */
PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("2nd Gear") PORT_PLAYER(1) /* 2nd gear */
PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("3rd Gear") PORT_PLAYER(1) /* 3rd gear */
PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("4th Gear") PORT_PLAYER(1) /* 4th gear */
PORT_BIT( 0x0f00, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, vegas_state, gearshift_r, "GEAR" )
PORT_START("GEAR")
PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("1st Gear") PORT_PLAYER(1) /* 1st gear */
PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("2nd Gear") PORT_PLAYER(1) /* 2nd gear */
PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("3rd Gear") PORT_PLAYER(1) /* 3rd gear */
PORT_BIT( 0x8, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("4th Gear") PORT_PLAYER(1) /* 4th gear */
PORT_START("KEYPAD")
PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD) /* keypad 1 */
@ -1435,23 +1507,26 @@ static INPUT_PORTS_START( sf2049 )
PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad #") PORT_CODE(KEYCODE_PLUS_PAD) /* keypad + */
PORT_MODIFY("AN.2") /* Accel */
PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(100)
PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(20) PORT_PLAYER(1)
PORT_MODIFY("AN.3") /* Clutch */
PORT_BIT( 0xff, 0x00, IPT_PEDAL3 ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(20)
PORT_BIT( 0xff, 0x00, IPT_PEDAL3 ) PORT_SENSITIVITY(25) PORT_KEYDELTA(100) PORT_PLAYER(1)
PORT_MODIFY("AN.6") /* Brake */
PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(20)
PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_SENSITIVITY(25) PORT_KEYDELTA(100) PORT_PLAYER(1)
PORT_MODIFY("AN.7") /* Steer */
PORT_BIT(0xff, 0x80, IPT_PADDLE) PORT_MINMAX(0x10, 0xf0) PORT_SENSITIVITY(25) PORT_KEYDELTA(5)
PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x10, 0xf0) PORT_SENSITIVITY(25) PORT_KEYDELTA(5)
INPUT_PORTS_END
static INPUT_PORTS_START( sf2049se )
PORT_INCLUDE(sf2049)
PORT_MODIFY("DIPS")
PORT_DIPUNUSED( 0x003e, 0x003e )
PORT_DIPUNUSED( 0x001e, 0x001e )
PORT_DIPNAME(0x0020, 0x0020, "Boot Message")
PORT_DIPSETTING( 0x0020, "Quiet")
PORT_DIPSETTING( 0x0000, "Squawk During Boot")
PORT_DIPNAME( 0x00c0, 0x00c0, "Test Mode" )
PORT_DIPSETTING( 0x00c0, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0080, "Disk-based Test" )
@ -1463,8 +1538,8 @@ static INPUT_PORTS_START( sf2049se )
PORT_DIPUNUSED( 0x1f00, 0x1f00 )
PORT_DIPNAME( 0xc000, 0x8000, "Resolution" )
PORT_DIPSETTING( 0xc000, "Standard Res 512x256" )
PORT_DIPSETTING( 0x8000, "Medium Res 512x384" )
PORT_DIPSETTING( 0x0000, "VGA Res 640x480" )
PORT_DIPSETTING( 0x4000, "Medium Res 512x384" )
PORT_DIPSETTING( 0x8000, "VGA Res 640x480" )
PORT_DIPNAME( 0x2000, 0x2000, "Cabinet Type" )
PORT_DIPSETTING( 0x2000, "Sit down cabinet" )
PORT_DIPSETTING( 0x0000, "Upright cabinet" )
@ -1474,15 +1549,51 @@ static INPUT_PORTS_START( cartfury )
PORT_INCLUDE(vegas_common)
PORT_MODIFY("DIPS")
PORT_DIPNAME( 0x0001, 0x0000, "Coinage Source" )
PORT_DIPSETTING( 0x0001, "Dipswitch" )
PORT_DIPSETTING( 0x0000, "CMOS" )
PORT_DIPNAME( 0x000e, 0x000e, DEF_STR( Coinage ) )
PORT_DIPSETTING( 0x000e, "Mode 1" )
PORT_DIPSETTING( 0x000c, "Mode 2" )
PORT_DIPSETTING( 0x000a, "Mode 3" )
PORT_DIPSETTING( 0x0008, "Mode 4" )
PORT_DIPSETTING( 0x0006, "Mode 5")
PORT_DIPSETTING( 0x0004, "Mode 6")
PORT_DIPSETTING( 0x0002, "Mode 7")
PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
PORT_DIPNAME( 0x0030, 0x0030, "Curency Type" )
PORT_DIPSETTING( 0x0030, DEF_STR( USA ) )
PORT_DIPSETTING( 0x0020, DEF_STR( French ) )
PORT_DIPSETTING( 0x0010, DEF_STR( German ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
PORT_DIPNAME( 0x2000, 0x2000, "Disable Brake" )
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x8000, 0x8000, "Test Switch" )
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_MODIFY("IN1")
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_NAME("View 1") PORT_PLAYER(1) /* view 1 */
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME("View 2") PORT_PLAYER(1) /* view 2 */
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON11 ) PORT_NAME("View 3") PORT_PLAYER(1) /* view 3 */
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON12 ) PORT_NAME("Music") PORT_PLAYER(1) /* music */
PORT_BIT( 0x0f00, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, vegas_state, gearshift_r, "GEAR" )
PORT_START("GEAR")
PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("1st Gear") PORT_PLAYER(1) /* 1st gear */
PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("2nd Gear") PORT_PLAYER(1) /* 2nd gear */
PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("3rd Gear") PORT_PLAYER(1) /* 3rd gear */
PORT_BIT( 0x8, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("4th Gear") PORT_PLAYER(1) /* 4th gear */
PORT_MODIFY("AN.0") /* Steer */
PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x10, 0xf0) PORT_SENSITIVITY(25) PORT_KEYDELTA(5)
PORT_MODIFY("AN.1") /* Accel */
PORT_BIT( 0xff, 0x80, IPT_PEDAL ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(20)
PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(20) PORT_PLAYER(1)
PORT_MODIFY("AN.2") /* Brake */
PORT_BIT( 0xff, 0x80, IPT_PEDAL2 ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(100)
PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_SENSITIVITY(25) PORT_KEYDELTA(100) PORT_PLAYER(1)
INPUT_PORTS_END
@ -1524,6 +1635,12 @@ static ADDRESS_MAP_START(vegas_cs7_map, AS_PROGRAM, 32, vegas_state)
AM_RANGE(0x00007000, 0x00007003) AM_DEVREADWRITE("dcs", dcs_audio_device, dsio_idma_data_r, dsio_idma_data_w) // if (m_dcs_idma_cs == 7)
ADDRESS_MAP_END
static ADDRESS_MAP_START(vegas_cs8_map, AS_PROGRAM, 32, vegas_state)
AM_RANGE(0x01000000, 0x0100001f) AM_DEVREADWRITE8("uart2", ns16550_device, ins8250_r, ins8250_w, 0xff) // Serial UART2 (TL16C552 CS0)
AM_RANGE(0x01400000, 0x0140001f) AM_DEVREADWRITE8("uart1", ns16550_device, ins8250_r, ins8250_w, 0xff) // Serial UART1 (TL16C552 CS1)
AM_RANGE(0x01800000, 0x0180001f) AM_READWRITE8(parallel_r, parallel_w, 0xff) // Parallel UART (TL16C552 CS2)
ADDRESS_MAP_END
/*************************************
*
* Machine drivers
@ -1533,10 +1650,10 @@ ADDRESS_MAP_END
static MACHINE_CONFIG_START( vegascore )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", R5000LE, vrc5074_device::SYSTEM_CLOCK*2)
MCFG_CPU_ADD("maincpu", R5000LE, vegas_state::SYSTEM_CLOCK*2)
MCFG_MIPS3_ICACHE_SIZE(16384)
MCFG_MIPS3_DCACHE_SIZE(16384)
MCFG_MIPS3_SYSTEM_CLOCK(vrc5074_device::SYSTEM_CLOCK)
MCFG_MIPS3_SYSTEM_CLOCK(vegas_state::SYSTEM_CLOCK)
// PCI Bus Devices
MCFG_PCI_ROOT_ADD(":pci")
@ -1584,19 +1701,21 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( vegas250, vegascore )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_CLOCK(vrc5074_device::SYSTEM_CLOCK*2.5)
MCFG_CPU_CLOCK(vegas_state::SYSTEM_CLOCK*2.5)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( vegas32m, vegascore )
static MACHINE_CONFIG_DERIVED( vegas32m, vegas250)
MCFG_DEVICE_MODIFY(PCI_ID_NILE)
MCFG_VRC5074_SET_SDRAM(0, 0x02000000)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( vegasban, vegascore )
MCFG_DEVICE_MODIFY(PCI_ID_NILE)
MCFG_VRC5074_SET_SDRAM(0, 0x02000000)
static MACHINE_CONFIG_DERIVED( vegasban, vegas32m)
// Short term hack to get nbashowt, nbanfl, nbagold to boot.
// Probably due to CRTC registers not used for timing in voodoo
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_REFRESH_RATE(120)
MCFG_DEVICE_REMOVE(PCI_ID_VIDEO)
MCFG_VOODOO_PCI_ADD(PCI_ID_VIDEO, TYPE_VOODOO_BANSHEE, ":maincpu")
@ -1606,11 +1725,16 @@ static MACHINE_CONFIG_DERIVED( vegasban, vegascore )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( vegasv3, vegascore)
MCFG_CPU_REPLACE("maincpu", RM7000LE, vrc5074_device::SYSTEM_CLOCK*2.5)
static MACHINE_CONFIG_DERIVED( vegasv3, vegas32m)
MCFG_CPU_REPLACE("maincpu", RM7000LE, vegas_state::SYSTEM_CLOCK*2.5)
MCFG_MIPS3_ICACHE_SIZE(16384)
MCFG_MIPS3_DCACHE_SIZE(16384)
MCFG_MIPS3_SYSTEM_CLOCK(vrc5074_device::SYSTEM_CLOCK)
MCFG_MIPS3_SYSTEM_CLOCK(vegas_state::SYSTEM_CLOCK)
// Short term hack to get cartfury to boot.
// Probably due to CRTC registers not used for timing in voodoo
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_REFRESH_RATE(120)
MCFG_DEVICE_REMOVE(PCI_ID_VIDEO)
MCFG_VOODOO_PCI_ADD(PCI_ID_VIDEO, TYPE_VOODOO_3, ":maincpu")
@ -1621,18 +1745,48 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( denver, vegascore )
MCFG_CPU_REPLACE("maincpu", RM7000LE, vrc5074_device::SYSTEM_CLOCK*2.5)
MCFG_CPU_REPLACE("maincpu", RM7000LE, vegas_state::SYSTEM_CLOCK*2.5)
MCFG_MIPS3_ICACHE_SIZE(16384)
MCFG_MIPS3_DCACHE_SIZE(16384)
MCFG_MIPS3_SYSTEM_CLOCK(vrc5074_device::SYSTEM_CLOCK)
MCFG_MIPS3_SYSTEM_CLOCK(vegas_state::SYSTEM_CLOCK)
MCFG_DEVICE_MODIFY(PCI_ID_NILE)
MCFG_VRC5074_SET_SDRAM(0, 0x02000000)
MCFG_VRC5074_SET_CS(8, vegas_cs8_map)
MCFG_DEVICE_REMOVE(PCI_ID_VIDEO)
MCFG_VOODOO_PCI_ADD(PCI_ID_VIDEO, TYPE_VOODOO_3, ":maincpu")
MCFG_VOODOO_PCI_FBMEM(16)
MCFG_DEVICE_MODIFY(PCI_ID_VIDEO":voodoo")
MCFG_VOODOO_VBLANK_CB(DEVWRITELINE(":", vegas_state, vblank_assert))
// TL16C552 UART
MCFG_DEVICE_ADD("uart1", NS16550, vegas_state::SYSTEM_CLOCK / 12)
MCFG_INS8250_OUT_TX_CB(DEVWRITELINE("com1", rs232_port_device, write_txd))
MCFG_INS8250_OUT_DTR_CB(DEVWRITELINE("com1", rs232_port_device, write_dtr))
MCFG_INS8250_OUT_RTS_CB(DEVWRITELINE("com1", rs232_port_device, write_rts))
MCFG_INS8250_OUT_INT_CB(DEVWRITELINE(":", vegas_state, uart1_irq_cb))
MCFG_DEVICE_ADD("uart2", NS16550, vegas_state::SYSTEM_CLOCK / 12)
MCFG_INS8250_OUT_TX_CB(DEVWRITELINE("com2", rs232_port_device, write_txd))
MCFG_INS8250_OUT_DTR_CB(DEVWRITELINE("com2", rs232_port_device, write_dtr))
MCFG_INS8250_OUT_RTS_CB(DEVWRITELINE("com2", rs232_port_device, write_rts))
MCFG_INS8250_OUT_INT_CB(DEVWRITELINE(":", vegas_state, uart2_irq_cb))
MCFG_RS232_PORT_ADD("com1", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart1", ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("uart1", ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart1", ins8250_uart_device, dsr_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("uart1", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart1", ins8250_uart_device, cts_w))
MCFG_RS232_PORT_ADD("com2", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart2", ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("uart2", ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart2", ins8250_uart_device, dsr_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("uart2", ins8250_uart_device, ri_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart2", ins8250_uart_device, cts_w))
MACHINE_CONFIG_END
// Per driver configs
@ -1763,7 +1917,7 @@ static MACHINE_CONFIG_DERIVED( sf2049se, denver )
MCFG_DEVICE_ADD("ioasic", MIDWAY_IOASIC, 0)
MCFG_MIDWAY_IOASIC_SHUFFLE(MIDWAY_IOASIC_SFRUSHRK)
MCFG_MIDWAY_IOASIC_UPPER(336/* others? */)
MCFG_MIDWAY_IOASIC_UPPER(352/*352 336 others? */)
MCFG_MIDWAY_IOASIC_YEAR_OFFS(80)
MCFG_MIDWAY_IOASIC_IRQ_CALLBACK(WRITELINE(vegas_state, ioasic_irq))
MCFG_MIDWAY_IOASIC_AUTO_ACK(1)
@ -1776,7 +1930,7 @@ static MACHINE_CONFIG_DERIVED( sf2049te, denver )
MCFG_DEVICE_ADD("ioasic", MIDWAY_IOASIC, 0)
MCFG_MIDWAY_IOASIC_SHUFFLE(MIDWAY_IOASIC_SFRUSHRK)
MCFG_MIDWAY_IOASIC_UPPER(348/* others? */)
MCFG_MIDWAY_IOASIC_UPPER(348/* 348 others? */)
MCFG_MIDWAY_IOASIC_YEAR_OFFS(80)
MCFG_MIDWAY_IOASIC_IRQ_CALLBACK(WRITELINE(vegas_state, ioasic_irq))
MCFG_MIDWAY_IOASIC_AUTO_ACK(1)
@ -1789,10 +1943,11 @@ static MACHINE_CONFIG_DERIVED( cartfury, vegasv3 )
MCFG_DEVICE_ADD("ioasic", MIDWAY_IOASIC, 0)
MCFG_MIDWAY_IOASIC_SHUFFLE(MIDWAY_IOASIC_CARNEVIL)
MCFG_MIDWAY_IOASIC_UPPER(433/* 495 others? */)
// 433, 495 Development PIC
MCFG_MIDWAY_IOASIC_UPPER(495/*433, 495 others? */)
MCFG_MIDWAY_IOASIC_YEAR_OFFS(80)
MCFG_MIDWAY_IOASIC_IRQ_CALLBACK(WRITELINE(vegas_state, ioasic_irq))
MCFG_MIDWAY_IOASIC_AUTO_ACK(1)
//MCFG_MIDWAY_IOASIC_AUTO_ACK(1)
MACHINE_CONFIG_END
@ -2215,7 +2370,7 @@ GAME( 2000, nbagold , 0, nbagold, nbashowt, vegas_state, nbanfl, ROT
/* Durango + Denver SIO + Voodoo 3 */
GAMEL( 1998, sf2049, 0, sf2049, sf2049, vegas_state, sf2049, ROT0, "Atari Games", "San Francisco Rush 2049", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 )
GAMEL( 1998, sf2049se, sf2049, sf2049se, sf2049se, vegas_state, sf2049se, ROT0, "Atari Games", "San Francisco Rush 2049: Special Edition", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 )
GAMEL( 1998, sf2049te, sf2049, sf2049te, sf2049, vegas_state, sf2049te, ROT0, "Atari Games", "San Francisco Rush 2049: Tournament Edition", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 )
GAMEL( 1998, sf2049te, sf2049, sf2049te, sf2049se, vegas_state, sf2049te, ROT0, "Atari Games", "San Francisco Rush 2049: Tournament Edition", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sf2049 )
/* Durango + Vegas SIO + Voodoo 3 */
GAME( 2000, cartfury, 0, cartfury, cartfury, vegas_state, cartfury, ROT0, "Midway Games", "Cart Fury", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )