	.TITLE SUMOF
				; x=M〜Nの範囲でf(x)=A*x+Bを計算し、
				; その合計を求めるプログラム
				; (マイクロプログラム版)
*START:	100
	R0:=202			; Mのアドレスをセット
*
	READ
	SET BY R0
*
	R7:=MM			; R7にXの値を格納する
*
	R6:=204			; R6にYADDRの値(アドレス)を格納する
*
	R0:=203			; Nのアドレスをセット
*
	READ
	SET BY R0
*
	R5:=MM			; R5にNの値を格納する
*LOOP:
	SET BY R7 - R5
*
	IF NEG = 1 THEN L1
*
	IF ZER = 0 THEN NEXT
*L1:
	R1:=R7			; R1に関数の引数をセット
*
	CALL FUNC		; f(x)=a*x+bを計算するFUNCを呼び出す
*
	WRITE
	SET BY R6
*
	SET BY R1		; f(x)の計算結果をYDATA[]に格納する
*
	R6:=R6+1		; YADDRの値を1増加
*
	R7:=R7+1		; Xの値を1増加
*
	GOTO LOOP
*NEXT:
	R0:=202			; Mのアドレスをセット
*
	READ
	SET BY R0
*
	R7:=MM			; R7に(再び)Xの値を格納する
*
	R6:=204			; R6に(再び)YADDRの値(アドレス)を格納する
*
	R0:=203			; Nのアドレスをセット
*
	READ
	SET BY R0
*
	R5:=MM			; R5に(再び)Nの値を格納する
*
	R4:=0			; R5にSUMの値を格納する(0で初期化)
*LOOP2:
	SET BY R7 - R5		; XとNの値を比較
*
	IF NEG = 1 THEN L2
*
	IF ZER = 0 THEN FIN
*L2:
	READ
	SET BY R6
*
	R4:=MM+R4		; SUM = SUM + YDATA[]
*
	R6:=R6+1
*
	R7:=R7+1
*
	GOTO LOOP2
*FIN:
	R0:=214			; SUMのアドレスをセット
*
	WRITE
	SET BY R0
*
	SET BY R4		; メモリ上のSUMに値を書き込む
*
	SET HLT
				;
*FUNC:				; f(x) = A*x + B の値を計算する
				; マイクロサブルーチン
				; r1にxの値をセットして呼び出す
	R0:=200			; Aのアドレスをセット
*
	READ
	SET BY R0
*
	R2:=MM			; r2にAの値を格納する
*
	CALL MULT		; A * Xを計算する (r1に結果が返ってくる)
*
	R0:=201			; Bのアドレスをセット
*
	READ
	SET BY R0
*
	R1:=MM+R1		; A * x + Bを計算する
*
	RETURN
				;
				; 乗算を行なうマイクロサブルーチン
*MULT:				; r1に被乗数 r2に乗数をセットして呼び出す
				; 上位16ビットをr0、下位16ビットをr1に返す
	R0:=ZERO AND 10		; r0への0のセットと
	C:=RBUS			; カウンタCへの0x10のセットを同時に行なう
*
	R1:=SRL R1
*MULT2:                         ; 乗算ループ
	IF CRY=0 THEN MULT3
        C-1
*
	R0:=R0+R2
*MULT3:
	R0:=SRL R0
	WITH CRY
*
	IF CZ=0 THEN MULT2
	R1:=SRL R1
	WITH CRY
*
	RETURN
	.END
