Dual Shift Operations
Undocumented instructions that perform two actions at the same time
Like most early microprocessors, the Z80 has it's own set of undocumented instructions.
Most of these either do something that's not useful, or they do something that would at first seem to be odd in why they were implemented in the first place.
In most instances, they exist due to how the processor is implemented in silicon. Where an instruction is decoded, there are free bits so if something tried to use that code then the processor would just do as it's told as it wouldn't know otherwise.
Be aware, these usually work on a physical chip due to it requiring the actual instruction decoding to provide these instructions.
They will most likely not work in an emulator as they would perform the decoding in software using lookup tables, so wouldn't implement anything that's not documented.
These may or may not work on actual chips. For example, on the 6502 there were plenty of undocumented instructions that were replaced in the 65C02 with NOP instructions.
These are provided here for reference only.
Most of the undocumented instructions fall under some simple rules:
Only codes 0xCB30…0xCB37 are undocumented but implement a Shift Logical Left instruction where bit 0 is set post shift.
For opcodes with the 0xDDCB and 0xFDCB prefixes the instructions store the result in one of the 8-bit registers based on the lower 3 bits of the opcode: B=000, C=001, D=010, E=011, H=100, L=101 and A=111.
The officially documented codes all have 110 as the lower 3 bits and do not store the result in any register.
All of these instructions with the 0xDDCB prefix operate against the IX register (IY for 0xFDBC).
The only exception to this rule is opcodes 0x40…0x7F which are the bit text operations. As these only test the memory location they do not create a result so all the undocumented versions are identical to the official instructions.
Officially the 0xDD and 0xFD prefixes cause any instruction that references (HL)
to instead work
against the IX & IY registers with a displacement, 0xDD for IX and 0xFD for IY.
The undocumented instructions allows for instructions that refer to just H or L can also be used to access the upper or lower 8-bit components of IX and IY themselves.
There are a few undocumented instructions with this prefix, but they simply emulate existing instructions.
The exception to this are the IN F, (C)
and OUT (C), F
instructions which are
described below.
One oddity is the undocumented IN F,(C)
0xED70 instruction
which performs an IN from an I/O port but stores the result into the Flags register.
This instruction is actually documented in Zilogs own documentation (2016 PDF).
For this reason, that instruction is listed on the IN r, (C) page and not in this
section.
It's OUT (C), F
0xED71 equivalent is listed under OUT (C), r for consistency, even though that
instruction is completely undocumented.
Undocumented instructions that perform two actions at the same time
Undocumented instructions for IX and IY registers
Undocumented instruction to perform a logical left shift
Undocumented BIT n,(IX+d)
Undocumented Reset bit in (IX+d) and copy into register r
Undocumented Reset bit in (IY+d) and copy into register r
Undocumented SET bit in (IX+d) and copy into register r
Undocumented SET bit in (IY+d) and copy into register r