	TITLE SUMOF
				; x=M〜Nの範囲でf(x)=A*x+Bを計算し、
				; その合計を求めるプログラム
				; (機械語プログラム版)
				;
	ORG 200			; 0x200より入力データ開始
A:	DC 2			; A=2
B:	DC 1			; B=1
M:	DC 0			; M=0
N:	DC 5			; N=5
	ORG 210			; 0x210より命令コード開始
START:	L  1,M
	ST 1,X			; X=M (==0)
	LA 2,YDATA
	ST 2,YADDR		; YDATAのアドレスをYADDRに格納する
				; f(x)=A*x+Bを x=M〜Nの範囲で求めるループ
LOOP:	L  1,X
	L  2,N
	CMP 1,(2)		; XとNを比較する
	BP NEXT			; XがNより大きい場合はループを抜ける
	BSR FUNC		; f(x)を計算するサブルーチンを呼び出す
				; r1にXの値をセットしてから呼び出す
				; r1に計算結果が返ってくる
	L  2,YADDR
	STX 1,(2)		; YADDRのアドレスに結果を格納する
	LEA 2,1(2)		; YADDR++
	ST 2,YADDR
	L  1,X
	LEA 1,1(1)		; X++
	ST 1,X
	B  LOOP
				;
NEXT:	L  1,M
	ST 1,X
	LA 2,YDATA
	ST 2,YADDR		; YDATAのアドレスを(再び)YADDRに格納する
				;
				; YDATA[]に格納されている値を合計するループ
LOOP2:  L  1,X
	L  2,N
	CMP 1,(2)		; XとNを比較する
	BP FIN			; XがNより大きい場合にはループを抜ける
	L  2,YADDR
	LX 2,(2)		; 現在のYADDRのアドレスから値を読み出す
	L  1,SUM
	ADD 1,(2)		; SUMに加算する
	ST 1,SUM
	L  2,YADDR
	LEA 2,1(2)		; YADDR++
	ST 2,YADDR
	L  1,X
	LEA 1,1(1)		; X++
	ST 1,X
	B  LOOP2
				;
FIN:    HLT			; プログラム停止
				;
FUNC:   L  2,A			; f(x)=A*x+B を計算するサブルーチン
				; r1にxの値をセットして呼び出す
				; r1に計算結果を格納して戻る
	MULT 1,(2)		; A*xを計算する
	L  3,B
	ADD 3,(2)		; A*x+Bの値がr3に格納されている
	LEA 1,(3)		; r1にr3の値をコピーする
	RET			; 呼び出し元に戻る
				;
X:	DS 1			; 現在のxの値 (作業用)
YADDR:	DS 1			; 現在のYDATA[]の位置 (作業用)
YDATA:	DS 10			; 各xに対応したf(x)の計算結果を格納
SUM:	DC 0			; 計算結果
	END
