> Om jag förstår din postade kodsnutt rätt så är detta också bara maskinkoden för att spara
> undan/hämta tillbaka STATUS-registret?
Jag skrev: "Notera att detta enbart sparar WREG och STATUS...".
Så du har halvt rätt.
> Om jag förstår funktionen (och dig) rätt så finns det, i dessa MCU:er, en hårdvara, SUU (Shadow Update Unit),
> som typ dubbelbuffrar dessa specifika register och som arbetar vid sidan av den "vanliga" processorn.
Nja, nu ska vi inte göra det med komplicerat än vad det faktiskt är.
Det är inget speciellt med shadow registren, sök databladet efter "_SHAD".
Det är helt vanliga register som kan skrivas/läsas som alla andra, det är bara
det att processorn i vissa lägen gör det automatiskt, d.v.s dels när ett
interrupt inträffar (skrivs), dels när RETFIE utförs (läses).
Man skulle kunna skriva direkt till _SHAD registren i från ISR'en, det
skulle ge en del intressanta effekter i main koden...
Rent teoretiskt skulle man kunna ha en main rutin som i t.ex läser data via
ett av index registren FSR0 eller FSR1. Sen skulle man rent tekniskt kunna
ha ett interrupt som ändrar t.ex FSR0L_SHAD och FSR0H_SHAD och de kommer
automatiskt att användas av main efter avslut av ISR'en då de återladdas till FSR0.
Lite krystat blir det, men man *skulle* kunna trimma main rutinen maximalt
och inte behöva kod som kollar om indexet ska ändras när det inte behövs.
Upon exiting the Interrupt Service Routine, these registers are automatically restored.
Any modifications to these registers during the ISR will be lost. If modifications to any
of these registers are desired, the corresponding shadow register should be modified and
the value will be restored when exiting the ISR. The shadow registers are available in
Bank 31 and are readable and writable.
Så det är helt dokumenterat att det är OK att göra så...
Som lite extra överkurs, notera att även stacken kan läsas och skrivas, d.v.s att
det inne i ISR'en går att ändra returadressen, så att när RETFIE utförs så kommer
man tillbaka till en annan plats än där interruptet inträffade. Men det är lite
extrem programmering...

Man skulle kunna tänka sig en applikation som
består av flera individuella delar som i sig måste vara mycket snabba när de
körs så att det får plats kod för att kolla om man ska byta rutin. En ISR som
manipulerar stacken skulle kunna byta rutin via t.ex en timer eller en extern
händelse. Lite extremt är det i alla fall...