summaryrefslogtreecommitdiff
path: root/src/debug/debug.c
diff options
context:
space:
mode:
authortomas <93524600+TommiRommi@users.noreply.github.com>2023-08-04 19:04:49 +0000
committerGitHub <noreply@github.com>2023-08-04 13:04:49 -0600
commit9d716d921ab6e48e09813636be8acbe77fb26669 (patch)
tree5dab79f7a9a92d7962c478504c63cc1189582c9f /src/debug/debug.c
parent2e5b2737f3fa8bdde21f493ba3f807b4017b2394 (diff)
very cool debug display list (#348)
* added a very cool debug display list ^^ (prints variables to screen) * Decompiled various functions
Diffstat (limited to 'src/debug/debug.c')
-rw-r--r--src/debug/debug.c251
1 files changed, 251 insertions, 0 deletions
diff --git a/src/debug/debug.c b/src/debug/debug.c
new file mode 100644
index 000000000..cdc333dc5
--- /dev/null
+++ b/src/debug/debug.c
@@ -0,0 +1,251 @@
+#include <ultra64.h>
+#include <debug.h>
+#include "debug.inc.c"
+#include <libc/stdio.h>
+
+#if DVDL
+
+u8 sDisplayListState = OK;
+
+static u32 variable_to_u64(variableWatchAttributes *);
+static void round_up_float(u32 *, u8);
+static void u64_to_string(variableWatchAttributes *, u32, u8);
+static u32 _strlen(const char *);
+static void _memcpy(char *, const char *, u32);
+
+void display_dvdl(void) {
+ u32 variable;
+ u32 i, vNameLen;
+ u32 arraySize = sizeof(gMainVariableWatchList) / sizeof(variableWatchAttributes);
+ s32 text_y_possition = TEXT_Y_POSSITION;
+ u8 base;
+ char *vName, *cBuffer;
+
+ load_debug_font();
+ for (i = 0; i < arraySize; i++) {
+ variableWatchAttributes *currentAttribute = &gMainVariableWatchList[i];
+ currentAttribute->characterBuffer = currentAttribute->buffer;
+ cBuffer = currentAttribute->characterBuffer;
+ vName = currentAttribute->variableName;
+
+ variable = variable_to_u64(currentAttribute);
+ base = 0;
+
+ if (currentAttribute->variableFlag & (DISPLAY_FLOAT_AS_TYPE | DISPLAY_FLOAT_WITH_ROUNDING)) {
+ if (currentAttribute->variableFlag & DISPLAY_FLOAT_NUMBER) {
+ sDisplayListState = BAD;
+ } else if (currentAttribute->variableFlag & DISPLAY_FLOAT_WITH_ROUNDING) {
+ round_up_float(&variable, currentAttribute->variableSize);
+ }
+ }
+
+ switch (currentAttribute->variableFlag & 0x8F) {
+ case DISPLAY_FLOAT_NUMBER:
+ sprintf(cBuffer, "%.3f", *(f32*)&variable);
+ break;
+ case DISPLAY_HEXIDECIMAL_NUMBER:
+ base = HEXIDECIMAL;
+ break;
+ case DISPLAY_DECIMAL_NUMBER:
+ base = DECIMAL;
+ break;
+ case DISPLAY_OCTAL_NUMBER:
+ base = OCTAL;
+ break;
+ case DISPLAY_BINARY_NUMBER:
+ base = BINARY;
+ break;
+ default:
+ sDisplayListState = BAD;
+ }
+ if (base) {
+ u64_to_string(currentAttribute, variable, base);
+ }
+
+ if (sDisplayListState == BAD) {
+ cBuffer = "NaN";
+ }
+ sDisplayListState = OK;
+
+ vNameLen = _strlen(vName);
+
+ debug_print_str2(TEXT_X_POSSITION, text_y_possition, vName);
+ debug_print_str2(TEXT_X_POSSITION + (vNameLen * 0x8), text_y_possition, cBuffer);
+ text_y_possition += 0x8;
+ }
+ gSPDisplayList(gDisplayListHead++, D_0D007EB8);
+ gSPDisplayList(gDisplayListHead++, D_020076E0);
+ func_80093C98(1);
+}
+
+static u32 variable_to_u64(variableWatchAttributes *attribute) {
+ u32 variable;
+
+ switch (attribute->variableSize) {
+ case sizeof(u8):
+ variable = *((u8*) attribute->variablePointer);
+ break;
+ case sizeof(u16):
+ variable = *((u16*) attribute->variablePointer);
+ break;
+ case sizeof(u32):
+ case sizeof(u64):
+ variable = *((u32*) attribute->variablePointer); // no floating point rounding
+ break;
+ default:
+ sDisplayListState = BAD;
+ }
+
+ return variable;
+}
+
+static void round_up_float(u32 *variable, u8 variableSize) {
+ switch (variableSize) {
+ case sizeof(u64):
+ case sizeof(u32):
+ *variable = (u32) (*(f32*) &*variable);
+ break;
+ default:
+ sDisplayListState = BAD;
+ }
+}
+
+static void u64_to_string(variableWatchAttributes *attribute, u32 variable, u8 base) {
+ s32 signedVariable;
+ u32 stringDifference, indexesToFillAVariable, stringLengthWithZero;
+ u32 indexesToFillAByte, upperIndex, remainder;
+ u32 stringLength, lowerIndex, i;
+ u8 variableSize;
+ char *bufferedString;
+ char swapRegister;
+
+ if (sDisplayListState == BAD) {
+ return;
+ }
+
+ bufferedString = attribute->characterBuffer;
+ variableSize = attribute->variableSize;
+
+ // converts a minus number into it's unsigned equivalent for proper string conversion
+ if (attribute->variableFlag & DISPLAY_SIGNED_NUMBER) {
+ switch (variableSize) {
+ case sizeof(u8):
+ signedVariable = (s8) variable;
+ if (signedVariable < 0) {
+ signedVariable = -signedVariable;
+ variable = (u8) signedVariable;
+ *bufferedString = '-';
+ bufferedString++;
+ }
+ break;
+ case sizeof(u16):
+ signedVariable = (s16) variable;
+ if (signedVariable < 0) {
+ signedVariable = -signedVariable;
+ variable = (u16) signedVariable;
+ *bufferedString = '-';
+ bufferedString++;
+ }
+ break;
+ case sizeof(u32):
+ case sizeof(u64):
+ signedVariable = (s32) variable;
+ if (signedVariable < 0) {
+ signedVariable = -signedVariable;
+ variable = (u32) signedVariable;
+ *bufferedString = '-';
+ bufferedString++;
+ }
+ break;
+ }
+ }
+
+ stringLength = 0;
+
+ // convert u64 into a string but it gets put in reverse
+ if (base != HEXIDECIMAL) {
+ do {
+ stringLength++;
+ *bufferedString = variable % base + '0';
+ bufferedString++;
+ variable /= base;
+ } while (variable != 0);
+ } else {
+ do {
+ stringLength++;
+ remainder = variable % 16;
+
+ if ((remainder >= 0) && (remainder <= 9)) {
+ *bufferedString = '0' + remainder;
+ } else {
+ *bufferedString = 'A' + (remainder - 10);
+ }
+
+ bufferedString++;
+ variable /= 16;
+ } while (variable != 0);
+ }
+
+ bufferedString -= stringLength;
+ upperIndex = stringLength - 1;
+
+ // flip string 4321 --> 1234
+ for (lowerIndex = 0; lowerIndex < stringLength >> 1; lowerIndex++) {
+ swapRegister = bufferedString[lowerIndex];
+ bufferedString[lowerIndex] = bufferedString[upperIndex];
+ bufferedString[upperIndex] = swapRegister;
+ upperIndex--;
+ }
+
+ switch (base) {
+ case BINARY:
+ indexesToFillAByte = 8;
+ break;
+ case OCTAL:
+ indexesToFillAByte = 3;
+ break;
+ case DECIMAL:
+ bufferedString[stringLength] = '\0';
+ return;
+ case HEXIDECIMAL:
+ indexesToFillAByte = 2;
+ break;
+ }
+
+ stringLengthWithZero = stringLength - 1;
+ indexesToFillAVariable = indexesToFillAByte * variableSize;
+ stringDifference = indexesToFillAVariable - stringLengthWithZero;
+
+ // makes space and fills in extra space. u32 FE -> 000000FE
+ for (i = stringLength; i > 0; i--) {
+ bufferedString[stringDifference + i - 2] = bufferedString[i - 1];
+ }
+ for (i = 0; i < stringDifference - 1; i++) {
+ bufferedString[i] = '0';
+ }
+ bufferedString[indexesToFillAVariable] = '\0';
+}
+
+static u32 _strlen(const char *str) {
+ u32 len;
+
+ len = 0;
+ for (; *str != '\0'; str++) {
+ len++;
+ }
+
+ return len;
+}
+
+// unused but may be useful
+static void _memcpy(char *destStr, const char *copyStr, u32 copySize) {
+ u32 i;
+
+ for (i = 0; i < copySize; i++) {
+ *destStr = *copyStr;
+ destStr++;
+ copyStr++;
+ }
+}
+
+#endif