--- nono/vm/rom.h 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/rom.h 2026/04/29 17:05:42 1.1.1.13 @@ -1,44 +1,59 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// ROM の基本クラス // #pragma once #include "device.h" -class ROMDevice - : public IODevice +class ROMDevice : public IODevice { - typedef IODevice inherited; + using inherited = IODevice; public: - ROMDevice(); - virtual ~ROMDevice(); + explicit ROMDevice(uint objid_); + ~ROMDevice() override; - virtual uint64 Read8(uint32 addr); - virtual uint64 Read16(uint32 addr); - virtual uint64 Read32(uint32 addr); - virtual uint64 Write8(uint32 addr, uint32 data); - virtual uint64 Write16(uint32 addr, uint32 data); - virtual uint64 Write32(uint32 addr, uint32 data); - virtual uint64 Peek8(uint32 addr); + busdata Read(busaddr addr) override; + busdata Write(busaddr addr, uint32 data) override; + busdata Peek1(uint32 addr) override; + + // ファイル名を取得。なければ NULL。 + const char *GetFilename() const; + + // アクセスウェイト [clock] を取得/設定 + void SetWait(uint32 wait_); protected: - bool LoadROM(const char *name, int size); + bool AllocROM(uint len, uint8 fill); + bool LoadROM(const char *name, uint size); + + // Read()/Peek1() がアクセスするメモリ領域をさすポインタ。 + const uint8 *mem {}; - // アドレスマスク - uint32 mask = 0; + // アクセスマスク。 + // LUNA の PROM のように、この ROM の折り返しミラーが見える構造なら + // このアクセスマスクを設定すること。 + // X680x0 の各 ROM などはミラーが不要なのでコンストラクタで初期化される + // 0xffffffff のままでよい。 + uint32 mask {}; + + // ファイル名 + std::string filename {}; + + // イメージ + // (ファイルから読み込んだ内容、あるいは自分で作ったバッファ) + std::unique_ptr imagebuf {}; + + // ライトアクセス時の動作 (Write*() の戻り値)。 + // 派生クラスが指定すること。 + busdata write_op {}; - // オープンしているファイルのパスとディスクリプタ - std::string filename; - int fd = 0; - - // mmap される領域とサイズ - uint8 *file = NULL; - size_t filesize = 0; - - // メモリ領域をさすポインタ。 - // 通常は ROM イメージファイルを読み込むだけなので mem = file となる。 - // ROM イメージを自分で用意したい場合はこれを適当なところにむけてどうぞ。 - uint8 *mem = NULL; + // アクセスウェイト + busdata wait {}; };