Obliczanie adresu danych dla podprogramów: Różnice pomiędzy wersjami

Z Atariki
Przejdź do nawigacji Przejdź do wyszukiwania
Xxl (dyskusja | edycje)
Nie podano opisu zmian
 
Tdc (dyskusja | edycje)
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)