Merge pull request #17 from Cuyler36/debug_mode

Implement m_debug_mode
This commit is contained in:
Prakxo
2023-04-20 17:48:43 +02:00
committed by GitHub
17 changed files with 1051 additions and 15 deletions
+16
View File
@@ -0,0 +1,16 @@
#ifndef BOOT_H
#define BOOT_H
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
extern const char* boot_copyDate;
#ifdef __cplusplus
}
#endif
#endif
+17
View File
@@ -0,0 +1,17 @@
#ifndef M_ALL_GROW_H
#define M_ALL_GROW_H
#include "types.h"
#include "libu64/gfxprint.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void mAGrw_PrintFossilHaniwa_debug(gfxprint_t* gfxprint);
#ifdef __cplusplus
}
#endif
#endif
+17
View File
@@ -0,0 +1,17 @@
#ifndef M_CARD_H
#define M_CARD_H
#include "types.h"
#include "libu64/gfxprint.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void mCD_PrintErrInfo(gfxprint_t* gfxprint);
#ifdef __cplusplus
}
#endif
#endif
+19
View File
@@ -0,0 +1,19 @@
#ifndef M_DEBUG_HAYAKAWA_H
#define M_DEBUG_HAYAKAWA_H
#include "types.h"
#include "graph.h"
#include "libu64/pad.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void debug_hayakawa_draw(GRAPH* graph);
extern void debug_hayakawa_move(pad_t* pad);
#ifdef __cplusplus
}
#endif
#endif
+44
View File
@@ -0,0 +1,44 @@
#ifndef M_DEBUG_MODE_H
#define M_DEBUG_MODE_H
#include "types.h"
#include "graph.h"
#include "m_debug.h"
#include "pad.h"
#include "game.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void Debug_mode_input(pad_t* pad);
extern void Debug_mode_output(GRAPH* graph);
/* Defines for debug mode output colors */
#define DEBUG_PRINT_COLOR_BLACK 0
#define DEBUG_PRINT_COLOR_BLUE 1
#define DEBUG_PRINT_COLOR_RED 2
#define DEBUG_PRINT_COLOR_MAGENTA 3
#define DEBUG_PRINT_COLOR_GREEN 4
#define DEBUG_PRINT_COLOR_CYAN 5
#define DEBUG_PRINT_COLOR_YELLOW 6
#define DEBUG_PRINT_COLOR_WHITE 7
/* Defines for debug mode 2 output colors */
#define DEBUG_PRINT2_COLOR_YELLOW 0
#define DEBUG_PRINT2_COLOR_PINK 1
#define DEBUG_PRINT2_COLOR_BROWN 2
#define DEBUG_PRINT2_COLOR_DARKORANGE 3
#define DEBUG_PRINT2_COLOR_LIGHTORANGE 4
#define DEBUG_PRINT2_COLOR_GRAY 5
#define DEBUG_PRINT2_COLOR_LILAC 6
#define DEBUG_PRINT2_COLOR_LIMEGREEN 7
#define DEBUG_MODE_CHECK_TRIGGER(game, btn) (((game)->pads[1].on.button & (btn)) == (btn))
#define DEBUG_MODE_CHECK_TRIGGER_GAME(btn) (DEBUG_MODE_CHECK_TRIGGER(gamePT, btn))
#ifdef __cplusplus
}
#endif
#endif
+18
View File
@@ -0,0 +1,18 @@
#ifndef M_EVENT_H
#define M_EVENT_H
#include "types.h"
#include "libu64/gfxprint.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void mEv_debug_print4f(gfxprint_t* gfxprint);
extern void mEv_sp_debug_print4f(gfxprint_t* gfxprint);
#ifdef __cplusplus
}
#endif
#endif
+17
View File
@@ -0,0 +1,17 @@
#ifndef M_FIELD_ASSESSMENT_H
#define M_FIELD_ASSESSMENT_H
#include "types.h"
#include "libu64/gfxprint.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void mFAs_PrintFieldAssessment(gfxprint_t* gfxprint);
#ifdef __cplusplus
}
#endif
#endif
+17
View File
@@ -0,0 +1,17 @@
#ifndef M_FLASHROM_H
#define M_FLASHROM_H
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void mFRm_PrintSavedDebug(gfxprint_t* gfxprint);
extern void mFRm_display_errInfo(gfxprint_t* gfxprint);
#ifdef __cplusplus
}
#endif
#endif
+16
View File
@@ -0,0 +1,16 @@
#ifndef M_FUUSEN_H
#define M_FUUSEN_H
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
extern int fuusen_DEBUG_mode_flag;
#ifdef __cplusplus
}
#endif
#endif
+23 -13
View File
@@ -1,19 +1,29 @@
#ifndef M_MALLOC_H
#define M_MALLOC_H
#include "types.h"
#include "libc64/__osMalloc.h"
Arena zelda_arena;
#ifdef __cplusplus
extern "C" {
#endif
extern Arena zelda_arena;
void zelda_malloc_align(u32,u32);
void zelda_malloc(u32);
void zelda_malloc_r(u32);
void zelda_free(void*);
void zelda_GetFreeArena(u32*,u32*,u32*);
u32 zelda_GetTotalFreeSize(void);
u32 zelda_GetMemBlockSize(void*);
void zelda_InitArena(void*, u32);
void zelda_AddBlockArena(void*, u32);
void zelda_CleanupArena(void);
void zelda_MallocIsInitialized(void);
#endif
extern void zelda_malloc_align(u32,u32);
extern void zelda_malloc(u32);
extern void zelda_malloc_r(u32);
extern void zelda_free(void*);
extern void zelda_GetFreeArena(size_t* max, size_t* free, size_t* alloc);
extern u32 zelda_GetTotalFreeSize(void);
extern u32 zelda_GetMemBlockSize(void*);
extern void zelda_InitArena(void*, u32);
extern void zelda_AddBlockArena(void*, u32);
extern void zelda_CleanupArena(void);
extern int zelda_MallocIsInitalized();
#ifdef __cplusplus
}
#endif
#endif
+18
View File
@@ -0,0 +1,18 @@
#ifndef M_NPC_H
#define M_NPC_H
#include "types.h"
#include "libu64/gfxprint.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void mNpc_PrintRemoveInfo(gfxprint_t* gfxprint);
extern void mNpc_PrintFriendship_fdebug(gfxprint_t* gfxprint);
#ifdef __cplusplus
}
#endif
#endif
+17
View File
@@ -0,0 +1,17 @@
#ifndef M_QUEST_H
#define M_QUEST_H
#include "types.h"
#include "libu64/gfxprint.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void mQst_PrintQuestInfo(gfxprint_t* gfxprint);
#ifdef __cplusplus
}
#endif
#endif
+61
View File
@@ -0,0 +1,61 @@
#ifndef ROOM_TYPE_H
#define ROOM_TYPE_H
#include "types.h"
#include "libu64/gfxprint.h"
enum {
FG_ITEM0_TYPE,
FG_FTR0_TYPE,
FG_ITEM1_TYPE,
FG_FTR1_TYPE,
FG_NXGT0_TYPE,
FG_STRUCTURE_TYPE,
FG_PAD6_TYPE,
FG_PAD7_TYPE,
FG_ITEM2_TYPE,
FG_ACTOR_TYPE,
FG_PROPS_TYPE,
FG_PAD11_TYPE,
FG_PAD12_TYPE,
FG_SP_NPC_TYPE,
FG_NPC_TYPE,
FG_DONT_TYPE,
FG_TYPE_NUM
};
// TEMPORARY. Should be generated with .decl files
#define ITEM0_NO_START 0x0000
#define NULL_NO ITEM0_NO_START
#define ITEM0_1_NO_START ITEM0_NO_START + 0x800
#define FTR0_NO_START 0x1000
#define ITEM1_NO_START 0x2000
#define ITEM1_0_NO_START ITEM0_1_NO_START // paper
#define ITEM1_1_NO_START ITEM1_NO_START + 0x100 // money
#define ITEM1_2_NO_START ITEM1_NO_START + 0x200 // tools
#define ITEM1_3_NO_START ITEM1_NO_START + 0x300 // fish
#define ITEM1_4_NO_START ITEM1_NO_START + 0x400 // clothing
#define ITEM1_5_NO_START ITEM1_NO_START + 0x500 // etc
#define ITEM1_6_NO_START ITEM1_NO_START + 0x600 // carpets
#define ITEM1_7_NO_START ITEM1_NO_START + 0x700 // wallpaper
#define ITEM1_8_NO_START ITEM1_NO_START + 0x800 // food
#define ITEM1_9_NO_START ITEM1_NO_START + 0x900 // seeds
#define ITEM1_A_NO_START ITEM1_NO_START + 0xA00 // mini disks
#define ITEM1_B_NO_START ITEM1_NO_START + 0xB00 // diaries
#define ITEM1_C_NO_START ITEM1_NO_START + 0xC00 // tickets
#define ITEM1_D_NO_START ITEM1_NO_START + 0xD00 // insects
#define ITEM1_E_NO_START ITEM1_NO_START + 0xE00 // hukubukuro
#define ITEM1_F_NO_START ITEM1_NO_START + 0xF00 // kabu
#define FTR1_NO_START 0x3000
#define GET_FG_ITEM0_CATEGORY(f) (((f)&0x800) >> 11)
#define GET_FG_ITEM1_CATEGORY(f) (((f)&0xF00) >> 8)
#define GET_FG_TYPE(f) (((f)&0xF000) >> 12)
extern void mRmTp_DrawFamicomInfo(gfxprint_t* gfxprint);
extern void mRmTp_MakeFamicom_Fdebug();
#endif
+20
View File
@@ -0,0 +1,20 @@
#ifndef M_SHOP_H
#define M_SHOP_H
#include "types.h"
#include "libu64/gfxprint.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void mSP_PrintNowShopSalesSum(gfxprint_t* gfxprint);
extern void mItemDebug_ItemDebugMain();
extern void mItemDebug_ItemDebugDraw(gfxprint_t* gfxprint);
#ifdef __cplusplus
}
#endif
#endif
+729
View File
@@ -0,0 +1,729 @@
#include "m_debug_mode.h"
#include "libu64/gfxprint.h"
#include "m_lib.h"
#include "m_malloc.h"
#include "THA_GA.h"
#include "gfxalloc.h"
#include "graph.h"
#include "game.h"
#include "m_debug_hayakawa.h"
#include "m_fuusen.h"
#include "m_field_info.h"
#include "m_private.h"
#include "m_quest.h"
#include "m_event.h"
#include "m_msg.h"
#include "m_shop.h"
#include "zurumode.h"
#include "m_nmibuf.h"
#include "m_room_type.h"
#include "m_npc.h"
#include "m_field_assessment.h"
#include "m_all_grow.h"
#include "m_card.h"
#include "m_flashrom.h"
#include "dolphin/dvd.h"
#include "libjsys/jsyswrapper.h"
#include "boot.h"
#define DEBUG_MODE_PRINT_BUF_COUNT 6
#define DEBUG_MODE_PRINT_OUTPUT_X 26
#define DEBUG_MODE_PRINT_OUTPUT_Y 20
#define DEBUG_MODE_PRINT_OUTPUT_Y_LAST (DEBUG_MODE_PRINT_OUTPUT_Y + DEBUG_MODE_PRINT_BUF_COUNT)
#define DEBUG_MODE_PRINT_FLAG 1
#define DEBUG_MODE_PRINT2_FLAG 2
static int debug_print_flg;
static s16 debug_print2_count;
typedef struct debug_mode_print_buffer_s {
u8 color;
u8 msg[11];
} debug_mode_print_buf_t;
static debug_mode_print_buf_t debug_print_buffer[DEBUG_MODE_PRINT_BUF_COUNT] = {
{
DEBUG_PRINT_COLOR_BLACK,
" \0",
},
{
DEBUG_PRINT_COLOR_BLACK,
" \0",
},
{
DEBUG_PRINT_COLOR_BLACK,
" \0",
},
{
DEBUG_PRINT_COLOR_BLACK,
" \0",
},
{
DEBUG_PRINT_COLOR_BLACK,
" \0",
},
{
DEBUG_PRINT_COLOR_BLACK,
" \0",
}
};
#pragma pool_data on
static void Debug_Print_output(gfxprint_t* gfxprint) {
static rgba_t print_color[8] = {
{ 0, 0, 0, 64 }, /* Black */
{ 0, 0, 255, 64 }, /* Blue */
{ 255, 0, 0, 64 }, /* Red */
{ 255, 0, 255, 64 }, /* Magenta */
{ 0, 255, 0, 64 }, /* Green */
{ 0, 255, 255, 64 }, /* Cyan */
{ 255, 255, 0, 64 }, /* Yellow */
{ 255, 255, 255, 64 } /* White */
};
debug_mode_print_buf_t* print_buf = debug_print_buffer;
int y;
for (y = DEBUG_MODE_PRINT_OUTPUT_Y; y < DEBUG_MODE_PRINT_OUTPUT_Y_LAST;) {
rgba_t* color;
gfxprint_locate8x8(gfxprint, DEBUG_MODE_PRINT_OUTPUT_X, y);
color = print_color + print_buf->color;
gfxprint_color(gfxprint, color->r, color->g, color->b, color->a);
gfxprint_printf(gfxprint, "%s", print_buf->msg);
y++;
print_buf->msg[0] = '\0';
print_buf++;
}
}
#pragma pool_data reset
#define DEBUG_MODE_PRINT2_BUF_COUNT 80
typedef struct debug_mode_print2_buffer_s {
u8 x;
u8 y;
u8 color;
u8 msg[41];
} debug_mode_print2_buf_t;
static debug_mode_print2_buf_t debug_print2_buffer[DEBUG_MODE_PRINT2_BUF_COUNT];
static void Debug_Print2_output(gfxprint_t* gfxprint) {
static rgba_t print_color[8] = {
{ 255, 255, 32, 192 }, /* Yellow */
{ 255, 150, 128, 192 }, /* Pink */
{ 128, 96, 0, 64 }, /* Brown */
{ 196, 128, 16, 128 }, /* Dark Orange */
{ 255, 196, 32, 128 }, /* Light Orange */
{ 230, 230, 220, 64 }, /* White/Gray */
{ 128, 150, 255, 128 }, /* Lilac */
{ 128, 255, 32, 128 } /* Lime green */
};
int i;
for (i = 0; i < debug_print2_count; i++) {
gfxprint_color(
gfxprint,
print_color[debug_print2_buffer[i].color].r,
print_color[debug_print2_buffer[i].color].g,
print_color[debug_print2_buffer[i].color].b,
print_color[debug_print2_buffer[i].color].a
);
gfxprint_locate8x8(gfxprint, debug_print2_buffer[i].x, debug_print2_buffer[i].y);
gfxprint_printf(gfxprint, "%s", debug_print2_buffer[i].msg);
}
}
#define PAD_BUTTON_DOWN(buttons, button) (((int)(buttons) | (~(int)(button))) == -1)
static int Debug_console(pad_t* pad) {
static f32 console_scroll;
static f32 console_offset_x;
void* sys_console = JC_JFWSystem_getSystemConsole();
if (sys_console != NULL) {
/* Toggle console visiblity when Z button is released */
if (PAD_BUTTON_DOWN(pad->on.button, BUTTON_Z) && (pad->now.button & (~BUTTON_Z)) == 0) {
JC_JUTConsole_setVisible(sys_console, !JC_JUTConsole_isVisible(sys_console));
}
if (JC_JUTConsole_isVisible(sys_console)) {
int scroll_x, scroll_y;
f32 log_stick_x = (f32)pad->off.stick_x / 60.0f;
f32 log_stick_y = (f32)pad->off.stick_y / 60.0f;
/* B button clears console */
if (PAD_BUTTON_DOWN(pad->on.button, BUTTON_B)) {
JC_JUTConsole_clear(sys_console);
}
/* L button to scroll */
if (PAD_BUTTON_DOWN(pad->now.button, BUTTON_L)) {
console_scroll -= log_stick_y;
if (console_scroll > 1.0f) {
scroll_y = (int)console_scroll;
}
else if (console_scroll < -1.0f) {
scroll_y = -(int)-console_scroll; /* nice double neg */
}
else {
scroll_y = 0;
}
if (scroll_y != 0) {
console_scroll -= scroll_y;
JC_JUTConsole_scroll(sys_console, scroll_y);
}
console_offset_x -= log_stick_x;
if (console_offset_x > 1.0f) {
scroll_x = (int)console_offset_x;
}
else if (console_offset_x < -1.0f) {
scroll_x = -(int)-console_offset_x; /* nice double neg */
}
else {
scroll_x = 0;
}
if (scroll_x != 0) {
console_offset_x -= scroll_x;
JC_JUTConsole_setPosition(sys_console, scroll_x + JC_JUTConsole_getPositionX(sys_console), 42);
}
JW_JUTReport(
30, 440,
1,
"SCROLL%3d %3d Output=%1x",
JC_JUTConsole_getLineOffset(sys_console),
JC_JUTConsole_getPositionX(sys_console),
JC_JUTConsole_getOutput(sys_console)
);
}
/* R button re-prints console */
if (PAD_BUTTON_DOWN(pad->on.button, BUTTON_R)) {
JC_JUTConsole_dumpToTerminal(sys_console, -1); /* -1 is probably a define */
JC_JUTConsole_setOutput(sys_console, 3); /* Again, 3 is probably a define */
}
return TRUE;
}
}
return FALSE;
}
static int draw_status;
static int bg_draw_status;
static int bg_draw_status2;
static int quest_draw_status;
static int shop_draw_status;
static int event_status;
static int zelda_malloc_status;
static int famicom_status;
static int npc_draw_status;
static int field_assessment_status;
typedef struct debug_reg_keycombo_s {
u16 held; /* Previously held */
u16 pressed; /* Pressed this frame */
} debug_reg_keycombo_t;
#pragma pool_data on
extern void Debug_mode_input(pad_t* pad) {
int r_ofs = (-1 + debug_mode->mode + debug_mode->type * DEBUG_REG_GROUP) * DEBUG_REG_SIZE;
if (famicom_status != 0 || Debug_console(pad) == 0) {
u16 now_button = pad->now.button;
int dpad = now_button & (BUTTON_DRIGHT | BUTTON_DLEFT | BUTTON_DDOWN | BUTTON_DUP);
/* L + R held shows the disk info, copy date, and zurumode/appNMI buffer state */
if (PAD_BUTTON_DOWN(now_button, BUTTON_L) && PAD_BUTTON_DOWN(now_button, BUTTON_R)) {
DVDDiskID* diskid = DVDGetCurrentDiskID();
if (diskid != NULL) {
JW_JUTReport(50, 50, 1, "%.4s %.2s 0x%02x(%d)", diskid->gameName, diskid->company, diskid->gameVersion, diskid->gameVersion);
}
if (boot_copyDate != NULL) {
JW_JUTReport(320, 50, 1, "%.19s", boot_copyDate);
}
JW_JUTReport(50, 60, 1, "Z=%d Z2=%d, ANB=%08x", zurumode_flag != 0, zurumode_flag >= 2, APPNMI_GETVAL());
/* Additionally, pressing Z after L + R will print out each bit in debug appNMI buffer */
if (PAD_BUTTON_DOWN(pad->now.button, BUTTON_Z)) {
int i;
for (i = 0; i < 32; i++) {
JW_JUTReport(50 + i * 12, 70, 1, "%1x", (APPNMI_GETVAL() >> (31 - i)) & 1);
}
}
}
if (zurumode_flag >= 2 && (PAD_BUTTON_DOWN(pad->now.button, BUTTON_L) || PAD_BUTTON_DOWN(pad->now.button, BUTTON_R) || PAD_BUTTON_DOWN(pad->now.button, BUTTON_START))) {
/* Button combos to get to each register */
static debug_reg_keycombo_t key_data[DEBUG_REG_MAX] = {
{BUTTON_L, BUTTON_CUP}, /* REG */
{BUTTON_L, BUTTON_CLEFT}, /* SREG */
{BUTTON_L, BUTTON_CDOWN}, /* OREG */
{BUTTON_L, BUTTON_A}, /* PREG */
{BUTTON_R, BUTTON_CDOWN}, /* QREG */
{BUTTON_L, BUTTON_CRIGHT}, /* MREG */
{BUTTON_L, BUTTON_R}, /* SBREG */
{BUTTON_L, BUTTON_DLEFT}, /* DREG */
{BUTTON_L, BUTTON_DRIGHT}, /* UREG */
{BUTTON_L, BUTTON_DUP}, /* IREG */
{BUTTON_L, BUTTON_B}, /* ZREG */
{BUTTON_L, BUTTON_Z}, /* CRV */
{BUTTON_L, BUTTON_DDOWN}, /* NS1 */
{BUTTON_R, BUTTON_A}, /* SND */
{BUTTON_R, BUTTON_B}, /* XREG */
{BUTTON_R, BUTTON_Z}, /* CRV2 */
{BUTTON_R, BUTTON_L}, /* DEMOREG */
{BUTTON_R, BUTTON_CUP}, /* TREG */
{BUTTON_R, BUTTON_CRIGHT}, /* WREG */
{BUTTON_R, BUTTON_DLEFT}, /* AREG */
{BUTTON_R, BUTTON_CLEFT}, /* VREG */
{BUTTON_R, BUTTON_START}, /* HREG */
{BUTTON_L, BUTTON_START}, /* GREG */
{BUTTON_R, BUTTON_DRIGHT}, /* mREG */
{BUTTON_R, BUTTON_DUP}, /* nREG */
{BUTTON_START, BUTTON_R}, /* BREG */
{BUTTON_START, BUTTON_A}, /* DORO */
{BUTTON_START, BUTTON_Y}, /* kREG */
{BUTTON_START, BUTTON_CRIGHT}, /* BAK */
{BUTTON_START, BUTTON_CLEFT}, /* PLAYERREG */
{BUTTON_START, BUTTON_CDOWN}, /* NMREG */
{BUTTON_START, BUTTON_L}, /* NIIREG */
{BUTTON_START, BUTTON_Z}, /* GENREG */
{BUTTON_START, BUTTON_CUP}, /* MYKREG */
{BUTTON_START, BUTTON_DUP}, /* CAMREG */
{BUTTON_START, BUTTON_DRIGHT}, /* SAKREG */
{BUTTON_START, BUTTON_DLEFT}, /* TAKREG */
{BUTTON_START, BUTTON_DDOWN} /* PL2REG */
};
int i;
for (i = 0; i < DEBUG_REG_MAX; i++) {
if (PAD_BUTTON_DOWN(pad->now.button, key_data[i].held) &&
PAD_BUTTON_DOWN(pad->on.button, key_data[i].pressed)) {
break;
}
}
if (i < DEBUG_REG_MAX) {
if (i == debug_mode->type) {
/* Switch register group */
debug_mode->mode = (debug_mode->mode + 1) % (DEBUG_REG_GROUP + 1);
} else {
/* Switch registers */
debug_mode->type = i;
debug_mode->mode = 0;
}
}
}
else {
int increment;
switch ((int)debug_mode->mode) {
default:
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6: {
if (dpad == debug_mode->old_key) {
if (debug_mode->key_wait <= 0) {
debug_mode->key_wait = 1;
} else {
debug_mode->key_wait--;
dpad ^= debug_mode->old_key;
}
} else {
debug_mode->key_wait = 16;
debug_mode->old_key = dpad;
}
/**
* Register increment key combos:
* - D-Pad Right: positive
* - D-Pad Left: negative
*
* Increment modifiers (held)
* - C-Stick Up: 0x1000
* - C-Stick Down: 0x100
* - A + B: 1000
* - A: 100
* - B: 10
* - Default: 1
**/
if (dpad & BUTTON_DRIGHT) {
u16 btn = pad->now.button;
if (PAD_BUTTON_DOWN(btn, BUTTON_CUP)) {
increment = 0x1000;
} else if (PAD_BUTTON_DOWN(btn, BUTTON_CDOWN)) {
increment = 0x100;
} else if (PAD_BUTTON_DOWN(btn, BUTTON_A | BUTTON_B)) {
increment = 1000;
} else if (PAD_BUTTON_DOWN(btn, BUTTON_A)) {
increment = 100;
} else {
increment = 1;
if (PAD_BUTTON_DOWN(btn, BUTTON_B)) {
increment = 10;
}
}
} else if (dpad & BUTTON_DLEFT) {
u16 btn = pad->now.button;
if (PAD_BUTTON_DOWN(btn, BUTTON_CUP)) {
increment = -0x1000;
} else if (PAD_BUTTON_DOWN(btn, BUTTON_CDOWN)) {
increment = -0x100;
} else if (PAD_BUTTON_DOWN(btn, BUTTON_A | BUTTON_B)) {
increment = -1000;
}
/* lol the missed duplicated case */
else if (PAD_BUTTON_DOWN(btn, BUTTON_A | BUTTON_B)) {
increment = -1000;
} else if (PAD_BUTTON_DOWN(btn, BUTTON_A)) {
increment = -100;
} else {
increment = -1;
if (PAD_BUTTON_DOWN(btn, BUTTON_B)) {
increment = -10;
}
}
} else {
increment = 0;
}
/* Adjust selected register value */
debug_mode->r[debug_mode->input_r + r_ofs] += increment;
/* Adjust selected register index */
if (dpad & BUTTON_DUP) {
if (debug_mode->input_r <= 0) {
debug_mode->input_r = (DEBUG_REG_SIZE - 1);
} else {
debug_mode->input_r--;
}
} else if (dpad & BUTTON_DDOWN) {
if (debug_mode->input_r >= (DEBUG_REG_SIZE - 1)) {
debug_mode->input_r = 0;
} else {
debug_mode->input_r++;
}
}
} break;
}
}
/* Hayakawa debug functions controlled by previous controller */
debug_hayakawa_move(pad - 1);
/**
* Summary of display toggle buttons
* A:
* - bg_draw_status
* - quest_draw_status
* - event_status (non-special)
* - draw_status
* D-Pad Left:
* - event_status (special)
* D-Pad Up:
* - shop_draw_status
* C-Stick Up
* - zelda_malloc_status
* D-Pad Down (zurumode 2 enabled):
* - famicom_status
* (missing: C-Stick Down, perhaps for bg_draw_status2)
* D-Pad Right:
* - npc_draw_status
* C-Stick Right:
* - field_assessment_status
**/
if (DEBUG_MODE_CHECK_TRIGGER_GAME(BUTTON_A)) {
bg_draw_status ^= 1;
}
if (DEBUG_MODE_CHECK_TRIGGER_GAME(BUTTON_A)) {
quest_draw_status ^= 1;
}
if (DEBUG_MODE_CHECK_TRIGGER_GAME(BUTTON_A)) {
event_status ^= 1;
}
if (DEBUG_MODE_CHECK_TRIGGER_GAME(BUTTON_DLEFT)) {
event_status ^= 2;
}
if (DEBUG_MODE_CHECK_TRIGGER_GAME(BUTTON_A)) {
draw_status ^= 1;
}
if (DEBUG_MODE_CHECK_TRIGGER_GAME(BUTTON_DUP)) {
shop_draw_status ^= 1;
}
if (DEBUG_MODE_CHECK_TRIGGER_GAME(BUTTON_CUP)) {
zelda_malloc_status ^= 1;
}
if (zurumode_flag >= 2 && DEBUG_MODE_CHECK_TRIGGER_GAME(BUTTON_DDOWN)) {
famicom_status ^= 1;
}
if (DEBUG_MODE_CHECK_TRIGGER_GAME(BUTTON_DRIGHT)) {
npc_draw_status ^= 1;
}
if (DEBUG_MODE_CHECK_TRIGGER_GAME(BUTTON_CRIGHT)) {
field_assessment_status ^= 1;
}
}
}
#pragma pool_data reset
#pragma pool_data on
static void Debug_mode_output_sub(gfxprint_t* gfxprint) {
static u8 reg_name_data[] = " SOPQMYDUIZCNKXcsiWAVHGmnBdkb*********";
static char* long_reg_name_data[] = {
"REG",
"SREG",
"OREG",
"PREG",
"QREG",
"MREG",
"SBREG",
"DREG",
"UREG",
"IREG",
"ZREG",
"CRV",
"NS1",
"SND",
"XREG",
"CRV2",
"DEMOREG",
"TREG",
"WREG",
"AREG",
"VREG",
"HREG",
"GREG",
"mREG",
"nREG",
"BREG",
"DORO",
"kREG",
"BAK",
"PLAYERREG",
"NMREG",
"NIIREG",
"GENREG",
"MYKREG",
"CAMREG",
"SAKREG",
"TAKREG",
"PL2REG"
};
int i;
int mode;
int adj;
int ofs;
mode = (debug_mode->mode - 1);
adj = mode * DEBUG_REG_SIZE;
ofs = (mode + debug_mode->type * DEBUG_REG_GROUP) * DEBUG_REG_SIZE;
gfxprint_color(gfxprint, 0, 128, 128, 128); /* Color -> xlu dark cyan */
gfxprint_locate8x8(gfxprint, 3, 8);
gfxprint_printf(gfxprint, "%c(%s)", reg_name_data[debug_mode->type], long_reg_name_data[debug_mode->type]);
gfxprint_color(gfxprint, 0, 128, 128, 128); /* Reset color... back to dark cyan? */
for (i = 0; i < DEBUG_REG_SIZE; i++) {
if (i == debug_mode->input_r) {
gfxprint_color(gfxprint, 0, 255, 255, 255); /* Color -> opaque cyan */
}
gfxprint_locate8x8(gfxprint, 3, i + 9);
gfxprint_printf(gfxprint, "%02d%6d", i + adj, debug_mode->r[i + ofs]);
if (i == debug_mode->input_r) {
gfxprint_color(gfxprint, 0, 128, 128, 128); /* Color -> xlu dark cyan */
}
}
}
#pragma pool_data reset
#pragma pool_data on
static void Debug_mode_zelda_malloc_info_output(gfxprint_t* gfxprint) {
u32 max, free, alloc;
u32 graph_alloc;
if (zelda_MallocIsInitalized()) {
graph_alloc = THA_GA_getFreeBytes(&gamePT->graph->polygon_opaque_thaga);
zelda_GetFreeArena(&max, &free, &alloc);
gfxprint_color(gfxprint, 200, 200, 250, 255); /* color -> opaque lilac */
gfxprint_locate8x8(gfxprint, 3, 23);
gfxprint_printf(gfxprint, "zelda_malloc サイダイアキ%x", max);
gfxprint_locate8x8(gfxprint, 3, 24);
gfxprint_printf(gfxprint, " アキ%x", free);
gfxprint_locate8x8(gfxprint, 3, 25);
gfxprint_printf(gfxprint, "graph_alloc ノコリ %x", graph_alloc);
}
}
#pragma pool_data reset
static void DebugHaniwaTempo(gfxprint_t* gfxprint) {
/* TODO: this requires implementing m_home & m_house */
}
#define GFXLIST_RESERVED_SIZE (int)(512 * sizeof(Gfx)) /* requires 0x1000 bytes, or 512 free Gfx */
#pragma pool_data on
extern void Debug_mode_output(GRAPH* graph) {
static int glist_used_bytes;
Gfx* start_gfx;
Gfx* last_gfx;
int poly_free_bytes;
int d_col_r;
int d_col_g;
gfxprint_t gfxprint;
gfxprint_t* print_p = &gfxprint;
debug_hayakawa_draw(graph);
poly_free_bytes = THA_GA_getFreeBytes(&graph->polygon_opaque_thaga);
if (poly_free_bytes >= glist_used_bytes + GFXLIST_RESERVED_SIZE) {
Gfx* gfx;
gfxprint_init(print_p);
OPEN_DISP(graph);
start_gfx = NOW_POLY_OPA_DISP;
gfx = gfxopen(start_gfx);
gSPDisplayList(NOW_OVERLAY_DISP++, gfx);
gfxprint_open(print_p, gfx);
if (debug_print_flg & DEBUG_MODE_PRINT2_FLAG) {
Debug_Print2_output(print_p);
}
if (debug_mode->mode != 0) {
Debug_mode_output_sub(print_p);
}
debug_print2_count = 0;
if (debug_print_flg & DEBUG_MODE_PRINT_FLAG) {
Debug_Print_output(print_p);
}
if (debug_mode->mode == 0) {
fuusen_DEBUG_mode_flag = 1;
if (bg_draw_status & 1) {
mFI_PrintNowBGNum(print_p);
mFI_PrintFgAttr(print_p);
gfxprint_color(print_p, 200, 200, 250, 255); /* color -> lilac */
gfxprint_locate8x8(print_p, 3, 9);
gfxprint_printf(print_p, "%3d %3d", mPr_GetMoneyPower(), mPr_GetGoodsPower());
}
if (quest_draw_status & 1) {
mQst_PrintQuestInfo(print_p);
}
if (event_status & 1) {
mEv_debug_print4f(print_p);
}
if (event_status & 2) {
mEv_sp_debug_print4f(print_p);
}
if (draw_status & 1) {
mMsg_debug_draw(print_p);
}
if (zurumode_flag >= 2) {
mItemDebug_ItemDebugMain();
mItemDebug_ItemDebugDraw(print_p);
}
if (shop_draw_status & 1) {
mSP_PrintNowShopSalesSum(print_p);
DebugHaniwaTempo(print_p);
}
if (zelda_malloc_status & 1) {
Debug_mode_zelda_malloc_info_output(print_p);
}
if (zurumode_flag >= 2 && (famicom_status & 1)) {
mRmTp_DrawFamicomInfo(print_p);
mRmTp_MakeFamicom_Fdebug();
}
d_col_g = APPNMI_RESETEXEMPT_GET() ? 125 : 250;
d_col_r = zurumode_flag >= 2 ? 125 : 250;
/**
* debug 'D' colors:
* Base: Yellow
* ResetExempt: Pink
* Zurumode2/Zurumode3: Green
* ResetExempt & Zurumode2/Zurumode3: Blue-gray
*/
gfxprint_color(print_p, d_col_r, d_col_g, 140, 255);
gfxprint_locate8x8(print_p, 36, 3);
gfxprint_printf(print_p, "D");
if (npc_draw_status & 1) {
mNpc_PrintRemoveInfo(print_p);
}
if (field_assessment_status & 1) {
mFAs_PrintFieldAssessment(print_p);
mAGrw_PrintFossilHaniwa_debug(print_p);
/* Maybe a macro like 'IS_FDEBUG()' */
if (zurumode_flag >= 2) {
mNpc_PrintFriendship_fdebug(print_p);
}
mPr_PrintMapInfo_debug(print_p);
}
mFRm_PrintSavedDebug(print_p);
mCD_PrintErrInfo(print_p);
mFRm_display_errInfo(print_p);
}
last_gfx = gfxprint_close(print_p);
gSPEndDisplayList(last_gfx++);
glist_used_bytes = (int)last_gfx - (int)start_gfx;
gfxclose(start_gfx, last_gfx);
SET_POLY_OPA_DISP(last_gfx);
gfxprint_cleanup(print_p);
CLOSE_DISP(graph);
}
}
#pragma pool_data reset
+1 -1
View File
@@ -1,6 +1,6 @@
#include "m_malloc.h"
extern Arena zelda_arena;
Arena zelda_arena;
void zelda_malloc_align(u32 size, u32 align){
__osMallocAlign(&zelda_arena, size, align);