From 7d2665943a8af432f10eeafb153093c9aa2710f8 Mon Sep 17 00:00:00 2001 From: Andreas Bielawski Date: Sat, 23 Mar 2019 13:20:41 +0100 Subject: [PATCH] Initial commit --- LICENSE | 24 ++++++ Makefile | 209 ++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 7 ++ icon.png | Bin 0 -> 17671 bytes screenshot1.bmp | Bin 0 -> 288054 bytes screenshot2.bmp | Bin 0 -> 288054 bytes source/main.c | 72 +++++++++++++++++ 7 files changed, 312 insertions(+) create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 icon.png create mode 100644 screenshot1.bmp create mode 100644 screenshot2.bmp create mode 100644 source/main.c diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..222d431 --- /dev/null +++ b/Makefile @@ -0,0 +1,209 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITARM)/3ds_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 +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# +# NO_SMDH: if set to anything, no SMDH file is generated. +# ROMFS is the directory which contains the RomFS, relative to the Makefile (Optional) +# APP_TITLE is the name of the app stored in the SMDH file (Optional) +# APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional) +# APP_AUTHOR is the author of the app stored in the SMDH file (Optional) +# ICON is the filename of the icon (.png), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .png +# - icon.png +# - /default_icon.png +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include +APP_TITLE := Power Off Cartridge Slot +APP_DESCRIPTION := Dis- and enables the cartridge slot +APP_AUTHOR := Brawl +#ROMFS := romfs + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft + +CFLAGS := -g -Wall -O2 -mword-relocations \ + -fomit-frame-pointer -ffunction-sections \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM11 -D_3DS + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lctru -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) + + +#--------------------------------------------------------------------------------- +# 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 TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(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))) +PICAFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.v.pica))) +SHLISTFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.shlist))) +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_SOURCES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export OFILES_BIN := $(addsuffix .o,$(BINFILES)) \ + $(PICAFILES:.v.pica=.shbin.o) $(SHLISTFILES:.shlist=.shbin.o) + +export OFILES := $(OFILES_BIN) $(OFILES_SOURCES) + +export HFILES := $(PICAFILES:.v.pica=_shbin.h) $(SHLISTFILES:.shlist=_shbin.h) $(addsuffix .h,$(subst .,_,$(BINFILES))) + +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) + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.png) + ifneq (,$(findstring $(TARGET).png,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).png + else + ifneq (,$(findstring icon.png,$(icons))) + export APP_ICON := $(TOPDIR)/icon.png + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +ifeq ($(strip $(NO_SMDH)),) + export _3DSXFLAGS += --smdh=$(CURDIR)/$(TARGET).smdh +endif + +ifneq ($(ROMFS),) + export _3DSXFLAGS += --romfs=$(CURDIR)/$(ROMFS) +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +ifeq ($(strip $(NO_SMDH)),) +$(OUTPUT).3dsx : $(OUTPUT).elf $(OUTPUT).smdh +else +$(OUTPUT).3dsx : $(OUTPUT).elf +endif + +$(OFILES_SOURCES) : $(HFILES) + +$(OUTPUT).elf : $(OFILES) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o %_bin.h : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------- +# rules for assembling GPU shaders +#--------------------------------------------------------------------------------- +define shader-as + $(eval CURBIN := $*.shbin) + $(eval DEPSFILE := $(DEPSDIR)/$*.shbin.d) + echo "$(CURBIN).o: $< $1" > $(DEPSFILE) + echo "extern const u8" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(CURBIN) | tr . _)`.h + echo "extern const u8" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(CURBIN) | tr . _)`.h + echo "extern const u32" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(CURBIN) | tr . _)`.h + picasso -o $(CURBIN) $1 + bin2s $(CURBIN) | $(AS) -o $*.shbin.o +endef + +%.shbin.o %_shbin.h : %.v.pica %.g.pica + @echo $(notdir $^) + @$(call shader-as,$^) + +%.shbin.o %_shbin.h : %.v.pica + @echo $(notdir $<) + @$(call shader-as,$<) + +%.shbin.o %_shbin.h : %.shlist + @echo $(notdir $<) + @$(call shader-as,$(foreach file,$(shell cat $<),$(dir $<)$(file))) + + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/README.md b/README.md new file mode 100644 index 0000000..e2cd82a --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +3DS Power Off Cartridge Slot +============================ +This 3DS homebrew **powers off the 3DS cartridge slot** and can enable it again. This **does not survive a reboot** and the cartridge slot gets **re-enabled when you re-insert a cartridge**. Please make sure to run this **with a Custom Firmware**. Useful for flashcard users! + +![Screenshot](screenshot1.bmp?raw=true) + +![Screenshot](screenshot2.bmp?raw=true) diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7fc5888f26e6ceddb2e4eb048ac1c31bf189b068 GIT binary patch literal 17671 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 RhT9<{e5(00ME;!${11Cy+dcpQ literal 0 HcmV?d00001 diff --git a/source/main.c b/source/main.c new file mode 100644 index 0000000..9cb450a --- /dev/null +++ b/source/main.c @@ -0,0 +1,72 @@ +#include +#include +#include <3ds.h> + +// Get current Cartridge Slot status +bool get_slot_status() { + bool status; + FSUSER_CardSlotGetCardIFPowerStatus(&status); + return status; +} + +// Switch cartridge slot status +void switch_slot_status(bool status) { + bool newstatus; + if (status) { + FSUSER_CardSlotPowerOff(&newstatus); + } else { + FSUSER_CardSlotPowerOn(&newstatus); + } + // Doesn't seem to return the new power status correctly? +} + +int main(int argc, char** argv) +{ + // Initialize services + gfxInitDefault(); + fsInit(); + + // Init console for text output + consoleInit(GFX_TOP, NULL); + consoleClear(); + + // Begin Code here + printf(CONSOLE_GREEN "3DS Power Off Cartridge Slot" CONSOLE_RESET "\n"); + printf("Press A to switch cartridge status.\n"); + printf("Press START to exit.\n"); + + bool status = get_slot_status(); + + // Main loop + while (aptMainLoop()) + { + printf("\x1b[5;0H"); + if (status) { + printf("Cartridge Slot is:" CONSOLE_BLUE " ENABLED " CONSOLE_RESET "\n"); + } else { + printf("Cartridge Slot is:" CONSOLE_RED " DISABLED" CONSOLE_RESET "\n"); + } + + hidScanInput(); + u32 kDown = hidKeysDown(); + + if (kDown & KEY_START) { + break; // break in order to return to hbmenu + } + + if (kDown & KEY_A) { + switch_slot_status(status); + status = get_slot_status(); + } + + // Flush and swap framebuffers + gfxFlushBuffers(); + gfxSwapBuffers(); + gspWaitForVBlank(); + } + + // Exit services + fsExit(); + gfxExit(); + return 0; +}