Build FlooohZ80 on Linux

This commit is contained in:
CasualPokePlayer 2024-10-06 15:18:39 -07:00
parent 882bab228f
commit ce2a6da71f
6 changed files with 76 additions and 124 deletions

1
.gitignore vendored
View File

@ -48,4 +48,3 @@ UpgradeLog.htm
/packages
launchSettings.json
/ExternalProjects/FlooohZ80/x64

BIN
Assets/dll/libFlooohZ80.so Executable file

Binary file not shown.

2
ExternalProjects/FlooohZ80/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
x64/
build/

View File

@ -85,90 +85,95 @@ void LibFz80::SET_im(uint8_t value) { z80Instance->im = value; }
void LibFz80::SET_iff1(bool value) { z80Instance->iff1 = value; }
void LibFz80::SET_iff2(bool value) { z80Instance->iff2 = value; }
// Expose the functions for C# interoperability
extern "C" {
__declspec(dllexport) LibFz80* CreateLibFz80() {
#ifdef _WIN32
#define FZ80_EXPORT __declspec(dllexport)
#else
#define FZ80_EXPORT __attribute__((visibility("default")))
#endif
FZ80_EXPORT LibFz80* CreateLibFz80() {
return new LibFz80();
}
__declspec(dllexport) void DestroyLibFz80(LibFz80* instance) {
FZ80_EXPORT void DestroyLibFz80(LibFz80* instance) {
delete instance;
}
__declspec(dllexport) uint64_t LibFz80_Initialize(LibFz80* instance) {
FZ80_EXPORT uint64_t LibFz80_Initialize(LibFz80* instance) {
return instance->Initialize();
}
__declspec(dllexport) uint64_t LibFz80_Reset(LibFz80* instance) {
FZ80_EXPORT uint64_t LibFz80_Reset(LibFz80* instance) {
return instance->Reset();
}
__declspec(dllexport) uint64_t LibFz80_Tick(LibFz80* instance, uint64_t pins) {
FZ80_EXPORT uint64_t LibFz80_Tick(LibFz80* instance, uint64_t pins) {
return instance->Tick(pins);
}
__declspec(dllexport) uint64_t LibFz80_Prefetch(LibFz80* instance, uint16_t new_pc) {
FZ80_EXPORT uint64_t LibFz80_Prefetch(LibFz80* instance, uint16_t new_pc) {
return instance->Prefetch(new_pc);
}
__declspec(dllexport) bool LibFz80_InstructionDone(LibFz80* instance) {
FZ80_EXPORT bool LibFz80_InstructionDone(LibFz80* instance) {
return instance->InstructionDone();
}
// Getter functions
__declspec(dllexport) uint16_t LibFz80_GET_step(LibFz80* instance) { return instance->GET_step(); }
__declspec(dllexport) uint16_t LibFz80_GET_addr(LibFz80* instance) { return instance->GET_addr(); }
__declspec(dllexport) uint8_t LibFz80_GET_dlatch(LibFz80* instance) { return instance->GET_dlatch(); }
__declspec(dllexport) uint8_t LibFz80_GET_opcode(LibFz80* instance) { return instance->GET_opcode(); }
__declspec(dllexport) uint8_t LibFz80_GET_hlx_idx(LibFz80* instance) { return instance->GET_hlx_idx(); }
__declspec(dllexport) bool LibFz80_GET_prefix_active(LibFz80* instance) { return instance->GET_prefix_active(); }
__declspec(dllexport) uint64_t LibFz80_GET_pins(LibFz80* instance) { return instance->GET_pins(); }
__declspec(dllexport) uint64_t LibFz80_GET_int_bits(LibFz80* instance) { return instance->GET_int_bits(); }
__declspec(dllexport) uint16_t LibFz80_GET_pc(LibFz80* instance) { return instance->GET_pc(); }
__declspec(dllexport) uint16_t LibFz80_GET_af(LibFz80* instance) { return instance->GET_af(); }
__declspec(dllexport) uint16_t LibFz80_GET_bc(LibFz80* instance) { return instance->GET_bc(); }
__declspec(dllexport) uint16_t LibFz80_GET_de(LibFz80* instance) { return instance->GET_de(); }
__declspec(dllexport) uint16_t LibFz80_GET_hl(LibFz80* instance) { return instance->GET_hl(); }
__declspec(dllexport) uint16_t LibFz80_GET_ix(LibFz80* instance) { return instance->GET_ix(); }
__declspec(dllexport) uint16_t LibFz80_GET_iy(LibFz80* instance) { return instance->GET_iy(); }
__declspec(dllexport) uint16_t LibFz80_GET_wz(LibFz80* instance) { return instance->GET_wz(); }
__declspec(dllexport) uint16_t LibFz80_GET_sp(LibFz80* instance) { return instance->GET_sp(); }
__declspec(dllexport) uint16_t LibFz80_GET_ir(LibFz80* instance) { return instance->GET_ir(); }
__declspec(dllexport) uint16_t LibFz80_GET_af2(LibFz80* instance) { return instance->GET_af2(); }
__declspec(dllexport) uint16_t LibFz80_GET_bc2(LibFz80* instance) { return instance->GET_bc2(); }
__declspec(dllexport) uint16_t LibFz80_GET_de2(LibFz80* instance) { return instance->GET_de2(); }
__declspec(dllexport) uint16_t LibFz80_GET_hl2(LibFz80* instance) { return instance->GET_hl2(); }
__declspec(dllexport) uint8_t LibFz80_GET_im(LibFz80* instance) { return instance->GET_im(); }
__declspec(dllexport) bool LibFz80_GET_iff1(LibFz80* instance) { return instance->GET_iff1(); }
__declspec(dllexport) bool LibFz80_GET_iff2(LibFz80* instance) { return instance->GET_iff2(); }
FZ80_EXPORT uint16_t LibFz80_GET_step(LibFz80* instance) { return instance->GET_step(); }
FZ80_EXPORT uint16_t LibFz80_GET_addr(LibFz80* instance) { return instance->GET_addr(); }
FZ80_EXPORT uint8_t LibFz80_GET_dlatch(LibFz80* instance) { return instance->GET_dlatch(); }
FZ80_EXPORT uint8_t LibFz80_GET_opcode(LibFz80* instance) { return instance->GET_opcode(); }
FZ80_EXPORT uint8_t LibFz80_GET_hlx_idx(LibFz80* instance) { return instance->GET_hlx_idx(); }
FZ80_EXPORT bool LibFz80_GET_prefix_active(LibFz80* instance) { return instance->GET_prefix_active(); }
FZ80_EXPORT uint64_t LibFz80_GET_pins(LibFz80* instance) { return instance->GET_pins(); }
FZ80_EXPORT uint64_t LibFz80_GET_int_bits(LibFz80* instance) { return instance->GET_int_bits(); }
FZ80_EXPORT uint16_t LibFz80_GET_pc(LibFz80* instance) { return instance->GET_pc(); }
FZ80_EXPORT uint16_t LibFz80_GET_af(LibFz80* instance) { return instance->GET_af(); }
FZ80_EXPORT uint16_t LibFz80_GET_bc(LibFz80* instance) { return instance->GET_bc(); }
FZ80_EXPORT uint16_t LibFz80_GET_de(LibFz80* instance) { return instance->GET_de(); }
FZ80_EXPORT uint16_t LibFz80_GET_hl(LibFz80* instance) { return instance->GET_hl(); }
FZ80_EXPORT uint16_t LibFz80_GET_ix(LibFz80* instance) { return instance->GET_ix(); }
FZ80_EXPORT uint16_t LibFz80_GET_iy(LibFz80* instance) { return instance->GET_iy(); }
FZ80_EXPORT uint16_t LibFz80_GET_wz(LibFz80* instance) { return instance->GET_wz(); }
FZ80_EXPORT uint16_t LibFz80_GET_sp(LibFz80* instance) { return instance->GET_sp(); }
FZ80_EXPORT uint16_t LibFz80_GET_ir(LibFz80* instance) { return instance->GET_ir(); }
FZ80_EXPORT uint16_t LibFz80_GET_af2(LibFz80* instance) { return instance->GET_af2(); }
FZ80_EXPORT uint16_t LibFz80_GET_bc2(LibFz80* instance) { return instance->GET_bc2(); }
FZ80_EXPORT uint16_t LibFz80_GET_de2(LibFz80* instance) { return instance->GET_de2(); }
FZ80_EXPORT uint16_t LibFz80_GET_hl2(LibFz80* instance) { return instance->GET_hl2(); }
FZ80_EXPORT uint8_t LibFz80_GET_im(LibFz80* instance) { return instance->GET_im(); }
FZ80_EXPORT bool LibFz80_GET_iff1(LibFz80* instance) { return instance->GET_iff1(); }
FZ80_EXPORT bool LibFz80_GET_iff2(LibFz80* instance) { return instance->GET_iff2(); }
// Setter functions
__declspec(dllexport) void LibFz80_SET_step(LibFz80* instance, uint16_t value) { instance->SET_step(value); }
__declspec(dllexport) void LibFz80_SET_addr(LibFz80* instance, uint16_t value) { instance->SET_addr(value); }
__declspec(dllexport) void LibFz80_SET_dlatch(LibFz80* instance, uint8_t value) { instance->SET_dlatch(value); }
__declspec(dllexport) void LibFz80_SET_opcode(LibFz80* instance, uint8_t value) { instance->SET_opcode(value); }
__declspec(dllexport) void LibFz80_SET_hlx_idx(LibFz80* instance, uint8_t value) { instance->SET_hlx_idx(value); }
__declspec(dllexport) void LibFz80_SET_prefix_active(LibFz80* instance, bool value) { instance->SET_prefix_active(value); }
__declspec(dllexport) void LibFz80_SET_pins(LibFz80* instance, uint64_t value) { instance->SET_pins(value); }
__declspec(dllexport) void LibFz80_SET_int_bits(LibFz80* instance, uint64_t value) { instance->SET_int_bits(value); }
__declspec(dllexport) void LibFz80_SET_pc(LibFz80* instance, uint16_t value) { instance->SET_pc(value); }
__declspec(dllexport) void LibFz80_SET_af(LibFz80* instance, uint16_t value) { instance->SET_af(value); }
__declspec(dllexport) void LibFz80_SET_bc(LibFz80* instance, uint16_t value) { instance->SET_bc(value); }
__declspec(dllexport) void LibFz80_SET_de(LibFz80* instance, uint16_t value) { instance->SET_de(value); }
__declspec(dllexport) void LibFz80_SET_hl(LibFz80* instance, uint16_t value) { instance->SET_hl(value); }
__declspec(dllexport) void LibFz80_SET_ix(LibFz80* instance, uint16_t value) { instance->SET_ix(value); }
__declspec(dllexport) void LibFz80_SET_iy(LibFz80* instance, uint16_t value) { instance->SET_iy(value); }
__declspec(dllexport) void LibFz80_SET_wz(LibFz80* instance, uint16_t value) { instance->SET_wz(value); }
__declspec(dllexport) void LibFz80_SET_sp(LibFz80* instance, uint16_t value) { instance->SET_sp(value); }
__declspec(dllexport) void LibFz80_SET_ir(LibFz80* instance, uint16_t value) { instance->SET_ir(value); }
__declspec(dllexport) void LibFz80_SET_af2(LibFz80* instance, uint16_t value) { instance->SET_af2(value); }
__declspec(dllexport) void LibFz80_SET_bc2(LibFz80* instance, uint16_t value) { instance->SET_bc2(value); }
__declspec(dllexport) void LibFz80_SET_de2(LibFz80* instance, uint16_t value) { instance->SET_de2(value); }
__declspec(dllexport) void LibFz80_SET_hl2(LibFz80* instance, uint16_t value) { instance->SET_hl2(value); }
__declspec(dllexport) void LibFz80_SET_im(LibFz80* instance, uint8_t value) { instance->SET_im(value); }
__declspec(dllexport) void LibFz80_SET_iff1(LibFz80* instance, bool value) { instance->SET_iff1(value); }
__declspec(dllexport) void LibFz80_SET_iff2(LibFz80* instance, bool value) { instance->SET_iff2(value); }
FZ80_EXPORT void LibFz80_SET_step(LibFz80* instance, uint16_t value) { instance->SET_step(value); }
FZ80_EXPORT void LibFz80_SET_addr(LibFz80* instance, uint16_t value) { instance->SET_addr(value); }
FZ80_EXPORT void LibFz80_SET_dlatch(LibFz80* instance, uint8_t value) { instance->SET_dlatch(value); }
FZ80_EXPORT void LibFz80_SET_opcode(LibFz80* instance, uint8_t value) { instance->SET_opcode(value); }
FZ80_EXPORT void LibFz80_SET_hlx_idx(LibFz80* instance, uint8_t value) { instance->SET_hlx_idx(value); }
FZ80_EXPORT void LibFz80_SET_prefix_active(LibFz80* instance, bool value) { instance->SET_prefix_active(value); }
FZ80_EXPORT void LibFz80_SET_pins(LibFz80* instance, uint64_t value) { instance->SET_pins(value); }
FZ80_EXPORT void LibFz80_SET_int_bits(LibFz80* instance, uint64_t value) { instance->SET_int_bits(value); }
FZ80_EXPORT void LibFz80_SET_pc(LibFz80* instance, uint16_t value) { instance->SET_pc(value); }
FZ80_EXPORT void LibFz80_SET_af(LibFz80* instance, uint16_t value) { instance->SET_af(value); }
FZ80_EXPORT void LibFz80_SET_bc(LibFz80* instance, uint16_t value) { instance->SET_bc(value); }
FZ80_EXPORT void LibFz80_SET_de(LibFz80* instance, uint16_t value) { instance->SET_de(value); }
FZ80_EXPORT void LibFz80_SET_hl(LibFz80* instance, uint16_t value) { instance->SET_hl(value); }
FZ80_EXPORT void LibFz80_SET_ix(LibFz80* instance, uint16_t value) { instance->SET_ix(value); }
FZ80_EXPORT void LibFz80_SET_iy(LibFz80* instance, uint16_t value) { instance->SET_iy(value); }
FZ80_EXPORT void LibFz80_SET_wz(LibFz80* instance, uint16_t value) { instance->SET_wz(value); }
FZ80_EXPORT void LibFz80_SET_sp(LibFz80* instance, uint16_t value) { instance->SET_sp(value); }
FZ80_EXPORT void LibFz80_SET_ir(LibFz80* instance, uint16_t value) { instance->SET_ir(value); }
FZ80_EXPORT void LibFz80_SET_af2(LibFz80* instance, uint16_t value) { instance->SET_af2(value); }
FZ80_EXPORT void LibFz80_SET_bc2(LibFz80* instance, uint16_t value) { instance->SET_bc2(value); }
FZ80_EXPORT void LibFz80_SET_de2(LibFz80* instance, uint16_t value) { instance->SET_de2(value); }
FZ80_EXPORT void LibFz80_SET_hl2(LibFz80* instance, uint16_t value) { instance->SET_hl2(value); }
FZ80_EXPORT void LibFz80_SET_im(LibFz80* instance, uint8_t value) { instance->SET_im(value); }
FZ80_EXPORT void LibFz80_SET_iff1(LibFz80* instance, bool value) { instance->SET_iff1(value); }
FZ80_EXPORT void LibFz80_SET_iff2(LibFz80* instance, bool value) { instance->SET_iff2(value); }
}

View File

@ -74,69 +74,4 @@ private:
z80_t* z80Instance;
};
// Expose the functions for C# interoperability
extern "C" {
__declspec(dllexport) LibFz80* CreateLibFz80();
__declspec(dllexport) void DestroyLibFz80(LibFz80* instance);
__declspec(dllexport) uint64_t LibFz80_Initialize(LibFz80* instance);
__declspec(dllexport) uint64_t LibFz80_Reset(LibFz80* instance);
__declspec(dllexport) uint64_t LibFz80_Tick(LibFz80* instance, uint64_t pins);
__declspec(dllexport) uint64_t LibFz80_Prefetch(LibFz80* instance, uint16_t new_pc);
__declspec(dllexport) bool LibFz80_InstructionDone(LibFz80* instance);
// expose struct field getters
__declspec(dllexport) uint16_t LibFz80_GET_step(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_addr(LibFz80* instance);
__declspec(dllexport) uint8_t LibFz80_GET_dlatch(LibFz80* instance);
__declspec(dllexport) uint8_t LibFz80_GET_opcode(LibFz80* instance);
__declspec(dllexport) uint8_t LibFz80_GET_hlx_idx(LibFz80* instance);
__declspec(dllexport) bool LibFz80_GET_prefix_active(LibFz80* instance);
__declspec(dllexport) uint64_t LibFz80_GET_pins(LibFz80* instance);
__declspec(dllexport) uint64_t LibFz80_GET_int_bits(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_pc(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_af(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_bc(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_de(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_hl(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_ix(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_iy(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_wz(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_sp(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_ir(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_af2(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_bc2(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_de2(LibFz80* instance);
__declspec(dllexport) uint16_t LibFz80_GET_hl2(LibFz80* instance);
__declspec(dllexport) uint8_t LibFz80_GET_im(LibFz80* instance);
__declspec(dllexport) bool LibFz80_GET_iff1(LibFz80* instance);
__declspec(dllexport) bool LibFz80_GET_iff2(LibFz80* instance);
// expose struct field setters
__declspec(dllexport) void LibFz80_SET_step(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_addr(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_dlatch(LibFz80* instance, uint8_t value);
__declspec(dllexport) void LibFz80_SET_opcode(LibFz80* instance, uint8_t value);
__declspec(dllexport) void LibFz80_SET_hlx_idx(LibFz80* instance, uint8_t value);
__declspec(dllexport) void LibFz80_SET_prefix_active(LibFz80* instance, bool value);
__declspec(dllexport) void LibFz80_SET_pins(LibFz80* instance, uint64_t value);
__declspec(dllexport) void LibFz80_SET_int_bits(LibFz80* instance, uint64_t value);
__declspec(dllexport) void LibFz80_SET_pc(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_af(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_bc(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_de(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_hl(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_ix(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_iy(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_wz(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_sp(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_ir(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_af2(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_bc2(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_de2(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_hl2(LibFz80* instance, uint16_t value);
__declspec(dllexport) void LibFz80_SET_im(LibFz80* instance, uint8_t value);
__declspec(dllexport) void LibFz80_SET_iff1(LibFz80* instance, bool value);
__declspec(dllexport) void LibFz80_SET_iff2(LibFz80* instance, bool value);
}
#endif // FLOOOHZ80_H

View File

@ -0,0 +1,11 @@
#!/bin/sh
if [ -z "$BIZHAWKBUILD_HOME" ]; then export BIZHAWKBUILD_HOME="$(realpath "$(dirname "$0")/../..")"; fi
if [ -z "$CXX" ]; then export CXX="clang++"; fi
mkdir -p build
$CXX -std=c++11 -O3 -flto -fvisibility=hidden -fPIC -shared -s FlooohZ80.cpp -o build/libFlooohZ80.so
cp build/libFlooohZ80.so "$BIZHAWKBUILD_HOME/Assets/dll"
if [ -e "$BIZHAWKBUILD_HOME/output" ]; then
cp build/libFlooohZ80.so "$BIZHAWKBUILD_HOME/output/dll"
fi