Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Cia.Tod.cs
2 views
namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
{
    public sealed partial class Cia
    {
        private void CountTod()
        {
            if (_todCounter > 0)
            {
                _todCounter -= _todDen;
                return;
            }

            _todCounter += _todNum * ((_cra & 0x80) != 0 ? 6 : 5);
            _tod10Ths++;
            if (_tod10Ths > 9)
            {
                _tod10Ths = 0;
                _todlo = (_todSec & 0x0F) + 1;
                _todhi = (_todSec >> 4);
                if (_todlo > 9)
                {
                    _todlo = 0;
                    _todhi++;
                }
                if (_todhi > 5)
                {
                    _todSec = 0;
                    _todlo = (_todMin & 0x0F) + 1;
                    _todhi = (_todMin >> 4);
                    if (_todlo > 9)
                    {
                        _todlo = 0;
                        _todhi++;
                    }
                    if (_todhi > 5)
                    {
                        _todMin = 0;
                        _todlo = (_todHr & 0x0F) + 1;
                        _todhi = (_todHr >> 4);
                        _todHr &= 0x80;
                        if (_todlo > 9)
                        {
                            _todlo = 0;
                            _todhi++;
                        }
                        _todHr |= (_todhi << 4) | _todlo;
                        if ((_todHr & 0x1F) > 0x11)
                        {
                            _todHr &= 0x80 ^ 0x80;
                        }
                    }
                    else
                    {
                        _todMin = (_todhi << 4) | _todlo;
                    }
                }
                else
                {
                    _todSec = (_todhi << 4) | _todlo;
                }
            }

            if (_tod10Ths == _alm10Ths && _todSec == _almSec && _todMin == _almMin && _todHr == _almHr)
            {
                TriggerInterrupt(4);
            }
        }
    }
}