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)
