public void Write(byte value, ushort address) { if (address >= 0x4000 && address <= 0x4017) { Update(); switch (address & 0xFFFC) { case 0x4000: square1.Write(value, (ushort)(address & 0x3)); break; case 0x4004: square2.Write(value, (ushort)(address & 0x3)); break; case 0x4008: triangle.Write(value, (ushort)(address & 0x3)); break; case 0x400C: noise.Write(value, (ushort)(address & 0x3)); break; case 0x4010: dmc.Write(value, (ushort)(address & 0x3)); break; default: switch (address) { case 0x4015: square1.Write((byte)(value & 1), 4); square2.Write((byte)(value & 2), 4); triangle.Write((byte)(value & 4), 4); noise.Write((byte)(value & 8), 4); dmc.Write((byte)(value & 0x10), 4); break; case 0x4017: //APU Frame rate/ IRQ control mode = (value & 0x80) != 0; frameIRQInhibit = (value & 0x40) != 0; if (frameIRQInhibit) { frameIRQ = false; } frameCounter = 0; if (mode) { timeToClock = modeOneDelay; } else { timeToClock = modeZeroDelay; } if (currentTime % 2 == 1) //jitter, apu_test 4-jitter.nes { timeToClock++; } break; } break; } } }
public override void Write(byte value, ushort address) { if (address >= 0x5000 && address <= 0x5017) { nes.APU.Update(); switch (address) { case 0x5000: square1.Write(value, 0); break; case 0x5001: square1.Write(value, 1); break; case 0x5002: square1.Write(value, 2); break; case 0x5003: square1.Write(value, 3); break; case 0x5004: square2.Write(value, 0); break; case 0x5005: square2.Write(value, 1); break; case 0x5006: square2.Write(value, 2); break; case 0x5007: square2.Write(value, 3); break; case 0x5010: readMode = (value & 1) != 0; irqEnable = (value & 0x80) != 0; break; case 0x5011: if (!readMode) { if (value == 0) { irqTrip = true; } else { pcmData = value; } } break; case 0x5015: square1.Write((byte)(value & 1), 4); square2.Write((byte)(value & 2), 4); break; } } }