Transfers

Imagine the following situation: You're using the index register X and you'd like to increase it by #$40. There's INX which increases the value in X by one, but what about increasing it by $40? There's no opcode which increases the value in X by $40, but there is one which increases the value in A by $40. How do you get the value in X into A?

There are a series of opcodes for exactly that purpose, and they're called "transfers". There are a bunch of transfer opcodes, all starting with the letter T.

Transferring A, X and Y

There are opcodes which transfers the values between A, X and Y registers. All the combinations are possible:

Opcode

Full name

Explanation

TAX

Transfer A to X

Copies over the value of A to X

TAY

Transfer A to Y

Copies over the value of A to Y

TXA

Transfer X to A

Copies over the value of X to A

TXY

Transfer X to Y

Copies over the value of X to Y

TYA

Transfer Y to A

Copies over the value of Y to A

TYX

Transfer Y to X

Copies over the value of Y to X

The opcodes are self-explanatory. Here's an example of a transfer:

LDA #$45           ; A = $45
LDY #$99           ; Y = $99
TAY                ; A = $45, Y = $45

As you can see, the values are copied over to the target register.

8-bit and 16-bit mode

Transfers work as you'd expect when the source and target registers are both 16-bit mode. You transfer a 16-bit value, like so:

LDA #$4512         ; A = $4512
LDY #$9900         ; Y = $9900
TAY                ; A = $4512, Y = $4512

If you want to transfer an 8-bit register's value to a 16-bit register, the SNES looks at the target register's size, and transfers the value's low byte accordingly. Here's an example involving an 8-bit transfer to the 16-bit A register:

LDA #$4512         ; A = $4512
LDY #$99           ; Y = $0099
TYA                ; A = $4599, Y = $0099

Here's an example involving a 16-bit transfer to the 8-bit A register:

LDA #$45           ; A = $xx45
LDY #$99AA         ; Y = $99AA
TYA                ; A = $xxAA, Y = $99AA

In the second example, the xx could be anything. Remember that in the introduction of the A, X and Y registers, it's mentioned that the A register can actually be treated to be always 16-bit. The high byte isn't touched during the transfer, even if A is in 8-bit mode. If A was $1245 before the transfer, it'll be $12AA after the transfer. This doesn't apply to X and Y, as their high bytes are immediately cleared when they exit 16-bit mode.

Transferring general registers

There are other opcodes which involve the general SNES registers.

Opcode

Full name

Explanation

TCD

Transfer A to direct page register

Transfers the 16-bit value in A, to the direct page register, regardless of A being in 16-bit mode or not

TDC

Transfer direct page register to A

Transfer the 16-bit value in the direct page register to the A register, regardless of A being in 16-bit mode or not

TCS

Transfer A to stack pointer register

Transfers the 16-bit value in A to the stack pointer register, regardless of A being in 16-bit mode or not

TSC

Transfer stack pointer register to A

Transfers the 16-bit value in the stack pointer register to A, regardless of A being in 16-bit mode or not

TXS

Transfer X to stack pointer register

Transfers the 16-bit value in X to the stack pointer register, regardless of X being in 16-bit mode or not. Note that when X is in 8-bit mode, the high byte is always $00

TSX

Transfer stack pointer register to X

Transfers the 16-bit value in the stack pointer register to X. Note that when X is in 8-bit mode, the high byte stays $00 after the transfer

Last updated