sm64/lib/src/kdebugserver.c
2019-08-25 00:46:40 -04:00

130 lines
3.0 KiB
C

#include "libultra_internal.h"
typedef struct {
u8 unk00 : 2;
u8 pad : 4;
u8 unk01 : 2;
u8 unk2[3];
} unkStruct;
extern u32 D_80334A44;
u32 D_80334A30 = 0;
u32 D_80334A34 = 0;
s32 D_80334A38 = 0;
u8 D_80365E40[0x100];
OSThread gInterruptedThread;
void u32_to_string(u32 i, u8 *str) {
str[0] = (i >> 0x18) & 0xff;
str[1] = (i >> 0x10) & 0xff;
str[2] = (i >> 0x8) & 0xff;
str[3] = i & 0xff;
}
u32 string_to_u32(u8 *str) {
u32 i;
i = (str[0] & 0xff) << 0x18;
i |= (str[1] & 0xff) << 0x10;
i |= (str[2] & 0xff) << 0x8;
i |= (str[3] & 0xff);
return i;
}
void send_packet(u8 *a0, s32 a1) {
unkStruct sp1c;
s32 i;
sp1c.unk00 = 2;
for (sp1c.unk01 = a1, i = 0; i < a1; i++) {
sp1c.unk2[i] = a0[i];
}
*(volatile u32 *) 0xc0000000 = *(u32 *) &sp1c;
while (!(__osGetCause() & 0x2000))
;
*(volatile u32 *) 0xc000000c = 0;
}
void send(u8 *buff, s32 len) {
s32 i;
s32 end;
s32 rem;
if (!D_80334A44) {
while (!(__osGetCause() & 0x2000))
;
*(volatile u32 *) 0xc000000c = 0;
D_80334A44 = 1;
}
i = 0;
rem = len % 3;
end = len - rem;
for (; i < end; i += 3) {
send_packet(&buff[i], 3);
}
if (rem > 0) {
send_packet(&buff[end], rem);
}
}
void process_command_memory() {
u32 sp1c;
u32 sp18;
sp1c = string_to_u32(&D_80365E40[1]);
sp18 = string_to_u32(&D_80365E40[5]);
send((u8 *) sp1c, sp18);
}
void process_command_register() {
send((u8 *) &gInterruptedThread.context, sizeof(__OSThreadContext));
}
void kdebugserver(u32 a0) {
u32 sp2c;
unkStruct sp28;
*(u32 *) &sp28 = a0;
for (sp2c = 0; sp2c < sp28.unk01; sp2c++) {
D_80365E40[D_80334A34] = sp28.unk2[sp2c];
D_80334A34++;
}
D_80334A38 -= sp28.unk01;
switch (D_80334A30) {
case 0:
switch (sp28.unk2[0]) {
case 1:
D_80334A30 = 1;
D_80334A38 = 9 - sp28.unk01;
break;
case 2:
process_command_register();
D_80334A30 = 0;
D_80334A34 = 0;
D_80334A38 = 0;
break;
default:
D_80334A30 = 0;
D_80334A34 = 0;
D_80334A38 = 0;
break;
}
break;
case 1:
if (D_80334A38 <= 0) {
if (D_80365E40[0] == 1) {
process_command_memory();
D_80334A30 = 0;
D_80334A34 = 0;
D_80334A38 = 0;
} else {
D_80334A30 = 0;
D_80334A34 = 0;
D_80334A38 = 0;
}
}
break;
default:
D_80334A30 = 0;
D_80334A34 = 0;
D_80334A38 = 0;
break;
}
}