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