From 88bf3b7d2996c366b0ed3e64afe402d03cc49d57 Mon Sep 17 00:00:00 2001 From: Yatis Date: Fri, 12 Mar 2021 11:47:20 +0100 Subject: [PATCH] Gintracer v0.8.0 - Library @add * create library instead of an addin * before: sources -> addin * now: sources -> library (-> addin (optionnal)) * configuration script that allow format, type and other options * generate `gintrace-fx.a` for monochrom calculator * generate `gintrace-cg.a` for prizm calculator * generate demo addin (same addin that before) @fix * fix fx9860g compilation (it is not a support !) --- .gitignore | 3 +- Makefile | 533 ++++++++++++++++------- TODO.txt => TODO | 6 +- {assets-cg => assets/cg}/icon-cg-sel.png | Bin {assets-cg => assets/cg}/icon-cg-uns.png | Bin {assets-fx => assets/fx}/icon-fx.png | Bin configure | 191 ++++++++ {src => demo}/main.c | 0 gintrace.g3a | Bin 119828 -> 119924 bytes libgintrace-cg.a | Bin 0 -> 115316 bytes project.cfg | 88 ---- src/gui/input.c | 27 +- src/menu/disasm.c | 2 +- src/menu/internal/dictionary/notes.c | 2 +- src/menu/internal/dictionary/syscalls.c | 4 +- 15 files changed, 587 insertions(+), 269 deletions(-) rename TODO.txt => TODO (67%) rename {assets-cg => assets/cg}/icon-cg-sel.png (100%) rename {assets-cg => assets/cg}/icon-cg-uns.png (100%) rename {assets-fx => assets/fx}/icon-fx.png (100%) create mode 100755 configure rename {src => demo}/main.c (100%) create mode 100644 libgintrace-cg.a delete mode 100644 project.cfg diff --git a/.gitignore b/.gitignore index dd07bff..5e44124 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -build-* +build* +*.cfg diff --git a/Makefile b/Makefile index 370dbbb..e67b518 100644 --- a/Makefile +++ b/Makefile @@ -1,208 +1,417 @@ #! /usr/bin/make -f -# Default Makefile for fxSDK add-ins. This file was probably copied there by -# the [fxsdk] program. #--- - # -# Configuration +# gintrace project Makefile # +# Build architecture: +# build/ +# |-- libraries/ +# | |-- static/ +# | | |-- fx/ +# | | | |-- gui_display.o +# | | | |-- gui_menu.o +# | | | ... +# | | | `-- ubc_handler.o +# | | `-- cg/ +# | | |-- gui_display.o +# | | |-- gui_menu.o +# | | ... +# | | `-- ubc_handler.o +# | `-- dynamic/ +# | |-- fx/ +# | | |-- gui_display.o +# | | |-- gui_menu.o +# | | ... +# | | `-- ubc_handler.o +# | `-- cg/ +# | |-- gui_display.o +# | |-- gui_menu.o +# | ... +# | `-- ubc_handler.o +# `-- demo/ +# |-- fx/ +# | |-- main.o +# | `-- map (ELF link map informations) +# `-- cg/ +# |-- main.o +# `-- map +# +#--- +MAJOR := 0 +MINOR := 8 +PATCH := 0 +EXTRAVERSION := -include project.cfg -# Compiler flags -CFLAGSFX = $(CFLAGS) $(CFLAGS_FX) $(INCLUDE_FX) -CFLAGSCG = $(CFLAGS) $(CFLAGS_CG) $(INCLUDE_CG) -# Linker flags -LDFLAGSFX := $(LDFLAGS) $(LDFLAGS_FX) -LDFLAGSCG := $(LDFLAGS) $(LDFLAGS_CG) -# Dependency list generation flags -depflags = -MMD -MT $@ -MF $(@:.o=.d) -MP -# ELF to binary flags -BINFLAGS := -R .bss -R .gint_bss +#--- +# Build rules +#--- +# Make selects the first rule set when you type "make" but, in our case, we are +# going to generate most of the rules. So, we set a placeholder to force the +# "all" rule to be the "first" rule +first: all -# G1A and G3A generation flags -NAME_G1A ?= $(NAME) -NAME_G3A ?= $(NAME) -G1AF := -i "$(ICON_FX)" -n "$(NAME_G1A)" --internal="$(INTERNAL)" -G3AF := -n basic:"$(NAME_G3A)" -i uns:"$(ICON_CG_UNS)" -i sel:"$(ICON_CG_SEL)" +# display the library version +version: + @echo "$(MAJOR).$(MINOR).$(PATCH)$(EXTRAVERSION)" -ifeq "$(TOOLCHAIN_FX)" "" -TOOLCHAIN_FX := sh3eb-elf +# Display helper +help: + @ echo 'Rules listing:' + @ echo '... all the default, if no target is provided' + @ echo '... clean remove build object' + @ echo '... fclean remove all generated object' + @ echo '... re same as `make fclean all`' + @ echo '... version display version' + @ echo '... install install the library' + @ echo '... uninstall uninstall the library' + +.PHONY: help version first + + + + +#--- +# Build configuration +#--- +# Require configuration file +CONFIG := gintrace.cfg +ifeq "$(wildcard $(CONFIG))" "" +$(error "config file $(CONFIG) does not exist (you should use `./configure`") endif +include $(CONFIG) -ifeq "$(TOOLCHAIN_CG)" "" -TOOLCHAIN_CG := sh4eb-elf -endif +# color definition, for swagg :D +red := \033[1;31m +green := \033[1;32m +blue := \033[1;34m +white := \033[1;37m +nocolor := \033[1;0m -# fxconv flags -FXCONVFX := --fx --toolchain=$(TOOLCHAIN_FX) -FXCONVCG := --cg --toolchain=$(TOOLCHAIN_CG) +# common information for FX platform +FX_INCLUDE := -I include -I . +FX_CFLAGS := -Wall -Wextra -Os + +# common information for CG platform +CG_INCLUDE := -I include -I . +CG_CFLAGS := -Wall -Wextra -Os # Determine the compiler install and include path -GCC_BASE_FX := $(shell $(TOOLCHAIN_FX)-gcc --print-search-dirs | grep install | sed 's/install: //') -GCC_BASE_CG := $(shell $(TOOLCHAIN_CG)-gcc --print-search-dirs | grep install | sed 's/install: //') +GCC_BASE_FX := $(shell sh-elf-gcc --print-search-dirs | grep install | sed 's/install: //') +GCC_BASE_CG := $(shell sh-elf-gcc --print-search-dirs | grep install | sed 's/install: //') GCC_INCLUDE_FX := $(GCC_BASE_FX)/include GCC_INCLUDE_CG := $(GCC_BASE_CG)/include -# -# File listings -# -NULL := -TARGET := $(subst $(NULL) $(NULL),-,$(NAME)) +#--- +# Generate building rules +#--- +# This function will generate compilation rule for each sources. +# @params: +# *1 - source file pathname +# *2 - build directory path (output) +# *3 - C flags +# *4 - compiler name +# *5 - variable name (which store generated output filename) +# *6 - workaround to remove unwanted pathname information (src or demo) +# *7 - workaround to avoid undefined behaviour with $(eval $(call ...)) +define generate-compilation-rule +# generate the rule name +# @note: +# This is also the object filename, so to avoid multiple object filename +# generation, we save it into one variable that will be added to the given +# variable (arg $5), which list all object name. +object-$7-filename := $(patsubst $6_%,$2/%.o,$(subst /,_,$(basename $1))) -ifeq "$(TARGET_FX)" "" -TARGET_FX := $(TARGET).g1a +# generate the rules +$$(object-$7-filename): $1 +ifeq ($(CONFIG.VERBOSE),true) + @ mkdir -p $$(dir $$@) + @ echo "$6 - $2 - $1" + $4 $3 -o $$@ -c $$< +else + @ mkdir -p $$(dir $$@) + @ printf "$(green)>$(nocolor) $(white)$$@$(nocolor)\n" + @ $4 $3 -o $$@ -c $$< endif -ifeq "$(TARGET_CG)" "" -TARGET_CG := $(TARGET).g3a +# update the object fileame list, used by the main rule +$5 += $$(object-$7-filename) +endef + +# Function that will generate all rules for building each library. +# @params: +# *1 - format (dynamic/static) +# *2 - platform (fx/cg) +# *3 - source files list +# *4 - library name (without extra information ("gintrace" not "gintrace.a")) +# *5 - variable name (target list) +define generate-target-library +# generate common information +tname := $4-$2 +target-$(tname)-build := build/library/$1/$2 +target-$(tname)-build-src := build/library/$1/$2 + +# generate platform specific flags +ifeq ($2,fx) + target-$(tname)-cflags := -D FX9860G -m3 + target-$(tname)-cflags += $(FX_INCLUDE) $(FX_CFLAGS) +endif +ifeq ($2,cg) + target-$(tname)-cflags := -D FXCG50 -m4-nofpu + target-$(tname)-cflags += $(CG_INCLUDE) $(CG_CFLAGS) endif -ELF_FX := build-fx/$(shell basename "$(TARGET_FX)" .g1a).elf -BIN_FX := $(ELF_FX:.elf=.bin) - -ELF_CG := build-cg/$(shell basename "$(TARGET_CG)" .g3a).elf -BIN_CG := $(ELF_CG:.elf=.bin) - -# Source files -src := $(wildcard src/*.[csS] \ - src/*/*.[csS] \ - src/*/*/*.[csS] \ - src/*/*/*/*.[csS]) -assets-fx := $(wildcard assets-fx/*/*) -assets-cg := $(wildcard assets-cg/*/*) - -# Object files -obj-fx := $(src:%=build-fx/%.o) \ - $(assets-fx:assets-fx/%=build-fx/assets/%.o) -obj-cg := $(src:%=build-cg/%.o) \ - $(assets-cg:assets-cg/%=build-cg/assets/%.o) - -# Additional dependencies -deps-fx := $(ICON_FX) -deps-cg := $(ICON_CG_UNS) $(ICON_CG_SEL) - -# All targets -all := -ifneq "$(wildcard build-fx)" "" -all += all-fx +# generate format-specific flags +ifeq ($1,static) + target-$(tname)-ldflags := + target-$(tname)-cflags += -mb -ffreestanding -nostdlib + target-$(tname)-cflags += -fstrict-volatile-bitfields + target-$(tname)-exec := lib$4-$2.a + target-$(tname)-gcc := $(CONFIG.TOOLCHAIN)-gcc + target-$(tname)-ar := $(CONFIG.TOOLCHAIN)-ar endif -ifneq "$(wildcard build-cg)" "" -all += all-cg +ifeq ($1,dynamic) + target-$(tname)-ldflags := -shared -T dynlib.ld + target-$(tname)-ldflags += -Wl,-Map=$$(target-$(tname)-build)/map + target-$(tname)-ldflags += -Wl,-soname=$4-$2 + target-$(tname)-cflags += -mb -ffreestanding -nostdlib + target-$(tname)-cflags += -fstrict-volatile-bitfields -fPIC + target-$(tname)-exec := lib$4-$2-$(MAJOR).$(MINOR).$(PATCH).so + target-$(tname)-gcc := $(CONFIG.TOOLCHAIN)-gcc + target-$(tname)-ar := $(CONFIG.TOOLCHAIN)-ar endif -# -# Build rules -# +# generate compilation rules and generate all object filename into the +# object list variable, this will be used by the `main` rule +target-$(tname)-obj := +$$(foreach source,$3,$$(eval \ + $$(call generate-compilation-rule,$$(source),\ + $$(target-$(tname)-build-src),$$(target-$(tname)-cflags),\ + $$(target-$(tname)-gcc),target-$(tname)-obj,src,$(tname))\ +)) -all: $(all) +# Register the library building rule name +# @note: +# This rule list is used by the main compiling rule like a dependency. And it's +# this dependency that will involve all generated rules for building each +# libraries. +$5 += $$(target-$(tname)-exec) -all-fx: $(TARGET_FX) -all-cg: $(TARGET_CG) +# Generate the "linking" rule +$$(target-$(tname)-exec): $$(target-$(tname)-obj) + @ mkdir -p $$(dir $$@) + @ printf "$(blue)Create the library $(red)$$@$(nocolor)\n" +ifeq ($1,dynamic) + $$(target-$(tname)-gcc) $$(target-$(tname)-ldflags) \ + -o $$@ $$^ -nostdlib -lgcc +else + $$(target-$(tname)-ar) crs $$@ $$^ +endif +endef -$(TARGET_FX): $(obj-fx) $(deps-fx) - @ mkdir -p $(dir $@) - $(TOOLCHAIN_FX)-gcc -o $(ELF_FX) $(obj-fx) $(CFLAGSFX) $(LDFLAGSFX) - $(TOOLCHAIN_FX)-objcopy -O binary $(BINFLAGS) $(ELF_FX) $(BIN_FX) - fxg1a $(BIN_FX) -o $@ $(G1AF) +# Function that will generate all rules for building each demo addin +# @params: +# *1 - platform (fx/cg) +# *2 - source files list +# *3 - library name (without extra information ("gintrace" not "gintrace.a")) +# *4 - variable name (target list) +define generate-target-demo +# generate path information +tname := $3-$1 +target-$(tname)-build := build/demo/$1 +target-$(tname)-build-src := build/demo/$1 -$(TARGET_CG): $(obj-cg) $(deps-cg) - @ mkdir -p $(dir $@) - $(TOOLCHAIN_CG)-gcc -o $(ELF_CG) $(obj-cg) $(CFLAGSCG) $(LDFLAGSCG) - $(TOOLCHAIN_CG)-objcopy -O binary $(BINFLAGS) $(ELF_CG) $(BIN_CG) - mkg3a $(G3AF) $(BIN_CG) $@ +# generate common information +target-$(tname)-elf := $$(target-$(tname)-build)/$3-$1.elf +target-$(tname)-bin := $$(target-$(tname)-build)/$3-$1.bin +target-$(tname)-cflags := -mb -ffreestanding -nostdlib +target-$(tname)-cflags += -fstrict-volatile-bitfields +target-$(tname)-ldflags := -Wl,-Map=$$(target-$(tname)-build)/map +target-$(tname)-gcc := $(CONFIG.TOOLCHAIN)-gcc +target-$(tname)-objcopy := $(CONFIG.TOOLCHAIN)-objcopy -# C sources -build-fx/%.c.o: %.c - @ mkdir -p $(dir $@) - $(TOOLCHAIN_FX)-gcc -c $< -o $@ $(CFLAGSFX) $(depflags) -build-cg/%.c.o: %.c - @ mkdir -p $(dir $@) - $(TOOLCHAIN_CG)-gcc -c $< -o $@ $(CFLAGSCG) $(depflags) +# generate platform specific flags +ifeq ($1,fx) + target-$(tname)-cflags += -D FX9860G -m3 + target-$(tname)-ldflags += -T fx9860g.ld + target-$(tname)-libs := -L. -L $(GCC_INCLUDE_FX) + target-$(tname)-libs += -lgintrace-fx -lgint-fx -lgcc + target-$(tname)-exec := $3.g1a +endif +ifeq ($1,cg) + target-$(tname)-cflags += -D FXCG50 -m4-nofpu + target-$(tname)-ldflags += -T fxcg50.ld + target-$(tname)-libs := -L. -L $(GCC_INCLUDE_CG) + target-$(tname)-libs += -lgintrace-cg -lgint-cg -lgcc + target-$(tname)-exec := $3.g3a +endif -# Assembler sources -build-fx/%.s.o: %.s - @ mkdir -p $(dir $@) - $(TOOLCHAIN_FX)-gcc -c $< -o $@ -build-cg/%.s.o: %.s - @ mkdir -p $(dir $@) - $(TOOLCHAIN_CG)-gcc -c $< -o $@ +# generate compilation rules and generate all object filename +target-$(tname)-obj := +$$(foreach source,$2,$$(eval \ + $$(call generate-compilation-rule,$$(source),\ + $$(target-$(tname)-build-src),$$(target-$(tname)-cflags),\ + $$(target-$(tname)-gcc),target-$(tname)-obj,demo,$(tname))\ +)) -# Preprocessed assembler sources -build-fx/%.S.o: %.S - @ mkdir -p $(dir $@) - $(TOOLCHAIN_FX)-gcc -c $< -o $@ $(INCLUDE_FX) -build-cg/%.S.o: %.S - @ mkdir -p $(dir $@) - $(TOOLCHAIN_CG)-gcc -c $< -o $@ $(INCLUDE_CG) +# Register the demo building rule name +$4 += $$(target-$(tname)-exec) -# Images -build-fx/assets/img/%.o: assets-fx/img/% - @ mkdir -p $(dir $@) - fxconv --bopti-image $< -o $@ $(FXCONVFX) name:img_$(basename $*) $(IMG.$*) -build-cg/assets/img/%.o: assets-cg/img/% - @ mkdir -p $(dir $@) - fxconv --bopti-image $< -o $@ $(FXCONVCG) name:img_$(basename $*) $(IMG.$*) +# Generate the addin main rule +$$(target-$(tname)-exec): $$(target-$(tname)-obj) + @ mkdir -p $$(dir $$@) + @ printf "$(blue)Create the demo addin $(red)$$@$(nocolor)\n" + $$(target-$(tname)-gcc) $$(target-$(tname)-cflags) \ + $$(target-$(tname)-ldflags) -o $$(target-$(tname)-elf) \ + $$(target-$(tname)-obj) $$(target-$(tname)-libs) + $$(target-$(tname)-objcopy) -O binary -R .bss -R .gint_bss \ + $$(target-$(tname)-elf) $$(target-$(tname)-bin) +ifeq ($1,fx) + fxg1a $$(target-$(tname)-bin) -o $$@ -i "assets/fx/icon-fx.png" +else + mkg3a -n basic:"$3" -i uns:"assets/cg/icon-cg-uns.png" \ + -i sel:"assets/cg/icon-cg-sel.png" $$(target-$(tname)-bin) $$@ +endif +endef -# Fonts -build-fx/assets/fonts/%.o: assets-fx/fonts/% - @ mkdir -p $(dir $@) - fxconv -f $< -o $@ $(FXCONVFX) name:font_$(basename $*) $(FONT.$*) -build-cg/assets/fonts/%.o: assets-cg/fonts/% - @ mkdir -p $(dir $@) - fxconv -f $< -o $@ $(FXCONVCG) name:font_$(basename $*) $(FONT.$*) -# Binaries -build-fx/assets/bin/%.o: assets-fx/bin/% - @ mkdir -p $(dir $@) - fxconv -b $< -o $@ $(FXCONVFX) name:bin_$(basename $*) $(BIN.$*) -build-cg/assets/bin/%.o: assets-cg/bin/% - @ mkdir -p $(dir $@) - fxconv -b $< -o $@ $(FXCONVCG) name:bin_$(basename $*) $(BIN.$*) -# Custom conversions -build-fx/assets/%.o: assets-fx/% - @ mkdir -p $(dir $@) - fxconv --custom $< -o $@ $(FXCONVFX) type:$(subst /,,$(dir $*)) name:$(subst /,_,$(basename $*)) -build-cg/assets/%.o: assets-cg/% - @ mkdir -p $(dir $@) - fxconv --custom $< -o $@ $(FXCONVCG) type:$(subst /,,$(dir $*)) name:$(subst /,_,$(basename $*)) -# -# Cleaning and utilities -# +#--- +# Generate all building rules for the "library" part +#--- +# find sources files +target-lib-directory := $(shell find src -not -path "*/\.*" -type d) +target-lib-src := $(foreach path,$(target-lib-directory), \ + $(wildcard $(path)/*.c) \ + $(wildcard $(path)/*.S) \ + $(wildcard $(path)/*.s)) -# Dependency information --include $(shell find build* -name *.d 2> /dev/null) -build-fx/%.d: ; -build-cg/%.d: ; -.PRECIOUS: build-fx build-cg build-fx/%.d build-cg/%.d %/ +# generate all library rules +target-lib-list := +$(foreach format,$(CONFIG.FORMAT),\ + $(foreach platform,$(CONFIG.PLATFORM),$(eval \ + $(call generate-target-library,$(format),$(platform),\ + $(target-lib-src),gintrace,target-lib-list) \ + ))\ +) -clean-fx: - @ rm -rf build-fx/ -clean-cg: - @ rm -rf build-cg/ +#--- +# Generate all building rules for the "demo" part, if requested +#--- +target-demo_list := +ifeq ($(CONFIG.DEMO),true) +# find source files +target-demo-directory := $(shell find demo -not -path "*/\.*" -type d) +target-demo-src := $(foreach path,$(target-demo-directory), \ + $(wildcard $(path)/*.c) \ + $(wildcard $(path)/*.S) \ + $(wildcard $(path)/*.s)) -distclean-fx: clean-fx - @ rm -f $(TARGET_FX) -distclean-cg: clean-cg - @ rm -f $(TARGET_CG) +# generate all demo rules +target-demo-list := +$(foreach platform,$(CONFIG.PLATFORM),$(eval \ + $(call generate-target-demo,$(platform),\ + $(target-demo-src),gintrace,target-demo-list) \ +)) +endif -clean: clean-fx clean-cg -distclean: distclean-fx distclean-cg -install-fx: $(TARGET_FX) - p7 send -f $< -install-cg: $(TARGET_CG) - @ while [[ ! -h /dev/Prizm1 ]]; do sleep 0.25; done - @ while ! mount /dev/Prizm1; do sleep 0.25; done - @ rm -f /mnt/prizm/$< - @ cp $< /mnt/prizm - @ umount /dev/Prizm1 - @- eject /dev/Prizm1 -.PHONY: all all-fx all-cg clean distclean install-fx install-cg +#--- +# Build rules +#--- +all: $(target-lib-list) $(target-demo-list) + +.PHONY: all + + + + +#--- +# Generate installation rules (library only) +#--- +# Common rules generated for the installation of each libraries. +# Basically, it will generate -install and -uninstall rules +# @note: +# *1 - library pathname +# *2 - variable name (installation rules list) +# *3 - variable name (uninstallation rules list) +define generate-install-rule +# Generate the installation rule +$(basename $(notdir $1))-install: + install -d $(CONFIG.PREFIX) + install $1 -m 644 $(CONFIG.PREFIX) + +# Generate the uninstallation rule +$(basename $(notdir $1))-uninstall: + rm -f $(CONFIG.PREFIX)$(notdir $1) + +# Register generated rules into their appropriate list +$2 += $(basename $(notdir $1))-install +$3 += $(basename $(notdir $1))-uninstall +endef + +# Generate all installation/uninstallation rules +target-install-rules := +target-uninstall-rules := +$(foreach target,$(target-lib-list),$(eval \ + $(call generate-install-rule,$(target),\ + target-install-rules,target-uninstall-rules) \ +)) + +# Generate the path where include directory will be installed. +target-install-header-dir := $(CONFIG.PREFIX)include/ +ifeq ($(wildcard $(target-install-header-dir)gintrace/.*),) + target-install-header-dir := $(target-install-header-dir)gintrace +endif + + + + +#--- +# Installation rules +#--- +install: $(target-list) $(target-install-rules) + cp -r include/gintrace/ $(target-install-header-dir) + +uninstall: $(target-uninstall-rules) + rm -rf $(CONFIG.PREFIX)include/gintrace + + + + +#--- +# (internal) debug rule +#--- +#target-list := +#DEBUG=$(call generate-target-library,static,fx,src/gui/menu.c,gintrace,target-list) +##DEBUG=$(call generate-install-rule,/output/static/fxlibc.a) +##DEBUG=$(call generate-target-demo,fx,demo/main.c,gintrace,target-list) +##DEBUG=$(call generate-compilation-rule,demo/main.c,build/demo/fx,-Wall,sh-elf-gcc,target-list,demo) +#export DEBUG +#debug: +# @ echo "$$DEBUG" +# @ echo "target-lib: $(target-libs)" +# @ echo "generated lib: $(lib-generation-rules)" +# @ echo "target format: $(target-formats)" +# @ echo "install-rules: $(lib-installation-rules)" +# @ echo "uninstall-rules: $(lib-uninstallation-rules)" + + + + +#--- +# cleaning rules +#--- +clean: + rm -rf build +fclean: clean + rm -rf $(target-lib-list) $(target-demo-list) +re: fclean all + +.PHONY: install uninstall clean fclean re all diff --git a/TODO.txt b/TODO similarity index 67% rename from TODO.txt rename to TODO index ecf6a5e..692d95a 100644 --- a/TODO.txt +++ b/TODO @@ -3,6 +3,9 @@ * fix fx9860 support @update +* makefile: generate the demo +* makefile: handle header dependencies +* makefile: generate the documentation * context: refacto printXY() ! * hexdump: search commands * callgraph: improve user interface. @@ -13,5 +16,4 @@ * icon @feature -* transform gintracer into a librairy -* handle session (send the session instead of ucontext !) +* add documentation diff --git a/assets-cg/icon-cg-sel.png b/assets/cg/icon-cg-sel.png similarity index 100% rename from assets-cg/icon-cg-sel.png rename to assets/cg/icon-cg-sel.png diff --git a/assets-cg/icon-cg-uns.png b/assets/cg/icon-cg-uns.png similarity index 100% rename from assets-cg/icon-cg-uns.png rename to assets/cg/icon-cg-uns.png diff --git a/assets-fx/icon-fx.png b/assets/fx/icon-fx.png similarity index 100% rename from assets-fx/icon-fx.png rename to assets/fx/icon-fx.png diff --git a/configure b/configure new file mode 100755 index 0000000..e7c275a --- /dev/null +++ b/configure @@ -0,0 +1,191 @@ +#! /bin/bash +# Gint tracing library configuration script + +# output file +confile='gintrace.cfg' + +# Build options +toolchain=sh-elf +prefix= + +# lib formats +gen_platform_cg=false +gen_platform_fx=false +gen_format_static=false +gen_format_dynamic=false +gen_demo=false +gen_verbose=false + + +#--- +# Help screen +#--- +help() +{ +cat << EOF +Configuration script for the Casio calculator tracer library for the Gint +unikernel +Usage: $0 [OPTION]... + +Build options: + --toolchain=TRIPLET Build with a different toolchain (default: sh-elf-gcc) + --prefix=PREFIX Installation prefix path. "PREFIX/lib" and + "PREFIX/include" will be used. (default: we will ask + your compiler) + +Select library format: + --format=[,]... + static Generate static library (default) + dynamic Generate dynamic library + +Specific calculator support: + --platform=,, ... + fx Support monochrom caclulator (fx9860g) + cg Support color calculator (fxcg50) + all Same as "--platform=fx,cg" + +Other flags: + --help,-h Display this help message. + --version Display the librairy version. + --demo Generate demo addins using the static librairy + --verbose Makefile debug +EOF + exit 0 +} + +#--- +# Check early help options +#--- +if [[ $# -eq 1 ]] && [[ "$1" = "-h" ]] || [[ "$1" = "--help" ]]; then + help +fi + + + + +#--- +# Parsing arguments +#--- +for arg; do case "$arg" in + # Help options + --help | -h) + help;; + + # build options + --toolchain=*) + toolchain=${arg#*=};; + --prefix=*) + prefix=${arg#*=};; + + # Specific platform + --platform=*) + IFS=',' read -ra target_platform <<< "${arg#*=}" + for platform in "${target_platform[@]}"; do case "$platform" in + all) + gen_platform_fx=true + gen_platform_cg=true;; + fx) + gen_platform_fx=true;; + cg) + gen_platform_cg=true;; + *) + echo "error: unreconized target '$format', giving up." >&2 + exit 1 + esac; done;; + + # format support + --format=*) + IFS=',' read -ra target_format <<< "${arg#*=}" + for format in "${target_format[@]}"; do case "$format" in + all) + gen_format_static=true + gen_format_dynamic=true;; + static) + gen_format_static=true;; + dynamic) + gen_format_dynamic=true;; + *) + echo "error: unreconized target '$format', giving up." >&2 + exit 1 + esac; done;; + + # other flags + --demo) + gen_format_static=true + gen_demo=true;; + --verbose) + gen_verbose=true;; + + # error part + *) + echo "error: unreconized argument '$arg', giving up." >&2 + exit 1 +esac; done + + +#--- +# Check error +#--- +# If no prefix is specified, install to the GCC's build folder +if [[ -z "$prefix" ]] +then + # ask the toolchain where is his installation path + echo "No prefix specified, let's ask the compiler:" + echo " Call: \"$toolchain-gcc --print-search-dirs | grep install | sed 's/install: //'\"" + if ! inst=$("$toolchain"-gcc --print-search-dirs | grep install | sed 's/install: //'); then + echo " Call: returned $?, giving up." >&2 + exit 1 + fi + echo " Got '$inst'". + + # check if the directory exist + if [[ ! -d $inst ]]; then + echo "Directory does not exist (or is not a directory), giving up." >&2 + exit 1 + fi + prefix=$inst +fi + +# if no specific calculator has been specified, set the defaut choice +[ $gen_platform_fx = false ] && [ $gen_platform_cg = false ] && gen_platform_cg=true + +# if no format has been specified, set the default format +[ $gen_format_static = false ] && [ $gen_format_dynamic = false ] && gen_format_static=true + + + + +# TODO +# TODO: check if the wanted lib exist (check lib verion too)! +# TODO + + + +#--- +# Generate the configuration file +#--- +generate_config() +{ + # build information + echo "CONFIG.TOOLCHAIN := $toolchain" + [[ "$prefix" ]] && echo "CONFIG.PREFIX := $prefix" + + # Specific platform + echo 'CONFIG.PLATFORM :=' + [ $gen_platform_fx = true ] && echo 'CONFIG.PLATFORM += fx' + [ $gen_platform_cg = true ] && echo 'CONFIG.PLATFORM += cg' + + # formats + echo 'CONFIG.FORMAT :=' + [ $gen_format_static = true ] && echo 'CONFIG.FORMAT += static' + [ $gen_format_dynamic = true ] && echo 'CONFIG.FORMAT += dynamic' + + # other + [ $gen_demo = true ] && echo 'CONFIG.DEMO := true' + [ $gen_verbose = true ] && echo 'CONFIG.VERBOSE := true' + +} +generate_config > $confile + +echo "Configuration saved in $confile, ready to make!" +exit 0 diff --git a/src/main.c b/demo/main.c similarity index 100% rename from src/main.c rename to demo/main.c diff --git a/gintrace.g3a b/gintrace.g3a index f309e1f45fbba47d2371a3ce5c331056ecfa346f..d59a78a432922638010b7b9a87a73192e7613347 100644 GIT binary patch delta 18477 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 literal 0 HcmV?d00001 diff --git a/project.cfg b/project.cfg deleted file mode 100644 index 36174ea..0000000 --- a/project.cfg +++ /dev/null @@ -1,88 +0,0 @@ -#--- -# fxSDK project configuration file for GINTRACE -#--- - -# Project name, should be at most 8 bytes long. -# (You can also specify NAME_G1A or NAME_G3A to override individually.) -NAME := gintrace - -# Internal name, should be '@' followed by at most 7 uppercase letters. -# WARNING: If this convention is not followed, the add-in might not appear in -# the main menu of the calculator! -INTERNAL := @GTRACE - -# Output file name. The default is to take , replace spaces with dashes, -# and add .g1a (or .g3a). You can specify a different folder if you want. -TARGET_FX := -TARGET_CG := - -# fx-9860G icon location -ICON_FX = assets-fx/icon-fx.png -# fx-CG 50 icon locations -ICON_CG_UNS = assets-cg/icon-cg-uns.png -ICON_CG_SEL = assets-cg/icon-cg-sel.png - -#--- -# Toolchain selection -#--- - -# Toolchain for fx9860g. Please see also CFLAGS_FX below. -TOOLCHAIN_FX := sh-elf - -# Toolchain for fxcg50. Please see also CFLAGS_CG below. -TOOLCHAIN_CG := sh-elf - -#--- -# Compiler flags -#--- - -# Base compiler flags for the fxSDK, you usually want to keep these. -CFLAGS := -mb -ffreestanding -nostdlib -fstrict-volatile-bitfields - -# Platform-specific compiler flags. -# <> If you are using sh3eb-elf, use -m3. (You can do this on both FX and CG.) -# <> If you are using sh4eb-elf, use -m4-nofpu. (Not ideal on FX but works.) -# <> If you are using sh4eb-nofpu-elf, then your compiler will likely use the -# FPU and cause problems on the calculator. Consider another configuration. -# <> If you are using an sh-elf with several targets, specify whichever you -# support. I recommend -m3 on FX and -m4-nofpu on CG. -# Please see also TOOLCHAIN_FX and TOOLCHAIN_CG above. -CFLAGS_FX := -D FX9860G -m3 -CFLAGS_CG := -D FXCG50 -m4-nofpu - -# Additional compiler flags, change to your own taste! -CFLAGS += -Wall -Wextra -Wno-missing-field-initializers -Os - -# Include paths. Add one -I option for each folder from which you want to -# be able to include files with #include<>. The Makefile provides a variable -# GCC_INCLUDE_FX/GCC_INCLUDE_CG that represents the default include folder, -# which is useful for some libraries such as OpenLibm. -INCLUDE_FX = -I include -I . -INCLUDE_CG = -I include -I . - -# Libraries. Add one -l option for each library you are using, and also -# suitable -L options if you have library files in custom folders. To use -# fxlib, add libfx.a to the project directory and use "-L . -lfx". -LIBS_FX := -LIBS_CG := - -# Base linker flags for the fxSDK, you usually want to keep these. -LDFLAGS_FX := -T fx9860g.ld -lgint-fx $(LIBS_FX) -lgint-fx -lgcc -LDFLAGS_CG := -T fxcg50.ld -lgint-cg $(LIBS_CG) -lgint-cg -lgcc - -# Additional linker flags, if you need any. -LDFLAGS := - -# Additional platform-specific linker flags. -LDFLAGS_FX += -Wl,-Map=build-fx/map -LDFLAGS_CG += -Wl,-Map=build-cg/map - -#--- -# File conversion parameters -#--- - -# Here you can add fxconv options for each converted file, individually. -# The syntax is ".". For example, to specify the parameters for a -# font named "hexa.png", you might write: -# -# FONT.hexa.png = charset:print grid.size:3x5 grid.padding:1 diff --git a/src/gui/input.c b/src/gui/input.c index 289bd1e..adfb75e 100644 --- a/src/gui/input.c +++ b/src/gui/input.c @@ -246,9 +246,6 @@ static int input_key_buffer_update(key_event_t key_event) int input_read(char *buffer, size_t size, const char *prefix, ...) { key_event_t key; - uint16_t *secondary; - uint16_t *main; - void *tmp; int spe; /* check obvious error */ @@ -272,13 +269,17 @@ int input_read(char *buffer, size_t size, const char *prefix, ...) } /* Gint workaround to freeze the current display */ +#ifdef FXCG50 + uint16_t *secondary; + uint16_t *main; dgetvram(&main, &secondary); if (gint_vram == main) { - tmp = main; + void *tmp = main; main = secondary; secondary = tmp; } memcpy(secondary, main, 2*396*224); +#endif /* keyboard handling */ @@ -304,10 +305,7 @@ int input_write(const char *format, ...) { char buffer[512]; va_list _args; - uint16_t *secondary; - uint16_t *main; size_t size; - void *tmp; va_start(_args, format); size = vsnprintf(buffer, 512, format, _args); @@ -322,13 +320,17 @@ int input_write(const char *format, ...) input_info.buffer.max = 512; /* Gint workaround to freeze the current display */ +#ifdef FXCG50 + uint16_t *secondary; + uint16_t *main; dgetvram(&main, &secondary); if (gint_vram == main) { - tmp = main; + void *tmp = main; main = secondary; secondary = tmp; } memcpy(secondary, main, 2*396*224); +#endif /* display and wait user event */ input_info.config.cursor = 0; @@ -342,10 +344,7 @@ int input_write_noint(const char *format, ...) { char buffer[512]; va_list _args; - uint16_t *secondary; - uint16_t *main; size_t size; - void *tmp; va_start(_args, format); size = vsnprintf(buffer, 512, format, _args); @@ -360,13 +359,17 @@ int input_write_noint(const char *format, ...) input_info.buffer.max = 512; /* Gint workaround to freeze the current display */ +#ifdef FXCG50 + uint16_t *secondary; + uint16_t *main; dgetvram(&main, &secondary); if (gint_vram == main) { - tmp = main; + void *tmp = main; main = secondary; secondary = tmp; } memcpy(secondary, main, 2*396*224); +#endif /* display and wait user event */ input_info.config.cursor = 0; diff --git a/src/menu/disasm.c b/src/menu/disasm.c index 9c8bc88..573b1bb 100644 --- a/src/menu/disasm.c +++ b/src/menu/disasm.c @@ -515,7 +515,7 @@ static void disasm_command(struct tsession *session, int argc, char **argv) #ifdef FXCG50 uintptr_t *systab = *(uintptr_t **)0x8002007c; #endif - #ifdef FX9860 + #ifdef FX9860G uintptr_t *systab = *(uintptr_t **)0x8001007c; #endif if (idx == 2) { diff --git a/src/menu/internal/dictionary/notes.c b/src/menu/internal/dictionary/notes.c index 940b66b..d4c36eb 100644 --- a/src/menu/internal/dictionary/notes.c +++ b/src/menu/internal/dictionary/notes.c @@ -27,7 +27,7 @@ static void dictionary_notes_init(void) #if FXCG50 void (*GetOSVersion)(char *buffer) = (*(void ***)0x8002007c)[0x1406]; #endif -#if FX9860 +#if FX9860G void (*GetOSVersion)(char *buffer) = (*(void ***)0x8001007c)[0x2ee]; #endif diff --git a/src/menu/internal/dictionary/syscalls.c b/src/menu/internal/dictionary/syscalls.c index 71390d1..48d3a22 100644 --- a/src/menu/internal/dictionary/syscalls.c +++ b/src/menu/internal/dictionary/syscalls.c @@ -18,7 +18,7 @@ const char *dictionary_syscalls_check(void *address) * switch from user mode to privileged mode. They just jump always at * 0x80010070 and use the table of syscall addresses to redirect the * jump. (and the table address is always stored at 0x8001007c). */ - #ifdef FX9860 + #ifdef FX9860G systab = *(uint32_t **)0x8001007c; #endif #ifdef FXCG50 @@ -634,7 +634,7 @@ const struct sysname casio_syscalls[] = { }; #endif /* FXCG50 */ -#ifdef FX9860 +#ifdef FX9860G const struct sysname casio_syscalls[] = { // // Simon Lothar