Alternative library and kernel for add-in development on fx-9860G and fx-CG50 under Linux.
Go to file
Lephe 2fd4238d31
core: finalize TLB management in timer callbacks (STABLE)
This change enables interrupts within timer callbacks, making it
possible to load pages to MMU while handling a timer underflow. The call
to TLB_LoadPTEH() has been moved directly into the VBR handler to avoid
jumping to ILRAM for a short call on SH4.

The TMU and ETMU handlers have been changed to callback through a new
function gint_inth_callback() that saves the user bank and a few
registers, then invokes the callback with interrupts enabled and in user
bank; until now, callbacks were invoked with interrupts disabled and in
kernel bank. Note that IMASK is still set so a callback can only be
interrupted by a high-priority interrupt.

A timer_wait() function has also been added to simplify tests that
involve timers. Finally, the priority level of the TMU0 underflow
interrupt has been set to 13 (as per the comments) instead of 7.

This version is the first stable version that handles TLB misses
transparently for large add-ins. It is suitable for every gint
application.
2020-06-17 11:43:26 +02:00
include core: finalize TLB management in timer callbacks (STABLE) 2020-06-17 11:43:26 +02:00
make make: improve the Git commit approximation scheme 2020-06-14 08:30:09 +02:00
src core: finalize TLB management in timer callbacks (STABLE) 2020-06-17 11:43:26 +02:00
.gitignore way too much, including bopti/topti, timers, and more. 2019-02-21 21:00:26 +01:00
Makefile core, tmu: add gint_switch(), return to menu, and improve timer code 2020-05-10 14:03:41 +02:00
README.md libc: add random number generation with TinyMT 2020-05-31 17:03:14 +02:00
TODO core: finalize TLB management in timer callbacks (STABLE) 2020-06-17 11:43:26 +02:00
configure use sh-elf by default when building 2019-11-13 19:31:37 +01:00
fx9860g.ld core: backport TLB handling to fx9860g, fix return-to-menu (UNSTABLE) 2020-06-15 20:55:18 +02:00
fxcg50.ld core: backport TLB handling to fx9860g, fix return-to-menu (UNSTABLE) 2020-06-15 20:55:18 +02:00

README.md

gint project

gint (pronounce 'guin') is a development system for Casio fx-9860G II and fx-CG 50 calculators. It provides a mostly free-standing runtime and is used to develop add-ins under Linux, along with specialized GCC toolchains and the fxSDK.

gint is a modular kernel that implements its own drivers for the calculator's hardware, overriding the operating system and its syscalls. It is a drop-in replacement from fxlib, with which it is mostly incompatible. gint exposes a new, richer API to manipulate the hardware and take advantage of the full capabilities of the machine.

This is free software: you may use it for any purpose, share it, and modify it as long as you share your changes. Credit is not required, but please let me know!

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

Programming interface

Because of its free-standing design, gint's API provides direct and efficient access to the low-level MPU features, among which:

  • Multi-key management with event systems suitable for games
  • Hardware timers with sub-millisecond and sub-microsecond resolution
  • Fast screen drivers with DMAC on fx-CG 50
  • Efficient and user-extendable interrupt management

The library also offers powerful higher-level features:

  • An enhanced version of the system's GetKey() and GetKeyWait()
  • A gray engine that works by rapidly swapping monochrome images on fx-9860G II
  • Blazingly fast drawing functions when working with the fxSDK (image rendering is 10 times faster than MonochromeLib)
  • Integrated font management with the fxSDK
  • Integration with a Newlib port by Memallox (WIP)

Building and installing gint

You can choose to build gint for fx-9860G II (monochrome calculators, aka Graph 85 family), fx-CG 50 (color calculators, aka Prizm or Graph 90 family), or both. There are a few dependencies:

  • A suitable GCC toolchain in the PATH. You can absolutely not build gint with your system compiler!
    • The tutorial on Planète Casio builds an sh-elf that works everywhere
    • For fx-9860G II, sh3eb-elf is strongly advised
    • For fx-CG 50, sh4eb-elf (with -m4-nofpu) is slightly better but sh3eb-elf is completely fine
  • The fxSDK installed and available in the PATH. You will need fxconv to build gint, and if you intend to develop add-ins for fx-9860G II, you probably want fxg1a as well. All these tools are built by default.

fx-CG 50 developers probably want a g3a wrapper as well; the reference implementation is Tari's mkg3a. This is needed at the very last compilation step to create the g3a file. On Arch Linux, you can use the AUR/mkg3a package maintained directly by Tari.

The build process is detailed below for both platforms, the principle is the same. You can build both targets at the same time by reading the two sections.

By default gint will be installed in the appropriate compiler folder, which is $PREFIX/ for libraries and linker scripts, and $PREFIX/include/gint/ for headers, where PREFIX is obtained by running ${toolchain}-gcc --print-search-dirs and reading the line that starts with install:. You can change this with the --prefix configure option, but normally you don't need to.

Building for fx-9860G II

Create a build directory and configure in it:

% mkdir build.fx && cd build.fx
% ../configure --target=fx9860g

Then build the source and install the library files to the selected directory. You might need root access if you selected a target directory owned by root with --prefix, or if you built your compiler as root.

% make
% make install

Building for fx-CG 50

Create a build directory and configure in it. The default toolchain is sh4eb-elf, if you wish to build with sh3eb-elf, you need to add a command-line option --toolchain=sh3eb-elf.

% mkdir build.cg && cd build.cg
% ../configure --target=fxcg50

Then build the source and install the library files to the selected directory.

% make
% make install

Using gint

To use gint as your runtime environment, the bare minimum is:

  • Build with -ffreestanding;
  • Link with -T fx9860g.ld and -lgint-fx on fx-9860G;
  • Link with -T fxcg50.ld and -lgint-cg on fx-CG 50.

If you don't have a standard library such as Memallox's port of newlib, you also need -nostdlib. I typically use -m3 -mb or -m4-nofpu -mb to specify the platform, but that may not even be necessary.

Typically you might want to do this with the fxSDK, which hides most of the details and makes it easy to roll add-ins.