diff --git a/src/mame/vsystem/f1gp.cpp b/src/mame/vsystem/f1gp.cpp index beec0fa904e69..9152b5e7ab34f 100644 --- a/src/mame/vsystem/f1gp.cpp +++ b/src/mame/vsystem/f1gp.cpp @@ -11,11 +11,6 @@ - f1gp2's hardware is very similar to Lethal Crash Race, main difference being an extra 68000. - TODO: - - Hook up link for Multi Player game mode. Currently they boot with - link set to multiple, but the ID changes every boot (and will black - out if a multiplayer game is started). - f1gp: - gfxctrl register not understood - handling of fg/sprite priority to fix "continue" screen is just a kludge. @@ -34,6 +29,8 @@ #include "vsystem_spr.h" #include "vsystem_spr2.h" +#include "bus/rs232/rs232.h" + #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "machine/6850acia.h" @@ -84,6 +81,8 @@ class f1gp_state : public driver_device m_palette(*this, "palette"), m_soundlatch(*this, "soundlatch"), m_acia(*this, "acia"), + m_rs232_out(*this, "com_out"), + m_rs232_in(*this, "com_in"), m_rozgfxram(*this, "rozgfxram"), m_spr_old(*this, "vsystem_spr_old%u", 1U) { } @@ -120,6 +119,8 @@ class f1gp_state : public driver_device required_device m_palette; optional_device m_soundlatch; // not f1gpbl required_device m_acia; + required_device m_rs232_out; + required_device m_rs232_in; void sh_bankswitch_w(uint8_t data); uint8_t soundlatch_pending_r(); @@ -742,6 +743,14 @@ static INPUT_PORTS_START( f1gp2 ) PORT_DIPUNUSED( 0x001e, 0x001e ) INPUT_PORTS_END +static DEVICE_INPUT_DEFAULTS_START( linkplay ) + DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_38400 ) + DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_38400 ) + DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 ) + DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_EVEN ) + DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 ) +DEVICE_INPUT_DEFAULTS_END + static GFXDECODE_START( gfx_f1gp ) @@ -826,9 +835,18 @@ void f1gp_state::f1gp(machine_config &config) ACIA6850(config, m_acia, 0); m_acia->irq_handler().set_inputline("sub", M68K_IRQ_3); - m_acia->txd_handler().set("acia", FUNC(acia6850_device::write_rxd)); // loopback for now + m_acia->txd_handler().set("com_out", FUNC(rs232_port_device::write_txd)); + + // dual DE-9 ports + // COM-IN (inner) and COM-OUT (outer) according to manual + rs232_port_device &rs232out(RS232_PORT(config, "com_out", default_rs232_devices, nullptr)); + rs232out.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay)); - clock_device &acia_clock(CLOCK(config, "acia_clock", 1'000'000)); // guessed + rs232_port_device &rs232in(RS232_PORT(config, "com_in", default_rs232_devices, nullptr)); + rs232in.rxd_handler().set("acia", FUNC(acia6850_device::write_rxd)); + rs232in.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay)); + + clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 32)); // assume ~38400 baud acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc)); acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)); @@ -888,12 +906,22 @@ void f1gp_state::f1gpbl(machine_config &config) ACIA6850(config, m_acia, 0); m_acia->irq_handler().set_inputline("sub", M68K_IRQ_3); - m_acia->txd_handler().set("acia", FUNC(acia6850_device::write_rxd)); // loopback for now + m_acia->txd_handler().set("com_out", FUNC(rs232_port_device::write_txd)); + + // dual DE-9 ports + // COM-IN (inner) and COM-OUT (outer) according to manual + rs232_port_device &rs232out(RS232_PORT(config, "com_out", default_rs232_devices, nullptr)); + rs232out.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay)); - clock_device &acia_clock(CLOCK(config, "acia_clock", 1'000'000)); // guessed + rs232_port_device &rs232in(RS232_PORT(config, "com_in", default_rs232_devices, nullptr)); + rs232in.rxd_handler().set("acia", FUNC(acia6850_device::write_rxd)); + rs232in.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay)); + + clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 32)); // assume ~38400 baud acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc)); acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)); + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); @@ -1162,9 +1190,9 @@ ROM_END } // anonymous namespace -GAME( 1991, f1gp, 0, f1gp, f1gp, f1gp_state, empty_init, ROT90, "Video System Co.", "F-1 Grand Prix (set 1)", MACHINE_NO_COCKTAIL | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) // censored banners, US McO'River release? -GAME( 1991, f1gpa, f1gp, f1gp, f1gp, f1gp_state, empty_init, ROT90, "Video System Co.", "F-1 Grand Prix (set 2)", MACHINE_NO_COCKTAIL | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) -GAME( 1991, f1gpb, f1gp, f1gp, f1gp, f1gp_state, empty_init, ROT90, "Video System Co.", "F-1 Grand Prix (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) // supposed to be the earliest version dumped and only work with steering wheel -GAME( 1991, f1gpbl, f1gp, f1gpbl, f1gp, f1gp_state, empty_init, ROT90, "bootleg (Playmark)", "F-1 Grand Prix (Playmark bootleg)", MACHINE_NOT_WORKING | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) // PCB marked 'Super Formula II', manufactured by Playmark. +GAME( 1991, f1gp, 0, f1gp, f1gp, f1gp_state, empty_init, ROT90, "Video System Co.", "F-1 Grand Prix (set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // censored banners, US McO'River release? +GAME( 1991, f1gpa, f1gp, f1gp, f1gp, f1gp_state, empty_init, ROT90, "Video System Co.", "F-1 Grand Prix (set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1991, f1gpb, f1gp, f1gp, f1gp, f1gp_state, empty_init, ROT90, "Video System Co.", "F-1 Grand Prix (set 3)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // supposed to be the earliest version dumped and only work with steering wheel +GAME( 1991, f1gpbl, f1gp, f1gpbl, f1gp, f1gp_state, empty_init, ROT90, "bootleg (Playmark)", "F-1 Grand Prix (Playmark bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // PCB marked 'Super Formula II', manufactured by Playmark. -GAME( 1992, f1gp2, 0, f1gp2, f1gp2, f1gp2_state, empty_init, ROT90, "Video System Co.", "F-1 Grand Prix Part II", MACHINE_NO_COCKTAIL | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) +GAME( 1992, f1gp2, 0, f1gp2, f1gp2, f1gp2_state, empty_init, ROT90, "Video System Co.", "F-1 Grand Prix Part II", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/vsystem/gstriker.cpp b/src/mame/vsystem/gstriker.cpp index 7c2d8fe5d8a10..6a872db8b2a02 100644 --- a/src/mame/vsystem/gstriker.cpp +++ b/src/mame/vsystem/gstriker.cpp @@ -181,6 +181,8 @@ Frequencies: 68k is XTAL_32MHZ/2 #include "vs920a.h" #include "vsystem_spr.h" +#include "bus/rs232/rs232.h" + #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "machine/6850acia.h" @@ -223,6 +225,7 @@ class gstriker_state : public driver_device m_palette(*this, "palette"), m_watchdog(*this, "watchdog"), m_acia(*this, "acia"), + m_rs232(*this, "rs232"), m_cg10103_vram(*this, "cg10103_vram"), m_buffered_spriteram(*this, "buffere_spriteram%u", 0U, 0x2000U, ENDIANNESS_BIG), m_work_ram(*this, "work_ram"), @@ -255,6 +258,7 @@ class gstriker_state : public driver_device required_device m_palette; required_device m_watchdog; optional_device m_acia; + optional_device m_rs232; required_shared_ptr m_cg10103_vram; memory_share_array_creator m_buffered_spriteram; @@ -622,6 +626,14 @@ static INPUT_PORTS_START( vgoalsoc ) PORT_DIPSETTING( 0x00, "2" ) INPUT_PORTS_END +static DEVICE_INPUT_DEFAULTS_START( linkplay ) + DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_38400 ) + DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_38400 ) + DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 ) + DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE ) + DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 ) +DEVICE_INPUT_DEFAULTS_END + /*** MACHINE DRIVER **********************************************************/ void gstriker_state::base(machine_config &config) @@ -691,12 +703,14 @@ void gstriker_state::gstriker(machine_config &config) ACIA6850(config, m_acia, 0); m_acia->irq_handler().set_inputline(m_maincpu, M68K_IRQ_2); - m_acia->txd_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); // loopback for now + m_acia->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); // DE-9 port - // slave sends 0xca, master receives it and sends a 0x0d ACK back. - // writing latter to $200063 while in slave mode will pass the serial check - clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 64)); // assume ~19200 baud + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr)); + rs232.rxd_handler().set("acia", FUNC(acia6850_device::write_rxd)); + rs232.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay)); + + clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 32)); // assume ~38400 baud acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc)); acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)); } @@ -1278,9 +1292,9 @@ void gstriker_state::init_vgoalsoc() /*** GAME DRIVERS ************************************************************/ -GAME( 1993, gstriker, 0, gstriker, gstriker, gstriker_state, empty_init, ROT0, "Human", "Grand Striker (Europe, Oceania)", MACHINE_NOT_WORKING | MACHINE_NODEVICE_LAN | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1993, gstrikera, gstriker, gstriker, gstriker, gstriker_state, empty_init, ROT0, "Human", "Grand Striker (Americas)", MACHINE_NOT_WORKING | MACHINE_NODEVICE_LAN | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1993, gstrikerj, gstriker, gstriker, gstriker, gstriker_state, empty_init, ROT0, "Human", "Grand Striker (Japan)", MACHINE_NOT_WORKING | MACHINE_NODEVICE_LAN | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, gstriker, 0, gstriker, gstriker, gstriker_state, empty_init, ROT0, "Human", "Grand Striker (Europe, Oceania)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, gstrikera, gstriker, gstriker, gstriker, gstriker_state, empty_init, ROT0, "Human", "Grand Striker (Americas)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, gstrikerj, gstriker, gstriker, gstriker, gstriker_state, empty_init, ROT0, "Human", "Grand Striker (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // Similar, but not identical hardware, appear to be protected by an MCU GAME( 1994, vgoalsoc, 0, vgoal, vgoalsoc, gstriker_state, init_vgoalsoc, ROT0, "Tecmo", "V Goal Soccer (Europe)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // has ger/hol/arg/bra/ita/eng/spa/fra diff --git a/src/mame/vsystem/tail2nos.cpp b/src/mame/vsystem/tail2nos.cpp index d643c908a2738..d80849672a7ee 100644 --- a/src/mame/vsystem/tail2nos.cpp +++ b/src/mame/vsystem/tail2nos.cpp @@ -18,9 +18,12 @@ #include "vsystem_gga.h" +#include "bus/rs232/rs232.h" + #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "machine/gen_latch.h" #include "sound/ymopn.h" #include "video/k051316.h" @@ -49,6 +52,8 @@ class tail2nos_state : public driver_device m_palette(*this, "palette"), m_soundlatch(*this, "soundlatch"), m_acia(*this, "acia"), + m_rs232_out(*this, "com_out"), + m_rs232_in(*this, "com_in"), m_analog(*this, "AN%u", 0U) { } @@ -82,6 +87,8 @@ class tail2nos_state : public driver_device required_device m_palette; required_device m_soundlatch; required_device m_acia; + required_device m_rs232_out; + required_device m_rs232_in; required_ioport_array<2> m_analog; void txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); @@ -433,6 +440,14 @@ static INPUT_PORTS_START( sformula ) PORT_DIPSETTING( 0x8000, "Overseas" ) // "Tail to Nose" INPUT_PORTS_END +static DEVICE_INPUT_DEFAULTS_START( linkplay ) + DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_38400 ) + DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_38400 ) + DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 ) + DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_EVEN ) + DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 ) +DEVICE_INPUT_DEFAULTS_END + static const gfx_layout tail2nos_spritelayout = { @@ -491,8 +506,20 @@ void tail2nos_state::tail2nos(machine_config &config) ACIA6850(config, m_acia, 0); m_acia->irq_handler().set_inputline("maincpu", M68K_IRQ_3); - //m_acia->txd_handler().set("link", FUNC(rs232_port_device::write_txd)); - //m_acia->rts_handler().set("link", FUNC(rs232_port_device::write_rts)); + m_acia->txd_handler().set("com_out", FUNC(rs232_port_device::write_txd)); + + // dual DE-9 ports + // COM-IN (inner) and COM-OUT (outer) according to manual + rs232_port_device &rs232out(RS232_PORT(config, "com_out", default_rs232_devices, nullptr)); + rs232out.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay)); + + rs232_port_device &rs232in(RS232_PORT(config, "com_in", default_rs232_devices, nullptr)); + rs232in.rxd_handler().set("acia", FUNC(acia6850_device::write_rxd)); + rs232in.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay)); + + clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 32)); // assume ~38400 baud + acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc)); + acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)); // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -662,7 +689,7 @@ ROM_END } // anonymous namespace -GAME( 1989, tail2nos, 0, tail2nos, tail2nos, tail2nos_state, empty_init, ROT90, "V-System Co.", "Tail to Nose - Great Championship / Super Formula", MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) // Only set that's affected by the Country dipswitch -GAME( 1989, tail2nosa, tail2nos, tail2nos, tail2nos, tail2nos_state, empty_init, ROT90, "V-System Co.", "Tail to Nose - Great Championship", MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) -GAME( 1989, sformula, tail2nos, tail2nos, sformula, tail2nos_state, empty_init, ROT90, "V-System Co.", "Super Formula (Japan, set 1)", MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) // For Use in Japan... warning -GAME( 1989, sformulaa, tail2nos, tail2nos, sformula, tail2nos_state, empty_init, ROT90, "V-System Co.", "Super Formula (Japan, set 2)", MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) // No Japan warning, but Japanese version +GAME( 1989, tail2nos, 0, tail2nos, tail2nos, tail2nos_state, empty_init, ROT90, "V-System Co.", "Tail to Nose - Great Championship / Super Formula", MACHINE_SUPPORTS_SAVE ) // Only set that's affected by the Country dipswitch +GAME( 1989, tail2nosa, tail2nos, tail2nos, tail2nos, tail2nos_state, empty_init, ROT90, "V-System Co.", "Tail to Nose - Great Championship", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, sformula, tail2nos, tail2nos, sformula, tail2nos_state, empty_init, ROT90, "V-System Co.", "Super Formula (Japan, set 1)", MACHINE_SUPPORTS_SAVE ) // For Use in Japan... warning +GAME( 1989, sformulaa, tail2nos, tail2nos, sformula, tail2nos_state, empty_init, ROT90, "V-System Co.", "Super Formula (Japan, set 2)", MACHINE_SUPPORTS_SAVE ) // No Japan warning, but Japanese version