# UXNGBA This is a port of the [UXN virtual machine][uxn] for the GBA. It is currently at an early stage, but is capable of running simple demos that make use of the screen or console devices, including the beautiful DVD bouncing. [uxn]: https://wiki.xxiivv.com/site/uxn.html ## Building from source To build this software you need the [devkitPro][devkitpro] SDK. Once installed, you may need to modify the Makefile to ensure the path is correct, but should work with the default devikit installation methods on Linux and macOS. ``` DEVKITPRO := /opt/devkitpro DEVKITBIN := $(DEVKITPRO)/devkitARM/bin DEVKITTOOLS := $(DEVKITPRO)/tools/bin LIBGBA_DIR := $(DEVKITPRO)/libgba LIBGBA_SRC := $(DEVKITPRO)/libgba/include/ LIBGBA := $(LIBGBA_DIR)/lib/libgba.a LIBGBA += $(LIBGBA_DIR)/lib/libfat.a LIBGBA += $(LIBGBA_DIR)/lib/libmm.a ``` If everything is properly installed, you should be able to run `make` to compile the program into a `uxngba.gba` rom. If you have `mgba-qt` installed, you can test it with: `make run`. To use a specific UXN compiled rom, you can pass it as the `ROM_SRC` make parameter: ``` make run ROM_SRC=roms/noodle.rom ``` If you have compiled a rom already and want to change it, you probably want to use `make clean` beforehand. [devkitpro]: https://devkitpro.org/ ## Configuration The output .gba files will embed the rom used for installation. Different roms have different needs, such as the usage of different input methods or the desired audio quality. These options can be selected by defining the right macros on compile time as described below. ### Input method order Uxngba currently supports three different control schemes that can be cycled by pressing the SELECT button: `CONTROL_CONTROLLER`, `CONTROL_MOUSE` and `CONTROL_KEYBOARD`. To select the order and available methods set the `CONTROL_METHODS` macro on compile time. For example, [noodle][noodle] doesn't make much use of the controller scheme, and we may want to use the mouse as the default input method. This can be achieved with the following command: ``` make run ROM_SRC=roms/noodle.rom CONFIG="-DCONTROL_METHODS=CONTROL_MOUSE,CONTROL_KEYBOARD" ``` ### Audio quality Audio processing can be computationally expensive and the GBA has limited resources. uxngba supports 4 audio channel devices simultaneously, and depending on the demands of the rest of the program, the audio quality can be increased or decreased. By default, sounds will play on a 18157 Hz buffer, which offers a good quality-performance compromise. A high quality and low-fi audio modes can be selected by setting the `AUDIO_HIFI` or `AUDIO_LOFI` macros: ``` make run ROM_SRC=roms/audio.rom CONFIG="-DAUDIO_HIFI" or make run ROM_SRC=roms/audio.rom CONFIG="-DAUDIO_LOFI" ``` ### Text layer When writing text to the screen (for example using the console device) the text will be drawn by default on the foreground layer. This can be controlled by setting the `TEXT_MODE` option to 0 for foreground mode or 1 for background mode. ``` make run CONFIG="-DTEXT_MODE=1" ``` ### Performance metrics To enable profiling, the `PROF_ENABLE` macro can be used. This will display the cycle count for input handling (INPUT), loop uxn evaluation (EVAL), screen buffer flip (FLIP) and audio mixing (MIX). If `PROF_ENABLE` is set to 0, the current frame numbers will be displayed, if set to 1, the maximum cycle count for each section will be used instead. Enabling profiling can have a small performance impact, so these numbers may not be 100% accurate, but should give a good indication. Using `PROF_SHOW_X` and `PROF_SHOW_Y` we can control at which tile the cycle count text will be located. ``` make run CONFIG="-DPROF_ENABLE=0 -DPROF_SHOW_Y=8 -DPROF_SHOW_X=8" ``` [noodle]: https://wiki.xxiivv.com/site/noodle.html