UNPKG

@nataliapc/mcp-openmsx

Version:

Model context protocol server for openMSX automation and control

2,038 lines (1,476 loc) 49.4 kB
# Z80 detailed instruction set Source: [Z80 Heaven](http://z80-heaven.wikidot.com/instructions-set) Instructions index: ||||||||||| |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| | [ADC](#adc) | [ADD](#add) | [AND](#and) | [BIT](#bit) | [CALL](#call) | [CCF](#ccf) | [CP](#cp) | [CPD](#cpd) | [CPDR](#cpdr) | [CPI](#cpi) | | [CPIR](#cpir) | [CPL](#cpl) | [DAA](#daa) | [DEC](#dec) | [DI](#di) | [DJNZ](#djnz) | [EI](#ei) | [EX](#ex) | [EXX](#exx) | [HALT](#halt) | | [IM](#im) | [IN](#in) | [INC](#inc) | [IND](#ind) | [INDR](#indr) | [INI](#ini) | [INIR](#inir) | [JP](#jp) | [JR](#jr) | [LD](#ld) | | [LDD](#ldd) | [LDDR](#lddr) | [LDI](#ldi) | [LDIR](#ldir) | [NEG](#neg) | [NOP](#nop) | [OR](#or) | [OTDR](#otdr) | [OTIR](#otir) | [OUT](#out) | | [OUTD](#outd) | [OUTI](#outi) | [POP](#pop) | [PUSH](#push) | [RES](#res) | [RET](#ret) | [RETI](#reti) | [RETN](#retn) | [RL](#rl) | [RLA](#rla) | | [RLC](#rlc) | [RLCA](#rlca) | [RLD](#rld) | [RR](#rr) | [RRA](#rra) | [RRC](#rrc) | [RRCA](#rrca) | [RRD](#rrd) | [RST](#rst) | [SBC](#sbc) | | [SCF](#scf) | [SET](#set) | [SLA](#sla) | [SLL/SL1](#sllsl1) | [SRA](#sra) | [SRL](#srl) | [SUB](#sub) | [XOR](#xor) ||| --- ## ADC The sum of the two operands plus the carry flag (0 or 1) is calculated, and the result is written back into the first operand. ### Syntax adc a,op8 ;8 bit adc hl,op16 ;16 bit #### Allowed instructions adc a,a adc a,b adc a,c adc a,d adc a,e adc a,h adc a,l adc a,ixh adc a,ixl adc a,iyh adc a,iyl adc a,(hl) adc a,(ix+n) adc a,(iy+n) adc a,n ;(8-bit number) adc hl,bc adc hl,de adc hl,hl adc hl,sp ### Effects The `N` flag is reset, `P/V` is interpreted as overflow. The rest of the flags is modified by definition. In the case of 16-bit addition the `H` flag is undefined. ### Uses Multiple precision adding ### T-States `r` denotes 8-bit register. `rr` represents a two byte register pair: `BC`, `DE`, `HL`, `SP` a, r 4 a, X 7 a, (hl) 7 a, (ix+X) 19 a, (iy+X) 19 hl, rr 15 ### See also [ADD](#add), [DAA](#daa), [DEC](#dec), [INC](#inc), [SBC](#sbc), [SUB](#sub) ## ADD The values of the two operands are added together, and the result is written back to the first one. ### Syntax add a,op8 ;8 bits add op16,op16 ;16 bits #### Allowed instructions add a,a add a,b add a,c add a,d add a,e add a,h add a,l add a,ixh add a,ixl add a,iyh add a,ixl add a,(hl) add a,(ix+n) add a,(iy+n) add a,n ;8-bit constant add hl,bc add hl,de add hl,hl add hl,sp add ix,bc add ix,de add ix,ix add ix,sp add iy,bc add iy,de add iy,iy add iy,sp ### Effects #### 8-bit arithmetic `N` flag is reset, `P/V` is interpreted as overflow. Rest of flags modified by definition. #### 16-bit arithmetic preserves the `S`, `Z` and `P/V` flags, and `H` is undefined. Rest of flags modified by definition. ### Uses Obviously used to add two numbers together. However, you can add 16-bit numbers to sp, giving you control of where the stack pointer is pointing to. ### T-States `r` denotes 8-bit register. `rr` represents a two byte register pair: BC, DE, HL, SP r 4 X 7 (hl) 7 (ix+X) 19 (iy+X) 19 hl, rr 11 ix, rr 15 iy, rr 15 ### See Also [ADC](#adc), [DAA](#daa), [DEC](#dec), [INC](#inc), [SBC](#sbc), [SUB](#sub) ## AND `AND` is an instruction that takes an 8-bit input an compares it with the accumulator. It checks to see if both are set. If either one is reset, the resulting bit in the accumulator is zero. 0 and 0 result: 0 0 and 1 result: 0 1 and 0 result: 0 1 and 1 result: 1 ### Syntax and op8 #### Allowed Instructions and a and b and c and d and e and h and l and ixh and ixl and iyh and iyl and (hl) and (ix+n) and (iy+n) and n ;8 bit constant ### Effects `C` and `N` flags cleared, `P/V` is parity, rest are altered by definition. ### Uses The most important use of `AND` is in bit-masking. For more information on bit-masking, see here. ### T-States `r` denotes 8-bit register. r 4 X 7 (l) 7 (x+X) 19 (y+X) 19 ### See Also [BIT](#bit), [CCF](#ccf), [CPL](#cpl), [OR](#or), [RES](#res), [SCF](#scf), [SET](#set) ,[XOR](#xor) ## BIT Tests if the specified bit is set. ### Syntax bit n,op8 #### Allowed Instructions `n` can be any integer from [0,7]. It must be defined on compile time. bit n,a bit n,b bit n,c bit n,d bit n,e bit n,h bit n,l bit n,(hl) bit n,(ix+n) bit n,(iy+n) ### Effects Opposite of the n<sup>th</sup> bit is written into the `Z` flag. `C` is preserved, `N` is reset, `H` is set, and `S` and `P/V` are undefined. ld a,%00000001 bit 0,a ;would reset Z bit 1,a ;would set Z ### T-States `r` denotes 8-bit register. r 8 (hl) 12 (ix+X) 20 (iy+X) 20 ### See Also [AND](#and), [CCF](#ccf), [CP](#cp), [CPD](#cpd), [CPDR](#cpdr), [CPI](#cpi), [CPIR](#cpir), [CPL](#cpl), [OR](#or), [RES](#res), [SCF](#scf), [SET](#set), [XOR](#xor) ## CALL Pushes the address after the `CALL` instruction (`PC`+3) onto the stack and jumps to the label. Can also take conditions. ### Syntax call label ;unconditional call call cond.,label ;conditional call #### Allowed Instructions call label ;always calls call c,label ;calls if C flag is set call nc,label ;calls if C flag is reset call z,label ;calls if Z flag is set call nz,label ;calls if Z flag is reset call m,label ;calls if S flag is set call p,label ;calls if S flag is reset call pe,label ;calls if P/V is set call po,label ;calls if P/V is reset ### Effects Flags are preserved. ### Uses The most common use of `CALL` is to create routines that can be used multiple times. ### T-States `cc` is condition: `NZ`, `Z`, `NC`, `C`, `PO`, `PE`, `P`, `M` XX 17 condition-true condition-false cc,XX 17 10 ### See Also [BIT](#bit), [CP](#cp), [CPD](#cpd), [CPDR](#cpdr), [CPI](#cpi), [CPIR](#cpir), [DJNZ](#djnz), [JP](#jp), [JR](#jr), [RET](#ret) ## CCF Inverts the carry flag. ### Syntax ccf ### Effects Carry flag inverted. Also inverts `H` and clears `N`. Rest of the flags are preserved. ### T-States 4 t-states ### See Also [SCF](#scf) ## CP CP is a subtraction from A that doesn't update A, only the flags it would have set/reset if it really was subtracted. ### Syntax cp op8 `op8` is any one of the allowed inputs. #### Allowed instructions cp a cp b cp c cp d cp e cp h cp l cp ixh cp ixl cp iyh cp iyl cp (hl) cp (ix+n) cp (iy+n) cp n ;8 bit constant ### Effects `C`, `S`, and `Z` flags modified by definition `P/V` detects overflow ### Uses Here are some general rules on using `CP`: #### Unsigned If A == N, then `Z` flag is set. If A != N, then `Z` flag is reset. If A < N, then `C` flag is set. If A >= N, then `C` flag is reset. #### Signed If A == N, then `Z` flag is set. If A != N, then `Z` flag is reset. If A < N, then `S` and `P/V` are different. If A >= N, then `S` and `P/V` are the same. ### T-States `r` denotes 8-bit register. r 4 X 7 (hl) 7 (ix+X) 19 (iy+X) 19 ### See also [BIT](#bit), [CALL](#call), [CPD](#cpd), [CPDR](#cpdr), [CPI](#cpi), [CPIR](#cpir), [JP](#jp), [JR](#jr), [RET](#ret) ## CPD Multiple instructions combined into one. `CPD` does these things in this order: CP (HL) DEC HL DEC BC ### Syntax No operands. cpd ### Effects The carry is preserved, `N` is set and all the other flags are affected as defined. `P/V` denotes the overflowing of `BC`, while the `Z` flag is set if `A`=`(HL)` before `HL` is decreased. ### Uses See [`CPDR`](#cpdr) for potential uses. ### See Also [BIT](#bit), [CALL](#call), [CP](#cp), [CPDR](#cpdr), [CPI](#cpi), [CPIR](#cpir), [JP](#jp), [JR](#jr) ## CPDR Repeats `CPD` until either: BC=0 A=(HL) ### Syntax No operands. cpdr ### Effects The carry is preserved, `N` is set and all the other flags are affected as defined. `P/V` denotes the overflowing of `BC`, while the `Z` flag is set if `A`=`(HL)` before `HL` is decreased. ### Uses Say you want to find the last occurrence of 124 in the valid memory space: LD HL,0000h LD BC,0000h LD A,124 CPDR _Note: if you used CPIR it would find the first occurrence of 124 in the valid memory space._ ### T-States BC ≠ 0 and A ≠ (HL) 21 BC = 0 or A = (HL) 16 ### See Also [BIT](#bit), [CALL](#call), [CP](#cp), [CPD](#cpd), [CPI](#cpi), [CPIR](#cpir), [JP](#jp), [JR](#jr) ## CPI Multiple instructions combined into one. `CPI` does these things in this order: CP (HL) INC HL DEC BC ### Syntax No operands. cpi ### Effects The carry is preserved, `N` is set and all the other flags are affected as defined. `P/V` denotes the overflowing of `BC`, while the `Z` flag is set if `A`=`(HL)` before `HL` is decreased. ### Uses See [`CPIR`](#cpir) for one example use. ### T-States 16 t-states ### See Also [BIT](#bit), [CALL](#call), [CP](#cp), [CPD](#cpd), [CPDR](#cpdr), [CPIR](#cpir), [JP](#jp), [JR](#jr) ## CPIR Repeats `CPI` until either: BC=0 A=(HL) ### Syntax No operands. cpir ### Effects The carry is preserved, `N` is set and all the other flags are affected as defined. `P/V` denotes the overflowing of `BC`, while the `Z` flag is set if `A`=`(HL)` before `HL` is decreased. ### Uses If you want to find the first occurrence of 124 in the valid memory space: LD HL,0000h LD BC,0000h LD A,124 CPIR _Note: if you used CPDR it would find the last occurrence of 124 in the valid memory space._ ### T-States BC ≠ 0 and A ≠ (HL) 21 BC = 0 or A = (HL) 16 ### See Also [BIT](#bit), [CALL](#call), [CP](#cp), [CPD](#cpd), [CPDR](#cpdr), [CPI](#cpi), [JP](#jp), [JR](#jr) ## CPL CPL inverts all bits of A. ### Syntax cpl ### Effects Sets `H` and `N`, other flags are unmodified. ### Uses This instruction returns the same value as XORing A with $FF or subtracting A from $FF. Also, `CPL` \ `INC A` returns the same value that `NEG` does. ### T-States 4 t-states ### See Also [NEG](#neg), [XOR](#xor) ## DAA When this instruction is executed, the `A` register is BCD corrected using the contents of the flags. The exact process is the following: if the least significant four bits of `A` contain a non-BCD digit (i. e. it is greater than 9) or the `H` flag is set, then $06 is added to the register. Then the four most significant bits are checked. If this more significant digit also happens to be greater than 9 or the `C` flag is set, then $60 is added. ### Syntax dda ### Effects If the second addition was needed, the `C` flag is set after execution, otherwise it is reset. The `N` flag is preserved, `P/V` is parity and the others are altered by definition. ### T-States 4 t-states ### See Also [ADC](#adc), [ADD](#add), [DEC](#dec), [INC](#inc), [SBC](#sbc), [SUB](#sub) ## DEC Decreases operand by one. ### Syntax dec op8 ;8 bits dec op16 ;16 bits #### Allowed Instructions dec a dec b dec c dec d dec e dec h dec l dec ixh dec ixl dec iyh dec iyl dec (hl) dec (ix+n) dec (iy+n) dec bc dec de dec hl dec ix dec iy dec sp ### Effects #### 8 Bits `C` flag preserved, `P/V` detects overflow and rest modified by definition. #### 16 Bits No flags altered. ### T-States `r` denotes 8-bit register. `rr` represents a two byte register pair: `BC`, `DE`, `HL`, `SP` r 4 (hl) 11 (ix+X) 23 (iy+X) 23 rr 6 ix 10 iy 10 ### See Also [ADC](#adc), [ADD](#add), [DAA](#daa), [INC](#inc), [SBC](#sbc), [SUB](#sub) ## DI Disables the interrupts (both mode 1 and mode 2). ### Syntax di ### Effects Flags preserved. ### Uses Useful if you want to use the `IY` register or shadow registers, which are modified by the OS's interrupts. Be sure to reset `IY` to flags before returning to the OS. ld iy,flags ### T-States 4 t-states ### See Also [EI](#ei), [HALT](#halt), [IM](#im), [RETI](#reti), [RETN](#retn), [RST](#rst) ## DJNZ Decreases `B` and jumps to a label if not zero. Note that `DJNZ` does a relative jump, so it can only jump between 128 bytes back/ahead. ### Syntax djnz label ### Effects Preserves all flags. ### Uses `DJNZ` is a very useful instruction when it comes to creating loops. See Control Structures to find out more about loops. ### T-States B ≠ 0 13 B = 0 8 ### See Also [CALL](#call), [JP](#jp), [JR](#jr) ## EI Enables the interrupts. ### Syntax ei ### Effects Flags preserved. ### Uses Can either be set to interrupt mode 1 (OS interrupts) or interrupt mode 2 using `IM`. Be sure to re-enable interrupt mode 1 before returning to the OS. ### T-States 4 t-states ### See Also [DI](#di), [HALT](#halt), [IM](#im), [RETI](#reti), [RETN](#retn), [RST](#rst) ## EX Exchanges two 16-bit values. ### Syntax ex op16,op16 #### Allowed Instructions ex af,af' ex de,hl ex (sp),hl ex (sp),ix ex (sp),iy ### Effects Flags are preserved. ### Uses `EX DE,HL` exchanges `HL` with `DE`. Note that `IX` and `IY` do not work with this command. `EX (SP),HL` exchanges `HL` with the last pushed value on the stack. `EX AF,AF'` exchanges `AF` with its shadow register. This is mostly used as an alternative to pushing `AF` to the stack during interrupts. Note that the flags will most likely not be the same after this command. ### T-States de, hl 4 af, af' 4 (sp),hl 19 (sp),ix 19 (sp),iy 19 ### See Also [EXX](#exx) ## EXX Exchanges `BC`, `DE`, and `HL` with shadow registers `BC'`, `DE'`, and `HL'`. ### Syntax exx ### Effects All flags preserved. ### Uses Most useful in interrupts as an alternative to saving those registers on the stack. If you want to use this command outside an interrupt, make sure interrupts are disabled first. ### T-States 4 t-states ### See Also [DI](#di), [EI](#ei), [EX](#ex), [HALT](#halt), [IM](#im), [RETI](#reti), [RETN](#retn) ## HALT Suspends all actions until the next interrupt. _Note: Since halt does wait for the next interrupt, if you disable interrupts halt will run forever, resulting in a crash. Make sure that you always either know the interrupts will be on, or turn it on right before you use the halt instruction._ ### Syntax halt ### Effects All flags preserved. ### Uses Exactly what it says: if you need a delay, halt will provide a split second delay. You can chain halts ### T-States 4 t-states ### See Also [DI](#di), [EI](#ei), [NOP](#nop) ## IM Sets the interrupt mode. ### Modes #### Mode 0 Not used by TI calculators, but means that an external device plugged into a z80 device generates the interrupt. #### Mode 1 Interrupts are generated by the internal circuitry of the processor (aka the OS). The frequency of these interrupts is 200 per second on a ZX Spectrum, and 50(PAL)/60(NTSC) on a MSX, but it depends on the state of the batteries in the case of TI calculators (probably varies between 100 and 150). Every time an interrupt is encountered, the OS performs an RST $28. #### Mode 2 Allows user to determine when an interrupt happens, and what the interrupt does. For more information on interrupts, see this page. ### Syntax im 0 ;will compile, but could result in a crash im 1 im 2 ### Effects All flags are preserved. ### Uses The most important use of `IM` is to allow for the programmer to create their own interrupts that can do whatever they want them to, when they want the interrupts to occur. For more information on how interrupts work, see this page. ### T-States 8 t-states for each mode ### See Also [DI](#di), [EI](#ei), [RETI](#reti), [RETN](#retn), [RST](#rst) ## IN Reads a value from a hardware port. ### Syntax in op8,(op8) #### Allowed Instructions in a,(n) ;8-bit constant in a,(c) in b,(c) in c,(c) in d,(c) in e,(c) in h,(c) in l,(c) in (c) ;undocumented command ### Effects #### IN A,(N) This command alters no flags. #### Others `N` flag reset, `P/V` represents parity, `C` flag preserved, all other flags affected by definition. ### Uses This command, along with `OUT`, is used for hardware interfacing. The undocumented command `IN (C)` reads from the port and affects flags, but does not store the value to a register. ### T-States `r` denotes 8-bit register. A, X 11 r, (C) 12 ### See Also [IND](#ind), [INDR](#indr), [INI](#ini), [INIR](#inir), [OUT](#out), [OUTD](#outd), [OTDR](#otdr), [OUTI](#outi), [OTIR](#otir) ## INC Increases operand by 1. ### Syntax inc op8 ;8 bits inc op16 ;16 bits #### Allowed Instructions inc a inc b inc c inc d inc e inc h inc l inc ixh inc ixl inc iyh inc iyl inc (hl) inc (ix+n) inc (iy+n) inc bc inc de inc hl inc ix inc iy inc sp ### Effects #### 8 Bits Preserves `C` flag, `N` flag is reset, `P/V` detects overflow and rest are modified by definition. #### 16 Bits No flags altered. ### T-States `r` denotes 8-bit register. `rr` represents a two byte register pair: `BC`, `DE`, `HL`, `SP` r 4 (hl) 11 (ix+X) 23 (iy+X) 23 rr 6 ix 10 iy 10 ### See Also [ADC](#adc), [ADD](#add), [DAA](#daa), [DEC](#dec), [SBC](#sbc), [SUB](#sub) ## IND Reads the `(C)` port and writes the result to `(HL)`, then decrements `HL` and decrements `B`. ### Syntax ind ### Effects `C` is preserved, the `N` flag is set. `S`, `H` and `P/V` are undefined. `Z` is set if `B` becomes zero after decrementing, otherwise it is reset. ### T-States 16 t-states ### See Also [IN](#in), [INI](#ini), [INDR](#indr), [INIR](#inir), [OTDR](#otdr), [OTIR](#otir), [OUT](#out), [OUTD](#outd), [OUTI](#outi) ## INDR Reads the `(C)` port and writes the result to `(HL)`. `HL` and `B` are decremented. Repeats until `B` = 0. ### Syntax indr ### Effects `Z` is set, carry is preserved, `N` is set, `S`, `H`, and `P/V` are undefined. ### Uses ### T-States B = 0 16 B ≠ 0 21 ### See Also [IN](#in), [IND](#ind), [INI](#ini), [INIR](#inir), [OUT](#out), [OUTD](#outd), [OTDR](#otdr), [OUTI](#outi), [OTIR](#otir) ## INI Reads the `(C)` port and writes the result to `(HL)`, then increments `HL` and decrements `B`. ### Syntax ini ### Effects `C` is preserved, the `N` flag is reset. `S`, `H` and `P/V` are undefined. `Z` is set if `B` becomes zero after decrementing, otherwise it is reset. ### T-States 16 t-states ### See Also [IN](#in), [IND](#ind), [INDR](#indr), [INIR](#inir), [OTDR](#otdr), [OTIR](#otir), [OUT](#out), [OUTD](#outd), [OUTI](#outi) ## INIR Reads from the `(C)` port, then writes to `(HL)`. `HL` is incremented and `B` is decremented. Repeats until `B` = 0. ### Syntax inir ### Effects `Z` is set, `C` is reset, `N` is reset, `S`, `H`, and `P/V` are undefined. ### T-States B = 0 16 B ≠ 0 21 ### See Also [IN](#in), [IND](#ind), [INDR](#indr), [INI](#ini), [OUT](#out), [OUTD](#outd), [OTDR](#otdr), [OUTI](#outi), [OTIR](#otir) ## JP Absolute jumps to the address. Can be conditional or unconditional. `JP` takes one more byte than `JR`, but is also slightly faster, so decide whether speed or size is more important before choosing `JP` or `JR`. `JP (HL)`, `JP (IX)`, and `JP (IY)` are unconditional and are the fastest jumps, and do not take more bytes than other jumps. ### Syntax jp nn ;unconditional jump jp cond.,nn ;conditional jump jp (reg16) ;HL, IX and IY only #### Allowed Instructions ;Constants jp nn ;no condition jp c,nn ;jumps if C is set jp nc,nn ;jumps if C is reset jp z,nn ;jumps if Z is set jp nz,nn ;jumps if Z is reset jp m,nn ;jumps if S is set jp p,nn ;jumps if S is reset jp pe,nn ;jumps if P/V is set jp po,nn ;jumps if P/V is reset ;HL points to address jp (hl) ;IX points to address jp (ix) ;IY points to address jp (iy) ### Effects All flags preserved. ### T-States `cc` is condition: `NZ`, `Z`, `NC`, `C`, `PO`, `PE`, `P`, `M` XX 10 cc,XX 10 (hl) 4 (ix) 8 (iy) 8 ### See Also [BIT](#bit), [CALL](#call), [CP](#cp), [CPD](#cpd), [CPDR](#cpdr), [CPI](#cpi), [CPIR](#cpir), [DJNZ](#djnz), [JR](#jr) ## JR Relative jumps to the address. This means that it can only jump between 128 bytes ahead or behind. Can be conditional or unconditional. `JR` takes up one less byte than `JP`, but is also slower. Weigh the needs of the code at the time before choosing one over the other (speed vs. size). ### Syntax jr nn ;unconditional jump jr cond.,nn ;conditional jump #### Allowed Instructions ;Constants jr nn ;no condition jr c,nn ;jumps if C is set jr nc,nn ;jumps if C is reset jr z,nn ;jumps if Z is set jr nz,nn ;jumps if Z is reset ### Effects All flags preserved. ### T-States `cc` is condition: `NZ`, `Z`, `NC`, `C` XX 12 condition-true condition-false cc,XX 12 7 ### See Also [BIT](#bit), [CALL](#call), [CP](#cp), [CPD](#cpd), [CPDR](#cpdr), [CPI](#cpi), [CPIR](#cpir), [DJNZ](#djnz), [JP](#jp) ## LD The `LD` instruction is used to put the value from one place into another place. ### Syntax ld N,M puts `M` into `N`. #### Allowed instructions (across: `M` Down: `N`) If x, it means allowed. If empty, it means not allowed. | | A | B | C | D | E | H | L | I | R | IXH | IXL | IYH | IYL | BC | DE | HL | SP | IX | IY | (BC) | (DE) | (HL) | (IX+N) | (IY+N) | N | NN | (NN) | |-||||||||||--|--|--|--|-|-|-|-|-|-||||--|--||-|-- | | A | x | x | x | x | x | x | x | x | x | x | x | x | x | | | | | | | x | x | x | x | x | x | | x | | B | x | x | x | x | x | x | x | | | x | x | x | x | | | | | | | | | x | x | x | x | | | | C | x | x | x | x | x | x | x | | | x | x | x | x | | | | | | | | | x | x | x | x | | | | D | x | x | x | x | x | x | x | | | x | x | x | x | | | | | | | | | x | x | x | x | | | | E | x | x | x | x | x | x | x | | | x | x | x | x | | | | | | | | | x | x | x | x | | | | H | x | x | x | x | x | x | x | | | | | | | | | | | | | | | x | x | x | x | | | | L | x | x | x | x | x | x | x | | | | | | | | | | | | | | | x | x | x | x | | | | I | x | | | | | | | | | | | | | | | | | | | | | | | | | | | | R | x | | | | | | | | | | | | | | | | | | | | | | | | | | | | IXH | x | x | x | x | x | | | | | x | x | | | | | | | | | | | | | | x | | | | IXL | x | x | x | x | x | | | | | x | x | | | | | | | | | | | | | | x | | | | IYH | x | x | x | x | x | | | | | | | x | x | | | | | | | | | | | | x | | | | IYL | x | x | x | x | x | | | | | | | x | x | | | | | | | | | | | | x | | | | BC | | | | | | | | | | | | | | | | | | | | | | | | | | x | x | | DE | | | | | | | | | | | | | | | | | | | | | | | | | | x | x | | HL | | | | | | | | | | | | | | | | | | | | | | | | | | x | x | | SP | | | | | | | | | | | | | | | | x | | x | x | | | | | | | x | x | | IX | | | | | | | | | | | | | | | | | | | | | | | | | | x | x | | IY | | | | | | | | | | | | | | | | | | | | | | | | | | x | x | | (BC) | x | | | | | | | | | | | | | | | | | | | | | | | | | | | | (DE) | x | | | | | | | | | | | | | | | | | | | | | | | | | | | | (HL) | x | x | x | x | x | x | x | | | | | | | | | | | | | | | | | | x | | | | (IX+N)| x | x | x | x | x | x | x | | | | | | | | | | | | | | | | | | x | | | | (IY+N)| x | x | x | x | x | x | x | | | | | | | | | | | | | | | | | | x | | | | (NN) | x | | | | | | | | | | | | | x | x | x | x | x | x | | | | | | | | | ### Effects No flags are altered except in the cases of the `I` or `R` registers. In those cases, `C` is preserved, `H` and `N` are reset, and alters `Z` and `S`. `P/V` is set if interrupts are enabled, reset otherwise. ### Uses Use to load numbers into operands. They can either be numbers used in the code (usually 8-bits), or labels (usually 16-bits). ld b,$05 ;Counter ld hl,var ;Variable label ld a,(var) ;Write data to var ### T-States `r` denotes 8-bit register. `rr` represents a two byte register pair: `BC`, `DE`, `HL`, `SP` r, r' 4 r,X 7 r,(hl) 7 r,(ix+X) 19 r,(iy+X) 19 a, (bc) 7 a, (de) 7 a, (XX) 13 (bc),a 7 (de),a 7 (XX),a 13 a, i 9 a, r 9 i, a 9 r, a 9 a, (BC) 7 (XX), a 13 rr,XX 10 ix, XX 14 iy, XX 14 hl, (XX) 20 ix, (XX) 20 iy, (XX) 20 (XX), hl 20 (XX), rr 20 (XX), ix 20 (XX), iy 20 sp, hl 6 sp, ix 10 sp, iy 10 ### See Also [LDD](#ldd), [LDDR](#lddr), [LDI](#ldi), [LDIR](#ldir) ## LDD Does a sort of `LD (DE),(HL)`, then decrements `DE`, `HL`, and `BC`. ### Syntax ldd ### Effects `P/V` is reset in case of overflow (if `BC`=0 after calling `LDD`). ### Uses Used when you want to copy over the data pointed to by `HL` to the location pointed to by `DE`. ### T-States 16 t-states ### See Also [LD](#ld), [LDDR](#lddr), [LDI](#ldi), [LDIR](#ldir) ## LDDR Repeats the instruction `LDD` (Does a `LD (DE),(HL)` and decrements each of `DE`, `HL`, and `BC`) until `BC`=0. Note that if `BC`=0 before the start of the routine, it will try loop around until `BC`=0 again. ### Syntax lddr ### Effects `P/V` is reset. ### Uses Copying over sections of data. ### T-States BC ≠ 0 21 BC = 0 16 ### See Also [LD](#ld), [LDD](#ldd), [LDI](#ldi), [LDIR](#ldir) ## LDI Performs a `LD (DE),(HL)`, then increments `DE` and `HL`, and decrements `BC`. ### Syntax ldi ### Effects `P/V` is reset in case of overflow (if `BC`=0 after calling `LDI`). ### Uses Copying data. ### T-States 16 t-states ### See Also [LD](#ld), [LDD](#ldd), [LDDR](#lddr), [LDIR](#ldir) ## LDIR Repeats `LDI` (`LD (DE),(HL)`, then increments `DE`, `HL`, and decrements `BC`) until `BC`=0. Note that if `BC`=0 before this instruction is called, it will loop around until `BC`=0 again. ### Syntax ldir ### Effects `P/V` is reset. ### Uses Copying sections of data. ### T-States BC ≠ 0 21 BC = 0 16 ### See Also [LD](#ld), [LDD](#ldd), [LDDR](#lddr), [LDI](#ldi) ## NEG `NEG` negates the accumulator. ### Syntax neg ### Effects `N` flag is set, all other flags modified by definition. ### Uses This command literally subtracts `A` from 0. This explains what "modified by definition" means in the _Effects_ section above. ### T-States 8 t-states ### See Also [CPL](#cpl), [SUB](#sub) ## NOP `NOP` does nothing for 4 clock cycles. ### Syntax nop ### Effects All flags preserved. ### Uses Useful for a short time waster (for example, it's common to put clock cycles between output and input ports). ### T-States 4 t-states ### See Also [HALT](#halt) ## OR `OR` is an instruction that takes an 8-bit input an compare sit with the accumulator. It checks to see if anything is set, and if neither are set, it results in a zero. 0 or 0 result: 0 0 or 1 result: 1 1 or 0 result: 1 1 or 1 result: 1 ### Syntax or op8 #### Allowed Instructions or a or b or c or d or e or h or l or ixh or ixl or iyh or iyl or (hl) or (ix+n) or (iy+n) or n ;8 bit constant ### Effects `C` and `N` flags cleared, `P/V` detects parity, and rest are modified by definition. ### Uses Used in bit-masking. For more information see here. ### T-States `r` denotes 8-bit register. r 4 X 7 (hl) 7 (ix+X) 19 (iy+X) 19 ### See Also [AND](#and), [BIT](#bit), [CCF](#ccf), [CPL](#cpl), [RES](#res), [SCF](#scf), [SET](#set), [XOR](#xor) ## OTDR Reads from `(HL)` and writes to the `(C)` port. `HL` and `B` are then decremented. Repeats until `B` = 0. ### Syntax otdr ### Effects `C` is preserved, `Z` is set, `N` is set, `S`, `H`, and `P/V` are undefined. ### T-States B = 0 16 B ≠ 0 21 ### See Also [IN](#in), [IND](#ind), [INDR](#indr), [INI](#ini), [INIR](#inir), [OUT](#out), [OUTD](#outd), [OUTI](#outi), [OTIR](#otir) ## OTIR Reads from `(HL)` and writes to the `(C)` port. `HL` is incremented and `B` is decremented. Repeats until `B` = 0. ### Syntax otir ### Effects `Z` is set, `C` is preserved, `N` is reset, `H`, `S`, and `P/V` are undefined. ### T-States B = 0 16 B ≠ 0 21 ### See Also [IN](#in), [IND](#ind), [INDR](#indr), [INI](#ini), [INIR](#inir), [OUT](#out), [OUTD](#outd), [OTDR](#otdr), [OUTI](#outi) ## OUT Writes the value of the second operand into the port given by the first operand. ### Syntax out (imm8),a out (c),reg8 #### Allowed Instructions out (imm8),a out (c),a out (c),b out (c),c out (c),d out (c),e out (c),h out (c),l out (c),0 ;Zero. Note: Undocumented ### Effects All flags preserved ### T-States `r` denotes 8-bit register. A, X 11 r, (C) 12 ### See Also [IN](#in), [IND](#ind), [INDR](#indr), [INI](#ini), [INIR](#inir), [OUTD](#outd), [OTDR](#otdr), [OUTI](#outi), [OTIR](#otir) ## OUTD Writes the value from `(HL)` to the `(C)` port, then decrements `B` and `HL`. ### Syntax outd ### Effects `C` is preserved, `N` is set, `H`, `S`, and `P/V` are undefined. `Z` is set only if `B` becomes zero after decrement, otherwise it is reset. ### T-States 16 t-states ### See Also [IN](#in), [IND](#ind), [INDR](#indr), [INI](#ini), [INIR](#inir), [OUT](#out), [OTDR](#otdr), [OUTI](#outi), [OTIR](#otir) ## OUTI Reads from `(HL)` and writes to the `(C)` port. `HL` is then incremented, and `B` is decremented. ### Syntax outi ### Effects `C` is preserved, `N` is reset, `H`, `S`, and `P/V` are undefined. `Z` is set only if `B` becomes zero after decrement, otherwise it's reset. ### Uses ### T-States 16 t-states ### See Also [IN](#in), [IND](#ind), [INDR](#indr), [INI](#ini), [INIR](#inir), [OUT](#out), [OUTD](#outd), [OTDR](#otdr), [OTIR](#otir) ## POP Copies the two bytes from `(SP)` into the operand, then increases `SP` by 2. ### Syntax pop reg16 #### Allowed Instructions pop af pop bc pop de pop hl pop ix pop iy ### Effects Flags are unaffected except when popping `AF`. ### Uses Used for retrieving values saved on the stack. Also used when you want to load a 16-bit register into another 16-bit register (the `LD` instruction won't work for this). ### T-States `rr` represents a two byte register pair: `BC`, `DE`, `HL`, `SP` rr 10 ix 14 iy 14 ### See Also [PUSH](#push) ## PUSH Copies the operand into `(SP)`, then decrements `SP` by 2. ### Syntax push reg16 #### Allowed Instructions push af push bc push de push hl push ix push iy ### Effects Flags are unaffected. ### Uses Used for saving register values onto the stack. Also used when you want to load a 16-bit register into another 16-bit register (the `LD` instruction won't work for this). ### T-States `rr` represents a two byte register pair: `BC`, `DE`, `HL`, `SP` rr 11 ix 15 iy 15 ### See Also [POP](#pop) ## RES Resets the specified bit to zero. ### Syntax res n,op8 #### Allowed Instructions `n` can be any integer from [0,7]. It must be defined on compile time. res n,a res n,b res n,c res n,d res n,e res n,h res n,l res n,(hl) res n,(ix+n) res n,(iy+n) ### Effects Flags are preserved. ### T-States `r` denotes 8-bit register. r 8 (hl) 15 (ix+X) 23 (iy+X) 23 ### See Also [AND](#and), [BIT](#bit), [CCF](#ccf), [CPL](#cpl), [OR](#or), [SCF](#scf), [SET](#set), [XOR](#xor) ## RET Pops the top of the stack into the program counter. Note that `RET` can be either conditional or unconditional. ### Syntax ret ;no conditions ret cond. ;conditional #### Allowed Instructions ret z ; Z flag is set ret nz ; Z flag is reset ret c ; Carry flag is set ret nc ; Carry flag is reset ret m ; S flag is set ret p ; S flag is reset ret pe ; P/V is set ret po ; P/V is reset ### Effects Preserves all flags. ### Uses `RET` is used mostly for exiting an assembly program or returning from a routine. ### T-States `cc` is condition: `NZ`, `Z`, `NC`, `C`, `PO`, `PE`, `P`, `M` ret 10 condition-true condition-false ret cc 11 5 ### See Also [BIT](#bit), [CALL](#call), [CP](#cp), [CPD](#cpd), [CPDR](#cpdr), [CPI](#cpi), [CPIR](#cpir), [RETI](#reti), [RETN](#retn) ## RETI Returns from an interrupt routine. Note: `RETI` cannot use return conditions. ### Syntax reti ### Effects All flags unaffected. ### T-States 14 t-states ### See Also [DI](#di), [EI](#ei), [IM](#im), [RET](#ret), [RETN](#retn), [RST](#rst) ## RETN Returns from the non-maskable interrupt (NMI). Cannot take return conditions. ### Syntax retn ### Effects All flags unaffected. ### T-States 14 t-states ### See Also [DI](#di), [EI](#ei), [IM](#im), [RET](#ret), [RETI](#reti), [RST](#rst) ## RL 9-bit rotation to the left. The register's bits are shifted left. The carry value is put into 0<sup>th</sup> bit of the register, and the leaving 7th bit is put into the carry. ### Syntax rl op8 #### Allowed Instructions rl a rl b rl c rl d rl e rl h rl l rl (hl) rl (ix+n) rl (iy+n) ### Effects `C` is changed to the leaving 7th bit, `H` and `N` are reset, `P/V` is parity, `S` and `Z` are modified by definition. ### T-States `r` denotes 8-bit register. r 8 (hl) 15 (ix+X) 23 (iy+X) 23 ### See Also [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## RLA Performs an `RL A`, but is much faster and `S`, `Z`, and `P/V` flags are preserved. ### Syntax rla ### Effects `C` is changed to the leaving 7th bit, `H` and `N` are reset, `P/V`, `S` and `Z` are preserved. ### T-States 4 t-states ### See Also [RL](#rl), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## RLC 8-bit rotation to the left. The bit leaving on the left is copied into the carry, and to bit 0. ### Syntax rlc op8 #### Allowed Instructions rlc a rlc b rlc c rlc d rlc e rlc h rlc l rlc (hl) rlc (ix+n) rlc (iy+n) ### Effects `H` and `N` flags are reset, `P/V` is parity, `S` and `Z` are modified by definition. ### T-States `r` denotes 8-bit register. r 8 (hl) 15 (ix+X) 23 (iy+X) 23 ### See Also [RL](#rl), [RLA](#rla), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## RLCA Performs `RLC A` much quicker, and modifies the flags differently. ### Syntax rlca ### Effects `S`, `Z`, and `P/V` are preserved, `H` and `N` flags are reset. ### T-States 4 t-states ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## RLD Performs a 4-bit leftward rotation of the 12-bit number whose 4 most significant bits are the 4 least significant bits of A, and its 8 least significant bits are in (HL). ; assume W,X,Y,Z are the set of all possible hex values 0-F ld a,$WX ld (hl),$YZ rld ; A = $WY ; (HL) = $ZX ### Syntax rld ### Effects The `H` and `N` flags are reset, `P/V` is parity, `C` is preserved, and `S` and `Z` are modified by definition. ### T-States 18 t-states ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## RR 9-bit rotation to the right. The carry is copied into bit 7, and the bit leaving on the right is copied into the carry. ### Syntax rr op8 #### Allowed Instructions rr a rr b rr c rr d rr e rr h rr l rr (hl) rr (ix+n) rr (iy+n) ### Effects Carry becomes the bit leaving on the right, `H` and `N` flags are reset, `P/V` is parity, `S` and `Z` are modified by definition. ### T-States `r` denotes 8-bit register. r 8 (hl) 15 (ix+X) 23 (iy+X) 23 ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## RRA Performs an `RR A`, but is much faster and `P/V`, `S`, and `Z` flags are preserved. ### Syntax rra ### Effects The carry becomes the bit leaving on the right, `H` and `N` flags are reset, `P/V`, `S`, and `Z` are preserved. ### T-States 4 t-states ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## RRC 8-bit rotation to the right. The bit leaving on the right is copied into the carry, and into bit 7. ### Syntax rrc op8 #### Allowed Instructions rrc a rrc b rrc c rrc d rrc e rrc h rrc l rrc (hl) rrc (ix+n) rrc (iy+n) ### Effects The carry becomes the value leaving on the right, `H` and `N` are reset, `P/V` is parity, and `S` and `Z` are modified by definition. ### T-States `r` denotes 8-bit register. r 8 (hl) 15 (ix+X) 23 (iy+X) 23 ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## RRCA Performs `RRC A` faster and modifies the flags differently. ### Syntax rrca ### Effects The carry becomes the value leaving on the right, `H` and `N` are reset, `P/V`, `S`, and `Z` are preserved. ### Uses ### T-States 4 t-states ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## RRD Performs a 4-bit rightward rotation of the 12-bit number whose 4 most significant bits are the 4 least significant bits of `A`, and its 8 least significant bits are in `(HL)`. ; assume W,X,Y,Z are the set of all possible hex values 0-F ld a,$WX ld (hl),$YZ rrd ; A = $WZ ; (HL) = $XY ### Syntax rrd ### Effects The `H` and `N` flags are reset, `P/V` is parity, `C` is preserved, and `S` and `Z` are modified by definition. ### T-States 18 t-states ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## RST The current `PC` value plus three is pushed onto the stack. The MSB is loaded with $00 and the LSB is loaded with `imm8`. ### Syntax rst imm8 #### Allowed Instructions rst $00 rst $08 rst $10 rst $18 rst $20 rst $28 rst $30 rst $38 ### Effects All flags unaffected. ### T-States 11 t-states ### See Also [DI](#di), [EI](#ei), [IM](#im), [RET](#ret), [RETI](#reti), [RETN](#retn) ## SBC Sum of second operand and carry flag is subtracted from the first operand. Results are written into the first operand. ### Syntax sbc a,op8 ;8 bits sbc hl,op16 ;16 bits #### Allowed Instructions sbc a,a sbc a,b sbc a,c sbc a,d sbc a,e sbc a,h sbc a,l sbc a,ixh sbc a,ixl sbc a,iyh sbc a,iyl sbc a,(hl) sbc a,(ix+n) sbc a,(iy+n) sbc a,n ;8 bits sbc hl,bc sbc hl,de sbc hl,hl sbc hl,sp ### Effects `N` flag is set, `P/V` detects overflow, rest modified by definition. In the case of 16-bit registers, `H` flag is undefined. ### Uses Multiple precision subtraction ### T-States `r` denotes 8-bit register. `rr` represents a two byte register pair: `BC`, `DE`, `HL`, `SP` r 4 X 7 (hl) 7 (ix+X) 19 (iy+X) 19 hl, rr 15 ### See Also [ADC](#adc), [ADD](#add), [DAA](#daa), [DEC](#dec), [INC](#inc), [SUB](#sub) ## SCF Sets carry flag. ### Syntax scf ### Effects Carry flag set, `H` and `N` cleared, rest are preserved. ### T-States 4 t-states ### See Also [CCF](#ccf) ## SET Sets the specified bit. ### Syntax set n,op8 #### Allowed Instructions `n` can be any integer from [0,7]. It must be defined on compile time. set n,a set n,b set n,c set n,d set n,e set n,h set n,l set n,(hl) set n,(ix+n) set n,(iy+n) ### Effects All flags preserved. ### T-States `r` denotes 8-bit register. r 8 (hl) 15 (ix+X) 23 (iy+X) 23 ### See Also [AND](#and), [BIT](#bit), [CCF](#ccf), [CPL](#cpl), [OR](#or), [RES](#res), [SCF](#scf), [XOR](#xor) ## SLA An arithmetic shift left 1 bit position is performed on the contents of register `r`. The contents of bit 7 are copied to the carry flag. Bit 0 is the least-significant bit. ### Syntax sla op8 #### Allowed Instructions sla a sla b sla c sla d sla e sla h sla l sla (hl) sla (ix+n) sla (iy+n) ### Effects `S` and `Z` by definition, `H` and `N` reset, `C` from bit 7, `P/V` set if result is even. ### T-States `r` denotes 8-bit register. r 8 (hl) 15 (ix+X) 23 (iy+X) 23 ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLL/SL1](#sllsl1), [SRA](#sra), [SRL](#srl) ## SLL/SL1 An "undocumented" instruction. Functions like `SLA`, except a 1 is inserted into the low bit. ### Syntax sll op8 #### Allowed Instructions sll a sll b sll c sll d sll e sll h sll l sll (hl) sll (ix+n) sll (iy+n) ### Effects `S` and `Z` by definition, `H` and `N` reset, `C` from bit 7, `P/V` set if result is even. ### T-States `r` denotes 8-bit register. `IX` and `IY` values assumed from `SLA`. Needs confirmation. r 8 (hl) 15 (ix+X) 23 (iy+X) 23 ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SRA](#sra), [SRL](#srl) ## SRA Arithmetic shift right 1 bit, bit 0 goes to carry flag, bit 7 remains unchanged. ### Syntax sra op8 #### Allowed Instructions sra a sra b sra c sra d sra e sra h sra l sra (hl) sra (ix+n) sra (iy+n) ### Effects `S` and `Z` set according to definition, `H` and `N` reset, `C` from bit 0, `P/V` if parity is 0. ### T-States `r` denotes 8-bit register. r 8 (hl) 15 (ix+X) 23 (iy+X) 23 ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRL](#srl) ## SRL Like `SRA`, except a 0 is put into bit 7. The bits are all shifted right, with bit 0 put into the carry flag. ### Syntax srl op8 #### Allowed Instructions srl a srl b srl c srl d srl e srl h srl l srl (hl) srl (ix+n) srl (iy+n) ### Effects `S`, `H`, and `N` flags reset, `Z` if result is zero, `P/V` set if parity is even, `C` from bit 0. ### T-States `r` denotes 8-bit register. r 8 (hl) 15 (ix+X) 23 (iy+X) 23 ### See Also [RL](#rl), [RLA](#rla), [RLC](#rlc), [RLCA](#rlca), [RLD](#rld), [RR](#rr), [RRA](#rra), [RRC](#rrc), [RRCA](#rrca), [RRD](#rrd), [SLA](#sla), [SLL/SL1](#sllsl1), [SRA](#sra) ## SUB `SUB` stands for subtract but only takes one input. It subtracts the input from the accumulator and writes back to it. ### Syntax sub op8 ;8 bit #### Allowed Instructions sub a sub b sub c sub d sub e sub h sub l sub n ;8 bit constant sub (hl) sub (ix+n) sub (iy+n) ### Effects `N` flag set, `P/V` is overflow, rest modified by definition. ### Uses Allows you to subtract two 8 bit integers. Useful in if you have an offset and want to eliminate certain items. ### T-States `r` denotes 8-bit register. r 4 X 7 (hl) 7 (ix+X) 19 (iy+X) 19 ### See Also [ADC](#adc), [ADD](#add), [DAA](#daa), [DEC](#dec), [INC](#inc), [SBC](#sbc) ## XOR `XOR` is an instruction that takes one 8-bit input and compares it with the accumulator. `XOR` is similar to `OR`, except for one thing: only 1 of the 2 test bits can be set or else it will result in a zero. The final answer is stored to the accumulator. 0 and 0 result: 0 0 and 1 result: 1 1 and 0 result: 1 1 and 1 result: 0 ### Syntax xor op8 #### Allowed Instructions xor a xor b xor c xor d xor e xor h xor l xor ixh xor ixl xor iyh xor iyl xor (hl) xor (ix+n) xor (iy+n) xor n ;8 bit constant ### Effects `C` and `N` flags cleared. `P/V` is parity, and rest are modified by definition. ### Uses XORing numbers is used a lot to invert sprites and such. It is also very useful in bit-masking. See here for more information about bit-masking. ### T-States `r` denotes 8-bit register. r 4 X 7 (hl) 7 (ix+X) 19 (iy+X) 19 ### See Also [AND](#and), [BIT](#bit), [CCF](#ccf), [CPL](#cpl), [OR](#or), [RES](#res), [SCF](#scf), [SET](#set) ---