PACK   START              ;文字の圧縮 [c03.cas]
       IN     S,LEN       ;文字列の入力
       LAD    GR1,0
       LAD    GR2,0       ;Sの指標レジスタ
L0     CPA    GR2,LEN     ;終了判定 [  a  ]
       JZE    FIN
       LAD    GR3,1       ;連続する文字の数
       LAD    GR4,1,GR2
L1     CPA    GR4,LEN
       JZE    L2
       LD     GR0,S,GR2   ;Sの1文字を取り出す
       CPA    GR0,S,GR4   ;同じ文字か?
       JNZ    L2
       LAD    GR3,1,GR3   ;GR3+1 → GR3
       LAD    GR4,1,GR4   ;GR4+1 → GR4
       JUMP   L1
L2     CPA    GR3,=5      ;連続する文字の数が5以上
       JMI    L4
       LD     GR5,='@'    ;'@'をGR5に入れる [  b  ]
       ST     GR5,R,GR1   ;'@'の格納
       LAD    GR1,1,GR1   ;Rの指標を加算
       ST     GR0,R,GR1   ;Rに1文字格納
;
       LD     GR6,GR3     ;GR3 → GR6
       LD     GR0,='1'    ;'1' → GR0
       CPA    GR6,=9      ;10以上か? [  c  ]
       JPL    SKIP
       LD     GR0,='0'    ;'0' → GR0
       ADDA   GR6,=10     ;10を加算
SKIP   LAD    GR1,1,GR1   ;Rの指標を加算
       ST     GR0,R,GR1
       SUBA   GR6,=10
       OR     GR6,=#0030  ;文字に変換
       LAD    GR1,1,GR1   ;Rの指標を加算
       ST     GR6,R,GR1   ;Rに格納
       LAD    GR1,1,GR1   ;Rの指標を加算
L3     ADDA   GR2,GR3     ;GR2+GR3 → GR2
       JUMP   L0
L4     LAD    GR4,1       ;1 → GR4
L5     CPA    GR4,GR3
       JPL    L3          ; [  d  ]
       LD     GR0,S,GR2   ;文字の複写
       ST     GR0,R,GR1   ;文字の複写
       LAD    GR1,1,GR1
       LAD    GR4,1,GR4
       JUMP   L5
FIN    ST     GR1,LEN     ;長さを格納
       OUT    R,LEN       ;出力
       RET
LEN    DS     1           ;入力文字長
S      DS     256
R      DS     256
       END