CODE START ;暗号化 [c07.cas]
LAD GR1,0
LD GR0,KEY ;KEYのロード
TOP JZE FIN ;ゼロならば終了
JMI N1
N0 LAD GR1,1,GR1 ;シフトした回数
SLL GR0,1 ;1のビットがある [ a ]
JMI N1 ; まで左にシフトする
JUMP N0
N1 LD GR2,=#8000 ;#8000 → GR2
SRL GR2,0,GR1 ;GR1の数だけ右にずらす
LD GR3,DATA ;DATAのロード
AND GR3,GR2 ;左のビットを取り出す [ b ]
LAD GR4,1,GR1
N2 SLL GR0,1 ;1のビットがあるまで
JMI N3 ; シフト
LAD GR4,1,GR4
JUMP N2
N3 ST GR4,GR4SV
LD GR6,=#8000 ;#8000 → GR6 [ c ]
SRL GR6,0,GR4 ;GR4の数だけ右にずらす
LD GR5,DATA
AND GR5,GR6 ;左のビットを取り出す
SUBA GR4,GR1
LD GR7,GR3
SRL GR7,0,GR4 ;比較するために右にシフト
CPA GR7,GR5 ;比較
JZE NEXT ;同じ場合は入れ換えない
LD GR5,DATA ;DATAをロード
CPA GR3,=0 ;左のビットが0か?
JZE N4
SUBA GR5,GR2 ;左のビットが0の場合 [ d ]
ADDA GR5,GR6
ST GR5,DATA ;DATAに格納
JUMP NEXT
N4 ADDA GR5,GR2 ;左のビットが1の場合
SUBA GR5,GR6
ST GR5,DATA ;DATAに格納
NEXT LD GR1,GR4SV
LAD GR1,1,GR1
SLL GR0,1 ;1ビット左にずらす
JUMP TOP
FIN RET
GR4SV DS 1
DATA DC #6010 ;0110 0000 0001 0000
KEY DC #5012 ;0101 0000 0001 0010
END