blob: f4a346c22645225978dbd153de62ec8bc3b0274a [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* ---- includes ----------------------------------------------------------- */
#include "b_BasicEm/Functions.h"
#include "b_BasicEm/Context.h"
/* ---- related objects --------------------------------------------------- */
/* ---- typedefs ----------------------------------------------------------- */
/* ---- constants ---------------------------------------------------------- */
/* ---- globals ---------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* ========================================================================= */
/* */
/* ---- \ghd{ external functions } ----------------------------------------- */
/* */
/* ========================================================================= */
/* ------------------------------------------------------------------------- */
uint16 bbs_swapBytes( uint16 valA )
{
return ( ( valA >> 8 ) & 0x00FF ) | ( ( valA << 8 ) & 0xFF00 );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memWrite32( const void* ptrA,
uint16* memPtrA )
{
uint32 valL = *( uint32* )ptrA;
#ifdef HW_BIG_ENDIAN
*memPtrA++ = bbs_swapBytes( ( uint16 )( ( valL >> 0 ) & 0xFFFF ) );
*memPtrA++ = bbs_swapBytes( ( uint16 )( ( valL >> 16 ) & 0xFFFF ) );
#else
*memPtrA++ = ( valL >> 0 ) & 0xFFFF;
*memPtrA++ = ( valL >> 16 ) & 0xFFFF;
#endif
return bbs_SIZEOF16( uint32 );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memRead32( void* ptrA,
const uint16* memPtrA )
{
uint32 valL = 0;
#ifdef HW_BIG_ENDIAN
valL |= ( ( uint32 )bbs_swapBytes( *memPtrA++ ) << 0 );
valL |= ( ( uint32 )bbs_swapBytes( *memPtrA++ ) << 16 );
#else
valL |= ( ( uint32 )*memPtrA++ << 0 );
valL |= ( ( uint32 )*memPtrA++ << 16 );
#endif
*( uint32* )ptrA = valL;
return bbs_SIZEOF16( uint32 );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memPeek32( const uint16* memPtrA )
{
uint32 valL = 0;
#ifdef HW_BIG_ENDIAN
valL |= ( ( uint32 )bbs_swapBytes( *memPtrA++ ) << 0 );
valL |= ( ( uint32 )bbs_swapBytes( *memPtrA++ ) << 16 );
#else
valL |= ( ( uint32 )*memPtrA++ << 0 );
valL |= ( ( uint32 )*memPtrA++ << 16 );
#endif
return valL;
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memWrite16( const void* ptrA,
uint16* memPtrA )
{
#ifdef HW_BIG_ENDIAN
*memPtrA++ = bbs_swapBytes( *( uint16* )ptrA );
#else
*memPtrA++ = *( uint16* )ptrA;
#endif
return bbs_SIZEOF16( uint16 );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memRead16( void* ptrA,
const uint16* memPtrA )
{
#ifdef HW_BIG_ENDIAN
*( uint16* )ptrA = bbs_swapBytes( *memPtrA++ );
#else
*( uint16* )ptrA = *memPtrA++;
#endif
return bbs_SIZEOF16( uint16 );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memWrite32Arr( struct bbs_Context* cpA,
const void* ptrA,
uint32 sizeA, uint16* memPtrA )
{
uint32 iL;
const uint32* srcL = ( uint32* )ptrA;
if( bbs_Context_error( cpA ) ) return 0;
for( iL = 0; iL < sizeA; iL++ )
{
memPtrA += bbs_memWrite32( srcL++, memPtrA );
}
return sizeA * bbs_SIZEOF16( uint32 );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memRead32Arr( struct bbs_Context* cpA,
void* ptrA,
uint32 sizeA,
const uint16* memPtrA )
{
uint32 iL;
uint32* dstL = ( uint32* )ptrA;
if( bbs_Context_error( cpA ) ) return 0;
for( iL = 0; iL < sizeA; iL++ )
{
memPtrA += bbs_memRead32( dstL++, memPtrA );
}
return sizeA * bbs_SIZEOF16( uint32 );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memWrite16Arr( struct bbs_Context* cpA,
const void* ptrA,
uint32 sizeA,
uint16* memPtrA )
{
uint32 iL;
const uint16* srcL = ( uint16* )ptrA;
if( bbs_Context_error( cpA ) ) return 0;
for( iL = 0; iL < sizeA; iL++ )
{
memPtrA += bbs_memWrite16( srcL++, memPtrA );
}
return sizeA * bbs_SIZEOF16( uint16 );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memRead16Arr( struct bbs_Context* cpA,
void* ptrA,
uint32 sizeA,
const uint16* memPtrA )
{
uint32 iL;
uint16* dstL = ( uint16* )ptrA;
if( bbs_Context_error( cpA ) ) return 0;
for( iL = 0; iL < sizeA; iL++ )
{
memPtrA += bbs_memRead16( dstL++, memPtrA );
}
return sizeA * bbs_SIZEOF16( uint16 );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memWriteUInt32( uint32 valA,
uint16* memPtrA )
{
#ifdef HW_BIG_ENDIAN
*memPtrA++ = bbs_swapBytes( ( uint16 )( ( valA >> 0 ) & 0xFFFF ) );
*memPtrA++ = bbs_swapBytes( ( uint16 )( ( valA >> 16 ) & 0xFFFF ) );
#else
*memPtrA++ = ( valA >> 0 ) & 0xFFFF;
*memPtrA++ = ( valA >> 16 ) & 0xFFFF;
#endif
return bbs_SIZEOF16( valA );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memWriteUInt16( uint16 valA,
uint16* memPtrA )
{
#ifdef HW_BIG_ENDIAN
*memPtrA++ = bbs_swapBytes( valA );
#else
*memPtrA++ = valA;
#endif
return bbs_SIZEOF16( valA );
}
/* ------------------------------------------------------------------------- */
uint32 bbs_memReadVersion32( struct bbs_Context* cpA,
uint32* versionPtrA,
uint32 refVersionA,
const uint16* memPtrA )
{
if( bbs_Context_error( cpA ) ) return 0;
bbs_memRead32( versionPtrA, memPtrA );
if( *versionPtrA > refVersionA )
{
bbs_ERR0( bbs_ERR_WRONG_VERSION, "uint32 bbs_memReadVersion32( .... ):\n"
"Data format is newer than software or corrupt\n" );
}
return bbs_SIZEOF16( uint32 );
}
/* ------------------------------------------------------------------------- */
uint16 bbs_memCheckSum16( const uint16* memPtrA, uint32 sizeA )
{
uint32 iL;
uint16 sumL = 0;
for( iL = 0; iL < sizeA; iL++ )
{
#ifdef HW_BIG_ENDIAN
sumL += bbs_swapBytes( memPtrA[ iL ] );
#else
sumL += memPtrA[ iL ];
#endif
}
return sumL;
}
/* ------------------------------------------------------------------------- */