Compare commits

..

2 Commits

Author SHA1 Message Date
Arceveti
4d65fd3f48 Add segment_names.h 2021-10-23 19:40:28 -07:00
Arceveti
141854b1f9 Fix 6 level entries freeze 2021-10-20 09:39:31 -07:00
28 changed files with 431 additions and 395 deletions

View File

@@ -106,7 +106,7 @@ endif
DEBUG_MAP_STACKTRACE_FLAG := -D DEBUG_MAP_STACKTRACE
TARGET := sm64
TARGET := sm64.$(VERSION)
# GRUCODE - selects which RSP microcode to use.
@@ -171,10 +171,21 @@ endif
ifeq ($(NON_MATCHING),1)
DEFINES += NON_MATCHING=1 AVOID_UB=1
COMPARE := 0
endif
TARGET_STRING := sm64
# COMPARE - whether to verify the SHA-1 hash of the ROM after building
# 1 - verifies the SHA-1 hash of the selected version of the game
# 0 - does not verify the hash
COMPARE ?= 0
$(eval $(call validate-option,COMPARE,0 1))
TARGET_STRING := sm64.$(VERSION).$(CONSOLE).$(GRUCODE)
# If non-default settings were chosen, disable COMPARE
ifeq ($(filter $(TARGET_STRING), sm64.jp.f3d_old sm64.us.f3d_old sm64.eu.f3d_new sm64.sh.f3d_new),)
COMPARE := 0
endif
# UNF - whether to use UNFLoader flashcart library
# 1 - includes code in ROM
@@ -234,6 +245,27 @@ endif
# Whether to colorize build messages
COLOR ?= 1
# display selected options unless 'make clean' or 'make distclean' is run
ifeq ($(filter clean distclean,$(MAKECMDGOALS)),)
$(info ==== Build Options ====)
$(info Version: $(VERSION))
$(info Microcode: $(GRUCODE))
$(info Console: $(CONSOLE))
$(info Target: $(TARGET))
ifeq ($(COMPARE),1)
$(info Compare ROM: yes)
else
$(info Compare ROM: no)
endif
ifeq ($(NON_MATCHING),1)
$(info Build Matching: no)
else
$(info Build Matching: yes)
endif
$(info =======================)
endif
#==============================================================================#
# Universal Dependencies #
#==============================================================================#
@@ -279,7 +311,7 @@ endif
BUILD_DIR_BASE := build
# BUILD_DIR is the location where all build artifacts are placed
BUILD_DIR := $(BUILD_DIR_BASE)/$(VERSION)_$(CONSOLE)
BUILD_DIR := $(BUILD_DIR_BASE)/$(VERSION)
ROM := $(BUILD_DIR)/$(TARGET_STRING).z64
ELF := $(BUILD_DIR)/$(TARGET_STRING).elf
LIBZ := $(BUILD_DIR)/libz.a
@@ -453,7 +485,7 @@ RED := \033[0;31m
GREEN := \033[0;32m
BLUE := \033[0;34m
YELLOW := \033[0;33m
BLINK := \033[32;5m
BLINK := \033[33;5m
endif
# For non-IDO, use objcopy instead of extract_data_for_mio
@@ -471,12 +503,13 @@ endef
#==============================================================================#
all: $(ROM)
ifeq ($(COMPARE),1)
@$(PRINT) "$(GREEN)Checking if ROM matches.. $(NO_COL)\n"
@$(SHA1SUM) --quiet -c $(TARGET).sha1 && $(PRINT) "$(TARGET): $(GREEN)OK$(NO_COL)\n" || ($(PRINT) "$(YELLOW)Building the ROM file has succeeded, but does not match the original ROM.\nThis is expected, and not an error, if you are making modifications.\nTo silence this message, use 'make COMPARE=0.' $(NO_COL)\n" && false)
else
@$(SHA1SUM) $(ROM)
@$(PRINT) "${BLINK}Build succeeded.\n$(NO_COL)"
@$(PRINT) "==== Build Options ====$(NO_COL)\n"
@$(PRINT) "${GREEN}Version: $(BLUE)$(VERSION)$(NO_COL)\n"
@$(PRINT) "${GREEN}Microcode: $(BLUE)$(GRUCODE)$(NO_COL)\n"
@$(PRINT) "${GREEN}Console: $(BLUE)$(CONSOLE)$(NO_COL)\n"
@$(PRINT) "${GREEN}Build succeeded.$(NO_COL)\n"
endif
clean:
$(RM) -r $(BUILD_DIR_BASE)
@@ -781,7 +814,7 @@ ifeq ($(CONSOLE),n64)
$(V)$(OBJCOPY) --pad-to=0x101000 --gap-fill=0xFF $< $@ -O binary
else ifeq ($(CONSOLE),bb)
$(V)$(OBJCOPY) --gap-fill=0x00 $< $@ -O binary
$(V)dd if=$@ of=tmp bs=16K conv=sync status=none
$(V)dd if=$@ of=tmp bs=16K conv=sync
$(V)mv tmp $@
endif
$(V)$(N64CKSUM) $@

View File

@@ -178,9 +178,7 @@ To switch to no compression, run make with the ``COMPRESS=uncomp`` argument.
Q: Why in the hell are you bundling your own build of ``ld``?
A: Newer binutils (Like the one bundled with Ubuntu, 2.34) break linking with libultra builds due to local asm symbols.
This puts me at a crossroads of either touching leaked code and requiring GCC, or just using an older linker that works just fine.
I went with the latter.
Thanks to "someone2639" for this hacky-ass idea

View File

@@ -39,7 +39,7 @@ If you have code in a groupX_geo.c file, you must load it in level scripts by do
This has two extra arguments, which should be passed as `_groupX_geoSegmentNoloadStart` and `_groupX_geoSegmentNoloadEnd`.
For example, if you added code to group3's geo segment:
LOAD_RAW_WITH_CODE(0x0C, _group3_geoSegmentRomStart, _group3_geoSegmentRomEnd, _group3_geoSegmentNoloadStart, _group3_geoSegmentNoloadEnd),
LOAD_RAW_WITH_CODE(SEGMENT_GROUPA_GEO, _group3_geoSegmentRomStart, _group3_geoSegmentRomEnd, _group3_geoSegmentNoloadStart, _group3_geoSegmentNoloadEnd),
For convenience, included is a new header: src/game/obj_behaviors_2_nonstatic.h. In addition to effectively removing
the static keyword from object_behaviors_2.c, this header defines prototypes for all functions in that file. This

50
include/segment_names.h Normal file
View File

@@ -0,0 +1,50 @@
#ifndef SEGMENT_NAMES_H
#define SEGMENT_NAMES_H
/**
* TLB Segment Names
*
* Most are set in sm64.ld, Makefile.split, and in level scripts, some are set elsewuere.
* If you change these, make sure to also change them in Makefile.split and in your level scripts.
*
* TODO: Make this an enum without breaking sm64.ld
* TODO: Replace the remaining hardcoded segment numbers in level scripts with these
* TODO: Find a way to use these with SEG_ADDRESS in Makefile.split
*/
#define SEGMENT_MAIN 0x00 // | segment 0 | General Segment, includes most of /src/ (engine, buffers, goddard, audio, etc.)
#define SEGMENT_RENDER 0x01 // | segment 1 | SPTask, GFX pool buffer
#define SEGMENT_SEGMENT2 0x02 // | segment 2 | Segment 2 (Fonts, Text, etc)
#define SEGMENT_COMMON1_YAY0 0x03 // | segment 3 | /actors/common1_yay0
#define SEGMENT_GROUP0_YAY0 0x04 // | segment 4 | /actors/group0_yay0, also includes boot (/src/boot/) & gd_dynlists (/src/goddard/dynlists/)
#define SEGMENT_GROUPA_YAY0 0x05 // | segment 5 | Actor group A yay0 (group1 - group11)
#define SEGMENT_GROUPB_YAY0 0x06 // | segment 6 | Actor group B yay0 (group12 - group17)
#define SEGMENT_LEVEL_DATA 0x07 // | segment 7 | Level Data, also includes intro_segment_7, menu_segment_7, & /menu/debug_level_select/
#define SEGMENT_COMMON0_YAY0 0x08 // | segment 8 | /actors/common0_yay0
#define SEGMENT_TEXTURE 0x09 // | segment 9 | Shared texture bins (/textures/)
#define SEGMENT_SKYBOX 0x0A // | segment 10 | Skybox textures (/textures/skyboxes/), includes title screen background (/textures/title_screen_bg/)
#define SEGMENT_EFFECT_YAY0 0x0B // | segment 11 | effect_yay0
#define SEGMENT_GROUPA_GEO 0x0C // | segment 12 | Actor group A geo (group1 - group11)
#define SEGMENT_GROUPB_GEO 0x0D // | segment 13 | Actor group B geo (group12 - group17)
#define SEGMENT_ENDING_SCRIPT 0x0E // | segment 14 | level_ending_entry (/levels/ending/)
#define SEGMENT_COMMON0_GEO 0x0F // | segment 15 | /actors/common0_geo
#define SEGMENT_LEVEL_ENTRY 0x10 // | segment 16 | Level Script Entry
#define SEGMENT_MARIO_ANIMS 0x11 // | segment 17 | Mario Animations
#define SEGMENT_UNKNOWN_18 0x12 // | segment 18 | Unknown/Unused?
#define SEGMENT_BEHAVIOR_DATA 0x13 // | segment 19 | Behavior Data
#define SEGMENT_MENU_INTRO 0x14 // | segment 20 | /src/menu/, /levels/menu/, /levels/intro/
#define SEGMENT_GLOBAL_LEVEL_SCRIPT 0x15 // | segment 21 | Global level scripts: /levels/scripts
#define SEGMENT_COMMON1_GEO 0x16 // | segment 22 | /actors/common1_geo
#define SEGMENT_GROUP0_GEO 0x17 // | segment 23 | /actors/group0_geo
#define SEGMENT_DEMO_INPUTS 0x18 // | segment 24 | Demo Inputs List
#define SEGMENT_EU_TRANSLATION 0x19 // | segment 25 | EU language translations
#define SEGMENT_UNKNOWN_26 0x1A // | segment 26 | Unknown/Unused?
#define SEGMENT_UNKNOWN_27 0x1B // | segment 27 | Unknown/Unused?
#define SEGMENT_UNKNOWN_28 0x1C // | segment 28 | Unknown/Unused?
#define SEGMENT_UNKNOWN_29 0x1D // | segment 29 | Unknown/Unused?
#define SEGMENT_UNKNOWN_30 0x1E // | segment 30 | Unknown/Unused?
#define SEGMENT_UNKNOWN_31 0x1F // | segment 31 | Unknown/Unused?
#define SEG_ADDRESS(segment) ((segment) << 24)
#endif

View File

@@ -1,9 +1,11 @@
#ifndef SEGMENTS_H
#define SEGMENTS_H
#include "segment_names.h"
#ifndef LINKER
#include "segment_symbols.h"
#endif
/*
* Memory addresses for segments. Ideally, this header file would not be
* needed, and the addresses would be defined in sm64.ld and linker-inserted
@@ -14,13 +16,23 @@
* linker script syntax.
*/
// Starting address of RAM
#define RAM_START 0x80000000
// 1MB of RAM
#define RAM_1MB 0x00100000
#define USE_EXT_RAM
// Calculate total amount of RAM
#ifndef USE_EXT_RAM
#define RAM_END 0x80400000
#define TOTAL_RAM_SIZE (RAM_1MB * 4)
#else
#define RAM_END 0x80800000
#define TOTAL_RAM_SIZE (RAM_1MB * 8)
#endif
// Ending address of RAM
#define RAM_END (RAM_START + TOTAL_RAM_SIZE)
/*
* Workaround for running out of pool space due to
* importing large custom content.
@@ -29,4 +41,6 @@
#define SEG_POOL_START _framebuffersSegmentBssEnd // 0x0165000 in size
#define POOL_SIZE RAM_END - SEG_POOL_START
#define MAP_PARSER_ADDRESS 0x80345678
#endif // SEGMENTS_H

View File

@@ -13,6 +13,7 @@
#include "mario_geo_switch_case_ids.h"
#include "surface_terrains.h"
#include "macros.h"
#include "segments.h"
// Crash handler enhancement
#ifdef CRASH_SCREEN_INCLUDED

View File

@@ -18,7 +18,7 @@
const LevelScript level_ending_entry[] = {
/*0*/ INIT_LEVEL(),
/*1*/ LOAD_YAY0(/*seg*/ 0x07, _ending_segment_7SegmentRomStart, _ending_segment_7SegmentRomEnd),
/*1*/ LOAD_YAY0(/*seg*/ SEGMENT_LEVEL_DATA, _ending_segment_7SegmentRomStart, _ending_segment_7SegmentRomEnd),
/*4*/ ALLOC_LEVEL_POOL(),
/*5*/ AREA(/*index*/ 1, ending_geo_area_1),

View File

@@ -16,10 +16,10 @@ const LevelScript level_script_entry[] = {
BLACKOUT(/*active*/ FALSE),
#ifdef TEST_LEVEL
SET_REG(/*value*/ TEST_LEVEL),
EXECUTE(/*seg*/ 0x15, /*script*/ _scriptsSegmentRomStart, /*scriptEnd*/ _scriptsSegmentRomEnd, /*entry*/ level_main_scripts_entry),
EXECUTE(/*seg*/ SEGMENT_GLOBAL_LEVEL_SCRIPT, /*script*/ _scriptsSegmentRomStart, /*scriptEnd*/ _scriptsSegmentRomEnd, /*entry*/ level_main_scripts_entry),
#else
SET_REG(/*value*/ 0),
EXECUTE(/*seg*/ 0x14, /*script*/ _introSegmentRomStart, /*scriptEnd*/ _introSegmentRomEnd, /*entry*/ level_intro_splash_screen),
EXECUTE(/*seg*/ SEGMENT_MENU_INTRO, /*script*/ _introSegmentRomStart, /*scriptEnd*/ _introSegmentRomEnd, /*entry*/ level_intro_splash_screen),
#endif
JUMP(/*target*/ level_script_entry),
};

View File

@@ -28,14 +28,14 @@
const LevelScript level_intro_splash_screen[] = {
INIT_LEVEL(),
#ifdef SKIP_TITLE_SCREEN
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ 0x14, _introSegmentRomStart, _introSegmentRomEnd, level_intro_mario_head_regular, _introSegmentBssStart, _introSegmentBssEnd),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ SEGMENT_MENU_INTRO, _introSegmentRomStart, _introSegmentRomEnd, level_intro_mario_head_regular, _introSegmentBssStart, _introSegmentBssEnd),
#endif
FIXED_LOAD(/*loadAddr*/ _goddardSegmentStart, /*romStart*/ _goddardSegmentRomStart, /*romEnd*/ _goddardSegmentRomEnd),
LOAD_RAW( /*seg*/ 0x13, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
LOAD_YAY0(/*seg*/ 0x07, _intro_segment_7SegmentRomStart, _intro_segment_7SegmentRomEnd),
LOAD_RAW( /*seg*/ SEGMENT_BEHAVIOR_DATA, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
LOAD_YAY0(/*seg*/ SEGMENT_LEVEL_DATA, _intro_segment_7SegmentRomStart, _intro_segment_7SegmentRomEnd),
#if defined(HD_INTRO_TEXTURES) && defined(FLOOMBAS)
LOAD_YAY0(/*seg*/ 0x08, _common0_yay0SegmentRomStart, _common0_yay0SegmentRomEnd),
LOAD_RAW( /*seg*/ 0x0F, _common0_geoSegmentRomStart, _common0_geoSegmentRomEnd),
LOAD_YAY0(/*seg*/ SEGMENT_COMMON0_YAY0, _common0_yay0SegmentRomStart, _common0_yay0SegmentRomEnd),
LOAD_RAW( /*seg*/ SEGMENT_COMMON0_GEO, _common0_geoSegmentRomStart, _common0_geoSegmentRomEnd),
// Load "Super Mario 64" logo
ALLOC_LEVEL_POOL(),
@@ -79,7 +79,7 @@ const LevelScript level_intro_splash_screen[] = {
CMD2A(/*unk2*/ 1),
CLEAR_LEVEL(),
SLEEP(/*frames*/ 2),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ 0x14, _introSegmentRomStart, _introSegmentRomEnd, level_intro_mario_head_regular, _introSegmentBssStart, _introSegmentBssEnd),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ SEGMENT_MENU_INTRO, _introSegmentRomStart, _introSegmentRomEnd, level_intro_mario_head_regular, _introSegmentBssStart, _introSegmentBssEnd),
};
const LevelScript level_intro_mario_head_regular[] = {
@@ -88,8 +88,8 @@ const LevelScript level_intro_mario_head_regular[] = {
FIXED_LOAD(/*loadAddr*/ _goddardSegmentStart, /*romStart*/ _goddardSegmentRomStart, /*romEnd*/ _goddardSegmentRomEnd),
#ifdef KEEP_MARIO_HEAD
LOAD_MARIO_HEAD(/*loadHeadID*/ REGULAR_FACE),
LOAD_RAW(/*seg*/ 0x13, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
LOAD_YAY0_TEXTURE(/*seg*/ 0x0A, _title_screen_bg_yay0SegmentRomStart, _title_screen_bg_yay0SegmentRomEnd),
LOAD_RAW(/*seg*/ SEGMENT_BEHAVIOR_DATA, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
LOAD_YAY0_TEXTURE(/*seg*/ SEGMENT_SKYBOX, _title_screen_bg_yay0SegmentRomStart, _title_screen_bg_yay0SegmentRomEnd),
ALLOC_LEVEL_POOL(),
AREA(/*index*/ 1, intro_geo_mario_head_regular),
@@ -118,8 +118,8 @@ const LevelScript level_intro_mario_head_dizzy[] = {
#ifdef KEEP_MARIO_HEAD
LOAD_MARIO_HEAD(/*loadHeadID*/ DIZZY_FACE),
#endif
LOAD_RAW(/*seg*/ 0x13, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
LOAD_YAY0_TEXTURE(/*seg*/ 0x0A, _title_screen_bg_yay0SegmentRomStart, _title_screen_bg_yay0SegmentRomEnd),
LOAD_RAW(/*seg*/ SEGMENT_BEHAVIOR_DATA, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
LOAD_YAY0_TEXTURE(/*seg*/ SEGMENT_SKYBOX, _title_screen_bg_yay0SegmentRomStart, _title_screen_bg_yay0SegmentRomEnd),
ALLOC_LEVEL_POOL(),
AREA(/*index*/ 1, intro_geo_mario_head_dizzy),
@@ -140,9 +140,9 @@ const LevelScript level_intro_mario_head_dizzy[] = {
const LevelScript level_intro_entry_level_select[] = {
INIT_LEVEL(),
LOAD_RAW(/*seg*/ 0x13, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
LOAD_YAY0_TEXTURE(/*seg*/ 0x0A, _title_screen_bg_yay0SegmentRomStart, _title_screen_bg_yay0SegmentRomEnd),
LOAD_YAY0(/*seg*/ 0x07, _debug_level_select_yay0SegmentRomStart, _debug_level_select_yay0SegmentRomEnd),
LOAD_RAW(/*seg*/ SEGMENT_BEHAVIOR_DATA, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
LOAD_YAY0_TEXTURE(/*seg*/ SEGMENT_SKYBOX, _title_screen_bg_yay0SegmentRomStart, _title_screen_bg_yay0SegmentRomEnd),
LOAD_YAY0(/*seg*/ SEGMENT_LEVEL_DATA, _debug_level_select_yay0SegmentRomStart, _debug_level_select_yay0SegmentRomEnd),
FIXED_LOAD(/*loadAddr*/ _goddardSegmentStart, /*romStart*/ _goddardSegmentRomStart, /*romEnd*/ _goddardSegmentRomEnd),
ALLOC_LEVEL_POOL(),
@@ -168,7 +168,7 @@ const LevelScript script_intro_file_select[] = {
CLEAR_LEVEL(),
SLEEP(/*frames*/ 2),
SET_REG(/*value*/ START_LEVEL),
EXIT_AND_EXECUTE(/*seg*/ 0x14, _menuSegmentRomStart, _menuSegmentRomEnd, level_main_menu_entry_file_select),
EXIT_AND_EXECUTE(/*seg*/ SEGMENT_MENU_INTRO, _menuSegmentRomStart, _menuSegmentRomEnd, level_main_menu_entry_file_select),
};
const LevelScript script_intro_level_select[] = {
@@ -176,7 +176,7 @@ const LevelScript script_intro_level_select[] = {
SLEEP(/*frames*/ 16),
CLEAR_LEVEL(),
SLEEP(/*frames*/ 2),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ 0x14, _introSegmentRomStart, _introSegmentRomEnd, level_intro_entry_level_select, _introSegmentBssStart, _introSegmentBssEnd),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ SEGMENT_MENU_INTRO, _introSegmentRomStart, _introSegmentRomEnd, level_intro_entry_level_select, _introSegmentBssStart, _introSegmentBssEnd),
};
const LevelScript script_intro_main_level_entry_stop_music[] = {
@@ -189,7 +189,7 @@ const LevelScript script_intro_main_level_entry[] = {
SLEEP(/*frames*/ 16),
CLEAR_LEVEL(),
SLEEP(/*frames*/ 2),
EXIT_AND_EXECUTE(/*seg*/ 0x15, _scriptsSegmentRomStart, _scriptsSegmentRomEnd, level_main_scripts_entry),
EXIT_AND_EXECUTE(/*seg*/ SEGMENT_GLOBAL_LEVEL_SCRIPT, _scriptsSegmentRomStart, _scriptsSegmentRomEnd, level_main_scripts_entry),
};
const LevelScript script_intro_splash_screen[] = {
@@ -198,5 +198,5 @@ const LevelScript script_intro_splash_screen[] = {
SLEEP(/*frames*/ 16),
CLEAR_LEVEL(),
SLEEP(/*frames*/ 2),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ 0x14, _introSegmentRomStart, _introSegmentRomEnd, level_intro_splash_screen, _introSegmentBssStart, _introSegmentBssEnd),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ SEGMENT_MENU_INTRO, _introSegmentRomStart, _introSegmentRomEnd, level_intro_splash_screen, _introSegmentBssStart, _introSegmentBssEnd),
};

View File

@@ -21,8 +21,8 @@
const LevelScript level_main_menu_entry_file_select[] = {
INIT_LEVEL(),
FIXED_LOAD(/*loadAddr*/ _goddardSegmentStart, /*romStart*/ _goddardSegmentRomStart, /*romEnd*/ _goddardSegmentRomEnd),
LOAD_YAY0(/*seg*/ 0x07, _menu_segment_7SegmentRomStart, _menu_segment_7SegmentRomEnd),
LOAD_RAW(/*seg*/ 0x13, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
LOAD_YAY0(/*seg*/ SEGMENT_LEVEL_DATA, _menu_segment_7SegmentRomStart, _menu_segment_7SegmentRomEnd),
LOAD_RAW(/*seg*/ SEGMENT_BEHAVIOR_DATA, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
ALLOC_LEVEL_POOL(),
LOAD_MODEL_FROM_GEO(MODEL_MAIN_MENU_MARIO_SAVE_BUTTON, geo_menu_mario_save_button),
LOAD_MODEL_FROM_GEO(MODEL_MAIN_MENU_RED_ERASE_BUTTON, geo_menu_erase_button),
@@ -54,7 +54,7 @@ const LevelScript level_main_menu_entry_file_select[] = {
CLEAR_LEVEL(),
SLEEP_BEFORE_EXIT(/*frames*/ 1),
SET_REG(/*value*/ START_LEVEL),
EXIT_AND_EXECUTE(/*seg*/ 0x15, _scriptsSegmentRomStart, _scriptsSegmentRomEnd, level_main_scripts_entry),
EXIT_AND_EXECUTE(/*seg*/ SEGMENT_GLOBAL_LEVEL_SCRIPT, _scriptsSegmentRomStart, _scriptsSegmentRomEnd, level_main_scripts_entry),
};
const LevelScript level_main_menu_entry_act_select[] = {
@@ -62,7 +62,7 @@ const LevelScript level_main_menu_entry_act_select[] = {
/*2*/ JUMP_IF(/*op*/ OP_EQ, /*arg*/ FALSE, (level_main_menu_entry_act_select + 42)), // goto L1 (exit)
/*5*/ INIT_LEVEL(),
/*6*/ FIXED_LOAD(/*loadAddr*/ _goddardSegmentStart, /*romStart*/ _goddardSegmentRomStart, /*romEnd*/ _goddardSegmentRomEnd),
/*10*/ LOAD_YAY0(/*seg*/ 0x07, _menu_segment_7SegmentRomStart, _menu_segment_7SegmentRomEnd),
/*10*/ LOAD_YAY0(/*seg*/ SEGMENT_LEVEL_DATA, _menu_segment_7SegmentRomStart, _menu_segment_7SegmentRomEnd),
/*13*/ ALLOC_LEVEL_POOL(),
/*14*/ AREA(/*index*/ 2, geo_menu_act_selector_strings),

View File

@@ -45,23 +45,23 @@ static const LevelScript script_exec_level_table[2
#undef STUB_LEVEL
static const LevelScript goto_intro_splash_screen[] = {
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ 0x14, _introSegmentRomStart, _introSegmentRomEnd, level_intro_splash_screen, _introSegmentBssStart, _introSegmentBssEnd),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ SEGMENT_MENU_INTRO, _introSegmentRomStart, _introSegmentRomEnd, level_intro_splash_screen, _introSegmentBssStart, _introSegmentBssEnd),
};
static const LevelScript goto_ending[] = {
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ 0x0E, _endingSegmentRomStart, _endingSegmentRomEnd, level_ending_entry, _endingSegmentBssStart, _endingSegmentBssEnd),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ SEGMENT_ENDING_SCRIPT, _endingSegmentRomStart, _endingSegmentRomEnd, level_ending_entry, _endingSegmentBssStart, _endingSegmentBssEnd),
};
static const LevelScript goto_mario_head_regular[] = {
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ 0x14, _introSegmentRomStart, _introSegmentRomEnd, level_intro_mario_head_regular, _introSegmentBssStart, _introSegmentBssEnd),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ SEGMENT_MENU_INTRO, _introSegmentRomStart, _introSegmentRomEnd, level_intro_mario_head_regular, _introSegmentBssStart, _introSegmentBssEnd),
};
static const LevelScript goto_mario_head_dizzy[] = {
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ 0x14, _introSegmentRomStart, _introSegmentRomEnd, level_intro_mario_head_dizzy, _introSegmentBssStart, _introSegmentBssEnd),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ SEGMENT_MENU_INTRO, _introSegmentRomStart, _introSegmentRomEnd, level_intro_mario_head_dizzy, _introSegmentBssStart, _introSegmentBssEnd),
};
static const LevelScript goto_debug_level_select[] = {
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ 0x14, _introSegmentRomStart, _introSegmentRomEnd, level_intro_entry_level_select, _introSegmentBssStart, _introSegmentBssEnd),
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ SEGMENT_MENU_INTRO, _introSegmentRomStart, _introSegmentRomEnd, level_intro_entry_level_select, _introSegmentBssStart, _introSegmentBssEnd),
};
#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8)
@@ -73,11 +73,11 @@ static const LevelScript goto_debug_level_select[] = {
#undef STUB_LEVEL
const LevelScript level_main_scripts_entry[] = {
LOAD_YAY0( /*seg*/ 0x04, _group0_yay0SegmentRomStart, _group0_yay0SegmentRomEnd),
LOAD_YAY0( /*seg*/ 0x03, _common1_yay0SegmentRomStart, _common1_yay0SegmentRomEnd),
LOAD_RAW_WITH_CODE( /*seg*/ 0x17, _group0_geoSegmentRomStart, _group0_geoSegmentRomEnd, _group0_geoSegmentBssStart, _group0_geoSegmentBssEnd),
LOAD_RAW_WITH_CODE( /*seg*/ 0x16, _common1_geoSegmentRomStart, _common1_geoSegmentRomEnd, _common1_geoSegmentBssStart, _common1_geoSegmentBssEnd),
LOAD_RAW_WITH_CODE( /*seg*/ 0x13, _behaviorSegmentRomStart, _behaviorSegmentRomEnd, _behaviorSegmentBssStart, _behaviorSegmentBssEnd),
LOAD_YAY0( /*seg*/ SEGMENT_GROUP0_YAY0, _group0_yay0SegmentRomStart, _group0_yay0SegmentRomEnd),
LOAD_YAY0( /*seg*/ SEGMENT_COMMON1_YAY0, _common1_yay0SegmentRomStart, _common1_yay0SegmentRomEnd),
LOAD_RAW_WITH_CODE( /*seg*/ SEGMENT_GROUP0_GEO, _group0_geoSegmentRomStart, _group0_geoSegmentRomEnd, _group0_geoSegmentBssStart, _group0_geoSegmentBssEnd),
LOAD_RAW_WITH_CODE( /*seg*/ SEGMENT_COMMON1_GEO, _common1_geoSegmentRomStart, _common1_geoSegmentRomEnd, _common1_geoSegmentBssStart, _common1_geoSegmentBssEnd),
LOAD_RAW_WITH_CODE( /*seg*/ SEGMENT_BEHAVIOR_DATA, _behaviorSegmentRomStart, _behaviorSegmentRomEnd, _behaviorSegmentBssStart, _behaviorSegmentBssEnd),
ALLOC_LEVEL_POOL(),
LOAD_MODEL_FROM_GEO(MODEL_MARIO, mario_geo),
LOAD_MODEL_FROM_GEO(MODEL_SMOKE, smoke_geo),
@@ -132,7 +132,7 @@ const LevelScript level_main_scripts_entry[] = {
FREE_LEVEL_POOL(),
CALL(/*arg*/ 0, /*func*/ lvl_init_from_save_file),
LOOP_BEGIN(),
EXECUTE(/*seg*/ 0x14, _menuSegmentRomStart, _menuSegmentRomEnd, level_main_menu_entry_act_select),
EXECUTE(/*seg*/ SEGMENT_MENU_INTRO, _menuSegmentRomStart, _menuSegmentRomEnd, level_main_menu_entry_act_select),
JUMP_LINK(script_exec_level_table),
SLEEP(/*frames*/ 1),
LOOP_UNTIL(/*op*/ OP_LT, /*arg*/ WARP_SPECIAL_NONE),

165
sm64.ld
View File

@@ -31,7 +31,7 @@ OUTPUT_ARCH (mips)
} \
END_SEG(name##_yay0) \
_##name##_mio0SegmentRomStart = _##name##_yay0SegmentRomStart; \
_##name##_mio0SegmentRomEnd = _##name##_yay0SegmentRomEnd;
_##name##_mio0SegmentRomEnd = _##name##_yay0SegmentRomEnd;
#define YAY0_EU_SEG(name, segAddr) \
BEGIN_SEG(name##_yay0, segAddr) \
@@ -41,16 +41,16 @@ OUTPUT_ARCH (mips)
} \
END_SEG(name##_yay0) \
_##name##_mio0SegmentRomStart = _##name##_yay0SegmentRomStart; \
_##name##_mio0SegmentRomEnd = _##name##_yay0SegmentRomEnd;
_##name##_mio0SegmentRomEnd = _##name##_yay0SegmentRomEnd;
#define STANDARD_LEVEL(name) \
BEGIN_SEG(name##_segment_7, 0x07000000) \
BEGIN_SEG(name##_segment_7, SEG_ADDRESS(SEGMENT_LEVEL_DATA)) \
{ \
KEEP(BUILD_DIR/levels/name/leveldata.szp.o(.data)); \
. = ALIGN(0x10); \
} \
END_SEG(name##_segment_7) \
BEGIN_SEG(name, 0x0E000000) \
BEGIN_SEG(name, SEG_ADDRESS(SEGMENT_ENDING_SCRIPT)) \
{ \
KEEP(BUILD_DIR/levels/name/script.o(.*data*)); \
KEEP(BUILD_DIR/levels/name/script.o(.text)); \
@@ -93,14 +93,14 @@ SECTIONS
{
__romPos = 0;
BEGIN_SEG(boot, 0x04000000)
BEGIN_SEG(boot, SEG_ADDRESS(SEGMENT_GROUP0_YAY0))
{
KEEP(BUILD_DIR/asm/rom_header.o(.text));
KEEP(BUILD_DIR/asm/boot.o(.text));
}
END_SEG(boot)
. = 0x80000400;
. = (RAM_START + 0x400);
BEGIN_NOLOAD(zbuffer)
{
BUILD_DIR/src/buffers/zbuffer.o(.bss*);
@@ -146,12 +146,12 @@ SECTIONS
/* hardcoded symbols to satisfy preliminary link for map parser */
#ifndef DEBUG_MAP_STACKTRACE
parse_map = 0x80345678;
find_function_in_stack = 0x80345678;
parse_map = MAP_PARSER_ADDRESS;
find_function_in_stack = MAP_PARSER_ADDRESS;
_mapDataSegmentRomStart = 0;
gMapEntries = 0;
gMapEntries = 0;
gMapEntrySize = 0;
gMapStrings = 0;
gMapStrings = 0;
#endif
BEGIN_SEG(main, .) SUBALIGN(16)
@@ -278,57 +278,57 @@ SECTIONS
END_NOLOAD(framebuffers)
__mainPoolStart = .;
__mainPoolSize = RAM_END - .;
__mainPoolSize = (RAM_END - .);
__expansionRamStart = 0x80400000;
#ifndef USE_EXT_RAM
#ifndef PRELIMINARY
__expansionRamStart = (RAM_START + (RAM_1MB * 4));
#ifndef USE_EXT_RAM
#ifndef PRELIMINARY
ASSERT((. <= __expansionRamStart), "Error: RDRAM expanded into Expansion RAM, despite Expansion RAM not being defined.")
#endif
#endif
#endif
BEGIN_SEG(entry, 0x10000000)
BEGIN_SEG(entry, SEG_ADDRESS(SEGMENT_LEVEL_ENTRY))
{
BUILD_DIR/levels/entry.o(.data);
}
END_SEG(entry)
/* load YAY0 and level data */
YAY0_SEG(segment2, 0x02000000)
YAY0_SEG(segment2, SEG_ADDRESS(SEGMENT_SEGMENT2))
#ifdef VERSION_EU
YAY0_EU_SEG(translation_en, 0x19000000)
YAY0_EU_SEG(translation_fr, 0x19000000)
YAY0_EU_SEG(translation_de, 0x19000000)
YAY0_EU_SEG(translation_en, SEG_ADDRESS(SEGMENT_EU_TRANSLATION))
YAY0_EU_SEG(translation_fr, SEG_ADDRESS(SEGMENT_EU_TRANSLATION))
YAY0_EU_SEG(translation_de, SEG_ADDRESS(SEGMENT_EU_TRANSLATION))
#endif
/* mario actor group */
STANDARD_OBJECTS(group0, 0x04000000, 0x17000000)
STANDARD_OBJECTS(group0, SEG_ADDRESS(SEGMENT_GROUP0_YAY0), SEG_ADDRESS(SEGMENT_GROUP0_GEO))
/* load the other actor groups */
STANDARD_OBJECTS(group1, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group2, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group3, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group4, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group5, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group6, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group7, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group8, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group9, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group10, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group11, 0x05000000, 0x0C000000)
STANDARD_OBJECTS(group12, 0x06000000, 0x0D000000)
STANDARD_OBJECTS(group13, 0x06000000, 0x0D000000)
STANDARD_OBJECTS(group14, 0x06000000, 0x0D000000)
STANDARD_OBJECTS(group15, 0x06000000, 0x0D000000)
STANDARD_OBJECTS(group16, 0x06000000, 0x0D000000)
STANDARD_OBJECTS(group17, 0x06000000, 0x0D000000)
STANDARD_OBJECTS(group1, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group2, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group3, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group4, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group5, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group6, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group7, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group8, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group9, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group10, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group11, SEG_ADDRESS(SEGMENT_GROUPA_YAY0), SEG_ADDRESS(SEGMENT_GROUPA_GEO))
STANDARD_OBJECTS(group12, SEG_ADDRESS(SEGMENT_GROUPB_YAY0), SEG_ADDRESS(SEGMENT_GROUPB_GEO))
STANDARD_OBJECTS(group13, SEG_ADDRESS(SEGMENT_GROUPB_YAY0), SEG_ADDRESS(SEGMENT_GROUPB_GEO))
STANDARD_OBJECTS(group14, SEG_ADDRESS(SEGMENT_GROUPB_YAY0), SEG_ADDRESS(SEGMENT_GROUPB_GEO))
STANDARD_OBJECTS(group15, SEG_ADDRESS(SEGMENT_GROUPB_YAY0), SEG_ADDRESS(SEGMENT_GROUPB_GEO))
STANDARD_OBJECTS(group16, SEG_ADDRESS(SEGMENT_GROUPB_YAY0), SEG_ADDRESS(SEGMENT_GROUPB_GEO))
STANDARD_OBJECTS(group17, SEG_ADDRESS(SEGMENT_GROUPB_YAY0), SEG_ADDRESS(SEGMENT_GROUPB_GEO))
/* load the common actor groups */
STANDARD_OBJECTS(common0, 0x08000000, 0x0F000000)
STANDARD_OBJECTS(common1, 0x03000000, 0x16000000)
STANDARD_OBJECTS(common0, SEG_ADDRESS(SEGMENT_COMMON0_YAY0), SEG_ADDRESS(SEGMENT_COMMON0_GEO))
STANDARD_OBJECTS(common1, SEG_ADDRESS(SEGMENT_COMMON1_YAY0), SEG_ADDRESS(SEGMENT_COMMON1_GEO))
/* use segmented addressing for behaviors */
BEGIN_SEG(behavior, 0x13000000)
BEGIN_SEG(behavior, SEG_ADDRESS(SEGMENT_BEHAVIOR_DATA))
{
KEEP(BUILD_DIR/data/behavior_data.o(.data*));
KEEP(BUILD_DIR/data/behavior_data.o(.rodata*));
@@ -343,13 +343,13 @@ SECTIONS
/* 0x8016F000 21D7D0-255EC0 [386F0] */
BEGIN_SEG(goddard, RAM_END - GODDARD_SIZE)
BEGIN_SEG(goddard, (RAM_END - GODDARD_SIZE))
{
KEEP(BUILD_DIR/src/menu*.o(.text));
_goddardSegmentTextEnd = .;
KEEP(BUILD_DIR/src/menu*.o(.data*));
KEEP(BUILD_DIR/src/menu*.o(.rodata*));
#ifdef KEEP_MARIO_HEAD
#ifdef KEEP_MARIO_HEAD
KEEP(BUILD_DIR/libgoddard.a:*.o(.text));
KEEP(BUILD_DIR/libgoddard.a:gd_main.o(.data*));
KEEP(BUILD_DIR/libgoddard.a:draw_objects.o(.data*));
@@ -374,29 +374,28 @@ SECTIONS
KEEP(BUILD_DIR/libgoddard.a:gd_math.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:shape_helper.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:renderer.o(.rodata*));
#endif
#endif
. = ALIGN(16);
}
END_SEG(goddard)
BEGIN_NOLOAD(goddard)
{
KEEP(BUILD_DIR/src/menu*.o(.bss*));
#ifdef KEEP_MARIO_HEAD
#ifdef KEEP_MARIO_HEAD
KEEP(BUILD_DIR/libgoddard.a:*.o(.bss*));
#endif
#endif
. = ALIGN(16);
}
END_NOLOAD(goddard)
#ifndef PRELIMINARY
ASSERT((. <= (SEG_POOL_START + POOL_SIZE)), "Error: extended past pool end.")
#endif
#ifdef PRELIMINARY
#ifdef PRELIMINARY
GODDARD_SIZE = SIZEOF(.goddard) + SIZEOF(.goddard.noload);
#endif
#else
ASSERT((. <= (SEG_POOL_START + POOL_SIZE)), "Error: extended past pool end.")
#endif
/* 0x268020 0x268020-0 [0] */
BEGIN_SEG(intro, 0x14000000)
BEGIN_SEG(intro, SEG_ADDRESS(SEGMENT_MENU_INTRO))
{
KEEP(BUILD_DIR/levels/intro/script.o(.*data));
KEEP(BUILD_DIR/levels/intro/script.o(.rodata*));
@@ -409,18 +408,18 @@ SECTIONS
KEEP(BUILD_DIR/levels/intro/script.o(.bss*));
}
END_NOLOAD(intro)
BEGIN_SEG(intro_segment_7, 0x07000000)
BEGIN_SEG(intro_segment_7, SEG_ADDRESS(SEGMENT_LEVEL_DATA))
{
KEEP(BUILD_DIR/levels/intro/leveldata.szp.o(.data));
. = ALIGN(0x10);
}
END_SEG(intro_segment_7)
YAY0_SEG(debug_level_select, 0x07000000)
YAY0_SEG(title_screen_bg, 0x0A000000)
YAY0_SEG(debug_level_select, SEG_ADDRESS(SEGMENT_LEVEL_DATA))
YAY0_SEG(title_screen_bg, SEG_ADDRESS(SEGMENT_SKYBOX))
#ifdef KEEP_MARIO_HEAD
BEGIN_SEG(gd_dynlists, 0x04000000)
BEGIN_SEG(gd_dynlists, SEG_ADDRESS(SEGMENT_GROUP0_YAY0))
{
BUILD_DIR/libgoddard.a:dynlist_test_cube.o(.data);
BUILD_DIR/libgoddard.a:dynlist_unused.o(.data);
@@ -445,50 +444,50 @@ SECTIONS
gMainLevels = __romPos;
BEGIN_SEG(menu, 0x14000000)
BEGIN_SEG(menu, SEG_ADDRESS(SEGMENT_MENU_INTRO))
{
KEEP(BUILD_DIR/levels/menu/script.o(.data));
KEEP(BUILD_DIR/levels/menu/geo.o(.data));
}
END_SEG(menu)
BEGIN_SEG(menu_segment_7, 0x07000000)
BEGIN_SEG(menu_segment_7, SEG_ADDRESS(SEGMENT_LEVEL_DATA))
{
KEEP(BUILD_DIR/levels/menu/leveldata.szp.o(.data));
. = ALIGN(0x10);
}
END_SEG(menu_segment_7)
BEGIN_SEG(scripts, 0x15000000)
BEGIN_SEG(scripts, SEG_ADDRESS(SEGMENT_GLOBAL_LEVEL_SCRIPT))
{
BUILD_DIR/levels/scripts.o(.data);
}
END_SEG(scripts)
YAY0_SEG(water_skybox, 0x0A000000)
YAY0_SEG(ccm_skybox, 0x0A000000)
YAY0_SEG(clouds_skybox, 0x0A000000)
YAY0_SEG(bitfs_skybox, 0x0A000000)
YAY0_SEG(wdw_skybox, 0x0A000000)
YAY0_SEG(cloud_floor_skybox, 0x0A000000)
YAY0_SEG(ssl_skybox, 0x0A000000)
YAY0_SEG(bbh_skybox, 0x0A000000)
YAY0_SEG(bidw_skybox, 0x0A000000)
YAY0_SEG(bits_skybox, 0x0A000000)
YAY0_SEG(water_skybox, SEG_ADDRESS(SEGMENT_SKYBOX))
YAY0_SEG(ccm_skybox, SEG_ADDRESS(SEGMENT_SKYBOX))
YAY0_SEG(clouds_skybox, SEG_ADDRESS(SEGMENT_SKYBOX))
YAY0_SEG(bitfs_skybox, SEG_ADDRESS(SEGMENT_SKYBOX))
YAY0_SEG(wdw_skybox, SEG_ADDRESS(SEGMENT_SKYBOX))
YAY0_SEG(cloud_floor_skybox, SEG_ADDRESS(SEGMENT_SKYBOX))
YAY0_SEG(ssl_skybox, SEG_ADDRESS(SEGMENT_SKYBOX))
YAY0_SEG(bbh_skybox, SEG_ADDRESS(SEGMENT_SKYBOX))
YAY0_SEG(bidw_skybox, SEG_ADDRESS(SEGMENT_SKYBOX))
YAY0_SEG(bits_skybox, SEG_ADDRESS(SEGMENT_SKYBOX))
// Texture bins
YAY0_SEG(fire, 0x09000000)
YAY0_SEG(spooky, 0x09000000)
YAY0_SEG(generic, 0x09000000)
YAY0_SEG(water, 0x09000000)
YAY0_SEG(sky, 0x09000000)
YAY0_SEG(snow, 0x09000000)
YAY0_SEG(cave, 0x09000000)
YAY0_SEG(machine, 0x09000000)
YAY0_SEG(mountain, 0x09000000)
YAY0_SEG(grass, 0x09000000)
YAY0_SEG(outside, 0x09000000)
YAY0_SEG(inside, 0x09000000)
YAY0_SEG(effect, 0x0B000000)
YAY0_SEG(fire, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(spooky, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(generic, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(water, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(sky, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(snow, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(cave, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(machine, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(mountain, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(grass, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(outside, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(inside, SEG_ADDRESS(SEGMENT_TEXTURE))
YAY0_SEG(effect, SEG_ADDRESS(SEGMENT_EFFECT_YAY0))
#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8)
#define DEFINE_LEVEL(_0, _1, _2, folder, _4, _5, _6, _7, _8, _9, _10) STANDARD_LEVEL(folder)
@@ -516,7 +515,7 @@ SECTIONS
#endif
#ifdef DEBUG_MAP_STACKTRACE
BEGIN_SEG(mapData, 0x80700000) {
BEGIN_SEG(mapData, (RAM_END - 0x00100000)) {
KEEP(BUILD_DIR/asm/debug/map.o(.data*));
}
END_SEG(mapData)

View File

@@ -97,20 +97,20 @@ void setup_mesg_queues(void) {
osCreateMesgQueue(&gIntrMesgQueue, gIntrMesgBuf, ARRAY_COUNT(gIntrMesgBuf));
osViSetEvent(&gIntrMesgQueue, (OSMesg) MESG_VI_VBLANK, 1);
osSetEventMesg(OS_EVENT_SP, &gIntrMesgQueue, (OSMesg) MESG_SP_COMPLETE);
osSetEventMesg(OS_EVENT_DP, &gIntrMesgQueue, (OSMesg) MESG_DP_COMPLETE);
osSetEventMesg(OS_EVENT_SP, &gIntrMesgQueue, (OSMesg) MESG_SP_COMPLETE);
osSetEventMesg(OS_EVENT_DP, &gIntrMesgQueue, (OSMesg) MESG_DP_COMPLETE);
osSetEventMesg(OS_EVENT_PRENMI, &gIntrMesgQueue, (OSMesg) MESG_NMI_REQUEST);
}
void alloc_pool(void) {
void *start = (void *) SEG_POOL_START;
void *end = (void *) (SEG_POOL_START + POOL_SIZE);
void *start = (void *) SEG_POOL_START;
void *end = (void *) (SEG_POOL_START + POOL_SIZE);
main_pool_init(start, end);
gEffectsMemoryPool = mem_pool_init(0x4000, MEMORY_POOL_LEFT);
#ifdef PUPPYLIGHTS
#ifdef PUPPYLIGHTS
gLightsPool = mem_pool_init(PUPPYLIGHTS_POOL, MEMORY_POOL_LEFT);
#endif
#endif
}
void create_thread(OSThread *thread, OSId id, void (*entry)(void *), void *arg, void *sp, OSPri pri) {

View File

@@ -311,18 +311,25 @@ static void level_cmd_init_level(void) {
}
extern s32 gTlbEntries;
extern u8 gTlbSegments[NUM_TLB_SEGMENTS];
extern u8 gTlbSegments[NUM_TLB_SEGMENTS];
// This clears all the temporary bank TLB maps. group0, common1 and behavourdata are always loaded,
// and they're also loaded first, so that means we just leave the first 3 indexes mapped.
void unmap_tlbs(void) {
s32 i;
for (i = 0; i < NUM_TLB_SEGMENTS; i++) {
if (gTlbSegments[i] && i != 0x17 && i != 0x16 && i != 0x13) {
while (gTlbSegments[i] > 0) {
osUnmapTLB(gTlbEntries);
gTlbSegments[i]--;
gTlbEntries--;
if (gTlbSegments[i]) {
if ((i != SEGMENT_GROUP0_GEO)
&& (i != SEGMENT_COMMON1_GEO)
&& (i != SEGMENT_BEHAVIOR_DATA)) {
while (gTlbSegments[i] > 0) {
osUnmapTLB(gTlbEntries);
gTlbSegments[i]--;
gTlbEntries--;
}
} else {
gTlbEntries -= gTlbSegments[i];
gTlbSegments[i] = 0;
}
}
}

View File

@@ -132,7 +132,7 @@ void print_intro_text(void) {
u32 get_mario_spawn_type(struct Object *obj) {
s32 i;
const BehaviorScript *behavior = virtual_to_segmented(0x13, obj->behavior);
const BehaviorScript *behavior = virtual_to_segmented(SEGMENT_BEHAVIOR_DATA, obj->behavior);
for (i = 0; i < 20; i++) {
if (sWarpBhvSpawnTable[i] == behavior) {
@@ -261,7 +261,7 @@ void load_mario_area(void) {
spawn_objects_from_info(gMarioSpawnInfo);
}
if (gAreaSkyboxStart[gCurrAreaIndex - 1]) {
load_segment_decompress(0x0A, gAreaSkyboxStart[gCurrAreaIndex - 1], gAreaSkyboxEnd[gCurrAreaIndex - 1]);
load_segment_decompress(SEGMENT_SKYBOX, gAreaSkyboxStart[gCurrAreaIndex - 1], gAreaSkyboxEnd[gCurrAreaIndex - 1]);
}
}
@@ -427,7 +427,6 @@ void render_game(void) {
#if PUPPYPRINT_DEBUG
profiler_update(graphTime, first);
graphTime[perfIteration] -= (collisionTime[perfIteration] - colTime);
graphTime[perfIteration] -= profilerTime[perfIteration];
#endif
#if PUPPYPRINT_DEBUG
puppyprint_render_profiler();

View File

@@ -183,7 +183,7 @@ void draw_crash_context(OSThread *thread, s32 cause) {
crash_screen_print(30, 30, "PC:%08XH SR:%08XH VA:%08XH", tc->pc, tc->sr, tc->badvaddr);
osWritebackDCacheAll();
crash_screen_draw_rect(15, 45, 270, 185);
if ((u32)parse_map != 0x80345678) {
if ((u32)parse_map != MAP_PARSER_ADDRESS) {
char *fname = parse_map(tc->pc);
crash_screen_print(30, 40, "CRASH AT: %s", fname == NULL ? "UNKNOWN" : fname);
}
@@ -241,7 +241,7 @@ void draw_stacktrace(OSThread *thread, UNUSED s32 cause) {
crash_screen_draw_rect(25, 20, 270, 210);
crash_screen_print(30, 25, "STACK TRACE FROM %08X:", temp_sp);
if ((u32) parse_map == 0x80345678) {
if ((u32) parse_map == MAP_PARSER_ADDRESS) {
crash_screen_print(30, 35, "CURRFUNC: NONE");
} else {
crash_screen_print(30, 35, "CURRFUNC: %s", parse_map(tc->pc));
@@ -250,11 +250,11 @@ void draw_stacktrace(OSThread *thread, UNUSED s32 cause) {
osWritebackDCacheAll();
for (int i = 0; i < 18; i++) {
if ((u32) find_function_in_stack == 0x80345678) {
if ((u32) find_function_in_stack == MAP_PARSER_ADDRESS) {
crash_screen_print(30, (45 + (i * 10)), "STACK TRACE DISABLED");
break;
} else {
if ((u32) find_function_in_stack == 0x80345678) {
if ((u32) find_function_in_stack == MAP_PARSER_ADDRESS) {
return;
}
@@ -388,7 +388,7 @@ void thread2_crash_screen(UNUSED void *arg) {
osSetEventMesg(OS_EVENT_FAULT, &gCrashScreen.mesgQueue, (OSMesg) 2);
goto finished;
reset:
if ((u32) map_data_init != 0x80345678) {
if ((u32) map_data_init != MAP_PARSER_ADDRESS) {
map_data_init();
}
gCrashScreen.thread.priority = 15;

View File

@@ -355,7 +355,7 @@ void render_init(void) {
gBorderHeight = BORDER_HEIGHT_CONSOLE;
}
gGfxPool = &gGfxPools[0];
set_segment_base_addr(1, gGfxPool->buffer);
set_segment_base_addr(SEGMENT_RENDER, gGfxPool->buffer);
gGfxSPTask = &gGfxPool->spTask;
gDisplayListHead = gGfxPool->buffer;
gGfxPoolEnd = (u8 *)(gGfxPool->buffer + GFX_POOL_SIZE);
@@ -377,7 +377,7 @@ void render_init(void) {
*/
void select_gfx_pool(void) {
gGfxPool = &gGfxPools[gGlobalTimer % ARRAY_COUNT(gGfxPools)];
set_segment_base_addr(1, gGfxPool->buffer);
set_segment_base_addr(SEGMENT_RENDER, gGfxPool->buffer);
gGfxSPTask = &gGfxPool->spTask;
gDisplayListHead = gGfxPool->buffer;
gGfxPoolEnd = (u8 *) (gGfxPool->buffer + GFX_POOL_SIZE);
@@ -640,7 +640,7 @@ void init_controllers(void) {
*/
void setup_game_memory(void) {
// Setup general Segment 0
set_segment_base_addr(0, (void *) 0x80000000);
set_segment_base_addr(SEGMENT_MAIN, (void *) 0x80000000);
// Create Mesg Queues
osCreateMesgQueue( &gGfxVblankQueue, gGfxMesgBuf, ARRAY_COUNT( gGfxMesgBuf));
osCreateMesgQueue(&gGameVblankQueue, gGameMesgBuf, ARRAY_COUNT(gGameMesgBuf));
@@ -651,16 +651,16 @@ void setup_game_memory(void) {
gPhysicalFramebuffers[2] = VIRTUAL_TO_PHYSICAL(gFramebuffer2);
// Setup Mario Animations
gMarioAnimsMemAlloc = main_pool_alloc(0x4000, MEMORY_POOL_LEFT);
set_segment_base_addr(17, (void *) gMarioAnimsMemAlloc);
set_segment_base_addr(SEGMENT_MARIO_ANIMS, (void *) gMarioAnimsMemAlloc);
setup_dma_table_list(&gMarioAnimsBuf, gMarioAnims, gMarioAnimsMemAlloc);
// Setup Demo Inputs List
gDemoInputsMemAlloc = main_pool_alloc(0x800, MEMORY_POOL_LEFT);
set_segment_base_addr(24, (void *) gDemoInputsMemAlloc);
set_segment_base_addr(SEGMENT_DEMO_INPUTS, (void *) gDemoInputsMemAlloc);
setup_dma_table_list(&gDemoInputsBuf, gDemoInputs, gDemoInputsMemAlloc);
// Setup Level Script Entry
load_segment(0x10, _entrySegmentRomStart, _entrySegmentRomEnd, MEMORY_POOL_LEFT, NULL, NULL);
load_segment(SEGMENT_LEVEL_ENTRY, _entrySegmentRomStart, _entrySegmentRomEnd, MEMORY_POOL_LEFT, NULL, NULL);
// Setup Segment 2 (Fonts, Text, etc)
load_segment_decompress(2, _segment2_mio0SegmentRomStart, _segment2_mio0SegmentRomEnd);
load_segment_decompress(SEGMENT_SEGMENT2, _segment2_mio0SegmentRomStart, _segment2_mio0SegmentRomEnd);
}
/**
@@ -732,8 +732,6 @@ void thread5_game_loop(UNUSED void *arg) {
#endif
#if PUPPYPRINT_DEBUG
profiler_update(scriptTime, lastTime);
scriptTime[perfIteration] -= profilerTime[perfIteration];
scriptTime[perfIteration] -= profilerTime2[perfIteration];
if (benchmarkLoop > 0 && benchOption == 0) {
benchmarkLoop--;
benchMark[benchmarkLoop] = osGetTime() - lastTime;

View File

@@ -1951,12 +1951,10 @@ void print_hud_course_complete_coins(s16 x, s16 y) {
gCourseCompleteCoins++;
play_sound(SOUND_MENU_YOSHI_GAIN_LIVES, gGlobalSoundSource);
#ifndef DISABLE_LIVES
if (gCourseCompleteCoins && (gCourseCompleteCoins % 50) == 0) {
if (gCourseCompleteCoins == 50 || gCourseCompleteCoins == 100 || gCourseCompleteCoins == 150) {
play_sound(SOUND_GENERAL_COLLECT_1UP, gGlobalSoundSource);
gMarioState->numLives++;
}
#endif
}
if (gHudDisplay.coins == gCourseCompleteCoins && gGotFileCoinHiScore) {

View File

@@ -1,5 +1,7 @@
#include <PR/ultratypes.h>
#include <stdio.h>
#include "sm64.h"
#include "macros.h"
#include "farcall.h"
@@ -124,7 +126,7 @@ char *insn_disasm(InsnData insn, u32 isPC) {
break;
case PARAM_JAL:
target = 0x80000000 | ((insn.d & 0x1FFFFFF) * 4);
if ((u32)parse_map != 0x80345678) {
if ((u32)parse_map != MAP_PARSER_ADDRESS) {
strp += sprintf(strp, "%-8s %s", insn_db[i].name,
parse_map(target)
);

View File

@@ -136,7 +136,7 @@ static u8 sPssSlideStarted = FALSE;
* Returns the type of cap Mario is wearing.
*/
u32 get_mario_cap_flag(struct Object *capObject) {
const BehaviorScript *script = virtual_to_segmented(0x13, capObject->behavior);
const BehaviorScript *script = virtual_to_segmented(SEGMENT_BEHAVIOR_DATA, capObject->behavior);
if (script == bhvNormalCap) {
return MARIO_NORMAL_CAP;
@@ -408,7 +408,7 @@ u32 mario_check_object_grab(struct MarioState *m) {
const BehaviorScript *script;
if (m->input & INPUT_INTERACT_OBJ_GRABBABLE) {
script = virtual_to_segmented(0x13, m->interactObj->behavior);
script = virtual_to_segmented(SEGMENT_BEHAVIOR_DATA, m->interactObj->behavior);
if (script == bhvBowser) {
s16 facingDYaw = abs_angle_diff(m->faceAngle[1], m->interactObj->oMoveAngleYaw);
@@ -1556,7 +1556,7 @@ u32 interact_cap(struct MarioState *m, UNUSED u32 interactType, struct Object *o
}
u32 interact_grabbable(struct MarioState *m, u32 interactType, struct Object *obj) {
const BehaviorScript *script = virtual_to_segmented(0x13, obj->behavior);
const BehaviorScript *script = virtual_to_segmented(SEGMENT_BEHAVIOR_DATA, obj->behavior);
if (obj->oInteractionSubtype & INT_SUBTYPE_KICKABLE) {
u32 interaction = determine_interaction(m, obj);

Some files were not shown because too many files have changed in this diff Show More