private void UpdateSquareWave_(Channel channel, int total_frames) { if (channel.status) { var square = channel.square_wave; while (total_frames > 0) { int frames = (int)(square.ticks / APU_TICKS); byte sample = Apu.CHANNELX_SAMPLE(channel, square.sample); if (frames <= total_frames) { square.ticks = square.period; square.position = (byte)((square.position + 1) % DUTY_CYCLE_COUNT); square.sample = Apu.GetDuty(square.duty, square.position); } else { frames = total_frames; square.ticks -= (uint)frames * APU_TICKS; } channel.accumulator += sample * (uint)frames; total_frames -= frames; } } }