.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