diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..02b3155a2e --- /dev/null +++ b/Makefile @@ -0,0 +1,79 @@ +MWCCVER := 2.0/sp2p2 +PROC := arm946e +PROC_S := arm5te +PROC_LD := v5te +LCF_TEMPLATE := ARM9-TS.lcf.template +LIBS := -Llib -lsyscall -nostdlib +OPTFLAGS := -O4,p + +# Config +BUILD_DIR := build/platinum +NEFNAME := main +buildname := platinum +TITLE_NAME := POKEMON PL +GAME_CODE := CPUE +SECURE_CRC := 0xF8B8 +GF_DEFINES := +GLB_DEFINES := -DSDK_ARM9 -DSDK_CODE_ARM +DEFINES = $(GF_DEFINES) $(GLB_DEFINES) + +ALL_BUILDDIRS := $(BUILD_DIR)/lib +include common.mk + +ROM := $(BUILD_DIR)/poke$(buildname).nds +BANNER := $(ROM:%.nds=%.bnr) +BANNER_SPEC := $(buildname)/banner.bsf +ICON_PNG := $(buildname)/icon.png +HEADER_TEMPLATE := $(buildname)/rom_header_template.sbin + +.PHONY: main libsyscall sdk sdk9 sdk7 +.PRECIOUS: $(ROM) + +MAKEFLAGS += --no-print-directory + +all: $(ROM) + +tidy: + $(RM) -r $(BUILD_DIR) + $(RM) -r $(PROJECT_CLEAN_TARGETS) + $(RM) $(ROM) + +clean: tidy clean-tools + @$(MAKE) -C lib/syscall clean + +sdk9 sdk7: sdk +main filesystem: | sdk9 + +main: $(SBIN) $(ELF) + +ROMSPEC := rom.rsf +MAKEROM_FLAGS := $(DEFINES) + +$(NEF): libsyscall + +libsyscall: + $(MAKE) -C lib/syscall all install INSTALL_PREFIX=$(abspath $(WORK_DIR)/$(BUILD_DIR)) GAME_CODE=$(GAME_CODE) + +$(BUILD_DIR)/component.files: main ; + +$(HEADER_TEMPLATE): ; + +$(ROM): $(ROMSPEC) filesystem main_lz $(BANNER) + $(WINE) $(MAKEROM) $(MAKEROM_FLAGS) -DBUILD_DIR=$(BUILD_DIR) -DNITROFS_FILES="$(NITROFS_FILES:files/%=%)" -DTITLE_NAME="$(TITLE_NAME)" -DBNR="$(BANNER)" -DHEADER_TEMPLATE="$(HEADER_TEMPLATE)" $< $@ + $(FIXROM) $@ --secure-crc $(SECURE_CRC) --game-code $(GAME_CODE) +ifeq ($(COMPARE),1) + $(SHA1SUM) -c $(buildname)/rom.sha1 +endif + +$(BANNER): $(BANNER_SPEC) $(ICON_PNG:%.png=%.nbfp) $(ICON_PNG:%.png=%.nbfc) + $(WINE) $(MAKEBNR) $< $@ + +# TODO: move to NitroSDK makefile +FX_CONST_H := $(WORK_DIR)/lib/include/nitro/fx/fx_const.h +PROJECT_CLEAN_TARGETS += $(FX_CONST_H) +$(FX_CONST_H): $(TOOLSDIR)/gen_fx_consts/fx_const.csv + $(MKFXCONST) $@ +sdk: $(FX_CONST_H) +$(WORK_DIR)/include/global.h: $(FX_CONST_H) ; + +.PHONY: diff --git a/asm/arm9.s b/asm/arm9.s index fb915acb8f..dbe48bd339 100644 --- a/asm/arm9.s +++ b/asm/arm9.s @@ -1,591 +1,7 @@ .include "macros/function.inc" - .text - arm_func_start sub_02000000 -sub_02000000: ; 0x02000000 - udf #0xfdef - udf #0xfdef - udf #0xfdef - mrchi p14, #4, sp, c2, c15, #7 - ldrtgt ip, [r8], #-0xb26 - sbfxls fp, pc, #0x19, #4 - stclhi p4, c10, [r6, #0x150]! - orrlo r0, r5, #0x7c00000 - arm_func_end sub_02000000 -_02000020: - .byte 0xB7, 0x48, 0xEC, 0xF8, 0x19, 0xE8, 0x5C, 0x73, 0x66, 0x43, 0x66, 0xC4, 0x63, 0x36, 0x44, 0x36 - .byte 0x24, 0x40, 0x84, 0xCC, 0xDD, 0x94, 0x08, 0xA2, 0x8A, 0x12, 0xE2, 0x43, 0xD5, 0xF4, 0x95, 0x8C - .byte 0xA8, 0x64, 0xCD, 0xDB, 0xA7, 0x11, 0xD1, 0x9A, 0xD9, 0x2E, 0x63, 0x3F, 0xA0, 0xFF, 0xB2, 0x5C - .byte 0xAD, 0xFB, 0xBC, 0x93, 0x5F, 0xD0, 0x8B, 0x60, 0xEB, 0x1B, 0xE3, 0x46, 0x69, 0xBB, 0xED, 0x62 - .byte 0x17, 0xD5, 0x67, 0x98, 0xBB, 0xD2, 0x0B, 0xF9, 0x61, 0x5A, 0x71, 0xB4, 0xCD, 0xC7, 0xE4, 0x78 - .byte 0x36, 0x22, 0x91, 0x9A, 0xE6, 0x82, 0xB0, 0xD5, 0x63, 0x0E - - non_word_aligned_thumb_func_start sub_0200007A -sub_0200007A: ; 0x0200007A - svc #0xd - bx lr - thumb_func_end sub_0200007A -_0200007E: - .byte 0x7F, 0x2D - .byte 0x47, 0xDA, 0xA7, 0xEC, 0xAB, 0xA8, 0xE3, 0xD7, 0x4E, 0xBD, 0x2C, 0x3B, 0xE9, 0x58, 0x1E, 0x93 - .byte 0x0B, 0x9D, 0x95, 0x92, 0x78, 0x17, 0x5A, 0xC5, 0x64, 0xB0, 0xA7, 0xC3, 0xE3, 0xBA, 0x71, 0xC9 - .byte 0xE4, 0xDA, 0x75, 0x3A, 0x80, 0xDB, 0xE7, 0xFB, 0x8F, 0xDF, 0x76, 0x0C, 0xA8, 0x78, 0xD8, 0xC6 - .byte 0xA4, 0xA1, 0x20, 0x62, 0xB9, 0x0C, 0xEA, 0x82, 0x20, 0x99, 0x7F, 0x1E, 0xCB, 0xF2, 0x77, 0x39 - .byte 0x4C, 0xD0, 0xFC, 0x57, 0xF6, 0xB2, 0x78, 0x51, 0x82, 0x9C, 0x9D, 0xE7, 0x70, 0xD8, 0x17, 0x6A - .byte 0x25, 0xE9, 0x22, 0xAF, 0x05, 0xAB, 0xEE, 0x06, 0xB6, 0x34, 0xBC, 0x40, 0xDC, 0x05, 0x82, 0x21 - - thumb_func_start sub_020000E0 -sub_020000E0: ; 0x020000E0 - svc #0x12 - bx lr - thumb_func_end sub_020000E0 -_020000E4: - .byte 0x7F, 0xF0, 0x5D, 0x95, 0x2F, 0x8F, 0x87, 0xC6, 0x6F, 0x88, 0x36, 0x73 - .byte 0xC7, 0x57, 0x82, 0x11, 0x0D, 0x58, 0x3E, 0x8C, 0x0D, 0xE1, 0xE9, 0xD8, 0x13, 0x49, 0x97, 0x11 - .byte 0xB0, 0x7E, 0x30, 0x42, 0x1D, 0x23, 0x96, 0x72, 0xCE, 0x3B, 0x65, 0x29, 0xBD, 0x19, 0xAF, 0x06 - .byte 0xC0, 0x52, 0x70, 0xDA, 0xF0, 0xBB, 0x61, 0x07, 0x69, 0x6B, 0xAB, 0x01, 0xCE, 0x09, 0x28, 0x15 - .byte 0x13, 0x96, 0xEF, 0xAD, 0xB4, 0xDC, 0xCD, 0x91, 0xF5, 0x33, 0x76, 0x1E, 0x0D, 0x8F, 0xBC, 0x1A - .byte 0x26, 0x4C, 0x03, 0x81, 0x2F, 0xE1, 0x2A, 0x69, 0xC9, 0x60, 0xEC, 0xDC, 0x69, 0x44, 0xCE, 0x63 - .byte 0xC8, 0x8A, 0x7C, 0xDF, 0x28, 0x33, 0x06, 0x72, 0x3D, 0xF1, 0x5C, 0xC8, 0xA7, 0x43, 0x83, 0xA3 - .byte 0x88, 0x4E, 0xAE, 0x16, 0x3B, 0xBE, 0x54, 0x24, 0x6A, 0x7B, 0x2C, 0x20, 0xFD, 0xB8, 0xAA, 0xE0 - - thumb_func_start sub_02000160 -sub_02000160: ; 0x02000160 - svc #0xe - bx lr - thumb_func_end sub_02000160 -_02000164: - .byte 0x98, 0xE1, 0xD6, 0x85, 0xD9, 0xD9, 0x57, 0x08, 0xE5, 0x99, 0x06, 0x63 - .byte 0x8C, 0xE6, 0x69, 0xDB, 0x02, 0x7B, 0x75, 0xCA, 0xD1, 0xFE, 0x42, 0x50, 0x23, 0x7B, 0x3E, 0x1B - .byte 0xC6, 0xC4, 0x07, 0x81, 0x83, 0x53, 0x07, 0x39, 0x0B, 0xBB, 0xBC, 0x86, 0x67, 0x9A, 0x30, 0x8F - .byte 0x6B, 0x82, 0xAE, 0x00, 0x22, 0xAE, 0xFA, 0x60, 0xDA, 0x7D, 0x6A, 0x20, 0xB5, 0x60, 0xAC, 0xC5 - .byte 0xD6, 0x4B, 0x91, 0x8E, 0xA1, 0x87, 0x91, 0x2D, 0x7D, 0x20, 0x62, 0x01, 0x93, 0xAE, 0x1E, 0x10 - .byte 0xEE, 0xF1, 0x85, 0x35, 0x54, 0x82, 0x84, 0xB7, 0x67, 0xDF, 0x57, 0x04, 0xDD, 0x59, 0xAC, 0xF4 - .byte 0xC8, 0x42, 0x01, 0xDE - - thumb_func_start sub_020001C4 -sub_020001C4: ; 0x020001C4 - svc #9 - bx lr - thumb_func_end sub_020001C4 -_020001C8: - .byte 0xF8, 0x4B, 0xB2, 0xDA, 0xE3, 0xE8, 0xA0, 0x05 - .byte 0x8F, 0x8D, 0x10, 0x77, 0x7E, 0x0D, 0x52, 0xE4, 0x66, 0x59, 0x8D, 0x91, 0x35, 0x57, 0x20, 0xA7 - .byte 0xBB, 0x6E, 0x35, 0xF9, 0x73, 0x0A, 0x73, 0xFD, 0x3A, 0x2D, 0x68, 0x12, 0x9C, 0xFC, 0x46, 0x4A - .byte 0x78, 0x42, 0x42, 0x90, 0xA9, 0xF8, 0x92, 0x35, 0x48, 0x77, 0x89, 0x6E, 0x0A, 0x80, 0xB0, 0xD8 - .byte 0xDE, 0x38, 0xE8, 0xF9, 0xBC, 0xF2, 0x73, 0xCC, 0x00, 0xAB, 0xC9, 0x68, 0x6E, 0x67, 0x87, 0xD0 - .byte 0x16, 0xE8, 0x5C, 0xCC, 0x1C, 0x59, 0xBA, 0xEC, 0xA8, 0xBB, 0x67, 0x76, 0x21, 0xD1, 0xF9, 0xB6 - .byte 0xA3, 0xFC, 0xA3, 0xB0, 0xF3, 0xAC, 0x94, 0xEF, 0x8B, 0x87, 0x7D, 0xA3, 0x50, 0x31, 0x6A, 0xE1 - .byte 0x96, 0xFB, 0xF7, 0x2B, 0xC1, 0x43, 0xFC, 0xAF, 0xD4, 0xD8, 0x78, 0x96, 0x25, 0x1F, 0x2E, 0x12 - .byte 0x73, 0x77, 0x20, 0x94, 0x4C, 0xCA - - non_word_aligned_thumb_func_start sub_02000246 -sub_02000246: ; 0x02000246 - mov r2, #0 - svc #5 - bx lr - thumb_func_end sub_02000246 -_0200024C: - .byte 0xF2, 0xF2, 0x65, 0x7C - .byte 0x41, 0x43, 0x9D, 0xA1, 0x09, 0xE9, 0xD5, 0xAB, 0x6E, 0x1F, 0x30, 0x19, 0xFA, 0xCD, 0x4A, 0x8D - .byte 0x42, 0x80, 0x1F, 0x8C, 0x81, 0x09, 0x0C, 0x0C, 0x2C, 0x91, 0x3F, 0x2B, 0x98, 0x70, 0xE8, 0x0D - .byte 0x8F, 0x82, 0x82, 0x8E, 0x6A, 0x02, 0x64, 0x7D, 0xCC, 0xD2, 0xC6, 0x08, 0xC8, 0xE8, 0x9E, 0xB5 - .byte 0x08, 0x9F, 0xDF, 0xD8, 0x1A, 0x48, 0xF6, 0xA4, 0x11, 0xE0, 0xD6, 0xE1, 0xF0, 0xD5, 0x66, 0xF4 - .byte 0xFC, 0x3B, 0x69, 0x83, 0x3E, 0x63, 0x14, 0xE9, 0x54, 0xB5, 0x2F, 0xC0, 0xB9, 0x78, 0x8C, 0x88 - .byte 0x19, 0x8A, 0x09, 0x06, 0xA6, 0x48, 0x30, 0xC6, 0xA3, 0xA7, 0x62, 0xE8, 0xE0, 0x3A, 0x9C, 0xF4 - .byte 0x7E, 0xE0, 0x02, 0xF1, 0x9F, 0x74, 0x4C, 0xC3, 0xE9, 0xA9, 0x1A, 0x0A - - thumb_func_start sub_020002BC -sub_020002BC: ; 0x020002BC - svc #0x11 - bx lr - thumb_func_end sub_020002BC -_020002C0: - .byte 0x84, 0x8D, 0x66, 0x56, 0xAD, 0xC7, 0xD0, 0xDF, 0x6B, 0x85, 0x96, 0x97, 0x9E, 0x86, 0x6F, 0x36 - .byte 0xCB, 0x9F, 0x63, 0x5A, 0x81, 0xCE, 0x0E, 0xEC, 0xD3, 0xD9, 0xFB, 0x68, 0x56, 0x7A, 0xA9, 0x9F - .byte 0xA4, 0x91, 0xA1, 0x3C, 0x82, 0x19, 0x34, 0xC4, 0x6C, 0xD5, 0x7A, 0x49, 0xAD, 0xE6, 0x93, 0x1F - .byte 0xD4, 0x70, 0x8F, 0xD1, 0x45, 0x98, 0xAB, 0x3E, 0x60, 0xB4, 0x24, 0xD2, 0x79, 0x0F, 0x4F, 0x5E - .byte 0xD1, 0x21, 0x42, 0xCE, 0xC5, 0x6C, 0x3A, 0xDE, 0xC3, 0x62, 0xE4, 0x79, 0xCF, 0xA4, 0xF6, 0xE4 - .byte 0x05, 0x1E, 0x9A, 0x64, 0xBC, 0x90 - - non_word_aligned_thumb_func_start sub_02000316 -sub_02000316: ; 0x02000316 - svc #6 - bx lr - thumb_func_end sub_02000316 -_0200031A: - .byte 0xE9, 0x0E, 0xEB, 0xAE, 0xE7, 0x7D - .byte 0xBE, 0x6D, 0x80, 0xF6, 0xFD, 0x65, 0xFF, 0x34, 0x6B, 0x87, 0x74, 0x07, 0xB4, 0x58, 0xC4, 0x20 - .byte 0xF9, 0xAB, 0xF1, 0xBE, 0xC9, 0x37, 0x22, 0x2E, 0xBB, 0xE7, 0xB9, 0x60, 0x75, 0x0B, 0x70, 0xFF - .byte 0xE3, 0x1D, 0x8A, 0x4D, 0x70, 0x72, 0xA3, 0x07, 0x18, 0xE1, 0x4F, 0xC7, 0x13, 0x0C, 0x6F, 0x66 - .byte 0x63, 0x5A, 0x6F, 0x9A, 0x1D, 0xDE, 0x4C, 0xB2, 0x01, 0xA3, 0x00, 0xD2, 0xA0, 0xF3, 0x07, 0xA2 - .byte 0xF1, 0xFF, 0x90, 0xCE, 0x19, 0x2B, 0x2E, 0x99, 0xB3, 0x7B, 0x89, 0x82, 0xA5, 0xB8, 0x27, 0x31 - .byte 0xEF, 0x1D, 0xA5, 0x60, 0x81, 0xF7, 0xF2, 0xDE, 0xE1, 0x48, 0x67, 0xFF, 0xD4, 0xF1, 0xFD, 0xEA - .byte 0x04, 0x08, 0x89, 0x95, 0xE5, 0xA6, 0x4B, 0xA4, 0xB8, 0x36, 0x45, 0x22, 0x06, 0xED, 0xA0, 0xBE - .byte 0x40, 0xA4, 0x14, 0x9C, 0x64, 0x17, 0xF3, 0x81, 0x36, 0x48 - - non_word_aligned_thumb_func_start sub_0200039A -sub_0200039A: ; 0x0200039A - svc #0x14 - bx lr - thumb_func_end sub_0200039A -_0200039E: - .byte 0xCD, 0x88 - .byte 0x7F, 0x75, 0x2F, 0x90, 0x3F, 0x6E, 0x4B, 0xFD, 0xE9, 0xE3, 0x2B, 0xC6, 0xA0, 0xA9, 0xB3, 0xB8 - .byte 0x7A, 0xBD, 0x31, 0x3B, 0x04, 0x00, 0x12, 0x0B, 0xF7, 0x2A, 0x10, 0x6E, 0x5B, 0x20, 0xDE, 0x43 - .byte 0xA6, 0xBC, 0x29, 0x85, 0x94, 0x3D, 0x8F, 0x55, 0x8A, 0xC5, 0x44, 0xFF, 0x78, 0xBA, 0x7A, 0xA8 - .byte 0x1A, 0x90, 0x51, 0xDD, 0xF0, 0xF7, 0x99, 0x57, 0x42, 0xCA, 0x38, 0x29, 0xEF, 0xA1, 0x1D, 0xE7 - .byte 0xA9, 0x9F, 0xAB, 0xD8, 0x82, 0x41, 0x93, 0xD6, 0x95, 0x50, 0x24, 0xC2, 0x2D, 0xA3, 0x03, 0xDC - .byte 0x18, 0xD9, 0xE2, 0x3C, 0x19, 0x76, 0x9F, 0x35, 0xEE, 0x15, 0x81, 0xB4, 0xD5, 0x98, 0xDA, 0x4B - .byte 0x17, 0x94, 0xC8, 0x7D, 0x77, 0x97, 0x09, 0xDF, 0x08, 0x1C, 0x70, 0x47, 0xC5, 0x28, 0x19, 0xFA - .byte 0x99, 0xF2, 0xD3, 0x66, 0x98, 0xF7, 0xE7, 0x25, 0xA8, 0x9E, 0x04, 0x58, 0xA7, 0x1E, 0x80, 0xD2 - .byte 0x89, 0x8B, 0x8C, 0x9A, 0xDB, 0xEC, 0xC2, 0x64, 0x59, 0xFF, 0xAE, 0xC1, 0xD8, 0x8E, 0x42, 0x24 - .byte 0x3A, 0x72, 0x47, 0xF7, 0x5E, 0x56, 0x27, 0xE8, 0xC9, 0x85, 0x46, 0xAF, 0x2F, 0x42, 0xC4, 0x0C - .byte 0x43, 0xCA, 0x50, 0x37, 0x25, 0xC7, 0x64, 0xE2, 0x9C, 0xD5, 0x27, 0x1D, 0x49, 0xFC, 0xBE, 0xD2 - .byte 0x7B, 0x21, 0x21, 0x65, 0x8D, 0x5E, 0xAC, 0x80, 0xFF, 0xD1, 0x76, 0x5B, 0x3D, 0x64, 0x31, 0x59 - .byte 0x06, 0x03, 0x95, 0x34, 0x13, 0xA7, 0x42, 0xF6, 0x50, 0x0B - - non_word_aligned_thumb_func_start sub_0200046A -sub_0200046A: ; 0x0200046A - svc #0xf - bx lr - thumb_func_end sub_0200046A -_0200046E: - .byte 0x0C, 0x9B - .byte 0xF4, 0xF6, 0x89, 0x7B, 0xD0, 0x91, 0x6B, 0x58, 0x33, 0x76, 0x52, 0xBC, 0xEC, 0x81, 0x89, 0xD2 - .byte 0xFB, 0x4B, 0xE1, 0x85, 0x49, 0x57, 0xCC, 0xD3, 0x6F, 0x12, 0xE1, 0xEB, 0xFC, 0x58, 0x09, 0x81 - .byte 0xBE, 0x65, 0x5F, 0x36, 0xCE, 0x1F, 0xF1, 0x41, 0x0A, 0xB1, 0xA4, 0x65, 0xF5, 0xA0, 0xAA, 0x78 - .byte 0x61, 0x33, 0xBD, 0x6D, 0x27, 0x1A, 0x26, 0x08, 0xD0, 0xF5, 0x3E, 0x39, 0xC1, 0x98, 0x19, 0x58 - .byte 0x8C, 0x14, 0xD1, 0xAE, 0x10, 0xAB, 0x3A, 0xD0, 0x41, 0xF8, 0xCB, 0x40, 0x54, 0x27, 0x4C, 0xEF - .byte 0xD5, 0x54, 0x19, 0xBF - - thumb_func_start sub_020004C4 -sub_020004C4: ; 0x020004C4 - svc #0x15 - bx lr - thumb_func_end sub_020004C4 -_020004C8: - .byte 0x66, 0x02, 0x85, 0x2F, 0xD4, 0xDF, 0x62, 0x16 - .byte 0x62, 0x3B, 0xEE, 0xB9, 0x9E, 0xB9, 0x3C, 0x1D, 0xD2, 0x60, 0x9F, 0x20, 0x5A, 0xF0, 0xA7, 0xA0 - .byte 0xE4, 0xAB, 0x60, 0x4B, 0x4F, 0xA8, 0xE7, 0x07, 0x10, 0x1C, 0x5C, 0x17, 0x07, 0x11, 0xE3, 0xAA - .byte 0x37, 0x07, 0xEB, 0x11, 0x10, 0x34, 0x9D, 0xAE, 0x30, 0xF2, 0x5D, 0xB9, 0x39, 0xA8, 0xA4, 0x22 - .byte 0x12, 0x69, 0x21, 0x85, 0xA1, 0xEC, 0x13, 0xE1, 0xEF, 0xF8, 0xE9, 0xA5, 0xF2, 0xBF, 0xF6, 0x21 - .byte 0x2C, 0x45, 0x80, 0xDF, 0x1C, 0x6D, 0x7C, 0x89, 0xEA, 0xBE, 0xEA, 0x37, 0xBC, 0x88, 0x59, 0x52 - .byte 0x59, 0x93 - - non_word_aligned_thumb_func_start sub_02000522 -sub_02000522: ; 0x02000522 - svc #3 - bx lr - thumb_func_end sub_02000522 -_02000526: - .byte 0x2D, 0x0E, 0xA1, 0x2B, 0x37, 0xE7, 0xA6, 0x05, 0x06, 0xAC - .byte 0x3C, 0x78, 0x3E, 0x0D, 0xC3, 0x9F, 0xC9, 0xCA, 0xB6, 0x80, 0x2D, 0x34, 0xE7, 0x23, 0x07, 0xC7 - .byte 0x14, 0x1E, 0xCC, 0x24, 0xF3, 0xA2, 0x7C, 0x51, 0x4D, 0xE4, 0xB3, 0xCF, 0x0E, 0x5C, 0x0D, 0x43 - .byte 0x61, 0xCC, 0xD6, 0x96, 0x0A, 0xE2, 0xDC, 0xD9, 0x3F, 0x0F, 0x25, 0xE4, 0x4D, 0xE7, 0x95, 0xF7 - .byte 0xAE, 0xB0, 0x1D, 0x8A, 0x69, 0xCE, 0x72, 0x09, 0xEE, 0x00, 0x40, 0x43, 0xC5, 0x93, 0xC6, 0xB2 - - thumb_func_start sub_02000570 -sub_02000570: ; 0x02000570 - svc #0xb - bx lr - thumb_func_end sub_02000570 -_02000574: - .byte 0xBC, 0x15, 0x93, 0xAD, 0x09, 0xF3, 0xFB, 0xBA, 0xAB, 0x28, 0xCE, 0xA1 - .byte 0xDF, 0x1A, 0xD7, 0xE9, 0x80, 0xD7, 0xDD, 0xC4, 0x0D, 0xAC, 0xB2, 0x18, 0x50, 0x27, 0x88, 0x6A - .byte 0xBD, 0x44, 0x9A, 0x4C, 0xF5, 0xA4, 0x9A, 0xC5, 0x2E, 0x40, 0x20, 0x6E, 0xCE, 0xE3, 0x5E, 0x49 - .byte 0x17, 0x47, 0x47, 0xAE, 0x90, 0xD9, 0xAD, 0xDF, 0xB5, 0x3B, 0xFF, 0x7B, 0x3C, 0x9C, 0x76, 0xC8 - .byte 0x99, 0x4E, 0x6F, 0x1C, 0x66, 0x8E, 0xB0, 0x86, 0x16, 0x9A, 0xD3, 0xAC, 0x6D, 0x1E, 0xD2, 0xF6 - .byte 0xE5, 0x92, 0x1F, 0xAC, 0x25, 0x61, 0x47, 0x74, 0xA1, 0x43, 0xF9, 0x55, 0x92, 0x89, 0xF5, 0x24 - .byte 0xD6, 0x21, 0x92, 0x1E, 0xDD, 0x88, 0x72, 0x94, 0x42, 0x86, 0x45, 0x28, 0xCA, 0xE4, 0x89, 0xBF - .byte 0x15, 0xDF, 0x9F, 0x5D - - thumb_func_start sub_020005E4 -sub_020005E4: ; 0x020005E4 - svc #0x13 - bx lr - thumb_func_end sub_020005E4 -_020005E8: - .byte 0x1A, 0x2D, 0x0F, 0xF7, 0x0F, 0x7E, 0xB5, 0x68 - .byte 0x9E, 0x56, 0x70, 0x6D, 0x69, 0x08, 0x51, 0x97, 0x54, 0x30, 0x97, 0x32, 0x78, 0xD1, 0x62, 0x94 - .byte 0xFD, 0x6E, 0x67, 0x1D, 0x37, 0x9E, 0x2F, 0xFE, 0x4A, 0x38, 0x15, 0xE8, 0x5E, 0xAF, 0xC8, 0x57 - .byte 0x81, 0x44, 0x16, 0x6B, 0x6C, 0x4B, 0x57, 0x7D, 0xAC, 0x33, 0xDA, 0x4F, 0x4C, 0x74, 0xB9, 0x94 - .byte 0x1B, 0xF5, 0x76, 0x5B, 0x4A, 0xEF, 0x49, 0x7D, 0x55, 0xFB, 0x56, 0xE8, 0x4B, 0x8C, 0x03, 0x75 - .byte 0x1D, 0xFE, 0x9C, 0x8F, 0x58, 0x7B, 0x21, 0x76, 0xCE, 0xBF, 0xDA, 0xAA, 0xE6, 0xE2, 0xFE, 0x52 - .byte 0xAC, 0x3D, 0x48, 0x2B, 0x9D, 0x12, 0xE4, 0x67, 0xDA, 0x53 - - non_word_aligned_thumb_func_start sub_0200064A -sub_0200064A: ; 0x0200064A - svc #0x10 - bx lr - thumb_func_end sub_0200064A -_0200064E: - .byte 0xB9, 0x2F - .byte 0x79, 0x01, 0xAA, 0x32, 0xD5, 0x52, 0x94, 0xA4, 0xA9, 0x32, 0xBD, 0xCE, 0x70, 0xFF, 0xC6, 0x26 - .byte 0x02, 0x23, 0x0A, 0x59, 0x7A, 0x60, 0xFE, 0xC1, 0x3B, 0x5B, 0xC3, 0x6F, 0xA5, 0x43, 0xB1, 0x95 - .byte 0x7B, 0x94, 0x5C, 0xFA, 0x49, 0x06, 0x46, 0x81, 0x17, 0x13, 0x58, 0xEC, 0x13, 0xBF, 0xD1, 0x2E - .byte 0x96, 0x3D, 0x41, 0xEA, 0x0A, 0xA1, 0xE5, 0xDC, 0x8D, 0xC4, 0xEE, 0x19, 0x5F, 0x0C, 0x04, 0x04 - .byte 0x23, 0x0F, 0x5B, 0xF0, 0xCE, 0x91, 0x34, 0x7F, 0x46, 0xDD, 0x9E, 0xE4, 0x7B, 0xDF - - non_word_aligned_thumb_func_start sub_0200069E -sub_0200069E: ; 0x0200069E - mov r2, #0 - svc #4 - bx lr - thumb_func_end sub_0200069E -_020006A4: - .byte 0xE6, 0x8A, 0xFF, 0x50, 0x99, 0x98, 0xAD, 0x97, 0xA0, 0x42, 0x3F, 0x17 - .byte 0xED, 0x3B, 0x69, 0xBD, 0x2E, 0xB2, 0xF1, 0x4A, 0x4E, 0xCE, 0x4B, 0x96, 0xC9, 0xA7, 0xFD, 0x1E - .byte 0xFB, 0xDA, 0x55, 0xE2, 0x1F, 0xEC, 0x89, 0x23, 0xB6, 0xED, 0xA5, 0xC9, 0xF7, 0x3A, 0x32, 0xE8 - .byte 0x8C, 0xA2, 0x17, 0x6A, 0x47, 0x6A, 0x86, 0x43, 0xDA, 0xA5, 0x3D, 0x8A, 0x24, 0x44, 0xBA, 0xEB - .byte 0xAB, 0x09, 0x4C, 0x9C, 0x26, 0x96, 0xFC, 0x4D, 0xC8, 0xA3, 0xF8, 0x1C, 0x7E, 0xDD, 0xBF, 0xBC - .byte 0xD9, 0xAA, 0x21, 0x23, 0xB0, 0x79, 0x80, 0x1C, 0xF6, 0x3C, 0xE7, 0xEF, 0xDC, 0x16, 0x54, 0xEB - .byte 0xFC, 0xA2, 0x36, 0x8D, 0x3B, 0x80, 0x76, 0x6B - - thumb_func_start sub_02000708 -sub_02000708: ; 0x02000708 - svc #0 - bx lr - thumb_func_end sub_02000708 -_0200070C: - .byte 0xE0, 0x35, 0x0E, 0xD6 - .byte 0xF5, 0xE2, 0xAC, 0x6E, 0xAE, 0x5E, 0xD1, 0xB4, 0xD5, 0x0A, 0xAA, 0x00, 0x1A, 0x17, 0x29, 0x2A - .byte 0x6C, 0x32, 0x7C, 0x7C, 0x5E, 0x12, 0xF9, 0x35, 0x5E, 0x12, 0x52, 0xDE, 0xCB, 0x00, 0x64, 0x60 - .byte 0xD6, 0x8A, 0xB9, 0xC9, 0x0C, 0x66, 0x10, 0xA4, 0xD3, 0xED, 0xD3, 0x75, 0x4E, 0x9A, 0xF9, 0xFE - .byte 0x77, 0x47, 0x8E, 0x85, 0xCB, 0xCD, 0x20, 0xC1, 0xCD, 0x7E, 0x12, 0xC3, 0xFF, 0xFD, 0x52, 0x87 - .byte 0x5E, 0x78, 0xC1, 0xFC, 0xB0, 0x92, 0x63, 0xE9, 0xED, 0xC9, 0x6F, 0x8D, 0xBB, 0x3E, 0xC8, 0x93 - .byte 0x04, 0x09, 0x8B, 0xE8, 0xA6, 0x3B, 0xCE, 0x0D, 0xB1, 0x67, 0x66, 0xC8, 0xDB, 0xD3, 0xF5, 0x2F - .byte 0x8F, 0x4D, 0x6A, 0x99, 0x7B, 0xFA, 0x28, 0x74, 0x09, 0xF6, 0xF1, 0xD1, 0x8C, 0x15, 0xE0, 0x2C - .byte 0x59, 0xA0, 0xA6, 0xCC, 0x77, 0x45, 0x64, 0x48, 0x7A, 0x05 - - non_word_aligned_thumb_func_start sub_0200078A -sub_0200078A: ; 0x0200078A - svc #0xc - bx lr - thumb_func_end sub_0200078A -_0200078E: - .byte 0x59, 0x2B - .byte 0xE6, 0x44, 0x0B, 0xBA, 0x2A, 0xEC, 0x68, 0x4F, 0xE9, 0xF6, 0x2B, 0x5D, 0xFC, 0x5B, 0xEF, 0x02 - .byte 0xC8, 0x25, 0x05, 0xC8, 0xF7, 0x0B, 0x1A, 0xA9, 0x2E, 0x50, 0x96, 0x85, 0xAF, 0x8B, 0xE9, 0x9D - .byte 0x10, 0x4E, 0x25, 0xE6, 0xF7, 0x16, 0xE5, 0xF0, 0x3C, 0x13, 0x8D, 0x87, 0xD4, 0x18, 0x48, 0xF9 - .byte 0x85, 0x3A, 0x45, 0x68, 0x0A, 0x00, 0x73, 0xF6, 0x51, 0x07, 0x50, 0x86, 0x18, 0x76, 0x0C, 0x25 - .byte 0x3C, 0xF0, 0xFD, 0x8B, 0xB6, 0x13, 0xC9, 0xC4, 0xA2, 0x83, 0x5B, 0xE7, 0x7E, 0xC8, 0x54, 0xA3 - .byte 0x1D, 0xDF, 0x6C, 0x43, 0xD5, 0x52, 0xAA, 0x18, 0xC4, 0x6F, 0x29, 0xD2, 0x1B, 0x66, 0x82, 0xBE - .byte 0x30, 0xD4, 0x9A, 0xEB, 0x94, 0x23, 0xB6, 0x7F, 0xAC, 0x6B, 0x96, 0x95, 0xB9, 0x14, 0x00, 0x00 - - arm_func_start sub_02000800 -sub_02000800: ; 0x02000800 - mov ip, #0x4000000 - str ip, [ip, #0x208] -_02000808: - ldrh r0, [ip, #6] - cmp r0, #0 - bne _02000808 - bl sub_02000AB0 - mov r0, #0x13 - msr cpsr_c, r0 - ldr r0, _02000930 ; =0x027E0000 - add r0, r0, #0x3fc0 - mov sp, r0 - mov r0, #0x12 - msr cpsr_c, r0 - ldr r0, _02000930 ; =0x027E0000 - add r0, r0, #0x3fc0 - sub r0, r0, #0x40 - sub sp, r0, #4 - tst sp, #4 - beq _02000850 - b _02000854 -_02000850: - sub sp, sp, #4 -_02000854: - ldr r1, _02000934 ; =0x00000800 - sub r1, r0, r1 - mov r0, #0x1f - msr cpsr_fsxc, r0 - sub sp, r1, #4 - mov r0, #0 - ldr r1, _02000930 ; =0x027E0000 - mov r2, #0x4000 - bl sub_02000954 - mov r0, #0 - ldr r1, _02000938 ; =0x05000000 - mov r2, #0x400 - bl sub_02000954 - mov r0, #0x200 - ldr r1, _0200093C ; =0x07000000 - mov r2, #0x400 - bl sub_02000954 - ldr r1, _02000940 ; =0x02000BA0 - ldr r0, [r1, #0x14] - bl sub_02000970 - bl sub_02000A1C - ldr r0, _02000940 ; =0x02000BA0 - ldr r1, [r0, #0xc] - ldr r2, [r0, #0x10] - mov r3, r1 - mov r0, #0 -_020008BC: - cmp r1, r2 - blo _020008C8 - b _020008CC -_020008C8: - str r0, [r1, #0], #4 -_020008CC: - blo _020008BC - bic r1, r3, #0x1f -_020008D4: - mcr p15, #0, r0, c7, c10, #4 - mcr p15, #0, r1, c7, c5, #1 - mcr p15, #0, r1, c7, c14, #1 - add r1, r1, #0x20 - cmp r1, r2 - blt _020008D4 - ldr r1, _02000944 ; =0x027FFF9C - str r0, [r1, #0] - ldr r1, _02000930 ; =0x027E0000 - add r1, r1, #0x3fc0 - add r1, r1, #0x3c - ldr r0, _02000948 ; =0x01FF8000 - str r0, [r1, #0] - bl sub_020E28B8 - bl sub_02000B98 - bl sub_020E402C - ldr r1, _0200094C ; =sub_02000C88 - ldr lr, _02000950 ; =0xFFFF0000 - tst sp, #4 - bne _02000928 - b _0200092C -_02000928: - sub sp, sp, #4 -_0200092C: - bx r1 - ; .align 2, 0 -_02000930: .word 0x027E0000 -_02000934: .word 0x00000800 -_02000938: .word 0x05000000 -_0200093C: .word 0x07000000 -_02000940: .word 0x02000BA0 -_02000944: .word 0x027FFF9C -_02000948: .word 0x01FF8000 -_0200094C: .word sub_02000C88 -_02000950: .word 0xFFFF0000 - arm_func_end sub_02000800 - - arm_func_start sub_02000954 -sub_02000954: ; 0x02000954 - add ip, r1, r2 -_02000958: - cmp r1, ip - blt _02000964 - b _02000968 -_02000964: - stmia r1!, {r0} -_02000968: - blt _02000958 - bx lr - arm_func_end sub_02000954 - - arm_func_start sub_02000970 -sub_02000970: ; 0x02000970 - cmp r0, #0 - beq _02000A18 - stmfd sp!, {r4, r5, r6, r7} - ldmdb r0, {r1, r2} - add r2, r0, r2 - sub r3, r0, r1, lsr #24 - bic r1, r1, #0xff000000 - sub r1, r0, r1 - mov r4, r2 -_02000994: - cmp r3, r1 - ble _020009F4 - ldrb r5, [r3, #-1]! - mov r6, #8 -_020009A4: - sub r6, r6, #1 - blt _02000994 - tst r5, #0x80 - bne _020009C0 - ldrb r0, [r3, #-1]! - strb r0, [r2, #-1]! - b _020009E8 -_020009C0: - ldrb ip, [r3, #-1]! - ldrb r7, [r3, #-1]! - orr r7, r7, ip, lsl #8 - bic r7, r7, #0xf000 - add r7, r7, #2 - add ip, ip, #0x20 -_020009D8: - ldrb r0, [r2, r7] - strb r0, [r2, #-1]! - sub ip, ip, #0x10 - bge _020009D8 -_020009E8: - cmp r3, r1 - lsl r5, r5, #1 - bgt _020009A4 -_020009F4: - mov r0, #0 - bic r3, r1, #0x1f -_020009FC: - mcr p15, #0, r0, c7, c10, #4 - mcr p15, #0, r3, c7, c5, #1 - mcr p15, #0, r3, c7, c14, #1 - add r3, r3, #0x20 - cmp r3, r4 - blt _020009FC - ldmia sp!, {r4, r5, r6, r7} -_02000A18: - bx lr - arm_func_end sub_02000970 - - arm_func_start sub_02000A1C -sub_02000A1C: ; 0x02000A1C - ldr r0, _02000AA8 ; =0x02000BA0 - ldr r1, [r0, #0] - ldr r2, [r0, #4] - ldr r3, [r0, #8] -_02000A2C: - cmp r1, r2 - beq _02000AA4 - ldr r5, [r1, #0], #4 - ldr r7, [r1, #0], #4 - add r6, r5, r7 - mov r4, r5 -_02000A44: - cmp r4, r6 - bmi _02000A50 - b _02000A54 -_02000A50: - ldr r7, [r3, #0], #4 -_02000A54: - bmi _02000A5C - b _02000A60 -_02000A5C: - str r7, [r4, #0], #4 -_02000A60: - bmi _02000A44 - ldr r7, [r1, #0], #4 - add r6, r4, r7 - mov r7, #0 -_02000A70: - cmp r4, r6 - blo _02000A7C - b _02000A80 -_02000A7C: - str r7, [r4, #0], #4 -_02000A80: - blo _02000A70 - bic r4, r5, #0x1f -_02000A88: - mcr p15, #0, r7, c7, c10, #4 - mcr p15, #0, r4, c7, c5, #1 - mcr p15, #0, r4, c7, c14, #1 - add r4, r4, #0x20 - cmp r4, r6 - blt _02000A88 - b _02000A2C -_02000AA4: - b _02000AAC - ; .align 2, 0 -_02000AA8: .word 0x02000BA0 - arm_func_end sub_02000A1C -_02000AAC: - bx lr - - arm_func_start sub_02000AB0 -sub_02000AB0: ; 0x02000AB0 - mrc p15, #0, r0, c1, c0, #0 - ldr r1, _02000B68 ; =0x000F9005 - bic r0, r0, r1 - mcr p15, #0, r0, c1, c0, #0 - mov r0, #0 - mcr p15, #0, r0, c7, c5, #0 - mcr p15, #0, r0, c7, c6, #0 - mcr p15, #0, r0, c7, c10, #4 - ldr r0, _02000B6C ; =0x04000033 - mcr p15, #0, r0, c6, c0, #0 - ldr r0, _02000B70 ; =0x0200002D - mcr p15, #0, r0, c6, c1, #0 - ldr r0, _02000B74 ; =0x027E0021 - mcr p15, #0, r0, c6, c2, #0 - ldr r0, _02000B78 ; =0x08000035 - mcr p15, #0, r0, c6, c3, #0 - ldr r0, _02000B7C ; =0x027E0000 - orr r0, r0, #0x1a - orr r0, r0, #1 - mcr p15, #0, r0, c6, c4, #0 - ldr r0, _02000B80 ; =0x0100002F - mcr p15, #0, r0, c6, c5, #0 - ldr r0, _02000B84 ; =0xFFFF001D - mcr p15, #0, r0, c6, c6, #0 - ldr r0, _02000B88 ; =0x027FF017 - mcr p15, #0, r0, c6, c7, #0 - mov r0, #0x20 - mcr p15, #0, r0, c9, c1, #1 - ldr r0, _02000B7C ; =0x027E0000 - orr r0, r0, #0xa - mcr p15, #0, r0, c9, c1, #0 - mov r0, #0x42 - mcr p15, #0, r0, c2, c0, #1 - mov r0, #0x42 - mcr p15, #0, r0, c2, c0, #0 - mov r0, #2 - mcr p15, #0, r0, c3, c0, #0 - ldr r0, _02000B8C ; =0x05100011 - mcr p15, #0, r0, c5, c0, #3 - ldr r0, _02000B90 ; =0x15111011 - mcr p15, #0, r0, c5, c0, #2 - mrc p15, #0, r0, c1, c0, #0 - ldr r1, _02000B94 ; =0x0005707D - orr r0, r0, r1 - mcr p15, #0, r0, c1, c0, #0 - bx lr - ; .align 2, 0 -_02000B68: .word 0x000F9005 -_02000B6C: .word 0x04000033 -_02000B70: .word 0x0200002D -_02000B74: .word 0x027E0021 -_02000B78: .word 0x08000035 -_02000B7C: .word 0x027E0000 -_02000B80: .word 0x0100002F -_02000B84: .word 0xFFFF001D -_02000B88: .word 0x027FF017 -_02000B8C: .word 0x05100011 -_02000B90: .word 0x15111011 -_02000B94: .word 0x0005707D - arm_func_end sub_02000AB0 - - arm_func_start sub_02000B98 -sub_02000B98: ; 0x02000B98 - bx lr - arm_func_end sub_02000B98 - - arm_func_start sub_02000B9C -sub_02000B9C: ; 0x02000B9C - bx lr - arm_func_end sub_02000B9C -_02000BA0: - .byte 0xE0, 0x23, 0x10, 0x02, 0xF8, 0x23, 0x10, 0x02, 0x20, 0x1D, 0x10, 0x02, 0x20, 0x1D, 0x10, 0x02 - .byte 0x80, 0x0D, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x31, 0x75, 0x02, 0x04, 0x21, 0x06, 0xC0, 0xDE - .byte 0xDE, 0xC0, 0x06, 0x21, 0x5B, 0x53, 0x44, 0x4B, 0x2B, 0x4E, 0x49, 0x4E, 0x54, 0x45, 0x4E, 0x44 - .byte 0x4F, 0x3A, 0x44, 0x57, 0x43, 0x32, 0x2E, 0x32, 0x2E, 0x33, 0x30, 0x30, 0x30, 0x38, 0x2E, 0x30 - .byte 0x38, 0x30, 0x36, 0x33, 0x30, 0x2E, 0x31, 0x39, 0x30, 0x36, 0x5F, 0x44, 0x57, 0x43, 0x5F, 0x32 - .byte 0x5F, 0x32, 0x5F, 0x50, 0x4C, 0x55, 0x53, 0x38, 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x53, 0x44, 0x4B - .byte 0x2B, 0x4E, 0x49, 0x4E, 0x54, 0x45, 0x4E, 0x44, 0x4F, 0x3A, 0x42, 0x41, 0x43, 0x4B, 0x55, 0x50 - .byte 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x53, 0x44, 0x4B, 0x2B, 0x41, 0x62, 0x69, 0x6F, 0x73, 0x73, 0x6F - .byte 0x3A, 0x6C, 0x69, 0x62, 0x56, 0x43, 0x54, 0x20, 0x31, 0x2E, 0x33, 0x2E, 0x31, 0x5D, 0x00, 0x00 - .byte 0x5B, 0x53, 0x44, 0x4B, 0x2B, 0x4E, 0x49, 0x4E, 0x54, 0x45, 0x4E, 0x44, 0x4F, 0x3A, 0x57, 0x69 - .byte 0x46, 0x69, 0x32, 0x2E, 0x31, 0x2E, 0x33, 0x30, 0x30, 0x30, 0x33, 0x2E, 0x30, 0x37, 0x30, 0x39 - .byte 0x32, 0x30, 0x30, 0x32, 0x32, 0x39, 0x5D, 0x00, 0x5B, 0x53, 0x44, 0x4B, 0x2B, 0x55, 0x42, 0x49 - .byte 0x51, 0x55, 0x49, 0x54, 0x4F, 0x55, 0x53, 0x3A, 0x43, 0x50, 0x53, 0x5D, 0x00, 0x00, 0x00, 0x00 - .byte 0x5B, 0x53, 0x44, 0x4B, 0x2B, 0x55, 0x42, 0x49, 0x51, 0x55, 0x49, 0x54, 0x4F, 0x55, 0x53, 0x3A - .byte 0x53, 0x53, 0x4C, 0x5D, 0x00, 0x00, 0x00, 0x00 - thumb_func_start sub_02000C88 sub_02000C88: ; 0x02000C88 push {r3, r4, r5, r6, r7, lr} diff --git a/asm/dtcm.s b/asm/dtcm.s new file mode 100644 index 0000000000..e69de29bb2 diff --git a/asm/itcm.s b/asm/itcm.s new file mode 100644 index 0000000000..e69de29bb2 diff --git a/binutils.mk b/binutils.mk new file mode 100644 index 0000000000..2c8dea8134 --- /dev/null +++ b/binutils.mk @@ -0,0 +1,14 @@ +# Supply a GNU ARM Embedded toolchain for objcopy, ar, etc. + +ifdef DEVKITARM +TOOLCHAIN := $(DEVKITARM) +endif + +ifdef TOOLCHAIN +export PATH := $(TOOLCHAIN)/bin:$(PATH) +endif + +PREFIX := arm-none-eabi- + +OBJCOPY := $(PREFIX)objcopy +AR := $(PREFIX)ar diff --git a/common.mk b/common.mk new file mode 100644 index 0000000000..6d1f50cdcf --- /dev/null +++ b/common.mk @@ -0,0 +1,210 @@ +## Common defines for ARM9 and ARM7 Makefiles ## + +COMPARE ?= 1 + +default: all + +PROJECT_ROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +# Because mwldarm expects absolute paths to be WIN32 paths, +# all paths referring up from BUILD_DIR must be relative. +WORK_DIR := $(shell realpath --relative-to $(CURDIR) $(PROJECT_ROOT)) +$(shell mkdir -p $(BUILD_DIR)) +BACK_REL := $(shell realpath --relative-to $(BUILD_DIR) $(CURDIR)) + +TOOLSDIR := $(WORK_DIR)/tools + +include $(WORK_DIR)/platform.mk +include $(WORK_DIR)/binutils.mk + +# NitroSDK tools +MWCC = $(TOOLSDIR)/mwccarm/$(MWCCVER)/mwccarm.exe +MWAS = $(TOOLSDIR)/mwccarm/$(MWCCVER)/mwasmarm.exe +MWLD = $(BACK_REL)/$(TOOLSDIR)/mwccarm/$(MWCCVER)/mwldarm.exe +MAKEROM := $(TOOLSDIR)/bin/makerom.exe +MAKELCF := $(TOOLSDIR)/bin/makelcf.exe +MAKEBNR := $(TOOLSDIR)/bin/makebanner.exe + +export LM_LICENSE_FILE := $(TOOLSDIR)/mwccarm/license.dat + +# Native tools +FIXROM := $(TOOLSDIR)/fixrom/fixrom$(EXE) +ASPATCH := $(TOOLSDIR)/mwasmarm_patcher/mwasmarm_patcher$(EXE) + +# Other tools +NTRMERGE := $(TOOLSDIR)/ntr_merge_elf/ntr_merge_elf.sh +ASM_PROCESSOR := $(TOOLSDIR)/asm_processor/compile.sh + +NATIVE_TOOLS := \ + $(FIXROM) \ + $(ASPATCH) + +TOOLDIRS := $(foreach tool,$(NATIVE_TOOLS),$(dir $(tool))) + +# Directories +NITROSDK_SRC_SUBDIRS := os + +LIB_SUBDIRS := cw NitroSDK NitroSystem NitroDWC NitroWiFi libCPS libVCT +SRC_SUBDIR := src +ASM_SUBDIR := asm +LIB_SRC_SUBDIR := lib/src $(LIB_SUBDIRS:%=lib/%/src) $(NITROSDK_SRC_SUBDIRS:%=lib/NitroSDK/src/%) +LIB_ASM_SUBDIR := lib/asm $(LIB_SUBDIRS:%=lib/%/asm) +ALL_SUBDIRS := $(SRC_SUBDIR) $(ASM_SUBDIR) $(LIB_SRC_SUBDIR) $(LIB_ASM_SUBDIR) + +SRC_BUILDDIR := $(addprefix $(BUILD_DIR)/,$(SRC_SUBDIR)) +ASM_BUILDDIR := $(addprefix $(BUILD_DIR)/,$(ASM_SUBDIR)) +LIB_SRC_BUILDDIR := $(addprefix $(BUILD_DIR)/,$(LIB_SRC_SUBDIR)) +LIB_ASM_BUILDDIR := $(addprefix $(BUILD_DIR)/,$(LIB_ASM_SUBDIR)) + +C_SRCS := $(foreach dname,$(SRC_SUBDIR),$(wildcard $(dname)/*.c)) +ASM_SRCS := $(foreach dname,$(ASM_SUBDIR),$(wildcard $(dname)/*.s)) +# asm processor should only be necessary for libcrypto +GLOBAL_ASM_SRCS := +LIB_C_SRCS := $(foreach dname,$(LIB_SRC_SUBDIR),$(wildcard $(dname)/*.c)) +LIB_ASM_SRCS := $(foreach dname,$(LIB_ASM_SUBDIR),$(wildcard $(dname)/*.s)) +ALL_SRCS := $(C_SRCS) $(ASM_SRCS) $(LIB_C_SRCS) $(LIB_ASM_SRCS) + +C_OBJS = $(C_SRCS:%.c=$(BUILD_DIR)/%.o) +ASM_OBJS = $(ASM_SRCS:%.s=$(BUILD_DIR)/%.o) +GLOBAL_ASM_OBJS = $(GLOBAL_ASM_SRCS:%.c=$(BUILD_DIR)/%.o) +LIB_C_OBJS = $(LIB_C_SRCS:%.c=$(BUILD_DIR)/%.o) +LIB_ASM_OBJS = $(LIB_ASM_SRCS:%.s=$(BUILD_DIR)/%.o) +ALL_GAME_OBJS = $(C_OBJS) $(ASM_OBJS) +ALL_LIB_OBJS = $(LIB_C_OBJS) $(LIB_ASM_OBJS) +ALL_OBJS = $(ALL_GAME_OBJS) $(ALL_LIB_OBJS) + +$(ALL_LIB_OBJS): DEFINES = $(GLB_DEFINES) + +ALL_BUILDDIRS := $(sort $(ALL_BUILDDIRS) $(foreach obj,$(ALL_OBJS),$(dir $(obj)))) + +NEF := $(BUILD_DIR)/$(NEFNAME).nef +ELF := $(NEF:%.nef=%.elf) +LCF := $(NEF:%.nef=%.lcf) +RESPONSE := $(NEF:%.nef=%.response) +SBIN := $(NEF:%.nef=%.sbin) +XMAP := $(NEF).xMAP + +EXCCFLAGS := -Cpp_exceptions off + +MWCFLAGS = $(DEFINES) $(OPTFLAGS) -enum int -lang c99 $(EXCCFLAGS) -gccext,on -proc $(PROC) -msgstyle gcc -gccinc -i ./include -i ./include/library -i $(WORK_DIR)/files -I$(WORK_DIR)/lib/include -ipa file -interworking -inline on,noauto -char signed +MWASFLAGS = $(DEFINES) -proc $(PROC_S) -gccinc -i . -i ./include -i $(WORK_DIR)/files -I$(WORK_DIR)/lib/include -DSDK_ASM +MWLDFLAGS := -w off -proc $(PROC) -nopic -nopid -interworking -map closure,unused -symtab sort -m _start -msgstyle gcc +ARFLAGS := rcS + +$(C_OBJS): MWCFLAGS += -include global.h + +MW_COMPILE = $(WINE) $(MWCC) $(MWCFLAGS) +MW_ASSEMBLE = $(WINE) $(MWAS) $(MWASFLAGS) + +export MWCIncludes := lib/include + +LSF := $(addsuffix .lsf,$(NEFNAME)) +ifneq ($(LSF),) +OVERLAYS := $(shell $(GREP) -o "^Overlay \w+" $(LSF) | cut -d' ' -f2) +else +OVERLAYS := +endif + +# Make sure build directories exist before compiling anything +DUMMY := $(shell mkdir -p $(ALL_BUILDDIRS)) + +.SECONDARY: +.SECONDEXPANSION: +.DELETE_ON_ERROR: +.PHONY: all tidy clean tools clean-tools $(TOOLDIRS) +.PRECIOUS: $(SBIN) +.NOTPARALLEL: + +.PHONY: $(MWAS) +$(MWAS): + $(ASPATCH) -q $@ + +all: tools + +ifeq ($(NODEP),) +ifneq ($(WINPATH),) +PROJECT_ROOT_NT := $(shell $(WINPATH) -w $(PROJECT_ROOT) | $(SED) 's/\\/\//g') +define fixdep +$(SED) -i 's/\r//g; s/\\/\//g; s/\/$$/\\/g; s#$(PROJECT_ROOT_NT)#$(PROJECT_ROOT)#g' $(1) +touch -r $(1:%.d=%.o) $(1) +endef +else +define fixdep +$(SED) -i 's/\r//g; s/\\/\//g; s/\/$$/\\/g' $(1) +touch -r $(1:%.d=%.o) $(1) +endef +endif +DEPFLAGS := -gccdep -MD +DEPFILES := $(ALL_OBJS:%.o=%.d) +MW_COMPILE += $(DEPFLAGS) +$(GLOBAL_ASM_OBJS): BUILD_C := $(ASM_PROCESSOR) "$(MW_COMPILE)" "$(MW_ASSEMBLE)" +BUILD_C ?= $(MW_COMPILE) -c -o + +$(DEPFILES): + +$(BUILD_DIR)/lib/NitroSDK/%.o: MWCCVER := 2.0/sp2p3 + +$(BUILD_DIR)/%.o: %.c +$(BUILD_DIR)/%.o: %.c $(BUILD_DIR)/%.d + $(BUILD_C) $@ $< + @$(call fixdep,$(BUILD_DIR)/$*.d) + +$(BUILD_DIR)/%.o: %.s +$(BUILD_DIR)/%.o: %.s $(BUILD_DIR)/%.d + $(WINE) $(MWAS) $(MWASFLAGS) $(DEPFLAGS) -o $@ $< + @$(call fixdep,$(BUILD_DIR)/$*.d) + +include $(wildcard $(DEPFILES)) +else +$(GLOBAL_ASM_OBJS): BUILD_C := $(ASM_PROCESSOR) "$(MW_COMPILE)" "$(MW_ASSEMBLE)" +BUILD_C ?= $(MW_COMPILE) -c -o + +$(BUILD_DIR)/%.o: %.c + $(BUILD_C) $@ $< + +$(BUILD_DIR)/%.o: %.s + $(WINE) $(MWAS) $(MWASFLAGS) -o $@ $< +endif + +$(NATIVE_TOOLS): tools + +tools: $(TOOLDIRS) $(MWAS) + +$(TOOLDIRS): + @$(MAKE) -C $@ + +clean-tools: + $(foreach tool,$(TOOLDIRS),$(MAKE) -C $(tool) clean;) + +$(LCF): $(LSF) $(LCF_TEMPLATE) + $(WINE) $(MAKELCF) $(MAKELCF_FLAGS) $^ $@ +ifeq ($(PROC),arm946e) + $(SED) -i '1i KEEP_SECTION\n{\n\t.exceptix\n}' $@ +else + $(SED) -i '/\} > check\.WORKRAM/a SDK_SUBPRIV_ARENA_LO = SDK_SUBPRIV_ARENA_LO + SDK_AUTOLOAD.EXT_WRAM.SIZE + SDK_AUTOLOAD.EXT_WRAM.BSS_SIZE;' $@ +endif + +RESPONSE_TEMPLATE := $(PROJECT_ROOT)/mwldarm.response.template +RESPONSE_TEMPLATE_NT := $(PROJECT_ROOT_NT)/mwldarm.response.template + +$(RESPONSE): $(LSF) $(RESPONSE_TEMPLATE) + $(WINE) $(MAKELCF) $(MAKELCF_FLAGS) $< $(RESPONSE_TEMPLATE_NT) $@ + +# Locate crt0.o +CRT0_OBJ := lib/asm/crt0.o + +$(NEF): $(LCF) $(RESPONSE) $(ALL_OBJS) + cd $(BUILD_DIR) && LM_LICENSE_FILE=$(BACK_REL)/$(LM_LICENSE_FILE) $(WINE) $(MWLD) $(MWLDFLAGS) $(LIBS) -o $(BACK_REL)/$(NEF) $(LCF:$(BUILD_DIR)/%=%) @$(RESPONSE:$(BUILD_DIR)/%=%) $(CRT0_OBJ) + +.INTERMEDIATE: $(BUILD_DIR)/obj.list + +$(SBIN): build/%.sbin: build/%.nef + +ifeq ($(COMPARE),1) + $(SHA1SUM) --quiet -c $*.sha1 +endif + +$(ELF): %.elf: %.nef + $(NTRMERGE) $* + +print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true diff --git a/lib/asm/crt0.s b/lib/asm/crt0.s new file mode 100644 index 0000000000..7051c9b26f --- /dev/null +++ b/lib/asm/crt0.s @@ -0,0 +1,312 @@ + .include "asm/macros/function.inc" + + arm_func_start sub_02000800 +sub_02000800: ; 0x02000800 + mov ip, #0x4000000 + str ip, [ip, #0x208] +_02000808: + ldrh r0, [ip, #6] + cmp r0, #0 + bne _02000808 + bl sub_02000AB0 + mov r0, #0x13 + msr cpsr_c, r0 + ldr r0, _02000930 ; =0x027E0000 + add r0, r0, #0x3fc0 + mov sp, r0 + mov r0, #0x12 + msr cpsr_c, r0 + ldr r0, _02000930 ; =0x027E0000 + add r0, r0, #0x3fc0 + sub r0, r0, #0x40 + sub sp, r0, #4 + tst sp, #4 + beq _02000850 + b _02000854 +_02000850: + sub sp, sp, #4 +_02000854: + ldr r1, _02000934 ; =0x00000800 + sub r1, r0, r1 + mov r0, #0x1f + msr cpsr_fsxc, r0 + sub sp, r1, #4 + mov r0, #0 + ldr r1, _02000930 ; =0x027E0000 + mov r2, #0x4000 + bl sub_02000954 + mov r0, #0 + ldr r1, _02000938 ; =0x05000000 + mov r2, #0x400 + bl sub_02000954 + mov r0, #0x200 + ldr r1, _0200093C ; =0x07000000 + mov r2, #0x400 + bl sub_02000954 + ldr r1, _02000940 ; =0x02000BA0 + ldr r0, [r1, #0x14] + bl sub_02000970 + bl sub_02000A1C + ldr r0, _02000940 ; =0x02000BA0 + ldr r1, [r0, #0xc] + ldr r2, [r0, #0x10] + mov r3, r1 + mov r0, #0 +_020008BC: + cmp r1, r2 + blo _020008C8 + b _020008CC +_020008C8: + str r0, [r1, #0], #4 +_020008CC: + blo _020008BC + bic r1, r3, #0x1f +_020008D4: + mcr p15, #0, r0, c7, c10, #4 + mcr p15, #0, r1, c7, c5, #1 + mcr p15, #0, r1, c7, c14, #1 + add r1, r1, #0x20 + cmp r1, r2 + blt _020008D4 + ldr r1, _02000944 ; =0x027FFF9C + str r0, [r1, #0] + ldr r1, _02000930 ; =0x027E0000 + add r1, r1, #0x3fc0 + add r1, r1, #0x3c + ldr r0, _02000948 ; =0x01FF8000 + str r0, [r1, #0] + bl sub_020E28B8 + bl sub_02000B98 + bl sub_020E402C + ldr r1, _0200094C ; =sub_02000C88 + ldr lr, _02000950 ; =0xFFFF0000 + tst sp, #4 + bne _02000928 + b _0200092C +_02000928: + sub sp, sp, #4 +_0200092C: + bx r1 + ; .align 2, 0 +_02000930: .word 0x027E0000 +_02000934: .word 0x00000800 +_02000938: .word 0x05000000 +_0200093C: .word 0x07000000 +_02000940: .word 0x02000BA0 +_02000944: .word 0x027FFF9C +_02000948: .word 0x01FF8000 +_0200094C: .word sub_02000C88 +_02000950: .word 0xFFFF0000 + arm_func_end sub_02000800 + + arm_func_start sub_02000954 +sub_02000954: ; 0x02000954 + add ip, r1, r2 +_02000958: + cmp r1, ip + blt _02000964 + b _02000968 +_02000964: + stmia r1!, {r0} +_02000968: + blt _02000958 + bx lr + arm_func_end sub_02000954 + + arm_func_start sub_02000970 +sub_02000970: ; 0x02000970 + cmp r0, #0 + beq _02000A18 + stmfd sp!, {r4, r5, r6, r7} + ldmdb r0, {r1, r2} + add r2, r0, r2 + sub r3, r0, r1, lsr #24 + bic r1, r1, #0xff000000 + sub r1, r0, r1 + mov r4, r2 +_02000994: + cmp r3, r1 + ble _020009F4 + ldrb r5, [r3, #-1]! + mov r6, #8 +_020009A4: + sub r6, r6, #1 + blt _02000994 + tst r5, #0x80 + bne _020009C0 + ldrb r0, [r3, #-1]! + strb r0, [r2, #-1]! + b _020009E8 +_020009C0: + ldrb ip, [r3, #-1]! + ldrb r7, [r3, #-1]! + orr r7, r7, ip, lsl #8 + bic r7, r7, #0xf000 + add r7, r7, #2 + add ip, ip, #0x20 +_020009D8: + ldrb r0, [r2, r7] + strb r0, [r2, #-1]! + sub ip, ip, #0x10 + bge _020009D8 +_020009E8: + cmp r3, r1 + lsl r5, r5, #1 + bgt _020009A4 +_020009F4: + mov r0, #0 + bic r3, r1, #0x1f +_020009FC: + mcr p15, #0, r0, c7, c10, #4 + mcr p15, #0, r3, c7, c5, #1 + mcr p15, #0, r3, c7, c14, #1 + add r3, r3, #0x20 + cmp r3, r4 + blt _020009FC + ldmia sp!, {r4, r5, r6, r7} +_02000A18: + bx lr + arm_func_end sub_02000970 + + arm_func_start sub_02000A1C +sub_02000A1C: ; 0x02000A1C + ldr r0, _02000AA8 ; =0x02000BA0 + ldr r1, [r0, #0] + ldr r2, [r0, #4] + ldr r3, [r0, #8] +_02000A2C: + cmp r1, r2 + beq _02000AA4 + ldr r5, [r1, #0], #4 + ldr r7, [r1, #0], #4 + add r6, r5, r7 + mov r4, r5 +_02000A44: + cmp r4, r6 + bmi _02000A50 + b _02000A54 +_02000A50: + ldr r7, [r3, #0], #4 +_02000A54: + bmi _02000A5C + b _02000A60 +_02000A5C: + str r7, [r4, #0], #4 +_02000A60: + bmi _02000A44 + ldr r7, [r1, #0], #4 + add r6, r4, r7 + mov r7, #0 +_02000A70: + cmp r4, r6 + blo _02000A7C + b _02000A80 +_02000A7C: + str r7, [r4, #0], #4 +_02000A80: + blo _02000A70 + bic r4, r5, #0x1f +_02000A88: + mcr p15, #0, r7, c7, c10, #4 + mcr p15, #0, r4, c7, c5, #1 + mcr p15, #0, r4, c7, c14, #1 + add r4, r4, #0x20 + cmp r4, r6 + blt _02000A88 + b _02000A2C +_02000AA4: + b _02000AAC + ; .align 2, 0 +_02000AA8: .word 0x02000BA0 + arm_func_end sub_02000A1C +_02000AAC: + bx lr + + arm_func_start sub_02000AB0 +sub_02000AB0: ; 0x02000AB0 + mrc p15, #0, r0, c1, c0, #0 + ldr r1, _02000B68 ; =0x000F9005 + bic r0, r0, r1 + mcr p15, #0, r0, c1, c0, #0 + mov r0, #0 + mcr p15, #0, r0, c7, c5, #0 + mcr p15, #0, r0, c7, c6, #0 + mcr p15, #0, r0, c7, c10, #4 + ldr r0, _02000B6C ; =0x04000033 + mcr p15, #0, r0, c6, c0, #0 + ldr r0, _02000B70 ; =0x0200002D + mcr p15, #0, r0, c6, c1, #0 + ldr r0, _02000B74 ; =0x027E0021 + mcr p15, #0, r0, c6, c2, #0 + ldr r0, _02000B78 ; =0x08000035 + mcr p15, #0, r0, c6, c3, #0 + ldr r0, _02000B7C ; =0x027E0000 + orr r0, r0, #0x1a + orr r0, r0, #1 + mcr p15, #0, r0, c6, c4, #0 + ldr r0, _02000B80 ; =0x0100002F + mcr p15, #0, r0, c6, c5, #0 + ldr r0, _02000B84 ; =0xFFFF001D + mcr p15, #0, r0, c6, c6, #0 + ldr r0, _02000B88 ; =0x027FF017 + mcr p15, #0, r0, c6, c7, #0 + mov r0, #0x20 + mcr p15, #0, r0, c9, c1, #1 + ldr r0, _02000B7C ; =0x027E0000 + orr r0, r0, #0xa + mcr p15, #0, r0, c9, c1, #0 + mov r0, #0x42 + mcr p15, #0, r0, c2, c0, #1 + mov r0, #0x42 + mcr p15, #0, r0, c2, c0, #0 + mov r0, #2 + mcr p15, #0, r0, c3, c0, #0 + ldr r0, _02000B8C ; =0x05100011 + mcr p15, #0, r0, c5, c0, #3 + ldr r0, _02000B90 ; =0x15111011 + mcr p15, #0, r0, c5, c0, #2 + mrc p15, #0, r0, c1, c0, #0 + ldr r1, _02000B94 ; =0x0005707D + orr r0, r0, r1 + mcr p15, #0, r0, c1, c0, #0 + bx lr + ; .align 2, 0 +_02000B68: .word 0x000F9005 +_02000B6C: .word 0x04000033 +_02000B70: .word 0x0200002D +_02000B74: .word 0x027E0021 +_02000B78: .word 0x08000035 +_02000B7C: .word 0x027E0000 +_02000B80: .word 0x0100002F +_02000B84: .word 0xFFFF001D +_02000B88: .word 0x027FF017 +_02000B8C: .word 0x05100011 +_02000B90: .word 0x15111011 +_02000B94: .word 0x0005707D + arm_func_end sub_02000AB0 + + arm_func_start sub_02000B98 +sub_02000B98: ; 0x02000B98 + bx lr + arm_func_end sub_02000B98 + + arm_func_start sub_02000B9C +sub_02000B9C: ; 0x02000B9C + bx lr + arm_func_end sub_02000B9C +_02000BA0: + .byte 0xE0, 0x23, 0x10, 0x02, 0xF8, 0x23, 0x10, 0x02, 0x20, 0x1D, 0x10, 0x02, 0x20, 0x1D, 0x10, 0x02 + .byte 0x80, 0x0D, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x31, 0x75, 0x02, 0x04, 0x21, 0x06, 0xC0, 0xDE + .byte 0xDE, 0xC0, 0x06, 0x21, 0x5B, 0x53, 0x44, 0x4B, 0x2B, 0x4E, 0x49, 0x4E, 0x54, 0x45, 0x4E, 0x44 + .byte 0x4F, 0x3A, 0x44, 0x57, 0x43, 0x32, 0x2E, 0x32, 0x2E, 0x33, 0x30, 0x30, 0x30, 0x38, 0x2E, 0x30 + .byte 0x38, 0x30, 0x36, 0x33, 0x30, 0x2E, 0x31, 0x39, 0x30, 0x36, 0x5F, 0x44, 0x57, 0x43, 0x5F, 0x32 + .byte 0x5F, 0x32, 0x5F, 0x50, 0x4C, 0x55, 0x53, 0x38, 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x53, 0x44, 0x4B + .byte 0x2B, 0x4E, 0x49, 0x4E, 0x54, 0x45, 0x4E, 0x44, 0x4F, 0x3A, 0x42, 0x41, 0x43, 0x4B, 0x55, 0x50 + .byte 0x5D, 0x00, 0x00, 0x00, 0x5B, 0x53, 0x44, 0x4B, 0x2B, 0x41, 0x62, 0x69, 0x6F, 0x73, 0x73, 0x6F + .byte 0x3A, 0x6C, 0x69, 0x62, 0x56, 0x43, 0x54, 0x20, 0x31, 0x2E, 0x33, 0x2E, 0x31, 0x5D, 0x00, 0x00 + .byte 0x5B, 0x53, 0x44, 0x4B, 0x2B, 0x4E, 0x49, 0x4E, 0x54, 0x45, 0x4E, 0x44, 0x4F, 0x3A, 0x57, 0x69 + .byte 0x46, 0x69, 0x32, 0x2E, 0x31, 0x2E, 0x33, 0x30, 0x30, 0x30, 0x33, 0x2E, 0x30, 0x37, 0x30, 0x39 + .byte 0x32, 0x30, 0x30, 0x32, 0x32, 0x39, 0x5D, 0x00, 0x5B, 0x53, 0x44, 0x4B, 0x2B, 0x55, 0x42, 0x49 + .byte 0x51, 0x55, 0x49, 0x54, 0x4F, 0x55, 0x53, 0x3A, 0x43, 0x50, 0x53, 0x5D, 0x00, 0x00, 0x00, 0x00 + .byte 0x5B, 0x53, 0x44, 0x4B, 0x2B, 0x55, 0x42, 0x49, 0x51, 0x55, 0x49, 0x54, 0x4F, 0x55, 0x53, 0x3A + .byte 0x53, 0x53, 0x4C, 0x5D, 0x00, 0x00, 0x00, 0x00 diff --git a/lib/syscall/Makefile b/lib/syscall/Makefile new file mode 100644 index 0000000000..9634e80701 --- /dev/null +++ b/lib/syscall/Makefile @@ -0,0 +1,32 @@ +GAME_CODE ?= arm9 +MWCCVER := 2.0/sp2p3 +PROC := arm946e +PROC_S := arm5te +PROC_LD := v5te +BUILD_DIR := build + +include ../../common.mk + +MWLDFLAGS := -library -nodead -w off -proc $(PROC_LD) +LIB := $(BUILD_DIR)/libsyscall.a + +.PHONY: all install + +INSTALL_PREFIX ?= $(WORK_DIR)/lib/ARM9-TS +INSTALL_LIBDIR := $(INSTALL_PREFIX)/lib + +all: $(LIB) + +ASM_SRCS := asm/_secure.s + +$(LIB): $(ALL_OBJS) + cd $(BUILD_DIR) && LM_LICENSE_FILE=$(BACK_REL)/$(LM_LICENSE_FILE) $(WINE) $(MWLD) $(MWLDFLAGS) -o $(BACK_REL)/$(LIB) $(ALL_OBJS:$(BUILD_DIR)/%=%) + +install: all + $(shell mkdir -p $(INSTALL_LIBDIR)) + cp $(LIB) $(INSTALL_LIBDIR)/ + +tidy: + $(RM) -r $(BUILD_DIR) + +clean: tidy diff --git a/lib/syscall/asm/_secure.s b/lib/syscall/asm/_secure.s new file mode 100644 index 0000000000..5144e44ec3 --- /dev/null +++ b/lib/syscall/asm/_secure.s @@ -0,0 +1,265 @@ + .include "asm/macros/function.inc" + + .global SecureAreaStart +SecureAreaStart: + .byte 0xFF, 0xDE, 0xFF, 0xE7, 0xFF, 0xDE, 0xFF, 0xE7, 0xFF, 0xDE, 0xFF, 0xE7, 0xFF, 0xDE, 0x92, 0x8E + .byte 0x26, 0xCB, 0x38, 0xC4, 0xDF, 0xBC, 0xA3, 0x97, 0x54, 0xA4, 0xE6, 0x8D, 0x1F, 0x05, 0x85, 0x33 + .byte 0xB7, 0x48, 0xEC, 0xF8, 0x19, 0xE8, 0x5C, 0x73, 0x66, 0x43, 0x66, 0xC4, 0x63, 0x36, 0x44, 0x36 + .byte 0x24, 0x40, 0x84, 0xCC, 0xDD, 0x94, 0x08, 0xA2, 0x8A, 0x12, 0xE2, 0x43, 0xD5, 0xF4, 0x95, 0x8C + .byte 0xA8, 0x64, 0xCD, 0xDB, 0xA7, 0x11, 0xD1, 0x9A, 0xD9, 0x2E, 0x63, 0x3F, 0xA0, 0xFF, 0xB2, 0x5C + .byte 0xAD, 0xFB, 0xBC, 0x93, 0x5F, 0xD0, 0x8B, 0x60, 0xEB, 0x1B, 0xE3, 0x46, 0x69, 0xBB, 0xED, 0x62 + .byte 0x17, 0xD5, 0x67, 0x98, 0xBB, 0xD2, 0x0B, 0xF9, 0x61, 0x5A, 0x71, 0xB4, 0xCD, 0xC7, 0xE4, 0x78 + .byte 0x36, 0x22, 0x91, 0x9A, 0xE6, 0x82, 0xB0, 0xD5, 0x63, 0x0E + + non_word_aligned_thumb_func_start sub_0200007A +sub_0200007A: ; 0x0200007A + swi #0xd + bx lr + thumb_func_end sub_0200007A +_0200007E: + .byte 0x7F, 0x2D + .byte 0x47, 0xDA, 0xA7, 0xEC, 0xAB, 0xA8, 0xE3, 0xD7, 0x4E, 0xBD, 0x2C, 0x3B, 0xE9, 0x58, 0x1E, 0x93 + .byte 0x0B, 0x9D, 0x95, 0x92, 0x78, 0x17, 0x5A, 0xC5, 0x64, 0xB0, 0xA7, 0xC3, 0xE3, 0xBA, 0x71, 0xC9 + .byte 0xE4, 0xDA, 0x75, 0x3A, 0x80, 0xDB, 0xE7, 0xFB, 0x8F, 0xDF, 0x76, 0x0C, 0xA8, 0x78, 0xD8, 0xC6 + .byte 0xA4, 0xA1, 0x20, 0x62, 0xB9, 0x0C, 0xEA, 0x82, 0x20, 0x99, 0x7F, 0x1E, 0xCB, 0xF2, 0x77, 0x39 + .byte 0x4C, 0xD0, 0xFC, 0x57, 0xF6, 0xB2, 0x78, 0x51, 0x82, 0x9C, 0x9D, 0xE7, 0x70, 0xD8, 0x17, 0x6A + .byte 0x25, 0xE9, 0x22, 0xAF, 0x05, 0xAB, 0xEE, 0x06, 0xB6, 0x34, 0xBC, 0x40, 0xDC, 0x05, 0x82, 0x21 + + thumb_func_start sub_020000E0 +sub_020000E0: ; 0x020000E0 + swi #0x12 + bx lr + thumb_func_end sub_020000E0 +_020000E4: + .byte 0x7F, 0xF0, 0x5D, 0x95, 0x2F, 0x8F, 0x87, 0xC6, 0x6F, 0x88, 0x36, 0x73 + .byte 0xC7, 0x57, 0x82, 0x11, 0x0D, 0x58, 0x3E, 0x8C, 0x0D, 0xE1, 0xE9, 0xD8, 0x13, 0x49, 0x97, 0x11 + .byte 0xB0, 0x7E, 0x30, 0x42, 0x1D, 0x23, 0x96, 0x72, 0xCE, 0x3B, 0x65, 0x29, 0xBD, 0x19, 0xAF, 0x06 + .byte 0xC0, 0x52, 0x70, 0xDA, 0xF0, 0xBB, 0x61, 0x07, 0x69, 0x6B, 0xAB, 0x01, 0xCE, 0x09, 0x28, 0x15 + .byte 0x13, 0x96, 0xEF, 0xAD, 0xB4, 0xDC, 0xCD, 0x91, 0xF5, 0x33, 0x76, 0x1E, 0x0D, 0x8F, 0xBC, 0x1A + .byte 0x26, 0x4C, 0x03, 0x81, 0x2F, 0xE1, 0x2A, 0x69, 0xC9, 0x60, 0xEC, 0xDC, 0x69, 0x44, 0xCE, 0x63 + .byte 0xC8, 0x8A, 0x7C, 0xDF, 0x28, 0x33, 0x06, 0x72, 0x3D, 0xF1, 0x5C, 0xC8, 0xA7, 0x43, 0x83, 0xA3 + .byte 0x88, 0x4E, 0xAE, 0x16, 0x3B, 0xBE, 0x54, 0x24, 0x6A, 0x7B, 0x2C, 0x20, 0xFD, 0xB8, 0xAA, 0xE0 + + thumb_func_start sub_02000160 +sub_02000160: ; 0x02000160 + swi #0xe + bx lr + thumb_func_end sub_02000160 +_02000164: + .byte 0x98, 0xE1, 0xD6, 0x85, 0xD9, 0xD9, 0x57, 0x08, 0xE5, 0x99, 0x06, 0x63 + .byte 0x8C, 0xE6, 0x69, 0xDB, 0x02, 0x7B, 0x75, 0xCA, 0xD1, 0xFE, 0x42, 0x50, 0x23, 0x7B, 0x3E, 0x1B + .byte 0xC6, 0xC4, 0x07, 0x81, 0x83, 0x53, 0x07, 0x39, 0x0B, 0xBB, 0xBC, 0x86, 0x67, 0x9A, 0x30, 0x8F + .byte 0x6B, 0x82, 0xAE, 0x00, 0x22, 0xAE, 0xFA, 0x60, 0xDA, 0x7D, 0x6A, 0x20, 0xB5, 0x60, 0xAC, 0xC5 + .byte 0xD6, 0x4B, 0x91, 0x8E, 0xA1, 0x87, 0x91, 0x2D, 0x7D, 0x20, 0x62, 0x01, 0x93, 0xAE, 0x1E, 0x10 + .byte 0xEE, 0xF1, 0x85, 0x35, 0x54, 0x82, 0x84, 0xB7, 0x67, 0xDF, 0x57, 0x04, 0xDD, 0x59, 0xAC, 0xF4 + .byte 0xC8, 0x42, 0x01, 0xDE + + thumb_func_start sub_020001C4 +sub_020001C4: ; 0x020001C4 + swi #9 + bx lr + thumb_func_end sub_020001C4 +_020001C8: + .byte 0xF8, 0x4B, 0xB2, 0xDA, 0xE3, 0xE8, 0xA0, 0x05 + .byte 0x8F, 0x8D, 0x10, 0x77, 0x7E, 0x0D, 0x52, 0xE4, 0x66, 0x59, 0x8D, 0x91, 0x35, 0x57, 0x20, 0xA7 + .byte 0xBB, 0x6E, 0x35, 0xF9, 0x73, 0x0A, 0x73, 0xFD, 0x3A, 0x2D, 0x68, 0x12, 0x9C, 0xFC, 0x46, 0x4A + .byte 0x78, 0x42, 0x42, 0x90, 0xA9, 0xF8, 0x92, 0x35, 0x48, 0x77, 0x89, 0x6E, 0x0A, 0x80, 0xB0, 0xD8 + .byte 0xDE, 0x38, 0xE8, 0xF9, 0xBC, 0xF2, 0x73, 0xCC, 0x00, 0xAB, 0xC9, 0x68, 0x6E, 0x67, 0x87, 0xD0 + .byte 0x16, 0xE8, 0x5C, 0xCC, 0x1C, 0x59, 0xBA, 0xEC, 0xA8, 0xBB, 0x67, 0x76, 0x21, 0xD1, 0xF9, 0xB6 + .byte 0xA3, 0xFC, 0xA3, 0xB0, 0xF3, 0xAC, 0x94, 0xEF, 0x8B, 0x87, 0x7D, 0xA3, 0x50, 0x31, 0x6A, 0xE1 + .byte 0x96, 0xFB, 0xF7, 0x2B, 0xC1, 0x43, 0xFC, 0xAF, 0xD4, 0xD8, 0x78, 0x96, 0x25, 0x1F, 0x2E, 0x12 + .byte 0x73, 0x77, 0x20, 0x94, 0x4C, 0xCA + + non_word_aligned_thumb_func_start sub_02000246 +sub_02000246: ; 0x02000246 + mov r2, #0 + swi #5 + bx lr + thumb_func_end sub_02000246 +_0200024C: + .byte 0xF2, 0xF2, 0x65, 0x7C + .byte 0x41, 0x43, 0x9D, 0xA1, 0x09, 0xE9, 0xD5, 0xAB, 0x6E, 0x1F, 0x30, 0x19, 0xFA, 0xCD, 0x4A, 0x8D + .byte 0x42, 0x80, 0x1F, 0x8C, 0x81, 0x09, 0x0C, 0x0C, 0x2C, 0x91, 0x3F, 0x2B, 0x98, 0x70, 0xE8, 0x0D + .byte 0x8F, 0x82, 0x82, 0x8E, 0x6A, 0x02, 0x64, 0x7D, 0xCC, 0xD2, 0xC6, 0x08, 0xC8, 0xE8, 0x9E, 0xB5 + .byte 0x08, 0x9F, 0xDF, 0xD8, 0x1A, 0x48, 0xF6, 0xA4, 0x11, 0xE0, 0xD6, 0xE1, 0xF0, 0xD5, 0x66, 0xF4 + .byte 0xFC, 0x3B, 0x69, 0x83, 0x3E, 0x63, 0x14, 0xE9, 0x54, 0xB5, 0x2F, 0xC0, 0xB9, 0x78, 0x8C, 0x88 + .byte 0x19, 0x8A, 0x09, 0x06, 0xA6, 0x48, 0x30, 0xC6, 0xA3, 0xA7, 0x62, 0xE8, 0xE0, 0x3A, 0x9C, 0xF4 + .byte 0x7E, 0xE0, 0x02, 0xF1, 0x9F, 0x74, 0x4C, 0xC3, 0xE9, 0xA9, 0x1A, 0x0A + + thumb_func_start sub_020002BC +sub_020002BC: ; 0x020002BC + swi #0x11 + bx lr + thumb_func_end sub_020002BC +_020002C0: + .byte 0x84, 0x8D, 0x66, 0x56, 0xAD, 0xC7, 0xD0, 0xDF, 0x6B, 0x85, 0x96, 0x97, 0x9E, 0x86, 0x6F, 0x36 + .byte 0xCB, 0x9F, 0x63, 0x5A, 0x81, 0xCE, 0x0E, 0xEC, 0xD3, 0xD9, 0xFB, 0x68, 0x56, 0x7A, 0xA9, 0x9F + .byte 0xA4, 0x91, 0xA1, 0x3C, 0x82, 0x19, 0x34, 0xC4, 0x6C, 0xD5, 0x7A, 0x49, 0xAD, 0xE6, 0x93, 0x1F + .byte 0xD4, 0x70, 0x8F, 0xD1, 0x45, 0x98, 0xAB, 0x3E, 0x60, 0xB4, 0x24, 0xD2, 0x79, 0x0F, 0x4F, 0x5E + .byte 0xD1, 0x21, 0x42, 0xCE, 0xC5, 0x6C, 0x3A, 0xDE, 0xC3, 0x62, 0xE4, 0x79, 0xCF, 0xA4, 0xF6, 0xE4 + .byte 0x05, 0x1E, 0x9A, 0x64, 0xBC, 0x90 + + non_word_aligned_thumb_func_start sub_02000316 +sub_02000316: ; 0x02000316 + swi #6 + bx lr + thumb_func_end sub_02000316 +_0200031A: + .byte 0xE9, 0x0E, 0xEB, 0xAE, 0xE7, 0x7D + .byte 0xBE, 0x6D, 0x80, 0xF6, 0xFD, 0x65, 0xFF, 0x34, 0x6B, 0x87, 0x74, 0x07, 0xB4, 0x58, 0xC4, 0x20 + .byte 0xF9, 0xAB, 0xF1, 0xBE, 0xC9, 0x37, 0x22, 0x2E, 0xBB, 0xE7, 0xB9, 0x60, 0x75, 0x0B, 0x70, 0xFF + .byte 0xE3, 0x1D, 0x8A, 0x4D, 0x70, 0x72, 0xA3, 0x07, 0x18, 0xE1, 0x4F, 0xC7, 0x13, 0x0C, 0x6F, 0x66 + .byte 0x63, 0x5A, 0x6F, 0x9A, 0x1D, 0xDE, 0x4C, 0xB2, 0x01, 0xA3, 0x00, 0xD2, 0xA0, 0xF3, 0x07, 0xA2 + .byte 0xF1, 0xFF, 0x90, 0xCE, 0x19, 0x2B, 0x2E, 0x99, 0xB3, 0x7B, 0x89, 0x82, 0xA5, 0xB8, 0x27, 0x31 + .byte 0xEF, 0x1D, 0xA5, 0x60, 0x81, 0xF7, 0xF2, 0xDE, 0xE1, 0x48, 0x67, 0xFF, 0xD4, 0xF1, 0xFD, 0xEA + .byte 0x04, 0x08, 0x89, 0x95, 0xE5, 0xA6, 0x4B, 0xA4, 0xB8, 0x36, 0x45, 0x22, 0x06, 0xED, 0xA0, 0xBE + .byte 0x40, 0xA4, 0x14, 0x9C, 0x64, 0x17, 0xF3, 0x81, 0x36, 0x48 + + non_word_aligned_thumb_func_start sub_0200039A +sub_0200039A: ; 0x0200039A + swi #0x14 + bx lr + thumb_func_end sub_0200039A +_0200039E: + .byte 0xCD, 0x88 + .byte 0x7F, 0x75, 0x2F, 0x90, 0x3F, 0x6E, 0x4B, 0xFD, 0xE9, 0xE3, 0x2B, 0xC6, 0xA0, 0xA9, 0xB3, 0xB8 + .byte 0x7A, 0xBD, 0x31, 0x3B, 0x04, 0x00, 0x12, 0x0B, 0xF7, 0x2A, 0x10, 0x6E, 0x5B, 0x20, 0xDE, 0x43 + .byte 0xA6, 0xBC, 0x29, 0x85, 0x94, 0x3D, 0x8F, 0x55, 0x8A, 0xC5, 0x44, 0xFF, 0x78, 0xBA, 0x7A, 0xA8 + .byte 0x1A, 0x90, 0x51, 0xDD, 0xF0, 0xF7, 0x99, 0x57, 0x42, 0xCA, 0x38, 0x29, 0xEF, 0xA1, 0x1D, 0xE7 + .byte 0xA9, 0x9F, 0xAB, 0xD8, 0x82, 0x41, 0x93, 0xD6, 0x95, 0x50, 0x24, 0xC2, 0x2D, 0xA3, 0x03, 0xDC + .byte 0x18, 0xD9, 0xE2, 0x3C, 0x19, 0x76, 0x9F, 0x35, 0xEE, 0x15, 0x81, 0xB4, 0xD5, 0x98, 0xDA, 0x4B + .byte 0x17, 0x94, 0xC8, 0x7D, 0x77, 0x97, 0x09, 0xDF, 0x08, 0x1C, 0x70, 0x47, 0xC5, 0x28, 0x19, 0xFA + .byte 0x99, 0xF2, 0xD3, 0x66, 0x98, 0xF7, 0xE7, 0x25, 0xA8, 0x9E, 0x04, 0x58, 0xA7, 0x1E, 0x80, 0xD2 + .byte 0x89, 0x8B, 0x8C, 0x9A, 0xDB, 0xEC, 0xC2, 0x64, 0x59, 0xFF, 0xAE, 0xC1, 0xD8, 0x8E, 0x42, 0x24 + .byte 0x3A, 0x72, 0x47, 0xF7, 0x5E, 0x56, 0x27, 0xE8, 0xC9, 0x85, 0x46, 0xAF, 0x2F, 0x42, 0xC4, 0x0C + .byte 0x43, 0xCA, 0x50, 0x37, 0x25, 0xC7, 0x64, 0xE2, 0x9C, 0xD5, 0x27, 0x1D, 0x49, 0xFC, 0xBE, 0xD2 + .byte 0x7B, 0x21, 0x21, 0x65, 0x8D, 0x5E, 0xAC, 0x80, 0xFF, 0xD1, 0x76, 0x5B, 0x3D, 0x64, 0x31, 0x59 + .byte 0x06, 0x03, 0x95, 0x34, 0x13, 0xA7, 0x42, 0xF6, 0x50, 0x0B + + non_word_aligned_thumb_func_start sub_0200046A +sub_0200046A: ; 0x0200046A + swi #0xf + bx lr + thumb_func_end sub_0200046A +_0200046E: + .byte 0x0C, 0x9B + .byte 0xF4, 0xF6, 0x89, 0x7B, 0xD0, 0x91, 0x6B, 0x58, 0x33, 0x76, 0x52, 0xBC, 0xEC, 0x81, 0x89, 0xD2 + .byte 0xFB, 0x4B, 0xE1, 0x85, 0x49, 0x57, 0xCC, 0xD3, 0x6F, 0x12, 0xE1, 0xEB, 0xFC, 0x58, 0x09, 0x81 + .byte 0xBE, 0x65, 0x5F, 0x36, 0xCE, 0x1F, 0xF1, 0x41, 0x0A, 0xB1, 0xA4, 0x65, 0xF5, 0xA0, 0xAA, 0x78 + .byte 0x61, 0x33, 0xBD, 0x6D, 0x27, 0x1A, 0x26, 0x08, 0xD0, 0xF5, 0x3E, 0x39, 0xC1, 0x98, 0x19, 0x58 + .byte 0x8C, 0x14, 0xD1, 0xAE, 0x10, 0xAB, 0x3A, 0xD0, 0x41, 0xF8, 0xCB, 0x40, 0x54, 0x27, 0x4C, 0xEF + .byte 0xD5, 0x54, 0x19, 0xBF + + thumb_func_start sub_020004C4 +sub_020004C4: ; 0x020004C4 + swi #0x15 + bx lr + thumb_func_end sub_020004C4 +_020004C8: + .byte 0x66, 0x02, 0x85, 0x2F, 0xD4, 0xDF, 0x62, 0x16 + .byte 0x62, 0x3B, 0xEE, 0xB9, 0x9E, 0xB9, 0x3C, 0x1D, 0xD2, 0x60, 0x9F, 0x20, 0x5A, 0xF0, 0xA7, 0xA0 + .byte 0xE4, 0xAB, 0x60, 0x4B, 0x4F, 0xA8, 0xE7, 0x07, 0x10, 0x1C, 0x5C, 0x17, 0x07, 0x11, 0xE3, 0xAA + .byte 0x37, 0x07, 0xEB, 0x11, 0x10, 0x34, 0x9D, 0xAE, 0x30, 0xF2, 0x5D, 0xB9, 0x39, 0xA8, 0xA4, 0x22 + .byte 0x12, 0x69, 0x21, 0x85, 0xA1, 0xEC, 0x13, 0xE1, 0xEF, 0xF8, 0xE9, 0xA5, 0xF2, 0xBF, 0xF6, 0x21 + .byte 0x2C, 0x45, 0x80, 0xDF, 0x1C, 0x6D, 0x7C, 0x89, 0xEA, 0xBE, 0xEA, 0x37, 0xBC, 0x88, 0x59, 0x52 + .byte 0x59, 0x93 + + non_word_aligned_thumb_func_start sub_02000522 +sub_02000522: ; 0x02000522 + swi #3 + bx lr + thumb_func_end sub_02000522 +_02000526: + .byte 0x2D, 0x0E, 0xA1, 0x2B, 0x37, 0xE7, 0xA6, 0x05, 0x06, 0xAC + .byte 0x3C, 0x78, 0x3E, 0x0D, 0xC3, 0x9F, 0xC9, 0xCA, 0xB6, 0x80, 0x2D, 0x34, 0xE7, 0x23, 0x07, 0xC7 + .byte 0x14, 0x1E, 0xCC, 0x24, 0xF3, 0xA2, 0x7C, 0x51, 0x4D, 0xE4, 0xB3, 0xCF, 0x0E, 0x5C, 0x0D, 0x43 + .byte 0x61, 0xCC, 0xD6, 0x96, 0x0A, 0xE2, 0xDC, 0xD9, 0x3F, 0x0F, 0x25, 0xE4, 0x4D, 0xE7, 0x95, 0xF7 + .byte 0xAE, 0xB0, 0x1D, 0x8A, 0x69, 0xCE, 0x72, 0x09, 0xEE, 0x00, 0x40, 0x43, 0xC5, 0x93, 0xC6, 0xB2 + + thumb_func_start sub_02000570 +sub_02000570: ; 0x02000570 + swi #0xb + bx lr + thumb_func_end sub_02000570 +_02000574: + .byte 0xBC, 0x15, 0x93, 0xAD, 0x09, 0xF3, 0xFB, 0xBA, 0xAB, 0x28, 0xCE, 0xA1 + .byte 0xDF, 0x1A, 0xD7, 0xE9, 0x80, 0xD7, 0xDD, 0xC4, 0x0D, 0xAC, 0xB2, 0x18, 0x50, 0x27, 0x88, 0x6A + .byte 0xBD, 0x44, 0x9A, 0x4C, 0xF5, 0xA4, 0x9A, 0xC5, 0x2E, 0x40, 0x20, 0x6E, 0xCE, 0xE3, 0x5E, 0x49 + .byte 0x17, 0x47, 0x47, 0xAE, 0x90, 0xD9, 0xAD, 0xDF, 0xB5, 0x3B, 0xFF, 0x7B, 0x3C, 0x9C, 0x76, 0xC8 + .byte 0x99, 0x4E, 0x6F, 0x1C, 0x66, 0x8E, 0xB0, 0x86, 0x16, 0x9A, 0xD3, 0xAC, 0x6D, 0x1E, 0xD2, 0xF6 + .byte 0xE5, 0x92, 0x1F, 0xAC, 0x25, 0x61, 0x47, 0x74, 0xA1, 0x43, 0xF9, 0x55, 0x92, 0x89, 0xF5, 0x24 + .byte 0xD6, 0x21, 0x92, 0x1E, 0xDD, 0x88, 0x72, 0x94, 0x42, 0x86, 0x45, 0x28, 0xCA, 0xE4, 0x89, 0xBF + .byte 0x15, 0xDF, 0x9F, 0x5D + + thumb_func_start sub_020005E4 +sub_020005E4: ; 0x020005E4 + swi #0x13 + bx lr + thumb_func_end sub_020005E4 +_020005E8: + .byte 0x1A, 0x2D, 0x0F, 0xF7, 0x0F, 0x7E, 0xB5, 0x68 + .byte 0x9E, 0x56, 0x70, 0x6D, 0x69, 0x08, 0x51, 0x97, 0x54, 0x30, 0x97, 0x32, 0x78, 0xD1, 0x62, 0x94 + .byte 0xFD, 0x6E, 0x67, 0x1D, 0x37, 0x9E, 0x2F, 0xFE, 0x4A, 0x38, 0x15, 0xE8, 0x5E, 0xAF, 0xC8, 0x57 + .byte 0x81, 0x44, 0x16, 0x6B, 0x6C, 0x4B, 0x57, 0x7D, 0xAC, 0x33, 0xDA, 0x4F, 0x4C, 0x74, 0xB9, 0x94 + .byte 0x1B, 0xF5, 0x76, 0x5B, 0x4A, 0xEF, 0x49, 0x7D, 0x55, 0xFB, 0x56, 0xE8, 0x4B, 0x8C, 0x03, 0x75 + .byte 0x1D, 0xFE, 0x9C, 0x8F, 0x58, 0x7B, 0x21, 0x76, 0xCE, 0xBF, 0xDA, 0xAA, 0xE6, 0xE2, 0xFE, 0x52 + .byte 0xAC, 0x3D, 0x48, 0x2B, 0x9D, 0x12, 0xE4, 0x67, 0xDA, 0x53 + + non_word_aligned_thumb_func_start sub_0200064A +sub_0200064A: ; 0x0200064A + swi #0x10 + bx lr + thumb_func_end sub_0200064A +_0200064E: + .byte 0xB9, 0x2F + .byte 0x79, 0x01, 0xAA, 0x32, 0xD5, 0x52, 0x94, 0xA4, 0xA9, 0x32, 0xBD, 0xCE, 0x70, 0xFF, 0xC6, 0x26 + .byte 0x02, 0x23, 0x0A, 0x59, 0x7A, 0x60, 0xFE, 0xC1, 0x3B, 0x5B, 0xC3, 0x6F, 0xA5, 0x43, 0xB1, 0x95 + .byte 0x7B, 0x94, 0x5C, 0xFA, 0x49, 0x06, 0x46, 0x81, 0x17, 0x13, 0x58, 0xEC, 0x13, 0xBF, 0xD1, 0x2E + .byte 0x96, 0x3D, 0x41, 0xEA, 0x0A, 0xA1, 0xE5, 0xDC, 0x8D, 0xC4, 0xEE, 0x19, 0x5F, 0x0C, 0x04, 0x04 + .byte 0x23, 0x0F, 0x5B, 0xF0, 0xCE, 0x91, 0x34, 0x7F, 0x46, 0xDD, 0x9E, 0xE4, 0x7B, 0xDF + + non_word_aligned_thumb_func_start sub_0200069E +sub_0200069E: ; 0x0200069E + mov r2, #0 + swi #4 + bx lr + thumb_func_end sub_0200069E +_020006A4: + .byte 0xE6, 0x8A, 0xFF, 0x50, 0x99, 0x98, 0xAD, 0x97, 0xA0, 0x42, 0x3F, 0x17 + .byte 0xED, 0x3B, 0x69, 0xBD, 0x2E, 0xB2, 0xF1, 0x4A, 0x4E, 0xCE, 0x4B, 0x96, 0xC9, 0xA7, 0xFD, 0x1E + .byte 0xFB, 0xDA, 0x55, 0xE2, 0x1F, 0xEC, 0x89, 0x23, 0xB6, 0xED, 0xA5, 0xC9, 0xF7, 0x3A, 0x32, 0xE8 + .byte 0x8C, 0xA2, 0x17, 0x6A, 0x47, 0x6A, 0x86, 0x43, 0xDA, 0xA5, 0x3D, 0x8A, 0x24, 0x44, 0xBA, 0xEB + .byte 0xAB, 0x09, 0x4C, 0x9C, 0x26, 0x96, 0xFC, 0x4D, 0xC8, 0xA3, 0xF8, 0x1C, 0x7E, 0xDD, 0xBF, 0xBC + .byte 0xD9, 0xAA, 0x21, 0x23, 0xB0, 0x79, 0x80, 0x1C, 0xF6, 0x3C, 0xE7, 0xEF, 0xDC, 0x16, 0x54, 0xEB + .byte 0xFC, 0xA2, 0x36, 0x8D, 0x3B, 0x80, 0x76, 0x6B + + thumb_func_start sub_02000708 +sub_02000708: ; 0x02000708 + swi #0 + bx lr + thumb_func_end sub_02000708 +_0200070C: + .byte 0xE0, 0x35, 0x0E, 0xD6 + .byte 0xF5, 0xE2, 0xAC, 0x6E, 0xAE, 0x5E, 0xD1, 0xB4, 0xD5, 0x0A, 0xAA, 0x00, 0x1A, 0x17, 0x29, 0x2A + .byte 0x6C, 0x32, 0x7C, 0x7C, 0x5E, 0x12, 0xF9, 0x35, 0x5E, 0x12, 0x52, 0xDE, 0xCB, 0x00, 0x64, 0x60 + .byte 0xD6, 0x8A, 0xB9, 0xC9, 0x0C, 0x66, 0x10, 0xA4, 0xD3, 0xED, 0xD3, 0x75, 0x4E, 0x9A, 0xF9, 0xFE + .byte 0x77, 0x47, 0x8E, 0x85, 0xCB, 0xCD, 0x20, 0xC1, 0xCD, 0x7E, 0x12, 0xC3, 0xFF, 0xFD, 0x52, 0x87 + .byte 0x5E, 0x78, 0xC1, 0xFC, 0xB0, 0x92, 0x63, 0xE9, 0xED, 0xC9, 0x6F, 0x8D, 0xBB, 0x3E, 0xC8, 0x93 + .byte 0x04, 0x09, 0x8B, 0xE8, 0xA6, 0x3B, 0xCE, 0x0D, 0xB1, 0x67, 0x66, 0xC8, 0xDB, 0xD3, 0xF5, 0x2F + .byte 0x8F, 0x4D, 0x6A, 0x99, 0x7B, 0xFA, 0x28, 0x74, 0x09, 0xF6, 0xF1, 0xD1, 0x8C, 0x15, 0xE0, 0x2C + .byte 0x59, 0xA0, 0xA6, 0xCC, 0x77, 0x45, 0x64, 0x48, 0x7A, 0x05 + + non_word_aligned_thumb_func_start sub_0200078A +sub_0200078A: ; 0x0200078A + swi #0xc + bx lr + thumb_func_end sub_0200078A +_0200078E: + .byte 0x59, 0x2B + .byte 0xE6, 0x44, 0x0B, 0xBA, 0x2A, 0xEC, 0x68, 0x4F, 0xE9, 0xF6, 0x2B, 0x5D, 0xFC, 0x5B, 0xEF, 0x02 + .byte 0xC8, 0x25, 0x05, 0xC8, 0xF7, 0x0B, 0x1A, 0xA9, 0x2E, 0x50, 0x96, 0x85, 0xAF, 0x8B, 0xE9, 0x9D + .byte 0x10, 0x4E, 0x25, 0xE6, 0xF7, 0x16, 0xE5, 0xF0, 0x3C, 0x13, 0x8D, 0x87, 0xD4, 0x18, 0x48, 0xF9 + .byte 0x85, 0x3A, 0x45, 0x68, 0x0A, 0x00, 0x73, 0xF6, 0x51, 0x07, 0x50, 0x86, 0x18, 0x76, 0x0C, 0x25 + .byte 0x3C, 0xF0, 0xFD, 0x8B, 0xB6, 0x13, 0xC9, 0xC4, 0xA2, 0x83, 0x5B, 0xE7, 0x7E, 0xC8, 0x54, 0xA3 + .byte 0x1D, 0xDF, 0x6C, 0x43, 0xD5, 0x52, 0xAA, 0x18, 0xC4, 0x6F, 0x29, 0xD2, 0x1B, 0x66, 0x82, 0xBE + .byte 0x30, 0xD4, 0x9A, 0xEB, 0x94, 0x23, 0xB6, 0x7F, 0xAC, 0x6B, 0x96, 0x95, 0xB9, 0x14, 0x00, 0x00 diff --git a/lib/syscall/asm/macros/function.inc b/lib/syscall/asm/macros/function.inc new file mode 100644 index 0000000000..6b9e5f40e8 --- /dev/null +++ b/lib/syscall/asm/macros/function.inc @@ -0,0 +1,24 @@ + .macro arm_func_start name + .balign 4, 0 + .global \name + .arm + .endm + + .macro arm_func_end name + .size \name, .-\name + .endm + + .macro thumb_func_start name + .balign 4, 0 + .global \name + .thumb + .endm + + .macro non_word_aligned_thumb_func_start name + .global \name + .thumb + .endm + + .macro thumb_func_end name + .size \name, .-\name + .endm diff --git a/main.lsf b/main.lsf new file mode 100644 index 0000000000..83a6591795 --- /dev/null +++ b/main.lsf @@ -0,0 +1,757 @@ +############################################################ +### Linker spec file for Pokemon Platinum US ### +### Pass this to the SDK's makelcf.exe utility ### +### along with the ARM9-TS template. ### +### WIP ### +############################################################ + +Static main +{ + Address 0x02000000 + StackSize 0 2048 + Object asm/arm9.o +} + +Autoload ITCM +{ + Address 0x01FF8000 + Object asm/itcm.o +} + +Autoload DTCM +{ + Address 0x027E0000 + Object asm/dtcm.o (.dtcm) + Object asm/dtcm.o (.bss) +} + +Overlay overlay0 +{ + After main + Object asm/overlay0.o +} + +Overlay overlay1 +{ + After main + Object asm/overlay1.o +} + +Overlay overlay2 +{ + After overlay1 + Object asm/overlay2.o +} + +Overlay overlay3 +{ + After ITCM + Object asm/overlay3.o +} + +Overlay overlay4 +{ + After main + Object asm/overlay4.o + +Overlay overlay5 +{ + After main + Object asm/overlay5.o +} + +Overlay overlay6 +{ + After overlay5 + Object asm/overlay6.o +} + +Overlay overlay7 +{ + After overlay6 + Object asm/overlay7.o +} + +Overlay overlay8 +{ + After overlay6 + Object asm/overlay8.o +} + +Overlay overlay9 +{ + After overlay6 + Object asm/overlay9.o +} + +Overlay overlay10 +{ + After overlay4 + Object asm/overlay10.o +} + +Overlay overlay11 +{ + After overlay4 + Object asm/overlay11.o +} + +Overlay overlay12 +{ + After overlay11 + Object asm/overlay12.o +} + +Overlay overlay13 +{ + After overlay11 + Object asm/overlay13.o +} + +Overlay overlay14 +{ + After overlay11 + Object asm/overlay14.o +} + +Overlay overlay15 +{ + After main + Object asm/overlay15.o +} + +Overlay overlay16 +{ + After overlay12 + Object asm/overlay16.o +} + +Overlay overlay17 +{ + After overlay12 + Object asm/overlay17.o +} + +Overlay overlay18 +{ + After overlay4 + Object asm/overlay18.o +} + +Overlay overlay19 +{ + After main + Object asm/overlay19.o +} + +Overlay overlay20 +{ + After main + Object asm/overlay20.o +} + +Overlay overlay21 +{ + After main + Object asm/overlay21.o +} + +Overlay overlay22 +{ + After overlay17 + Object asm/overlay22.o +} + +Overlay overlay23 +{ + After overlay5 + Object asm/overlay23.o +} + +Overlay overlay24 +{ + After overlay9 + Object asm/overlay24.o +} + +Overlay overlay25 +{ + After overlay9 + Object asm/overlay25.o +} + +Overlay overlay26 +{ + After overlay25 + Object asm/overlay26.o +} + +Overlay overlay27 +{ + After overlay25 + Object asm/overlay27.o +} + +Overlay overlay28 +{ + After overlay25 + Object asm/overlay28.o +} + +Overlay overlay29 +{ + After overlay25 + Object asm/overlay29.o +} + +Overlay overlay30 +{ + After overlay25 + Object asm/overlay30.o +} + +Overlay overlay31 +{ + After overlay25 + Object asm/overlay31.o +} + +Overlay overlay32 +{ + After overlay25 + Object asm/overlay32.o +} + +Overlay overlay33 +{ + After overlay25 + Object asm/overlay33.o +} + +Overlay overlay34 +{ + After overlay25 + Object asm/overlay34.o +} + +Overlay overlay35 +{ + After overlay25 + Object asm/overlay35.o +} + +Overlay overlay36 +{ + After overlay25 + Object asm/overlay36.o +} + +Overlay overlay37 +{ + After overlay25 + Object asm/overlay37.o +} + +Overlay overlay38 +{ + After overlay25 + Object asm/overlay38.o +} + +Overlay overlay39 +{ + After overlay25 + Object asm/overlay39.o +} + +Overlay overlay40 +{ + After overlay25 + Object asm/overlay40.o +} + +Overlay overlay41 +{ + After overlay25 + Object asm/overlay41.o +} + +Overlay overlay42 +{ + After overlay25 + Object asm/overlay42.o +} + +Overlay overlay43 +{ + After overlay25 + Object asm/overlay43.o +} + +Overlay overlay44 +{ + After overlay25 + Object asm/overlay44.o +} + +Overlay overlay45 +{ + After overlay25 + Object asm/overlay45.o +} + +Overlay overlay46 +{ + After overlay25 + Object asm/overlay46.o +} + +Overlay overlay47 +{ + After overlay25 + Object asm/overlay47.o +} + +Overlay overlay48 +{ + After overlay25 + Object asm/overlay48.o +} + +Overlay overlay49 +{ + After overlay25 + Object asm/overlay49.o +} + +Overlay overlay50 +{ + After overlay25 + Object asm/overlay50.o +} + +Overlay overlay51 +{ + After overlay25 + Object asm/overlay51.o +} + +Overlay overlay52 +{ + After overlay25 + Object asm/overlay52.o +} + +Overlay overlay53 +{ + After overlay25 + Object asm/overlay53.o +} + +Overlay overlay54 +{ + After overlay25 + Object asm/overlay54.o +} + +Overlay overlay55 +{ + After overlay25 + Object asm/overlay55.o +} + +Overlay overlay56 +{ + After overlay25 + Object asm/overlay56.o +} + +Overlay overlay57 +{ + After main + Object asm/overlay57.o +} + +Overlay overlay58 +{ + After main + Object asm/overlay58.o +} + +Overlay overlay59 +{ + After main + Object asm/overlay59.o +} + +Overlay overlay60 +{ + After overlay4 + Object asm/overlay60.o +} + +Overlay overlay61 +{ + After overlay60 + Object asm/overlay61.o +} + +Overlay overlay62 +{ + After overlay61 + Object asm/overlay62.o +} + +Overlay overlay63 +{ + After overlay60 + Object asm/overlay63.o +} + +Overlay overlay64 +{ + After overlay63 + Object asm/overlay64.o +} + +Overlay overlay65 +{ + After overlay63 + Object asm/overlay65.o +} + +Overlay overlay66 +{ + After overlay63 + Object asm/overlay66.o +} + +Overlay overlay67 +{ + After overlay66 + Object asm/overlay67.o +} + +Overlay overlay68 +{ + After overlay66 + Object asm/overlay68.o +} + +Overlay overlay69 +{ + After overlay66 + Object asm/overlay69.o +} + +Overlay overlay70 +{ + After overlay66 + Object asm/overlay70.o +} + +Overlay overlay71 +{ + After overlay12 + Object asm/overlay71.o +} + +Overlay overlay72 +{ + After overlay71 + Object asm/overlay72.o +} + +Overlay overlay73 +{ + After main + Object asm/overlay73.o +} + +Overlay overlay74 +{ + After main + Object asm/overlay74.o +} + +Overlay overlay75 +{ + After main + Object asm/overlay75.o +} + +Overlay overlay76 +{ + After overlay12 + Object asm/overlay76.o +} + +Overlay overlay77 +{ + After main + Object asm/overlay77.o +} + +Overlay overlay78 +{ + After main + Object asm/overlay78.o +} + +Overlay overlay79 +{ + After main + Object asm/overlay79.o +} + +Overlay overlay80 +{ + After main + Object asm/overlay80.o +} + +Overlay overlay81 +{ + After main + Object asm/overlay81.o +} + +Overlay overlay82 +{ + After overlay12 + Object asm/overlay82.o +} + +Overlay overlay83 +{ + After overlay82 + Object asm/overlay83.o +} + +Overlay overlay84 +{ + After overlay82 + Object asm/overlay84.o +} + +Overlay overlay85 +{ + After overlay84 + Object asm/overlay85.o +} + +Overlay overlay86 +{ + After overlay12 + Object asm/overlay86.o +} + +Overlay overlay87 +{ + After main + Object asm/overlay87.o +} + +Overlay overlay88 +{ + After overlay12 + Object asm/overlay88.o +} + +Overlay overlay89 +{ + After main + Object asm/overlay89.o +} + +Overlay overlay90 +{ + After main + Object asm/overlay90.o +} + +Overlay overlay91 +{ + After main + Object asm/overlay91.o +} + +Overlay overlay92 +{ + After main + Object asm/overlay92.o +} + +Overlay overlay93 +{ + After main + Object asm/overlay93.o +} + +Overlay overlay94 +{ + After overlay12 + Object asm/overlay94.o +} + +Overlay overlay95 +{ + After overlay94 + Object asm/overlay95.o +} + +Overlay overlay96 +{ + After overlay12 + Object asm/overlay96.o +} + +Overlay overlay97 +{ + After overlay60 + Object asm/overlay97.o +} + +Overlay overlay98 +{ + After overlay94 + Object asm/overlay98.o +} + +Overlay overlay99 +{ + After main + Object asm/overlay99.o +} + +Overlay overlay100 +{ + After main + Object asm/overlay100.o +} + +Overlay overlay101 +{ + After main + Object asm/overlay101.o +} + +Overlay overlay102 +{ + After main + Object asm/overlay102.o +} + +Overlay overlay103 +{ + After overlay63 + Object asm/overlay103.o +} + +Overlay overlay104 +{ + After overlay63 + Object asm/overlay104.o +} + +Overlay overlay105 +{ + After overlay104 + Object asm/overlay105.o +} + +Overlay overlay106 +{ + After overlay104 + Object asm/overlay106.o +} + +Overlay overlay107 +{ + After overlay104 + Object asm/overlay107.o +} + +Overlay overlay108 +{ + After overlay104 + Object asm/overlay108.o +} + +Overlay overlay109 +{ + After main + Object asm/overlay109.o +} + +Overlay overlay110 +{ + After main + Object asm/overlay110.o +} + +Overlay overlay111 +{ + After main + Object asm/overlay111.o + +Overlay overlay112 +{ + After overlay66 + Object asm/overlay112.o +} + +Overlay overlay113 +{ + After overlay66 + Object asm/overlay113.o +} + +Overlay overlay114 +{ + After overlay66 + Object asm/overlay114.o +} + +Overlay overlay115 +{ + After overlay114 + Object asm/overlay115.o +} + +Overlay overlay116 +{ + After overlay114 + Object asm/overlay116.o +} + +Overlay overlay117 +{ + After overlay114 + Object asm/overlay117.o +} + +Overlay overlay118 +{ + After main + Object asm/overlay118.o +} + +Overlay overlay119 +{ + After main + Object asm/overlay119.o +} + +Overlay overlay120 +{ + After main + Object asm/overlay120.o +} + +Overlay overlay121 +{ + After main + Object asm/overlay121.o +} + diff --git a/platform.mk b/platform.mk new file mode 100644 index 0000000000..2eb7182806 --- /dev/null +++ b/platform.mk @@ -0,0 +1,38 @@ + +WSLENV ?= no +ifeq ($(WSLENV),) +NOWINE = 1 +else +NOWINE = 0 +endif + +ifeq ($(OS),Windows_NT) +EXE := .exe +WINE := +GREP := grep -P +SED := sed -r +SHA1SUM := sha1sum +MKTEMP := mktemp +else +EXE := +WINE := wine +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Darwin) +GREP := grep -E +SED := gsed -r +SHA1SUM := shasum +MKTEMP := gmktemp +else +GREP := grep -P +SED := sed -r +SHA1SUM := sha1sum +MKTEMP := mktemp +endif +endif + +ifeq ($(NOWINE),1) +WINE := +WINPATH := wslpath +else +WINPATH := winepath +endif diff --git a/rom.rsf b/rom.rsf new file mode 100644 index 0000000000..f547bf9a45 --- /dev/null +++ b/rom.rsf @@ -0,0 +1,32 @@ +Arm9 +{ + Static $(BUILD_DIR)/main.sbin + OverlayDefs $(BUILD_DIR)/main_defs.sbin + OverlayTable $(BUILD_DIR)/main_table.sbin + Nef $(BUILD_DIR)/main.nef +} + +Arm7 +{ + Static sub/ichneumon_sub.sbin + OverlayDefs sub/ichneumon_sub_defs.sbin +} + +Property +{ + RomHeaderTemplate "$(HEADER_TEMPLATE)" + TitleName "$(TITLE_NAME)" + MakerCode "01" + RemasterVersion 0 + RomSpeedType 1TROM + RomSize 1G + RomFootPadding TRUE + BannerFile $(BNR) +} + +RomSpec +{ + Segment All + HostRoot files/ + File $(NITROFS_FILES) +} diff --git a/sub/ichneumon_sub.sbin b/sub/ichneumon_sub.sbin new file mode 100644 index 0000000000..58a0356bd0 Binary files /dev/null and b/sub/ichneumon_sub.sbin differ diff --git a/sub/ichneumon_sub_defs.sbin b/sub/ichneumon_sub_defs.sbin new file mode 100644 index 0000000000..390d6153a5 Binary files /dev/null and b/sub/ichneumon_sub_defs.sbin differ diff --git a/tools/asm_processor/.gitattributes b/tools/asm_processor/.gitattributes new file mode 100644 index 0000000000..75c2cbe529 --- /dev/null +++ b/tools/asm_processor/.gitattributes @@ -0,0 +1 @@ +compile.sh text eol=lf diff --git a/tools/asm_processor/asm_processor.py b/tools/asm_processor/asm_processor.py new file mode 100644 index 0000000000..83cef1b7fd --- /dev/null +++ b/tools/asm_processor/asm_processor.py @@ -0,0 +1,1265 @@ +#!/usr/bin/env python3 +import argparse +import tempfile +import struct +import copy +import sys +import re +import os +from collections import namedtuple, defaultdict +from io import StringIO + +MAX_FN_SIZE = 3000 +SLOW_CHECKS = False + +EI_NIDENT = 16 +EI_CLASS = 4 +EI_DATA = 5 +EI_VERSION = 6 +EI_OSABI = 7 +EI_ABIVERSION = 8 +STN_UNDEF = 0 + +SHN_UNDEF = 0 +SHN_ABS = 0xfff1 +SHN_COMMON = 0xfff2 +SHN_XINDEX = 0xffff +SHN_LORESERVE = 0xff00 + +STT_NOTYPE = 0 +STT_OBJECT = 1 +STT_FUNC = 2 +STT_SECTION = 3 +STT_FILE = 4 +STT_COMMON = 5 +STT_TLS = 6 + +STB_LOCAL = 0 +STB_GLOBAL = 1 +STB_WEAK = 2 + +STV_DEFAULT = 0 +STV_INTERNAL = 1 +STV_HIDDEN = 2 +STV_PROTECTED = 3 + +SHT_NULL = 0 +SHT_PROGBITS = 1 +SHT_SYMTAB = 2 +SHT_STRTAB = 3 +SHT_RELA = 4 +SHT_HASH = 5 +SHT_DYNAMIC = 6 +SHT_NOTE = 7 +SHT_NOBITS = 8 +SHT_REL = 9 +SHT_SHLIB = 10 +SHT_DYNSYM = 11 +SHT_INIT_ARRAY = 14 +SHT_FINI_ARRAY = 15 +SHT_PREINIT_ARRAY = 16 +SHT_GROUP = 17 +SHT_SYMTAB_SHNDX = 18 +SHT_MIPS_GPTAB = 0x70000003 +SHT_MIPS_DEBUG = 0x70000005 +SHT_MIPS_REGINFO = 0x70000006 +SHT_MIPS_OPTIONS = 0x7000000d + +SHF_WRITE = 0x1 +SHF_ALLOC = 0x2 +SHF_EXECINSTR = 0x4 +SHF_MERGE = 0x10 +SHF_STRINGS = 0x20 +SHF_INFO_LINK = 0x40 +SHF_LINK_ORDER = 0x80 +SHF_OS_NONCONFORMING = 0x100 +SHF_GROUP = 0x200 +SHF_TLS = 0x400 + +R_MIPS_32 = 2 +R_MIPS_26 = 4 +R_MIPS_HI16 = 5 +R_MIPS_LO16 = 6 + + +class ElfHeader: + """ + 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; + """ + + def __init__(self, data): + self.e_ident = data[:EI_NIDENT] + self.e_type, self.e_machine, self.e_version, self.e_entry, self.e_phoff, self.e_shoff, self.e_flags, self.e_ehsize, self.e_phentsize, self.e_phnum, self.e_shentsize, self.e_shnum, self.e_shstrndx = struct.unpack('> 4 + self.type = st_info & 15 + self.name = strtab.lookup_str(self.st_name) + self.visibility = self.st_other & 3 + + def to_bin(self): + st_info = (self.bind << 4) | self.type + return struct.pack('> 8 + self.rel_type = self.r_info & 0xff + + def to_bin(self): + self.r_info = (self.sym_index << 8) | self.rel_type + if self.sh_type == SHT_REL: + return struct.pack(' 0: + # Generate late rodata by emitting unique float constants. + # This requires 3 instructions for each 4 bytes of rodata. + # If we know alignment, we can use doubles, which give 3 + # instructions for 8 bytes of rodata. + size = self.fn_section_sizes['.late_rodata'] // 2 + skip_next = False + needs_double = (self.late_rodata_alignment != 0) + for i in range(size): + if skip_next: + skip_next = False + continue + # Jump tables give 9 instructions for >= 5 words of rodata, and should be + # emitted when: + # - -O2 or -O2 -g3 are used, which give the right codegen + # - we have emitted our first .float/.double (to ensure that we find the + # created rodata in the binary) + # - we have emitted our first .double, if any (to ensure alignment of doubles + # in shifted rodata sections) + # - we have at least 5 words of rodata left to emit (otherwise IDO does not + # generate a jump table) + # - we have at least 10 more instructions to go in this function (otherwise our + # function size computation will be wrong since the delay slot goes unused) + if (not needs_double and state.use_jtbl_for_rodata and i >= 1 and + size - i >= 5 and num_instr - len(late_rodata_fn_output) >= 10): + cases = " ".join("case {}:".format(case) for case in range(size - i)) + late_rodata_fn_output.append("switch (*(volatile int*)0) { " + cases + " ; }") + late_rodata_fn_output.extend([""] * 8) + jtbl_rodata_size = (size - i) * 4 + break + dummy_bytes = state.next_late_rodata_hex() + late_rodata_dummy_bytes.append(dummy_bytes) + if self.late_rodata_alignment == 4 * ((i + 1) % 2 + 1) and i + 1 < size: + dummy_bytes2 = state.next_late_rodata_hex() + late_rodata_dummy_bytes.append(dummy_bytes2) + fval, = struct.unpack(' 0 or late_rodata_fn_output: + text_name = state.make_name('func') + src[0] = 'int {}(void) {{ return '.format(text_name) + instr_count = self.fn_section_sizes['.text'] // 2 + src[self.num_lines] = '((volatile void *) 0); }; ' if instr_count > 1 else '; }; ' + if instr_count < state.min_instr_count: + self.fail("too short .text block") + tot_emitted = 0 + tot_skipped = 0 + fn_emitted = 0 + fn_skipped = 0 + rodata_stack = late_rodata_fn_output[::-1] + for (line, count) in self.fn_ins_inds: + for _ in range(count): + if (fn_emitted > MAX_FN_SIZE and instr_count - tot_emitted > state.min_instr_count and + (not rodata_stack or rodata_stack[-1])): + # Don't let functions become too large. When a function reaches 284 + # instructions, and -O2 -framepointer flags are passed, the IRIX + # compiler decides it is a great idea to start optimizing more. + fn_emitted = 0 + fn_skipped = 0 + src[line] += '((volatile void *) 0); }} int {}(void) {{ return '.format(state.make_name('large_func')) + if fn_skipped < state.skip_instr_count: + fn_skipped += 1 + tot_skipped += 1 + elif rodata_stack: + src[line] += rodata_stack.pop() + else: + src[line] += '*(int *)' + tot_emitted += 1 + fn_emitted += 1 + if rodata_stack: + size = len(late_rodata_fn_output) // 3 + available = instr_count - tot_skipped + self.fail( + "late rodata to text ratio is too high: {} / {} must be <= 1/3\n" + "add .late_rodata_alignment (4|8) to the .late_rodata " + "block to double the allowed ratio." + .format(size, available)) + + init_name = None + if self.fn_section_sizes['.init'] > 0 or late_rodata_fn_output: + init_name = state.make_name('func') + src[0] = 'int {}(void) {{ return '.format(init_name) + instr_count = self.fn_section_sizes['.init'] // 2 + src[self.num_lines] = '((volatile void *) 0); }; ' if instr_count else '; }; ' + if instr_count < state.min_instr_count: + self.fail("too short .init block") + tot_emitted = 0 + tot_skipped = 0 + fn_emitted = 0 + fn_skipped = 0 + rodata_stack = late_rodata_fn_output[::-1] + for (line, count) in self.fn_ins_inds: + for _ in range(count): + if (fn_emitted > MAX_FN_SIZE and instr_count - tot_emitted > state.min_instr_count and + (not rodata_stack or rodata_stack[-1])): + # Don't let functions become too large. When a function reaches 284 + # instructions, and -O2 -framepointer flags are passed, the IRIX + # compiler decides it is a great idea to start optimizing more. + fn_emitted = 0 + fn_skipped = 0 + src[line] += '((volatile void *) 0); }} int {}(void) {{ return '.format(state.make_name('large_func')) + if fn_skipped < state.skip_instr_count: + fn_skipped += 1 + tot_skipped += 1 + elif rodata_stack: + src[line] += rodata_stack.pop() + else: + src[line] += '*(int *)' + tot_emitted += 1 + fn_emitted += 1 + if rodata_stack: + size = len(late_rodata_fn_output) // 3 + available = instr_count - tot_skipped + self.fail( + "late rodata to init ratio is too high: {} / {} must be <= 1/3\n" + "add .late_rodata_alignment (4|8) to the .late_rodata " + "block to double the allowed ratio." + .format(size, available)) + + rodata_name = None + if self.fn_section_sizes['.rodata'] > 0: + rodata_name = state.make_name('rodata') + src[self.num_lines] += f" const char {rodata_name}[{self.fn_section_sizes['.rodata']}] = {{1}};" + + data_name = None + if self.fn_section_sizes['.data'] > 0: + data_name = state.make_name('data') + src[self.num_lines] += f" char {data_name}[{self.fn_section_sizes['.data']}] = {{1}};" + + bss_name = None + if self.fn_section_sizes['.bss'] > 0: + bss_name = state.make_name('bss') + src[self.num_lines] += f" char {bss_name}[{self.fn_section_sizes['.bss']}];" + + sdata_name = None # sdata is like data but small + if self.fn_section_sizes['.sdata'] > 0: + sdata_code = "" + for i in range(self.fn_section_sizes['.sdata']): + sdata_name = state.make_name('sdata') + sdata_code += f" char {sdata_name} = 1;" + src[self.num_lines] += sdata_code + + sdata2_name = None # sdata2 is like rodata but small + if self.fn_section_sizes['.sdata2'] > 0: + sdata2_code = "" + for i in range(self.fn_section_sizes['.sdata2']): + sdata2_name = state.make_name('sdata2') + sdata2_code += f" const char {sdata2_name} = 1;" + src[self.num_lines] += sdata2_code + + sbss_name = None # Similarly, sbss is like uninitialized data but small + if self.fn_section_sizes['.sbss'] > 0: + sbss_code = "" + for i in range(self.fn_section_sizes['.sbss']): + sbss_name = state.make_name('sbss') + sbss_code += f" char {sbss_name};" + src[self.num_lines] += sbss_code + + """ sbss2 is currently borked + sbss2_name = None # Similarly, sbss2 is like uninitialized rodata but small + if self.fn_section_sizes['.sbss2'] > 0: + sbss2_code = "" + for i in range(self.fn_section_sizes['.sbss2']): + sbss2_name = state.make_name('sbss2') + sbss2_code += f" const char {sbss2_name};" + src[self.num_lines] += sbss2_code + """ + + fn = Function( + text_glabels=self.text_glabels, + asm_conts=self.asm_conts, + late_rodata_dummy_bytes=late_rodata_dummy_bytes, + jtbl_rodata_size=jtbl_rodata_size, + late_rodata_asm_conts=self.late_rodata_asm_conts, + fn_desc=self.fn_desc, + data={ + '.text': (text_name, self.fn_section_sizes['.text']), + '.data': (data_name, self.fn_section_sizes['.data']), + '.rodata': (rodata_name, self.fn_section_sizes['.rodata']), + '.bss': (bss_name, self.fn_section_sizes['.bss']), + '.sdata': (sdata_name, self.fn_section_sizes['.sdata']), + '.sdata2': (sdata2_name, self.fn_section_sizes['.sdata2']), + '.sbss': (sbss_name, self.fn_section_sizes['.sbss']), + #'.sbss2': (sbss2_name, self.fn_section_sizes['.sbss2']), + }) + return src, fn + +cutscene_data_regexpr = re.compile(r"CutsceneData (.|\n)*\[\] = {") +float_regexpr = re.compile(r"[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?f") + +def repl_float_hex(m): + return str(struct.unpack(" 0 + n_text = objfile.text_section_index(temp_name) + loc = objfile.symtab.find_symbol(temp_name) + if loc is None: + ifdefed = True + break + loc = loc[1] + prev_loc = prev_locs[sectype + (str(n_text) if sectype == '.text' else '')] + if loc < prev_loc: + raise Failure("Wrongly computed size for section {} (diff {}). This is an asm-processor bug!".format(sectype + (str(n_text) if sectype == '.text' else ''), prev_loc- loc)) + if loc != prev_loc: + asm.append('.section ' + sectype) + if sectype == '.text': + for i in range((loc - prev_loc) // 2): + asm.append('nop') + else: + asm.append('.space {}'.format(loc - prev_loc)) + to_copy[sectype + (str(n_text) if sectype == '.text' else '')].append((loc, size, temp_name, function.fn_desc, [])) + prev_locs[sectype + (str(n_text) if sectype == '.text' else '')] = loc + size + if not ifdefed: + all_text_glabels.update(function.text_glabels) + all_late_rodata_dummy_bytes.append(function.late_rodata_dummy_bytes) + all_jtbl_rodata_size.append(function.jtbl_rodata_size) + late_rodata_asm.append(function.late_rodata_asm_conts) + for sectype, (temp_name, size) in function.data.items(): + if temp_name is not None: + asm.append('.section ' + sectype) + asm.append('.global ' + temp_name + '_asm_start') + asm.append(temp_name + '_asm_start:') + asm.append('.section .text') + for line in function.asm_conts: + asm.append(line) + for sectype, (temp_name, size) in function.data.items(): + if temp_name is not None: + #asm.append('.section ' + sectype) + asm.append('.global ' + temp_name + '_asm_end') + asm.append(temp_name + '_asm_end:') + + if any(late_rodata_asm): + late_rodata_source_name_start = '_asmpp_late_rodata_start' + late_rodata_source_name_end = '_asmpp_late_rodata_end' + asm.append('.rdata') + asm.append('glabel {}'.format(late_rodata_source_name_start)) + for conts in late_rodata_asm: + asm.extend(conts) + asm.append('glabel {}'.format(late_rodata_source_name_end)) + + o_file = open("asm_processor_temp.o", 'w').close() # Create temp file. tempfile module isn't working for me. + o_name = "asm_processor_temp.o" + + s_file = open("asm_processor_temp.s", 'wb') # Ditto. + s_name = "asm_processor_temp.s" + try: + s_file.write(asm_prelude + b'\n') + for line in asm: + s_file.write(line.encode(output_enc) + b'\n') + s_file.close() + ret = os.system(assembler + " " + s_name + " -o " + o_name) + if ret != 0: + raise Failure("failed to assemble") + with open(o_name, 'rb') as f: + asm_objfile = ElfFile(f.read()) + + # Remove some clutter from objdump output + objfile.drop_irrelevant_sections() + + """ + # Unify reginfo sections + target_reginfo = objfile.find_section('.reginfo') + source_reginfo_data = list(asm_objfile.find_section('.reginfo').data) + data = list(target_reginfo.data) + for i in range(20): + data[i] |= source_reginfo_data[i] + target_reginfo.data = bytes(data) + """ + + # Move over section contents + modified_text_positions = set() + jtbl_rodata_positions = set() + last_rodata_pos = 0 + n_text = 0 + for sec in objfile.sections: + sectype = sec.name + if not to_copy[sectype + (str(n_text) if sectype == '.text' else '')]: + if sectype == '.text': + n_text += 1 + continue + # This should work as long as you NONMATCH whole functions rather than asm fragments + func = to_copy[sectype + str(n_text) if sectype == '.text' else ''][0][2] + asm_n_text = asm_objfile.text_section_index(func + '_asm_start') + source = asm_objfile.find_section(sectype, asm_n_text if sectype == '.text' else 0) + assert source is not None, "didn't find source section: " + sectype + for (pos, count, temp_name, fn_desc, fn_name) in to_copy[sectype + (str(n_text) if sectype == '.text' else '')]: + loc1 = asm_objfile.symtab.find_symbol_in_section(temp_name + '_asm_start', source) + loc2 = asm_objfile.symtab.find_symbol_in_section(temp_name + '_asm_end', source) + assert loc1 == pos, "assembly and C files don't line up for section " + sectype + ", " + fn_desc + # Since we are nonmatching whole functions, we don't need to insert the correct + # amount of padding into the src file. We don't actually need to insert padding + # at all. We can just plop the asm's text section into the objfile. + # if loc2 - loc1 != count: + # raise Failure("incorrectly computed size for section " + sectype + ", " + fn_desc + ". If using .double, make sure to provide explicit alignment padding.") + if sectype == '.bss' or sectype == '.sbss2': + continue + target = objfile.find_section(sectype, n_text if sectype == '.text' else 0) + assert target is not None, "missing target section of type " + sectype + data = list(target.data) + for (pos, count, _, _, _) in to_copy[sectype + (str(n_text) if sectype == '.text' else '')]: + # mwasmarm 4-aligns text sections, so make sure to copy exactly `count` bytes + data[pos:pos + count] = source.data[pos:pos + count] + if sectype == '.text': + assert count % 2 == 0 + assert pos % 2 == 0 + for i in range(count // 2): + modified_text_positions.add(pos + 2 * i) + elif sectype == '.rodata': + last_rodata_pos = pos + count + target.data = bytes(data) + if sectype == '.text': + n_text += 1 + + # Move over late rodata. This is heuristic, sadly, since I can't think + # of another way of doing it. + moved_late_rodata = {} + if any(all_late_rodata_dummy_bytes) or any(all_jtbl_rodata_size): + source = asm_objfile.find_section('.rodata', 0) + target = objfile.find_section('.rodata', 0) + source_pos = asm_objfile.symtab.find_symbol_in_section(late_rodata_source_name_start, source) + source_end = asm_objfile.symtab.find_symbol_in_section(late_rodata_source_name_end, source) + if source_end - source_pos != sum(map(len, all_late_rodata_dummy_bytes)) * 2 + sum(all_jtbl_rodata_size): + raise Failure("computed wrong size of .late_rodata") + new_data = list(target.data) + for dummy_bytes_list, jtbl_rodata_size in zip(all_late_rodata_dummy_bytes, all_jtbl_rodata_size): + for index, dummy_bytes in enumerate(dummy_bytes_list): + pos = target.data.index(dummy_bytes, last_rodata_pos) + # This check is nice, but makes time complexity worse for large files: + if SLOW_CHECKS and target.data.find(dummy_bytes, pos + 2) != -1: + raise Failure("multiple occurrences of late_rodata hex magic. Change asm-processor to use something better than 0xE0123456!") + if index == 0 and len(dummy_bytes_list) > 1 and target.data[pos+2:pos+8] == b'\0\0\0\0': + # Ugly hack to handle double alignment for non-matching builds. + # We were told by .late_rodata_alignment (or deduced from a .double) + # that a function's late_rodata started out 4 (mod 8), and emitted + # a float and then a double. But it was actually 0 (mod 8), so our + # double was moved by 4 bytes. To make them adjacent to keep jump + # tables correct, move the float by 4 bytes as well. + new_data[pos:pos+2] = b'\0\0\0\0' + pos += 2 + new_data[pos:pos+2] = source.data[source_pos:source_pos+2] + moved_late_rodata[source_pos] = pos + last_rodata_pos = pos + 2 + source_pos += 2 + if jtbl_rodata_size > 0: + assert dummy_bytes_list, "should always have dummy bytes before jtbl data" + pos = last_rodata_pos + new_data[pos : pos + jtbl_rodata_size] = \ + source.data[source_pos : source_pos + jtbl_rodata_size] + for i in range(0, jtbl_rodata_size, 2): + moved_late_rodata[source_pos + i] = pos + i + jtbl_rodata_positions.add(pos + i) + last_rodata_pos += jtbl_rodata_size + source_pos += jtbl_rodata_size + target.data = bytes(new_data) + + # Merge strtab data. + strtab_adj = len(objfile.symtab.strtab.data) + objfile.symtab.strtab.data += asm_objfile.symtab.strtab.data + + # Find relocated symbols + relocated_symbols = set() + for obj in [asm_objfile, objfile]: + for sec in obj.sections: + for reltab in sec.relocated_by: + for rel in reltab.relocations: + relocated_symbols.add(obj.symtab.symbol_entries[rel.sym_index]) + + # Move over symbols, deleting the temporary function labels. + # Sometimes this naive procedure results in duplicate symbols, or UNDEF + # symbols that are also defined the same .o file. Hopefully that's fine. + # Skip over local symbols that aren't used relocated against, to avoid + # conflicts. + new_local_syms = [s for s in objfile.symtab.local_symbols() if not is_temp_name(s.name)] + new_global_syms = [s for s in objfile.symtab.global_symbols() if not is_temp_name(s.name)] + n_text = 0 + for i, s in enumerate(asm_objfile.symtab.symbol_entries): + is_local = (i < asm_objfile.symtab.sh_info) + if is_local and s not in relocated_symbols: + continue + if is_temp_name(s.name): + continue + if s.st_shndx not in [SHN_UNDEF, SHN_ABS]: + section_name = asm_objfile.sections[s.st_shndx].name + if section_name not in SECTIONS: + raise Failure("generated assembly .o must only have symbols for .text, .data, .rodata, .sdata, .sdata2, .sbss, ABS and UNDEF, but found " + section_name) + if section_name == '.sbss2': #! I'm not sure why this isn't working + continue + obj_n_text = objfile.text_section_index(temp_name) + s.st_shndx = objfile.find_section(section_name, obj_n_text if section_name == '.text' else 0).index + if section_name == '.text': + n_text += 1 + # glabel's aren't marked as functions, making objdump output confusing. Fix that. + if s.name in all_text_glabels: + s.type = STT_FUNC + if objfile.sections[s.st_shndx].name == '.rodata' and s.st_value in moved_late_rodata: + s.st_value = moved_late_rodata[s.st_value] + s.st_name += strtab_adj + if is_local: + new_local_syms.append(s) + else: + new_global_syms.append(s) + new_syms = new_local_syms + new_global_syms + for i, s in enumerate(new_syms): + s.new_index = i + objfile.symtab.data = b''.join(s.to_bin() for s in new_syms) + objfile.symtab.sh_info = len(new_local_syms) + + # Move over relocations + n_text = 0 + for sec in objfile.sections: + sectype = sec.name + # This should work as long as you NONMATCH whole functions rather than asm fragments + target = objfile.find_section(sectype, n_text if sectype == '.text' else 0) + + if target is not None: + # fixup relocation symbol indices, since we butchered them above + for reltab in target.relocated_by: + nrels = [] + for rel in reltab.relocations: + if (sectype == '.rodata' and rel.r_offset in jtbl_rodata_positions) or sectype == ".sbss2": + # don't include relocations for late_rodata dummy code + continue + # hopefully we don't have relocations for local or + # temporary symbols, so new_index exists + rel.sym_index = objfile.symtab.symbol_entries[rel.sym_index].new_index + nrels.append(rel) + reltab.relocations = nrels + reltab.data = b''.join(rel.to_bin() for rel in nrels) + + if not to_copy[sectype + (str(n_text) if sectype == '.text' else '')]: + if sectype == '.text': + n_text += 1 + continue + + func = to_copy[sectype + str(n_text) if sectype == '.text' else ''][0][2] + asm_n_text = asm_objfile.text_section_index(func + '_asm_start') + source = asm_objfile.find_section(sectype, asm_n_text if sectype == '.text' else 0) + if not source: + if sectype == '.text': + n_text += 1 + continue + + target_reltab = objfile.find_section('.rel' + sectype, n_text if sectype == '.text' else 0) + target_reltaba = objfile.find_section('.rela' + sectype, n_text if sectype == '.text' else 0) + for reltab in source.relocated_by: + for rel in reltab.relocations: + rel.sym_index = asm_objfile.symtab.symbol_entries[rel.sym_index].new_index + if sectype == '.rodata' and rel.r_offset in moved_late_rodata: + rel.r_offset = moved_late_rodata[rel.r_offset] + new_data = b''.join(rel.to_bin() for rel in reltab.relocations) + if reltab.sh_type == SHT_REL: + target_reltab = objfile.add_section('.rel' + sectype, + sh_type=SHT_REL, sh_flags=0, + sh_link=objfile.symtab.index, sh_info=target.index, + sh_addralign=4, sh_entsize=8, data=b'') + target_reltab.data += new_data + else: + # Always append as a separate .rela.text section + target_reltaba = objfile.add_section('.rela' + sectype, + sh_type=SHT_RELA, sh_flags=0, + sh_link=objfile.symtab.index, sh_info=target.index, + sh_addralign=4, sh_entsize=12, data=b'') + target_reltaba.data += new_data + if sectype == '.text': + n_text += 1 + + objfile.write(objfile_name) + finally: + s_file.close() + #os.remove(s_name) + try: + pass + #os.remove(o_name) + except: + pass + +def run_wrapped(argv, outfile): + parser = argparse.ArgumentParser(description="Pre-process .c files and post-process .o files to enable embedding assembly into C.") + parser.add_argument('filename', help="path to .c code") + parser.add_argument('--post-process', dest='objfile', help="path to .o file to post-process") + parser.add_argument('--assembler', dest='assembler', help="assembler command (e.g. \"mips-linux-gnu-as -march=vr4300 -mabi=32\")") + parser.add_argument('--asm-prelude', dest='asm_prelude', help="path to a file containing a prelude to the assembly file (with .set and .macro directives, e.g.)") + parser.add_argument('--input-enc', default='latin1', help="Input encoding (default: latin1)") + parser.add_argument('--output-enc', default='latin1', help="Output encoding (default: latin1)") + parser.add_argument('-framepointer', dest='framepointer', action='store_true') + parser.add_argument('-g3', dest='g3', action='store_true') + group = parser.add_mutually_exclusive_group(required=False) + group.add_argument('-O1', dest='opt', action='store_const', const='O1') + group.add_argument('-O2', dest='opt', action='store_const', const='O2') + group.add_argument('-g', dest='opt', action='store_const', const='g') + args = parser.parse_args(argv) + opt = args.opt + if args.g3: + if opt != 'O2': + raise Failure("-g3 is only supported together with -O2") + opt = 'g3' + + if args.objfile is None: + with open(args.filename, encoding=args.input_enc) as f: + parse_source(f, opt=opt, framepointer=args.framepointer, input_enc=args.input_enc, output_enc=args.output_enc, print_source=outfile) + else: + if args.assembler is None: + raise Failure("must pass assembler command") + with open(args.filename, encoding=args.input_enc) as f: + functions = parse_source(f, opt=opt, framepointer=args.framepointer, input_enc=args.input_enc, output_enc=args.output_enc) + if not functions: + return + asm_prelude = b'' + if args.asm_prelude: + with open(args.asm_prelude, 'rb') as f: + asm_prelude = f.read() + fixup_objfile(args.objfile, functions, asm_prelude, args.assembler, args.output_enc) + +def run(argv, outfile=sys.stdout.buffer): + try: + run_wrapped(argv, outfile) + except Failure as e: + print("Error:", e, file=sys.stderr) + sys.exit(1) + +if __name__ == "__main__": + run(sys.argv[1:]) diff --git a/tools/asm_processor/compile.sh b/tools/asm_processor/compile.sh new file mode 100644 index 0000000000..b27d7a3277 --- /dev/null +++ b/tools/asm_processor/compile.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +CC="$1" +AS="$2" +OBJ="$3" +SRC="$4" + +BUILD_FILENAME=${OBJ%.o} + +PADDED_SRC="$(mktemp --suffix=.c padded-XXXXXX)" +PADDED_OBJ="$(mktemp --suffix=.o padded-XXXXXX)" +PADDED_D="$(mktemp --suffix=.d padded-XXXXXX)" + +# Create a .c file replacing the nonmatching function with volatile int writes, +# and compile. +./tools/asm_processor/asm_processor.py "$SRC" --assembler "$AS" > "$PADDED_SRC" +$CC -c "$PADDED_SRC" -o "$PADDED_OBJ" + +# Inject the matching assembly into the padded obj file. +./tools/asm_processor/asm_processor.py "$SRC" --post-process "$PADDED_OBJ" --assembler "$AS" + +arm-none-eabi-objcopy --remove-section .comment "$PADDED_OBJ" "$OBJ" +if [[ $CC == *"gccdep"* ]]; then + cp "$PADDED_D" "${BUILD_FILENAME}.d" +fi + +rm padded-* +rm output.txt +rm asm_processor_temp.s +rm asm_processor_temp.o diff --git a/tools/fixrom/.gitignore b/tools/fixrom/.gitignore new file mode 100644 index 0000000000..8ab48d98f9 --- /dev/null +++ b/tools/fixrom/.gitignore @@ -0,0 +1 @@ +fixrom diff --git a/tools/fixrom/Makefile b/tools/fixrom/Makefile new file mode 100644 index 0000000000..7a3b5e0da9 --- /dev/null +++ b/tools/fixrom/Makefile @@ -0,0 +1,13 @@ +CC := gcc +CFLAGS := -O3 + +.PHONY: all clean + +all: fixrom + @: + +fixrom: fixrom.c + $(CC) $(CFLAGS) -o $@ $^ + +clean: + $(RM) fixrom fixrom.exe diff --git a/tools/fixrom/fixrom.c b/tools/fixrom/fixrom.c new file mode 100644 index 0000000000..6c5f5da12e --- /dev/null +++ b/tools/fixrom/fixrom.c @@ -0,0 +1,190 @@ +#include +#include +#include +#include +#include +#include +#include + +#define HEADER_SIZE 0x4000 + +uint8_t RomHeader[HEADER_SIZE]; + +static inline noreturn __attribute__((format(printf, 1, 2))) void fatal_error(const char * message, ...) +{ + va_list va_args; + va_start(va_args, message); + fputs("Error: ", stderr); + vfprintf(stderr, message, va_args); + fputc('\n', stderr); + va_end(va_args); + exit(EXIT_FAILURE); +} + +static inline void OffsetCheck(int offset) +{ + if (offset < 0 || offset >= HEADER_SIZE) + { + fatal_error("illegal access to header+%d", offset); + } +} + +static inline uint16_t HeaderReadU16LE(int offset) +{ + OffsetCheck(offset); + return RomHeader[offset] | + (RomHeader[offset + 1] << 8); +} + +static inline uint32_t HeaderReadU32LE(int offset) +{ + OffsetCheck(offset); + return RomHeader[offset] | + (RomHeader[offset + 1] << 8) | + (RomHeader[offset + 2] << 16) | + (RomHeader[offset + 3] << 24); +} + +static inline void HeaderWriteU16LE(int offset, uint16_t value) +{ + OffsetCheck(offset); + RomHeader[offset] = value; + RomHeader[offset + 1] = value >> 8; +} +static inline void HeaderWriteU32LE(int offset, uint32_t value) +{ + OffsetCheck(offset); + RomHeader[offset] = value; + RomHeader[offset + 1] = value >> 8; + RomHeader[offset + 2] = value >> 16; + RomHeader[offset + 3] = value >> 24; +} + +static uint16_t Calc_CRC16(uint8_t * data, size_t length, uint16_t crc) +{ + static uint16_t CrcTable[16] = { + 0x0000, + 0xCC01, + 0xD801, + 0x1400, + 0xF001, + 0x3C00, + 0x2800, + 0xE401, + 0xA001, + 0x6C00, + 0x7800, + 0xB401, + 0x5000, + 0x9C01, + 0x8801, + 0x4400, + }; + + uint16_t x = 0; + uint16_t y; + uint16_t bit = 0; + uint8_t * end = data + length; + while (data < end) + { + if (bit == 0) + { + x = data[0] | (data[1] << 8); + } + y = CrcTable[crc & 15]; + crc >>= 4; + crc ^= y; + y = CrcTable[(x >> bit) & 15]; + crc ^= y; + bit += 4; + if (bit == 16) + { + data += 2; + bit = 0; + } + } + return crc; +} + +int main(int argc, char ** argv) +{ + uint16_t secure_crc = 0xFFFF; + char game_code[4] = "NTRJ"; + int override_crc = 0; + int override_code = 0; + FILE * rom = NULL; + + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--secure-crc") == 0) + { + if (override_crc) + { + fatal_error("multiple --secure-crc options specified"); + } + char * endptr; + unsigned long secure_crc_l = strtoul(argv[++i], &endptr, 0); + if (secure_crc_l == 0 && endptr == argv[i]) + { + fatal_error("argument to --secure-crc must be an integer"); + } + if (secure_crc_l >= 0x10000) + { + fatal_error("argument to --secure-crc must be a 16-bit integer"); + } + secure_crc = secure_crc_l; + override_crc = 1; + } + else if (strcmp(argv[i], "--game-code") == 0) + { + if (override_code) + { + fatal_error("multiple --game-code options specified"); + } + if (strlen(argv[++i]) > 4) + { + fatal_error("argument to --game-code must be 4 characters or fewer"); + } + strncpy(game_code, argv[i], 4); + override_code = 1; + } + else + { + if (rom != NULL) + { + fatal_error("unrecognized %s argument: %s", argv[i][0] == '-' ? "flag" : "positional", argv[i]); + } + rom = fopen(argv[i], "r+b"); + if (rom == NULL) + { + fatal_error(argv[i][0] == '-' ? "unrecognized flag argument: %s" : "unable to open file '%s' for reading", argv[i]); + } + } + } + + if (fread(RomHeader, 1, HEADER_SIZE, rom) != HEADER_SIZE) + { + fatal_error("error reading the ROM header"); + } + + if (override_crc) + { + HeaderWriteU16LE(0x6C, secure_crc); + } + + if (override_code) + { + memcpy(RomHeader + 0xC, game_code, 4); + } + + uint16_t header_crc = Calc_CRC16((uint8_t *)RomHeader, 0x15E, 0xFFFF); + HeaderWriteU16LE(0x15E, header_crc); + + fseek(rom, 0, SEEK_SET); + if (fwrite(RomHeader, 1, HEADER_SIZE, rom) != HEADER_SIZE) + { + fatal_error("error writing the ROM header"); + } + + fclose(rom); + return EXIT_SUCCESS; +} diff --git a/tools/gen_fx_consts/.gitignore b/tools/gen_fx_consts/.gitignore new file mode 100644 index 0000000000..d091085c0e --- /dev/null +++ b/tools/gen_fx_consts/.gitignore @@ -0,0 +1 @@ +gen_fx_consts diff --git a/tools/gen_fx_consts/Makefile b/tools/gen_fx_consts/Makefile new file mode 100644 index 0000000000..9c9d3f4ef8 --- /dev/null +++ b/tools/gen_fx_consts/Makefile @@ -0,0 +1,31 @@ +CC = gcc +CFLAGS := -O3 -g -DNDEBUG -DSOURCE_DIR="\"$(CURDIR)\"" + +SRCS := main.c fx_encode.c fx_data.c +OBJS := $(SRCS:%.c=%.o) + +prog := gen_fx_consts + +.PHONY: all clean + +DEPDIR := .deps +DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d + +all: $(prog) + @: + +clean: ; $(RM) -r $(DEPDIR) $(OBJS) $(prog) $(prog).exe + +$(prog): $(OBJS) + $(CC) $(LDFLAGS) -o $@ $^ + +$(OBJS): %.o: %.c +$(OBJS): %.o: %.c $(DEPDIR)/%.d | $(DEPDIR) + $(CC) $(CFLAGS) $(DEPFLAGS) -c -o $@ $< + +$(DEPDIR): ; mkdir -p $@ + +DEPFILES := $(SRCS:%.c=$(DEPDIR)/%.d) +$(DEPFILES): + +include $(wildcard $(DEPFILES)) diff --git a/tools/gen_fx_consts/fx.h b/tools/gen_fx_consts/fx.h new file mode 100644 index 0000000000..93984e02d0 --- /dev/null +++ b/tools/gen_fx_consts/fx.h @@ -0,0 +1,31 @@ +#ifndef GUARD_FX_H +#define GUARD_FX_H + +#include + +struct FxSpec { + const char *name; + int intpart; + int fracpart; +}; + +struct FxConst { + char *name; + const struct FxSpec *fxtype; + double value; +}; + +extern struct FxConst *gFxConstTable; +extern size_t gNFxConstTable; + +// Init and delete the above two objects +void FxConstTableInit(void); +void FxConstTableEnd(void); + +// Generates the integer value of the fixed-point value represented by FxConst* +long long MakeFix(const struct FxConst *constdef); + +// For FxSpec*, get the width in bits. +int GetFxWidth(const struct FxSpec *fxtype); + +#endif //GUARD_FX_H diff --git a/tools/gen_fx_consts/fx_const.csv b/tools/gen_fx_consts/fx_const.csv new file mode 100644 index 0000000000..713aaa33f4 --- /dev/null +++ b/tools/gen_fx_consts/fx_const.csv @@ -0,0 +1,862 @@ +#name,type,value +E,fx64c,2.7182818284590452354 +LOG2E,fx64c,1.4426950408889634074 +LOG10E,fx64c,0.43429448190325182765 +LN2,fx64c,0.69314718055994530942 +LN10,fx64c,2.30258509299404568402 +PI,fx64c,3.14159265358979323846 +TWOPI,fx64c,6.28318530717958647692 +PI_2,fx64c,1.57079632679489661923 +PI_4,fx64c,0.78539816339744830962 +3PI_4,fx64c,2.3561944901923448370 +SQRTPI,fx64c,1.77245385090551602793 +1_PI,fx64c,0.31830988618379067154 +2_PI,fx64c,0.63661977236758134308 +2_SQRTPI,fx64c,1.12837916709551257390 +SQRT2,fx64c,1.41421356237309504880 +SQRT1_2,fx64c,0.70710678118654752440 +SQRT3,fx64c,1.73205080756887719000 +SQRT1_3,fx64c,0.57735026918962576450914878050196 +IVLN10,fx64c,0.43429448190325182765 +LOG2_E,fx64c,0.693147180559945309417 +INVLN2,fx64c,1.4426950408889633870 +1_360,fx64c,0.0027777777777777777778 +TWOPI_360,fx64c,0.0174532925199432957692 +360_TWOPI,fx64c,57.295779513082320876846 +65536_TWOPI,fx64c,10430.378350470452724958342593503 +65536_360,fx64c,182.04444444444444444444444444444 +TWOPI_65536,fx64c,0.0000958737992428525768572998046875 +360_65536,fx64c,0.0054931640625 +1_100,fx64c,0.01000000000000000000 +2_100,fx64c,0.02000000000000000000 +3_100,fx64c,0.03000000000000000000 +4_100,fx64c,0.04000000000000000000 +5_100,fx64c,0.05000000000000000000 +6_100,fx64c,0.06000000000000000000 +7_100,fx64c,0.07000000000000000000 +8_100,fx64c,0.08000000000000000000 +9_100,fx64c,0.09000000000000000000 +10_100,fx64c,0.10000000000000000000 +11_100,fx64c,0.11000000000000000000 +12_100,fx64c,0.12000000000000000000 +13_100,fx64c,0.13000000000000000000 +14_100,fx64c,0.14000000000000000000 +15_100,fx64c,0.15000000000000000000 +16_100,fx64c,0.16000000000000000000 +17_100,fx64c,0.17000000000000000000 +18_100,fx64c,0.18000000000000000000 +19_100,fx64c,0.19000000000000000000 +20_100,fx64c,0.20000000000000000000 +21_100,fx64c,0.21000000000000000000 +22_100,fx64c,0.22000000000000000000 +23_100,fx64c,0.23000000000000000000 +24_100,fx64c,0.24000000000000000000 +25_100,fx64c,0.25000000000000000000 +26_100,fx64c,0.26000000000000000000 +27_100,fx64c,0.27000000000000000000 +28_100,fx64c,0.28000000000000000000 +29_100,fx64c,0.29000000000000000000 +30_100,fx64c,0.30000000000000000000 +31_100,fx64c,0.31000000000000000000 +32_100,fx64c,0.32000000000000000000 +33_100,fx64c,0.33000000000000000000 +34_100,fx64c,0.34000000000000000000 +35_100,fx64c,0.35000000000000000000 +36_100,fx64c,0.36000000000000000000 +37_100,fx64c,0.37000000000000000000 +38_100,fx64c,0.38000000000000000000 +39_100,fx64c,0.39000000000000000000 +40_100,fx64c,0.40000000000000000000 +41_100,fx64c,0.41000000000000000000 +42_100,fx64c,0.42000000000000000000 +43_100,fx64c,0.43000000000000000000 +44_100,fx64c,0.44000000000000000000 +45_100,fx64c,0.45000000000000000000 +46_100,fx64c,0.46000000000000000000 +47_100,fx64c,0.47000000000000000000 +48_100,fx64c,0.48000000000000000000 +49_100,fx64c,0.49000000000000000000 +50_100,fx64c,0.50000000000000000000 +51_100,fx64c,0.51000000000000000000 +52_100,fx64c,0.52000000000000000000 +53_100,fx64c,0.53000000000000000000 +54_100,fx64c,0.54000000000000000000 +55_100,fx64c,0.55000000000000000000 +56_100,fx64c,0.56000000000000000000 +57_100,fx64c,0.57000000000000000000 +58_100,fx64c,0.58000000000000000000 +59_100,fx64c,0.59000000000000000000 +60_100,fx64c,0.60000000000000000000 +61_100,fx64c,0.61000000000000000000 +62_100,fx64c,0.62000000000000000000 +63_100,fx64c,0.63000000000000000000 +64_100,fx64c,0.64000000000000000000 +65_100,fx64c,0.65000000000000000000 +66_100,fx64c,0.66000000000000000000 +67_100,fx64c,0.67000000000000000000 +68_100,fx64c,0.68000000000000000000 +69_100,fx64c,0.69000000000000000000 +70_100,fx64c,0.70000000000000000000 +71_100,fx64c,0.71000000000000000000 +72_100,fx64c,0.72000000000000000000 +73_100,fx64c,0.73000000000000000000 +74_100,fx64c,0.74000000000000000000 +75_100,fx64c,0.75000000000000000000 +76_100,fx64c,0.76000000000000000000 +77_100,fx64c,0.77000000000000000000 +78_100,fx64c,0.78000000000000000000 +79_100,fx64c,0.79000000000000000000 +80_100,fx64c,0.80000000000000000000 +81_100,fx64c,0.81000000000000000000 +82_100,fx64c,0.82000000000000000000 +83_100,fx64c,0.83000000000000000000 +84_100,fx64c,0.84000000000000000000 +85_100,fx64c,0.85000000000000000000 +86_100,fx64c,0.86000000000000000000 +87_100,fx64c,0.87000000000000000000 +88_100,fx64c,0.88000000000000000000 +89_100,fx64c,0.89000000000000000000 +90_100,fx64c,0.90000000000000000000 +91_100,fx64c,0.91000000000000000000 +92_100,fx64c,0.92000000000000000000 +93_100,fx64c,0.93000000000000000000 +94_100,fx64c,0.94000000000000000000 +95_100,fx64c,0.95000000000000000000 +96_100,fx64c,0.96000000000000000000 +97_100,fx64c,0.97000000000000000000 +98_100,fx64c,0.98000000000000000000 +99_100,fx64c,0.99000000000000000000 +ONE,fx64c,1.00000000000000000000 +HALF,fx64c,0.50000000000000000000 +ONE,fx32,1.00000000000000000000 +HALF,fx32,0.50000000000000000000 +SQRT2,fx32,1.41421356237309504880 +SQRT1_2,fx32,0.70710678118654752440 +SQRT3,fx32,1.73205080756887719000 +SQRT1_3,fx32,0.57735026918962576450914878050196 +ONE,fx16,1.00000000000000000000 +HALF,fx16,0.50000000000000000000 +SQRT2,fx16,1.41421356237309504880 +SQRT1_2,fx16,0.70710678118654752440 +SQRT3,fx16,1.73205080756887719000 +SQRT1_3,fx16,0.57735026918962576450914878050196 +SIN0,fx32,0 +SIN1,fx32,0.0174524064372835 +SIN2,fx32,0.034899496702501 +SIN3,fx32,0.0523359562429438 +SIN4,fx32,0.0697564737441253 +SIN5,fx32,0.0871557427476582 +SIN6,fx32,0.104528463267653 +SIN7,fx32,0.121869343405147 +SIN8,fx32,0.139173100960065 +SIN9,fx32,0.156434465040231 +SIN10,fx32,0.17364817766693 +SIN11,fx32,0.190808995376545 +SIN12,fx32,0.207911690817759 +SIN13,fx32,0.224951054343865 +SIN14,fx32,0.241921895599668 +SIN15,fx32,0.258819045102521 +SIN16,fx32,0.275637355816999 +SIN17,fx32,0.292371704722737 +SIN18,fx32,0.309016994374947 +SIN19,fx32,0.325568154457157 +SIN20,fx32,0.342020143325669 +SIN21,fx32,0.3583679495453 +SIN22,fx32,0.374606593415912 +SIN23,fx32,0.390731128489274 +SIN24,fx32,0.4067366430758 +SIN25,fx32,0.422618261740699 +SIN26,fx32,0.438371146789077 +SIN27,fx32,0.453990499739547 +SIN28,fx32,0.469471562785891 +SIN29,fx32,0.484809620246337 +SIN30,fx32,0.5 +SIN31,fx32,0.515038074910054 +SIN32,fx32,0.529919264233205 +SIN33,fx32,0.544639035015027 +SIN34,fx32,0.559192903470747 +SIN35,fx32,0.573576436351046 +SIN36,fx32,0.587785252292473 +SIN37,fx32,0.601815023152048 +SIN38,fx32,0.615661475325658 +SIN39,fx32,0.629320391049837 +SIN40,fx32,0.642787609686539 +SIN41,fx32,0.656059028990507 +SIN42,fx32,0.669130606358858 +SIN43,fx32,0.681998360062498 +SIN44,fx32,0.694658370458997 +SIN45,fx32,0.707106781186547 +SIN46,fx32,0.719339800338651 +SIN47,fx32,0.73135370161917 +SIN48,fx32,0.743144825477394 +SIN49,fx32,0.754709580222772 +SIN50,fx32,0.766044443118978 +SIN51,fx32,0.777145961456971 +SIN52,fx32,0.788010753606722 +SIN53,fx32,0.798635510047293 +SIN54,fx32,0.809016994374947 +SIN55,fx32,0.819152044288992 +SIN56,fx32,0.829037572555042 +SIN57,fx32,0.838670567945424 +SIN58,fx32,0.848048096156426 +SIN59,fx32,0.857167300702112 +SIN60,fx32,0.866025403784439 +SIN61,fx32,0.874619707139396 +SIN62,fx32,0.882947592858927 +SIN63,fx32,0.891006524188368 +SIN64,fx32,0.898794046299167 +SIN65,fx32,0.90630778703665 +SIN66,fx32,0.913545457642601 +SIN67,fx32,0.92050485345244 +SIN68,fx32,0.927183854566787 +SIN69,fx32,0.933580426497202 +SIN70,fx32,0.939692620785908 +SIN71,fx32,0.945518575599317 +SIN72,fx32,0.951056516295154 +SIN73,fx32,0.956304755963035 +SIN74,fx32,0.961261695938319 +SIN75,fx32,0.965925826289068 +SIN76,fx32,0.970295726275996 +SIN77,fx32,0.974370064785235 +SIN78,fx32,0.978147600733806 +SIN79,fx32,0.981627183447664 +SIN80,fx32,0.984807753012208 +SIN81,fx32,0.987688340595138 +SIN82,fx32,0.99026806874157 +SIN83,fx32,0.992546151641322 +SIN84,fx32,0.994521895368273 +SIN85,fx32,0.996194698091746 +SIN86,fx32,0.997564050259824 +SIN87,fx32,0.998629534754574 +SIN88,fx32,0.999390827019096 +SIN89,fx32,0.999847695156391 +SIN90,fx32,1 +SIN91,fx32,0.999847695156391 +SIN92,fx32,0.999390827019096 +SIN93,fx32,0.998629534754574 +SIN94,fx32,0.997564050259824 +SIN95,fx32,0.996194698091746 +SIN96,fx32,0.994521895368273 +SIN97,fx32,0.992546151641322 +SIN98,fx32,0.99026806874157 +SIN99,fx32,0.987688340595138 +SIN100,fx32,0.984807753012208 +SIN101,fx32,0.981627183447664 +SIN102,fx32,0.978147600733806 +SIN103,fx32,0.974370064785235 +SIN104,fx32,0.970295726275996 +SIN105,fx32,0.965925826289068 +SIN106,fx32,0.961261695938319 +SIN107,fx32,0.956304755963036 +SIN108,fx32,0.951056516295154 +SIN109,fx32,0.945518575599317 +SIN110,fx32,0.939692620785908 +SIN111,fx32,0.933580426497202 +SIN112,fx32,0.927183854566787 +SIN113,fx32,0.92050485345244 +SIN114,fx32,0.913545457642601 +SIN115,fx32,0.90630778703665 +SIN116,fx32,0.898794046299167 +SIN117,fx32,0.891006524188368 +SIN118,fx32,0.882947592858927 +SIN119,fx32,0.874619707139396 +SIN120,fx32,0.866025403784439 +SIN121,fx32,0.857167300702112 +SIN122,fx32,0.848048096156426 +SIN123,fx32,0.838670567945424 +SIN124,fx32,0.829037572555042 +SIN125,fx32,0.819152044288992 +SIN126,fx32,0.809016994374947 +SIN127,fx32,0.798635510047293 +SIN128,fx32,0.788010753606722 +SIN129,fx32,0.777145961456971 +SIN130,fx32,0.766044443118978 +SIN131,fx32,0.754709580222772 +SIN132,fx32,0.743144825477394 +SIN133,fx32,0.731353701619171 +SIN134,fx32,0.719339800338651 +SIN135,fx32,0.707106781186548 +SIN136,fx32,0.694658370458997 +SIN137,fx32,0.681998360062498 +SIN138,fx32,0.669130606358858 +SIN139,fx32,0.656059028990507 +SIN140,fx32,0.642787609686539 +SIN141,fx32,0.629320391049837 +SIN142,fx32,0.615661475325658 +SIN143,fx32,0.601815023152048 +SIN144,fx32,0.587785252292473 +SIN145,fx32,0.573576436351046 +SIN146,fx32,0.559192903470747 +SIN147,fx32,0.544639035015027 +SIN148,fx32,0.529919264233205 +SIN149,fx32,0.515038074910054 +SIN150,fx32,0.5 +SIN151,fx32,0.484809620246337 +SIN152,fx32,0.469471562785891 +SIN153,fx32,0.453990499739547 +SIN154,fx32,0.438371146789077 +SIN155,fx32,0.422618261740699 +SIN156,fx32,0.4067366430758 +SIN157,fx32,0.390731128489274 +SIN158,fx32,0.374606593415912 +SIN159,fx32,0.3583679495453 +SIN160,fx32,0.342020143325669 +SIN161,fx32,0.325568154457157 +SIN162,fx32,0.309016994374948 +SIN163,fx32,0.292371704722737 +SIN164,fx32,0.275637355816999 +SIN165,fx32,0.258819045102521 +SIN166,fx32,0.241921895599668 +SIN167,fx32,0.224951054343865 +SIN168,fx32,0.207911690817759 +SIN169,fx32,0.190808995376545 +SIN170,fx32,0.17364817766693 +SIN171,fx32,0.156434465040231 +SIN172,fx32,0.139173100960065 +SIN173,fx32,0.121869343405148 +SIN174,fx32,0.104528463267654 +SIN175,fx32,0.0871557427476582 +SIN176,fx32,0.0697564737441255 +SIN177,fx32,0.0523359562429438 +SIN178,fx32,0.0348994967025011 +SIN179,fx32,0.0174524064372834 +SIN180,fx32,1.22464679914735e-16 +SIN181,fx32,-0.0174524064372836 +SIN182,fx32,-0.0348994967025009 +SIN183,fx32,-0.0523359562429436 +SIN184,fx32,-0.0697564737441253 +SIN185,fx32,-0.0871557427476579 +SIN186,fx32,-0.104528463267653 +SIN187,fx32,-0.121869343405147 +SIN188,fx32,-0.139173100960066 +SIN189,fx32,-0.156434465040231 +SIN190,fx32,-0.17364817766693 +SIN191,fx32,-0.190808995376545 +SIN192,fx32,-0.20791169081776 +SIN193,fx32,-0.224951054343865 +SIN194,fx32,-0.241921895599668 +SIN195,fx32,-0.258819045102521 +SIN196,fx32,-0.275637355816999 +SIN197,fx32,-0.292371704722737 +SIN198,fx32,-0.309016994374947 +SIN199,fx32,-0.325568154457157 +SIN200,fx32,-0.342020143325669 +SIN201,fx32,-0.3583679495453 +SIN202,fx32,-0.374606593415912 +SIN203,fx32,-0.390731128489274 +SIN204,fx32,-0.4067366430758 +SIN205,fx32,-0.422618261740699 +SIN206,fx32,-0.438371146789077 +SIN207,fx32,-0.453990499739547 +SIN208,fx32,-0.469471562785891 +SIN209,fx32,-0.484809620246337 +SIN210,fx32,-0.5 +SIN211,fx32,-0.515038074910054 +SIN212,fx32,-0.529919264233205 +SIN213,fx32,-0.544639035015027 +SIN214,fx32,-0.559192903470747 +SIN215,fx32,-0.573576436351046 +SIN216,fx32,-0.587785252292473 +SIN217,fx32,-0.601815023152048 +SIN218,fx32,-0.615661475325658 +SIN219,fx32,-0.629320391049838 +SIN220,fx32,-0.642787609686539 +SIN221,fx32,-0.656059028990507 +SIN222,fx32,-0.669130606358858 +SIN223,fx32,-0.681998360062498 +SIN224,fx32,-0.694658370458997 +SIN225,fx32,-0.707106781186547 +SIN226,fx32,-0.719339800338651 +SIN227,fx32,-0.73135370161917 +SIN228,fx32,-0.743144825477394 +SIN229,fx32,-0.754709580222772 +SIN230,fx32,-0.766044443118978 +SIN231,fx32,-0.777145961456971 +SIN232,fx32,-0.788010753606722 +SIN233,fx32,-0.798635510047293 +SIN234,fx32,-0.809016994374947 +SIN235,fx32,-0.819152044288992 +SIN236,fx32,-0.829037572555042 +SIN237,fx32,-0.838670567945424 +SIN238,fx32,-0.848048096156426 +SIN239,fx32,-0.857167300702112 +SIN240,fx32,-0.866025403784438 +SIN241,fx32,-0.874619707139396 +SIN242,fx32,-0.882947592858927 +SIN243,fx32,-0.891006524188368 +SIN244,fx32,-0.898794046299167 +SIN245,fx32,-0.90630778703665 +SIN246,fx32,-0.913545457642601 +SIN247,fx32,-0.92050485345244 +SIN248,fx32,-0.927183854566787 +SIN249,fx32,-0.933580426497202 +SIN250,fx32,-0.939692620785908 +SIN251,fx32,-0.945518575599317 +SIN252,fx32,-0.951056516295154 +SIN253,fx32,-0.956304755963035 +SIN254,fx32,-0.961261695938319 +SIN255,fx32,-0.965925826289068 +SIN256,fx32,-0.970295726275996 +SIN257,fx32,-0.974370064785235 +SIN258,fx32,-0.978147600733806 +SIN259,fx32,-0.981627183447664 +SIN260,fx32,-0.984807753012208 +SIN261,fx32,-0.987688340595138 +SIN262,fx32,-0.99026806874157 +SIN263,fx32,-0.992546151641322 +SIN264,fx32,-0.994521895368273 +SIN265,fx32,-0.996194698091746 +SIN266,fx32,-0.997564050259824 +SIN267,fx32,-0.998629534754574 +SIN268,fx32,-0.999390827019096 +SIN269,fx32,-0.999847695156391 +SIN270,fx32,-1 +SIN271,fx32,-0.999847695156391 +SIN272,fx32,-0.999390827019096 +SIN273,fx32,-0.998629534754574 +SIN274,fx32,-0.997564050259824 +SIN275,fx32,-0.996194698091746 +SIN276,fx32,-0.994521895368273 +SIN277,fx32,-0.992546151641322 +SIN278,fx32,-0.99026806874157 +SIN279,fx32,-0.987688340595138 +SIN280,fx32,-0.984807753012208 +SIN281,fx32,-0.981627183447664 +SIN282,fx32,-0.978147600733806 +SIN283,fx32,-0.974370064785235 +SIN284,fx32,-0.970295726275997 +SIN285,fx32,-0.965925826289068 +SIN286,fx32,-0.961261695938319 +SIN287,fx32,-0.956304755963035 +SIN288,fx32,-0.951056516295154 +SIN289,fx32,-0.945518575599317 +SIN290,fx32,-0.939692620785908 +SIN291,fx32,-0.933580426497202 +SIN292,fx32,-0.927183854566787 +SIN293,fx32,-0.92050485345244 +SIN294,fx32,-0.913545457642601 +SIN295,fx32,-0.90630778703665 +SIN296,fx32,-0.898794046299167 +SIN297,fx32,-0.891006524188368 +SIN298,fx32,-0.882947592858927 +SIN299,fx32,-0.874619707139396 +SIN300,fx32,-0.866025403784439 +SIN301,fx32,-0.857167300702112 +SIN302,fx32,-0.848048096156426 +SIN303,fx32,-0.838670567945424 +SIN304,fx32,-0.829037572555042 +SIN305,fx32,-0.819152044288992 +SIN306,fx32,-0.809016994374948 +SIN307,fx32,-0.798635510047293 +SIN308,fx32,-0.788010753606722 +SIN309,fx32,-0.777145961456971 +SIN310,fx32,-0.766044443118978 +SIN311,fx32,-0.754709580222772 +SIN312,fx32,-0.743144825477395 +SIN313,fx32,-0.73135370161917 +SIN314,fx32,-0.719339800338651 +SIN315,fx32,-0.707106781186548 +SIN316,fx32,-0.694658370458998 +SIN317,fx32,-0.681998360062498 +SIN318,fx32,-0.669130606358858 +SIN319,fx32,-0.656059028990507 +SIN320,fx32,-0.64278760968654 +SIN321,fx32,-0.629320391049838 +SIN322,fx32,-0.615661475325658 +SIN323,fx32,-0.601815023152048 +SIN324,fx32,-0.587785252292473 +SIN325,fx32,-0.573576436351046 +SIN326,fx32,-0.559192903470747 +SIN327,fx32,-0.544639035015027 +SIN328,fx32,-0.529919264233205 +SIN329,fx32,-0.515038074910054 +SIN330,fx32,-0.5 +SIN331,fx32,-0.484809620246337 +SIN332,fx32,-0.469471562785891 +SIN333,fx32,-0.453990499739547 +SIN334,fx32,-0.438371146789078 +SIN335,fx32,-0.422618261740699 +SIN336,fx32,-0.4067366430758 +SIN337,fx32,-0.390731128489274 +SIN338,fx32,-0.374606593415912 +SIN339,fx32,-0.358367949545301 +SIN340,fx32,-0.342020143325669 +SIN341,fx32,-0.325568154457157 +SIN342,fx32,-0.309016994374948 +SIN343,fx32,-0.292371704722737 +SIN344,fx32,-0.275637355816999 +SIN345,fx32,-0.258819045102521 +SIN346,fx32,-0.241921895599668 +SIN347,fx32,-0.224951054343865 +SIN348,fx32,-0.20791169081776 +SIN349,fx32,-0.190808995376545 +SIN350,fx32,-0.17364817766693 +SIN351,fx32,-0.156434465040231 +SIN352,fx32,-0.139173100960066 +SIN353,fx32,-0.121869343405147 +SIN354,fx32,-0.104528463267653 +SIN355,fx32,-0.0871557427476583 +SIN356,fx32,-0.0697564737441256 +SIN357,fx32,-0.0523359562429444 +SIN358,fx32,-0.0348994967025008 +SIN359,fx32,-0.0174524064372836 +COS0,fx32,1 +COS1,fx32,0.999847695156391 +COS2,fx32,0.999390827019096 +COS3,fx32,0.998629534754574 +COS4,fx32,0.997564050259824 +COS5,fx32,0.996194698091746 +COS6,fx32,0.994521895368273 +COS7,fx32,0.992546151641322 +COS8,fx32,0.99026806874157 +COS9,fx32,0.987688340595138 +COS10,fx32,0.984807753012208 +COS11,fx32,0.981627183447664 +COS12,fx32,0.978147600733806 +COS13,fx32,0.974370064785235 +COS14,fx32,0.970295726275996 +COS15,fx32,0.965925826289068 +COS16,fx32,0.961261695938319 +COS17,fx32,0.956304755963035 +COS18,fx32,0.951056516295154 +COS19,fx32,0.945518575599317 +COS20,fx32,0.939692620785908 +COS21,fx32,0.933580426497202 +COS22,fx32,0.927183854566787 +COS23,fx32,0.92050485345244 +COS24,fx32,0.913545457642601 +COS25,fx32,0.90630778703665 +COS26,fx32,0.898794046299167 +COS27,fx32,0.891006524188368 +COS28,fx32,0.882947592858927 +COS29,fx32,0.874619707139396 +COS30,fx32,0.866025403784439 +COS31,fx32,0.857167300702112 +COS32,fx32,0.848048096156426 +COS33,fx32,0.838670567945424 +COS34,fx32,0.829037572555042 +COS35,fx32,0.819152044288992 +COS36,fx32,0.809016994374947 +COS37,fx32,0.798635510047293 +COS38,fx32,0.788010753606722 +COS39,fx32,0.777145961456971 +COS40,fx32,0.766044443118978 +COS41,fx32,0.754709580222772 +COS42,fx32,0.743144825477394 +COS43,fx32,0.73135370161917 +COS44,fx32,0.719339800338651 +COS45,fx32,0.707106781186548 +COS46,fx32,0.694658370458997 +COS47,fx32,0.681998360062498 +COS48,fx32,0.669130606358858 +COS49,fx32,0.656059028990507 +COS50,fx32,0.642787609686539 +COS51,fx32,0.629320391049838 +COS52,fx32,0.615661475325658 +COS53,fx32,0.601815023152048 +COS54,fx32,0.587785252292473 +COS55,fx32,0.573576436351046 +COS56,fx32,0.559192903470747 +COS57,fx32,0.544639035015027 +COS58,fx32,0.529919264233205 +COS59,fx32,0.515038074910054 +COS60,fx32,0.5 +COS61,fx32,0.484809620246337 +COS62,fx32,0.469471562785891 +COS63,fx32,0.453990499739547 +COS64,fx32,0.438371146789077 +COS65,fx32,0.422618261740699 +COS66,fx32,0.4067366430758 +COS67,fx32,0.390731128489274 +COS68,fx32,0.374606593415912 +COS69,fx32,0.3583679495453 +COS70,fx32,0.342020143325669 +COS71,fx32,0.325568154457157 +COS72,fx32,0.309016994374947 +COS73,fx32,0.292371704722737 +COS74,fx32,0.275637355816999 +COS75,fx32,0.258819045102521 +COS76,fx32,0.241921895599668 +COS77,fx32,0.224951054343865 +COS78,fx32,0.207911690817759 +COS79,fx32,0.190808995376545 +COS80,fx32,0.17364817766693 +COS81,fx32,0.156434465040231 +COS82,fx32,0.139173100960065 +COS83,fx32,0.121869343405147 +COS84,fx32,0.104528463267653 +COS85,fx32,0.0871557427476581 +COS86,fx32,0.0697564737441252 +COS87,fx32,0.052335956242944 +COS88,fx32,0.0348994967025011 +COS89,fx32,0.0174524064372836 +COS90,fx32,6.12323399573677e-17 +COS91,fx32,-0.0174524064372835 +COS92,fx32,-0.034899496702501 +COS93,fx32,-0.0523359562429438 +COS94,fx32,-0.0697564737441253 +COS95,fx32,-0.0871557427476582 +COS96,fx32,-0.104528463267654 +COS97,fx32,-0.121869343405147 +COS98,fx32,-0.139173100960065 +COS99,fx32,-0.156434465040231 +COS100,fx32,-0.17364817766693 +COS101,fx32,-0.190808995376545 +COS102,fx32,-0.207911690817759 +COS103,fx32,-0.224951054343865 +COS104,fx32,-0.241921895599668 +COS105,fx32,-0.258819045102521 +COS106,fx32,-0.275637355816999 +COS107,fx32,-0.292371704722737 +COS108,fx32,-0.309016994374947 +COS109,fx32,-0.325568154457157 +COS110,fx32,-0.342020143325669 +COS111,fx32,-0.3583679495453 +COS112,fx32,-0.374606593415912 +COS113,fx32,-0.390731128489274 +COS114,fx32,-0.4067366430758 +COS115,fx32,-0.422618261740699 +COS116,fx32,-0.438371146789078 +COS117,fx32,-0.453990499739547 +COS118,fx32,-0.469471562785891 +COS119,fx32,-0.484809620246337 +COS120,fx32,-0.5 +COS121,fx32,-0.515038074910054 +COS122,fx32,-0.529919264233205 +COS123,fx32,-0.544639035015027 +COS124,fx32,-0.559192903470747 +COS125,fx32,-0.573576436351046 +COS126,fx32,-0.587785252292473 +COS127,fx32,-0.601815023152048 +COS128,fx32,-0.615661475325658 +COS129,fx32,-0.629320391049837 +COS130,fx32,-0.642787609686539 +COS131,fx32,-0.656059028990507 +COS132,fx32,-0.669130606358858 +COS133,fx32,-0.681998360062498 +COS134,fx32,-0.694658370458997 +COS135,fx32,-0.707106781186547 +COS136,fx32,-0.719339800338651 +COS137,fx32,-0.73135370161917 +COS138,fx32,-0.743144825477394 +COS139,fx32,-0.754709580222772 +COS140,fx32,-0.766044443118978 +COS141,fx32,-0.777145961456971 +COS142,fx32,-0.788010753606722 +COS143,fx32,-0.798635510047293 +COS144,fx32,-0.809016994374947 +COS145,fx32,-0.819152044288992 +COS146,fx32,-0.829037572555042 +COS147,fx32,-0.838670567945424 +COS148,fx32,-0.848048096156426 +COS149,fx32,-0.857167300702112 +COS150,fx32,-0.866025403784439 +COS151,fx32,-0.874619707139396 +COS152,fx32,-0.882947592858927 +COS153,fx32,-0.891006524188368 +COS154,fx32,-0.898794046299167 +COS155,fx32,-0.90630778703665 +COS156,fx32,-0.913545457642601 +COS157,fx32,-0.92050485345244 +COS158,fx32,-0.927183854566787 +COS159,fx32,-0.933580426497202 +COS160,fx32,-0.939692620785908 +COS161,fx32,-0.945518575599317 +COS162,fx32,-0.951056516295154 +COS163,fx32,-0.956304755963036 +COS164,fx32,-0.961261695938319 +COS165,fx32,-0.965925826289068 +COS166,fx32,-0.970295726275996 +COS167,fx32,-0.974370064785235 +COS168,fx32,-0.978147600733806 +COS169,fx32,-0.981627183447664 +COS170,fx32,-0.984807753012208 +COS171,fx32,-0.987688340595138 +COS172,fx32,-0.99026806874157 +COS173,fx32,-0.992546151641322 +COS174,fx32,-0.994521895368273 +COS175,fx32,-0.996194698091746 +COS176,fx32,-0.997564050259824 +COS177,fx32,-0.998629534754574 +COS178,fx32,-0.999390827019096 +COS179,fx32,-0.999847695156391 +COS180,fx32,-1 +COS181,fx32,-0.999847695156391 +COS182,fx32,-0.999390827019096 +COS183,fx32,-0.998629534754574 +COS184,fx32,-0.997564050259824 +COS185,fx32,-0.996194698091746 +COS186,fx32,-0.994521895368273 +COS187,fx32,-0.992546151641322 +COS188,fx32,-0.99026806874157 +COS189,fx32,-0.987688340595138 +COS190,fx32,-0.984807753012208 +COS191,fx32,-0.981627183447664 +COS192,fx32,-0.978147600733806 +COS193,fx32,-0.974370064785235 +COS194,fx32,-0.970295726275996 +COS195,fx32,-0.965925826289068 +COS196,fx32,-0.961261695938319 +COS197,fx32,-0.956304755963035 +COS198,fx32,-0.951056516295154 +COS199,fx32,-0.945518575599317 +COS200,fx32,-0.939692620785908 +COS201,fx32,-0.933580426497202 +COS202,fx32,-0.927183854566787 +COS203,fx32,-0.92050485345244 +COS204,fx32,-0.913545457642601 +COS205,fx32,-0.90630778703665 +COS206,fx32,-0.898794046299167 +COS207,fx32,-0.891006524188368 +COS208,fx32,-0.882947592858927 +COS209,fx32,-0.874619707139396 +COS210,fx32,-0.866025403784439 +COS211,fx32,-0.857167300702112 +COS212,fx32,-0.848048096156426 +COS213,fx32,-0.838670567945424 +COS214,fx32,-0.829037572555042 +COS215,fx32,-0.819152044288992 +COS216,fx32,-0.809016994374948 +COS217,fx32,-0.798635510047293 +COS218,fx32,-0.788010753606722 +COS219,fx32,-0.777145961456971 +COS220,fx32,-0.766044443118978 +COS221,fx32,-0.754709580222772 +COS222,fx32,-0.743144825477394 +COS223,fx32,-0.731353701619171 +COS224,fx32,-0.719339800338651 +COS225,fx32,-0.707106781186548 +COS226,fx32,-0.694658370458997 +COS227,fx32,-0.681998360062499 +COS228,fx32,-0.669130606358858 +COS229,fx32,-0.656059028990507 +COS230,fx32,-0.642787609686539 +COS231,fx32,-0.629320391049838 +COS232,fx32,-0.615661475325658 +COS233,fx32,-0.601815023152048 +COS234,fx32,-0.587785252292473 +COS235,fx32,-0.573576436351046 +COS236,fx32,-0.559192903470747 +COS237,fx32,-0.544639035015027 +COS238,fx32,-0.529919264233205 +COS239,fx32,-0.515038074910054 +COS240,fx32,-0.5 +COS241,fx32,-0.484809620246337 +COS242,fx32,-0.469471562785891 +COS243,fx32,-0.453990499739547 +COS244,fx32,-0.438371146789078 +COS245,fx32,-0.422618261740699 +COS246,fx32,-0.4067366430758 +COS247,fx32,-0.390731128489274 +COS248,fx32,-0.374606593415912 +COS249,fx32,-0.358367949545301 +COS250,fx32,-0.342020143325669 +COS251,fx32,-0.325568154457157 +COS252,fx32,-0.309016994374948 +COS253,fx32,-0.292371704722737 +COS254,fx32,-0.275637355816999 +COS255,fx32,-0.258819045102521 +COS256,fx32,-0.241921895599668 +COS257,fx32,-0.224951054343865 +COS258,fx32,-0.20791169081776 +COS259,fx32,-0.190808995376545 +COS260,fx32,-0.17364817766693 +COS261,fx32,-0.156434465040231 +COS262,fx32,-0.139173100960066 +COS263,fx32,-0.121869343405147 +COS264,fx32,-0.104528463267653 +COS265,fx32,-0.0871557427476582 +COS266,fx32,-0.0697564737441256 +COS267,fx32,-0.0523359562429443 +COS268,fx32,-0.0348994967025008 +COS269,fx32,-0.0174524064372835 +COS270,fx32,-1.83697019872103e-16 +COS271,fx32,0.0174524064372831 +COS272,fx32,0.0348994967025013 +COS273,fx32,0.0523359562429439 +COS274,fx32,0.0697564737441252 +COS275,fx32,0.0871557427476579 +COS276,fx32,0.104528463267653 +COS277,fx32,0.121869343405148 +COS278,fx32,0.139173100960065 +COS279,fx32,0.156434465040231 +COS280,fx32,0.17364817766693 +COS281,fx32,0.190808995376545 +COS282,fx32,0.207911690817759 +COS283,fx32,0.224951054343865 +COS284,fx32,0.241921895599667 +COS285,fx32,0.25881904510252 +COS286,fx32,0.275637355816999 +COS287,fx32,0.292371704722737 +COS288,fx32,0.309016994374947 +COS289,fx32,0.325568154457156 +COS290,fx32,0.342020143325669 +COS291,fx32,0.3583679495453 +COS292,fx32,0.374606593415912 +COS293,fx32,0.390731128489273 +COS294,fx32,0.4067366430758 +COS295,fx32,0.4226182617407 +COS296,fx32,0.438371146789077 +COS297,fx32,0.453990499739547 +COS298,fx32,0.46947156278589 +COS299,fx32,0.484809620246337 +COS300,fx32,0.5 +COS301,fx32,0.515038074910054 +COS302,fx32,0.529919264233205 +COS303,fx32,0.544639035015027 +COS304,fx32,0.559192903470747 +COS305,fx32,0.573576436351046 +COS306,fx32,0.587785252292473 +COS307,fx32,0.601815023152048 +COS308,fx32,0.615661475325659 +COS309,fx32,0.629320391049838 +COS310,fx32,0.642787609686539 +COS311,fx32,0.656059028990507 +COS312,fx32,0.669130606358858 +COS313,fx32,0.681998360062499 +COS314,fx32,0.694658370458997 +COS315,fx32,0.707106781186547 +COS316,fx32,0.719339800338651 +COS317,fx32,0.731353701619171 +COS318,fx32,0.743144825477394 +COS319,fx32,0.754709580222772 +COS320,fx32,0.766044443118978 +COS321,fx32,0.777145961456971 +COS322,fx32,0.788010753606722 +COS323,fx32,0.798635510047293 +COS324,fx32,0.809016994374947 +COS325,fx32,0.819152044288992 +COS326,fx32,0.829037572555042 +COS327,fx32,0.838670567945424 +COS328,fx32,0.848048096156426 +COS329,fx32,0.857167300702112 +COS330,fx32,0.866025403784438 +COS331,fx32,0.874619707139396 +COS332,fx32,0.882947592858927 +COS333,fx32,0.891006524188368 +COS334,fx32,0.898794046299167 +COS335,fx32,0.90630778703665 +COS336,fx32,0.913545457642601 +COS337,fx32,0.92050485345244 +COS338,fx32,0.927183854566787 +COS339,fx32,0.933580426497202 +COS340,fx32,0.939692620785908 +COS341,fx32,0.945518575599317 +COS342,fx32,0.951056516295154 +COS343,fx32,0.956304755963035 +COS344,fx32,0.961261695938319 +COS345,fx32,0.965925826289068 +COS346,fx32,0.970295726275996 +COS347,fx32,0.974370064785235 +COS348,fx32,0.978147600733806 +COS349,fx32,0.981627183447664 +COS350,fx32,0.984807753012208 +COS351,fx32,0.987688340595138 +COS352,fx32,0.99026806874157 +COS353,fx32,0.992546151641322 +COS354,fx32,0.994521895368273 +COS355,fx32,0.996194698091746 +COS356,fx32,0.997564050259824 +COS357,fx32,0.998629534754574 +COS358,fx32,0.999390827019096 +COS359,fx32,0.999847695156391 diff --git a/tools/gen_fx_consts/fx_data.c b/tools/gen_fx_consts/fx_data.c new file mode 100644 index 0000000000..a6f94bb78e --- /dev/null +++ b/tools/gen_fx_consts/fx_data.c @@ -0,0 +1,128 @@ +#include +#include +#include "fx.h" +#include "global.h" + +const struct FxSpec fx32 = {"fx32", 19, 12}; +const struct FxSpec fx64 = {"fx64", 51, 12}; +const struct FxSpec fx64c = {"fx64c", 31, 32}; +const struct FxSpec fx16 = {"fx16", 3, 12}; + +const struct FxSpec *const sFxSpecPtrs[] = { + &fx32, + &fx64, + &fx64c, + &fx16, +}; + +struct FxConst *gFxConstTable = NULL; +size_t gNFxConstTable = 0; + +void FxConstTableInit(void) { + FILE *file; + char *contents; + char *ptr; + char *linetok; + char *linetok_r; + char *commatok; + char *commatok_r; + char *_realpath; + int i, j, k; + long fsize; + long readsz; + static const char filename[] = SOURCE_DIR "/fx_const.csv"; + + atexit(FxConstTableEnd); + + file = fopen(filename, "r"); + if (file == NULL) { + fatal_error("Unable to open file '%s' for reading", filename); + } + fseek(file, 0, SEEK_END); + fsize = ftell(file); + fseek(file, 0, SEEK_SET); + contents = malloc(fsize + 1); + if (contents == NULL) { + fclose(file); + fatal_error("Unable to allocate CSV read buffer"); + } + readsz = fread(contents, 1, fsize, file); + fclose(file); + if (readsz != fsize) { + free(contents); + fatal_error("Read error"); + } + contents[fsize] = 0; + ptr = contents - 1; + gNFxConstTable = 0; + do { + ptr++; + gNFxConstTable += (*ptr != '#' && *ptr != '\n'); + ptr = strchr(ptr, '\n'); + } while (ptr != NULL); + if (gNFxConstTable == 0) { + free(contents); + fatal_error("Malformatted CSV file"); + } + gFxConstTable = malloc(gNFxConstTable * sizeof(struct FxConst)); + if (gFxConstTable == NULL) { + free(contents); + fatal_error("Unable to allocate gFxConstTable"); + } + ptr = contents; + for (i = 0; i < gNFxConstTable; i++) { + linetok = strtok_r(ptr, "\n", &linetok_r); + ptr = NULL; + if (linetok == NULL) { + gNFxConstTable = i; + break; + } + if (*linetok == '#') { + i--; + continue; + } + for (j = 0; j < 3; j++) { + commatok = strtok_r(linetok, ",", &commatok_r); + linetok = NULL; + if (commatok == NULL) { + free(contents); + fatal_error("Malformatted CSV file at line %d col %d", i, j); + } + switch (j) { + case 0: + gFxConstTable[i].name = strdup(commatok); + break; + case 1: + for (k = 0; k < len(sFxSpecPtrs); k++) { + if (strcmp(commatok, sFxSpecPtrs[k]->name) == 0) { + break; + } + } + if (k == len(sFxSpecPtrs)) { + free(contents); + fatal_error("Invalid fx type %s", commatok); + } + gFxConstTable[i].fxtype = sFxSpecPtrs[k]; + break; + case 2: + gFxConstTable[i].value = strtod(commatok, NULL); + break; + } + } + } + free(contents); +} + +void FxConstTableEnd(void) { + int i; + if (gFxConstTable != NULL) { + for (i = 0; i < gNFxConstTable; i++) { + if (gFxConstTable[i].name != NULL) { + free(gFxConstTable[i].name); + } + } + free(gFxConstTable); + gFxConstTable = NULL; + } + gNFxConstTable = 0; +} diff --git a/tools/gen_fx_consts/fx_encode.c b/tools/gen_fx_consts/fx_encode.c new file mode 100644 index 0000000000..8110753d78 --- /dev/null +++ b/tools/gen_fx_consts/fx_encode.c @@ -0,0 +1,28 @@ +#include +#include "fx.h" + +long long MakeFix(const struct FxConst *constdef) { + double ret_di, ret_df, value_abs; + long long ret_ii, ret_if, ret_val; + + if (constdef->value == 0) { + return 0LL; + } + + value_abs = constdef->value < 0 ? -constdef->value : constdef->value; + ret_di = floor(value_abs); + ret_df = value_abs - ret_di; + ret_ii = (long long)value_abs * (1LL << constdef->fxtype->fracpart); + ret_if = (long long)(ret_df * (double)(1LL << constdef->fxtype->fracpart) + 0.5); + ret_ii &= ~((1LL << constdef->fxtype->fracpart) - 1); + ret_if &= (1LL << constdef->fxtype->fracpart) - 1; + ret_val = ret_ii + ret_if; + if (constdef->value < 0) { + ret_val = -ret_val; + } + return ret_val; +} + +int GetFxWidth(const struct FxSpec *fxtype) { + return fxtype->fracpart + fxtype->intpart + 1; +} diff --git a/tools/gen_fx_consts/global.h b/tools/gen_fx_consts/global.h new file mode 100644 index 0000000000..b4509536fe --- /dev/null +++ b/tools/gen_fx_consts/global.h @@ -0,0 +1,27 @@ +#ifndef GUARD_GLOBAL_H +#define GUARD_GLOBAL_H + +#include +#include +#include +#include + +#define len(a) ((sizeof(a))/(sizeof(*(a)))) + +static inline noreturn __attribute__((format(printf, 1, 2))) void fatal_error(const char *fmt, ...) { + va_list va_args; + va_start(va_args, fmt); + vfprintf(stderr, fmt, va_args); + va_end(va_args); + fputc('\n', stderr); + exit(1); +} + +#ifndef __clang__ +#undef strlcat +#define strlcat(d,s,n) strncat(d,s,(n)-strlen(d)-1) +#undef strlcpy +#define strlcpy(d,s,n) strncpy(d,s,(n)-1) +#endif //__clang__ + +#endif //GUARD_GLOBAL_H diff --git a/tools/gen_fx_consts/main.c b/tools/gen_fx_consts/main.c new file mode 100644 index 0000000000..19787ced2a --- /dev/null +++ b/tools/gen_fx_consts/main.c @@ -0,0 +1,86 @@ +#include +#include +#include "fx.h" +#include "global.h" + +#define NAMEBUF_SIZ 32 + +static inline void usage(FILE *dest) { + fprintf(dest, "USAGE: gen_fx_consts FILENAME\n\n" + "FILENAME Path to write C header. Guard will be generated\n" + " automatically from the path.\n"); +} + +int main(int argc, char ** argv) { + int i; + char namebuf[NAMEBUF_SIZ] = ""; + char *header_guard; + FILE *outfile; + + FxConstTableInit(); + if (argc < 2) { + outfile = stdout; + header_guard = "NITRO_FX_FX_CONST_H_"; + } else { + outfile = fopen(argv[1], "w"); + if (outfile == NULL) { + fatal_error("Unable to open file '%s' for writing", argv[1]); + } + header_guard = strdup(argv[1]); + if (header_guard == NULL) { + fclose(outfile); + fatal_error("Unable to allocate temp buffer for header guard"); + } + for (i = 0; header_guard[i]; i++) { + switch (header_guard[i]) { + case '.': + case '/': + header_guard[i] = '_'; + break; + default: + header_guard[i] = toupper(header_guard[i]); + break; + } + } + } + fprintf(outfile, "#ifndef %s_\n" + "#define %s_\n\n", header_guard, header_guard); + for (i = 0; i < gNFxConstTable; i++) { + long long value; + int nbyte; + char *suffix; + char *fmtstr; + int j; + value = MakeFix(&gFxConstTable[i]); + nbyte = GetFxWidth(gFxConstTable[i].fxtype) / 8; + switch (nbyte) { + case 2: + suffix = ""; + fmtstr = "#define %-32s ((%s) 0x%04hx%s) // %.12f\n"; + value &= 0xFFFFLL; + break; + case 4: + suffix = "L"; + fmtstr = "#define %-32s ((%s) 0x%08lx%s) // %.12f\n"; + value &= 0xFFFFFFFFLL; + break; + case 8: + suffix = "LL"; + fmtstr = "#define %-32s ((%s) 0x%016llx%s) // %.12f\n"; + break; + default: + fatal_error("invalid integer width: %d", nbyte); + } + snprintf(namebuf, NAMEBUF_SIZ, "%s_%s", gFxConstTable[i].fxtype->name, gFxConstTable[i].name); + for (j = 0; j < NAMEBUF_SIZ && namebuf[j]; j++) { + namebuf[j] = toupper(namebuf[j]); + } + fprintf(outfile, fmtstr, namebuf, gFxConstTable[i].fxtype->name, value, suffix, gFxConstTable[i].value); + } + fprintf(outfile, "\n#endif //%s_\n", header_guard); + if (argc >= 2) { + fclose(outfile); + free(header_guard); + } + return 0; +} diff --git a/tools/mwasmarm_patcher/.gitignore b/tools/mwasmarm_patcher/.gitignore new file mode 100644 index 0000000000..c9b889c594 --- /dev/null +++ b/tools/mwasmarm_patcher/.gitignore @@ -0,0 +1 @@ +mwasmarm_patcher diff --git a/tools/mwasmarm_patcher/Makefile b/tools/mwasmarm_patcher/Makefile new file mode 100644 index 0000000000..ffdf82d980 --- /dev/null +++ b/tools/mwasmarm_patcher/Makefile @@ -0,0 +1,14 @@ +.PHONY: all clean + +CC := gcc +CFLAGS := -O3 + +.PHONY: all clean + +all: mwasmarm_patcher + @: + +clean: ; $(RM) mwasmarm_patcher$(EXE) + +mwasmarm_patcher: mwasmarm_patcher.c + $(CC) $(CFLAGS) -o $@ $< diff --git a/tools/mwasmarm_patcher/mwasmarm_patcher.c b/tools/mwasmarm_patcher/mwasmarm_patcher.c new file mode 100644 index 0000000000..1d7aa2044f --- /dev/null +++ b/tools/mwasmarm_patcher/mwasmarm_patcher.c @@ -0,0 +1,254 @@ +#include +#include +#include +#include +#include + +// mwasmarm patcher v1.2 +// Patches the Metrowerk C compiler assembler to stop the line ending bug and the 0x400 incbin bug. + +// Changelog: +// v1.1: Added patch definitions and looped over them to find the matching +// definition as well as the version. +// v1.2: Switched to array system for applying multiple patches for compiler +// versions and added 0x400 incbin fix for each version. + +struct PatchPair { + int offsetPatch; + int newByte; +}; + +struct PatchDef { + char *version; + char *sha1before; + char *sha1after; + struct PatchPair *patches; +}; + +// Patch definitions for each of the respective assembler versions. +struct PatchPair g12BasePatches[] = { + { 0x57614, 0x5 }, + { 0xD47, 0x8D }, + {0} +}; + +struct PatchPair g20BasePatches[] = { + { 0x57644, 0x5 }, + { 0xD47, 0x8D }, + {0} +}; + +struct PatchPair g20sp2p4Patches[] = { + { 0x57834, 0x5 }, + { 0xD47, 0x8D }, + {0} +}; + +// Table of definitions for each assembler version +struct PatchDef gPatchDefs[] = { + // mwasmarm 1.2/base definition + { + "mwasmarm 1.2/base", + "87f942cc0a0e90e73550d8d6f3fffcdeb5f69fa5", + "3395ac5decf49135d892e93a3e6dd38676025983", + g12BasePatches + }, + // mwasmarm 2.0/base definition + { + "mwasmarm 2.0/base", + "9d63877c776245129b4727b41d3e9e63cfc9cd28", + "ef75c3fb9f8d90cb4881386c41d8dc3ab4de7153", + g20BasePatches + }, + // mwasmarm 2.0/sp2p4 definition + { + "mwasmarm 2.0/sp2p4", + "448cb0c7f1ace4393e9a9562f819f7a9f049be83", + "caa84dd90b1987ab7b42749bd5c9dcfdcfef59f3", + g20sp2p4Patches + }, + {0} +}; + +// --------------------------------------------------------- +// Credit to ax6 for implementation of sha1 hash functions +// --------------------------------------------------------- + +void sha1_process_block (const unsigned char * block, uint32_t * state); + +unsigned char * calculate_sha1 (const void * data, unsigned length) { + uint32_t state[5] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0}; + const char * current; + unsigned remaining; + for (current = data, remaining = length; remaining >= 64; current += 64, remaining -= 64) sha1_process_block((const uint8_t *)current, state); + // technically only {0} is necessary, but better safe than sorry + unsigned char last_block[64] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + memcpy(last_block, current, remaining); + last_block[remaining] = 0x80; + if (remaining >= 56) { + sha1_process_block(last_block, state); + memset(last_block, 0, 64); + } + unsigned long long bit_length = ((unsigned long long) length) << 3; + for (remaining = 5; remaining; remaining --) { + last_block[58 + remaining] = bit_length; + bit_length >>= 8; + } + sha1_process_block(last_block, state); + unsigned char * result = malloc(20); + for (remaining = 0; remaining < 20; remaining ++) result[remaining] = state[remaining >> 2] >> ((~remaining & 3) << 3); + return result; +} + +static inline unsigned sha1_rotate (unsigned value, unsigned count) { + return (value << count) | (value >> (32 - count)); +} + +void sha1_process_block (const unsigned char * block, uint32_t * state) { + uint32_t words[80]; + unsigned pos, temp, count, a, b, c, d, e; + // constants used by SHA-1; they are actually simply the square roots of 2, 3, 5 and 10 as a fixed-point number (2.30 format) + const uint32_t hash_constants[4] = {0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6}; + memset(words, 0, 16 * sizeof(uint32_t)); + for (pos = 0; pos < 64; pos ++) words[pos >> 2] = (words[pos >> 2] << 8) | block[pos]; + for (pos = 16; pos < 80; pos ++) words[pos] = sha1_rotate(words[pos - 3] ^ words[pos - 8] ^ words[pos - 14] ^ words[pos - 16], 1); + a = *state; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + for (pos = 0; pos < 4; pos ++) for (count = 0; count < 20; count ++) { + temp = sha1_rotate(a, 5) + e + words[pos * 20 + count] + hash_constants[pos]; + switch (pos) { + case 0: + temp += (b & c) | (~b & d); + break; + case 2: + temp += (b & c) | (b & d) | (c & d); + break; + default: + temp += b ^ c ^ d; + } + e = d; + d = c; + c = sha1_rotate(b, 30); + b = a; + a = temp; + } + *state += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; +} + +// --------------------------------------------------------- +// ax6 code end +// --------------------------------------------------------- + +__attribute__((format(printf, 1, 2))) +void fatal_printf(char *str, ...) { + va_list args; + va_start(args, str); + vprintf(str, args); + va_end(args); + exit(1); +} + +// return size in bytes +int get_file_size (FILE * fp) { + int curpos = ftell(fp); + fseek(fp, 0, SEEK_END); + int result = ftell(fp); + fseek(fp, curpos, SEEK_SET); + return result; +} + +#define SHA_DIGEST_LENGTH 20 + +void print_help(void) { + printf("Usage:\n" + "\tmwasmarm_patcher [OPTIONS] FILENAME\n\n" + "Arguments:\n" + "\tFILENAME: path to MWASMARM.exe program\n\n" + "OPTIONS:\n" + "\t-q/--quietly: Suppress verbose output\n" + "\t-h/--help: Print this message and exit\n"); +} + +int main(int argc, char *argv[]) { + int quietly = 0; + char* filename = NULL; + for (int i = 1; i < argc; i++) + { + if (argv[i][0] == '-') { + if (strcmp(argv[i], "-q") == 0 || strcmp(argv[i], "--quietly") == 0) + quietly = 1; + else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { + print_help(); + exit(0); + } + else + { + print_help(); + fatal_printf("Unrecognized option: %s\n", argv[i]); + } + } else if (filename != NULL) { + print_help(); + fatal_printf("Excess filename supplied\n"); + } + else + filename = argv[i]; + } + if (filename == NULL) { + print_help(); + fatal_printf("Missing required argument: filename\n"); + } else { + // Open the file and read it's sha1 hash. + FILE *f = fopen(filename, "rb+"); + if (f == NULL) { + fatal_printf("ERROR: No file detected\n"); + } + int fsize = get_file_size(f); + unsigned char *string = malloc(fsize + 1); + if (string == NULL) { + fatal_printf("ERROR: Failed to allocate string variable\n"); + } + int readvar = fread(string, 1, fsize, f); // var to surpress warning + + // Check if sha1 matches either known assembler hashes. + unsigned char *sha1 = calculate_sha1(string, fsize); + if (sha1 == NULL) { + fatal_printf("ERROR: Failed to retrieve sha1 hash\n"); + } + free(string); + + char buf[(SHA_DIGEST_LENGTH*2)+1]; + for (int i=0; i < SHA_DIGEST_LENGTH; i++) { + sprintf(&(buf[i*2]), "%02x", sha1[i]); + } + free(sha1); + + // loop over each patch definition to attempt to locate a supported version and, if + // needed, apply the patch definitions. + for (int i = 0; gPatchDefs[i].sha1before != NULL; i++) { + // check if already patched for the current loop. + if (!strcmp(buf, gPatchDefs[i].sha1after)) { + if (!quietly) printf("Supported patched version detected (%s): no action needed\n", gPatchDefs[i].version); + return 0; + } else if(!strcmp(buf, gPatchDefs[i].sha1before)) { + // we found an unpatched version: apply the patches. + for (int j = 0; gPatchDefs[i].patches[j].offsetPatch != 0; j++) { + fseek(f, gPatchDefs[i].patches[j].offsetPatch, SEEK_SET); + fputc(gPatchDefs[i].patches[j].newByte, f); + } + if (!quietly) printf("Supported unpatched version detected (%s): assembler patched\n", gPatchDefs[i].version); + return 0; + } + } + // Unable to locate supported version, quitting + fatal_printf("ERROR: Unsupported mwasmarm.exe version\n"); + } + return 0; +}