summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/multibyte.h
diff options
context:
space:
mode:
author Miƫtek Bak <mietek@bak.io>2023-09-14 02:27:47 +0200
committer GitHub <noreply@github.com>2023-09-14 07:27:47 +0700
commit5353a8df14d88a378361902a6954ab4c5c1dc5bf (patch)
treefaeb581bddcf4367980e775ae63ca3540ecb73cd /src/lib/util/multibyte.h
parent86c6e83b4c2b8aca18db2565e72b03f90a25dda5 (diff)
nscsi: Add SCSI tape device based on SIMH tape image format (#11430)
Diffstat (limited to 'src/lib/util/multibyte.h')
-rw-r--r--src/lib/util/multibyte.h251
1 files changed, 251 insertions, 0 deletions
diff --git a/src/lib/util/multibyte.h b/src/lib/util/multibyte.h
new file mode 100644
index 00000000000..07510e64678
--- /dev/null
+++ b/src/lib/util/multibyte.h
@@ -0,0 +1,251 @@
+// license:BSD-3-Clause
+// copyright-holders:Mietek Bak
+
+#ifndef MAME_LIB_UTIL_MULTIBYTE_H
+#define MAME_LIB_UTIL_MULTIBYTE_H
+
+#pragma once
+
+#include "coretmpl.h"
+#include "osdcomm.h"
+
+using osd::u8;
+using osd::u16;
+using osd::u32;
+using osd::u64;
+using osd::s8;
+using osd::s16;
+using osd::s32;
+using osd::s64;
+
+//////////////////////////////////////////////////////////////////////////////
+
+// unsigned big-endian
+
+inline const u16 get_u16be(const u8 *const buf)
+{
+ return ((const u16)buf[0] << 8)
+ | ((const u16)buf[1] << 0);
+}
+
+inline const u32 get_u24be(const u8 *const buf)
+{
+ return ((const u32)buf[0] << 16)
+ | ((const u32)buf[1] << 8)
+ | ((const u32)buf[2] << 0);
+}
+
+inline const u32 get_u32be(const u8 *const buf)
+{
+ return ((const u32)buf[0] << 24)
+ | ((const u32)buf[1] << 16)
+ | ((const u32)buf[2] << 8)
+ | ((const u32)buf[3] << 0);
+}
+
+inline const u64 get_u64be(const u8 *const buf)
+{
+ return ((const u64)buf[0] << 56)
+ | ((const u64)buf[1] << 48)
+ | ((const u64)buf[2] << 40)
+ | ((const u64)buf[3] << 36)
+ | ((const u64)buf[4] << 24)
+ | ((const u64)buf[5] << 16)
+ | ((const u64)buf[6] << 8)
+ | ((const u64)buf[7] << 0);
+}
+
+inline void put_u16be(u8 *buf, const u16 data)
+{
+ buf[0] = data >> 8;
+ buf[1] = data >> 0;
+}
+
+inline void put_u24be(u8 *buf, const u32 data)
+{
+ buf[0] = data >> 16;
+ buf[1] = data >> 8;
+ buf[2] = data >> 0;
+}
+
+inline void put_u32be(u8 *buf, const u32 data)
+{
+ buf[0] = data >> 24;
+ buf[1] = data >> 16;
+ buf[2] = data >> 8;
+ buf[3] = data >> 0;
+}
+
+inline void put_u64be(u8 *buf, const u64 data)
+{
+ buf[0] = data >> 56;
+ buf[1] = data >> 48;
+ buf[2] = data >> 40;
+ buf[3] = data >> 36;
+ buf[4] = data >> 24;
+ buf[5] = data >> 16;
+ buf[6] = data >> 8;
+ buf[7] = data >> 0;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+// signed big-endian
+
+inline const s16 get_s16be(const u8 *const buf)
+{
+ return get_u16be(buf);
+}
+
+inline const s32 get_s24be(const u8 *const buf)
+{
+ return util::sext(get_u24be(buf), 24);
+}
+
+inline const s32 get_s32be(const u8 *const buf)
+{
+ return get_u32be(buf);
+}
+
+inline const s64 get_s64be(const u8 *const buf)
+{
+ return get_u64be(buf);
+}
+
+inline void put_s16be(u8 *buf, const s16 data)
+{
+ put_u16be(buf, data);
+}
+
+inline void put_s24be(u8 *buf, const s32 data)
+{
+ put_u24be(buf, data);
+}
+
+inline void put_s32be(u8 *buf, const s32 data)
+{
+ put_u32be(buf, data);
+}
+
+inline void put_s64be(u8 *buf, const s64 data)
+{
+ put_u64be(buf, data);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+// unsigned little-endian
+
+inline const u16 get_u16le(const u8 *const buf)
+{
+ return ((const u16)buf[0] << 0)
+ | ((const u16)buf[1] << 8);
+}
+
+inline const u32 get_u24le(const u8 *const buf)
+{
+ return ((const u32)buf[0] << 0)
+ | ((const u32)buf[1] << 8)
+ | ((const u32)buf[2] << 16);
+}
+
+inline const u32 get_u32le(const u8 *const buf)
+{
+ return ((const u32)buf[0] << 0)
+ | ((const u32)buf[1] << 8)
+ | ((const u32)buf[2] << 16)
+ | ((const u32)buf[3] << 24);
+}
+
+inline const u64 get_u64le(const u8 *const buf)
+{
+ return ((const u64)buf[0] << 0)
+ | ((const u64)buf[1] << 8)
+ | ((const u64)buf[2] << 16)
+ | ((const u64)buf[3] << 24)
+ | ((const u64)buf[4] << 32)
+ | ((const u64)buf[5] << 40)
+ | ((const u64)buf[6] << 48)
+ | ((const u64)buf[7] << 56);
+}
+
+inline void put_u16le(u8 *buf, const u16 data)
+{
+ buf[0] = data >> 0;
+ buf[1] = data >> 8;
+}
+
+inline void put_u24le(u8 *buf, const u32 data)
+{
+ buf[0] = data >> 0;
+ buf[1] = data >> 8;
+ buf[2] = data >> 16;
+}
+
+inline void put_u32le(u8 *buf, const u32 data)
+{
+ buf[0] = data >> 0;
+ buf[1] = data >> 8;
+ buf[2] = data >> 16;
+ buf[3] = data >> 24;
+}
+
+inline void put_u64le(u8 *buf, const u64 data)
+{
+ buf[0] = data >> 0;
+ buf[1] = data >> 8;
+ buf[2] = data >> 16;
+ buf[3] = data >> 24;
+ buf[4] = data >> 32;
+ buf[5] = data >> 40;
+ buf[6] = data >> 48;
+ buf[7] = data >> 56;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+// signed little-endian
+
+inline const s16 get_s16le(const u8 *const buf)
+{
+ return get_u16le(buf);
+}
+
+inline const s32 get_s24le(const u8 *const buf)
+{
+ return util::sext(get_u24le(buf), 24);
+}
+
+inline const s32 get_s32le(const u8 *const buf)
+{
+ return get_u32le(buf);
+}
+
+inline const s64 get_s64le(const u8 *const buf)
+{
+ return get_u64le(buf);
+}
+
+inline void put_s16le(u8 *buf, const s16 data)
+{
+ put_u16le(buf, data);
+}
+
+inline void put_s24le(u8 *buf, const s32 data)
+{
+ put_u24le(buf, data);
+}
+
+inline void put_s32le(u8 *buf, const s32 data)
+{
+ put_u32le(buf, data);
+}
+
+inline void put_s64le(u8 *buf, const s64 data)
+{
+ put_u64le(buf, data);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+#endif // MAME_LIB_UTIL_MULTIBYTE_H