view Examples/6502/a.s65 @ 0:cfb7c6b24319

Initial revision
author kono
date Thu, 30 Aug 2007 14:57:44 +0900
parents
children
line wrap: on
line source

;;
;;   ackerman function

;;   procedure name ACK
;;      ACK(X,Y)
;;	   == if X=0 then Y+1
;;	      else if Y=0 then ACK(X-1,1)
;;	      else ACK(X-1, ACK(X,Y-1))

;;   calling sequence
;;
;;	X  on   x
;;      Y  on   y
;;		non compile 11.86 sec on Sun 140
;;		    compile  7.54 sec on Sun 140

start		cld
		ldx	#1
		ldy	#1
		jsr	ack
		brk

ack		cpx	#0
		bne	xneqzero	
xeqzero		iny
		tya
		rts			

xneqzero	cpy	#0
		bne	yneqzero	
		dex			;; x <- x-1
yeqzero		ldy	#1
		jmp	ack		 ;; tail recursion

yneqzero	txa
		pha
		dey			;; y <- y-1
		jsr	ack		;; ack x,y-1
		tay
		pla
		tax
		dex			;; x <- x-1
		jmp	ack		;; tail recursion

		end
;;