;２０１７年平成２９年度春の問題設問２用
;３２ビット符号なし整数の乗算：条件：ADD64を使う。
;-------------
MAIN START
    LAD GR1,N1
    LAD GR2,N2
    LAD GR3,ANS
    CALL MUL32
    RET
;N1とN2は、乗算の対象となる３２ビットの符号なし整数
N1  DC #0010
    DC #0A05 ;
N2  DC #0000 ; N2 の HIWORD
    DC #0002 ; N2 の LOWORD
ANS DS 4 ;乗算結果の６４ビットの符号なし整数の格納領域
    END
;------------------------------------------------
MUL32 START
    RPUSH
    LAD GR7,TEMP ;TEMP のアドレスを取得
    ;----------------
    LD GR0,0,GR1 ;GR1（つまりN1）から始まる２語の
    ST GR0,2,GR7 ;領域の値をTEMPから始まる
    LD GR0,1,GR1 ;４語の領域のうちの下位２語に格納
    ST GR0,3,GR7 ;
    ;------
    LD GR0,=0 ;
    ;-----
    ST GR0,0,GR7 ;TEMPから始まる４語の領域のうちの
    ST GR0,1,GR7 ;上位２語にゼロを格納
    ;-------
    ST GR0,0,GR3 ;GR3（つまりANS)から始まる４語の領域に
    ST GR0,1,GR3 ;ゼロを格納
    ST GR0,2,GR3 ;
    ST GR0,3,GR3 ;　
    ;--------
    LD GR5,=0  ;ループカウンタ N2の第ゼロビット目の意味
    LD GR4,GR2 ;GR2の値をGR4に退避
LOOP LD GR6,GR5
    SUBL GR6,=16 ;処理対象がLOWORD、HIWORDのどちらかであるかの判定
    JMI LOWORD   ;問e 答ア　LOWORD 又は HIWORD 処理への分岐
    LD GR0,0,GR2 ;N2の HIWORD の処理を以下で行う
    SRL GR0,0,GR6
    JUMP TESTBIT
LOWORD LD GR0,1,GR2 ;N2の LOWORD の処理を以下で行う
    SRL GR0,0,GR5
TESTBIT AND GR0,=#0001
    JZE EXITLOOP
    ;----------以下大事--------------------------------
    LD GR1,GR3   ;ANS のアドレスをGR1に入れる。
    LAD GR2,TEMP ;ANS と TEMP の数値の合計を求める。
    CALL ADD64   ;GR1つまりANS にTEMP の値を加算する。
    ;----------以上大事-------------------------
EXITLOOP CPL GR5,=31 ;全３２ビット処理完了かどうかの判定
    JZE EXIT
    ADDL GR5,=1 ;次の上位ビットを処理する準備
;-----------以下重要-------------------------
    LAD GR1,TEMP ;TEMP アドレス取得
    LAD GR2,TEMP ;問 f 答 オ　同じくTEMP アドレス取得　
    CALL ADD64   ;一回実行する毎にTEMPの値が２倍になる。
; TEMP（初期値N1）の値が一回実行毎に２倍、４倍、８倍、
; １６倍、３２倍、６４倍、１２８倍、・・・となる。
;----------以上重要---------------------------
    LD GR2,GR4 ;GR4に退避した値をGR2に復帰
    JUMP LOOP
EXIT RPOP
    RET
TEMP DS 4 ;作業用６４ビットの符号なし整数の格納領域
    END
;--------------ggg----
ADD64 START
    RPUSH
    LD GR0,=0
    LAD GR3,3,GR1
    LAD GR4,3,GR2
LOOP LD GR5,=0
    ADDL GR0,0,GR3
    JOV OV1
    JUMP NOV1
OV1 LD GR5,=1   ; 問 a 答 オ　桁上がり確保
NOV1 ADDL GR0,0,GR4
    JOV OV2
    JUMP NOV2
OV2 LD GR5,=1  ; 問 a 答 オ　桁上がり確保
NOV2 ST GR0,0,GR3
    LD GR0,GR5  ;桁上がりを上位桁に加算用
    CPL GR3,GR1 ; GR3 が最上位桁と同じになったか？
    JZE EXIT
    SUBL GR3,=1
    SUBL GR4,=1
    JUMP LOOP
EXIT RPOP
    RET
    END
;----------------
