Obliczanie adresu danych dla podprogramów
From Atariki
Wersja z dnia 15:13, 3 cze 2008 Xxl (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 16:52, 18 sty 2011 Xxl (Dyskusja | wkład) (dodatkowe info) Next diff → |
||
Linia 2: | Linia 2: | ||
Jeśli odpowiednio zorganizujemy nasz program możemy zaoszczędzić na każdorazowym zapisywaniu adresu danych dla podprogramów: | Jeśli odpowiednio zorganizujemy nasz program możemy zaoszczędzić na każdorazowym zapisywaniu adresu danych dla podprogramów: | ||
- | + | <pre> | |
JSR podprogram | JSR podprogram | ||
dta nasze dane | dta nasze dane | ||
Linia 11: | Linia 11: | ||
dta nasze dane | dta nasze dane | ||
itd. | itd. | ||
- | + | </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. | ||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
Czym częściej wywołujemy podprogram z różnych miejsc tym więcej oszczędzamy - nie potrzeba: | Czym częściej wywołujemy podprogram z różnych miejsc tym więcej oszczędzamy - nie potrzeba: | ||
Linia 26: | Linia 51: | ||
Tak działa funkcja PRINTF w SpartaDOS X, na podobnej zasadzie można również zorganizować listę obsługiwanych obiektów w grach. | 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: | ||
+ | <pre> | ||
+ | tya ; ilość parametrów | ||
+ | sec ; +1 | ||
+ | adc PZER0 | ||
+ | sta PZER0 | ||
+ | bcc _1 | ||
+ | inc PZER0+1 | ||
+ | _1 jmp (PZER0) | ||
+ | </pre> | ||
[[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] |
Wersja z dnia 16:52, 18 sty 2011
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)