;Exam2009H21Prg1 シフトによる３２ビット乗算
;被乗数３２ビット、乗数は１６ビット 　完成
;----------------
MAIN START
    LAD GR1,VALUP ;被乗数の上位語のアドレス
    LD GR2,MLT    ;乗数
    LAD GR3,SEKI  ;積 計算結果の上位語のアドレス
    CALL MULS
    RET
VALUP DC #0079 ;被乗数の上位語
VALDWN DC #8A03 ;被乗数の上位語
MLT DC #0002    ;乗数
SEKI 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
;-------------------
