Official Western Design Center documents clearly outline the syntax as
mvn srcbk,dstbk and
mvp srcbk,dstbk, with full explanation that the
actual assembled bytecode is
$54 dstbk srcbk and
$44 dstbk srcbk respectively. I've always shrugged this off as "part of the little-endian aspect" (even though these are bytes and not words) and have never cared to get political about it -- there's an actual reason the bytecode is "reversed" even for this. WDC's official documentation for the MVN/MVP opcodes is:
Quote:
Assembler syntax for the block move instruction calls for the operand field to be coded as two addresses, source first, then destination – the more intuitive ordering, but the opposite of the actual operand order in the object code. The assembler strips the bank bytes from the addresses (ignoring the rest) and reverses them to object code order.
However, in the same document describing how to use MVN/MVP with actual code examples (stripped), we find this:
Quote:
... In the object code, the first byte following the opcode is the bank address of the destination and the second byte is the bank address of the source. But while this order provides microprocessor efficiency, assembler syntax has always been the more logical left to right, source to destination (TAY, for example, transfers the accumulator to the Y index register). As a result, the recommended assembler syntax is to follow the mnemonic first with a 24-bit source address then with a 24-bit destination address - or more commonly with labels representing code or data addresses. The assembler strips the bank byte from each address (ignoring the rest) and inserts them in the correct object code sequence. (Destination bank, source bank.) For example:
Code:
440102 MVP SOURCE, DEST move from bank of source(02) to bank of dest(01)
The bank byte of the label SOURCE is 02 while the bank byte of the label DEST is 01. As always, the assembler does the work of converting the more human-friendly assembly code to the correct object code format for the processor.
If the source and destination banks are not specified, some assemblers will provide a user-specified default bank value.
The assembler will translate the opcode to object code, then supply its bank value for both of the operand bytes:
Code:
440000 MVP
If either bank is different from the default value, both must be specified.
That statement compounded with the fact that (splitting hairs/nitpicking) the SNES CPU isn't from WDC, whatever syntax someone wants its their choice. I think if bass says it wants
mv{n,p} $src=$dst then fantastic and no problem.
The question then becomes: what, given the initial post, does "they don't work for some reason" mean
exactly?