summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile55
-rw-r--r--arm7/Makefile126
-rw-r--r--arm7/source/template.c98
-rw-r--r--arm9/Makefile127
-rw-r--r--arm9/source/template.c160
5 files changed, 566 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..e9e881e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,55 @@
+#---------------------------------------------------------------------------------
+.SUFFIXES:
+#---------------------------------------------------------------------------------
+ifeq ($(strip $(DEVKITARM)),)
+$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
+endif
+
+export TARGET := $(shell basename $(CURDIR))
+export TOPDIR := $(CURDIR)
+
+# specify a directory which contains the nitro filesystem
+# this is relative to the Makefile
+NITRO_FILES :=
+
+# These set the information text in the nds file
+#GAME_TITLE := My Wonderful Homebrew
+#GAME_SUBTITLE1 := built with devkitARM
+#GAME_SUBTITLE2 := http://devitpro.org
+
+include $(DEVKITARM)/ds_rules
+
+.PHONY: checkarm7 checkarm9 clean
+
+#---------------------------------------------------------------------------------
+# main targets
+#---------------------------------------------------------------------------------
+all: checkarm7 checkarm9 $(TARGET).nds
+
+#---------------------------------------------------------------------------------
+checkarm7:
+ $(MAKE) -C arm7
+
+#---------------------------------------------------------------------------------
+checkarm9:
+ $(MAKE) -C arm9
+
+#---------------------------------------------------------------------------------
+$(TARGET).nds : $(NITRO_FILES) arm7/$(TARGET).elf arm9/$(TARGET).elf
+ ndstool -c $(TARGET).nds -7 arm7/$(TARGET).elf -9 arm9/$(TARGET).elf \
+ -b $(GAME_ICON) "$(GAME_TITLE);$(GAME_SUBTITLE1);$(GAME_SUBTITLE2)" \
+ $(_ADDFILES)
+
+#---------------------------------------------------------------------------------
+arm7/$(TARGET).elf:
+ $(MAKE) -C arm7
+
+#---------------------------------------------------------------------------------
+arm9/$(TARGET).elf:
+ $(MAKE) -C arm9
+
+#---------------------------------------------------------------------------------
+clean:
+ $(MAKE) -C arm9 clean
+ $(MAKE) -C arm7 clean
+ rm -f $(TARGET).nds $(TARGET).arm7 $(TARGET).arm9
diff --git a/arm7/Makefile b/arm7/Makefile
new file mode 100644
index 0000000..a6e5bed
--- /dev/null
+++ b/arm7/Makefile
@@ -0,0 +1,126 @@
+#---------------------------------------------------------------------------------
+.SUFFIXES:
+#---------------------------------------------------------------------------------
+ifeq ($(strip $(DEVKITARM)),)
+$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
+endif
+
+include $(DEVKITARM)/ds_rules
+
+#---------------------------------------------------------------------------------
+# 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 files
+# all directories are relative to this makefile
+#---------------------------------------------------------------------------------
+BUILD := build
+SOURCES := source
+INCLUDES := include build
+DATA :=
+
+#---------------------------------------------------------------------------------
+# options for code generation
+#---------------------------------------------------------------------------------
+ARCH := -mthumb-interwork
+
+CFLAGS := -g -Wall -O2\
+ -mcpu=arm7tdmi -mtune=arm7tdmi -fomit-frame-pointer\
+ -ffast-math \
+ $(ARCH)
+
+CFLAGS += $(INCLUDE) -DARM7
+CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -fno-rtti
+
+
+ASFLAGS := -g $(ARCH)
+LDFLAGS = -specs=ds_arm7.specs -g $(ARCH) -Wl,--nmagic -Wl,-Map,$(notdir $*).map
+
+LIBS := -ldswifi7 -lmm7 -lnds7
+
+#---------------------------------------------------------------------------------
+# 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 ($(BUILD),$(notdir $(CURDIR)))
+#---------------------------------------------------------------------------------
+
+export ARM7ELF := $(CURDIR)/$(TARGET).elf
+export DEPSDIR := $(CURDIR)/$(BUILD)
+
+export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir))
+
+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)/*.*)))
+
+export OFILES := $(addsuffix .o,$(BINFILES)) \
+ $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
+
+export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
+ $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
+ -I$(CURDIR)/$(BUILD)
+
+export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
+
+#---------------------------------------------------------------------------------
+# use CXX for linking C++ projects, CC for standard C
+#---------------------------------------------------------------------------------
+ifeq ($(strip $(CPPFILES)),)
+#---------------------------------------------------------------------------------
+ export LD := $(CC)
+#---------------------------------------------------------------------------------
+else
+#---------------------------------------------------------------------------------
+ export LD := $(CXX)
+#---------------------------------------------------------------------------------
+endif
+#---------------------------------------------------------------------------------
+
+.PHONY: $(BUILD) clean
+
+#---------------------------------------------------------------------------------
+$(BUILD):
+ @[ -d $@ ] || mkdir -p $@
+ @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
+
+#---------------------------------------------------------------------------------
+clean:
+ @echo clean ...
+ @rm -fr $(BUILD) *.elf
+
+
+#---------------------------------------------------------------------------------
+else
+
+DEPENDS := $(OFILES:.o=.d)
+
+#---------------------------------------------------------------------------------
+# main targets
+#---------------------------------------------------------------------------------
+$(ARM7ELF) : $(OFILES)
+ @echo linking $(notdir $@)
+ @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@
+
+
+#---------------------------------------------------------------------------------
+# you need a rule like this for each extension you use as binary data
+#---------------------------------------------------------------------------------
+%.bin.o : %.bin
+#---------------------------------------------------------------------------------
+ @echo $(notdir $<)
+ @$(bin2o)
+
+-include $(DEPENDS)
+
+#---------------------------------------------------------------------------------------
+endif
+#---------------------------------------------------------------------------------------
diff --git a/arm7/source/template.c b/arm7/source/template.c
new file mode 100644
index 0000000..00592c3
--- /dev/null
+++ b/arm7/source/template.c
@@ -0,0 +1,98 @@
+/*---------------------------------------------------------------------------------
+
+ default ARM7 core
+
+ Copyright (C) 2005 - 2010
+ Michael Noland (joat)
+ Jason Rogers (dovoto)
+ Dave Murphy (WinterMute)
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any
+ damages arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any
+ purpose, including commercial applications, and to alter it and
+ redistribute it freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you
+ must not claim that you wrote the original software. If you use
+ this software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and
+ must not be misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+
+---------------------------------------------------------------------------------*/
+#include <nds.h>
+#include <dswifi7.h>
+#include <maxmod7.h>
+
+//---------------------------------------------------------------------------------
+void VblankHandler(void) {
+//---------------------------------------------------------------------------------
+ Wifi_Update();
+}
+
+
+//---------------------------------------------------------------------------------
+void VcountHandler() {
+//---------------------------------------------------------------------------------
+ inputGetAndSend();
+}
+
+volatile bool exitflag = false;
+
+//---------------------------------------------------------------------------------
+void powerButtonCB() {
+//---------------------------------------------------------------------------------
+ exitflag = true;
+}
+
+//---------------------------------------------------------------------------------
+int main() {
+//---------------------------------------------------------------------------------
+ // clear sound registers
+ dmaFillWords(0, (void*)0x04000400, 0x100);
+
+ REG_SOUNDCNT |= SOUND_ENABLE;
+ writePowerManagement(PM_CONTROL_REG, ( readPowerManagement(PM_CONTROL_REG) & ~PM_SOUND_MUTE ) | PM_SOUND_AMP );
+ powerOn(POWER_SOUND);
+
+ readUserSettings();
+ ledBlink(0);
+
+ irqInit();
+ // Start the RTC tracking IRQ
+ initClockIRQ();
+ fifoInit();
+ touchInit();
+
+ mmInstall(FIFO_MAXMOD);
+
+ SetYtrigger(80);
+
+ installWifiFIFO();
+ installSoundFIFO();
+
+ installSystemFIFO();
+
+ irqSet(IRQ_VCOUNT, VcountHandler);
+ irqSet(IRQ_VBLANK, VblankHandler);
+
+ irqEnable( IRQ_VBLANK | IRQ_VCOUNT | IRQ_NETWORK);
+
+ setPowerButtonCB(powerButtonCB);
+
+ // Keep the ARM7 mostly idle
+ while (!exitflag) {
+ if ( 0 == (REG_KEYINPUT & (KEY_SELECT | KEY_START | KEY_L | KEY_R))) {
+ exitflag = true;
+ }
+ swiWaitForVBlank();
+ }
+ return 0;
+}
diff --git a/arm9/Makefile b/arm9/Makefile
new file mode 100644
index 0000000..0e4fbdf
--- /dev/null
+++ b/arm9/Makefile
@@ -0,0 +1,127 @@
+#---------------------------------------------------------------------------------
+.SUFFIXES:
+#---------------------------------------------------------------------------------
+ifeq ($(strip $(DEVKITARM)),)
+$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
+endif
+
+include $(DEVKITARM)/ds_rules
+
+#---------------------------------------------------------------------------------
+# 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 files
+# all directories are relative to this makefile
+#---------------------------------------------------------------------------------
+BUILD := build
+SOURCES := source
+INCLUDES := include
+DATA :=
+
+
+#---------------------------------------------------------------------------------
+# 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 -fno-exceptions
+
+ASFLAGS := -g $(ARCH) -march=armv5te -mtune=arm946e-s
+
+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 ($(BUILD),$(notdir $(CURDIR)))
+#---------------------------------------------------------------------------------
+
+export ARM9ELF := $(CURDIR)/$(TARGET).elf
+export DEPSDIR := $(CURDIR)/$(BUILD)
+
+export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
+ $(foreach dir,$(DATA),$(CURDIR)/$(dir))
+
+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)/*.*)))
+
+#---------------------------------------------------------------------------------
+# 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)) \
+ $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
+
+export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
+ $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
+ -I$(CURDIR)/$(BUILD)
+
+export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
+
+.PHONY: $(BUILD) clean
+
+#---------------------------------------------------------------------------------
+$(BUILD):
+ @[ -d $@ ] || mkdir -p $@
+ @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
+
+#---------------------------------------------------------------------------------
+clean:
+ @echo clean ...
+ @rm -fr $(BUILD) *.elf *.nds* *.bin
+
+
+#---------------------------------------------------------------------------------
+else
+
+#---------------------------------------------------------------------------------
+# main targets
+#---------------------------------------------------------------------------------
+$(ARM9ELF) : $(OFILES)
+ @echo linking $(notdir $@)
+ @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@
+
+#---------------------------------------------------------------------------------
+# you need a rule like this for each extension you use as binary data
+#---------------------------------------------------------------------------------
+%.bin.o : %.bin
+#---------------------------------------------------------------------------------
+ @echo $(notdir $<)
+ @$(bin2o)
+
+-include $(DEPSDIR)/*.d
+
+#---------------------------------------------------------------------------------------
+endif
+#---------------------------------------------------------------------------------------
diff --git a/arm9/source/template.c b/arm9/source/template.c
new file mode 100644
index 0000000..ca4f43e
--- /dev/null
+++ b/arm9/source/template.c
@@ -0,0 +1,160 @@
+/* DS Homebrew demo.
+ * Written by mr b0nk 500 <b0nk@b0nk.xyz>.
+ */
+
+
+#include <nds.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+struct vec2d {
+ float x;
+ float y;
+};
+
+struct player {
+ struct vec2d pos;
+ struct vec2d delta;
+ float max_vel;
+ float accel;
+ int w;
+ int h;
+};
+
+void init_player(struct player *p, float x, float y, float max_vel, float accel, int w, int h) {
+ p->pos.x = x;
+ p->pos.y = y;
+ p->delta.x = 0;
+ p->delta.y = 0;
+ p->max_vel = max_vel;
+ p->accel = accel;
+ p->w = w;
+ p->h = h;
+}
+
+int main() {
+ touchPosition old_touch;
+ touchPosition touch;
+
+ memset(&old_touch, 0, sizeof(old_touch));
+ memset(&touch, 0, sizeof(touch));
+
+ videoSetMode(MODE_0_2D);
+ videoSetModeSub(MODE_0_2D);
+
+ vramSetBankC(VRAM_C_MAIN_BG);
+ vramSetBankD(VRAM_D_SUB_SPRITE);
+
+ /*oamInit(&oamMain, SpriteMapping_1D_32, false);*/
+ oamInit(&oamSub, SpriteMapping_1D_32, false);
+
+ /*u16 *main_gfx = oamAllocateGfx(&oamMain, SpriteSize_16x16, SpriteColorFormat_256Color);*/
+ u16 *sub_gfx = oamAllocateGfx(&oamSub, SpriteSize_16x16, SpriteColorFormat_256Color);
+
+ videoSetMode(MODE_0_2D);
+
+ for (int i = 0; i < (16*16)/2; i++) {
+ /*main_gfx[i] = 1 | BIT(8);*/
+ sub_gfx[i] = 1 | BIT(8);
+ }
+
+ /*SPRITE_PALETTE[1] = RGB15(31,0,0);*/
+ SPRITE_PALETTE_SUB[1] = RGB15(0,31,0);
+ consoleInit(0, 0, BgType_Text4bpp, BgSize_T_256x256, 31, 0, true, true);
+
+ struct player ply;
+ struct vec2d drag_speed = {0, 0};
+ int max_x = 256;
+ int min_x = 0;
+ int max_y = 192;
+ int min_y = 0;
+ int frame_step = 0;
+ int pause = 0;
+ init_player(&ply, 100, 100, 5.25f, 0.25f, 16, 16);
+ min_x -= ply.w;
+ min_y -= ply.h;
+
+ for (;;) {
+ scanKeys();
+ int pressed = keysDown();
+ int held = keysHeld();
+
+ frame_step = (pressed & KEY_R) ? !frame_step : frame_step;
+ pause = (pressed & KEY_SELECT) ? !pause : pause;
+ frame_step = (pressed & KEY_SELECT) ? 0 : frame_step;
+ pause = (frame_step) ? 1 : pause;
+
+ if (!pause || frame_step) {
+ int up = held & KEY_UP;
+ int down = held & KEY_DOWN;
+ int left = held & KEY_LEFT;
+ int right = held & KEY_RIGHT;
+ int is_decel_x = (!left && ply.delta.x < 0) || (!right && ply.delta.x > 0);
+ int is_decel_y = (!up && ply.delta.y < 0) || (!down && ply.delta.y > 0);
+
+ if (held & KEY_TOUCH) {
+ touchRead(&touch);
+ touch.px = (touch.px >= max_x+ply.w) ? max_x+ply.w : touch.px;
+ touch.py = (touch.py >= max_y+ply.h) ? max_y+ply.h : touch.py;
+ drag_speed.x = (touch.px - old_touch.px)/2;
+ drag_speed.y = (touch.py - old_touch.py)/2;
+ ply.delta = drag_speed;
+ /*ply.delta.x = drag_speed.x;
+ ply.delta.y = drag_speed.y;*/
+ ply.pos.x = touch.px;
+ ply.pos.y = touch.py;
+ old_touch = touch;
+ }
+
+ if (is_decel_x) {
+ int opposite_x = (right && ply.delta.x < 0) || (left && ply.delta.x > 0);
+ float tmp_accel = ply.accel*(opposite_x+1);
+ ply.delta.x += (ply.delta.x > 0) ? -tmp_accel : tmp_accel;
+ } else if (left || right) {
+ ply.delta.x += (right) ? ply.accel : -ply.accel;
+ }
+
+ if (is_decel_y) {
+ int opposite_y = (down && ply.delta.y < 0) || (up && ply.delta.y > 0);
+ float tmp_accel = ply.accel*(opposite_y+1);
+ ply.delta.y += (ply.delta.y > 0) ? -tmp_accel : tmp_accel;
+ } else if (up || down) {
+ ply.delta.y += (down) ? ply.accel : -ply.accel;
+ }
+
+
+
+ ply.delta.x = (ply.delta.x > ply.max_vel) ? ply.max_vel : ply.delta.x;
+ ply.delta.y = (ply.delta.y > ply.max_vel) ? ply.max_vel : ply.delta.y;
+ ply.delta.x = (ply.delta.x < -ply.max_vel) ? -ply.max_vel : ply.delta.x;
+ ply.delta.y = (ply.delta.y < -ply.max_vel) ? -ply.max_vel : ply.delta.y;
+ ply.pos.x += ply.delta.x;
+ ply.pos.y += ply.delta.y;
+ ply.pos.x = (ply.pos.x > max_x) ? min_x+(ply.delta.x-1) : ply.pos.x;
+ ply.pos.y = (ply.pos.y > max_y) ? min_y+(ply.delta.y-1) : ply.pos.y;
+ ply.pos.x = (ply.pos.x < min_x) ? max_x+(ply.delta.x+1) : ply.pos.x;
+ ply.pos.y = (ply.pos.y < min_y) ? max_y+(ply.delta.y+1) : ply.pos.y;
+ frame_step = 0;
+ }
+ if (held & KEY_START) {
+ break;
+ }
+
+ /*oamSet(&oamMain, 0, x, y, 0, 0, SpriteSize_16x16, SpriteColorFormat_256Color, main_gfx, -1, false, false, false, false, false);*/
+
+ oamSet(&oamSub, 0, (int)ply.pos.x, (int)ply.pos.y, 0, 0, SpriteSize_16x16, SpriteColorFormat_256Color, sub_gfx, -1, false, false, false, false, false);
+
+ swiWaitForVBlank();
+
+ printf("\x1B[5Hx: % 4.5f, y: % 4.5f\n", ply.pos.x, ply.pos.y);
+ printf("dx: % 3.5f, dy: % 3.5f\n", ply.delta.x, ply.delta.y);
+ iprintf("pause: %i, frame_step: %i\n", pause, frame_step);
+
+ /*oamUpdate(&oamMain);*/
+ oamUpdate(&oamSub);
+ }
+
+ return 0;
+}