;Exam2010H22FallPrg3   ZZ
;Exam2010H22秋Prg3
;部分ビット列の逆転
;----------------------
MAIN START
	LAD GR1,WORD
	LD GR2,P
	LD GR3,Q
	CALL PREVRS
	RET
WORD DC #BE5A  ;
HOZON DC #BE5A ;比較用の元のビット列
P DC 8
Q DC 4
	END
;---------------
PREVRS START
	RPUSH
	LD GR4,0,GR1   ;ビット列を保存
	CALL REVRS     ;ビット列のビットの並びを逆転
	LD GR5,0,GR1   ;GR5 <--- 逆転したビット列
	LD GR6,=16
	SUBA GR6,GR3   ;GR6 <--- 16-q
	SRL GR5,0,GR2  ;逆転した部分ビット列aを右端に移動
	SLL GR5,0,GR6
    ;逆転した部分ビット列aを左端に移動 　　答え ウ
  SRL GR5,0,GR2  ;逆転した部分ビット列aをＰビット右に移動
    ;------------------------
	LD GR6,=#8000
	SRA GR6,-1,GR3 ;Qビット連続した１の並びを作成
	SRL GR6,0,GR2  ;Ｐビット右へ移動
	XOR GR6,=#FFFF ;１を０に、０を１にビットを反転
	AND GR6,GR4
    ;元のビット列中の部分ビット列aにゼロを設定
	;-----------------------------
	OR GR6,GR5     ;合成する 　　答え　ア
	ST GR6,0,GR1
	RPOP
	RET
	END
;------------------------
LREVRS START
	RPUSH
	LD GR3,GR1 ;WORDSの先頭アドレス
	LD GR4,GR2 ;　Ｎ
	SUBA GR4,=1
	JZE LOOP2
	ADDA GR4,GR1
LOOP1 LD GR5,0,GR3 ;GR3の指す語とGR4が指す語の内容を入れ替える
	LD GR6,0,GR4  ;
	ST GR5,0,GR4  ;
	ST GR6,0,GR3  ;
	LAD GR3,1,GR3 ;GR3を次の語に位置付ける
	LAD GR4,-1,GR4 ;GR4を一つ前の語に位置付ける
	CPA GR3,GR4
	JPL LOOP1 ;ゼロまたはマイナスの時語順逆転完了
LOOP2 CALL REVRS
	LAD GR1,1,GR1 ;次の語のアドレス
	SUBA GR2,=1 ;残りの語数をカウント
	JNZ LOOP2 ;GR2がゼロになると終了
FIN3  RPOP
	RET
	END
;--------------------
REVRS START
	RPUSH
	LD GR4,=0    ;結果のビット列を初期化
	LAD GR2,15   ;ループカウンタ
	LD GR3,0,GR1 ; GR3 <--- ビット列
LOOP SLL GR4,1   ;結果のビット列を左シフト
	SRL GR3,1    ;元のビット列を右シフト
	JOV ON   ;元のビット列右端に１があればＯＮへ　答え　ウ
	JZE FIN1 ;元のビット列の残りのビットはすべてゼロ
	JUMP OFF
ON OR GR4,=#0001
OFF SUBA GR2,=1 ;カウンタから１を引く
	JMI FIN2    ;１６ビット処理済
	JUMP LOOP
FIN1 SLL GR4,0,GR2
;結果のビット列を残りのビット数だけシフト　答え　イ
FIN2 ST GR4,0,GR1
	RPOP
	RET
	END
;----------------
