dzieki Epi, przetestuje
a tutaj znalazlem prace Baloisa na temat IRQ Vs NMI ( TEST 4 ) http://www.republika.pl/balois/atari/index.htm
cytat:
Test 4 ma na celu określenie, w którym cyklu maszynowym w linii rozpoczyna się przerwanie dli. Źródła testu 4 dostępne są tu.
Przerwanie dli należy do grupy przerwań niemaskowalnych (ang. Non-Maskable Interrupt). Oznacza to, że żądanie tego przerwania nie może zostać zignorowane przez procesor. Przerwanie niemaskowalne zostaje zainicjowane, jeśli na nóżce NMI procesora pojawi się stan 0. Wejście NMI jest wrażliwe na opadające zbocze, a nie na poziom sygnału równy 0. Innymi słowy, skok sygnału z 1 na 0 wymusi przerwanie, ale trwające nadal 0 nie zainicjuje następnego przerwania. W odpowiedzi na żądanie przerwania NMI procesor wykonuje następujący ciąg działań:
Kończy wykonanie bieżącego rozkazu.
Rozpoczyna procedurę przerwania:
- Odkłada na stos adres następnego rozkazu, tzw. adres programu głównego.
- Odkłada na stos zawartość rejestru stanu P.
- Do rejestru PC ładuje z komórek $FFFA i $FFFB (młodszy i starszy bajt) adres programu przerwania, tzw. wektor przerwania NMI.
- Ustawia bit I w rejestrze stanu P na 1 co powoduje, że nie będą przyjmowane przerwania IRQ.
Przechodzi do wykonania pierwszego rozkazu programu przerwania.
W tym miejscu należy wyjaśnić co oznacza sformułowanie "przerwanie rozpoczyna się w x-tym cyklu maszynowym w linii". Otóż oznacza ono, że procedura przerwania rozpocznie się po instrukcji, której jeden z taktów przypada na x-ty cykl w linii. Zdanie "kończy wykonanie bieżącego rozkazu" odnosi się właśnie do tej instrukcji. Zakończenie instrukcji, której jeden z taktów przypada na x-ty cykl w linii może trwać od 1 do 7 cykli. Jeśli rozpoczęcie przerwania przypada na ostatni takt instrukcji, to jej zakończenie potrwa 1 cykl. Jeśli rozpoczęcie przerwania przypada na pierwszy cykl 7 taktowej instrukcji, to jej zakończenie potrwa 7 cykli. Nie bierzemy tu pod uwagę nie publikowanych rozkazów 6502, których wykonanie może zabrać więcej niż 7 taktów. Sama procedura przerwania trwa 7 cykli. Zatem może upłynąć od 8 do 14 cykli zanim procesor rozpocznie program przerwania. Jeśli przerwanie dli rozpoczyna się w 8 cyklu w linii, to program przerwania rozpocznie się w przedziale od 16 do 22 cyklu w linii.
Program przerwania musi zostać zakończony instrukcją RTI (ang. ReTurn from Interrupt). Po napotkaniu tego rozkazu procesor wykonuje następujący ciąg działań:
Przywraca ze stosu poprzednią zawartość rejestru stanu P.
Przywraca ze stosu do rejestru PC adres programu głównego.
Jeśli nie ma żądania następnego przerwania, to kontynuuje wykonanie programu głównego.
W procesorze jest jeszcze nóżka IRQ (ang. Interrupt ReQuest). Sygnał dochodzący tutaj jest traktowany podobnie jak w przypadku NMI, ale:
- Przerwanie IRQ należy do grupy przerwań maskowalnych. Ustawiony bit I rejestru stanu P nie pozwala na przyjmowanie przerwań IRQ.
- Jeśli zgłoszą się oba przerwania, to procesor obsługuje NMI a IRQ czeka.
- Adres programu przerwania IRQ, tzw. wektor IRQ, jest ładowany do rejestru PC z komórek $FFFE i $FFFF (młodszy i starszy bajt).
Wejście IRQ jest wrażliwe na poziom sygnału równy 0. Trwające nadal 0 może zainicjować następne przerwanie IRQ.