You've already forked HackerSM64
mirror of
https://github.com/HackerN64/HackerSM64.git
synced 2026-01-21 10:35:32 -08:00
Compare commits
1 Commits
develop/2.
...
bug/patch-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3824ca867e |
6
Makefile
6
Makefile
@@ -529,10 +529,10 @@ else
|
||||
RSPASM := $(TOOLS_DIR)/armips
|
||||
endif
|
||||
ENDIAN_BITWIDTH := $(BUILD_DIR)/endian-and-bitwidth
|
||||
EMULATOR = mupen64plus
|
||||
EMULATOR = wslview
|
||||
EMU_FLAGS =
|
||||
LOADER = loader64
|
||||
LOADER_FLAGS = -vwf
|
||||
LOADER = UNFLoader.exe
|
||||
LOADER_FLAGS = -r
|
||||
SHA1SUM = sha1sum
|
||||
PRINT = printf
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
*********************/
|
||||
|
||||
// Size of how large the master display list (gDisplayListHead) can be. 6400 is vanilla
|
||||
#define GFX_POOL_SIZE 10000
|
||||
#define GFX_POOL_SIZE 20000
|
||||
|
||||
// Show a watermark in the title screen that reads "Made with HackerSM64", instead of the copyright message
|
||||
#define INTRO_CREDIT
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
#define HANGING_SPEED 12.0f
|
||||
|
||||
// Prevents Mario from falling asleep while idle
|
||||
// #define NO_SLEEP
|
||||
#define NO_SLEEP
|
||||
|
||||
// Disables fall damage
|
||||
#define NO_FALL_DAMAGE
|
||||
|
||||
// Disables the scream that mario makes when falling off a great height (this is separate from actual fall damage)
|
||||
//#define NO_FALL_DAMAGE_SOUND
|
||||
#define NO_FALL_DAMAGE_SOUND
|
||||
|
||||
// Fall height for normal fall damage. Vanilla is 1150.0f
|
||||
#define FALL_DAMAGE_HEIGHT_SMALL 1150.0f
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
const LevelScript level_intro_splash_screen[] = {
|
||||
// Skip straight to main menu
|
||||
JUMP(script_intro_file_select),
|
||||
// JUMP(script_intro_file_select),
|
||||
INIT_LEVEL(),
|
||||
#ifdef SKIP_TITLE_SCREEN
|
||||
EXIT_AND_EXECUTE_WITH_CODE(/*seg*/ SEGMENT_MENU_INTRO, _introSegmentRomStart, _introSegmentRomEnd, level_intro_mario_head_regular, _introSegmentBssStart, _introSegmentBssEnd),
|
||||
@@ -52,6 +52,7 @@ const LevelScript level_intro_splash_screen[] = {
|
||||
|
||||
CALL(/*arg*/ LVL_INTRO_PLAY_ITS_A_ME_MARIO, /*func*/ lvl_intro_update),
|
||||
CALL(/*arg*/ 0, /*func*/ load_mario_area),
|
||||
SET_MENU_MUSIC(/*seq*/ SEQ_LEVEL_GRASS),
|
||||
|
||||
JUMP_LINK_PUSH_ARG(75),
|
||||
UPDATE_OBJECTS(),
|
||||
|
||||
2
sm64.ld
2
sm64.ld
@@ -116,6 +116,7 @@ SECTIONS
|
||||
BUILD_DIR/src/audio/synthesis.o(.bss*);
|
||||
BUILD_DIR/src/audio/heap.o(.bss*);
|
||||
BUILD_DIR/src/audio/load.o(.bss*);
|
||||
. += 0x1D530;
|
||||
BUILD_DIR/src/audio/data.o(.bss*);
|
||||
BUILD_DIR/src/audio*.o(.bss*);
|
||||
. = ALIGN(0x10);
|
||||
@@ -124,6 +125,7 @@ SECTIONS
|
||||
END_NOLOAD(buffers)
|
||||
|
||||
. = _buffersSegmentBssEnd;
|
||||
. += 0x2500;
|
||||
|
||||
#ifdef HVQM
|
||||
BEGIN_NOLOAD(hvqmwork)
|
||||
|
||||
@@ -223,6 +223,8 @@ void discard_sequence(s32 seqId) {
|
||||
}
|
||||
}
|
||||
|
||||
extern u32 crashdata[16*18];
|
||||
extern u32 ptrdumb;
|
||||
void *soundAlloc(struct SoundAllocPool *pool, u32 size) {
|
||||
#if defined(VERSION_EU) || defined(VERSION_SH)
|
||||
u8 *start;
|
||||
@@ -240,6 +242,7 @@ void *soundAlloc(struct SoundAllocPool *pool, u32 size) {
|
||||
return start;
|
||||
#else
|
||||
u32 alignedSize = ALIGN16(size);
|
||||
crashdata[ptrdumb++] = alignedSize;
|
||||
|
||||
u8 *start = pool->cur;
|
||||
if ((start + alignedSize <= pool->size + pool->start)) {
|
||||
|
||||
167
src/audio/load.c
167
src/audio/load.c
@@ -9,6 +9,7 @@
|
||||
#include "seqplayer.h"
|
||||
#include "game/puppyprint.h"
|
||||
|
||||
extern u8* addrdebug;
|
||||
#define ALIGN16(val) (((val) + 0xF) & ~0xF)
|
||||
|
||||
struct SharedDma {
|
||||
@@ -507,6 +508,10 @@ void patch_audio_bank(struct AudioBank *mem, u8 *offset, u32 numInstruments, u32
|
||||
u32 numDrums2 = numDrums;
|
||||
if (drums != NULL && numDrums2 > 0) {
|
||||
mem->drums = PATCH(drums, mem);
|
||||
if (numInstruments != 12) {
|
||||
// addrdebug = (u8*) &mem; // 0x80 0B E7 90
|
||||
// FORCE_CRASH
|
||||
}
|
||||
for (i = 0; i < numDrums2; i++) {
|
||||
patched = mem->drums[i];
|
||||
if (patched != NULL) {
|
||||
@@ -548,6 +553,49 @@ void patch_audio_bank(struct AudioBank *mem, u8 *offset, u32 numInstruments, u32
|
||||
itInstrs++;
|
||||
} while (end != itInstrs);
|
||||
}
|
||||
|
||||
volatile int xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
xxx = 0;
|
||||
|
||||
#undef PATCH_MEM
|
||||
#undef PATCH
|
||||
#undef BASE_OFFSET_REAL
|
||||
@@ -583,20 +631,20 @@ struct AudioBank *bank_load_immediate(s32 bankId, s32 arg1) {
|
||||
}
|
||||
|
||||
struct AudioBank *bank_load_async(s32 bankId, s32 arg1, struct SequencePlayer *seqPlayer) {
|
||||
u32 buf[4];
|
||||
// u32 buf[4];
|
||||
|
||||
size_t alloc = gAlCtlHeader->seqArray[bankId].len + 0xf;
|
||||
alloc = ALIGN16(alloc);
|
||||
alloc -= 0x10;
|
||||
u8 *ctlData = gAlCtlHeader->seqArray[bankId].offset;
|
||||
// alloc = ALIGN16(alloc);
|
||||
// alloc -= 0x10;
|
||||
// u8 *ctlData = gAlCtlHeader->seqArray[bankId].offset;
|
||||
struct AudioBank *ret = alloc_bank_or_seq(&gBankLoadedPool, 1, alloc, arg1, bankId);
|
||||
if (ret == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
// if (ret == NULL) {
|
||||
// return NULL;
|
||||
// }
|
||||
|
||||
audio_dma_copy_immediate((uintptr_t) ctlData, buf, 0x10);
|
||||
u32 numInstruments = buf[0];
|
||||
u32 numDrums = buf[1];
|
||||
// audio_dma_copy_immediate((uintptr_t) ctlData, buf, 0x10);
|
||||
// u32 numInstruments = buf[0];
|
||||
// u32 numDrums = buf[1];
|
||||
seqPlayer->loadingBankId = (u8) bankId;
|
||||
#if defined(VERSION_EU)
|
||||
gCtlEntries[bankId].numInstruments = numInstruments;
|
||||
@@ -607,22 +655,22 @@ struct AudioBank *bank_load_async(s32 bankId, s32 arg1, struct SequencePlayer *s
|
||||
seqPlayer->bankDmaCurrDevAddr = (uintptr_t)(ctlData + 0x10);
|
||||
seqPlayer->bankDmaRemaining = alloc;
|
||||
#else
|
||||
seqPlayer->loadingBankNumInstruments = numInstruments;
|
||||
seqPlayer->loadingBankNumDrums = numDrums;
|
||||
seqPlayer->bankDmaCurrMemAddr = (u8 *) ret;
|
||||
seqPlayer->loadingBank = ret;
|
||||
seqPlayer->bankDmaCurrDevAddr = (uintptr_t)(ctlData + 0x10);
|
||||
seqPlayer->bankDmaRemaining = alloc;
|
||||
// seqPlayer->loadingBankNumInstruments = numInstruments;
|
||||
// seqPlayer->loadingBankNumDrums = numDrums;
|
||||
// seqPlayer->bankDmaCurrMemAddr = (u8 *) ret;
|
||||
// seqPlayer->loadingBank = ret;
|
||||
// seqPlayer->bankDmaCurrDevAddr = (uintptr_t)(ctlData + 0x10);
|
||||
// seqPlayer->bankDmaRemaining = alloc;
|
||||
#endif
|
||||
OSMesgQueue *mesgQueue = &seqPlayer->bankDmaMesgQueue;
|
||||
osCreateMesgQueue(mesgQueue, &seqPlayer->bankDmaMesg, 1);
|
||||
#if defined(VERSION_JP) || defined(VERSION_US)
|
||||
seqPlayer->bankDmaMesg = NULL;
|
||||
#endif
|
||||
seqPlayer->bankDmaInProgress = TRUE;
|
||||
audio_dma_partial_copy_async(&seqPlayer->bankDmaCurrDevAddr, &seqPlayer->bankDmaCurrMemAddr,
|
||||
&seqPlayer->bankDmaRemaining, mesgQueue, &seqPlayer->bankDmaIoMesg);
|
||||
gBankLoadStatus[bankId] = SOUND_LOAD_STATUS_IN_PROGRESS;
|
||||
// OSMesgQueue *mesgQueue = &seqPlayer->bankDmaMesgQueue;
|
||||
// osCreateMesgQueue(mesgQueue, &seqPlayer->bankDmaMesg, 1);
|
||||
// #if defined(VERSION_JP) || defined(VERSION_US)
|
||||
// seqPlayer->bankDmaMesg = NULL;
|
||||
// #endif
|
||||
// seqPlayer->bankDmaInProgress = TRUE;
|
||||
// audio_dma_partial_copy_async(&seqPlayer->bankDmaCurrDevAddr, &seqPlayer->bankDmaCurrMemAddr,
|
||||
// &seqPlayer->bankDmaRemaining, mesgQueue, &seqPlayer->bankDmaIoMesg);
|
||||
// gBankLoadStatus[bankId] = SOUND_LOAD_STATUS_IN_PROGRESS;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -858,20 +906,29 @@ void load_sequence_internal(u32 player, u32 seqId, s32 loadAsync) {
|
||||
seqPlayer->scriptState.pc = sequenceData;
|
||||
}
|
||||
|
||||
extern u32 crashdata[16*18];
|
||||
extern u32 ptrdumb;
|
||||
// (void) must be omitted from parameters to fix stack with -framepointer
|
||||
void audio_init() {
|
||||
#if defined(VERSION_JP) || defined(VERSION_US) || defined(VERSION_EU)
|
||||
u8 buf[0x10];
|
||||
volatile int dumbp = 0;
|
||||
#endif
|
||||
s32 i, /*j,*/ k;
|
||||
UNUSED u32 size;
|
||||
/*ALIGNED16*/ u8 buf[0x10];
|
||||
u32 *size = &crashdata[0x100];
|
||||
void *data;
|
||||
|
||||
gAudioLoadLock = AUDIO_LOCK_UNINITIALIZED;
|
||||
|
||||
dumbp = 0;
|
||||
dumbp = 0;
|
||||
dumbp = 0;
|
||||
dumbp = 0;
|
||||
dumbp = 0;
|
||||
dumbp = 0;
|
||||
|
||||
#if defined(VERSION_JP) || defined(VERSION_US)
|
||||
s32 lim2 = gAudioHeapSize;
|
||||
for (i = 0; i <= lim2 / 8 - 1; i++) {
|
||||
for (i = 0; i < gAudioHeapSize / 8; i++) {
|
||||
((u64 *) gAudioHeap)[i] = 0;
|
||||
}
|
||||
|
||||
@@ -963,30 +1020,34 @@ void audio_init() {
|
||||
data = gMusicData;
|
||||
audio_dma_copy_immediate((uintptr_t) data, gSeqFileHeader, 0x10);
|
||||
gSequenceCount = gSeqFileHeader->seqCount;
|
||||
size = gSequenceCount * sizeof(ALSeqData) + 4;
|
||||
size = ALIGN16(size);
|
||||
gSeqFileHeader = soundAlloc(&gAudioInitPool, size);
|
||||
audio_dma_copy_immediate((uintptr_t) data, gSeqFileHeader, size);
|
||||
*size = gSequenceCount * sizeof(ALSeqData) + 4;
|
||||
*size = ALIGN16(*size);
|
||||
gSeqFileHeader = soundAlloc(&gAudioInitPool, *size);
|
||||
audio_dma_copy_immediate((uintptr_t) data, gSeqFileHeader, *size);
|
||||
alSeqFileNew(gSeqFileHeader, data);
|
||||
size++;
|
||||
|
||||
// Load header for CTL (instrument metadata)
|
||||
gAlCtlHeader = (ALSeqFile *) buf;
|
||||
data = gSoundDataADSR;
|
||||
audio_dma_copy_immediate((uintptr_t) data, gAlCtlHeader, 0x10);
|
||||
size = gAlCtlHeader->seqCount * sizeof(ALSeqData) + 4;
|
||||
size = ALIGN16(size);
|
||||
*size = gAlCtlHeader->seqCount * sizeof(ALSeqData) + 4;
|
||||
size[7] = (u32)gAlCtlHeader;
|
||||
*size = ALIGN16(*size);
|
||||
gCtlEntries = soundAlloc(&gAudioInitPool, gAlCtlHeader->seqCount * sizeof(struct CtlEntry));
|
||||
gAlCtlHeader = soundAlloc(&gAudioInitPool, size);
|
||||
audio_dma_copy_immediate((uintptr_t) data, gAlCtlHeader, size);
|
||||
gAlCtlHeader = soundAlloc(&gAudioInitPool, *size);
|
||||
audio_dma_copy_immediate((uintptr_t) data, gAlCtlHeader, *size);
|
||||
alSeqFileNew(gAlCtlHeader, data);
|
||||
size++;
|
||||
|
||||
// Load header for TBL (raw sound data)
|
||||
gAlTbl = (ALSeqFile *) buf;
|
||||
audio_dma_copy_immediate((uintptr_t) data, gAlTbl, 0x10);
|
||||
size = gAlTbl->seqCount * sizeof(ALSeqData) + 4;
|
||||
size = ALIGN16(size);
|
||||
gAlTbl = soundAlloc(&gAudioInitPool, size);
|
||||
audio_dma_copy_immediate((uintptr_t) gSoundDataRaw, gAlTbl, size);
|
||||
*size = gAlTbl->seqCount * sizeof(ALSeqData) + 4;
|
||||
*size = ALIGN16(*size);
|
||||
crashdata[ptrdumb++] = *size;
|
||||
gAlTbl = soundAlloc(&gAudioInitPool, *size);
|
||||
audio_dma_copy_immediate((uintptr_t) gSoundDataRaw, gAlTbl, *size);
|
||||
alSeqFileNew(gAlTbl, gSoundDataRaw);
|
||||
|
||||
// Load bank sets for each sequence
|
||||
@@ -998,18 +1059,24 @@ void audio_init() {
|
||||
audio_dma_copy_immediate((uintptr_t) gBankSetsData, gAlBankSets, 0x100);
|
||||
#endif
|
||||
|
||||
dumbp = 0;
|
||||
dumbp = 0;
|
||||
dumbp = 0;
|
||||
dumbp = 0;
|
||||
dumbp = 0;
|
||||
|
||||
init_sequence_players();
|
||||
gAudioLoadLock = AUDIO_LOCK_NOT_LOADING;
|
||||
// Should probably contain the sizes of the data banks, but those aren't
|
||||
// easily accessible from here.
|
||||
osSyncPrintf("---------- Init Completed. ------------\n");
|
||||
osSyncPrintf(" Syndrv :[%6d]\n", gSoundDataRaw - gSoundDataADSR); // gSoundDataADSR
|
||||
#ifndef VERSION_SH
|
||||
osSyncPrintf(" Seqdrv :[%6d]\n", gBankSetsData - gMusicData); // gMusicData
|
||||
#else
|
||||
osSyncPrintf(" Seqdrv :[%6d]\n", _assetsSegmentRomEnd - gMusicData); // gMusicData
|
||||
#endif
|
||||
osSyncPrintf(" audiodata :[%6d]\n", gMusicData - gSoundDataRaw); // gSoundDataRaw
|
||||
osSyncPrintf("---------------------------------------\n");
|
||||
// osSyncPrintf("---------- Init Completed. ------------\n");
|
||||
// osSyncPrintf(" Syndrv :[%6d]\n", gSoundDataRaw - gSoundDataADSR); // gSoundDataADSR
|
||||
// #ifndef VERSION_SH
|
||||
// osSyncPrintf(" Seqdrv :[%6d]\n", gBankSetsData - gMusicData); // gMusicData
|
||||
// #else
|
||||
// osSyncPrintf(" Seqdrv :[%6d]\n", _assetsSegmentRomEnd - gMusicData); // gMusicData
|
||||
// #endif
|
||||
// osSyncPrintf(" audiodata :[%6d]\n", gMusicData - gSoundDataRaw); // gSoundDataRaw
|
||||
// osSyncPrintf("---------------------------------------\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -246,10 +246,42 @@ void draw_crash_log(void) {
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
extern ALSeqFile *gAlTbl;
|
||||
u32 crashdata[16*18];
|
||||
u32 ptrdumb;
|
||||
u8* addrdebug = (u8*) crashdata;
|
||||
// prints any function pointers it finds in the stack format:
|
||||
// SP address: function name
|
||||
void draw_stacktrace(OSThread *thread, UNUSED s32 cause) {
|
||||
if (gPlayer1Controller->stickY < -34.0f) {
|
||||
addrdebug += 0x80;
|
||||
}
|
||||
if (gPlayer1Controller->stickY > 34.0f) {
|
||||
addrdebug -= 0x80;
|
||||
}
|
||||
|
||||
char str[16*3];
|
||||
u8 *ptr = (/*(u8*) 0x800BE3C0*/ (u8*) addrdebug - 0x00);
|
||||
|
||||
crash_screen_draw_rect(0, 0, 320, 240);
|
||||
for (int i = 0; i < 18; i++) {
|
||||
for (int j = 0; j < 16; j++, ptr++) {
|
||||
str[3*j] = ((*ptr >> 4) & 0x0F) + '0';
|
||||
if (str[3*j] > '9') {
|
||||
str[3*j] += 'A' - '9' - 1;
|
||||
}
|
||||
str[3*j+1] = (*ptr & 0x0F) + '0';
|
||||
if (str[3*j+1] > '9') {
|
||||
str[3*j+1] += 'A' - '9' - 1;
|
||||
}
|
||||
str[3*j+2] = ' ';
|
||||
}
|
||||
|
||||
str[16*3-1] = '\0';
|
||||
crash_screen_print(15, (15 + (i * 12)), str);
|
||||
}
|
||||
|
||||
return;
|
||||
__OSThreadContext *tc = &thread->context;
|
||||
u32 temp_sp = (tc->sp + 0x14);
|
||||
|
||||
@@ -322,6 +354,7 @@ void draw_assert(UNUSED OSThread *thread) {
|
||||
osWritebackDCacheAll();
|
||||
}
|
||||
|
||||
u8 stickThres = FALSE;
|
||||
void draw_crash_screen(OSThread *thread) {
|
||||
__OSThreadContext *tc = &thread->context;
|
||||
|
||||
@@ -349,6 +382,13 @@ void draw_crash_screen(OSThread *thread) {
|
||||
sProgramPosition -= 4;
|
||||
updateBuffer = TRUE;
|
||||
}
|
||||
if (stickThres == TRUE && gPlayer1Controller->stickY < 30.0f && gPlayer1Controller->stickY > -30.0f) {
|
||||
stickThres = FALSE;
|
||||
}
|
||||
if (stickThres == FALSE && (gPlayer1Controller->stickY > 34.0f || gPlayer1Controller->stickY < -34.0f)) {
|
||||
stickThres = TRUE;
|
||||
updateBuffer = TRUE;
|
||||
}
|
||||
|
||||
if ((crashPage >= PAGE_COUNT) && (crashPage != 255)) {
|
||||
crashPage = 0;
|
||||
|
||||
Reference in New Issue
Block a user