diff --git a/Makefile b/Makefile index ee56319266..ae6246170d 100644 --- a/Makefile +++ b/Makefile @@ -150,12 +150,20 @@ ifneq (,$(MAKECMDGOALS)) endif endif +.SHELLSTATUS ?= 0 + ifeq ($(SETUP_PREREQS),1) # If set on: Default target or a rule requiring a scan # Forcibly execute `make tools` since we need them for what we are doing. - $(call infoshell, $(MAKE) -f make_tools.mk) + $(foreach line, $(shell $(MAKE) -f make_tools.mk | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) + ifneq ($(.SHELLSTATUS),0) + $(error Errors occurred while building tools. See error messages above for more details) + endif # Oh and also generate mapjson sources before we use `SCANINC`. - $(call infoshell, $(MAKE) generated) + $(foreach line, $(shell $(MAKE) generated | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) + ifneq ($(.SHELLSTATUS),0) + $(error Errors occurred while generating map-related sources. See error messages above for more details) + endif endif # Collect sources @@ -237,7 +245,10 @@ include spritesheet_rules.mk include json_data_rules.mk include audio_rules.mk +# NOTE: Tools must have been built prior (FIXME) +# so you can't really call this rule directly generated: $(AUTO_GEN_TARGETS) + @: # Silence the "Nothing to be done for `generated'" message, which some people were confusing for an error. %.s: ; %.png: ; @@ -252,8 +263,6 @@ generated: $(AUTO_GEN_TARGETS) %.lz: % ; $(GFX) $< $@ %.rl: % ; $(GFX) $< $@ -# NOTE: Tools must have been built prior (FIXME) -generated: tools $(AUTO_GEN_TARGETS) clean-generated: -rm -f $(AUTO_GEN_TARGETS) @@ -287,69 +296,52 @@ endif # As a side effect, they're evaluated immediately instead of when the rule is invoked. # It doesn't look like $(shell) can be deferred so there might not be a better way (Icedude_907: there is soon). -# For C dependencies. -# Args: $1 = Output file without extension (build/assets/src/data), $2 = Input file (src/data.c) -define C_DEP -$(call C_DEP_IMPL,$1,$2,$1) -endef -# Internal implementation details. -# $1: Output file without extension, $2 input file, $3 temp path (if keeping) -define C_DEP_IMPL -$1.o: $2 +$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.c ifneq ($(KEEP_TEMPS),1) - @echo "$$(CC1) -o $$@ $$<" - @$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) -i $$< charmap.txt | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ - + @echo "$(CC1) -o $@ $<" + @$(CPP) $(CPPFLAGS) $< | $(PREPROC) -i $< charmap.txt | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ - else - @$$(CPP) $$(CPPFLAGS) $$< -o $3.i - @$$(PREPROC) $3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $3.s - @echo -e ".text\n\t.align\t2, 0 @ Don't pad with nop\n" >> $3.s - $$(AS) $$(ASFLAGS) -o $$@ $3.s + @$(CPP) $(CPPFLAGS) $< -o $*.i + @$(PREPROC) $*.i charmap.txt | $(CC1) $(CFLAGS) -o $*.s + @echo -e ".text\n\t.align\t2, 0\n" >> $*.s + $(AS) $(ASFLAGS) -o $@ $*.s endif + +$(C_BUILDDIR)/%.d: $(C_SUBDIR)/%.c + $(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I tools/agbcc/include $< + ifneq ($(NODEP),1) -$1.d: $2 - $(SCANINC) -M $1.d $(INCLUDE_SCANINC_ARGS) -I tools/agbcc/include $2 --include $1.d +-include $(addprefix $(OBJ_DIR)/,$(C_SRCS:.c=.d)) endif -endef -# Create generic rules if no dependency scanning, else create the real rules -ifeq ($(NODEP),1) -$(eval $(call C_DEP,$(C_BUILDDIR)/%,$(C_SUBDIR)/%.c)) -else -$(foreach src,$(C_SRCS),$(eval $(call C_DEP,$(OBJ_DIR)/$(basename $(src)),$(src)))) +$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s + $(AS) $(ASFLAGS) -o $@ $< + +$(ASM_BUILDDIR)/%.d: $(ASM_SUBDIR)/%.s + $(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I "" $< + +ifneq ($(NODEP),1) +-include $(addprefix $(OBJ_DIR)/,$(ASM_SRCS:.s=.d)) endif -# Similar methodology for Assembly files -# $1: Output path without extension, $2: Input file (`*.s`) -define ASM_DEP -$1.o: $2 - $$(AS) $$(ASFLAGS) -o $$@ $$< -$(call ASM_SCANINC,$1,$2) -endef -# As above but first doing a preprocessor pass -define ASM_DEP_PREPROC -$1.o: $2 - $$(PREPROC) $$< charmap.txt | $$(CPP) $(INCLUDE_SCANINC_ARGS) - | $$(PREPROC) -ie $$< charmap.txt | $$(AS) $$(ASFLAGS) -o $$@ -$(call ASM_SCANINC,$1,$2) -endef - -define ASM_SCANINC +$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s + $(PREPROC) $< charmap.txt | $(CPP) $(INCLUDE_SCANINC_ARGS) - | $(PREPROC) -ie $< charmap.txt | $(AS) $(ASFLAGS) -o $@ + +$(C_BUILDDIR)/%.d: $(C_SUBDIR)/%.s + $(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I "" $< + ifneq ($(NODEP),1) -$1.d: $2 - $(SCANINC) -M $1.d $(INCLUDE_SCANINC_ARGS) -I "" $2 --include $1.d +-include $(addprefix $(OBJ_DIR)/,$(C_ASM_SRCS:.s=.d)) endif -endef -# Dummy rules or real rules -ifeq ($(NODEP),1) -$(eval $(call ASM_DEP,$(ASM_BUILDDIR)/%,$(ASM_SUBDIR)/%.s)) -$(eval $(call ASM_DEP_PREPROC,$(C_BUILDDIR)/%,$(C_SUBDIR)/%.s)) -$(eval $(call ASM_DEP_PREPROC,$(DATA_ASM_BUILDDIR)/%,$(DATA_ASM_SUBDIR)/%.s)) -else -$(foreach src, $(ASM_SRCS), $(eval $(call ASM_DEP,$(src:%.s=$(OBJ_DIR)/%),$(src)))) -$(foreach src, $(C_ASM_SRCS), $(eval $(call ASM_DEP_PREPROC,$(src:%.s=$(OBJ_DIR)/%),$(src)))) -$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call ASM_DEP_PREPROC,$(src:%.s=$(OBJ_DIR)/%),$(src)))) +$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s + $(PREPROC) $< charmap.txt | $(CPP) $(INCLUDE_SCANINC_ARGS) - | $(PREPROC) -ie $< charmap.txt | $(AS) $(ASFLAGS) -o $@ + +$(DATA_ASM_BUILDDIR)/%.d: $(DATA_ASM_SUBDIR)/%.s + $(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I "" $< + +ifneq ($(NODEP),1) +-include $(addprefix $(OBJ_DIR)/,$(REGULAR_DATA_ASM_SRCS:.s=.d)) endif $(OBJ_DIR)/sym_bss.ld: sym_bss.txt @@ -373,8 +365,10 @@ endif # Final rules # Elf from object files +LDFLAGS = -Map ../../$(MAP) $(ELF): $(LD_SCRIPT) $(LD_SCRIPT_DEPS) $(OBJS) @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat + @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ | cat" $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(GAME_REVISION) --silent # Builds the rom from the elf file diff --git a/common_syms/AgbRfu_LinkManager.txt b/common_syms/AgbRfu_LinkManager.txt deleted file mode 100644 index 7ff8cd53dd..0000000000 --- a/common_syms/AgbRfu_LinkManager.txt +++ /dev/null @@ -1 +0,0 @@ -lman diff --git a/common_syms/agb_flash.txt b/common_syms/agb_flash.txt deleted file mode 100644 index cb421ec80d..0000000000 --- a/common_syms/agb_flash.txt +++ /dev/null @@ -1,10 +0,0 @@ -gFlashTimeoutFlag -PollFlashStatus -WaitForFlashWrite -ProgramFlashSector -gFlash -ProgramFlashByte -gFlashNumRemainingBytes -EraseFlashChip -EraseFlashSector -gFlashMaxTime diff --git a/common_syms/battle_anim_special.txt b/common_syms/battle_anim_special.txt deleted file mode 100644 index 5e2e8b3ff3..0000000000 --- a/common_syms/battle_anim_special.txt +++ /dev/null @@ -1,3 +0,0 @@ -gMonShrinkDuration -gMonShrinkDelta -gMonShrinkDistance diff --git a/common_syms/battle_controller_pokedude.txt b/common_syms/battle_controller_pokedude.txt deleted file mode 100644 index c96cab7710..0000000000 --- a/common_syms/battle_controller_pokedude.txt +++ /dev/null @@ -1 +0,0 @@ -gPokedudeBattlerStates diff --git a/common_syms/battle_main.txt b/common_syms/battle_main.txt deleted file mode 100644 index f6f02c48d3..0000000000 --- a/common_syms/battle_main.txt +++ /dev/null @@ -1,9 +0,0 @@ -gPreBattleCallback1 -gBattleMainFunc -gBattleResults -gLeveledUpInBattle -gBattlerControllerFuncs -gHealthboxSpriteIds -gMultiUsePlayerCursor -gNumberOfMovesToChoose -gBattleControllerData diff --git a/common_syms/berry_fix_program.txt b/common_syms/berry_fix_program.txt deleted file mode 100644 index f042474923..0000000000 --- a/common_syms/berry_fix_program.txt +++ /dev/null @@ -1,4 +0,0 @@ -gMultibootStart -gMultibootStatus -gMultibootSize -gMultibootParam diff --git a/common_syms/bg.txt b/common_syms/bg.txt deleted file mode 100644 index 0a3c3aecca..0000000000 --- a/common_syms/bg.txt +++ /dev/null @@ -1 +0,0 @@ -gWindowTileAutoAllocEnabled diff --git a/common_syms/cable_club.txt b/common_syms/cable_club.txt deleted file mode 100644 index 9cdf633b53..0000000000 --- a/common_syms/cable_club.txt +++ /dev/null @@ -1 +0,0 @@ -UnusedVarNeededToMatch diff --git a/common_syms/ereader_screen.txt b/common_syms/ereader_screen.txt deleted file mode 100644 index 2189eedbc9..0000000000 --- a/common_syms/ereader_screen.txt +++ /dev/null @@ -1 +0,0 @@ -gEReaderData diff --git a/common_syms/event_data.txt b/common_syms/event_data.txt deleted file mode 100644 index 6d9f585d7d..0000000000 --- a/common_syms/event_data.txt +++ /dev/null @@ -1 +0,0 @@ -gLastQuestLogStoredFlagOrVarIdx diff --git a/common_syms/evolution_scene.txt b/common_syms/evolution_scene.txt deleted file mode 100644 index 137cd3e05d..0000000000 --- a/common_syms/evolution_scene.txt +++ /dev/null @@ -1 +0,0 @@ -gCB2_AfterEvolution diff --git a/common_syms/fame_checker.txt b/common_syms/fame_checker.txt deleted file mode 100644 index c23bd9a2ac..0000000000 --- a/common_syms/fame_checker.txt +++ /dev/null @@ -1,2 +0,0 @@ -gFameChecker_ListMenuTemplate -gIconDescriptionBoxIsOpen diff --git a/common_syms/field_camera.txt b/common_syms/field_camera.txt deleted file mode 100644 index 02301ce23c..0000000000 --- a/common_syms/field_camera.txt +++ /dev/null @@ -1,3 +0,0 @@ -gFieldCamera -gTotalCameraPixelOffsetY -gTotalCameraPixelOffsetX diff --git a/common_syms/field_control_avatar.txt b/common_syms/field_control_avatar.txt deleted file mode 100644 index c243b56ecd..0000000000 --- a/common_syms/field_control_avatar.txt +++ /dev/null @@ -1 +0,0 @@ -gFieldInputRecord diff --git a/common_syms/field_specials.txt b/common_syms/field_specials.txt deleted file mode 100644 index 04599f921c..0000000000 --- a/common_syms/field_specials.txt +++ /dev/null @@ -1,2 +0,0 @@ -sFieldSpecialsListMenuTemplate -sFieldSpecialsListMenuScrollBuffer diff --git a/common_syms/fieldmap.txt b/common_syms/fieldmap.txt deleted file mode 100644 index dedf055bdc..0000000000 --- a/common_syms/fieldmap.txt +++ /dev/null @@ -1 +0,0 @@ -VMap diff --git a/common_syms/help_system.txt b/common_syms/help_system.txt deleted file mode 100644 index 20475eeb95..0000000000 --- a/common_syms/help_system.txt +++ /dev/null @@ -1,2 +0,0 @@ -gHelpSystemState -gHelpContextIdBackup diff --git a/common_syms/help_system_util.txt b/common_syms/help_system_util.txt deleted file mode 100644 index af59733d43..0000000000 --- a/common_syms/help_system_util.txt +++ /dev/null @@ -1 +0,0 @@ -gHelpSystemEnabled diff --git a/common_syms/image_processing_effects.txt b/common_syms/image_processing_effects.txt deleted file mode 100644 index 134f7e88b2..0000000000 --- a/common_syms/image_processing_effects.txt +++ /dev/null @@ -1,10 +0,0 @@ -gCanvasColumnStart -gCanvasPixels -gCanvasRowEnd -gCanvasHeight -gCanvasColumnEnd -gCanvasRowStart -gCanvasMonPersonality -gCanvasWidth -gCanvasPalette -gCanvasPaletteStart diff --git a/common_syms/librfu_rfu.txt b/common_syms/librfu_rfu.txt deleted file mode 100644 index 4b742dcd25..0000000000 --- a/common_syms/librfu_rfu.txt +++ /dev/null @@ -1,5 +0,0 @@ -gRfuSlotStatusUNI -gRfuSlotStatusNI -gRfuLinkStatus -gRfuStatic -gRfuFixed diff --git a/common_syms/librfu_sio32id.txt b/common_syms/librfu_sio32id.txt deleted file mode 100644 index 97395e84b3..0000000000 --- a/common_syms/librfu_sio32id.txt +++ /dev/null @@ -1 +0,0 @@ -gRfuSIO32Id diff --git a/common_syms/librfu_stwi.txt b/common_syms/librfu_stwi.txt deleted file mode 100644 index a1f7735535..0000000000 --- a/common_syms/librfu_stwi.txt +++ /dev/null @@ -1 +0,0 @@ -gSTWIStatus diff --git a/common_syms/link.txt b/common_syms/link.txt deleted file mode 100644 index 4118d1eb4b..0000000000 --- a/common_syms/link.txt +++ /dev/null @@ -1,35 +0,0 @@ -gLinkPartnersHeldKeys -gLinkDebugSeed -gLocalLinkPlayerBlock -gLinkErrorOccurred -gLinkDebugFlags -gLinkFiller1 -gRemoteLinkPlayersNotReceived -gBlockReceivedStatus -gLinkFiller2 -gLinkHeldKeys -gRecvCmds -gLinkStatus -gLinkDummy1 -gLinkDummy2 -gReadyToExitStandby -gReadyToCloseLink -gReadyCloseLinkType -gSuppressLinkErrorMessage -gWirelessCommType -gSavedLinkPlayerCount -gSendCmd -gSavedMultiplayerId -gReceivedRemoteLinkPlayers -gLinkTestBGInfo -gLinkCallback -gShouldAdvanceLinkState -gLinkTestBlockChecksums -gBlockRequestType -gLinkFiller3 -gLinkFiller4 -gLinkFiller5 -gLastSendQueueCount -gLink -gLastRecvQueueCount -gLinkSavedIme diff --git a/common_syms/link_rfu_2.txt b/common_syms/link_rfu_2.txt deleted file mode 100644 index 3a84c23bf1..0000000000 --- a/common_syms/link_rfu_2.txt +++ /dev/null @@ -1,3 +0,0 @@ -gHostRfuGameData -gRfu -gHostRfuUsername diff --git a/common_syms/list_menu.txt b/common_syms/list_menu.txt deleted file mode 100644 index ed5343618c..0000000000 --- a/common_syms/list_menu.txt +++ /dev/null @@ -1,2 +0,0 @@ -gListMenuOverride -gMultiuseListMenuTemplate diff --git a/common_syms/load_save.txt b/common_syms/load_save.txt deleted file mode 100644 index 2d3d9b802f..0000000000 --- a/common_syms/load_save.txt +++ /dev/null @@ -1,4 +0,0 @@ -gFlashMemoryPresent -gSaveBlock1Ptr -gSaveBlock2Ptr -gPokemonStoragePtr diff --git a/common_syms/m4a.txt b/common_syms/m4a.txt deleted file mode 100644 index 6e7b3c93e7..0000000000 --- a/common_syms/m4a.txt +++ /dev/null @@ -1,12 +0,0 @@ -gSoundInfo -gPokemonCrySongs -gPokemonCryMusicPlayers -gMPlayJumpTable -gCgbChans -gPokemonCryTracks -gPokemonCrySong -gMPlayInfo_BGM -gMPlayInfo_SE1 -gMPlayInfo_SE2 -gMPlayMemAccArea -gMPlayInfo_SE3 diff --git a/common_syms/main.txt b/common_syms/main.txt deleted file mode 100644 index b1f274b58d..0000000000 --- a/common_syms/main.txt +++ /dev/null @@ -1,12 +0,0 @@ -gKeyRepeatStartDelay -gLinkTransferringData -gMain -gKeyRepeatContinueDelay -gSoftResetDisabled -gIntrTable -sVcountAfterSound -gLinkVSyncDisabled -IntrMain_Buffer -sVcountAtIntr -sVcountBeforeSound -gPcmDmaCounter diff --git a/common_syms/overworld.txt b/common_syms/overworld.txt deleted file mode 100644 index e2aec44b17..0000000000 --- a/common_syms/overworld.txt +++ /dev/null @@ -1,8 +0,0 @@ -gBGTilemapBuffers1 -gBGTilemapBuffers2 -gBGTilemapBuffers3 -gFieldCallback -gFieldCallback2 -gHeldKeyCodeToSend -gLocalLinkPlayerId -gFieldLinkPlayerCount diff --git a/common_syms/party_menu.txt b/common_syms/party_menu.txt deleted file mode 100644 index 6ed37392c2..0000000000 --- a/common_syms/party_menu.txt +++ /dev/null @@ -1 +0,0 @@ -gItemUseCB diff --git a/common_syms/quest_log.txt b/common_syms/quest_log.txt deleted file mode 100644 index e5e3ec49c7..0000000000 --- a/common_syms/quest_log.txt +++ /dev/null @@ -1,4 +0,0 @@ -gQuestLogPlaybackState -sMaxActionsInScene -gQuestLogFieldInput -sCurSceneActions diff --git a/common_syms/random.txt b/common_syms/random.txt deleted file mode 100644 index 794439ea51..0000000000 --- a/common_syms/random.txt +++ /dev/null @@ -1 +0,0 @@ -gRngValue diff --git a/common_syms/save.txt b/common_syms/save.txt deleted file mode 100644 index 8b2ecc95a2..0000000000 --- a/common_syms/save.txt +++ /dev/null @@ -1,12 +0,0 @@ -gLastWrittenSector -gLastSaveCounter -gLastKnownGoodSector -gDamagedSaveSectors -gSaveCounter -gSaveDataBufferPtr -gIncrementalSectorId -gSaveUnusedVar -gSaveFileStatus -gGameContinueCallback -gRamSaveSectorLocations -gSaveAttemptStatus diff --git a/common_syms/save_failed_screen.txt b/common_syms/save_failed_screen.txt deleted file mode 100644 index caab09b266..0000000000 --- a/common_syms/save_failed_screen.txt +++ /dev/null @@ -1 +0,0 @@ -sIsInSaveFailedScreen diff --git a/common_syms/scrcmd.txt b/common_syms/scrcmd.txt deleted file mode 100644 index bfc21e41f3..0000000000 --- a/common_syms/scrcmd.txt +++ /dev/null @@ -1,2 +0,0 @@ -sQuestLogScriptContextPtr -gSelectedObjectEvent diff --git a/common_syms/sound.txt b/common_syms/sound.txt deleted file mode 100644 index 0f6f2fc758..0000000000 --- a/common_syms/sound.txt +++ /dev/null @@ -1 +0,0 @@ -gDisableMusic diff --git a/common_syms/sprite.txt b/common_syms/sprite.txt deleted file mode 100644 index 627c01c0d0..0000000000 --- a/common_syms/sprite.txt +++ /dev/null @@ -1,2 +0,0 @@ -gOamMatrixAllocBitmap -gReservedSpritePaletteCount diff --git a/common_syms/task.txt b/common_syms/task.txt deleted file mode 100644 index 6601bd11bb..0000000000 --- a/common_syms/task.txt +++ /dev/null @@ -1 +0,0 @@ -gTasks diff --git a/common_syms/text.txt b/common_syms/text.txt deleted file mode 100644 index dbaaa0b494..0000000000 --- a/common_syms/text.txt +++ /dev/null @@ -1 +0,0 @@ -gTextFlags diff --git a/common_syms/text_printer.txt b/common_syms/text_printer.txt deleted file mode 100644 index 38452e46d7..0000000000 --- a/common_syms/text_printer.txt +++ /dev/null @@ -1,2 +0,0 @@ -gFonts -gGlyphInfo diff --git a/common_syms/window.txt b/common_syms/window.txt deleted file mode 100644 index 0371083ce6..0000000000 --- a/common_syms/window.txt +++ /dev/null @@ -1,2 +0,0 @@ -gWindowClearTile -gWindowBgTilemapBuffers diff --git a/include/gba/defines.h b/include/gba/defines.h index 46c722a1ae..5521e942c0 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -13,6 +13,7 @@ #define IWRAM_DATA __attribute__((section("iwram_data"))) #define EWRAM_DATA __attribute__((section("ewram_data"))) #endif +#define COMMON_DATA __attribute__((section("common_data"))) #if MODERN #define NOINLINE __attribute__((noinline)) diff --git a/ld_script.ld b/ld_script.ld index 1d2bbf29d9..3bbcfc8fa6 100644 --- a/ld_script.ld +++ b/ld_script.ld @@ -38,6 +38,7 @@ SECTIONS { /* COMMON starts at 0x30030E0 */ INCLUDE "sym_common.ld" + src/*.o(COMMON); *libc.a:sbrkr.o(COMMON); end = .; diff --git a/ld_script_modern.ld b/ld_script_modern.ld index 76f4536fb9..2b5eb546df 100644 --- a/ld_script_modern.ld +++ b/ld_script_modern.ld @@ -30,6 +30,7 @@ SECTIONS { /* COMMON starts at 0x30022A8 */ *(COMMON); + *(common_data); end = .; __end__ = .; } > IWRAM diff --git a/src/AgbRfu_LinkManager.c b/src/AgbRfu_LinkManager.c index 558b195144..0f05013936 100644 --- a/src/AgbRfu_LinkManager.c +++ b/src/AgbRfu_LinkManager.c @@ -14,7 +14,7 @@ #define FSP_ON 0x01 #define FSP_START 0x02 -LINK_MANAGER lman; +COMMON_DATA LINK_MANAGER lman = {0}; static void rfu_LMAN_clearVariables(void); static void rfu_LMAN_settingPCSWITCH(u32 rand); diff --git a/src/agb_flash.c b/src/agb_flash.c index 0b454a41a7..08aeed1638 100644 --- a/src/agb_flash.c +++ b/src/agb_flash.c @@ -6,16 +6,16 @@ static u16 sTimerCount; static vu16 *sTimerReg; static u16 sSavedIme; -u8 gFlashTimeoutFlag; -u8 (*PollFlashStatus)(u8 *); -u16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData); -u16 (*ProgramFlashSector)(u16 sectorNum, void *src); -const struct FlashType *gFlash; -u16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data); -u16 gFlashNumRemainingBytes; -u16 (*EraseFlashChip)(); -u16 (*EraseFlashSector)(u16 sectorNum); -const u16 *gFlashMaxTime; +COMMON_DATA u8 gFlashTimeoutFlag = 0; +COMMON_DATA u8 (*PollFlashStatus)(u8 *) = NULL; +COMMON_DATA u16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData) = NULL; +COMMON_DATA u16 (*ProgramFlashSector)(u16 sectorNum, void *src) = NULL; +COMMON_DATA const struct FlashType *gFlash = NULL; +COMMON_DATA u16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data) = NULL; +COMMON_DATA u16 gFlashNumRemainingBytes = 0; +COMMON_DATA u16 (*EraseFlashChip)() = NULL; +COMMON_DATA u16 (*EraseFlashSector)(u16 sectorNum) = NULL; +COMMON_DATA const u16 *gFlashMaxTime = NULL; void SetReadFlash1(u16 *dest); diff --git a/src/battle_anim_special.c b/src/battle_anim_special.c index 183f861966..23eb9ebe4f 100644 --- a/src/battle_anim_special.c +++ b/src/battle_anim_special.c @@ -30,9 +30,9 @@ #define TAG_PARTICLES_LUXURYBALL 55030 #define TAG_PARTICLES_PREMIERBALL 55031 -u32 gMonShrinkDuration; -u16 gMonShrinkDelta; -u16 gMonShrinkDistance; +COMMON_DATA u32 gMonShrinkDuration = 0; +COMMON_DATA u16 gMonShrinkDelta = 0; +COMMON_DATA u16 gMonShrinkDistance = 0; static void AnimTask_UnusedLevelUpHealthBox_Step(u8); static void AnimTask_FlashHealthboxOnLevelUp_Step(u8); diff --git a/src/battle_controller_pokedude.c b/src/battle_controller_pokedude.c index 62c259c040..f6307236c5 100644 --- a/src/battle_controller_pokedude.c +++ b/src/battle_controller_pokedude.c @@ -2424,7 +2424,7 @@ static const struct PokedudeBattlePartyInfo *const sPokedudeBattlePartyPointers[ [TTVSCR_CATCHING] = sParties_Catching, }; -struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT]; +COMMON_DATA struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT] = {0}; static void PokedudeSimulateInputChooseAction(void) { diff --git a/src/battle_main.c b/src/battle_main.c index dc52024d2b..4c3e927a0a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -220,15 +220,15 @@ EWRAM_DATA u16 gBattleMovePower = 0; EWRAM_DATA u16 gMoveToLearn = 0; EWRAM_DATA u8 gBattleMonForms[MAX_BATTLERS_COUNT] = {0}; -void (*gPreBattleCallback1)(void); -void (*gBattleMainFunc)(void); -struct BattleResults gBattleResults; -u8 gLeveledUpInBattle; -void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void); -u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT]; -u8 gMultiUsePlayerCursor; -u8 gNumberOfMovesToChoose; -u8 gBattleControllerData[MAX_BATTLERS_COUNT]; +COMMON_DATA void (*gPreBattleCallback1)(void) = NULL; +COMMON_DATA void (*gBattleMainFunc)(void) = NULL; +COMMON_DATA struct BattleResults gBattleResults = {0}; +COMMON_DATA u8 gLeveledUpInBattle = 0; +COMMON_DATA void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void) = {0}; +COMMON_DATA u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT] = {0}; +COMMON_DATA u8 gMultiUsePlayerCursor = 0; +COMMON_DATA u8 gNumberOfMovesToChoose = 0; +COMMON_DATA u8 gBattleControllerData[MAX_BATTLERS_COUNT] = {0}; static const struct ScanlineEffectParams sIntroScanlineParams16Bit = { diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index 67aece9a1e..4ef103aeca 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -32,10 +32,10 @@ enum { STATE_RETRY, }; -const void *gMultibootStart; -int gMultibootStatus; -size_t gMultibootSize; -struct MultiBootParam gMultibootParam; +COMMON_DATA const void *gMultibootStart = NULL; +COMMON_DATA int gMultibootStatus = 0; +COMMON_DATA size_t gMultibootSize = 0; +COMMON_DATA struct MultiBootParam gMultibootParam = {0}; static void CB2_BerryFix(void); static void Task_BerryFixMain(u8 taskId); diff --git a/src/bg.c b/src/bg.c index 251f426168..aa11ae01f8 100644 --- a/src/bg.c +++ b/src/bg.c @@ -43,7 +43,7 @@ static struct BgConfig2 sGpuBgConfigs2[4]; static u32 sDmaBusyBitfield[4]; static u8 gpu_tile_allocation_map_bg[0x100]; -bool32 gWindowTileAutoAllocEnabled; +COMMON_DATA bool32 gWindowTileAutoAllocEnabled = 0; static const struct BgConfig sZeroedBgControlStruct = { 0 }; diff --git a/src/cable_club.c b/src/cable_club.c index f1869b83fb..23c9b940ac 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -27,7 +27,7 @@ #include "constants/field_weather.h" #include "constants/maps.h" -u32 UnusedVarNeededToMatch[8]; +COMMON_DATA u32 UnusedVarNeededToMatch[8] = {0}; static void Task_LinkupStart(u8 taskId); static void Task_LinkupAwaitConnection(u8 taskId); diff --git a/src/ereader_screen.c b/src/ereader_screen.c index 060150cbfb..20ec25d015 100644 --- a/src/ereader_screen.c +++ b/src/ereader_screen.c @@ -41,7 +41,7 @@ struct EReaderData static void Task_EReader(u8); -struct EReaderData gEReaderData; +COMMON_DATA struct EReaderData gEReaderData = {0}; extern const u8 gMultiBootProgram_EReader_Start[]; extern const u8 gMultiBootProgram_EReader_End[]; diff --git a/src/event_data.c b/src/event_data.c index fa393a47ce..da9391cf0e 100644 --- a/src/event_data.c +++ b/src/event_data.c @@ -35,7 +35,7 @@ EWRAM_DATA u16 gSpecialVar_PrevTextColor = 0; EWRAM_DATA u16 gSpecialVar_0x8014 = 0; EWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_SIZE] = {}; -u16 gLastQuestLogStoredFlagOrVarIdx; +COMMON_DATA u16 gLastQuestLogStoredFlagOrVarIdx = 0; extern u16 *const gSpecialVars[]; diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 5e505e336b..442aa15ff7 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -43,7 +43,7 @@ static EWRAM_DATA struct EvoInfo *sEvoStructPtr = NULL; static EWRAM_DATA u16 *sBgAnimPal = NULL; // IWRAM common -void (*gCB2_AfterEvolution)(void); +COMMON_DATA void (*gCB2_AfterEvolution)(void) = NULL; #define sEvoCursorPos gBattleCommunication[1] // when learning a new move #define sEvoGraphicsTaskId gBattleCommunication[2] diff --git a/src/fame_checker.c b/src/fame_checker.c index 3c0c769633..ea1724922f 100644 --- a/src/fame_checker.c +++ b/src/fame_checker.c @@ -57,8 +57,8 @@ static EWRAM_DATA struct FameCheckerData * sFameCheckerData = NULL; static EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL; static EWRAM_DATA s32 sLastMenuIdx = 0; -struct ListMenuTemplate gFameChecker_ListMenuTemplate; -u8 gIconDescriptionBoxIsOpen; +COMMON_DATA struct ListMenuTemplate gFameChecker_ListMenuTemplate = {0}; +COMMON_DATA u8 gIconDescriptionBoxIsOpen = 0; static void MainCB2_LoadFameChecker(void); static void LoadUISpriteSheetsAndPalettes(void); diff --git a/src/field_camera.c b/src/field_camera.c index e2839d76ee..e8d4019075 100644 --- a/src/field_camera.c +++ b/src/field_camera.c @@ -37,9 +37,9 @@ static s16 sVerticalCameraPan; static u8 sBikeCameraPanFlag; static void (*sFieldCameraPanningCallback)(void); -struct CameraObject gFieldCamera; -u16 gTotalCameraPixelOffsetY; -u16 gTotalCameraPixelOffsetX; +COMMON_DATA struct CameraObject gFieldCamera = {0}; +COMMON_DATA u16 gTotalCameraPixelOffsetY = 0; +COMMON_DATA u16 gTotalCameraPixelOffsetX = 0; // text static void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraOffset *cameraOffset) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 78c478db5c..b1f4291e20 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -71,7 +71,7 @@ static bool8 TryDoorWarp(struct MapPosition * position, u16 metatileBehavior, u8 static s8 GetWarpEventAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z); static const u8 *GetCoordEventScriptAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z); -struct FieldInput gFieldInputRecord; +COMMON_DATA struct FieldInput gFieldInputRecord = {0}; void FieldClearPlayerInput(struct FieldInput *input) { diff --git a/src/field_specials.c b/src/field_specials.c index c2a9944cc1..d7dbb6f81b 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -50,8 +50,8 @@ static EWRAM_DATA u16 sListMenuLastScrollPosition = 0; static EWRAM_DATA u8 sPCBoxToSendMon = 0; static EWRAM_DATA u8 sBrailleTextCursorSpriteID = 0; -struct ListMenuTemplate sFieldSpecialsListMenuTemplate; -u16 sFieldSpecialsListMenuScrollBuffer; +COMMON_DATA struct ListMenuTemplate sFieldSpecialsListMenuTemplate = {0}; +COMMON_DATA u16 sFieldSpecialsListMenuScrollBuffer = 0; static void Task_AnimatePcTurnOn(u8 taskId); static void PcTurnOnUpdateMetatileId(bool16 flag); diff --git a/src/fieldmap.c b/src/fieldmap.c index bd69c05330..4156777229 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -14,7 +14,7 @@ struct ConnectionFlags u8 east:1; }; -struct BackupMapLayout VMap; +COMMON_DATA struct BackupMapLayout VMap = {0}; EWRAM_DATA u16 gBackupMapData[VIRTUAL_MAP_SIZE] = {}; EWRAM_DATA struct MapHeader gMapHeader = {}; EWRAM_DATA struct Camera gCamera = {}; diff --git a/src/help_system.c b/src/help_system.c index b178fd6abe..5f57730ce4 100644 --- a/src/help_system.c +++ b/src/help_system.c @@ -51,8 +51,8 @@ struct HelpSystemState u8 scrollSub; }; -struct HelpSystemState gHelpSystemState; -u16 gHelpContextIdBackup; +COMMON_DATA struct HelpSystemState gHelpSystemState = {0}; +COMMON_DATA u16 gHelpContextIdBackup = 0; static bool32 IsCurrentMapInArray(const u16 * mapIdxs); static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); diff --git a/src/help_system_util.c b/src/help_system_util.c index 546fda9340..d07881e00a 100644 --- a/src/help_system_util.c +++ b/src/help_system_util.c @@ -10,7 +10,7 @@ #define ZERO 0 -bool8 gHelpSystemEnabled; +COMMON_DATA bool8 gHelpSystemEnabled = 0; struct HelpSystemVideoState { diff --git a/src/image_processing_effects.c b/src/image_processing_effects.c index 01364c354e..d0213527e1 100644 --- a/src/image_processing_effects.c +++ b/src/image_processing_effects.c @@ -2,16 +2,16 @@ #include "image_processing_effects.h" // IWRAM common -u8 gCanvasColumnStart; -u16 (*gCanvasPixels)[][32]; -u8 gCanvasRowEnd; -u8 gCanvasHeight; -u8 gCanvasColumnEnd; -u8 gCanvasRowStart; -u8 gCanvasMonPersonality; -u8 gCanvasWidth; -u16 *gCanvasPalette; -u16 gCanvasPaletteStart; +COMMON_DATA u8 gCanvasColumnStart = 0; +COMMON_DATA u16 (*gCanvasPixels)[][32] = {0}; +COMMON_DATA u8 gCanvasRowEnd = 0; +COMMON_DATA u8 gCanvasHeight = 0; +COMMON_DATA u8 gCanvasColumnEnd = 0; +COMMON_DATA u8 gCanvasRowStart = 0; +COMMON_DATA u8 gCanvasMonPersonality = 0; +COMMON_DATA u8 gCanvasWidth = 0; +COMMON_DATA u16 *gCanvasPalette = NULL; +COMMON_DATA u16 gCanvasPaletteStart = 0; static void ApplyImageEffect_Pointillism(void); static void ApplyImageEffect_Blur(void); diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index 69fbbd13f0..0bfa13abb7 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -68,11 +68,11 @@ static void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuLocalStruct *, con static void rfu_STC_NI_initSlot_asRecvDataEntity(u8, struct NIComm *); static void rfu_STC_NI_initSlot_asRecvControllData(u8, struct NIComm *); -struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX]; -struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX]; -struct RfuLinkStatus *gRfuLinkStatus; -struct RfuStatic *gRfuStatic; -struct RfuFixed *gRfuFixed; +COMMON_DATA struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX] = {0}; +COMMON_DATA struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX] = {0}; +COMMON_DATA struct RfuLinkStatus *gRfuLinkStatus = NULL; +COMMON_DATA struct RfuStatic *gRfuStatic = NULL; +COMMON_DATA struct RfuFixed *gRfuFixed = NULL; static const struct LLSFStruct llsf_struct[2] = { [MODE_CHILD] = { diff --git a/src/librfu_sio32id.c b/src/librfu_sio32id.c index d726bca7be..56a18d293e 100644 --- a/src/librfu_sio32id.c +++ b/src/librfu_sio32id.c @@ -15,7 +15,7 @@ struct RfuSIO32Id u16 lastId; }; -struct RfuSIO32Id gRfuSIO32Id; +COMMON_DATA struct RfuSIO32Id gRfuSIO32Id = {0}; static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO static const char Sio32IDLib_Var[] = "Sio32ID_030820"; diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c index fb90cb452a..7b3b486cae 100644 --- a/src/librfu_stwi.c +++ b/src/librfu_stwi.c @@ -8,7 +8,7 @@ static void STWI_stop_timer(void); static s32 STWI_restart_Command(void); static s32 STWI_reset_ClockCounter(void); -struct STWIStatus *gSTWIStatus; +COMMON_DATA struct STWIStatus *gSTWIStatus = NULL; void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) { diff --git a/src/link.c b/src/link.c index f883db4821..959264a404 100644 --- a/src/link.c +++ b/src/link.c @@ -62,41 +62,41 @@ static u16 sRecvNonzeroCheck; static u8 sChecksumAvailable; static u8 sHandshakePlayerCount; -u16 gLinkPartnersHeldKeys[6]; -u32 gLinkDebugSeed; -struct LinkPlayerBlock gLocalLinkPlayerBlock; -bool8 gLinkErrorOccurred; -u32 gLinkDebugFlags; -u32 gLinkFiller1; -bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS]; -u8 gBlockReceivedStatus[MAX_LINK_PLAYERS]; -u32 gLinkFiller2; -u16 gLinkHeldKeys; -u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; -u32 gLinkStatus; -bool8 gLinkDummy1; // Never read -bool8 gLinkDummy2; // Never read -bool8 gReadyToExitStandby[MAX_LINK_PLAYERS]; -bool8 gReadyToCloseLink[MAX_LINK_PLAYERS]; -u16 gReadyCloseLinkType; -u8 gSuppressLinkErrorMessage; -u8 gWirelessCommType; -u8 gSavedLinkPlayerCount; -u16 gSendCmd[CMD_LENGTH]; -u8 gSavedMultiplayerId; -bool8 gReceivedRemoteLinkPlayers; -struct LinkTestBGInfo gLinkTestBGInfo; -void (*gLinkCallback)(void); -u8 gShouldAdvanceLinkState; -u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; -u8 gBlockRequestType; -u32 gLinkFiller3; // file -u32 gLinkFiller4; // boundary -u32 gLinkFiller5; // here? -u8 gLastSendQueueCount; -struct Link gLink; -u8 gLastRecvQueueCount; -u16 gLinkSavedIme; +COMMON_DATA u16 gLinkPartnersHeldKeys[6] = {0}; +COMMON_DATA u32 gLinkDebugSeed = 0; +COMMON_DATA struct LinkPlayerBlock gLocalLinkPlayerBlock = {0}; +COMMON_DATA bool8 gLinkErrorOccurred = 0; +COMMON_DATA u32 gLinkDebugFlags = 0; +COMMON_DATA u32 gLinkFiller1 = 0; +COMMON_DATA bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS] = {0}; +COMMON_DATA u8 gBlockReceivedStatus[MAX_LINK_PLAYERS] = {0}; +COMMON_DATA u32 gLinkFiller2 = 0; +COMMON_DATA u16 gLinkHeldKeys = 0; +COMMON_DATA u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH] = {0}; +COMMON_DATA u32 gLinkStatus = 0; +COMMON_DATA bool8 gLinkDummy1 = 0; // Never read +COMMON_DATA bool8 gLinkDummy2 = 0; // Never read +COMMON_DATA bool8 gReadyToExitStandby[MAX_LINK_PLAYERS] = {0}; +COMMON_DATA bool8 gReadyToCloseLink[MAX_LINK_PLAYERS] = {0}; +COMMON_DATA u16 gReadyCloseLinkType = 0; +COMMON_DATA u8 gSuppressLinkErrorMessage = 0; +COMMON_DATA u8 gWirelessCommType = 0; +COMMON_DATA u8 gSavedLinkPlayerCount = 0; +COMMON_DATA u16 gSendCmd[CMD_LENGTH] = {0}; +COMMON_DATA u8 gSavedMultiplayerId = 0; +COMMON_DATA bool8 gReceivedRemoteLinkPlayers = 0; +COMMON_DATA struct LinkTestBGInfo gLinkTestBGInfo = {0}; +COMMON_DATA void (*gLinkCallback)(void) = NULL; +COMMON_DATA u8 gShouldAdvanceLinkState = 0; +COMMON_DATA u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS] = {0}; +COMMON_DATA u8 gBlockRequestType = 0; +COMMON_DATA u32 gLinkFiller3 = 0; // file +COMMON_DATA u32 gLinkFiller4 = 0; // boundary +COMMON_DATA u32 gLinkFiller5 = 0; // here? +COMMON_DATA u8 gLastSendQueueCount = 0; +COMMON_DATA struct Link gLink = {0}; +COMMON_DATA u8 gLastRecvQueueCount = 0; +COMMON_DATA u16 gLinkSavedIme = 0; static EWRAM_DATA bool8 sLinkTestDebugValuesEnabled = FALSE; static EWRAM_DATA bool8 sDummyFlag = FALSE; diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index 43614712d6..2a58279c0f 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -75,9 +75,9 @@ static u32 sRfuAPIBuffer[RFU_API_BUFF_SIZE_RAM / 4]; static u8 sResendBlock8[CMD_LENGTH * 2]; static u16 sResendBlock16[CMD_LENGTH]; -struct RfuGameData gHostRfuGameData; -struct RfuManager gRfu; -u8 gHostRfuUsername[PLAYER_NAME_LENGTH + 1]; +COMMON_DATA struct RfuGameData gHostRfuGameData = {0}; +COMMON_DATA struct RfuManager gRfu = {0}; +COMMON_DATA u8 gHostRfuUsername[PLAYER_NAME_LENGTH + 1] = {0}; static void InitChildRecvBuffers(void); static void InitParentSendData(void); diff --git a/src/list_menu.c b/src/list_menu.c index d759f6d790..36b81faec0 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -39,8 +39,8 @@ struct MoveMenuInfoIcon static EWRAM_DATA struct MysteryGiftLinkMenuStruct sMysteryGiftLinkMenu = {0}; -struct ListMenuOverride gListMenuOverride; -struct ListMenuTemplate gMultiuseListMenuTemplate; +COMMON_DATA struct ListMenuOverride gListMenuOverride = {0}; +COMMON_DATA struct ListMenuTemplate gMultiuseListMenuTemplate = {0}; static u8 ListMenuInitInternal(const struct ListMenuTemplate *listMenuTemplate, u16 cursorPos, u16 itemsAbove); static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown); diff --git a/src/load_save.c b/src/load_save.c index b81e78acc2..d711305078 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -37,10 +37,10 @@ EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0}; EWRAM_DATA u32 gLastEncryptionKey = 0; // IWRAM common -bool32 gFlashMemoryPresent; -struct SaveBlock1 *gSaveBlock1Ptr; -struct SaveBlock2 *gSaveBlock2Ptr; -struct PokemonStorage *gPokemonStoragePtr; +COMMON_DATA bool32 gFlashMemoryPresent = 0; +COMMON_DATA struct SaveBlock1 *gSaveBlock1Ptr = NULL; +COMMON_DATA struct SaveBlock2 *gSaveBlock2Ptr = NULL; +COMMON_DATA struct PokemonStorage *gPokemonStoragePtr = NULL; void CheckForFlashMemory(void) { diff --git a/src/m4a.c b/src/m4a.c index 365e7f6aa3..31d519d7bb 100644 --- a/src/m4a.c +++ b/src/m4a.c @@ -7,18 +7,18 @@ extern const u8 gCgb3Vol[]; BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0}; -struct SoundInfo gSoundInfo; -struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES]; -struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES]; -MPlayFunc gMPlayJumpTable[36]; -struct CgbChannel gCgbChans[4]; -struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2]; -struct PokemonCrySong gPokemonCrySong; -struct MusicPlayerInfo gMPlayInfo_BGM; -struct MusicPlayerInfo gMPlayInfo_SE1; -struct MusicPlayerInfo gMPlayInfo_SE2; -struct MusicPlayerInfo gMPlayInfo_SE3; -u8 gMPlayMemAccArea[0x10]; +COMMON_DATA struct SoundInfo gSoundInfo = {0}; +COMMON_DATA struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES] = {0}; +COMMON_DATA struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES] = {0}; +COMMON_DATA MPlayFunc gMPlayJumpTable[36] = {0}; +COMMON_DATA struct CgbChannel gCgbChans[4] = {0}; +COMMON_DATA struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2] = {0}; +COMMON_DATA struct PokemonCrySong gPokemonCrySong = {0}; +COMMON_DATA struct MusicPlayerInfo gMPlayInfo_BGM = {0}; +COMMON_DATA struct MusicPlayerInfo gMPlayInfo_SE1 = {0}; +COMMON_DATA struct MusicPlayerInfo gMPlayInfo_SE2 = {0}; +COMMON_DATA u8 gMPlayMemAccArea[0x10] = {0}; +COMMON_DATA struct MusicPlayerInfo gMPlayInfo_SE3 = {0}; u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) { diff --git a/src/main.c b/src/main.c index 8ee89c9944..f2d77a8c2c 100644 --- a/src/main.c +++ b/src/main.c @@ -58,21 +58,18 @@ const IntrFunc gIntrTableTemplate[] = #define INTR_COUNT ((int)(sizeof(gIntrTableTemplate)/sizeof(IntrFunc))) -u16 gKeyRepeatStartDelay; -u8 gLinkTransferringData; -struct Main gMain; -u16 gKeyRepeatContinueDelay; -u8 gSoftResetDisabled; -IntrFunc gIntrTable[INTR_COUNT]; -bool8 gLinkVSyncDisabled; -u32 IntrMain_Buffer[0x200]; -u8 gPcmDmaCounter; - -// These variables are not defined in RS or Emerald, and are never read. -// They were likely used to debug the audio engine and VCount interrupt. -u8 sVcountAfterSound; -u8 sVcountAtIntr; -u8 sVcountBeforeSound; +COMMON_DATA u16 gKeyRepeatStartDelay = 0; +COMMON_DATA u8 gLinkTransferringData = 0; +COMMON_DATA struct Main gMain = {0}; +COMMON_DATA u16 gKeyRepeatContinueDelay = 0; +COMMON_DATA u8 gSoftResetDisabled = 0; +COMMON_DATA IntrFunc gIntrTable[INTR_COUNT] = {0}; +COMMON_DATA u8 sVcountAfterSound = 0; +COMMON_DATA bool8 gLinkVSyncDisabled = 0; +COMMON_DATA u32 IntrMain_Buffer[0x200] = {0}; +COMMON_DATA u8 sVcountAtIntr = 0; +COMMON_DATA u8 sVcountBeforeSound = 0; +COMMON_DATA u8 gPcmDmaCounter = 0; static IntrFunc * const sTimerIntrFunc = gIntrTable + 0x7; diff --git a/src/overworld.c b/src/overworld.c index f3078c596a..c52a8edd27 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -106,14 +106,14 @@ static EWRAM_DATA s16 sCreditsOverworld_CmdIndex = 0; EWRAM_DATA struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4] = {}; -u16 *gBGTilemapBuffers1; -u16 *gBGTilemapBuffers2; -u16 *gBGTilemapBuffers3; -void (*gFieldCallback)(void); -bool8 (*gFieldCallback2)(void); -u16 gHeldKeyCodeToSend; -u8 gLocalLinkPlayerId; -u8 gFieldLinkPlayerCount; +COMMON_DATA u16 *gBGTilemapBuffers1 = NULL; +COMMON_DATA u16 *gBGTilemapBuffers2 = NULL; +COMMON_DATA u16 *gBGTilemapBuffers3 = NULL; +COMMON_DATA void (*gFieldCallback)(void) = NULL; +COMMON_DATA bool8 (*gFieldCallback2)(void) = NULL; +COMMON_DATA u16 gHeldKeyCodeToSend = 0; +COMMON_DATA u8 gLocalLinkPlayerId = 0; +COMMON_DATA u8 gFieldLinkPlayerCount = 0; static u8 sPlayerLinkStates[MAX_LINK_PLAYERS]; static KeyInterCB sPlayerKeyInterceptCallback; diff --git a/src/party_menu.c b/src/party_menu.c index 571dcf2c99..87a1dd4dcd 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -414,7 +414,7 @@ EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0}; static EWRAM_DATA u16 sPartyMenuItemId = ITEM_NONE; ALIGNED(4) EWRAM_DATA u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2] = {0}; // bits 0-3 are the current pos of Slot 1, 4-7 are Slot 2, and so on -void (*gItemUseCB)(u8, TaskFunc); +COMMON_DATA void (*gItemUseCB)(u8, TaskFunc) = NULL; #include "data/pokemon/tutor_learnsets.h" #include "data/party_menu.h" diff --git a/src/quest_log.c b/src/quest_log.c index eb1169424e..53de75e816 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -67,10 +67,10 @@ struct FlagOrVarRecord u16 value; }; -u8 gQuestLogPlaybackState; -u16 sMaxActionsInScene; -struct FieldInput gQuestLogFieldInput; -struct QuestLogAction * sCurSceneActions; +COMMON_DATA u8 gQuestLogPlaybackState = 0; +COMMON_DATA u16 sMaxActionsInScene = 0; +COMMON_DATA struct FieldInput gQuestLogFieldInput = {0}; +COMMON_DATA struct QuestLogAction * sCurSceneActions = NULL; static struct FlagOrVarRecord * sFlagOrVarRecords; static u16 sNumFlagsOrVars; diff --git a/src/random.c b/src/random.c index 413a3e60de..635a1df5a5 100644 --- a/src/random.c +++ b/src/random.c @@ -4,7 +4,7 @@ // The number 1103515245 comes from the example implementation // of rand and srand in the ISO C standard. -u32 gRngValue; +COMMON_DATA u32 gRngValue = 0; u16 Random(void) { diff --git a/src/save.c b/src/save.c index 07def36e4e..7a4808924c 100644 --- a/src/save.c +++ b/src/save.c @@ -77,18 +77,18 @@ STATIC_ASSERT(sizeof(struct SaveBlock1) <= SECTOR_DATA_SIZE * (SECTOR_ID_SAVEBLO STATIC_ASSERT(sizeof(struct PokemonStorage) <= SECTOR_DATA_SIZE * (SECTOR_ID_PKMN_STORAGE_END - SECTOR_ID_PKMN_STORAGE_START + 1), PokemonStorageFreeSpace); // Sector num to begin writing save data. Sectors are rotated each time the game is saved. (possibly to avoid wear on flash memory?) -u16 gLastWrittenSector; -u32 gLastSaveCounter; -u16 gLastKnownGoodSector; -u32 gDamagedSaveSectors; -u32 gSaveCounter; -struct SaveSector *gSaveDataBufferPtr; // the pointer is in fast IWRAM but points to the slower EWRAM. -u16 gIncrementalSectorId; -u16 gSaveUnusedVar; -u16 gSaveFileStatus; -void (*gGameContinueCallback)(void); -struct SaveSectorLocation gRamSaveSectorLocations[NUM_SECTORS_PER_SLOT]; -u16 gSaveAttemptStatus; +COMMON_DATA u16 gLastWrittenSector = 0; +COMMON_DATA u32 gLastSaveCounter = 0; +COMMON_DATA u16 gLastKnownGoodSector = 0; +COMMON_DATA u32 gDamagedSaveSectors = 0; +COMMON_DATA u32 gSaveCounter = 0; +COMMON_DATA struct SaveSector *gSaveDataBufferPtr = NULL; // the pointer is in fast IWRAM but points to the slower EWRAM. +COMMON_DATA u16 gIncrementalSectorId = 0; +COMMON_DATA u16 gSaveUnusedVar = 0; +COMMON_DATA u16 gSaveFileStatus = 0; +COMMON_DATA void (*gGameContinueCallback)(void) = NULL; +COMMON_DATA struct SaveSectorLocation gRamSaveSectorLocations[NUM_SECTORS_PER_SLOT] = {0}; +COMMON_DATA u16 gSaveAttemptStatus = 0; EWRAM_DATA struct SaveSector gSaveDataBuffer = {0}; EWRAM_DATA u32 gSaveUnusedVar2 = 0; diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c index ddb45171ae..e88e309181 100644 --- a/src/save_failed_screen.c +++ b/src/save_failed_screen.c @@ -7,7 +7,7 @@ #include "save.h" #include "strings.h" -bool32 sIsInSaveFailedScreen; +COMMON_DATA bool32 sIsInSaveFailedScreen = 0; static EWRAM_DATA u16 sSaveType = SAVE_NORMAL; static EWRAM_DATA u16 sUnused = 0; diff --git a/src/scrcmd.c b/src/scrcmd.c index d297f509e3..ea45a38a20 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -54,8 +54,8 @@ static EWRAM_DATA u16 sMovingNpcMapGroup = 0; static EWRAM_DATA u16 sMovingNpcMapNum = 0; static EWRAM_DATA u16 sFieldEffectScriptId = 0; -struct ScriptContext * sQuestLogScriptContextPtr; -u8 gSelectedObjectEvent; +COMMON_DATA struct ScriptContext * sQuestLogScriptContextPtr = NULL; +COMMON_DATA u8 gSelectedObjectEvent = 0; // This is defined in here so the optimizer can't see its value when compiling // script.c. diff --git a/src/sound.c b/src/sound.c index 636f88bb32..9060aa513d 100644 --- a/src/sound.c +++ b/src/sound.c @@ -30,7 +30,7 @@ static u8 sMapMusicFadeInSpeed; static u16 sFanfareCounter; // iwram common -bool8 gDisableMusic; +COMMON_DATA bool8 gDisableMusic = 0; extern u32 gBattleTypeFlags; extern struct MusicPlayerInfo gMPlayInfo_BGM; diff --git a/src/sprite.c b/src/sprite.c index afaa8e08d3..ae7a055ac0 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -270,8 +270,8 @@ static u16 sSpriteTileRanges[MAX_SPRITES * 2]; static struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT]; static u16 sSpritePaletteTags[16]; -u32 gOamMatrixAllocBitmap; -u8 gReservedSpritePaletteCount; +COMMON_DATA u32 gOamMatrixAllocBitmap = 0; +COMMON_DATA u8 gReservedSpritePaletteCount = 0; EWRAM_DATA struct Sprite gSprites[MAX_SPRITES + 1] = {0}; EWRAM_DATA u16 gSpritePriorities[MAX_SPRITES] = {0}; diff --git a/src/task.c b/src/task.c index 672d200fec..cd9841d065 100644 --- a/src/task.c +++ b/src/task.c @@ -4,7 +4,7 @@ #define HEAD_SENTINEL 0xFE #define TAIL_SENTINEL 0xFF -struct Task gTasks[NUM_TASKS]; +COMMON_DATA struct Task gTasks[NUM_TASKS] = {0}; static void InsertTask(u8 newTaskId); static u8 FindFirstActiveTask(); diff --git a/src/text.c b/src/text.c index 76739f8c60..b2dcff3b5a 100644 --- a/src/text.c +++ b/src/text.c @@ -24,7 +24,7 @@ static s32 GetGlyphWidth_Male(u16 glyphId, bool32 isJapanese); static s32 GetGlyphWidth_Female(u16 glyphId, bool32 isJapanese); static void SpriteCB_TextCursor(struct Sprite *sprite); -TextFlags gTextFlags; +COMMON_DATA TextFlags gTextFlags = {0}; static const u8 sDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow.4bpp"); static const u8 sDarkDownArrowTiles[] = INCBIN_U8("graphics/fonts/down_arrow_RS.4bpp"); diff --git a/src/text_printer.c b/src/text_printer.c index 6710ebfd0c..e425ccb181 100644 --- a/src/text_printer.c +++ b/src/text_printer.c @@ -10,8 +10,8 @@ static u16 sLastTextBgColor; static u16 sLastTextFgColor; static u16 sLastTextShadowColor; -const struct FontInfo *gFonts; -struct GlyphInfo gGlyphInfo; +COMMON_DATA const struct FontInfo *gFonts = NULL; +COMMON_DATA struct GlyphInfo gGlyphInfo = {0}; static const u8 sFontHalfRowOffsets[] = { diff --git a/src/window.c b/src/window.c index 1b1d347a09..834f13a8c9 100644 --- a/src/window.c +++ b/src/window.c @@ -1,8 +1,8 @@ #include "global.h" #include "gflib.h" -u8 gWindowClearTile; -void *gWindowBgTilemapBuffers[4]; +COMMON_DATA u8 gWindowClearTile = {0}; +COMMON_DATA void *gWindowBgTilemapBuffers[4] = {0}; EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0}; diff --git a/tools/ramscrgen/elf.cpp b/tools/ramscrgen/elf.cpp index 7e78704b8c..077fcc82a4 100644 --- a/tools/ramscrgen/elf.cpp +++ b/tools/ramscrgen/elf.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include "ramscrgen.h" @@ -22,6 +21,7 @@ static int s_shstrtabIndex; static std::uint32_t s_symtabOffset; static std::uint32_t s_strtabOffset; +static std::uint32_t s_pseudoCommonSectionIndex; static std::uint32_t s_symbolCount; static std::uint32_t s_elfFileOffset; @@ -101,18 +101,6 @@ static void VerifyElfIdent() FATAL_ERROR("error: \"%s\" not little-endian ELF\n", s_elfPath.c_str()); } -static void VerifyAr() -{ - char expectedMagic[8] = {'!', '<', 'a', 'r', 'c', 'h', '>', '\n'}; - char magic[8]; - - if (std::fread(magic, 8, 1, s_file) != 1) - FATAL_ERROR("error: failed to read AR magic from \"%s\"\n", s_archiveFilePath.c_str()); - - if (std::memcmp(magic, expectedMagic, 8) != 0) - FATAL_ERROR("error: AR magic did not match in \"%s\"\n", s_archiveFilePath.c_str()); -} - static void ReadElfHeader() { Seek(0x20); @@ -123,40 +111,6 @@ static void ReadElfHeader() s_shstrtabIndex = ReadInt16(); } -static void FindArObj() -{ - char file_ident[17] = {0}; - char filesize_s[11] = {0}; - char expectedEndMagic[2] = { 0x60, 0x0a }; - char end_magic[2]; - std::size_t filesize; - - Seek(8); - while (!std::feof(s_file)) { - if (std::fread(file_ident, 16, 1, s_file) != 1) - FATAL_ERROR("error: failed to read file ident in \"%s\"\n", s_archiveFilePath.c_str()); - Skip(32); - if (std::fread(filesize_s, 10, 1, s_file) != 1) - FATAL_ERROR("error: failed to read filesize in \"%s\"\n", s_archiveFilePath.c_str()); - if (std::fread(end_magic, 2, 1, s_file) != 1) - FATAL_ERROR("error: failed to read end sentinel in \"%s\"\n", s_archiveFilePath.c_str()); - if (std::memcmp(end_magic, expectedEndMagic, 2) != 0) - FATAL_ERROR("error: corrupted archive header in \"%s\" at \"%s\"\n", s_archiveFilePath.c_str(), file_ident); - - char * ptr = std::strchr(file_ident, '/'); - if (ptr != nullptr) - *ptr = 0; - filesize = std::strtoul(filesize_s, nullptr, 10); - if (std::strncmp(s_archiveObjectPath.c_str(), file_ident, 16) == 0) { - s_elfFileOffset = std::ftell(s_file); - return; - } - Skip(filesize); - } - - FATAL_ERROR("error: could not find object \"%s\" in archive \"%s\"\n", s_archiveObjectPath.c_str(), s_archiveFilePath.c_str()); -} - static std::string GetSectionName(std::uint32_t shstrtabOffset, int index) { Seek(s_sectionHeaderOffset + s_sectionHeaderEntrySize * index); @@ -169,6 +123,7 @@ static void FindTableOffsets() { s_symtabOffset = 0; s_strtabOffset = 0; + s_pseudoCommonSectionIndex = 0; Seek(s_sectionHeaderOffset + s_sectionHeaderEntrySize * s_shstrtabIndex + 0x10); std::uint32_t shstrtabOffset = ReadInt32(); @@ -192,6 +147,11 @@ static void FindTableOffsets() FATAL_ERROR("error: mutiple .strtab sections found in \"%s\"\n", s_elfPath.c_str()); Seek(s_sectionHeaderOffset + s_sectionHeaderEntrySize * i + 0x10); s_strtabOffset = ReadInt32(); + } else if (name == "common_data") { + if (s_pseudoCommonSectionIndex) { + FATAL_ERROR("error: mutiple common_data sections found in \"%s\"\n", s_elfPath.c_str()); + } + s_pseudoCommonSectionIndex = i; } } @@ -202,65 +162,50 @@ static void FindTableOffsets() FATAL_ERROR("error: couldn't find .strtab section in \"%s\"\n", s_elfPath.c_str()); } -static std::map GetCommonSymbols_Shared() +static std::vector> GetCommonSymbols_Shared() { VerifyElfIdent(); ReadElfHeader(); FindTableOffsets(); - std::map commonSymbols; - - std::vector commonSymbolVec; - - Seek(s_symtabOffset); - - for (std::uint32_t i = 0; i < s_symbolCount; i++) - { - Symbol sym; - sym.nameOffset = ReadInt32(); - Skip(4); - sym.size = ReadInt32(); - Skip(2); - std::uint16_t sectionIndex = ReadInt16(); - if (sectionIndex == SHN_COMMON) - commonSymbolVec.push_back(sym); - } + std::vector> commonSymbols; - for (const Symbol& sym : commonSymbolVec) - { - Seek(s_strtabOffset + sym.nameOffset); - std::string name = ReadString(); - commonSymbols[name] = sym.size; + if (s_pseudoCommonSectionIndex) { + std::vector commonSymbolVec; + + Seek(s_symtabOffset); + + for (std::uint32_t i = 0; i < s_symbolCount; i++) + { + Symbol sym; + sym.nameOffset = ReadInt32(); + Skip(4); + sym.size = ReadInt32(); + Skip(2); + std::uint16_t sectionIndex = ReadInt16(); + if (sectionIndex == s_pseudoCommonSectionIndex) + commonSymbolVec.push_back(sym); + } + + for (const Symbol& sym : commonSymbolVec) + { + Seek(s_strtabOffset + sym.nameOffset); + std::string name = ReadString(); + if (name == "$d" || name == "") { + continue; + } + commonSymbols.emplace_back(name, sym.size); + } } return commonSymbols; } -std::map GetCommonSymbolsFromLib(std::string sourcePath, std::string libpath) -{ - std::size_t colonPos = libpath.find(':'); - if (colonPos == std::string::npos) - FATAL_ERROR("error: missing colon separator in libfile \"%s\"\n", s_elfPath.c_str()); - - s_archiveObjectPath = libpath.substr(colonPos + 1); - s_archiveFilePath = sourcePath + "/" + libpath.substr(1, colonPos - 1); - s_elfPath = sourcePath + "/" + libpath.substr(1); - - s_file = std::fopen(s_archiveFilePath.c_str(), "rb"); - - if (s_file == NULL) - FATAL_ERROR("error: failed to open \"%s\" for reading\n", s_archiveFilePath.c_str()); - - VerifyAr(); - FindArObj(); - return GetCommonSymbols_Shared(); -} - -std::map GetCommonSymbols(std::string sourcePath, std::string path) +std::vector> GetCommonSymbols(std::string sourcePath, std::string path) { s_elfFileOffset = 0; if (path[0] == '*') - return GetCommonSymbolsFromLib(sourcePath, path); + FATAL_ERROR("error: library common syms are unsupported (filename: \"%s\")\n", path.c_str()); s_elfPath = sourcePath + "/" + path; s_file = std::fopen(s_elfPath.c_str(), "rb"); diff --git a/tools/ramscrgen/elf.h b/tools/ramscrgen/elf.h index 3704860c0e..bf79a954e0 100644 --- a/tools/ramscrgen/elf.h +++ b/tools/ramscrgen/elf.h @@ -22,9 +22,9 @@ #define ELF_H #include -#include +#include #include -std::map GetCommonSymbols(std::string sourcePath, std::string path); +std::vector> GetCommonSymbols(std::string sourcePath, std::string path); #endif // ELF_H diff --git a/tools/ramscrgen/main.cpp b/tools/ramscrgen/main.cpp index 5e5894f470..e99cf9fa30 100644 --- a/tools/ramscrgen/main.cpp +++ b/tools/ramscrgen/main.cpp @@ -28,54 +28,19 @@ void HandleCommonInclude(std::string filename, std::string sourcePath, std::string symOrderPath, std::string lang) { auto commonSymbols = GetCommonSymbols(sourcePath, filename); - std::size_t dotIndex; - if (filename[0] == '*') { - dotIndex = filename.find_last_of(':'); - filename = filename.substr(dotIndex + 1); - } - - dotIndex = filename.find_last_of('.'); - - if (dotIndex == std::string::npos) - FATAL_ERROR("error: \"%s\" doesn't have a file extension\n", filename.c_str()); - - std::string symOrderFilename = filename.substr(0, dotIndex + 1) + "txt"; - - SymFile symFile(symOrderPath + "/" + symOrderFilename); - - while (!symFile.IsAtEnd()) + for (const auto& commonSym : commonSymbols) { - symFile.HandleLangConditional(lang); - - std::string label = symFile.GetLabel(false); - - if (label.length() == 0) - { - unsigned long length; - if (symFile.ReadInteger(length)) - { - if (length & 3) - symFile.RaiseWarning("gap length %d is not multiple of 4", length); - printf(". += 0x%lX;\n", length); - } - } - else - { - if (commonSymbols.count(label) == 0) - symFile.RaiseError("no common symbol named \"%s\"", label.c_str()); - unsigned long size = commonSymbols[label]; - int alignment = 4; - if (size > 4) - alignment = 8; - if (size > 8) - alignment = 16; - printf(". = ALIGN(%d);\n", alignment); - printf("%s = .;\n", label.c_str()); - printf(". += 0x%lX;\n", size); - } - - symFile.ExpectEmptyRestOfLine(); + unsigned long size = commonSym.second; + + int alignment = 4; + if (size > 4) + alignment = 8; + if (size > 8) + alignment = 16; + printf(". = ALIGN(%d);\n", alignment); + printf("%s = .;\n", commonSym.first.c_str()); + printf(". += 0x%lX;\n", size); } }