Autor Wątek: Przerwania  (Przeczytany 15817 razy)

dox

  • *
  • Wiadomości: 25
  • Miejsce pobytu:
    Rybnik
    • www.slanina.pl
Odp: Przerwania
« Odpowiedź #15 dnia: 2012.12.17, 10:56:12 »
Tak dla porządku dodam jedną rzecz związaną z IM1: nie należy używać rejestru IY.
Pewnie o tym wiecie, ale ja potrzebowałem 4 godzin aby do tego dojść...
?

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Przerwania
« Odpowiedź #16 dnia: 2012.12.17, 11:01:29 »
Głowy sobie nie dam uciąć, ale mam wrażenie, że chodzi o używanie przerwań w trybie IM1 z ROMem Spectrum 128. Jeśli w takiej sytuacji zmienimy zawartość IY to system przestanie trafiać w zmienne systemowe - również w procedurze obsługi przerwań w ROMie. I oczywiście całość się prawdopodobnie posypie.

Zastrzegam, że nie zaglądałem w kod i to co napisałem to przypuszczenie ;)

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: Przerwania
« Odpowiedź #17 dnia: 2012.12.17, 12:43:12 »
Głowy sobie nie dam uciąć, ale mam wrażenie, że chodzi o używanie przerwań w trybie IM1 z ROMem Spectrum 128. Jeśli w takiej sytuacji zmienimy zawartość IY to system przestanie trafiać w zmienne systemowe - również w procedurze obsługi przerwań w ROMie. I oczywiście całość się prawdopodobnie posypie.
...

Tak. W każdym Spectrum, nie tylko 128.
Procedury z ROMu adresują zmienne systemowe przez (IY+nn), więc po pierwsze nie trafią tam gdzie trzeba, a po drugie jeśli IY wskazuje na nasze dane - to mogą je skaszanić.

Drugą taką pułapką, jeśli program wraca do Basica, jest konieczność odtworzenia rejetru HL'. Musi zawierać 10072. Czyli jeśli program używa HL' - na końcu dopisujemy np.:

LD HL, 10072
EXX
RET

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Przerwania
« Odpowiedź #18 dnia: 2012.12.17, 13:19:58 »
No tak... Zasugerowałem się tym, że w "The Complete Spectrum ROM Disassembly" zmienne systemowe zawsze są używane w wersji symbolicznej a w fizycznym ROMie w tych miejscach występuje IY ze stosownym przesunięciem.

Prostym rozwiązaniem - jeśli nasz kod "wyrabia się" w ramce a przerwań używa tylko do synchronizacji jest push iy/halt/pop iy jako kod synchronizujący ;)

Konieczność ustawienia HL' to ewidentna niedoróbka w ROMie - w komentarzu w TCSRD jest nawet uwaga, że o ile IY jest odtwarzany (czyli możemy go zmieniać używać w naszym kodzie jeśli działamy z wyłączonymi przerwaniami) o tyle ważniejszy HL' nie jest co powoduje "ciekawe" efekty jeśli próbujemy wracać do BASICa po zmianie HL' ;)

tsulej

  • *
  • Wiadomości: 25
  • Miejsce pobytu:
    Warszawa
Odp: Przerwania
« Odpowiedź #19 dnia: 2012.12.17, 13:56:07 »
Przepraszam za brak wyjaśnień (późna pora), ale jest dokładnie tak jak pisali przedmówcy. Chodzi o to, że rejestr IY jest przez ROM wykorzystywany jako wektor po zmienne systemowe.

Z ROM Dissasembly:
Cytuj
LD IY,+5C3A IY holds +ERR-NR always.

I trzeba się przerzucić na IM2 lub kod z wykorzystaniem IY robić z wyłączonymi przerwaniami zabezpieczając ten rejestr na stosie w czasie działających przerwań.

Problem wyniknął podczas zabawy z SDCC, program mi przestawał rysować po naciśnięciu spacji. Okazało się, że zmienia mi się wartość zmiennej, do której skompilowany kod dobierał się przez IY. Na szczęście twórcy SDCC przewidzieli problemy z ROMami i wystarczy dodać parametr --reserve-regs-iy aby pozbyć się IY z kompilatu.

sect0r

  • *****
  • Wiadomości: 698
  • Miejsce pobytu:
    Oltedal/NO
  • speccyholic
Odp: Przerwania
« Odpowiedź #20 dnia: 2013.04.27, 08:14:36 »
Przy okazji kopania w necie natrafilem na kolejny artykul opisujacy przerwania.
http://www.grush.one.pl/gazety.php?mode=text&title=komputer&issue=komputer.4.86&art=glospana
Szarak # DivIDE+ # MasakratorFM DeluXe by Zaxon