--- nono/vm/fdc.cpp 2026/04/29 17:05:33 1.1.1.14 +++ nono/vm/fdc.cpp 2026/04/29 17:05:38 1.1.1.15 @@ -75,6 +75,11 @@ // OP.SEL.x でドライブごとに有効になる信号 // EJECT, EJECT MASK, LED BLINK, DISK IN, ERR DISK +// ドライブセレクトイネーブルがネゲートされていて、 +// どのドライブも選択されていない状態になったとき、 +// 各入力信号はプルアップされているため、 +// 負論理の信号はすべてネゲート状態となる。 + #include "fdc.h" #include "bitops.h" #include "config.h" @@ -145,10 +150,6 @@ FDCDevice::Create() bool FDCDevice::Init() { - if (inherited::Init() == false) { - return false; - } - dmac = GetDMACDevice(); pedec = GetPEDECDevice(); @@ -277,13 +278,15 @@ FDCDevice::WritePort(uint32 offset, uint // ドライブコントロールレジスタ putlog(1, "Drive Control <- $%02x", data); - // FDD 割り込みクリア(要実機確認) - pedec->NegateINT(fdd_vector[0]); - uint8 bit = 0x01; for (const auto f : fdd_vector) { + // ドライブセレクタのビットが %1 -> %0 になると動作する。 if (f && bit_falling(drivectrl, data, bit)) { f->SetDriveCtrl(data & 0xe0); + + // FDD 割り込みのクリアは詳細不明だが、とりあえず + // 同じタイミングで動作するようにしておく。 + pedec->NegateINT(f); } bit <<= 1; } @@ -1135,6 +1138,12 @@ FDCDevice::DriveSelect(uint8 drive) fdd = NULL; } + // ドライブセレクト信号線が変わったら READY が変わるかもしれないので + // ポーリングを再開する必要がある。 + if (initialized) { + StartPoll(); + } + // いまのところ LUNA のことは忘れる }