Skip to content

Commit 1aebfa2

Browse files
authored
vsystem: hook up rs232 to f1gp, gstriker and tail2nos. (#14045)
1 parent ef0ffe8 commit 1aebfa2

File tree

4 files changed

+103
-28
lines changed

4 files changed

+103
-28
lines changed

src/devices/bus/rs232/rs232.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
#define RS232_BAUD_3600 (0x14)
3333
#define RS232_BAUD_7200 (0x15)
3434
#define RS232_BAUD_111900 (0x16)
35+
#define RS232_BAUD_76800 (0x17)
36+
#define RS232_BAUD_78125 (0x18)
3537

3638
#define PORT_RS232_BAUD(_tag, _default_baud, _description, _class, _write_line) \
3739
PORT_START(_tag) \
@@ -57,6 +59,8 @@
5759
PORT_CONFSETTING( RS232_BAUD_28800, "28800") \
5860
PORT_CONFSETTING( RS232_BAUD_38400, "38400") \
5961
PORT_CONFSETTING( RS232_BAUD_57600, "57600") \
62+
PORT_CONFSETTING( RS232_BAUD_76800, "76800") \
63+
PORT_CONFSETTING( RS232_BAUD_78125, "78125") \
6064
PORT_CONFSETTING( RS232_BAUD_111900, "111900") \
6165
PORT_CONFSETTING( RS232_BAUD_115200, "115200")
6266

@@ -229,7 +233,9 @@ class device_rs232_port_interface : public device_interface
229233
2000,
230234
3600,
231235
7200,
232-
111900
236+
111900,
237+
76800,
238+
78125
233239
};
234240

235241
return values[baud];

src/mame/vsystem/f1gp.cpp

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@
1111
- f1gp2's hardware is very similar to Lethal Crash Race, main difference
1212
being an extra 68000.
1313
14-
TODO:
15-
- Hook up link for Multi Player game mode. Currently they boot with
16-
link set to multiple, but the ID changes every boot (and will black
17-
out if a multiplayer game is started).
18-
1914
f1gp:
2015
- gfxctrl register not understood - handling of fg/sprite priority to fix
2116
"continue" screen is just a kludge.
@@ -34,6 +29,8 @@
3429
#include "vsystem_spr.h"
3530
#include "vsystem_spr2.h"
3631

32+
#include "bus/rs232/rs232.h"
33+
3734
#include "cpu/m68000/m68000.h"
3835
#include "cpu/z80/z80.h"
3936
#include "machine/6850acia.h"
@@ -84,6 +81,8 @@ class f1gp_state : public driver_device
8481
m_palette(*this, "palette"),
8582
m_soundlatch(*this, "soundlatch"),
8683
m_acia(*this, "acia"),
84+
m_rs232_out(*this, "com_out"),
85+
m_rs232_in(*this, "com_in"),
8786
m_rozgfxram(*this, "rozgfxram"),
8887
m_spr_old(*this, "vsystem_spr_old%u", 1U)
8988
{ }
@@ -120,6 +119,8 @@ class f1gp_state : public driver_device
120119
required_device<palette_device> m_palette;
121120
optional_device<generic_latch_8_device> m_soundlatch; // not f1gpbl
122121
required_device<acia6850_device> m_acia;
122+
required_device<rs232_port_device> m_rs232_out;
123+
required_device<rs232_port_device> m_rs232_in;
123124

124125
void sh_bankswitch_w(uint8_t data);
125126
uint8_t soundlatch_pending_r();
@@ -742,6 +743,14 @@ static INPUT_PORTS_START( f1gp2 )
742743
PORT_DIPUNUSED( 0x001e, 0x001e )
743744
INPUT_PORTS_END
744745

746+
static DEVICE_INPUT_DEFAULTS_START( linkplay )
747+
DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_78125 )
748+
DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_78125 )
749+
DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 )
750+
DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_EVEN )
751+
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 )
752+
DEVICE_INPUT_DEFAULTS_END
753+
745754

746755

747756
static GFXDECODE_START( gfx_f1gp )
@@ -826,9 +835,18 @@ void f1gp_state::f1gp(machine_config &config)
826835

827836
ACIA6850(config, m_acia, 0);
828837
m_acia->irq_handler().set_inputline("sub", M68K_IRQ_3);
829-
m_acia->txd_handler().set("acia", FUNC(acia6850_device::write_rxd)); // loopback for now
838+
m_acia->txd_handler().set("com_out", FUNC(rs232_port_device::write_txd));
839+
840+
// dual DE-9 ports
841+
// COM-IN (inner) and COM-OUT (outer) according to manual
842+
rs232_port_device &rs232out(RS232_PORT(config, "com_out", default_rs232_devices, nullptr));
843+
rs232out.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay));
830844

831-
clock_device &acia_clock(CLOCK(config, "acia_clock", 1'000'000)); // guessed
845+
rs232_port_device &rs232in(RS232_PORT(config, "com_in", default_rs232_devices, nullptr));
846+
rs232in.rxd_handler().set("acia", FUNC(acia6850_device::write_rxd));
847+
rs232in.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay));
848+
849+
clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 16)); // 78125 baud
832850
acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc));
833851
acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc));
834852

@@ -888,12 +906,22 @@ void f1gp_state::f1gpbl(machine_config &config)
888906

889907
ACIA6850(config, m_acia, 0);
890908
m_acia->irq_handler().set_inputline("sub", M68K_IRQ_3);
891-
m_acia->txd_handler().set("acia", FUNC(acia6850_device::write_rxd)); // loopback for now
909+
m_acia->txd_handler().set("com_out", FUNC(rs232_port_device::write_txd));
910+
911+
// dual DE-9 ports
912+
// COM-IN (inner) and COM-OUT (outer) according to manual
913+
rs232_port_device &rs232out(RS232_PORT(config, "com_out", default_rs232_devices, nullptr));
914+
rs232out.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay));
892915

893-
clock_device &acia_clock(CLOCK(config, "acia_clock", 1'000'000)); // guessed
916+
rs232_port_device &rs232in(RS232_PORT(config, "com_in", default_rs232_devices, nullptr));
917+
rs232in.rxd_handler().set("acia", FUNC(acia6850_device::write_rxd));
918+
rs232in.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay));
919+
920+
clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 16)); // 78125 baud
894921
acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc));
895922
acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc));
896923

924+
897925
// video hardware
898926
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
899927
screen.set_refresh_hz(60);
@@ -1162,9 +1190,9 @@ ROM_END
11621190
} // anonymous namespace
11631191

11641192

1165-
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?
1166-
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 )
1167-
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
1168-
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.
1193+
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?
1194+
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 )
1195+
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
1196+
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.
11691197

1170-
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 )
1198+
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 )

src/mame/vsystem/gstriker.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ Frequencies: 68k is XTAL_32MHZ/2
181181
#include "vs920a.h"
182182
#include "vsystem_spr.h"
183183

184+
#include "bus/rs232/rs232.h"
185+
184186
#include "cpu/m68000/m68000.h"
185187
#include "cpu/z80/z80.h"
186188
#include "machine/6850acia.h"
@@ -223,6 +225,7 @@ class gstriker_state : public driver_device
223225
m_palette(*this, "palette"),
224226
m_watchdog(*this, "watchdog"),
225227
m_acia(*this, "acia"),
228+
m_rs232(*this, "rs232"),
226229
m_cg10103_vram(*this, "cg10103_vram"),
227230
m_buffered_spriteram(*this, "buffere_spriteram%u", 0U, 0x2000U, ENDIANNESS_BIG),
228231
m_work_ram(*this, "work_ram"),
@@ -255,6 +258,7 @@ class gstriker_state : public driver_device
255258
required_device<palette_device> m_palette;
256259
required_device<mb3773_device> m_watchdog;
257260
optional_device<acia6850_device> m_acia;
261+
optional_device<rs232_port_device> m_rs232;
258262

259263
required_shared_ptr<uint16_t> m_cg10103_vram;
260264
memory_share_array_creator<uint16_t, 2> m_buffered_spriteram;
@@ -622,6 +626,14 @@ static INPUT_PORTS_START( vgoalsoc )
622626
PORT_DIPSETTING( 0x00, "2" )
623627
INPUT_PORTS_END
624628

629+
static DEVICE_INPUT_DEFAULTS_START( linkplay )
630+
DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_78125 )
631+
DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_78125 )
632+
DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 )
633+
DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE )
634+
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 )
635+
DEVICE_INPUT_DEFAULTS_END
636+
625637
/*** MACHINE DRIVER **********************************************************/
626638

627639
void gstriker_state::base(machine_config &config)
@@ -691,12 +703,14 @@ void gstriker_state::gstriker(machine_config &config)
691703

692704
ACIA6850(config, m_acia, 0);
693705
m_acia->irq_handler().set_inputline(m_maincpu, M68K_IRQ_2);
694-
m_acia->txd_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); // loopback for now
706+
m_acia->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
695707

696708
// DE-9 port
697-
// slave sends 0xca, master receives it and sends a 0x0d ACK back.
698-
// writing latter to $200063 while in slave mode will pass the serial check
699-
clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 64)); // assume ~19200 baud
709+
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
710+
rs232.rxd_handler().set("acia", FUNC(acia6850_device::write_rxd));
711+
rs232.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay));
712+
713+
clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 16)); // 78125 baud
700714
acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc));
701715
acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc));
702716
}
@@ -1278,9 +1292,9 @@ void gstriker_state::init_vgoalsoc()
12781292

12791293
/*** GAME DRIVERS ************************************************************/
12801294

1281-
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 )
1282-
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 )
1283-
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 )
1295+
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 )
1296+
GAME( 1993, gstrikera, gstriker, gstriker, gstriker, gstriker_state, empty_init, ROT0, "Human", "Grand Striker (Americas)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
1297+
GAME( 1993, gstrikerj, gstriker, gstriker, gstriker, gstriker_state, empty_init, ROT0, "Human", "Grand Striker (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
12841298

12851299
// Similar, but not identical hardware, appear to be protected by an MCU
12861300
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

src/mame/vsystem/tail2nos.cpp

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@
1818

1919
#include "vsystem_gga.h"
2020

21+
#include "bus/rs232/rs232.h"
22+
2123
#include "cpu/m68000/m68000.h"
2224
#include "cpu/z80/z80.h"
2325
#include "machine/6850acia.h"
26+
#include "machine/clock.h"
2427
#include "machine/gen_latch.h"
2528
#include "sound/ymopn.h"
2629
#include "video/k051316.h"
@@ -49,6 +52,8 @@ class tail2nos_state : public driver_device
4952
m_palette(*this, "palette"),
5053
m_soundlatch(*this, "soundlatch"),
5154
m_acia(*this, "acia"),
55+
m_rs232_out(*this, "com_out"),
56+
m_rs232_in(*this, "com_in"),
5257
m_analog(*this, "AN%u", 0U)
5358
{ }
5459

@@ -82,6 +87,8 @@ class tail2nos_state : public driver_device
8287
required_device<palette_device> m_palette;
8388
required_device<generic_latch_8_device> m_soundlatch;
8489
required_device<acia6850_device> m_acia;
90+
required_device<rs232_port_device> m_rs232_out;
91+
required_device<rs232_port_device> m_rs232_in;
8592
required_ioport_array<2> m_analog;
8693

8794
void txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
@@ -433,6 +440,14 @@ static INPUT_PORTS_START( sformula )
433440
PORT_DIPSETTING( 0x8000, "Overseas" ) // "Tail to Nose"
434441
INPUT_PORTS_END
435442

443+
static DEVICE_INPUT_DEFAULTS_START( linkplay )
444+
DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_78125 )
445+
DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_78125 )
446+
DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 )
447+
DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_EVEN )
448+
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 )
449+
DEVICE_INPUT_DEFAULTS_END
450+
436451

437452
static const gfx_layout tail2nos_spritelayout =
438453
{
@@ -491,8 +506,20 @@ void tail2nos_state::tail2nos(machine_config &config)
491506

492507
ACIA6850(config, m_acia, 0);
493508
m_acia->irq_handler().set_inputline("maincpu", M68K_IRQ_3);
494-
//m_acia->txd_handler().set("link", FUNC(rs232_port_device::write_txd));
495-
//m_acia->rts_handler().set("link", FUNC(rs232_port_device::write_rts));
509+
m_acia->txd_handler().set("com_out", FUNC(rs232_port_device::write_txd));
510+
511+
// dual DE-9 ports
512+
// COM-IN (inner) and COM-OUT (outer) according to manual
513+
rs232_port_device &rs232out(RS232_PORT(config, "com_out", default_rs232_devices, nullptr));
514+
rs232out.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay));
515+
516+
rs232_port_device &rs232in(RS232_PORT(config, "com_in", default_rs232_devices, nullptr));
517+
rs232in.rxd_handler().set("acia", FUNC(acia6850_device::write_rxd));
518+
rs232in.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(linkplay));
519+
520+
clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 16)); // 78125 baud
521+
acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc));
522+
acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc));
496523

497524
// video hardware
498525
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -662,7 +689,7 @@ ROM_END
662689
} // anonymous namespace
663690

664691

665-
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
666-
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 )
667-
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
668-
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
692+
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
693+
GAME( 1989, tail2nosa, tail2nos, tail2nos, tail2nos, tail2nos_state, empty_init, ROT90, "V-System Co.", "Tail to Nose - Great Championship", MACHINE_SUPPORTS_SAVE )
694+
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
695+
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

0 commit comments

Comments
 (0)