Building and developing Ada applications for the Casio fx-CG50
Find a file
2026-03-30 17:19:10 +02:00
.gitignore DID NOT TEST YET 2026-03-30 17:19:10 +02:00
build-gcc.sh DID NOT TEST YET 2026-03-30 17:19:10 +02:00
README.md DID NOT TEST YET 2026-03-30 17:19:10 +02:00

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.

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

I have tried gcc-14.1 but there were some problems with a missing -gnatg flag. Using gcc-15.2 solved the issue but I haven't tested other versions.

Prepare the build environment to configure the tools.

# mkdir build-binutils build-gcc $(pwd)/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="$PREFIX"                 \
  --target="sh3eb-elf"               \
  --with-multilib-list="m3,m4-nofpu" \
  --program-prefix="sh-elf-"         \
  --disable-nls                      \
  --disable-multilib                 \
  --disable-shared                   \
  --with-sysroot

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

Note

I couldn't figure out the usecase for all of these flags If you have to comments on which flags to use I'd be open to hear them!

Flag Meaning
--prefix The install path. In our case it's $(pwd)/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
--disable-nls NO idea
--disable-shared No Idea
--disable-multilib No Idea
--with-sysroot Set the sysroot

Compiling binutils

We now compile binutils with our custom configuration using

# make configure-host
# 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

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

%TODO: Da fuck all these flags for? Which used did I use again? look at .zsh_history on desktop

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

The first part of the compiler flags where from the Casio forum, focusing on c++ support. The second have where from the oswiki guide on making a gnat cross compiler.

Compiling GCC

We now compile gcc the same way we did binutils.


# make -j(nproc) all-gcc all-target-libgcc
# make -j(nproc) -C gcc cross-gnattools ada.all.cross
# make install-strip-gcc install-strip-target-libgcc

%TODO: Why all-gcc and the other stuff? Look that up!

We now have created our own custom Ada compiler that targets our chip!!! But being able to compile a program will not bring us far. We still have to package our binary in such a way that the OS of the CG50 can actually use it. That includes adding an icon and an App name. This step will be done later tho, as we want to integrate our compiler to gprbuild.


Adding our custom compiler to GPRBuild

%TODO: follow osdev wiki guide and debug shit that aint worky worky Maybe change database file or just straigt up make own gprbuild? IDk

Sources used:

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