MAIN START
LAD GR1,DATA
CALL BUNPU ;副プログラムの呼び出し
RET
DATA DC 'PROGRAMMING LANGUAGE CASL.'
DC 'COMET&CASL#'
END
BUNPU START ;文字の分布 [b04.cas]
RPUSH ;汎用レジスタの退避
LAD GR2,26 ;WORKの指標レジスタ
LAD GR3,2 ;2 → GR3 [ a ]
CLEAR ST GR3,WORK,GR2 ;初期値をWORKに入れる
SUBA GR2,=1 ;GR2-1 → GR2
JPL CLEAR
JZE CLEAR
TOP LD GR2,0,GR1 ;GR2に1文字取り出す
CPA GR2,='#' ;最後か? [ b ]
JZE PRINT
CPA GR2,='A' ;'A'と比較
JMI OTHER
CPA GR2,='Z' ;'Z'と比較
JPL OTHER
SUBA GR2,='A' ;数値に変換
JUMP SKIP
OTHER LAD GR2,26 ;英大文字以外の文字
SKIP LD GR3,WORK,GR2 ;個数を読み込む
LAD GR3,1,GR3 ;GR3を1加算する
ST GR3,WORK,GR2 ;個数を格納
LAD GR1,1,GR1 ;指標レジスタUP
JUMP TOP
PRINT LAD GR2,0 ;WORKの指標レジスタ
NEXT LD GR3,WORK,GR2 ;個数を読み込む
ST GR3,LEN ;出力長を格納
CPA GR2,=26 ;最後か? [ c ]
JZE LAST
LD GR3,GR2 ;GR2 → GR3
ADDA GR3,='A' ;文字に変換
ST GR3,AREA ;文字を格納
OUT AREA,LEN ;グラフの出力
LAD GR2,1,GR2 ;指標レジスタを加算 [ d ]
JUMP NEXT
LAST LD GR3,='#' ;その他の文字
ST GR3,AREA ;'#'を格納
OUT AREA,LEN ;グラフの出力
RPOP ;汎用レジスタの復元
RET
WORK DS 27
AREA DS 1
DC ' ********************'
LEN DS 1
END