BizHawk/waterbox/waterboxhost
Morilli 542f917b1f fix a new waterboxhost warning 2024-10-18 23:54:18 +02:00
..
.vscode more krusty krab 2020-06-22 18:15:11 -04:00
src fix a new waterboxhost warning 2024-10-18 23:54:18 +02:00
.gitignore git ignore build directory for waterboxhost 2023-04-18 21:35:58 -07:00
Cargo.lock Update waterboxhost dependencies 2024-06-15 16:16:13 +02:00
Cargo.toml specify nightly toolchain in rust-toolchain.toml 2024-09-03 07:37:18 +02:00
README.md Build rust projects with x86_64-win7-windows-msvc target 2024-06-17 19:41:52 -07:00
build-debug-no-dirty-detection.bat specify nightly toolchain in rust-toolchain.toml 2024-09-03 07:37:18 +02:00
build-debug-no-dirty-detection.sh specify nightly toolchain in rust-toolchain.toml 2024-09-03 07:37:18 +02:00
build-debug.bat specify nightly toolchain in rust-toolchain.toml 2024-09-03 07:37:18 +02:00
build-debug.sh specify nightly toolchain in rust-toolchain.toml 2024-09-03 07:37:18 +02:00
build-release.bat Build rust projects with x86_64-win7-windows-msvc target 2024-06-17 19:41:52 -07:00
build-release.sh specify nightly toolchain in rust-toolchain.toml 2024-09-03 07:37:18 +02:00
rust-toolchain.toml specify nightly toolchain in rust-toolchain.toml 2024-09-03 07:37:18 +02:00

README.md

Waterboxhost

This is the native support code for Waterbox. It's intended to be consumed as a shared library from the host environment with a C api. For most work with Waterbox cores, you don't need to get into this at all.

API

The public api is mostly all in src/cinterface.rs and has basic documentation on it. Bare minimum sequence of calls to get going:

  1. (Optional) In a release environment, turn off certain checks to speed things up wbx_set_always_evict_blocks()
  2. Create an environment, and load the ELF into it wbx_create_host() wbx_activate_host()
  3. Connect exports from the guest executable to your host system wbx_get_proc_addr()
  4. Run the guest system's init, using function pointers it exposed through wbx_get_proc_addr()
  5. Get ready to take savestates wbx_seal()
  6. Run emulation, using frameadvance or other advance functions exposed by the guest through wbx_get_proc_addr()
  7. Save and load states as needed wbx_save_state() wbx_load_state()
  8. Tear down the environment when done with it. (One shot processes that are about to exit can skip this; the OS will clean everything up) wbx_deactivate_host() wbx_destroy_host()

Some more advanced features:

  • If you're keeping around multiple hosts that may compete for the same address space, use wbx_activate_host() and wbx_deactivate_host() to switch between them.
  • If you'd like to expose files to the virtual filesystem, see wbx_mount_file() and wbx_unmount_file().
  • If you need to call dynamically exposed functions that are not part of the static exports, see wbx_get_callin_addr().
  • If you'd like the guest code to be able to call callbacks that you pass to it, see wbx_get_callback_addr().

Building

Standard rust build infrastructure is used and can be installed with rustup. At the moment, we're using the nightly-x86_64-pc-windows-msvc chain on Windows, and the nightly-x86_64-unknown-linux-gnu chain on linux. I don't know much about crosspiling, but presumably that will work. The linux chain works fine in WSL, anyway. When used in a Windows environment with the right default chain, build-release.bat will build waterboxhost.dll and copy it to the right place. When used in a Linux (or WSL) environment with the right default chain, build-release.sh will build libwaterboxhost.so and copy it to the right place.