Autor Wątek: Interfejs generujący przerwania maskowalne w trybie 2  (Przeczytany 7895 razy)

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Interfejs generujący przerwania maskowalne w trybie 2
« Odpowiedź #15 dnia: 2017.05.16, 17:27:56 »
Gwoli ścisłości - 0x38 albo 56 ;)
Pisałeś że Basic to tryb 1 a tryb 1 to 0x66
0x38 to tryb 0 - domyślny tryb przyjmowania przerwań maskowalnych dla Z80

Coś pokręciłeś ;)
Tryb 0 to ten  w którym urządzenie podaje na szynę danych rozkaz do wykonania dla procesora.
Tryb 1 to ten (domyślny dla ZXS) w którym procesor skacze pod adres 56/0x38.
Tryb 2 to ten z tablicą skoków.

0x66 to wektor przerwania niemaskowalnego :)

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Interfejs generujący przerwania maskowalne w trybie 2
« Odpowiedź #16 dnia: 2017.05.16, 17:30:08 »
@matofesi - zastanówmy się nad tym aby nie korzystać z trybu 2.
czy standardowa obsługa przerwania w ZXie "zagląda" gdzieś do RAMu a jeśli tak to jak to przed czy po obsłudze klawiatury/ekranu.

Innymi słowy czy jestem w stanie się gdzieś tam zahaczyć?

Nie jesteś. Procedura w ROMie skanuje klawiaturę, zmienia jakieś liczniki i to zasadniczo tyle. Nie jest przeznaczona do podpinania się.

silenter

  • *****
  • Wiadomości: 1337
  • Miejsce pobytu:
    Warszawa/Radzymin
Odp: Interfejs generujący przerwania maskowalne w trybie 2
« Odpowiedź #17 dnia: 2017.05.16, 17:34:35 »
Coś pokręciłeś ;)
Pokręciłem ;)
128k +2 UK issue 1, JS128, FDD3000 in restoration, ZAXON MGT +D, PEAR AmpY, Pear ExEar :), PEAR TI-OF-TTL+FDD35, co to tu robi??? => 2xCDTV&A500

https://soundcloud.com/silenter

https://www.youtube.com/channel/UCKZhL7Lq1zUDDnRDTJKhN4A

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Interfejs generujący przerwania maskowalne w trybie 2
« Odpowiedź #18 dnia: 2017.05.16, 17:56:48 »
A ja nadal uważam, że niepotrzebnie przekomplikowujecie. Urządzenie powinno po prostu robić swoje i generować przerwania pilnując tylko swojego stanu i udostępniając go wraz z możliwością aktualizacji. A kwestia jak tego użyć jest zasadniczo drugorzędna i w wypadku Spectrum - bez kombinowania z koncepcją Nietoperza - daje się zrobić tylko w jeden sposób czyli ustawiając przerwania w tryb IM2 i łapiąc wszystko co przychodzi. Wpychanie na siłę wektorów, których nic innego nie używa to jest właśnie ten nadmiar komplikacji - bez tego układ jest łatwy i prosty i jedynym problemem jest "niepogryzienie się" z ULA. Nawet jednak jeśli będziemy generować przerwanie "na rympał" to zastosowaniu metody ze znacznikiem i jego resetowaniem najgorszy efekt jaki może nas spotkać to zgubienie jednego przerwania ULA gdyby masze przerwanie nałożyło się na systemowe.

Ale powtórzę jeszcze raz - to twoja zabawka i zrobisz jak będziesz uważał ;)

silenter

  • *****
  • Wiadomości: 1337
  • Miejsce pobytu:
    Warszawa/Radzymin
Odp: Interfejs generujący przerwania maskowalne w trybie 2
« Odpowiedź #19 dnia: 2017.05.16, 18:11:21 »
Czaję
1) do rejestru i starszy bajt adresu procedury obsługi.
2) w pamięci od adresu I+0x00 256 zer
3) potem procedura podobna do tej jak napisałeś z drobną zmianą, że jeśli nie in status  to jp 0x38
4) na procku włączamy obsługę przerwań typu 2

i sprawa załatwiona.
Coś w tym jest

@matofesi czy dobrze zrozumiałem?
128k +2 UK issue 1, JS128, FDD3000 in restoration, ZAXON MGT +D, PEAR AmpY, Pear ExEar :), PEAR TI-OF-TTL+FDD35, co to tu robi??? => 2xCDTV&A500

https://soundcloud.com/silenter

https://www.youtube.com/channel/UCKZhL7Lq1zUDDnRDTJKhN4A

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Interfejs generujący przerwania maskowalne w trybie 2
« Odpowiedź #20 dnia: 2017.05.16, 18:15:12 »
Nie ma się co martwić kolejnym przerwaniem, bo CPU go nie przyjmie (DI na początku przerwania załatwia sprawę).  Jezeli ma je przyjąć bezwzględnie to musi być to NMI. W obsługę przerwania IM2 w określonym czasie bym nie liczył.

Nadal nie wiemy co ten interface ma umożliwiać... ale bez oprogramowania zapewne będzie bezużyteczny. I tu mamy kilka możliwości:
- własny ROM
- firmware dla divide, divmmc

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Interfejs generujący przerwania maskowalne w trybie 2
« Odpowiedź #21 dnia: 2017.05.16, 18:53:30 »
Czaję
1) do rejestru i starszy bajt adresu procedury obsługi.
2) w pamięci od adresu I+0x00 256 zer
3) potem procedura podobna do tej jak napisałeś z drobną zmianą, że jeśli nie in status  to jp 0x38
4) na procku włączamy obsługę przerwań typu 2

i sprawa załatwiona.
Coś w tym jest

@matofesi czy dobrze zrozumiałem?

Prawie ale nie do końca ;)

Do I ładujesz starszy bajt TABLICY, które się zaczyna od I*256 - np. 0xFD. Wtedy do pamięci zaczynając od 0xFD00  pakujesz 257 (to na wypadek tego domyślnego 255 - wtedy adres bierze z I*256+255 i I*256+256) razy ten sam bajt - np. 0xFE. W efekcie niezależnie od tego co będzie na szynie pobrany w momencie przerwania wektor trafi na dwa razy 0xFE w pamięci i w efekcie skoczy do 0xFEFE i tam właśnie umieszczasz kod zbliżony do tego, który pokazałem i - jeśli jest ci to niezbędne - jeśli przerwanie nie przyszło od twojego interfejsu skaczesz pod 0x0038.

Tak się robi obsługę przerwań IM2 na Spectrum ;)

@Tygrys mnie nie chodziło o kolejne przerwanie tylko o sytuację ekstremalną w której przerwanie przyjdzie równocześnie z dwóch źródeł. W takiej sytuacji interfejs ustawi swój znacznik i procedura obsługi zgubi jedno "nie swoje" przerwanie.

I tak - dobrze by było wiedzieć, co dokładnie to urządzenie ma robić. Łatwiej byłoby proponować jakieś konkretne rozwiązania :)

silenter

  • *****
  • Wiadomości: 1337
  • Miejsce pobytu:
    Warszawa/Radzymin
Odp: Interfejs generujący przerwania maskowalne w trybie 2
« Odpowiedź #22 dnia: 2017.05.16, 18:55:26 »
Zasadniczo myślałem żeby podłączyć atmega do spectruma a dzięki temu port szeregowy port równoległy i timer
być może jakiś A/D udostepnił bym spectrumowi.
Pierwszorzędne znaczenie miałoby udostepnienie seriala - chciałbym na nim odpalić pełnoprawne midi IN i OUT.
ATMEGA ma trochę ramu więc mam gdzie założyć circullar buffer więc odbieranie danych nie było by szczególnie time critical.
Dodatkowo w samej atmedze mógłbym zaszyć trochę kodu obsługi MIDI więc zx dostałby fajne wysokopoziomowe narzędzie do obsługi midi. Planowałem że interfejs mógłby pracować w trybie z przerwaniami i bez przerwań.
W tym drugim przypadku software sam musiałby kontrolować czy w buforze pojawiły się nowe dane.

Celem przerwania byłoby tylko i wyłącznie informowanie oprogramowania "mam nowe dane !!!"
128k +2 UK issue 1, JS128, FDD3000 in restoration, ZAXON MGT +D, PEAR AmpY, Pear ExEar :), PEAR TI-OF-TTL+FDD35, co to tu robi??? => 2xCDTV&A500

https://soundcloud.com/silenter

https://www.youtube.com/channel/UCKZhL7Lq1zUDDnRDTJKhN4A

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Interfejs generujący przerwania maskowalne w trybie 2
« Odpowiedź #23 dnia: 2017.05.16, 18:59:24 »
Celem przerwania byłoby tylko i wyłącznie informowanie oprogramowania "mam nowe dane !!!"

No to tym bardziej nie potrzebna ci jest ekstra komplikacja - w samym urządzeniu robisz flip-flopa z resetem na odczyt ustawianego w momencie wyzwalania przerwania. Soft w dowolnym trybie (bo z podmianą ROMu można to zrobić w IM1) odbiera przerwanie, i pobiera sobie dane. Łatwizna ;)