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