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