These "write one to clear" registers are designed for "an even greater purpose".
Instead of "service one interrupt and clear it" the "write one to clear" register allows you to:
nInterruptsPendingNow = INTERRUPT_STATUS_REGISTER
if (nInterruptsPendingNow & INTERRUPT_ONE)
{
Service Interrupt one;
}
if (nInterruptsPendingNow & INTERRUPT_TWO)
{
Service Interrupt two;
}
... And so on for 3, 4, 5
INTERRUPT_STATUS_REGISTER = nInterruptsPendingNow;
What you've done in the above is captured the pending interrupts at the one point in time, serviced all of them and then cleared just them. Any new ones that have popped up will be caught the next time. That also gives you control in software of the priority and order of servicing a group of interrupts. In most cases you'd want to service receive interrupts before transmit one, for instance.
In some cases it might be preferable to read, then clear, then process. It depends on the details of what happens if another one comes in before-after-during the servicing of the previous one:
nInterruptsPendingNow = INTERRUPT_STATUS_REGISTER
INTERRUPT_STATUS_REGISTER = nInterruptsPendingNow;
if (nInterruptsPendingNow & INTERRUPT_ONE)
...
Tom