Peter Thärning
<3707>
· Text 871 · w8 · kommentar
1987-07-03 18:56
Ärende: NMI och RETI
Se inlägg 869.
ALLA returninstruktioner fungerar på samma sätt vad det gäller POPandet
av programräknaren, PC. Därför kan man använda vilken som helst om det
bara gäller att ta sig ur en subrutin där PC är sparad på stacken. Och
PC sparas automatiskt på stacken vid NMI. (Om man av någon anledning
vill returnera med ett villkorligt return så måste naturligtvis
villkoret vara uppfyllt.)
När ett NMI inträffar så sparas automatiskt interruptflaggan som styr
över INT, och sedan nollställs den. Det betyder att inga INT kan inträffa
under NMI-rutinen, såvida inte programmet i själva NMI-rutinen har
med instruktionen EI som ju ettställer flaggan. Vad som är speciellt
med RETN, och varför man bör ha med den SIST i sin NMI-rutin beror på
att instruktionen sätter interruptflaggan till det förut sparade värdet.
Om man då innan tillät INT så tillåts INT även efter NMI-rutinen.
I NMI-rutinen så är det fritt fram att göra vad man vill och gör man
då ett CALL till RETI så är det säkert för att utnyttja just det som
är speciellt med RETI och inte att returnera från NMI-rutinen, även om
det skulle gå bra att gör det med RETI.
Vad som är speciellt med RETI stod i inlägg 869, dvs. att vissa ZILOG
kretsar hajar till när de ser den på bussen och kan på så vis kolla
om det är deras tur att interrupta. (Att de är byggda för att haja till
för just RETI beror på att man skall avsluta en INT-rutin med den
instruktionen och det vet de om!)
Detta har man förstås bara nytta av vid nästlade interrupt.