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