diff options
Diffstat (limited to 'src/lib/util/multibyte.h')
-rw-r--r-- | src/lib/util/multibyte.h | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/src/lib/util/multibyte.h b/src/lib/util/multibyte.h new file mode 100644 index 00000000000..6af34de83ed --- /dev/null +++ b/src/lib/util/multibyte.h @@ -0,0 +1,301 @@ +// license:BSD-3-Clause +// copyright-holders:Mietek Bak +#ifndef MAME_UTIL_MULTIBYTE_H +#define MAME_UTIL_MULTIBYTE_H + +#pragma once + +#include "coretmpl.h" +#include "osdcomm.h" + +////////////////////////////////////////////////////////////////////////////// + +// unsigned big-endian + +constexpr osd::u16 get_u16be(osd::u8 const *buf) noexcept +{ + return (osd::u16(buf[0]) << 8) + | (osd::u16(buf[1]) << 0); +} + +constexpr osd::u32 get_u24be(osd::u8 const *buf) noexcept +{ + return (osd::u32(buf[0]) << 16) + | (osd::u32(buf[1]) << 8) + | (osd::u32(buf[2]) << 0); +} + +constexpr osd::u32 get_u32be(osd::u8 const *buf) noexcept +{ + return (osd::u32(buf[0]) << 24) + | (osd::u32(buf[1]) << 16) + | (osd::u32(buf[2]) << 8) + | (osd::u32(buf[3]) << 0); +} + +constexpr osd::u64 get_u48be(osd::u8 const *buf) noexcept +{ + return (osd::u64(buf[0]) << 40) + | (osd::u64(buf[1]) << 32) + | (osd::u64(buf[2]) << 24) + | (osd::u64(buf[3]) << 16) + | (osd::u64(buf[4]) << 8) + | (osd::u64(buf[5]) << 0); +} + +constexpr osd::u64 get_u64be(osd::u8 const *buf) noexcept +{ + return (osd::u64(buf[0]) << 56) + | (osd::u64(buf[1]) << 48) + | (osd::u64(buf[2]) << 40) + | (osd::u64(buf[3]) << 32) + | (osd::u64(buf[4]) << 24) + | (osd::u64(buf[5]) << 16) + | (osd::u64(buf[6]) << 8) + | (osd::u64(buf[7]) << 0); +} + +inline void put_u16be(osd::u8 *buf, osd::u16 data) noexcept +{ + buf[0] = osd::u8(data >> 8); + buf[1] = osd::u8(data >> 0); +} + +inline void put_u24be(osd::u8 *buf, osd::u32 data) noexcept +{ + buf[0] = osd::u8(data >> 16); + buf[1] = osd::u8(data >> 8); + buf[2] = osd::u8(data >> 0); +} + +inline void put_u32be(osd::u8 *buf, osd::u32 data) noexcept +{ + buf[0] = osd::u8(data >> 24); + buf[1] = osd::u8(data >> 16); + buf[2] = osd::u8(data >> 8); + buf[3] = osd::u8(data >> 0); +} + +inline void put_u48be(osd::u8 *buf, osd::u64 data) noexcept +{ + buf[0] = osd::u8(data >> 40); + buf[1] = osd::u8(data >> 32); + buf[2] = osd::u8(data >> 24); + buf[3] = osd::u8(data >> 16); + buf[4] = osd::u8(data >> 8); + buf[5] = osd::u8(data >> 0); +} + +inline void put_u64be(osd::u8 *buf, osd::u64 data) noexcept +{ + buf[0] = osd::u8(data >> 56); + buf[1] = osd::u8(data >> 48); + buf[2] = osd::u8(data >> 40); + buf[3] = osd::u8(data >> 32); + buf[4] = osd::u8(data >> 24); + buf[5] = osd::u8(data >> 16); + buf[6] = osd::u8(data >> 8); + buf[7] = osd::u8(data >> 0); +} + +////////////////////////////////////////////////////////////////////////////// + +// signed big-endian + +constexpr osd::s16 get_s16be(osd::u8 const *buf) noexcept +{ + return get_u16be(buf); +} + +constexpr osd::s32 get_s24be(osd::u8 const *buf) noexcept +{ + return util::sext(get_u24be(buf), 24); +} + +constexpr osd::s32 get_s32be(osd::u8 const *buf) noexcept +{ + return get_u32be(buf); +} + +constexpr osd::s64 get_s48be(osd::u8 const *buf) noexcept +{ + return util::sext(get_u48be(buf), 48); +} + +constexpr osd::s64 get_s64be(osd::u8 const *buf) noexcept +{ + return get_u64be(buf); +} + +inline void put_s16be(osd::u8 *buf, osd::s16 data) noexcept +{ + put_u16be(buf, data); +} + +inline void put_s24be(osd::u8 *buf, osd::s32 data) noexcept +{ + put_u24be(buf, data); +} + +inline void put_s32be(osd::u8 *buf, osd::s32 data) noexcept +{ + put_u32be(buf, data); +} + +inline void put_s48be(osd::u8 *buf, osd::s64 data) noexcept +{ + put_u48be(buf, data); +} + +inline void put_s64be(osd::u8 *buf, osd::s64 data) noexcept +{ + put_u64be(buf, data); +} + +////////////////////////////////////////////////////////////////////////////// + +// unsigned little-endian + +constexpr osd::u16 get_u16le(osd::u8 const *buf) noexcept +{ + return (osd::u16(buf[0]) << 0) + | (osd::u16(buf[1]) << 8); +} + +constexpr osd::u32 get_u24le(osd::u8 const *buf) noexcept +{ + return (osd::u32(buf[0]) << 0) + | (osd::u32(buf[1]) << 8) + | (osd::u32(buf[2]) << 16); +} + +constexpr osd::u32 get_u32le(osd::u8 const *buf) noexcept +{ + return (osd::u32(buf[0]) << 0) + | (osd::u32(buf[1]) << 8) + | (osd::u32(buf[2]) << 16) + | (osd::u32(buf[3]) << 24); +} + +constexpr osd::u64 get_u48le(osd::u8 const *buf) noexcept +{ + return (osd::u64(buf[0]) << 0) + | (osd::u64(buf[1]) << 8) + | (osd::u64(buf[2]) << 16) + | (osd::u64(buf[3]) << 24) + | (osd::u64(buf[4]) << 32) + | (osd::u64(buf[5]) << 40); +} + +constexpr osd::u64 get_u64le(osd::u8 const *buf) noexcept +{ + return (osd::u64(buf[0]) << 0) + | (osd::u64(buf[1]) << 8) + | (osd::u64(buf[2]) << 16) + | (osd::u64(buf[3]) << 24) + | (osd::u64(buf[4]) << 32) + | (osd::u64(buf[5]) << 40) + | (osd::u64(buf[6]) << 48) + | (osd::u64(buf[7]) << 56); +} + +inline void put_u16le(osd::u8 *buf, osd::u16 data) noexcept +{ + buf[0] = osd::u8(data >> 0); + buf[1] = osd::u8(data >> 8); +} + +inline void put_u24le(osd::u8 *buf, osd::u32 data) noexcept +{ + buf[0] = osd::u8(data >> 0); + buf[1] = osd::u8(data >> 8); + buf[2] = osd::u8(data >> 16); +} + +inline void put_u32le(osd::u8 *buf, osd::u32 data) noexcept +{ + buf[0] = osd::u8(data >> 0); + buf[1] = osd::u8(data >> 8); + buf[2] = osd::u8(data >> 16); + buf[3] = osd::u8(data >> 24); +} + +inline void put_u48le(osd::u8 *buf, osd::u64 data) noexcept +{ + buf[0] = osd::u8(data >> 0); + buf[1] = osd::u8(data >> 8); + buf[2] = osd::u8(data >> 16); + buf[3] = osd::u8(data >> 24); + buf[4] = osd::u8(data >> 32); + buf[5] = osd::u8(data >> 40); +} + +inline void put_u64le(osd::u8 *buf, osd::u64 data) noexcept +{ + buf[0] = osd::u8(data >> 0); + buf[1] = osd::u8(data >> 8); + buf[2] = osd::u8(data >> 16); + buf[3] = osd::u8(data >> 24); + buf[4] = osd::u8(data >> 32); + buf[5] = osd::u8(data >> 40); + buf[6] = osd::u8(data >> 48); + buf[7] = osd::u8(data >> 56); +} + +////////////////////////////////////////////////////////////////////////////// + +// signed little-endian + +constexpr osd::s16 get_s16le(osd::u8 const *buf) noexcept +{ + return get_u16le(buf); +} + +constexpr osd::s32 get_s24le(osd::u8 const *buf) noexcept +{ + return util::sext(get_u24le(buf), 24); +} + +constexpr osd::s32 get_s32le(osd::u8 const *buf) noexcept +{ + return get_u32le(buf); +} + +constexpr osd::s64 get_s48le(osd::u8 const *buf) noexcept +{ + return util::sext(get_u48le(buf), 48); +} + +constexpr osd::s64 get_s64le(osd::u8 const *buf) noexcept +{ + return get_u64le(buf); +} + +inline void put_s16le(osd::u8 *buf, osd::s16 data) noexcept +{ + put_u16le(buf, data); +} + +inline void put_s24le(osd::u8 *buf, osd::s32 data) noexcept +{ + put_u24le(buf, data); +} + +inline void put_s32le(osd::u8 *buf, osd::s32 data) noexcept +{ + put_u32le(buf, data); +} + +inline void put_s48le(osd::u8 *buf, osd::s64 data) noexcept +{ + put_u48le(buf, data); +} + +inline void put_s64le(osd::u8 *buf, osd::s64 data) noexcept +{ + put_u64le(buf, data); +} + +////////////////////////////////////////////////////////////////////////////// + +#endif // MAME_UTIL_MULTIBYTE_H |