mamedev / mame

MAME
https://www.mamedev.org/
Other
8.02k stars 2k forks source link

Serial communications difficulties #11545

Closed colinleroy closed 3 weeks ago

colinleroy commented 1 year ago

MAME version

0.251 (ecdce6505c499531ceb3c4b70c7d59db78e8125b)

System information

Ubuntu 23.04, x86_64, en_US.

INI configuration details

~/.mame/apple2c0.ini:

#
# CORE CONFIGURATION OPTIONS
#
readconfig                1
writeconfig               1

#
# CORE SEARCH PATH OPTIONS
#
homepath                  .
rompath                   $HOME/mame/roms;/usr/local/share/games/mame/roms;/usr/share/games/mame/roms
hashpath                  files
samplepath                $HOME/mame/samples;/usr/local/share/games/mame/samples;/usr/share/games/mame/samples
artpath                   $HOME/mame/artwork;/usr/local/share/games/mame/artwork;/usr/share/games/mame/artwork
ctrlrpath                 /usr/share/games/mame/ctrlr
inipath                   $HOME/.mame;/etc/mame
fontpath                  /usr/share/games/mame/fonts
cheatpath                 $HOME/mame/cheat;/usr/local/share/games/mame/cheat;/usr/share/games/mame/cheat
crosshairpath             $HOME/mame/crosshair;/usr/local/share/games/mame/crosshair;/usr/share/games/mame/crosshair
pluginspath               /usr/share/games/mame/plugins
languagepath              /usr/share/games/mame/language
swpath                    software

#
# CORE OUTPUT DIRECTORY OPTIONS
#
cfg_directory             $HOME/.mame/cfg
nvram_directory           $HOME/.mame/nvram
input_directory           $HOME/.mame/inp
state_directory           $HOME/.mame/sta
snapshot_directory        $HOME/.mame/snap
diff_directory            $HOME/.mame/diff
comment_directory         $HOME/.mame/comments
share_directory           share

#
# CORE STATE/PLAYBACK OPTIONS
#
state                     
autosave                  0
rewind                    0
rewind_capacity           100
playback                  
record                    
exit_after_playback       0
mngwrite                  
aviwrite                  
wavwrite                  
snapname                  %g/%i
snapsize                  auto
snapview                  auto
snapbilinear              1
statename                 %g
burnin                    0

#
# CORE PERFORMANCE OPTIONS
#
autoframeskip             0
frameskip                 0
seconds_to_run            0
throttle                  1
sleep                     1
speed                     1.0
refreshspeed              0
lowlatency                0

#
# CORE RENDER OPTIONS
#
keepaspect                1
unevenstretch             1
unevenstretchx            0
unevenstretchy            0
autostretchxy             0
intoverscan               0
intscalex                 0
intscaley                 0

#
# CORE ROTATION OPTIONS
#
rotate                    1
ror                       0
rol                       0
autoror                   0
autorol                   0
flipx                     0
flipy                     0

#
# CORE ARTWORK OPTIONS
#
artwork_crop              0
fallback_artwork          
override_artwork          

#
# CORE SCREEN OPTIONS
#
brightness                1.0
contrast                  1.0
gamma                     1.0
pause_brightness          0.65
effect                    none

#
# CORE VECTOR OPTIONS
#
beam_width_min            1.0
beam_width_max            1.0
beam_dot_size             1.0
beam_intensity_weight     0
flicker                   0

#
# CORE SOUND OPTIONS
#
samplerate                48000
samples                   1
volume                    0
compressor                1
speaker_report            0

#
# CORE INPUT OPTIONS
#
coin_lockout              1
ctrlr                     
mouse                     0
joystick                  1
lightgun                  0
multikeyboard             0
multimouse                0
steadykey                 0
ui_active                 0
offscreen_reload          0
joystick_map              auto
joystick_deadzone         0.3
joystick_saturation       0.85
natural                   0
joystick_contradictory    0
coin_impulse              0

#
# CORE INPUT AUTOMATIC ENABLE OPTIONS
#
paddle_device             keyboard
adstick_device            keyboard
pedal_device              keyboard
dial_device               keyboard
trackball_device          keyboard
lightgun_device           keyboard
positional_device         keyboard
mouse_device              mouse

#
# CORE DEBUGGING OPTIONS
#
verbose                   0
log                       0
oslog                     0
debug                     1
update_in_pause           0
debugscript               
debuglog                  0

#
# CORE COMM OPTIONS
#
comm_localhost            0.0.0.0
comm_localport            15112
comm_remotehost           127.0.0.1
comm_remoteport           15112
comm_framesync            0

#
# CORE MISC OPTIONS
#
drc                       1
drc_use_c                 0
drc_log_uml               0
drc_log_native            0
bios                      
cheat                     0
skip_gameinfo             0
uifont                    default
ui                        cabinet
ramsize                   
confirm_quit              0
ui_mouse                  1
language                  
nvram_save                1

#
# SCRIPTING OPTIONS
#
autoboot_command          
autoboot_delay            0
autoboot_script           
console                   0
plugins                   1
plugin                    
noplugin                  

#
# HTTP SERVER OPTIONS
#
http                      0
http_port                 8080
http_root                 web

#
# OSD KEYBOARD MAPPING OPTIONS
#
uimodekey                 DEL

#
# OSD FONT OPTIONS
#
uifontprovider            auto

#
# OSD OUTPUT OPTIONS
#
output                    auto

#
# OSD INPUT OPTIONS
#
keyboardprovider          auto
mouseprovider             auto
lightgunprovider          auto
joystickprovider          auto

#
# OSD DEBUGGING OPTIONS
#
debugger                  auto
debugger_port             23946
debugger_font             auto
debugger_font_size        0
watchdog                  0

#
# OSD PERFORMANCE OPTIONS
#
numprocessors             auto
bench                     0

#
# OSD VIDEO OPTIONS
#
video                     opengl
numscreens                1
window                    1
maximize                  1
waitvsync                 0
syncrefresh               0
monitorprovider           auto

#
# OSD PER-WINDOW VIDEO OPTIONS
#
screen                    auto
aspect                    auto
resolution                560x384
view                      auto
screen0                   auto
aspect0                   auto
resolution0               auto
view0                     auto
screen1                   auto
aspect1                   auto
resolution1               auto
view1                     auto
screen2                   auto
aspect2                   auto
resolution2               auto
view2                     auto
screen3                   auto
aspect3                   auto
resolution3               auto
view3                     auto

#
# OSD FULL SCREEN OPTIONS
#
switchres                 0

#
# OSD ACCELERATED VIDEO OPTIONS
#
filter                    1
prescale                  1

#
# OpenGL-SPECIFIC OPTIONS
#
gl_forcepow2texture       0
gl_notexturerect          0
gl_vbo                    1
gl_pbo                    1
gl_glsl                   0
gl_glsl_filter            1
glsl_shader_mame0         none
glsl_shader_mame1         none
glsl_shader_mame2         none
glsl_shader_mame3         none
glsl_shader_mame4         none
glsl_shader_mame5         none
glsl_shader_mame6         none
glsl_shader_mame7         none
glsl_shader_mame8         none
glsl_shader_mame9         none
glsl_shader_screen0       none
glsl_shader_screen1       none
glsl_shader_screen2       none
glsl_shader_screen3       none
glsl_shader_screen4       none
glsl_shader_screen5       none
glsl_shader_screen6       none
glsl_shader_screen7       none
glsl_shader_screen8       none
glsl_shader_screen9       none

#
# OSD SOUND OPTIONS
#
sound                     auto
audio_latency             2

#
# PORTAUDIO OPTIONS
#
pa_api                    none
pa_device                 none
pa_latency                0

#
# BGFX POST-PROCESSING OPTIONS
#
bgfx_path                 /usr/share/games/mame/bgfx
bgfx_backend              auto
bgfx_debug                0
bgfx_screen_chains        default
bgfx_shadow_mask          slot-mask.png
bgfx_lut                  lut-default.png
bgfx_avi_name             auto

#
# SDL PERFORMANCE OPTIONS
#
sdlvideofps               0

#
# SDL VIDEO OPTIONS
#
centerh                   1
centerv                   1
scalemode                 none

#
# SDL FULL SCREEN OPTIONS
#
useallheads               0
attach_window             

#
# SDL KEYBOARD MAPPING
#
keymap                    0
keymap_file               keymap.dat

#
# SDL JOYSTICK MAPPING
#
sixaxis                   0

#
# SDL LIGHTGUN MAPPING
#
lightgun_index1           auto
lightgun_index2           auto
lightgun_index3           auto
lightgun_index4           auto
lightgun_index5           auto
lightgun_index6           auto
lightgun_index7           auto
lightgun_index8           auto

#
# SDL LOW-LEVEL DRIVER OPTIONS
#
videodriver               auto
renderdriver              auto
audiodriver               auto
gl_lib                    auto

#
# FRONTEND COMMAND OPTIONS
#
dtd                       1

#
# SLOT DEVICES
#
modem                     null_modem

#
# IMAGE DEVICES
#
floppydisk1               /home/colin/Documents/git-oss/a2tools/mastoperso.dsk
floppydisk2               /home/colin/Documents/git-oss/a2tools/disks/images.dsk
bitbanger                 /home/colin/Documents/git-oss/a2tools/socket.localhost:2000

Emulated system/software

apple2c0

Incorrect behaviour

The above command (mame apple2c0 -window -flop1 mastoperso.dsk -resolution 560x384 -modem null_modem -bitb socket.localhost:2000 -nomouse -debug) works and gives me serial communication, as long as I have ser2net running and the tty0tty kernel module loaded (which does pair virtual ttys).

However, with this solution the line status is completely ignored.

I have understood that I should be able to pass -bitbanger /dev/ttySomething to use a file directly, and hoped that it would solve hardware handshaking issues. However, in this mode, whatever is configured in MAME's OSD UI "Machine configuration" tab, the serial device stays set at 38400bps and communication doesn't work.

Linked issue: The ACIA 6551 has control registers that allows to dynamically set parameters like speed, data bits, stop bits etc. I would expect changing the ACIA settings via its registers to reflect on the "Machine configuration" tab, but it does not.

Expected behaviour

I expected the Machine Configuration settings to be reflected on the serial device, using tcsetattr() calls. However this is not the case according to strace.

I would love to improve this myself if this is welcomed by MAME's team, however, I have to admit that I don't understand at all how the firmware / port / bitbanger are linked together.

Thanks!

Steps to reproduce

mame apple2c0 -window -flop1 mastoperso.dsk -resolution 560x384 -modem null_modem -bitb /dev/tnt1 -nomouse -debug

In Machine Configuration, the "RS232 null model [root:modem:null_modem]" configurations are shown as: Flow Control: RTS Data bits: 8 Parity: none RX Baud: 19200 Stop bits: 1 TX Baud: 19200

However stty -F /dev/tnt1 shows:

speed 38400 baud; line = 0;
min = 1; time = 0;
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

Additional details

apple2c0 has an ACIA 6551 in slot 2.

ajrhacker commented 1 year ago

Since MAME's RS232 emulation sends and receives data on a bit-serial level, the 6551 baud rate and framing parameters (normally set by firmware) are not necessarily reflected by those set in "Machine Configuration" for the null_modem device, though they really should match.

I don't really know much about POSIX terminal programming or the handshaking properties of your /dev/tnt1, but it does seem like it would be possible to add flow control calls and such to the pty "pseudo-terminal" interface (though not null_modem).

colinleroy commented 1 year ago

Hi, Thank you for your answer. So I understand that null_modem -bitb /dev/ttySxyz treats the serial port as a simple file? There is no way to connect the emulated RS232 device to an actual RS232 device with flow control, line status, baudrate and the other parameters passed along?

ajrhacker commented 1 year ago

Yes, the bitbanger device (which is admittedly poorly named) basically only provides simple file I/O. That is also basically true of the pty interface, though more of an accident of underdevelopment. For either interface, the OSD layer provides some termios(3)-based handling for files whose names begin with /dev/pts (or /dev/pty on MacOS), which to me seems a bit more rudimentary than it should be.

The fundamental issue is that MAME's asynchronous serial emulation is designed for line-level accuracy, while the character-level terminal interface provided by POSIX is designed more as a portable interface to whatever actual hardware the host system has. The two are therefore not directly compatible without some adapter code to retransmit data in the appropriate form. While it's theoretically possible to use termios(3) calls to force the /dev/XXX terminal's baud rates and framing parameters to match those from the "Machine Configuration" settings, it's not clear that doing so would offer any benefit when the interface device already has to convert the data transmitted as individual bits by the ACIA back to character format.

colinleroy commented 1 year ago

The main advantage I can think of is that it would allow support of CRTSCTS handshaking, and would help the emulated program not lose bytes when it asserts flow control. At least, that's my use case 🙂