a C standard library for fx Casio calculators
Find a file
Lephenixnoir 8cedf411c4
gint: outline a Hardware Abstraction Layer (HAL) for use with gint
A standard libc would normally use the kernel's syscall interface to
connect with the lower level, and this interface would usually imitate
POSIX or a similar style. With the statically-linked unikernel design,
the syscalls would be functions, but the interface wouldn't change much.

However, there are some fundamental differences. For instance, in gint
there aren't separate kernel/userspace memory allocators, there's just a
unified allocator in the kernel. This makes malloc() conceptually a
direct syscall, which pushes the kernel/libc boundary at an unusual
location.

Having a clearly-marked HAL makes it easier to identify where the
boundary is. Code from <time.h> currently has an ad-hoc interface which
should be replaced with clock_gettime(2) in the future.

The HAL offers default implementations but these aren't used by gint
yet, because it's more practical to have undefined references than to
end up with the stubs in an executable. These are provided for future
completeness.

This change does not lift the requirement to recursively link gint with
the libc and the libc with gint.
2024-08-06 18:55:01 +02:00
3rdparty stdlib: automatically seed PRNG with srand(1) 2023-04-01 20:30:30 +02:00
cmake update vxSDK integration 2023-04-01 20:30:30 +02:00
include gint: outline a Hardware Abstraction Layer (HAL) for use with gint 2024-08-06 18:55:01 +02:00
src gint: outline a Hardware Abstraction Layer (HAL) for use with gint 2024-08-06 18:55:01 +02:00
.gitignore update vxSDK integration 2023-04-01 20:30:30 +02:00
CMakeLists.txt gint: outline a Hardware Abstraction Layer (HAL) for use with gint 2024-08-06 18:55:01 +02:00
giteapc.make cmake: default to compiler install with gint, and GiteaPC support 2021-05-25 21:55:51 +02:00
LICENSE Release the 0.3.0 (add README + LICENSE and fix norm) 2020-10-21 22:26:47 +02:00
README.md meta: update build instructions 2022-08-21 17:11:28 +02:00
STATUS stdio: mark *scanf() as TEST 2024-01-14 22:03:59 +01:00
vxsdk.toml update vxSDK integration 2023-04-01 20:30:30 +02:00

fxlibc: The FX C Library

This directory contains the sources of the FxLibc Library. See CMakeLists.txt to see what release version you have.

The FxLibc is the standard system C library implementation for all Casio fx calculators, and is an important part of what makes up programs on these devices. It provides the system API for all programs written in C and C-compatible languages such as C++ and Objective-C; the runtime facilities of other programming languages use the C library to access the underlying operating system.


Dependencies

FxLibc requires a GCC compiler toolchain the PATH to build for any calculator. You cannot build with your system compiler! The tutorial on Planète Casio builds an sh-elf toolchain that supports all models using multilib. See also Lephenixnoir/sh-elf-gcc.

For Vhex targets, the headers of the kernel are also required (but not for gint; the fxlibc is installed before gint).


Building and installing FxLibc

FxLibc supports several targets:

  • Vhex on SH targets (vhex-sh)
  • CASIOWIN for fx-9860G-like calculators (casiowin-fx)
  • CASIOWIN for fx-CG-series calculators (casiowin-cg)
  • gint for all calculators (gint)

Each target supports different features depending on what the kernel/OS provides.

For automated gint/fxSDK setups using GiteaPC is recommended. The instructions below are for manual installs.

Configuration

Configure with CMake; specify the target with -DFXLIBC_TARGET. For SH platforms, set the toolchain to cmake/toolchain-sh.cmake.

You can either install FxLibc in the compiler's include folder (for Vhex), or another folder of your choice (eg. the fxSDK sysroot). If you choose non-standard folders you might need -I and -L options to use the library.

# Install in the compiler's include folder
% PREFIX="$(sh-elf-gcc -print-file-name=.)"
# Install in the fxSDK sysroot
% PREFIX="$(fxsdk path sysroot)"
# Custom target
% PREFIX="$HOME/.sh-prefix/"
# For gint, do not specify anything, the fxSDK will be used dynamically

Example for a static Vhex build:

% cmake -B build-vhex-sh -DFXLIBC_TARGET=vhex-sh -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-sh.cmake -DCMAKE_INSTALL_PREFIX="$PREFIX"

Or for a traditional gint/fxSDK build:

% cmake -B build-gint -DFXLIBC_TARGET=gint -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-sh.cmake

Build and install

Build in the directory specified in cmake -B.

% make -C build-X
% make -C build-X install

Contributing

Bug reports, feature suggestions and especially code contributions are most welcome.

If you are interested in doing a port, or want to contribute to this project, please, try to respect these constraints:

  • Document your code.
  • One function per file (named like the function).
  • Use the same formatting conventions as the rest of the code.
  • Only use hardware-related code (DMA, SPU, etc) in target-specified files when the target explicitly supports it.

Using FxLibc

Include headers normally (#include <stdio.h>); on SH platforms where sh-elf-gcc is used, link with -lc (by default the -nostdlib flag is used for a number of reasons).

If you're installing in a custom folder, you also need -I "$PREFIX/include" and -L "$PREFIX/lib". If you're installing in the GCC install folder, you don't need -I but you still need the -L as the default location for libraries is at the root instead of in a lib subfolder.


Licences

This work is licensed under a CC0 1.0 Universal License. To view a copy of this license, visit: https://creativecommons.org/publicdomain/zero/1.0/legalcode.txt Or see the LICENSE file.

FxLibc also includes third-party code that is distributed under its own license. Currently, this includes:


Special thanks to

  • Lephenixnoir - For all <3
  • Kristaba - For the idea with the shared libraries workaround !