Skip to content

vsystem: hook up rs232 to f1gp, gstriker and tail2nos. #14045

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 42 additions & 14 deletions src/mame/vsystem/f1gp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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"
Expand Down Expand Up @@ -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)
{ }
Expand Down Expand Up @@ -120,6 +119,8 @@ class f1gp_state : public driver_device
required_device<palette_device> m_palette;
optional_device<generic_latch_8_device> m_soundlatch; // not f1gpbl
required_device<acia6850_device> m_acia;
required_device<rs232_port_device> m_rs232_out;
required_device<rs232_port_device> m_rs232_in;

void sh_bankswitch_w(uint8_t data);
uint8_t soundlatch_pending_r();
Expand Down Expand Up @@ -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 )
Expand Down Expand Up @@ -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));

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 )
28 changes: 21 additions & 7 deletions src/mame/vsystem/gstriker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"),
Expand Down Expand Up @@ -255,6 +258,7 @@ class gstriker_state : public driver_device
required_device<palette_device> m_palette;
required_device<mb3773_device> m_watchdog;
optional_device<acia6850_device> m_acia;
optional_device<rs232_port_device> m_rs232;

required_shared_ptr<uint16_t> m_cg10103_vram;
memory_share_array_creator<uint16_t, 2> m_buffered_spriteram;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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));
}
Expand Down Expand Up @@ -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
Expand Down
39 changes: 33 additions & 6 deletions src/mame/vsystem/tail2nos.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
{ }

Expand Down Expand Up @@ -82,6 +87,8 @@ class tail2nos_state : public driver_device
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
required_device<acia6850_device> m_acia;
required_device<rs232_port_device> m_rs232_out;
required_device<rs232_port_device> m_rs232_in;
required_ioport_array<2> m_analog;

void txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
Expand Down Expand Up @@ -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 =
{
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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
Loading