mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-06-01 09:17:15 -04:00
82a28f7a23
* work on d_file_sel_warning * various cleanup * attempt to fix d_gameover * event cleanup * trk work * most of TRK done * remove asm
74 lines
2.3 KiB
C
74 lines
2.3 KiB
C
#include "TRK_MINNOW_DOLPHIN/utils/common/CircleBuffer.h"
|
|
|
|
/* 80372900-80372908 36D240 0008+00 0/0 2/2 0/0 .text CBGetBytesAvailableForRead */
|
|
u32 CBGetBytesAvailableForRead(CircleBuffer* cb) {
|
|
return cb->mBytesToRead;
|
|
}
|
|
|
|
/* 803728B0-80372900 36D1F0 0050+00 0/0 2/2 0/0 .text CircleBufferInitialize */
|
|
void CircleBufferInitialize(CircleBuffer* cb, u8* buf, s32 size) {
|
|
cb->start_ptr = buf;
|
|
cb->size = size;
|
|
cb->read_ptr = cb->start_ptr;
|
|
cb->write_ptr = cb->start_ptr;
|
|
cb->mBytesToRead = 0;
|
|
cb->mBytesToWrite = cb->size;
|
|
MWInitializeCriticalSection(&cb->mCriticalSection);
|
|
}
|
|
|
|
/* 803727A8-803728B0 36D0E8 0108+00 0/0 4/4 0/0 .text CircleBufferWriteBytes */
|
|
int CircleBufferWriteBytes(CircleBuffer* cb, u8* buf, u32 size) {
|
|
int availSize;
|
|
|
|
if (size > cb->mBytesToWrite) {
|
|
return -1;
|
|
}
|
|
MWEnterCriticalSection(&cb->mCriticalSection);
|
|
availSize = cb->size - (cb->write_ptr - cb->start_ptr);
|
|
if (availSize >= size) {
|
|
memcpy(cb->write_ptr, buf, size);
|
|
cb->write_ptr += size;
|
|
} else {
|
|
memcpy(cb->write_ptr, buf, availSize);
|
|
memcpy(cb->start_ptr, buf + availSize, size - availSize);
|
|
cb->write_ptr = cb->start_ptr + size - availSize;
|
|
}
|
|
|
|
if (cb->size == (cb->write_ptr - cb->start_ptr)) {
|
|
cb->write_ptr = cb->start_ptr;
|
|
}
|
|
|
|
cb->mBytesToWrite -= size;
|
|
cb->mBytesToRead += size;
|
|
MWExitCriticalSection(&cb->mCriticalSection);
|
|
return 0;
|
|
}
|
|
|
|
/* 803726A0-803727A8 36CFE0 0108+00 0/0 2/2 0/0 .text CircleBufferReadBytes */
|
|
int CircleBufferReadBytes(CircleBuffer* cb, u8* buf, u32 size) {
|
|
int availSize;
|
|
|
|
if (size > cb->mBytesToRead) {
|
|
return -1;
|
|
}
|
|
MWEnterCriticalSection(&cb->mCriticalSection);
|
|
availSize = cb->size - (cb->read_ptr - cb->start_ptr);
|
|
if (size < availSize) {
|
|
memcpy(buf, cb->read_ptr, size);
|
|
cb->read_ptr += size;
|
|
} else {
|
|
memcpy(buf, cb->read_ptr, availSize);
|
|
memcpy(buf + availSize, cb->start_ptr, size - availSize);
|
|
cb->read_ptr = cb->start_ptr + size - availSize;
|
|
}
|
|
|
|
if (cb->size == (cb->read_ptr - cb->start_ptr)) {
|
|
cb->read_ptr = cb->start_ptr;
|
|
}
|
|
|
|
cb->mBytesToWrite += size;
|
|
cb->mBytesToRead -= size;
|
|
MWExitCriticalSection(&cb->mCriticalSection);
|
|
return 0;
|
|
}
|