--- nono/vm/adpcm.cpp 2026/04/29 17:05:54 1.1.1.7 +++ nono/vm/adpcm.cpp 2026/04/29 17:05:59 1.1.1.8 @@ -28,8 +28,8 @@ #include "adpcm.h" #include "dmac.h" #include "event.h" +#include "mainbus.h" #include "monitor.h" -#include "mpu.h" #include "scheduler.h" #include "sound.h" @@ -38,7 +38,7 @@ ADPCMDevice::ADPCMDevice() : inherited(OBJ_ADPCM) { monitor = gMonitorManager->Regist(ID_MONITOR_ADPCM, this); - monitor->func = ToMonitorCallback(&ADPCMDevice::MonitorUpdate); + monitor->SetCallback(&ADPCMDevice::MonitorScreen); monitor->SetSize(40, 7); } @@ -60,7 +60,7 @@ ADPCMDevice::Init() return false; } - mixer_frame_nsec = 1_sec / sound->GetMixerFreq(); + mixer_frame_tsec = 1_sec / sound->GetMixerFreq(); auto evman = GetEventManager(); event = evman->Regist(this, @@ -98,7 +98,8 @@ ADPCMDevice::ReadPort(uint32 offset) putlog(1, "STAT -> $%02x", data.Data()); break; case 1: // DATA - putlog(0, "Read $%06x (NOT IMPLEMENTED)", mpu->GetPaddr()); + putlog(0, "Read $%06x (NOT IMPLEMENTED)", + GetMainbusDevice()->GetPaddr()); data = databuf; break; default: @@ -167,7 +168,7 @@ ADPCMDevice::PokePort(uint32 offset, uin } void -ADPCMDevice::MonitorUpdate(Monitor *, TextScreen& screen) +ADPCMDevice::MonitorScreen(Monitor *, TextScreen& screen) { int y; @@ -228,7 +229,7 @@ ADPCMDevice::StartPlay() dmac->AssertREQ(3); - event->time = guest_frame_nsec * 2; + event->time = guest_frame_tsec * 2; scheduler->StartEvent(event); } @@ -272,7 +273,7 @@ ADPCMDevice::EventCallback(Event *ev) dmac->AssertREQ(3); } - event->time = guest_frame_nsec * 2; + event->time = guest_frame_tsec * 2; scheduler->StartEvent(event); } @@ -332,13 +333,13 @@ void ADPCMDevice::CalcRate() { // 1フレームにかかる時間。15625 Hz なら 64 usec。 - guest_frame_nsec = (uint64)(div / clkMHz * 1000); + guest_frame_tsec = usec_to_tsec(div / clkMHz); // 周波数。主に表示用。 - freq = clkMHz * 1000'000 / div; + freq = clkMHz * 1000'000U / div; // アップスケール用の倍率。15625Hz なら 4倍。 - scale_factor = guest_frame_nsec / mixer_frame_nsec; + scale_factor = guest_frame_tsec / mixer_frame_tsec; // イベント名に載せておく。 event->SetName(string_format("ADPCM %u Hz", freq)); @@ -356,7 +357,7 @@ ADPCMDevice::DecodeADPCM(uint32 data) // 1サンプル目。 WritePCM(vtime, s1); // 2サンプル目。 - WritePCM(vtime + guest_frame_nsec, s2); + WritePCM(vtime + guest_frame_tsec, s2); } // vtime に相当する位置に PCM データを書き込む。 @@ -365,8 +366,8 @@ ADPCMDevice::DecodeADPCM(uint32 data) void ADPCMDevice::WritePCM(uint64 vtime, int16 target) { - uint64 vseq = vtime / Sound::BLK_NSEC; - uint64 voff = vtime % Sound::BLK_NSEC; + uint64 vseq = vtime / Sound::BLK_TSEC; + uint64 voff = vtime % Sound::BLK_TSEC; // 40msec バッファでは 1バイト (2サンプル) がバッファをまたぐ事があるため、 // サンプルごとに行う必要がある。 @@ -375,7 +376,7 @@ ADPCMDevice::WritePCM(uint64 vtime, int1 // このフレームがミキサーバッファのどの位置か。 uint32 mixer_frame_idx = - voff / guest_frame_nsec * Sound::NCHAN * scale_factor; + voff / guest_frame_tsec * Sound::NCHAN * scale_factor; int16 *d = blkbuf + mixer_frame_idx; // ここから scale_factor 個で pcm0 から target になるよう線形補間する。