--- nono/vm/opm.cpp 2026/04/29 17:04:45 1.1 +++ nono/vm/opm.cpp 2026/04/29 17:05:09 1.1.1.4 @@ -4,38 +4,76 @@ // Licensed under nono-license.txt // +// +// OPM (YM2151) +// + #include "opm.h" +#include "mpu.h" +#include "fdc.h" -std::unique_ptr gOPM; +// グローバル参照用 +OPMDevice *gOPM; +// コンストラクタ OPMDevice::OPMDevice() + : inherited("OPM") { - logname = "opm"; - devname = "OPM"; devaddr = baseaddr; devlen = 0x2000; } +// デストラクタ OPMDevice::~OPMDevice() { + gOPM = NULL; } uint64 -OPMDevice::Read(uint32 addr) +OPMDevice::Read(uint32 offset) { - putlog(0, "未実装読み込み +$%02x", addr); - return 0; + switch (offset) { + case 0: + putlog(0, "未実装読み込み $%06x", gMPU->GetPaddr()); + return 0; + case 1: + // OPM ステータスレジスタ + putlog(0, "未実装OPMステータスレジスタ読み込み"); + return 0; + default: + __unreachable(); + } } uint64 -OPMDevice::Write(uint32 addr, uint32 data) +OPMDevice::Write(uint32 offset, uint32 data) { - putlog(0, "未実装書き込み +$%02x <- $%02x", addr, data); + switch (offset) { + case 0: + putlog(1, "REG <- $%02x", data); + reg = data; + break; + case 1: + putlog(1, "DATA <- $%02x", data); + switch (reg) { + case 0x1b: + gFDC->SetForceReady(reg & 0x40); + // 他のビットは未対応 + break; + default: + putlog(0, "未実装書き込み $%06x <- $%02x", gMPU->GetPaddr(), data); + break; + } + break; + default: + __unreachable(); + } + return 0; } uint64 -OPMDevice::Peek(uint32 addr) +OPMDevice::Peek(uint32 offset) { // XXX 未実装 return 0xff;