BMI

From C64-Wiki
Jump to navigationJump to search

BMI (short for "Branch if MInus") is the mnemonic for a machine language instruction which branches, or "jumps", to the address specified if, and only if the negative flag is set. If the negative flag is clear when the CPU encounters a BMI instruction, the CPU will continue at the instruction following the BMI rather than taking the jump.

BMI in comparisons[edit]

Main article: Comparisons in machine language

BMI and its "counterpart", BPL, are often used after a "compare" instruction (either CMP, CPX, or CPY) in conjunction with comparing signed 8-bit integers, like e.g.:

LDA NumA    Read the value "NumA"
CMP NumB    Compare against "NumB"
BPL Larger  Go to label "Larger" if "NumA" >= "NumB"
...         Execution continues here if "NumA" < "NumB"

For unsigned integers, this method fails if either NumA or NumB (not both) exceeds 127/$7F — instead, BCC and BCS should be used for greater than/less than-style comparisons of unsigned bytes.

Addressing mode[edit]

Opcode Addressing
mode
Assembler
format
Length
in bytes
Number of
cycles
Dec Hex
48 30 Relative BMI nn 2 2*

BMI only supports the Relative addressing mode, as shown in the table at right. In the assembler formats listed, nn is a one-byte (8-bit) relative address. The relative address is treated as a signed byte; that is, it shifts program execution to a location within a number of bytes ranging from -128 to 127, relative to the address of the instruction following the branch instruction.
The execution time for BMI is not a fixed value, but depends on the circumstances. The listed time is valid only in cases where BMI does not take the branch. If it does take the branch, execution takes one additional clock cycle. Furthermore, if the branching crosses a page boundary, yet another cycle must be added to the execution time listed.

CPU flags[edit]

BMI does not affect any of the CPU's status flags.