;2015H25春プログラム２の改造
;Exam2015H27春Prg3 再帰処理
;---------------------------
MAIN START
	LD GR1,N
	CALL FACT2
	ST GR0,ANS
	RET
N DC 6
ANS DS 1
	END
;-----------------------
FACT2 START
	RPUSH
	CALL RSUB    ;再帰処理の本体を呼ぶ
	RPOP
	RET          ;主プログラムへ戻る
RSUB LD GR4,GR1
	SUBL GR4,=1
	JPL NEXT     ; N >=の場合 NEXTへ
	LD GR0,=1    ; GR0 <--- F(0), F(1)の値
	RET
NEXT PUSH 0,GR1
	LAD GR1,-1,GR1
	CALL RSUB    ; F(n-1)を計算
	POP GR2
	CALL MULT
	RET
	END
;------------------
FACT START
	RPUSH
	LD GR0,=1
	SUBL GR1,=1
;--------------
	JPL NEXT    ; 問題（	a ）の答 エ
;--------------------------
	JUMP FIN
NEXT LD GR2,=1
LP LAD GR2,1,GR2
	CALL MULT
;--------------------
	SUBL GR1,=1 ;問題（ｂ）の答　オ
;---------------------
	JNZ LP
FIN RPOP
	RET
	END
;-----------------------------------
MULT START ;シフトによる乗算
	RPUSH
	LD GR1,GR0 ;被乗数をＧＲ１に保持
	LD GR0,=0  ;乗算結果の初期化
	LD GR3,=15
	LD GR2,GR2
LP	JZE FIN
	JPL CONT
	LD GR4,GR1
;----------------
	SLL GR4,0,GR3 ;問題（ｃ）の答　ウ
;---------------------
	ADDL GR0,GR4
CONT LAD GR3,-1,GR3
	SLL GR2,1
	JUMP LP
FIN RPOP
	RET
	END
