Crazy Taxi clears the disable fiq bit before clearing the interrupt in a FIQ, leading to a re-entry.
Not sure if this is actually an issue, but it's definitely weird, and causes a very bad crash. During the second entry the Link Register is set to inside the FIQ routine and the program jumps back in it when it's supposed to return to Supervisor mode, leading to a bad reading in the stack and restoring a null CPSR, caushing the crash.
I added a workaround for this specific case which let Crazy Taxi run without regressing elsewhere afaik, but I don't think this is an actual solution:
https://github.com/Senryoku/arm7/commit/e56729af3c376500be4c6bf4a967bb100b6cd14e#diff-f223cc6d411b9182210dcc2386c5d5663d7d011518b666cd790caec2bf40b912R575
Crazy Taxi clears the
disable fiq
bit before clearing the interrupt in a FIQ, leading to a re-entry. Not sure if this is actually an issue, but it's definitely weird, and causes a very bad crash. During the second entry the Link Register is set to inside the FIQ routine and the program jumps back in it when it's supposed to return to Supervisor mode, leading to a bad reading in the stack and restoring a null CPSR, caushing the crash. I added a workaround for this specific case which let Crazy Taxi run without regressing elsewhere afaik, but I don't think this is an actual solution: https://github.com/Senryoku/arm7/commit/e56729af3c376500be4c6bf4a967bb100b6cd14e#diff-f223cc6d411b9182210dcc2386c5d5663d7d011518b666cd790caec2bf40b912R575Trace of the crash (with some comments):