--- nono/vm/pio.cpp 2026/04/29 17:05:33 1.1.1.15 +++ nono/vm/pio.cpp 2026/04/29 17:05:55 1.1.1.18 @@ -27,8 +27,10 @@ // +------------+ #include "pio.h" +#include "adpcm.h" #include "bitops.h" #include "dipsw.h" +#include "event.h" #include "interrupt.h" #include "lcd.h" #include "mainapp.h" @@ -163,6 +165,15 @@ PPIDevice::~PPIDevice() { } +// 初期化 +bool +PPIDevice::Init() +{ + adpcm = GetADPCMDevice(); + + return true; +} + busdata PPIDevice::ReadPort(uint32 offset) { @@ -174,8 +185,8 @@ PPIDevice::ReadPort(uint32 offset) data = 0xff; break; case 2: - putlog(0, "Read $e9a005 PortC (NOT IMPLEMENTED)"); - data = 0xff; + data = GetPC(); + putlog(1, "PortC -> $%02x", data.Data()); break; case 3: putlog(0, "Read $e9a007 Ctrl (NOT IMPLEMENTED)"); @@ -221,22 +232,51 @@ PPIDevice::PeekPort(uint32 offset) return 0xff; } +// PortC 読み込み +uint32 +PPIDevice::GetPC() const +{ + uint32 data = 0; + + // パンの状態はこちらで持っていない。 + if (adpcm->GetPanOutR() == false) { + data |= 0x01; + } + if (adpcm->GetPanOutL() == false) { + data |= 0x02; + } + + // サンプリングレートは書き込み値をこちらでも持っている(ADPCMにもある)。 + data |= adpcm_rate << 2; + + // bit4: PC4 (通常 0) + // bit5: PC5 (通常 0) + // bit6: IOA5 (1=ジョイスティック#1のAが押された状態にする, 0=通常) + // bit6: IOA6 (1=ジョイスティック#1のBが押された状態にする, 0=通常) + + return data; +} + // PortC 書き込み void PPIDevice::SetPC(uint pc, uint val) { switch (pc) { case 0: // ADPCM PAN Left Off - pan_left = !val; + adpcm->SetPanOutL(!val); return; case 1: // ADPCM PAN Right Off - pan_right = !val; + adpcm->SetPanOutR(!val); return; case 2: // ADPCM サンプリングレート - adpcm_rate = (adpcm_rate & 2) | val; + adpcm_rate &= ~1U; + adpcm_rate |= val ? 1U : 0; + adpcm->SetRate(adpcm_rate); return; case 3: // ADPCM サンプリングレート - adpcm_rate = (val << 1) | (adpcm_rate & 1); + adpcm_rate &= ~2U; + adpcm_rate |= val ? 2U : 0; + adpcm->SetRate(adpcm_rate); return; case 4: // ジョイスティック #1 コントロール @@ -345,10 +385,6 @@ PIO0Device::~PIO0Device() bool PIO0Device::Init() { - if (inherited::Init() == false) { - return false; - } - interrupt = GetInterruptDevice(); pio1 = GetPIO1Device(); @@ -528,7 +564,7 @@ PIO0Device::GetPA() const data |= ((int)dipsw1[i]) << i; } if (msb_first) { - data = bitrev(data); + data = bitrev8(data); } return data & 0xff; } @@ -542,7 +578,7 @@ PIO0Device::GetPB() const data |= ((int)dipsw2[i]) << i; } if (msb_first) { - data = bitrev(data); + data = bitrev8(data); } return data & 0xff; } @@ -665,10 +701,6 @@ PIO1Device::~PIO1Device() bool PIO1Device::Init() { - if (inherited::Init() == false) { - return false; - } - lcd = GetLCDDevice(); mpu64180 = GetMPU64180Device(); powerdev = GetPowerDevice();