; worm_zero.cas ; CASL2 で作成したコード自己複製プログラム。 ; コード自身が、メモリの下位から上位に向かって、自己複製を繰り返す。 ; プログラムブロック ;; 初期化部 ;; プログラム開始に必要な初期化を行う。 ;; コードを簡素化するために、メモリ参照は使用せず、すべてレジスタだけで実行できるようにした。 WORM START LD GR1,ONE ; GR1:定数1(インクリメントに使用する) LAD GR2,PRGBGN ; GR2:プログラム開始アドレス LAD GR3,PRGBGN ; GR3:プログラム複写元アドレス LAD GR4,PRGEND ; GR4:プログラム複写先アドレス LD GR5,OFFSET ; GR5:プログラムをコピーするためのオフセット ;; 自己複製部 PRGBGN LD GR0,0,GR3 ; 自己複製部の1ワード分をGR0にコピーする ST GR0,10,GR3 ; GR0から自己複製部の1ワード分を移動先(+10番地)にコピーする ADDA GR3,GR1 ; コピーアドレスをカウントアップ CPA GR3,GR4 ; 自己複製部の終了判定 JMI #0,GR2 ; 条件を満たすまで、PRGBGNへ LD GR2,GR4 ; プログラム終了アドレスを次の開始アドレスとする。 ADDA GR4,GR5 ; オフセット値を加え、次のプログラム終了アドレスとする。 PRGEND NOP ; 以下は、コードが自己複製されてくる領域になるので、NOPで埋めておく。 ; 定数ブロック ONE DC 1 OFFSET DC 10 DS 1024 END