--- nono/vm/ram.cpp 2026/04/29 17:04:59 1.1.1.10 +++ nono/vm/ram.cpp 2026/04/29 17:05:14 1.1.1.12 @@ -4,9 +4,14 @@ // Licensed under nono-license.txt // +// +// メインメモリ +// + #include "ram.h" #include "aout.h" #include "autofd.h" +#include "config.h" #include "elf.h" #include "iodevstream.h" #include "mainapp.h" @@ -16,16 +21,14 @@ #include #include -// -// メインメモリ -// - -std::unique_ptr gRAM; +// グローバル参照用 +RAMDevice *gRAM; // RAM はロングワード単位でホストバイトオーダ配置なので、 // バイトアクセス、ワードアクセス時は HLB(), HLW() マクロを使用のこと。 std::unique_ptr mainram; +// コンストラクタ RAMDevice::RAMDevice() : inherited("RAM") { @@ -33,7 +36,7 @@ RAMDevice::RAMDevice() // アクセスウェイト switch (gMainApp.GetVMType()) { - case VMTYPE_LUNA88K: + case VMType::LUNA88K: // 取扱説明書p.21 に、CMMU からのアクセスタイムが // リード(4byte)で 200ns、バーストリード(16byte)で 320ns // ライト(4byte)で 160ns、バーストライト(16byte)で 280ns とある。 @@ -42,21 +45,23 @@ RAMDevice::RAMDevice() read_wait = 3; write_wait = 2; break; - case VMTYPE_LUNA1: + case VMType::LUNA1: // LUNA-I は1ウェイト。 read_wait = 1; write_wait = 1; break; - case VMTYPE_X68030: + case VMType::X68030: default: // X68030 ではシステムポートが設定するのでここでは不要。 break; } } +// デストラクタ RAMDevice::~RAMDevice() { + gRAM = NULL; } bool @@ -72,7 +77,7 @@ RAMDevice::Init() } // 下限以外の制約は機種による switch (gMainApp.GetVMType()) { - case VMTYPE_X68030: + case VMType::X68030: // メインメモリは 12MB まで。 // 内部は 8KB 単位で処理できるが設定が 1MB 単位。 if (ram_size_MB > 12) { @@ -81,7 +86,7 @@ RAMDevice::Init() } break; - case VMTYPE_LUNA1: + case VMType::LUNA1: // 16MB までは、実機に合わせて 4MB 単位とする。 // see http://wiki.netbsd.org/ports/luna68k/luna68k_info/#hardware // @@ -101,7 +106,7 @@ RAMDevice::Init() } break; - case VMTYPE_LUNA88K: + case VMType::LUNA88K: // 64MB までは、実機に合わせて 16MB 単位とする。 // // 64MB を超える増設 (or 魔改造) 部分は未確認。 @@ -128,19 +133,16 @@ RAMDevice::Init() return true; } -bool -RAMDevice::PowerOn() -{ - // XXX ノイズを用意する - - return true; -} - +// 電源オン/リセット void -RAMDevice::ResetHard() +RAMDevice::ResetHard(bool poweron) { + if (poweron) { + // XXX ノイズを用意する + } + // X68030 ではリセットで戻るはず。(LUNA は固定なので関係ない) - if (gMainApp.GetVMType() == VMTYPE_X68030) { + if (gMainApp.GetVMType() == VMType::X68030) { read_wait = 0; write_wait = 0; } @@ -325,7 +327,7 @@ RAMDevice::LoadFile(const char *name, co const aout_header *aout = (const aout_header *)file; if (memcmp(ehdr->e_ident, "\177ELF", 4) == 0) { entry = Load_elf32(name, file, filesize); - } else if ((be32toh(aout->magic) & 0xffff) == AOUT_OMAGIC) { + } else if (AOUT_MAGIC(be32toh(aout->magic)) == AOUT_OMAGIC) { entry = Load_aout(name, file, filesize); } else { warnx("%s \"%s\" unknown executable file format", __func__, name); @@ -358,32 +360,31 @@ RAMDevice::Load_aout(const char *name, c aout.textrelsize = be32toh(((const aout_header *)file)->textrelsize); aout.datarelsize = be32toh(((const aout_header *)file)->datarelsize); - // マジックをチェック - uint32 mid = AOUT_MID(aout.magic); - bool mid_mismatch = false; - if (gMainApp.HasVMFeature(VMF_M68K)) { - if (mid != AOUT_MID_BSD_M68K8K && mid != AOUT_MID_BSD_M68K4K) { - mid_mismatch = true; + if (loglevel >= 1) { + const char *mstr; + switch (AOUT_MAGIC(aout.magic)) { + case AOUT_OMAGIC: mstr = "OMAGIC"; break; + case AOUT_NMAGIC: mstr = "NMAGIC"; break; + case AOUT_ZMAGIC: mstr = "ZMAGIC"; break; + default: + mstr = "unsupported magic"; + break; } - } else if (gMainApp.HasVMFeature(VMF_M88K)) { - if (mid != AOUT_MID_BSD_M88K && mid != AOUT_MID_MACH_M88K) { - mid_mismatch = true; - } - } else { - PANIC("Unknown CPU?"); - } - if (mid_mismatch) { - warnx("%s \"%s\" machine id $%03x mismatch", __func__, name, mid); - return 0; + putmsgn("%s magic = %08x (MID=0x%03x, %s)", __func__, + aout.magic, AOUT_MID(aout.magic), mstr); + putmsgn("%s textsize = %08x", __func__, aout.textsize); + putmsgn("%s datasize = %08x", __func__, aout.datasize); + putmsgn("%s bsssize = %08x", __func__, aout.bsssize); + putmsgn("%s symsize = %08x", __func__, aout.symsize); + putmsgn("%s entry = %08x", __func__, aout.entry); + putmsgn("%s textrelsize = %08x", __func__, aout.textrelsize); + putmsgn("%s datarelsize = %08x", __func__, aout.datarelsize); } - putmsg(1, "%s textsize = %08x", __func__, aout.textsize); - putmsg(1, "%s datasize = %08x", __func__, aout.datasize); - putmsg(1, "%s bsssize = %08x", __func__, aout.bsssize); - putmsg(1, "%s symsize = %08x", __func__, aout.symsize); - putmsg(1, "%s entry = %08x", __func__, aout.entry); - putmsg(1, "%s textrelsize = %08x", __func__, aout.textrelsize); - putmsg(1, "%s datarelsize = %08x", __func__, aout.datarelsize); + // MID はチェックしない。 + // CPU アーキテクチャが一致するかくらいはチェックしたいところだが、 + // MID は CPU ごとではなく OS(?) ごとに異なっているのと、MID の + // 一元管理された一次情報が存在しないので、正解リストを作るのが困難。 // とりあえず再配置は無視 if (aout.textrelsize != 0 || aout.datarelsize != 0) { @@ -500,9 +501,9 @@ RAMDevice::Load_elf32(const char *name, { uint16 target_elf_mid; - if (gMainApp.HasVMFeature(VMF_M68K)) { + if (gMainApp.Has(VMCap::M68K)) { target_elf_mid = EM_68K; - } else if (gMainApp.HasVMFeature(VMF_M88K)) { + } else if (gMainApp.Has(VMCap::M88K)) { target_elf_mid = EM_88K; } else { PANIC("Unknown CPU?");