2019-08-25 06:46:40 +02:00
|
|
|
#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;
|
2019-09-01 21:50:50 +02:00
|
|
|
while (!(__osGetCause() & 0x2000)) {
|
2019-08-25 06:46:40 +02:00
|
|
|
;
|
2019-09-01 21:50:50 +02:00
|
|
|
}
|
2019-08-25 06:46:40 +02:00
|
|
|
*(volatile u32 *) 0xc000000c = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void send(u8 *buff, s32 len) {
|
|
|
|
s32 i;
|
|
|
|
s32 end;
|
|
|
|
s32 rem;
|
|
|
|
if (!D_80334A44) {
|
2019-09-01 21:50:50 +02:00
|
|
|
while (!(__osGetCause() & 0x2000)) {
|
2019-08-25 06:46:40 +02:00
|
|
|
;
|
2019-09-01 21:50:50 +02:00
|
|
|
}
|
2019-08-25 06:46:40 +02:00
|
|
|
*(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;
|
|
|
|
}
|
|
|
|
}
|