;;; Computes the sum of numbers from 0..INPUT, using recursion. ;;; Author: Bert Maher .ORIG x3000 LD R6, STACKSTART LD R1, INPUT ;; push arg & call RECSUM STR R1, R6, 0 ADD R6, R6, -1 JSR RECSUM LDR R1, R6, 0 ADD R6, R6, 1 ; pop arg HALT RECSUM ;; Prologue ADD R6, R6, -1 ; push ret val STR R7, R6, 0 ; push ret address ADD R6, R6, -1 STR R5, R6, 0 ; push caller's frame ptr ADD R6, R6, -1 ADD R5, R6, 0 ; set my FP ;; no local vars ;; Body LDR R1, R6, 4 ; if (N==0) BRp RECSUM_REC AND R2, R2, 0 STR R2, R6, 3 ; return 0 BR RECSUM_EPI RECSUM_REC ADD R1, R1, -1 ; else STR R1, R6, 0 ; push N-1 ADD R6, R6, -1 JSR RECSUM ; recsum(N-1) LDR R2, R6, 0 ; get return value ADD R6, R6, 1 ; pop N-1 LDR R1, R6, 4 ; reload N ADD R2, R1, R2 ; N + recsum(N-1) STR R2, R6, 3 ; return N + recsum(N-1) ;; Epilogue RECSUM_EPI ADD R6, R6, 1 ; pop frame ptr LDR R5, R6, 0 ADD R6, R6, 1 ; pop ret addr LDR R7, R6, 0 ADD R6, R6, 1 ; pop ret value RET INPUT .FILL 100 STACKSTART .FILL xD000 .END