diff --git a/.gitignore b/.gitignore index c189660..e2a3e34 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ bin -obj-generic -obj-3ds +obj-* pilang2 *.smdh *.elf *.3dsx +*.nds diff --git a/Makefile b/Makefile index 9742019..24fbc5b 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,13 @@ generic: @mv Makefile Makefile-3ds | cat @mv Makefile.bak Makefile | cat +nds: + @mv Makefile Makefile.bak + @mv Makefile-nds Makefile + @make | cat + @mv Makefile Makefile-nds | cat + @mv Makefile.bak Makefile | cat + clean: @mv Makefile Makefile.bak @mv Makefile-3ds Makefile diff --git a/Makefile-nds b/Makefile-nds new file mode 100644 index 0000000..64e10c7 --- /dev/null +++ b/Makefile-nds @@ -0,0 +1,172 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +include $(DEVKITARM)/ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +# DATA is a list of directories containing binary data +# GRAPHICS is a list of directories containing files to be processed by grit +# +# All directories are specified relative to the project directory where +# the makefile is found +# +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := obj-nds +SOURCES := source +DATA := data +INCLUDES := include +GRAPHICS := gfx + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -mthumb -mthumb-interwork + +CFLAGS := -g -Wall -O2\ + -march=armv5te -mtune=arm946e-s -fomit-frame-pointer\ + -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM9 +CXXFLAGS := $(CFLAGS) -fno-rtti -std=c++17 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lnds9 + + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(LIBNDS) + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- + + +ifneq ($(BUILDDIR), $(CURDIR)) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) \ + $(foreach dir,$(GRAPHICS),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) +BMPFILES := $(foreach dir,$(GRAPHICS),$(notdir $(wildcard $(dir)/*.bmp))) +PNGFILES := $(foreach dir,$(GRAPHICS),$(notdir $(wildcard $(dir)/*.png))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(BMPFILES:.bmp=.o) \ + $(PNGFILES:.png=.o) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-iquote $(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) -I$(CURDIR)/wrappers/nds + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) BUILDDIR=`cd $(BUILD) && pwd` --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -rf $(BUILD) $(TARGET).elf $(TARGET).nds $(TARGET).ds.gba + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).nds : $(OUTPUT).elf +$(OUTPUT).elf : $(OFILES) + + +#--------------------------------------------------------------------------------- +# The bin2o rule should be copied and modified +# for each extension used in the data directories +#--------------------------------------------------------------------------------- + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .bin extension +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .raw extension +#--------------------------------------------------------------------------------- +%.raw.o : %.raw +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------- +# This rule creates assembly source files using grit +# grit takes an image file and a .grit describing how the file is to be processed +# add additional rules like this for each image extension +# you use in the graphics folders +#--------------------------------------------------------------------------------- +%.s %.h : %.bmp %.grit +#--------------------------------------------------------------------------------- + grit $< -fts -o$* + +#--------------------------------------------------------------------------------- +%.s %.h : %.png %.grit +#--------------------------------------------------------------------------------- + grit $< -fts -o$* + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/wrappers/nds/wrapper.hh b/wrappers/nds/wrapper.hh new file mode 100644 index 0000000..207302e --- /dev/null +++ b/wrappers/nds/wrapper.hh @@ -0,0 +1,67 @@ +#include +#include + +int _main(int argc, char *argv[]); +class exitexc : public std::string {}; +static int exitcode = 0; +static Keyboard *swkbd; + +PrintConsole topScreen; +PrintConsole bottomScreen; + + +void kbfeedback(int key) { + if (key > 0) printf("%c", key); +} + +void wait_for_gpkey(u32 key) { + u32 kDown; + while (true) { + scanKeys(); + kDown = keysDown(); + if (kDown & key) { + break; + } + } +} + +int main(void) { + using namespace std; + // Intialise stuff + consoleDemoInit(); + swkbd = keyboardDemoInit(); + swkbd->OnKeyPressed = kbfeedback; + // Generate argc and argv + char *argv[2] = {(char*)"/proc/self/exe", (char*)"/main.pil"}; + int argc = 1; + ifstream f("/main.pil"); + if (f.good()) { + argc = 2; + } + // Run actual main + int res; + try { + res = _main(argc, argv); + } catch (exitexc) { + res = exitcode; + } + // Print message and wait for key to be pressed + clog << endl << "Interpreter returned " << res << endl; + clog << "Press START to exit" << flush; + wait_for_gpkey(KEY_START); + // Exit + return res; +} + +std::stringstream readkbd(std::string hint) { + std::string outstr; + std::getline(std::cin, outstr); + std::stringstream out; + out << outstr; + return out; +} + +void _exit(int code) { + exitcode = code; + throw exitexc(); +}