Obliczanie adresu danych dla podprogramów
From Atariki
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)
						
			
		