File:  [Isaki's NoNo m68k/m88k emulator] / nono / lib / memorystream.h
Revision 1.1.1.7 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:05:26 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v027, v026, v025, v024, v023, v022, v021, v020, HEAD
nono 1.0.0

//
// nono
// Copyright (C) 2020 nono project
// Licensed under nono-license.txt
//

//
// メモリストリーム
//

#pragma once

#include "header.h"

// ホストのメモリ領域に対するストリームクラスみたいなもの。
class MemoryStream
{
 public:
	explicit MemoryStream(void *start_) {
		Init(start_);
	}

	// 開始ポインタを設定する
	// 現在のポインタ位置は開始ポインタ位置になる
	void Init(void *start_) {
		start = (uint8 *)start_;
		ptr = start;
	}

	// 開始ポインタを取得する
	void *GetStartPtr() const
	{
		return (void *)start;
	}

	// バイトオフセットを設定する
	void SetOffset(uint32 ofs)
	{
		ptr = start + ofs;
	}

	// 現在のバイトオフセットを取得する
	uint32 GetOffset() const
	{
		return (uint32)(ptr - start);
	}

	// 1バイト読み込んでポインタを進める
	uint32 Read1() {
		uint32 data = *ptr++;
		return data;
	}

	// 1バイト書き込んでポインタを進める
	void Write1(uint32 data) {
		*ptr++ = data;
	}

	// 文字列を書き込んでポインタを進める。
	// 書き込む文字列も終端の '\0' まで書く。
	void WriteString(const char *p) {
		while (*p) {
			Write1(*p++);
		}
		Write1('\0');
	}

 protected:
	uint8 *ptr {};
	uint8 *start {};
};

// データの受け渡しはホストエンディアンで、
// アクセスはビッグエンディアンになる。境界への整列は不要。
class MemoryStreamBE : public MemoryStream
{
	using inherited = MemoryStream;
 public:
	explicit MemoryStreamBE(void *start_)
		: inherited(start_)
	{
	}

	// BE で2バイト読み込んでポインタを進める
	uint32 Read2() {
		uint32 data;
		data  = Read1() << 8;
		data |= Read1();
		return data;
	}
	// BE で4バイト読み込んでポインタを進める
	uint32 Read4() {
		uint32 data;
		data  = Read2() << 16;
		data |= Read2();
		return data;
	}

	// BE で2バイト書き込んでポインタを進める
	void Write2(uint32 data) {
		Write1(data >> 8);
		Write1(data & 0xff);
	}
	// BE で4バイト書き込んでポインタを進める
	void Write4(uint32 data) {
		Write2(data >> 16);
		Write2(data & 0xffff);
	}
};

// データの受け渡しはホストエンディアンで、
// アクセスはリトルエンディアンになる。境界への整列は不要。
class MemoryStreamLE : public MemoryStream
{
	using inherited = MemoryStream;
 public:
	explicit MemoryStreamLE(void *start_)
		: inherited(start_)
	{
	}

	// LE で2バイト読み込んでポインタを進める
	uint32 Read2() {
		uint32 data;
		data  = Read1();
		data |= Read1() << 8;
		return data;
	}
	// LE で4バイト読み込んでポインタを進める
	uint32 Read4() {
		uint32 data;
		data  = Read2();
		data |= Read2() << 16;
		return data;
	}

	// LE で2バイト書き込んでポインタを進める。
	void Write2(uint32 data) {
		Write1(data & 0xff);
		Write1(data >> 8);
	}
	// LE で4バイト書き込んでポインタを進める。
	void Write4(uint32 data) {
		Write2(data & 0xffff);
		Write2(data >> 16);
	}
	// LE で8バイト書き込んでポインタを進める。
	void Write8(uint64 data) {
		Write4((uint32)data);
		Write4(data >> 32);
	}
};

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.