mirror of
https://github.com/pmret/papermario.git
synced 2024-11-23 05:39:44 +00:00
More shiftability fixes (#1203)
This commit is contained in:
parent
888b27eec8
commit
41e7f56f0e
@ -11,6 +11,6 @@ intervaltree
|
|||||||
n64img
|
n64img
|
||||||
python-githooks
|
python-githooks
|
||||||
crunch64>=0.5.1
|
crunch64>=0.5.1
|
||||||
spimdisasm>=1.28.1
|
spimdisasm>=1.30.0
|
||||||
splat64>=0.27.0
|
splat64>=0.27.2
|
||||||
requests
|
requests
|
||||||
|
@ -8,7 +8,8 @@
|
|||||||
#include "ld_addrs.h"
|
#include "ld_addrs.h"
|
||||||
|
|
||||||
#ifdef SHIFT
|
#ifdef SHIFT
|
||||||
#define PLAYER_ACTION_VRAM_DEF texture_memory_VRAM_END
|
extern Addr world_action_CLASS_VRAM;
|
||||||
|
#define PLAYER_ACTION_VRAM_DEF world_action_CLASS_VRAM
|
||||||
#else
|
#else
|
||||||
#define PLAYER_ACTION_VRAM_DEF (void*) 0x802B6000
|
#define PLAYER_ACTION_VRAM_DEF (void*) 0x802B6000
|
||||||
#endif
|
#endif
|
||||||
|
@ -321,7 +321,7 @@ s32 load_effect(s32 effectIndex) {
|
|||||||
|
|
||||||
// Map space for the effect
|
// Map space for the effect
|
||||||
tlbMappablePages = &D_80197000;
|
tlbMappablePages = &D_80197000;
|
||||||
osMapTLB(i, 0, effectEntry->dmaDest, (s32)((*tlbMappablePages)[i]) & 0xFFFFFF, -1, -1);
|
osMapTLB(i, OS_PM_4K, effectEntry->dmaDest, (s32)((*tlbMappablePages)[i]) & 0xFFFFFF, -1, -1);
|
||||||
|
|
||||||
// Copy the effect into the newly mapped space
|
// Copy the effect into the newly mapped space
|
||||||
dma_copy(effectEntry->dmaStart, effectEntry->dmaEnd, effectEntry->dmaDest);
|
dma_copy(effectEntry->dmaStart, effectEntry->dmaEnd, effectEntry->dmaDest);
|
||||||
|
16
src/heaps.c
16
src/heaps.c
@ -5,12 +5,12 @@
|
|||||||
typedef s32 TlbEntry[0x1000 / 4];
|
typedef s32 TlbEntry[0x1000 / 4];
|
||||||
typedef TlbEntry TlbMappablePage[15];
|
typedef TlbEntry TlbMappablePage[15];
|
||||||
|
|
||||||
BSS TlbMappablePage D_80197000;
|
BSS TlbMappablePage D_80197000 ALIGNED(0x1000);
|
||||||
BSS u8 D_801A6000[0x1000];
|
BSS u8 D_801A6000[0x1000] ALIGNED(0x1000);
|
||||||
BSS u8 BattleEntityHeapBottom[0x3000];
|
BSS u8 BattleEntityHeapBottom[0x3000] ALIGNED(0x1000);
|
||||||
BSS u8 AuHeapBase[AUDIO_HEAP_SIZE];
|
BSS u8 AuHeapBase[AUDIO_HEAP_SIZE] ALIGNED(0x1000);
|
||||||
BSS u8 D_80200000[0x4000];
|
BSS u8 D_80200000[0x4000] ALIGNED(0x1000);
|
||||||
BSS u8 D_80204000[0x3000];
|
BSS u8 D_80204000[0x3000] ALIGNED(0x1000);
|
||||||
BSS u8 D_80207000[0x3000];
|
BSS u8 D_80207000[0x3000] ALIGNED(0x1000);
|
||||||
BSS u8 D_8020A000[0x6000];
|
BSS u8 D_8020A000[0x6000] ALIGNED(0x1000);
|
||||||
BSS ShapeFile gMapShapeData;
|
BSS ShapeFile gMapShapeData;
|
||||||
|
@ -632,8 +632,8 @@ void msg_play_speech_sound(MessagePrintState* printer, u8 character) {
|
|||||||
|
|
||||||
extern s32 gItemIconRasterOffsets[];
|
extern s32 gItemIconRasterOffsets[];
|
||||||
extern s32 gItemIconPaletteOffsets[];
|
extern s32 gItemIconPaletteOffsets[];
|
||||||
extern u8* MsgLetterRasterOffsets[];
|
extern IMG_PTR MsgLetterRasterOffsets[];
|
||||||
extern u16* MsgLetterPaletteOffsets[];
|
extern PAL_PTR MsgLetterPaletteOffsets[];
|
||||||
extern MsgVoice MsgVoices[];
|
extern MsgVoice MsgVoices[];
|
||||||
|
|
||||||
#if VERSION_PAL
|
#if VERSION_PAL
|
||||||
|
@ -875,7 +875,7 @@ MessageCharset* MsgCharsets[] = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
u8* MsgLetterRasterOffsets[] = {
|
IMG_PTR MsgLetterRasterOffsets[] = {
|
||||||
charset_letter_content_1_OFFSET,
|
charset_letter_content_1_OFFSET,
|
||||||
charset_letter_content_2_OFFSET,
|
charset_letter_content_2_OFFSET,
|
||||||
charset_letter_content_3_OFFSET,
|
charset_letter_content_3_OFFSET,
|
||||||
@ -890,7 +890,7 @@ u8* MsgLetterRasterOffsets[] = {
|
|||||||
charset_letter_content_12_OFFSET,
|
charset_letter_content_12_OFFSET,
|
||||||
};
|
};
|
||||||
|
|
||||||
u16* MsgLetterPaletteOffsets[] = {
|
PAL_PTR MsgLetterPaletteOffsets[] = {
|
||||||
charset_letter_content_1_pal_OFFSET,
|
charset_letter_content_1_pal_OFFSET,
|
||||||
charset_letter_content_2_pal_OFFSET,
|
charset_letter_content_2_pal_OFFSET,
|
||||||
charset_letter_content_3_pal_OFFSET,
|
charset_letter_content_3_pal_OFFSET,
|
||||||
|
@ -99,20 +99,21 @@ s32 N(LetterBodyStringIDs)[] = {
|
|||||||
MSG_Document_Letter_Mario12_Body,
|
MSG_Document_Letter_Mario12_Body,
|
||||||
};
|
};
|
||||||
|
|
||||||
u8* N(LetterDmaOffsets)[] = {
|
// TODO mix of image / palette pointers
|
||||||
charset_postcard_OFFSET, (u8*) charset_postcard_pal_OFFSET,
|
IMG_PTR N(LetterDmaOffsets)[] = {
|
||||||
charset_letter_content_1_OFFSET, (u8*) charset_letter_content_1_pal_OFFSET,
|
charset_postcard_OFFSET, (IMG_PTR) charset_postcard_pal_OFFSET,
|
||||||
charset_letter_content_2_OFFSET, (u8*) charset_letter_content_2_pal_OFFSET,
|
charset_letter_content_1_OFFSET, (IMG_PTR) charset_letter_content_1_pal_OFFSET,
|
||||||
charset_letter_content_3_OFFSET, (u8*) charset_letter_content_3_pal_OFFSET,
|
charset_letter_content_2_OFFSET, (IMG_PTR) charset_letter_content_2_pal_OFFSET,
|
||||||
charset_letter_content_4_OFFSET, (u8*) charset_letter_content_4_pal_OFFSET,
|
charset_letter_content_3_OFFSET, (IMG_PTR) charset_letter_content_3_pal_OFFSET,
|
||||||
charset_letter_content_5_OFFSET, (u8*) charset_letter_content_5_pal_OFFSET,
|
charset_letter_content_4_OFFSET, (IMG_PTR) charset_letter_content_4_pal_OFFSET,
|
||||||
charset_letter_content_6_OFFSET, (u8*) charset_letter_content_6_pal_OFFSET,
|
charset_letter_content_5_OFFSET, (IMG_PTR) charset_letter_content_5_pal_OFFSET,
|
||||||
charset_letter_content_7_OFFSET, (u8*) charset_letter_content_7_pal_OFFSET,
|
charset_letter_content_6_OFFSET, (IMG_PTR) charset_letter_content_6_pal_OFFSET,
|
||||||
charset_letter_content_8_OFFSET, (u8*) charset_letter_content_8_pal_OFFSET,
|
charset_letter_content_7_OFFSET, (IMG_PTR) charset_letter_content_7_pal_OFFSET,
|
||||||
charset_letter_content_9_OFFSET, (u8*) charset_letter_content_9_pal_OFFSET,
|
charset_letter_content_8_OFFSET, (IMG_PTR) charset_letter_content_8_pal_OFFSET,
|
||||||
charset_letter_content_10_OFFSET, (u8*) charset_letter_content_10_pal_OFFSET,
|
charset_letter_content_9_OFFSET, (IMG_PTR) charset_letter_content_9_pal_OFFSET,
|
||||||
charset_letter_content_11_OFFSET, (u8*) charset_letter_content_11_pal_OFFSET,
|
charset_letter_content_10_OFFSET, (IMG_PTR) charset_letter_content_10_pal_OFFSET,
|
||||||
charset_letter_content_12_OFFSET, (u8*) charset_letter_content_12_pal_OFFSET,
|
charset_letter_content_11_OFFSET, (IMG_PTR) charset_letter_content_11_pal_OFFSET,
|
||||||
|
charset_letter_content_12_OFFSET, (IMG_PTR) charset_letter_content_12_pal_OFFSET,
|
||||||
};
|
};
|
||||||
|
|
||||||
API_CALLABLE(N(InitLetters)){
|
API_CALLABLE(N(InitLetters)){
|
||||||
|
@ -93,15 +93,6 @@ def write_ninja_rules(
|
|||||||
ld_args = f"-T ver/$version/build/undefined_syms.txt -T ver/$version/undefined_syms_auto.txt -T ver/$version/undefined_funcs_auto.txt -Map $mapfile --no-check-sections -T $in -o $out"
|
ld_args = f"-T ver/$version/build/undefined_syms.txt -T ver/$version/undefined_syms_auto.txt -T ver/$version/undefined_funcs_auto.txt -Map $mapfile --no-check-sections -T $in -o $out"
|
||||||
ld = f"{cross}ld" if not "PAPERMARIO_LD" in os.environ else os.environ["PAPERMARIO_LD"]
|
ld = f"{cross}ld" if not "PAPERMARIO_LD" in os.environ else os.environ["PAPERMARIO_LD"]
|
||||||
|
|
||||||
if shift:
|
|
||||||
# For the shiftable build, we link twice to resolve some addresses that gnu ld can't figure out all in one go.
|
|
||||||
ninja.rule(
|
|
||||||
"ld",
|
|
||||||
description="link($version) $out",
|
|
||||||
command=f"{ld} $$(tools/build/ld/multilink_calc.py $version hardcode) {ld_args} && \
|
|
||||||
{ld} $$(tools/build/ld/multilink_calc.py $version calc) {ld_args}",
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
ninja.rule(
|
ninja.rule(
|
||||||
"ld",
|
"ld",
|
||||||
description="link($version) $out",
|
description="link($version) $out",
|
||||||
|
@ -1,90 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import os
|
|
||||||
from pathlib import Path
|
|
||||||
import sys
|
|
||||||
from typing import Dict, List
|
|
||||||
|
|
||||||
script_dir = Path(os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
root_dir = script_dir / "../../.."
|
|
||||||
|
|
||||||
HARDCODED_ADDR = 0x80000000
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
if len(sys.argv) != 3:
|
|
||||||
print(f"Usage: {sys.argv[0]} <version> <mode>")
|
|
||||||
print("mode: hardcode, calc")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
version = sys.argv[1]
|
|
||||||
mode = sys.argv[2]
|
|
||||||
|
|
||||||
syms_to_max = {
|
|
||||||
"entity_data_vram_end": [
|
|
||||||
"entity_default_VRAM_END",
|
|
||||||
"entity_jan_iwa_VRAM_END",
|
|
||||||
"entity_sbk_omo_VRAM_END",
|
|
||||||
],
|
|
||||||
"world_action_vram_end": [
|
|
||||||
"world_action_idle_VRAM_END",
|
|
||||||
"world_action_walk_VRAM_END",
|
|
||||||
"world_action_jump_VRAM_END",
|
|
||||||
"world_action_step_up_VRAM_END",
|
|
||||||
"world_action_land_VRAM_END",
|
|
||||||
"world_action_hammer_VRAM_END",
|
|
||||||
"world_action_spin_VRAM_END",
|
|
||||||
"world_action_tornado_jump_VRAM_END",
|
|
||||||
"world_action_spin_jump_VRAM_END",
|
|
||||||
"world_action_slide_VRAM_END",
|
|
||||||
"world_action_hit_fire_VRAM_END",
|
|
||||||
"world_action_hit_lava_VRAM_END",
|
|
||||||
"world_action_knockback_VRAM_END",
|
|
||||||
"world_action_misc_VRAM_END",
|
|
||||||
"world_action_use_munchlesia_VRAM_END",
|
|
||||||
"world_action_use_spinning_flower_VRAM_END",
|
|
||||||
"world_action_use_tweester_VRAM_END",
|
|
||||||
"world_action_sneaky_parasol_VRAM_END",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
addrs: Dict[str, List[int]] = {}
|
|
||||||
|
|
||||||
if mode == "hardcode":
|
|
||||||
out = ""
|
|
||||||
for sym in syms_to_max:
|
|
||||||
addrs[sym] = [HARDCODED_ADDR]
|
|
||||||
elif mode == "calc":
|
|
||||||
with open(root_dir / "ver" / version / "build/papermario.map") as f:
|
|
||||||
lines = f.readlines()
|
|
||||||
|
|
||||||
finished = False
|
|
||||||
syms_to_go = set(syms_to_max.keys())
|
|
||||||
for line in lines:
|
|
||||||
for sym in syms_to_max:
|
|
||||||
for max_sym in syms_to_max[sym]:
|
|
||||||
if f"{max_sym} = ." in line:
|
|
||||||
if sym not in addrs:
|
|
||||||
addrs[sym] = []
|
|
||||||
addrs[sym].append(int(line.strip().split()[0], 16))
|
|
||||||
syms_to_max[sym].remove(max_sym)
|
|
||||||
if len(syms_to_max[sym]) == 0:
|
|
||||||
syms_to_go.remove(sym)
|
|
||||||
if not syms_to_go:
|
|
||||||
finished = True
|
|
||||||
if finished:
|
|
||||||
break
|
|
||||||
|
|
||||||
if syms_to_go:
|
|
||||||
print(f"Error: {syms_to_max} not found in map file")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
out_addrs = {sym: max(addrs[sym]) for sym in addrs}
|
|
||||||
|
|
||||||
out_addrs["entity_data_vram_end"] = (
|
|
||||||
out_addrs["entity_data_vram_end"] + out_addrs["world_action_vram_end"] - HARDCODED_ADDR
|
|
||||||
)
|
|
||||||
|
|
||||||
out = ""
|
|
||||||
for sym in out_addrs:
|
|
||||||
out += f" --defsym {sym}=0x{out_addrs[sym]:X}"
|
|
||||||
print(out)
|
|
@ -1,2 +1,3 @@
|
|||||||
options:
|
options:
|
||||||
ld_use_symbolic_vram_addresses: True
|
ld_use_symbolic_vram_addresses: True
|
||||||
|
emit_subalign: False
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
options:
|
options:
|
||||||
ld_use_symbolic_vram_addresses: True
|
ld_use_symbolic_vram_addresses: True
|
||||||
|
emit_subalign: False
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
options:
|
options:
|
||||||
ld_use_symbolic_vram_addresses: True
|
ld_use_symbolic_vram_addresses: True
|
||||||
|
emit_subalign: False
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
options:
|
options:
|
||||||
ld_use_symbolic_vram_addresses: True
|
ld_use_symbolic_vram_addresses: True
|
||||||
|
emit_subalign: False
|
||||||
|
@ -56,10 +56,10 @@ vram_classes:
|
|||||||
# Totally linear past this point
|
# Totally linear past this point
|
||||||
- { name: texture_memory, vram: 0x8028E000, follows_classes: [battle_code, world_script_api] }
|
- { name: texture_memory, vram: 0x8028E000, follows_classes: [battle_code, world_script_api] }
|
||||||
- { name: world_action, vram: 0x802B6000, follows_classes: [texture_memory] }
|
- { name: world_action, vram: 0x802B6000, follows_classes: [texture_memory] }
|
||||||
- { name: indicator_icon, vram: 0x802B7000, vram_symbol: world_action_vram_end } # follows_classes: [world_action] }
|
- { name: indicator_icon, vram: 0x802B7000, follows_classes: [world_action] }
|
||||||
- { name: model_clear_render_tasks, vram: 0x802B7E00, follows_classes: [indicator_icon] }
|
- { name: model_clear_render_tasks, vram: 0x802B7E00, follows_classes: [indicator_icon] }
|
||||||
- { name: area_entities, vram: 0x802BAE00, vram_symbol: model_clear_render_tasks_VRAM_END }
|
- { name: area_entities, vram: 0x802BAE00, vram_symbol: model_clear_render_tasks_VRAM_END }
|
||||||
- { name: world_partner, vram: 0x802BD100, vram_symbol: entity_data_vram_end } # follows_classes: [area_entities] }
|
- { name: world_partner, vram: 0x802BD100, follows_classes: [area_entities] }
|
||||||
- { name: world_use_item, vram: 0x802C0000, follows_classes: [world_partner] }
|
- { name: world_use_item, vram: 0x802C0000, follows_classes: [world_partner] }
|
||||||
- { name: evt, vram: 0x802C3000, vram_symbol: world_use_item_VRAM_END }
|
- { name: evt, vram: 0x802C3000, vram_symbol: world_use_item_VRAM_END }
|
||||||
- { name: engine4, vram: 0x802DBD40, vram_symbol: evt_VRAM_END }
|
- { name: engine4, vram: 0x802DBD40, vram_symbol: evt_VRAM_END }
|
||||||
|
Loading…
Reference in New Issue
Block a user