diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..2e6ec3d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.15) + +project(xrbDS) + +include_directories( + include/xrbds +) + +add_library(xrbds + engine/core/engine.cpp +) + +add_subdirectory(samples/hello_world) diff --git a/Makefile b/Makefile deleted file mode 100644 index ac5130d..0000000 --- a/Makefile +++ /dev/null @@ -1,123 +0,0 @@ -#--------------------------------------------------------------------------------- -.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 -#--------------------------------------------------------------------------------- -TARGET := $(shell basename $(CURDIR)) -BUILD := build -SOURCES := gfx source data -INCLUDES := include build - -#--------------------------------------------------------------------------------- -# options for code generation -#--------------------------------------------------------------------------------- -ARCH := -march=armv5te -mtune=arm946e-s -mthumb - -CFLAGS := -g -Wall -O2 -ffunction-sections -fdata-sections\ - $(ARCH) - -CFLAGS += $(INCLUDE) -DARM9 -CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions - -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 ($(BUILD),$(notdir $(CURDIR))) -#--------------------------------------------------------------------------------- - -export OUTPUT := $(CURDIR)/$(TARGET) - -export VPATH := $(foreach dir,$(SOURCES),$(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,$(SOURCES),$(notdir $(wildcard $(dir)/*.bin))) - -#--------------------------------------------------------------------------------- -# use CXX for linking C++ projects, CC for standard C -#--------------------------------------------------------------------------------- -ifeq ($(strip $(CPPFILES)),) -#--------------------------------------------------------------------------------- - export LD := $(CC) -#--------------------------------------------------------------------------------- -else -#--------------------------------------------------------------------------------- - export LD := $(CXX) -#--------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------- - -export OFILES := $(BINFILES:.bin=.o) \ - $(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) $(TARGET).elf $(TARGET).nds $(TARGET).ds.gba - - -#--------------------------------------------------------------------------------- -else - -DEPENDS := $(OFILES:.o=.d) - -#--------------------------------------------------------------------------------- -# main targets -#--------------------------------------------------------------------------------- -$(OUTPUT).nds : $(OUTPUT).elf -$(OUTPUT).elf : $(OFILES) - -#--------------------------------------------------------------------------------- -%.o : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - $(bin2o) - - --include $(DEPENDS) - -#--------------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------------- diff --git a/clang-format b/clang-format new file mode 100644 index 0000000..6a547cf --- /dev/null +++ b/clang-format @@ -0,0 +1,238 @@ +# Commented out parameters are those with the same value as base LLVM style. +# We can uncomment them if we want to change their value, or enforce the +# chosen value in case the base style changes (last sync: Clang 17.0.6). +BasedOnStyle: LLVM +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +# AlignArrayOfStructures: None +# AlignConsecutiveAssignments: +# Enabled: false +# AcrossEmptyLines: false +# AcrossComments: false +# AlignCompound: false +# PadOperators: true +# AlignConsecutiveBitFields: +# Enabled: false +# AcrossEmptyLines: false +# AcrossComments: false +# AlignCompound: false +# PadOperators: false +# AlignConsecutiveDeclarations: +# Enabled: false +# AcrossEmptyLines: false +# AcrossComments: false +# AlignCompound: false +# PadOperators: false +# AlignConsecutiveMacros: +# Enabled: false +# AcrossEmptyLines: false +# AcrossComments: false +# AlignCompound: false +# PadOperators: false +# AlignConsecutiveShortCaseStatements: +# Enabled: false +# AcrossEmptyLines: false +# AcrossComments: false +# AlignCaseColons: false +# AlignEscapedNewlines: Right +AlignOperands: DontAlign +AlignTrailingComments: + Kind: Never + OverEmptyLines: 0 +# AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: false +# AllowShortBlocksOnASingleLine: Never +# AllowShortCaseLabelsOnASingleLine: false +# AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: Inline +# AllowShortIfStatementsOnASingleLine: Never +# AllowShortLambdasOnASingleLine: All +# AllowShortLoopsOnASingleLine: false +# AlwaysBreakAfterDefinitionReturnType: None +# AlwaysBreakAfterReturnType: None +# AlwaysBreakBeforeMultilineStrings: false +# AlwaysBreakTemplateDeclarations: MultiLine +# AttributeMacros: +# - __capability +# BinPackArguments: true +# BinPackParameters: true +# BitFieldColonSpacing: Both +# BraceWrapping: +# AfterCaseLabel: false +# AfterClass: false +# AfterControlStatement: Never +# AfterEnum: false +# AfterFunction: false +# AfterNamespace: false +# AfterObjCDeclaration: false +# AfterStruct: false +# AfterUnion: false +# AfterExternBlock: false +# BeforeCatch: false +# BeforeElse: false +# BeforeLambdaBody: false +# BeforeWhile: false +# IndentBraces: false +# SplitEmptyFunction: true +# SplitEmptyRecord: true +# SplitEmptyNamespace: true +# BreakAfterAttributes: Never +# BreakAfterJavaFieldAnnotations: false +# BreakArrays: true +# BreakBeforeBinaryOperators: None +# BreakBeforeBraces: Attach +# BreakBeforeConceptDeclarations: Always +# BreakBeforeInlineASMColon: OnlyMultiline +# BreakBeforeTernaryOperators: true +BreakConstructorInitializers: AfterColon +# BreakInheritanceList: BeforeColon +# BreakStringLiterals: true +ColumnLimit: 0 +# CommentPragmas: "^ IWYU pragma:" +# CompactNamespaces: false +ConstructorInitializerIndentWidth: 8 +ContinuationIndentWidth: 8 +Cpp11BracedListStyle: false +# DerivePointerAlignment: false +# DisableFormat: false +# EmptyLineAfterAccessModifier: Never +# EmptyLineBeforeAccessModifier: LogicalBlock +# ExperimentalAutoDetectBinPacking: false +# FixNamespaceComments: true +# ForEachMacros: +# - foreach +# - Q_FOREACH +# - BOOST_FOREACH +# IfMacros: +# - KJ_IF_MAYBE +# IncludeBlocks: Preserve +IncludeCategories: + - Regex: ^".*"$ + Priority: 1 + - Regex: ^<.*\.h>$ + Priority: 2 + - Regex: ^<.*>$ + Priority: 3 +# IncludeIsMainRegex: (Test)?$ +# IncludeIsMainSourceRegex: "" +# IndentAccessModifiers: false +# IndentCaseBlocks: false +IndentCaseLabels: true +# IndentExternBlock: AfterExternBlock +# IndentGotoLabels: true +# IndentPPDirectives: None +# IndentRequiresClause: true +IndentWidth: 4 +# IndentWrappedFunctionNames: false +InsertBraces: true +# InsertNewlineAtEOF: false +# InsertTrailingCommas: None +# IntegerLiteralSeparator: +# Binary: 0 +# BinaryMinDigits: 0 +# Decimal: 0 +# DecimalMinDigits: 0 +# Hex: 0 +# HexMinDigits: 0 +JavaImportGroups: + - org.godotengine + - android + - androidx + - com.android + - com.google + - java + - javax +# JavaScriptQuotes: Leave +# JavaScriptWrapImports: true +# KeepEmptyLinesAtEOF: false +KeepEmptyLinesAtTheStartOfBlocks: false +# LambdaBodyIndentation: Signature +# Language: Cpp +# LineEnding: DeriveLF +# MacroBlockBegin: "" +# MacroBlockEnd: "" +# MaxEmptyLinesToKeep: 1 +# NamespaceIndentation: None +# ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +# ObjCBreakBeforeNestedBlockParam: true +# ObjCSpaceAfterProperty: false +# ObjCSpaceBeforeProtocolList: true +# PPIndentWidth: -1 +PackConstructorInitializers: NextLine +# PenaltyBreakAssignment: 2 +# PenaltyBreakBeforeFirstCallParameter: 19 +# PenaltyBreakComment: 300 +# PenaltyBreakFirstLessLess: 120 +# PenaltyBreakOpenParenthesis: 0 +# PenaltyBreakString: 1000 +# PenaltyBreakTemplateDeclaration: 10 +# PenaltyExcessCharacter: 1000000 +# PenaltyIndentedWhitespace: 0 +# PenaltyReturnTypeOnItsOwnLine: 60 +# PointerAlignment: Right +# QualifierAlignment: Leave +# ReferenceAlignment: Pointer +# ReflowComments: true +# RemoveBracesLLVM: false +# RemoveParentheses: Leave +RemoveSemicolon: true +# RequiresClausePosition: OwnLine +# RequiresExpressionIndentation: OuterScope +# SeparateDefinitionBlocks: Leave +# ShortNamespaceLines: 1 +# SortIncludes: CaseSensitive +# SortJavaStaticImport: Before +# SortUsingDeclarations: LexicographicNumeric +# SpaceAfterCStyleCast: false +# SpaceAfterLogicalNot: false +# SpaceAfterTemplateKeyword: true +# SpaceAroundPointerQualifiers: Default +# SpaceBeforeAssignmentOperators: true +# SpaceBeforeCaseColon: false +# SpaceBeforeCpp11BracedList: false +# SpaceBeforeCtorInitializerColon: true +# SpaceBeforeInheritanceColon: true +# SpaceBeforeJsonColon: false +# SpaceBeforeParens: ControlStatements +# SpaceBeforeParensOptions: +# AfterControlStatements: true +# AfterForeachMacros: true +# AfterFunctionDeclarationName: false +# AfterFunctionDefinitionName: false +# AfterIfMacros: true +# AfterOverloadedOperator: false +# AfterRequiresInClause: false +# AfterRequiresInExpression: false +# BeforeNonEmptyParentheses: false +# SpaceBeforeRangeBasedForLoopColon: true +# SpaceBeforeSquareBrackets: false +# SpaceInEmptyBlock: false +# SpacesBeforeTrailingComments: 1 +# SpacesInAngles: Never +# SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 0 # We want a minimum of 1 for comments, but allow 0 for disabled code. + Maximum: -1 +# SpacesInParens: Never +# SpacesInParensOptions: +# InConditionalStatements: false +# InCStyleCasts: false +# InEmptyParentheses: false +# Other: false +# SpacesInSquareBrackets: false +Standard: c++20 +# StatementAttributeLikeMacros: +# - Q_EMIT +# StatementMacros: +# - Q_UNUSED +# - QT_REQUIRE_VERSION +TabWidth: 4 +UseTab: Always +# VerilogBreakBetweenInstancePorts: true +# WhitespaceSensitiveMacros: +# - BOOST_PP_STRINGIZE +# - CF_SWIFT_NAME +# - NS_SWIFT_NAME +# - PP_STRINGIZE +# - STRINGIZE diff --git a/engine/core/engine.cpp b/engine/core/engine.cpp new file mode 100644 index 0000000..efbcef8 --- /dev/null +++ b/engine/core/engine.cpp @@ -0,0 +1,3 @@ +#include "core/engine.h" + +Engine::Engine() {} \ No newline at end of file diff --git a/engine/core/main_loop.cpp b/engine/core/main_loop.cpp new file mode 100644 index 0000000..e69de29 diff --git a/engine/core/main_loop.h b/engine/core/main_loop.h new file mode 100644 index 0000000..dd3e3ec --- /dev/null +++ b/engine/core/main_loop.h @@ -0,0 +1,20 @@ +#ifndef MAIN_LOOP_H +#define MAIN_LOOP_H + +class MainLoop { +public: + MainLoop(); + ~MainLoop(); + + virtual void initialize(); + virtual void iterationPrepare() {} + virtual bool physicsProcess(double p_time); + virtual void iterationEnd() {} + virtual bool process(double p_time); + virtual void finalize(); + +private: + void processFrame(); +}; + +#endif // MAIN_LOOP_H \ No newline at end of file diff --git a/engine/core/object.cpp b/engine/core/object.cpp new file mode 100644 index 0000000..e69de29 diff --git a/engine/core/object.h b/engine/core/object.h new file mode 100644 index 0000000..e69de29 diff --git a/include/xrbds/core/engine.h b/include/xrbds/core/engine.h new file mode 100644 index 0000000..d64452f --- /dev/null +++ b/include/xrbds/core/engine.h @@ -0,0 +1,29 @@ +#ifndef XRBDS_CORE_ENGINE_H +#define XRBDS_CORE_ENGINE_H + +#include + +class Engine { +public: + Engine(); + ~Engine(); + + // Initialize the engine + bool initialize(const std::string &title, int width, int height); + + // Run the main game loop + void run(); + + // Shutdown the engine + void shutdown(); + +private: + bool isRunning; + + // Internal methods for the game loop + void processInput(); + void update(); + void render(); +}; + +#endif // XRBDS_CORE_ENGINE_H \ No newline at end of file diff --git a/samples/hello_world/CMakeLists.txt b/samples/hello_world/CMakeLists.txt new file mode 100644 index 0000000..dda5d5c --- /dev/null +++ b/samples/hello_world/CMakeLists.txt @@ -0,0 +1,19 @@ +add_executable(hello_world + main.cpp +) + +target_link_libraries(hello_world + xrbds +) + +# Project specific settings +set(TITLE "Hello World") +set(PUBLISHER "Built with xrbDS") +set(DEVELOPER "Xarblanca") + +nds_create_rom( + hello_world + NAME ${TITLE} + SUBTITLE1 ${PUBLISHER} + SUBTITLE2 ${DEVELOPER} +) \ No newline at end of file diff --git a/source/main.cpp b/samples/hello_world/main.cpp similarity index 76% rename from source/main.cpp rename to samples/hello_world/main.cpp index de9ab38..6b2f0aa 100644 --- a/source/main.cpp +++ b/samples/hello_world/main.cpp @@ -1,6 +1,8 @@ #include #include +#include "core/engine.h" + static volatile int frame = 0; static void Vblank() { frame++; } @@ -12,15 +14,14 @@ int main(void) { consoleDemoInit(); - iprintf(" Hello DS dev'rs\n"); - iprintf(" \x1b[32mwww.devkitpro.org\n"); - iprintf(" \x1b[32;1mwww.drunkencoders.com\x1b[39m"); + iprintf("\x1b[4;7HxrbDS Hello World\n"); while (pmMainLoop()) { swiWaitForVBlank(); scanKeys(); int keys = keysDown(); - if (keys & KEY_START) break; + if (keys & KEY_START) + break; touchRead(&touchXY); diff --git a/tools/create_solution.sh b/tools/create_solution.sh new file mode 100644 index 0000000..f4f9dee --- /dev/null +++ b/tools/create_solution.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +DIR="../build" + +if [ ! -d $DIR ]; then + mkdir $DIR +fi + +if [ ! -d $DIR ]; then + echo "Failed to create build directory" + exit 3 +fi + +if [ ! -d $DEVKITPRO ]; then + echo "Please set DEVKITPRO environment variable" + exit 2 +fi + +working_dir_name="$(basename "$PWD")" + +if [ "$working_dir_name" = "tools" ]; then + echo "Creating solution..." +else + echo "Please run this script from the tools directory" + exit 1 +fi + +$DEVKITPRO/portlibs/nds/bin/arm-none-eabi-cmake -S .. -B $DIR \ No newline at end of file