forum speccy.pl

ZX Spectrum => PROGRAMOWANIE => Wątek zaczęty przez: aqqman w 2023.02.10, 03:51:08

Tytuł: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
Wiadomość wysłana przez: aqqman w 2023.02.10, 03:51:08
Nurtuje mnie taka kwestia:
Jak programowo stwierdzić w którym trybie przerwań pracuje Z80 w danym momencie?
Z tego co wiem pliki .sna przechowują informację "stanu" maszyny, czyli pamięć i rejestry wszystkie.
Jest tam też pole z informacją o trybie przerwań (IM0,IM1,IM2), oraz zawartością IFF.
W przypadku odczytania IFF sprawa jest prosta. Gorzej z trybem przerwań.
W naszych sprzętach (zxspectrum, timex) można w miarę bezpiecznie wykluczyć tryb IM0 jako bezużyteczny.
Czy jest jakiś sposób aby stwierdzić podczas tworzenia snapshota czy mamy aktywny tryb IM1 czy IM2?
Kiedyś na "pałę" ustawiałem w pliku docelowym, w programie do tworzenia .sna (na żywym sprzęcie, nie na emulatorze) tryb IM1 i to w 90% przypadków działało.
Tytuł: Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
Wiadomość wysłana przez: steev w 2023.02.10, 07:53:34
Nie znam się to się wypowiem:
Ja bym odczytał rejestr I, sprawdził czy ma sensowną wartość, a jeśli tak to podmienił wektor na swój, odblokował przerwania i sprawdził czy procesor skacze pod nowy adres.
Tytuł: Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
Wiadomość wysłana przez: tapy w 2023.02.10, 08:42:26
Czy w Spectrum stosowane były jakieś urządzenia, które potrafiły wystawić dolną połówkę adresu skoku w trakcie zgłaszania przerwania w trybie IM2?
Tytuł: Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
Wiadomość wysłana przez: steev w 2023.02.10, 11:07:37
AMX Mouse, jeśli dobrze pamiętam.
Tytuł: Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
Wiadomość wysłana przez: aqqman w 2023.02.10, 14:00:49
Nie znam się to się wypowiem:
Ja bym odczytał rejestr I, sprawdził czy ma sensowną wartość, a jeśli tak to podmienił wektor na swój, odblokował przerwania i sprawdził czy procesor skacze pod nowy adres.
Też się nie znam, zatem można podyskutować jak prawdziwi eksperci :D
Metoda jakaś to jest... trochę karkołomna. Przeszukiwałem właśnie dokumentację Z80. O pozyskaniu IFF ładnie pomyśleli, ale o odczycie trybu już zapomnieli.
Analogiczna kaszana jak z portem #7FFD w zx128.
Tytuł: Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
Wiadomość wysłana przez: matofesi w 2023.02.10, 14:14:44
To nie jest kwestia "zapomnieli". W normalnych warunkach - pisanie programu do pracy na konkretnym sprzęcie - taka operacja nie jest potrzebna. Jak piszesz kod to wiesz jak ustawiłeś przerwania albo wiesz jak system ma ustawione przerwania. Z IFF jest inaczej - jak łapiesz NMI to może ci być potrzebna informacja czy IRQ były włączone czy nie. Dodanie możliwości sprawdzenia trybu IM to dodatkowa komplikacja, która w 99.999999% przypadków nie jest potrzebna.

Z $7FFd w 128 jest to samo - twój kod wie która strona jest aktywna albo nie jest mu to potrzebne. Dodawanie możliwości odczytu wymagałoby pewnie kilku/nastu dodatkowych bramek w GALu i było, z punktu widzenia konstruktorów, zbędne.

Tytuł: Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
Wiadomość wysłana przez: aqqman w 2023.02.11, 04:42:11
Po prostu nie uwzględnili pewnych opcji. Patrząc na dzisiejsze procesory czy mikrokontrolery, widać że programowy dostęp do wszelkich znaczników jest i programista nie musi "pamiętać" jak ustawiony jest dany znacznik bo może go po prostu pobrać. Powiedzmy że nastąpiła ewolucja, w pamiętaniu o pewnych rzeczach. W Z180 już wiedzieli jak to zrobić.
Wracając do tematu -
Po głębszym przemyśleniu postanowiłem tematu nie rozszerzać, a doraźnie jeśli coś nie będzie działać z ustawieniem IM1 to ustawić IM2 w .sna
Tytuł: Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
Wiadomość wysłana przez: Phonex w 2023.02.11, 10:35:15
A jak to rozwiązali inni?
Np. w MULTIFACE? Można zgrać grę w dowolnym momencie. Więc?
Przy uruchamianiu zrzuconych gier, odtwarzane są wszystkie rejestry, a na końcu sprawdzana zawartość rejestru I. Jeśli jest równa $3F - czyli tyle ile załadowane jest do niego po resecie Spectrum - to IM1, jeśli nie - to IM2.
I działa.
Najwyraźniej programy, które używają rejestru I do innych celów niż wektor przerwań (jako kolejny zwykły rejestr, chociaż z niektórymi wartościami zabronionymi, jak chyba sam raz czy dwa użyłem) nie były dla nikogo na tyle atrakcyjne, żeby je "cyknąć" Multifejsem ;)

Można by rozszerzyć na tą okoliczność sprawdzanie i dopisać dodatkowy test: jeśli I mniejsze od $39 to też IM1 (bo często się używa $39, $3A i $3B przy IM2).
Tytuł: Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
Wiadomość wysłana przez: krru w 2023.02.11, 11:07:55
Z $7FFd w 128 jest to samo - twój kod wie która strona jest aktywna albo nie jest mu to potrzebne. Dodawanie możliwości odczytu wymagałoby pewnie kilku/nastu dodatkowych bramek w GALu i było, z punktu widzenia konstruktorów, zbędne.

Kiedyś zrobiłem prototypowo interfejs typu Masterface do 128 to w sprzęcie był rejestr śledzący (taki "shadow register") pod oryginalnym adresem i jego można było przeczytać.
Tytuł: Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
Wiadomość wysłana przez: aqqman w 2023.02.11, 12:33:47
A jak to rozwiązali inni?
Np. w MULTIFACE? Można zgrać grę w dowolnym momencie. Więc?
Przy uruchamianiu zrzuconych gier, odtwarzane są wszystkie rejestry, a na końcu sprawdzana zawartość rejestru I. Jeśli jest równa $3F - czyli tyle ile załadowane jest do niego po resecie Spectrum - to IM1, jeśli nie - to IM2.
I działa.
Najwyraźniej programy, które używają rejestru I do innych celów niż wektor przerwań (jako kolejny zwykły rejestr, chociaż z niektórymi wartościami zabronionymi, jak chyba sam raz czy dwa użyłem) nie były dla nikogo na tyle atrakcyjne, żeby je "cyknąć" Multifejsem ;)

Można by rozszerzyć na tą okoliczność sprawdzanie i dopisać dodatkowy test: jeśli I mniejsze od $39 to też IM1 (bo często się używa $39, $3A i $3B przy IM2).

TO bardzo fajna informacja, dzięki.  :D


Kiedyś zrobiłem prototypowo interfejs typu Masterface do 128 to w sprzęcie był rejestr śledzący (taki "shadow register") pod oryginalnym adresem i jego można było przeczytać.
Tak też zrobiłem w swoim TIMEX-ie TC2160 (tak nazwałem swojego TC2068 +128k w banku D)  ;)