MAIN START
LAD GR1,A
CALL MVBITS ;副プログラムの呼び出し
RET
A DC #9ABF ;+0 送出し領域
B DC #1234 ;+1 受取り領域
C DC 8 ;+2 送出し開始ビット位置
D DC 4 ;+3 格納ビット位置
E DC 4 ;+4 移動すべきビット数
END
MVBITS START ;ビットの移動 [c10.cas]
RPUSH ;汎用レジスタを待避
LD GR2,4,GR1 ;移動すべきビット数
LD GR0,=#8000 ;e個のビット列を
SRA GR0,-1,GR2 ; 左端に作成 [ a ]
ST GR0,SAVE1 ;GR0をSAVE1に保存
LAD GR2,16
SUBA GR2,4,GR1
SUBA GR2,2,GR1 ;開始ビット位置を取り出す
SRL GR0,0,GR2 ;マスクをGR0に作成 [ b ]
LD GR2,0,GR1 ;ビット列を取り出す
AND GR0,GR2 ; 〃
LD GR2,3,GR1 ;取出し位置と格納位置
CPA GR2,2,GR1 ; の関係を判定
JMI SHFTR
SUBA GR2,2,GR1 ;ビット列を格納位置に
SLL GR0,0,GR2 ; シフトし [ c ]
JUMP SHFTE ; SAVE2に保存
SHFTR LD GR2,2,GR1 ; 〃
SUBA GR2,3,GR1 ; 〃
SRL GR0,0,GR2 ; 〃 [ d ]
SHFTE ST GR0,SAVE2 ; 〃
LD GR2,SAVE1 ;受取り位置のビットを
LAD GR3,16 ; オフするための
SUBA GR3,4,GR1 ; マスクをGR2に作成
SUBA GR3,3,GR1
SRL GR2,0,GR3
XOR GR2,=#FFFF ; [ e ]
LD GR3,1,GR1 ;受け取り位置のビット
AND GR2,GR3 ; をオフ
OR GR2,SAVE2 ;ビット列を移動 [ f ]
ST GR2,1,GR1
RPOP ;汎用レジスタの復元
RET
SAVE1 DS 1
SAVE2 DS 1
END