	.ORIG	x4B00
;; Activation record for GCD
;;
;;  offsets to R5 during call
;;  -2 -- SAVED R2 (last local)     -- R6 here during call
;;  -1 -- SAVED R1
;;   0 -- SAVED R0 (first local)    -- R5 here during call
;;   1 -- dynamic link
;;   2 -- return PC
;;   3 -- return value  (GDC(N,M))  -- R6 here on exit
;;   4 -- ARG 1         (N)         -- R6 here on entry
;;   5 -- ARG 2         (M)
;;

;; CREATE THE ACTIVATION RECORD
GCD	STR     R7,R6,#-2      ;; Store caller PC
        STR     R5,R6,#-3      ;; Store caller dynamic link
        ADD     R5,R6,#-4      ;; Set R5 to first local
        ADD     R6,R5,#-2      ;; Set R6 to last local

;; SAVE REGS
        STR     R0,R5,#0
        STR     R1,R5,#-1
        STR     R1,R5,#-2

;; DO THE WORK
	LDR	R0,R5,#4	; R0 <- N
	LDR	R1,R5,#5	; R1 <- M
	NOT	R2,R1
	ADD	R2,R2,#1
	ADD	R2,R0,R2	; R2 <- N-M
	BRz	Leave
	BRp	Recurse
;; N < M -- swap
	ADD	R2,R1,#0
	ADD	R1,R0,#0
Recurse
	STR	R0,R6,#-2	; Push N and M on stack
	STR	R1,R6,#-1
	ADD	R6,R6,#-2
	JSR	GCD
	LDR	R0,R6,#0	; R0 <- return value
	ADD	R6,R6,#3	; pop return value and args

Leave	
;; SAVE RETURN VALUE
	STR	R0,R5,#3       ;; Save return value

;; RESTORE REGS
        LDR     R0,R5,#0
        LDR     R1,R5,#-1
        LDR     R1,R5,#-2

;; RETURN AND DELETE ACTIVATION RECORD
        LDR     R7,R5,#2
        ADD     R6,R5,#3
        LDR     R5,R5,#1
        RET

	.END

