pokeplatinum/src/unk_020322D8.c
2026-01-02 10:20:27 -08:00

323 lines
6.6 KiB
C

#include "unk_020322D8.h"
#include <nitro.h>
#include <string.h>
#include "struct_defs/struct_020322D8.h"
#include "struct_defs/struct_020322F8.h"
#include "struct_defs/struct_02032318.h"
#include "struct_defs/struct_0203233C.h"
#include "comm_ring.h"
#include "communication_system.h"
#include "heap.h"
#include "unk_02032798.h"
static UnkStruct_020322D8 *sub_020322D8(CommQueueMan *param0)
{
UnkStruct_020322D8 *v0 = param0->unk_18;
int v1;
for (v1 = 0; v1 < param0->unk_1C; v1++) {
if (v0->unk_0E == 0) {
return v0;
}
v0++;
}
return NULL;
}
BOOL CommQueue_IsEmpty(CommQueueMan *param0)
{
UnkStruct_020322D8 *v0 = param0->unk_18;
int v1;
for (v1 = 0; v1 < param0->unk_1C; v1++) {
if (v0->unk_0E != 0) {
return 0;
}
v0++;
}
return 1;
}
static BOOL sub_02032318(UnkStruct_02032318 *param0)
{
if (param0->unk_00 != NULL) {
if (param0->unk_00->unk_08 != NULL) {
param0->unk_00 = param0->unk_00->unk_08;
param0->unk_00->unk_04 = NULL;
} else {
param0->unk_00 = NULL;
param0->unk_04 = NULL;
}
return 1;
}
return 0;
}
static BOOL sub_0203233C(UnkStruct_0203233C *param0, u8 param1)
{
*param0->unk_00 = param1;
param0->unk_00++;
param0->unk_04--;
if (param0->unk_04 == 0) {
return 1;
}
return 0;
}
static BOOL sub_02032358(UnkStruct_020322D8 *param0, UnkStruct_0203233C *param1)
{
int v0 = CommCmd_PacketSizeOf(param0->unk_0E);
if (v0 == 0xffff) {
if (param1->unk_04 < 3) {
param0->unk_0F_0 = 0;
return 1;
}
} else {
if (param1->unk_04 < 1) {
param0->unk_0F_0 = 0;
return 1;
}
}
sub_0203233C(param1, param0->unk_0E);
if (v0 == 0xffff) {
sub_0203233C(param1, (param0->unk_0C >> 8) & 0xff);
sub_0203233C(param1, param0->unk_0C & 0xff);
} else {
param0->unk_0C = v0;
}
param0->unk_0F_0 = 1;
return 0;
}
static BOOL sub_020323D0(UnkStruct_020322D8 *param0, UnkStruct_0203233C *param1, CommRing *param2, BOOL param3)
{
int v0;
int v1;
int v2 = CommCmd_PacketSizeOf(param0->unk_0E);
if (v2 == 0xffff) {
v1 = 3;
} else {
v1 = 1;
}
if ((param1->unk_04 < (param0->unk_0C + v1)) && (!param3)) {
return 0;
}
if (param0->unk_0F_0 != 1) {
if (sub_02032358(param0, param1)) {
return 0;
}
}
if (param1->unk_04 < param0->unk_0C) {
if (param0->unk_0F_1) {
CommRing_Read(param2, param1->unk_00, param1->unk_04);
} else {
for (v0 = 0; v0 < param1->unk_04; v0++) {
param1->unk_00[v0] = param0->unk_00[v0];
}
}
param0->unk_00 += param1->unk_04;
param0->unk_0C -= param1->unk_04;
param1->unk_04 = -1;
return 1;
}
if (param0->unk_0F_1) {
CommRing_Read(param2, param1->unk_00, param0->unk_0C);
} else {
MI_CpuCopy8(param0->unk_00, param1->unk_00, param0->unk_0C);
}
param1->unk_00 += param0->unk_0C;
param1->unk_04 -= param0->unk_0C;
return 1;
}
BOOL CommQueue_Write(CommQueueMan *param0, int cmd, u8 *data, int size, BOOL param4, BOOL param5)
{
UnkStruct_020322D8 *v0;
UnkStruct_020322D8 *v1 = sub_020322D8(param0);
UnkStruct_02032318 *v2;
int v3;
param4 = 1;
if (v1 == NULL) {
return 0;
}
GF_ASSERT(size < 65534);
v3 = CommCmd_PacketSizeOf(cmd);
if (v3 == PACKET_SIZE_VARIABLE) {
v3 = size;
}
if (param5) {
int v4 = CommRing_RemainingSize(param0->unk_14);
if ((v3 + 3) >= v4) {
return 0;
}
CommRring_Write(param0->unk_14, data, v3, 265);
CommRing_UpdateEndPos(param0->unk_14);
v1->unk_0F_1 = 1;
}
v1->unk_0C = v3;
v1->unk_0E = cmd;
v1->unk_00 = data;
if (param4 == 1) {
v2 = &param0->unk_00;
} else {
v2 = &param0->unk_08;
}
if (v2->unk_04 == NULL) {
v2->unk_04 = v1;
v2->unk_00 = v1;
} else {
v2->unk_04->unk_08 = v1;
v1->unk_04 = v2->unk_04;
v2->unk_04 = v1;
}
return 1;
}
static UnkStruct_020322D8 *sub_02032530(CommQueueMan *param0)
{
UnkStruct_02032318 *v0;
if (param0->unk_10 != NULL) {
return param0->unk_10;
}
if (param0->unk_00.unk_00 != NULL) {
return param0->unk_00.unk_00;
}
if (param0->unk_08.unk_00 != NULL) {
return param0->unk_08.unk_00;
}
return NULL;
}
static void sub_02032550(CommQueueMan *param0)
{
UnkStruct_02032318 *v0;
if (param0->unk_10 != NULL) {
param0->unk_10 = NULL;
} else {
if (!sub_02032318(&param0->unk_00)) {
sub_02032318(&param0->unk_08);
}
}
}
BOOL sub_02032574(CommQueueMan *param0, UnkStruct_0203233C *param1, BOOL param2)
{
int v0;
int v1;
int v2 = 1;
while (param1->unk_04 > 0) {
UnkStruct_020322D8 *v3 = sub_02032530(param0);
if (NULL == v3) {
break;
}
sub_02032550(param0);
if (!sub_020323D0(v3, param1, param0->unk_14, v2)) {
param0->unk_10 = v3;
break;
}
if (-1 == param1->unk_04) {
param0->unk_10 = v3;
return 0;
} else {
MI_CpuFill8(v3, 0, sizeof(UnkStruct_020322D8));
}
v2 = param2;
}
for (v1 = 0; v1 < param1->unk_04; v1++) {
*param1->unk_00 = 0xee;
param1->unk_00++;
}
return 1;
}
void CommQueueMan_Init(CommQueueMan *param0, int param1, CommRing *param2)
{
MI_CpuFill8(param0, 0, sizeof(CommQueueMan));
param0->unk_18 = Heap_Alloc(HEAP_ID_COMMUNICATION, sizeof(UnkStruct_020322D8) * param1);
MI_CpuFill8(param0->unk_18, 0, sizeof(UnkStruct_020322D8) * param1);
param0->unk_1C = param1;
param0->unk_14 = param2;
}
void CommQueueMan_Reset(CommQueueMan *param0)
{
MI_CpuFill8(param0->unk_18, 0, sizeof(UnkStruct_020322D8) * param0->unk_1C);
param0->unk_00.unk_00 = NULL;
param0->unk_00.unk_04 = NULL;
param0->unk_08.unk_00 = NULL;
param0->unk_08.unk_04 = NULL;
param0->unk_10 = NULL;
}
void CommQueueMan_Delete(CommQueueMan *param0)
{
Heap_Free(param0->unk_18);
}
BOOL CommQueueMan_IsCmdInQueue(CommQueueMan *param0, int param1)
{
int v0;
UnkStruct_020322D8 *v1 = param0->unk_18;
for (v0 = 0; v0 < param0->unk_1C; v0++) {
if (v1->unk_0E == param1) {
return 1;
}
v1++;
}
return 0;
}