summaryrefslogtreecommitdiff
path: root/arm9
diff options
context:
space:
mode:
Diffstat (limited to 'arm9')
-rw-r--r--arm9/Makefile127
-rw-r--r--arm9/source/template.c160
2 files changed, 287 insertions, 0 deletions
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;
+}