You've already forked ultrasm64-2
mirror of
https://github.com/HackerN64/ultrasm64-2.git
synced 2026-01-21 10:38:08 -08:00
79
include/ld.h
Normal file
79
include/ld.h
Normal file
@@ -0,0 +1,79 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef USE_EXT_RAM
|
||||
#define ADDR_OR_ALIGN(addr) (addr)
|
||||
#else
|
||||
#define ADDR_OR_ALIGN(addr) ALIGN(0x1000)
|
||||
#endif
|
||||
|
||||
#if defined(VERSION_US) || defined(VERSION_JP)
|
||||
#define AUDIO_DIR BUILD_DIR/src/audio/us_jp
|
||||
#elif defined(VERSION_EU)
|
||||
#define AUDIO_DIR BUILD_DIR/src/audio/eu
|
||||
#elif defined(VERSION_SH) || defined(VERSION_CN)
|
||||
#define AUDIO_DIR BUILD_DIR/src/audio/sh
|
||||
#endif
|
||||
|
||||
#define BEGIN_SEG(name, addr) \
|
||||
_##name##SegmentStart = ADDR(.name); \
|
||||
_##name##SegmentRomStart = __romPos; \
|
||||
.name (addr) : AT(__romPos)
|
||||
|
||||
#define END_SEG(name) \
|
||||
_##name##SegmentEnd = ADDR(.name) + SIZEOF(.name); \
|
||||
_##name##SegmentRomEnd = __romPos + SIZEOF(.name); \
|
||||
__romPos += SIZEOF(.name);
|
||||
|
||||
#define BEGIN_NOLOAD(name) \
|
||||
_##name##SegmentNoloadStart = ADDR(.name.noload); \
|
||||
.name.noload (NOLOAD) :
|
||||
|
||||
#define END_NOLOAD(name) \
|
||||
_##name##SegmentNoloadEnd = ADDR(.name.noload) + SIZEOF(.name.noload);
|
||||
|
||||
#define MIO0_SEG(name, segAddr) \
|
||||
BEGIN_SEG(name##_mio0, segAddr) \
|
||||
{ \
|
||||
BUILD_DIR/bin/name.mio0.o(.data); \
|
||||
. = ALIGN(0x10); \
|
||||
} \
|
||||
END_SEG(name##_mio0)
|
||||
|
||||
#define MIO0_EU_SEG(name, segAddr) \
|
||||
BEGIN_SEG(name##_mio0, segAddr) \
|
||||
{ \
|
||||
BUILD_DIR/bin/eu/name.mio0.o(.data); \
|
||||
. = ALIGN(0x10); \
|
||||
} \
|
||||
END_SEG(name##_mio0)
|
||||
|
||||
#define STANDARD_LEVEL(name) \
|
||||
BEGIN_SEG(name##_segment_7, 0x07000000) \
|
||||
{ \
|
||||
BUILD_DIR/levels/name/leveldata.mio0.o(.data); \
|
||||
. = ALIGN(0x10); \
|
||||
} \
|
||||
END_SEG(name##_segment_7) \
|
||||
BEGIN_SEG(name, 0x0E000000) \
|
||||
{ \
|
||||
BUILD_DIR/levels/name/script.o(.data); \
|
||||
BUILD_DIR/levels/name/geo.o(.data); \
|
||||
} \
|
||||
END_SEG(name)
|
||||
|
||||
#define STANDARD_OBJECTS(name, segAddr, geoAddr) \
|
||||
BEGIN_SEG(name##_mio0, segAddr) \
|
||||
{ \
|
||||
BUILD_DIR/actors/name.mio0.o(.data); \
|
||||
. = ALIGN(0x10); \
|
||||
} \
|
||||
END_SEG(name##_mio0) \
|
||||
BEGIN_SEG(name##_geo, geoAddr) \
|
||||
{ \
|
||||
BUILD_DIR/actors/name##_geo.o(.data); \
|
||||
} \
|
||||
END_SEG(name##_geo)
|
||||
|
||||
#define CREATE_LO_HI_PAIR(name, value) \
|
||||
name##Hi = (value) >> 16; \
|
||||
name##Lo = (value) & 0xffff;
|
||||
@@ -12,10 +12,6 @@
|
||||
// Since we are using both compilers to match iQue, ignore these errors.
|
||||
#ifndef EGCS_GCC
|
||||
|
||||
#ifndef __sgi
|
||||
#define GLOBAL_ASM(...)
|
||||
#endif
|
||||
|
||||
#if !defined(__sgi) && (!defined(NON_MATCHING) || !defined(AVOID_UB))
|
||||
// asm-process isn't supported outside of IDO, and undefined behavior causes crashes.
|
||||
#error Matching build is only possible on IDO; please build with NON_MATCHING=1.
|
||||
|
||||
@@ -40,14 +40,14 @@ DECLARE_SEGMENT(engine)
|
||||
DECLARE_SEGMENT(behavior)
|
||||
DECLARE_SEGMENT(scripts)
|
||||
DECLARE_SEGMENT(goddard)
|
||||
DECLARE_SEGMENT(framebuffers)
|
||||
|
||||
extern u8 _goddardSegmentStart[];
|
||||
|
||||
#ifdef USE_EXT_RAM
|
||||
extern u8 _engineSegmentStart[];
|
||||
extern u8 _framebuffersSegmentNoloadStart[];
|
||||
extern u8 _engineSegmentNoloadEnd[];
|
||||
extern u8 _engineSegmentEnd[];
|
||||
extern u8 _framebuffersSegmentNoloadEnd[];
|
||||
#endif
|
||||
|
||||
DECLARE_LEVEL_SEGMENT(menu)
|
||||
DECLARE_LEVEL_SEGMENT(intro)
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
#ifndef SEGMENTS_H
|
||||
#define SEGMENTS_H
|
||||
|
||||
#include "config.h"
|
||||
#ifndef _LD
|
||||
#include "segment_symbols.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Memory addresses for segments. Ideally, this header file would not be
|
||||
@@ -13,50 +15,17 @@
|
||||
* linker script syntax.
|
||||
*/
|
||||
|
||||
#define SEG_START 0x8005C000
|
||||
#define USE_EXT_RAM // Undefine this to set a strict 4MB limit.
|
||||
|
||||
#define SEG_FRAMEBUFFERS_SIZE (2 * SCREEN_WIDTH * SCREEN_HEIGHT * 3)
|
||||
#define SEG_GODDARD_POOL_OFFSET 0x52000 // Offset from right side of pool
|
||||
#define SEG_GODDARD (SEG_POOL_END - SEG_GODDARD_POOL_OFFSET)
|
||||
|
||||
#ifndef USE_EXT_RAM /* Default: Runs out of memory quickly when importing custom assets. */
|
||||
|
||||
#define SEG_RAM_END 0x80400000
|
||||
|
||||
#define SEG_POOL_START SEG_START
|
||||
#define SEG_POOL_SIZE 0x165000
|
||||
#define SEG_POOL_END (SEG_POOL_START + SEG_POOL_SIZE)
|
||||
|
||||
#define SEG_BUFFERS SEG_POOL_END
|
||||
|
||||
#ifdef VERSION_EU
|
||||
#define SEG_ENGINE 0x8036FF00
|
||||
#ifndef USE_EXT_RAM
|
||||
#define RAM_END 0x80400000
|
||||
#else
|
||||
#define SEG_ENGINE 0x80378800
|
||||
#define RAM_END 0x80800000
|
||||
#endif
|
||||
|
||||
#define SEG_FRAMEBUFFERS (SEG_RAM_END - SEG_FRAMEBUFFERS_SIZE)
|
||||
|
||||
#else /* Use Expansion Pak space for pool. */
|
||||
|
||||
/*
|
||||
* Workaround for running out of pool space due to
|
||||
* importing large custom content.
|
||||
*/
|
||||
|
||||
#ifdef VERSION_CN
|
||||
#define SEG_RAM_END 0x807C0000 // iQue has stuff like EEPROM mapped at 807C0000 onwards. TODO: Code this using osMemSize
|
||||
#else
|
||||
#define SEG_RAM_END 0x80800000
|
||||
#endif
|
||||
|
||||
#define SEG_BUFFERS SEG_START
|
||||
#define SEG_ENGINE ((u32) &_engineSegmentStart)
|
||||
#define SEG_FRAMEBUFFERS ((u32) &_framebuffersSegmentNoloadStart)
|
||||
#define SEG_POOL_START ((u32) &_framebuffersSegmentNoloadEnd)
|
||||
#define SEG_POOL_END SEG_RAM_END
|
||||
#define SEG_POOL_END_4MB 0x80400000 // For the error message screen enhancement.
|
||||
|
||||
#endif
|
||||
#define SEG_POOL_START _framebuffersSegmentNoloadEnd // 0x0165000 in size
|
||||
#define SEG_GODDARD SEG_POOL_START + 0x113000
|
||||
#define POOL_SIZE RAM_END - SEG_POOL_START
|
||||
|
||||
#endif // SEGMENTS_H
|
||||
|
||||
Reference in New Issue
Block a user