MVN 命令 (Block Move Negative Destination)
指定したバンクにあるデータを、指定したバンクへ移動します。

MVNオーバーロード
オペコード 構文 アドレッシングモード バイト数 命令サイクル
54
MVN src, dest
Block Move
 3
7n
1


1. 1バイトの転送につき7サイクルを要する
 
フラグ変化
--------

この命令はステータスフラグを変更しない。

解説
MVN命令は転送元のデータから見てマイナス方向へのデータ移動を行います。すなわち、転送元と転送先のアドレスを比較した場合、後者の方が小さくなる場合にMVN命令が使用されます。

MVN命令のオペランドは、転送元のデータバンクと転送先のデータバンクを指定し、また、A,X,Yそれぞれのレジスタの値に従ってアドレスと移動するデータサイズを指定します。
転送開始前にAレジスタには移動するデータサイズから1を減じた値を、Xレジスタには転送元のデータの開始アドレスを、そしてYレジスタには転送先の開始アドレスを指定します。
1回のMVN命令の実行で、Aレジスタは1デクリメント、X,Yレジスタは1インクリメントされ、1バイトを転送します。この操作には7サイクルの時間を要します。
そしてAレジスタがデクリメントの結果#$FFFFへとオーバーフローするまでMVN命令は反復実行されます。
このことからわかるように、MVN命令は指定されたデータの最初のバイトから順に移動を行います。

インデクスレジスタが8ビットモード(x = 1)になっている場合、またはエミュレーションモード時は、インデクスレジスタの上位バイトは0とされるため、0ページの範囲内に限って移動可能です。

実際にMVN命令を使用する場合は、次のように行います。MVN命令はデータバンクレジスタを変更するため、MVNの開始前に必ずデータバンクレジスタを退避する必要があります。

; MVP Sample

PHB			; DB -> Stack
LDA	#$000F		; Data size (16 bytes)
LDX	#$8000		; Source end address
LDY	#$0000		; Destination end address
MVN	$7E, $7F	; $7E:8000 - $7E:800F -> $7F:0000 - $7F:000F
PLB			; DB <- Stack 
参照