Obliczanie adresu danych dla podprogramów

Z Atariki
Wersja z 3 cze 2008, 17:13 autorstwa Xxl (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacji Przejdź do wyszukiwania

Jeśli mamy często wywoływany podprogram, któremu trzeba przekazać parametry to robimy to zazwyczaj zapisując w wydzielonym obszarze na którym operuje podprogram adres danych i robimy JSR do procedury.

Jeśli odpowiednio zorganizujemy nasz program możemy zaoszczędzić na każdorazowym zapisywaniu adresu danych dla podprogramów:

     JSR podprogram
     dta nasze dane
     ...
     dalsza część programu
     ...
     JSR podprogram
     dta nasze dane
     itd.

Podprogram zdejmuje ze stosu adres który można indeksować od 1 - tam znajdują się nasze dane.

Aby powrócić z procedury należy do zdjętego ze stosu adresu dodać wartość zależną od ilości danych obsługiwanych przez podprogram i wykonać RTS.

Czym częściej wywołujemy podprogram z różnych miejsc tym więcej oszczędzamy - nie potrzeba:

     lda <adres_danych
     sta w_ciele_podprogramu_lub_strona_zero
     lda >adres_danych
     sta w_ciele_podprogramu_lub_strona_zero

czyli ok 10 bajtów na wywołanie.

Tak działa funkcja PRINTF w SpartaDOS X, na podobnej zasadzie można również zorganizować listę obsługiwanych obiektów w grach.