summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-09-08 21:26:46 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-09-08 21:26:46 -0400
commit888cbd634c746307a3992218a384139bfd5534d5 (patch)
treec93b0efe699f4cf33f7108de1b97d523fd1c70e2
parent306ce048ad07d62bed2028bfc8f30c03f5bc8db7 (diff)
libagbsyscall as an actual lib
-rw-r--r--Makefile15
-rw-r--r--berry_fix/Makefile28
-rw-r--r--berry_fix/payload/Makefile26
-rw-r--r--ld_script.txt15
-rw-r--r--libagbsyscall/Makefile98
-rw-r--r--libagbsyscall/libagbsyscall.s432
6 files changed, 604 insertions, 10 deletions
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