gigatron/rom/Contrib/psr/py-gtemu/gtemu_extension_build.py
2025-01-28 19:17:01 +03:00

50 lines
1.5 KiB
Python

"""CFFI Build script - Tells CFFI how to build the _gtemu extension
Defines the functions and structures that need to be useable from Python
using C syntax, and says where to find the C file that also be compiled and
linked.
"""
import pathlib
from cffi import FFI
# Paths to files elsewhere in the repository
REPO_ROOT = (pathlib.Path(__file__).parent / ".." / ".." / "..").resolve()
GTEMU_C = REPO_ROOT / "Docs" / "gtemu.c"
ffibuilder = FFI()
# These definitions become most of the the API of the extension.
# They're parsed by CFFI, but are in C syntax.
# They're copied from gtemu.c, but in a more typical usage
# they'd be taken from a manpage or other documentation.
ffibuilder.cdef(
"""\
typedef struct { // TTL state that the CPU controls
uint16_t PC;
uint8_t IR, D, AC, X, Y, OUT, undef;
} CpuState;
"""
)
ffibuilder.cdef("extern uint8_t ROM[1<<16][2], RAM[1<<15], IN;")
ffibuilder.cdef("CpuState cpuCycle(const CpuState S);")
ffibuilder.set_source(
"_gtemu", # name of the output C extension
# The same code as above, but this time for including in the generated C.
# More typically this would be a single line that includes a header.
"""\
typedef struct { // TTL state that the CPU controls
uint16_t PC;
uint8_t IR, D, AC, X, Y, OUT, undef;
} CpuState;
CpuState cpuCycle(const CpuState S);
extern uint8_t ROM[1<<16][2], RAM[1<<15], IN;
""",
sources=[str(GTEMU_C)],
libraries=[],
)
if __name__ == "__main__":
ffibuilder.compile(verbose=True)