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