;Exam2010H22春Prg1 浮動小数点数の加算
;---------------------------------
EX10H01 START
	LAD GR1,X
	LAD GR2,Y
	LAD GR3,Z
	CALL FADD
	RET
X 	DC #0080 ; 符号と指数（被加数）
	DC #8033 ; 仮数      （被加数）
Y 	DC #0080 ; 符号と指数（加数）
	DC #A055 ; 仮数      （加数）
Z 	DS 2     ; 加算結果格納領域
	END
;-------------
FADD START ; Z <-- X + Y
	RPUSH
	PUSH 0,GR3   ;結果Ｚの格納領域の先頭番地を退避
	LD GR4,0,GR1 ;
	AND GR4,=#00FF ;Ex: Xの指数
	LD GR5,0,GR2   ;
	AND GR5,=#00FF ;Ex: Yの指数
	LD GR6,1,GR1   ;Mx: Xの仮数
	LD GR7,1,GR2   ;My: Yの仮数
;加算前の準備（指数をそろえる）
;GR4 <-- max(Ex, Ey), GR6 <--調整済Mx, GR7 <--調整済みMy
	LD GR3,GR4     ; Xの指数
	CPL GR4,GR5
	JZE MADD       ; Ex = Ey　の場合
	JMI BIGEV      ; Ex < Ey　の場合
	SUBL GR3,GR5
	SRL GR7,0,GR3  ; My　を調整
	JUMP MADD
BIGEV  LD GR4,GR5   ; a 答え　う
	SUBL GR5,GR3
	SRL GR6,0,GR5  ; Mx　を調整
;符号を考慮した仮数の加算
; Sz : Zの符号 , Ex: Zの指数 , Mz: Zの仮数
; GR4 <--(Sz, Ez), GR5 <--Mz
MADD LD GR1,0,GR1   ;Xの符号の検査
	JMI XMINUS      ;負の場合
	LD GR2,0,GR2    ;Yの符号の検査
	JPL ADDMXY      ;b  Y > 0 の場合　答え　エ
	LD GR5,GR6      ;X >= 0, Y <= 0　の場合
	SUBL GR5,GR7    ;Mz <-- 調整済みMx - 調整済みMy
	JUMP SCHECK
XMINUS LD GR2,0,GR2
	JMI YMINUS
	LD GR5,GR7
	SUBL GR5,GR6
	JUMP SCHECK      ; c 答え　カ
YMINUS OR GR4,=#8000 ; Sz に負の符号を設定
ADDMXY LD GR5,GR6    ;調整済み仮数の加算を行う
	ADDL GR5,GR7     ;Mz <-- 調整済みMx + 調整済みMy
	JOV ADJST        ;桁上がりがある場合の正規化
	JUMP NORM
SCHECK JOV NEGMZ     ; Mz　の符号の検査
	JUMP NORM
NEGMZ OR GR4,=#8000  ; Szに負符号を設定
	XOR GR5,=#FFFF   ; Mz <-- -Mz
	ADDL GR5,=1
;
NORM LD GR5,GR5     ;ゼロチェック
	JNZ LOOP        ; 
	LD GR4,=0
	JUMP FIN
LOOP LD GR5,GR5   ;正規化完了？
	JMI FIN       ;最上位桁が１の場合
	SLL GR5,1    ;d 最上位桁が１となるように左シフト　答え　イ
	SUBL GR4,=1   ;指数を１下げる
	JUMP LOOP
ADJST SRL GR5,1    ;桁上がりの操作をする
	OR GR5,=#8000 ; Mz の最上位ビットを1に設定
	ADDL GR4,=1   ; e　答え　ア
FIN POP GR3
	ST GR4,0,GR3  ; 結果　Z　の格納
	ST GR5,1,GR3
	RPOP
	RET
	END
;-----------------
