* przyklad procedury rekurencyjnej
* zaglebiajacej sie do 20 razy

@stack_pointer = $FF
@stack_address = $400

;---
 org $2000
;--- 

; dla pewnosci zerujemy wskaznik stosu
 lda #0
 sta @stack_pointer

; wywolujemy procedure TEST, parametrem jest wartosc 0, lub inna wartosc <20
 test #0

; petla bez konca, aby mozna bylo zobaczyc efekt dzialania
loop jmp loop


; deklaracja procedury TEST
test .proc {.byte war}

; odczytujemy parametr
 ldx @stack_pointer
 lda war,x
; i zwiekszamy o 1
 clc
 adc #1 

; sprawdzamy czy osiagnelismy wartosc 20
; jesli nie to wywolaj jeszcze raz procedure TEST
 cmp #20
 beq quit

; wywolujemy procedure TEST, parametrem jest zawartosc akumulatora
 test @

; osiagnelismy wartosc 20 wiec wracamy
; zdejmujemy wartosc odlozona na stos i umieszczamy na ekranie
quit
 ldx @stack_pointer
 lda war,x
ekr sta $bc40
 inc ekr+1

 .exit

 .endp 


 icl 'macros\call.asm'
 icl 'macros\exitproc.asm'
