• Screwtape's avatar
    Update to v103r06 release. · 16f73630
    Screwtape authored
    byuu says:
      - processor/spc700: restored fetch/load/store/pull/push shorthand
      - processor/spc700: split functions that tested the algorithm used (`op
        != &SPC700:...`) to separate instructions
          - mostly for code clarity over code size: it was awkward having
            cycle counts change based on a function parameter
      - processor/spc700: implemented Overload's new findings on which
        cycles are truly internal (no bus reads)
      - sfc/smp: TEST register emulation has been vastly improved¹
    ¹: it turns out that TEST.d4,d5 is the external clock divider (used
    when accessing RAM through the DSP), and TEST.d6,d7 is the internal
    clock divider (used when accessing IPLROM, IO registers, or during idle
    The DSP (24576khz) feeds its clock / 12 through to the SMP (2048khz).
    The clock divider setting further divides the clock by 2, 4, 8, or 16.
    Since 8 and 16 are not cleanly divislbe by 12, the SMP cycle count
    glitches out and seems to take 10 and 2 clocks instead of 8 or 16. This
    can on real hardware either cause the SMP to run very slowly, or more
    likely, crash the SMP completely until reset.
    What's even stranger is the timers aren't affected by this. They still
    clock by 2, 4, 8, or 16.
    Note that technically I could divide my own clock counters by 24 and
    reduce these to {1,2,5,10} and {1,2,4,8}, I instead chose to divide by
    12 to better illustrate this hardware issue and better model that the
    SMP clock runs at 2048khz and not 1024khz.
    Further, note that things aren't 100% perfect yet. This seems to throw
    off some tests, such as blargg's `test_timer_speed`. I can't tell how
    far off I am because blargg's test tragically doesn't print out fail
    values. But you can see the improvements in that higan is now passing
    all of Revenant's tests that were obviously completely wrong before.
algorithms.cpp 2.19 KB