|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2024 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // ROM エミュレーションデバイスの基本クラス ! 9: // ! 10: ! 11: // IODevice ! 12: // | ! 13: // +- ROMDevice (LoadROM()、ウェイト、マスク等を持つ) ! 14: // | +- PROMDevice (LUNA* の PROM) ! 15: // | +- IPLROM1Device (X680x0 の IPLROM 後半) ! 16: // | +- IPLROM2Device (X680x0 の IPLROM 前半) ! 17: // | +- CGROMDevice (X680x0 の CGROM) ! 18: // | | ! 19: // | | +--------------+ ! 20: // | +-| ROMEmuDevice | (ROM エミュレーションの共通部分) ! 21: // | +--------------+ ! 22: // | | ! 23: // | +- LunaPROMEmuDevice (LUNA PROM エミュレーションの共通部分) ! 24: // | | +- Luna1PROMEmuDevice (LUNA-I の PROM エミュレーション) ! 25: // | | +- Luna88kPROMEmuDevice (LUNA-88K の PROM エミュレーション) ! 26: // | +- NewsROMEmuDevice (NEWS の ROM エミュレーション) ! 27: // | +- ROM30EmuDevice (X68030 の ROM30 エミュレーション) ! 28: // | +- Virt68kROMEmuDevice (virt-m68k の IPLROM 相当の何か) ! 29: // | ! 30: // +- PROM0Device (LUNA* のブートページ切り替え用プロキシ) ! 31: // +- IPLROM0Device (X680x0 のブートページ切り替え用プロキシ) ! 32: ! 33: #include "romemu.h" ! 34: ! 35: // コンストラクタ ! 36: ROMEmuDevice::ROMEmuDevice(uint objid_) ! 37: : inherited(objid_) ! 38: { ! 39: } ! 40: ! 41: // デストラクタ ! 42: ROMEmuDevice::~ROMEmuDevice() ! 43: { ! 44: } ! 45: ! 46: busdata ! 47: ROMEmuDevice::Read(busaddr addr) ! 48: { ! 49: uint64 romdata; ! 50: ! 51: // ROMIO が反応すればそっちを返す。そうでなければ ROM の内容を返す。 ! 52: romdata = ReadROMIO(addr); ! 53: if ((int64)romdata >= 0) { ! 54: busdata data = romdata; ! 55: data |= BusData::Size4; ! 56: return data; ! 57: } else { ! 58: return inherited::Read(addr); ! 59: } ! 60: } ! 61: ! 62: busdata ! 63: ROMEmuDevice::Write(busaddr addr, uint32 data) ! 64: { ! 65: // ROMIO が反応するかどうか。どちらにしても規定の応答を返す。 ! 66: if (WriteROMIO(addr, data) == true) { ! 67: busdata r = write_op; ! 68: r |= BusData::Size4; ! 69: return r; ! 70: } else { ! 71: return inherited::Write(addr, data); ! 72: } ! 73: } ! 74: ! 75: // 必要なら継承側でオーバーライドする。 ! 76: uint64 ! 77: ROMEmuDevice::ReadROMIO(busaddr addr) ! 78: { ! 79: return (uint64)-1; ! 80: } ! 81: ! 82: // 必要なら継承側でオーバーライドする。 ! 83: bool ! 84: ROMEmuDevice::WriteROMIO(busaddr addr, uint32 data) ! 85: { ! 86: return false; ! 87: } ! 88: ! 89: // Peek は未対応。
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.