+++ /dev/null
-FADD START ; Z ← X + Y
- RPUSH
- PUSH 0,GR3 ; 結果 Z の格納領域の先頭番地を退避
- LD GR4,0,GR1
- AND GR4,=#00FF ; Ex: X の指数
- LD GR5,0,GR2
- AND GR5,=#00FF ; Ey: Y の指数
- LD GR6,1,GR1 ; Mx: X の仮数
- LD GR7,1,GR2 ; My: Y の仮数
-; 加算前の準備 (指数をそろえる)
-; GR4 ← max(Ex,Ey) , GR6 ← 調整済 Mx , GR7 ← 調整済 My
- LD GR3,GR4
- CPL GR4,GR5
- JZE MADD ; Ex = Ey の場合
- JMI BIGEY ; Ex < Ey の場合
- SUBL GR3,GR5
- SRL GR7,0,GR3 ; My を調整
- JUMP MADD
-BIGEY LD GR4,GR5
- SUBL GR5,GR3
- SRL GR6,0,GR5 ; Mx を調整
-; 符号を考慮した仮数の加算
-; Sz: Z の符号 , Ez: Z の指数 , Mz: Z の仮数
-; GR4 ← (Sz,Ez) , GR5 ← Mz
-MADD LD GR1,0,GR1 ; X の符号の検査
- JMI XMINUS ; 負の場合
- LD GR2,0,GR2 ; Y の符号の検査
-
- 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
-
-YMINUS OR GR4,=#8000 ; Z に負符号を設定
-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
-
- SUBL GR4,=1
- JUMP LOOP
-ADJST SRL GR5,1
- OR GR5,=#8000 ; Mz の最上位ビットを 1 に設定
-
-FIN POP GR3
- ST GR4,0,GR3 ; 結果 Z の格納
- ST GR5,1,GR3
- RPOP
- RET
- END