Obliczanie adresu danych dla podprogramów

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
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)
Personal tools