summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/multibyte.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/util/multibyte.h')
-rw-r--r--src/lib/util/multibyte.h301
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