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