画面スクロール量の計算(加算命令で引き算)

By 神居 - Posted: 2011/01/05 Last updated: 2011/01/06 - Leave a Comment

同じ値を±の符号を入れ替えて計算したい場合があります。例えば画面のスクロール量を計算するようなことがあります。押されたキーがPF8キーなら表示中データを前方へスクロールさせ、PF7キーなら同じ量を後方へスクロールさせるような場合です。
そのような場合、すぐに思いつくのがADD命令とSUBTRACT命令の使い分けです。

         LH    R0,SCRAMONT              LOAD SCREEN SCROLL AMOUNT
         CLC   0(3,R1),=CL3'UP.'        BACKWARD SCROLL ?
         BE    UPSCROLL                 YES,
         A     R0,NEXTROW               NO, ADD SCROLL AMOUNT          +
                                            FOR FORWARD SCROLLING
         B     SETROWNO
UPSCROLL DS    0H
         S     R0,NEXTROW               SUBTRACT SCROLL AMOUNT         +
                                        FOR BACKWARD SCROLLING
SETROWNO DS    0H
         ST    R0,NEXTROW               SAVE THE 1ST ROW OF SCROLLING

プログラムとしては正しいですが、符号だけが異なる同じ値の加減算であれば、±の符号を入れ替える方が少しスマートになります。引き算は補数の加算で実現できます。

         LH    R0,SCRAMONT              LOAD SCREEN SCROLL AMOUNT
         CLC   0(3,R1),=CL3'UP.'        BACKWARD SCROLL ?
         BNE   *+4+2                    NO,
         LCR   R0,R0                    YES, SET NEGATIVE VALUE
         A     R0,NEXTROW               ADD SCROLL AMOUNT              +
                                            FOR NEXT SCROLLING
         ST    R0,NEXTROW               SAVE THE 1ST ROW OF SCROLLING

2の補数はLCR命令で求めます。GR0に入っているのが正の整数と決まっていればLNR命令でも同じことですが、補数と言うことでLCRを使ってます。
アセンブラーに限らず、引き算は負の数の足し算と同じ、というようにいろいろ視点を変える発想ができると柔軟なプログラミングに繋がります。

Posted in MVS実践アセンブラー・プログラミング • • Top Of Page