예제 #1
0
파일: APU.cs 프로젝트: DualBrain/Emu-o-Tron
        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;
                }
            }
        }
예제 #2
0
        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;
                }
            }
        }