omi-eikyo/src/m_binio.c

64 lines
1.2 KiB
C

// Copyright © 2017 Project Golan, all rights reserved.
#include "m_binio.h"
#include <stdio.h>
#include <math.h>
// Extern Functions ----------------------------------------------------------|
//
// M_IO_WriteLE4u
//
void M_IO_WriteLE4u(FILE *fp, mword v)
{
fputc((v >> 24) & 0xFF, fp);
fputc((v >> 16) & 0xFF, fp);
fputc((v >> 8) & 0xFF, fp);
fputc((v >> 0) & 0xFF, fp);
}
//
// M_IO_WriteLE4k
//
void M_IO_WriteLE4k(FILE *fp, fixed v)
{
#if __GDCC__
M_IO_WriteLE4u(fp, *(mword *)&v);
#else
float a = fabsf(v);
mword k = ((mword)a << 7) & 0x7FFFFF80;
k |= (mword)(fmod(a, 1) * 0x7F) & 0x7F;
if(v < 0) k |= 0x80000000;
M_IO_WriteLE4u(fp, k);
#endif
}
//
// M_IO_ReadLE4u
//
mword M_IO_ReadLE4u(FILE *fp)
{
mbyte data[4];
fread(data, 1, 4, fp);
return ((mword)data[0] << 0) | ((mword)data[1] << 8) |
((mword)data[2] << 16) | ((mword)data[3] << 24);
}
//
// M_IO_ReadLE4k
//
fixed M_IO_ReadLE4k(FILE *fp)
{
#if __GDCC__
return (union {mword u; fixed k;}){M_IO_ReadLE4u(fp)}.k;
#else
mword u = M_IO_ReadLE4u(fp);
float res = (u & 0x7FFFFF80) >> 7;
res += (u & 0x7F) / 127.f;
if(u & 0x80000000) res *= -1;
return res;
#endif
}
// EOF