From 9df7c643c6268975b69a80128c85b917a24be3c2 Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Wed, 9 Jun 2021 10:47:19 -0400 Subject: Initial commit. --- Makefile | 55 +++++++++++++++++ arm7/Makefile | 126 ++++++++++++++++++++++++++++++++++++++ arm7/source/template.c | 98 ++++++++++++++++++++++++++++++ arm9/Makefile | 127 +++++++++++++++++++++++++++++++++++++++ arm9/source/template.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 566 insertions(+) create mode 100644 Makefile create mode 100644 arm7/Makefile create mode 100644 arm7/source/template.c create mode 100644 arm9/Makefile create mode 100644 arm9/source/template.c 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=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=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 +#include +#include + +//--------------------------------------------------------------------------------- +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=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 . + */ + + +#include +#include +#include +#include +#include + +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; +} -- cgit v1.2.3-13-gbd6f