CPY

From C64-Wiki
Jump to navigationJump to search

CPY (short for "ComPare Y") is the mnemonic for a machine language instruction which compares the contents of the Y index register against that of the specified operand by subtracting the latter from the former, and setting the negative and carry flags according to the result. Unlike SBC, the result of the subtraction is discarded rather than stored back into the register, which is thus unaffected by the CPY operation.

Usage[edit | edit source]

Main article: Comparisons in machine language

To compare integers in machine language, first use a comparison instruction such as CPY, CPX or CMP to compare the numbers, then "test" the result using a conditional branch instruction that acts on the carry and negative flags, i.e. BCC, BCS, BMI, or BPL:

  • If the compared values are unsigned integers, use BCC to branch if the contents of the Y index register is less than that of the memory address, and BCS to branch if the register holds a number equal to or larger than that in memory.
  • If the compared values are signed integers, use BMI to branch if the contents of the Y index register is less than that of the memory address, and BPL to branch if the register holds a number equal to or larger than that in memory.

Addressing modes[edit | edit source]

Opcode Addressing
mode
Assembler
format
Length
in bytes
Number of
cycles
Dec Hex
192 C0 Immediate CPY #nn 2 2
204 CC Absolute CPY nnnn 3 4
196 C4 Zeropage CPY nn 2 3

CPY supports 3 addressing modes, as shown in the table at right. In the assembler formats listed, nn represents a single-byte (8-bit) figure, and nnnn is a two-byte (16-bit) address.

CPU flags[edit | edit source]

CPY affects 3 of the CPU's status flags:

  • The negative status flag is set if the result is negative, i.e. has its most significant bit set.
  • The zero flag is set if the result is zero, or cleared if it is non-zero.
  • The carry flag is set or cleared depending on the result.