MAIN   START
       LAD    GR1,ARG
       CALL   ZOOM       ;副プログラムの呼び出し
       RET
ARG    DC     ORG,PUT
ORG    DC     #1818,#1818,#DBDB,#FFFF
PUT    DS     16
       END
ZOOM   START             ;拡大 [c02.cas]
       RPUSH             ;汎用レジスタの退避
       LD     GR4,1,GR1  ;PUTのアドレス
       ST     GR4,LAST   ;終了アドレス
       LD     GR1,0,GR1  ;ORGのアドレス
       LAD    GR6,0      ;1回目、2回目
TOP    LD     GR0,0,GR1  ;ORGの値の取り出し [  a  ]
       CPA    GR6,=1     ;1回目か?
       JZE    RIGHT
       SRL    GR0,8      ;8ビット右シフト
RIGHT  SLL    GR0,8      ;8ビット左シフト
       LAD    GR2,8      ;ループカウンタ
       LAD    GR3,0      ;結果を保存する場所
B0     LAD    GR5,0      ;加算する値
       CPA    GR0,=0     ;符号ビットが0か? [  b  ]
       JZE    B2         ;終了
       JPL    B1         ;符号ビットが0
       LAD    GR5,1      ;加算する値
B1     SLL    GR3,1      ;左に論理シフト
       ADDA   GR3,GR5    ;GR5を加算
       SLL    GR3,1      ;左に論理シフト
       ADDA   GR3,GR5    ;GR5を加算 [  c  ]
       SLL    GR0,1      ;左に論理シフト
       SUBA   GR2,=1     ;カウントダウン
       JPL    B0
       JUMP   STORE
B2     SLA    GR2,1      ;2倍
       SLL    GR3,0,GR2  ;残りの2倍をシフト [  d  ]
STORE  ST     GR3,0,GR4  ;結果を保存
       ST     GR3,1,GR4  ;結果を保存
       LAD    GR4,2,GR4  ;次のアドレス
       XOR    GR6,=1     ;ビットの反転
       JPL    TOP        ;右8ビットの処理へ
       LAD    GR1,1,GR1  ;次のデータ
       CPL    GR1,LAST   ;終了判定
       JMI    TOP
       RPOP              ;汎用レジスタの復元
       RET
LAST   DS     1
       END