diff --git a/.gitignore b/.gitignore index af66eca..dd33ff9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,10 @@ *.gba *.elf build/ +payload/build tools/agbcc tools/binutils *.exe +*.lz +*.dump +.idea diff --git a/Makefile b/Makefile index 116e497..0cfbf72 100644 --- a/Makefile +++ b/Makefile @@ -6,11 +6,17 @@ OBJCOPY := $(PREFIX)objcopy PREPROC := tools/preproc/preproc SCANINC := tools/scaninc/scaninc RAMSCRGEN := tools/ramscrgen/ramscrgen +GBAFIX := tools/gbafix/gbafix +GBAGFX := tools/gbagfx/gbagfx +PYTHON := python3 -NAME := payload +NAME := colosseum-mb ROM := $(NAME).gba ELF := $(NAME).elf +PAYLOAD := payload/payload.gba +PAYLOADLZ := $(PAYLOAD).lz + OBJ_DIR := build/$(NAME) ASM_SRCS := $(wildcard asm/*.s) @@ -39,6 +45,7 @@ $(OBJ_DIR)/src/unk_200E344.o: CFLAGS := -mthumb-interwork -fhex-asm -Wimplicit - $(OBJ_DIR)/src/siirtc.o: CC1 := tools/agbcc/bin/agbcc $(OBJ_DIR)/src/siirtc.o: CFLAGS := -mthumb-interwork -fhex-asm -Wimplicit -Werror +MAKEFLAGS += --no-print-directory # Build tools when building the rom # Disable dependency scanning for clean/tidy/tools ifeq (,$(filter-out all compare,$(MAKECMDGOALS))) @@ -54,9 +61,10 @@ $(shell mkdir -p $(SUBDIRS:%=$(OBJ_DIR)/%)) .DELETE_ON_ERROR: .SECONDEXPANSION: -.PHONY: all rom clean compare tools cleantools mostlyclean +.PHONY: all rom clean compare tools cleantools mostlyclean payload all: rom + @: rom: $(ROM) @@ -93,20 +101,24 @@ $(C_OBJS): $(OBJ_DIR)/%.o: %.c $$(c_dep) $(DATA_ASM_OBJS): $(OBJ_DIR)/%.o: %.s $$(data_dep) $(PREPROC) $< charmap.txt | $(CPP) $(CPPFLAGS) | $(AS) $(ASFLAGS) -o $@ -$(OBJ_DIR)/sym_bss.ld: sym_bss.txt - $(RAMSCRGEN) .bss $< ENGLISH > $@ - -$(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt) - $(RAMSCRGEN) COMMON $< ENGLISH -c $(C_BUILDDIR),common_syms > $@ - -$(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt - $(RAMSCRGEN) ewram_data $< ENGLISH > $@ - -$(OBJ_DIR)/ld_script.ld: ld_script.txt $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld - cd $(OBJ_DIR) && sed -f ../../ld_script.sed ../../$< | sed "s#tools/#../../tools/#g" > ld_script.ld +$(OBJ_DIR)/ld_script.ld: ld_script.txt + cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$< > ld_script.ld $(ELF): $(OBJ_DIR)/ld_script.ld $(ALL_OBJS) cd $(OBJ_DIR) && $(LD) -Map ../../$(NAME).map -T ../../$< -o ../../$@ $(LIBS) + $(GBAFIX) $@ -cTEST -m01 -r0 --silent $(ROM): $(ELF) - $(OBJCOPY) -O binary $< $@ + $(OBJCOPY) -O binary --gap-fill 0 --pad-to 0x2028000 $< $@ + $(GBAFIX) $@ --silent + @# Hack to get the ROM checksum to match + $(PYTHON) fixrom.py $@ + +payload: $(PAYLOADLZ) + @: + +%.lz: % + $(GBAGFX) $< $@ + +$(PAYLOAD): + @make -C payload diff --git a/asm/crt0.s b/asm/crt0.s index 5bee5c4..f8cf7c8 100644 --- a/asm/crt0.s +++ b/asm/crt0.s @@ -6,20 +6,41 @@ arm_func_start _start _start: @ 0x02000000 b _init - .global gRomHeader -gRomHeader: - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x58, 0x56, 0x45 - .byte 0x30, 0x31, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00 + .global RomHeaderNintendoLogo +RomHeaderNintendoLogo: + .space 156 + +RomHeaderGameTitle: + .space 12 + + .global RomHeaderGameCode +RomHeaderGameCode: + .space 4 + +RomHeaderMakerCode: + .space 2 + +RomHeaderMagic: + .byte 0 + +RomHeaderMainUnitCode: + .byte 0 + +RomHeaderDeviceType: + .byte 0 + +RomHeaderReserved1: + .space 7 + + .global RomHeaderSoftwareVersion +RomHeaderSoftwareVersion: + .byte 0 + +RomHeaderChecksum: + .byte 0 + +RomHeaderReserved2: + .space 2 _init: mov r0, #0x12 msr cpsr_fc, r0 @@ -106,7 +127,7 @@ _020001D4: bic r3, r3, #0xdf orr r3, r3, #0x1f msr cpsr_fc, r3 - ldr r1, =gUnknown_02022BD0 + ldr r1, =gIntrTableTemplate add r1, r1, ip ldr r0, [r1] stmdb sp!, {lr} diff --git a/asm/iwram.s b/asm/iwram.s new file mode 100644 index 0000000..e9e3d1f --- /dev/null +++ b/asm/iwram.s @@ -0,0 +1,138 @@ + .include "asm/macros.inc" + .include "constants/constants.inc" + + .text + .syntax unified + + arm_func_start arm_LZ77UnCompWRAM +arm_LZ77UnCompWRAM: @ 0x02016818 + mov ip, sp + push {r4, r5, r6, r7, r8, sb, sl, fp, ip, lr, pc} + sub fp, ip, #4 + mov r7, r0 + ldr r3, [r7], #4 + mov lr, r1 + add sb, lr, r3, asr #8 + cmp lr, sb + bhs _02016940 + mov r8, #0xff0 + add r8, r8, #0xf +_02016844: + mov r5, #0x80 + ldrb sl, [r7], #1 +_0201684C: + tst sl, r5 + beq _02016924 + ldrb r3, [r7], #1 + ldrb r1, [r7], #1 + sub r0, lr, #1 + orr r1, r1, r3, lsl #8 + and r3, r1, r8 + rsb r0, r3, r0 + orr r2, lr, r0 + tst r2, #1 + asr r1, r1, #0xc + add r1, r1, #3 + bne _020168C0 + asr ip, r1, #2 + cmp ip, #0 + and r4, r1, #2 + and r6, r1, #1 + lsr r1, r5, #1 + beq _020168B0 +_02016898: + ldrh r3, [r0], #2 + strh r3, [lr], #2 + ldrh r3, [r0], #2 + strh r3, [lr], #2 + subs ip, ip, #1 + bne _02016898 +_020168B0: + cmp r4, #0 + ldrhne r3, [r0], #2 + strhne r3, [lr], #2 + b _02016914 +_020168C0: + asr ip, r1, #2 + cmp ip, #0 + and r4, r1, #2 + and r6, r1, #1 + lsr r1, r5, #1 + beq _02016900 +_020168D8: + ldrb r3, [r0], #1 + strb r3, [lr], #1 + ldrb r2, [r0], #1 + strb r2, [lr], #1 + ldrb r3, [r0], #1 + strb r3, [lr], #1 + ldrb r2, [r0], #1 + strb r2, [lr], #1 + subs ip, ip, #1 + bne _020168D8 +_02016900: + cmp r4, #0 + ldrbne r3, [r0], #1 + strbne r3, [lr], #1 + ldrbne r2, [r0], #1 + strbne r2, [lr], #1 +_02016914: + cmp r6, #0 + beq _02016930 + ldrb r3, [r0] + b _0201692C +_02016924: + ldrb r3, [r7], #1 + lsr r1, r5, #1 +_0201692C: + strb r3, [lr], #1 +_02016930: + ands r5, r1, #0xff + bne _0201684C + cmp lr, sb + blo _02016844 +_02016940: + ldmdb fp, {r4, r5, r6, r7, r8, sb, sl, fp, sp, lr} + bx lr + + arm_func_start arm_Bootstrap +arm_Bootstrap: @ 0x02016948 + mov ip, sp + push {r4, r5, fp, ip, lr, pc} + mov r3, #0xac + add r3, r3, #0x2000000 + mov r1, #0 + ldr r2, =ImageEnd + sub fp, ip, #4 + ldr ip, =Image + mov r5, #0x2000000 + ldr r4, [r3] + rsb r2, ip, r2 + rsb r0, r2, #0x2000000 + add r0, r0, #0x3fc00 + add r0, r0, #0x300 + cmp r1, r2 + bge _0201699C +_02016988: + ldrb r3, [ip, r1] + strb r3, [r0, r1] + add r1, r1, #1 + cmp r1, r2 + blt _02016988 +_0201699C: + mov r3, #0x208 + add r3, r3, #0x4000000 + mov r2, #0 + strh r2, [r3] + mov r1, #0x2000000 + bl arm_LZ77UnCompWRAM + mov r3, #0xac + add r3, r3, #0x2000000 + str r4, [r3] + mov lr, pc + bx r5 + b _020169D4 + .pool +_020169D4: @ 0x020169D4 + ldmdb fp, {r4, r5, fp, sp, lr} + bx lr diff --git a/asm/libagbsyscall.s b/asm/libagbsyscall.s index d430abe..5168698 100644 --- a/asm/libagbsyscall.s +++ b/asm/libagbsyscall.s @@ -2,81 +2,7 @@ .text .syntax unified - thumb_func_start CpuSet -CpuSet: @ 0x0200FD04 - svc #0xb - bx lr - - thumb_func_start Div -Div: @ 0x0200FD08 - svc #6 - bx lr - - thumb_func_start Mod -Mod: @ 0x0200FD0C - svc #6 - adds r0, r1, #0 - bx lr - .align 2, 0 - - thumb_func_start HuffUnComp -HuffUnComp: @ 0x0200FD14 - svc #0x13 - bx lr - - thumb_func_start LZ77UnCompVram -LZ77UnCompVram: @ 0x0200FD18 - svc #0x12 - bx lr - - thumb_func_start LZ77UnCompWram -LZ77UnCompWram: @ 0x0200FD1C - svc #0x11 - bx lr - - thumb_func_start RLUnCompVram -RLUnCompVram: @ 0x0200FD20 - svc #0x15 - bx lr - thumb_func_start RegisterRamReset RegisterRamReset: @ 0x0200FD24 svc #1 bx lr - - thumb_func_start SoftReset -SoftReset: @ 0x0200FD28 - ldr r3, =0x04000208 - movs r2, #0 - strb r2, [r3] - ldr r1, =0x03007F00 - mov sp, r1 - svc #1 - svc #0 - movs r0, r0 - .align 2, 0 - .pool - - thumb_func_start VBlankIntrWait -VBlankIntrWait: @ 0x0200FD40 - movs r2, #0 - svc #5 - bx lr - .align 2, 0 - - thumb_func_start SoftResetRom -SoftResetRom: @ 0x0200FD48 - ldr r3, =0x04000208 - movs r2, #0 - strb r2, [r3] - ldr r3, =0x03007FFA - movs r2, #1 - strb r2, [r3] - subs r3, #0xfa - mov sp, r3 - movs r2, #1 - bics r0, r2 - svc #1 - svc #0 - .align 2, 0 - .pool diff --git a/data/payload.s b/data/payload.s new file mode 100644 index 0000000..3a1bb11 --- /dev/null +++ b/data/payload.s @@ -0,0 +1,4 @@ + .section .rodata +Image:: + .incbin "payload/payload.gba.lz" +ImageEnd:: diff --git a/fixrom.py b/fixrom.py new file mode 100644 index 0000000..c083951 --- /dev/null +++ b/fixrom.py @@ -0,0 +1,7 @@ +#!/usr/bin/python3 + +import sys +fp = open(sys.argv[1], 'r+b') +fp.seek(0xbd) +fp.write(b'\xf0') +fp.close() diff --git a/include/gba/defines.h b/include/gba/defines.h index 3920a24..0fd2aa9 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -6,6 +6,9 @@ #define TRUE 1 #define FALSE 0 +#define EWRAM_START 0x02000000 +#define IWRAM_START 0x03000000 + #define BSS_DATA __attribute__((section(".bss"))) #define IWRAM_DATA __attribute__((section("iwram_data"))) #define EWRAM_DATA __attribute__((section("ewram_data"))) diff --git a/ld_script.txt b/ld_script.txt index 4df0350..a35a11b 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -1,51 +1,38 @@ SECTIONS { - . = 0x02000000; + . = 0x02000000; .text : ALIGN(4) { asm/crt0.o(.text); - asm/all.o(.text); - asm/m4a.o(.text); - src/main.o(.text); - asm/main.o(.text); - src/main.o(.text.020092C0); - asm/main.o(.text.020092F0); - src/unk_200E344.o(.text); - asm/unk_200E344.o(.text); - src/siirtc.o(.text); + src/main.o(.text); asm/libagbsyscall.o(.text); *libgcc.a:_call_via_rX.o(.text); - *libgcc.a:_divsi3.o(.text); - *libgcc.a:_dvmd_tls.o(.text); - *libgcc.a:_modsi3.o(.text); - *libgcc.a:_umodsi3.o(.text); - *libc.a:memcpy.o(.text); } =0 + + . += 0x100; .rodata : ALIGN(4) { - data/all.o(.rodata); - data/m4a.o(.rodata); - data/main.o(.rodata); - src/unk_200E344.o(.rodata); - data/all.o(.data); - data/main.o(.data); + data/payload.o(.rodata); + . = ALIGN(16); + src/main.o(.rodata); } =0 - ewram_start = .; - wram (NOLOAD) : + bootstrap : ALIGN(4) { - - + asm/iwram.o(.text); + } =0 + + . = 0x3000000; + iwram (NOLOAD) : + ALIGN(4) + { + arm_LZ77UnCompWRAM_Buffer = .; + . += 0x130; + arm_LZ77UnCompWRAM_FuncStart = .; + . += 0x94; + arm_LZ77UnCompWRAM_BufferEnd = .; } - ewram_end = .; - wram_extra (NOLOAD) : - ALIGN(4) - { - gUnknown_0202526C = .; - } - . = 0x080000C6; - GPIOPortDirection = .; /DISCARD/ : { *(*); diff --git a/payload/Makefile b/payload/Makefile new file mode 100644 index 0000000..bbf1f87 --- /dev/null +++ b/payload/Makefile @@ -0,0 +1,113 @@ +include $(DEVKITARM)/base_tools +AS := $(PREFIX)as +LD := $(PREFIX)ld +CPP := $(PREFIX)cpp +OBJCOPY := $(PREFIX)objcopy +PREPROC := ../tools/preproc/preproc +SCANINC := ../tools/scaninc/scaninc +RAMSCRGEN := ../tools/ramscrgen/ramscrgen + +NAME := payload +ROM := $(NAME).gba +ELF := $(NAME).elf + +OBJ_DIR := build/$(NAME) + +ASM_SRCS := $(wildcard asm/*.s) +ASM_OBJS := $(ASM_SRCS:%.s=$(OBJ_DIR)/%.o) +C_SRCS := $(wildcard src/*.c) +C_OBJS := $(C_SRCS:%.c=$(OBJ_DIR)/%.o) +DATA_ASM_SRCS := $(wildcard data/*.s) +DATA_ASM_OBJS := $(DATA_ASM_SRCS:%.s=$(OBJ_DIR)/%.o) + +CC1 := ../tools/agbcc/bin/old_agbcc +CPPFLAGS := -I ../tools/agbcc/include -iquote include -nostdinc -undef +CFLAGS := -O2 -mthumb-interwork -fhex-asm -Wimplicit -Werror +ASFLAGS := -mcpu=arm7tdmi +LIBS := -L../../../tools/agbcc/lib -lgcc -lc + +SUBDIRS := asm src data + +ALL_OBJS := $(ASM_OBJS) $(C_OBJS) $(DATA_ASM_OBJS) + +TOOLDIRS := $(filter-out ../tools/agbcc ../tools/binutils,$(wildcard ../tools/*)) + +infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) + +# Special rules for particular files +$(OBJ_DIR)/src/unk_200E344.o: CFLAGS := -mthumb-interwork -fhex-asm -Wimplicit -Werror +$(OBJ_DIR)/src/siirtc.o: CC1 := ../tools/agbcc/bin/agbcc +$(OBJ_DIR)/src/siirtc.o: CFLAGS := -mthumb-interwork -fhex-asm -Wimplicit -Werror + +# Build tools when building the rom +# Disable dependency scanning for clean/tidy/tools +ifeq (,$(filter-out all compare,$(MAKECMDGOALS))) +$(call infoshell, $(MAKE) tools) +else +NODEP := 1 +endif + +$(shell mkdir -p $(SUBDIRS:%=$(OBJ_DIR)/%)) + +.SUFFIXES: +.SECONDARY: +.DELETE_ON_ERROR: +.SECONDEXPANSION: + +.PHONY: all rom clean compare tools cleantools mostlyclean + +all: rom + @: + +rom: $(ROM) + +mostlyclean: + rm -f $(ROM) $(ROM:%.gba=%.elf) $(ALL_OBJS) + +clean: mostlyclean + @$(foreach tool,$(TOOLDIRS),$(MAKE) clean -C $(tool);) + +compare: rom + sha1sum -c rom.sha1 + +tools: + @$(foreach tool,$(TOOLDIRS),$(MAKE) -C $(tool);) + +ifeq ($(NODEP),1) +$(OBJ_DIR)/asm/%.o: asm_dep := +$(OBJ_DIR)/src/%.o: c_dep := +$(OBJ_DIR)/data/%.o: data_dep := +else +$(OBJ_DIR)/asm/%.o: asm_dep = $(shell $(SCANINC) -I include $*.s) +$(OBJ_DIR)/src/%.o: c_dep = $(shell $(SCANINC) -I include $*.c) +$(OBJ_DIR)/data/%.o: data_dep = $(shell $(SCANINC) -I include $*.s) +endif + +$(ASM_OBJS): $(OBJ_DIR)/%.o: %.s $$(asm_dep) + $(AS) $(ASFLAGS) -o $@ $< + +$(C_OBJS): $(OBJ_DIR)/%.o: %.c $$(c_dep) + $(CPP) $(CPPFLAGS) -o $(OBJ_DIR)/$*.i $< + $(PREPROC) $(OBJ_DIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(OBJ_DIR)/$*.s + $(AS) $(ASFLAGS) -o $@ $(OBJ_DIR)/$*.s + +$(DATA_ASM_OBJS): $(OBJ_DIR)/%.o: %.s $$(data_dep) + $(PREPROC) $< charmap.txt | $(CPP) $(CPPFLAGS) | $(AS) $(ASFLAGS) -o $@ + +$(OBJ_DIR)/sym_bss.ld: sym_bss.txt + $(RAMSCRGEN) .bss $< ENGLISH > $@ + +$(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt) + $(RAMSCRGEN) COMMON $< ENGLISH -c $(C_BUILDDIR),common_syms > $@ + +$(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt + $(RAMSCRGEN) ewram_data $< ENGLISH > $@ + +$(OBJ_DIR)/ld_script.ld: ld_script.txt $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld + cd $(OBJ_DIR) && sed -f ../../ld_script.sed ../../$< | sed "s#tools/#../../../tools/#g" > ld_script.ld + +$(ELF): $(OBJ_DIR)/ld_script.ld $(ALL_OBJS) + cd $(OBJ_DIR) && $(LD) -Map ../../$(NAME).map -T ../../$< -o ../../$@ $(LIBS) + +$(ROM): $(ELF) + $(OBJCOPY) -O binary $< $@ diff --git a/asm/all.s b/payload/asm/all.s similarity index 100% rename from asm/all.s rename to payload/asm/all.s diff --git a/payload/asm/crt0.s b/payload/asm/crt0.s new file mode 100644 index 0000000..5bee5c4 --- /dev/null +++ b/payload/asm/crt0.s @@ -0,0 +1,127 @@ + .include "asm/macros/function.inc" + .include "constants/gba_constants.inc" + .text + .syntax unified + + arm_func_start _start +_start: @ 0x02000000 + b _init + .global gRomHeader +gRomHeader: + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x58, 0x56, 0x45 + .byte 0x30, 0x31, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00 +_init: + mov r0, #0x12 + msr cpsr_fc, r0 + ldr sp, _020000F8 @=0x03007fa0 + mov r0, #0x1f + msr cpsr_fc, r0 + ldr sp, _020000F4 @=0x03007e60 + ldr r1, _020000FC @=INTR_VECTOR + adr r0, _intr + str r0, [r1] + ldr r1, _02000100 @=AgbMain + mov lr, pc + bx r1 + b _init + .align 2, 0 + +_020000F4: .4byte 0x03007e60 +_020000F8: .4byte 0x03007fa0 +_020000FC: .4byte INTR_VECTOR +_02000100: .4byte AgbMain + + arm_func_start _intr +_intr: @ 0x02000104 + mov r3, #0x4000000 + add r3, r3, #0x200 + ldr r2, [r3] + ldrh r1, [r3, #8] + mrs r0, spsr + push {r0, r1, r2, r3, lr} + mov r0, #1 + strh r0, [r3, #8] + and r1, r2, r2, lsr #16 + mov ip, #0 + ands r0, r1, #0x80 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #1 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #2 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #4 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #8 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #0x10 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #0x20 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #0x40 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #0x100 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #0x200 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #0x400 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #0x800 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #0x1000 + bne _020001D4 + add ip, ip, #4 + ands r0, r1, #0x2000 + strbne r0, [r3, #-0x17c] +_020001D0: + bne _020001D0 +_020001D4: + strh r0, [r3, #2] + mov r1, #0x20c0 + bic r2, r2, r0 + and r1, r1, r2 + strh r1, [r3] + mrs r3, apsr + bic r3, r3, #0xdf + orr r3, r3, #0x1f + msr cpsr_fc, r3 + ldr r1, =gUnknown_02022BD0 + add r1, r1, ip + ldr r0, [r1] + stmdb sp!, {lr} + adr lr, _intr_ret + bx r0 +_intr_ret: @ 0x02000210 + ldm sp!, {lr} + mrs r3, apsr + bic r3, r3, #0xdf + orr r3, r3, #0x92 + msr cpsr_fc, r3 + pop {r0, r1, r2, r3, lr} + strh r2, [r3] + strh r1, [r3, #8] + msr spsr_fc, r0 + bx lr + .align 2, 0 + .pool diff --git a/payload/asm/libagbsyscall.s b/payload/asm/libagbsyscall.s new file mode 100644 index 0000000..d430abe --- /dev/null +++ b/payload/asm/libagbsyscall.s @@ -0,0 +1,82 @@ + .include "asm/macros/function.inc" + .text + .syntax unified + + thumb_func_start CpuSet +CpuSet: @ 0x0200FD04 + svc #0xb + bx lr + + thumb_func_start Div +Div: @ 0x0200FD08 + svc #6 + bx lr + + thumb_func_start Mod +Mod: @ 0x0200FD0C + svc #6 + adds r0, r1, #0 + bx lr + .align 2, 0 + + thumb_func_start HuffUnComp +HuffUnComp: @ 0x0200FD14 + svc #0x13 + bx lr + + thumb_func_start LZ77UnCompVram +LZ77UnCompVram: @ 0x0200FD18 + svc #0x12 + bx lr + + thumb_func_start LZ77UnCompWram +LZ77UnCompWram: @ 0x0200FD1C + svc #0x11 + bx lr + + thumb_func_start RLUnCompVram +RLUnCompVram: @ 0x0200FD20 + svc #0x15 + bx lr + + thumb_func_start RegisterRamReset +RegisterRamReset: @ 0x0200FD24 + svc #1 + bx lr + + thumb_func_start SoftReset +SoftReset: @ 0x0200FD28 + ldr r3, =0x04000208 + movs r2, #0 + strb r2, [r3] + ldr r1, =0x03007F00 + mov sp, r1 + svc #1 + svc #0 + movs r0, r0 + .align 2, 0 + .pool + + thumb_func_start VBlankIntrWait +VBlankIntrWait: @ 0x0200FD40 + movs r2, #0 + svc #5 + bx lr + .align 2, 0 + + thumb_func_start SoftResetRom +SoftResetRom: @ 0x0200FD48 + ldr r3, =0x04000208 + movs r2, #0 + strb r2, [r3] + ldr r3, =0x03007FFA + movs r2, #1 + strb r2, [r3] + subs r3, #0xfa + mov sp, r3 + movs r2, #1 + bics r0, r2 + svc #1 + svc #0 + .align 2, 0 + .pool diff --git a/asm/m4a.s b/payload/asm/m4a.s similarity index 100% rename from asm/m4a.s rename to payload/asm/m4a.s diff --git a/payload/asm/macros.inc b/payload/asm/macros.inc new file mode 100644 index 0000000..e6813d3 --- /dev/null +++ b/payload/asm/macros.inc @@ -0,0 +1,155 @@ + .include "asm/macros/asm.inc" + .include "asm/macros/function.inc" + .include "asm/macros/movement.inc" + .include "asm/macros/pokemon_data.inc" + .include "asm/macros/ec.inc" + .include "asm/macros/map.inc" + .include "asm/macros/m4a.inc" + + .macro region_map_location x, y, width, height, name + .byte \x + .byte \y + .byte \width + .byte \height + .4byte gMapName_\name + .endm + + .macro obj_tiles address, uncompressed_size, tag + .4byte \address + .2byte \uncompressed_size + .2byte \tag + .endm + + .macro null_obj_tiles + obj_tiles 0, 0, 0 + .endm + + .macro obj_pal address, tag + .4byte \address + .2byte \tag + .2byte 0 @ padding + .endm + + .macro null_obj_pal + obj_pal 0, 0 + .endm + + .macro paired_pals tag, address + .2byte \tag + .2byte 0 @ padding + .4byte \address + .endm + +@ For object animation frames. + .macro obj_frame_tiles address, uncompressed_size + .4byte \address + .2byte \uncompressed_size + .2byte 0 @ padding + .endm + + .macro spr_template tile_tag, pal_tag, oam, anims, images, affine_anims, callback + .2byte \tile_tag + .2byte \pal_tag + .4byte \oam + .4byte \anims + .4byte \images + .4byte \affine_anims + .4byte \callback + .endm + +@ Berry trees have a table defining the palette slot used for each of their 5 +@ stages. However, the first 2 stages always use the same slots regardless of +@ the type of tree and the slots of the last 3 stages always equal each other. + .macro berry_tree_palette_slot_table slot + .byte 3, 4, \slot, \slot, \slot + .endm + + .macro subsprite x, y, priority, tile_num_offset, size + .2byte \x + .2byte \y + .2byte ((\priority) << 14) | ((\tile_num_offset) << 4) | SPRITE_SIZE_\size + .2byte 0 @ padding + .endm + + .macro obj_image_anim_frame pic_id, duration, flags = 0 + .2byte \pic_id + .byte (\flags) | (\duration) + .byte 0 @ padding + .endm + + .macro obj_image_anim_loop count + .2byte 0xfffd + .byte \count + .byte 0 @ padding + .endm + + .macro obj_image_anim_jump target_index + .2byte 0xfffe + .byte \target_index + .byte 0 @ padding + .endm + + .macro obj_image_anim_end + .2byte 0xffff + .2byte 0 @ padding + .endm + + .macro obj_rot_scal_anim_frame delta_x_scale, delta_y_scale, delta_angle, duration + .2byte \delta_x_scale + .2byte \delta_y_scale + .byte \delta_angle + .byte \duration + .2byte 0 @ padding + .endm + + .macro obj_rot_scal_anim_loop count + .2byte 0x7ffd + .2byte \count + .4byte 0 @ padding + .endm + + .macro obj_rot_scal_anim_jump target_index + .2byte 0x7ffe + .2byte \target_index + .4byte 0 @ padding + .endm + + .macro obj_rot_scal_anim_end unknown=0 + .2byte 0x7fff + .2byte \unknown + .fill 4 @ padding + .endm + + .macro credits_entry number, text + .4byte \number + .4byte \text + .endm + + .macro door_anim_frame unknown, offset + .byte \unknown + .byte 0 @ padding + .2byte \offset + .endm + + .macro door_anim_gfx metatile_num, unknown, tile_addr, palette_addr + .2byte \metatile_num + .2byte \unknown + .4byte \tile_addr + .4byte \palette_addr + .endm + + .macro trainer_eye_trainer opp_1, opp_2, opp_3, opp_4, opp_5, map_name + .2byte OPPONENT_\opp_1 + .2byte OPPONENT_\opp_2 + .2byte OPPONENT_\opp_3 + .2byte OPPONENT_\opp_4 + .2byte OPPONENT_\opp_5 + .2byte GROUP_\map_name + .2byte MAP_\map_name + .space 2 + .endm + + .macro window_template bg, top, left, height, width, palno, baseBlock + .byte \bg, \top, \left, \height, \width, \palno + .2byte \baseBlock + .endm diff --git a/payload/asm/macros/asm.inc b/payload/asm/macros/asm.inc new file mode 100644 index 0000000..26b2707 --- /dev/null +++ b/payload/asm/macros/asm.inc @@ -0,0 +1,17 @@ + .ifndef GUARD_ASM_MACROS_ASM_INC + .set GUARD_ASM_MACROS_ASM_INC, 1 + + .macro inc x + .set \x, \x + 1 + .endm + + .macro enum_start x=0 + .set __enum__, \x + .endm + + .macro enum constant + .equiv \constant, __enum__ + inc __enum__ + .endm + + .endif @ GUARD_ASM_MACROS_ASM_INC diff --git a/payload/asm/macros/battle_ai_script.inc b/payload/asm/macros/battle_ai_script.inc new file mode 100644 index 0000000..679e303 --- /dev/null +++ b/payload/asm/macros/battle_ai_script.inc @@ -0,0 +1,554 @@ + .macro if_random_less_than percent, address + .byte 0x00 + .byte \percent + .4byte \address + .endm + + @ unused + .macro if_random_greater_than percent, address + .byte 0x01 + .byte \percent + .4byte \address + .endm + + @ unused + .macro if_random_equal address + .byte 0x02 + .4byte \address + .endm + + @ unused + .macro if_random_not_equal address + .byte 0x03 + .4byte \address + .endm + + .macro score score + .byte 0x04 + .byte \score + .endm + + .macro if_hp_less_than target, percent, address + .byte 0x05 + .byte \target + .byte \percent + .4byte \address + .endm + + .macro if_hp_more_than target, percent, address + .byte 0x06 + .byte \target + .byte \percent + .4byte \address + .endm + + .macro if_hp_equal target, percent, address + .byte 0x07 + .byte \target + .byte \percent + .4byte \address + .endm + + .macro if_hp_not_equal target, percent, address + .byte 0x08 + .byte \target + .byte \percent + .4byte \address + .endm + + .macro if_status target, status, address + .byte 0x09 + .byte \target + .4byte \status + .4byte \address + .endm + + .macro if_not_status target, status, address + .byte 0x0a + .byte \target + .4byte \status + .4byte \address + .endm + + .macro if_status2 target, status, address + .byte 0x0b + .byte \target + .4byte \status + .4byte \address + .endm + + .macro if_not_status2 target, status, address + .byte 0x0c + .byte \target + .4byte \status + .4byte \address + .endm + + .macro if_status3 target, status, address + .byte 0x0d + .byte \target + .4byte \status + .4byte \address + .endm + + .macro if_not_status3 target, status, address + .byte 0x0e + .byte \target + .4byte \status + .4byte \address + .endm + + .macro if_status4 target, status, address + .byte 0x0f + .byte \target + .4byte \status + .4byte \address + .endm + + .macro if_not_status4 target, status, address + .byte 0x10 + .byte \target + .4byte \status + .4byte \address + .endm + + .macro if_less_than value, address + .byte 0x11 + .byte \value + .4byte \address + .endm + + .macro if_more_than value, address + .byte 0x12 + .byte \value + .4byte \address + .endm + + .macro if_equal value, address + .byte 0x13 + .byte \value + .4byte \address + .endm + + .macro if_not_equal value, address + .byte 0x14 + .byte \value + .4byte \address + .endm + + .macro if_less_than_32 value, address + .byte 0x15 + .4byte \value + .4byte \address + .endm + + .macro if_more_than_32 value, address + .byte 0x16 + .4byte \value + .4byte \address + .endm + + .macro if_equal_32 value, address + .byte 0x17 + .4byte \value + .4byte \address + .endm + + .macro if_not_equal_32 value, address + .byte 0x18 + .4byte \value + .4byte \address + .endm + + .macro if_move move, address + .byte 0x19 + .2byte \move + .4byte \address + .endm + + .macro if_not_move move, address + .byte 0x1a + .2byte \move + .4byte \address + .endm + + .macro if_in_bytes list, address + .byte 0x1b + .4byte \list + .4byte \address + .endm + + .macro if_not_in_bytes list, address + .byte 0x1c + .4byte \list + .4byte \address + .endm + + .macro if_in_words list, address + .byte 0x1d + .4byte \list + .4byte \address + .endm + + .macro if_not_in_words list, address + .byte 0x1e + .4byte \list + .4byte \address + .endm + + .macro if_user_can_damage address + .byte 0x1f + .4byte \address + .endm + + .macro if_user_cant_damage address + .byte 0x20 + .4byte \address + .endm + + .macro get_turn_count + .byte 0x21 + .endm + + .macro get_type byte + .byte 0x22 + .byte \byte + .endm + + @ unused + .macro get_move_power + .byte 0x23 + .endm + + .macro is_most_powerful_move + .byte 0x24 + .endm + + .macro get_move target + .byte 0x25 + .byte \target + .endm + + .macro if_arg_equal type, address + .byte 0x26 + .byte \type + .4byte \address + .endm + + @ unused + .macro if_arg_not_equal type, address + .byte 0x27 + .byte \type + .4byte \address + .endm + + .macro if_would_go_first target, address + .byte 0x28 + .byte \target + .4byte \address + .endm + + .macro if_would_not_go_first target, address + .byte 0x29 + .byte \target + .4byte \address + .endm + + @ nullsub + .macro ai_2a + .byte 0x2a + .endm + + @ nullsub + .macro ai_2b + .byte 0x2b + .endm + + .macro count_alive_pokemon target + .byte 0x2c + .byte \target + .endm + + @ unused + .macro get_considered_move + .byte 0x2d + .endm + + .macro get_effect + .byte 0x2e + .endm + + .macro get_ability target + .byte 0x2f + .byte \target + .endm + + @ unused + .macro get_highest_possible_damage + .byte 0x30 + .endm + + .macro if_damage_bonus value, address + .byte 0x31 + .byte \value + .4byte \address + .endm + + @ nullsub + .macro ai_32 + .byte 0x32 + .endm + + @ nullsub + .macro ai_33 + .byte 0x33 + .endm + + .macro if_status_in_party target, status, address + .byte 0x34 + .byte \target + .4byte \status + .4byte \address + .endm + + @ bugged + .macro if_status_not_in_party target, status, address + .byte 0x35 + .byte \target + .4byte \status + .4byte \address + .endm + + .macro get_weather + .byte 0x36 + .endm + + .macro if_effect byte, address + .byte 0x37 + .byte \byte + .4byte \address + .endm + + .macro if_not_effect byte, address + .byte 0x38 + .byte \byte + .4byte \address + .endm + + .macro if_stat_level_less_than target, stat, level, address + .byte 0x39 + .byte \target + .byte \stat + .byte \level + .4byte \address + .endm + + .macro if_stat_level_more_than target, stat, level, address + .byte 0x3a + .byte \target + .byte \stat + .byte \level + .4byte \address + .endm + + .macro if_stat_level_equal target, stat, level, address + .byte 0x3b + .byte \target + .byte \stat + .byte \level + .4byte \address + .endm + + .macro if_stat_level_not_equal target, stat, level, address + .byte 0x3c + .byte \target + .byte \stat + .byte \level + .4byte \address + .endm + + .macro if_can_faint address + .byte 0x3d + .4byte \address + .endm + + .macro if_cant_faint address + .byte 0x3e + .4byte \address + .endm + + @ unused + .macro if_has_move, target, move, address + .byte 0x3f + .byte \target + .2byte \move + .4byte \address + .endm + + @ unused + .macro if_dont_have_move, target, move, address + .byte 0x40 + .byte \target + .2byte \move + .4byte \address + .endm + + .macro if_move_effect target, effect, address + .byte 0x41 + .byte \target + .byte \effect + .4byte \address + .endm + + .macro if_not_move_effect target, effect, address + .byte 0x42 + .byte \target + .byte \effect + .4byte \address + .endm + + .macro if_last_move_did_damage target, byte, address + .byte 0x43 + .byte \target + .byte \byte + .4byte \address + .endm + + .macro if_encored target, address + .byte 0x44 + .byte \target + .4byte \address + .endm + + .macro flee + .byte 0x45 + .endm + + .macro if_random_100 address + .byte 0x46 + .4byte \address + .endm + + .macro watch + .byte 0x47 + .endm + + .macro get_hold_effect target + .byte 0x48 + .byte \target + .endm + + .macro get_gender target + .byte 0x49 + .byte \target + .endm + + .macro is_first_turn target + .byte 0x4a + .byte \target + .endm + + .macro get_stockpile_count target + .byte 0x4b + .byte \target + .endm + + .macro is_double_battle + .byte 0x4c + .endm + + .macro get_item target + .byte 0x4d + .byte \target + .endm + + .macro get_move_type_from_result + .byte 0x4e + .endm + + .macro get_move_power_from_result + .byte 0x4f + .endm + + .macro get_move_effect_from_result + .byte 0x50 + .endm + + .macro get_protect_count target + .byte 0x51 + .byte \target + .endm + + @ nullsub + .macro ai_52 + .byte 0x52 + .endm + + @ nullsub + .macro ai_53 + .byte 0x53 + .endm + + @ nullsub + .macro ai_54 + .byte 0x54 + .endm + + @ nullsub + .macro ai_55 + .byte 0x55 + .endm + + @ nullsub + .macro ai_56 + .byte 0x56 + .endm + + @ nullsub + .macro ai_57 + .byte 0x57 + .endm + + @ unused + .macro call address + .byte 0x58 + .4byte \address + .endm + + .macro jump address + .byte 0x59 + .4byte \address + .endm + + .macro end + .byte 0x5a + .endm + + .macro if_level_cond cond, address + .byte 0x5b + .byte \cond + .4byte \address + .endm + + .macro if_user_higher_level address + if_level_cond 0, \address + .endm + + .macro if_target_higher_level address + if_level_cond 1, \address + .endm + + .macro if_equal_levels address + if_level_cond 2, \address + .endm + + @ unused + .macro if_taunted address + .byte 0x5c + .4byte \address + .endm + + .macro if_not_taunted address + .byte 0x5d + .4byte \address + .endm diff --git a/payload/asm/macros/battle_anim.inc b/payload/asm/macros/battle_anim.inc new file mode 100644 index 0000000..4ff8450 --- /dev/null +++ b/payload/asm/macros/battle_anim.inc @@ -0,0 +1,266 @@ + .macro loadsprite id + .byte 0x00 + .2byte \id + .endm + + .macro unloadsprite id + .byte 0x01 + .2byte \id + .endm + + .macro sprite template, priority, argv:vararg + .byte 0x02 + .4byte \template + .byte \priority + .byte (.Lsprite_\@_2 - .Lsprite_\@_1) / 2 +.Lsprite_\@_1: + .2byte \argv +.Lsprite_\@_2: + .endm + + .macro createtask addr, priority, argv:vararg + .byte 0x03 + .4byte \addr + .byte \priority + .byte (.Lcreatetask_\@_2 - .Lcreatetask_\@_1) / 2 +.Lcreatetask_\@_1: + .2byte \argv +.Lcreatetask_\@_2: + .endm + + .macro pause delay + .byte 0x04 + .byte \delay + .endm + + .macro wait + .byte 0x05 + .endm + + .macro hang1 + .byte 0x06 + .endm + + .macro hang2 + .byte 0x07 + .endm + + .macro end + .byte 0x08 + .endm + + .macro playse id + .byte 0x09 + .2byte \id + .endm + + .macro monbg which + .byte 0x0A + .byte \which + .endm + + .macro clearmonbg which + .byte 0x0B + .byte \which + .endm + + .macro setalpha eva, evb + .byte 0x0C + .2byte ((\evb) << 8) | (\eva) + .endm + + .macro blendoff + .byte 0x0D + .endm + + .macro call addr + .byte 0x0E + .4byte \addr + .endm + + .macro ret + .byte 0x0F + .endm + + .macro setvar var_num, value + .byte 0x10 + .byte \var_num + .2byte \value + .endm + + .macro ifelse addr1, addr2 + .byte 0x11 + .4byte \addr1 + .4byte \addr2 + .endm + + .macro jumpif cond, addr + .byte 0x12 + .byte \cond + .4byte \addr + .endm + + .macro jump addr + .byte 0x13 + .4byte \addr + .endm + + .macro fadetobg id + .byte 0x14 + .byte \id + .endm + + .macro restorebg + .byte 0x15 + .endm + + .macro waitbgfadeout + .byte 0x16 + .endm + + .macro waitbgfadein + .byte 0x17 + .endm + + .macro changebg id + .byte 0x18 + .byte \id + .endm + + .macro panse_19 id, pan + .byte 0x19 + .2byte \id + .byte \pan + .endm + + .macro setpan pan + .byte 0x1A + .byte \pan + .endm + + .macro panse_1B id, pan_start, pan_end, step, delay + .byte 0x1B + .2byte \id + .byte \pan_start + .byte \pan_end + .byte \step + .byte \delay + .endm + + .macro panse_1C id, pan, delay, count + .byte 0x1C + .2byte \id + .byte \pan + .byte \delay + .byte \count + .endm + + .macro panse_1D id, pan, count + .byte 0x1D + .2byte \id + .byte \pan + .byte \count + .endm + + .macro setbldcnt bldcnt + .byte 0x1E + .2byte \bldcnt + .endm + + .macro createtask_1F addr, argv:vararg + .byte 0x1F + .4byte \addr + .byte (.Lcreatetask_1F_\@_2 - .Lcreatetask_1F_\@_1) / 2 +.Lcreatetask_1F_\@_1: + .2byte \argv +.Lcreatetask_1F_\@_2: + .endm + + .macro waitsound + .byte 0x20 + .endm + + .macro jumpvareq var_num, value, addr + .byte 0x21 + .byte \var_num + .2byte \value + .4byte \addr + .endm + + .macro monbg_22 unk + .byte 0x22 + .byte \unk + .endm + + .macro clearmonbg_23 unk + .byte 0x23 + .byte \unk + .endm + + .macro jumpunkcond addr + .byte 0x24 + .4byte \addr + .endm + + .macro fadetobg_25 a, b, c + .byte 0x25 + .byte \a + .byte \b + .byte \c + .endm + + .macro panse_26 id, pan_start, pan_end, step, delay + .byte 0x26 + .2byte \id + .byte \pan_start + .byte \pan_end + .byte \step + .byte \delay + .endm + + .macro panse_27 id, pan_start, pan_end, step, delay + .byte 0x27 + .2byte \id + .byte \pan_start + .byte \pan_end + .byte \step + .byte \delay + .endm + + .macro monbgprio_28 unk + .byte 0x28 + .byte \unk + .endm + + .macro monbgprio_29 + .byte 0x29 + .endm + + .macro monbgprio_2A unk + .byte 0x2A + .byte \unk + .endm + + .macro invisible side + .byte 0x2B + .byte \side + .endm + + .macro visible side + .byte 0x2C + .byte \side + .endm + + .macro doublebattle_2D unk + .byte 0x2D + .byte \unk + .endm + + .macro doublebattle_2E unk + .byte 0x2E + .byte \unk + .endm + + .macro stopsound + .byte 0x2F + .endm diff --git a/payload/asm/macros/battle_script.inc b/payload/asm/macros/battle_script.inc new file mode 100644 index 0000000..5dd1d5a --- /dev/null +++ b/payload/asm/macros/battle_script.inc @@ -0,0 +1,1228 @@ +@ 0 == +@ 1 != +@ 2 < +@ 3 > +@ 4 &= + + .macro calculatedamage + critical + atk5 + atk6 + atk7 + .endm + + + .macro attackcanceler + .byte 0x00 + .endm + + .macro accuracycheck address, param1 + .byte 0x01 + .4byte \address + .2byte \param1 + .endm + + .macro attackstring + .byte 0x02 + .endm + + .macro ppreduce + .byte 0x03 + .endm + + .macro critcalc + .byte 0x04 + .endm + + .macro atk5 + .byte 0x05 + .endm + + .macro atk6 + .byte 0x06 + .endm + + .macro atk7 + .byte 0x07 + .endm + + .macro atk8 + .byte 0x08 + .endm + + .macro attackanimation + .byte 0x09 + .endm + + .macro waitanimation + .byte 0x0a + .endm + + .macro graphicalhpupdate bank + .byte 0x0b + .byte \bank + .endm + + .macro datahpupdate bank + .byte 0x0c + .byte \bank + .endm + + .macro critmessage + .byte 0x0d + .endm + + .macro missmessage + .byte 0x0e + .endm + + .macro resultmessage + .byte 0x0f + .endm + + .macro printstring string + .byte 0x10 + .2byte \string + .endm + + .macro printstring2 string + .byte 0x11 + .2byte \string + .endm + + .macro waitmessage delay + .byte 0x12 + .2byte \delay + .endm + + .macro printfromtable table + .byte 0x13 + .4byte \table + .endm + + .macro printfromtable2 table + .byte 0x14 + .4byte \table + .endm + + .macro seteffectwithchancetarget + .byte 0x15 + .endm + + .macro seteffecttarget + .byte 0x16 + .endm + + .macro seteffectuser + .byte 0x17 + .endm + + .macro clearstatus bank + .byte 0x18 + .byte \bank + .endm + + .macro faintpokemon bank, param2, param3 + .byte 0x19 + .byte \bank + .byte \param2 + .4byte \param3 + .endm + + .macro atk1a param1 + .byte 0x1a + .byte \param1 + .endm + + .macro atk1b bank + .byte 0x1b + .byte \bank + .endm + + .macro jumpifstatus bank, status, address + .byte 0x1c + .byte \bank + .4byte \status + .4byte \address + .endm + + .macro jumpifsecondarytstatus bank, status, address + .byte 0x1d + .byte \bank + .4byte \status + .4byte \address + .endm + + .macro jumpifability bank, ability, address + .byte 0x1e + .byte \bank + .byte \ability + .4byte \address + .endm + + .macro jumpifhalverset bank, status, address + .byte 0x1f + .byte \bank + .2byte \status + .4byte \address + .endm + + .macro jumpifstat bank, flag, quantity, statid, address + .byte 0x20 + .byte \bank + .byte \flag + .byte \quantity + .byte \statid + .4byte \address + .endm + + .macro jumpifspecialstatusflag bank, mask, status, address + .byte 0x21 + .byte \bank + .4byte \mask + .byte \status + .4byte \address + .endm + + .macro jumpiftype bank, type, address + .byte 0x22 + .byte \bank + .byte \type + .4byte \address + .endm + + .macro atk23 bank + .byte 0x23 + .byte \bank + .endm + + .macro atk24 address + .byte 0x24 + .4byte \address + .endm + + .macro atk25 + .byte 0x25 + .endm + + .macro atk26 param1 + .byte 0x26 + .byte \param1 + .endm + + .macro atk27 address + .byte 0x27 + .4byte \address + .endm + + .macro jump address + .byte 0x28 + .4byte \address + .endm + + .macro jumpifbyte ifflag, checkaddr, compare, address + .byte 0x29 + .byte \ifflag + .4byte \checkaddr + .byte \compare + .4byte \address + .endm + + .macro jumpifhalfword ifflag, checkaddr, compare, address + .byte 0x2a + .byte \ifflag + .4byte \checkaddr + .2byte \compare + .4byte \address + .endm + + .macro jumpifword ifflag, checkaddr, compare, address + .byte 0x2b + .byte \ifflag + .4byte \checkaddr + .4byte \compare + .4byte \address + .endm + + .macro jumpifarrayequal mem1, mem2, size, address + .byte 0x2c + .4byte \mem1 + .4byte \mem2 + .byte \size + .4byte \address + .endm + + .macro jumpifarraynotequal mem1, mem2, size, address + .byte 0x2d + .4byte \mem1 + .4byte \mem2 + .byte \size + .4byte \address + .endm + + .macro setbyte pointer, value + .byte 0x2e + .4byte \pointer + .byte \value + .endm + + .macro addbyte pointer, value + .byte 0x2f + .4byte \pointer + .byte \value + .endm + + .macro subtractbyte pointer, value + .byte 0x30 + .4byte \pointer + .byte \value + .endm + + .macro copyarray destination, source, size + .byte 0x31 + .4byte \destination + .4byte \source + .byte \size + .endm + + .macro atk32 param1, param2, param3, byte + .byte 0x32 + .4byte \param1 + .4byte \param2 + .4byte \param3 + .byte \byte + .endm + + .macro orbyte pointer, value + .byte 0x33 + .4byte \pointer + .byte \value + .endm + + .macro orhalfword pointer, value + .byte 0x34 + .4byte \pointer + .2byte \value + .endm + + .macro orword pointer, value + .byte 0x35 + .4byte \pointer + .4byte \value + .endm + + .macro bicbyte pointer, value + .byte 0x36 + .4byte \pointer + .byte \value + .endm + + .macro bichalfword pointer, value + .byte 0x37 + .4byte \pointer + .2byte \value + .endm + + .macro bicword pointer, value + .byte 0x38 + .4byte \pointer + .4byte \value + .endm + + .macro pause pause_duration + .byte 0x39 + .2byte \pause_duration + .endm + + .macro waitstateatk + .byte 0x3a + .endm + + .macro somethinghealatk3b bank + .byte 0x3b + .byte \bank + .endm + + .macro return + .byte 0x3c + .endm + + .macro end + .byte 0x3d + .endm + + .macro end2 + .byte 0x3e + .endm + + .macro end3 + .byte 0x3f + .endm + + .macro atk40 address + .byte 0x40 + .4byte \address + .endm + + .macro callatk address + .byte 0x41 + .4byte \address + .endm + + .macro jumpiftype2 bank, type, address + .byte 0x42 + .byte \bank + .byte \type + .4byte \address + .endm + + .macro jumpifabilitypresent ability, address + .byte 0x43 + .byte \ability + .4byte \address + .endm + + .macro atk44 + .byte 0x44 + .endm + + .macro playanimation bank, animation, var_address + .byte 0x45 + .byte \bank + .byte \animation + .4byte \var_address + .endm + + .macro atk46 bank, address, int + .byte 0x46 + .byte \bank + .4byte \address + .4byte \int + .endm + + .macro atk47 + .byte 0x47 + .endm + + .macro playstatchangeanimation bank, color, byte + .byte 0x48 + .byte \bank + .byte \color + .byte \byte + .endm + + .macro atk49 byte1, byte2 + .byte 0x49 + .byte \byte1 + .byte \byte2 + .endm + + .macro damagecalc2 + .byte 0x4a + .endm + + .macro atk4b + .byte 0x4b + .endm + + .macro switch1 bank + .byte 0x4c + .byte \bank + .endm + + .macro switch2 bank + .byte 0x4d + .byte \bank + .endm + + .macro switch3 bank, byte + .byte 0x4e + .byte \bank + .byte \byte + .endm + + .macro jumpifcannotswitch bank, address + .byte 0x4f + .byte \bank + .4byte \address + .endm + + .macro openpartyscreen bank, address + .byte 0x50 + .byte \bank + .4byte \address + .endm + + .macro atk51 bank, param2 + .byte 0x51 + .byte \bank + .byte \param2 + .endm + + .macro atk52 bank + .byte 0x52 + .byte \bank + .endm + + .macro atk53 bank + .byte 0x53 + .byte \bank + .endm + + .macro atk54 word + .byte 0x54 + .2byte \word + .endm + + .macro atk55 int + .byte 0x55 + .4byte \int + .endm + + .macro atk56 bank_or_side + .byte 0x56 + .byte \bank_or_side + .endm + + .macro atk57 + .byte 0x57 + .endm + + .macro atk58 bank + .byte 0x58 + .byte \bank + .endm + + .macro checkiflearnmoveinbattle param1, param2, bank_maybe + .byte 0x59 + .4byte \param1 + .4byte \param2 + .byte \bank_maybe + .endm + + .macro atk5a address + .byte 0x5a + .4byte \address + .endm + + .macro atk5b address + .byte 0x5b + .4byte \address + .endm + + .macro atk5c bank + .byte 0x5c + .byte \bank + .endm + + .macro atk5d + .byte 0x5d + .endm + + .macro atk5e bank + .byte 0x5e + .byte \bank + .endm + + .macro atk5f + .byte 0x5f + .endm + + .macro atk60 byte + .byte 0x60 + .byte \byte + .endm + + .macro atk61 bank_or_side + .byte 0x61 + .byte \bank_or_side + .endm + + .macro atk62 bank_or_side + .byte 0x62 + .byte \bank_or_side + .endm + + .macro jumptoattack bank + .byte 0x63 + .byte \bank + .endm + + .macro statusanimation bank + .byte 0x64 + .byte \bank + .endm + + .macro atk65 bank_or_side, address + .byte 0x65 + .byte \bank_or_side + .4byte \address + .endm + + .macro atk66 bank_or_side, bank_or_side2, address + .byte 0x66 + .byte \bank_or_side + .byte \bank_or_side2 + .4byte \address + .endm + + .macro atk67 + .byte 0x67 + .endm + + .macro atk68 + .byte 0x68 + .endm + + .macro atk69 + .byte 0x69 + .endm + + .macro removeitem bank + .byte 0x6a + .byte \bank + .endm + + .macro atk6b + .byte 0x6b + .endm + + .macro atk6c + .byte 0x6c + .endm + + .macro atk6d + .byte 0x6d + .endm + + .macro atk6e + .byte 0x6e + .endm + + .macro atk6f bank + .byte 0x6f + .byte \bank + .endm + + .macro atk70 bank + .byte 0x70 + .byte \bank + .endm + + .macro atk71 + .byte 0x71 + .endm + + .macro atk72 address + .byte 0x72 + .4byte \address + .endm + + .macro atk73 bank + .byte 0x73 + .byte \bank + .endm + + .macro atk74 bank + .byte 0x74 + .byte \bank + .endm + + .macro atk75 + .byte 0x75 + .endm + + .macro atk76 bank, byte + .byte 0x76 + .byte \bank + .byte \byte + .endm + + .macro setprotect + .byte 0x77 + .endm + + .macro faintifabilitynotdamp + .byte 0x78 + .endm + + .macro setuserhptozero + .byte 0x79 + .endm + + .macro jumpwhiletargetvalid address + .byte 0x7a + .4byte \address + .endm + + .macro setdamageasrestorehalfmaxhp address, byte + .byte 0x7b + .4byte \address + .byte \byte + .endm + + .macro jumptolastusedattack + .byte 0x7c + .endm + + .macro setrain + .byte 0x7d + .endm + + .macro setreflect + .byte 0x7e + .endm + + .macro setleechseed + .byte 0x7f + .endm + + .macro manipulatedamage id + .byte 0x80 + .byte \id + .endm + + .macro setrest address + .byte 0x81 + .4byte \address + .endm + + .macro jumpifnotfirstturn address + .byte 0x82 + .4byte \address + .endm + + .macro nop3 + .byte 0x83 + .endm + + .macro jumpifcannotsleep address + .byte 0x84 + .4byte \address + .endm + + .macro stockpile + .byte 0x85 + .endm + + .macro stockpiletobasedamage address + .byte 0x86 + .4byte \address + .endm + + .macro stockpiletohprecovery address + .byte 0x87 + .4byte \address + .endm + + .macro negativedamage + .byte 0x88 + .endm + + .macro statbuffchange target, address + .byte 0x89 + .byte \target + .4byte \address + .endm + + .macro normalisebuffs + .byte 0x8a + .endm + + .macro setbide + .byte 0x8b + .endm + + .macro confuseifrepeatingattackends + .byte 0x8c + .endm + + .macro setloopcounter count + .byte 0x8d + .byte \count + .endm + + .macro atk8e + .byte 0x8e + .endm + + .macro forcerandomswitch address + .byte 0x8f + .4byte \address + .endm + + .macro changetypestoenemyattacktype address + .byte 0x90 + .4byte \address + .endm + + .macro givemoney + .byte 0x91 + .endm + + .macro setlightscreen + .byte 0x92 + .endm + + .macro koplussomethings address + .byte 0x93 + .4byte \address + .endm + + .macro gethalfcurrentenemyhp + .byte 0x94 + .endm + + .macro setsandstorm + .byte 0x95 + .endm + + .macro weatherdamage + .byte 0x96 + .endm + + .macro tryinfatuatetarget address + .byte 0x97 + .4byte \address + .endm + + .macro atk98 byte + .byte 0x98 + .byte \byte + .endm + + .macro setmisteffect + .byte 0x99 + .endm + + .macro setincreasedcriticalchance + .byte 0x9a + .endm + + .macro transformdataexecution + .byte 0x9b + .endm + + .macro setsubstituteeffect + .byte 0x9c + .endm + + .macro copyattack address + .byte 0x9d + .4byte \address + .endm + + .macro metronomeeffect + .byte 0x9e + .endm + + .macro nightshadedamageeffect + .byte 0x9f + .endm + + .macro psywavedamageeffect + .byte 0xa0 + .endm + + .macro counterdamagecalculator address + .byte 0xa1 + .4byte \address + .endm + + .macro mirrorcoatdamagecalculator address + .byte 0xa2 + .4byte \address + .endm + + .macro disablelastusedattack address + .byte 0xa3 + .4byte \address + .endm + + .macro setencore address + .byte 0xa4 + .4byte \address + .endm + + .macro painsplitdamagecalculator address + .byte 0xa5 + .4byte \address + .endm + + .macro settypetorandomresistance address + .byte 0xa6 + .4byte \address + .endm + + .macro setalwayshitflag + .byte 0xa7 + .endm + + .macro copymovepermanently address + .byte 0xa8 + .4byte \address + .endm + + .macro selectrandommovefromusermoves address + .byte 0xa9 + .4byte \address + .endm + + .macro destinybondeffect + .byte 0xaa + .endm + + .macro atkab + .byte 0xab + .endm + + .macro remaininghptopower + .byte 0xac + .endm + + .macro reducepprandom address + .byte 0xad + .4byte \address + .endm + + .macro clearstatusifnotsoundproofed + .byte 0xae + .endm + + .macro cursetarget address + .byte 0xaf + .4byte \address + .endm + + .macro setspikes address + .byte 0xb0 + .4byte \address + .endm + + .macro setforesight + .byte 0xb1 + .endm + + .macro setperishsong address + .byte 0xb2 + .4byte \address + .endm + + .macro rolloutdamagecalculation + .byte 0xb3 + .endm + + .macro jumpifconfusedandattackmaxed bank, address + .byte 0xb4 + .byte \bank + .4byte \address + .endm + + .macro furycutterdamagecalculation + .byte 0xb5 + .endm + + .macro happinesstodamagecalculation + .byte 0xb6 + .endm + + .macro presentdamagecalculation + .byte 0xb7 + .endm + + .macro setsafeguard + .byte 0xb8 + .endm + + .macro magnitudedamagecalculation + .byte 0xb9 + .endm + + .macro atkba address + .byte 0xba + .4byte \address + .endm + + .macro setsunny + .byte 0xbb + .endm + + .macro maxattackhalvehp address + .byte 0xbc + .4byte \address + .endm + + .macro copyfoestats address + .byte 0xbd + .4byte \address + .endm + + .macro breakfree + .byte 0xbe + .endm + + .macro setcurled + .byte 0xbf + .endm + + .macro recoverbasedonsunlight address + .byte 0xc0 + .4byte \address + .endm + + .macro hiddenpowerdamagecalculation + .byte 0xc1 + .endm + + .macro selectnexttarget + .byte 0xc2 + .endm + + .macro setfutureattack address + .byte 0xc3 + .4byte \address + .endm + + .macro beatupcalculation address1, address2 + .byte 0xc4 + .4byte \address1 + .4byte \address2 + .endm + + .macro hidepreattack + .byte 0xc5 + .endm + + .macro unhidepostattack + .byte 0xc6 + .endm + + .macro setminimize + .byte 0xc7 + .endm + + .macro sethail + .byte 0xc8 + .endm + + .macro jumpifattackandspecialattackcannotfall address + .byte 0xc9 + .4byte \address + .endm + + .macro setforcedtarget + .byte 0xca + .endm + + .macro setcharge + .byte 0xcb + .endm + + .macro callterrainattack + .byte 0xcc + .endm + + .macro cureifburnedparalysedorpoisoned address + .byte 0xcd + .4byte \address + .endm + + .macro settorment address + .byte 0xce + .4byte \address + .endm + + .macro jumpifnodamage address + .byte 0xcf + .4byte \address + .endm + + .macro settaunt address + .byte 0xd0 + .4byte \address + .endm + + .macro sethelpinghand address + .byte 0xd1 + .4byte \address + .endm + + .macro itemswap address + .byte 0xd2 + .4byte \address + .endm + + .macro copyability address + .byte 0xd3 + .4byte \address + .endm + + .macro atkd4 byte, address + .byte 0xd4 + .byte \byte + .4byte \address + .endm + + .macro setroots address + .byte 0xd5 + .4byte \address + .endm + + .macro doubledamagedealtifdamaged + .byte 0xd6 + .endm + + .macro setyawn address + .byte 0xd7 + .4byte \address + .endm + + .macro setdamagetohealthdifference address + .byte 0xd8 + .4byte \address + .endm + + .macro scaledamagebyhealthratio + .byte 0xd9 + .endm + + .macro abilityswap address + .byte 0xda + .4byte \address + .endm + + .macro imprisoneffect address + .byte 0xdb + .4byte \address + .endm + + .macro setgrudge address + .byte 0xdc + .4byte \address + .endm + + .macro weightdamagecalculation + .byte 0xdd + .endm + + .macro assistattackselect address + .byte 0xde + .4byte \address + .endm + + .macro setmagiccoat address + .byte 0xdf + .4byte \address + .endm + + .macro setstealstatchange address + .byte 0xe0 + .4byte \address + .endm + + .macro atke1 address + .byte 0xe1 + .4byte \address + .endm + + .macro atke2 bank + .byte 0xe2 + .byte \bank + .endm + + .macro jumpiffainted bank, address + .byte 0xe3 + .byte \bank + .4byte \address + .endm + + .macro naturepowereffect + .byte 0xe4 + .endm + + .macro pickupitemcalculation + .byte 0xe5 + .endm + + .macro actualcastformswitch + .byte 0xe6 + .endm + + .macro castformswitch + .byte 0xe7 + .endm + + .macro settypebasedhalvers address + .byte 0xe8 + .4byte \address + .endm + + .macro seteffectbyweather + .byte 0xe9 + .endm + + .macro recycleitem address + .byte 0xea + .4byte \address + .endm + + .macro settypetoterrain address + .byte 0xeb + .4byte \address + .endm + + .macro pursuitwhenswitched address + .byte 0xec + .4byte \address + .endm + + .macro snatchmove + .byte 0xed + .endm + + .macro removereflectlightscreen + .byte 0xee + .endm + + .macro pokemoncatchfunction + .byte 0xef + .endm + + .macro catchpoke + .byte 0xf0 + .endm + + .macro capturesomethingf1 address + .byte 0xf1 + .4byte \address + .endm + + .macro capturesomethingf2 + .byte 0xf2 + .endm + + .macro capturesomethingf3 address + .byte 0xf3 + .4byte \address + .endm + + .macro removehp + .byte 0xf4 + .endm + + .macro curestatusfirstword + .byte 0xf5 + .endm + + .macro atkf6 + .byte 0xf6 + .endm + + .macro activesidesomething + .byte 0xf7 + .endm + + .macro atkf8 bank + .byte 0xf8 + .byte \bank + .endm diff --git a/payload/asm/macros/contest_ai_script.inc b/payload/asm/macros/contest_ai_script.inc new file mode 100644 index 0000000..05d70e3 --- /dev/null +++ b/payload/asm/macros/contest_ai_script.inc @@ -0,0 +1,506 @@ +@ Add a positive/negative value to the score of the move being evaluated. + + .macro score score + .byte 0x00 + .byte \score + .endm + +@ turn (AKA "Appeal No.") + + .macro get_turn + .byte 0x01 + .endm + + .macro if_turn_less_than param, addr + .byte 0x02 + .byte \param + .4byte \addr + .endm + + .macro if_turn_more_than param, addr + .byte 0x03 + .byte \param + .4byte \addr + .endm + + .macro if_turn_eq param, addr + .byte 0x04 + .byte \param + .4byte \addr + .endm + + .macro if_turn_not_eq param, addr + .byte 0x05 + .byte \param + .4byte \addr + .endm + +@ audience excitement + + .macro get_excitement + .byte 0x06 + .endm + + .macro if_excitement_less_than param, addr + .byte 0x07 + .byte \param + .4byte \addr + .endm + + .macro if_excitement_more_than param, addr + .byte 0x08 + .byte \param + .4byte \addr + .endm + + .macro if_excitement_eq param, addr + .byte 0x09 + .byte \param + .4byte \addr + .endm + + .macro if_excitement_not_eq param, addr + .byte 0x0A + .byte \param + .4byte \addr + .endm + +@ the order that the user goes in the current turn + + .macro get_user_order + .byte 0x0B + .endm + + .macro if_user_order_less_than param addr + .byte 0x0C + .byte \param + .4byte \addr + .endm + + .macro if_user_order_more_than param addr + .byte 0x0D + .byte \param + .4byte \addr + .endm + + .macro if_user_order_eq param addr + .byte 0x0E + .byte \param + .4byte \addr + .endm + + .macro if_user_order_not_eq param addr + .byte 0x0F + .byte \param + .4byte \addr + .endm + +@ user condition + + .macro get_user_condition + .byte 0x10 + .endm + + .macro if_user_condition_less_than param, addr + .byte 0x11 + .byte \param + .4byte \addr + .endm + + .macro if_user_condition_more_than param, addr + .byte 0x12 + .byte \param + .4byte \addr + .endm + + .macro if_user_condition_eq param, addr + .byte 0x13 + .byte \param + .4byte \addr + .endm + + .macro if_user_condition_not_eq param, addr + .byte 0x14 + .byte \param + .4byte \addr + .endm + +@ 15 +@ 16 +@ 17 +@ 18 +@ 19 +@ 1A +@ 1B +@ 1C +@ 1D +@ 1E + +@ contest type + + .macro get_contest_type + .byte 0x1F + .endm + + .macro if_contest_type_eq param, addr + .byte 0x20 + .byte \param + .4byte \addr + .endm + + .macro if_contest_type_not_eq param, addr + .byte 0x21 + .byte \param + .4byte \addr + .endm + +@ move excitement (change in excitement due to move) + + .macro get_move_excitement + .byte 0x22 + .endm + + .macro if_move_excitement_less_than param, addr + .byte 0x23 + .byte \param + .4byte \addr + .endm + + .macro if_move_excitement_more_than param, addr + .byte 0x24 + .byte \param + .4byte \addr + .endm + + .macro if_move_excitement_eq param, addr + .byte 0x25 + .byte \param + .4byte \addr + .endm + + .macro if_move_excitement_not_eq param, addr + .byte 0x26 + .byte \param + .4byte \addr + .endm + +@ move effect + + .macro get_effect + .byte 0x27 + .endm + + .macro if_effect_eq param, addr + .byte 0x28 + .byte \param + .4byte \addr + .endm + + .macro if_effect_not_eq param, addr + .byte 0x29 + .byte \param + .4byte \addr + .endm + +@ move effect type + + .macro get_effect_type + .byte 0x2A + .endm + + .macro if_effect_type_eq param, addr + .byte 0x2B + .byte \param + .4byte \addr + .endm + + .macro if_effect_type_not_eq param, addr + .byte 0x2C + .byte \param + .4byte \addr + .endm + +@ whether the current move is the most appealing in the user's moveset + + .macro check_most_appealing_move + .byte 0x2D + .endm + + .macro if_most_appealing_move addr + .byte 0x2E + .4byte \addr + .endm + +@ 2F +@ 30 +@ 31 +@ 32 +@ 33 +@ 34 +@ 35 +@ 36 +@ 37 +@ 38 +@ 39 +@ 3A + +@ number of times current move has been used + + .macro get_move_used_count + .byte 0x3B + .endm + + .macro if_move_used_count_less_than param, addr + .byte 0x3C + .byte \param + .4byte \addr + .endm + + .macro if_move_used_count_more_than param, addr + .byte 0x3D + .byte \param + .4byte \addr + .endm + + .macro if_move_used_count_eq param, addr + .byte 0x3E + .byte \param + .4byte \addr + .endm + + .macro if_move_used_count_not_eq param, addr + .byte 0x3F + .byte \param + .4byte \addr + .endm + +@ whether the current move is a combo starter (with another move in the moveset) + + .macro check_combo_starter + .byte 0x40 + .endm + + .macro if_combo_starter addr + .byte 0x41 + .4byte \addr + .endm + + .macro if_not_combo_starter addr + .byte 0x42 + .4byte \addr + .endm + +@ whether the current move is a combo finisher (with another move in the moveset) + + .macro check_combo_finisher + .byte 0x43 + .endm + + .macro if_combo_finisher addr + .byte 0x44 + .4byte \addr + .endm + + .macro if_not_combo_finisher addr + .byte 0x45 + .4byte \addr + .endm + +@ whether the current move would finish a combo + + .macro check_would_finish_combo + .byte 0x46 + .endm + + .macro if_would_finish_combo addr + .byte 0x47 + .4byte \addr + .endm + + .macro if_would_not_finish_combo addr + .byte 0x48 + .4byte \addr + .endm + +@ condition of mon (indexed by order) + + .macro get_condition mon + .byte 0x49 + .byte \mon + .endm + + .macro if_condition_less_than mon, value, addr + .byte 0x4A + .byte \mon + .byte \value + .4byte \addr + .endm + + .macro if_condition_more_than mon, value, addr + .byte 0x4B + .byte \mon + .byte \value + .4byte \addr + .endm + + .macro if_condition_eq mon, value, addr + .byte 0x4C + .byte \mon + .byte \value + .4byte \addr + .endm + + .macro if_condition_not_eq mon, value, addr + .byte 0x4D + .byte \mon + .byte \value + .4byte \addr + .endm + +@ whether the mon used a combo starter move +@ Even though this value is always 1 or 0 (i.e. TRUE/FALSE), +@ there are less-than and greater-than comparison operations for some reason. + + .macro get_used_combo_starter mon + .byte 0x4E + .byte \mon + .endm + + .macro if_used_combo_starter_less_than mon, value, addr + .byte 0x4F + .byte \mon + .byte \value + .4byte \addr + .endm + + .macro if_used_combo_starter_more_than mon, value, addr + .byte 0x50 + .byte \mon + .byte \value + .4byte \addr + .endm + + + .macro if_used_combo_starter_eq mon, value, addr + .byte 0x51 + .byte \mon + .byte \value + .4byte \addr + .endm + + .macro if_used_combo_starter_not_eq mon, value, addr + .byte 0x52 + .byte \mon + .byte \value + .4byte \addr + .endm + +@ whether the mon can make an appeal + + .macro check_can_participate mon + .byte 0x53 + .byte \mon + .endm + + .macro if_can_participate mon, addr + .byte 0x54 + .byte \mon + .4byte \addr + .endm + + .macro if_cannot_participate mon, addr + .byte 0x55 + .byte \mon + .4byte \addr + .endm + +@ 56 +@ 57 + + .macro contest_58 param addr + .byte 0x58 + .byte \param + .4byte \addr + .endm + +@ 59 +@ 5A +@ 5B +@ 5C +@ 5D +@ 5E +@ 5F +@ 60 +@ 61 +@ 62 +@ 63 +@ 64 +@ 65 +@ 66 +@ 67 +@ 68 +@ 69 +@ 6A +@ 6B +@ 6C +@ 6D +@ 6E +@ 6F +@ 70 +@ 71 +@ 72 +@ 73 +@ 74 +@ 75 +@ 76 +@ 77 +@ 78 +@ 79 +@ 7A +@ 7B +@ 7C + + .macro if_random param addr + .byte 0x7D + .byte \param + .4byte \addr + .endm + +@ 7E + + .macro jump addr + .byte 0x7F + .4byte \addr + .endm + + .macro call addr + .byte 0x80 + .4byte \addr + .endm + + .macro end + .byte 0x81 + .endm + + .macro check_user_has_exciting_move + .byte 0x82 + .endm + + .macro if_user_has_exciting_move addr + .byte 0x83 + .4byte \addr + .endm + + .macro if_user_doesnt_have_exciting_move addr + .byte 0x84 + .4byte \addr + .endm + +@ 85 +@ 86 + + .macro if_effect_in_user_moveset param addr + .byte 0x87 + .2byte \param + .4byte \addr + .endm diff --git a/payload/asm/macros/ec.inc b/payload/asm/macros/ec.inc new file mode 100644 index 0000000..d3fd45c --- /dev/null +++ b/payload/asm/macros/ec.inc @@ -0,0 +1,8 @@ + + .macro ec_duplicates count + .2byte 0xff00 + \count + .endm + + .macro ec_words_by_letter label + .2byte (gEasyChatWordsByLetter_\label - gEasyChatWordsAlphabetized) / 2 + .endm diff --git a/payload/asm/macros/event.inc b/payload/asm/macros/event.inc new file mode 100644 index 0000000..7ce50a5 --- /dev/null +++ b/payload/asm/macros/event.inc @@ -0,0 +1,1444 @@ + @ Does nothing. + .macro nop + .byte 0x00 + .endm + + @ Does nothing. + .macro nop1 + .byte 0x01 + .endm + + @ Terminates script execution. + .macro end + .byte 0x02 + .endm + + @ Jumps back to after the last-executed call statement, and continues script execution from there. + .macro return + .byte 0x03 + .endm + + @ Jumps to destination and continues script execution from there. The location of the calling script is remembered and can be returned to later. + .macro call destination + .byte 0x04 + .4byte \destination + .endm + + @ Jumps to destination and continues script execution from there. + .macro goto destination + .byte 0x05 + .4byte \destination + .endm + + @ If the result of the last comparison matches condition (see Comparison operators), jumps to destination and continues script execution from there. + .macro goto_if condition, destination + .byte 0x06 + .byte \condition + .4byte \destination + .endm + + @ If the result of the last comparison matches condition (see Comparison operators), calls destination. + .macro call_if condition, destination + .byte 0x07 + .byte \condition + .4byte \destination + .endm + + @ Jumps to the standard function at index function. + .macro gotostd function + .byte 0x08 + .byte \function + .endm + + @ Calls the standard function at index function. + .macro callstd function + .byte 0x09 + .byte \function + .endm + + @ If the result of the last comparison matches condition (see Comparison operators), jumps to the standard function at index function. + .macro gotostd_if condition, function + .byte 0x0a + .byte \condition + .byte \function + .endm + + @ If the result of the last comparison matches condition (see Comparison operators), calls the standard function at index function. + .macro callstd_if condition, function + .byte 0x0b + .byte \condition + .byte \function + .endm + + @ Executes a script stored in a default RAM location. + .macro gotoram + .byte 0x0c + .endm + + @ Terminates script execution and "resets the script RAM". + .macro killscript + .byte 0x0d + .endm + + @ Sets mystery event status + .macro setmysteryeventstatus value + .byte 0x0e + .byte \value + .endm + + @ Sets the specified script bank to immediate value. + .macro loadword destination, value + .byte 0x0f + .byte \destination + .4byte \value + .endm + + @ Sets the specified script bank to immediate value. + .macro loadbyte destination, value + .byte 0x10 + .byte \destination + .byte \value + .endm + + @ Sets the byte at offset to value. + .macro writebytetoaddr value, offset + .byte 0x11 + .byte \value + .4byte \offset + .endm + + @ Copies the byte value at source into the specified script bank. + .macro loadbytefromaddr destination, source + .byte 0x12 + .byte \destination + .4byte \source + .endm + + @ Not sure. Judging from XSE's description I think it takes the least-significant byte in bank source and writes it to destination. + .macro setptrbyte source, destination + .byte 0x13 + .byte \source + .4byte \destination + .endm + + @ Copies the contents of bank source into bank destination. + .macro copylocal destination, source + .byte 0x14 + .byte \destination + .byte \source + .endm + + @ Copies the byte at source to destination, replacing whatever byte was previously there. + .macro copybyte destination, source + .byte 0x15 + .4byte \destination + .4byte \source + .endm + + @ Changes the value of destination to value. + .macro setvar destination, value + .byte 0x16 + .2byte \destination + .2byte \value + .endm + + @ Changes the value of destination by adding value to it. Overflow is not prevented (0xFFFF + 1 = 0x0000). + .macro addvar destination, value + .byte 0x17 + .2byte \destination + .2byte \value + .endm + + @ Changes the value of destination by subtracting value to it. Overflow is not prevented (0x0000 - 1 = 0xFFFF). + .macro subvar destination, value + .byte 0x18 + .2byte \destination + .2byte \value + .endm + + @ Copies the value of source into destination. + .macro copyvar destination, source + .byte 0x19 + .2byte \destination + .2byte \source + .endm + + @ If source is not a variable, then this function acts like setvar. Otherwise, it acts like copyvar. + .macro setorcopyvar destination, source + .byte 0x1a + .2byte \destination + .2byte \source + .endm + + @ Compares the values of script banks a and b, after forcing the values to bytes. + .macro compare_local_to_local byte1, byte2 + .byte 0x1b + .byte \byte1 + .byte \byte2 + .endm + + @ Compares the least-significant byte of the value of script bank a to a fixed byte value (b). + .macro compare_local_to_value a, b + .byte 0x1c + .byte \a + .byte \b + .endm + + @ Compares the least-significant byte of the value of script bank a to the byte located at offset b. + .macro compare_local_to_addr a, b + .byte 0x1d + .byte \a + .4byte \b + .endm + + @ Compares the byte located at offset a to the least-significant byte of the value of script bank b. + .macro compare_addr_to_local a, b + .byte 0x1e + .4byte \a + .byte \b + .endm + + @ Compares the byte located at offset a to a fixed byte value (b). + .macro compare_addr_to_value a, b + .byte 0x1f + .4byte \a + .byte \b + .endm + + @ Compares the byte located at offset a to the byte located at offset b. + .macro compare_addr_to_addr a, b + .byte 0x20 + .4byte \a + .4byte \b + .endm + + @ Compares the value of `var` to a fixed word value (b). + .macro compare_var_to_value var, value + .byte 0x21 + .2byte \var + .2byte \value + .endm + + @ Compares the value of `var` to the value of `var2`. + .macro compare_var_to_var var1, var2 + .byte 0x22 + .2byte \var1 + .2byte \var2 + .endm + + @ Generic compare macro which attempts to deduce argument types based on their values + @ Any values between 0x4000 to 0x4FFF and 0x8000 to 0x8FFF are considered event variable identifiers + .macro compare arg1, arg2 + .if ((\arg1 >> 12) == 4 || (\arg1 >> 12) == 8) && ((\arg2 >> 12) == 4 || (\arg2 >> 12) == 8) + compare_var_to_var \arg1, \arg2 + .elseif ((\arg1 >> 12) == 4 || (\arg1 >> 12) == 8) && (\arg2 >= 0 && \arg2 <= 0xFFFF) + compare_var_to_value \arg1, \arg2 + .else + .error "Invalid arguments for 'compare'" + .endif + .endm + + @ Calls the native C function stored at `func`. + .macro callnative func + .byte 0x23 + .4byte \func + .endm + + @ Replaces the script with the function stored at `func`. Execution returns to the bytecode script when func returns TRUE. + .macro gotonative func + .byte 0x24 + .4byte \func + .endm + + @ Calls a special function; that is, a piece of ASM code designed for use by scripts and listed in a table of pointers. + .macro special function + .byte 0x25 + .2byte SPECIAL_\function + .endm + + @ Calls a special function. That function's output (if any) will be written to the variable you specify. + .macro specialvar output, function + .byte 0x26 + .2byte \output + .2byte SPECIAL_\function + .endm + + @ Blocks script execution until a command or ASM code manually unblocks it. Generally used with specific commands and specials. If this command runs, and a subsequent command or piece of ASM does not unblock state, the script will remain blocked indefinitely (essentially a hang). + .macro waitstate + .byte 0x27 + .endm + + @ Blocks script execution for time (frames? milliseconds?). + .macro delay time + .byte 0x28 + .2byte \time + .endm + + @ Sets a to 1. + .macro setflag a + .byte 0x29 + .2byte \a + .endm + + @ Sets a to 0. + .macro clearflag a + .byte 0x2a + .2byte \a + .endm + + @ Compares a to 1. + .macro checkflag a + .byte 0x2b + .2byte \a + .endm + + @ In FireRed, this command is a nop. + .macro initclock hour minute + .byte 0x2c + .endm + + @ In FireRed, this command is a nop. + .macro dodailyevents + .byte 0x2d + .endm + + @ Resets the values of variables 0x8000, 0x8001, and 0x8002. + .macro gettime + .byte 0x2e + .endm + + @ Plays the specified (sound_number) sound. Only one sound may play at a time, with newer ones interrupting older ones. + .macro playse sound_number + .byte 0x2f + .2byte \sound_number + .endm + + @ Blocks script execution until the currently-playing sound (triggered by sound) finishes playing. + .macro waitse + .byte 0x30 + .endm + + @ Plays the specified (fanfare_number) fanfare. + .macro playfanfare fanfare_number + .byte 0x31 + .2byte \fanfare_number + .endm + + @ Blocks script execution until all currently-playing fanfares finish. + .macro waitfanfare + .byte 0x32 + .endm + + @ Plays the specified (song_number) song. The byte is apparently supposed to be 0x00. + .macro playbgm song_number, unknown + .byte 0x33 + .2byte \song_number + .byte \unknown + .endm + + @ Plays the specified (song_number) song. + .macro savebgm song_number + .byte 0x34 + .2byte \song_number + .endm + + @ Crossfades the currently-playing song into the map's default song. + .macro fadedefaultbgm + .byte 0x35 + .endm + + @ Crossfades the currently-playng song into the specified (song_number) song. + .macro fadenewbgm song_number + .byte 0x36 + .2byte \song_number + .endm + + @ Fades out the currently-playing song. + .macro fadeoutbgm speed + .byte 0x37 + .byte \speed + .endm + + @ Fades the currently-playing song back in. + .macro fadeinbgm speed + .byte 0x38 + .byte \speed + .endm + + @ Sends the player to Warp warp on Map bank.map. If the specified warp is 0xFF, then the player will instead be sent to (X, Y) on the map. + .macro warp map, warp, X, Y + .byte 0x39 + map \map + .byte \warp + .2byte \X + .2byte \Y + .endm + + @ Clone of warp that does not play a sound effect. + .macro warpsilent map, warp, X, Y + .byte 0x3a + map \map + .byte \warp + .2byte \X + .2byte \Y + .endm + + @ Clone of warp that uses "a walking effect". + .macro warpdoor map, warp, X, Y + .byte 0x3b + map \map + .byte \warp + .2byte \X + .2byte \Y + .endm + + @ Warps the player to another map using a hole animation. + .macro warphole map + .byte 0x3c + map \map + .endm + + @ Clone of warp that uses a teleport effect. It is apparently only used in R/S/E.[source] + .macro warpteleport map, warp, X, Y + .byte 0x3d + map \map + .byte \warp + .2byte \X + .2byte \Y + .endm + + @ Clone of warp. Used by an (unused?) Safari Zone script to return the player to the gatehouse and end the Safari Game. + .macro setwarp map, warp, X, Y + .byte 0x3e + map \map + .byte \warp + .2byte \X + .2byte \Y + .endm + + @ Sets a default warp place. If a warp tries to send the player to Warp 127 on Map 127.127, they will instead be sent here. Useful when a map has warps that need to go to script-controlled locations (i.e. elevators). + .macro setdynamicwarp map, warp, X, Y + .byte 0x3f + map \map + .byte \warp + .2byte \X + .2byte \Y + .endm + + @ Clone of warp3, except that this writes data to different offsets... + .macro setdivewarp map, warp, X, Y + .byte 0x40 + map \map + .byte \warp + .2byte \X + .2byte \Y + .endm + + @ Clone of warp3, except that this writes data to different offsets... + .macro setholewarp map, warp, X, Y + .byte 0x41 + map \map + .byte \warp + .2byte \X + .2byte \Y + .endm + + @ Retrieves the player's zero-indexed X- and Y-coordinates in the map, and stores them in the specified variables. + .macro getplayerxy X, Y + .byte 0x42 + .2byte \X + .2byte \Y + .endm + + @ Retrieves the number of Pokmon in the player's party, and stores that number in variable 0x800D (LASTRESULT). + .macro countpokemon + .byte 0x43 + .endm + + @ Attempts to add quantity of item index to the player's Bag. If the player has enough room, the item will be added and variable 0x800D (LASTRESULT) will be set to 0x0001; otherwise, LASTRESULT is set to 0x0000. + .macro additem index, quantity + .byte 0x44 + .2byte \index + .2byte \quantity + .endm + + @ Removes quantity of item index from the player's Bag. + .macro removeitem index, quantity + .byte 0x45 + .2byte \index + .2byte \quantity + .endm + + @ Checks if the player has enough space in their Bag to hold quantity more of item index. Sets variable 0x800D (LASTRESULT) to 0x0001 if there is room, or 0x0000 is there is no room. + .macro checkitemspace index, quantity + .byte 0x46 + .2byte \index + .2byte \quantity + .endm + + @ Checks if the player has quantity or more of item index in their Bag. Sets variable 0x800D (LASTRESULT) to 0x0001 if the player has enough of the item, or 0x0000 if they have fewer than quantity of the item. + .macro checkitem index, quantity + .byte 0x47 + .2byte \index + .2byte \quantity + .endm + + @ Checks which Bag pocket the specified (index) item belongs in, and writes the value to variable 0x800D (LASTRESULT). This script is used to show the name of the proper Bag pocket when the player receives an item via callstd (simplified to giveitem in XSE). + .macro checkitemtype index + .byte 0x48 + .2byte \index + .endm + + @ Adds a quantity amount of item index to the player's PC. Both arguments can be variables. + .macro givepcitem index, quantity + .byte 0x49 + .2byte \index + .2byte \quantity + .endm + + @ Checks for quantity amount of item index in the player's PC. Both arguments can be variables. + .macro checkpcitem index, quantity + .byte 0x4a + .2byte \index + .2byte \quantity + .endm + + @ In FireRed, this command is a nop. (The argument is read, but not used for anything.) + .macro adddecor decoration + .byte 0x4b + .2byte \decoration + .endm + + @ In FireRed, this command is a nop. (The argument is read, but not used for anything.) + .macro removedecor decoration + .byte 0x4c + .2byte \decoration + .endm + + @ In FireRed, this command is a nop. (The argument is read, but not used for anything.) + .macro hasdecor decoration + .byte 0x4d + .2byte \decoration + .endm + + @ In FireRed, this command is a nop. (The argument is read, but not used for anything.) + .macro checkdecor decoration + .byte 0x4e + .2byte \decoration + .endm + + @ Applies the movement data at movements to the specified (index) Person event. Also closes any standard message boxes that are still open. + @ This command in fact uses variables to access the Person event ID. So, for example, if you setvar 0x8000 to 0x3, and then use applymovementpos 0x8000 @move1, Person event 3 will have the movements at @move1 applied to them. Thank you Shiny Quagsire for bringing this to my attention. + .macro applymovement index, movements, mapGroup, mapNum + .ifb \mapGroup + .byte 0x4f + .2byte \index + .4byte \movements + .else + .byte 0x50 + .2byte \index + .4byte \movements + .byte \mapGroup + .byte \mapNum + .endif + .endm + + @ Blocks script execution until the movements being applied to the specified (index) Person event finish. If the specified Person event is 0x0000, then the command will block script execution until all Person events affected by applymovement finish their movements. If the specified Person event is not currently being manipulated with applymovement, then this command does nothing. + .macro waitmovement index, mapBank, mapNum + .ifb \mapBank + .byte 0x51 + .2byte \index + .else + .byte 0x52 + .2byte \index + .byte \mapBank + .byte \mapNum + .endif + .endm + + @ Attempts to hide the specified (local_ID, a local ID) Person event on the specified map, by setting its visibility flag if it has a valid one. If the Person does not have a valid visibility flag, this command does nothing. + @ If no map is specified, then the current map is used + .macro removeobject localId, mapGroup, mapNum + .ifb \mapGroup + .byte 0x53 + .2byte \localId + .else + .byte 0x54 + .2byte \localId + .byte \mapGroup + .byte \mapNum + .endif + .endm + + .macro addobject localId, mapGroup, mapNum + .ifb \mapGroup + .byte 0x55 + .2byte \localId + .else + .byte 0x56 + .2byte \localId + .byte \mapGroup + .byte \mapNum + .endif + .endm + + @ Sets the specified (index) Object's position on the current map. + .macro setobjectxy index, x, y + .byte 0x57 + .2byte \index + .2byte \x + .2byte \y + .endm + + .macro showobject index, map + .byte 0x58 + .2byte \index + map \map + .endm + + .macro hideobject index, map + .byte 0x59 + .2byte \index + map \map + .endm + + @ If the script was called by an Object, then that Object will turn to face toward the metatile that the player is standing on. + .macro faceplayer + .byte 0x5a + .endm + + .macro turnobject index, direction + .byte 0x5b + .2byte \index + .byte \direction + .endm + + @ If the Trainer flag for Trainer index is not set, this command does absolutely nothing. + .macro trainerbattle type, trainer, word, pointer1, pointer2, pointer3, pointer4 + .byte 0x5c + .byte \type + .2byte \trainer + .2byte \word + .if \type == 0 + .4byte \pointer1 @ text + .4byte \pointer2 @ text + .elseif \type == 1 + .4byte \pointer1 @ text + .4byte \pointer2 @ text + .4byte \pointer3 @ event script + .elseif \type == 2 + .4byte \pointer1 @ text + .4byte \pointer2 @ text + .4byte \pointer3 @ event script + .elseif \type == 3 + .4byte \pointer1 @ text + .elseif \type == 4 + .4byte \pointer1 @ text + .4byte \pointer2 @ text + .4byte \pointer3 @ text + .elseif \type == 5 + .4byte \pointer1 @ text + .4byte \pointer2 @ text + .elseif \type == 6 + .4byte \pointer1 @ text + .4byte \pointer2 @ text + .4byte \pointer3 @ text + .4byte \pointer4 @ event script + .elseif \type == 7 + .4byte \pointer1 @ text + .4byte \pointer2 @ text + .4byte \pointer3 @ text + .elseif \type == 8 + .4byte \pointer1 @ text + .4byte \pointer2 @ text + .4byte \pointer3 @ text + .4byte \pointer4 @ event script + .elseif \type == 9 + .4byte \pointer1 @ text + .4byte \pointer2 @ text + .endif + .endm + + + @ Starts a trainer battle using the battle information stored in RAM (usually by trainerbattle, which actually calls this command behind-the-scenes), and blocks script execution until the battle finishes. + .macro battlebegin + .byte 0x5d + .endm + + .macro ontrainerbattleend + .byte 0x5e + .endm + + .macro ontrainerbattleendgoto + .byte 0x5f + .endm + + @ Compares Flag (trainer + 0x500) to 1. (If the flag is set, then the trainer has been defeated by the player.) + .macro checktrainerflag trainer + .byte 0x60 + .2byte \trainer + .endm + + @ Sets Flag (trainer + 0x500). (I didn't make a mistake. The command names actually are backwards.) + .macro settrainerflag trainer + .byte 0x61 + .2byte \trainer + .endm + + @ Clears Flag (trainer + 0x500). (I didn't make a mistake. The command names actually are backwards.) + .macro cleartrainerflag trainer + .byte 0x62 + .2byte \trainer + .endm + + .macro setobjectxyperm index, x, y + .byte 0x63 + .2byte \index + .2byte \x + .2byte \y + .endm + + .macro moveobjectoffscreen index + .byte 0x64 + .2byte \index + .endm + + .macro setobjectmovementtype word, byte + .byte 0x65 + .2byte \word + .byte \byte + .endm + + @ If a standard message box (or its text) is being drawn on-screen, this command blocks script execution until the box and its text have been fully drawn. + .macro waitmessage + .byte 0x66 + .endm + + @ Starts displaying a standard message box containing the specified text. If text is a pointer, then the string at that offset will be loaded and used. If text is script bank 0, then the value of script bank 0 will be treated as a pointer to the text. (You can use loadpointer to place a string pointer in a script bank.) + .macro message text + .byte 0x67 + .4byte \text + .endm + + @ Holds the current message box open until the player presses a key. The message box is then closed. + .macro closemessage + .byte 0x68 + .endm + + @ Ceases movement for all Objects on-screen. + .macro lockall + .byte 0x69 + .endm + + @ If the script was called by an Object, then that Object's movement will cease. + .macro lock + .byte 0x6a + .endm + + @ Resumes normal movement for all Objects on-screen, and closes any standard message boxes that are still open. + .macro releaseall + .byte 0x6b + .endm + + @ If the script was called by an Object, then that Object's movement will resume. This command also closes any standard message boxes that are still open. + .macro release + .byte 0x6c + .endm + + @ Blocks script execution until the player presses any key. + .macro waitbuttonpress + .byte 0x6d + .endm + + @ Displays a YES/NO multichoice box at the specified coordinates, and blocks script execution until the user makes a selection. Their selection is stored in variable 0x800D (LASTRESULT); 0x0000 for "NO" or if the user pressed B, and 0x0001 for "YES". + .macro yesnobox x, y + .byte 0x6e + .byte \x + .byte \y + .endm + + @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. Lists of options are predefined and the one to be used is specified with list. If b is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button. + .macro multichoice x, y, list, b + .byte 0x6f + .byte \x + .byte \y + .byte \list + .byte \b + .endm + + @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. Lists of options are predefined and the one to be used is specified with list. The default argument determines the initial position of the cursor when the box is first opened; it is zero-indexed, and if it is too large, it is treated as 0x00. If b is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button. + .macro multichoicedefault x, y, list, default, b + .byte 0x70 + .byte \x + .byte \y + .byte \list + .byte \default + .byte \b + .endm + + @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. Lists of options are predefined and the one to be used is specified with list. The per_row argument determines how many list items will be shown on a single row of the box. + .macro multichoicegrid x, y, list, per_row, B + .byte 0x71 + .byte \x + .byte \y + .byte \list + .byte \per_row + .byte \B + .endm + + .macro drawbox + .byte 0x72 + .endm + + .macro erasebox byte1, byte2, byte3, byte4 + .byte 0x73 + .byte \byte1 + .byte \byte2 + .byte \byte3 + .byte \byte4 + .endm + + .macro drawboxtext + .byte 0x74 + .endm + + @ Displays a box containing the front sprite for the specified (species) Pokemon species. + .macro drawmonpic species, x, y + .byte 0x75 + .2byte \species + .byte \x + .byte \y + .endm + + @ Hides all boxes displayed with drawmonpic. + .macro erasemonpic + .byte 0x76 + .endm + + @ Draws an image of the winner of the contest. In FireRed, this command is a nop. (The argument is discarded.) + .macro drawcontestwinner a + .byte 0x77 + .byte \a + .endm + + @ Displays the string at pointer as braille text in a standard message box. The string must be formatted to use braille characters. + .macro braillemessage text + .byte 0x78 + .4byte \text + .endm + + @ RENAMED! + @ Gives the player one of the specified (species) Pokmon at level level holding item. The unknown arguments should all be zeroes. + .macro givemon species, level, item, unknown1, unknown2, unknown3 + .byte 0x79 + .2byte \species + .byte \level + .2byte \item + .4byte \unknown1 + .4byte \unknown2 + .byte \unknown3 + .endm + + .macro giveegg species + .byte 0x7a + .2byte \species + .endm + + @ RENAMED! + .macro setmonmove byte1, byte2, word + .byte 0x7b + .byte \byte1 + .byte \byte2 + .2byte \word + .endm + + @ Checks if at least one Pokémon in the player's party knows the specified (index) attack. If so, variable 0x800D (LASTRESULT) is set to the (zero-indexed) slot number of the first Pokémon that knows the move. If not, LASTRESULT is set to 0x0006. Variable 0x8004 is also set to this Pokémon's species. + .macro checkpartymove index + .byte 0x7c + .2byte \index + .endm + + @ Writes the name of the Pokemon at index species to the specified buffer. + .macro getspeciesname out, species + .byte 0x7d + .byte \out + .2byte \species + .endm + + @ RENAMED! + @ Writes the name of the species of the first Pokémon in the player's party to the specified buffer. + .macro getfirstpartymonname out + .byte 0x7e + .byte \out + .endm + + @ RENAMED! + @ Writes the nickname of the Pokemon in slot slot (zero-indexed) of the player's party to the specified buffer. If an empty or invalid slot is specified, ten spaces ("") are written to the buffer. + .macro getpartymonname out, slot + .byte 0x7f + .byte \out + .2byte \slot + .endm + + @ Writes the name of the item at index item to the specified buffer. If the specified index is larger than the number of items in the game (0x176), the name of item 0 ("????????") is buffered instead. + .macro getitemname out, item + .byte 0x80 + .byte \out + .2byte \item + .endm + + @ Writes the name of the decoration at index decoration to the specified buffer. In FireRed, this command is a nop. + .macro getdecorname out, decoration + .byte 0x81 + .byte \out + .2byte \decoration + .endm + + @ Writes the name of the move at index move to the specified buffer. + .macro getmovename out, move + .byte 0x82 + .byte \out + .2byte \move + .endm + + @ Converts the value of input to a decimal string, and writes that string to the specified buffer. + .macro getnumberstring out, input + .byte 0x83 + .byte \out + .2byte \input + .endm + + @ Writes the standard string identified by index to the specified buffer. This command has no protections in place at all, so specifying an invalid standard string (e.x. 0x2B) can and usually will cause data corruption. + .macro getstdstring out, index + .byte 0x84 + .byte \out + .2byte \index + .endm + + @ Copies the string at offset to the specified buffer. + .macro getstring out, offset + .byte 0x85 + .byte \out + .4byte \offset + .endm + + @ Opens the Pokemart system, offering the specified products for sale. + .macro pokemart products + .byte 0x86 + .4byte \products + .endm + + @ Apparent clone of pokemart. + .macro pokemartdecor products + .byte 0x87 + .4byte \products + .endm + + @ Apparent clone of pokemart. + .macro pokemartbp products + .byte 0x88 + .4byte \products + .endm + + @ Starts up the slot machine minigame. + .macro playslotmachine word + .byte 0x89 + .2byte \word + .endm + + @ In FireRed, this command is a nop. + .macro plantberrytree + .byte 0x8a + .endm + + @ In FireRed, this command sets the byte at 0x03000EA8 to 0x01. I do not know what that means. + .macro choosecontestpkmn + .byte 0x8b + .endm + + @ In FireRed, this command is a nop. + .macro startcontest + .byte 0x8c + .endm + + @ In FireRed, this command is a nop. + .macro showcontestresults + .byte 0x8d + .endm + + @ In FireRed, this command is a nop. + .macro contestlinktransfer + .byte 0x8e + .endm + + @ Stores a random integer between 0 and limit in variable 0x800D (LASTRESULT). + .macro random limit + .byte 0x8f + .2byte \limit + .endm + + @ If check is 0x00, this command adds value to the player's money. + .macro givemoney value, check + .byte 0x90 + .4byte \value + .byte \check + .endm + + @ If check is 0x00, this command subtracts value from the player's money. + .macro takemoney value, check + .byte 0x91 + .4byte \value + .byte \check + .endm + + @ If check is 0x00, this command will check if the player has value or more money; script variable 0x800D (LASTRESULT) is set to 0x0001 if the player has enough money, or 0x0000 if the do not. + .macro checkmoney value, check + .byte 0x92 + .4byte \value + .byte \check + .endm + + @ Spawns a secondary box showing how much money the player has. + .macro showmoneybox x, y, check + .byte 0x93 + .byte \x + .byte \y + .byte \check + .endm + + @ Hides the secondary box spawned by showmoney. + .macro hidemoneybox + .byte 0x94 + .endm + + @ Updates the secondary box spawned by showmoney. Consumes but does not use arguments. + .macro updatemoneybox x, y, check + .byte 0x95 + .byte \x + .byte \y + .byte \check + .endm + + @ In FireRed, this command is a nop. + .macro getpricereduction + .byte 0x96 + .endm + + @ Fades the screen to black or back, using the specified effect. Effect 0x00 fades in, and effect 0x01 fades out. I don't know if other effects exist. + .macro fadescreen effect + .byte 0x97 + .byte \effect + .endm + + @ Fades the screen to and from black and white. Mode 0x00 fades from black, mode 0x01 fades out to black, mode 0x2 fades in from white, and mode 0x3 fades out to white. Other modes may exist. + .macro fadescreenspeed effect, speed + .byte 0x98 + .byte \effect + .byte \speed + .endm + + .macro setflashradius word + .byte 0x99 + .2byte \word + .endm + + .macro animateflash byte + .byte 0x9a + .byte \byte + .endm + + .macro messageautoscroll pointer + .byte 0x9b + .4byte \pointer + .endm + + @ Executes the specified field move animation. + .macro dofieldeffect animation + .byte 0x9c + .2byte \animation + .endm + + @ Sets up the field effect argument argument with the value value. + .macro setfieldeffectarg argument, param + .byte 0x9d + .byte \argument + .2byte \param + .endm + + @ Blocks script execution until all playing field move animations complete. + .macro waitfieldeffect animation + .byte 0x9e + .2byte \animation + .endm + + @ Sets which healing place the player will return to if all of the Pokemon in their party faint. + .macro setrespawn flightspot + .byte 0x9f + .2byte \flightspot + .endm + + @ Checks the player's gender. If male, then 0x0000 is stored in variable 0x800D (LASTRESULT). If female, then 0x0001 is stored in LASTRESULT. + .macro checkplayergender + .byte 0xa0 + .endm + + @ Plays the specified (species) Pokemon's cry. You can use waitcry to block script execution until the sound finishes. + .macro playmoncry species, effect + .byte 0xa1 + .2byte \species + .2byte \effect + .endm + + @ Changes the metatile at (x, y) on the current map. + .macro setmetatile x, y, metatile_number, tile_attrib + .byte 0xa2 + .2byte \x + .2byte \y + .2byte \metatile_number + .2byte \tile_attrib + .endm + + @ Queues a weather change to the default weather for the map. + .macro resetweather + .byte 0xa3 + .endm + + @ Queues a weather change to type weather. + .macro setweather type + .byte 0xa4 + .2byte \type + .endm + + @ Executes the weather change queued with resetweather or setweather. The current weather will smoothly fade into the queued weather. + .macro doweather + .byte 0xa5 + .endm + + @ This command manages cases in which maps have tiles that change state when stepped on (specifically, cracked/breakable floors). + .macro setstepcallback subroutine + .byte 0xa6 + .byte \subroutine + .endm + + .macro setmaplayoutindex index + .byte 0xa7 + .2byte \index + .endm + + .macro setobjectpriority index, map, priority + .byte 0xa8 + .2byte \index + map \map + .byte \priority + .endm + + .macro resetobjectpriority index, map + .byte 0xa9 + .2byte \index + map \map + .endm + + .macro createvobject sprite, byte2, x, y, elevation, direction + .byte 0xaa + .byte \sprite + .byte \byte2 + .2byte \x + .2byte \y + .byte \elevation + .byte \direction + .endm + + .macro turnvobject index, direction + .byte 0xab + .byte \index + .byte \direction + .endm + + @ Opens the door metatile at (X, Y) with an animation. + .macro opendoor x, y + .byte 0xac + .2byte \x + .2byte \y + .endm + + @ Closes the door metatile at (X, Y) with an animation. + .macro closedoor x, y + .byte 0xad + .2byte \x + .2byte \y + .endm + + @ Waits for the door animation started with opendoor or closedoor to finish. + .macro waitdooranim + .byte 0xae + .endm + + @ Sets the door tile at (x, y) to be open without an animation. + .macro setdooropen x, y + .byte 0xaf + .2byte \x + .2byte \y + .endm + + @ Sets the door tile at (x, y) to be closed without an animation. + .macro setdoorclosed2 x, y + .byte 0xb0 + .2byte \x + .2byte \y + .endm + + @ In Emerald, this command consumes its parameters and does nothing. In FireRed, this command is a nop. + .macro addelevmenuitem + .byte 0xb1 + .endm + + @ In FireRed and Emerald, this command is a nop. + .macro showelevmenu + .byte 0xb2 + .endm + + .macro checkcoins out + .byte 0xb3 + .2byte \out + .endm + + .macro givecoins count + .byte 0xb4 + .2byte \count + .endm + + .macro takecoins word + .byte 0xb5 + .2byte \word + .endm + + @ Prepares to start a wild battle against a species at Level level holding item. Running this command will not affect normal wild battles. You start the prepared battle with dowildbattle. + .macro setwildbattle species, level, item + .byte 0xb6 + .2byte \species + .byte \level + .2byte \item + .endm + + @ Starts a wild battle against the Pokemon generated by setwildbattle. Blocks script execution until the battle finishes. + .macro dowildbattle + .byte 0xb7 + .endm + + .macro setvaddress long, word + .byte 0xb8 + .4byte \long + .2byte \word + .endm + + .macro vgoto pointer + .byte 0xb9 + .4byte \pointer + .endm + + .macro vcall pointer + .byte 0xba + .4byte \pointer + .endm + + .macro vgoto_if byte, pointer + .byte 0xbb + .byte \byte + .4byte \pointer + .endm + + .macro vcall_if byte, pointer + .byte 0xbc + .byte \byte + .4byte \pointer + .endm + + .macro vmessage pointer + .byte 0xbd + .4byte \pointer + .endm + + .macro vloadptr pointer + .byte 0xbe + .4byte \pointer + .endm + + .macro vbufferstring byte, pointer + .byte 0xbf + .byte \byte + .4byte \pointer + .endm + + @ Spawns a secondary box showing how many Coins the player has. + .macro showcoinsbox x, y + .byte 0xc0 + .byte \x + .byte \y + .endm + + @ Hides the secondary box spawned by showcoins. It consumes its arguments but doesn't use them. + .macro hidecoinsbox x, y + .byte 0xc1 + .byte \x + .byte \y + .endm + + @ Updates the secondary box spawned by showcoins. It consumes its arguments but doesn't use them. + .macro updatecoinsbox x, y + .byte 0xc2 + .byte \x + .byte \y + .endm + + @ Increases the value of the specified game stat by 1. The stat's value will not be allowed to exceed 0x00FFFFFF. + .macro incrementgamestat stat + .byte 0xc3 + .byte \stat + .endm + + @ Sets the destination that using an Escape Rope or Dig will take the player to. + .macro setescapewarp map, warp, x, y + .byte 0xc4 + map \map + .byte \warp + .2byte \x + .2byte \y + .endm + + @ Blocks script execution until cry finishes. + .macro waitmoncry + .byte 0xc5 + .endm + + @ Writes the name of the specified (box) PC box to the specified buffer. + .macro bufferboxname out, box + .byte 0xc6 + .byte \out + .2byte \box + .endm + + @ Sets the color of the text in standard message boxes. 0x00 produces blue (male) text, 0x01 produces red (female) text, 0xFF resets the color to the default for the current OW's gender, and all other values produce black text. + .macro textcolor color + .byte 0xc7 + .byte \color + .endm + + @ The exact purpose of this command is unknown, but it is related to the blue help-text box that appears on the bottom of the screen when the Main Menu is opened. + .macro loadhelp pointer + .byte 0xc8 + .4byte \pointer + .endm + + @ The exact purpose of this command is unknown, but it is related to the blue help-text box that appears on the bottom of the screen when the Main Menu is opened. + .macro unloadhelp + .byte 0xc9 + .endm + + @ After using this command, all standard message boxes will use the signpost frame. + .macro signmsg + .byte 0xca + .endm + + @ Ends the effects of signmsg, returning message box frames to normal. + .macro normalmsg + .byte 0xcb + .endm + + @ Compares the value of a hidden variable to a dword. + .macro comparehiddenvar a, value + .byte 0xcc + .byte \a + .4byte \value + .endm + + @ Makes the Pokemon in the specified slot of the player's party obedient. It will not randomly disobey orders in battle. + .macro setmonobedient slot + .byte 0xcd + .2byte \slot + .endm + + @ Checks if the Pokemon in the specified slot of the player's party is obedient. If the Pokemon is disobedient, 0x0001 is written to script variable 0x800D (LASTRESULT). If the Pokemon is obedient (or if the specified slot is empty or invalid), 0x0000 is written. + .macro checkmonobedience slot + .byte 0xce + .2byte \slot + .endm + + @ Depending on factors I haven't managed to understand yet, this command may cause script execution to jump to the offset specified by the pointer at 0x020375C0. + .macro execram + .byte 0xcf + .endm + + @ Sets worldmapflag to 1. This allows the player to Fly to the corresponding map, if that map has a flightspot. + .macro setworldmapflag worldmapflag + .byte 0xd0 + .2byte \worldmapflag + .endm + + @ Clone of warpteleport? It is apparently only used in FR/LG, and only with specials.[source] + .macro warpteleport2 map, warp, x, y + .byte 0xd1 + map \map + .byte \warp + .2byte \x + .2byte \y + .endm + + @ Changes the location where the player caught the Pokemon in the specified slot of their party. + .macro setmonmetlocation slot, location + .byte 0xd2 + .2byte \slot + .byte \location + .endm + + .macro getbraillestringwidth pointer + .byte 0xd3 + .4byte \pointer + .endm + + .macro bufferitemnameplural out, item, quantity + .byte 0xd4 + .byte \out + .2byte \item + .2byte \quantity + .endm + + +@ Supplementary + + .macro goto_if_eq dest + goto_if 1, \dest + .endm + + .macro switch var + copyvar 0x8000, \var + .endm + + .macro case condition, dest + compare_var_to_value 0x8000, \condition + goto_if_eq \dest + .endm + + .macro msgbox text, type=4 + loadword 0, \text + callstd \type + .endm + + @ Message box types + MSGBOX_YESNO = 5 + + YES = 1 + NO = 0 + + .macro giveitem item, amount=1, function=0 + setorcopyvar 0x8000, \item + setorcopyvar 0x8001, \amount + callstd \function + .endm + + .macro giveitemfanfaremsg msg, item, amount=1, fanfare=MUS_FANFA1 + loadword 0, \msg + setorcopyvar 0x8000, \item + setorcopyvar 0x8001, \amount + setorcopyvar 0x8002, \fanfare + callstd 9 + .endm diff --git a/payload/asm/macros/field_effect_script.inc b/payload/asm/macros/field_effect_script.inc new file mode 100644 index 0000000..d5895b0 --- /dev/null +++ b/payload/asm/macros/field_effect_script.inc @@ -0,0 +1,42 @@ + .macro loadtiles address + .byte 0 + .4byte \address + .endm + + .macro loadfadedpal address + .byte 1 + .4byte \address + .endm + + .macro loadpal address + .byte 2 + .4byte \address + .endm + + .macro callnative address + .byte 3 + .4byte \address + .endm + + .macro end + .byte 4 + .endm + + .macro loadgfx_callnative tiles_address, palette_address, function_address + .byte 5 + .4byte \tiles_address + .4byte \palette_address + .4byte \function_address + .endm + + .macro loadtiles_callnative tiles_address, function_address + .byte 6 + .4byte \tiles_address + .4byte \function_address + .endm + + .macro loadfadedpal_callnative palette_address, function_address + .byte 7 + .4byte \palette_address + .4byte \function_address + .endm diff --git a/payload/asm/macros/function.inc b/payload/asm/macros/function.inc new file mode 100644 index 0000000..67fb373 --- /dev/null +++ b/payload/asm/macros/function.inc @@ -0,0 +1,29 @@ + .macro arm_func_start name + .align 2, 0 + .global \name + .arm + .type \name, function + .endm + + .macro arm_func_end name + .size \name, .-\name + .endm + + .macro thumb_func_start name + .align 2, 0 + .global \name + .thumb + .thumb_func + .type \name, function + .endm + + .macro non_word_aligned_thumb_func_start name + .global \name + .thumb + .thumb_func + .type \name, function + .endm + + .macro thumb_func_end name + .size \name, .-\name + .endm diff --git a/payload/asm/macros/m4a.inc b/payload/asm/macros/m4a.inc new file mode 100644 index 0000000..6c5abc0 --- /dev/null +++ b/payload/asm/macros/m4a.inc @@ -0,0 +1,13 @@ + .macro song label, music_player, unknown + .4byte \label + .2byte \music_player + .2byte \unknown + .endm + + .macro music_player info_struct, track_struct, unknown_1, unknown_2 + .4byte \info_struct + .4byte \track_struct + .byte \unknown_1 + .space 1 + .2byte \unknown_2 + .endm diff --git a/payload/asm/macros/map.inc b/payload/asm/macros/map.inc new file mode 100644 index 0000000..075993f --- /dev/null +++ b/payload/asm/macros/map.inc @@ -0,0 +1,90 @@ + .macro map map_id + .byte \map_id >> 8 @ map group + .byte \map_id & 0xFF @ map num + .endm + + .macro map_script type, address + .byte \type + .4byte \address + .endm + + .macro map_script_2 word1, word2, address + .2byte \word1 + .2byte \word2 + .4byte \address + .endm + + .macro object_event index:req, gfx:req, x:req, y:req, elevation:req, movement_type:req, x_radius:req, y_radius:req, trainer_type:req, sight_radius_tree_etc:req, script:req, event_flag:req + .byte \index + .2byte \gfx + .byte 0 + .2byte \x, \y + .byte \elevation, \movement_type, ((\y_radius << 4) | \x_radius), 0 + .2byte \trainer_type, \sight_radius_tree_etc + .4byte \script + .2byte \event_flag, 0 + inc _num_npcs + .endm + + .macro warp_def x, y, byte, warp, map_id + .2byte \x, \y + .byte \byte, \warp + .byte \map_id & 0xFF @ map num + .byte \map_id >> 8 @ map group + inc _num_warps + .endm + + .macro coord_event x, y, byte1, byte2, word1, word2, word3, script + .2byte \x, \y + .byte \byte1, \byte2 + .2byte \word1, \word2, \word3 + .4byte \script + inc _num_traps + .endm + + .macro bg_event x, y, byte, kind, word, arg6, arg7, arg8 + .2byte \x, \y + .byte \byte, \kind + .2byte \word + .if \kind < 5 + .4byte \arg6 + .else + .2byte \arg6 + .byte \arg7, \arg8 + .endif + inc _num_signs + .endm + + .macro bg_hidden_item_event x, y, height, item, flag, unknown + bg_event \x, \y, \height, 7, 0, \item, \flag, \unknown + .endm + + .macro map_events npcs, warps, traps, signs + .byte _num_npcs, _num_warps, _num_traps, _num_signs + .4byte \npcs, \warps, \traps, \signs + reset_map_events + .endm + + .macro reset_map_events + .set _num_npcs, 0 + .set _num_warps, 0 + .set _num_traps, 0 + .set _num_signs, 0 + .endm + + reset_map_events + + + .equiv connection_down, 1 + .equiv connection_up, 2 + .equiv connection_left, 3 + .equiv connection_right, 4 + .equiv connection_dive, 5 + .equiv connection_emerge, 6 + + .macro connection direction, offset, map, filler + .4byte connection_\direction + .4byte \offset + map \map + .space 2 + .endm diff --git a/payload/asm/macros/movement.inc b/payload/asm/macros/movement.inc new file mode 100644 index 0000000..f077a8f --- /dev/null +++ b/payload/asm/macros/movement.inc @@ -0,0 +1,122 @@ + .macro create_movement name + enum _\name + .macro \name + .byte _\name + .endm + .endm + + enum_start 0 + create_movement step_00 + create_movement step_01 + create_movement step_02 + create_movement step_03 + create_movement slow_step_down + create_movement slow_step_up + create_movement slow_step_left + create_movement slow_step_right + create_movement step_down + create_movement step_up + create_movement step_left + create_movement step_right + create_movement fast_step_down + create_movement fast_step_up + create_movement fast_step_left + create_movement fast_step_right + create_movement step_10 + create_movement step_11 + create_movement step_12 + create_movement step_13 + create_movement step_14 + create_movement step_15 + create_movement step_16 + create_movement step_17 + create_movement step_18 + create_movement step_19 + create_movement step_1a + create_movement step_1b + create_movement step_1c + create_movement step_1d + create_movement step_1e + create_movement step_1f + create_movement step_20 + create_movement step_21 + create_movement step_22 + create_movement step_23 + create_movement step_24 + create_movement step_25 + create_movement step_26 + create_movement step_27 + create_movement step_28 + create_movement step_29 + create_movement step_2a + create_movement step_2b + create_movement step_2c + create_movement step_2d + create_movement step_2e + create_movement step_2f + create_movement step_30 + create_movement step_31 + create_movement step_32 + create_movement step_33 + create_movement step_34 + create_movement step_35 + create_movement step_36 + create_movement step_37 + create_movement step_38 + create_movement step_39 + create_movement step_3a + create_movement step_3b + create_movement step_3c + create_movement step_3d + create_movement step_3e + create_movement step_3f + create_movement step_40 + create_movement step_41 + create_movement step_42 + create_movement step_43 + create_movement step_44 + create_movement step_45 + create_movement step_46 + create_movement step_47 + create_movement step_48 + create_movement step_49 + create_movement step_4a + create_movement step_4b + create_movement step_4c + create_movement step_4d + create_movement step_4e + create_movement step_4f + create_movement step_50 + create_movement step_51 + create_movement step_52 + create_movement step_53 + create_movement step_54 + create_movement step_55 + create_movement step_56 + create_movement step_57 + create_movement step_58 + create_movement step_59 + create_movement step_5a + create_movement step_5b + create_movement step_5c + create_movement step_5d + create_movement step_5e + create_movement step_5f + create_movement step_60 + create_movement step_61 + create_movement step_62 + create_movement step_63 + create_movement step_64 + create_movement step_65 + create_movement step_66 + create_movement step_67 + + enum_start 0x91 + create_movement step_91 + create_movement step_92 + + enum_start 0x96 + create_movement step_96 + + enum_start 0xfe + create_movement step_end diff --git a/payload/asm/macros/music_voice.inc b/payload/asm/macros/music_voice.inc new file mode 100644 index 0000000..b7a9e7f --- /dev/null +++ b/payload/asm/macros/music_voice.inc @@ -0,0 +1,125 @@ + .macro voice_directsound base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release + .byte 0 + _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release + .endm + + .macro voice_directsound_no_resample base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release + .byte 8 + _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release + .endm + + .macro voice_directsound_alt base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release + .byte 16 + _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release + .endm + + .macro _voice_directsound base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release + .byte \base_midi_key + .byte 0 + .if \pan != 0 + .byte (0x80 | \pan) + .else + .byte 0 + .endif + .4byte \sample_data_pointer + .byte \attack + .byte \decay + .byte \sustain + .byte \release + .endm + + .macro voice_square_1 sweep, duty_cycle, attack, decay, sustain, release + _voice_square_1 1, \sweep, \duty_cycle, \attack, \decay, \sustain, \release + .endm + + .macro voice_square_1_alt sweep, duty_cycle, attack, decay, sustain, release + _voice_square_1 9, \sweep, \duty_cycle, \attack, \decay, \sustain, \release + .endm + + .macro _voice_square_1 type, sweep, duty_cycle, attack, decay, sustain, release + .byte \type, 60, 0 + .byte \sweep + .byte (\duty_cycle & 0x3) + .byte 0, 0, 0 + .byte (\attack & 0x7) + .byte (\decay & 0x7) + .byte (\sustain & 0xF) + .byte (\release & 0x7) + .endm + + .macro voice_square_2 duty_cycle, attack, decay, sustain, release + _voice_square_2 2, \duty_cycle, \attack, \decay, \sustain, \release + .endm + + .macro voice_square_2_alt duty_cycle, attack, decay, sustain, release + _voice_square_2 10, \duty_cycle, \attack, \decay, \sustain, \release + .endm + + .macro _voice_square_2 type, duty_cycle, attack, decay, sustain, release + .byte \type, 60, 0, 0 + .byte (\duty_cycle & 0x3) + .byte 0, 0, 0 + .byte (\attack & 0x7) + .byte (\decay & 0x7) + .byte (\sustain & 0xF) + .byte (\release & 0x7) + .endm + + .macro voice_programmable_wave wave_samples_pointer, attack, decay, sustain, release + _voice_programmable_wave 3, \wave_samples_pointer, \attack, \decay, \sustain, \release + .endm + + .macro voice_programmable_wave_alt wave_samples_pointer, attack, decay, sustain, release + _voice_programmable_wave 11, \wave_samples_pointer, \attack, \decay, \sustain, \release + .endm + + .macro _voice_programmable_wave type, wave_samples_pointer, attack, decay, sustain, release + .byte \type, 60, 0, 0 + .4byte \wave_samples_pointer + .byte (\attack & 0x7) + .byte (\decay & 0x7) + .byte (\sustain & 0xF) + .byte (\release & 0x7) + .endm + + .macro voice_noise period, attack, decay, sustain, release + _voice_noise 4, \period, \attack, \decay, \sustain, \release + .endm + + .macro voice_noise_alt period, attack, decay, sustain, release + _voice_noise 12, \period, \attack, \decay, \sustain, \release + .endm + + .macro _voice_noise type, period, attack, decay, sustain, release + .byte \type, 60, 0, 0 + .byte (\period & 0x1) + .byte 0, 0, 0 + .byte (\attack & 0x7) + .byte (\decay & 0x7) + .byte (\sustain & 0xF) + .byte (\release & 0x7) + .endm + + .macro voice_keysplit voice_group_pointer, keysplit_table_pointer + .byte 0x40, 0, 0, 0 + .4byte \voice_group_pointer + .4byte \keysplit_table_pointer + .endm + + .macro voice_keysplit_all voice_group_pointer + .byte 0x80, 0, 0, 0 + .4byte \voice_group_pointer + .4byte 0 + .endm + + .macro cry sample + .byte 0x20, 60, 0, 0 + .4byte \sample + .byte 0xff, 0, 0xff, 0 + .endm + + .macro cry2 sample + .byte 0x30, 60, 0, 0 + .4byte \sample + .byte 0xff, 0, 0xff, 0 + .endm diff --git a/payload/asm/macros/pokemon_data.inc b/payload/asm/macros/pokemon_data.inc new file mode 100644 index 0000000..b0a5f22 --- /dev/null +++ b/payload/asm/macros/pokemon_data.inc @@ -0,0 +1,57 @@ + .macro pokedex_entry pokemon_name, height, weight, pokemon_scale, pokemon_offset, trainer_scale, trainer_offset + .2byte \height @ in decimeters + .2byte \weight @ in hectograms + .4byte DexDescription_\pokemon_name\()_1 + .4byte DexDescription_\pokemon_name\()_2 + .2byte 0 @ unused + .2byte \pokemon_scale + .2byte \pokemon_offset + .2byte \trainer_scale + .2byte \trainer_offset + .2byte 0 @ padding + .endm + + .macro base_stats hp, attack, defense, speed, sp_attack, sp_defense + .byte \hp + .byte \attack + .byte \defense + .byte \speed + .byte \sp_attack + .byte \sp_defense + .endm + + .macro ev_yield hp, attack, defense, speed, sp_attack, sp_defense + .2byte (\sp_defense << 10) | (\sp_attack << 8) | (\speed << 6) | (\defense << 4) | (\attack << 2) | \hp + .endm + + .macro level_up_move level, move + .2byte (\level << 9) | \move + .endm + + .macro evo_entry method, parameter, target_species + .2byte \method + .2byte \parameter + .2byte \target_species + .2byte 0 @ padding + .endm + + .macro empty_evo_entries count + .fill 8 * \count, 1, 0 + .endm + + .macro egg_moves_begin species + .2byte 20000 + \species + .endm + +@ If the min level equals the max level, only one level argument is needed. + .macro wild_mon species, min_level, max_level + .byte \min_level + + .ifb \max_level + .byte \min_level + .else + .byte \max_level + .endif + + .2byte SPECIES_\species + .endm diff --git a/asm/main.s b/payload/asm/main.s similarity index 100% rename from asm/main.s rename to payload/asm/main.s diff --git a/asm/siirtc.s b/payload/asm/siirtc.s similarity index 100% rename from asm/siirtc.s rename to payload/asm/siirtc.s diff --git a/asm/unk_200E344.s b/payload/asm/unk_200E344.s similarity index 100% rename from asm/unk_200E344.s rename to payload/asm/unk_200E344.s diff --git a/payload/charmap.txt b/payload/charmap.txt new file mode 100644 index 0000000..fe07476 --- /dev/null +++ b/payload/charmap.txt @@ -0,0 +1,783 @@ +' ' = 00 +'À' = 01 +'Á' = 02 +'Â' = 03 +'Ç' = 04 +'È' = 05 +'É' = 06 +'Ê' = 07 +'Ë' = 08 +'Ì' = 09 +'Î' = 0B +'Ï' = 0C +'Ò' = 0D +'Ó' = 0E +'Ô' = 0F +'Œ' = 10 +'Ù' = 11 +'Ú' = 12 +'Û' = 13 +'Ñ' = 14 +'ß' = 15 +'à' = 16 +'á' = 17 +'ç' = 19 +'è' = 1A +'é' = 1B +'ê' = 1C +'ë' = 1D +'ì' = 1E +'î' = 20 +'ï' = 21 +'ò' = 22 +'ó' = 23 +'ô' = 24 +'œ' = 25 +'ù' = 26 +'ú' = 27 +'û' = 28 +'ñ' = 29 +'º' = 2A +'ª' = 2B +SUPER_ER = 2C +'&' = 2D +'+' = 2E +LV = 34 +'=' = 35 +'¿' = 51 +'¡' = 52 +PK = 53 +PKMN = 53 54 +POKEBLOCK = 55 56 57 58 59 +'Í' = 5A +'%' = 5B +'(' = 5C +')' = 5D +'â' = 68 +'í' = 6F +UP_ARROW = 79 +DOWN_ARROW = 7A +LEFT_ARROW = 7B +RIGHT_ARROW = 7C +'0' = A1 +'1' = A2 +'2' = A3 +'3' = A4 +'4' = A5 +'5' = A6 +'6' = A7 +'7' = A8 +'8' = A9 +'9' = AA +'!' = AB +'?' = AC +'.' = AD +'-' = AE +'…' = B0 +'“' = B1 +'”' = B2 +'‘' = B3 +'\'' = B4 +'♂' = B5 +'♀' = B6 +'¥' = B7 +',' = B8 +'×' = B9 +'/' = BA +'A' = BB +'B' = BC +'C' = BD +'D' = BE +'E' = BF +'F' = C0 +'G' = C1 +'H' = C2 +'I' = C3 +'J' = C4 +'K' = C5 +'L' = C6 +'M' = C7 +'N' = C8 +'O' = C9 +'P' = CA +'Q' = CB +'R' = CC +'S' = CD +'T' = CE +'U' = CF +'V' = D0 +'W' = D1 +'X' = D2 +'Y' = D3 +'Z' = D4 +'a' = D5 +'b' = D6 +'c' = D7 +'d' = D8 +'e' = D9 +'f' = DA +'g' = DB +'h' = DC +'i' = DD +'j' = DE +'k' = DF +'l' = E0 +'m' = E1 +'n' = E2 +'o' = E3 +'p' = E4 +'q' = E5 +'r' = E6 +'s' = E7 +'t' = E8 +'u' = E9 +'v' = EA +'w' = EB +'x' = EC +'y' = ED +'z' = EE +'▶' = EF +':' = F0 +'Ä' = F1 +'Ö' = F2 +'Ü' = F3 +'ä' = F4 +'ö' = F5 +'ü' = F6 +@ Arrows at F7-FA are duplicates of 79-7C. Unused? +TALL_PLUS = FC 0C FB +'$' = FF + +@ Hiragana +'あ' = 01 +'い' = 02 +'う' = 03 +'え' = 04 +'お' = 05 +'か' = 06 +'き' = 07 +'く' = 08 +'け' = 09 +'こ' = 0A +'さ' = 0B +'し' = 0C +'す' = 0D +'せ' = 0E +'そ' = 0F +'た' = 10 +'ち' = 11 +'つ' = 12 +'て' = 13 +'と' = 14 +'な' = 15 +'に' = 16 +'ぬ' = 17 +'ね' = 18 +'の' = 19 +'は' = 1A +'ひ' = 1B +'ふ' = 1C +'へ' = 1D +'ほ' = 1E +'ま' = 1F +'み' = 20 +'む' = 21 +'め' = 22 +'も' = 23 +'や' = 24 +'ゆ' = 25 +'よ' = 26 +'ら' = 27 +'り' = 28 +'る' = 29 +'れ' = 2A +'ろ' = 2B +'わ' = 2C +'を' = 2D +'ん' = 2E +'ぁ' = 2F +'ぃ' = 30 +'ぅ' = 31 +'ぇ' = 32 +'ぉ' = 33 +'ゃ' = 34 +'ゅ' = 35 +'ょ' = 36 +'が' = 37 +'ぎ' = 38 +'ぐ' = 39 +'げ' = 3A +'ご' = 3B +'ざ' = 3C +'じ' = 3D +'ず' = 3E +'ぜ' = 3F +'ぞ' = 40 +'だ' = 41 +'ぢ' = 42 +'づ' = 43 +'で' = 44 +'ど' = 45 +'ば' = 46 +'び' = 47 +'ぶ' = 48 +'べ' = 49 +'ぼ' = 4A +'ぱ' = 4B +'ぴ' = 4C +'ぷ' = 4D +'ぺ' = 4E +'ぽ' = 4F +'っ' = 50 + +@ Katakana +'ア' = 51 +'イ' = 52 +'ウ' = 53 +'エ' = 54 +'オ' = 55 +'カ' = 56 +'キ' = 57 +'ク' = 58 +'ケ' = 59 +'コ' = 5A +'サ' = 5B +'シ' = 5C +'ス' = 5D +'セ' = 5E +'ソ' = 5F +'タ' = 60 +'チ' = 61 +'ツ' = 62 +'テ' = 63 +'ト' = 64 +'ナ' = 65 +'ニ' = 66 +'ヌ' = 67 +'ネ' = 68 +'ノ' = 69 +'ハ' = 6A +'ヒ' = 6B +'フ' = 6C +'ヘ' = 6D +'ホ' = 6E +'マ' = 6F +'ミ' = 70 +'ム' = 71 +'メ' = 72 +'モ' = 73 +'ヤ' = 74 +'ユ' = 75 +'ヨ' = 76 +'ラ' = 77 +'リ' = 78 +'ル' = 79 +'レ' = 7A +'ロ' = 7B +'ワ' = 7C +'ヲ' = 7D +'ン' = 7E +'ァ' = 7F +'ィ' = 80 +'ゥ' = 81 +'ェ' = 82 +'ォ' = 83 +'ャ' = 84 +'ュ' = 85 +'ョ' = 86 +'ガ' = 87 +'ギ' = 88 +'グ' = 89 +'ゲ' = 8A +'ゴ' = 8B +'ザ' = 8C +'ジ' = 8D +'ズ' = 8E +'ゼ' = 8F +'ゾ' = 90 +'ダ' = 91 +'ヂ' = 92 +'ヅ' = 93 +'デ' = 94 +'ド' = 95 +'バ' = 96 +'ビ' = 97 +'ブ' = 98 +'ベ' = 99 +'ボ' = 9A +'パ' = 9B +'ピ' = 9C +'プ' = 9D +'ペ' = 9E +'ポ' = 9F +'ッ' = A0 + +@ Japanese punctuation +' ' = 00 +'!' = AB +'?' = AC +'。' = AD +'ー' = AE +'·' = AF +'‥' = B0 + +@ TODO: Identify and declare F7 control codes +UNKNOWN_F7 = F7 +KEYGFX = F8 +EXTRA = F9 + +KEYGFX_A_BUTTON = F8 00 +KEYGFX_B_BUTTON = F8 01 +KEYGFX_L_BUTTON = F8 02 +KEYGFX_R_BUTTON = F8 03 +KEYGFX_START_BUTTON = F8 04 +KEYGFX_SELECT_BUTTON = F8 05 +KEYGFX_DPAD_UP = F8 06 +KEYGFX_DPAD_DOWN = F8 07 +KEYGFX_DPAD_LEFT = F8 08 +KEYGFX_DPAD_RIGHT = F8 09 +KEYGFX_DPAD_UP_DOWN = F8 0A +KEYGFX_DPAD_LEFT_RIGHT = F8 0B +KEYGFX_DPAD_ANY = F8 0C + +EXTRA_UPARROW = F9 00 +EXTRA_DOWNARROW = F9 01 +EXTRA_LEFTARROW = F9 02 +EXTRA_RIGHTARROW = F9 03 +EXTRA_PLUS = F9 04 +EXTRA_LV = F9 05 +EXTRA_PP = F9 06 +EXTRA_ID = F9 07 +EXTRA_NO = F9 08 +EXTRA_UNDERSCORE = F9 09 +EXTRA_CIRCLE_1 = F9 0A +EXTRA_CIRCLE_2 = F9 0B +EXTRA_CIRCLE_3 = F9 0C +EXTRA_CIRCLE_4 = F9 0D +EXTRA_CIRCLE_5 = F9 0E +EXTRA_CIRCLE_6 = F9 0F +EXTRA_CIRCLE_7 = F9 10 +EXTRA_CIRCLE_8 = F9 11 +EXTRA_CIRCLE_9 = F9 12 +EXTRA_LEFT_PAREN = F9 13 +EXTRA_RIGHT_PAREN = F9 14 +EXTRA_TARGET = F9 15 +EXTRA_TRIANGLE = F9 16 +EXTRA_X = F9 17 + +STRING = FD + +@ string placeholders +PLAYER = FD 01 +STR_VAR_1 = FD 02 +STR_VAR_2 = FD 03 +STR_VAR_3 = FD 04 +KUN = FD 05 +RIVAL = FD 06 +@ version-dependent strings +VERSION = FD 07 @ "RUBY" / "SAPPHIRE" +EVIL_TEAM = FD 08 @ "MAGMA" / "AQUA" +GOOD_TEAM = FD 09 @ "AQUA" / "MAGMA" +EVIL_LEADER = FD 0A @ "MAXIE" / "ARCHIE" +GOOD_LEADER = FD 0B @ "ARCHIE" / "MAXIE" +EVIL_LEGENDARY = FD 0C @ "GROUDON" / "KYOGRE" +GOOD_LEGENDARY = FD 0D @ "KYOGRE" / "GROUDON" + +@ battle macros + +UNKNOWN_STR = FD 00 + +ATTACKING_TRAINER = FD 08 +DEFENDING_TRAINER = FD 09 + +ATTACKING_MON = FD 0C +DEFENDING_MON = FD 0D + +@ indicates the end of a town/city name (before " TOWN" or " CITY") +NAME_END = FC 00 + +@ more text functions + +COLOR = FC 01 @ use a color listed below right after +HIGHLIGHT = FC 02 @ same as fc 01 +SHADOW = FC 03 @ same as fc 01 +COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes +PALETTE = FC 05 @ used in credits +SIZE = FC 06 @ note that anything other than "SMALL" is invalid +UNKNOWN_7 = FC 07 +PAUSE = FC 08 @ manually print the wait byte after this, havent mapped them +PAUSE_UNTIL_PRESS = FC 09 +UNKNOWN_A = FC 0A +PLAY_BGM = FC 0B +ESCAPE = FC 0C +SHIFT_TEXT = FC 0D +UNKNOWN_E = FC 0E +UNKNOWN_F = FC 0F +PLAY_SE = FC 10 +CLEAR = FC 11 +SKIP = FC 12 +CLEAR_TO = FC 13 +UNKNOWN_14 = FC 14 +JPN = FC 15 +ENG = FC 16 +PAUSE_MUSIC = FC 17 +RESUME_MUSIC = FC 18 + +@ font sizes + +SMALL = FC 06 00 +BIG = FC 06 04 + +@ colors + +TRANSPARENT = 00 +DARK_GREY = 01 +RED = 02 +GREEN = 03 +BLUE = 04 +YELLOW = 05 +CYAN = 06 +MAGENTA = 07 +LIGHT_GRAY = 08 +BLACK = 09 +BLACK2 = 0A @ duplicate of black? +SILVER = 0B +WHITE = 0C +SKY_BLUE = 0D +LIGHT_BLUE = 0E +WHITE2 = 0F @ duplicate of white? + +@ sound and music + +SE_STOP = 00 00 +SE_KAIFUKU = 01 00 +SE_PC_LOGON = 02 00 +SE_PC_OFF = 03 00 +SE_PC_ON = 04 00 +SE_SELECT = 05 00 +SE_WIN_OPEN = 06 00 +SE_WALL_HIT = 07 00 +SE_DOOR = 08 00 +SE_KAIDAN = 09 00 +SE_DANSA = 0A 00 +SE_JITENSYA = 0B 00 +SE_KOUKA_L = 0C 00 +SE_KOUKA_M = 0D 00 +SE_KOUKA_H = 0E 00 +SE_BOWA2 = 0F 00 +SE_POKE_DEAD = 10 00 +SE_NIGERU = 11 00 +SE_JIDO_DOA = 12 00 +SE_NAMINORI = 13 00 +SE_BAN = 14 00 +SE_PIN = 15 00 +SE_BOO = 16 00 +SE_BOWA = 17 00 +SE_JYUNI = 18 00 +SE_A = 19 00 +SE_I = 1A 00 +SE_U = 1B 00 +SE_E = 1C 00 +SE_O = 1D 00 +SE_N = 1E 00 +SE_SEIKAI = 1F 00 +SE_HAZURE = 20 00 +SE_EXP = 21 00 +SE_JITE_PYOKO = 22 00 +SE_MU_PACHI = 23 00 +SE_TK_KASYA = 24 00 +SE_FU_ZAKU = 25 00 +SE_FU_ZAKU2 = 26 00 +SE_FU_ZUZUZU = 27 00 +SE_RU_GASHIN = 28 00 +SE_RU_GASYAN = 29 00 +SE_RU_BARI = 2A 00 +SE_RU_HYUU = 2B 00 +SE_KI_GASYAN = 2C 00 +SE_TK_WARPIN = 2D 00 +SE_TK_WARPOUT = 2E 00 +SE_TU_SAA = 2F 00 +SE_HI_TURUN = 30 00 +SE_TRACK_MOVE = 31 00 +SE_TRACK_STOP = 32 00 +SE_TRACK_HAIK = 33 00 +SE_TRACK_DOOR = 34 00 +SE_MOTER = 35 00 +SE_CARD = 36 00 +SE_SAVE = 37 00 +SE_KON = 38 00 +SE_KON2 = 39 00 +SE_KON3 = 3A 00 +SE_KON4 = 3B 00 +SE_SUIKOMU = 3C 00 +SE_NAGERU = 3D 00 +SE_TOY_C = 3E 00 +SE_TOY_D = 3F 00 +SE_TOY_E = 40 00 +SE_TOY_F = 41 00 +SE_TOY_G = 42 00 +SE_TOY_A = 43 00 +SE_TOY_B = 44 00 +SE_TOY_C1 = 45 00 +SE_MIZU = 46 00 +SE_HASHI = 47 00 +SE_DAUGI = 48 00 +SE_PINPON = 49 00 +SE_FUUSEN1 = 4A 00 +SE_FUUSEN2 = 4B 00 +SE_FUUSEN3 = 4C 00 +SE_TOY_KABE = 4D 00 +SE_TOY_DANGO = 4E 00 +SE_DOKU = 4F 00 +SE_ESUKA = 50 00 +SE_T_AME = 51 00 +SE_T_AME_E = 52 00 +SE_T_OOAME = 53 00 +SE_T_OOAME_E = 54 00 +SE_T_KOAME = 55 00 +SE_T_KOAME_E = 56 00 +SE_T_KAMI = 57 00 +SE_T_KAMI2 = 58 00 +SE_ELEBETA = 59 00 +SE_HINSI = 5A 00 +SE_EXPMAX = 5B 00 +SE_TAMAKORO = 5C 00 +SE_TAMAKORO_E = 5D 00 +SE_BASABASA = 5E 00 +SE_REGI = 5F 00 +SE_C_GAJI = 60 00 +SE_C_MAKU_U = 61 00 +SE_C_MAKU_D = 62 00 +SE_C_PASI = 63 00 +SE_C_SYU = 64 00 +SE_C_PIKON = 65 00 +SE_REAPOKE = 66 00 +SE_OP_BASYU = 67 00 +SE_BT_START = 68 00 +SE_DENDOU = 69 00 +SE_JIHANKI = 6A 00 +SE_TAMA = 6B 00 +SE_Z_SCROLL = 6C 00 +SE_Z_PAGE = 6D 00 +SE_PN_ON = 6E 00 +SE_PN_OFF = 6F 00 +SE_Z_SEARCH = 70 00 +SE_TAMAGO = 71 00 +SE_TB_START = 72 00 +SE_TB_KON = 73 00 +SE_TB_KARA = 74 00 +SE_BIDORO = 75 00 + +MUS_ME_ASA = 00 01 +MUS_FANFA1 = 01 01 +MUS_FANFA4 = 02 01 +MUS_FANFA5 = 03 01 +MUS_ME_BACHI = 04 01 +MUS_ME_WAZA = 05 01 +MUS_ME_KINOMI = 06 01 +MUS_ME_SHINKA = 07 01 +BGM_FRLG_SAFARI_ZONE = 08 01 +MUS_SHINKA = 08 01 +BGM_FRLG_CHANSEY_DANCE = 0B 01 +MUS_ME_B_BIG = 0C 01 +MUS_ME_B_SMALL = 0D 01 +MUS_ME_WASURE = 0E 01 +MUS_ME_ZANNEN = 0F 01 +BGM_FRLG_FOLLOW_ME = 10 01 +BGM_FRLG_GAMECORNER = 11 01 +BGM_FRLG_ROCKET_HIDEOUT = 12 01 +BGM_FRLG_GYM = 13 01 +BGM_FRLG_JIGGLYPUFF = 14 01 +BGM_FRLG_OPENING = 15 01 +BGM_FRLG_TITLE = 16 01 +BGM_FRLG_CINNABAR_ISLAND = 17 01 +BGM_FRLG_LAVENDER_TOWN = 18 01 +BGM_FRLG_HEALING_TEST = 19 01 +BGM_FRLG_BICYCLE = 1A 01 +BGM_FRLG_SUSPICIOUS_EYE = 1B 01 +BGM_FRLG_GIRL_EYE = 1C 01 +BGM_FRLG_BOY_EYE = 1D 01 +BGM_FRLG_CONGRATULATIONS_HALL_OF_FAME = 1E 01 +BGM_FRLG_VIRIDIAN_FOREST = 1F 01 +BGM_FRLG_MT_MOON = 20 01 +BGM_FRLG_POKEMON_MANSION = 21 01 +BGM_FRLG_CREDITS = 22 01 +BGM_FRLG_ROUTE_1 = 23 01 +BGM_FRLG_ROUTE_24 = 24 01 +BGM_FRLG_ROUTE_3 = 25 01 +BGM_FRLG_ROUTE_11 = 26 01 +BGM_FRLG_INDIGO_PLATEAU = 27 01 +BGM_FRLG_BATTLE_LEADER = 28 01 +BGM_FRLG_BATTLE_TRAINER = 29 01 +BGM_FRLG_BATTLE_WILD_POKEMON = 2A 01 +BGM_FRLG_BATTLE_CHAMPION = 2B 01 +BGM_FRLG_PALLET_TOWN = 2C 01 +BGM_FRLG_OAK_LAB = 2D 01 +BGM_FRLG_PROF_OAK = 2E 01 +BGM_FRLG_POKEMON_CENTER = 2F 01 +BGM_FRLG_SS_ANNE = 30 01 +BGM_FRLG_SURF = 31 01 +BGM_FRLG_POKEMON_TOWER = 32 01 +BGM_FRLG_SILPH = 33 01 +BGM_FRLG_CERULEAN_CITY = 34 01 +BGM_FRLG_CELADON_CITY = 35 01 +BGM_FRLG_KACHI_TRAINER = 36 01 +BGM_FRLG_KACHI_WILD_POKEMON = 37 01 +BGM_FRLG_KACHI_LEADER = 38 01 +BGM_FRLG_VERMILION_CITY = 39 01 +BGM_FRLG_VIRIDIAN_CITY = 3A 01 +BGM_FRLG_RIVAL = 3B 01 +BGM_FRLG_RIVAL_POSTBATTLE = 3C 01 +BGM_FRLG_ME_POKEDEX_EVAL = 3D 01 +BGM_FRLG_ME_KEYITEM = 3E 01 +BGM_FRLG_FANFA_POKEMON_CAUGHT = 3F 01 +BGM_FRLG_FANFA_TRAINERCARD_PHOTO = 40 01 +BGM_FRLG_GAMEFREAK_LOGO = 41 01 +BGM_FRLG_CAUGHT_POKEMON = 42 01 +BGM_FRLG_GAME_EXPLANATION_START = 43 01 +BGM_FRLG_GAME_EXPLANATION_MIDDLE = 44 01 +BGM_FRLG_GAME_EXPLANATION_END = 45 01 +BGM_FRLG_POKEMON_JUMP = 46 01 +BGM_FRLG_UNION_ROOM = 47 01 +BGM_FRLG_POKEMON_NETWORK_CENTER = 48 01 +BGM_FRLG_MYSTERY_GIFT = 49 01 +BGM_FRLG_DODRIO_BERRY_PICK = 4A 01 +BGM_FRLG_MT_EMBER = 4B 01 +BGM_FRLG_TEACHY_TV_EPISODE = 4C 01 +BGM_FRLG_SEVII_ISLANDS = 4D 01 +BGM_FRLG_TANOBY_RUINS = 4E 01 +BGM_FRLG_ISLAND_ONE = 4F 01 +BGM_FRLG_ISLAND_FOUR = 50 01 +BGM_FRLG_ISLAND_SIX = 51 01 +BGM_FRLG_FLUTE = 52 01 +BGM_FRLG_BATTLE_DEOXYS = 53 01 +BGM_FRLG_BATTLE_MEWTWO = 54 01 +BGM_FRLG_BATTLE_LEGENDARY = 55 01 +BGM_FRLG_LEADER_EYE = 56 01 +BGM_FRLG_DEOXYS_EYE = 57 01 +BGM_FRLG_TRAINER_TOWER = 58 01 +BGM_FRLG_HALL_OF_FAME_PALLET_TOWN = 59 01 +BGM_FRLG_TEACHY_TV = 5A 01 + +BGM_STOP = 5D 01 +BGM_TETSUJI = 5E 01 +BGM_FIELD13 = 5F 01 +BGM_KACHI22 = 60 01 +BGM_KACHI2 = 61 01 +BGM_KACHI3 = 62 01 +BGM_KACHI5 = 63 01 +BGM_PCC = 64 01 +BGM_NIBI = 65 01 +BGM_SUIKUN = 66 01 +BGM_DOORO1 = 67 01 +BGM_DOORO_X1 = 68 01 +BGM_DOORO_X3 = 69 01 +BGM_MACHI_S2 = 6A 01 +BGM_MACHI_S4 = 6B 01 +BGM_GIM = 6C 01 +BGM_NAMINORI = 6D 01 +BGM_DAN01 = 6E 01 +BGM_FANFA1 = 6F 01 +BGM_ME_ASA = 70 01 +BGM_ME_BACHI = 71 01 +BGM_FANFA4 = 72 01 +BGM_FANFA5 = 73 01 +BGM_ME_WAZA = 74 01 +BGM_BIJYUTU = 75 01 +BGM_DOORO_X4 = 76 01 +BGM_FUNE_KAN = 77 01 +BGM_ME_SHINKA = 78 01 +BGM_SHINKA = 79 01 +BGM_ME_WASURE = 7A 01 +BGM_SYOUJOEYE = 7B 01 +BGM_BOYEYE = 7C 01 +BGM_DAN02 = 7D 01 +BGM_MACHI_S3 = 7E 01 +BGM_ODAMAKI = 7F 01 +BGM_B_TOWER = 80 01 +BGM_SWIMEYE = 81 01 +BGM_DAN03 = 82 01 +BGM_ME_KINOMI = 83 01 +BGM_ME_TAMA = 84 01 +BGM_ME_B_BIG = 85 01 +BGM_ME_B_SMALL = 86 01 +BGM_ME_ZANNEN = 87 01 +BGM_BD_TIME = 88 01 +BGM_TEST1 = 89 01 +BGM_TEST2 = 8A 01 +BGM_TEST3 = 8B 01 +BGM_TEST4 = 8C 01 +BGM_TEST = 8D 01 +BGM_GOMACHI0 = 8E 01 +BGM_GOTOWN = 8F 01 +BGM_POKECEN = 90 01 +BGM_NEXTROAD = 91 01 +BGM_GRANROAD = 92 01 +BGM_CYCLING = 93 01 +BGM_FRIENDLY = 94 01 +BGM_MISHIRO = 95 01 +BGM_TOZAN = 96 01 +BGM_GIRLEYE = 97 01 +BGM_MINAMO = 98 01 +BGM_ASHROAD = 99 01 +BGM_EVENT0 = 9A 01 +BGM_DEEPDEEP = 9B 01 +BGM_KACHI1 = 9C 01 +BGM_TITLE3 = 9D 01 +BGM_DEMO1 = 9E 01 +BGM_GIRL_SUP = 9F 01 +BGM_HAGESHII = A0 01 +BGM_KAKKOII = A1 01 +BGM_KAZANBAI = A2 01 +BGM_AQA_0 = A3 01 +BGM_TSURETEK = A4 01 +BGM_BOY_SUP = A5 01 +BGM_RAINBOW = A6 01 +BGM_AYASII = A7 01 +BGM_KACHI4 = A8 01 +BGM_ROPEWAY = A9 01 +BGM_CASINO = AA 01 +BGM_HIGHTOWN = AB 01 +BGM_SAFARI = AC 01 +BGM_C_ROAD = AD 01 +BGM_AJITO = AE 01 +BGM_M_BOAT = AF 01 +BGM_M_DUNGON = B0 01 +BGM_FINECITY = B1 01 +BGM_MACHUPI = B2 01 +BGM_P_SCHOOL = B3 01 +BGM_DENDOU = B4 01 +BGM_TONEKUSA = B5 01 +BGM_MABOROSI = B6 01 +BGM_CON_FAN = B7 01 +BGM_CONTEST0 = B8 01 +BGM_MGM0 = B9 01 +BGM_T_BATTLE = BA 01 +BGM_OOAME = BB 01 +BGM_HIDERI = BC 01 +BGM_RUNECITY = BD 01 +BGM_CON_K = BE 01 +BGM_EIKOU_R = BF 01 +BGM_KARAKURI = C0 01 +BGM_HUTAGO = C1 01 +BGM_SITENNOU = C2 01 +BGM_YAMA_EYE = C3 01 +BGM_CONLOBBY = C4 01 +BGM_INTER_V = C5 01 +BGM_DAIGO = C6 01 +BGM_THANKFOR = C7 01 +BGM_END = C8 01 +BGM_BATTLE27 = C9 01 +BGM_BATTLE31 = CA 01 +BGM_BATTLE20 = CB 01 +BGM_BATTLE32 = CC 01 +BGM_BATTLE33 = CD 01 +BGM_BATTLE36 = CE 01 +BGM_BATTLE34 = CF 01 +BGM_BATTLE35 = D0 01 +BGM_BATTLE38 = D1 01 +BGM_BATTLE30 = D2 01 + +'\l' = FA @ scroll up window text +'\p' = FB @ new paragraph +'\n' = FE @ new line diff --git a/payload/constants/battle.inc b/payload/constants/battle.inc new file mode 100644 index 0000000..7443994 --- /dev/null +++ b/payload/constants/battle.inc @@ -0,0 +1,101 @@ +@ status 1 +.equiv SLP, 0x07 +.equiv PSN, 0x08 +.equiv BRN, 0x10 +.equiv FRZ, 0x20 +.equiv PAR, 0x40 +.equiv TOX, 0x80 + +@ status 2 +.equiv S_CONFUSED, 0x00000007 +.equiv S_CONTINUE, 0x00001000 +.equiv S_TEMP_TRAP, 0x0000E000 @ Wrap, Bind, etc. +.equiv S_INFATUATED, 0x000F0000 +.equiv S_FOCUS_ENERGY, 0x00100000 +.equiv S_SUBSTITUTE, 0x01000000 +.equiv S_MEAN_LOOK, 0x04000000 +.equiv S_NIGHTMARE, 0x08000000 +.equiv S_CURSED, 0x10000000 +.equiv S_FORESIGHT, 0x20000000 +.equiv S_TORMENT, 0x80000000 + +@ status 3 +.equiv S_LEECH_SEED, 0x00000004 +.equiv S_ALWAYS_HIT, 0x00000010 +.equiv S_PERISH_SONG, 0x00000020 +.equiv S_ROOTED, 0x00000400 +.equiv S_YAWN, 0x00001800 +.equiv S_IMPRISONED, 0x00002000 +.equiv S_MUD_SPORT, 0x00010000 +.equiv S_WATER_SPORT, 0x00020000 + +@ status 4 +.equiv S_REFLECT, 0x0001 +.equiv S_LIGHT_SCREEN, 0x0002 +.equiv S_SPIKES, 0x0010 +.equiv S_SAFEGUARD, 0x0020 +.equiv S_FUTURE_SIGHT, 0x0040 +.equiv S_MIST, 0x0100 + +.equiv TARGET, 0 +.equiv USER, 1 + +.equiv BATTLE_WEATHER_SUNNY, 0 +.equiv BATTLE_WEATHER_RAIN, 1 +.equiv BATTLE_WEATHER_SANDSTORM, 2 +.equiv BATTLE_WEATHER_HAIL, 3 + + enum_start 1 + enum ATTACK + enum DEFENSE + enum SPEED + enum SP_ATTACK + enum SP_DEFENSE + enum ACCURACY + enum EVASION + +@ status animation table +.equiv B_ANIM_STATUS_PSN, 0x0 +.equiv B_ANIM_STATUS_CONFUSION, 0x1 +.equiv B_ANIM_STATUS_BRN, 0x2 +.equiv B_ANIM_STATUS_INFATUATION, 0x3 +.equiv B_ANIM_STATUS_SLP, 0x4 +.equiv B_ANIM_STATUS_PRZ, 0x5 +.equiv B_ANIM_STATUS_FRZ, 0x6 +.equiv B_ANIM_STATUS_CURSED, 0x7 +.equiv B_ANIM_STATUS_NIGHTMARE, 0x8 +.equiv B_ANIM_STATUS_WRAPPED, 0x9 + +@ general animation table +.equiv B_ANIM_CASTFORM_CHANGE, 0x0 +.equiv B_ANIM_STATS_CHANGE, 0x1 +.equiv B_ANIM_SUBSTITUTE_FADE, 0x2 +.equiv B_ANIM_SUBSTITUTE_APPEAR, 0x3 +.equiv B_ANIM_POKEBLOCK_THROW, 0x4 +.equiv B_ANIM_ITEM_KNOCKOFF, 0x5 +.equiv B_ANIM_TURN_TRAP, 0x6 +.equiv B_ANIM_ITEM_EFFECT, 0x7 +.equiv B_ANIM_SMOKEBALL_ESCAPE, 0x8 +.equiv B_ANIM_HANGED_ON, 0x9 +.equiv B_ANIM_RAIN_CONTINUES, 0xA +.equiv B_ANIM_SUN_CONTINUES, 0xB +.equiv B_ANIM_SANDSTORM_CONTINUES, 0xC +.equiv B_ANIM_HAIL_CONTINUES, 0xD +.equiv B_ANIM_LEECH_SEED_DRAIN, 0xE +.equiv B_ANIM_MON_HIT, 0xF +.equiv B_ANIM_ITEM_STEAL, 0x10 +.equiv B_ANIM_SNATCH_MOVE, 0x11 +.equiv B_ANIM_FUTURE_SIGHT_HIT, 0x12 +.equiv B_ANIM_DOOM_DESIRE_HIT, 0x13 +.equiv B_ANIM_FOCUS_PUNCH_SET_UP, 0x14 +.equiv B_ANIM_INGRAIN_HEAL, 0x15 +.equiv B_ANIM_WISH_HEAL, 0x16 + +@ special animation table +.equiv B_ANIM_LVL_UP, 0x0 +.equiv B_ANIM_SWITCH_OUT_PLAYER_MON, 0x1 +.equiv B_ANIM_SWITCH_OUT_OPPONENT_MON, 0x2 +.equiv B_ANIM_BALL_THROW, 0x3 +.equiv B_ANIM_SAFARI_BALL_THROW, 0x4 +.equiv B_ANIM_SUBSTITUTE_TO_MON, 0x5 +.equiv B_ANIM_MON_TO_SUBSTITUTE, 0x6 diff --git a/payload/constants/battle_move_constants.inc b/payload/constants/battle_move_constants.inc new file mode 100644 index 0000000..a05da3d --- /dev/null +++ b/payload/constants/battle_move_constants.inc @@ -0,0 +1,15 @@ + .set TARGET_SELECTED_POKEMON, 0 + + .set F_TARGET_SPECIAL, 1 << 0 + .set F_TARGET_RANDOM, 1 << 2 + .set F_TARGET_BOTH_ENEMIES, 1 << 3 + .set F_TARGET_USER, 1 << 4 + .set F_TARGET_ALL_EXCEPT_USER, 1 << 5 + .set F_TARGET_ENEMY_SIDE, 1 << 6 + + .set F_MAKES_CONTACT, 1 << 0 + .set F_AFFECTED_BY_PROTECT, 1 << 1 + .set F_AFFECTED_BY_MAGIC_COAT, 1 << 2 + .set F_AFFECTED_BY_SNATCH, 1 << 3 + .set F_MIRROR_MOVE_COMPATIBLE, 1 << 4 + .set F_AFFECTED_BY_KINGS_ROCK, 1 << 5 diff --git a/payload/constants/battle_text.inc b/payload/constants/battle_text.inc new file mode 100644 index 0000000..f7025f6 --- /dev/null +++ b/payload/constants/battle_text.inc @@ -0,0 +1,352 @@ + enum_start 12 + enum BATTLE_TEXT_UnknownString + enum BATTLE_TEXT_GainExpPoints + enum BATTLE_TEXT_GrewLevel + enum BATTLE_TEXT_LearnedMove + enum BATTLE_TEXT_TryingToLearnMove + enum BATTLE_TEXT_CantLearnMore + enum BATTLE_TEXT_DeleteMove + enum BATTLE_TEXT_DeletedMove + enum BATTLE_TEXT_StopLearning + enum BATTLE_TEXT_DidNotLearn + enum BATTLE_TEXT_LearnedMove2 + enum BATTLE_TEXT_AttackMissed + enum BATTLE_TEXT_ProtectedItself + enum BATTLE_TEXT_StatNoHigher + enum BATTLE_TEXT_AvoidedDamage + enum BATTLE_TEXT_DoesntAffect + enum BATTLE_TEXT_AttackingFainted + enum BATTLE_TEXT_DefendingFainted + enum BATTLE_TEXT_WinningPrize + enum BATTLE_TEXT_OutOfUsablePoke + enum BATTLE_TEXT_WhitedOut + enum BATTLE_TEXT_PreventEscape + enum BATTLE_TEXT_HitMulti + enum BATTLE_TEXT_FellAsleep + enum BATTLE_TEXT_MadeAsleep + enum BATTLE_TEXT_DefendingAsleep + enum BATTLE_TEXT_AttackingAsleep + enum BATTLE_TEXT_WasntAffected + enum BATTLE_TEXT_Poisoned + enum BATTLE_TEXT_Poisoned2 + enum BATTLE_TEXT_PoisonHurt + enum BATTLE_TEXT_AlreadyPoisoned + enum BATTLE_TEXT_BadlyPoisoned + enum BATTLE_TEXT_EnergyDrained + enum BATTLE_TEXT_Burned + enum BATTLE_TEXT_Burned2 + enum BATTLE_TEXT_BurnHurt + enum BATTLE_TEXT_Frozen + enum BATTLE_TEXT_Frozen2 + enum BATTLE_TEXT_FrozenSolid + enum BATTLE_TEXT_DefendingDefrosted + enum BATTLE_TEXT_AttackingDefrosted + enum BATTLE_TEXT_Defrosted + enum BATTLE_TEXT_Paralyzed + enum BATTLE_TEXT_Paralyzed2 + enum BATTLE_TEXT_Paralyzed3 + enum BATTLE_TEXT_AlreadyParalyzed + enum BATTLE_TEXT_ParalysisHealed + enum BATTLE_TEXT_DreamEaten + enum BATTLE_TEXT_AttackingStatNoHigher + enum BATTLE_TEXT_DefendingStatNoHigher + enum BATTLE_TEXT_StoppedWorking + enum BATTLE_TEXT_StoppedWorking2 + enum BATTLE_TEXT_Confused + enum BATTLE_TEXT_ConfusionSnapOut + enum BATTLE_TEXT_BecameConfused + enum BATTLE_TEXT_AlreadyConfused + enum BATTLE_TEXT_FellLove + enum BATTLE_TEXT_InLoveWith + enum BATTLE_TEXT_ImmobilizedBy + enum BATTLE_TEXT_BlownAway + enum BATTLE_TEXT_TypeTransform + enum BATTLE_TEXT_Flinched + enum BATTLE_TEXT_RegainedHealth + enum BATTLE_TEXT_HPFull + enum BATTLE_TEXT_RaisedSpDef + enum BATTLE_TEXT_RaisedDefense + enum BATTLE_TEXT_CoveredVeil + enum BATTLE_TEXT_SafeguardActive + enum BATTLE_TEXT_SafeguardFaded + enum BATTLE_TEXT_WentToSleep + enum BATTLE_TEXT_SpeltHealthy + enum BATTLE_TEXT_WhipWhirlwind + enum BATTLE_TEXT_TookSunlight + enum BATTLE_TEXT_LoweredHead + enum BATTLE_TEXT_IsGlowing + enum BATTLE_TEXT_FlewHigh + enum BATTLE_TEXT_DugHole + enum BATTLE_TEXT_SqueezedBind + enum BATTLE_TEXT_TrappedVortex + enum BATTLE_TEXT_Wrapped + enum BATTLE_TEXT_Clamped + enum BATTLE_TEXT_HurtBy + enum BATTLE_TEXT_FreedFrom + enum BATTLE_TEXT_KeptGoingCrash + enum BATTLE_TEXT_MistShroud + enum BATTLE_TEXT_MistProtect + enum BATTLE_TEXT_GetPumped + enum BATTLE_TEXT_HitRecoil + enum BATTLE_TEXT_ProtectedItself2 + enum BATTLE_TEXT_SandBuffeted + enum BATTLE_TEXT_HailStricken + enum BATTLE_TEXT_WasSeeded + enum BATTLE_TEXT_EvadedAttack + enum BATTLE_TEXT_HealthSapped + enum BATTLE_TEXT_FastAsleep + enum BATTLE_TEXT_WokeUp + enum BATTLE_TEXT_UproarAwake + enum BATTLE_TEXT_UproarWoke + enum BATTLE_TEXT_UproarCaused + enum BATTLE_TEXT_UproarMaking + enum BATTLE_TEXT_CalmedDown + enum BATTLE_TEXT_UproarCantSleep + enum BATTLE_TEXT_Stockpiled + enum BATTLE_TEXT_StockpiledCant + enum BATTLE_TEXT_UproarCantSleep2 + enum BATTLE_TEXT_UproarKeptAwake + enum BATTLE_TEXT_StayedAwake + enum BATTLE_TEXT_StoringEnergy + enum BATTLE_TEXT_UnleashedEnergy + enum BATTLE_TEXT_FatigueConfuse + enum BATTLE_TEXT_PickedUpYen + enum BATTLE_TEXT_Unaffected + enum BATTLE_TEXT_Transformed + enum BATTLE_TEXT_SubMade + enum BATTLE_TEXT_SubAlready + enum BATTLE_TEXT_SubTookDamage + enum BATTLE_TEXT_SubFaded + enum BATTLE_TEXT_MustRecharge + enum BATTLE_TEXT_RageBuilding + enum BATTLE_TEXT_MoveWasDisabled + enum BATTLE_TEXT_MoveIsDisabled + enum BATTLE_TEXT_DisabledNoMore + enum BATTLE_TEXT_EncoreGot + enum BATTLE_TEXT_EncoreEnded + enum BATTLE_TEXT_TookAim + enum BATTLE_TEXT_SketchedMove + enum BATTLE_TEXT_DestinyBondTake + enum BATTLE_TEXT_DestinyBondTaken + enum BATTLE_TEXT_ReducedBy + enum BATTLE_TEXT_StoleSomething + enum BATTLE_TEXT_CantEscapeNow + enum BATTLE_TEXT_NightmareStart + enum BATTLE_TEXT_NightmareLock + enum BATTLE_TEXT_CurseLay + enum BATTLE_TEXT_CurseAfflict + enum BATTLE_TEXT_SpikesScattered + enum BATTLE_TEXT_SpikesHurt + enum BATTLE_TEXT_IdentifiedPoke + enum BATTLE_TEXT_PerishSongFell + enum BATTLE_TEXT_BracedItself + enum BATTLE_TEXT_EnduredHit + enum BATTLE_TEXT_MagnitudeCount + enum BATTLE_TEXT_CutHPMaxATK + enum BATTLE_TEXT_CopyStatChanges + enum BATTLE_TEXT_GotFreeFrom + enum BATTLE_TEXT_LeechShed + enum BATTLE_TEXT_SpikesBlownAway + enum BATTLE_TEXT_FledBattle + enum BATTLE_TEXT_ForesawAttack + enum BATTLE_TEXT_TookAttack + enum BATTLE_TEXT_PokeAttack + enum BATTLE_TEXT_CenterAttention + enum BATTLE_TEXT_ChargingPower + enum BATTLE_TEXT_NaturePower + enum BATTLE_TEXT_StatusNormal + enum BATTLE_TEXT_NoMovesLeft + enum BATTLE_TEXT_TormentSubject + enum BATTLE_TEXT_TormentNoUse + enum BATTLE_TEXT_TightenFocus + enum BATTLE_TEXT_TauntFell + enum BATTLE_TEXT_TauntNoUse + enum BATTLE_TEXT_ReadyToHelp + enum BATTLE_TEXT_SwitchedItems + enum BATTLE_TEXT_CopiedObject + enum BATTLE_TEXT_WishMade + enum BATTLE_TEXT_WishTrue + enum BATTLE_TEXT_PlantedRoots + enum BATTLE_TEXT_AbsorbNutrients + enum BATTLE_TEXT_AnchoredItself + enum BATTLE_TEXT_DrowsyMade + enum BATTLE_TEXT_KnockedOffItem + enum BATTLE_TEXT_AbilitySwap + enum BATTLE_TEXT_SealedMove + enum BATTLE_TEXT_SealedNoUse + enum BATTLE_TEXT_GrudgeBear + enum BATTLE_TEXT_GrudgeLosePP + enum BATTLE_TEXT_ShroudedItself + enum BATTLE_TEXT_MagicCoatBounce + enum BATTLE_TEXT_AwaitMove + enum BATTLE_TEXT_SnatchedMove + enum BATTLE_TEXT_RainMade + enum BATTLE_TEXT_SpeedRisen + enum BATTLE_TEXT_ProtectedBy + enum BATTLE_TEXT_PreventedBy + enum BATTLE_TEXT_HPRestoredUsing + enum BATTLE_TEXT_MadeType + enum BATTLE_TEXT_PreventedPara + enum BATTLE_TEXT_PreventedRomance + enum BATTLE_TEXT_PreventedPoison + enum BATTLE_TEXT_PreventedConfusion + enum BATTLE_TEXT_RaisedFirePower + enum BATTLE_TEXT_AnchorsItself + enum BATTLE_TEXT_CutsAttack + enum BATTLE_TEXT_PreventedStatLoss + enum BATTLE_TEXT_HurtOther + enum BATTLE_TEXT_Traced + enum BATTLE_TEXT_Sharply + enum BATTLE_TEXT_Rose + enum BATTLE_TEXT_Harshly + enum BATTLE_TEXT_Fell + enum BATTLE_TEXT_UnknownString7 + enum BATTLE_TEXT_UnknownString3 + enum BATTLE_TEXT_UnknownString5 + enum BATTLE_TEXT_UnknownString6 + enum BATTLE_TEXT_Critical + enum BATTLE_TEXT_GrandSlam + enum BATTLE_TEXT_MoveForget123 + enum BATTLE_TEXT_MoveForgetAnd + enum BATTLE_TEXT_NotEffective + enum BATTLE_TEXT_SuperEffective + enum BATTLE_TEXT_GotAwaySafely + enum BATTLE_TEXT_FledWild + enum BATTLE_TEXT_NoRunning + enum BATTLE_TEXT_CantEscape2 + enum BATTLE_TEXT_BirchDontLeaveMe + enum BATTLE_TEXT_Nothing + enum BATTLE_TEXT_Failed + enum BATTLE_TEXT_HurtItself + enum BATTLE_TEXT_MirrorFail + enum BATTLE_TEXT_RainStart + enum BATTLE_TEXT_PourStart + enum BATTLE_TEXT_RainCont1 + enum BATTLE_TEXT_PourCont + enum BATTLE_TEXT_RainStop + enum BATTLE_TEXT_SandBrewed + enum BATTLE_TEXT_SandRages + enum BATTLE_TEXT_SandSubsided + enum BATTLE_TEXT_SunBright + enum BATTLE_TEXT_SunStrong + enum BATTLE_TEXT_SunFaded + enum BATTLE_TEXT_HailStart + enum BATTLE_TEXT_HailCont + enum BATTLE_TEXT_HailStop + enum BATTLE_TEXT_SpitUpFail + enum BATTLE_TEXT_SwallowFail + enum BATTLE_TEXT_WindHeatWave + enum BATTLE_TEXT_StatElim + enum BATTLE_TEXT_CoinScatter + enum BATTLE_TEXT_SubWeak + enum BATTLE_TEXT_PainSplit + enum BATTLE_TEXT_BellChime + enum BATTLE_TEXT_PerishSong + enum BATTLE_TEXT_NoPP1 + enum BATTLE_TEXT_NoPP2 + enum BATTLE_TEXT_Used1 + enum BATTLE_TEXT_TutorialUsed + enum BATTLE_TEXT_BlockBall + enum BATTLE_TEXT_DontBeAThief + enum BATTLE_TEXT_DodgeBall + enum BATTLE_TEXT_MissPoke + enum BATTLE_TEXT_BallBrokeOhNo + enum BATTLE_TEXT_BallBrokeAppeared + enum BATTLE_TEXT_BallBrokeAlmost + enum BATTLE_TEXT_BallBrokeSoClose + enum BATTLE_TEXT_BallCaught1 + enum BATTLE_TEXT_BallCaught2 + enum BATTLE_TEXT_GiveNickname + enum BATTLE_TEXT_SentToPC + enum BATTLE_TEXT_AddedToDex + enum BATTLE_TEXT_Raining + enum BATTLE_TEXT_Sandstorm + enum BATTLE_TEXT_CantEscape + enum BATTLE_TEXT_IgnoredOrdersSLP + enum BATTLE_TEXT_IgnoredOrders + enum BATTLE_TEXT_BeganNap + enum BATTLE_TEXT_LoafingAround + enum BATTLE_TEXT_WontObey + enum BATTLE_TEXT_TurnedAway + enum BATTLE_TEXT_NotNotice + enum BATTLE_TEXT_WillSwitch + enum BATTLE_TEXT_CreptCloser + enum BATTLE_TEXT_CantGetCloser + enum BATTLE_TEXT_WatchingCarefully + enum BATTLE_TEXT_CuriousAbout + enum BATTLE_TEXT_EnthralledBy + enum BATTLE_TEXT_IgnoredThing + enum BATTLE_TEXT_ThrewBlock + enum BATTLE_TEXT_SafariOver + enum BATTLE_TEXT_CuredParalysis + enum BATTLE_TEXT_CuredPoison + enum BATTLE_TEXT_CuredBurn + enum BATTLE_TEXT_CuredFreeze + enum BATTLE_TEXT_CuredSleep + enum BATTLE_TEXT_CuredConfusion + enum BATTLE_TEXT_CuredStatus + enum BATTLE_TEXT_RestoredHealth + enum BATTLE_TEXT_RestoredPP + enum BATTLE_TEXT_RestoredStatus + enum BATTLE_TEXT_RestoredHPLittle + enum BATTLE_TEXT_ChoiceBand + enum BATTLE_TEXT_FocusSash + enum BATTLE_TEXT_Terminator2 @ terminator? + enum BATTLE_TEXT_PreventedBurn + enum BATTLE_TEXT_BlocksOther + enum BATTLE_TEXT_RestoredHPByItem + enum BATTLE_TEXT_WhipSandstorm + enum BATTLE_TEXT_PreventedLoss + enum BATTLE_TEXT_InfatuatedPoke + enum BATTLE_TEXT_MadeIneffective + enum BATTLE_TEXT_CuredProblem + enum BATTLE_TEXT_OozeSuckup + enum BATTLE_TEXT_Transformed2 + enum BATTLE_TEXT_ElecWeakened + enum BATTLE_TEXT_FireWeakened + enum BATTLE_TEXT_HidUnderwater + enum BATTLE_TEXT_SprangUp + enum BATTLE_TEXT_CantForgetHM + enum BATTLE_TEXT_FoundOne + enum BATTLE_TEXT_PlayerDefeatedTrainer2 + enum BATTLE_TEXT_SoothingAroma + enum BATTLE_TEXT_CantUseItems + enum BATTLE_TEXT_UnknownString2 + enum BATTLE_TEXT_UnknownString4 + enum BATTLE_TEXT_HustleUse + enum BATTLE_TEXT_MadeUseless + enum BATTLE_TEXT_SandTombTrapped @ sand tomb + enum BATTLE_TEXT_Terminator + enum BATTLE_TEXT_BoostedExp + enum BATTLE_TEXT_SunIntensified + enum BATTLE_TEXT_GroundMoveNegate + enum BATTLE_TEXT_WallyBall + enum BATTLE_TEXT_TookAttack2 + enum BATTLE_TEXT_ChoseDestiny + enum BATTLE_TEXT_LostFocus + enum BATTLE_TEXT_UseNext + enum BATTLE_TEXT_FledUsingItem + enum BATTLE_TEXT_FledUsingOther + enum BATTLE_TEXT_DraggedOut + enum BATTLE_TEXT_PreventedOther + enum BATTLE_TEXT_NormalizedStatus + enum BATTLE_TEXT_Used2 + enum BATTLE_TEXT_BoxFull + enum BATTLE_TEXT_AvoidedAttack + enum BATTLE_TEXT_MadeIneffective2 + enum BATTLE_TEXT_PreventedFlinching + enum BATTLE_TEXT_AlreadyBurned + enum BATTLE_TEXT_StatNoLower + enum BATTLE_TEXT_BlocksOther2 + enum BATTLE_TEXT_WoreOff + enum BATTLE_TEXT_RaisedDefenseLittle + enum BATTLE_TEXT_RaisedSpDefLittle + enum BATTLE_TEXT_BrokeWall + enum BATTLE_TEXT_PreventedOther2 + enum BATTLE_TEXT_CuredOfProblem + enum BATTLE_TEXT_AttackingCantEscape + enum BATTLE_TEXT_Obtained1 + enum BATTLE_TEXT_Obtained2 + enum BATTLE_TEXT_Obtained3 + enum BATTLE_TEXT_NoEffect + enum BATTLE_TEXT_NoEffectOn diff --git a/payload/constants/berry_constants.inc b/payload/constants/berry_constants.inc new file mode 100644 index 0000000..2ecd7ac --- /dev/null +++ b/payload/constants/berry_constants.inc @@ -0,0 +1,6 @@ + .set BERRY_FIRMNESS_UNKNOWN, 0 + .set BERRY_FIRMNESS_VERY_SOFT, 1 + .set BERRY_FIRMNESS_SOFT, 2 + .set BERRY_FIRMNESS_HARD, 3 + .set BERRY_FIRMNESS_VERY_HARD, 4 + .set BERRY_FIRMNESS_SUPER_HARD, 5 diff --git a/payload/constants/constants.inc b/payload/constants/constants.inc new file mode 100644 index 0000000..4365e90 --- /dev/null +++ b/payload/constants/constants.inc @@ -0,0 +1,12 @@ + .include "constants/gba_constants.inc" + .include "constants/misc_constants.inc" + .include "constants/type_constants.inc" + .include "constants/contest_constants.inc" +@ .include "constants/item_data_constants.inc" + .include "constants/battle_move_constants.inc" + .include "constants/trainer_constants.inc" + .include "constants/berry_constants.inc" + .include "constants/version.inc" + .include "constants/battle.inc" + .include "constants/battle_text.inc" + .include "constants/contest_move_effects.inc" diff --git a/payload/constants/contest_constants.inc b/payload/constants/contest_constants.inc new file mode 100644 index 0000000..e971764 --- /dev/null +++ b/payload/constants/contest_constants.inc @@ -0,0 +1,68 @@ + .set CONTEST_COOL, 0x00 + .set CONTEST_BEAUTY, 0x01 + .set CONTEST_CUTE, 0x02 + .set CONTEST_SMART, 0x03 + .set CONTEST_TOUGH, 0x04 + + .set COMBO_STARTER_RAIN_DANCE, 0x01 + .set COMBO_STARTER_RAGE, 0x02 + .set COMBO_STARTER_FOCUS_ENERGY, 0x03 + .set COMBO_STARTER_HYPNOSIS, 0x04 + .set COMBO_STARTER_ENDURE, 0x05 + .set COMBO_STARTER_HORN_ATTACK, 0x06 + .set COMBO_STARTER_SWORDS_DANCE, 0x07 + .set COMBO_STARTER_STOCKPILE, 0x08 + .set COMBO_STARTER_SUNNY_DAY, 0x09 + .set COMBO_STARTER_REST, 0x0A + .set COMBO_STARTER_VICE_GRIP, 0x0B + .set COMBO_STARTER_DEFENSE_CURL, 0x0C + .set COMBO_STARTER_CHARGE, 0x0D + .set COMBO_STARTER_ROCK_THROW, 0x0E + .set COMBO_STARTER_YAWN, 0x0F + .set COMBO_STARTER_SCARY_FACE, 0x10 + .set COMBO_STARTER_POWDER_SNOW, 0x11 + .set COMBO_STARTER_LOCK_ON, 0x12 + .set COMBO_STARTER_SOFT_BOILED, 0x13 + .set COMBO_STARTER_MEAN_LOOK, 0x14 + .set COMBO_STARTER_SCRATCH, 0x15 + .set COMBO_STARTER_GROWTH, 0x16 + .set COMBO_STARTER_HAIL, 0x17 + .set COMBO_STARTER_SANDSTORM, 0x18 + .set COMBO_STARTER_BELLY_DRUM, 0x19 + .set COMBO_STARTER_MIND_READER, 0x1A + .set COMBO_STARTER_DRAGON_BREATH, 0x1B + .set COMBO_STARTER_DRAGON_RAGE, 0x1C + .set COMBO_STARTER_DRAGON_DANCE, 0x1D + .set COMBO_STARTER_SURF, 0x1E + .set COMBO_STARTER_DIVE, 0x1F + .set COMBO_STARTER_STRING_SHOT, 0x20 + .set COMBO_STARTER_LEER, 0x21 + .set COMBO_STARTER_TAUNT, 0x22 + .set COMBO_STARTER_CHARM, 0x23 + .set COMBO_STARTER_HARDEN, 0x24 + .set COMBO_STARTER_SING, 0x25 + .set COMBO_STARTER_EARTHQUAKE, 0x26 + .set COMBO_STARTER_DOUBLE_TEAM, 0x27 + .set COMBO_STARTER_CURSE, 0x28 + .set COMBO_STARTER_SWEET_SCENT, 0x29 + .set COMBO_STARTER_SLUDGE, 0x2A + .set COMBO_STARTER_SLUDGE_BOMB, 0x2B + .set COMBO_STARTER_THUNDER_PUNCH, 0x2C + .set COMBO_STARTER_FIRE_PUNCH, 0x2D + .set COMBO_STARTER_ICE_PUNCH, 0x2E + .set COMBO_STARTER_PECK, 0x2F + .set COMBO_STARTER_METAL_SOUND, 0x30 + .set COMBO_STARTER_MUD_SPORT, 0x31 + .set COMBO_STARTER_WATER_SPORT, 0x32 + .set COMBO_STARTER_BONE_CLUB, 0x33 + .set COMBO_STARTER_BONEMERANG, 0x34 + .set COMBO_STARTER_BONE_RUSH, 0x35 + .set COMBO_STARTER_SAND_ATTACK, 0x36 + .set COMBO_STARTER_MUD_SLAP, 0x37 + .set COMBO_STARTER_FAKE_OUT, 0x38 + .set COMBO_STARTER_PSYCHIC, 0x39 + .set COMBO_STARTER_KINESIS, 0x3A + .set COMBO_STARTER_CONFUSION, 0x3B + .set COMBO_STARTER_POUND, 0x3C + .set COMBO_STARTER_SMOG, 0x3D + .set COMBO_STARTER_CALM_MIND, 0x3E diff --git a/payload/constants/contest_move_effects.inc b/payload/constants/contest_move_effects.inc new file mode 100644 index 0000000..b19e050 --- /dev/null +++ b/payload/constants/contest_move_effects.inc @@ -0,0 +1,49 @@ + enum_start + enum CONTEST_EFFECT_HIGHLY_APPEALING @ 0 + enum CONTEST_EFFECT_USER_MORE_EASILY_STARTLED @ 1 + enum CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES @ 2 + enum CONTEST_EFFECT_REPETITION_NOT_BORING @ 3 + enum CONTEST_EFFECT_AVOID_STARTLE_ONCE @ 4 + enum CONTEST_EFFECT_AVOID_STARTLE @ 5 + enum CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY @ 6 + enum CONTEST_EFFECT_USER_LESS_EASILY_STARTLED @ 7 + enum CONTEST_EFFECT_STARTLE_FRONT_MON @ 8 + enum CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS @ 9 + enum CONTEST_EFFECT_STARTLE_PREV_MON @ 10 + enum CONTEST_EFFECT_STARTLE_PREV_MONS @ 11 + enum CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON @ 12 + enum CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS @ 13 + enum CONTEST_EFFECT_STARTLE_PREV_MON_2 @ 14 + enum CONTEST_EFFECT_STARTLE_PREV_MONS_2 @ 15 + enum CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION @ 16 + enum CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION @ 17 + enum CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN @ 18 + enum CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL @ 19 + enum CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL @ 20 + enum CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL @ 21 + enum CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL @ 22 + enum CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL @ 23 + enum CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL @ 24 + enum CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS @ 25 + enum CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS @ 26 + enum CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS @ 27 + enum CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION @ 28 + enum CONTEST_EFFECT_BETTER_IF_FIRST @ 29 + enum CONTEST_EFFECT_BETTER_IF_LAST @ 30 + enum CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES @ 31 + enum CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE @ 32 + enum CONTEST_EFFECT_BETTER_WHEN_LATER @ 33 + enum CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING @ 34 + enum CONTEST_EFFECT_BETTER_IF_SAME_TYPE @ 35 + enum CONTEST_EFFECT_BETTER_IF_DIFF_TYPE @ 36 + enum CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL @ 37 + enum CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS @ 38 + enum CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION @ 39 + enum CONTEST_EFFECT_NEXT_APPEAL_EARLIER @ 40 + enum CONTEST_EFFECT_NEXT_APPEAL_LATER @ 41 + enum CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER @ 42 + enum CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER @ 43 + enum CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST @ 44 + enum CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS @ 45 + enum CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED @ 46 + enum CONTEST_EFFECT_DONT_EXCITE_AUDIENCE @ 47 diff --git a/payload/constants/gba_constants.inc b/payload/constants/gba_constants.inc new file mode 100644 index 0000000..9d59c8f --- /dev/null +++ b/payload/constants/gba_constants.inc @@ -0,0 +1,490 @@ + .set PSR_USR_MODE, 0x00000010 + .set PSR_FIQ_MODE, 0x00000011 + .set PSR_IRQ_MODE, 0x00000012 + .set PSR_SVC_MODE, 0x00000013 + .set PSR_ABT_MODE, 0x00000017 + .set PSR_UND_MODE, 0x0000001b + .set PSR_SYS_MODE, 0x0000001f + .set PSR_MODE_MASK, 0x0000001f + .set PSR_T_BIT, 0x00000020 + .set PSR_F_BIT, 0x00000040 + .set PSR_I_BIT, 0x00000080 + + .set EWRAM_START, 0x02000000 + .set EWRAM_END, EWRAM_START + 0x40000 + .set IWRAM_START, 0x03000000 + .set IWRAM_END, IWRAM_START + 0x8000 + + .set PLTT, 0x5000000 + .set BG_PLTT, PLTT + .set OBJ_PLTT, PLTT + 0x200 + + .set VRAM, 0x6000000 + .set BG_VRAM, VRAM + .set OBJ_VRAM0, VRAM + 0x10000 @ text-mode BG + .set OBJ_VRAM1, VRAM + 0x14000 @ bitmap-mode BG + + .set OAM, 0x7000000 + + .set SOUND_INFO_PTR, 0x3007FF0 + .set INTR_CHECK, 0x3007FF8 + .set INTR_VECTOR, 0x3007FFC + + .set INTR_FLAG_VBLANK, 1 << 0 + .set INTR_FLAG_HBLANK, 1 << 1 + .set INTR_FLAG_VCOUNT, 1 << 2 + .set INTR_FLAG_TIMER0, 1 << 3 + .set INTR_FLAG_TIMER1, 1 << 4 + .set INTR_FLAG_TIMER2, 1 << 5 + .set INTR_FLAG_TIMER3, 1 << 6 + .set INTR_FLAG_SERIAL, 1 << 7 + .set INTR_FLAG_DMA0, 1 << 8 + .set INTR_FLAG_DMA1, 1 << 9 + .set INTR_FLAG_DMA2, 1 << 10 + .set INTR_FLAG_DMA3, 1 << 11 + .set INTR_FLAG_KEYPAD, 1 << 12 + .set INTR_FLAG_GAMEPAK, 1 << 13 + + .set VCOUNT_VBLANK, 160 + .set TOTAL_SCANLINES, 228 + + .set REG_BASE, 0x4000000 @ I/O register base address + +@ I/O register offsets + .set OFFSET_REG_DISPCNT, 0x0 + .set OFFSET_REG_DISPSTAT, 0x4 + .set OFFSET_REG_VCOUNT, 0x6 + .set OFFSET_REG_BG0CNT, 0x8 + .set OFFSET_REG_BG1CNT, 0xa + .set OFFSET_REG_BG2CNT, 0xc + .set OFFSET_REG_BG3CNT, 0xe + .set OFFSET_REG_BG0HOFS, 0x10 + .set OFFSET_REG_BG0VOFS, 0x12 + .set OFFSET_REG_BG1HOFS, 0x14 + .set OFFSET_REG_BG1VOFS, 0x16 + .set OFFSET_REG_BG2HOFS, 0x18 + .set OFFSET_REG_BG2VOFS, 0x1a + .set OFFSET_REG_BG3HOFS, 0x1c + .set OFFSET_REG_BG3VOFS, 0x1e + .set OFFSET_REG_BG2PA, 0x20 + .set OFFSET_REG_BG2PB, 0x22 + .set OFFSET_REG_BG2PC, 0x24 + .set OFFSET_REG_BG2PD, 0x26 + .set OFFSET_REG_BG2X_L, 0x28 + .set OFFSET_REG_BG2X_H, 0x2a + .set OFFSET_REG_BG2Y_L, 0x2c + .set OFFSET_REG_BG2Y_H, 0x2e + .set OFFSET_REG_BG3PA, 0x30 + .set OFFSET_REG_BG3PB, 0x32 + .set OFFSET_REG_BG3PC, 0x34 + .set OFFSET_REG_BG3PD, 0x36 + .set OFFSET_REG_BG3X_L, 0x38 + .set OFFSET_REG_BG3X_H, 0x3a + .set OFFSET_REG_BG3Y_L, 0x3c + .set OFFSET_REG_BG3Y_H, 0x3e + .set OFFSET_REG_WIN0H, 0x40 + .set OFFSET_REG_WIN1H, 0x42 + .set OFFSET_REG_WIN0V, 0x44 + .set OFFSET_REG_WIN1V, 0x46 + .set OFFSET_REG_WININ, 0x48 + .set OFFSET_REG_WINOUT, 0x4a + .set OFFSET_REG_MOSAIC, 0x4c + .set OFFSET_REG_BLDCNT, 0x50 + .set OFFSET_REG_BLDALPHA, 0x52 + .set OFFSET_REG_BLDY, 0x54 + + .set OFFSET_REG_SOUND1CNT, 0x60 + .set OFFSET_REG_SOUND1CNT_L, 0x60 + .set OFFSET_REG_NR10, 0x60 + .set OFFSET_REG_SOUND1CNT_H, 0x62 + .set OFFSET_REG_NR11, 0x62 + .set OFFSET_REG_NR12, 0x63 + .set OFFSET_REG_SOUND1CNT_X, 0x64 + .set OFFSET_REG_NR13, 0x64 + .set OFFSET_REG_NR14, 0x65 + .set OFFSET_REG_SOUND2CNT, 0x68 + .set OFFSET_REG_SOUND2CNT_L, 0x68 + .set OFFSET_REG_NR21, 0x68 + .set OFFSET_REG_NR22, 0x69 + .set OFFSET_REG_SOUND2CNT_H, 0x6c + .set OFFSET_REG_NR23, 0x6c + .set OFFSET_REG_NR24, 0x6d + .set OFFSET_REG_SOUND3CNT, 0x70 + .set OFFSET_REG_SOUND3CNT_L, 0x70 + .set OFFSET_REG_NR30, 0x70 + .set OFFSET_REG_SOUND3CNT_H, 0x72 + .set OFFSET_REG_NR31, 0x72 + .set OFFSET_REG_NR32, 0x73 + .set OFFSET_REG_SOUND3CNT_X, 0x74 + .set OFFSET_REG_NR33, 0x74 + .set OFFSET_REG_NR34, 0x75 + .set OFFSET_REG_SOUND4CNT, 0x78 + .set OFFSET_REG_SOUND4CNT_L, 0x78 + .set OFFSET_REG_NR41, 0x78 + .set OFFSET_REG_NR42, 0x79 + .set OFFSET_REG_SOUND4CNT_H, 0x7c + .set OFFSET_REG_NR43, 0x7c + .set OFFSET_REG_NR44, 0x7d + .set OFFSET_REG_SOUNDCNT, 0x80 + .set OFFSET_REG_SOUNDCNT_L, 0x80 + .set OFFSET_REG_NR50, 0x80 + .set OFFSET_REG_NR51, 0x81 + .set OFFSET_REG_SOUNDCNT_H, 0x82 + .set OFFSET_REG_SOUNDCNT_X, 0x84 + .set OFFSET_REG_NR52, 0x84 + .set OFFSET_REG_SOUNDBIAS, 0x88 + .set OFFSET_REG_WAVE_RAM, 0x90 + .set OFFSET_REG_WAVE_RAM0, 0x90 + .set OFFSET_REG_WAVE_RAM0_L, 0x90 + .set OFFSET_REG_WAVE_RAM0_H, 0x92 + .set OFFSET_REG_WAVE_RAM1, 0x94 + .set OFFSET_REG_WAVE_RAM1_L, 0x94 + .set OFFSET_REG_WAVE_RAM1_H, 0x96 + .set OFFSET_REG_WAVE_RAM2, 0x98 + .set OFFSET_REG_WAVE_RAM2_L, 0x98 + .set OFFSET_REG_WAVE_RAM2_H, 0x9a + .set OFFSET_REG_WAVE_RAM3, 0x9c + .set OFFSET_REG_WAVE_RAM3_L, 0x9c + .set OFFSET_REG_WAVE_RAM3_H, 0x9e + .set OFFSET_REG_FIFO, 0xa0 + .set OFFSET_REG_FIFO_A, 0xa0 + .set OFFSET_REG_FIFO_A_L, 0xa0 + .set OFFSET_REG_FIFO_A_H, 0xa2 + .set OFFSET_REG_FIFO_B, 0xa4 + .set OFFSET_REG_FIFO_B_L, 0xa4 + .set OFFSET_REG_FIFO_B_H, 0xa6 + + .set OFFSET_REG_DMA0, 0xb0 + .set OFFSET_REG_DMA0SAD, 0xb0 + .set OFFSET_REG_DMA0SAD_L, 0xb0 + .set OFFSET_REG_DMA0SAD_H, 0xb2 + .set OFFSET_REG_DMA0DAD, 0xb4 + .set OFFSET_REG_DMA0DAD_L, 0xb4 + .set OFFSET_REG_DMA0DAD_H, 0xb6 + .set OFFSET_REG_DMA0CNT, 0xb8 + .set OFFSET_REG_DMA0CNT_L, 0xb8 + .set OFFSET_REG_DMA0CNT_H, 0xba + .set OFFSET_REG_DMA1, 0xbc + .set OFFSET_REG_DMA1SAD, 0xbc + .set OFFSET_REG_DMA1SAD_L, 0xbc + .set OFFSET_REG_DMA1SAD_H, 0xbe + .set OFFSET_REG_DMA1DAD, 0xc0 + .set OFFSET_REG_DMA1DAD_L, 0xc0 + .set OFFSET_REG_DMA1DAD_H, 0xc2 + .set OFFSET_REG_DMA1CNT, 0xc4 + .set OFFSET_REG_DMA1CNT_L, 0xc4 + .set OFFSET_REG_DMA1CNT_H, 0xc6 + .set OFFSET_REG_DMA2, 0xc8 + .set OFFSET_REG_DMA2SAD, 0xc8 + .set OFFSET_REG_DMA2SAD_L, 0xc8 + .set OFFSET_REG_DMA2SAD_H, 0xca + .set OFFSET_REG_DMA2DAD, 0xcc + .set OFFSET_REG_DMA2DAD_L, 0xcc + .set OFFSET_REG_DMA2DAD_H, 0xce + .set OFFSET_REG_DMA2CNT, 0xd0 + .set OFFSET_REG_DMA2CNT_L, 0xd0 + .set OFFSET_REG_DMA2CNT_H, 0xd2 + .set OFFSET_REG_DMA3, 0xd4 + .set OFFSET_REG_DMA3SAD, 0xd4 + .set OFFSET_REG_DMA3SAD_L, 0xd4 + .set OFFSET_REG_DMA3SAD_H, 0xd6 + .set OFFSET_REG_DMA3DAD, 0xd8 + .set OFFSET_REG_DMA3DAD_L, 0xd8 + .set OFFSET_REG_DMA3DAD_H, 0xda + .set OFFSET_REG_DMA3CNT, 0xdc + .set OFFSET_REG_DMA3CNT_L, 0xdc + .set OFFSET_REG_DMA3CNT_H, 0xde + + .set OFFSET_REG_TM0CNT, 0x100 + .set OFFSET_REG_TM0CNT_L, 0x100 + .set OFFSET_REG_TM0CNT_H, 0x102 + .set OFFSET_REG_TM1CNT, 0x104 + .set OFFSET_REG_TM1CNT_L, 0x104 + .set OFFSET_REG_TM1CNT_H, 0x106 + .set OFFSET_REG_TM2CNT, 0x108 + .set OFFSET_REG_TM2CNT_L, 0x108 + .set OFFSET_REG_TM2CNT_H, 0x10a + .set OFFSET_REG_TM3CNT, 0x10c + .set OFFSET_REG_TM3CNT_L, 0x10c + .set OFFSET_REG_TM3CNT_H, 0x10e + + .set OFFSET_REG_SIOCNT, 0x128 + .set OFFSET_REG_SIODATA8, 0x12a + .set OFFSET_REG_SIODATA32, 0x120 + .set OFFSET_REG_SIOMLT_SEND, 0x12a + .set OFFSET_REG_SIOMLT_RECV, 0x120 + .set OFFSET_REG_SIOMULTI0, 0x120 + .set OFFSET_REG_SIOMULTI1, 0x122 + .set OFFSET_REG_SIOMULTI2, 0x124 + .set OFFSET_REG_SIOMULTI3, 0x126 + + .set OFFSET_REG_KEYINPUT, 0x130 + .set OFFSET_REG_KEYCNT, 0x132 + + .set OFFSET_REG_RCNT, 0x134 + + .set OFFSET_REG_JOYCNT, 0x140 + .set OFFSET_REG_JOYSTAT, 0x158 + .set OFFSET_REG_JOY_RECV, 0x150 + .set OFFSET_REG_JOY_RECV_L, 0x150 + .set OFFSET_REG_JOY_RECV_H, 0x152 + .set OFFSET_REG_JOY_TRANS, 0x154 + .set OFFSET_REG_JOY_TRANS_L, 0x154 + .set OFFSET_REG_JOY_TRANS_H, 0x156 + + .set OFFSET_REG_IME, 0x208 + .set OFFSET_REG_IE, 0x200 + .set OFFSET_REG_IF, 0x202 + + .set OFFSET_REG_WAITCNT, 0x204 + +@ I/O register addresses + .set REG_DISPCNT, REG_BASE + OFFSET_REG_DISPCNT + .set REG_DISPSTAT, REG_BASE + OFFSET_REG_DISPSTAT + .set REG_VCOUNT, REG_BASE + OFFSET_REG_VCOUNT + .set REG_BG0CNT, REG_BASE + OFFSET_REG_BG0CNT + .set REG_BG1CNT, REG_BASE + OFFSET_REG_BG1CNT + .set REG_BG2CNT, REG_BASE + OFFSET_REG_BG2CNT + .set REG_BG3CNT, REG_BASE + OFFSET_REG_BG3CNT + .set REG_BG0HOFS, REG_BASE + OFFSET_REG_BG0HOFS + .set REG_BG0VOFS, REG_BASE + OFFSET_REG_BG0VOFS + .set REG_BG1HOFS, REG_BASE + OFFSET_REG_BG1HOFS + .set REG_BG1VOFS, REG_BASE + OFFSET_REG_BG1VOFS + .set REG_BG2HOFS, REG_BASE + OFFSET_REG_BG2HOFS + .set REG_BG2VOFS, REG_BASE + OFFSET_REG_BG2VOFS + .set REG_BG3HOFS, REG_BASE + OFFSET_REG_BG3HOFS + .set REG_BG3VOFS, REG_BASE + OFFSET_REG_BG3VOFS + .set REG_BG2PA, REG_BASE + OFFSET_REG_BG2PA + .set REG_BG2PB, REG_BASE + OFFSET_REG_BG2PB + .set REG_BG2PC, REG_BASE + OFFSET_REG_BG2PC + .set REG_BG2PD, REG_BASE + OFFSET_REG_BG2PD + .set REG_BG2X_L, REG_BASE + OFFSET_REG_BG2X_L + .set REG_BG2X_H, REG_BASE + OFFSET_REG_BG2X_H + .set REG_BG2Y_L, REG_BASE + OFFSET_REG_BG2Y_L + .set REG_BG2Y_H, REG_BASE + OFFSET_REG_BG2Y_H + .set REG_BG3PA, REG_BASE + OFFSET_REG_BG3PA + .set REG_BG3PB, REG_BASE + OFFSET_REG_BG3PB + .set REG_BG3PC, REG_BASE + OFFSET_REG_BG3PC + .set REG_BG3PD, REG_BASE + OFFSET_REG_BG3PD + .set REG_BG3X_L, REG_BASE + OFFSET_REG_BG3X_L + .set REG_BG3X_H, REG_BASE + OFFSET_REG_BG3X_H + .set REG_BG3Y_L, REG_BASE + OFFSET_REG_BG3Y_L + .set REG_BG3Y_H, REG_BASE + OFFSET_REG_BG3Y_H + .set REG_WIN0H, REG_BASE + OFFSET_REG_WIN0H + .set REG_WIN1H, REG_BASE + OFFSET_REG_WIN1H + .set REG_WIN0V, REG_BASE + OFFSET_REG_WIN0V + .set REG_WIN1V, REG_BASE + OFFSET_REG_WIN1V + .set REG_WININ, REG_BASE + OFFSET_REG_WININ + .set REG_WINOUT, REG_BASE + OFFSET_REG_WINOUT + .set REG_MOSAIC, REG_BASE + OFFSET_REG_MOSAIC + .set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT + .set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA + .set REG_BLDY, REG_BASE + OFFSET_REG_BLDY + + .set REG_SOUND1CNT, REG_BASE + OFFSET_REG_SOUND1CNT + .set REG_SOUND1CNT_L, REG_BASE + OFFSET_REG_SOUND1CNT_L + .set REG_NR10, REG_BASE + OFFSET_REG_NR10 + .set REG_SOUND1CNT_H, REG_BASE + OFFSET_REG_SOUND1CNT_H + .set REG_NR11, REG_BASE + OFFSET_REG_NR11 + .set REG_NR12, REG_BASE + OFFSET_REG_NR12 + .set REG_SOUND1CNT_X, REG_BASE + OFFSET_REG_SOUND1CNT_X + .set REG_NR13, REG_BASE + OFFSET_REG_NR13 + .set REG_NR14, REG_BASE + OFFSET_REG_NR14 + .set REG_SOUND2CNT, REG_BASE + OFFSET_REG_SOUND2CNT + .set REG_SOUND2CNT_L, REG_BASE + OFFSET_REG_SOUND2CNT_L + .set REG_NR21, REG_BASE + OFFSET_REG_NR21 + .set REG_NR22, REG_BASE + OFFSET_REG_NR22 + .set REG_SOUND2CNT_H, REG_BASE + OFFSET_REG_SOUND2CNT_H + .set REG_NR23, REG_BASE + OFFSET_REG_NR23 + .set REG_NR24, REG_BASE + OFFSET_REG_NR24 + .set REG_SOUND3CNT, REG_BASE + OFFSET_REG_SOUND3CNT + .set REG_SOUND3CNT_L, REG_BASE + OFFSET_REG_SOUND3CNT_L + .set REG_NR30, REG_BASE + OFFSET_REG_NR30 + .set REG_SOUND3CNT_H, REG_BASE + OFFSET_REG_SOUND3CNT_H + .set REG_NR31, REG_BASE + OFFSET_REG_NR31 + .set REG_NR32, REG_BASE + OFFSET_REG_NR32 + .set REG_SOUND3CNT_X, REG_BASE + OFFSET_REG_SOUND3CNT_X + .set REG_NR33, REG_BASE + OFFSET_REG_NR33 + .set REG_NR34, REG_BASE + OFFSET_REG_NR34 + .set REG_SOUND4CNT, REG_BASE + OFFSET_REG_SOUND4CNT + .set REG_SOUND4CNT_L, REG_BASE + OFFSET_REG_SOUND4CNT_L + .set REG_NR41, REG_BASE + OFFSET_REG_NR41 + .set REG_NR42, REG_BASE + OFFSET_REG_NR42 + .set REG_SOUND4CNT_H, REG_BASE + OFFSET_REG_SOUND4CNT_H + .set REG_NR43, REG_BASE + OFFSET_REG_NR43 + .set REG_NR44, REG_BASE + OFFSET_REG_NR44 + .set REG_SOUNDCNT, REG_BASE + OFFSET_REG_SOUNDCNT + .set REG_SOUNDCNT_L, REG_BASE + OFFSET_REG_SOUNDCNT_L + .set REG_NR50, REG_BASE + OFFSET_REG_NR50 + .set REG_NR51, REG_BASE + OFFSET_REG_NR51 + .set REG_SOUNDCNT_H, REG_BASE + OFFSET_REG_SOUNDCNT_H + .set REG_SOUNDCNT_X, REG_BASE + OFFSET_REG_SOUNDCNT_X + .set REG_NR52, REG_BASE + OFFSET_REG_NR52 + .set REG_SOUNDBIAS, REG_BASE + OFFSET_REG_SOUNDBIAS + .set REG_WAVE_RAM, REG_BASE + OFFSET_REG_WAVE_RAM + .set REG_WAVE_RAM0, REG_BASE + OFFSET_REG_WAVE_RAM0 + .set REG_WAVE_RAM0_L, REG_BASE + OFFSET_REG_WAVE_RAM0_L + .set REG_WAVE_RAM0_H, REG_BASE + OFFSET_REG_WAVE_RAM0_H + .set REG_WAVE_RAM1, REG_BASE + OFFSET_REG_WAVE_RAM1 + .set REG_WAVE_RAM1_L, REG_BASE + OFFSET_REG_WAVE_RAM1_L + .set REG_WAVE_RAM1_H, REG_BASE + OFFSET_REG_WAVE_RAM1_H + .set REG_WAVE_RAM2, REG_BASE + OFFSET_REG_WAVE_RAM2 + .set REG_WAVE_RAM2_L, REG_BASE + OFFSET_REG_WAVE_RAM2_L + .set REG_WAVE_RAM2_H, REG_BASE + OFFSET_REG_WAVE_RAM2_H + .set REG_WAVE_RAM3, REG_BASE + OFFSET_REG_WAVE_RAM3 + .set REG_WAVE_RAM3_L, REG_BASE + OFFSET_REG_WAVE_RAM3_L + .set REG_WAVE_RAM3_H, REG_BASE + OFFSET_REG_WAVE_RAM3_H + .set REG_FIFO, REG_BASE + OFFSET_REG_FIFO + .set REG_FIFO_A, REG_BASE + OFFSET_REG_FIFO_A + .set REG_FIFO_A_L, REG_BASE + OFFSET_REG_FIFO_A_L + .set REG_FIFO_A_H, REG_BASE + OFFSET_REG_FIFO_A_H + .set REG_FIFO_B, REG_BASE + OFFSET_REG_FIFO_B + .set REG_FIFO_B_L, REG_BASE + OFFSET_REG_FIFO_B_L + .set REG_FIFO_B_H, REG_BASE + OFFSET_REG_FIFO_B_H + + .set REG_DMA0, REG_BASE + OFFSET_REG_DMA0 + .set REG_DMA0SAD, REG_BASE + OFFSET_REG_DMA0SAD + .set REG_DMA0SAD_L, REG_BASE + OFFSET_REG_DMA0SAD_L + .set REG_DMA0SAD_H, REG_BASE + OFFSET_REG_DMA0SAD_H + .set REG_DMA0DAD, REG_BASE + OFFSET_REG_DMA0DAD + .set REG_DMA0DAD_L, REG_BASE + OFFSET_REG_DMA0DAD_L + .set REG_DMA0DAD_H, REG_BASE + OFFSET_REG_DMA0DAD_H + .set REG_DMA0CNT, REG_BASE + OFFSET_REG_DMA0CNT + .set REG_DMA0CNT_L, REG_BASE + OFFSET_REG_DMA0CNT_L + .set REG_DMA0CNT_H, REG_BASE + OFFSET_REG_DMA0CNT_H + .set REG_DMA1, REG_BASE + OFFSET_REG_DMA1 + .set REG_DMA1SAD, REG_BASE + OFFSET_REG_DMA1SAD + .set REG_DMA1SAD_L, REG_BASE + OFFSET_REG_DMA1SAD_L + .set REG_DMA1SAD_H, REG_BASE + OFFSET_REG_DMA1SAD_H + .set REG_DMA1DAD, REG_BASE + OFFSET_REG_DMA1DAD + .set REG_DMA1DAD_L, REG_BASE + OFFSET_REG_DMA1DAD_L + .set REG_DMA1DAD_H, REG_BASE + OFFSET_REG_DMA1DAD_H + .set REG_DMA1CNT, REG_BASE + OFFSET_REG_DMA1CNT + .set REG_DMA1CNT_L, REG_BASE + OFFSET_REG_DMA1CNT_L + .set REG_DMA1CNT_H, REG_BASE + OFFSET_REG_DMA1CNT_H + .set REG_DMA2, REG_BASE + OFFSET_REG_DMA2 + .set REG_DMA2SAD, REG_BASE + OFFSET_REG_DMA2SAD + .set REG_DMA2SAD_L, REG_BASE + OFFSET_REG_DMA2SAD_L + .set REG_DMA2SAD_H, REG_BASE + OFFSET_REG_DMA2SAD_H + .set REG_DMA2DAD, REG_BASE + OFFSET_REG_DMA2DAD + .set REG_DMA2DAD_L, REG_BASE + OFFSET_REG_DMA2DAD_L + .set REG_DMA2DAD_H, REG_BASE + OFFSET_REG_DMA2DAD_H + .set REG_DMA2CNT, REG_BASE + OFFSET_REG_DMA2CNT + .set REG_DMA2CNT_L, REG_BASE + OFFSET_REG_DMA2CNT_L + .set REG_DMA2CNT_H, REG_BASE + OFFSET_REG_DMA2CNT_H + .set REG_DMA3, REG_BASE + OFFSET_REG_DMA3 + .set REG_DMA3SAD, REG_BASE + OFFSET_REG_DMA3SAD + .set REG_DMA3SAD_L, REG_BASE + OFFSET_REG_DMA3SAD_L + .set REG_DMA3SAD_H, REG_BASE + OFFSET_REG_DMA3SAD_H + .set REG_DMA3DAD, REG_BASE + OFFSET_REG_DMA3DAD + .set REG_DMA3DAD_L, REG_BASE + OFFSET_REG_DMA3DAD_L + .set REG_DMA3DAD_H, REG_BASE + OFFSET_REG_DMA3DAD_H + .set REG_DMA3CNT, REG_BASE + OFFSET_REG_DMA3CNT + .set REG_DMA3CNT_L, REG_BASE + OFFSET_REG_DMA3CNT_L + .set REG_DMA3CNT_H, REG_BASE + OFFSET_REG_DMA3CNT_H + + .set REG_TM0CNT, REG_BASE + OFFSET_REG_TM0CNT + .set REG_TM0CNT_L, REG_BASE + OFFSET_REG_TM0CNT_L + .set REG_TM0CNT_H, REG_BASE + OFFSET_REG_TM0CNT_H + .set REG_TM1CNT, REG_BASE + OFFSET_REG_TM1CNT + .set REG_TM1CNT_L, REG_BASE + OFFSET_REG_TM1CNT_L + .set REG_TM1CNT_H, REG_BASE + OFFSET_REG_TM1CNT_H + .set REG_TM2CNT, REG_BASE + OFFSET_REG_TM2CNT + .set REG_TM2CNT_L, REG_BASE + OFFSET_REG_TM2CNT_L + .set REG_TM2CNT_H, REG_BASE + OFFSET_REG_TM2CNT_H + .set REG_TM3CNT, REG_BASE + OFFSET_REG_TM3CNT + .set REG_TM3CNT_L, REG_BASE + OFFSET_REG_TM3CNT_L + .set REG_TM3CNT_H, REG_BASE + OFFSET_REG_TM3CNT_H + + .set REG_SIOCNT, REG_BASE + OFFSET_REG_SIOCNT + .set REG_SIODATA8, REG_BASE + OFFSET_REG_SIODATA8 + .set REG_SIODATA32, REG_BASE + OFFSET_REG_SIODATA32 + .set REG_SIOMLT_SEND, REG_BASE + OFFSET_REG_SIOMLT_SEND + .set REG_SIOMLT_RECV, REG_BASE + OFFSET_REG_SIOMLT_RECV + .set REG_SIOMULTI0, REG_BASE + OFFSET_REG_SIOMULTI0 + .set REG_SIOMULTI1, REG_BASE + OFFSET_REG_SIOMULTI1 + .set REG_SIOMULTI2, REG_BASE + OFFSET_REG_SIOMULTI2 + .set REG_SIOMULTI3, REG_BASE + OFFSET_REG_SIOMULTI3 + + .set REG_KEYINPUT, REG_BASE + OFFSET_REG_KEYINPUT + .set REG_KEYCNT, REG_BASE + OFFSET_REG_KEYCNT + + .set REG_RCNT, REG_BASE + OFFSET_REG_RCNT + + .set REG_JOYCNT, REG_BASE + OFFSET_REG_JOYCNT + .set REG_JOYSTAT, REG_BASE + OFFSET_REG_JOYSTAT + .set REG_JOY_RECV, REG_BASE + OFFSET_REG_JOY_RECV + .set REG_JOY_RECV_L, REG_BASE + OFFSET_REG_JOY_RECV_L + .set REG_JOY_RECV_H, REG_BASE + OFFSET_REG_JOY_RECV_H + .set REG_JOY_TRANS, REG_BASE + OFFSET_REG_JOY_TRANS + .set REG_JOY_TRANS_L, REG_BASE + OFFSET_REG_JOY_TRANS_L + .set REG_JOY_TRANS_H, REG_BASE + OFFSET_REG_JOY_TRANS_H + + .set REG_IME, REG_BASE + OFFSET_REG_IME + .set REG_IE, REG_BASE + OFFSET_REG_IE + .set REG_IF, REG_BASE + OFFSET_REG_IF + + .set REG_WAITCNT, REG_BASE + OFFSET_REG_WAITCNT + +@ DMA register constants + + .set DMA_DEST_INC, 0x0000 + .set DMA_DEST_DEC, 0x0020 + .set DMA_DEST_FIXED, 0x0040 + .set DMA_DEST_RELOAD, 0x0060 + .set DMA_SRC_INC, 0x0000 + .set DMA_SRC_DEC, 0x0080 + .set DMA_SRC_FIXED, 0x0100 + .set DMA_REPEAT, 0x0200 + .set DMA_16BIT, 0x0000 + .set DMA_32BIT, 0x0400 + .set DMA_DREQ_ON, 0x0800 + .set DMA_START_NOW, 0x0000 + .set DMA_START_VBLANK, 0x1000 + .set DMA_START_HBLANK, 0x2000 + .set DMA_START_SPECIAL, 0x3000 + .set DMA_INTR_ENABLE, 0x4000 + .set DMA_ENABLE, 0x8000 + +@ OAM attribute constants + + .set OAM_OBJ_NORMAL, 0x00000000 + .set OAM_OBJ_BLEND, 0x00000400 + .set OAM_OBJ_WINDOW, 0x00000800 + + .set OAM_AFFINE_NONE, 0x00000000 + .set OAM_AFFINE_NORMAL_SIZE, 0x00000100 + .set OAM_OBJ_DISABLED, 0x00000200 + .set OAM_AFFINE_DOUBLE_SIZE, 0x00000300 + + .set OAM_MOSAIC_OFF, 0x00000000 + .set OAM_MOSAIC_ON, 0x00001000 + + .set OAM_4BPP, 0x00000000 + .set OAM_8BPP, 0x00002000 + + .set OAM_H_FLIP, 0x10000000 + .set OAM_V_FLIP, 0x20000000 + + .set OAM_SQUARE, 0x00000000 + .set OAM_H_RECTANGLE, 0x00004000 + .set OAM_V_RECTANGLE, 0x00008000 + .set OAM_SIZE_0, 0x00000000 + .set OAM_SIZE_1, 0x40000000 + .set OAM_SIZE_2, 0x80000000 + .set OAM_SIZE_3, 0xc0000000 + + .set OAM_SIZE_8x8, OAM_SIZE_0 | OAM_SQUARE + .set OAM_SIZE_16x16, OAM_SIZE_1 | OAM_SQUARE + .set OAM_SIZE_32x32, OAM_SIZE_2 | OAM_SQUARE + .set OAM_SIZE_64x64, OAM_SIZE_3 | OAM_SQUARE + + .set OAM_SIZE_16x8, OAM_SIZE_0 | OAM_H_RECTANGLE + .set OAM_SIZE_32x8, OAM_SIZE_1 | OAM_H_RECTANGLE + .set OAM_SIZE_32x16, OAM_SIZE_2 | OAM_H_RECTANGLE + .set OAM_SIZE_64x32, OAM_SIZE_3 | OAM_H_RECTANGLE + + .set OAM_SIZE_8x16, OAM_SIZE_0 | OAM_V_RECTANGLE + .set OAM_SIZE_8x32, OAM_SIZE_1 | OAM_V_RECTANGLE + .set OAM_SIZE_16x32, OAM_SIZE_2 | OAM_V_RECTANGLE + .set OAM_SIZE_32x64, OAM_SIZE_3 | OAM_V_RECTANGLE diff --git a/payload/constants/item_data_constants.inc b/payload/constants/item_data_constants.inc new file mode 100644 index 0000000..cfeb9c1 --- /dev/null +++ b/payload/constants/item_data_constants.inc @@ -0,0 +1,5 @@ + .set POCKET_ITEMS, 0x01 + .set POCKET_KEY_ITEMS, 0x02 + .set POCKET_POKE_BALLS, 0x03 + .set POCKET_TM_CASE, 0x04 + .set POCKET_BERRY_POUCH, 0x05 diff --git a/payload/constants/m4a_constants.inc b/payload/constants/m4a_constants.inc new file mode 100644 index 0000000..62ca5bb --- /dev/null +++ b/payload/constants/m4a_constants.inc @@ -0,0 +1,199 @@ + .equiv ID_NUMBER, 0x68736d53 + + .equiv PCM_DMA_BUF_SIZE, 1584 + + .equiv TONEDATA_TYPE_CGB, 0x07 + .equiv TONEDATA_TYPE_FIX, 0x08 + .equiv TONEDATA_TYPE_SPL, 0x40 @ key split + .equiv TONEDATA_TYPE_RHY, 0x80 @ rhythm + + .macro struct_begin + .struct 0 + .endm + + .macro struct_field name, size +\name: + .struct \name + \size + .endm + + struct_begin + struct_field o_SoundInfo_ident, 4 + struct_field o_SoundInfo_pcmDmaCounter, 1 + struct_field o_SoundInfo_reverb, 1 + struct_field o_SoundInfo_maxChans, 1 + struct_field o_SoundInfo_masterVolume, 1 + struct_field o_SoundInfo_freq, 1 + struct_field o_SoundInfo_mode, 1 + struct_field o_SoundInfo_c15, 1 + struct_field o_SoundInfo_pcmDmaPeriod, 1 + struct_field o_SoundInfo_maxLines, 1 + struct_field o_SoundInfo_gap, 3 + struct_field o_SoundInfo_pcmSamplesPerVBlank, 4 + struct_field o_SoundInfo_pcmFreq, 4 + struct_field o_SoundInfo_divFreq, 4 + struct_field o_SoundInfo_cgbChans, 4 + struct_field o_SoundInfo_func, 4 + struct_field o_SoundInfo_intp, 4 + struct_field o_SoundInfo_CgbSound, 4 + struct_field o_SoundInfo_CgbOscOff, 4 + struct_field o_SoundInfo_MidiKeyToCgbFreq, 4 + struct_field o_SoundInfo_MPlayJumpTable, 4 + struct_field o_SoundInfo_plynote, 4 + struct_field o_SoundInfo_ExtVolPit, 4 + struct_field o_SoundInfo_gap2, 16 + struct_field o_SoundInfo_chans, 768 + struct_field o_SoundInfo_pcmBuffer, PCM_DMA_BUF_SIZE * 2 + struct_field SoundInfo_size, 0 + + struct_begin + struct_field o_SoundChannel_status, 1 + struct_field o_SoundChannel_type, 1 + struct_field o_SoundChannel_rightVolume, 1 + struct_field o_SoundChannel_leftVolume, 1 + struct_field o_SoundChannel_attack, 1 + struct_field o_SoundChannel_decay, 1 + struct_field o_SoundChannel_sustain, 1 + struct_field o_SoundChannel_release, 1 + struct_field o_SoundChannel_ky, 1 + struct_field o_SoundChannel_ev, 1 + struct_field o_SoundChannel_er, 1 + struct_field o_SoundChannel_el, 1 + struct_field o_SoundChannel_iev, 1 + struct_field o_SoundChannel_iel, 1 + struct_field o_SoundChannel_d1, 1 + struct_field o_SoundChannel_d2, 1 + struct_field o_SoundChannel_gt, 1 + struct_field o_SoundChannel_mk, 1 + struct_field o_SoundChannel_ve, 1 + struct_field o_SoundChannel_pr, 1 + struct_field o_SoundChannel_rp, 1 + struct_field o_SoundChannel_d3, 3 + struct_field o_SoundChannel_ct, 4 + struct_field o_SoundChannel_fw, 4 + struct_field o_SoundChannel_freq, 4 + struct_field o_SoundChannel_wav, 4 + struct_field o_SoundChannel_cp, 4 + struct_field o_SoundChannel_track, 4 + struct_field o_SoundChannel_pp, 4 + struct_field o_SoundChannel_np, 4 + struct_field o_SoundChannel_d4, 4 + struct_field o_SoundChannel_xpi, 2 + struct_field o_SoundChannel_xpc, 2 + struct_field SoundChannel_size, 0 + + struct_begin + struct_field o_MusicPlayerTrack_flags, 1 + struct_field o_MusicPlayerTrack_wait, 1 + struct_field o_MusicPlayerTrack_patternLevel, 1 + struct_field o_MusicPlayerTrack_repN, 1 + struct_field o_MusicPlayerTrack_gateTime, 1 + struct_field o_MusicPlayerTrack_key, 1 + struct_field o_MusicPlayerTrack_velocity, 1 + struct_field o_MusicPlayerTrack_runningStatus, 1 + struct_field o_MusicPlayerTrack_keyM, 1 + struct_field o_MusicPlayerTrack_pitM, 1 + struct_field o_MusicPlayerTrack_keyShift, 1 + struct_field o_MusicPlayerTrack_keyShiftX, 1 + struct_field o_MusicPlayerTrack_tune, 1 + struct_field o_MusicPlayerTrack_pitX, 1 + struct_field o_MusicPlayerTrack_bend, 1 + struct_field o_MusicPlayerTrack_bendRange, 1 + struct_field o_MusicPlayerTrack_volMR, 1 + struct_field o_MusicPlayerTrack_volML, 1 + struct_field o_MusicPlayerTrack_vol, 1 + struct_field o_MusicPlayerTrack_volX, 1 + struct_field o_MusicPlayerTrack_pan, 1 + struct_field o_MusicPlayerTrack_panX, 1 + struct_field o_MusicPlayerTrack_modM, 1 + struct_field o_MusicPlayerTrack_mod, 1 + struct_field o_MusicPlayerTrack_modT, 1 + struct_field o_MusicPlayerTrack_lfoSpeed, 1 + struct_field o_MusicPlayerTrack_lfoSpeedC, 1 + struct_field o_MusicPlayerTrack_lfoDelay, 1 + struct_field o_MusicPlayerTrack_lfoDelayC, 1 + struct_field o_MusicPlayerTrack_priority, 1 + struct_field o_MusicPlayerTrack_echoVolume, 1 + struct_field o_MusicPlayerTrack_echoLength, 1 + struct_field o_MusicPlayerTrack_chan, 4 + struct_field o_MusicPlayerTrack_ToneData_type, 1 + struct_field o_MusicPlayerTrack_ToneData_key, 1 + struct_field o_MusicPlayerTrack_ToneData_length, 1 + struct_field o_MusicPlayerTrack_ToneData_pan_sweep, 1 + struct_field o_MusicPlayerTrack_ToneData_wav, 4 + struct_field o_MusicPlayerTrack_ToneData_attack, 1 + struct_field o_MusicPlayerTrack_ToneData_decay, 1 + struct_field o_MusicPlayerTrack_ToneData_sustain, 1 + struct_field o_MusicPlayerTrack_ToneData_release, 1 + struct_field o_MusicPlayerTrack_gap, 10 + struct_field o_MusicPlayerTrack_unk_3A, 2 + struct_field o_MusicPlayerTrack_unk_3C, 4 + struct_field o_MusicPlayerTrack_cmdPtr, 4 + struct_field o_MusicPlayerTrack_patternStack, 12 + struct_field MusicPlayerTrack_size, 0 + + .equiv o_MusicPlayerTrack_ToneData_keySplitTable, o_MusicPlayerTrack_ToneData_attack + + struct_begin + struct_field o_MusicPlayerInfo_songHeader, 4 + struct_field o_MusicPlayerInfo_status, 4 + struct_field o_MusicPlayerInfo_trackCount, 1 + struct_field o_MusicPlayerInfo_priority, 1 + struct_field o_MusicPlayerInfo_cmd, 1 + struct_field o_MusicPlayerInfo_unk_B, 1 + struct_field o_MusicPlayerInfo_clock, 4 + struct_field o_MusicPlayerInfo_gap, 8 + struct_field o_MusicPlayerInfo_memAccArea, 4 + struct_field o_MusicPlayerInfo_tempoD, 2 + struct_field o_MusicPlayerInfo_tempoU, 2 + struct_field o_MusicPlayerInfo_tempoI, 2 + struct_field o_MusicPlayerInfo_tempoC, 2 + struct_field o_MusicPlayerInfo_fadeOI, 2 + struct_field o_MusicPlayerInfo_fadeOC, 2 + struct_field o_MusicPlayerInfo_fadeOV, 2 + struct_field o_MusicPlayerInfo_padding, 2 + struct_field o_MusicPlayerInfo_tracks, 4 + struct_field o_MusicPlayerInfo_tone, 4 + struct_field o_MusicPlayerInfo_ident, 4 + struct_field o_MusicPlayerInfo_func, 4 + struct_field o_MusicPlayerInfo_intp, 4 + struct_field MusicPlayerInfo_size, 0 + + struct_begin + struct_field o_CgbChannel_sf, 1 + struct_field o_CgbChannel_ty, 1 + struct_field o_CgbChannel_rightVolume, 1 + struct_field o_CgbChannel_leftVolume, 1 + struct_field o_CgbChannel_at, 1 + struct_field o_CgbChannel_de, 1 + struct_field o_CgbChannel_su, 1 + struct_field o_CgbChannel_re, 1 + struct_field o_CgbChannel_ky, 1 + struct_field o_CgbChannel_ev, 1 + struct_field o_CgbChannel_eg, 1 + struct_field o_CgbChannel_ec, 1 + struct_field o_CgbChannel_echoVolume, 1 + struct_field o_CgbChannel_echoLength, 1 + struct_field o_CgbChannel_d1, 1 + struct_field o_CgbChannel_d2, 1 + struct_field o_CgbChannel_gt, 1 + struct_field o_CgbChannel_mk, 1 + struct_field o_CgbChannel_ve, 1 + struct_field o_CgbChannel_pr, 1 + struct_field o_CgbChannel_rp, 1 + struct_field o_CgbChannel_d3, 3 + struct_field o_CgbChannel_d5, 1 + struct_field o_CgbChannel_sg, 1 + struct_field o_CgbChannel_n4, 1 + struct_field o_CgbChannel_pan, 1 + struct_field o_CgbChannel_panMask, 1 + struct_field o_CgbChannel_mo, 1 + struct_field o_CgbChannel_le, 1 + struct_field o_CgbChannel_sw, 1 + struct_field o_CgbChannel_fr, 4 + struct_field o_CgbChannel_wp, 4 + struct_field o_CgbChannel_cp, 4 + struct_field o_CgbChannel_tp, 4 + struct_field o_CgbChannel_pp, 4 + struct_field o_CgbChannel_np, 4 + struct_field o_CgbChannel_d4, 8 + struct_field CgbChannel_size, 0 diff --git a/payload/constants/misc_constants.inc b/payload/constants/misc_constants.inc new file mode 100644 index 0000000..5f43309 --- /dev/null +++ b/payload/constants/misc_constants.inc @@ -0,0 +1,51 @@ + .set TRUE, 1 + .set FALSE, 0 + + .set NULL, 0 + + .set POKEMON_NAME_LENGTH, 11 + .set MOVE_NAME_LENGTH, 13 + + .set SPRITE_SIZE_8x8, (OAM_SIZE_0 >> 28) | (OAM_SQUARE >> 14) + .set SPRITE_SIZE_16x16, (OAM_SIZE_1 >> 28) | (OAM_SQUARE >> 14) + .set SPRITE_SIZE_32x32, (OAM_SIZE_2 >> 28) | (OAM_SQUARE >> 14) + .set SPRITE_SIZE_64x64, (OAM_SIZE_3 >> 28) | (OAM_SQUARE >> 14) + + .set SPRITE_SIZE_16x8, (OAM_SIZE_0 >> 28) | (OAM_H_RECTANGLE >> 14) + .set SPRITE_SIZE_32x8, (OAM_SIZE_1 >> 28) | (OAM_H_RECTANGLE >> 14) + .set SPRITE_SIZE_32x16, (OAM_SIZE_2 >> 28) | (OAM_H_RECTANGLE >> 14) + .set SPRITE_SIZE_64x32, (OAM_SIZE_3 >> 28) | (OAM_H_RECTANGLE >> 14) + + .set SPRITE_SIZE_8x16, (OAM_SIZE_0 >> 28) | (OAM_V_RECTANGLE >> 14) + .set SPRITE_SIZE_8x32, (OAM_SIZE_1 >> 28) | (OAM_V_RECTANGLE >> 14) + .set SPRITE_SIZE_16x32, (OAM_SIZE_2 >> 28) | (OAM_V_RECTANGLE >> 14) + .set SPRITE_SIZE_32x64, (OAM_SIZE_3 >> 28) | (OAM_V_RECTANGLE >> 14) + + .set OBJ_IMAGE_ANIM_H_FLIP, 1 << 6 + .set OBJ_IMAGE_ANIM_V_FLIP, 1 << 7 + + .equiv DIR_SOUTH, 1 + .equiv DIR_NORTH, 2 + .equiv DIR_WEST, 3 + .equiv DIR_EAST, 4 + + .equiv MALE, 0 + .equiv FEMALE, 1 + + .ifdef ENGLISH + .equiv GAME_LANGUAGE, 2 + .else + .ifdef GERMAN + .equiv GAME_LANGUAGE, 5 + .endif + .endif + + .equiv ENEMY_TYPE1, 0 + .equiv ENEMY_TYPE2, 1 + .equiv PLAYER_TYPE1, 2 + .equiv PLAYER_TYPE2, 3 + .equiv CURRENT_MOVE, 4 + + .equiv LESS_THAN, 0 + .equiv GREATER_THAN, 1 + .equiv EQUAL, 2 diff --git a/payload/constants/pokemon_data_constants.inc b/payload/constants/pokemon_data_constants.inc new file mode 100644 index 0000000..cf5d4df --- /dev/null +++ b/payload/constants/pokemon_data_constants.inc @@ -0,0 +1,78 @@ + .set NATURE_HARDY, 0 + .set NATURE_LONELY, 1 + .set NATURE_BRAVE, 2 + .set NATURE_ADAMANT, 3 + .set NATURE_NAUGHTY, 4 + .set NATURE_BOLD, 5 + .set NATURE_DOCILE, 6 + .set NATURE_RELAXED, 7 + .set NATURE_IMPISH, 8 + .set NATURE_LAX, 9 + .set NATURE_TIMID, 10 + .set NATURE_HASTY, 11 + .set NATURE_SERIOUS, 12 + .set NATURE_JOLLY, 13 + .set NATURE_NAIVE, 14 + .set NATURE_MODEST, 15 + .set NATURE_MILD, 16 + .set NATURE_QUIET, 17 + .set NATURE_BASHFUL, 18 + .set NATURE_RASH, 19 + .set NATURE_CALM, 20 + .set NATURE_GENTLE, 21 + .set NATURE_SASSY, 22 + .set NATURE_CAREFUL, 23 + .set NATURE_QUIRKY, 24 + + .set GROWTH_MEDIUM_FAST, 0x00 + .set GROWTH_ERRATIC, 0x01 + .set GROWTH_FLUCTUATING, 0x02 + .set GROWTH_MEDIUM_SLOW, 0x03 + .set GROWTH_FAST, 0x04 + .set GROWTH_SLOW, 0x05 + + .set EGG_GROUP_NONE, 0x00 + .set EGG_GROUP_MONSTER, 0x01 + .set EGG_GROUP_WATER_1, 0x02 + .set EGG_GROUP_BUG, 0x03 + .set EGG_GROUP_FLYING, 0x04 + .set EGG_GROUP_FIELD, 0x05 + .set EGG_GROUP_FAIRY, 0x06 + .set EGG_GROUP_GRASS, 0x07 + .set EGG_GROUP_HUMAN_LIKE, 0x08 + .set EGG_GROUP_WATER_3, 0x09 + .set EGG_GROUP_MINERAL, 0x0a + .set EGG_GROUP_AMORPHOUS, 0x0b + .set EGG_GROUP_WATER_2, 0x0c + .set EGG_GROUP_DITTO, 0x0d + .set EGG_GROUP_DRAGON, 0x0e + .set EGG_GROUP_UNDISCOVERED, 0x0f + + .set BODY_COLOR_RED, 0x00 + .set BODY_COLOR_BLUE, 0x01 + .set BODY_COLOR_YELLOW, 0x02 + .set BODY_COLOR_GREEN, 0x03 + .set BODY_COLOR_BLACK, 0x04 + .set BODY_COLOR_BROWN, 0x05 + .set BODY_COLOR_PURPLE, 0x06 + .set BODY_COLOR_GRAY, 0x07 + .set BODY_COLOR_WHITE, 0x08 + .set BODY_COLOR_PINK, 0x09 + + .set F_SUMMARY_SCREEN_FLIP_SPRITE, 0x80 + + .set EVO_FRIENDSHIP, 0x0001 @ Pokémon levels up with friendship ≥ 220 + .set EVO_FRIENDSHIP_DAY, 0x0002 @ Pokémon levels up during the day with friendship ≥ 220 + .set EVO_FRIENDSHIP_NIGHT, 0x0003 @ Pokémon levels up at night with friendship ≥ 220 + .set EVO_LEVEL, 0x0004 @ Pokémon reaches the specified level + .set EVO_TRADE, 0x0005 @ Pokémon is traded + .set EVO_TRADE_ITEM, 0x0006 @ Pokémon is traded while it's holding the specified item + .set EVO_ITEM, 0x0007 @ specified item is used on Pokémon + .set EVO_LEVEL_ATK_GT_DEF, 0x0008 @ Pokémon reaches the specified level with attack > defense + .set EVO_LEVEL_ATK_EQ_DEF, 0x0009 @ Pokémon reaches the specified level with attack = defense + .set EVO_LEVEL_ATK_LT_DEF, 0x000a @ Pokémon reaches the specified level with attack < defense + .set EVO_LEVEL_SILCOON, 0x000b @ Pokémon reaches the specified level with a Silcoon personality value + .set EVO_LEVEL_CASCOON, 0x000c @ Pokémon reaches the specified level with a Cascoon personality value + .set EVO_LEVEL_NINJASK, 0x000d @ Pokémon reaches the specified level (special value for Ninjask) + .set EVO_LEVEL_SHEDINJA, 0x000e @ Pokémon reaches the specified level (special value for Shedinja) + .set EVO_BEAUTY, 0x000f @ Pokémon levels up with beauty ≥ specified value diff --git a/payload/constants/trainer_constants.inc b/payload/constants/trainer_constants.inc new file mode 100644 index 0000000..48ed303 --- /dev/null +++ b/payload/constants/trainer_constants.inc @@ -0,0 +1,243 @@ + .set TRAINER_CLASS_AQUA_LEADER, 0 + .set TRAINER_CLASS_TEAM_AQUA_M, 1 + .set TRAINER_CLASS_TEAM_AQUA_F, 2 + .set TRAINER_CLASS_AROMA_LADY, 3 + .set TRAINER_CLASS_RUIN_MANIAC, 4 + .set TRAINER_CLASS_INTERVIEWER, 5 + .set TRAINER_CLASS_TUBER_F, 6 + .set TRAINER_CLASS_TUBER_M, 7 + .set TRAINER_CLASS_COOL_TRAINER_M, 8 + .set TRAINER_CLASS_COOL_TRAINER_F, 9 + .set TRAINER_CLASS_HEX_MANIAC, 10 + .set TRAINER_CLASS_LADY, 11 + .set TRAINER_CLASS_BEAUTY, 12 + .set TRAINER_CLASS_RICH_BOY, 13 + .set TRAINER_CLASS_POKEMANIAC, 14 + .set TRAINER_CLASS_SWIMMER_M, 15 + .set TRAINER_CLASS_BLACK_BELT, 16 + .set TRAINER_CLASS_GUITARIST, 17 + .set TRAINER_CLASS_KINDLER, 18 + .set TRAINER_CLASS_CAMPER, 19 + .set TRAINER_CLASS_BUG_MANIAC, 20 + .set TRAINER_CLASS_PSYCHIC_M, 21 + .set TRAINER_CLASS_PSYCHIC_F, 22 + .set TRAINER_CLASS_GENTLEMAN, 23 + .set TRAINER_CLASS_ELITE_FOUR_M, 24 + .set TRAINER_CLASS_ELITE_FOUR_F, 25 + .set TRAINER_CLASS_LEADER_F, 26 + .set TRAINER_CLASS_LEADER_M, 27 + .set TRAINER_CLASS_LEADER_MF, 28 + .set TRAINER_CLASS_SCHOOL_KID_M, 29 + .set TRAINER_CLASS_SCHOOL_KID_F, 30 + .set TRAINER_CLASS_SR_AND_JR, 31 + .set TRAINER_CLASS_POKEFAN_M, 32 + .set TRAINER_CLASS_POKEFAN_F, 33 + .set TRAINER_CLASS_EXPERT_M, 34 + .set TRAINER_CLASS_EXPERT_F, 35 + .set TRAINER_CLASS_YOUNGSTER, 36 + .set TRAINER_CLASS_CHAMPION, 37 + .set TRAINER_CLASS_FISHERMAN, 38 + .set TRAINER_CLASS_CYCLING_TRIATHLETE_M, 39 + .set TRAINER_CLASS_CYCLING_TRIATHLETE_F, 40 + .set TRAINER_CLASS_RUNNING_TRIATHLETE_M, 41 + .set TRAINER_CLASS_RUNNING_TRIATHLETE_F, 42 + .set TRAINER_CLASS_SWIMMING_TRIATHLETE_M, 43 + .set TRAINER_CLASS_SWIMMING_TRIATHLETE_F, 44 + .set TRAINER_CLASS_DRAGON_TAMER, 45 + .set TRAINER_CLASS_BIRD_KEEPER, 46 + .set TRAINER_CLASS_NINJA_BOY, 47 + .set TRAINER_CLASS_BATTLE_GIRL, 48 + .set TRAINER_CLASS_PARASOL_LADY, 49 + .set TRAINER_CLASS_SWIMMER_F, 50 + .set TRAINER_CLASS_PICNICKER, 51 + .set TRAINER_CLASS_TWINS, 52 + .set TRAINER_CLASS_SAILOR, 53 + .set TRAINER_CLASS_BOARDER_1, 54 + .set TRAINER_CLASS_BOARDER_2, 55 + .set TRAINER_CLASS_COLLECTOR, 56 + .set TRAINER_CLASS_WALLY, 57 + .set TRAINER_CLASS_BRENDAN_1, 58 + .set TRAINER_CLASS_BRENDAN_2, 59 + .set TRAINER_CLASS_BRENDAN_3, 60 + .set TRAINER_CLASS_MAY_1, 61 + .set TRAINER_CLASS_MAY_2, 62 + .set TRAINER_CLASS_MAY_3, 63 + .set TRAINER_CLASS_POKEMON_BREEDER_M, 64 + .set TRAINER_CLASS_POKEMON_BREEDER_F, 65 + .set TRAINER_CLASS_POKEMON_RANGER_M, 66 + .set TRAINER_CLASS_POKEMON_RANGER_F, 67 + .set TRAINER_CLASS_MAGMA_LEADER, 68 + .set TRAINER_CLASS_TEAM_MAGMA_M, 69 + .set TRAINER_CLASS_TEAM_MAGMA_F, 70 + .set TRAINER_CLASS_LASS, 71 + .set TRAINER_CLASS_BUG_CATCHER, 72 + .set TRAINER_CLASS_HIKER, 73 + .set TRAINER_CLASS_YOUNG_COUPLE, 74 + .set TRAINER_CLASS_OLD_COUPLE, 75 + .set TRAINER_CLASS_SIS_AND_BRO, 76 + + .set TRAINER_PIC_BRENDAN, 0 + .set TRAINER_PIC_MAY, 1 + .set TRAINER_PIC_LASS, 2 + .set TRAINER_PIC_YOUNGSTER, 3 + .set TRAINER_PIC_HIKER, 4 + .set TRAINER_PIC_BEAUTY, 5 + .set TRAINER_PIC_FISHERMAN, 6 + .set TRAINER_PIC_LADY, 7 + .set TRAINER_PIC_CYCLING_TRIATHLETE_M, 8 + .set TRAINER_PIC_AQUA_GRUNT_M, 9 + .set TRAINER_PIC_TWINS, 10 + .set TRAINER_PIC_SWIMMER_F, 11 + .set TRAINER_PIC_BUG_CATCHER, 12 + .set TRAINER_PIC_SCHOOL_KID_M, 13 + .set TRAINER_PIC_RICH_BOY, 14 + .set TRAINER_PIC_SR_AND_JR, 15 + .set TRAINER_PIC_BLACK_BELT, 16 + .set TRAINER_PIC_WALLY, 17 + .set TRAINER_PIC_AQUA_GRUNT_F, 18 + .set TRAINER_PIC_TUBER_F, 19 + .set TRAINER_PIC_HEX_MANIAC, 20 + .set TRAINER_PIC_POKEMON_BREEDER_F, 21 + .set TRAINER_PIC_MAGMA_GRUNT_M, 22 + .set TRAINER_PIC_MAGMA_GRUNT_F, 23 + .set TRAINER_PIC_INTERVIEWER, 24 + .set TRAINER_PIC_TUBER_M, 25 + .set TRAINER_PIC_YOUNG_COUPLE, 26 + .set TRAINER_PIC_GUITARIST, 27 + .set TRAINER_PIC_GENTLEMAN, 28 + .set TRAINER_PIC_STEVEN, 29 + .set TRAINER_PIC_MAXIE, 30 + .set TRAINER_PIC_RUNNING_TRIATHLETE_F, 31 + .set TRAINER_PIC_RUNNING_TRIATHLETE_M, 32 + .set TRAINER_PIC_BATTLE_GIRL, 33 + .set TRAINER_PIC_CYCLING_TRIATHLETE_F, 34 + .set TRAINER_PIC_SWIMMER_M, 35 + .set TRAINER_PIC_POKEFAN_F, 36 + .set TRAINER_PIC_EXPERT_M, 37 + .set TRAINER_PIC_EXPERT_F, 38 + .set TRAINER_PIC_SWIMMING_TRIATHLETE_M, 39 + .set TRAINER_PIC_SWIMMING_TRIATHLETE_F, 40 + .set TRAINER_PIC_DRAGON_TAMER, 41 + .set TRAINER_PIC_BIRD_KEEPER, 42 + .set TRAINER_PIC_NINJA_BOY, 43 + .set TRAINER_PIC_PARASOL_LADY, 44 + .set TRAINER_PIC_BUG_MANIAC, 45 + .set TRAINER_PIC_SAILOR, 46 + .set TRAINER_PIC_COLLECTOR, 47 + .set TRAINER_PIC_POKEMON_BREEDER_M, 48 + .set TRAINER_PIC_POKEMON_RANGER_M, 49 + .set TRAINER_PIC_POKEMON_RANGER_F, 50 + .set TRAINER_PIC_MAGMA_ADMIN_M, 51 + .set TRAINER_PIC_MAGMA_ADMIN_F, 52 + .set TRAINER_PIC_AROMA_LADY, 53 + .set TRAINER_PIC_RUIN_MANIAC, 54 + .set TRAINER_PIC_COOL_TRAINER_M, 55 + .set TRAINER_PIC_COOL_TRAINER_F, 56 + .set TRAINER_PIC_POKEMANIAC, 57 + .set TRAINER_PIC_KINDLER, 58 + .set TRAINER_PIC_CAMPER, 59 + .set TRAINER_PIC_PICNICKER, 60 + .set TRAINER_PIC_PSYCHIC_M, 61 + .set TRAINER_PIC_PSYCHIC_F, 62 + .set TRAINER_PIC_SCHOOL_KID_F, 63 + .set TRAINER_PIC_POKEFAN_M, 64 + .set TRAINER_PIC_SIS_AND_BRO, 65 + .set TRAINER_PIC_OLD_COUPLE, 66 + .set TRAINER_PIC_AQUA_ADMIN_M, 67 + .set TRAINER_PIC_AQUA_ADMIN_F, 68 + .set TRAINER_PIC_UNUSED_AQUA, 69 + .set TRAINER_PIC_ARCHIE, 70 + .set TRAINER_PIC_ROXANNE, 71 + .set TRAINER_PIC_BRAWLY, 72 + .set TRAINER_PIC_WATTSON, 73 + .set TRAINER_PIC_FLANNERY, 74 + .set TRAINER_PIC_NORMAN, 75 + .set TRAINER_PIC_WINONA, 76 + .set TRAINER_PIC_TATE_AND_LIZA, 77 + .set TRAINER_PIC_WALLACE, 78 + .set TRAINER_PIC_SIDNEY, 79 + .set TRAINER_PIC_PHOEBE, 80 + .set TRAINER_PIC_GLACIA, 81 + .set TRAINER_PIC_DRAKE, 82 + + .set TRAINER_CLASS_NAME_POKEMON_TRAINER_1, 0 + .set TRAINER_CLASS_NAME_POKEMON_TRAINER_2, 1 + .set TRAINER_CLASS_NAME_AQUA_LEADER, 2 + .set TRAINER_CLASS_NAME_TEAM_AQUA, 3 + .set TRAINER_CLASS_NAME_AQUA_ADMIN, 4 + .set TRAINER_CLASS_NAME_AROMA_LADY, 5 + .set TRAINER_CLASS_NAME_RUIN_MANIAC, 6 + .set TRAINER_CLASS_NAME_INTERVIEWER, 7 + .set TRAINER_CLASS_NAME_TUBER_F, 8 + .set TRAINER_CLASS_NAME_TUBER_M, 9 + .set TRAINER_CLASS_NAME_COOL_TRAINER, 10 + .set TRAINER_CLASS_NAME_HEX_MANIAC, 11 + .set TRAINER_CLASS_NAME_LADY, 12 + .set TRAINER_CLASS_NAME_BEAUTY, 13 + .set TRAINER_CLASS_NAME_RICH_BOY, 14 + .set TRAINER_CLASS_NAME_POKEMANIAC, 15 + .set TRAINER_CLASS_NAME_SWIMMER_M, 16 + .set TRAINER_CLASS_NAME_BLACK_BELT, 17 + .set TRAINER_CLASS_NAME_GUITARIST, 18 + .set TRAINER_CLASS_NAME_KINDLER, 19 + .set TRAINER_CLASS_NAME_CAMPER, 20 + .set TRAINER_CLASS_NAME_BUG_MANIAC, 21 + .set TRAINER_CLASS_NAME_PSYCHIC, 22 + .set TRAINER_CLASS_NAME_GENTLEMAN, 23 + .set TRAINER_CLASS_NAME_ELITE_FOUR, 24 + .set TRAINER_CLASS_NAME_LEADER, 25 + .set TRAINER_CLASS_NAME_SCHOOL_KID, 26 + .set TRAINER_CLASS_NAME_SR_AND_JR, 27 + .set TRAINER_CLASS_NAME_WINSTRATE, 28 + .set TRAINER_CLASS_NAME_POKEFAN, 29 + .set TRAINER_CLASS_NAME_EXPERT, 30 + .set TRAINER_CLASS_NAME_YOUNGSTER, 31 + .set TRAINER_CLASS_NAME_CHAMPION, 32 + .set TRAINER_CLASS_NAME_FISHERMAN, 33 + .set TRAINER_CLASS_NAME_TRIATHLETE, 34 + .set TRAINER_CLASS_NAME_DRAGON_TAMER, 35 + .set TRAINER_CLASS_NAME_BIRD_KEEPER, 36 + .set TRAINER_CLASS_NAME_NINJA_BOY, 37 + .set TRAINER_CLASS_NAME_BATTLE_GIRL, 38 + .set TRAINER_CLASS_NAME_PARASOL_LADY, 39 + .set TRAINER_CLASS_NAME_SWIMMER_F, 40 + .set TRAINER_CLASS_NAME_PICNICKER, 41 + .set TRAINER_CLASS_NAME_TWINS, 42 + .set TRAINER_CLASS_NAME_SAILOR, 43 + .set TRAINER_CLASS_NAME_BOARDER, 44 + .set TRAINER_CLASS_NAME_COLLECTOR, 45 + .set TRAINER_CLASS_NAME_POKEMON_TRAINER_3, 46 + .set TRAINER_CLASS_NAME_POKEMON_BREEDER, 47 + .set TRAINER_CLASS_NAME_POKEMON_RANGER, 48 + .set TRAINER_CLASS_NAME_MAGMA_LEADER, 49 + .set TRAINER_CLASS_NAME_TEAM_MAGMA, 50 + .set TRAINER_CLASS_NAME_MAGMA_ADMIN, 51 + .set TRAINER_CLASS_NAME_LASS, 52 + .set TRAINER_CLASS_NAME_BUG_CATCHER, 53 + .set TRAINER_CLASS_NAME_HIKER, 54 + .set TRAINER_CLASS_NAME_YOUNG_COUPLE, 55 + .set TRAINER_CLASS_NAME_OLD_COUPLE, 56 + .set TRAINER_CLASS_NAME_SIS_AND_BRO, 57 + + .set TRAINER_ENCOUNTER_MUSIC_MALE, 0 @ standard male encounter music + .set TRAINER_ENCOUNTER_MUSIC_FEMALE, 1 @ standard female encounter music + .set TRAINER_ENCOUNTER_MUSIC_GIRL, 2 @ used for male Tubers and Young Couples too + .set TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, 3 + .set TRAINER_ENCOUNTER_MUSIC_INTENSE, 4 + .set TRAINER_ENCOUNTER_MUSIC_COOL, 5 + .set TRAINER_ENCOUNTER_MUSIC_AQUA, 6 + .set TRAINER_ENCOUNTER_MUSIC_MAGMA, 7 + .set TRAINER_ENCOUNTER_MUSIC_SWIMMER, 8 + .set TRAINER_ENCOUNTER_MUSIC_TWINS, 9 @ used for other trainer classes too + .set TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, 10 + .set TRAINER_ENCOUNTER_MUSIC_HIKER, 11 @ used for other trainer classes too + .set TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, 12 + .set TRAINER_ENCOUNTER_MUSIC_RICH, 13 @ Rich Boys and Gentlemen + + .set F_TRAINER_FEMALE, 1 << 7 + +@ All trainer parties specify the IV, level, and species for each Pokémon in the +@ party. Some trainer parties also specify held items and custom moves for each +@ Pokémon. + .set F_TRAINER_PARTY_CUSTOM_MOVESET, 1 << 0 + .set F_TRAINER_PARTY_HELD_ITEM, 1 << 1 diff --git a/payload/constants/type_constants.inc b/payload/constants/type_constants.inc new file mode 100644 index 0000000..c6611bd --- /dev/null +++ b/payload/constants/type_constants.inc @@ -0,0 +1,18 @@ + .set TYPE_NORMAL, 0x00 + .set TYPE_FIGHTING, 0x01 + .set TYPE_FLYING, 0x02 + .set TYPE_POISON, 0x03 + .set TYPE_GROUND, 0x04 + .set TYPE_ROCK, 0x05 + .set TYPE_BUG, 0x06 + .set TYPE_GHOST, 0x07 + .set TYPE_STEEL, 0x08 + .set TYPE_MYSTERY, 0x09 + .set TYPE_FIRE, 0x0a + .set TYPE_WATER, 0x0b + .set TYPE_GRASS, 0x0c + .set TYPE_ELECTRIC, 0x0d + .set TYPE_PSYCHIC, 0x0e + .set TYPE_ICE, 0x0f + .set TYPE_DRAGON, 0x10 + .set TYPE_DARK, 0x11 diff --git a/payload/constants/variables.inc b/payload/constants/variables.inc new file mode 100644 index 0000000..ab488a9 --- /dev/null +++ b/payload/constants/variables.inc @@ -0,0 +1,6 @@ + .equiv FACING, 0x800C + .equiv RESULT, 0x800D + .equiv ITEM_ID, 0x800E + .equiv LAST_TALKED, 0x800F + .equiv CONTEST_RANK, 0x8010 + .equiv CONTEST_CATEGORY, 0x8011 diff --git a/payload/constants/version.inc b/payload/constants/version.inc new file mode 100644 index 0000000..c93e439 --- /dev/null +++ b/payload/constants/version.inc @@ -0,0 +1,91 @@ + .ifdef SAPPHIRE + .equiv GAME_VERSION, 1 + .else + .equiv GAME_VERSION, 2 + .endif + + .ifdef SAPPHIRE + .set BGM_EVIL_TEAM, BGM_AQA_0 + .set BGM_GOOD_TEAM, BGM_MGM0 + .else + .set BGM_EVIL_TEAM, BGM_MGM0 + .set BGM_GOOD_TEAM, BGM_AQA_0 + .endc + + .ifdef SAPPHIRE + .set ITEM_RED_OR_BLUE_ORB, ITEM_BLUE_ORB + .else + .set ITEM_RED_OR_BLUE_ORB, ITEM_RED_ORB + .endif + + .ifdef SAPPHIRE + .set SPECIES_GROUDON_OR_KYOGRE, SPECIES_KYOGRE + .else + .set SPECIES_GROUDON_OR_KYOGRE, SPECIES_GROUDON + .endif + + .ifdef SAPPHIRE + .set SPECIES_LATIAS_OR_LATIOS, SPECIES_LATIOS + .else + .set SPECIES_LATIAS_OR_LATIOS, SPECIES_LATIAS + .endif + + .ifdef SAPPHIRE + .set OPPONENT_PETALBURG_WOODS_GRUNT, OPPONENT_GRUNT_9 + .set OPPONENT_RUSTURF_TUNNEL_GRUNT, OPPONENT_GRUNT_15 + .set OPPONENT_MUSEUM_2F_GRUNT_1, OPPONENT_GRUNT_19 + .set OPPONENT_MUSEUM_2F_GRUNT_2, OPPONENT_GRUNT_20 + .set OPPONENT_514, OPPONENT_HECTOR_1 + .set OPPONENT_MT_CHIMNEY_GRUNT_1, OPPONENT_MATT_2 + .set OPPONENT_MT_CHIMNEY_GRUNT_2, OPPONENT_GRUNT_13 + .set OPPONENT_HIDEOUT_1F_GRUNT, OPPONENT_GRUNT_1 + .set OPPONENT_HIDEOUT_B1F_GRUNT_1, OPPONENT_GRUNT_2 + .set OPPONENT_HIDEOUT_B1F_GRUNT_2, OPPONENT_GRUNT_3 + .set OPPONENT_HIDEOUT_B1F_GRUNT_3, OPPONENT_GRUNT_26 + .set OPPONENT_HIDEOUT_B2F_GRUNT_1, OPPONENT_MATT_1 + .set OPPONENT_HIDEOUT_B2F_GRUNT_2, OPPONENT_GRUNT_4 + .set OPPONENT_HIDEOUT_B2F_GRUNT_3, OPPONENT_GRUNT_27 + .set OPPONENT_SEAFLOOR_CAVERN_GRUNT_1, OPPONENT_GRUNT_5 + .set OPPONENT_SEAFLOOR_CAVERN_GRUNT_2, OPPONENT_GRUNT_6 + .set OPPONENT_SEAFLOOR_CAVERN_GRUNT_3, OPPONENT_SHELLY_2 + .set OPPONENT_SEAFLOOR_CAVERN_GRUNT_4, OPPONENT_GRUNT_7 + .set OPPONENT_SEAFLOOR_CAVERN_GRUNT_5, OPPONENT_ARCHIE_2 + .set OPPONENT_MT_CHIMNEY_GRUNT_3, OPPONENT_ARCHIE_3 + .set OPPONENT_MT_PYRE_SUMMIT_GRUNT_1, OPPONENT_GRUNT_22 + .set OPPONENT_MT_PYRE_SUMMIT_GRUNT_2, OPPONENT_GRUNT_23 + .set OPPONENT_MT_PYRE_SUMMIT_GRUNT_3, OPPONENT_GRUNT_24 + .set OPPONENT_WEATHER_INSTITUTE_GRUNT_1, OPPONENT_GRUNT_16 + .set OPPONENT_WEATHER_INSTITUTE_GRUNT_2, OPPONENT_GRUNT_25 + .set OPPONENT_WEATHER_INSTITUTE_GRUNT_3, OPPONENT_GRUNT_17 + .set OPPONENT_WEATHER_INSTITUTE_GRUNT_4, OPPONENT_GRUNT_18 + .set OPPONENT_WEATHER_INSTITUTE_GRUNT_5, OPPONENT_SHELLY_1 + .else + .set OPPONENT_PETALBURG_WOODS_GRUNT, OPPONENT_GRUNT_36 + .set OPPONENT_RUSTURF_TUNNEL_GRUNT, OPPONENT_GRUNT_42 + .set OPPONENT_MUSEUM_2F_GRUNT_1, OPPONENT_GRUNT_46 + .set OPPONENT_MUSEUM_2F_GRUNT_2, OPPONENT_GRUNT_47 + .set OPPONENT_514, OPPONENT_HECTOR_2 + .set OPPONENT_MT_CHIMNEY_GRUNT_1, OPPONENT_TABITHA_2 + .set OPPONENT_MT_CHIMNEY_GRUNT_2, OPPONENT_GRUNT_40 + .set OPPONENT_HIDEOUT_1F_GRUNT, OPPONENT_GRUNT_28 + .set OPPONENT_HIDEOUT_B1F_GRUNT_1, OPPONENT_GRUNT_29 + .set OPPONENT_HIDEOUT_B1F_GRUNT_2, OPPONENT_GRUNT_30 + .set OPPONENT_HIDEOUT_B1F_GRUNT_3, OPPONENT_GRUNT_53 + .set OPPONENT_HIDEOUT_B2F_GRUNT_1, OPPONENT_TABITHA_1 + .set OPPONENT_HIDEOUT_B2F_GRUNT_2, OPPONENT_GRUNT_31 + .set OPPONENT_HIDEOUT_B2F_GRUNT_3, OPPONENT_GRUNT_54 + .set OPPONENT_SEAFLOOR_CAVERN_GRUNT_1, OPPONENT_GRUNT_32 + .set OPPONENT_SEAFLOOR_CAVERN_GRUNT_2, OPPONENT_GRUNT_33 + .set OPPONENT_SEAFLOOR_CAVERN_GRUNT_3, OPPONENT_COURTNEY_2 + .set OPPONENT_SEAFLOOR_CAVERN_GRUNT_4, OPPONENT_GRUNT_34 + .set OPPONENT_SEAFLOOR_CAVERN_GRUNT_5, OPPONENT_MAXIE_2 + .set OPPONENT_MT_CHIMNEY_GRUNT_3, OPPONENT_MAXIE_3 + .set OPPONENT_MT_PYRE_SUMMIT_GRUNT_1, OPPONENT_GRUNT_49 + .set OPPONENT_MT_PYRE_SUMMIT_GRUNT_2, OPPONENT_GRUNT_50 + .set OPPONENT_MT_PYRE_SUMMIT_GRUNT_3, OPPONENT_GRUNT_51 + .set OPPONENT_WEATHER_INSTITUTE_GRUNT_1, OPPONENT_GRUNT_43 + .set OPPONENT_WEATHER_INSTITUTE_GRUNT_2, OPPONENT_GRUNT_52 + .set OPPONENT_WEATHER_INSTITUTE_GRUNT_3, OPPONENT_GRUNT_44 + .set OPPONENT_WEATHER_INSTITUTE_GRUNT_4, OPPONENT_GRUNT_45 + .set OPPONENT_WEATHER_INSTITUTE_GRUNT_5, OPPONENT_COURTNEY_1 + .endif diff --git a/data/all.s b/payload/data/all.s similarity index 100% rename from data/all.s rename to payload/data/all.s diff --git a/data/m4a.s b/payload/data/m4a.s similarity index 100% rename from data/m4a.s rename to payload/data/m4a.s diff --git a/data/main.s b/payload/data/main.s similarity index 100% rename from data/main.s rename to payload/data/main.s diff --git a/payload/include/constants/game_stat.h b/payload/include/constants/game_stat.h new file mode 100644 index 0000000..47d703d --- /dev/null +++ b/payload/include/constants/game_stat.h @@ -0,0 +1,56 @@ +#ifndef GUARD_CONSTANTS_GAME_STAT_H +#define GUARD_CONSTANTS_GAME_STAT_H + +#define GAME_STAT_SAVED_GAME 0 +#define GAME_STAT_FIRST_HOF_PLAY_TIME 1 +#define GAME_STAT_STARTED_TRENDS 2 +#define GAME_STAT_PLANTED_BERRIES 3 +#define GAME_STAT_TRADED_BIKES 4 +#define GAME_STAT_STEPS 5 +#define GAME_STAT_GOT_INTERVIEWED 6 +#define GAME_STAT_TOTAL_BATTLES 7 +#define GAME_STAT_WILD_BATTLES 8 +#define GAME_STAT_TRAINER_BATTLES 9 +#define GAME_STAT_ENTERED_HOF 10 +#define GAME_STAT_POKEMON_CAPTURES 11 +#define GAME_STAT_FISHING_CAPTURES 12 +#define GAME_STAT_HATCHED_EGGS 13 +#define GAME_STAT_EVOLVED_POKEMON 14 +#define GAME_STAT_USED_POKECENTER 15 +#define GAME_STAT_RESTED_AT_HOME 16 +#define GAME_STAT_ENTERED_SAFARI_ZONE 17 +#define GAME_STAT_USED_CUT 18 +#define GAME_STAT_USED_ROCK_SMASH 19 +#define GAME_STAT_MOVED_SECRET_BASE 20 +#define GAME_STAT_POKEMON_TRADES 21 +#define GAME_STAT_UNKNOWN_22 22 +#define GAME_STAT_LINK_BATTLE_WINS 23 +#define GAME_STAT_LINK_BATTLE_LOSSES 24 +#define GAME_STAT_LINK_BATTLE_DRAWS 25 +#define GAME_STAT_USED_SPLASH 26 +#define GAME_STAT_USED_STRUGGLE 27 +#define GAME_STAT_SLOT_JACKPOTS 28 +#define GAME_STAT_CONSECUTIVE_ROULETTE_WINS 29 +#define GAME_STAT_ENTERED_BATTLE_TOWER 30 +#define GAME_STAT_UNKNOWN_31 31 +#define GAME_STAT_BATTLE_TOWER_BEST_STREAK 32 +#define GAME_STAT_POKEBLOCKS 33 +#define GAME_STAT_POKEBLOCKS_WITH_FRIENDS 34 +#define GAME_STAT_WON_LINK_CONTEST 35 +#define GAME_STAT_ENTERED_CONTEST 36 +#define GAME_STAT_WON_CONTEST 37 +#define GAME_STAT_SHOPPED 38 +#define GAME_STAT_USED_ITEMFINDER 39 +#define GAME_STAT_GOT_RAINED_ON 40 +#define GAME_STAT_CHECKED_POKEDEX 41 +#define GAME_STAT_RECEIVED_RIBBONS 42 +#define GAME_STAT_JUMPED_DOWN_LEDGES 43 +#define GAME_STAT_WATCHED_TV 44 +#define GAME_STAT_CHECKED_CLOCK 45 +#define GAME_STAT_WON_POKEMON_LOTTERY 46 +#define GAME_STAT_USED_DAYCARE 47 +#define GAME_STAT_RODE_CABLE_CAR 48 +#define GAME_STAT_ENTERED_HOT_SPRINGS 49 +#define NUM_GAME_STATS 50 + +#endif // GUARD_CONSTANTS_GAME_STAT_H diff --git a/payload/include/constants/vars.h b/payload/include/constants/vars.h new file mode 100644 index 0000000..4b40c1d --- /dev/null +++ b/payload/include/constants/vars.h @@ -0,0 +1,196 @@ +#ifndef GUARD_CONSTANTS_VARS_H +#define GUARD_CONSTANTS_VARS_H + +#define VAR_0x3F20 0x3F20 + +#define VARS_START 0x4000 + +// temporary vars +// The first 0x10 vars are are temporary--they are cleared every time a map is loaded. +#define VAR_TEMP_0 0x4000 +#define VAR_TEMP_1 0x4001 +#define VAR_TEMP_2 0x4002 +#define VAR_TEMP_3 0x4003 +#define VAR_TEMP_4 0x4004 +#define VAR_TEMP_5 0x4005 +#define VAR_TEMP_6 0x4006 +#define VAR_TEMP_7 0x4007 +#define VAR_TEMP_8 0x4008 +#define VAR_TEMP_9 0x4009 +#define VAR_TEMP_A 0x400A +#define VAR_TEMP_B 0x400B +#define VAR_TEMP_C 0x400C +#define VAR_TEMP_D 0x400D +#define VAR_TEMP_E 0x400E +#define VAR_TEMP_F 0x400F + +// object gfx id vars +// These 0x10 vars are used to dynamically control a event object's sprite. +// For example, the rival's sprite id is dynamically set based on the player's gender. +// See VarGetEventObjectGraphicsId(). +#define VAR_OBJ_GFX_ID_0 0x4010 +#define VAR_OBJ_GFX_ID_1 0x4011 +#define VAR_OBJ_GFX_ID_2 0x4012 +#define VAR_OBJ_GFX_ID_3 0x4013 +#define VAR_OBJ_GFX_ID_4 0x4014 +#define VAR_OBJ_GFX_ID_5 0x4015 +#define VAR_OBJ_GFX_ID_6 0x4016 +#define VAR_OBJ_GFX_ID_7 0x4017 +#define VAR_OBJ_GFX_ID_8 0x4018 +#define VAR_OBJ_GFX_ID_9 0x4019 +#define VAR_OBJ_GFX_ID_A 0x401A +#define VAR_OBJ_GFX_ID_B 0x401B +#define VAR_OBJ_GFX_ID_C 0x401C +#define VAR_OBJ_GFX_ID_D 0x401D +#define VAR_OBJ_GFX_ID_E 0x401E +#define VAR_OBJ_GFX_ID_F 0x401F + +// general purpose vars +#define VAR_RECYCLE_GOODS 0x4020 +#define VAR_REPEL_STEP_COUNT 0x4021 +#define VAR_ICE_STEP_COUNT 0x4022 +#define VAR_STARTER_MON 0x4023 // 0=Treecko, 1=Torchic, 2=Mudkip +#define VAR_MIRAGE_RND_H 0x4024 +#define VAR_MIRAGE_RND_L 0x4025 +#define VAR_SECRET_BASE_MAP 0x4026 +#define VAR_CYCLING_ROAD_RECORD_COLLISIONS 0x4027 +#define VAR_CYCLING_ROAD_RECORD_TIME_L 0x4028 +#define VAR_CYCLING_ROAD_RECORD_TIME_H 0x4029 +#define VAR_HAPPINESS_STEP_COUNTER 0x402A +#define VAR_POISON_STEP_COUNTER 0x402B +#define VAR_RESET_RTC_ENABLE 0x402C +#define VAR_ENIGMA_BERRY_AVAILABLE 0x402D + +#define VAR_DAYS 0x4040 +#define VAR_FANCLUB_UNKNOWN_1 0x4041 // TODO: document these two fanclub vars +#define VAR_FANCLUB_UNKNOWN_2 0x4042 +#define VAR_DEPT_STORE_FLOOR 0x4043 +#define VAR_TRICK_HOUSE_ROOMS_COMPLETED 0x4044 +#define VAR_LOTTERY_PRIZE 0x4045 +#define VAR_NATIONAL_DEX 0x4046 +#define VAR_SHROOMISH_SIZE_RECORD 0x4047 +#define VAR_ASH_GATHER_COUNT 0x4048 +#define VAR_BIRCH_STATE 0x4049 +#define VAR_CRUISE_STEP_COUNT 0x404A +#define VAR_LOTTERY_RND_L 0x404B +#define VAR_LOTTERY_RND_H 0x404C + +#define VAR_BARBOACH_SIZE_RECORD 0x404F +#define VAR_LITTLEROOT_STATE 0x4050 +#define VAR_ROUTE102_ACCESSIBLE 0x4051 + +#define VAR_LAVARIDGE_RIVAL_STATE 0x4053 +#define VAR_CURRENT_SECRET_BASE 0x4054 + +#define VAR_PETALBURG_STATE 0x4057 +#define VAR_SLATEPORT_STATE 0x4058 + +#define VAR_RUSTBORO_STATE 0x405A + +#define VAR_SOOTOPOLIS_STATE 0x405E + +#define VAR_ROUTE101_STATE 0x4060 + +#define VAR_ROUTE103_STATE 0x4062 + +#define VAR_ROUTE110_STATE 0x4069 + +#define VAR_ROUTE116_STATE 0x406F + +#define VAR_ROUTE118_STATE 0x4071 +#define VAR_ROUTE119_STATE 0x4072 + +#define VAR_ROUTE121_STATE 0x4074 +#define VAR_ROUTE128_STATE 0x407B + +#define VAR_LITTLEROOT_HOUSES_STATE 0x4082 // TODO: needs more investigation + +#define VAR_BIRCH_LAB_STATE 0x4084 +#define VAR_PETALBURG_GYM_STATE 0x4085 +#define VAR_LINK_CONTEST_ROOM_STATE 0x4086 +#define VAR_CABLE_CLUB_STATE 0x4087 +#define VAR_CONTEST_LOCATION 0x4088 +#define VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F 0x4089 // TODO: related to decorations +#define VAR_CONTEST_PRIZE_PICKUP 0x408A + +#define VAR_LITTLEROOT_HOUSES_STATE_2 0x408C // TODO: needs more investigation +#define VAR_LITTLEROOT_RIVAL_STATE 0x408D +#define VAR_BOARD_BRINEY_BOAT_ROUTE104_STATE 0x408E +#define VAR_DEVON_CORP_3F_STATE 0x408F +#define VAR_BRINEY_HOUSE_STATE 0x4090 + +#define VAR_LITTLEROOT_INTRO_STATE 0x4092 +#define VAR_MAUVILLE_GYM_STATE 0x4093 +#define VAR_LILYCOVE_MUSEUM_2F_STATE 0x4094 +#define VAR_LILYCOVE_FAN_CLUB_STATE 0x4095 +#define VAR_BRINEY_LOCATION 0x4096 +#define VAR_0x4097 0x4097 // TODO: related to creating new secret base +#define VAR_PETALBURG_WOODS_STATE 0x4098 +#define VAR_LILYCOVE_CONTEST_LOBBY_STATE 0x4099 +#define VAR_RUSTURF_TUNNEL_STATE 0x409a +#define VAR_CAVE_OF_ORIGIN_B4F_STATE 0x409B +#define VAR_ELITE_4_STATE 0x409C + +#define VAR_SLATEPORT_HARBOR_STATE 0x40A0 + +#define VAR_SEAFLOOR_CAVERN_STATE 0x40A2 +#define VAR_CABLE_CAR_STATION_STATE 0x40A3 +#define VAR_SAFARI_ZONE_STATE 0x40A4 +#define VAR_TRICK_HOUSE_ENTRANCE_STATE 0x40A5 +#define VAR_TRICK_HOUSE_ENTRANCE_STATE_2 0x40A6 +#define VAR_TRICK_HOUSE_ENTRANCE_STATE_3 0x40A7 + +#define VAR_CYCLING_CHALLENGE_STATE 0x40A9 +#define VAR_SLATEPORT_MUSEUM_1F_STATE 0x40AA +#define VAR_TRICK_HOUSE_PUZZLE_1_STATE 0x40AB +#define VAR_TRICK_HOUSE_PUZZLE_2_STATE 0x40AC +#define VAR_TRICK_HOUSE_PUZZLE_3_STATE 0x40AD +#define VAR_TRICK_HOUSE_PUZZLE_4_STATE 0x40AE +#define VAR_TRICK_HOUSE_PUZZLE_5_STATE 0x40AF +#define VAR_TRICK_HOUSE_PUZZLE_6_STATE 0x40B0 +#define VAR_TRICK_HOUSE_PUZZLE_7_STATE 0x40B1 +#define VAR_TRICK_HOUSE_PUZZLE_8_STATE 0x40B2 +#define VAR_WEATHER_INSTITUTE_STATE 0x40B3 +#define VAR_PORTHOLE_STATE 0x40B4 +#define VAR_TRICK_HOUSE_STATE 0x40B5 // TODO: needs some further investigation +#define VAR_TRICK_HOUSE_PUZZLE_7_STATE_2 0x40B6 +#define VAR_SLATEPORT_FAN_CLUB_STATE 0x40B7 + +#define VAR_MT_PYRE_STATE 0x40B9 +#define VAR_NEW_MAUVILLE_STATE 0x40BA + +#define VAR_BRAVO_TRAINER_BATTLE_TOWER_ON 0x40BC +#define VAR_JAGGED_PASS_VOLCANIC_ASH_WEATHER 0x40BD +#define VAR_GLASS_WORKSHOP_STATE 0x40BE +#define VAR_METEOR_FALLS_STATE 0x40BF +#define VAR_GAME_CORNER_STATE 0x40C0 +#define VAR_TRICK_HOUSE_PRIZE_PICKUP 0x40C1 +#define VAR_PACIFIDLOG_TM_RECEIVED_DAY 0x40C2 +#define VAR_VICTORY_ROAD_1F_STATE 0x40C3 +#define VAR_FOSSIL_RESURRECTION_STATE 0x40C4 +#define VAR_WHICH_FOSSIL_REVIVED 0x40C5 +#define VAR_STEVENS_HOUSE_STATE 0x40C6 +#define VAR_OLDALE_STATE 0x40C7 + +// special vars +// They are commonly used as parameters to commands, or return values from commands. +#define VAR_SPECIAL_0 0x8000 +#define VAR_SPECIAL_1 0x8001 +#define VAR_SPECIAL_2 0x8002 +#define VAR_SPECIAL_3 0x8003 +#define VAR_SPECIAL_4 0x8004 +#define VAR_SPECIAL_5 0x8005 +#define VAR_SPECIAL_6 0x8006 +#define VAR_SPECIAL_7 0x8007 +#define VAR_SPECIAL_8 0x8008 +#define VAR_SPECIAL_9 0x8009 +#define VAR_SPECIAL_A 0x800A +#define VAR_SPECIAL_B 0x800B +#define FACING 0x800C +#define RESULT 0x800D +#define ITEM_ID 0x800E +#define LAST_TALKED 0x800F +#define CONTEST_RANK 0x8010 +#define CONTEST_CATEGORY 0x8011 + +#endif // GUARD_CONSTANTS_VARS_H diff --git a/payload/include/gba/defines.h b/payload/include/gba/defines.h new file mode 100644 index 0000000..3920a24 --- /dev/null +++ b/payload/include/gba/defines.h @@ -0,0 +1,65 @@ +#ifndef GUARD_GBA_DEFINES +#define GUARD_GBA_DEFINES + +#include + +#define TRUE 1 +#define FALSE 0 + +#define BSS_DATA __attribute__((section(".bss"))) +#define IWRAM_DATA __attribute__((section("iwram_data"))) +#define EWRAM_DATA __attribute__((section("ewram_data"))) +#define UNUSED __attribute__((unused)) +#define NAKED __attribute__((naked)) + +#define ALIGNED(n) __attribute__((aligned(n))) + +#define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0) +#define INTR_CHECK (*(u16 *)0x3007FF8) +#define INTR_VECTOR (*(void **)0x3007FFC) + +#define PLTT 0x5000000 +#define PLTT_SIZE 0x400 + +#define BG_PLTT PLTT +#define BG_PLTT_SIZE 0x200 + +#define OBJ_PLTT (PLTT + 0x200) +#define OBJ_PLTT_SIZE 0x200 + +#define VRAM 0x6000000 +#define VRAM_SIZE 0x18000 + +#define BG_VRAM VRAM +#define BG_VRAM_SIZE 0x10000 +#define BG_CHAR_ADDR(n) (void *)(BG_VRAM + (0x4000 * (n))) +#define BG_SCREEN_ADDR(n) (void *)(BG_VRAM + (0x800 * (n))) +#define BG_TILE_ADDR(n) (void *)(BG_VRAM + (0x80 * (n))) + +// text-mode BG +#define OBJ_VRAM0 (void *)(VRAM + 0x10000) +#define OBJ_VRAM0_SIZE 0x8000 + +// bitmap-mode BG +#define OBJ_VRAM1 (void *)(VRAM + 0x14000) +#define OBJ_VRAM1_SIZE 0x4000 + +#define OAM 0x7000000 +#define OAM_SIZE 0x400 + +#define DISPLAY_WIDTH 240 +#define DISPLAY_HEIGHT 160 + +#define TILE_SIZE_4BPP 32 +#define TILE_SIZE_8BPP 64 + +#define TOTAL_OBJ_TILE_COUNT 1024 + +#define RGB(r, g, b) ((r) | ((g) << 5) | ((b) << 10)) + +#define RGB_BLACK RGB(0, 0, 0) +#define RGB_WHITE RGB(31, 31, 31) + +#define WIN_RANGE(a, b) (((a) << 8) | (b)) + +#endif // GUARD_GBA_DEFINES diff --git a/payload/include/gba/flash_internal.h b/payload/include/gba/flash_internal.h new file mode 100644 index 0000000..39e14ef --- /dev/null +++ b/payload/include/gba/flash_internal.h @@ -0,0 +1,83 @@ +#ifndef GUARD_GBA_FLASH_INTERNAL_H +#define GUARD_GBA_FLASH_INTERNAL_H + +#define FLASH_BASE ((u8 *)0xE000000) + +#define FLASH_WRITE(addr, data) ((*(vu8 *)(FLASH_BASE + (addr))) = (data)) + +#define FLASH_ROM_SIZE_1M 131072 // 1 megabit ROM + +#define SECTORS_PER_BANK 16 + +struct FlashSector +{ + u32 size; + u8 shift; + u16 count; + u16 top; +}; + +struct FlashType { + u32 romSize; + struct FlashSector sector; + u16 wait[2]; // game pak bus read/write wait + + // TODO: add support for anonymous unions/structs if possible + union { + struct { + u8 makerId; + u8 deviceId; + } separate; + u16 joined; + } ids; +}; + +struct FlashSetupInfo +{ + u16 (*programFlashByte)(u16, u32, u8); + u16 (*programFlashSector)(u16, void *); + u16 (*eraseFlashChip)(void); + u16 (*eraseFlashSector)(u16); + u16 (*WaitForFlashWrite)(u8, u8 *, u8); + const u16 *maxTime; + struct FlashType type; +}; + +extern u16 gFlashNumRemainingBytes; + +extern u16 (*ProgramFlashByte)(u16, u32, u8); +extern u16 (*ProgramFlashSector)(u16, void *); +extern u16 (*EraseFlashChip)(void); +extern u16 (*EraseFlashSector)(u16); +extern u16 (*WaitForFlashWrite)(u8, u8 *, u8); +extern const u16 *gFlashMaxTime; +extern const struct FlashType *gFlash; + +extern u8 (*PollFlashStatus)(u8 *); +extern u8 gFlashTimeoutFlag; + +extern const struct FlashSetupInfo MX29L010; +extern const struct FlashSetupInfo LE26FV10N1TS; +extern const struct FlashSetupInfo DefaultFlash; + +void SwitchFlashBank(u8 bankNum); +u16 ReadFlashId(void); +void StartFlashTimer(u8 phase); +void SetReadFlash1(u16 *dest); +void StopFlashTimer(void); +u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)); +u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src); +void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size); +u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *dataSrc, u32 n); + +u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData); + +u16 EraseFlashChip_MX(void); +u16 EraseFlashSector_MX(u16 sectorNum); +u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data); +u16 ProgramFlashSector_MX(u16 sectorNum, void *src); + +// agb_flash_1m +u16 IdentifyFlash(void); + +#endif // GUARD_GBA_FLASH_INTERNAL_H diff --git a/payload/include/gba/gba.h b/payload/include/gba/gba.h new file mode 100644 index 0000000..3493440 --- /dev/null +++ b/payload/include/gba/gba.h @@ -0,0 +1,12 @@ +#ifndef GUARD_GBA_GBA_H +#define GUARD_GBA_GBA_H + +#include "gba/defines.h" +#include "gba/io_reg.h" +#include "gba/types.h" +#include "gba/multiboot.h" +#include "gba/syscall.h" +#include "gba/macro.h" +#include "gba/isagbprint.h" + +#endif // GUARD_GBA_GBA_H diff --git a/payload/include/gba/io_reg.h b/payload/include/gba/io_reg.h new file mode 100644 index 0000000..2dda7b5 --- /dev/null +++ b/payload/include/gba/io_reg.h @@ -0,0 +1,763 @@ +#ifndef GUARD_GBA_IO_REG_H +#define GUARD_GBA_IO_REG_H + +#define REG_BASE 0x4000000 // I/O register base address + +// I/O register offsets + +#define REG_OFFSET_DISPCNT 0x0 +#define REG_OFFSET_DISPSTAT 0x4 +#define REG_OFFSET_VCOUNT 0x6 +#define REG_OFFSET_BG0CNT 0x8 +#define REG_OFFSET_BG1CNT 0xa +#define REG_OFFSET_BG2CNT 0xc +#define REG_OFFSET_BG3CNT 0xe +#define REG_OFFSET_BG0HOFS 0x10 +#define REG_OFFSET_BG0VOFS 0x12 +#define REG_OFFSET_BG1HOFS 0x14 +#define REG_OFFSET_BG1VOFS 0x16 +#define REG_OFFSET_BG2HOFS 0x18 +#define REG_OFFSET_BG2VOFS 0x1a +#define REG_OFFSET_BG3HOFS 0x1c +#define REG_OFFSET_BG3VOFS 0x1e +#define REG_OFFSET_BG2PA 0x20 +#define REG_OFFSET_BG2PB 0x22 +#define REG_OFFSET_BG2PC 0x24 +#define REG_OFFSET_BG2PD 0x26 +#define REG_OFFSET_BG2X 0x28 +#define REG_OFFSET_BG2X_L 0x28 +#define REG_OFFSET_BG2X_H 0x2a +#define REG_OFFSET_BG2Y 0x2c +#define REG_OFFSET_BG2Y_L 0x2c +#define REG_OFFSET_BG2Y_H 0x2e +#define REG_OFFSET_BG3PA 0x30 +#define REG_OFFSET_BG3PB 0x32 +#define REG_OFFSET_BG3PC 0x34 +#define REG_OFFSET_BG3PD 0x36 +#define REG_OFFSET_BG3X 0x38 +#define REG_OFFSET_BG3X_L 0x38 +#define REG_OFFSET_BG3X_H 0x3a +#define REG_OFFSET_BG3Y 0x3c +#define REG_OFFSET_BG3Y_L 0x3c +#define REG_OFFSET_BG3Y_H 0x3e +#define REG_OFFSET_WIN0H 0x40 +#define REG_OFFSET_WIN1H 0x42 +#define REG_OFFSET_WIN0V 0x44 +#define REG_OFFSET_WIN1V 0x46 +#define REG_OFFSET_WININ 0x48 +#define REG_OFFSET_WINOUT 0x4a +#define REG_OFFSET_MOSAIC 0x4c +#define REG_OFFSET_BLDCNT 0x50 +#define REG_OFFSET_BLDALPHA 0x52 +#define REG_OFFSET_BLDY 0x54 + +#define REG_OFFSET_SOUND1CNT_L 0x60 +#define REG_OFFSET_NR10 0x60 +#define REG_OFFSET_SOUND1CNT_H 0x62 +#define REG_OFFSET_NR11 0x62 +#define REG_OFFSET_NR12 0x63 +#define REG_OFFSET_SOUND1CNT_X 0x64 +#define REG_OFFSET_NR13 0x64 +#define REG_OFFSET_NR14 0x65 +#define REG_OFFSET_SOUND2CNT_L 0x68 +#define REG_OFFSET_NR21 0x68 +#define REG_OFFSET_NR22 0x69 +#define REG_OFFSET_SOUND2CNT_H 0x6c +#define REG_OFFSET_NR23 0x6c +#define REG_OFFSET_NR24 0x6d +#define REG_OFFSET_SOUND3CNT_L 0x70 +#define REG_OFFSET_NR30 0x70 +#define REG_OFFSET_SOUND3CNT_H 0x72 +#define REG_OFFSET_NR31 0x72 +#define REG_OFFSET_NR32 0x73 +#define REG_OFFSET_SOUND3CNT_X 0x74 +#define REG_OFFSET_NR33 0x74 +#define REG_OFFSET_NR34 0x75 +#define REG_OFFSET_SOUND4CNT_L 0x78 +#define REG_OFFSET_NR41 0x78 +#define REG_OFFSET_NR42 0x79 +#define REG_OFFSET_SOUND4CNT_H 0x7c +#define REG_OFFSET_NR43 0x7c +#define REG_OFFSET_NR44 0x7d +#define REG_OFFSET_SOUNDCNT_L 0x80 +#define REG_OFFSET_NR50 0x80 +#define REG_OFFSET_NR51 0x81 +#define REG_OFFSET_SOUNDCNT_H 0x82 +#define REG_OFFSET_SOUNDCNT_X 0x84 +#define REG_OFFSET_NR52 0x84 +#define REG_OFFSET_SOUNDBIAS 0x88 +#define REG_OFFSET_SOUNDBIAS_L 0x88 +#define REG_OFFSET_SOUNDBIAS_H 0x89 +#define REG_OFFSET_WAVE_RAM0 0x90 +#define REG_OFFSET_WAVE_RAM1 0x94 +#define REG_OFFSET_WAVE_RAM2 0x98 +#define REG_OFFSET_WAVE_RAM3 0x9c +#define REG_OFFSET_FIFO_A 0xa0 +#define REG_OFFSET_FIFO_B 0xa4 + +#define REG_OFFSET_DMA0 0xb0 +#define REG_OFFSET_DMA0SAD 0xb0 +#define REG_OFFSET_DMA0SAD_L 0xb0 +#define REG_OFFSET_DMA0SAD_H 0xb2 +#define REG_OFFSET_DMA0DAD 0xb4 +#define REG_OFFSET_DMA0DAD_L 0xb4 +#define REG_OFFSET_DMA0DAD_H 0xb6 +#define REG_OFFSET_DMA0CNT 0xb8 +#define REG_OFFSET_DMA0CNT_L 0xb8 +#define REG_OFFSET_DMA0CNT_H 0xba +#define REG_OFFSET_DMA1 0xbc +#define REG_OFFSET_DMA1SAD 0xbc +#define REG_OFFSET_DMA1SAD_L 0xbc +#define REG_OFFSET_DMA1SAD_H 0xbe +#define REG_OFFSET_DMA1DAD 0xc0 +#define REG_OFFSET_DMA1DAD_L 0xc0 +#define REG_OFFSET_DMA1DAD_H 0xc2 +#define REG_OFFSET_DMA1CNT 0xc4 +#define REG_OFFSET_DMA1CNT_L 0xc4 +#define REG_OFFSET_DMA1CNT_H 0xc6 +#define REG_OFFSET_DMA2 0xc8 +#define REG_OFFSET_DMA2SAD 0xc8 +#define REG_OFFSET_DMA2SAD_L 0xc8 +#define REG_OFFSET_DMA2SAD_H 0xca +#define REG_OFFSET_DMA2DAD 0xcc +#define REG_OFFSET_DMA2DAD_L 0xcc +#define REG_OFFSET_DMA2DAD_H 0xce +#define REG_OFFSET_DMA2CNT 0xd0 +#define REG_OFFSET_DMA2CNT_L 0xd0 +#define REG_OFFSET_DMA2CNT_H 0xd2 +#define REG_OFFSET_DMA3 0xd4 +#define REG_OFFSET_DMA3SAD 0xd4 +#define REG_OFFSET_DMA3SAD_L 0xd4 +#define REG_OFFSET_DMA3SAD_H 0xd6 +#define REG_OFFSET_DMA3DAD 0xd8 +#define REG_OFFSET_DMA3DAD_L 0xd8 +#define REG_OFFSET_DMA3DAD_H 0xda +#define REG_OFFSET_DMA3CNT 0xdc +#define REG_OFFSET_DMA3CNT_L 0xdc +#define REG_OFFSET_DMA3CNT_H 0xde + +#define REG_OFFSET_TMCNT 0x100 +#define REG_OFFSET_TM0CNT 0x100 +#define REG_OFFSET_TM0CNT_L 0x100 +#define REG_OFFSET_TM0CNT_H 0x102 +#define REG_OFFSET_TM1CNT 0x104 +#define REG_OFFSET_TM1CNT_L 0x104 +#define REG_OFFSET_TM1CNT_H 0x106 +#define REG_OFFSET_TM2CNT 0x108 +#define REG_OFFSET_TM2CNT_L 0x108 +#define REG_OFFSET_TM2CNT_H 0x10a +#define REG_OFFSET_TM3CNT 0x10c +#define REG_OFFSET_TM3CNT_L 0x10c +#define REG_OFFSET_TM3CNT_H 0x10e + +#define REG_OFFSET_SIOCNT 0x128 +#define REG_OFFSET_SIODATA8 0x12a +#define REG_OFFSET_SIODATA32 0x120 +#define REG_OFFSET_SIOMLT_SEND 0x12a +#define REG_OFFSET_SIOMLT_RECV 0x120 +#define REG_OFFSET_SIOMULTI0 0x120 +#define REG_OFFSET_SIOMULTI1 0x122 +#define REG_OFFSET_SIOMULTI2 0x124 +#define REG_OFFSET_SIOMULTI3 0x126 + +#define REG_OFFSET_KEYINPUT 0x130 +#define REG_OFFSET_KEYCNT 0x132 + +#define REG_OFFSET_RCNT 0x134 + +#define REG_OFFSET_JOYCNT 0x140 +#define REG_OFFSET_JOYSTAT 0x158 +#define REG_OFFSET_JOY_RECV 0x150 +#define REG_OFFSET_JOY_RECV_L 0x150 +#define REG_OFFSET_JOY_RECV_H 0x152 +#define REG_OFFSET_JOY_TRANS 0x154 +#define REG_OFFSET_JOY_TRANS_L 0x154 +#define REG_OFFSET_JOY_TRANS_H 0x156 + +#define REG_OFFSET_IME 0x208 +#define REG_OFFSET_IE 0x200 +#define REG_OFFSET_IF 0x202 + +#define REG_OFFSET_WAITCNT 0x204 + +// I/O register addresses + +#define REG_ADDR_DISPCNT (REG_BASE + REG_OFFSET_DISPCNT) +#define REG_ADDR_DISPSTAT (REG_BASE + REG_OFFSET_DISPSTAT) +#define REG_ADDR_VCOUNT (REG_BASE + REG_OFFSET_VCOUNT) +#define REG_ADDR_BG0CNT (REG_BASE + REG_OFFSET_BG0CNT) +#define REG_ADDR_BG1CNT (REG_BASE + REG_OFFSET_BG1CNT) +#define REG_ADDR_BG2CNT (REG_BASE + REG_OFFSET_BG2CNT) +#define REG_ADDR_BG3CNT (REG_BASE + REG_OFFSET_BG3CNT) +#define REG_ADDR_BG0HOFS (REG_BASE + REG_OFFSET_BG0HOFS) +#define REG_ADDR_BG0VOFS (REG_BASE + REG_OFFSET_BG0VOFS) +#define REG_ADDR_BG1HOFS (REG_BASE + REG_OFFSET_BG1HOFS) +#define REG_ADDR_BG1VOFS (REG_BASE + REG_OFFSET_BG1VOFS) +#define REG_ADDR_BG2HOFS (REG_BASE + REG_OFFSET_BG2HOFS) +#define REG_ADDR_BG2VOFS (REG_BASE + REG_OFFSET_BG2VOFS) +#define REG_ADDR_BG3HOFS (REG_BASE + REG_OFFSET_BG3HOFS) +#define REG_ADDR_BG3VOFS (REG_BASE + REG_OFFSET_BG3VOFS) +#define REG_ADDR_BG2PA (REG_BASE + REG_OFFSET_BG2PA) +#define REG_ADDR_BG2PB (REG_BASE + REG_OFFSET_BG2PB) +#define REG_ADDR_BG2PC (REG_BASE + REG_OFFSET_BG2PC) +#define REG_ADDR_BG2PD (REG_BASE + REG_OFFSET_BG2PD) +#define REG_ADDR_BG2X (REG_BASE + REG_OFFSET_BG2X) +#define REG_ADDR_BG2X_L (REG_BASE + REG_OFFSET_BG2X_L) +#define REG_ADDR_BG2X_H (REG_BASE + REG_OFFSET_BG2X_H) +#define REG_ADDR_BG2Y (REG_BASE + REG_OFFSET_BG2Y) +#define REG_ADDR_BG2Y_L (REG_BASE + REG_OFFSET_BG2Y_L) +#define REG_ADDR_BG2Y_H (REG_BASE + REG_OFFSET_BG2Y_H) +#define REG_ADDR_BG3PA (REG_BASE + REG_OFFSET_BG3PA) +#define REG_ADDR_BG3PB (REG_BASE + REG_OFFSET_BG3PB) +#define REG_ADDR_BG3PC (REG_BASE + REG_OFFSET_BG3PC) +#define REG_ADDR_BG3PD (REG_BASE + REG_OFFSET_BG3PD) +#define REG_ADDR_BG3X (REG_BASE + REG_OFFSET_BG3X) +#define REG_ADDR_BG3X_L (REG_BASE + REG_OFFSET_BG3X_L) +#define REG_ADDR_BG3X_H (REG_BASE + REG_OFFSET_BG3X_H) +#define REG_ADDR_BG3Y (REG_BASE + REG_OFFSET_BG3Y) +#define REG_ADDR_BG3Y_L (REG_BASE + REG_OFFSET_BG3Y_L) +#define REG_ADDR_BG3Y_H (REG_BASE + REG_OFFSET_BG3Y_H) +#define REG_ADDR_WIN0H (REG_BASE + REG_OFFSET_WIN0H) +#define REG_ADDR_WIN1H (REG_BASE + REG_OFFSET_WIN1H) +#define REG_ADDR_WIN0V (REG_BASE + REG_OFFSET_WIN0V) +#define REG_ADDR_WIN1V (REG_BASE + REG_OFFSET_WIN1V) +#define REG_ADDR_WININ (REG_BASE + REG_OFFSET_WININ) +#define REG_ADDR_WINOUT (REG_BASE + REG_OFFSET_WINOUT) +#define REG_ADDR_MOSAIC (REG_BASE + REG_OFFSET_MOSAIC) +#define REG_ADDR_BLDCNT (REG_BASE + REG_OFFSET_BLDCNT) +#define REG_ADDR_BLDALPHA (REG_BASE + REG_OFFSET_BLDALPHA) +#define REG_ADDR_BLDY (REG_BASE + REG_OFFSET_BLDY) + +#define REG_ADDR_SOUND1CNT_L (REG_BASE + REG_OFFSET_SOUND1CNT_L) +#define REG_ADDR_NR10 (REG_BASE + REG_OFFSET_NR10) +#define REG_ADDR_SOUND1CNT_H (REG_BASE + REG_OFFSET_SOUND1CNT_H) +#define REG_ADDR_NR11 (REG_BASE + REG_OFFSET_NR11) +#define REG_ADDR_NR12 (REG_BASE + REG_OFFSET_NR12) +#define REG_ADDR_SOUND1CNT_X (REG_BASE + REG_OFFSET_SOUND1CNT_X) +#define REG_ADDR_NR13 (REG_BASE + REG_OFFSET_NR13) +#define REG_ADDR_NR14 (REG_BASE + REG_OFFSET_NR14) +#define REG_ADDR_SOUND2CNT_L (REG_BASE + REG_OFFSET_SOUND2CNT_L) +#define REG_ADDR_NR21 (REG_BASE + REG_OFFSET_NR21) +#define REG_ADDR_NR22 (REG_BASE + REG_OFFSET_NR22) +#define REG_ADDR_SOUND2CNT_H (REG_BASE + REG_OFFSET_SOUND2CNT_H) +#define REG_ADDR_NR23 (REG_BASE + REG_OFFSET_NR23) +#define REG_ADDR_NR24 (REG_BASE + REG_OFFSET_NR24) +#define REG_ADDR_SOUND3CNT_L (REG_BASE + REG_OFFSET_SOUND3CNT_L) +#define REG_ADDR_NR30 (REG_BASE + REG_OFFSET_NR30) +#define REG_ADDR_SOUND3CNT_H (REG_BASE + REG_OFFSET_SOUND3CNT_H) +#define REG_ADDR_NR31 (REG_BASE + REG_OFFSET_NR31) +#define REG_ADDR_NR32 (REG_BASE + REG_OFFSET_NR32) +#define REG_ADDR_SOUND3CNT_X (REG_BASE + REG_OFFSET_SOUND3CNT_X) +#define REG_ADDR_NR33 (REG_BASE + REG_OFFSET_NR33) +#define REG_ADDR_NR34 (REG_BASE + REG_OFFSET_NR34) +#define REG_ADDR_SOUND4CNT_L (REG_BASE + REG_OFFSET_SOUND4CNT_L) +#define REG_ADDR_NR41 (REG_BASE + REG_OFFSET_NR41) +#define REG_ADDR_NR42 (REG_BASE + REG_OFFSET_NR42) +#define REG_ADDR_SOUND4CNT_H (REG_BASE + REG_OFFSET_SOUND4CNT_H) +#define REG_ADDR_NR43 (REG_BASE + REG_OFFSET_NR43) +#define REG_ADDR_NR44 (REG_BASE + REG_OFFSET_NR44) +#define REG_ADDR_SOUNDCNT_L (REG_BASE + REG_OFFSET_SOUNDCNT_L) +#define REG_ADDR_NR50 (REG_BASE + REG_OFFSET_NR50) +#define REG_ADDR_NR51 (REG_BASE + REG_OFFSET_NR51) +#define REG_ADDR_SOUNDCNT_H (REG_BASE + REG_OFFSET_SOUNDCNT_H) +#define REG_ADDR_SOUNDCNT_X (REG_BASE + REG_OFFSET_SOUNDCNT_X) +#define REG_ADDR_NR52 (REG_BASE + REG_OFFSET_NR52) +#define REG_ADDR_SOUNDBIAS (REG_BASE + REG_OFFSET_SOUNDBIAS) +#define REG_ADDR_SOUNDBIAS_L (REG_BASE + REG_OFFSET_SOUNDBIAS_L) +#define REG_ADDR_SOUNDBIAS_H (REG_BASE + REG_OFFSET_SOUNDBIAS_H) +#define REG_ADDR_WAVE_RAM0 (REG_BASE + REG_OFFSET_WAVE_RAM0) +#define REG_ADDR_WAVE_RAM1 (REG_BASE + REG_OFFSET_WAVE_RAM1) +#define REG_ADDR_WAVE_RAM2 (REG_BASE + REG_OFFSET_WAVE_RAM2) +#define REG_ADDR_WAVE_RAM3 (REG_BASE + REG_OFFSET_WAVE_RAM3) +#define REG_ADDR_FIFO_A (REG_BASE + REG_OFFSET_FIFO_A) +#define REG_ADDR_FIFO_B (REG_BASE + REG_OFFSET_FIFO_B) + +#define REG_ADDR_DMA0 (REG_BASE + REG_OFFSET_DMA0) +#define REG_ADDR_DMA0SAD (REG_BASE + REG_OFFSET_DMA0SAD) +#define REG_ADDR_DMA0DAD (REG_BASE + REG_OFFSET_DMA0DAD) +#define REG_ADDR_DMA0CNT (REG_BASE + REG_OFFSET_DMA0CNT) +#define REG_ADDR_DMA0CNT_L (REG_BASE + REG_OFFSET_DMA0CNT_L) +#define REG_ADDR_DMA0CNT_H (REG_BASE + REG_OFFSET_DMA0CNT_H) +#define REG_ADDR_DMA1 (REG_BASE + REG_OFFSET_DMA1) +#define REG_ADDR_DMA1SAD (REG_BASE + REG_OFFSET_DMA1SAD) +#define REG_ADDR_DMA1DAD (REG_BASE + REG_OFFSET_DMA1DAD) +#define REG_ADDR_DMA1CNT (REG_BASE + REG_OFFSET_DMA1CNT) +#define REG_ADDR_DMA1CNT_L (REG_BASE + REG_OFFSET_DMA1CNT_L) +#define REG_ADDR_DMA1CNT_H (REG_BASE + REG_OFFSET_DMA1CNT_H) +#define REG_ADDR_DMA2 (REG_BASE + REG_OFFSET_DMA2) +#define REG_ADDR_DMA2SAD (REG_BASE + REG_OFFSET_DMA2SAD) +#define REG_ADDR_DMA2DAD (REG_BASE + REG_OFFSET_DMA2DAD) +#define REG_ADDR_DMA2CNT (REG_BASE + REG_OFFSET_DMA2CNT) +#define REG_ADDR_DMA2CNT_L (REG_BASE + REG_OFFSET_DMA2CNT_L) +#define REG_ADDR_DMA2CNT_H (REG_BASE + REG_OFFSET_DMA2CNT_H) +#define REG_ADDR_DMA3 (REG_BASE + REG_OFFSET_DMA3) +#define REG_ADDR_DMA3SAD (REG_BASE + REG_OFFSET_DMA3SAD) +#define REG_ADDR_DMA3DAD (REG_BASE + REG_OFFSET_DMA3DAD) +#define REG_ADDR_DMA3CNT (REG_BASE + REG_OFFSET_DMA3CNT) +#define REG_ADDR_DMA3CNT_L (REG_BASE + REG_OFFSET_DMA3CNT_L) +#define REG_ADDR_DMA3CNT_H (REG_BASE + REG_OFFSET_DMA3CNT_H) + +#define REG_ADDR_TMCNT (REG_BASE + REG_OFFSET_TMCNT) +#define REG_ADDR_TM0CNT (REG_BASE + REG_OFFSET_TM0CNT) +#define REG_ADDR_TM0CNT_L (REG_BASE + REG_OFFSET_TM0CNT_L) +#define REG_ADDR_TM0CNT_H (REG_BASE + REG_OFFSET_TM0CNT_H) +#define REG_ADDR_TM1CNT (REG_BASE + REG_OFFSET_TM1CNT) +#define REG_ADDR_TM1CNT_L (REG_BASE + REG_OFFSET_TM1CNT_L) +#define REG_ADDR_TM1CNT_H (REG_BASE + REG_OFFSET_TM1CNT_H) +#define REG_ADDR_TM2CNT (REG_BASE + REG_OFFSET_TM2CNT) +#define REG_ADDR_TM2CNT_L (REG_BASE + REG_OFFSET_TM2CNT_L) +#define REG_ADDR_TM2CNT_H (REG_BASE + REG_OFFSET_TM2CNT_H) +#define REG_ADDR_TM3CNT (REG_BASE + REG_OFFSET_TM3CNT) +#define REG_ADDR_TM3CNT_L (REG_BASE + REG_OFFSET_TM3CNT_L) +#define REG_ADDR_TM3CNT_H (REG_BASE + REG_OFFSET_TM3CNT_H) + +#define REG_ADDR_SIOCNT (REG_BASE + REG_OFFSET_SIOCNT) +#define REG_ADDR_SIODATA8 (REG_BASE + REG_OFFSET_SIODATA8) +#define REG_ADDR_SIODATA32 (REG_BASE + REG_OFFSET_SIODATA32) +#define REG_ADDR_SIOMLT_SEND (REG_BASE + REG_OFFSET_SIOMLT_SEND) +#define REG_ADDR_SIOMLT_RECV (REG_BASE + REG_OFFSET_SIOMLT_RECV) +#define REG_ADDR_SIOMULTI0 (REG_BASE + REG_OFFSET_SIOMULTI0) +#define REG_ADDR_SIOMULTI1 (REG_BASE + REG_OFFSET_SIOMULTI1) +#define REG_ADDR_SIOMULTI2 (REG_BASE + REG_OFFSET_SIOMULTI2) +#define REG_ADDR_SIOMULTI3 (REG_BASE + REG_OFFSET_SIOMULTI3) + +#define REG_ADDR_KEYINPUT (REG_BASE + REG_OFFSET_KEYINPUT) +#define REG_ADDR_KEYCNT (REG_BASE + REG_OFFSET_KEYCNT) + +#define REG_ADDR_RCNT (REG_BASE + REG_OFFSET_RCNT) + +#define REG_ADDR_JOYCNT (REG_BASE + REG_OFFSET_JOYCNT) +#define REG_ADDR_JOYSTAT (REG_BASE + REG_OFFSET_JOYSTAT) +#define REG_ADDR_JOY_RECV (REG_BASE + REG_OFFSET_JOY_RECV) +#define REG_ADDR_JOY_RECV_L (REG_BASE + REG_OFFSET_JOY_RECV_L) +#define REG_ADDR_JOY_RECV_H (REG_BASE + REG_OFFSET_JOY_RECV_H) +#define REG_ADDR_JOY_TRANS (REG_BASE + REG_OFFSET_JOY_TRANS) +#define REG_ADDR_JOY_TRANS_L (REG_BASE + REG_OFFSET_JOY_TRANS_L) +#define REG_ADDR_JOY_TRANS_H (REG_BASE + REG_OFFSET_JOY_TRANS_H) + +#define REG_ADDR_IME (REG_BASE + REG_OFFSET_IME) +#define REG_ADDR_IE (REG_BASE + REG_OFFSET_IE) +#define REG_ADDR_IF (REG_BASE + REG_OFFSET_IF) + +#define REG_ADDR_WAITCNT (REG_BASE + REG_OFFSET_WAITCNT) + +// I/O registers + +#define REG_DISPCNT (*(vu16 *)REG_ADDR_DISPCNT) +#define REG_DISPSTAT (*(vu16 *)REG_ADDR_DISPSTAT) +#define REG_VCOUNT (*(vu16 *)REG_ADDR_VCOUNT) +#define REG_BG0CNT (*(vu16 *)REG_ADDR_BG0CNT) +#define REG_BG1CNT (*(vu16 *)REG_ADDR_BG1CNT) +#define REG_BG2CNT (*(vu16 *)REG_ADDR_BG2CNT) +#define REG_BG3CNT (*(vu16 *)REG_ADDR_BG3CNT) +#define REG_BG0HOFS (*(vu16 *)REG_ADDR_BG0HOFS) +#define REG_BG0VOFS (*(vu16 *)REG_ADDR_BG0VOFS) +#define REG_BG1HOFS (*(vu16 *)REG_ADDR_BG1HOFS) +#define REG_BG1VOFS (*(vu16 *)REG_ADDR_BG1VOFS) +#define REG_BG2HOFS (*(vu16 *)REG_ADDR_BG2HOFS) +#define REG_BG2VOFS (*(vu16 *)REG_ADDR_BG2VOFS) +#define REG_BG3HOFS (*(vu16 *)REG_ADDR_BG3HOFS) +#define REG_BG3VOFS (*(vu16 *)REG_ADDR_BG3VOFS) +#define REG_BG2PA (*(vu16 *)REG_ADDR_BG2PA) +#define REG_BG2PB (*(vu16 *)REG_ADDR_BG2PB) +#define REG_BG2PC (*(vu16 *)REG_ADDR_BG2PC) +#define REG_BG2PD (*(vu16 *)REG_ADDR_BG2PD) +#define REG_BG2X (*(vu32 *)REG_ADDR_BG2X) +#define REG_BG2X_L (*(vu16 *)REG_ADDR_BG2X_L) +#define REG_BG2X_H (*(vu16 *)REG_ADDR_BG2X_H) +#define REG_BG2Y (*(vu32 *)REG_ADDR_BG2Y) +#define REG_BG2Y_L (*(vu16 *)REG_ADDR_BG2Y_L) +#define REG_BG2Y_H (*(vu16 *)REG_ADDR_BG2Y_H) +#define REG_BG3PA (*(vu16 *)REG_ADDR_BG3PA) +#define REG_BG3PB (*(vu16 *)REG_ADDR_BG3PB) +#define REG_BG3PC (*(vu16 *)REG_ADDR_BG3PC) +#define REG_BG3PD (*(vu16 *)REG_ADDR_BG3PD) +#define REG_BG3X (*(vu32 *)REG_ADDR_BG3X) +#define REG_BG3X_L (*(vu16 *)REG_ADDR_BG3X_L) +#define REG_BG3X_H (*(vu16 *)REG_ADDR_BG3X_H) +#define REG_BG3Y (*(vu32 *)REG_ADDR_BG3Y) +#define REG_BG3Y_L (*(vu16 *)REG_ADDR_BG3Y_L) +#define REG_BG3Y_H (*(vu16 *)REG_ADDR_BG3Y_H) +#define REG_WIN0H (*(vu16 *)REG_ADDR_WIN0H) +#define REG_WIN1H (*(vu16 *)REG_ADDR_WIN1H) +#define REG_WIN0V (*(vu16 *)REG_ADDR_WIN0V) +#define REG_WIN1V (*(vu16 *)REG_ADDR_WIN1V) +#define REG_WININ (*(vu16 *)REG_ADDR_WININ) +#define REG_WINOUT (*(vu16 *)REG_ADDR_WINOUT) +#define REG_MOSAIC (*(vu16 *)REG_ADDR_MOSAIC) +#define REG_BLDCNT (*(vu16 *)REG_ADDR_BLDCNT) +#define REG_BLDALPHA (*(vu16 *)REG_ADDR_BLDALPHA) +#define REG_BLDY (*(vu16 *)REG_ADDR_BLDY) + +#define REG_SOUND1CNT_L (*(vu16 *)REG_ADDR_SOUND1CNT_L) +#define REG_NR10 (*(vu8 *)REG_ADDR_NR10) +#define REG_SOUND1CNT_H (*(vu16 *)REG_ADDR_SOUND1CNT_H) +#define REG_NR11 (*(vu8 *)REG_ADDR_NR11) +#define REG_NR12 (*(vu8 *)REG_ADDR_NR12) +#define REG_SOUND1CNT_X (*(vu16 *)REG_ADDR_SOUND1CNT_X) +#define REG_NR13 (*(vu8 *)REG_ADDR_NR13) +#define REG_NR14 (*(vu8 *)REG_ADDR_NR14) +#define REG_SOUND2CNT_L (*(vu16 *)REG_ADDR_SOUND2CNT_L) +#define REG_NR21 (*(vu8 *)REG_ADDR_NR21) +#define REG_NR22 (*(vu8 *)REG_ADDR_NR22) +#define REG_SOUND2CNT_H (*(vu16 *)REG_ADDR_SOUND2CNT_H) +#define REG_NR23 (*(vu8 *)REG_ADDR_NR23) +#define REG_NR24 (*(vu8 *)REG_ADDR_NR24) +#define REG_SOUND3CNT_L (*(vu16 *)REG_ADDR_SOUND3CNT_L) +#define REG_NR30 (*(vu8 *)REG_ADDR_NR30) +#define REG_SOUND3CNT_H (*(vu16 *)REG_ADDR_SOUND3CNT_H) +#define REG_NR31 (*(vu8 *)REG_ADDR_NR31) +#define REG_NR32 (*(vu8 *)REG_ADDR_NR32) +#define REG_SOUND3CNT_X (*(vu16 *)REG_ADDR_SOUND3CNT_X) +#define REG_NR33 (*(vu8 *)REG_ADDR_NR33) +#define REG_NR34 (*(vu8 *)REG_ADDR_NR34) +#define REG_SOUND4CNT_L (*(vu16 *)REG_ADDR_SOUND4CNT_L) +#define REG_NR41 (*(vu8 *)REG_ADDR_NR41) +#define REG_NR42 (*(vu8 *)REG_ADDR_NR42) +#define REG_SOUND4CNT_H (*(vu16 *)REG_ADDR_SOUND4CNT_H) +#define REG_NR43 (*(vu8 *)REG_ADDR_NR43) +#define REG_NR44 (*(vu8 *)REG_ADDR_NR44) +#define REG_SOUNDCNT_L (*(vu16 *)REG_ADDR_SOUNDCNT_L) +#define REG_NR50 (*(vu8 *)REG_ADDR_NR50) +#define REG_NR51 (*(vu8 *)REG_ADDR_NR51) +#define REG_SOUNDCNT_H (*(vu16 *)REG_ADDR_SOUNDCNT_H) +#define REG_SOUNDCNT_X (*(vu16 *)REG_ADDR_SOUNDCNT_X) +#define REG_NR52 (*(vu8 *)REG_ADDR_NR52) +#define REG_SOUNDBIAS (*(vu16 *)REG_ADDR_SOUNDBIAS) +#define REG_SOUNDBIAS_L (*(vu8 *)REG_ADDR_SOUNDBIAS_L) +#define REG_SOUNDBIAS_H (*(vu8 *)REG_ADDR_SOUNDBIAS_H) +#define REG_WAVE_RAM0 (*(vu32 *)REG_ADDR_WAVE_RAM0) +#define REG_WAVE_RAM1 (*(vu32 *)REG_ADDR_WAVE_RAM1) +#define REG_WAVE_RAM2 (*(vu32 *)REG_ADDR_WAVE_RAM2) +#define REG_WAVE_RAM3 (*(vu32 *)REG_ADDR_WAVE_RAM3) +#define REG_FIFO_A (*(vu32 *)REG_ADDR_FIFO_A) +#define REG_FIFO_B (*(vu32 *)REG_ADDR_FIFO_B) + +#define REG_DMA0SAD (*(vu32 *)REG_ADDR_DMA0SAD) +#define REG_DMA0DAD (*(vu32 *)REG_ADDR_DMA0DAD) +#define REG_DMA0CNT (*(vu32 *)REG_ADDR_DMA0CNT) +#define REG_DMA0CNT_L (*(vu16 *)REG_ADDR_DMA0CNT_L) +#define REG_DMA0CNT_H (*(vu16 *)REG_ADDR_DMA0CNT_H) + +#define REG_DMA1SAD (*(vu32 *)REG_ADDR_DMA1SAD) +#define REG_DMA1DAD (*(vu32 *)REG_ADDR_DMA1DAD) +#define REG_DMA1CNT (*(vu32 *)REG_ADDR_DMA1CNT) +#define REG_DMA1CNT_L (*(vu16 *)REG_ADDR_DMA1CNT_L) +#define REG_DMA1CNT_H (*(vu16 *)REG_ADDR_DMA1CNT_H) + +#define REG_DMA2SAD (*(vu32 *)REG_ADDR_DMA2SAD) +#define REG_DMA2DAD (*(vu32 *)REG_ADDR_DMA2DAD) +#define REG_DMA2CNT (*(vu32 *)REG_ADDR_DMA2CNT) +#define REG_DMA2CNT_L (*(vu16 *)REG_ADDR_DMA2CNT_L) +#define REG_DMA2CNT_H (*(vu16 *)REG_ADDR_DMA2CNT_H) + +#define REG_DMA3SAD (*(vu32 *)REG_ADDR_DMA3SAD) +#define REG_DMA3DAD (*(vu32 *)REG_ADDR_DMA3DAD) +#define REG_DMA3CNT (*(vu32 *)REG_ADDR_DMA3CNT) +#define REG_DMA3CNT_L (*(vu16 *)REG_ADDR_DMA3CNT_L) +#define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H) + +#define REG_TMCNT(n) (*(vu16 *)(REG_ADDR_TMCNT + ((n) * 4))) +#define REG_TM0CNT (*(vu32 *)REG_ADDR_TM0CNT) +#define REG_TM0CNT_L (*(vu16 *)REG_ADDR_TM0CNT_L) +#define REG_TM0CNT_H (*(vu16 *)REG_ADDR_TM0CNT_H) +#define REG_TM1CNT (*(vu32 *)REG_ADDR_TM1CNT) +#define REG_TM1CNT_L (*(vu16 *)REG_ADDR_TM1CNT_L) +#define REG_TM1CNT_H (*(vu16 *)REG_ADDR_TM1CNT_H) +#define REG_TM2CNT (*(vu32 *)REG_ADDR_TM2CNT) +#define REG_TM2CNT_L (*(vu16 *)REG_ADDR_TM2CNT_L) +#define REG_TM2CNT_H (*(vu16 *)REG_ADDR_TM2CNT_H) +#define REG_TM3CNT (*(vu32 *)REG_ADDR_TM3CNT) +#define REG_TM3CNT_L (*(vu16 *)REG_ADDR_TM3CNT_L) +#define REG_TM3CNT_H (*(vu16 *)REG_ADDR_TM3CNT_H) + +#define REG_SIOCNT (*(vu16 *)REG_ADDR_SIOCNT) +#define REG_SIODATA8 (*(vu16 *)REG_ADDR_SIODATA8) +#define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32) +#define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND) +#define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV) +#define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0) +#define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1) +#define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2) +#define REG_SIOMULTI3 (*(vu16 *)REG_ADDR_SIOMULTI3) + +#define REG_KEYINPUT (*(vu16 *)REG_ADDR_KEYINPUT) +#define REG_KEYCNT (*(vu16 *)REG_ADDR_KEYCNT) + +#define REG_RCNT (*(vu16 *)REG_ADDR_RCNT) + +#define REG_IME (*(vu16 *)REG_ADDR_IME) +#define REG_IE (*(vu16 *)REG_ADDR_IE) +#define REG_IF (*(vu16 *)REG_ADDR_IF) + +#define REG_WAITCNT (*(vu16 *)REG_ADDR_WAITCNT) + +// I/O register fields + +// DISPCNT +#define DISPCNT_MODE_0 0x0000 // BG0: text, BG1: text, BG2: text, BG3: text +#define DISPCNT_MODE_1 0x0001 // BG0: text, BG1: text, BG2: affine, BG3: off +#define DISPCNT_MODE_2 0x0002 // BG0: off, BG1: off, BG2: affine, BG3: affine +#define DISPCNT_MODE_3 0x0003 // Bitmap mode, 240x160, BGR555 color +#define DISPCNT_MODE_4 0x0004 // Bitmap mode, 240x160, 256 color palette +#define DISPCNT_MODE_5 0x0005 // Bitmap mode, 160x128, BGR555 color +#define DISPCNT_OBJ_1D_MAP 0x0040 +#define DISPCNT_FORCED_BLANK 0x0080 +#define DISPCNT_BG0_ON 0x0100 +#define DISPCNT_BG1_ON 0x0200 +#define DISPCNT_BG2_ON 0x0400 +#define DISPCNT_BG3_ON 0x0800 +#define DISPCNT_BG_ALL_ON 0x0F00 +#define DISPCNT_OBJ_ON 0x1000 +#define DISPCNT_WIN0_ON 0x2000 +#define DISPCNT_WIN1_ON 0x4000 +#define DISPCNT_OBJWIN_ON 0x8000 + +// DISPSTAT +#define DISPSTAT_VBLANK 0x0001 // in V-Blank +#define DISPSTAT_HBLANK 0x0002 // in H-Blank +#define DISPSTAT_VCOUNT 0x0004 // V-Count match +#define DISPSTAT_VBLANK_INTR 0x0008 // V-Blank interrupt enabled +#define DISPSTAT_HBLANK_INTR 0x0010 // H-Blank interrupt enabled +#define DISPSTAT_VCOUNT_INTR 0x0020 // V-Count interrupt enabled + +// BGCNT +#define BGCNT_PRIORITY(n) (n) // Values 0 - 3. Lower priority BGs will be drawn on top of higher priority BGs. +#define BGCNT_CHARBASE(n) ((n) << 2) // Values 0 - 3. Base block for tile pixel data. +#define BGCNT_MOSAIC 0x0040 +#define BGCNT_16COLOR 0x0000 // 4 bits per pixel +#define BGCNT_256COLOR 0x0080 // 8 bits per pixel +#define BGCNT_SCREENBASE(n) ((n) << 8) // Values 0 - 31. Base block for tile map. +#define BGCNT_WRAP 0x2000 // Only affects affine BGs. Text BGs wrap by default. +#define BGCNT_TXT256x256 0x0000 // Internal screen size size of text mode BG in pixels. +#define BGCNT_TXT512x256 0x4000 +#define BGCNT_TXT256x512 0x8000 +#define BGCNT_TXT512x512 0xC000 +#define BGCNT_AFF128x128 0x0000 // Internal screen size size of affine mode BG in pixels. +#define BGCNT_AFF256x256 0x4000 +#define BGCNT_AFF512x512 0x8000 +#define BGCNT_AFF1024x1024 0xC000 + +// WININ/OUT +#define WININ_WIN0_BG0 (1 << 0) +#define WININ_WIN0_BG1 (1 << 1) +#define WININ_WIN0_BG2 (1 << 2) +#define WININ_WIN0_BG3 (1 << 3) +#define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) +#define WININ_WIN0_OBJ (1 << 4) +#define WININ_WIN0_CLR (1 << 5) +#define WININ_WIN1_BG0 (1 << 8) +#define WININ_WIN1_BG1 (1 << 9) +#define WININ_WIN1_BG2 (1 << 10) +#define WININ_WIN1_BG3 (1 << 11) +#define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3) +#define WININ_WIN1_OBJ (1 << 12) +#define WININ_WIN1_CLR (1 << 13) + +#define WINOUT_WIN01_BG0 (1 << 0) +#define WINOUT_WIN01_BG1 (1 << 1) +#define WINOUT_WIN01_BG2 (1 << 2) +#define WINOUT_WIN01_BG3 (1 << 3) +#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3) +#define WINOUT_WIN01_OBJ (1 << 4) +#define WINOUT_WIN01_CLR (1 << 5) +#define WINOUT_WINOBJ_BG0 (1 << 8) +#define WINOUT_WINOBJ_BG1 (1 << 9) +#define WINOUT_WINOBJ_BG2 (1 << 10) +#define WINOUT_WINOBJ_BG3 (1 << 11) +#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3) +#define WINOUT_WINOBJ_OBJ (1 << 12) +#define WINOUT_WINOBJ_CLR (1 << 13) + +#define WIN_RANGE(a, b) (((a) << 8) | (b)) +#define WIN_RANGE2(a, b) ((b) | ((a) << 8)) + +// BLDCNT +// Bits 0-5 select layers for the 1st target +#define BLDCNT_TGT1_BG0 (1 << 0) +#define BLDCNT_TGT1_BG1 (1 << 1) +#define BLDCNT_TGT1_BG2 (1 << 2) +#define BLDCNT_TGT1_BG3 (1 << 3) +#define BLDCNT_TGT1_OBJ (1 << 4) +#define BLDCNT_TGT1_BD (1 << 5) +#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD) +// Bits 6-7 select the special effect +#define BLDCNT_EFFECT_NONE (0 << 6) // no special effect +#define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA) +#define BLDCNT_EFFECT_LIGHTEN (2 << 6) // 1st target becomes whiter (controlled by BLDY) +#define BLDCNT_EFFECT_DARKEN (3 << 6) // 1st target becomes blacker (controlled by BLDY) +// Bits 8-13 select layers for the 2nd target +#define BLDCNT_TGT2_BG0 (1 << 8) +#define BLDCNT_TGT2_BG1 (1 << 9) +#define BLDCNT_TGT2_BG2 (1 << 10) +#define BLDCNT_TGT2_BG3 (1 << 11) +#define BLDCNT_TGT2_OBJ (1 << 12) +#define BLDCNT_TGT2_BD (1 << 13) +#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD) + +// BLDALPHA +#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1)) + +// SOUNDCNT_H +#define SOUND_CGB_MIX_QUARTER 0x0000 +#define SOUND_CGB_MIX_HALF 0x0001 +#define SOUND_CGB_MIX_FULL 0x0002 +#define SOUND_A_MIX_HALF 0x0000 +#define SOUND_A_MIX_FULL 0x0004 +#define SOUND_B_MIX_HALF 0x0000 +#define SOUND_B_MIX_FULL 0x0008 +#define SOUND_ALL_MIX_FULL 0x000E +#define SOUND_A_RIGHT_OUTPUT 0x0100 +#define SOUND_A_LEFT_OUTPUT 0x0200 +#define SOUND_A_TIMER_0 0x0000 +#define SOUND_A_TIMER_1 0x0400 +#define SOUND_A_FIFO_RESET 0x0800 +#define SOUND_B_RIGHT_OUTPUT 0x1000 +#define SOUND_B_LEFT_OUTPUT 0x2000 +#define SOUND_B_TIMER_0 0x0000 +#define SOUND_B_TIMER_1 0x4000 +#define SOUND_B_FIFO_RESET 0x8000 + +// SOUNDCNT_X +#define SOUND_1_ON 0x0001 +#define SOUND_2_ON 0x0002 +#define SOUND_3_ON 0x0004 +#define SOUND_4_ON 0x0008 +#define SOUND_MASTER_ENABLE 0x0080 + +// DMA +#define DMA_DEST_INC 0x0000 +#define DMA_DEST_DEC 0x0020 +#define DMA_DEST_FIXED 0x0040 +#define DMA_DEST_RELOAD 0x0060 +#define DMA_SRC_INC 0x0000 +#define DMA_SRC_DEC 0x0080 +#define DMA_SRC_FIXED 0x0100 +#define DMA_REPEAT 0x0200 +#define DMA_16BIT 0x0000 +#define DMA_32BIT 0x0400 +#define DMA_DREQ_ON 0x0800 +#define DMA_START_NOW 0x0000 +#define DMA_START_VBLANK 0x1000 +#define DMA_START_HBLANK 0x2000 +#define DMA_START_SPECIAL 0x3000 +#define DMA_START_MASK 0x3000 +#define DMA_INTR_ENABLE 0x4000 +#define DMA_ENABLE 0x8000 + +// timer +#define TIMER_1CLK 0x00 +#define TIMER_64CLK 0x01 +#define TIMER_256CLK 0x02 +#define TIMER_1024CLK 0x03 +#define TIMER_INTR_ENABLE 0x40 +#define TIMER_ENABLE 0x80 + +// serial +#define SIO_ID 0x0030 // Communication ID + +#define SIO_8BIT_MODE 0x0000 // Normal 8-bit communication mode +#define SIO_32BIT_MODE 0x1000 // Normal 32-bit communication mode +#define SIO_MULTI_MODE 0x2000 // Multi-player communication mode +#define SIO_UART_MODE 0x3000 // UART communication mode + +#define SIO_9600_BPS 0x0000 // baud rate 9600 bps +#define SIO_38400_BPS 0x0001 // 38400 bps +#define SIO_57600_BPS 0x0002 // 57600 bps +#define SIO_115200_BPS 0x0003 // 115200 bps + +#define SIO_MULTI_SI 0x0004 // Multi-player communication SI terminal +#define SIO_MULTI_SD 0x0008 // SD terminal +#define SIO_MULTI_BUSY 0x0080 + +#define SIO_ERROR 0x0040 // Detect error +#define SIO_START 0x0080 // Start transfer +#define SIO_ENABLE 0x0080 // Enable SIO + +#define SIO_INTR_ENABLE 0x4000 + +#define SIO_MULTI_SI_SHIFT 2 +#define SIO_MULTI_SI_MASK 0x1 +#define SIO_MULTI_DI_SHIFT 3 +#define SIO_MULTI_DI_MASK 0x1 + +// keys +#define A_BUTTON 0x0001 +#define B_BUTTON 0x0002 +#define SELECT_BUTTON 0x0004 +#define START_BUTTON 0x0008 +#define DPAD_RIGHT 0x0010 +#define DPAD_LEFT 0x0020 +#define DPAD_UP 0x0040 +#define DPAD_DOWN 0x0080 +#define R_BUTTON 0x0100 +#define L_BUTTON 0x0200 +#define KEYS_MASK 0x03FF +#define KEY_INTR_ENABLE 0x0400 +#define KEY_OR_INTR 0x0000 +#define KEY_AND_INTR 0x8000 +#define DPAD_ANY 0x00F0 +#define JOY_EXCL_DPAD 0x030F + +// interrupt flags +#define INTR_FLAG_VBLANK (1 << 0) +#define INTR_FLAG_HBLANK (1 << 1) +#define INTR_FLAG_VCOUNT (1 << 2) +#define INTR_FLAG_TIMER0 (1 << 3) +#define INTR_FLAG_TIMER1 (1 << 4) +#define INTR_FLAG_TIMER2 (1 << 5) +#define INTR_FLAG_TIMER3 (1 << 6) +#define INTR_FLAG_SERIAL (1 << 7) +#define INTR_FLAG_DMA0 (1 << 8) +#define INTR_FLAG_DMA1 (1 << 9) +#define INTR_FLAG_DMA2 (1 << 10) +#define INTR_FLAG_DMA3 (1 << 11) +#define INTR_FLAG_KEYPAD (1 << 12) +#define INTR_FLAG_GAMEPAK (1 << 13) + +// WAITCNT +#define WAITCNT_SRAM_4 (0 << 0) +#define WAITCNT_SRAM_3 (1 << 0) +#define WAITCNT_SRAM_2 (2 << 0) +#define WAITCNT_SRAM_8 (3 << 0) +#define WAITCNT_SRAM_MASK (3 << 0) + +#define WAITCNT_WS0_N_4 (0 << 2) +#define WAITCNT_WS0_N_3 (1 << 2) +#define WAITCNT_WS0_N_2 (2 << 2) +#define WAITCNT_WS0_N_8 (3 << 2) +#define WAITCNT_WS0_N_MASK (3 << 2) + +#define WAITCNT_WS0_S_2 (0 << 4) +#define WAITCNT_WS0_S_1 (1 << 4) + +#define WAITCNT_WS1_N_4 (0 << 5) +#define WAITCNT_WS1_N_3 (1 << 5) +#define WAITCNT_WS1_N_2 (2 << 5) +#define WAITCNT_WS1_N_8 (3 << 5) +#define WAITCNT_WS1_N_MASK (3 << 5) + +#define WAITCNT_WS1_S_4 (0 << 7) +#define WAITCNT_WS1_S_1 (1 << 7) + +#define WAITCNT_WS2_N_4 (0 << 8) +#define WAITCNT_WS2_N_3 (1 << 8) +#define WAITCNT_WS2_N_2 (2 << 8) +#define WAITCNT_WS2_N_8 (3 << 8) +#define WAITCNT_WS2_N_MASK (3 << 8) + +#define WAITCNT_WS2_S_8 (0 << 10) +#define WAITCNT_WS2_S_1 (1 << 10) + +#define WAITCNT_PHI_OUT_NONE (0 << 11) +#define WAITCNT_PHI_OUT_4MHZ (1 << 11) +#define WAITCNT_PHI_OUT_8MHZ (2 << 11) +#define WAITCNT_PHI_OUT_16MHZ (3 << 11) +#define WAITCNT_PHI_OUT_MASK (3 << 11) + +#define WAITCNT_PREFETCH_ENABLE (1 << 14) + +#define WAITCNT_AGB (0 << 15) +#define WAITCNT_CGB (1 << 15) + +#endif // GUARD_GBA_IO_REG_H diff --git a/payload/include/gba/isagbprint.h b/payload/include/gba/isagbprint.h new file mode 100644 index 0000000..c5eb456 --- /dev/null +++ b/payload/include/gba/isagbprint.h @@ -0,0 +1,50 @@ +#ifndef GUARD_GBA_ISAGBPRINT_H +#define GUARD_GBA_ISAGBPRINT_H + +#ifdef NDEBUG +#define AGBPrintInit() +#define AGBPutc(cChr) +#define AGBPrint(pBuf) +#define AGBPrintf(pBuf, ...) +#define AGBPrintFlush1Block() +#define AGBPrintFlush() +#define AGBAssert(pFile, nLine, pExpression, nStopProgram) +#else +void AGBPrintInit(void); +void AGBPutc(const char cChr); +void AGBPrint(const char *pBuf); +void AGBPrintf(const char *pBuf, ...); +void AGBPrintFlush1Block(void); +void AGBPrintFlush(void); +void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram); +#endif + +#undef AGB_ASSERT +#ifdef NDEBUG +#define AGB_ASSERT(exp) +#else +#define AGB_ASSERT(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 1); +#endif + +#undef AGB_WARNING +#ifdef NDEBUG +#define AGB_WARNING(exp) +#else +#define AGB_WARNING(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 0); +#endif + +// for matching purposes + +#ifdef NDEBUG +#define AGB_ASSERT_EX(exp, file, line) +#else +#define AGB_ASSERT_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 1); +#endif + +#ifdef NDEBUG +#define AGB_WARNING_EX(exp, file, line) +#else +#define AGB_WARNING_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 0); +#endif + +#endif // GUARD_GBA_ISAGBPRINT_H diff --git a/payload/include/gba/m4a_internal.h b/payload/include/gba/m4a_internal.h new file mode 100644 index 0000000..488ccfb --- /dev/null +++ b/payload/include/gba/m4a_internal.h @@ -0,0 +1,463 @@ +#ifndef GUARD_M4A_INTERNAL_H +#define GUARD_M4A_INTERNAL_H + +#include "gba/gba.h" + +// ASCII encoding of 'Smsh' in reverse +// This is presumably short for SMASH, the developer of MKS4AGB. +#define ID_NUMBER 0x68736D53 + +#define C_V 0x40 // center value for PAN, BEND, and TUNE + +#define SOUND_MODE_REVERB_VAL 0x0000007F +#define SOUND_MODE_REVERB_SET 0x00000080 +#define SOUND_MODE_MAXCHN 0x00000F00 +#define SOUND_MODE_MAXCHN_SHIFT 8 +#define SOUND_MODE_MASVOL 0x0000F000 +#define SOUND_MODE_MASVOL_SHIFT 12 +#define SOUND_MODE_FREQ_05734 0x00010000 +#define SOUND_MODE_FREQ_07884 0x00020000 +#define SOUND_MODE_FREQ_10512 0x00030000 +#define SOUND_MODE_FREQ_13379 0x00040000 +#define SOUND_MODE_FREQ_15768 0x00050000 +#define SOUND_MODE_FREQ_18157 0x00060000 +#define SOUND_MODE_FREQ_21024 0x00070000 +#define SOUND_MODE_FREQ_26758 0x00080000 +#define SOUND_MODE_FREQ_31536 0x00090000 +#define SOUND_MODE_FREQ_36314 0x000A0000 +#define SOUND_MODE_FREQ_40137 0x000B0000 +#define SOUND_MODE_FREQ_42048 0x000C0000 +#define SOUND_MODE_FREQ 0x000F0000 +#define SOUND_MODE_FREQ_SHIFT 16 +#define SOUND_MODE_DA_BIT_9 0x00800000 +#define SOUND_MODE_DA_BIT_8 0x00900000 +#define SOUND_MODE_DA_BIT_7 0x00A00000 +#define SOUND_MODE_DA_BIT_6 0x00B00000 +#define SOUND_MODE_DA_BIT 0x00B00000 +#define SOUND_MODE_DA_BIT_SHIFT 20 + +struct WaveData +{ + u16 type; + u16 status; + u32 freq; + u32 loopStart; + u32 size; // number of samples + s8 data[1]; // samples +}; + +#define TONEDATA_TYPE_CGB 0x07 +#define TONEDATA_TYPE_FIX 0x08 +#define TONEDATA_TYPE_SPL 0x40 // key split +#define TONEDATA_TYPE_RHY 0x80 // rhythm + +#define TONEDATA_P_S_PAN 0xc0 +#define TONEDATA_P_S_PAM TONEDATA_P_S_PAN + +struct ToneData +{ + u8 type; + u8 key; + u8 length; // sound length (compatible sound) + u8 pan_sweep; // pan or sweep (compatible sound ch. 1) + struct WaveData *wav; + u8 attack; + u8 decay; + u8 sustain; + u8 release; +}; + +struct CgbChannel +{ + u8 sf; + u8 ty; + u8 rightVolume; + u8 leftVolume; + u8 at; + u8 de; + u8 su; + u8 re; + u8 ky; + u8 ev; + u8 eg; + u8 ec; + u8 echoVolume; + u8 echoLength; + u8 d1; + u8 d2; + u8 gt; + u8 mk; + u8 ve; + u8 pr; + u8 rp; + u8 d3[3]; + u8 d5; + u8 sg; + u8 n4; + u8 pan; + u8 panMask; + u8 mo; + u8 le; + u8 sw; + u32 fr; + u32* wp; + u32 cp; + u32 tp; + u32 pp; + u32 np; + u8 d4[8]; +}; + +struct MusicPlayerTrack; + +struct SoundChannel +{ + u8 status; + u8 type; + u8 rightVolume; + u8 leftVolume; + u8 attack; + u8 decay; + u8 sustain; + u8 release; + u8 ky; + u8 ev; + u8 er; + u8 el; + u8 echoVolume; + u8 echoLength; + u8 d1; + u8 d2; + u8 gt; + u8 mk; + u8 ve; + u8 pr; + u8 rp; + u8 d3[3]; + u32 ct; + u32 fw; + u32 freq; + struct WaveData *wav; + u32 cp; + struct MusicPlayerTrack *track; + u32 pp; + u32 np; + u32 d4; + u16 xpi; + u16 xpc; +}; + +#define MAX_DIRECTSOUND_CHANNELS 12 + +#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer + +struct SoundInfo +{ + // This field is normally equal to ID_NUMBER but it is set to other + // values during sensitive operations for locking purposes. + // This field should be volatile but isn't. This could potentially cause + // race conditions. + u32 ident; + + vu8 pcmDmaCounter; + + // Direct Sound + u8 reverb; + u8 maxChans; + u8 masterVolume; + u8 freq; + + u8 mode; + u8 c15; + u8 pcmDmaPeriod; // number of V-blanks per PCM DMA + u8 maxLines; + u8 gap[3]; + s32 pcmSamplesPerVBlank; + s32 pcmFreq; + s32 divFreq; + struct CgbChannel *cgbChans; + u32 func; + u32 intp; + void (*CgbSound)(void); + void (*CgbOscOff)(u8); + u32 (*MidiKeyToCgbFreq)(u8, u8, u8); + u32 MPlayJumpTable; + u32 plynote; + u32 ExtVolPit; + u8 gap2[16]; + struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS]; + s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2]; +}; + +struct SongHeader +{ + u8 trackCount; + u8 blockCount; + u8 priority; + u8 reverb; + struct ToneData *tone; + u8 *part[1]; +}; + +struct PokemonCrySong +{ + u8 trackCount; + u8 blockCount; + u8 priority; + u8 reverb; + struct ToneData *tone; + u8 *part[2]; + u8 gap; + u8 part0; // 0x11 + u8 tuneValue; // 0x12 + u8 gotoCmd; // 0x13 + u32 gotoTarget; // 0x14 + u8 part1; // 0x18 + u8 tuneValue2; // 0x19 + u8 cont[2]; // 0x1A + u8 volCmd; // 0x1C + u8 volumeValue; // 0x1D + u8 unkCmd0D[2]; // 0x1E + u32 unkCmd0DParam; // 0x20 + u8 xreleCmd[2]; // 0x24 + u8 releaseValue; // 0x26 + u8 panCmd; + u8 panValue; // 0x28 + u8 tieCmd; // 0x29 + u8 tieKeyValue; // 0x2A + u8 tieVelocityValue; // 0x2B + u8 unkCmd0C[2]; // 0x2C + u16 unkCmd0CParam; // 0x2E + u8 end[2]; // 0x30 +}; + +#define MPT_FLG_VOLSET 0x01 +#define MPT_FLG_VOLCHG 0x03 +#define MPT_FLG_PITSET 0x04 +#define MPT_FLG_PITCHG 0x0C +#define MPT_FLG_START 0x40 +#define MPT_FLG_EXIST 0x80 + +struct MusicPlayerTrack +{ + u8 flags; + u8 wait; + u8 patternLevel; + u8 repN; + u8 gateTime; + u8 key; + u8 velocity; + u8 runningStatus; + u8 keyM; + u8 pitM; + s8 keyShift; + s8 keyShiftX; + s8 tune; + u8 pitX; + s8 bend; + u8 bendRange; + u8 volMR; + u8 volML; + u8 vol; + u8 volX; + s8 pan; + s8 panX; + s8 modM; + u8 mod; + u8 modT; + u8 lfoSpeed; + u8 lfoSpeedC; + u8 lfoDelay; + u8 lfoDelayC; + u8 priority; + u8 echoVolume; + u8 echoLength; + struct SoundChannel *chan; + struct ToneData tone; + u8 gap[10]; + u16 unk_3A; + u32 unk_3C; + u8 *cmdPtr; + u8 *patternStack[3]; +}; + +#define MUSICPLAYER_STATUS_TRACK 0x0000ffff +#define MUSICPLAYER_STATUS_PAUSE 0x80000000 + +#define MAX_MUSICPLAYER_TRACKS 16 + +#define TEMPORARY_FADE 0x0001 +#define FADE_IN 0x0002 +#define FADE_VOL_MAX 64 +#define FADE_VOL_SHIFT 2 + +struct MusicPlayerInfo +{ + struct SongHeader *songHeader; + u32 status; + u8 trackCount; + u8 priority; + u8 cmd; + u8 unk_B; + u32 clock; + u8 gap[8]; + u8 *memAccArea; + u16 tempoD; + u16 tempoU; + u16 tempoI; + u16 tempoC; + u16 fadeOI; + u16 fadeOC; + u16 fadeOV; + struct MusicPlayerTrack *tracks; + struct ToneData *tone; + u32 ident; + u32 func; + u32 intp; +}; + +struct MusicPlayer +{ + struct MusicPlayerInfo *info; + struct MusicPlayerTrack *track; + u8 unk_8; + u16 unk_A; +}; + +struct Song +{ + struct SongHeader *header; + u16 ms; + u16 me; +}; + +extern const struct MusicPlayer gMPlayTable[]; +extern const struct Song gSongTable[]; + + + +extern u8 gMPlayMemAccArea[]; + +//u8 gPokemonCrySong[52]; +//u8 gPokemonCrySongs[52 * MAX_POKEMON_CRIES]; + +#define MAX_POKEMON_CRIES 2 + +extern struct PokemonCrySong gPokemonCrySong; +extern struct PokemonCrySong gPokemonCrySongs[]; + +extern struct MusicPlayerInfo gPokemonCryMusicPlayers[]; +extern struct MusicPlayerTrack gPokemonCryTracks[]; + +extern char SoundMainRAM[]; + +extern void *gMPlayJumpTable[]; + +typedef void (*XcmdFunc)(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +extern const XcmdFunc gXcmdTable[]; + +extern struct CgbChannel gCgbChans[]; + +extern const u8 gScaleTable[]; +extern const u32 gFreqTable[]; +extern const u16 gPcmSamplesPerVBlankTable[]; + +extern const u8 gCgbScaleTable[]; +extern const s16 gCgbFreqTable[]; +extern const u8 gNoiseTable[]; + +extern const struct PokemonCrySong gPokemonCrySongTemplate; + +extern const struct ToneData voicegroup000; + +extern char gNumMusicPlayers[]; +extern char gMaxLines[]; + +#define NUM_MUSIC_PLAYERS ((u16)gNumMusicPlayers) +#define MAX_LINES ((u32)gMaxLines) + +u32 umul3232H32(u32 multiplier, u32 multiplicand); +void SoundMain(void); +void SoundMainBTM(void); +void TrackStop(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track); +void MPlayMain(void); +void RealClearChain(void *x); + +void MPlayContinue(struct MusicPlayerInfo *mplayInfo); +void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader); +void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo); +void FadeOutBody(struct MusicPlayerInfo *mplayInfo); +void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track); +void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed); +void ClearChain(void *x); +void Clear64byte(void *addr); +void SoundInit(struct SoundInfo *soundInfo); +void MPlayExtender(struct CgbChannel *cgbChans); +void m4aSoundMode(u32 mode); +void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track, u8 a3); +void CgbSound(void); +void CgbOscOff(u8); +u32 MidiKeyToCgbFreq(u8, u8, u8); +void DummyFunc(void); +void MPlayJumpTableCopy(void **mplayJumpTable); +void SampleFreqSet(u32 freq); +void m4aSoundVSyncOn(void); +void m4aSoundVSyncOff(void); + +void ClearModM(struct MusicPlayerTrack *track); +void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth); +void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed); + +struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone); +void SetPokemonCryVolume(u8 val); +void SetPokemonCryPanpot(s8 val); +void SetPokemonCryPitch(s16 val); +void SetPokemonCryLength(u16 val); +void SetPokemonCryRelease(u8 val); +void SetPokemonCryProgress(u32 val); +int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo); +void SetPokemonCryChorus(s8 val); +void SetPokemonCryStereo(u32 val); +void SetPokemonCryPriority(u8 val); + +// sound command handler functions +void ply_fine(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_goto(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_patt(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_pend(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_rept(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_memacc(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_prio(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_tempo(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_keysh(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_voice(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_vol(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_pan(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_bend(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_bendr(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_lfos(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_lfodl(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_mod(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_modt(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *); + +// extended sound command handler functions +void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xwave(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xtype(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xatta(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xdeca(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xsust(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xrele(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xiecv(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xiecl(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xleng(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xswee(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xcmd_0C(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xcmd_0D(struct MusicPlayerInfo *, struct MusicPlayerTrack *); + +#endif // GUARD_M4A_INTERNAL_H diff --git a/payload/include/gba/macro.h b/payload/include/gba/macro.h new file mode 100644 index 0000000..ab42c9d --- /dev/null +++ b/payload/include/gba/macro.h @@ -0,0 +1,223 @@ +#ifndef GUARD_GBA_MACRO_H +#define GUARD_GBA_MACRO_H + +#define CPU_FILL(value, dest, size, bit) \ +{ \ + vu##bit tmp = (vu##bit)(value); \ + CpuSet((void *)&tmp, \ + dest, \ + CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size)/(bit/8) & 0x1FFFFF)); \ +} + +#define CpuFill16(value, dest, size) CPU_FILL(value, dest, size, 16) +#define CpuFill32(value, dest, size) CPU_FILL(value, dest, size, 32) + +#define CPU_COPY(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size)/(bit/8) & 0x1FFFFF)) + +#define CpuCopy16(src, dest, size) CPU_COPY(src, dest, size, 16) +#define CpuCopy32(src, dest, size) CPU_COPY(src, dest, size, 32) + +#define CpuFastFill(value, dest, size) \ +{ \ + vu32 tmp = (vu32)(value); \ + CpuFastSet((void *)&tmp, \ + dest, \ + CPU_FAST_SET_SRC_FIXED | ((size)/(32/8) & 0x1FFFFF)); \ +} + +#define CpuFastFill16(value, dest, size) CpuFastFill(((value) << 16) | (value), (dest), (size)) + +#define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF)) + +#define DmaSet(dmaNum, src, dest, control) \ +{ \ + vu32 *dmaRegs = (vu32 *)REG_ADDR_DMA##dmaNum; \ + dmaRegs[0] = (vu32)(src); \ + dmaRegs[1] = (vu32)(dest); \ + dmaRegs[2] = (vu32)(control); \ + dmaRegs[2]; \ +} + +#define DMA_FILL(dmaNum, value, dest, size, bit) \ +{ \ + vu##bit tmp = (vu##bit)(value); \ + DmaSet(dmaNum, \ + &tmp, \ + dest, \ + (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_FIXED | DMA_DEST_INC) << 16 \ + | ((size)/(bit/8))); \ +} + +#define DmaFill16(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 16) +#define DmaFill32(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 32) + +// Note that the DMA clear macros cause the DMA control value to be calculated +// at runtime rather than compile time. The size is divided by the DMA transfer +// unit size (2 or 4 bytes) and then combined with the DMA control flags using a +// bitwise OR operation. + +#define DMA_CLEAR(dmaNum, dest, size, bit) \ +{ \ + vu##bit *_dest = (vu##bit *)(dest); \ + u32 _size = size; \ + DmaFill##bit(dmaNum, 0, _dest, _size); \ +} + +#define DmaClear16(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 16) +#define DmaClear32(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 32) + +#define DMA_COPY(dmaNum, src, dest, size, bit) \ + DmaSet(dmaNum, \ + src, \ + dest, \ + (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 \ + | ((size)/(bit/8))) + +#define DmaCopy16(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 16) +#define DmaCopy32(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 32) + +#define DmaStop(dmaNum) \ +{ \ + vu16 *dmaRegs = (vu16 *)REG_ADDR_DMA##dmaNum; \ + dmaRegs[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT); \ + dmaRegs[5] &= ~DMA_ENABLE; \ + dmaRegs[5]; \ +} + +#define DmaCopyLarge(dmaNum, src, dest, size, block, bit) \ +{ \ + const void *_src = src; \ + void *_dest = (void *)(dest); \ + u32 _size = size; \ + while (1) \ + { \ + DmaCopy##bit(dmaNum, _src, _dest, (block)); \ + _src += (block); \ + _dest += (block); \ + _size -= (block); \ + if (_size <= (block)) \ + { \ + DmaCopy##bit(dmaNum, _src, _dest, _size); \ + break; \ + } \ + } \ +} + +#define DmaClearLarge(dmaNum, dest, size, block, bit) \ +{ \ + void *_dest = dest; \ + u32 _size = size; \ + while (1) \ + { \ + DmaFill##bit(dmaNum, 0, _dest, (block)); \ + _dest += (block); \ + _size -= (block); \ + if (_size <= (block)) \ + { \ + DmaFill##bit(dmaNum, 0, _dest, _size); \ + break; \ + } \ + } \ +} + +#define DmaCopyLarge16(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 16) +#define DmaCopyLarge32(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 32) + +#define DmaClearLarge16(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 16) +#define DmaClearLarge32(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 32) + +#define DmaCopyDefvars(dmaNum, src, dest, size, bit) \ +{ \ + const void *_src = src; \ + void *_dest = (void *)(dest); \ + u32 _size = size; \ + DmaCopy##bit(dmaNum, _src, _dest, _size); \ +} + +#define DmaCopy16Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 16) +#define DmaCopy32Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 32) + +#define DmaFillLarge(dmaNum, fillval, dest, size, block, bit) \ +{ \ + void *_dest = (void *)(dest); \ + u32 _size = (u32)(size); \ + while (1) \ + { \ + DmaFill##bit(dmaNum, fillval, _dest, (block)); \ + _dest += (block); \ + _size -= (block); \ + if (_size <= (block)) \ + { \ + DmaFill##bit(dmaNum, fillval, _dest, _size); \ + break; \ + } \ + } \ +} + +#define DmaFill16Large(dmaNum, fillval, dest, size, block) DmaFillLarge(dmaNum, fillval, dest, size, block, 16) +#define DmaFill32Large(dmaNum, fillval, dest, size, block) DmaFillLarge(dmaNum, fillval, dest, size, block, 32) + +#define DmaFillDefvars(dmaNum, fillval, dest, size, bit) \ +{ \ + void *_dest = (void *)(dest); \ + u32 _size = (u##bit)(size); \ + DmaFill##bit(dmaNum, fillval, _dest, _size); \ +} + +#define DmaFill16Defvars(dmaNum, fillval, dest, size) DmaFillDefvars(dmaNum, fillval, dest, size, 16) +#define DmaFill32Defvars(dmaNum, fillval, dest, size) DmaFillDefvars(dmaNum, fillval, dest, size, 32) + +// from pokeemerald +// Maximum amount of data we will transfer in one operation +#define MAX_DMA_BLOCK_SIZE 0x1000 + +#define MAX_DMA_REQUESTS 128 + +#define DMA_REQUEST_COPY32 1 +#define DMA_REQUEST_FILL32 2 +#define DMA_REQUEST_COPY16 3 +#define DMA_REQUEST_FILL16 4 + +#define Dma3CopyLarge_(src, dest, size, bit) \ +{ \ + const void *_src = src; \ + void *_dest = dest; \ + u32 _size = size; \ + while (1) \ + { \ + if (_size <= MAX_DMA_BLOCK_SIZE) \ + { \ + DmaCopy##bit(3, _src, _dest, _size); \ + break; \ + } \ + DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \ + _src += MAX_DMA_BLOCK_SIZE; \ + _dest += MAX_DMA_BLOCK_SIZE; \ + _size -= MAX_DMA_BLOCK_SIZE; \ + } \ +} + +#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16) +#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32) + +#define Dma3FillLarge_(value, dest, size, bit) \ +{ \ + void *_dest = dest; \ + u32 _size = size; \ + while (1) \ + { \ + if (_size <= MAX_DMA_BLOCK_SIZE) \ + { \ + DmaFill##bit(3, value, _dest, _size); \ + break; \ + } \ + DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \ + _dest += MAX_DMA_BLOCK_SIZE; \ + _size -= MAX_DMA_BLOCK_SIZE; \ + } \ +} + +#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16) +#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32) + +#endif // GUARD_GBA_MACRO_H diff --git a/payload/include/gba/multiboot.h b/payload/include/gba/multiboot.h new file mode 100644 index 0000000..e88b43a --- /dev/null +++ b/payload/include/gba/multiboot.h @@ -0,0 +1,55 @@ +#ifndef GUARD_GBA_MULTIBOOT_H +#define GUARD_GBA_MULTIBOOT_H + +#define MULTIBOOT_NCHILD 3 // Maximum number of slaves +#define MULTIBOOT_HEADER_SIZE 0xc0 // Header size +#define MULTIBOOT_SEND_SIZE_MIN 0x100 // Minimum transmission size +#define MULTIBOOT_SEND_SIZE_MAX 0x40000 // Maximum transmission size + +struct MultiBootParam +{ + u32 system_work[5]; + u8 handshake_data; + u8 padding; + u16 handshake_timeout; + u8 probe_count; + u8 client_data[MULTIBOOT_NCHILD]; + u8 palette_data; + u8 response_bit; + u8 client_bit; + u8 reserved1; + u8 *boot_srcp; + u8 *boot_endp; + u8 *masterp; + u8 *reserved2[MULTIBOOT_NCHILD]; + u32 system_work2[4]; + u8 sendflag; + u8 probe_target_bit; + u8 check_wait; + u8 server_type; +}; + +#define MULTIBOOT_ERROR_04 0x04 +#define MULTIBOOT_ERROR_08 0x08 +#define MULTIBOOT_ERROR_0c 0x0c +#define MULTIBOOT_ERROR_40 0x40 +#define MULTIBOOT_ERROR_44 0x44 +#define MULTIBOOT_ERROR_48 0x48 +#define MULTIBOOT_ERROR_4c 0x4c +#define MULTIBOOT_ERROR_80 0x80 +#define MULTIBOOT_ERROR_84 0x84 +#define MULTIBOOT_ERROR_88 0x88 +#define MULTIBOOT_ERROR_8c 0x8c +#define MULTIBOOT_ERROR_NO_PROBE_TARGET 0x50 +#define MULTIBOOT_ERROR_NO_DLREADY 0x60 +#define MULTIBOOT_ERROR_BOOT_FAILURE 0x70 +#define MULTIBOOT_ERROR_HANDSHAKE_FAILURE 0x71 + +#define MULTIBOOT_CONNECTION_CHECK_WAIT 15 + +#define MULTIBOOT_SERVER_TYPE_NORMAL 0 +#define MULTIBOOT_SERVER_TYPE_QUICK 1 + +#define MULTIBOOT_HANDSHAKE_TIMEOUT 400 + +#endif // GUARD_GBA_MULTIBOOT_H diff --git a/payload/include/gba/syscall.h b/payload/include/gba/syscall.h new file mode 100644 index 0000000..70bd1f4 --- /dev/null +++ b/payload/include/gba/syscall.h @@ -0,0 +1,53 @@ +#ifndef GUARD_GBA_SYSCALL_H +#define GUARD_GBA_SYSCALL_H + +#define RESET_EWRAM 0x01 +#define RESET_IWRAM 0x02 +#define RESET_PALETTE 0x04 +#define RESET_VRAM 0x08 +#define RESET_OAM 0x10 +#define RESET_SIO_REGS 0x20 +#define RESET_SOUND_REGS 0x40 +#define RESET_REGS 0x80 +#define RESET_ALL 0xFF + +void SoftReset(u32 resetFlags); + +void RegisterRamReset(u32 resetFlags); + +void VBlankIntrWait(void); + +u16 Sqrt(u32 num); + +u16 ArcTan2(s16 x, s16 y); + +#define CPU_SET_SRC_FIXED 0x01000000 +#define CPU_SET_16BIT 0x00000000 +#define CPU_SET_32BIT 0x04000000 + +void CpuSet(const void *src, void *dest, u32 control); + +#define CPU_FAST_SET_SRC_FIXED 0x01000000 + +void CpuFastSet(const void *src, void *dest, u32 control); + +void BgAffineSet(struct BgAffineSrcData *src, struct BgAffineDstData *dest, s32 count); + +void ObjAffineSet(struct ObjAffineSrcData *src, void *dest, s32 count, s32 offset); + +void LZ77UnCompWram(const void *src, void *dest); + +void LZ77UnCompVram(const void *src, void *dest); + +void RLUnCompWram(const void *src, void *dest); + +void RLUnCompVram(const void *src, void *dest); + +void HuffUnComp(const void *src, void *dest); + +int MultiBoot(struct MultiBootParam *mp); + +int Div(int dividend, int divisor); +int Mod(int dividend, int divisor); + +#endif // GUARD_GBA_SYSCALL_H diff --git a/payload/include/gba/types.h b/payload/include/gba/types.h new file mode 100644 index 0000000..4d6c24a --- /dev/null +++ b/payload/include/gba/types.h @@ -0,0 +1,142 @@ +#ifndef GUARD_GBA_TYPES_H +#define GUARD_GBA_TYPES_H + +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; + +typedef volatile u8 vu8; +typedef volatile u16 vu16; +typedef volatile u32 vu32; +typedef volatile u64 vu64; +typedef volatile s8 vs8; +typedef volatile s16 vs16; +typedef volatile s32 vs32; +typedef volatile s64 vs64; + +typedef float f32; +typedef double f64; + +typedef u8 bool8; +typedef u16 bool16; +typedef u32 bool32; + +struct BgCnt +{ + u16 priority:2; + u16 charBaseBlock:2; + u16 dummy:2; + u16 mosaic:1; + u16 palettes:1; + u16 screenBaseBlock:5; + u16 areaOverflowMode:1; + u16 screenSize:2; +}; +typedef volatile struct BgCnt vBgCnt; + +struct PlttData +{ + u16 r:5; // red + u16 g:5; // green + u16 b:5; // blue + u16 unused_15:1; +} /*__attribute__((packed))*/; + +struct OamData +{ + /*0x00*/ u32 y:8; + /*0x01*/ u32 affineMode:2; // 0x1, 0x2 = 0x3 + u32 objMode:2; // 0x4, 0x8 = 0xC + u32 mosaic:1; // 0x10 + u32 bpp:1; // 0x20 + u32 shape:2; // 0x40, 0x80 + + /*0x02*/ u32 x:9; + u32 matrixNum:5; // bits 3/4 are h-flip/v-flip if not in affine mode + u32 size:2; + + /*0x04*/ u16 tileNum:10; + u16 priority:2; + u16 paletteNum:4; + /*0x06*/ u16 affineParam; +}; + +#define ST_OAM_OBJ_NORMAL 0 +#define ST_OAM_OBJ_BLEND 1 +#define ST_OAM_OBJ_WINDOW 2 + +#define ST_OAM_AFFINE_OFF 0 +#define ST_OAM_AFFINE_NORMAL 1 +#define ST_OAM_AFFINE_ERASE 2 +#define ST_OAM_AFFINE_DOUBLE 3 + +#define ST_OAM_AFFINE_ON_MASK 1 +#define ST_OAM_AFFINE_DOUBLE_MASK 2 + +#define ST_OAM_4BPP 0 +#define ST_OAM_8BPP 1 + +#define ST_OAM_SQUARE 0 +#define ST_OAM_H_RECTANGLE 1 +#define ST_OAM_V_RECTANGLE 2 + +struct BgAffineSrcData +{ + s32 texX; + s32 texY; + s16 scrX; + s16 scrY; + s16 sx; + s16 sy; + u16 alpha; +}; + +struct BgAffineDstData +{ + s16 pa; + s16 pb; + s16 pc; + s16 pd; + s32 dx; + s32 dy; +}; + +struct ObjAffineSrcData +{ + s16 xScale; + s16 yScale; + u16 rotation; +}; + +// Multi-player SIO Control Structure +struct SioMultiCnt +{ + u16 baudRate:2; // baud rate + u16 si:1; // SI terminal + u16 sd:1; // SD terminal + u16 id:2; // ID + u16 error:1; // error flag + u16 enable:1; // SIO enable + u16 unused_11_8:4; + u16 mode:2; // communication mode (should equal 2) + u16 intrEnable:1; // IRQ enable + u16 unused_15:1; + u16 data; // data +}; + +#define ST_SIO_MULTI_MODE 2 // Multi-player communication mode + +// baud rate +#define ST_SIO_9600_BPS 0 // 9600 bps +#define ST_SIO_38400_BPS 1 // 38400 bps +#define ST_SIO_57600_BPS 2 // 57600 bps +#define ST_SIO_115200_BPS 3 // 115200 bps + +#endif // GUARD_GBA_TYPES_H diff --git a/include/global.berry.h b/payload/include/global.berry.h similarity index 100% rename from include/global.berry.h rename to payload/include/global.berry.h diff --git a/include/global.fieldmap.h b/payload/include/global.fieldmap.h similarity index 100% rename from include/global.fieldmap.h rename to payload/include/global.fieldmap.h diff --git a/include/global.h b/payload/include/global.h similarity index 100% rename from include/global.h rename to payload/include/global.h diff --git a/include/m4a.h b/payload/include/m4a.h similarity index 100% rename from include/m4a.h rename to payload/include/m4a.h diff --git a/include/pokemon.h b/payload/include/pokemon.h similarity index 100% rename from include/pokemon.h rename to payload/include/pokemon.h diff --git a/include/siirtc.h b/payload/include/siirtc.h similarity index 100% rename from include/siirtc.h rename to payload/include/siirtc.h diff --git a/ld_script.sed b/payload/ld_script.sed similarity index 100% rename from ld_script.sed rename to payload/ld_script.sed diff --git a/payload/ld_script.txt b/payload/ld_script.txt new file mode 100644 index 0000000..4df0350 --- /dev/null +++ b/payload/ld_script.txt @@ -0,0 +1,53 @@ +SECTIONS { + . = 0x02000000; + .text : + ALIGN(4) + { + asm/crt0.o(.text); + asm/all.o(.text); + asm/m4a.o(.text); + src/main.o(.text); + asm/main.o(.text); + src/main.o(.text.020092C0); + asm/main.o(.text.020092F0); + src/unk_200E344.o(.text); + asm/unk_200E344.o(.text); + src/siirtc.o(.text); + asm/libagbsyscall.o(.text); + *libgcc.a:_call_via_rX.o(.text); + *libgcc.a:_divsi3.o(.text); + *libgcc.a:_dvmd_tls.o(.text); + *libgcc.a:_modsi3.o(.text); + *libgcc.a:_umodsi3.o(.text); + *libc.a:memcpy.o(.text); + } =0 + .rodata : + ALIGN(4) + { + data/all.o(.rodata); + data/m4a.o(.rodata); + data/main.o(.rodata); + src/unk_200E344.o(.rodata); + data/all.o(.data); + data/main.o(.data); + } =0 + ewram_start = .; + wram (NOLOAD) : + ALIGN(4) + { + + + } + ewram_end = .; + wram_extra (NOLOAD) : + ALIGN(4) + { + gUnknown_0202526C = .; + } + . = 0x080000C6; + GPIOPortDirection = .; + /DISCARD/ : + { + *(*); + } +} diff --git a/payload/rom.sha1 b/payload/rom.sha1 new file mode 100644 index 0000000..c307c4c --- /dev/null +++ b/payload/rom.sha1 @@ -0,0 +1 @@ +24d4b01fb2970f89fff487b9192812f3370a5be0 payload.gba diff --git a/payload/src/main.c b/payload/src/main.c new file mode 100644 index 0000000..11b8c77 --- /dev/null +++ b/payload/src/main.c @@ -0,0 +1,361 @@ +#include "global.h" +#include "m4a.h" + +struct RomInfo +{ + /*0x00*/ int gameVersion; + /*0x04*/ int gameLanguage; + /*0x08*/ char gameTitle[32]; + /*0x28*/ const struct CompressedSpriteSheet *monFrontPicTable; + /*0x2C*/ const struct CompressedSpriteSheet * monBackPicTable; + /*0x30*/ const struct CompressedSpritePalette *monPaletteTable; + /*0x34*/ const struct CompressedSpritePalette *monShinyPaletteTable; + /*0x38*/ const u8 *const *monIconTable; + /*0x3C*/ const u8 *gMonIconPaletteIndices; + /*0x40*/ const struct SpritePalette *monIconPaletteTable; + /*0x44*/ const u8 *speciesNames; + /*0x48*/ const u8 *moveNames; + /*0x4C*/ const struct Decoration *decorations; + /*0x50*/ ptrdiff_t unk50; + /*0x54*/ ptrdiff_t unk54; + /*0x58*/ ptrdiff_t unk58; + /*0x5C*/ ptrdiff_t unk5C; + /*0x60*/ ptrdiff_t unk60; + /*0x64*/ ptrdiff_t unk64; + /*0x68*/ ptrdiff_t unk68; + /*0x6C*/ ptrdiff_t unk6C; + /*0x70*/ ptrdiff_t unk70; + /*0x74*/ u8 unk74[16]; + /*0x84*/ ptrdiff_t unk84; + /*0x88*/ ptrdiff_t unk88; + /*0x8C*/ ptrdiff_t unk8C; + /*0x90*/ ptrdiff_t unk90; + /*0x94*/ ptrdiff_t unk94; + /*0x98*/ ptrdiff_t unk98; + /*0x9C*/ ptrdiff_t unk9C; + /*0xA0*/ ptrdiff_t unkA0; + /*0xA4*/ ptrdiff_t unkA4; + /*0xA8*/ ptrdiff_t unkA8; + /*0xAC*/ ptrdiff_t unkAC; + /*0xB0*/ ptrdiff_t unkB0; + /*0xB4*/ ptrdiff_t unkB4; + /*0xB8*/ ptrdiff_t unkB8; + /*0xBC*/ const struct BaseStats *baseStats; + /*0xC0*/ const u8 *abilityNames; + /*0xC4*/ const u8 *abilityDescriptions; + /*0xC8*/ const struct Item *items; + /*0xCC*/ const struct BattleMove *unkCC; + /*0xD0*/ const struct CompressedSpriteSheet *ballSpriteSheets; + /*0xD4*/ const struct CompressedSpritePalette *ballSpritePalettes; + /*0xD8*/ ptrdiff_t unkD8; + /*0xDC*/ ptrdiff_t unkDC; + /*0xE0*/ ptrdiff_t unkE0; + /*0xE4*/ ptrdiff_t unkE4; + /*0xE8*/ ptrdiff_t unkE8; + /*0xEC*/ ptrdiff_t unkEC; + /*0xF0*/ ptrdiff_t unkF0; + /*0xF4*/ ptrdiff_t unkF4; + /*0xF8*/ ptrdiff_t unkF8; + /*0xFC*/ const u8 *moveDescriptions; +}; + +struct UnkStruct_02020CD0 +{ + u8 unk0; + u8 unk1; + u8 unk2; + u16 unk4; + u16 unk6; + u16 unk8; + u16 unkA; + u32 unkC; + void (*unk10)(struct UnkStruct_02020CD0 *); + void * unk14[4]; +}; + +extern u8 ewram_start[]; +extern struct UnkStruct_02020CD0 gUnknown_02020CD0[18]; +extern void (*gUnknown_02022BD0[])(void); +extern u32 gUnknown_02022C08; +extern void (*gUnknown_02022C0C)(void); +extern u16 gUnknown_02022C10[4]; +extern u16 gUnknown_02022C18[4]; +extern u8 gUnknown_02022C20[4]; +extern u16 gUnknown_02022EB8; +extern struct RomInfo *gUnknown_020251E8; +extern u8 ewram_end[]; + +void sub_02008638(void); +void sub_020086B8(void); +void sub_02008708(void); +void sub_0200870C(void); +void sub_020087B4(void); +void sub_02008C00(void); +void sub_02008C80(void); +void sub_02008D1C(void); +void sub_02009228(void); +bool32 sub_02009324(u8); + +extern void sub_020002B4(void); + +#define SR_KEYS (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON) + +#define TEST_BUTTON(arr, flags) ({(arr) & (flags);}) + +void AgbMain(void) +{ + REG_IME = 0; + RegisterRamReset(RESET_ALL & ~(RESET_EWRAM | RESET_IWRAM)); + CpuFill16(0, ewram_start, ewram_end - ewram_start); + REG_WAITCNT = WAITCNT_SRAM_4 | WAITCNT_WS0_N_3 | WAITCNT_WS0_S_1 | WAITCNT_WS1_N_3 | WAITCNT_WS1_S_1 | WAITCNT_WS2_N_3 | WAITCNT_WS2_S_1 | WAITCNT_PREFETCH_ENABLE; + sub_02008638(); + sub_020087B4(); + sub_02008C80(); + sub_020002B4(); + SoftReset(RESET_ALL); +} + +u32 sub_020085F4(void) +{ + return gUnknown_02022C08; +} + +void sub_02008600(u32 a0) +{ + for (; a0 != 0; a0--) + { + sub_02008C00(); + VBlankIntrWait(); + sub_02009228(); + if (TEST_BUTTON(gUnknown_02022EB8, SR_KEYS) == SR_KEYS) + SoftReset(0); + } +} + +void sub_02008638(void) +{ + int i; + gUnknown_02022C0C = NULL; + for (i = 0; i < 14u; i++) + gUnknown_02022BD0[i] = sub_02008708; + if (sub_020086B8 != NULL) + gUnknown_02022BD0[1] = sub_020086B8; + else + gUnknown_02022BD0[1] = sub_02008708; +} + +void sub_02008674(int i, void (*func)(void)) +{ + if (func != NULL) + gUnknown_02022BD0[i] = func; + else + gUnknown_02022BD0[i] = sub_02008708; +} + +void sub_020086A0(void (*a0)(void)) +{ + u16 imeBak = REG_IME; + REG_IME = 0; + gUnknown_02022C0C = a0; + REG_IME = imeBak; +} + +void sub_020086B8(void) +{ + if (sub_02009324(0)) + m4aSoundVSync(); + sub_02008D1C(); + sub_0200870C(); + gUnknown_02022C08++; + INTR_CHECK = TRUE; + if (gUnknown_02022C0C != NULL) + gUnknown_02022C0C(); + if (sub_02009324(1)) + m4aSoundMain(); +} + +void sub_02008708(void) +{ + +} + +void sub_0200870C(void) +{ + s32 i; + u16 bgCnt; + void * screenBase; + size_t size; + s32 r2; + REG_BG0HOFS = gUnknown_02022C10[0]; + REG_BG1HOFS = gUnknown_02022C10[1]; + REG_BG2HOFS = gUnknown_02022C10[2]; + REG_BG3HOFS = gUnknown_02022C10[3]; + REG_BG0VOFS = gUnknown_02022C18[0]; + REG_BG1VOFS = gUnknown_02022C18[1]; + REG_BG2VOFS = gUnknown_02022C18[2]; + REG_BG3VOFS = gUnknown_02022C18[3]; + for (i = 0; i < 4; i++) + { + if (gUnknown_02022C20[i]) + { + gUnknown_02022C20[i] = 0; + bgCnt = *(vu16 *)(REG_ADDR_BG0CNT + 2 * i); + screenBase = (void *)(BG_VRAM + ((bgCnt & 0x1F00) << 3)); + r2 = bgCnt & 0xC000 ? 2 : 1; + CpuCopy32((void *)(0x03000000 + 0x1000 * i), screenBase, r2 * 0x800); + } + } +} + +void sub_020087B4(void) +{ + CpuFill16(0, (void *)0x03000000, 0x4000); + CpuFill16(0, gUnknown_02022C10, 8); + CpuFill16(0, gUnknown_02022C18, 8); + gUnknown_02022C20[3] = 0; + gUnknown_02022C20[2] = 0; + gUnknown_02022C20[1] = 0; + gUnknown_02022C20[0] = 0; +} + +void sub_0200880C(int bgNum, int left, int top, int width, int height, const u16 * src) +{ + int x; + u16 * ptr = (void *)(0x03000000 + (bgNum << 12) + (top << 6) + (left << 1)); + + while (height) + { + for (x = 0; x < width; x++, src++) + { + ptr[x] = *src; + } + ptr += 32; + height--; + } +} + +void sub_02008850(int bgNum, int left, int top, int width, int height, u16 * dest) +{ + int x; + u16 * ptr = (void *)(0x03000000 + (bgNum << 12) + (top << 6) + (left << 1)); + + while (height) + { + for (x = 0; x < width; x++, dest++) + { + *dest = ptr[x]; + } + ptr += 32; + height--; + } +} + +void sub_02008894(int bgNum, int left, int top, int width, int height, int paletteNum) +{ + int x; + u16 * ptr = (void *)(0x03000000 + (bgNum << 12) + (top << 6) + (left << 1)); + + while (height) + { + for (x = 0; x < width; x++) + { + ptr[x] &= 0xFFF; + ptr[x] |= paletteNum << 12; + } + ptr += 32; + height--; + } +} + +void sub_020088E8(int bgNum, int x, int y, u16 tileNum) +{ + u16 * ptr = (void *)(0x03000000 + (bgNum << 12) + (y << 6) + (x << 1)); + *ptr = tileNum; +} + +void sub_02008904(int bgNum, int left, int top, int width, int height,u16 tileNum) +{ + int x; + u16 * ptr = (void *)(0x03000000 + (bgNum << 12) + (top << 6) + (left << 1)); + + while (height) + { + for (x = 0; x < width; x++) + { + ptr[x] = tileNum; + } + ptr += 32; + height--; + } +} + +void sub_02008948(int bgNum, int srcLeft, int srcTop, int width, int height, int destLeft, int destTop) +{ + int x; + const u16 * srcPtr; + u16 * destPtr; + + srcPtr = (void *)(0x03000000 + (bgNum << 12) + (srcTop << 6) + (srcLeft << 1)); + destPtr = (void *)(0x03000000 + (bgNum << 12) + (destTop << 6) + (destLeft << 1)); + + while (height) + { + for (x = 0; x < width; x++) + { + destPtr[x] = srcPtr[x]; + } + srcPtr += 32; + destPtr += 32; + height--; + } +} + +void sub_020089A4(int bgNum, u16 x, u16 y) +{ + gUnknown_02022C10[bgNum] = x; + gUnknown_02022C18[bgNum] = y; +} + +void sub_020089BC(struct UnkStruct_02020CD0 * a0, struct UnkStruct_02020CD0 * a1) +{ + a1->unk1 = a0->unk1; + a1->unk0 = a0 - gUnknown_02020CD0; + a0->unk1 = gUnknown_02020CD0[a0->unk1].unk0 = a1 - gUnknown_02020CD0; +} + +struct UnkStruct_02020CD0 * sub_02008A10(s32 a, s32 b, s32 c) +{ + s32 i; + struct UnkStruct_02020CD0 * r7 = &gUnknown_02020CD0[gUnknown_02020CD0[0].unk1]; + gUnknown_02020CD0[r7->unk0].unk1 = r7->unk1; + gUnknown_02020CD0[r7->unk1].unk0 = r7->unk0; + sub_020089BC(&gUnknown_02020CD0[1], r7); + r7->unk8 = a; + r7->unkA = b; + r7->unkC = c; + r7->unk2 = 0; + r7->unk4 = 0; + r7->unk6 = 0; + r7->unk10 = NULL; + for (i = 0; i < 4; i++) + r7->unk14[i] = NULL; + return r7; +} + +asm(".section .text.020092C0"); + +void AutoUnCompVram(const void * src, void * dest) +{ + switch (*(u8 *)src & 0xF0) + { + case 0x10: + LZ77UnCompVram(src, dest); + break; + case 0x20: + HuffUnComp(src, dest); + break; + case 0x30: + RLUnCompVram(src, dest); + break; + } +} diff --git a/src/siirtc.c b/payload/src/siirtc.c similarity index 100% rename from src/siirtc.c rename to payload/src/siirtc.c diff --git a/src/unk_200E344.c b/payload/src/unk_200E344.c similarity index 100% rename from src/unk_200E344.c rename to payload/src/unk_200E344.c diff --git a/sym_bss.txt b/payload/sym_bss.txt similarity index 100% rename from sym_bss.txt rename to payload/sym_bss.txt diff --git a/sym_common.txt b/payload/sym_common.txt similarity index 100% rename from sym_common.txt rename to payload/sym_common.txt diff --git a/sym_ewram.txt b/payload/sym_ewram.txt similarity index 100% rename from sym_ewram.txt rename to payload/sym_ewram.txt diff --git a/rom.sha1 b/rom.sha1 index c307c4c..a55039e 100644 --- a/rom.sha1 +++ b/rom.sha1 @@ -1 +1 @@ -24d4b01fb2970f89fff487b9192812f3370a5be0 payload.gba +6cf444e998c39b74046c9715f3a07033b3262d12 colosseum-mb.gba diff --git a/src/main.c b/src/main.c index 11b8c77..779051b 100644 --- a/src/main.c +++ b/src/main.c @@ -1,361 +1,27 @@ -#include "global.h" -#include "m4a.h" +#include "gba/gba.h" -struct RomInfo +extern u8 arm_LZ77UnCompWRAM_Buffer[]; +extern u8 arm_LZ77UnCompWRAM_BufferEnd[]; +extern u8 arm_LZ77UnCompWRAM_FuncStart[]; + +typedef void (*IntrFunc)(void); + +const IntrFunc gIntrTableTemplate[14] = {}; + +void arm_LZ77UnCompWRAM(void); + +void sub_0200023C(void) { - /*0x00*/ int gameVersion; - /*0x04*/ int gameLanguage; - /*0x08*/ char gameTitle[32]; - /*0x28*/ const struct CompressedSpriteSheet *monFrontPicTable; - /*0x2C*/ const struct CompressedSpriteSheet * monBackPicTable; - /*0x30*/ const struct CompressedSpritePalette *monPaletteTable; - /*0x34*/ const struct CompressedSpritePalette *monShinyPaletteTable; - /*0x38*/ const u8 *const *monIconTable; - /*0x3C*/ const u8 *gMonIconPaletteIndices; - /*0x40*/ const struct SpritePalette *monIconPaletteTable; - /*0x44*/ const u8 *speciesNames; - /*0x48*/ const u8 *moveNames; - /*0x4C*/ const struct Decoration *decorations; - /*0x50*/ ptrdiff_t unk50; - /*0x54*/ ptrdiff_t unk54; - /*0x58*/ ptrdiff_t unk58; - /*0x5C*/ ptrdiff_t unk5C; - /*0x60*/ ptrdiff_t unk60; - /*0x64*/ ptrdiff_t unk64; - /*0x68*/ ptrdiff_t unk68; - /*0x6C*/ ptrdiff_t unk6C; - /*0x70*/ ptrdiff_t unk70; - /*0x74*/ u8 unk74[16]; - /*0x84*/ ptrdiff_t unk84; - /*0x88*/ ptrdiff_t unk88; - /*0x8C*/ ptrdiff_t unk8C; - /*0x90*/ ptrdiff_t unk90; - /*0x94*/ ptrdiff_t unk94; - /*0x98*/ ptrdiff_t unk98; - /*0x9C*/ ptrdiff_t unk9C; - /*0xA0*/ ptrdiff_t unkA0; - /*0xA4*/ ptrdiff_t unkA4; - /*0xA8*/ ptrdiff_t unkA8; - /*0xAC*/ ptrdiff_t unkAC; - /*0xB0*/ ptrdiff_t unkB0; - /*0xB4*/ ptrdiff_t unkB4; - /*0xB8*/ ptrdiff_t unkB8; - /*0xBC*/ const struct BaseStats *baseStats; - /*0xC0*/ const u8 *abilityNames; - /*0xC4*/ const u8 *abilityDescriptions; - /*0xC8*/ const struct Item *items; - /*0xCC*/ const struct BattleMove *unkCC; - /*0xD0*/ const struct CompressedSpriteSheet *ballSpriteSheets; - /*0xD4*/ const struct CompressedSpritePalette *ballSpritePalettes; - /*0xD8*/ ptrdiff_t unkD8; - /*0xDC*/ ptrdiff_t unkDC; - /*0xE0*/ ptrdiff_t unkE0; - /*0xE4*/ ptrdiff_t unkE4; - /*0xE8*/ ptrdiff_t unkE8; - /*0xEC*/ ptrdiff_t unkEC; - /*0xF0*/ ptrdiff_t unkF0; - /*0xF4*/ ptrdiff_t unkF4; - /*0xF8*/ ptrdiff_t unkF8; - /*0xFC*/ const u8 *moveDescriptions; -}; -struct UnkStruct_02020CD0 -{ - u8 unk0; - u8 unk1; - u8 unk2; - u16 unk4; - u16 unk6; - u16 unk8; - u16 unkA; - u32 unkC; - void (*unk10)(struct UnkStruct_02020CD0 *); - void * unk14[4]; -}; - -extern u8 ewram_start[]; -extern struct UnkStruct_02020CD0 gUnknown_02020CD0[18]; -extern void (*gUnknown_02022BD0[])(void); -extern u32 gUnknown_02022C08; -extern void (*gUnknown_02022C0C)(void); -extern u16 gUnknown_02022C10[4]; -extern u16 gUnknown_02022C18[4]; -extern u8 gUnknown_02022C20[4]; -extern u16 gUnknown_02022EB8; -extern struct RomInfo *gUnknown_020251E8; -extern u8 ewram_end[]; - -void sub_02008638(void); -void sub_020086B8(void); -void sub_02008708(void); -void sub_0200870C(void); -void sub_020087B4(void); -void sub_02008C00(void); -void sub_02008C80(void); -void sub_02008D1C(void); -void sub_02009228(void); -bool32 sub_02009324(u8); - -extern void sub_020002B4(void); - -#define SR_KEYS (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON) - -#define TEST_BUTTON(arr, flags) ({(arr) & (flags);}) +} void AgbMain(void) { + void (*func)(void) = (void *)arm_LZ77UnCompWRAM_FuncStart; REG_IME = 0; RegisterRamReset(RESET_ALL & ~(RESET_EWRAM | RESET_IWRAM)); - CpuFill16(0, ewram_start, ewram_end - ewram_start); REG_WAITCNT = WAITCNT_SRAM_4 | WAITCNT_WS0_N_3 | WAITCNT_WS0_S_1 | WAITCNT_WS1_N_3 | WAITCNT_WS1_S_1 | WAITCNT_WS2_N_3 | WAITCNT_WS2_S_1 | WAITCNT_PREFETCH_ENABLE; - sub_02008638(); - sub_020087B4(); - sub_02008C80(); - sub_020002B4(); - SoftReset(RESET_ALL); -} - -u32 sub_020085F4(void) -{ - return gUnknown_02022C08; -} - -void sub_02008600(u32 a0) -{ - for (; a0 != 0; a0--) - { - sub_02008C00(); - VBlankIntrWait(); - sub_02009228(); - if (TEST_BUTTON(gUnknown_02022EB8, SR_KEYS) == SR_KEYS) - SoftReset(0); - } -} - -void sub_02008638(void) -{ - int i; - gUnknown_02022C0C = NULL; - for (i = 0; i < 14u; i++) - gUnknown_02022BD0[i] = sub_02008708; - if (sub_020086B8 != NULL) - gUnknown_02022BD0[1] = sub_020086B8; - else - gUnknown_02022BD0[1] = sub_02008708; -} - -void sub_02008674(int i, void (*func)(void)) -{ - if (func != NULL) - gUnknown_02022BD0[i] = func; - else - gUnknown_02022BD0[i] = sub_02008708; -} - -void sub_020086A0(void (*a0)(void)) -{ - u16 imeBak = REG_IME; - REG_IME = 0; - gUnknown_02022C0C = a0; - REG_IME = imeBak; -} - -void sub_020086B8(void) -{ - if (sub_02009324(0)) - m4aSoundVSync(); - sub_02008D1C(); - sub_0200870C(); - gUnknown_02022C08++; - INTR_CHECK = TRUE; - if (gUnknown_02022C0C != NULL) - gUnknown_02022C0C(); - if (sub_02009324(1)) - m4aSoundMain(); -} - -void sub_02008708(void) -{ - -} - -void sub_0200870C(void) -{ - s32 i; - u16 bgCnt; - void * screenBase; - size_t size; - s32 r2; - REG_BG0HOFS = gUnknown_02022C10[0]; - REG_BG1HOFS = gUnknown_02022C10[1]; - REG_BG2HOFS = gUnknown_02022C10[2]; - REG_BG3HOFS = gUnknown_02022C10[3]; - REG_BG0VOFS = gUnknown_02022C18[0]; - REG_BG1VOFS = gUnknown_02022C18[1]; - REG_BG2VOFS = gUnknown_02022C18[2]; - REG_BG3VOFS = gUnknown_02022C18[3]; - for (i = 0; i < 4; i++) - { - if (gUnknown_02022C20[i]) - { - gUnknown_02022C20[i] = 0; - bgCnt = *(vu16 *)(REG_ADDR_BG0CNT + 2 * i); - screenBase = (void *)(BG_VRAM + ((bgCnt & 0x1F00) << 3)); - r2 = bgCnt & 0xC000 ? 2 : 1; - CpuCopy32((void *)(0x03000000 + 0x1000 * i), screenBase, r2 * 0x800); - } - } -} - -void sub_020087B4(void) -{ - CpuFill16(0, (void *)0x03000000, 0x4000); - CpuFill16(0, gUnknown_02022C10, 8); - CpuFill16(0, gUnknown_02022C18, 8); - gUnknown_02022C20[3] = 0; - gUnknown_02022C20[2] = 0; - gUnknown_02022C20[1] = 0; - gUnknown_02022C20[0] = 0; -} - -void sub_0200880C(int bgNum, int left, int top, int width, int height, const u16 * src) -{ - int x; - u16 * ptr = (void *)(0x03000000 + (bgNum << 12) + (top << 6) + (left << 1)); - - while (height) - { - for (x = 0; x < width; x++, src++) - { - ptr[x] = *src; - } - ptr += 32; - height--; - } -} - -void sub_02008850(int bgNum, int left, int top, int width, int height, u16 * dest) -{ - int x; - u16 * ptr = (void *)(0x03000000 + (bgNum << 12) + (top << 6) + (left << 1)); - - while (height) - { - for (x = 0; x < width; x++, dest++) - { - *dest = ptr[x]; - } - ptr += 32; - height--; - } -} - -void sub_02008894(int bgNum, int left, int top, int width, int height, int paletteNum) -{ - int x; - u16 * ptr = (void *)(0x03000000 + (bgNum << 12) + (top << 6) + (left << 1)); - - while (height) - { - for (x = 0; x < width; x++) - { - ptr[x] &= 0xFFF; - ptr[x] |= paletteNum << 12; - } - ptr += 32; - height--; - } -} - -void sub_020088E8(int bgNum, int x, int y, u16 tileNum) -{ - u16 * ptr = (void *)(0x03000000 + (bgNum << 12) + (y << 6) + (x << 1)); - *ptr = tileNum; -} - -void sub_02008904(int bgNum, int left, int top, int width, int height,u16 tileNum) -{ - int x; - u16 * ptr = (void *)(0x03000000 + (bgNum << 12) + (top << 6) + (left << 1)); - - while (height) - { - for (x = 0; x < width; x++) - { - ptr[x] = tileNum; - } - ptr += 32; - height--; - } -} - -void sub_02008948(int bgNum, int srcLeft, int srcTop, int width, int height, int destLeft, int destTop) -{ - int x; - const u16 * srcPtr; - u16 * destPtr; - - srcPtr = (void *)(0x03000000 + (bgNum << 12) + (srcTop << 6) + (srcLeft << 1)); - destPtr = (void *)(0x03000000 + (bgNum << 12) + (destTop << 6) + (destLeft << 1)); - - while (height) - { - for (x = 0; x < width; x++) - { - destPtr[x] = srcPtr[x]; - } - srcPtr += 32; - destPtr += 32; - height--; - } -} - -void sub_020089A4(int bgNum, u16 x, u16 y) -{ - gUnknown_02022C10[bgNum] = x; - gUnknown_02022C18[bgNum] = y; -} - -void sub_020089BC(struct UnkStruct_02020CD0 * a0, struct UnkStruct_02020CD0 * a1) -{ - a1->unk1 = a0->unk1; - a1->unk0 = a0 - gUnknown_02020CD0; - a0->unk1 = gUnknown_02020CD0[a0->unk1].unk0 = a1 - gUnknown_02020CD0; -} - -struct UnkStruct_02020CD0 * sub_02008A10(s32 a, s32 b, s32 c) -{ - s32 i; - struct UnkStruct_02020CD0 * r7 = &gUnknown_02020CD0[gUnknown_02020CD0[0].unk1]; - gUnknown_02020CD0[r7->unk0].unk1 = r7->unk1; - gUnknown_02020CD0[r7->unk1].unk0 = r7->unk0; - sub_020089BC(&gUnknown_02020CD0[1], r7); - r7->unk8 = a; - r7->unkA = b; - r7->unkC = c; - r7->unk2 = 0; - r7->unk4 = 0; - r7->unk6 = 0; - r7->unk10 = NULL; - for (i = 0; i < 4; i++) - r7->unk14[i] = NULL; - return r7; -} - -asm(".section .text.020092C0"); - -void AutoUnCompVram(const void * src, void * dest) -{ - switch (*(u8 *)src & 0xF0) - { - case 0x10: - LZ77UnCompVram(src, dest); - break; - case 0x20: - HuffUnComp(src, dest); - break; - case 0x30: - RLUnCompVram(src, dest); - break; - } + DmaCopy16(3, arm_LZ77UnCompWRAM, IWRAM_START, arm_LZ77UnCompWRAM_BufferEnd - arm_LZ77UnCompWRAM_Buffer); + func(); + while (1); } diff --git a/tools/aif2pcm/Makefile b/tools/aif2pcm/Makefile index e5cb6ad..af7d19f 100644 --- a/tools/aif2pcm/Makefile +++ b/tools/aif2pcm/Makefile @@ -6,7 +6,10 @@ LIBS = -lm SRCS = main.c extended.c -.PHONY: clean +.PHONY: all clean + +all: aif2pcm + @: aif2pcm: $(SRCS) $(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS) diff --git a/tools/bin2c/Makefile b/tools/bin2c/Makefile index 73f7898..ab11e1b 100644 --- a/tools/bin2c/Makefile +++ b/tools/bin2c/Makefile @@ -2,10 +2,13 @@ CC = gcc CFLAGS = -Wall -Wextra -Werror -std=c11 -O2 -.PHONY: clean +.PHONY: all clean SRCS = bin2c.c +all: bin2c + @: + bin2c: $(SRCS) $(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) diff --git a/tools/br_ips/Makefile b/tools/br_ips/Makefile deleted file mode 100644 index e80e257..0000000 --- a/tools/br_ips/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -CC := gcc -CFLAGS := -O3 - -all: br_ips ips_patch - -clean: - rm -f br_ips ips_patch br_ips.exe ips_patch.exe - -br_ips: br_ips.c - $(CC) $(CFLAGS) -o $@ $^ - -ips_patch: ips_patch.c - $(CC) $(CFLAGS) -o $@ $^ diff --git a/tools/br_ips/br_ips b/tools/br_ips/br_ips deleted file mode 100644 index f70a5b2..0000000 Binary files a/tools/br_ips/br_ips and /dev/null differ diff --git a/tools/br_ips/br_ips.c b/tools/br_ips/br_ips.c deleted file mode 100644 index 64c454a..0000000 --- a/tools/br_ips/br_ips.c +++ /dev/null @@ -1,321 +0,0 @@ -#define _POSIX_C_SOURCE 200808L // Don't use GNU getline -#include -#include -#include -#include -#include -#include "global.h" - -static const char SPLASH[] = "IPS patch creator for undisassembled data\n" - "Created by PikalaxALT on 23 June 2019 All Rights Reserved\n"; - -static const char HELP[] = "br_ips\n" - "This utility is meant to be run with no arguments in the project root of a PRET AGB disassembly.\n" - "baserom.gba and ld_script.txt are required files which must be present in the project root.\n" - "ld_script.txt is a GNU linker script. For more details, see\n" - "https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_chapter/ld_3.html#SEC6.\n" - "All ELF targets in the linker script with Makefile rules \"%.o: %.s\" must have their sources present\n" - "at the indicated paths relative to the project root.\n" - "\n" - "Options:\n" - " -h - show this message and exit\n"; - -static int getline(char ** lineptr, size_t * n, FILE * stream) { - // Static implementation of GNU getline - int i = 0; - int c; - if (n == NULL || lineptr == NULL || stream == NULL) return -1; - size_t size = *n; - char * buf = *lineptr; - if (buf == NULL || size < 4) { - size = 128; - *lineptr = buf = realloc(buf, 128); - } - if (buf == NULL) return -1; - while (1) { - c = getc(stream); - if (c == EOF) break; - buf[i++] = c; - if (c == '\n') break; - if (i == size - 1) { - size <<= 1; - buf = realloc(buf, size); - if (buf == NULL) return -1; - *lineptr = buf; - *n = size; - } - } - if (i == 0) return -1; - buf[i] = 0; - return i; -} - -static void getIncbinsFromFile(hunk_t ** hunks, size_t * num, size_t * maxnum, const char * fname, char ** strbuf, size_t * buffersize) { - // Recursively find incbinned segments and encode them as hunks. - FILE * file = fopen(fname, "r"); - if (file == NULL) FATAL_ERROR("unable to open file \"%s\" for reading\n", fname); - hunk_t * data = *hunks; - size_t nhunks = *num; - size_t maxnhunks = *maxnum; - int line_n = 0; // for error prints - while (getline(strbuf, buffersize, file) > 0) { - line_n++; - // If another file is included by this one, recurse into it. - char * include = strstr(*strbuf, ".include"); - if (include != NULL) { - char incfname[128]; - include = strchr(include, '"'); - if (include == NULL) FATAL_ERROR("%s:%d: malformed include\n", fname, line_n); - include++; - char * endq_p = strchr(include, '"'); - if (endq_p == NULL) FATAL_ERROR("%s:%d: malformed include\n", fname, line_n); - *endq_p = 0; - strcpy(incfname, include); - getIncbinsFromFile(&data, &nhunks, &maxnhunks, incfname, strbuf, buffersize); - continue; - } - // Check for a .incbin "baserom.gba" directive - char * line = strstr(*strbuf, ".incbin"); - if (line == NULL) continue; - line = strstr(line + sizeof(".incbin"), "\"baserom.gba\","); - if (line == NULL) continue; - line += sizeof("\"baserom.gba\",") - 1; - uint32_t incbinOffset; - // Enforce the structure .incbin "baserom.gba", offset, size - // Data cannot be located at offset 0, as that is the entry - // point (ARM code). - do { - if (*line == 0) FATAL_ERROR("%s:%d: malformed incbin\n", fname, line_n); - incbinOffset = strtoul(line, &line, 0); - line++; - } while (incbinOffset == 0); - size_t incbinSize; - do { - if (*line == 0) FATAL_ERROR("%s:%d: malformed incbin\n", fname, line_n); - incbinSize = strtoul(line, &line, 0); - line++; - } while (incbinSize == 0); - // Offset must fit in three bytes - if (incbinOffset >= 0x01000000) FATAL_ERROR("%s:%d: offset exceeds encodable limit\n", fname, line_n); - // Avoid confusion with the end sentinel - if (incbinOffset == 0x454F46) { // "EOF" - incbinOffset--; - incbinSize++; - } - // Cannot read past a certain point due to format restrictions - if (incbinOffset + incbinSize > 0xFFFFFF + 0xFFFF) FATAL_ERROR("%s:%d: size exceeds encodable limit\n", fname, line_n); - // Break up the incbin into hunks of maximum size 0xFFFF - do { - size_t trueSize = incbinSize <= 0xFFFF ? incbinSize : 0xFFFF; - if (nhunks >= maxnhunks) { - maxnhunks <<= 1; - data = realloc(data, maxnhunks * sizeof(hunk_t)); - if (data == NULL) FATAL_ERROR("unable to reallocate hunks buffer\n"); - } - data[nhunks].offset = incbinOffset; - data[nhunks].size = trueSize; - incbinOffset += trueSize; - incbinSize -= trueSize; - if (incbinOffset == 0x454F46) { - incbinOffset--; - data[nhunks].size--; - incbinSize++; - } - nhunks++; - } while (incbinSize > 0); - } - // Error check - if (!feof(file)) FATAL_ERROR("getline\n"); - fclose(file); - *hunks = data; - *num = nhunks; - *maxnum = maxnhunks; -} - -static hunk_t * getAllIncbins(FILE * ld_script, size_t * num_p) { - // Parse the ld script. - // Strict adherence to syntax is expected. - char * line = NULL; - size_t linesiz = 0; - char fname_buf[128]; - size_t maxnum = 256; - size_t num = 0; - // Allocate the hunks array. - hunk_t * hunks = malloc(256 * sizeof(hunk_t)); - if (hunks == NULL) FATAL_ERROR("failed to allocate hunks buffer\n"); - while (getline(&line, &linesiz, ld_script) > 0) { - char * endptr; - // We only expect hunks in rodata, script_data, and gfx_data sections. - if ((endptr = strstr(line, ".o(.rodata);")) == NULL - && (endptr = strstr(line, ".o(script_data);")) == NULL - && (endptr = strstr(line, ".o(gfx_data);")) == NULL) continue; - char * startptr = line; - // Skip whitespace. - while (isspace(*startptr)) startptr++; - if (strstr(startptr, ".a:") != NULL) continue; // no hunks in libs - if (strstr(startptr, "src/") == startptr) continue; // no hunks in src/ - // Replace the extension with .s and truncate the string - endptr[1] = 's'; - endptr[2] = 0; - // We're reusing the already-allocated string buffer, so - // copy the filename to the stack for use in error prints. - strcpy(fname_buf, startptr); - getIncbinsFromFile(&hunks, &num, &maxnum, fname_buf, &line, &linesiz); - } - // Error check - if (!feof(ld_script)) FATAL_ERROR("getline\n"); - free(line); - *num_p = num; - return hunks; -} - -static int cmp_baserom(const void * a, const void * b) { - // Comparison function for sorting Hunk structs. - // For more details, please refer to the qsort man pages. - // See also the function "collapseIncbins" below. - const hunk_t * aa = (const hunk_t *)a; - const hunk_t * bb = (const hunk_t *)b; - return (aa->offset > bb->offset) - (aa->offset < bb->offset); -} - -static void collapseIncbins(hunk_t * hunks, size_t * num_p) { - // This function merges adjacent hunks where possible. - size_t num = *num_p; - // Sort the array by offset increasing. - qsort(hunks, num, sizeof(hunk_t), cmp_baserom); - // We stop at num - 1 because we need to be able to look one - // entry ahead in the hunks array. - for (int i = 0; i < num - 1; i++) { - // Loop until the next hunk is not adjacent to the current. - while (hunks[i].offset + hunks[i].size == hunks[i + 1].offset) { - // If this hunk cannot be merged with the next, proceed to the next. - if (hunks[i].size == 0xFFFF || (hunks[i].size == 0xFFFE && hunks[i + 1].offset == 0x454F45)) break; - // If this hunk is empty, remove it. - if (hunks[i].size == 0) { - int j; - // Find the next non-empty hunk - for (j = i + 1; j < num; j++) { - if (hunks[j].size != 0) break; - } - if (j == num) { - // All remaining hunks are empty - num = i; - break; - } - // Compaction - // Use a for loop instead of memcpy to avoid UB from - // overlapping buffers. - for (int k = 0; k < num - j; k++) hunks[i + k] = hunks[j + k]; - num -= j - i; - if (i >= num - 1) break; - } - else - { - // Combine this hunk with the next - hunks[i].size += hunks[i + 1].size; - if (hunks[i].size > 0xFFFF) { - // Split the hunk back up, it's too big to encode. - // Set the earlier hunk to the maximum permitted size, - // and the following hunk to the remainder. - hunks[i + 1].size = hunks[i].size - 0xFFFF; - hunks[i].size = 0xFFFF; - hunks[i + 1].offset = hunks[i].offset + 0xFFFF; - // If this operation would confuse the hunk with the - // EOF sentinel, fix that. - if (hunks[i + 1].offset == 0x454F46) { - hunks[i].size--; - hunks[i + 1].offset--; - hunks[i + 1].size++; - } - break; - } else { - // Compaction - // Use a for loop instead of memcpy to avoid UB from - // overlapping buffers. - for (int j = i + 1; j < num - 1; j++) hunks[j] = hunks[j + 1]; - num--; - if (i >= num - 1) break; - } - } - } - } - *num_p = num; -} - -static void writePatch(const char * filename, const hunk_t * hunks, size_t num, FILE * rom) { - // Create an IPS patch. - // The file is headed with a magic code which is "PATCH" in ASCII. - // Following that are the "hunks": 3-byte offset, 2-byte size, and - // the literal data. The file is ended with "EOF", again in ASCII. - // For that reason, an offset of 0x454F46 cannot be encoded directly. - // Offset and size are encoded big-endian. - FILE * file = fopen(filename, "wb"); - if (file == NULL) FATAL_ERROR("unable to open file \"%s\" for writing\n", filename); - // Maximum hunk size is 65535 bytes. For convenience, we allocate a - // round 65536 (0x10000). This has no effect on memory consumption, - // as malloc will round this up anyway. - char * readbuf = malloc(0x10000); - if (readbuf == NULL) FATAL_ERROR("failed to allocate write buffer\n"); - fwrite("PATCH", 1, 5, file); // magic - for (int i = 0; i < num; i++) { - // Encode the offset - uint32_t offset = hunks[i].offset; - putc(offset >> 16, file); - putc(offset >> 8, file); - putc(offset >> 0, file); - // Encode the size - size_t size = hunks[i].size; - putc(size >> 8, file); - putc(size >> 0, file); - // Yank the data straight from the ROM - if (fseek(rom, offset, SEEK_SET)) FATAL_ERROR("seek\n"); - if (fread(readbuf, 1, size, rom) != size) FATAL_ERROR("read\n"); - if (fwrite(readbuf, 1, size, file) != size) FATAL_ERROR("write\n"); - } - free(readbuf); - // Write the EOF magic - fwrite("EOF", 1, 3, file); - fclose(file); -} - -// This script takes no arguments. -int main(int argc, char ** argv) { - // Show a friendly message - puts(SPLASH); - // If requested, show help message - if (argc >= 2 && strcmp(argv[1], "-h") == 0) { - puts(HELP); - return 0; - } - // This script expects to be in a PRET AGB disassembly project root. - // Required files include baserom.gba, ld_script.txt, and all paths - // referenced in ld_script.txt relative to the project root. - FILE * rom = fopen("baserom.gba", "rb"); - if (rom == NULL) FATAL_ERROR("unable to open \"baserom.gba\" for reading\n"); - FILE * ld_script = fopen("ld_script.txt", "r"); - if (ld_script == NULL) FATAL_ERROR("unable to open \"ld_script.txt\" for reading\n"); - // Find all instances where segments of baserom.gba are incbinned literaly. - size_t num = 0; - hunk_t * hunks = getAllIncbins(ld_script, &num); - fclose(ld_script); - if (num == 0) { - // If this line is printed, the script was unable to find any - // `.incbin "baserom.gba"` lines. - // If this is incorrect, please contact the developer. - puts("No baserom.gba hunks found!\n" - "If there are baserom.gba hunks in this project,\n" - "please ping PikalaxALT on the pret discord,\n" - "channel #gen-3-help.\n"); - } else { - // Merge neighboring hunks to reduce the number of hunks. - collapseIncbins(hunks, &num); - // Encode the hunks in the IPS patch. - writePatch("baserom.ips", hunks, num, rom); - // Communicate status to the user. - puts("IPS file created at baserom.ips\n"); - } - // Clean up and return. - fclose(rom); - free(hunks); - return 0; -} diff --git a/tools/br_ips/global.h b/tools/br_ips/global.h deleted file mode 100644 index b82c516..0000000 --- a/tools/br_ips/global.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef GUARD_BR_IPS_GLOBAL_H -#define GUARD_BR_IPS_GLOBAL_H - -#ifdef _MSC_VER - -#define FATAL_ERROR(format, ...) \ -do { \ - fprintf(stderr, format, __VA_ARGS__); \ - exit(1); \ -} while (0) - -#else - -#define FATAL_ERROR(format, ...) \ -do { \ - fprintf(stderr, format, ##__VA_ARGS__); \ - exit(1); \ -} while (0) - -#endif // _MSC_VER - -typedef struct Hunk { - uint32_t offset; - size_t size; -} hunk_t; - -#endif //GUARD_BR_IPS_GLOBAL_H diff --git a/tools/br_ips/ips_patch b/tools/br_ips/ips_patch deleted file mode 100644 index 67c561a..0000000 Binary files a/tools/br_ips/ips_patch and /dev/null differ diff --git a/tools/br_ips/ips_patch.c b/tools/br_ips/ips_patch.c deleted file mode 100644 index c912474..0000000 --- a/tools/br_ips/ips_patch.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include -#include -#include "global.h" - -static const char SPLASH[] = "Small IPS patch utility\n" - "Created by PikalaxALT on 23 June 2019 All Rights Reserved\n"; - -static const char HELP[] = "ips_patch [-h] ROM PATCH OUT\n" - "\n" - " ROM - input ROM file\n" - " PATCH - IPS patch file to apply\n" - " OUT - path to write patched ROM\n" - "\n" - "Options:\n" - " -h - show this message and exit\n"; - -int main(int argc, char ** argv) { - // Show a friendly message - puts(SPLASH); - // If requested, show help message - if (argc >= 2 && strcmp(argv[1], "-h") == 0) { - puts(HELP); - return 0; - } - // Enforce CLI syntax - if (argc != 4) FATAL_ERROR("usage: %s [-h] ROM PATCH OUT\n", argv[0]); - FILE * rom = fopen(argv[1], "rb"); - if (rom == NULL) FATAL_ERROR("failed to open file \"%s\" for reading\n", argv[1]); - FILE * patch = fopen(argv[2], "rb"); - if (patch == NULL) FATAL_ERROR("failed to open file \"%s\" for reading\n", argv[2]); - FILE * out = fopen(argv[3], "wb"); - if (patch == NULL) FATAL_ERROR("failed to open file \"%s\" for writing\n", argv[3]); - // IPS magic header - char magic[5]; - if (fread(magic, 1, 5, patch) != 5) FATAL_ERROR("read magic\n"); - if (memcmp(magic, "PATCH", 5) != 0) FATAL_ERROR("malformed IPS patch\n"); - // Read the ROM into allocated memory. - fseek(rom, 0, SEEK_END); - size_t romsize = ftell(rom); - fseek(rom, 0, SEEK_SET); - char * buffer = malloc(romsize); - if (buffer == NULL) FATAL_ERROR("failed to allocate dest buffer\n"); - if (fread(buffer, 1, romsize, rom) != romsize) FATAL_ERROR("read ROM\n"); - fclose(rom); - while (1) { - uint32_t offset; - size_t size; - // Read each hunk into the buffer, overwriting previous data. - // If two or more hunks overlap, the newest one is retained. - // A good IPS patch creator will avoid this. - offset = (unsigned char)getc(patch) << 16; - offset |= (unsigned char)getc(patch) << 8; - offset |= (unsigned char)getc(patch); - if (offset == 0x454F46) break; // end sentinel "EOF" - size = (unsigned char)getc(patch) << 8; - size |= (unsigned char)getc(patch); - if (offset + size > romsize) FATAL_ERROR("segment extends past end of ROM\n"); - if (fread(buffer + offset, 1, size, patch) != size) FATAL_ERROR("read segment\n"); - } - fclose(patch); - // Write the patched ROM - fwrite(buffer, 1, romsize, out); - fclose(out); - free(buffer); - return 0; -} diff --git a/tools/gbafix/Makefile b/tools/gbafix/Makefile index f12c8cc..5b410da 100644 --- a/tools/gbafix/Makefile +++ b/tools/gbafix/Makefile @@ -1,8 +1,11 @@ CC = gcc -.PHONY: clean +.PHONY: all clean SRCS = gbafix.c +all: gbafix + @: + gbafix: $(SRCS) $(CC) $(SRCS) -o $@ $(LDFLAGS) diff --git a/tools/gbafix/elf.h b/tools/gbafix/elf.h new file mode 100644 index 0000000..79d3b97 --- /dev/null +++ b/tools/gbafix/elf.h @@ -0,0 +1,3147 @@ +/* +From musl include/elf.h + +Copyright © 2005-2014 Rich Felker, et al. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +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 OR COPYRIGHT HOLDERS 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. +*/ + +#ifndef _ELF_H +#define _ELF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef uint16_t Elf32_Half; +typedef uint16_t Elf64_Half; + +typedef uint32_t Elf32_Word; +typedef int32_t Elf32_Sword; +typedef uint32_t Elf64_Word; +typedef int32_t Elf64_Sword; + +typedef uint64_t Elf32_Xword; +typedef int64_t Elf32_Sxword; +typedef uint64_t Elf64_Xword; +typedef int64_t Elf64_Sxword; + +typedef uint32_t Elf32_Addr; +typedef uint64_t Elf64_Addr; + +typedef uint32_t Elf32_Off; +typedef uint64_t Elf64_Off; + +typedef uint16_t Elf32_Section; +typedef uint16_t Elf64_Section; + +typedef Elf32_Half Elf32_Versym; +typedef Elf64_Half Elf64_Versym; + +#define EI_NIDENT (16) + +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +} Elf32_Ehdr; + +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +} Elf64_Ehdr; + +#define EI_MAG0 0 +#define ELFMAG0 0x7f + +#define EI_MAG1 1 +#define ELFMAG1 'E' + +#define EI_MAG2 2 +#define ELFMAG2 'L' + +#define EI_MAG3 3 +#define ELFMAG3 'F' + + +#define ELFMAG "\177ELF" +#define SELFMAG 4 + +#define EI_CLASS 4 +#define ELFCLASSNONE 0 +#define ELFCLASS32 1 +#define ELFCLASS64 2 +#define ELFCLASSNUM 3 + +#define EI_DATA 5 +#define ELFDATANONE 0 +#define ELFDATA2LSB 1 +#define ELFDATA2MSB 2 +#define ELFDATANUM 3 + +#define EI_VERSION 6 + + +#define EI_OSABI 7 +#define ELFOSABI_NONE 0 +#define ELFOSABI_SYSV 0 +#define ELFOSABI_HPUX 1 +#define ELFOSABI_NETBSD 2 +#define ELFOSABI_LINUX 3 +#define ELFOSABI_GNU 3 +#define ELFOSABI_SOLARIS 6 +#define ELFOSABI_AIX 7 +#define ELFOSABI_IRIX 8 +#define ELFOSABI_FREEBSD 9 +#define ELFOSABI_TRU64 10 +#define ELFOSABI_MODESTO 11 +#define ELFOSABI_OPENBSD 12 +#define ELFOSABI_ARM 97 +#define ELFOSABI_STANDALONE 255 + +#define EI_ABIVERSION 8 + +#define EI_PAD 9 + + + +#define ET_NONE 0 +#define ET_REL 1 +#define ET_EXEC 2 +#define ET_DYN 3 +#define ET_CORE 4 +#define ET_NUM 5 +#define ET_LOOS 0xfe00 +#define ET_HIOS 0xfeff +#define ET_LOPROC 0xff00 +#define ET_HIPROC 0xffff + + + +#define EM_NONE 0 +#define EM_M32 1 +#define EM_SPARC 2 +#define EM_386 3 +#define EM_68K 4 +#define EM_88K 5 +#define EM_860 7 +#define EM_MIPS 8 +#define EM_S370 9 +#define EM_MIPS_RS3_LE 10 + +#define EM_PARISC 15 +#define EM_VPP500 17 +#define EM_SPARC32PLUS 18 +#define EM_960 19 +#define EM_PPC 20 +#define EM_PPC64 21 +#define EM_S390 22 + +#define EM_V800 36 +#define EM_FR20 37 +#define EM_RH32 38 +#define EM_RCE 39 +#define EM_ARM 40 +#define EM_FAKE_ALPHA 41 +#define EM_SH 42 +#define EM_SPARCV9 43 +#define EM_TRICORE 44 +#define EM_ARC 45 +#define EM_H8_300 46 +#define EM_H8_300H 47 +#define EM_H8S 48 +#define EM_H8_500 49 +#define EM_IA_64 50 +#define EM_MIPS_X 51 +#define EM_COLDFIRE 52 +#define EM_68HC12 53 +#define EM_MMA 54 +#define EM_PCP 55 +#define EM_NCPU 56 +#define EM_NDR1 57 +#define EM_STARCORE 58 +#define EM_ME16 59 +#define EM_ST100 60 +#define EM_TINYJ 61 +#define EM_X86_64 62 +#define EM_PDSP 63 + +#define EM_FX66 66 +#define EM_ST9PLUS 67 +#define EM_ST7 68 +#define EM_68HC16 69 +#define EM_68HC11 70 +#define EM_68HC08 71 +#define EM_68HC05 72 +#define EM_SVX 73 +#define EM_ST19 74 +#define EM_VAX 75 +#define EM_CRIS 76 +#define EM_JAVELIN 77 +#define EM_FIREPATH 78 +#define EM_ZSP 79 +#define EM_MMIX 80 +#define EM_HUANY 81 +#define EM_PRISM 82 +#define EM_AVR 83 +#define EM_FR30 84 +#define EM_D10V 85 +#define EM_D30V 86 +#define EM_V850 87 +#define EM_M32R 88 +#define EM_MN10300 89 +#define EM_MN10200 90 +#define EM_PJ 91 +#define EM_OR1K 92 +#define EM_OPENRISC 92 +#define EM_ARC_A5 93 +#define EM_ARC_COMPACT 93 +#define EM_XTENSA 94 +#define EM_VIDEOCORE 95 +#define EM_TMM_GPP 96 +#define EM_NS32K 97 +#define EM_TPC 98 +#define EM_SNP1K 99 +#define EM_ST200 100 +#define EM_IP2K 101 +#define EM_MAX 102 +#define EM_CR 103 +#define EM_F2MC16 104 +#define EM_MSP430 105 +#define EM_BLACKFIN 106 +#define EM_SE_C33 107 +#define EM_SEP 108 +#define EM_ARCA 109 +#define EM_UNICORE 110 +#define EM_EXCESS 111 +#define EM_DXP 112 +#define EM_ALTERA_NIOS2 113 +#define EM_CRX 114 +#define EM_XGATE 115 +#define EM_C166 116 +#define EM_M16C 117 +#define EM_DSPIC30F 118 +#define EM_CE 119 +#define EM_M32C 120 +#define EM_TSK3000 131 +#define EM_RS08 132 +#define EM_SHARC 133 +#define EM_ECOG2 134 +#define EM_SCORE7 135 +#define EM_DSP24 136 +#define EM_VIDEOCORE3 137 +#define EM_LATTICEMICO32 138 +#define EM_SE_C17 139 +#define EM_TI_C6000 140 +#define EM_TI_C2000 141 +#define EM_TI_C5500 142 +#define EM_TI_ARP32 143 +#define EM_TI_PRU 144 +#define EM_MMDSP_PLUS 160 +#define EM_CYPRESS_M8C 161 +#define EM_R32C 162 +#define EM_TRIMEDIA 163 +#define EM_QDSP6 164 +#define EM_8051 165 +#define EM_STXP7X 166 +#define EM_NDS32 167 +#define EM_ECOG1X 168 +#define EM_MAXQ30 169 +#define EM_XIMO16 170 +#define EM_MANIK 171 +#define EM_CRAYNV2 172 +#define EM_RX 173 +#define EM_METAG 174 +#define EM_MCST_ELBRUS 175 +#define EM_ECOG16 176 +#define EM_CR16 177 +#define EM_ETPU 178 +#define EM_SLE9X 179 +#define EM_L10M 180 +#define EM_K10M 181 +#define EM_AARCH64 183 +#define EM_AVR32 185 +#define EM_STM8 186 +#define EM_TILE64 187 +#define EM_TILEPRO 188 +#define EM_MICROBLAZE 189 +#define EM_CUDA 190 +#define EM_TILEGX 191 +#define EM_CLOUDSHIELD 192 +#define EM_COREA_1ST 193 +#define EM_COREA_2ND 194 +#define EM_ARC_COMPACT2 195 +#define EM_OPEN8 196 +#define EM_RL78 197 +#define EM_VIDEOCORE5 198 +#define EM_78KOR 199 +#define EM_56800EX 200 +#define EM_BA1 201 +#define EM_BA2 202 +#define EM_XCORE 203 +#define EM_MCHP_PIC 204 +#define EM_KM32 210 +#define EM_KMX32 211 +#define EM_EMX16 212 +#define EM_EMX8 213 +#define EM_KVARC 214 +#define EM_CDP 215 +#define EM_COGE 216 +#define EM_COOL 217 +#define EM_NORC 218 +#define EM_CSR_KALIMBA 219 +#define EM_Z80 220 +#define EM_VISIUM 221 +#define EM_FT32 222 +#define EM_MOXIE 223 +#define EM_AMDGPU 224 +#define EM_RISCV 243 +#define EM_BPF 247 +#define EM_NUM 248 + +#define EM_ALPHA 0x9026 + +#define EV_NONE 0 +#define EV_CURRENT 1 +#define EV_NUM 2 + +typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +} Elf32_Shdr; + +typedef struct { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +} Elf64_Shdr; + + + +#define SHN_UNDEF 0 +#define SHN_LORESERVE 0xff00 +#define SHN_LOPROC 0xff00 +#define SHN_BEFORE 0xff00 + +#define SHN_AFTER 0xff01 + +#define SHN_HIPROC 0xff1f +#define SHN_LOOS 0xff20 +#define SHN_HIOS 0xff3f +#define SHN_ABS 0xfff1 +#define SHN_COMMON 0xfff2 +#define SHN_XINDEX 0xffff +#define SHN_HIRESERVE 0xffff + + + +#define SHT_NULL 0 +#define SHT_PROGBITS 1 +#define SHT_SYMTAB 2 +#define SHT_STRTAB 3 +#define SHT_RELA 4 +#define SHT_HASH 5 +#define SHT_DYNAMIC 6 +#define SHT_NOTE 7 +#define SHT_NOBITS 8 +#define SHT_REL 9 +#define SHT_SHLIB 10 +#define SHT_DYNSYM 11 +#define SHT_INIT_ARRAY 14 +#define SHT_FINI_ARRAY 15 +#define SHT_PREINIT_ARRAY 16 +#define SHT_GROUP 17 +#define SHT_SYMTAB_SHNDX 18 +#define SHT_NUM 19 +#define SHT_LOOS 0x60000000 +#define SHT_GNU_ATTRIBUTES 0x6ffffff5 +#define SHT_GNU_HASH 0x6ffffff6 +#define SHT_GNU_LIBLIST 0x6ffffff7 +#define SHT_CHECKSUM 0x6ffffff8 +#define SHT_LOSUNW 0x6ffffffa +#define SHT_SUNW_move 0x6ffffffa +#define SHT_SUNW_COMDAT 0x6ffffffb +#define SHT_SUNW_syminfo 0x6ffffffc +#define SHT_GNU_verdef 0x6ffffffd +#define SHT_GNU_verneed 0x6ffffffe +#define SHT_GNU_versym 0x6fffffff +#define SHT_HISUNW 0x6fffffff +#define SHT_HIOS 0x6fffffff +#define SHT_LOPROC 0x70000000 +#define SHT_HIPROC 0x7fffffff +#define SHT_LOUSER 0x80000000 +#define SHT_HIUSER 0x8fffffff + +#define SHF_WRITE (1 << 0) +#define SHF_ALLOC (1 << 1) +#define SHF_EXECINSTR (1 << 2) +#define SHF_MERGE (1 << 4) +#define SHF_STRINGS (1 << 5) +#define SHF_INFO_LINK (1 << 6) +#define SHF_LINK_ORDER (1 << 7) +#define SHF_OS_NONCONFORMING (1 << 8) + +#define SHF_GROUP (1 << 9) +#define SHF_TLS (1 << 10) +#define SHF_COMPRESSED (1 << 11) +#define SHF_MASKOS 0x0ff00000 +#define SHF_MASKPROC 0xf0000000 +#define SHF_ORDERED (1 << 30) +#define SHF_EXCLUDE (1U << 31) + +typedef struct { + Elf32_Word ch_type; + Elf32_Word ch_size; + Elf32_Word ch_addralign; +} Elf32_Chdr; + +typedef struct { + Elf64_Word ch_type; + Elf64_Word ch_reserved; + Elf64_Xword ch_size; + Elf64_Xword ch_addralign; +} Elf64_Chdr; + +#define ELFCOMPRESS_ZLIB 1 +#define ELFCOMPRESS_LOOS 0x60000000 +#define ELFCOMPRESS_HIOS 0x6fffffff +#define ELFCOMPRESS_LOPROC 0x70000000 +#define ELFCOMPRESS_HIPROC 0x7fffffff + + +#define GRP_COMDAT 0x1 + +typedef struct { + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + Elf32_Section st_shndx; +} Elf32_Sym; + +typedef struct { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Section st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +} Elf64_Sym; + +typedef struct { + Elf32_Half si_boundto; + Elf32_Half si_flags; +} Elf32_Syminfo; + +typedef struct { + Elf64_Half si_boundto; + Elf64_Half si_flags; +} Elf64_Syminfo; + +#define SYMINFO_BT_SELF 0xffff +#define SYMINFO_BT_PARENT 0xfffe +#define SYMINFO_BT_LOWRESERVE 0xff00 + +#define SYMINFO_FLG_DIRECT 0x0001 +#define SYMINFO_FLG_PASSTHRU 0x0002 +#define SYMINFO_FLG_COPY 0x0004 +#define SYMINFO_FLG_LAZYLOAD 0x0008 + +#define SYMINFO_NONE 0 +#define SYMINFO_CURRENT 1 +#define SYMINFO_NUM 2 + +#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4) +#define ELF32_ST_TYPE(val) ((val) & 0xf) +#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) + +#define ELF64_ST_BIND(val) ELF32_ST_BIND (val) +#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val) +#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type)) + +#define STB_LOCAL 0 +#define STB_GLOBAL 1 +#define STB_WEAK 2 +#define STB_NUM 3 +#define STB_LOOS 10 +#define STB_GNU_UNIQUE 10 +#define STB_HIOS 12 +#define STB_LOPROC 13 +#define STB_HIPROC 15 + +#define STT_NOTYPE 0 +#define STT_OBJECT 1 +#define STT_FUNC 2 +#define STT_SECTION 3 +#define STT_FILE 4 +#define STT_COMMON 5 +#define STT_TLS 6 +#define STT_NUM 7 +#define STT_LOOS 10 +#define STT_GNU_IFUNC 10 +#define STT_HIOS 12 +#define STT_LOPROC 13 +#define STT_HIPROC 15 + +#define STN_UNDEF 0 + +#define ELF32_ST_VISIBILITY(o) ((o) & 0x03) +#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o) + +#define STV_DEFAULT 0 +#define STV_INTERNAL 1 +#define STV_HIDDEN 2 +#define STV_PROTECTED 3 + + + + +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; +} Elf32_Rel; + +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; +} Elf64_Rel; + + + +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; + Elf32_Sword r_addend; +} Elf32_Rela; + +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +} Elf64_Rela; + + + +#define ELF32_R_SYM(val) ((val) >> 8) +#define ELF32_R_TYPE(val) ((val) & 0xff) +#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff)) + +#define ELF64_R_SYM(i) ((i) >> 32) +#define ELF64_R_TYPE(i) ((i) & 0xffffffff) +#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type)) + + + +typedef struct { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +} Elf32_Phdr; + +typedef struct { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +} Elf64_Phdr; + + + +#define PT_NULL 0 +#define PT_LOAD 1 +#define PT_DYNAMIC 2 +#define PT_INTERP 3 +#define PT_NOTE 4 +#define PT_SHLIB 5 +#define PT_PHDR 6 +#define PT_TLS 7 +#define PT_NUM 8 +#define PT_LOOS 0x60000000 +#define PT_GNU_EH_FRAME 0x6474e550 +#define PT_GNU_STACK 0x6474e551 +#define PT_GNU_RELRO 0x6474e552 +#define PT_LOSUNW 0x6ffffffa +#define PT_SUNWBSS 0x6ffffffa +#define PT_SUNWSTACK 0x6ffffffb +#define PT_HISUNW 0x6fffffff +#define PT_HIOS 0x6fffffff +#define PT_LOPROC 0x70000000 +#define PT_HIPROC 0x7fffffff + + +#define PN_XNUM 0xffff + + +#define PF_X (1 << 0) +#define PF_W (1 << 1) +#define PF_R (1 << 2) +#define PF_MASKOS 0x0ff00000 +#define PF_MASKPROC 0xf0000000 + + + +#define NT_PRSTATUS 1 +#define NT_FPREGSET 2 +#define NT_PRPSINFO 3 +#define NT_PRXREG 4 +#define NT_TASKSTRUCT 4 +#define NT_PLATFORM 5 +#define NT_AUXV 6 +#define NT_GWINDOWS 7 +#define NT_ASRS 8 +#define NT_PSTATUS 10 +#define NT_PSINFO 13 +#define NT_PRCRED 14 +#define NT_UTSNAME 15 +#define NT_LWPSTATUS 16 +#define NT_LWPSINFO 17 +#define NT_PRFPXREG 20 +#define NT_SIGINFO 0x53494749 +#define NT_FILE 0x46494c45 +#define NT_PRXFPREG 0x46e62b7f +#define NT_PPC_VMX 0x100 +#define NT_PPC_SPE 0x101 +#define NT_PPC_VSX 0x102 +#define NT_386_TLS 0x200 +#define NT_386_IOPERM 0x201 +#define NT_X86_XSTATE 0x202 +#define NT_S390_HIGH_GPRS 0x300 +#define NT_S390_TIMER 0x301 +#define NT_S390_TODCMP 0x302 +#define NT_S390_TODPREG 0x303 +#define NT_S390_CTRS 0x304 +#define NT_S390_PREFIX 0x305 +#define NT_S390_LAST_BREAK 0x306 +#define NT_S390_SYSTEM_CALL 0x307 +#define NT_S390_TDB 0x308 +#define NT_ARM_VFP 0x400 +#define NT_ARM_TLS 0x401 +#define NT_ARM_HW_BREAK 0x402 +#define NT_ARM_HW_WATCH 0x403 +#define NT_ARM_SYSTEM_CALL 0x404 +#define NT_ARM_SVE 0x405 +#define NT_METAG_CBUF 0x500 +#define NT_METAG_RPIPE 0x501 +#define NT_METAG_TLS 0x502 +#define NT_VERSION 1 + + + + +typedef struct { + Elf32_Sword d_tag; + union { + Elf32_Word d_val; + Elf32_Addr d_ptr; + } d_un; +} Elf32_Dyn; + +typedef struct { + Elf64_Sxword d_tag; + union { + Elf64_Xword d_val; + Elf64_Addr d_ptr; + } d_un; +} Elf64_Dyn; + + + +#define DT_NULL 0 +#define DT_NEEDED 1 +#define DT_PLTRELSZ 2 +#define DT_PLTGOT 3 +#define DT_HASH 4 +#define DT_STRTAB 5 +#define DT_SYMTAB 6 +#define DT_RELA 7 +#define DT_RELASZ 8 +#define DT_RELAENT 9 +#define DT_STRSZ 10 +#define DT_SYMENT 11 +#define DT_INIT 12 +#define DT_FINI 13 +#define DT_SONAME 14 +#define DT_RPATH 15 +#define DT_SYMBOLIC 16 +#define DT_REL 17 +#define DT_RELSZ 18 +#define DT_RELENT 19 +#define DT_PLTREL 20 +#define DT_DEBUG 21 +#define DT_TEXTREL 22 +#define DT_JMPREL 23 +#define DT_BIND_NOW 24 +#define DT_INIT_ARRAY 25 +#define DT_FINI_ARRAY 26 +#define DT_INIT_ARRAYSZ 27 +#define DT_FINI_ARRAYSZ 28 +#define DT_RUNPATH 29 +#define DT_FLAGS 30 +#define DT_ENCODING 32 +#define DT_PREINIT_ARRAY 32 +#define DT_PREINIT_ARRAYSZ 33 +#define DT_NUM 34 +#define DT_LOOS 0x6000000d +#define DT_HIOS 0x6ffff000 +#define DT_LOPROC 0x70000000 +#define DT_HIPROC 0x7fffffff +#define DT_PROCNUM DT_MIPS_NUM + +#define DT_VALRNGLO 0x6ffffd00 +#define DT_GNU_PRELINKED 0x6ffffdf5 +#define DT_GNU_CONFLICTSZ 0x6ffffdf6 +#define DT_GNU_LIBLISTSZ 0x6ffffdf7 +#define DT_CHECKSUM 0x6ffffdf8 +#define DT_PLTPADSZ 0x6ffffdf9 +#define DT_MOVEENT 0x6ffffdfa +#define DT_MOVESZ 0x6ffffdfb +#define DT_FEATURE_1 0x6ffffdfc +#define DT_POSFLAG_1 0x6ffffdfd + +#define DT_SYMINSZ 0x6ffffdfe +#define DT_SYMINENT 0x6ffffdff +#define DT_VALRNGHI 0x6ffffdff +#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) +#define DT_VALNUM 12 + +#define DT_ADDRRNGLO 0x6ffffe00 +#define DT_GNU_HASH 0x6ffffef5 +#define DT_TLSDESC_PLT 0x6ffffef6 +#define DT_TLSDESC_GOT 0x6ffffef7 +#define DT_GNU_CONFLICT 0x6ffffef8 +#define DT_GNU_LIBLIST 0x6ffffef9 +#define DT_CONFIG 0x6ffffefa +#define DT_DEPAUDIT 0x6ffffefb +#define DT_AUDIT 0x6ffffefc +#define DT_PLTPAD 0x6ffffefd +#define DT_MOVETAB 0x6ffffefe +#define DT_SYMINFO 0x6ffffeff +#define DT_ADDRRNGHI 0x6ffffeff +#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag)) +#define DT_ADDRNUM 11 + + + +#define DT_VERSYM 0x6ffffff0 + +#define DT_RELACOUNT 0x6ffffff9 +#define DT_RELCOUNT 0x6ffffffa + + +#define DT_FLAGS_1 0x6ffffffb +#define DT_VERDEF 0x6ffffffc + +#define DT_VERDEFNUM 0x6ffffffd +#define DT_VERNEED 0x6ffffffe + +#define DT_VERNEEDNUM 0x6fffffff +#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) +#define DT_VERSIONTAGNUM 16 + + + +#define DT_AUXILIARY 0x7ffffffd +#define DT_FILTER 0x7fffffff +#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1) +#define DT_EXTRANUM 3 + + +#define DF_ORIGIN 0x00000001 +#define DF_SYMBOLIC 0x00000002 +#define DF_TEXTREL 0x00000004 +#define DF_BIND_NOW 0x00000008 +#define DF_STATIC_TLS 0x00000010 + + + +#define DF_1_NOW 0x00000001 +#define DF_1_GLOBAL 0x00000002 +#define DF_1_GROUP 0x00000004 +#define DF_1_NODELETE 0x00000008 +#define DF_1_LOADFLTR 0x00000010 +#define DF_1_INITFIRST 0x00000020 +#define DF_1_NOOPEN 0x00000040 +#define DF_1_ORIGIN 0x00000080 +#define DF_1_DIRECT 0x00000100 +#define DF_1_TRANS 0x00000200 +#define DF_1_INTERPOSE 0x00000400 +#define DF_1_NODEFLIB 0x00000800 +#define DF_1_NODUMP 0x00001000 +#define DF_1_CONFALT 0x00002000 +#define DF_1_ENDFILTEE 0x00004000 +#define DF_1_DISPRELDNE 0x00008000 +#define DF_1_DISPRELPND 0x00010000 +#define DF_1_NODIRECT 0x00020000 +#define DF_1_IGNMULDEF 0x00040000 +#define DF_1_NOKSYMS 0x00080000 +#define DF_1_NOHDR 0x00100000 +#define DF_1_EDITED 0x00200000 +#define DF_1_NORELOC 0x00400000 +#define DF_1_SYMINTPOSE 0x00800000 +#define DF_1_GLOBAUDIT 0x01000000 +#define DF_1_SINGLETON 0x02000000 + +#define DTF_1_PARINIT 0x00000001 +#define DTF_1_CONFEXP 0x00000002 + + +#define DF_P1_LAZYLOAD 0x00000001 +#define DF_P1_GROUPPERM 0x00000002 + + + + +typedef struct { + Elf32_Half vd_version; + Elf32_Half vd_flags; + Elf32_Half vd_ndx; + Elf32_Half vd_cnt; + Elf32_Word vd_hash; + Elf32_Word vd_aux; + Elf32_Word vd_next; +} Elf32_Verdef; + +typedef struct { + Elf64_Half vd_version; + Elf64_Half vd_flags; + Elf64_Half vd_ndx; + Elf64_Half vd_cnt; + Elf64_Word vd_hash; + Elf64_Word vd_aux; + Elf64_Word vd_next; +} Elf64_Verdef; + + + +#define VER_DEF_NONE 0 +#define VER_DEF_CURRENT 1 +#define VER_DEF_NUM 2 + + +#define VER_FLG_BASE 0x1 +#define VER_FLG_WEAK 0x2 + + +#define VER_NDX_LOCAL 0 +#define VER_NDX_GLOBAL 1 +#define VER_NDX_LORESERVE 0xff00 +#define VER_NDX_ELIMINATE 0xff01 + + + +typedef struct { + Elf32_Word vda_name; + Elf32_Word vda_next; +} Elf32_Verdaux; + +typedef struct { + Elf64_Word vda_name; + Elf64_Word vda_next; +} Elf64_Verdaux; + + + + +typedef struct { + Elf32_Half vn_version; + Elf32_Half vn_cnt; + Elf32_Word vn_file; + Elf32_Word vn_aux; + Elf32_Word vn_next; +} Elf32_Verneed; + +typedef struct { + Elf64_Half vn_version; + Elf64_Half vn_cnt; + Elf64_Word vn_file; + Elf64_Word vn_aux; + Elf64_Word vn_next; +} Elf64_Verneed; + + + +#define VER_NEED_NONE 0 +#define VER_NEED_CURRENT 1 +#define VER_NEED_NUM 2 + + + +typedef struct { + Elf32_Word vna_hash; + Elf32_Half vna_flags; + Elf32_Half vna_other; + Elf32_Word vna_name; + Elf32_Word vna_next; +} Elf32_Vernaux; + +typedef struct { + Elf64_Word vna_hash; + Elf64_Half vna_flags; + Elf64_Half vna_other; + Elf64_Word vna_name; + Elf64_Word vna_next; +} Elf64_Vernaux; + + + +#define VER_FLG_WEAK 0x2 + + + +typedef struct { + uint32_t a_type; + union { + uint32_t a_val; + } a_un; +} Elf32_auxv_t; + +typedef struct { + uint64_t a_type; + union { + uint64_t a_val; + } a_un; +} Elf64_auxv_t; + + + +#define AT_NULL 0 +#define AT_IGNORE 1 +#define AT_EXECFD 2 +#define AT_PHDR 3 +#define AT_PHENT 4 +#define AT_PHNUM 5 +#define AT_PAGESZ 6 +#define AT_BASE 7 +#define AT_FLAGS 8 +#define AT_ENTRY 9 +#define AT_NOTELF 10 +#define AT_UID 11 +#define AT_EUID 12 +#define AT_GID 13 +#define AT_EGID 14 +#define AT_CLKTCK 17 + + +#define AT_PLATFORM 15 +#define AT_HWCAP 16 + + + + +#define AT_FPUCW 18 + + +#define AT_DCACHEBSIZE 19 +#define AT_ICACHEBSIZE 20 +#define AT_UCACHEBSIZE 21 + + + +#define AT_IGNOREPPC 22 + +#define AT_SECURE 23 + +#define AT_BASE_PLATFORM 24 + +#define AT_RANDOM 25 + +#define AT_HWCAP2 26 + +#define AT_EXECFN 31 + + + +#define AT_SYSINFO 32 +#define AT_SYSINFO_EHDR 33 + + + +#define AT_L1I_CACHESHAPE 34 +#define AT_L1D_CACHESHAPE 35 +#define AT_L2_CACHESHAPE 36 +#define AT_L3_CACHESHAPE 37 + + + + +typedef struct { + Elf32_Word n_namesz; + Elf32_Word n_descsz; + Elf32_Word n_type; +} Elf32_Nhdr; + +typedef struct { + Elf64_Word n_namesz; + Elf64_Word n_descsz; + Elf64_Word n_type; +} Elf64_Nhdr; + + + + +#define ELF_NOTE_SOLARIS "SUNW Solaris" + + +#define ELF_NOTE_GNU "GNU" + + + + + +#define ELF_NOTE_PAGESIZE_HINT 1 + + +#define NT_GNU_ABI_TAG 1 +#define ELF_NOTE_ABI NT_GNU_ABI_TAG + + + +#define ELF_NOTE_OS_LINUX 0 +#define ELF_NOTE_OS_GNU 1 +#define ELF_NOTE_OS_SOLARIS2 2 +#define ELF_NOTE_OS_FREEBSD 3 + +#define NT_GNU_BUILD_ID 3 +#define NT_GNU_GOLD_VERSION 4 + + + +typedef struct { + Elf32_Xword m_value; + Elf32_Word m_info; + Elf32_Word m_poffset; + Elf32_Half m_repeat; + Elf32_Half m_stride; +} Elf32_Move; + +typedef struct { + Elf64_Xword m_value; + Elf64_Xword m_info; + Elf64_Xword m_poffset; + Elf64_Half m_repeat; + Elf64_Half m_stride; +} Elf64_Move; + + +#define ELF32_M_SYM(info) ((info) >> 8) +#define ELF32_M_SIZE(info) ((unsigned char) (info)) +#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size)) + +#define ELF64_M_SYM(info) ELF32_M_SYM (info) +#define ELF64_M_SIZE(info) ELF32_M_SIZE (info) +#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size) + +#define EF_CPU32 0x00810000 + +#define R_68K_NONE 0 +#define R_68K_32 1 +#define R_68K_16 2 +#define R_68K_8 3 +#define R_68K_PC32 4 +#define R_68K_PC16 5 +#define R_68K_PC8 6 +#define R_68K_GOT32 7 +#define R_68K_GOT16 8 +#define R_68K_GOT8 9 +#define R_68K_GOT32O 10 +#define R_68K_GOT16O 11 +#define R_68K_GOT8O 12 +#define R_68K_PLT32 13 +#define R_68K_PLT16 14 +#define R_68K_PLT8 15 +#define R_68K_PLT32O 16 +#define R_68K_PLT16O 17 +#define R_68K_PLT8O 18 +#define R_68K_COPY 19 +#define R_68K_GLOB_DAT 20 +#define R_68K_JMP_SLOT 21 +#define R_68K_RELATIVE 22 +#define R_68K_NUM 23 + +#define R_386_NONE 0 +#define R_386_32 1 +#define R_386_PC32 2 +#define R_386_GOT32 3 +#define R_386_PLT32 4 +#define R_386_COPY 5 +#define R_386_GLOB_DAT 6 +#define R_386_JMP_SLOT 7 +#define R_386_RELATIVE 8 +#define R_386_GOTOFF 9 +#define R_386_GOTPC 10 +#define R_386_32PLT 11 +#define R_386_TLS_TPOFF 14 +#define R_386_TLS_IE 15 +#define R_386_TLS_GOTIE 16 +#define R_386_TLS_LE 17 +#define R_386_TLS_GD 18 +#define R_386_TLS_LDM 19 +#define R_386_16 20 +#define R_386_PC16 21 +#define R_386_8 22 +#define R_386_PC8 23 +#define R_386_TLS_GD_32 24 +#define R_386_TLS_GD_PUSH 25 +#define R_386_TLS_GD_CALL 26 +#define R_386_TLS_GD_POP 27 +#define R_386_TLS_LDM_32 28 +#define R_386_TLS_LDM_PUSH 29 +#define R_386_TLS_LDM_CALL 30 +#define R_386_TLS_LDM_POP 31 +#define R_386_TLS_LDO_32 32 +#define R_386_TLS_IE_32 33 +#define R_386_TLS_LE_32 34 +#define R_386_TLS_DTPMOD32 35 +#define R_386_TLS_DTPOFF32 36 +#define R_386_TLS_TPOFF32 37 +#define R_386_SIZE32 38 +#define R_386_TLS_GOTDESC 39 +#define R_386_TLS_DESC_CALL 40 +#define R_386_TLS_DESC 41 +#define R_386_IRELATIVE 42 +#define R_386_GOT32X 43 +#define R_386_NUM 44 + + + + + +#define STT_SPARC_REGISTER 13 + + + +#define EF_SPARCV9_MM 3 +#define EF_SPARCV9_TSO 0 +#define EF_SPARCV9_PSO 1 +#define EF_SPARCV9_RMO 2 +#define EF_SPARC_LEDATA 0x800000 +#define EF_SPARC_EXT_MASK 0xFFFF00 +#define EF_SPARC_32PLUS 0x000100 +#define EF_SPARC_SUN_US1 0x000200 +#define EF_SPARC_HAL_R1 0x000400 +#define EF_SPARC_SUN_US3 0x000800 + + + +#define R_SPARC_NONE 0 +#define R_SPARC_8 1 +#define R_SPARC_16 2 +#define R_SPARC_32 3 +#define R_SPARC_DISP8 4 +#define R_SPARC_DISP16 5 +#define R_SPARC_DISP32 6 +#define R_SPARC_WDISP30 7 +#define R_SPARC_WDISP22 8 +#define R_SPARC_HI22 9 +#define R_SPARC_22 10 +#define R_SPARC_13 11 +#define R_SPARC_LO10 12 +#define R_SPARC_GOT10 13 +#define R_SPARC_GOT13 14 +#define R_SPARC_GOT22 15 +#define R_SPARC_PC10 16 +#define R_SPARC_PC22 17 +#define R_SPARC_WPLT30 18 +#define R_SPARC_COPY 19 +#define R_SPARC_GLOB_DAT 20 +#define R_SPARC_JMP_SLOT 21 +#define R_SPARC_RELATIVE 22 +#define R_SPARC_UA32 23 + + + +#define R_SPARC_PLT32 24 +#define R_SPARC_HIPLT22 25 +#define R_SPARC_LOPLT10 26 +#define R_SPARC_PCPLT32 27 +#define R_SPARC_PCPLT22 28 +#define R_SPARC_PCPLT10 29 +#define R_SPARC_10 30 +#define R_SPARC_11 31 +#define R_SPARC_64 32 +#define R_SPARC_OLO10 33 +#define R_SPARC_HH22 34 +#define R_SPARC_HM10 35 +#define R_SPARC_LM22 36 +#define R_SPARC_PC_HH22 37 +#define R_SPARC_PC_HM10 38 +#define R_SPARC_PC_LM22 39 +#define R_SPARC_WDISP16 40 +#define R_SPARC_WDISP19 41 +#define R_SPARC_GLOB_JMP 42 +#define R_SPARC_7 43 +#define R_SPARC_5 44 +#define R_SPARC_6 45 +#define R_SPARC_DISP64 46 +#define R_SPARC_PLT64 47 +#define R_SPARC_HIX22 48 +#define R_SPARC_LOX10 49 +#define R_SPARC_H44 50 +#define R_SPARC_M44 51 +#define R_SPARC_L44 52 +#define R_SPARC_REGISTER 53 +#define R_SPARC_UA64 54 +#define R_SPARC_UA16 55 +#define R_SPARC_TLS_GD_HI22 56 +#define R_SPARC_TLS_GD_LO10 57 +#define R_SPARC_TLS_GD_ADD 58 +#define R_SPARC_TLS_GD_CALL 59 +#define R_SPARC_TLS_LDM_HI22 60 +#define R_SPARC_TLS_LDM_LO10 61 +#define R_SPARC_TLS_LDM_ADD 62 +#define R_SPARC_TLS_LDM_CALL 63 +#define R_SPARC_TLS_LDO_HIX22 64 +#define R_SPARC_TLS_LDO_LOX10 65 +#define R_SPARC_TLS_LDO_ADD 66 +#define R_SPARC_TLS_IE_HI22 67 +#define R_SPARC_TLS_IE_LO10 68 +#define R_SPARC_TLS_IE_LD 69 +#define R_SPARC_TLS_IE_LDX 70 +#define R_SPARC_TLS_IE_ADD 71 +#define R_SPARC_TLS_LE_HIX22 72 +#define R_SPARC_TLS_LE_LOX10 73 +#define R_SPARC_TLS_DTPMOD32 74 +#define R_SPARC_TLS_DTPMOD64 75 +#define R_SPARC_TLS_DTPOFF32 76 +#define R_SPARC_TLS_DTPOFF64 77 +#define R_SPARC_TLS_TPOFF32 78 +#define R_SPARC_TLS_TPOFF64 79 +#define R_SPARC_GOTDATA_HIX22 80 +#define R_SPARC_GOTDATA_LOX10 81 +#define R_SPARC_GOTDATA_OP_HIX22 82 +#define R_SPARC_GOTDATA_OP_LOX10 83 +#define R_SPARC_GOTDATA_OP 84 +#define R_SPARC_H34 85 +#define R_SPARC_SIZE32 86 +#define R_SPARC_SIZE64 87 +#define R_SPARC_GNU_VTINHERIT 250 +#define R_SPARC_GNU_VTENTRY 251 +#define R_SPARC_REV32 252 + +#define R_SPARC_NUM 253 + + + +#define DT_SPARC_REGISTER 0x70000001 +#define DT_SPARC_NUM 2 + + +#define EF_MIPS_NOREORDER 1 +#define EF_MIPS_PIC 2 +#define EF_MIPS_CPIC 4 +#define EF_MIPS_XGOT 8 +#define EF_MIPS_64BIT_WHIRL 16 +#define EF_MIPS_ABI2 32 +#define EF_MIPS_ABI_ON32 64 +#define EF_MIPS_FP64 512 +#define EF_MIPS_NAN2008 1024 +#define EF_MIPS_ARCH 0xf0000000 + + + +#define EF_MIPS_ARCH_1 0x00000000 +#define EF_MIPS_ARCH_2 0x10000000 +#define EF_MIPS_ARCH_3 0x20000000 +#define EF_MIPS_ARCH_4 0x30000000 +#define EF_MIPS_ARCH_5 0x40000000 +#define EF_MIPS_ARCH_32 0x50000000 +#define EF_MIPS_ARCH_64 0x60000000 +#define EF_MIPS_ARCH_32R2 0x70000000 +#define EF_MIPS_ARCH_64R2 0x80000000 + + +#define E_MIPS_ARCH_1 0x00000000 +#define E_MIPS_ARCH_2 0x10000000 +#define E_MIPS_ARCH_3 0x20000000 +#define E_MIPS_ARCH_4 0x30000000 +#define E_MIPS_ARCH_5 0x40000000 +#define E_MIPS_ARCH_32 0x50000000 +#define E_MIPS_ARCH_64 0x60000000 + + + +#define SHN_MIPS_ACOMMON 0xff00 +#define SHN_MIPS_TEXT 0xff01 +#define SHN_MIPS_DATA 0xff02 +#define SHN_MIPS_SCOMMON 0xff03 +#define SHN_MIPS_SUNDEFINED 0xff04 + + + +#define SHT_MIPS_LIBLIST 0x70000000 +#define SHT_MIPS_MSYM 0x70000001 +#define SHT_MIPS_CONFLICT 0x70000002 +#define SHT_MIPS_GPTAB 0x70000003 +#define SHT_MIPS_UCODE 0x70000004 +#define SHT_MIPS_DEBUG 0x70000005 +#define SHT_MIPS_REGINFO 0x70000006 +#define SHT_MIPS_PACKAGE 0x70000007 +#define SHT_MIPS_PACKSYM 0x70000008 +#define SHT_MIPS_RELD 0x70000009 +#define SHT_MIPS_IFACE 0x7000000b +#define SHT_MIPS_CONTENT 0x7000000c +#define SHT_MIPS_OPTIONS 0x7000000d +#define SHT_MIPS_SHDR 0x70000010 +#define SHT_MIPS_FDESC 0x70000011 +#define SHT_MIPS_EXTSYM 0x70000012 +#define SHT_MIPS_DENSE 0x70000013 +#define SHT_MIPS_PDESC 0x70000014 +#define SHT_MIPS_LOCSYM 0x70000015 +#define SHT_MIPS_AUXSYM 0x70000016 +#define SHT_MIPS_OPTSYM 0x70000017 +#define SHT_MIPS_LOCSTR 0x70000018 +#define SHT_MIPS_LINE 0x70000019 +#define SHT_MIPS_RFDESC 0x7000001a +#define SHT_MIPS_DELTASYM 0x7000001b +#define SHT_MIPS_DELTAINST 0x7000001c +#define SHT_MIPS_DELTACLASS 0x7000001d +#define SHT_MIPS_DWARF 0x7000001e +#define SHT_MIPS_DELTADECL 0x7000001f +#define SHT_MIPS_SYMBOL_LIB 0x70000020 +#define SHT_MIPS_EVENTS 0x70000021 +#define SHT_MIPS_TRANSLATE 0x70000022 +#define SHT_MIPS_PIXIE 0x70000023 +#define SHT_MIPS_XLATE 0x70000024 +#define SHT_MIPS_XLATE_DEBUG 0x70000025 +#define SHT_MIPS_WHIRL 0x70000026 +#define SHT_MIPS_EH_REGION 0x70000027 +#define SHT_MIPS_XLATE_OLD 0x70000028 +#define SHT_MIPS_PDR_EXCEPTION 0x70000029 + + + +#define SHF_MIPS_GPREL 0x10000000 +#define SHF_MIPS_MERGE 0x20000000 +#define SHF_MIPS_ADDR 0x40000000 +#define SHF_MIPS_STRINGS 0x80000000 +#define SHF_MIPS_NOSTRIP 0x08000000 +#define SHF_MIPS_LOCAL 0x04000000 +#define SHF_MIPS_NAMES 0x02000000 +#define SHF_MIPS_NODUPE 0x01000000 + + + + + +#define STO_MIPS_DEFAULT 0x0 +#define STO_MIPS_INTERNAL 0x1 +#define STO_MIPS_HIDDEN 0x2 +#define STO_MIPS_PROTECTED 0x3 +#define STO_MIPS_PLT 0x8 +#define STO_MIPS_SC_ALIGN_UNUSED 0xff + + +#define STB_MIPS_SPLIT_COMMON 13 + + + +typedef union { + struct { + Elf32_Word gt_current_g_value; + Elf32_Word gt_unused; + } gt_header; + struct { + Elf32_Word gt_g_value; + Elf32_Word gt_bytes; + } gt_entry; +} Elf32_gptab; + + + +typedef struct { + Elf32_Word ri_gprmask; + Elf32_Word ri_cprmask[4]; + Elf32_Sword ri_gp_value; +} Elf32_RegInfo; + + + +typedef struct { + unsigned char kind; + + unsigned char size; + Elf32_Section section; + + Elf32_Word info; +} Elf_Options; + + + +#define ODK_NULL 0 +#define ODK_REGINFO 1 +#define ODK_EXCEPTIONS 2 +#define ODK_PAD 3 +#define ODK_HWPATCH 4 +#define ODK_FILL 5 +#define ODK_TAGS 6 +#define ODK_HWAND 7 +#define ODK_HWOR 8 + + + +#define OEX_FPU_MIN 0x1f +#define OEX_FPU_MAX 0x1f00 +#define OEX_PAGE0 0x10000 +#define OEX_SMM 0x20000 +#define OEX_FPDBUG 0x40000 +#define OEX_PRECISEFP OEX_FPDBUG +#define OEX_DISMISS 0x80000 + +#define OEX_FPU_INVAL 0x10 +#define OEX_FPU_DIV0 0x08 +#define OEX_FPU_OFLO 0x04 +#define OEX_FPU_UFLO 0x02 +#define OEX_FPU_INEX 0x01 + + + +#define OHW_R4KEOP 0x1 +#define OHW_R8KPFETCH 0x2 +#define OHW_R5KEOP 0x4 +#define OHW_R5KCVTL 0x8 + +#define OPAD_PREFIX 0x1 +#define OPAD_POSTFIX 0x2 +#define OPAD_SYMBOL 0x4 + + + +typedef struct { + Elf32_Word hwp_flags1; + Elf32_Word hwp_flags2; +} Elf_Options_Hw; + + + +#define OHWA0_R4KEOP_CHECKED 0x00000001 +#define OHWA1_R4KEOP_CLEAN 0x00000002 + + + +#define R_MIPS_NONE 0 +#define R_MIPS_16 1 +#define R_MIPS_32 2 +#define R_MIPS_REL32 3 +#define R_MIPS_26 4 +#define R_MIPS_HI16 5 +#define R_MIPS_LO16 6 +#define R_MIPS_GPREL16 7 +#define R_MIPS_LITERAL 8 +#define R_MIPS_GOT16 9 +#define R_MIPS_PC16 10 +#define R_MIPS_CALL16 11 +#define R_MIPS_GPREL32 12 + +#define R_MIPS_SHIFT5 16 +#define R_MIPS_SHIFT6 17 +#define R_MIPS_64 18 +#define R_MIPS_GOT_DISP 19 +#define R_MIPS_GOT_PAGE 20 +#define R_MIPS_GOT_OFST 21 +#define R_MIPS_GOT_HI16 22 +#define R_MIPS_GOT_LO16 23 +#define R_MIPS_SUB 24 +#define R_MIPS_INSERT_A 25 +#define R_MIPS_INSERT_B 26 +#define R_MIPS_DELETE 27 +#define R_MIPS_HIGHER 28 +#define R_MIPS_HIGHEST 29 +#define R_MIPS_CALL_HI16 30 +#define R_MIPS_CALL_LO16 31 +#define R_MIPS_SCN_DISP 32 +#define R_MIPS_REL16 33 +#define R_MIPS_ADD_IMMEDIATE 34 +#define R_MIPS_PJUMP 35 +#define R_MIPS_RELGOT 36 +#define R_MIPS_JALR 37 +#define R_MIPS_TLS_DTPMOD32 38 +#define R_MIPS_TLS_DTPREL32 39 +#define R_MIPS_TLS_DTPMOD64 40 +#define R_MIPS_TLS_DTPREL64 41 +#define R_MIPS_TLS_GD 42 +#define R_MIPS_TLS_LDM 43 +#define R_MIPS_TLS_DTPREL_HI16 44 +#define R_MIPS_TLS_DTPREL_LO16 45 +#define R_MIPS_TLS_GOTTPREL 46 +#define R_MIPS_TLS_TPREL32 47 +#define R_MIPS_TLS_TPREL64 48 +#define R_MIPS_TLS_TPREL_HI16 49 +#define R_MIPS_TLS_TPREL_LO16 50 +#define R_MIPS_GLOB_DAT 51 +#define R_MIPS_COPY 126 +#define R_MIPS_JUMP_SLOT 127 + +#define R_MIPS_NUM 128 + + + +#define PT_MIPS_REGINFO 0x70000000 +#define PT_MIPS_RTPROC 0x70000001 +#define PT_MIPS_OPTIONS 0x70000002 +#define PT_MIPS_ABIFLAGS 0x70000003 + + + +#define PF_MIPS_LOCAL 0x10000000 + + + +#define DT_MIPS_RLD_VERSION 0x70000001 +#define DT_MIPS_TIME_STAMP 0x70000002 +#define DT_MIPS_ICHECKSUM 0x70000003 +#define DT_MIPS_IVERSION 0x70000004 +#define DT_MIPS_FLAGS 0x70000005 +#define DT_MIPS_BASE_ADDRESS 0x70000006 +#define DT_MIPS_MSYM 0x70000007 +#define DT_MIPS_CONFLICT 0x70000008 +#define DT_MIPS_LIBLIST 0x70000009 +#define DT_MIPS_LOCAL_GOTNO 0x7000000a +#define DT_MIPS_CONFLICTNO 0x7000000b +#define DT_MIPS_LIBLISTNO 0x70000010 +#define DT_MIPS_SYMTABNO 0x70000011 +#define DT_MIPS_UNREFEXTNO 0x70000012 +#define DT_MIPS_GOTSYM 0x70000013 +#define DT_MIPS_HIPAGENO 0x70000014 +#define DT_MIPS_RLD_MAP 0x70000016 +#define DT_MIPS_DELTA_CLASS 0x70000017 +#define DT_MIPS_DELTA_CLASS_NO 0x70000018 + +#define DT_MIPS_DELTA_INSTANCE 0x70000019 +#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a + +#define DT_MIPS_DELTA_RELOC 0x7000001b +#define DT_MIPS_DELTA_RELOC_NO 0x7000001c + +#define DT_MIPS_DELTA_SYM 0x7000001d + +#define DT_MIPS_DELTA_SYM_NO 0x7000001e + +#define DT_MIPS_DELTA_CLASSSYM 0x70000020 + +#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 + +#define DT_MIPS_CXX_FLAGS 0x70000022 +#define DT_MIPS_PIXIE_INIT 0x70000023 +#define DT_MIPS_SYMBOL_LIB 0x70000024 +#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025 +#define DT_MIPS_LOCAL_GOTIDX 0x70000026 +#define DT_MIPS_HIDDEN_GOTIDX 0x70000027 +#define DT_MIPS_PROTECTED_GOTIDX 0x70000028 +#define DT_MIPS_OPTIONS 0x70000029 +#define DT_MIPS_INTERFACE 0x7000002a +#define DT_MIPS_DYNSTR_ALIGN 0x7000002b +#define DT_MIPS_INTERFACE_SIZE 0x7000002c +#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d + +#define DT_MIPS_PERF_SUFFIX 0x7000002e + +#define DT_MIPS_COMPACT_SIZE 0x7000002f +#define DT_MIPS_GP_VALUE 0x70000030 +#define DT_MIPS_AUX_DYNAMIC 0x70000031 + +#define DT_MIPS_PLTGOT 0x70000032 + +#define DT_MIPS_RWPLT 0x70000034 +#define DT_MIPS_RLD_MAP_REL 0x70000035 +#define DT_MIPS_NUM 0x36 + + + +#define RHF_NONE 0 +#define RHF_QUICKSTART (1 << 0) +#define RHF_NOTPOT (1 << 1) +#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) +#define RHF_NO_MOVE (1 << 3) +#define RHF_SGI_ONLY (1 << 4) +#define RHF_GUARANTEE_INIT (1 << 5) +#define RHF_DELTA_C_PLUS_PLUS (1 << 6) +#define RHF_GUARANTEE_START_INIT (1 << 7) +#define RHF_PIXIE (1 << 8) +#define RHF_DEFAULT_DELAY_LOAD (1 << 9) +#define RHF_REQUICKSTART (1 << 10) +#define RHF_REQUICKSTARTED (1 << 11) +#define RHF_CORD (1 << 12) +#define RHF_NO_UNRES_UNDEF (1 << 13) +#define RHF_RLD_ORDER_SAFE (1 << 14) + + + +typedef struct { + Elf32_Word l_name; + Elf32_Word l_time_stamp; + Elf32_Word l_checksum; + Elf32_Word l_version; + Elf32_Word l_flags; +} Elf32_Lib; + +typedef struct { + Elf64_Word l_name; + Elf64_Word l_time_stamp; + Elf64_Word l_checksum; + Elf64_Word l_version; + Elf64_Word l_flags; +} Elf64_Lib; + + + + +#define LL_NONE 0 +#define LL_EXACT_MATCH (1 << 0) +#define LL_IGNORE_INT_VER (1 << 1) +#define LL_REQUIRE_MINOR (1 << 2) +#define LL_EXPORTS (1 << 3) +#define LL_DELAY_LOAD (1 << 4) +#define LL_DELTA (1 << 5) + + + +typedef Elf32_Addr Elf32_Conflict; + +typedef struct { + Elf32_Half version; + unsigned char isa_level; + unsigned char isa_rev; + unsigned char gpr_size; + unsigned char cpr1_size; + unsigned char cpr2_size; + unsigned char fp_abi; + Elf32_Word isa_ext; + Elf32_Word ases; + Elf32_Word flags1; + Elf32_Word flags2; +} Elf_MIPS_ABIFlags_v0; + +#define MIPS_AFL_REG_NONE 0x00 +#define MIPS_AFL_REG_32 0x01 +#define MIPS_AFL_REG_64 0x02 +#define MIPS_AFL_REG_128 0x03 + +#define MIPS_AFL_ASE_DSP 0x00000001 +#define MIPS_AFL_ASE_DSPR2 0x00000002 +#define MIPS_AFL_ASE_EVA 0x00000004 +#define MIPS_AFL_ASE_MCU 0x00000008 +#define MIPS_AFL_ASE_MDMX 0x00000010 +#define MIPS_AFL_ASE_MIPS3D 0x00000020 +#define MIPS_AFL_ASE_MT 0x00000040 +#define MIPS_AFL_ASE_SMARTMIPS 0x00000080 +#define MIPS_AFL_ASE_VIRT 0x00000100 +#define MIPS_AFL_ASE_MSA 0x00000200 +#define MIPS_AFL_ASE_MIPS16 0x00000400 +#define MIPS_AFL_ASE_MICROMIPS 0x00000800 +#define MIPS_AFL_ASE_XPA 0x00001000 +#define MIPS_AFL_ASE_MASK 0x00001fff + +#define MIPS_AFL_EXT_XLR 1 +#define MIPS_AFL_EXT_OCTEON2 2 +#define MIPS_AFL_EXT_OCTEONP 3 +#define MIPS_AFL_EXT_LOONGSON_3A 4 +#define MIPS_AFL_EXT_OCTEON 5 +#define MIPS_AFL_EXT_5900 6 +#define MIPS_AFL_EXT_4650 7 +#define MIPS_AFL_EXT_4010 8 +#define MIPS_AFL_EXT_4100 9 +#define MIPS_AFL_EXT_3900 10 +#define MIPS_AFL_EXT_10000 11 +#define MIPS_AFL_EXT_SB1 12 +#define MIPS_AFL_EXT_4111 13 +#define MIPS_AFL_EXT_4120 14 +#define MIPS_AFL_EXT_5400 15 +#define MIPS_AFL_EXT_5500 16 +#define MIPS_AFL_EXT_LOONGSON_2E 17 +#define MIPS_AFL_EXT_LOONGSON_2F 18 + +#define MIPS_AFL_FLAGS1_ODDSPREG 1 + +enum +{ + Val_GNU_MIPS_ABI_FP_ANY = 0, + Val_GNU_MIPS_ABI_FP_DOUBLE = 1, + Val_GNU_MIPS_ABI_FP_SINGLE = 2, + Val_GNU_MIPS_ABI_FP_SOFT = 3, + Val_GNU_MIPS_ABI_FP_OLD_64 = 4, + Val_GNU_MIPS_ABI_FP_XX = 5, + Val_GNU_MIPS_ABI_FP_64 = 6, + Val_GNU_MIPS_ABI_FP_64A = 7, + Val_GNU_MIPS_ABI_FP_MAX = 7 +}; + + + + +#define EF_PARISC_TRAPNIL 0x00010000 +#define EF_PARISC_EXT 0x00020000 +#define EF_PARISC_LSB 0x00040000 +#define EF_PARISC_WIDE 0x00080000 +#define EF_PARISC_NO_KABP 0x00100000 + +#define EF_PARISC_LAZYSWAP 0x00400000 +#define EF_PARISC_ARCH 0x0000ffff + + + +#define EFA_PARISC_1_0 0x020b +#define EFA_PARISC_1_1 0x0210 +#define EFA_PARISC_2_0 0x0214 + + + +#define SHN_PARISC_ANSI_COMMON 0xff00 + +#define SHN_PARISC_HUGE_COMMON 0xff01 + + + +#define SHT_PARISC_EXT 0x70000000 +#define SHT_PARISC_UNWIND 0x70000001 +#define SHT_PARISC_DOC 0x70000002 + + + +#define SHF_PARISC_SHORT 0x20000000 +#define SHF_PARISC_HUGE 0x40000000 +#define SHF_PARISC_SBP 0x80000000 + + + +#define STT_PARISC_MILLICODE 13 + +#define STT_HP_OPAQUE (STT_LOOS + 0x1) +#define STT_HP_STUB (STT_LOOS + 0x2) + + + +#define R_PARISC_NONE 0 +#define R_PARISC_DIR32 1 +#define R_PARISC_DIR21L 2 +#define R_PARISC_DIR17R 3 +#define R_PARISC_DIR17F 4 +#define R_PARISC_DIR14R 6 +#define R_PARISC_PCREL32 9 +#define R_PARISC_PCREL21L 10 +#define R_PARISC_PCREL17R 11 +#define R_PARISC_PCREL17F 12 +#define R_PARISC_PCREL14R 14 +#define R_PARISC_DPREL21L 18 +#define R_PARISC_DPREL14R 22 +#define R_PARISC_GPREL21L 26 +#define R_PARISC_GPREL14R 30 +#define R_PARISC_LTOFF21L 34 +#define R_PARISC_LTOFF14R 38 +#define R_PARISC_SECREL32 41 +#define R_PARISC_SEGBASE 48 +#define R_PARISC_SEGREL32 49 +#define R_PARISC_PLTOFF21L 50 +#define R_PARISC_PLTOFF14R 54 +#define R_PARISC_LTOFF_FPTR32 57 +#define R_PARISC_LTOFF_FPTR21L 58 +#define R_PARISC_LTOFF_FPTR14R 62 +#define R_PARISC_FPTR64 64 +#define R_PARISC_PLABEL32 65 +#define R_PARISC_PLABEL21L 66 +#define R_PARISC_PLABEL14R 70 +#define R_PARISC_PCREL64 72 +#define R_PARISC_PCREL22F 74 +#define R_PARISC_PCREL14WR 75 +#define R_PARISC_PCREL14DR 76 +#define R_PARISC_PCREL16F 77 +#define R_PARISC_PCREL16WF 78 +#define R_PARISC_PCREL16DF 79 +#define R_PARISC_DIR64 80 +#define R_PARISC_DIR14WR 83 +#define R_PARISC_DIR14DR 84 +#define R_PARISC_DIR16F 85 +#define R_PARISC_DIR16WF 86 +#define R_PARISC_DIR16DF 87 +#define R_PARISC_GPREL64 88 +#define R_PARISC_GPREL14WR 91 +#define R_PARISC_GPREL14DR 92 +#define R_PARISC_GPREL16F 93 +#define R_PARISC_GPREL16WF 94 +#define R_PARISC_GPREL16DF 95 +#define R_PARISC_LTOFF64 96 +#define R_PARISC_LTOFF14WR 99 +#define R_PARISC_LTOFF14DR 100 +#define R_PARISC_LTOFF16F 101 +#define R_PARISC_LTOFF16WF 102 +#define R_PARISC_LTOFF16DF 103 +#define R_PARISC_SECREL64 104 +#define R_PARISC_SEGREL64 112 +#define R_PARISC_PLTOFF14WR 115 +#define R_PARISC_PLTOFF14DR 116 +#define R_PARISC_PLTOFF16F 117 +#define R_PARISC_PLTOFF16WF 118 +#define R_PARISC_PLTOFF16DF 119 +#define R_PARISC_LTOFF_FPTR64 120 +#define R_PARISC_LTOFF_FPTR14WR 123 +#define R_PARISC_LTOFF_FPTR14DR 124 +#define R_PARISC_LTOFF_FPTR16F 125 +#define R_PARISC_LTOFF_FPTR16WF 126 +#define R_PARISC_LTOFF_FPTR16DF 127 +#define R_PARISC_LORESERVE 128 +#define R_PARISC_COPY 128 +#define R_PARISC_IPLT 129 +#define R_PARISC_EPLT 130 +#define R_PARISC_TPREL32 153 +#define R_PARISC_TPREL21L 154 +#define R_PARISC_TPREL14R 158 +#define R_PARISC_LTOFF_TP21L 162 +#define R_PARISC_LTOFF_TP14R 166 +#define R_PARISC_LTOFF_TP14F 167 +#define R_PARISC_TPREL64 216 +#define R_PARISC_TPREL14WR 219 +#define R_PARISC_TPREL14DR 220 +#define R_PARISC_TPREL16F 221 +#define R_PARISC_TPREL16WF 222 +#define R_PARISC_TPREL16DF 223 +#define R_PARISC_LTOFF_TP64 224 +#define R_PARISC_LTOFF_TP14WR 227 +#define R_PARISC_LTOFF_TP14DR 228 +#define R_PARISC_LTOFF_TP16F 229 +#define R_PARISC_LTOFF_TP16WF 230 +#define R_PARISC_LTOFF_TP16DF 231 +#define R_PARISC_GNU_VTENTRY 232 +#define R_PARISC_GNU_VTINHERIT 233 +#define R_PARISC_TLS_GD21L 234 +#define R_PARISC_TLS_GD14R 235 +#define R_PARISC_TLS_GDCALL 236 +#define R_PARISC_TLS_LDM21L 237 +#define R_PARISC_TLS_LDM14R 238 +#define R_PARISC_TLS_LDMCALL 239 +#define R_PARISC_TLS_LDO21L 240 +#define R_PARISC_TLS_LDO14R 241 +#define R_PARISC_TLS_DTPMOD32 242 +#define R_PARISC_TLS_DTPMOD64 243 +#define R_PARISC_TLS_DTPOFF32 244 +#define R_PARISC_TLS_DTPOFF64 245 +#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L +#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R +#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L +#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R +#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32 +#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64 +#define R_PARISC_HIRESERVE 255 + + + +#define PT_HP_TLS (PT_LOOS + 0x0) +#define PT_HP_CORE_NONE (PT_LOOS + 0x1) +#define PT_HP_CORE_VERSION (PT_LOOS + 0x2) +#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3) +#define PT_HP_CORE_COMM (PT_LOOS + 0x4) +#define PT_HP_CORE_PROC (PT_LOOS + 0x5) +#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6) +#define PT_HP_CORE_STACK (PT_LOOS + 0x7) +#define PT_HP_CORE_SHM (PT_LOOS + 0x8) +#define PT_HP_CORE_MMF (PT_LOOS + 0x9) +#define PT_HP_PARALLEL (PT_LOOS + 0x10) +#define PT_HP_FASTBIND (PT_LOOS + 0x11) +#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12) +#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13) +#define PT_HP_STACK (PT_LOOS + 0x14) + +#define PT_PARISC_ARCHEXT 0x70000000 +#define PT_PARISC_UNWIND 0x70000001 + + + +#define PF_PARISC_SBP 0x08000000 + +#define PF_HP_PAGE_SIZE 0x00100000 +#define PF_HP_FAR_SHARED 0x00200000 +#define PF_HP_NEAR_SHARED 0x00400000 +#define PF_HP_CODE 0x01000000 +#define PF_HP_MODIFY 0x02000000 +#define PF_HP_LAZYSWAP 0x04000000 +#define PF_HP_SBP 0x08000000 + + + + + + +#define EF_ALPHA_32BIT 1 +#define EF_ALPHA_CANRELAX 2 + + + + +#define SHT_ALPHA_DEBUG 0x70000001 +#define SHT_ALPHA_REGINFO 0x70000002 + + + +#define SHF_ALPHA_GPREL 0x10000000 + + +#define STO_ALPHA_NOPV 0x80 +#define STO_ALPHA_STD_GPLOAD 0x88 + + + +#define R_ALPHA_NONE 0 +#define R_ALPHA_REFLONG 1 +#define R_ALPHA_REFQUAD 2 +#define R_ALPHA_GPREL32 3 +#define R_ALPHA_LITERAL 4 +#define R_ALPHA_LITUSE 5 +#define R_ALPHA_GPDISP 6 +#define R_ALPHA_BRADDR 7 +#define R_ALPHA_HINT 8 +#define R_ALPHA_SREL16 9 +#define R_ALPHA_SREL32 10 +#define R_ALPHA_SREL64 11 +#define R_ALPHA_GPRELHIGH 17 +#define R_ALPHA_GPRELLOW 18 +#define R_ALPHA_GPREL16 19 +#define R_ALPHA_COPY 24 +#define R_ALPHA_GLOB_DAT 25 +#define R_ALPHA_JMP_SLOT 26 +#define R_ALPHA_RELATIVE 27 +#define R_ALPHA_TLS_GD_HI 28 +#define R_ALPHA_TLSGD 29 +#define R_ALPHA_TLS_LDM 30 +#define R_ALPHA_DTPMOD64 31 +#define R_ALPHA_GOTDTPREL 32 +#define R_ALPHA_DTPREL64 33 +#define R_ALPHA_DTPRELHI 34 +#define R_ALPHA_DTPRELLO 35 +#define R_ALPHA_DTPREL16 36 +#define R_ALPHA_GOTTPREL 37 +#define R_ALPHA_TPREL64 38 +#define R_ALPHA_TPRELHI 39 +#define R_ALPHA_TPRELLO 40 +#define R_ALPHA_TPREL16 41 + +#define R_ALPHA_NUM 46 + + +#define LITUSE_ALPHA_ADDR 0 +#define LITUSE_ALPHA_BASE 1 +#define LITUSE_ALPHA_BYTOFF 2 +#define LITUSE_ALPHA_JSR 3 +#define LITUSE_ALPHA_TLS_GD 4 +#define LITUSE_ALPHA_TLS_LDM 5 + + +#define DT_ALPHA_PLTRO (DT_LOPROC + 0) +#define DT_ALPHA_NUM 1 + + + + +#define EF_PPC_EMB 0x80000000 + + +#define EF_PPC_RELOCATABLE 0x00010000 +#define EF_PPC_RELOCATABLE_LIB 0x00008000 + + + +#define R_PPC_NONE 0 +#define R_PPC_ADDR32 1 +#define R_PPC_ADDR24 2 +#define R_PPC_ADDR16 3 +#define R_PPC_ADDR16_LO 4 +#define R_PPC_ADDR16_HI 5 +#define R_PPC_ADDR16_HA 6 +#define R_PPC_ADDR14 7 +#define R_PPC_ADDR14_BRTAKEN 8 +#define R_PPC_ADDR14_BRNTAKEN 9 +#define R_PPC_REL24 10 +#define R_PPC_REL14 11 +#define R_PPC_REL14_BRTAKEN 12 +#define R_PPC_REL14_BRNTAKEN 13 +#define R_PPC_GOT16 14 +#define R_PPC_GOT16_LO 15 +#define R_PPC_GOT16_HI 16 +#define R_PPC_GOT16_HA 17 +#define R_PPC_PLTREL24 18 +#define R_PPC_COPY 19 +#define R_PPC_GLOB_DAT 20 +#define R_PPC_JMP_SLOT 21 +#define R_PPC_RELATIVE 22 +#define R_PPC_LOCAL24PC 23 +#define R_PPC_UADDR32 24 +#define R_PPC_UADDR16 25 +#define R_PPC_REL32 26 +#define R_PPC_PLT32 27 +#define R_PPC_PLTREL32 28 +#define R_PPC_PLT16_LO 29 +#define R_PPC_PLT16_HI 30 +#define R_PPC_PLT16_HA 31 +#define R_PPC_SDAREL16 32 +#define R_PPC_SECTOFF 33 +#define R_PPC_SECTOFF_LO 34 +#define R_PPC_SECTOFF_HI 35 +#define R_PPC_SECTOFF_HA 36 + + +#define R_PPC_TLS 67 +#define R_PPC_DTPMOD32 68 +#define R_PPC_TPREL16 69 +#define R_PPC_TPREL16_LO 70 +#define R_PPC_TPREL16_HI 71 +#define R_PPC_TPREL16_HA 72 +#define R_PPC_TPREL32 73 +#define R_PPC_DTPREL16 74 +#define R_PPC_DTPREL16_LO 75 +#define R_PPC_DTPREL16_HI 76 +#define R_PPC_DTPREL16_HA 77 +#define R_PPC_DTPREL32 78 +#define R_PPC_GOT_TLSGD16 79 +#define R_PPC_GOT_TLSGD16_LO 80 +#define R_PPC_GOT_TLSGD16_HI 81 +#define R_PPC_GOT_TLSGD16_HA 82 +#define R_PPC_GOT_TLSLD16 83 +#define R_PPC_GOT_TLSLD16_LO 84 +#define R_PPC_GOT_TLSLD16_HI 85 +#define R_PPC_GOT_TLSLD16_HA 86 +#define R_PPC_GOT_TPREL16 87 +#define R_PPC_GOT_TPREL16_LO 88 +#define R_PPC_GOT_TPREL16_HI 89 +#define R_PPC_GOT_TPREL16_HA 90 +#define R_PPC_GOT_DTPREL16 91 +#define R_PPC_GOT_DTPREL16_LO 92 +#define R_PPC_GOT_DTPREL16_HI 93 +#define R_PPC_GOT_DTPREL16_HA 94 +#define R_PPC_TLSGD 95 +#define R_PPC_TLSLD 96 + + +#define R_PPC_EMB_NADDR32 101 +#define R_PPC_EMB_NADDR16 102 +#define R_PPC_EMB_NADDR16_LO 103 +#define R_PPC_EMB_NADDR16_HI 104 +#define R_PPC_EMB_NADDR16_HA 105 +#define R_PPC_EMB_SDAI16 106 +#define R_PPC_EMB_SDA2I16 107 +#define R_PPC_EMB_SDA2REL 108 +#define R_PPC_EMB_SDA21 109 +#define R_PPC_EMB_MRKREF 110 +#define R_PPC_EMB_RELSEC16 111 +#define R_PPC_EMB_RELST_LO 112 +#define R_PPC_EMB_RELST_HI 113 +#define R_PPC_EMB_RELST_HA 114 +#define R_PPC_EMB_BIT_FLD 115 +#define R_PPC_EMB_RELSDA 116 + + +#define R_PPC_DIAB_SDA21_LO 180 +#define R_PPC_DIAB_SDA21_HI 181 +#define R_PPC_DIAB_SDA21_HA 182 +#define R_PPC_DIAB_RELSDA_LO 183 +#define R_PPC_DIAB_RELSDA_HI 184 +#define R_PPC_DIAB_RELSDA_HA 185 + + +#define R_PPC_IRELATIVE 248 + + +#define R_PPC_REL16 249 +#define R_PPC_REL16_LO 250 +#define R_PPC_REL16_HI 251 +#define R_PPC_REL16_HA 252 + + + +#define R_PPC_TOC16 255 + + +#define DT_PPC_GOT (DT_LOPROC + 0) +#define DT_PPC_OPT (DT_LOPROC + 1) +#define DT_PPC_NUM 2 + +#define PPC_OPT_TLS 1 + + +#define R_PPC64_NONE R_PPC_NONE +#define R_PPC64_ADDR32 R_PPC_ADDR32 +#define R_PPC64_ADDR24 R_PPC_ADDR24 +#define R_PPC64_ADDR16 R_PPC_ADDR16 +#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO +#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI +#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA +#define R_PPC64_ADDR14 R_PPC_ADDR14 +#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN +#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN +#define R_PPC64_REL24 R_PPC_REL24 +#define R_PPC64_REL14 R_PPC_REL14 +#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN +#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN +#define R_PPC64_GOT16 R_PPC_GOT16 +#define R_PPC64_GOT16_LO R_PPC_GOT16_LO +#define R_PPC64_GOT16_HI R_PPC_GOT16_HI +#define R_PPC64_GOT16_HA R_PPC_GOT16_HA + +#define R_PPC64_COPY R_PPC_COPY +#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT +#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT +#define R_PPC64_RELATIVE R_PPC_RELATIVE + +#define R_PPC64_UADDR32 R_PPC_UADDR32 +#define R_PPC64_UADDR16 R_PPC_UADDR16 +#define R_PPC64_REL32 R_PPC_REL32 +#define R_PPC64_PLT32 R_PPC_PLT32 +#define R_PPC64_PLTREL32 R_PPC_PLTREL32 +#define R_PPC64_PLT16_LO R_PPC_PLT16_LO +#define R_PPC64_PLT16_HI R_PPC_PLT16_HI +#define R_PPC64_PLT16_HA R_PPC_PLT16_HA + +#define R_PPC64_SECTOFF R_PPC_SECTOFF +#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO +#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI +#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA +#define R_PPC64_ADDR30 37 +#define R_PPC64_ADDR64 38 +#define R_PPC64_ADDR16_HIGHER 39 +#define R_PPC64_ADDR16_HIGHERA 40 +#define R_PPC64_ADDR16_HIGHEST 41 +#define R_PPC64_ADDR16_HIGHESTA 42 +#define R_PPC64_UADDR64 43 +#define R_PPC64_REL64 44 +#define R_PPC64_PLT64 45 +#define R_PPC64_PLTREL64 46 +#define R_PPC64_TOC16 47 +#define R_PPC64_TOC16_LO 48 +#define R_PPC64_TOC16_HI 49 +#define R_PPC64_TOC16_HA 50 +#define R_PPC64_TOC 51 +#define R_PPC64_PLTGOT16 52 +#define R_PPC64_PLTGOT16_LO 53 +#define R_PPC64_PLTGOT16_HI 54 +#define R_PPC64_PLTGOT16_HA 55 + +#define R_PPC64_ADDR16_DS 56 +#define R_PPC64_ADDR16_LO_DS 57 +#define R_PPC64_GOT16_DS 58 +#define R_PPC64_GOT16_LO_DS 59 +#define R_PPC64_PLT16_LO_DS 60 +#define R_PPC64_SECTOFF_DS 61 +#define R_PPC64_SECTOFF_LO_DS 62 +#define R_PPC64_TOC16_DS 63 +#define R_PPC64_TOC16_LO_DS 64 +#define R_PPC64_PLTGOT16_DS 65 +#define R_PPC64_PLTGOT16_LO_DS 66 + + +#define R_PPC64_TLS 67 +#define R_PPC64_DTPMOD64 68 +#define R_PPC64_TPREL16 69 +#define R_PPC64_TPREL16_LO 70 +#define R_PPC64_TPREL16_HI 71 +#define R_PPC64_TPREL16_HA 72 +#define R_PPC64_TPREL64 73 +#define R_PPC64_DTPREL16 74 +#define R_PPC64_DTPREL16_LO 75 +#define R_PPC64_DTPREL16_HI 76 +#define R_PPC64_DTPREL16_HA 77 +#define R_PPC64_DTPREL64 78 +#define R_PPC64_GOT_TLSGD16 79 +#define R_PPC64_GOT_TLSGD16_LO 80 +#define R_PPC64_GOT_TLSGD16_HI 81 +#define R_PPC64_GOT_TLSGD16_HA 82 +#define R_PPC64_GOT_TLSLD16 83 +#define R_PPC64_GOT_TLSLD16_LO 84 +#define R_PPC64_GOT_TLSLD16_HI 85 +#define R_PPC64_GOT_TLSLD16_HA 86 +#define R_PPC64_GOT_TPREL16_DS 87 +#define R_PPC64_GOT_TPREL16_LO_DS 88 +#define R_PPC64_GOT_TPREL16_HI 89 +#define R_PPC64_GOT_TPREL16_HA 90 +#define R_PPC64_GOT_DTPREL16_DS 91 +#define R_PPC64_GOT_DTPREL16_LO_DS 92 +#define R_PPC64_GOT_DTPREL16_HI 93 +#define R_PPC64_GOT_DTPREL16_HA 94 +#define R_PPC64_TPREL16_DS 95 +#define R_PPC64_TPREL16_LO_DS 96 +#define R_PPC64_TPREL16_HIGHER 97 +#define R_PPC64_TPREL16_HIGHERA 98 +#define R_PPC64_TPREL16_HIGHEST 99 +#define R_PPC64_TPREL16_HIGHESTA 100 +#define R_PPC64_DTPREL16_DS 101 +#define R_PPC64_DTPREL16_LO_DS 102 +#define R_PPC64_DTPREL16_HIGHER 103 +#define R_PPC64_DTPREL16_HIGHERA 104 +#define R_PPC64_DTPREL16_HIGHEST 105 +#define R_PPC64_DTPREL16_HIGHESTA 106 +#define R_PPC64_TLSGD 107 +#define R_PPC64_TLSLD 108 +#define R_PPC64_TOCSAVE 109 +#define R_PPC64_ADDR16_HIGH 110 +#define R_PPC64_ADDR16_HIGHA 111 +#define R_PPC64_TPREL16_HIGH 112 +#define R_PPC64_TPREL16_HIGHA 113 +#define R_PPC64_DTPREL16_HIGH 114 +#define R_PPC64_DTPREL16_HIGHA 115 + + +#define R_PPC64_JMP_IREL 247 +#define R_PPC64_IRELATIVE 248 +#define R_PPC64_REL16 249 +#define R_PPC64_REL16_LO 250 +#define R_PPC64_REL16_HI 251 +#define R_PPC64_REL16_HA 252 + +#define EF_PPC64_ABI 3 + +#define DT_PPC64_GLINK (DT_LOPROC + 0) +#define DT_PPC64_OPD (DT_LOPROC + 1) +#define DT_PPC64_OPDSZ (DT_LOPROC + 2) +#define DT_PPC64_OPT (DT_LOPROC + 3) +#define DT_PPC64_NUM 4 + +#define PPC64_OPT_TLS 1 +#define PPC64_OPT_MULTI_TOC 2 + +#define STO_PPC64_LOCAL_BIT 5 +#define STO_PPC64_LOCAL_MASK 0xe0 +#define PPC64_LOCAL_ENTRY_OFFSET(x) (1 << (((x)&0xe0)>>5) & 0xfc) + + +#define EF_ARM_RELEXEC 0x01 +#define EF_ARM_HASENTRY 0x02 +#define EF_ARM_INTERWORK 0x04 +#define EF_ARM_APCS_26 0x08 +#define EF_ARM_APCS_FLOAT 0x10 +#define EF_ARM_PIC 0x20 +#define EF_ARM_ALIGN8 0x40 +#define EF_ARM_NEW_ABI 0x80 +#define EF_ARM_OLD_ABI 0x100 +#define EF_ARM_SOFT_FLOAT 0x200 +#define EF_ARM_VFP_FLOAT 0x400 +#define EF_ARM_MAVERICK_FLOAT 0x800 + +#define EF_ARM_ABI_FLOAT_SOFT 0x200 +#define EF_ARM_ABI_FLOAT_HARD 0x400 + + +#define EF_ARM_SYMSARESORTED 0x04 +#define EF_ARM_DYNSYMSUSESEGIDX 0x08 +#define EF_ARM_MAPSYMSFIRST 0x10 +#define EF_ARM_EABIMASK 0XFF000000 + + +#define EF_ARM_BE8 0x00800000 +#define EF_ARM_LE8 0x00400000 + +#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) +#define EF_ARM_EABI_UNKNOWN 0x00000000 +#define EF_ARM_EABI_VER1 0x01000000 +#define EF_ARM_EABI_VER2 0x02000000 +#define EF_ARM_EABI_VER3 0x03000000 +#define EF_ARM_EABI_VER4 0x04000000 +#define EF_ARM_EABI_VER5 0x05000000 + + +#define STT_ARM_TFUNC STT_LOPROC +#define STT_ARM_16BIT STT_HIPROC + + +#define SHF_ARM_ENTRYSECT 0x10000000 +#define SHF_ARM_COMDEF 0x80000000 + + + +#define PF_ARM_SB 0x10000000 + +#define PF_ARM_PI 0x20000000 +#define PF_ARM_ABS 0x40000000 + + +#define PT_ARM_EXIDX (PT_LOPROC + 1) + + +#define SHT_ARM_EXIDX (SHT_LOPROC + 1) +#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) +#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) + +#define R_AARCH64_NONE 0 +#define R_AARCH64_P32_ABS32 1 +#define R_AARCH64_P32_COPY 180 +#define R_AARCH64_P32_GLOB_DAT 181 +#define R_AARCH64_P32_JUMP_SLOT 182 +#define R_AARCH64_P32_RELATIVE 183 +#define R_AARCH64_P32_TLS_DTPMOD 184 +#define R_AARCH64_P32_TLS_DTPREL 185 +#define R_AARCH64_P32_TLS_TPREL 186 +#define R_AARCH64_P32_TLSDESC 187 +#define R_AARCH64_P32_IRELATIVE 188 +#define R_AARCH64_ABS64 257 +#define R_AARCH64_ABS32 258 +#define R_AARCH64_ABS16 259 +#define R_AARCH64_PREL64 260 +#define R_AARCH64_PREL32 261 +#define R_AARCH64_PREL16 262 +#define R_AARCH64_MOVW_UABS_G0 263 +#define R_AARCH64_MOVW_UABS_G0_NC 264 +#define R_AARCH64_MOVW_UABS_G1 265 +#define R_AARCH64_MOVW_UABS_G1_NC 266 +#define R_AARCH64_MOVW_UABS_G2 267 +#define R_AARCH64_MOVW_UABS_G2_NC 268 +#define R_AARCH64_MOVW_UABS_G3 269 +#define R_AARCH64_MOVW_SABS_G0 270 +#define R_AARCH64_MOVW_SABS_G1 271 +#define R_AARCH64_MOVW_SABS_G2 272 +#define R_AARCH64_LD_PREL_LO19 273 +#define R_AARCH64_ADR_PREL_LO21 274 +#define R_AARCH64_ADR_PREL_PG_HI21 275 +#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 +#define R_AARCH64_ADD_ABS_LO12_NC 277 +#define R_AARCH64_LDST8_ABS_LO12_NC 278 +#define R_AARCH64_TSTBR14 279 +#define R_AARCH64_CONDBR19 280 +#define R_AARCH64_JUMP26 282 +#define R_AARCH64_CALL26 283 +#define R_AARCH64_LDST16_ABS_LO12_NC 284 +#define R_AARCH64_LDST32_ABS_LO12_NC 285 +#define R_AARCH64_LDST64_ABS_LO12_NC 286 +#define R_AARCH64_MOVW_PREL_G0 287 +#define R_AARCH64_MOVW_PREL_G0_NC 288 +#define R_AARCH64_MOVW_PREL_G1 289 +#define R_AARCH64_MOVW_PREL_G1_NC 290 +#define R_AARCH64_MOVW_PREL_G2 291 +#define R_AARCH64_MOVW_PREL_G2_NC 292 +#define R_AARCH64_MOVW_PREL_G3 293 +#define R_AARCH64_LDST128_ABS_LO12_NC 299 +#define R_AARCH64_MOVW_GOTOFF_G0 300 +#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 +#define R_AARCH64_MOVW_GOTOFF_G1 302 +#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 +#define R_AARCH64_MOVW_GOTOFF_G2 304 +#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 +#define R_AARCH64_MOVW_GOTOFF_G3 306 +#define R_AARCH64_GOTREL64 307 +#define R_AARCH64_GOTREL32 308 +#define R_AARCH64_GOT_LD_PREL19 309 +#define R_AARCH64_LD64_GOTOFF_LO15 310 +#define R_AARCH64_ADR_GOT_PAGE 311 +#define R_AARCH64_LD64_GOT_LO12_NC 312 +#define R_AARCH64_LD64_GOTPAGE_LO15 313 +#define R_AARCH64_TLSGD_ADR_PREL21 512 +#define R_AARCH64_TLSGD_ADR_PAGE21 513 +#define R_AARCH64_TLSGD_ADD_LO12_NC 514 +#define R_AARCH64_TLSGD_MOVW_G1 515 +#define R_AARCH64_TLSGD_MOVW_G0_NC 516 +#define R_AARCH64_TLSLD_ADR_PREL21 517 +#define R_AARCH64_TLSLD_ADR_PAGE21 518 +#define R_AARCH64_TLSLD_ADD_LO12_NC 519 +#define R_AARCH64_TLSLD_MOVW_G1 520 +#define R_AARCH64_TLSLD_MOVW_G0_NC 521 +#define R_AARCH64_TLSLD_LD_PREL19 522 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 +#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 +#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 +#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 +#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 +#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 +#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 +#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 +#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 +#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 +#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 +#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 +#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 +#define R_AARCH64_TLSDESC_LD_PREL19 560 +#define R_AARCH64_TLSDESC_ADR_PREL21 561 +#define R_AARCH64_TLSDESC_ADR_PAGE21 562 +#define R_AARCH64_TLSDESC_LD64_LO12 563 +#define R_AARCH64_TLSDESC_ADD_LO12 564 +#define R_AARCH64_TLSDESC_OFF_G1 565 +#define R_AARCH64_TLSDESC_OFF_G0_NC 566 +#define R_AARCH64_TLSDESC_LDR 567 +#define R_AARCH64_TLSDESC_ADD 568 +#define R_AARCH64_TLSDESC_CALL 569 +#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 +#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 +#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 +#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 +#define R_AARCH64_COPY 1024 +#define R_AARCH64_GLOB_DAT 1025 +#define R_AARCH64_JUMP_SLOT 1026 +#define R_AARCH64_RELATIVE 1027 +#define R_AARCH64_TLS_DTPMOD 1028 +#define R_AARCH64_TLS_DTPMOD64 1028 +#define R_AARCH64_TLS_DTPREL 1029 +#define R_AARCH64_TLS_DTPREL64 1029 +#define R_AARCH64_TLS_TPREL 1030 +#define R_AARCH64_TLS_TPREL64 1030 +#define R_AARCH64_TLSDESC 1031 + + +#define R_ARM_NONE 0 +#define R_ARM_PC24 1 +#define R_ARM_ABS32 2 +#define R_ARM_REL32 3 +#define R_ARM_PC13 4 +#define R_ARM_ABS16 5 +#define R_ARM_ABS12 6 +#define R_ARM_THM_ABS5 7 +#define R_ARM_ABS8 8 +#define R_ARM_SBREL32 9 +#define R_ARM_THM_PC22 10 +#define R_ARM_THM_PC8 11 +#define R_ARM_AMP_VCALL9 12 +#define R_ARM_TLS_DESC 13 +#define R_ARM_THM_SWI8 14 +#define R_ARM_XPC25 15 +#define R_ARM_THM_XPC22 16 +#define R_ARM_TLS_DTPMOD32 17 +#define R_ARM_TLS_DTPOFF32 18 +#define R_ARM_TLS_TPOFF32 19 +#define R_ARM_COPY 20 +#define R_ARM_GLOB_DAT 21 +#define R_ARM_JUMP_SLOT 22 +#define R_ARM_RELATIVE 23 +#define R_ARM_GOTOFF 24 +#define R_ARM_GOTPC 25 +#define R_ARM_GOT32 26 +#define R_ARM_PLT32 27 +#define R_ARM_CALL 28 +#define R_ARM_JUMP24 29 +#define R_ARM_THM_JUMP24 30 +#define R_ARM_BASE_ABS 31 +#define R_ARM_ALU_PCREL_7_0 32 +#define R_ARM_ALU_PCREL_15_8 33 +#define R_ARM_ALU_PCREL_23_15 34 +#define R_ARM_LDR_SBREL_11_0 35 +#define R_ARM_ALU_SBREL_19_12 36 +#define R_ARM_ALU_SBREL_27_20 37 +#define R_ARM_TARGET1 38 +#define R_ARM_SBREL31 39 +#define R_ARM_V4BX 40 +#define R_ARM_TARGET2 41 +#define R_ARM_PREL31 42 +#define R_ARM_MOVW_ABS_NC 43 +#define R_ARM_MOVT_ABS 44 +#define R_ARM_MOVW_PREL_NC 45 +#define R_ARM_MOVT_PREL 46 +#define R_ARM_THM_MOVW_ABS_NC 47 +#define R_ARM_THM_MOVT_ABS 48 +#define R_ARM_THM_MOVW_PREL_NC 49 +#define R_ARM_THM_MOVT_PREL 50 +#define R_ARM_THM_JUMP19 51 +#define R_ARM_THM_JUMP6 52 +#define R_ARM_THM_ALU_PREL_11_0 53 +#define R_ARM_THM_PC12 54 +#define R_ARM_ABS32_NOI 55 +#define R_ARM_REL32_NOI 56 +#define R_ARM_ALU_PC_G0_NC 57 +#define R_ARM_ALU_PC_G0 58 +#define R_ARM_ALU_PC_G1_NC 59 +#define R_ARM_ALU_PC_G1 60 +#define R_ARM_ALU_PC_G2 61 +#define R_ARM_LDR_PC_G1 62 +#define R_ARM_LDR_PC_G2 63 +#define R_ARM_LDRS_PC_G0 64 +#define R_ARM_LDRS_PC_G1 65 +#define R_ARM_LDRS_PC_G2 66 +#define R_ARM_LDC_PC_G0 67 +#define R_ARM_LDC_PC_G1 68 +#define R_ARM_LDC_PC_G2 69 +#define R_ARM_ALU_SB_G0_NC 70 +#define R_ARM_ALU_SB_G0 71 +#define R_ARM_ALU_SB_G1_NC 72 +#define R_ARM_ALU_SB_G1 73 +#define R_ARM_ALU_SB_G2 74 +#define R_ARM_LDR_SB_G0 75 +#define R_ARM_LDR_SB_G1 76 +#define R_ARM_LDR_SB_G2 77 +#define R_ARM_LDRS_SB_G0 78 +#define R_ARM_LDRS_SB_G1 79 +#define R_ARM_LDRS_SB_G2 80 +#define R_ARM_LDC_SB_G0 81 +#define R_ARM_LDC_SB_G1 82 +#define R_ARM_LDC_SB_G2 83 +#define R_ARM_MOVW_BREL_NC 84 +#define R_ARM_MOVT_BREL 85 +#define R_ARM_MOVW_BREL 86 +#define R_ARM_THM_MOVW_BREL_NC 87 +#define R_ARM_THM_MOVT_BREL 88 +#define R_ARM_THM_MOVW_BREL 89 +#define R_ARM_TLS_GOTDESC 90 +#define R_ARM_TLS_CALL 91 +#define R_ARM_TLS_DESCSEQ 92 +#define R_ARM_THM_TLS_CALL 93 +#define R_ARM_PLT32_ABS 94 +#define R_ARM_GOT_ABS 95 +#define R_ARM_GOT_PREL 96 +#define R_ARM_GOT_BREL12 97 +#define R_ARM_GOTOFF12 98 +#define R_ARM_GOTRELAX 99 +#define R_ARM_GNU_VTENTRY 100 +#define R_ARM_GNU_VTINHERIT 101 +#define R_ARM_THM_PC11 102 +#define R_ARM_THM_PC9 103 +#define R_ARM_TLS_GD32 104 + +#define R_ARM_TLS_LDM32 105 + +#define R_ARM_TLS_LDO32 106 + +#define R_ARM_TLS_IE32 107 + +#define R_ARM_TLS_LE32 108 +#define R_ARM_TLS_LDO12 109 +#define R_ARM_TLS_LE12 110 +#define R_ARM_TLS_IE12GP 111 +#define R_ARM_ME_TOO 128 +#define R_ARM_THM_TLS_DESCSEQ 129 +#define R_ARM_THM_TLS_DESCSEQ16 129 +#define R_ARM_THM_TLS_DESCSEQ32 130 +#define R_ARM_THM_GOT_BREL12 131 +#define R_ARM_IRELATIVE 160 +#define R_ARM_RXPC25 249 +#define R_ARM_RSBREL32 250 +#define R_ARM_THM_RPC22 251 +#define R_ARM_RREL32 252 +#define R_ARM_RABS22 253 +#define R_ARM_RPC24 254 +#define R_ARM_RBASE 255 + +#define R_ARM_NUM 256 + + + + +#define EF_IA_64_MASKOS 0x0000000f +#define EF_IA_64_ABI64 0x00000010 +#define EF_IA_64_ARCH 0xff000000 + + +#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) +#define PT_IA_64_UNWIND (PT_LOPROC + 1) +#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12) +#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13) +#define PT_IA_64_HP_STACK (PT_LOOS + 0x14) + + +#define PF_IA_64_NORECOV 0x80000000 + + +#define SHT_IA_64_EXT (SHT_LOPROC + 0) +#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) + + +#define SHF_IA_64_SHORT 0x10000000 +#define SHF_IA_64_NORECOV 0x20000000 + + +#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0) +#define DT_IA_64_NUM 1 + + +#define R_IA64_NONE 0x00 +#define R_IA64_IMM14 0x21 +#define R_IA64_IMM22 0x22 +#define R_IA64_IMM64 0x23 +#define R_IA64_DIR32MSB 0x24 +#define R_IA64_DIR32LSB 0x25 +#define R_IA64_DIR64MSB 0x26 +#define R_IA64_DIR64LSB 0x27 +#define R_IA64_GPREL22 0x2a +#define R_IA64_GPREL64I 0x2b +#define R_IA64_GPREL32MSB 0x2c +#define R_IA64_GPREL32LSB 0x2d +#define R_IA64_GPREL64MSB 0x2e +#define R_IA64_GPREL64LSB 0x2f +#define R_IA64_LTOFF22 0x32 +#define R_IA64_LTOFF64I 0x33 +#define R_IA64_PLTOFF22 0x3a +#define R_IA64_PLTOFF64I 0x3b +#define R_IA64_PLTOFF64MSB 0x3e +#define R_IA64_PLTOFF64LSB 0x3f +#define R_IA64_FPTR64I 0x43 +#define R_IA64_FPTR32MSB 0x44 +#define R_IA64_FPTR32LSB 0x45 +#define R_IA64_FPTR64MSB 0x46 +#define R_IA64_FPTR64LSB 0x47 +#define R_IA64_PCREL60B 0x48 +#define R_IA64_PCREL21B 0x49 +#define R_IA64_PCREL21M 0x4a +#define R_IA64_PCREL21F 0x4b +#define R_IA64_PCREL32MSB 0x4c +#define R_IA64_PCREL32LSB 0x4d +#define R_IA64_PCREL64MSB 0x4e +#define R_IA64_PCREL64LSB 0x4f +#define R_IA64_LTOFF_FPTR22 0x52 +#define R_IA64_LTOFF_FPTR64I 0x53 +#define R_IA64_LTOFF_FPTR32MSB 0x54 +#define R_IA64_LTOFF_FPTR32LSB 0x55 +#define R_IA64_LTOFF_FPTR64MSB 0x56 +#define R_IA64_LTOFF_FPTR64LSB 0x57 +#define R_IA64_SEGREL32MSB 0x5c +#define R_IA64_SEGREL32LSB 0x5d +#define R_IA64_SEGREL64MSB 0x5e +#define R_IA64_SEGREL64LSB 0x5f +#define R_IA64_SECREL32MSB 0x64 +#define R_IA64_SECREL32LSB 0x65 +#define R_IA64_SECREL64MSB 0x66 +#define R_IA64_SECREL64LSB 0x67 +#define R_IA64_REL32MSB 0x6c +#define R_IA64_REL32LSB 0x6d +#define R_IA64_REL64MSB 0x6e +#define R_IA64_REL64LSB 0x6f +#define R_IA64_LTV32MSB 0x74 +#define R_IA64_LTV32LSB 0x75 +#define R_IA64_LTV64MSB 0x76 +#define R_IA64_LTV64LSB 0x77 +#define R_IA64_PCREL21BI 0x79 +#define R_IA64_PCREL22 0x7a +#define R_IA64_PCREL64I 0x7b +#define R_IA64_IPLTMSB 0x80 +#define R_IA64_IPLTLSB 0x81 +#define R_IA64_COPY 0x84 +#define R_IA64_SUB 0x85 +#define R_IA64_LTOFF22X 0x86 +#define R_IA64_LDXMOV 0x87 +#define R_IA64_TPREL14 0x91 +#define R_IA64_TPREL22 0x92 +#define R_IA64_TPREL64I 0x93 +#define R_IA64_TPREL64MSB 0x96 +#define R_IA64_TPREL64LSB 0x97 +#define R_IA64_LTOFF_TPREL22 0x9a +#define R_IA64_DTPMOD64MSB 0xa6 +#define R_IA64_DTPMOD64LSB 0xa7 +#define R_IA64_LTOFF_DTPMOD22 0xaa +#define R_IA64_DTPREL14 0xb1 +#define R_IA64_DTPREL22 0xb2 +#define R_IA64_DTPREL64I 0xb3 +#define R_IA64_DTPREL32MSB 0xb4 +#define R_IA64_DTPREL32LSB 0xb5 +#define R_IA64_DTPREL64MSB 0xb6 +#define R_IA64_DTPREL64LSB 0xb7 +#define R_IA64_LTOFF_DTPREL22 0xba + + +#define EF_SH_MACH_MASK 0x1f +#define EF_SH_UNKNOWN 0x0 +#define EF_SH1 0x1 +#define EF_SH2 0x2 +#define EF_SH3 0x3 +#define EF_SH_DSP 0x4 +#define EF_SH3_DSP 0x5 +#define EF_SH4AL_DSP 0x6 +#define EF_SH3E 0x8 +#define EF_SH4 0x9 +#define EF_SH2E 0xb +#define EF_SH4A 0xc +#define EF_SH2A 0xd +#define EF_SH4_NOFPU 0x10 +#define EF_SH4A_NOFPU 0x11 +#define EF_SH4_NOMMU_NOFPU 0x12 +#define EF_SH2A_NOFPU 0x13 +#define EF_SH3_NOMMU 0x14 +#define EF_SH2A_SH4_NOFPU 0x15 +#define EF_SH2A_SH3_NOFPU 0x16 +#define EF_SH2A_SH4 0x17 +#define EF_SH2A_SH3E 0x18 + +#define R_SH_NONE 0 +#define R_SH_DIR32 1 +#define R_SH_REL32 2 +#define R_SH_DIR8WPN 3 +#define R_SH_IND12W 4 +#define R_SH_DIR8WPL 5 +#define R_SH_DIR8WPZ 6 +#define R_SH_DIR8BP 7 +#define R_SH_DIR8W 8 +#define R_SH_DIR8L 9 +#define R_SH_SWITCH16 25 +#define R_SH_SWITCH32 26 +#define R_SH_USES 27 +#define R_SH_COUNT 28 +#define R_SH_ALIGN 29 +#define R_SH_CODE 30 +#define R_SH_DATA 31 +#define R_SH_LABEL 32 +#define R_SH_SWITCH8 33 +#define R_SH_GNU_VTINHERIT 34 +#define R_SH_GNU_VTENTRY 35 +#define R_SH_TLS_GD_32 144 +#define R_SH_TLS_LD_32 145 +#define R_SH_TLS_LDO_32 146 +#define R_SH_TLS_IE_32 147 +#define R_SH_TLS_LE_32 148 +#define R_SH_TLS_DTPMOD32 149 +#define R_SH_TLS_DTPOFF32 150 +#define R_SH_TLS_TPOFF32 151 +#define R_SH_GOT32 160 +#define R_SH_PLT32 161 +#define R_SH_COPY 162 +#define R_SH_GLOB_DAT 163 +#define R_SH_JMP_SLOT 164 +#define R_SH_RELATIVE 165 +#define R_SH_GOTOFF 166 +#define R_SH_GOTPC 167 +#define R_SH_GOT20 201 +#define R_SH_GOTOFF20 202 +#define R_SH_GOTFUNCDESC 203 +#define R_SH_GOTFUNCDEST20 204 +#define R_SH_GOTOFFFUNCDESC 205 +#define R_SH_GOTOFFFUNCDEST20 206 +#define R_SH_FUNCDESC 207 +#define R_SH_FUNCDESC_VALUE 208 + +#define R_SH_NUM 256 + + + +#define R_390_NONE 0 +#define R_390_8 1 +#define R_390_12 2 +#define R_390_16 3 +#define R_390_32 4 +#define R_390_PC32 5 +#define R_390_GOT12 6 +#define R_390_GOT32 7 +#define R_390_PLT32 8 +#define R_390_COPY 9 +#define R_390_GLOB_DAT 10 +#define R_390_JMP_SLOT 11 +#define R_390_RELATIVE 12 +#define R_390_GOTOFF32 13 +#define R_390_GOTPC 14 +#define R_390_GOT16 15 +#define R_390_PC16 16 +#define R_390_PC16DBL 17 +#define R_390_PLT16DBL 18 +#define R_390_PC32DBL 19 +#define R_390_PLT32DBL 20 +#define R_390_GOTPCDBL 21 +#define R_390_64 22 +#define R_390_PC64 23 +#define R_390_GOT64 24 +#define R_390_PLT64 25 +#define R_390_GOTENT 26 +#define R_390_GOTOFF16 27 +#define R_390_GOTOFF64 28 +#define R_390_GOTPLT12 29 +#define R_390_GOTPLT16 30 +#define R_390_GOTPLT32 31 +#define R_390_GOTPLT64 32 +#define R_390_GOTPLTENT 33 +#define R_390_PLTOFF16 34 +#define R_390_PLTOFF32 35 +#define R_390_PLTOFF64 36 +#define R_390_TLS_LOAD 37 +#define R_390_TLS_GDCALL 38 + +#define R_390_TLS_LDCALL 39 + +#define R_390_TLS_GD32 40 + +#define R_390_TLS_GD64 41 + +#define R_390_TLS_GOTIE12 42 + +#define R_390_TLS_GOTIE32 43 + +#define R_390_TLS_GOTIE64 44 + +#define R_390_TLS_LDM32 45 + +#define R_390_TLS_LDM64 46 + +#define R_390_TLS_IE32 47 + +#define R_390_TLS_IE64 48 + +#define R_390_TLS_IEENT 49 + +#define R_390_TLS_LE32 50 + +#define R_390_TLS_LE64 51 + +#define R_390_TLS_LDO32 52 + +#define R_390_TLS_LDO64 53 + +#define R_390_TLS_DTPMOD 54 +#define R_390_TLS_DTPOFF 55 +#define R_390_TLS_TPOFF 56 + +#define R_390_20 57 +#define R_390_GOT20 58 +#define R_390_GOTPLT20 59 +#define R_390_TLS_GOTIE20 60 + + +#define R_390_NUM 61 + + + +#define R_CRIS_NONE 0 +#define R_CRIS_8 1 +#define R_CRIS_16 2 +#define R_CRIS_32 3 +#define R_CRIS_8_PCREL 4 +#define R_CRIS_16_PCREL 5 +#define R_CRIS_32_PCREL 6 +#define R_CRIS_GNU_VTINHERIT 7 +#define R_CRIS_GNU_VTENTRY 8 +#define R_CRIS_COPY 9 +#define R_CRIS_GLOB_DAT 10 +#define R_CRIS_JUMP_SLOT 11 +#define R_CRIS_RELATIVE 12 +#define R_CRIS_16_GOT 13 +#define R_CRIS_32_GOT 14 +#define R_CRIS_16_GOTPLT 15 +#define R_CRIS_32_GOTPLT 16 +#define R_CRIS_32_GOTREL 17 +#define R_CRIS_32_PLT_GOTREL 18 +#define R_CRIS_32_PLT_PCREL 19 + +#define R_CRIS_NUM 20 + + + +#define R_X86_64_NONE 0 +#define R_X86_64_64 1 +#define R_X86_64_PC32 2 +#define R_X86_64_GOT32 3 +#define R_X86_64_PLT32 4 +#define R_X86_64_COPY 5 +#define R_X86_64_GLOB_DAT 6 +#define R_X86_64_JUMP_SLOT 7 +#define R_X86_64_RELATIVE 8 +#define R_X86_64_GOTPCREL 9 + +#define R_X86_64_32 10 +#define R_X86_64_32S 11 +#define R_X86_64_16 12 +#define R_X86_64_PC16 13 +#define R_X86_64_8 14 +#define R_X86_64_PC8 15 +#define R_X86_64_DTPMOD64 16 +#define R_X86_64_DTPOFF64 17 +#define R_X86_64_TPOFF64 18 +#define R_X86_64_TLSGD 19 + +#define R_X86_64_TLSLD 20 + +#define R_X86_64_DTPOFF32 21 +#define R_X86_64_GOTTPOFF 22 + +#define R_X86_64_TPOFF32 23 +#define R_X86_64_PC64 24 +#define R_X86_64_GOTOFF64 25 +#define R_X86_64_GOTPC32 26 +#define R_X86_64_GOT64 27 +#define R_X86_64_GOTPCREL64 28 +#define R_X86_64_GOTPC64 29 +#define R_X86_64_GOTPLT64 30 +#define R_X86_64_PLTOFF64 31 +#define R_X86_64_SIZE32 32 +#define R_X86_64_SIZE64 33 + +#define R_X86_64_GOTPC32_TLSDESC 34 +#define R_X86_64_TLSDESC_CALL 35 + +#define R_X86_64_TLSDESC 36 +#define R_X86_64_IRELATIVE 37 +#define R_X86_64_RELATIVE64 38 +#define R_X86_64_GOTPCRELX 41 +#define R_X86_64_REX_GOTPCRELX 42 +#define R_X86_64_NUM 43 + + + +#define R_MN10300_NONE 0 +#define R_MN10300_32 1 +#define R_MN10300_16 2 +#define R_MN10300_8 3 +#define R_MN10300_PCREL32 4 +#define R_MN10300_PCREL16 5 +#define R_MN10300_PCREL8 6 +#define R_MN10300_GNU_VTINHERIT 7 +#define R_MN10300_GNU_VTENTRY 8 +#define R_MN10300_24 9 +#define R_MN10300_GOTPC32 10 +#define R_MN10300_GOTPC16 11 +#define R_MN10300_GOTOFF32 12 +#define R_MN10300_GOTOFF24 13 +#define R_MN10300_GOTOFF16 14 +#define R_MN10300_PLT32 15 +#define R_MN10300_PLT16 16 +#define R_MN10300_GOT32 17 +#define R_MN10300_GOT24 18 +#define R_MN10300_GOT16 19 +#define R_MN10300_COPY 20 +#define R_MN10300_GLOB_DAT 21 +#define R_MN10300_JMP_SLOT 22 +#define R_MN10300_RELATIVE 23 + +#define R_MN10300_NUM 24 + + + +#define R_M32R_NONE 0 +#define R_M32R_16 1 +#define R_M32R_32 2 +#define R_M32R_24 3 +#define R_M32R_10_PCREL 4 +#define R_M32R_18_PCREL 5 +#define R_M32R_26_PCREL 6 +#define R_M32R_HI16_ULO 7 +#define R_M32R_HI16_SLO 8 +#define R_M32R_LO16 9 +#define R_M32R_SDA16 10 +#define R_M32R_GNU_VTINHERIT 11 +#define R_M32R_GNU_VTENTRY 12 + +#define R_M32R_16_RELA 33 +#define R_M32R_32_RELA 34 +#define R_M32R_24_RELA 35 +#define R_M32R_10_PCREL_RELA 36 +#define R_M32R_18_PCREL_RELA 37 +#define R_M32R_26_PCREL_RELA 38 +#define R_M32R_HI16_ULO_RELA 39 +#define R_M32R_HI16_SLO_RELA 40 +#define R_M32R_LO16_RELA 41 +#define R_M32R_SDA16_RELA 42 +#define R_M32R_RELA_GNU_VTINHERIT 43 +#define R_M32R_RELA_GNU_VTENTRY 44 +#define R_M32R_REL32 45 + +#define R_M32R_GOT24 48 +#define R_M32R_26_PLTREL 49 +#define R_M32R_COPY 50 +#define R_M32R_GLOB_DAT 51 +#define R_M32R_JMP_SLOT 52 +#define R_M32R_RELATIVE 53 +#define R_M32R_GOTOFF 54 +#define R_M32R_GOTPC24 55 +#define R_M32R_GOT16_HI_ULO 56 + +#define R_M32R_GOT16_HI_SLO 57 + +#define R_M32R_GOT16_LO 58 +#define R_M32R_GOTPC_HI_ULO 59 + +#define R_M32R_GOTPC_HI_SLO 60 + +#define R_M32R_GOTPC_LO 61 + +#define R_M32R_GOTOFF_HI_ULO 62 + +#define R_M32R_GOTOFF_HI_SLO 63 + +#define R_M32R_GOTOFF_LO 64 +#define R_M32R_NUM 256 + +#define R_MICROBLAZE_NONE 0 +#define R_MICROBLAZE_32 1 +#define R_MICROBLAZE_32_PCREL 2 +#define R_MICROBLAZE_64_PCREL 3 +#define R_MICROBLAZE_32_PCREL_LO 4 +#define R_MICROBLAZE_64 5 +#define R_MICROBLAZE_32_LO 6 +#define R_MICROBLAZE_SRO32 7 +#define R_MICROBLAZE_SRW32 8 +#define R_MICROBLAZE_64_NONE 9 +#define R_MICROBLAZE_32_SYM_OP_SYM 10 +#define R_MICROBLAZE_GNU_VTINHERIT 11 +#define R_MICROBLAZE_GNU_VTENTRY 12 +#define R_MICROBLAZE_GOTPC_64 13 +#define R_MICROBLAZE_GOT_64 14 +#define R_MICROBLAZE_PLT_64 15 +#define R_MICROBLAZE_REL 16 +#define R_MICROBLAZE_JUMP_SLOT 17 +#define R_MICROBLAZE_GLOB_DAT 18 +#define R_MICROBLAZE_GOTOFF_64 19 +#define R_MICROBLAZE_GOTOFF_32 20 +#define R_MICROBLAZE_COPY 21 +#define R_MICROBLAZE_TLS 22 +#define R_MICROBLAZE_TLSGD 23 +#define R_MICROBLAZE_TLSLD 24 +#define R_MICROBLAZE_TLSDTPMOD32 25 +#define R_MICROBLAZE_TLSDTPREL32 26 +#define R_MICROBLAZE_TLSDTPREL64 27 +#define R_MICROBLAZE_TLSGOTTPREL32 28 +#define R_MICROBLAZE_TLSTPREL32 29 + +#define DT_NIOS2_GP 0x70000002 + +#define R_NIOS2_NONE 0 +#define R_NIOS2_S16 1 +#define R_NIOS2_U16 2 +#define R_NIOS2_PCREL16 3 +#define R_NIOS2_CALL26 4 +#define R_NIOS2_IMM5 5 +#define R_NIOS2_CACHE_OPX 6 +#define R_NIOS2_IMM6 7 +#define R_NIOS2_IMM8 8 +#define R_NIOS2_HI16 9 +#define R_NIOS2_LO16 10 +#define R_NIOS2_HIADJ16 11 +#define R_NIOS2_BFD_RELOC_32 12 +#define R_NIOS2_BFD_RELOC_16 13 +#define R_NIOS2_BFD_RELOC_8 14 +#define R_NIOS2_GPREL 15 +#define R_NIOS2_GNU_VTINHERIT 16 +#define R_NIOS2_GNU_VTENTRY 17 +#define R_NIOS2_UJMP 18 +#define R_NIOS2_CJMP 19 +#define R_NIOS2_CALLR 20 +#define R_NIOS2_ALIGN 21 +#define R_NIOS2_GOT16 22 +#define R_NIOS2_CALL16 23 +#define R_NIOS2_GOTOFF_LO 24 +#define R_NIOS2_GOTOFF_HA 25 +#define R_NIOS2_PCREL_LO 26 +#define R_NIOS2_PCREL_HA 27 +#define R_NIOS2_TLS_GD16 28 +#define R_NIOS2_TLS_LDM16 29 +#define R_NIOS2_TLS_LDO16 30 +#define R_NIOS2_TLS_IE16 31 +#define R_NIOS2_TLS_LE16 32 +#define R_NIOS2_TLS_DTPMOD 33 +#define R_NIOS2_TLS_DTPREL 34 +#define R_NIOS2_TLS_TPREL 35 +#define R_NIOS2_COPY 36 +#define R_NIOS2_GLOB_DAT 37 +#define R_NIOS2_JUMP_SLOT 38 +#define R_NIOS2_RELATIVE 39 +#define R_NIOS2_GOTOFF 40 +#define R_NIOS2_CALL26_NOAT 41 +#define R_NIOS2_GOT_LO 42 +#define R_NIOS2_GOT_HA 43 +#define R_NIOS2_CALL_LO 44 +#define R_NIOS2_CALL_HA 45 + +#define R_OR1K_NONE 0 +#define R_OR1K_32 1 +#define R_OR1K_16 2 +#define R_OR1K_8 3 +#define R_OR1K_LO_16_IN_INSN 4 +#define R_OR1K_HI_16_IN_INSN 5 +#define R_OR1K_INSN_REL_26 6 +#define R_OR1K_GNU_VTENTRY 7 +#define R_OR1K_GNU_VTINHERIT 8 +#define R_OR1K_32_PCREL 9 +#define R_OR1K_16_PCREL 10 +#define R_OR1K_8_PCREL 11 +#define R_OR1K_GOTPC_HI16 12 +#define R_OR1K_GOTPC_LO16 13 +#define R_OR1K_GOT16 14 +#define R_OR1K_PLT26 15 +#define R_OR1K_GOTOFF_HI16 16 +#define R_OR1K_GOTOFF_LO16 17 +#define R_OR1K_COPY 18 +#define R_OR1K_GLOB_DAT 19 +#define R_OR1K_JMP_SLOT 20 +#define R_OR1K_RELATIVE 21 +#define R_OR1K_TLS_GD_HI16 22 +#define R_OR1K_TLS_GD_LO16 23 +#define R_OR1K_TLS_LDM_HI16 24 +#define R_OR1K_TLS_LDM_LO16 25 +#define R_OR1K_TLS_LDO_HI16 26 +#define R_OR1K_TLS_LDO_LO16 27 +#define R_OR1K_TLS_IE_HI16 28 +#define R_OR1K_TLS_IE_LO16 29 +#define R_OR1K_TLS_LE_HI16 30 +#define R_OR1K_TLS_LE_LO16 31 +#define R_OR1K_TLS_TPOFF 32 +#define R_OR1K_TLS_DTPOFF 33 +#define R_OR1K_TLS_DTPMOD 34 + +#define R_BPF_NONE 0 +#define R_BPF_MAP_FD 1 + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/tools/gbafix/gbafix.c b/tools/gbafix/gbafix.c index fc1621a..9088cdc 100644 --- a/tools/gbafix/gbafix.c +++ b/tools/gbafix/gbafix.c @@ -62,14 +62,14 @@ typedef struct uint8_t logo[0xA0-0x04]; // logo data uint8_t title[0xC]; // game title name uint32_t game_code; // - uint16_t maker_code; // b0 - uint8_t fixed; // 0x96 b2 - uint8_t unit_code; // 0x00 b3 - uint8_t device_type; // 0x00 b4 + uint16_t maker_code; // + uint8_t fixed; // 0x96 + uint8_t unit_code; // 0x00 + uint8_t device_type; // 0x00 uint8_t unused[7]; // - uint8_t game_version; // 0x00 bc - uint8_t complement; // 800000A0..800000BC bd - uint16_t checksum; // 0x0000 be + uint8_t game_version; // 0x00 + uint8_t complement; // 800000A0..800000BC + uint16_t checksum; // 0x0000 } Header; @@ -142,7 +142,6 @@ int main(int argc, char *argv[]) int schedule_pad = 0; int size,bit; - int noLogo = 0; // show syntax if (argc <= 1) @@ -157,7 +156,6 @@ int main(int argc, char *argv[]) printf(" -m Patch maker code (two characters)\n"); printf(" -r Patch game version (number)\n"); printf(" -d Enable debugging handler and set debug entry point (0 or 1)\n"); - printf(" -L Don't fix logo\n"); printf(" --silent Silence non-error output\n"); return -1; } @@ -201,6 +199,7 @@ int main(int argc, char *argv[]) } // fix some data + memcpy(header.logo, good_header.logo, sizeof(header.logo)); memcpy(&header.fixed, &good_header.fixed, sizeof(header.fixed)); memcpy(&header.device_type, &good_header.device_type, sizeof(header.device_type)); @@ -211,9 +210,6 @@ int main(int argc, char *argv[]) { switch (ARGV[1]) { - case 'L': - noLogo = 1; - break; case 'p': // pad { schedule_pad = 1; @@ -290,10 +286,6 @@ int main(int argc, char *argv[]) } } - // fix some data - if (!noLogo) - memcpy(header.logo, good_header.logo, sizeof(header.logo)); - // update complement check & total checksum header.complement = 0; header.checksum = 0; // must be 0 diff --git a/tools/jsonproc/Makefile b/tools/jsonproc/Makefile index b415e7b..721da10 100644 --- a/tools/jsonproc/Makefile +++ b/tools/jsonproc/Makefile @@ -8,7 +8,7 @@ SRCS := jsonproc.cpp HEADERS := jsonproc.h inja.hpp nlohmann/json.hpp -.PHONY: clean +.PHONY: all clean all: jsonproc @: diff --git a/tools/mapjson/Makefile b/tools/mapjson/Makefile index d09acad..9a49be5 100644 --- a/tools/mapjson/Makefile +++ b/tools/mapjson/Makefile @@ -6,7 +6,10 @@ SRCS := json11.cpp mapjson.cpp HEADERS := mapjson.h -.PHONY: clean +.PHONY: all clean + +all: mapjson + @: mapjson: $(SRCS) $(HEADERS) $(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS) diff --git a/tools/mapjson/mapjson.cpp b/tools/mapjson/mapjson.cpp index 607d2bf..1cf196f 100644 --- a/tools/mapjson/mapjson.cpp +++ b/tools/mapjson/mapjson.cpp @@ -29,7 +29,6 @@ using json11::Json; #include "mapjson.h" -string version; string read_text_file(string filepath) { ifstream in_file(filepath); @@ -61,7 +60,7 @@ void write_text_file(string filepath, string text) { out_file.close(); } -string generate_map_header_text(Json map_data, Json layouts_data) { +string generate_map_header_text(Json map_data, Json layouts_data, string version) { string map_layout_id = map_data["layout"].string_value(); vector matched; @@ -78,7 +77,7 @@ string generate_map_header_text(Json map_data, Json layouts_data) { ostringstream text; - text << map_data["name"].string_value() << "::\n" + text << map_data["name"].string_value() << ":\n" << "\t.4byte " << layout["name"].string_value() << "\n"; if (map_data.object_items().find("shared_events_map") != map_data.object_items().end()) @@ -92,7 +91,7 @@ string generate_map_header_text(Json map_data, Json layouts_data) { text << "\t.4byte " << map_data["name"].string_value() << "_MapScripts\n"; if (map_data.object_items().find("connections") != map_data.object_items().end() - && map_data["connections"].array_items().size() > 0 && map_data["connections_no_include"] == Json()) + && map_data["connections"].array_items().size() > 0) text << "\t.4byte " << map_data["name"].string_value() << "_MapConnections\n"; else text << "\t.4byte 0x0\n"; @@ -102,27 +101,17 @@ string generate_map_header_text(Json map_data, Json layouts_data) { << "\t.byte " << map_data["region_map_section"].string_value() << "\n" << "\t.byte " << map_data["requires_flash"].bool_value() << "\n" << "\t.byte " << map_data["weather"].string_value() << "\n" - << "\t.byte " << map_data["map_type"].string_value() << "\n"; + << "\t.byte " << map_data["map_type"].string_value() << "\n" + << "\t.2byte 0\n"; - if (version == "firered") - text << "\t.byte " << map_data["unknown_18"].int_value() << "\n" - << "\t.byte " << map_data["unknown_19"].int_value() << "\n"; - else - text << "\t.2byte 0\n"; - - if (version == "ruby") { + if (version == "ruby") text << "\t.byte " << map_data["show_map_name"].bool_value() << "\n"; - } - else if (version == "emerald") { + else if (version == "emerald") text << "\tmap_header_flags " << "allow_bike=" << map_data["allow_bike"].bool_value() << ", " << "allow_escape_rope=" << map_data["allow_escape_rope"].bool_value() << ", " << "allow_run=" << map_data["allow_running"].bool_value() << ", " << "show_map_name=" << map_data["show_map_name"].bool_value() << "\n"; - } - else if (version == "firered") { - text << "\t.byte " << map_data["elevator_flag"].int_value() << "\n"; - } text << "\t.byte " << map_data["battle_scene"].string_value() << "\n\n"; @@ -135,7 +124,7 @@ string generate_map_connections_text(Json map_data) { ostringstream text; - text << map_data["name"].string_value() << "_MapConnectionsList::\n"; + text << map_data["name"].string_value() << "_MapConnectionsList:\n"; for (auto &connection : map_data["connections"].array_items()) { text << "\tconnection " @@ -144,7 +133,7 @@ string generate_map_connections_text(Json map_data) { << connection["map"].string_value() << "\n"; } - text << "\n" << map_data["name"].string_value() << "_MapConnections::\n" + text << "\n" << map_data["name"].string_value() << "_MapConnections:\n" << "\t.4byte " << map_data["connections"].array_items().size() << "\n" << "\t.4byte " << map_data["name"].string_value() << "_MapConnectionsList\n\n"; @@ -264,120 +253,13 @@ string generate_map_events_text(Json map_data) { return text.str(); } -string generate_firered_map_events_text(Json map_data) { - ostringstream text; - - string objects_label, warps_label, coords_label, bgs_label; - - if (map_data["object_events"].array_items().size() > 0) { - objects_label = map_data["name"].string_value() + "_EventObjects"; - text << objects_label << "::\n"; - for (unsigned int i = 0; i < map_data["object_events"].array_items().size(); i++) { - auto obj_event = map_data["object_events"].array_items()[i]; - text << "\tobject_event " << i + 1 << ", " - << obj_event["graphics_id"].string_value() << ", " - << obj_event["x"].int_value() << ", " - << obj_event["y"].int_value() << ", " - << obj_event["elevation"].int_value() << ", " - << obj_event["movement_type"].string_value() << ", " - << obj_event["movement_range_x"].int_value() << ", " - << obj_event["movement_range_y"].int_value() << ", " - << obj_event["trainer_type"].int_value() << ", " - << obj_event["trainer_sight_or_berry_tree_id"].int_value() << ", " - << obj_event["script"].string_value() << ", " - << obj_event["flag"].string_value() << "\n"; - } - text << "\n"; - } else { - objects_label = "0x0"; - } - - if (map_data["warp_events"].array_items().size() > 0) { - warps_label = map_data["name"].string_value() + "_MapWarps"; - text << warps_label << "::\n"; - for (auto &warp_event : map_data["warp_events"].array_items()) { - text << "\twarp_def " - << warp_event["x"].int_value() << ", " - << warp_event["y"].int_value() << ", " - << warp_event["elevation"].int_value() << ", " - << warp_event["dest_warp_id"].int_value() << ", " - << warp_event["dest_map"].string_value() << "\n"; - } - text << "\n"; - } else { - warps_label = "0x0"; - } - - if (map_data["coord_events"].array_items().size() > 0) { - coords_label = map_data["name"].string_value() + "_MapCoordEvents"; - text << coords_label << "::\n"; - for (auto &coord_event : map_data["coord_events"].array_items()) { - if (coord_event["type"].string_value() == "trigger") { - text << "\tcoord_event " - << coord_event["x"].int_value() << ", " - << coord_event["y"].int_value() << ", " - << coord_event["elevation"].int_value() << ", 0, " - << coord_event["var"].string_value() << ", " - << coord_event["var_value"].int_value() << ", 0, " - << coord_event["script"].string_value() << "\n"; - } - else if (coord_event["type"] == "weather") { - text << "\tcoord_weather_event " - << coord_event["x"].int_value() << ", " - << coord_event["y"].int_value() << ", " - << coord_event["elevation"].int_value() << ", " - << coord_event["weather"].string_value() << "\n"; - } - } - text << "\n"; - } else { - coords_label = "0x0"; - } - - if (map_data["bg_events"].array_items().size() > 0) { - bgs_label = map_data["name"].string_value() + "_MapBGEvents"; - text << bgs_label << "::\n"; - for (auto &bg_event : map_data["bg_events"].array_items()) { - if (bg_event["type"] == "hidden_item") { - text << "\tbg_hidden_item_event " - << bg_event["x"].int_value() << ", " - << bg_event["y"].int_value() << ", " - << bg_event["elevation"].int_value() << ", " - << bg_event["item"].string_value() << ", " - << bg_event["flag"].string_value() << ", " - << bg_event["unknown"].int_value() << "\n"; - } - else { - string type_string = bg_event["type"].string_value(); - type_string.erase(0, 14); - int type = std::stoi(type_string); - text << "\tbg_event " - << bg_event["x"].int_value() << ", " - << bg_event["y"].int_value() << ", " - << bg_event["elevation"].int_value() << ", " - << type << ", 0, " - << bg_event["script"].string_value() << "\n"; - } - } - text << "\n"; - } else { - bgs_label = "0x0"; - } - - text << map_data["name"].string_value() << "_MapEvents::\n" - << "\tmap_events " << objects_label << ", " << warps_label << ", " - << coords_label << ", " << bgs_label << "\n\n"; - - return text.str(); -} - string get_directory_name(string filename) { size_t dir_pos = filename.find_last_of("/\\"); return filename.substr(0, dir_pos + 1); } -void process_map(string map_filepath, string layouts_filepath) { +void process_map(string map_filepath, string layouts_filepath, string version) { string mapdata_err, layouts_err; string mapdata_json_text = read_text_file(map_filepath); @@ -391,9 +273,8 @@ void process_map(string map_filepath, string layouts_filepath) { if (layouts_data == Json()) FATAL_ERROR("%s\n", layouts_err.c_str()); - string header_text = generate_map_header_text(map_data, layouts_data); - string events_text = version == "firered" ? generate_firered_map_events_text(map_data) - : generate_map_events_text(map_data); + string header_text = generate_map_header_text(map_data, layouts_data, version); + string events_text = generate_map_events_text(map_data); string connections_text = generate_map_connections_text(map_data); string files_dir = get_directory_name(map_filepath); @@ -414,10 +295,7 @@ string generate_groups_text(Json groups_data) { text << "\n"; } - if (version != "firered") - text << "\t.align 2\n"; - - text << "gMapGroups::\n"; + text << "\t.align 2\n" << "gMapGroups::\n"; for (auto &group : groups_data["group_order"].array_items()) text << "\t.4byte " << group.string_value() << "\n"; text << "\n"; @@ -551,7 +429,6 @@ string generate_layout_headers_text(Json layouts_data) { ostringstream text; for (auto &layout : layouts_data["layouts"].array_items()) { - if (layout == Json::object()) continue; string border_label = layout["name"].string_value() + "_Border"; string blockdata_label = layout["name"].string_value() + "_Blockdata"; text << border_label << "::\n" @@ -565,15 +442,7 @@ string generate_layout_headers_text(Json layouts_data) { << "\t.4byte " << border_label << "\n" << "\t.4byte " << blockdata_label << "\n" << "\t.4byte " << layout["primary_tileset"].string_value() << "\n" - << "\t.4byte " << layout["secondary_tileset"].string_value() << "\n"; - - if (version == "firered") { - text << "\t.byte " << layout["border_width"].int_value() << "\n" - << "\t.byte " << layout["border_height"].int_value() << "\n" - << "\t.2byte 0\n"; - } - - text << "\n"; + << "\t.4byte " << layout["secondary_tileset"].string_value() << "\n\n"; } return text.str(); @@ -585,11 +454,8 @@ string generate_layouts_table_text(Json layouts_data) { text << "\t.align 2\n" << layouts_data["layouts_table_label"].string_value() << "::\n"; - for (auto &layout : layouts_data["layouts"].array_items()) { - string layout_name = layout["name"].string_value(); - if (layout_name.empty()) layout_name = "NULL"; - text << "\t.4byte " << layout_name << "\n"; - } + for (auto &layout : layouts_data["layouts"].array_items()) + text << "\t.4byte " << layout["name"].string_value() << "\n"; return text.str(); } @@ -600,12 +466,9 @@ string generate_layouts_constants_text(Json layouts_data) { text << "#ifndef GUARD_CONSTANTS_LAYOUTS_H\n" << "#define GUARD_CONSTANTS_LAYOUTS_H\n\n"; - int i = 1; - for (auto &layout : layouts_data["layouts"].array_items()) { - if (layout != Json::object()) - text << "#define " << layout["id"].string_value() << " " << i << "\n"; - i++; - } + int i = 0; + for (auto &layout : layouts_data["layouts"].array_items()) + text << "#define " << layout["id"].string_value() << " " << ++i << "\n"; text << "\n#endif // GUARD_CONSTANTS_LAYOUTS_H\n"; @@ -635,9 +498,10 @@ int main(int argc, char *argv[]) { if (argc < 3) FATAL_ERROR("USAGE: mapjson [options]\n"); - version = argv[2]; - if (version != "emerald" && version != "ruby" && version != "firered") - FATAL_ERROR("ERROR: must be 'emerald', 'firered', or 'ruby'.\n"); + char *version_arg = argv[2]; + string version(version_arg); + if (version != "emerald" && version != "ruby") + FATAL_ERROR("ERROR: must be 'emerald' or 'ruby'.\n"); char *mode_arg = argv[1]; string mode(mode_arg); @@ -651,7 +515,7 @@ int main(int argc, char *argv[]) { string filepath(argv[3]); string layouts_filepath(argv[4]); - process_map(filepath, layouts_filepath); + process_map(filepath, layouts_filepath, version); } else if (mode == "groups") { if (argc != 4) diff --git a/tools/preproc/Makefile b/tools/preproc/Makefile index 3d32758..63dedda 100644 --- a/tools/preproc/Makefile +++ b/tools/preproc/Makefile @@ -8,7 +8,10 @@ SRCS := asm_file.cpp c_file.cpp charmap.cpp preproc.cpp string_parser.cpp \ HEADERS := asm_file.h c_file.h char_util.h charmap.h preproc.h string_parser.h \ utf8.h -.PHONY: clean +.PHONY: all clean + +all: preproc + @: preproc: $(SRCS) $(HEADERS) $(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS) diff --git a/tools/ramscrgen/Makefile b/tools/ramscrgen/Makefile index 9aa309a..858db1a 100644 --- a/tools/ramscrgen/Makefile +++ b/tools/ramscrgen/Makefile @@ -6,7 +6,10 @@ SRCS := main.cpp sym_file.cpp elf.cpp HEADERS := ramscrgen.h sym_file.h elf.h char_util.h -.PHONY: clean +.PHONY: all clean + +all: ramscrgen + @: ramscrgen: $(SRCS) $(HEADERS) $(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS) diff --git a/tools/ramscrgen/elf.cpp b/tools/ramscrgen/elf.cpp index 7e78704..7599fe0 100644 --- a/tools/ramscrgen/elf.cpp +++ b/tools/ramscrgen/elf.cpp @@ -10,8 +10,6 @@ #define SHN_COMMON 0xFFF2 static std::string s_elfPath; -static std::string s_archiveFilePath; -static std::string s_archiveObjectPath; static FILE *s_file; @@ -24,7 +22,6 @@ static std::uint32_t s_symtabOffset; static std::uint32_t s_strtabOffset; static std::uint32_t s_symbolCount; -static std::uint32_t s_elfFileOffset; struct Symbol { @@ -34,7 +31,7 @@ struct Symbol static void Seek(long offset) { - if (std::fseek(s_file, s_elfFileOffset + offset, SEEK_SET) != 0) + if (std::fseek(s_file, offset, SEEK_SET) != 0) FATAL_ERROR("error: failed to seek to %ld in \"%s\"", offset, s_elfPath.c_str()); } @@ -101,18 +98,6 @@ static void VerifyElfIdent() FATAL_ERROR("error: \"%s\" not little-endian ELF\n", s_elfPath.c_str()); } -static void VerifyAr() -{ - char expectedMagic[8] = {'!', '<', 'a', 'r', 'c', 'h', '>', '\n'}; - char magic[8]; - - if (std::fread(magic, 8, 1, s_file) != 1) - FATAL_ERROR("error: failed to read AR magic from \"%s\"\n", s_archiveFilePath.c_str()); - - if (std::memcmp(magic, expectedMagic, 8) != 0) - FATAL_ERROR("error: AR magic did not match in \"%s\"\n", s_archiveFilePath.c_str()); -} - static void ReadElfHeader() { Seek(0x20); @@ -123,40 +108,6 @@ static void ReadElfHeader() s_shstrtabIndex = ReadInt16(); } -static void FindArObj() -{ - char file_ident[17] = {0}; - char filesize_s[11] = {0}; - char expectedEndMagic[2] = { 0x60, 0x0a }; - char end_magic[2]; - std::size_t filesize; - - Seek(8); - while (!std::feof(s_file)) { - if (std::fread(file_ident, 16, 1, s_file) != 1) - FATAL_ERROR("error: failed to read file ident in \"%s\"\n", s_archiveFilePath.c_str()); - Skip(32); - if (std::fread(filesize_s, 10, 1, s_file) != 1) - FATAL_ERROR("error: failed to read filesize in \"%s\"\n", s_archiveFilePath.c_str()); - if (std::fread(end_magic, 2, 1, s_file) != 1) - FATAL_ERROR("error: failed to read end sentinel in \"%s\"\n", s_archiveFilePath.c_str()); - if (std::memcmp(end_magic, expectedEndMagic, 2) != 0) - FATAL_ERROR("error: corrupted archive header in \"%s\" at \"%s\"\n", s_archiveFilePath.c_str(), file_ident); - - char * ptr = std::strchr(file_ident, '/'); - if (ptr != nullptr) - *ptr = 0; - filesize = std::strtoul(filesize_s, nullptr, 10); - if (std::strncmp(s_archiveObjectPath.c_str(), file_ident, 16) == 0) { - s_elfFileOffset = std::ftell(s_file); - return; - } - Skip(filesize); - } - - FATAL_ERROR("error: could not find object \"%s\" in archive \"%s\"\n", s_archiveObjectPath.c_str(), s_archiveFilePath.c_str()); -} - static std::string GetSectionName(std::uint32_t shstrtabOffset, int index) { Seek(s_sectionHeaderOffset + s_sectionHeaderEntrySize * index); @@ -202,14 +153,21 @@ static void FindTableOffsets() FATAL_ERROR("error: couldn't find .strtab section in \"%s\"\n", s_elfPath.c_str()); } -static std::map GetCommonSymbols_Shared() +std::map GetCommonSymbols(std::string path) { - VerifyElfIdent(); - ReadElfHeader(); - FindTableOffsets(); + s_elfPath = path; std::map commonSymbols; + s_file = std::fopen(s_elfPath.c_str(), "rb"); + + if (s_file == NULL) + FATAL_ERROR("error: failed to open \"%s\" for reading\n", path.c_str()); + + VerifyElfIdent(); + ReadElfHeader(); + FindTableOffsets(); + std::vector commonSymbolVec; Seek(s_symtabOffset); @@ -235,38 +193,3 @@ static std::map GetCommonSymbols_Shared() return commonSymbols; } - -std::map GetCommonSymbolsFromLib(std::string sourcePath, std::string libpath) -{ - std::size_t colonPos = libpath.find(':'); - if (colonPos == std::string::npos) - FATAL_ERROR("error: missing colon separator in libfile \"%s\"\n", s_elfPath.c_str()); - - s_archiveObjectPath = libpath.substr(colonPos + 1); - s_archiveFilePath = sourcePath + "/" + libpath.substr(1, colonPos - 1); - s_elfPath = sourcePath + "/" + libpath.substr(1); - - s_file = std::fopen(s_archiveFilePath.c_str(), "rb"); - - if (s_file == NULL) - FATAL_ERROR("error: failed to open \"%s\" for reading\n", s_archiveFilePath.c_str()); - - VerifyAr(); - FindArObj(); - return GetCommonSymbols_Shared(); -} - -std::map GetCommonSymbols(std::string sourcePath, std::string path) -{ - s_elfFileOffset = 0; - if (path[0] == '*') - return GetCommonSymbolsFromLib(sourcePath, path); - - s_elfPath = sourcePath + "/" + path; - s_file = std::fopen(s_elfPath.c_str(), "rb"); - - if (s_file == NULL) - FATAL_ERROR("error: failed to open \"%s\" for reading\n", path.c_str()); - - return GetCommonSymbols_Shared(); -} diff --git a/tools/ramscrgen/elf.h b/tools/ramscrgen/elf.h index 3704860..0bfdd69 100644 --- a/tools/ramscrgen/elf.h +++ b/tools/ramscrgen/elf.h @@ -25,6 +25,6 @@ #include #include -std::map GetCommonSymbols(std::string sourcePath, std::string path); +std::map GetCommonSymbols(std::string path); #endif // ELF_H diff --git a/tools/ramscrgen/main.cpp b/tools/ramscrgen/main.cpp index 5e5894f..6c4f4bb 100644 --- a/tools/ramscrgen/main.cpp +++ b/tools/ramscrgen/main.cpp @@ -27,15 +27,9 @@ void HandleCommonInclude(std::string filename, std::string sourcePath, std::string symOrderPath, std::string lang) { - auto commonSymbols = GetCommonSymbols(sourcePath, filename); - std::size_t dotIndex; + auto commonSymbols = GetCommonSymbols(sourcePath + "/" + filename); - if (filename[0] == '*') { - dotIndex = filename.find_last_of(':'); - filename = filename.substr(dotIndex + 1); - } - - dotIndex = filename.find_last_of('.'); + std::size_t dotIndex = filename.find_last_of('.'); if (dotIndex == std::string::npos) FATAL_ERROR("error: \"%s\" doesn't have a file extension\n", filename.c_str()); @@ -79,7 +73,7 @@ void HandleCommonInclude(std::string filename, std::string sourcePath, std::stri } } -void ConvertSymFile(std::string filename, std::string sectionName, std::string lang, bool common, std::string sourcePath, std::string commonSymPath, std::string libSourcePath) +void ConvertSymFile(std::string filename, std::string sectionName, std::string lang, bool common, std::string sourcePath, std::string commonSymPath) { SymFile symFile(filename); @@ -97,7 +91,7 @@ void ConvertSymFile(std::string filename, std::string sectionName, std::string l symFile.ExpectEmptyRestOfLine(); printf(". = ALIGN(4);\n"); if (common) - HandleCommonInclude(incFilename, incFilename[0] == '*' ? libSourcePath : sourcePath, commonSymPath, lang); + HandleCommonInclude(incFilename, sourcePath, commonSymPath, lang); else printf("%s(%s);\n", incFilename.c_str(), sectionName.c_str()); break; @@ -154,7 +148,6 @@ int main(int argc, char **argv) std::string lang = std::string(argv[3]); std::string sourcePath; std::string commonSymPath; - std::string libSourcePath; if (argc > 4) { @@ -173,15 +166,8 @@ int main(int argc, char **argv) sourcePath = paths.substr(0, commaPos); commonSymPath = paths.substr(commaPos + 1); - commaPos = commonSymPath.find(','); - if (commaPos == std::string::npos) { - libSourcePath = "tools/agbcc/lib"; - } else { - libSourcePath = commonSymPath.substr(commaPos + 1); - commonSymPath = commonSymPath.substr(0, commaPos); - } } - ConvertSymFile(symFileName, sectionName, lang, common, sourcePath, commonSymPath, libSourcePath); + ConvertSymFile(symFileName, sectionName, lang, common, sourcePath, commonSymPath); return 0; } diff --git a/tools/rsfont/Makefile b/tools/rsfont/Makefile index 582be7b..abe1cab 100644 --- a/tools/rsfont/Makefile +++ b/tools/rsfont/Makefile @@ -6,7 +6,10 @@ LIBS = -lpng -lz SRCS = main.c convert_png.c util.c font.c -.PHONY: clean +.PHONY: all clean + +all: rsfont + @: rsfont: $(SRCS) convert_png.h gfx.h global.h util.h font.h $(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS) diff --git a/tools/scaninc/Makefile b/tools/scaninc/Makefile index 53c9d00..1516f15 100644 --- a/tools/scaninc/Makefile +++ b/tools/scaninc/Makefile @@ -6,7 +6,10 @@ SRCS = scaninc.cpp c_file.cpp asm_file.cpp source_file.cpp HEADERS := scaninc.h asm_file.h c_file.h source_file.h -.PHONY: clean +.PHONY: all clean + +all: scaninc + @: scaninc: $(SRCS) $(HEADERS) $(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)