;Exam2009H21Prg シフトによる３２ビット乗算
;被乗数３２ビット、乗数も３２ビット 完成
;----------------
MAIN START
	LAD GR1,VALUP ;被乗数の上位語のアドレス
	LAD GR2,MLTUP  ;乗数の上位語のアドレス
	LAD GR3,SEKI  ;積 計算結果の上位語のアドレス
	CALL MUL
	RET
VALUP DC  #0079 ;被乗数の上位語
VALDWN DC #8A03 ;被乗数の上位語
MLTUP DC #0000  ;乗数の上位語
MLTDWN DC #0002 ;乗数の下位語
SEKI DS 2       ;積
	END
;------------------
MUL START
	RPUSH
	PUSH 0,GR3    ;積の上位語アドレス退避
	PUSH 0,GR2    ;乗数上位語アドレス退避
	LD GR2,1,GR2  ;乗数下位語を取り出しＧＲ２に設定
	CALL MULS     ;被乗数Ｘ乗数下位語ー＞積（Ａ）
	POP GR2       ;乗数上位語アドレス復元
	LD GR2,0,GR2  ;答え オ
    ;乗数上位語取り出しＧＲ２に設定　
	LAD GR3,SV    ;結果の格納先として作業領域を設定
	CALL MULS     ;被乗数Ｘ乗数上位語ー＞積（Ｂ）
	LD GR6,1,GR3  ;答え　カ　
	POP GR3       ;
	ADDL GR6,0,GR3
    ;積（Ａ）の上位語と積（Ｂ）の下位語を加算
	ST GR6,0,GR3
	RPOP
	RET
SV DS 2
	END
;----------------
MULS START
	RPUSH
	LAD GR6,0    ;積　上位語の初期化
	LAD GR7,0    ;積　下位語の初期化
	LD GR4,0,GR1 ;被乗数　上位語の取り出し
	LD GR5,1,GR1 ;被乗数　下位語の取り出し
LP SRL GR2,1      ;乗数を１ビット右にシフト
	JOV ADD32    ;答え　ウ
	JZE FIN
	JUMP NEXT      ;加算処理をスキップ
ADD32 ADDL GR6,GR4 ;32bit + 32bit --> 32bit
	ADDL GR7,GR5   ;
	JOV ADJ1       ;答え　ウ
	JUMP NEXT
ADJ1 ADDL GR6,=1 ;桁上げ処理
NEXT SLL GR4,1   ;被乗数（３２ビット）上位語を１ビット左にシフト
	;上のシフト操作で最下位桁が必ずゼロとなる。
	SLL GR5,1   ;被乗数下位語を１ビット左にシフト　答え　エ
	JOV ADJ2
	JUMP LP
ADJ2 OR GR4,=1    ;最下位桁を１にする
;ADJ2 ADDL GR4,=1 ; でも同じはずである。
	JUMP LP
FIN ST GR6,0,GR3  ;乗算結果の格納
	ST GR7,1,GR3
	RPOP
	RET
	END
;-------------------
