[プラス方向へブロック移動]
MVP と MVN 命令は、ユーザが調整することなく メモリ位置からメモリ位置へデータを移動する。
これら 2 つの命令は、負の方向へデータを移動する時には それ自身は上書きされない。
転送元アドレスは X レジスタから、 転送先アドレスは Y レジスタから取得する。 転送するデータの長さは、ステータスフラグの m の 設定に関わらず、アキュームレータから 16 ビット分取得する。 この値は、実際に転送する量より 1 バイト少ない値を指定する (a=$0000 だと、 1 バイト転送する)。
2 つのオペランドは、転送元 64K バンクと、 転送先 64K バンクを指定する。 アセンブラでは、転送元, 転送先の順でオペランドを書くが、 バイナリ出力コードでは、MVN の MVP オペコードは、 転送先バンクバイト, 転送元バンクバイトの順で配置される。
MVN は、転送元アドレスが転送先アドレスより大きい時に指定する。 逆に言えば、転送先範囲が、転送元範囲より低位にある時に指定する。
MVN 命令では、X,Y レジスタはアドレスの底を開始位置とする。 データは X から Y へ移動される。 X と Y はインクリメントされ、アキュームレータは $FFFF へ アンダーフローを起こすまでデクリメントされる。
MVP は、転送元アドレスが転送先アドレスより小さい時に指定する。 逆に言えば、転送先範囲が、転送元範囲より高位にある時に指定する。
MVP 命令では、X,Y レジスタはアドレスの天井を開始位置とする。 データは X から Y へ移動される。 X と Y はデクリメントされ、アキュームレータは $FFFF へ アンダーフローを起こすまでデクリメントされる。
インデックスレジスタが 8 ビットモード (x=1) になっているか、 プロセッサが 6502 エミュレーションモードになっている時、 上位バイトはデフォルト値として 0 が使われるので、 転送範囲はページ 0 の範囲に限られる。
サブルーチンでブロック移動命令を使い、 動的に MVP と MVN を切り替えるようにすることで コードサイズの削減が容易になる。
フラグ変化
なし
コード一覧
アドレッシングモード | 文法 | オペコード | バイト数 | 命令サイクル |
Block Move | MVP src,dest | 44 | 3 | * |
*1 バイト移動するごとに 7 サイクル要する