Autor Wątek: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.  (Przeczytany 4134 razy)

aqqman

  • ***
  • Wiadomości: 162
  • Miejsce pobytu:
    Milky Way
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.
2 x TC2068 na sterydach:
- TC2160 - 160kBRAM
- TC2176 - 176kB RAM - 2xscreen, 2xROM
FDD3000

steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
« Odpowiedź #1 dnia: 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.
Machines should work. People should think.

tapy

  • ***
  • Wiadomości: 223
  • Z80 & CP/M
Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
« Odpowiedź #2 dnia: 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?

steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
« Odpowiedź #3 dnia: 2023.02.10, 11:07:37 »
AMX Mouse, jeśli dobrze pamiętam.
Machines should work. People should think.

aqqman

  • ***
  • Wiadomości: 162
  • Miejsce pobytu:
    Milky Way
Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
« Odpowiedź #4 dnia: 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.
2 x TC2068 na sterydach:
- TC2160 - 160kBRAM
- TC2176 - 176kB RAM - 2xscreen, 2xROM
FDD3000

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
« Odpowiedź #5 dnia: 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.


aqqman

  • ***
  • Wiadomości: 162
  • Miejsce pobytu:
    Milky Way
Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
« Odpowiedź #6 dnia: 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
2 x TC2068 na sterydach:
- TC2160 - 160kBRAM
- TC2176 - 176kB RAM - 2xscreen, 2xROM
FDD3000

Phonex

  • *****
  • Wiadomości: 1260
  • Miejsce pobytu:
    Warszawa
Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
« Odpowiedź #7 dnia: 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).

krru

  • *
  • Wiadomości: 21
  • Miejsce pobytu:
    Warszawa
Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
« Odpowiedź #8 dnia: 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ć.

aqqman

  • ***
  • Wiadomości: 162
  • Miejsce pobytu:
    Milky Way
Odp: Tryby przerwań Z80 - czy można wywnioskować który jest aktywny.
« Odpowiedź #9 dnia: 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)  ;)
2 x TC2068 na sterydach:
- TC2160 - 160kBRAM
- TC2176 - 176kB RAM - 2xscreen, 2xROM
FDD3000