diff --git a/Makefile b/Makefile index 451a28740..6869e5df1 100644 --- a/Makefile +++ b/Makefile @@ -82,7 +82,7 @@ endif LDFLAGS = -Map ../../$(MAP) -LIB := $(LIBPATH) -lgcc -lc +LIB := $(LIBPATH) -lgcc -lc -L../../libagbsyscall -lagbsyscall SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c GFX := tools/gbagfx/gbagfx$(EXE) @@ -111,7 +111,7 @@ MAKEFLAGS += --no-print-directory # Secondary expansion is required for dependency variables in object rules. .SECONDEXPANSION: -.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS) berry_fix +.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS) berry_fix libagbsyscall infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) @@ -161,7 +161,7 @@ tools: $(TOOLDIRS) $(TOOLDIRS): @$(MAKE) -C $@ CC=$(HOSTCC) CXX=$(HOSTCXX) -rom: berry_fix $(ROM) +rom: $(ROM) ifeq ($(COMPARE),1) @$(SHA1) rom.sha1 endif @@ -182,7 +182,9 @@ mostlyclean: tidy rm -f $(DATA_ASM_SUBDIR)/maps/connections.inc $(DATA_ASM_SUBDIR)/maps/events.inc $(DATA_ASM_SUBDIR)/maps/groups.inc $(DATA_ASM_SUBDIR)/maps/headers.inc find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} + rm -f $(AUTO_GEN_TARGETS) + rm -f $(OBJ_DIR)/libagbsyscall.a @$(MAKE) clean -C berry_fix + @$(MAKE) clean -C libagbsyscall tidy: rm -f $(ROM) $(ELF) $(MAP) @@ -310,7 +312,7 @@ endif $(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS) cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld -$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) +$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ $(OBJS_REL) $(LIB) $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent @@ -323,4 +325,7 @@ modern: ; @$(MAKE) MODERN=1 berry_fix/berry_fix.gba: berry_fix berry_fix: - @$(MAKE) -C berry_fix COMPARE=$(COMPARE) + @$(MAKE) -C berry_fix COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN) + +libagbsyscall: + @$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) diff --git a/berry_fix/Makefile b/berry_fix/Makefile index 2bc225eba..0ead3804f 100644 --- a/berry_fix/Makefile +++ b/berry_fix/Makefile @@ -1,7 +1,29 @@ -include $(DEVKITARM)/base_tools +TOOLCHAIN := $(DEVKITARM) +COMPARE ?= 0 + +ifeq ($(CC),) +HOSTCC := gcc +else +HOSTCC := $(CC) +endif + +ifeq ($(CXX),) +HOSTCXX := g++ +else +HOSTCXX := $(CXX) +endif + +ifneq (,$(wildcard $(TOOLCHAIN)/base_tools)) +include $(TOOLCHAIN)/base_tools +else +export PATH := $(TOOLCHAIN)/bin:$(PATH) +PREFIX := arm-none-eabi- +OBJCOPY := $(PREFIX)objcopy +export CC := $(PREFIX)gcc +export AS := $(PREFIX)as +endif export CPP := $(PREFIX)cpp export LD := $(PREFIX)ld -COMPARE ?= 0 ifeq ($(OS),Windows_NT) EXE := .exe @@ -144,7 +166,7 @@ $(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s) endif payload: - @$(MAKE) -C payload COMPARE=$(COMPARE) + @$(MAKE) -C payload COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN) payload/payload.gba: payload diff --git a/berry_fix/payload/Makefile b/berry_fix/payload/Makefile index 63e326724..a121fda93 100644 --- a/berry_fix/payload/Makefile +++ b/berry_fix/payload/Makefile @@ -1,7 +1,29 @@ -include $(DEVKITARM)/base_tools +TOOLCHAIN := $(DEVKITARM) +COMPARE ?= 0 + +ifeq ($(CC),) +HOSTCC := gcc +else +HOSTCC := $(CC) +endif + +ifeq ($(CXX),) +HOSTCXX := g++ +else +HOSTCXX := $(CXX) +endif + +ifneq (,$(wildcard $(TOOLCHAIN)/base_tools)) +include $(TOOLCHAIN)/base_tools +else +export PATH := $(TOOLCHAIN)/bin:$(PATH) +PREFIX := arm-none-eabi- +OBJCOPY := $(PREFIX)objcopy +export CC := $(PREFIX)gcc +export AS := $(PREFIX)as +endif export CPP := $(PREFIX)cpp export LD := $(PREFIX)ld -COMPARE ?= 0 ifeq ($(OS),Windows_NT) EXE := .exe diff --git a/ld_script.txt b/ld_script.txt index cb3a7fa16..9caa100cc 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -361,6 +361,21 @@ SECTIONS { src/librfu_rfu.o(.text); asm/librfu.o(.text); src/libisagbprn.o(.text); + *libagbsyscall.a:ArcTan2.o(.text); + *libagbsyscall.a:BgAffineSet.o(.text); + *libagbsyscall.a:CpuFastSet.o(.text); + *libagbsyscall.a:CpuSet.o(.text); + *libagbsyscall.a:Div.o(.text); + *libagbsyscall.a:LZ77UnCompVram.o(.text); + *libagbsyscall.a:LZ77UnCompWram.o(.text); + *libagbsyscall.a:MultiBoot.o(.text); + *libagbsyscall.a:ObjAffineSet.o(.text); + *libagbsyscall.a:RLUnCompVram.o(.text); + *libagbsyscall.a:RLUnCompWram.o(.text); + *libagbsyscall.a:RegisterRamReset.o(.text); + *libagbsyscall.a:SoftReset.o(.text); + *libagbsyscall.a:Sqrt.o(.text); + *libagbsyscall.a:VBlankIntrWait.o(.text); src/libagbsyscall.o(.text); *libgcc.a:_call_via_rX.o(.text); *libgcc.a:_divdi3.o(.text); diff --git a/libagbsyscall/Makefile b/libagbsyscall/Makefile new file mode 100644 index 000000000..911cdb237 --- /dev/null +++ b/libagbsyscall/Makefile @@ -0,0 +1,98 @@ +TOOLCHAIN := $(DEVKITARM) +COMPARE ?= 0 + +ifeq ($(CC),) +HOSTCC := gcc +else +HOSTCC := $(CC) +endif + +ifeq ($(CXX),) +HOSTCXX := g++ +else +HOSTCXX := $(CXX) +endif + +ifneq (,$(wildcard $(TOOLCHAIN)/base_tools)) +include $(TOOLCHAIN)/base_tools +else +export PATH := $(TOOLCHAIN)/bin:$(PATH) +PREFIX := arm-none-eabi- +OBJCOPY := $(PREFIX)objcopy +export CC := $(PREFIX)gcc +export AS := $(PREFIX)as +endif +export CPP := $(PREFIX)cpp +export LD := $(PREFIX)ld + +ifeq ($(OS),Windows_NT) +EXE := .exe +else +EXE := +endif + +ASFLAGS := -mcpu=arm7tdmi +ARFLAGS := rc + +SYSCALLS := IntrWait \ + RegisterRamReset \ + Sqrt \ + MusicPlayerOpen \ + SoundBiasReset \ + SoundDriverVSyncOn \ + Mod \ + VBlankIntrWait \ + MusicPlayerStart \ + SoundDriverVSyncOff \ + HuffUnComp \ + SoftResetExram \ + MusicPlayerFadeOut \ + LZ77UnCompWram \ + SoundDriverMain \ + SoundBiasChange \ + LZ77UnCompVram \ + ArcTan2 \ + MusicPlayerStop \ + DivArm \ + ModArm \ + SoundDriverVSync \ + SoundDriverInit \ + BgAffineSet \ + Diff8bitUnFilterWram \ + MultiBoot \ + MidiKey2Freq \ + Div \ + Diff8bitUnFilterVram \ + ArcTan \ + ObjAffineSet \ + SoftResetRom \ + SoundDriverMode \ + RLUnCompWram \ + BitUnPack \ + SoundChannelClear \ + CpuFastSet \ + CpuSet \ + Diff16bitUnFilter \ + SoundBiasSet \ + MusicPlayerContinue \ + SoftReset \ + RLUnCompVram + +ASM_SRCS := libagbsyscall.s +ASM_OBJS := $(foreach syscall, $(SYSCALLS), $(syscall).o) + +LIB := libagbsyscall.a + +.PHONY: all clean + +all: $(LIB) + @: + +clean: + rm -f $(LIB) $(ASM_OBJS) + +$(LIB): $(ASM_OBJS) + $(AR) $(ARFLAGS) $@ $^ + +$(ASM_OBJS): libagbsyscall.s + $(AS) $(ASFLAGS) --defsym L_$(*F)=1 -o $@ $< diff --git a/libagbsyscall/libagbsyscall.s b/libagbsyscall/libagbsyscall.s new file mode 100644 index 000000000..893235e32 --- /dev/null +++ b/libagbsyscall/libagbsyscall.s @@ -0,0 +1,432 @@ + .include "../constants/gba_constants.inc" + .include "../asm/macros/function.inc" + + .text + + .set SOFT_RESET_DIRECT_BUF, 0x03007FFA + .set RESET_EX_WRAM_FLAG, 0x1 + + .ifdef NO_GRANULAR_AGBSYSCALL + .set L_IntrWait, 1 + .set L_RegisterRamReset, 1 + .set L_Sqrt, 1 + .set L_MusicPlayerOpen, 1 + .set L_SoundBiasReset, 1 + .set L_SoundDriverVSyncOn, 1 + .set L_Mod, 1 + .set L_VBlankIntrWait, 1 + .set L_MusicPlayerStart, 1 + .set L_SoundDriverVSyncOff, 1 + .set L_HuffUnComp, 1 + .set L_SoftResetExram, 1 + .set L_MusicPlayerFadeOut, 1 + .set L_LZ77UnCompWram, 1 + .set L_SoundDriverMain, 1 + .set L_SoundBiasChange, 1 + .set L_LZ77UnCompVram, 1 + .set L_ArcTan2, 1 + .set L_MusicPlayerStop, 1 + .set L_DivArm, 1 + .set L_ModArm, 1 + .set L_SoundDriverVSync, 1 + .set L_SoundDriverInit, 1 + .set L_BgAffineSet, 1 + .set L_Diff8bitUnFilterWram, 1 + .set L_MultiBoot, 1 + .set L_MidiKey2Freq, 1 + .set L_Div, 1 + .set L_Diff8bitUnFilterVram, 1 + .set L_ArcTan, 1 + .set L_ObjAffineSet, 1 + .set L_SoftResetRom, 1 + .set L_SoundDriverMode, 1 + .set L_RLUnCompWram, 1 + .set L_BitUnPack, 1 + .set L_SoundChannelClear, 1 + .set L_CpuFastSet, 1 + .set L_CpuSet, 1 + .set L_Diff16bitUnFilter, 1 + .set L_SoundBiasSet, 1 + .set L_MusicPlayerContinue, 1 + .set L_SoftReset, 1 + .set L_RLUnCompVram, 1 + .endif + + .ifdef L_IntrWait + thumb_func_start IntrWait +IntrWait: + mov r2, #0 + swi 4 + bx lr + thumb_func_end IntrWait + .endif + + .ifdef L_RegisterRamReset + thumb_func_start RegisterRamReset +RegisterRamReset: + swi 1 + bx lr + thumb_func_end RegisterRamReset + .endif + + .ifdef L_Sqrt + thumb_func_start Sqrt +Sqrt: + swi 8 + bx lr + thumb_func_end Sqrt + .endif + + .ifdef L_MusicPlayerOpen + thumb_func_start MusicPlayerOpen +MusicPlayerOpen: + swi 32 + bx lr + thumb_func_end MusicPlayerOpen + .endif + + .ifdef L_SoundBiasReset + thumb_func_start SoundBiasReset +SoundBiasReset: + mov r0, #0 + swi 25 + bx lr + thumb_func_end SoundBiasReset + .endif + + .ifdef L_SoundDriverVSyncOn + thumb_func_start SoundDriverVSyncOn +SoundDriverVSyncOn: + swi 41 + bx lr + thumb_func_end SoundDriverVSyncOn + .endif + + .ifdef L_Mod + thumb_func_start Mod +Mod: + swi 6 + mov r0, r1 + bx lr + thumb_func_end Mod + .endif + + .ifdef L_VBlankIntrWait + thumb_func_start VBlankIntrWait +VBlankIntrWait: + mov r2, #0 + swi 5 + bx lr + thumb_func_end VBlankIntrWait + .endif + + .ifdef L_MusicPlayerStart + thumb_func_start MusicPlayerStart +MusicPlayerStart: + swi 33 + bx lr + thumb_func_end MusicPlayerStart + .endif + + .ifdef L_SoundDriverVSyncOff + thumb_func_start SoundDriverVSyncOff +SoundDriverVSyncOff: + swi 40 + bx lr + thumb_func_end SoundDriverVSyncOff + .endif + + .ifdef L_HuffUnComp + thumb_func_start HuffUnComp +HuffUnComp: + swi 19 + bx lr + thumb_func_end HuffUnComp + .endif + + .ifdef L_SoftResetExram + thumb_func_start SoftResetExram +SoftResetExram: + ldr r3, =REG_IME + mov r2, #0 + strb r2, [r3, #0] + ldr r3, =SOFT_RESET_DIRECT_BUF + mov r2, #1 + strb r2, [r3, #0] + sub r3, #SOFT_RESET_DIRECT_BUF - 0x3007f00 + mov sp, r3 + mov r2, #RESET_EX_WRAM_FLAG + bic r0, r2 + swi 1 + swi 0 + .pool + thumb_func_end SoftResetExram + .endif + + .ifdef L_MusicPlayerFadeOut + thumb_func_start MusicPlayerFadeOut +MusicPlayerFadeOut: + swi 36 + bx lr + thumb_func_end MusicPlayerFadeOut + .endif + + .ifdef L_LZ77UnCompWram + thumb_func_start LZ77UnCompWram +LZ77UnCompWram: + swi 17 + bx lr + thumb_func_end LZ77UnCompWram + .endif + + .ifdef L_SoundDriverMain + thumb_func_start SoundDriverMain +SoundDriverMain: + swi 28 + bx lr + thumb_func_end SoundDriverMain + .endif + + .ifdef L_SoundBiasChange + thumb_func_start SoundBiasChange +SoundBiasChange: + swi 25 + bx lr + thumb_func_end SoundBiasChange + .endif + + .ifdef L_LZ77UnCompVram + thumb_func_start LZ77UnCompVram +LZ77UnCompVram: + swi 18 + bx lr + thumb_func_end LZ77UnCompVram + .endif + + .ifdef L_ArcTan2 + thumb_func_start ArcTan2 +ArcTan2: + swi 10 + bx lr + thumb_func_end ArcTan2 + .endif + + .ifdef L_MusicPlayerStop + thumb_func_start MusicPlayerStop +MusicPlayerStop: + swi 34 + bx lr + thumb_func_end MusicPlayerStop + .endif + + .ifdef L_DivArm + thumb_func_start DivArm +DivArm: + swi 7 + bx lr + thumb_func_end DivArm + .endif + + .ifdef L_ModArm + thumb_func_start ModArm +ModArm: + swi 7 + mov r0, r1 + bx lr + thumb_func_end ModArm + .endif + + .ifdef L_SoundDriverVSync + thumb_func_start SoundDriverVSync +SoundDriverVSync: + swi 29 + bx lr + thumb_func_end SoundDriverVSync + .endif + + .ifdef L_SoundDriverInit + thumb_func_start SoundDriverInit +SoundDriverInit: + swi 26 + bx lr + thumb_func_end SoundDriverInit + .endif + + .ifdef L_BgAffineSet + thumb_func_start BgAffineSet +BgAffineSet: + swi 14 + bx lr + thumb_func_end BgAffineSet + .endif + + .ifdef L_Diff8bitUnFilterWram + thumb_func_start Diff8bitUnFilterWram +Diff8bitUnFilterWram: + swi 22 + bx lr + thumb_func_end Diff8bitUnFilterWram + .endif + + .ifdef L_MultiBoot + thumb_func_start MultiBoot +MultiBoot: + mov r1, #1 + swi 37 + bx lr + thumb_func_end MultiBoot + .endif + + .ifdef L_MidiKey2Freq + thumb_func_start MidiKey2Freq +MidiKey2Freq: + swi 31 + bx lr + thumb_func_end MidiKey2Freq + .endif + + .ifdef L_Div + thumb_func_start Div +Div: + swi 6 + bx lr + thumb_func_end Div + .endif + + .ifdef L_Diff8bitUnFilterVram + thumb_func_start Diff8bitUnFilterVram +Diff8bitUnFilterVram: + swi 23 + bx lr + thumb_func_end Diff8bitUnFilterVram + .endif + + .ifdef L_ArcTan + thumb_func_start ArcTan +ArcTan: + swi 9 + bx lr + thumb_func_end ArcTan + .endif + + .ifdef L_ObjAffineSet + thumb_func_start ObjAffineSet +ObjAffineSet: + swi 15 + bx lr + thumb_func_end ObjAffineSet + .endif + + .ifdef L_SoftResetRom + thumb_func_start SoftResetRom +SoftResetRom: + ldr r3, =REG_IME + mov r2, #0 + strb r2, [r3, #0] + ldr r3, =SOFT_RESET_DIRECT_BUF + mov r2, #0 + strb r2, [r3, #0] + sub r3, #SOFT_RESET_DIRECT_BUF - 0x3007f00 + mov sp, r3 + swi 1 + swi 0 + .pool + thumb_func_end SoftResetRom + .endif + + .ifdef L_SoundDriverMode + thumb_func_start SoundDriverMode +SoundDriverMode: + swi 27 + bx lr + thumb_func_end SoundDriverMode + .endif + + .ifdef L_RLUnCompWram + thumb_func_start RLUnCompWram +RLUnCompWram: + swi 20 + bx lr + thumb_func_end RLUnCompWram + .endif + + .ifdef L_BitUnPack + thumb_func_start BitUnPack +BitUnPack: + swi 16 + bx lr + thumb_func_end BitUnPack + .endif + + .ifdef L_SoundChannelClear + thumb_func_start SoundChannelClear +SoundChannelClear: + swi 30 + bx lr + thumb_func_end SoundChannelClear + .endif + + .ifdef L_CpuFastSet + thumb_func_start CpuFastSet +CpuFastSet: + swi 12 + bx lr + thumb_func_end CpuFastSet + .endif + + .ifdef L_CpuSet + thumb_func_start CpuSet +CpuSet: + swi 11 + bx lr + thumb_func_end CpuSet + .endif + + .ifdef L_Diff16bitUnFilter + thumb_func_start Diff16bitUnFilter +Diff16bitUnFilter: + swi 24 + bx lr + thumb_func_end Diff16bitUnFilter + .endif + + .ifdef L_SoundBiasSet + thumb_func_start SoundBiasSet +SoundBiasSet: + mov r0, #1 + swi 25 + bx lr + thumb_func_end SoundBiasSet + .endif + + .ifdef L_MusicPlayerContinue + thumb_func_start MusicPlayerContinue +MusicPlayerContinue: + swi 35 + bx lr + thumb_func_end MusicPlayerContinue + .endif + + .ifdef L_SoftReset + thumb_func_start SoftReset +SoftReset: + ldr r3, =REG_IME + mov r2, #0 + strb r2, [r3, #0] + ldr r1, =0x3007f00 + mov sp, r1 + swi 1 + swi 0 + .pool + thumb_func_end SoftReset + .endif + + .ifdef L_RLUnCompVram + thumb_func_start RLUnCompVram +RLUnCompVram: + swi 21 + bx lr + thumb_func_end RLUnCompVram + .endif + + .align 2, 0 @ Don't pad with nop