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