110 lines
2.2 KiB
C
110 lines
2.2 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
void mapSpecificFlags_set(s32 i, s32 val);
|
|
|
|
/* .data */
|
|
u32 D_80367000 = 0;
|
|
|
|
/* .bss */
|
|
u32 D_8037DDE0;
|
|
u32 D_8037DDE4;
|
|
u32 D_8037DDE8;
|
|
|
|
/* .code */
|
|
u32 _mapSpecificFlags_calcCRC1(void){
|
|
return D_80367000 ^ 0x1195E97;
|
|
}
|
|
|
|
void _mapSpecificFlags_updateCRCs(void){
|
|
D_8037DDE4 = D_80367000 ^ 0xA84E38C8;
|
|
D_8037DDE0 = _mapSpecificFlags_calcCRC1();
|
|
D_8037DDE8 = D_80367000 ^ 0x3973e4d9;
|
|
}
|
|
|
|
void mapSpecificFlags_clearAll(void){
|
|
D_80367000 = 0;
|
|
_mapSpecificFlags_updateCRCs();
|
|
}
|
|
|
|
s32 mapSpecificFlags_get(s32 i){
|
|
return (D_80367000 & (1 << i))? 1 : 0;
|
|
}
|
|
|
|
u32 mapSpecificFlags_getN(s32 idx, s32 n){
|
|
s32 i;
|
|
u32 ret_val = 0;
|
|
for(i = 0; i < n; i++){
|
|
ret_val |= mapSpecificFlags_get(idx + i) << i;
|
|
}
|
|
return ret_val;
|
|
}
|
|
|
|
u32 mapSpecificFlags_getClear(s32 i){
|
|
u32 ret_val = mapSpecificFlags_get(i);
|
|
mapSpecificFlags_set(i, 0);
|
|
return ret_val;
|
|
}
|
|
|
|
void mapSpecificFlags_set(s32 i, s32 val){
|
|
if(val)
|
|
D_80367000 |= 1 << i;
|
|
else
|
|
D_80367000 &= ~(1 << i);
|
|
_mapSpecificFlags_updateCRCs();
|
|
}
|
|
|
|
void mapSpecificFlags_setN(s32 idx, s32 val, s32 n){
|
|
s32 i;
|
|
for(i = 0; i < n; i++){
|
|
mapSpecificFlags_set(idx + i, (1 << i) & val);
|
|
}
|
|
}
|
|
|
|
u32 mapSpecificFlags_getAll(void){
|
|
return D_80367000;
|
|
}
|
|
|
|
void mapSpecificFlags_setAll(u32 arg0){
|
|
D_80367000 = arg0;
|
|
_mapSpecificFlags_updateCRCs();
|
|
}
|
|
|
|
s32 *bitfield_new(s32 arg0){
|
|
s32 *phi_v0;
|
|
|
|
phi_v0 = (s32*)malloc( (((arg0 + 0x1F)>>5) + 1)*sizeof(s32));
|
|
*phi_v0 = arg0;
|
|
return phi_v0;
|
|
}
|
|
|
|
void bitfield_free(s32 *arg0){
|
|
free(arg0);
|
|
}
|
|
|
|
void bitfield_setBit(s32 *arg0, s32 arg1, bool arg2){
|
|
if(arg2){
|
|
arg0[(arg1 >> 5) + 1] |= 1 << (arg1 & (0x1F));
|
|
}
|
|
else{
|
|
arg0[(arg1 >> 5) + 1] -= arg0[(arg1 >> 5) + 1] & (1 << (arg1 & 0x1F));
|
|
}
|
|
}
|
|
|
|
bool bitfield_isBitSet(s32 *arg0, s32 arg1){
|
|
return (arg0[(arg1 >> 5) + 1] & (1 << (arg1 & 0x1F))) ? TRUE : FALSE;
|
|
}
|
|
|
|
void bitfield_setAll(s32 *arg0, bool arg1) {
|
|
s32 i;
|
|
|
|
for(i = 0; i < *arg0; i++){
|
|
bitfield_setBit(arg0, i, arg1);
|
|
}
|
|
}
|
|
|
|
s32 mapSpecificFlags_validateCRC1(void){
|
|
return _mapSpecificFlags_calcCRC1() == D_8037DDE0;
|
|
}
|