2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-14 06:46:09 +00:00

Merge branch 'dawn' into new-cmodel

# Conflicts:
#	Runtime/Streams/ContainerReaders.hpp
This commit is contained in:
2022-03-01 01:37:08 -05:00
28 changed files with 473 additions and 250 deletions

View File

@@ -78,27 +78,27 @@ void COutputStream::Put(const u8* ptr, u32 len) {
}
void COutputStream::WriteBits(u32 val, u32 bitCount) {
const u32 bitOffset = x18_shiftRegisterOffset;
if (x18_shiftRegisterOffset < bitCount) {
const s32 shiftAmt = x18_shiftRegisterOffset - s32(bitCount);
if (shiftAmt < 0) {
/* OR remaining bits to cached value */
const u32 shiftAmt = (bitCount - x18_shiftRegisterOffset);
const u32 mask = bitOffset == 32 ? -1 : (1 << bitOffset) - 1;
const u32 mask = (1U << x18_shiftRegisterOffset) - 1;
x14_shiftRegister |= (val >> u32(-shiftAmt)) & mask;
/* Write out 32-bits */
x14_shiftRegister |= (val >> shiftAmt) & mask;
x18_shiftRegisterOffset = 0;
FlushShiftRegister();
/* Cache remaining bits */
x14_shiftRegister = (val & (shiftAmt == 32 ? -1 : (1 << shiftAmt) - 1)) << (32 - shiftAmt);
x18_shiftRegisterOffset -= shiftAmt;
x18_shiftRegisterOffset = 0x20 + shiftAmt;
x14_shiftRegister = val << x18_shiftRegisterOffset;
} else {
/* OR bits to cached value */
const u32 mask = bitOffset == 0x20 ? -1 : (1 << bitOffset) - 1;
x14_shiftRegister |= (val & mask) << (bitOffset - bitCount);
const u32 mask = bitCount == 32 ? UINT32_MAX : ((1U << bitCount) - 1);
x14_shiftRegister |= (val & mask) << u32(shiftAmt);
/* New bit offset */
x18_shiftRegisterOffset -= bitCount;
}
}
void COutputStream::WriteChar(u8 c) {
@@ -199,6 +199,14 @@ void coutput_stream_helper(const std::string& t, COutputStream& out) {
}
}
template <>
void coutput_stream_helper(const std::string_view& t, COutputStream& out) {
for (size_t i = 0; i < t.size() + 1; ++i) {
out.FlushShiftRegister();
out.Put(t[i]);
}
}
u32 COutputStream::GetBitCount(u32 val) {
int bits = 0;
for (; val != 0; val >>= 1) {