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