start game bridge code

This commit is contained in:
Cadey Ratio 2020-05-08 16:30:43 -04:00
parent a08fffa9a4
commit cc11d483cb
4 changed files with 60 additions and 0 deletions

47
doc/gamebridge.org Normal file
View File

@ -0,0 +1,47 @@
#+TITLE: gamebridge
An interface between Super Mario 64 and just about anything else your heart
desires.
* High level ideas
the rust program has two threads, one is getting the inputs from $SOMEWHERE and
the other is doing the file I/O to the game \\
the game bridge thread has two file descriptors open, a fifo for feeding inputs
to the game and a fifo opened by the game for signaling vblanks \\
the game will then write a readiness signal to the rust program and read the
button data fifo \\
then things will progress normally \\
the getting the input thread of the rust program will have some logic for
telling how long ago it got liveness of the input source (explicitly vaguely
defined to allow a controller to sit there and do nothing as long as it still
exists), and then "sticking" it until, say, 10 frames have passed and then it
will block infinitely, freezing the game in place
* Goals
+ Blocking, synchronous rust as much as possible
+ unix fifos are great, let's use them
* Protocol
The protocol between the game and the bridge will be as follows (based on the
[[http://tasvideos.org/EmulatorResources/Mupen/M64.html][Mupen64 demo format]]). Two unix fifos will be created by the bridge.
The game and the bridge will both need to take care that the files are opened in
*unbuffered I/O modes*. This can be done with
=setvbuf( f, (char *)NULL, _IONBF, 0 );= in C and is the default in Rust.
The first one will be called =vblank= and will then be opened by the game in
write mode when it starts. The bridge will open this fifo in read mode.
The second one will be called =input= and will be opened by the game in read
mode. The bridge will open this fifo in write mode.
On every frame, the game will write the text ="OK\n"= to the vblank fifo. This
will signal the bridge that it should write four bytes of data to the input
fifo, conforming to the [[http://tasvideos.org/EmulatorResources/Mupen/M64.html#ControllerData][Controller Data]] specification of the Mupen64 format.
This data will be interpreted by the game as actions for Mario to take.
The bridge *MUST* block on waiting for the vblank fifo to be written to by the
game and the game *MUST* block on the input fifo being written to by the bridge.

1
gamebridge/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

9
gamebridge/Cargo.toml Normal file
View File

@ -0,0 +1,9 @@
[package]
name = "gamebridge"
version = "0.1.0"
authors = ["Christine Dodrill <me@christine.website>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

3
gamebridge/src/main.rs Normal file
View File

@ -0,0 +1,3 @@
fn main() {
println!("Hello, world!");
}