![]() |
![]()
| ![]() |
![]()
NAME
DESCRIPTIONThis is the list of opcodes supported by rgbasm(1), including a short description, the number of bytes needed to encode them and the number of CPU cycles at 1MHz (or 2MHz in GBC double speed mode) needed to complete them. Note: All arithmetic and logic instructions that use register A as a destination can omit the destination, since it is assumed to be register A by default. So the following two lines have the same effect: OR A,B OR B Furthermore, the CPL instruction can take an optional A destination, since it can only be register A. So the following two lines have the same effect: CPL CPL A LEGENDList of abbreviations used in this document.
INSTRUCTION OVERVIEWLoad instructions8-bit arithmetic instructions16-bit arithmetic instructionsBitwise logic instructionsBit flag instructionsBit shift instructionsJumps and subroutine instructionsCarry flag instructionsStack manipulation instructionsInterrupt-related instructionsMiscellaneous instructionsINSTRUCTION REFERENCEADC A,r8Add the value in r8 plus the carry flag to A. Cycles: 1 Bytes: 1 Flags: ADC A,[HL]Add the byte pointed to by HL plus the carry flag to A. Cycles: 2 Bytes: 1 Flags: See ADC A,r8 ADC A,n8Add the value n8 plus the carry flag to A. Cycles: 2 Bytes: 2 Flags: See ADC A,r8 ADD A,r8Add the value in r8 to A. Cycles: 1 Bytes: 1 Flags: ADD A,[HL]Add the byte pointed to by HL to A. Cycles: 2 Bytes: 1 Flags: See ADD A,r8 ADD A,n8Add the value n8 to A. Cycles: 2 Bytes: 2 Flags: See ADD A,r8 ADD HL,r16Add the value in r16 to HL. Cycles: 2 Bytes: 1 Flags: ADD HL,SPAdd the value in SP to HL. Cycles: 2 Bytes: 1 Flags: See ADD HL,r16 ADD SP,e8Add the signed value e8 to SP. Cycles: 4 Bytes: 2 Flags: AND A,r8Set A to the bitwise AND between the value in r8 and A. Cycles: 1 Bytes: 1 Flags: AND A,[HL]Set A to the bitwise AND between the byte pointed to by HL and A. Cycles: 2 Bytes: 1 Flags: See AND A,r8 AND A,n8Set A to the bitwise AND between the value n8 and A. Cycles: 2 Bytes: 2 Flags: See AND A,r8 BIT u3,r8Test bit u3 in register r8, set the zero flag if bit not set. Cycles: 2 Bytes: 2 Flags: BIT u3,[HL]Test bit u3 in the byte pointed by HL, set the zero flag if bit not set. Cycles: 3 Bytes: 2 Flags: See BIT u3,r8 CALL n16Call address n16. This pushes the address of the instruction after the CALL on the stack, such that RET can pop it later; then, it executes an implicit JP n16. Cycles: 6 Bytes: 3 Flags: None affected. CALL cc,n16Call address n16 if condition cc is met. Cycles: 6 taken / 3 untaken Bytes: 3 Flags: None affected. CCFComplement Carry Flag. Cycles: 1 Bytes: 1 Flags: CP A,r8ComPare the value in A with the value in r8. This subtracts the value in r8 from A and sets flags accordingly, but discards the result. Cycles: 1 Bytes: 1 Flags: CP A,[HL]ComPare the value in A with the byte pointed to by HL. This subtracts the byte pointed to by HL from A and sets flags accordingly, but discards the result. Cycles: 2 Bytes: 1 Flags: See CP A,r8 CP A,n8ComPare the value in A with the value n8. This subtracts the value n8 from A and sets flags accordingly, but discards the result. Cycles: 2 Bytes: 2 Flags: See CP A,r8 CPLComPLement accumulator (A = ~A); also called bitwise NOT. Cycles: 1 Bytes: 1 Flags: DAADecimal Adjust Accumulator. Designed to be used after performing an arithmetic instruction (ADD, ADC, SUB, SBC) whose inputs were in Binary-Coded Decimal (BCD), adjusting the result to likewise be in BCD. The exact behavior of this instruction depends on the state of the subtract flag N:
Cycles: 1 Bytes: 1 Flags: DEC r8Decrement the value in register r8 by 1. Cycles: 1 Bytes: 1 Flags: DEC [HL]Decrement the byte pointed to by HL by 1. Cycles: 3 Bytes: 1 Flags: See DEC r8 DEC r16Decrement the value in register r16 by 1. Cycles: 2 Bytes: 1 Flags: None affected. DEC SPDecrement the value in register SP by 1. Cycles: 2 Bytes: 1 Flags: None affected. DIDisable Interrupts by clearing the IME flag. Cycles: 1 Bytes: 1 Flags: None affected. EIEnable Interrupts by setting the IME flag. The flag is only set after the instruction following EI. Cycles: 1 Bytes: 1 Flags: None affected. HALTEnter CPU low-power consumption mode until an interrupt occurs. The exact behavior of this instruction depends on the state of the
IME flag, and whether interrupts are pending (i.e. whether
‘
Cycles: - Bytes: 1 Flags: None affected. INC r8Increment the value in register r8 by 1. Cycles: 1 Bytes: 1 Flags: INC [HL]Increment the byte pointed to by HL by 1. Cycles: 3 Bytes: 1 Flags: See INC r8 INC r16Increment the value in register r16 by 1. Cycles: 2 Bytes: 1 Flags: None affected. INC SPIncrement the value in register SP by 1. Cycles: 2 Bytes: 1 Flags: None affected. JP n16Jump to address n16; effectively, copy n16 into PC. Cycles: 4 Bytes: 3 Flags: None affected. JP cc,n16Jump to address n16 if condition cc is met. Cycles: 4 taken / 3 untaken Bytes: 3 Flags: None affected. JP HLJump to address in HL; effectively, copy the value in register HL into PC. Cycles: 1 Bytes: 1 Flags: None affected. JR n16Relative Jump to address n16. The address is encoded as a signed 8-bit offset from the address
immediately following the JR Label ; no-op; encoded offset of 0 Label: JR Label ; infinite loop; encoded offset of -2 Cycles: 3 Bytes: 2 Flags: None affected. JR cc,n16Relative Jump to address n16 if condition cc is met. Cycles: 3 taken / 2 untaken Bytes: 2 Flags: None affected. LD r8,r8Copy (aka Load) the value in register on the right into the register on the left. Storing a register into itself is a no-op; however, some Game Boy emulators interpret LD B,B as a breakpoint, or LD D,D as a debug message (such as BGB). Cycles: 1 Bytes: 1 Flags: None affected. LD r8,n8Copy the value n8 into register r8. Cycles: 2 Bytes: 2 Flags: None affected. LD r16,n16Copy the value n16 into register r16. Cycles: 3 Bytes: 3 Flags: None affected. LD [HL],r8Copy the value in register r8 into the byte pointed to by HL. Cycles: 2 Bytes: 1 Flags: None affected. LD [HL],n8Copy the value n8 into the byte pointed to by HL. Cycles: 3 Bytes: 2 Flags: None affected. LD r8,[HL]Copy the value pointed to by HL into register r8. Cycles: 2 Bytes: 1 Flags: None affected. LD [r16],ACopy the value in register A into the byte pointed to by r16. Cycles: 2 Bytes: 1 Flags: None affected. LD [n16],ACopy the value in register A into the byte at address n16. Cycles: 4 Bytes: 3 Flags: None affected. LDH [n16],ACopy the value in register A into the byte at address n16, provided the address is between $FF00 and $FFFF. Cycles: 3 Bytes: 2 Flags: None affected. LDH [C],ACopy the value in register A into the byte at address $FF00+C. Cycles: 2 Bytes: 1 Flags: None affected. This is sometimes written as ‘ LD A,[r16]Copy the byte pointed to by r16 into register A. Cycles: 2 Bytes: 1 Flags: None affected. LD A,[n16]Copy the byte at address n16 into register A. Cycles: 4 Bytes: 3 Flags: None affected. LDH A,[n16]Copy the byte at address n16 into register A, provided the address is between $FF00 and $FFFF. Cycles: 3 Bytes: 2 Flags: None affected. LDH A,[C]Copy the byte at address $FF00+C into register A. Cycles: 2 Bytes: 1 Flags: None affected. This is sometimes written as ‘ LD [HLI],ACopy the value in register A into the byte pointed by HL and increment HL afterwards. Cycles: 2 Bytes: 1 Flags: None affected. This is sometimes written as ‘ LD [HLD],ACopy the value in register A into the byte pointed by HL and decrement HL afterwards. Cycles: 2 Bytes: 1 Flags: None affected. This is sometimes written as ‘ LD A,[HLD]Copy the byte pointed to by HL into register A, and decrement HL afterwards. Cycles: 2 Bytes: 1 Flags: None affected. This is sometimes written as ‘ LD A,[HLI]Copy the byte pointed to by HL into register A, and increment HL afterwards. Cycles: 2 Bytes: 1 Flags: None affected. This is sometimes written as ‘ LD SP,n16Copy the value n16 into register SP. Cycles: 3 Bytes: 3 Flags: None affected. LD [n16],SPCopy SP & $FF at address n16 and SP >> 8 at address n16 + 1. Cycles: 5 Bytes: 3 Flags: None affected. LD HL,SP+e8Add the signed value e8 to SP and copy the result in HL. Cycles: 3 Bytes: 2 Flags: LD SP,HLCopy register HL into register SP. Cycles: 2 Bytes: 1 Flags: None affected. NOPNo OPeration. Cycles: 1 Bytes: 1 Flags: None affected. OR A,r8Set A to the bitwise OR between the value in r8 and A. Cycles: 1 Bytes: 1 Flags: OR A,[HL]Set A to the bitwise OR between the byte pointed to by HL and A. Cycles: 2 Bytes: 1 Flags: See OR A,r8 OR A,n8Set A to the bitwise OR between the value n8 and A. Cycles: 2 Bytes: 2 Flags: See OR A,r8 POP AFPop register AF from the stack. This is roughly equivalent to the following imaginary instructions: LD F, [SP] ; See below for individual flags INC SP LD A, [SP] INC SP Cycles: 3 Bytes: 1 Flags: POP r16Pop register r16 from the stack. This is roughly equivalent to the following imaginary instructions: LD LOW(r16), [SP] ; C, E or L INC SP LD HIGH(r16), [SP] ; B, D or H INC SP Cycles: 3 Bytes: 1 Flags: None affected. PUSH AFPush register AF into the stack. This is roughly equivalent to the following imaginary instructions: DEC SP LD [SP], A DEC SP LD [SP], F.Z << 7 | F.N << 6 | F.H << 5 | F.C << 4 Cycles: 4 Bytes: 1 Flags: None affected. PUSH r16Push register r16 into the stack. This is roughly equivalent to the following imaginary instructions: DEC SP LD [SP], HIGH(r16) ; B, D or H DEC SP LD [SP], LOW(r16) ; C, E or L Cycles: 4 Bytes: 1 Flags: None affected. RES u3,r8Set bit u3 in register r8 to 0. Bit 0 is the rightmost one, bit 7 the leftmost one. Cycles: 2 Bytes: 2 Flags: None affected. RES u3,[HL]Set bit u3 in the byte pointed by HL to 0. Bit 0 is the rightmost one, bit 7 the leftmost one. Cycles: 4 Bytes: 2 Flags: None affected. RETReturn from subroutine. This is basically a POP PC (if such an instruction existed). See POP r16 for an explanation of how POP works. Cycles: 4 Bytes: 1 Flags: None affected. RET ccReturn from subroutine if condition cc is met. Cycles: 5 taken / 2 untaken Bytes: 1 Flags: None affected. RETIReturn from subroutine and enable interrupts. This is basically equivalent to executing EI then RET, meaning that IME is set right after this instruction. Cycles: 4 Bytes: 1 Flags: None affected. RL r8Rotate bits in register r8 left, through the carry flag. ┏━ Flags ━┓ ┏━━━━━━━ r8 ━━━━━━┓ ┌─╂─ C ←╂─╂─ b7 ← ... ← b0 ←╂─┐ │ ┗━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━━┛ │ └─────────────────────────────────┘ Cycles: 2 Bytes: 2 Flags: RL [HL]Rotate the byte pointed to by HL left, through the carry flag. ┏━ Flags ━┓ ┏━━━━━━ [HL] ━━━━━┓ ┌─╂─ C ←╂─╂─ b7 ← ... ← b0 ←╂─┐ │ ┗━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━━┛ │ └─────────────────────────────────┘ Cycles: 4 Bytes: 2 Flags: See RL r8 RLARotate register A left, through the carry flag. ┏━ Flags ━┓ ┏━━━━━━━ A ━━━━━━━┓ ┌─╂─ C ←╂─╂─ b7 ← ... ← b0 ←╂─┐ │ ┗━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━━┛ │ └─────────────────────────────────┘ Cycles: 1 Bytes: 1 Flags: RLC r8Rotate register r8 left. ┏━ Flags ━┓ ┏━━━━━━━ r8 ━━━━━━┓ ┃ C ←╂─┬─╂─ b7 ← ... ← b0 ←╂─┐ ┗━━━━━━━━━┛ │ ┗━━━━━━━━━━━━━━━━━┛ │ └─────────────────────┘ Cycles: 2 Bytes: 2 Flags: RLC [HL]Rotate the byte pointed to by HL left. ┏━ Flags ━┓ ┏━━━━━━ [HL] ━━━━━┓ ┃ C ←╂─┬─╂─ b7 ← ... ← b0 ←╂─┐ ┗━━━━━━━━━┛ │ ┗━━━━━━━━━━━━━━━━━┛ │ └─────────────────────┘ Cycles: 4 Bytes: 2 Flags: See RLC r8 RLCARotate register A left. ┏━ Flags ━┓ ┏━━━━━━━ A ━━━━━━━┓ ┃ C ←╂─┬─╂─ b7 ← ... ← b0 ←╂─┐ ┗━━━━━━━━━┛ │ ┗━━━━━━━━━━━━━━━━━┛ │ └─────────────────────┘ Cycles: 1 Bytes: 1 Flags: RR r8Rotate register r8 right, through the carry flag. ┏━━━━━━━ r8 ━━━━━━┓ ┏━ Flags ━┓ ┌─╂→ b7 → ... → b0 ─╂─╂→ C ─╂─┐ │ ┗━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━┛ │ └─────────────────────────────────┘ Cycles: 2 Bytes: 2 Flags: RR [HL]Rotate the byte pointed to by HL right, through the carry flag. ┏━━━━━━ [HL] ━━━━━┓ ┏━ Flags ━┓ ┌─╂→ b7 → ... → b0 ─╂─╂→ C ─╂─┐ │ ┗━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━┛ │ └─────────────────────────────────┘ Cycles: 4 Bytes: 2 Flags: See RR r8 RRARotate register A right, through the carry flag. ┏━━━━━━━ A ━━━━━━━┓ ┏━ Flags ━┓ ┌─╂→ b7 → ... → b0 ─╂─╂→ C ─╂─┐ │ ┗━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━┛ │ └─────────────────────────────────┘ Cycles: 1 Bytes: 1 Flags: RRC r8Rotate register r8 right. ┏━━━━━━━ r8 ━━━━━━┓ ┏━ Flags ━┓ ┌─╂→ b7 → ... → b0 ─╂─┬─╂→ C ┃ │ ┗━━━━━━━━━━━━━━━━━┛ │ ┗━━━━━━━━━┛ └─────────────────────┘ Cycles: 2 Bytes: 2 Flags: RRC [HL]Rotate the byte pointed to by HL right. ┏━━━━━━ [HL] ━━━━━┓ ┏━ Flags ━┓ ┌─╂→ b7 → ... → b0 ─╂─┬─╂→ C ┃ │ ┗━━━━━━━━━━━━━━━━━┛ │ ┗━━━━━━━━━┛ └─────────────────────┘ Cycles: 4 Bytes: 2 Flags: See RRC r8 RRCARotate register A right. ┏━━━━━━━ A ━━━━━━━┓ ┏━ Flags ━┓ ┌─╂→ b7 → ... → b0 ─╂─┬─╂→ C ┃ │ ┗━━━━━━━━━━━━━━━━━┛ │ ┗━━━━━━━━━┛ └─────────────────────┘ Cycles: 1 Bytes: 1 Flags: RST vecCall address vec. This is a shorter and faster equivalent to CALL for suitable values of vec. Cycles: 4 Bytes: 1 Flags: None affected. SBC A,r8Subtract the value in r8 and the carry flag from A. Cycles: 1 Bytes: 1 Flags: SBC A,[HL]Subtract the byte pointed to by HL and the carry flag from A. Cycles: 2 Bytes: 1 Flags: See SBC A,r8 SBC A,n8Subtract the value n8 and the carry flag from A. Cycles: 2 Bytes: 2 Flags: See SBC A,r8 SCFSet Carry Flag. Cycles: 1 Bytes: 1 Flags: SET u3,r8Set bit u3 in register r8 to 1. Bit 0 is the rightmost one, bit 7 the leftmost one. Cycles: 2 Bytes: 2 Flags: None affected. SET u3,[HL]Set bit u3 in the byte pointed by HL to 1. Bit 0 is the rightmost one, bit 7 the leftmost one. Cycles: 4 Bytes: 2 Flags: None affected. SLA r8Shift Left Arithmetically register r8. ┏━ Flags ━┓ ┏━━━━━━━ r8 ━━━━━━┓ ┃ C ←╂─╂─ b7 ← ... ← b0 ←╂─ 0 ┗━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━━┛ Cycles: 2 Bytes: 2 Flags: SLA [HL]Shift Left Arithmetically the byte pointed to by HL. ┏━ Flags ━┓ ┏━━━━━━ [HL] ━━━━━┓ ┃ C ←╂─╂─ b7 ← ... ← b0 ←╂─ 0 ┗━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━━┛ Cycles: 4 Bytes: 2 Flags: See SLA r8 SRA r8Shift Right Arithmetically register r8 (bit 7 of r8 is unchanged). ┏━━━━━━ r8 ━━━━━━┓ ┏━ Flags ━┓ ┃ b7 → ... → b0 ─╂─╂→ C ┃ ┗━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━┛ Cycles: 2 Bytes: 2 Flags: SRA [HL]Shift Right Arithmetically the byte pointed to by HL (bit 7 of the byte pointed to by HL is unchanged). ┏━━━━━ [HL] ━━━━━┓ ┏━ Flags ━┓ ┃ b7 → ... → b0 ─╂─╂→ C ┃ ┗━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━┛ Cycles: 4 Bytes: 2 Flags: See SRA r8 SRL r8Shift Right Logically register r8. ┏━━━━━━━ r8 ━━━━━━┓ ┏━ Flags ━┓ 0 ─╂→ b7 → ... → b0 ─╂─╂→ C ┃ ┗━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━┛ Cycles: 2 Bytes: 2 Flags: SRL [HL]Shift Right Logically the byte pointed to by HL. ┏━━━━━━ [HL] ━━━━━┓ ┏━ Flags ━┓ 0 ─╂→ b7 → ... → b0 ─╂─╂→ C ┃ ┗━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━┛ Cycles: 4 Bytes: 2 Flags: See SRL r8 STOPEnter CPU very low power mode. Also used to switch between GBC double speed and normal speed CPU modes. The exact behavior of this instruction is fragile and may interpret its second byte as a separate instruction (see the Pan Docs), which is why rgbasm(1) allows explicitly specifying the second byte (STOP n8) to override the default of $00 (a NOP instruction). Cycles: - Bytes: 2 Flags: None affected. SUB A,r8Subtract the value in r8 from A. Cycles: 1 Bytes: 1 Flags: SUB A,[HL]Subtract the byte pointed to by HL from A. Cycles: 2 Bytes: 1 Flags: See SUB A,r8 SUB A,n8Subtract the value n8 from A. Cycles: 2 Bytes: 2 Flags: See SUB A,r8 SWAP r8Swap the upper 4 bits in register r8 and the lower 4 ones. Cycles: 2 Bytes: 2 Flags: SWAP [HL]Swap the upper 4 bits in the byte pointed by HL and the lower 4 ones. Cycles: 4 Bytes: 2 Flags: See SWAP r8 XOR A,r8Set A to the bitwise XOR between the value in r8 and A. Cycles: 1 Bytes: 1 Flags: XOR A,[HL]Set A to the bitwise XOR between the byte pointed to by HL and A. Cycles: 2 Bytes: 1 Flags: See XOR A,r8 XOR A,n8Set A to the bitwise XOR between the value n8 and A. Cycles: 2 Bytes: 2 Flags: See XOR A,r8 SEE ALSOrgbasm(1), rgblink(1), rgbfix(1), rgbgfx(1), rgbasm-old(5), rgbds(7) HISTORYrgbasm(1) was originally written by Carsten Sørensen as part of the ASMotor package, and was later repackaged in RGBDS by Justin Lloyd. It is now maintained by a number of contributors at https://github.com/gbdev/rgbds.
|