Obliczanie adresu danych dla podprogramów

From Atariki

Jump to: navigation, search

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