Szybsze zapamiętywanie rejestrów w procedurze przerwania
From Atariki
Wersja z dnia 10:10, 6 maj 2008 KMK (Dyskusja | wkład) ← Previous diff |
Aktualna wersja Tdc (Dyskusja | wkład) (dr. red.) |
||
Linia 1: | Linia 1: | ||
- | Kiedy obsługujemy przerwania (np. [[DLI]]), powinniśmy zapisać wartości rejestrów, i odtworzyć je przy wyjściu (oczywiście, tylko rejestry, które będziemy modyfikowali). | + | Kiedy obsługujemy przerwania (np. [[DLI]]), powinniśmy zapisać wartości rejestrów i odtworzyć je przy wyjściu (oczywiście, tylko rejestry, które będziemy modyfikowali). |
Typowo, jest to robione poprzez: | Typowo, jest to robione poprzez: | ||
<pre> | <pre> | ||
Linia 16: | Linia 16: | ||
pla ; 4 | pla ; 4 | ||
</pre> | </pre> | ||
- | To rozwiązanie, chociaż proste, zajmuje w sumie w sumie 29 cykli. W przypadkach, kiedy mamy dużo przerwań, np. DLI co 2 linie, jest szybsza metoda: | + | To rozwiązanie, chociaż proste, zajmuje w sumie 29 cykli. W przypadkach, kiedy mamy dużo przerwań, np. DLI co 2 linie, jest szybsza metoda: |
<pre> | <pre> | ||
enter | enter |
Aktualna wersja
Kiedy obsługujemy przerwania (np. DLI), powinniśmy zapisać wartości rejestrów i odtworzyć je przy wyjściu (oczywiście, tylko rejestry, które będziemy modyfikowali). Typowo, jest to robione poprzez:
enter pha ; 3 cykle txa ; 2 pha ; 3 tya ; 2 pha ; 3 ... leave pla ; 4 tay ; 2 pla ; 4 tax ; 2 pla ; 4
To rozwiązanie, chociaż proste, zajmuje w sumie 29 cykli. W przypadkach, kiedy mamy dużo przerwań, np. DLI co 2 linie, jest szybsza metoda:
enter sta _value_a+1 ; 4 cykle stx _value_x+1 ; 4 sty _value_y+1 ; 4 ... leave _value_a lda #0 ; 2 _value_x ldx #0 ; 2 _value_y ldy #0 ; 2
To zajmuje 18 cykli, zatem pozwala oszczędzić 11 cykli na obsługę przerwania. Zajmuje 5 bajtów więcej, ale zazwyczaj ten koszt jest pomijalny.
Powyższą procedurę możemy umieścić w całości na stronie zerowej, przez co instrukcje sta,stx,sty value wykonają się o jeden cykl mniej, w ten sposób oszczędzamy 3 cykle na przerwanie. Jeżeli mamy np. przerwanie DLI co 1 linię ekranową występujące przez 200 linii rachunek wydaje sie prosty, oszczędzany 600 cykli. Zyskujemy trochę cykli kosztem zajęcia części strony zerowej poprzez kod procedury obsługi przerwania. Jednak czasami jest to opłacalne.
Strony zerowej można też użyć do przechowywania rejestrów, zmniejszy to dodatkowy koszt pamięci z 5 bajtów do 2, przy tym samym czasie wykonania:
zp_a $80 zp_x $81 zp_y $82 ... enter sta zp_a stx zp_x sty zp_y ... leave lda zp_a ldx zp_x ldy zp_y
To rozwiązanie jest dodatkowo przydatne w sytuacjach, gdy w procedurze przerwania mamy więcej niż jedno miejsce wyjścia, np. w związku ze skokiem warunkowym.