Obliczanie adresu danych dla podprogramów: Różnice pomiędzy wersjami
Nie podano opisu zmian |
int. |
||
| (Nie pokazano 1 wersji utworzonej przez jednego użytkownika) | |||
| 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]] | ||
Aktualna wersja z 1 sie 2015, 16:52
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)