MAIN    START
        LAD    GR1,ARG
        CALL   DECSUM       ;副プログラムの呼び出し
        OUT    TOTAL,LEN    ;結果の出力
        RET
ARG     DC     NUM,11,TOTAL ;パラメタの内容
NUM     DC     '21,569,1387'
TOTAL   DC     '          ' ;合計領域
LEN     DC     10           ;出力文字長
        END
DECSUM  START              ;数字列の加算 [c05.cas]
        RPUSH              ;汎用レジスタの退避
        LD     GR3,0,GR1   ;文字列へのポインタ
        ST     GR3,INTOP   ;文字列の最初のアドレス
        ADDL   GR3,1,GR1   ;文字列のアドレス+長さ
        LD     GR2,2,GR1   ;合計領域へのポインタ
        ADDL   GR2,=10     ;合計領域のアドレス+10
        ST     GR2,OUT     ;合計領域の終わり
        LAD    GR1,0       ;けた上がりの初期化
LOOP    LAD    GR3,-1,GR3
        CPL    GR3,INTOP   ;文字列の終わり?
        JMI    CRYPRC
        LD     GR0,0,GR3   ;1文字取り出し [  a  ]
        CPL    GR0,=','    ;文字=','?
        JZE    CRYPRC
        SUBA   GR0,='0'    ;文字から数値に変換
        CALL   ADDPRC      ;加算処理の呼び出し
        JUMP   LOOP
CRYPRC  LD     GR1,GR1     ;残りのけた上がりの処理
        JZE    DECNXT
        LAD    GR0,0       ;0 → GR0
        CALL   ADDPRC      ;加算処理の呼び出し
        JUMP   CRYPRC
DECNXT  CPL    GR3,INTOP   ;文字列の終わり?
        JMI    RETURN
        LD     GR2,OUT     ;次の数字列の準備 [  b  ]
        JUMP   LOOP
RETURN  RPOP               ;汎用レジスタの復元
        RET
;
ADDPRC  LAD    GR2,-1,GR2  ;加算処理
        LD     GR4,0,GR2   ;数値(文字)を取り出す
        AND    GR4,=#000F  ;数値に変換 [  c  ]
        ADDA   GR0,GR4     ;GR0にGR4を加算
        ADDA   GR0,GR1     ;けた上がりを加算
        CPA    GR0,=9
        JPL    CRYNZR
CRYZER  LAD    GR1,0       ;0 → GR1
        JUMP   DECCHR
CRYNZR  LAD    GR1,1       ;1 → GR1
        SUBA   GR0,=10     ;10を減算
DECCHR  ADDA   GR0,='0'    ;文字に変換 [  d  ]
        ST     GR0,0,GR2   ;数値(文字)を格納
        RET
INTOP   DS     1           ;文字列の先頭番地
OUT     DS     1           ;合計領域の終わり
        END