From 5314361c7d861bce98d818f7ed915a00c6117c7f Mon Sep 17 00:00:00 2001 From: Oliver Bell Date: Fri, 10 May 2024 10:14:48 +0100 Subject: [PATCH] first pass to extract libagbsyscall to a package (#139) Co-authored-by: JaceCear <11230293+JaceCear@users.noreply.github.com> --- Makefile | 22 +- asm/{libagbsyscall.s => libagbsyscall.txt} | 0 config.mk | 5 +- ldscript.txt | 13 +- libagbsyscall/Makefile | 114 ++++++ libagbsyscall/libagbsyscall.s | 435 +++++++++++++++++++++ 6 files changed, 579 insertions(+), 10 deletions(-) rename asm/{libagbsyscall.s => libagbsyscall.txt} (100%) create mode 100644 libagbsyscall/Makefile create mode 100644 libagbsyscall/libagbsyscall.s diff --git a/Makefile b/Makefile index 0ff8bba63..63249f51a 100644 --- a/Makefile +++ b/Makefile @@ -101,11 +101,11 @@ ifeq ($(THUMB_SUPPORT),1) CC1FLAGS += -mthumb-interwork endif else -# Allow file input through stdin on modern GCC and set it to "compile only" ifeq ($(CPU_ARCH),i386) # Use the more legible Intel dialect for x86 CC1FLAGS += -masm=intel endif + # Allow file input through stdin on modern GCC and set it to "compile only" CC1FLAGS += -x c -S endif @@ -134,13 +134,13 @@ endif .SECONDEXPANSION: # these commands will run regardless of deps being completed -.PHONY: clean tools clean-tools $(TOOLDIRS) +.PHONY: clean tools clean-tools $(TOOLDIRS) libagbsyscall infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) # Build tools when building the rom # Disable dependency scanning for clean/tidy/tools -ifeq (,$(filter-out all rom compare,$(MAKECMDGOALS))) +ifeq (,$(filter-out all rom compare libagbsyscall,$(MAKECMDGOALS))) # if we are doing any of these things, build tools first $(call infoshell, $(MAKE) tools -j$(nproc)) else @@ -149,9 +149,15 @@ endif #### Files #### OBJ_DIR := build/$(PLATFORM)/$(BUILD_NAME) +ifeq ($(PLATFORM),gba) ROM := $(BUILD_NAME).gba ELF := $(ROM:.gba=.elf) MAP := $(ROM:.gba=.map) +else +ROM := $(BUILD_NAME).$(PLATFORM).exe +ELF := $(ROM:.exe=.elf) +MAP := $(ROM:.exe=.map) +endif ifeq ($(CPU_ARCH),arm) ASM_SUBDIR = asm @@ -270,6 +276,7 @@ clean: tidy clean-tools @$(MAKE) clean -C multi_boot/subgame_bootstrap @$(MAKE) clean -C multi_boot/programs/subgame_loader @$(MAKE) clean -C multi_boot/collect_rings + @$(MAKE) clean -C libagbsyscall $(RM) $(SAMPLE_SUBDIR)/*.bin $(MID_SUBDIR)/*.s find . \( -iwholename './data/maps/*/*/entities/*.bin' -o -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.rl' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec $(RM) {} + @@ -332,11 +339,11 @@ PROCESSED_LDSCRIPT := $(OBJ_DIR)/$(LDSCRIPT) $(PROCESSED_LDSCRIPT): $(LDSCRIPT) $(CPP) $(CPPFLAGS) $(LDSCRIPT) > $(PROCESSED_LDSCRIPT) -$(ELF): $(OBJS) $(PROCESSED_LDSCRIPT) +$(ELF): $(OBJS) $(PROCESSED_LDSCRIPT) libagbsyscall @echo "$(LD) -T $(LDSCRIPT) -Map $(MAP) " # NOTE: It is important to pass the CPU arch through -A # because the identifier for x86 (being i386) gets converted to a 1 by the preprocessor because it starts with an i... - @cd $(OBJ_DIR) && $(LD) -A CPU_ARCH -T $(LDSCRIPT) -Map "$(ROOT_DIR)/$(MAP)" $(OBJS_REL) "$(ROOT_DIR)/tools/agbcc/lib/libgcc.a" "$(ROOT_DIR)/tools/agbcc/lib/libc.a" -o $(ROOT_DIR)/$@ + @cd $(OBJ_DIR) && $(LD) -A CPU_ARCH -T $(LDSCRIPT) -Map "$(ROOT_DIR)/$(MAP)" $(OBJS_REL) "$(ROOT_DIR)/tools/agbcc/lib/libgcc.a" "$(ROOT_DIR)/tools/agbcc/lib/libc.a" -L$(ROOT_DIR)/libagbsyscall -lagbsyscall -o $(ROOT_DIR)/$@ $(ROM): $(ELF) $(OBJCOPY) -O binary --pad-to 0x8400000 $< $@ @@ -388,6 +395,8 @@ japan: ; @$(MAKE) GAME_REGION=JAPAN europe: ; @$(MAKE) GAME_REGION=EUROPE +x86: ; @$(MAKE) PLATFORM=win32 CPU_ARCH=i386 + chao_garden/mb_chao_garden.gba: @$(MAKE) -C chao_garden @@ -413,3 +422,6 @@ subgame_loader: tools collect_rings: tools @$(MAKE) -C multi_boot/collect_rings + +libagbsyscall: + @$(MAKE) -C libagbsyscall MODERN=0 diff --git a/asm/libagbsyscall.s b/asm/libagbsyscall.txt similarity index 100% rename from asm/libagbsyscall.s rename to asm/libagbsyscall.txt diff --git a/config.mk b/config.mk index e5c627718..0be5c7164 100644 --- a/config.mk +++ b/config.mk @@ -14,10 +14,7 @@ ifeq ($(CPU_ARCH),arm) endif MIDI_COMMENTS := "arm" -else ifeq ($(CPU_ARCH),x86) - CPU_ARCH := i386 - THUMB_SUPPORT ?= 0 - MIDI_COMMENTS := "x86" +# This is 'i386' because that's the arch's name in GNU Linker scripts else ifeq ($(CPU_ARCH),i386) THUMB_SUPPORT ?= 0 MIDI_COMMENTS := "x86" diff --git a/ldscript.txt b/ldscript.txt index 984ce6534..ff7aa5d59 100644 --- a/ldscript.txt +++ b/ldscript.txt @@ -385,7 +385,18 @@ SECTIONS src/lib/agb_flash_le_512k.o(.text); src/lib/agb_flash_mx_512k.o(.text); #if (PLATFORM_GBA == 1) - asm/libagbsyscall.o(.text); + *libagbsyscall.a:ArcTan2.o(.text); + *libagbsyscall.a:CpuFastSet.o(.text); + *libagbsyscall.a:CpuSet.o(.text); + *libagbsyscall.a:Div.o(.text); + *libagbsyscall.a:Mod.o(.text); + *libagbsyscall.a:LZ77UnCompWram.o(.text); + *libagbsyscall.a:MultiBoot.o(.text); + *libagbsyscall.a:RLUnCompWram.o(.text); + *libagbsyscall.a:SoftReset.o(.text); + *libagbsyscall.a:Sqrt.o(.text); + *libagbsyscall.a:VBlankIntrWait.o(.text); + *libagbsyscall.a:SoftResetExram.o(.text); #else src/lib/libagbsyscall.o(.text); #endif diff --git a/libagbsyscall/Makefile b/libagbsyscall/Makefile new file mode 100644 index 000000000..741f55684 --- /dev/null +++ b/libagbsyscall/Makefile @@ -0,0 +1,114 @@ +TOOLCHAIN := $(DEVKITARM) +COMPARE ?= 0 + +# don't use dkP's base_tools anymore +# because the redefinition of $(CC) conflicts +# with when we want to use $(CC) to preprocess files +# thus, manually create the variables for the bin +# files, or use arm-none-eabi binaries on the system +# if dkP is not installed on this system + +ifneq (,$(TOOLCHAIN)) +ifneq ($(wildcard $(TOOLCHAIN)/bin),) +export PATH := $(TOOLCHAIN)/bin:$(PATH) +endif +endif + +PREFIX := arm-none-eabi- +OBJCOPY := $(PREFIX)objcopy +AS := $(PREFIX)as +LD := $(PREFIX)ld +AR := $(PREFIX)ar + +# note: the makefile must be set up so MODERNCC is never called +# if MODERN=0 +MODERNCC := $(PREFIX)gcc + +ifeq ($(OS),Windows_NT) +EXE := .exe +else +EXE := +endif + +# use arm-none-eabi-cpp for macOS +# as macOS's default compiler is clang +# and clang's preprocessor will warn on \u +# when preprocessing asm files, expecting a unicode literal +# we can't unconditionally use arm-none-eabi-cpp +# as installations which install binutils-arm-none-eabi +# don't come with it +ifneq ($(MODERN),1) + ifeq ($(shell uname -s),Darwin) + CPP := $(PREFIX)cpp + else + CPP := $(CC) -E + endif +else + CPP := $(PREFIX)cpp +endif + +ASFLAGS := -mcpu=arm7tdmi -mthumb-interwork +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..e12333133 --- /dev/null +++ b/libagbsyscall/libagbsyscall.s @@ -0,0 +1,435 @@ + .include "../constants/gba_constants.inc" + .include "../asm/macros/function.inc" + + .text + + .syntax unified + .arm + + .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: + movs r2, #0 + svc #4 + bx lr + thumb_func_end IntrWait + .endif + + .ifdef L_RegisterRamReset + thumb_func_start RegisterRamReset +RegisterRamReset: + svc #1 + bx lr + thumb_func_end RegisterRamReset + .endif + + .ifdef L_Sqrt + thumb_func_start Sqrt +Sqrt: + svc #8 + bx lr + thumb_func_end Sqrt + .endif + + .ifdef L_MusicPlayerOpen + thumb_func_start MusicPlayerOpen +MusicPlayerOpen: + svc #32 + bx lr + thumb_func_end MusicPlayerOpen + .endif + + .ifdef L_SoundBiasReset + thumb_func_start SoundBiasReset +SoundBiasReset: + movs r0, #0 + svc #25 + bx lr + thumb_func_end SoundBiasReset + .endif + + .ifdef L_SoundDriverVSyncOn + thumb_func_start SoundDriverVSyncOn +SoundDriverVSyncOn: + svc #41 + bx lr + thumb_func_end SoundDriverVSyncOn + .endif + + .ifdef L_Mod + thumb_func_start Mod +Mod: + svc #6 + adds r0, r1, #0 + bx lr + thumb_func_end Mod + .endif + + .ifdef L_VBlankIntrWait + thumb_func_start VBlankIntrWait +VBlankIntrWait: + movs r2, #0 + svc #5 + bx lr + thumb_func_end VBlankIntrWait + .endif + + .ifdef L_MusicPlayerStart + thumb_func_start MusicPlayerStart +MusicPlayerStart: + svc #33 + bx lr + thumb_func_end MusicPlayerStart + .endif + + .ifdef L_SoundDriverVSyncOff + thumb_func_start SoundDriverVSyncOff +SoundDriverVSyncOff: + svc #40 + bx lr + thumb_func_end SoundDriverVSyncOff + .endif + + .ifdef L_HuffUnComp + thumb_func_start HuffUnComp +HuffUnComp: + svc #19 + bx lr + thumb_func_end HuffUnComp + .endif + + .ifdef L_SoftResetExram + thumb_func_start SoftResetExram +SoftResetExram: + ldr r3, =REG_IME + movs r2, #0 + strb r2, [r3, #0] + ldr r3, =SOFT_RESET_DIRECT_BUF + movs r2, #1 + strb r2, [r3, #0] + subs r3, #SOFT_RESET_DIRECT_BUF - 0x3007f00 + mov sp, r3 + movs r2, #RESET_EX_WRAM_FLAG + bics r0, r2 + svc #1 + svc #0 + .pool + thumb_func_end SoftResetExram + .endif + + .ifdef L_MusicPlayerFadeOut + thumb_func_start MusicPlayerFadeOut +MusicPlayerFadeOut: + svc #36 + bx lr + thumb_func_end MusicPlayerFadeOut + .endif + + .ifdef L_LZ77UnCompWram + thumb_func_start LZ77UnCompWram +LZ77UnCompWram: + svc #17 + bx lr + thumb_func_end LZ77UnCompWram + .endif + + .ifdef L_SoundDriverMain + thumb_func_start SoundDriverMain +SoundDriverMain: + svc #28 + bx lr + thumb_func_end SoundDriverMain + .endif + + .ifdef L_SoundBiasChange + thumb_func_start SoundBiasChange +SoundBiasChange: + svc #25 + bx lr + thumb_func_end SoundBiasChange + .endif + + .ifdef L_LZ77UnCompVram + thumb_func_start LZ77UnCompVram +LZ77UnCompVram: + svc #18 + bx lr + thumb_func_end LZ77UnCompVram + .endif + + .ifdef L_ArcTan2 + thumb_func_start ArcTan2 +ArcTan2: + svc #10 + bx lr + thumb_func_end ArcTan2 + .endif + + .ifdef L_MusicPlayerStop + thumb_func_start MusicPlayerStop +MusicPlayerStop: + svc #34 + bx lr + thumb_func_end MusicPlayerStop + .endif + + .ifdef L_DivArm + thumb_func_start DivArm +DivArm: + svc #7 + bx lr + thumb_func_end DivArm + .endif + + .ifdef L_ModArm + thumb_func_start ModArm +ModArm: + svc #7 + movs r0, r1 + bx lr + thumb_func_end ModArm + .endif + + .ifdef L_SoundDriverVSync + thumb_func_start SoundDriverVSync +SoundDriverVSync: + svc #29 + bx lr + thumb_func_end SoundDriverVSync + .endif + + .ifdef L_SoundDriverInit + thumb_func_start SoundDriverInit +SoundDriverInit: + svc #26 + bx lr + thumb_func_end SoundDriverInit + .endif + + .ifdef L_BgAffineSet + thumb_func_start BgAffineSet +BgAffineSet: + svc #14 + bx lr + thumb_func_end BgAffineSet + .endif + + .ifdef L_Diff8bitUnFilterWram + thumb_func_start Diff8bitUnFilterWram +Diff8bitUnFilterWram: + svc #22 + bx lr + thumb_func_end Diff8bitUnFilterWram + .endif + + .ifdef L_MultiBoot + thumb_func_start MultiBoot +MultiBoot: + movs r1, #1 + svc #37 + bx lr + thumb_func_end MultiBoot + .endif + + .ifdef L_MidiKey2Freq + thumb_func_start MidiKey2Freq +MidiKey2Freq: + svc #31 + bx lr + thumb_func_end MidiKey2Freq + .endif + + .ifdef L_Div + thumb_func_start Div +Div: + svc #6 + bx lr + thumb_func_end Div + .endif + + .ifdef L_Diff8bitUnFilterVram + thumb_func_start Diff8bitUnFilterVram +Diff8bitUnFilterVram: + svc #23 + bx lr + thumb_func_end Diff8bitUnFilterVram + .endif + + .ifdef L_ArcTan + thumb_func_start ArcTan +ArcTan: + svc #9 + bx lr + thumb_func_end ArcTan + .endif + + .ifdef L_ObjAffineSet + thumb_func_start ObjAffineSet +ObjAffineSet: + svc #15 + bx lr + thumb_func_end ObjAffineSet + .endif + + .ifdef L_SoftResetRom + thumb_func_start SoftResetRom +SoftResetRom: + ldr r3, =REG_IME + movs r2, #0 + strb r2, [r3, #0] + ldr r3, =SOFT_RESET_DIRECT_BUF + movs r2, #0 + strb r2, [r3, #0] + subs r3, #SOFT_RESET_DIRECT_BUF - 0x3007f00 + mov sp, r3 + svc #1 + svc #0 + .pool + thumb_func_end SoftResetRom + .endif + + .ifdef L_SoundDriverMode + thumb_func_start SoundDriverMode +SoundDriverMode: + svc #27 + bx lr + thumb_func_end SoundDriverMode + .endif + + .ifdef L_RLUnCompWram + thumb_func_start RLUnCompWram +RLUnCompWram: + svc #20 + bx lr + thumb_func_end RLUnCompWram + .endif + + .ifdef L_BitUnPack + thumb_func_start BitUnPack +BitUnPack: + svc #16 + bx lr + thumb_func_end BitUnPack + .endif + + .ifdef L_SoundChannelClear + thumb_func_start SoundChannelClear +SoundChannelClear: + svc #30 + bx lr + thumb_func_end SoundChannelClear + .endif + + .ifdef L_CpuFastSet + thumb_func_start CpuFastSet +CpuFastSet: + svc #12 + bx lr + thumb_func_end CpuFastSet + .endif + + .ifdef L_CpuSet + thumb_func_start CpuSet +CpuSet: + svc #11 + bx lr + thumb_func_end CpuSet + .endif + + .ifdef L_Diff16bitUnFilter + thumb_func_start Diff16bitUnFilter +Diff16bitUnFilter: + svc #24 + bx lr + thumb_func_end Diff16bitUnFilter + .endif + + .ifdef L_SoundBiasSet + thumb_func_start SoundBiasSet +SoundBiasSet: + movs r0, #1 + svc #25 + bx lr + thumb_func_end SoundBiasSet + .endif + + .ifdef L_MusicPlayerContinue + thumb_func_start MusicPlayerContinue +MusicPlayerContinue: + svc #35 + bx lr + thumb_func_end MusicPlayerContinue + .endif + + .ifdef L_SoftReset + thumb_func_start SoftReset +SoftReset: + ldr r3, =REG_IME + movs r2, #0 + strb r2, [r3, #0] + ldr r1, =0x3007f00 + mov sp, r1 + svc #1 + svc #0 + .pool + thumb_func_end SoftReset + .endif + + .ifdef L_RLUnCompVram + thumb_func_start RLUnCompVram +RLUnCompVram: + svc #21 + bx lr + thumb_func_end RLUnCompVram + .endif + + .align 2, 0 @ Don't pad with nop