AdaCasio/README.md
2026-04-02 13:05:56 +02:00

6 KiB

AdaCasio

Building and developing Ada applications for the Casio fx-CG50


The Casio fx-CG50 (from here on only called CG50) uses the SuperH architecture. Specifically a custom SH4-A chip. To be able to develope Add-ons, we first need to compile gcc with Ada and SuperH support.

Note

This guide is mostly based on Lephenixnoir guides for building fxSDK manually. I have changed a few parts to add Ada support without an Ada Runtime (Later project)

Building a GNAT cross compiler

We start by downloading the binutils and gcc source code.

wget -O binutils.tar.gz "https://ftp.gnu.org/gnu/binutils/binutils-2.46.0.tar.gz"
wget -O gcc.tar.gz "https://ftp.gnu.org/gnu/gcc/gcc-15.2.0/gcc-15.2.0.tar.gz"
tar -xf binutils.tar.gz
tar -xf gcc.tar.gz

Note

You need a working ada compiler to compile ada. If you don't have gnat available in your repo, you can compile a stage1 gcc compiler. For my own sanity sake, I'll just assume that you already have gnat installed on your system.

Prepare the build environment to configure the tools.

mkdir build-binutils build-gcc sysroot

sysroot is where gcc and binutils is going to be installed at. The build-* directories is where the tools are going to be build at. But before we do that we first have to configure them.

Configuring binutils

cd build-binutils
../binutils-*/configure                 \
  --prefix="$(pwd)/../sysroot"      \
  --target="sh3eb-elf"                  \
  --with-multilib-list="m3,m4-nofpu"    \
  --program-prefix="sh-elf-"            \
  --enable-libssp                       \
  --enable-lto

You might ask yourself now why we chose these flags. Here I have tried to lay out why we use some of these flags.

Flag Meaning
--prefix The install path. In our case it's sysroot
--target What our target architecture is. The CG50 uses SuperH
--with-multilib-list TODO: for what is that?
--program-prefix prefix of the binuitls tools
--enable-libssp No Idea
--enable-lto Link Time Optimization. Glue code faster together

Compiling binutils

We now compile binutils with our custom configuration using

make -j$(nproc)
make install-strip

%TODO: What does configure-host do? why install-strip?

We now configure and install gcc using the same steps but with different flags.

Configuring GCC (Part 1)

We will first compile a working C cross compiler without a libc and add it later on to compile gcc with C++ and Ada support.

cd ../build-gcc
../gcc-*/configure                        \
  --prefix="$(pwd)/../sysroot"            \
  --target="sh3eb-elf"                    \
  --with-multilib-list="m3,m4-nofpu"      \
  --enable-languages="c,c++,ada"          \
  --without-libada                        \
  --without-headers                       \
  --program-prefix="sh-elf-"              \
  --enable-libssp                         \
  --enable-lto                            \
  --enable-clocale="generic"              \
  --enable-libstdcxx-allocator            \
  --disable-threads                       \
  --disable-libstdcxx-verbose             \
  --enable-cxx-flags="-fno-exceptions"

TODO: Da fuck all these flags for?

Column1 Column2
--disable-libada We will be adding our own runtime
Item1.2 Item2.2
Item1.3 Item2.3
Item1.4 Item2.4

Compiling GCC

We now compile gcc the same way we did binutils.

make -j$(nproc) all-gcc all-target-libgcc
make install-strip-gcc install-strip-target-libgcc # TODO: may need to add Ada stuff?

Adding libc

We will now install a libc implementation that works on the CG50. For that we will use OpenLibm and fxlibc

COMPILER_DIR="$(sh-elf-gcc --print-file-name=.)" #TODO: maybe more elegant way to search for path?
LIBDIR="$COMPILER_DIR"
INCDIR="$COMPILER_DIR/include"
git clone https://git.planet-casio.com/Lephenixnoir/OpenLibm.git
cd OpenLibm
make USEGCC=1 TOOLPREFIX=sh-elf- AR=sh-elf-ar CC=sh-elf-gcc libdir="$(pwd)/../sysroot/lib/gcc/sh3eb-elf/15.2.0/" includedir="$(pwd)/../sysroot/lib/gcc/sh3eb-elf/15.2.0/include" install-static-superh install-headers-superh 
# make USEGCC=1 TOOLPREFIX=sh-elf- AR=sh-elf-ar CC=sh-elf-gcc \
#     libdir="$LIBDIR" includedir="$INCDIR" \
#     install-static-superh install-headers-superh

Now we install the actual libc

git clone https://git.planet-casio.com/Vhex-Kernel-Core/fxlibc.git
cd fxlibc
cmake -B build-gint -DFXLIBC_TARGET=gint -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-sh.cmake -DCMAKE_INSTALL_PREFIX="$SYSROOT" #instead of Sysroot use lib/gcc/15.2.0
make -C build-casiowin-cg
make -C build-casiowin-cg install

Note

There is also gint and vhex form the repo but those target also other calculators that I don't have access to. For my own sanity sake I'll just stick with the casiowin-cg

Compiling GCC (Part 2)

Build now the c++ support with

make -j$(nproc) all-target-libstdc++-v3
make install-strip-target-libstdc++-v3

Adding our custom compiler to GPRBuild

TODO: look into ironclad gprbuild integration

Sources used:


Copyright (c) 2026 Ada Orbit. All Rights Reserved.

TODO

Idea space thingy

Maybe try installing gcc the way Lephexnior does and just sneakally add --language=ada and no adalib to build everything?