Obliczanie adresu danych dla podprogramów
From Atariki
Wersja z dnia 16:52, 18 sty 2011 Xxl (Dyskusja | wkład) (dodatkowe info) ← Previous diff |
Aktualna wersja Tdc (Dyskusja | wkład) (int.) |
||
Linia 12: | Linia 12: | ||
itd. | itd. | ||
</pre> | </pre> | ||
- | Podprogram zdejmuje ze stosu adres który można indeksować od 1 - tam znajdują się nasze dane. | + | 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. | 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. |
Aktualna wersja
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.
podprogram pla sta PZER0 pla sta PZER0+1 ldy #$01 lda (PZER0),y ; pierwszy parametr ... iny lda (PZER0),y ; drugi parametr ... itd. lda PZER0 clc adc #ilosc_parametrow tay bcc _1 inc PZER0+1 _1 lda PZER0+1 pha tya pha 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.
Procedurę powrotu z podprogramu można skrócić i przyspieszyć kosztem czytelności:
tya ; ilość parametrów sec ; +1 adc PZER0 sta PZER0 bcc _1 inc PZER0+1 _1 jmp (PZER0)