Files
banjo-kazooie/src/core1/code_1E360.c

136 lines
2.8 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#include "SnS.h"
/* .data*/
/**
* An index used to track the position in the outgoing payload
* it should write the next key to.
*/
s32 snsPayloadOutCurrPos = 0;
/*.bss*/
/**
* An index used to track the position in the incoming payload
* we should read the next key from.
*/
s32 snsPayloadInCurrPos;
struct SnsPayload *snspayload_init_new_payload(struct SnsPayload *payload)
{
u32 i;
payload->magic = SNS_HEADER_MAGIC;
for (i = 0; i < SNS_PAYLOAD_DATALEN; i++)
payload->data[i] = 0;
payload->pad = 0;
snspayload_calc_checksum(payload);
return payload;
}
void snspayload_set_key_at_idx(struct SnsPayload *payload, s32 idx, s32 key)
{
payload->data[idx] = key;
snspayload_calc_checksum(payload);
}
void snspayload_calc_checksum(struct SnsPayload *payload)
{
glcrc_calc_checksum(payload, &payload->checksum, payload->checksum);
}
bool snspayload_validate(struct SnsPayload *payload)
{
u32 checksum[2];
glcrc_calc_checksum(payload, payload->checksum, checksum);
if ((payload->checksum[0] == checksum[0]) && (payload->checksum[1] == checksum[1]))
return TRUE;
return FALSE;
}
struct SnsPayload *snspayload_find_payload_in_ram(void)
{
struct SnsPayload *payload;
for (payload = (struct SnsPayload *)0x80000000; payload < (struct SnsPayload *)0x80400080; payload++)
if (payload->magic == SNS_HEADER_MAGIC && snspayload_validate(payload))
return payload;
return NULL;
}
s32 snspayload_contains_key(struct SnsPayload *payload, s32 key)
{
u32 i;
for (i = 0; i < SNS_PAYLOAD_DATALEN; i++)
if (payload->data[i] == key)
return key;
return 0;
}
s32 snspayload_get_key_in_range(struct SnsPayload *payload, s32 min, s32 max)
{
s32 i;
for (i = 0; i < SNS_PAYLOAD_DATALEN; i++)
{
if (payload->data[i] < min)
continue;
if (payload->data[i] > max)
continue;
return payload->data[i];
}
return 0;
}
void snspayload_rewind_incoming(void)
{
snsPayloadInCurrPos = 0;
}
u32 snspayload_get_next_key(struct SnsPayload *payload)
{
while (snsPayloadInCurrPos < SNS_PAYLOAD_DATALEN)
{
if (payload->data[snsPayloadInCurrPos])
return payload->data[snsPayloadInCurrPos++];
snsPayloadInCurrPos++;
}
return 0;
}
void snspayload_rewind_outgoing(void)
{
snsPayloadOutCurrPos = 0;
}
void snspayload_append_key_to_outgoing_payload(struct SnsPayload *payload, s32 key)
{
payload->data[snsPayloadOutCurrPos++] = key;
}
void snspayload_finalise_outgoing_payload(struct SnsPayload *payload)
{
while (snsPayloadOutCurrPos < SNS_PAYLOAD_DATALEN)
payload->data[snsPayloadOutCurrPos++] = 0;
snspayload_calc_checksum(payload);
}