<!-- PDF page 281 -->

rent state of the port. The port at **1FFDh** doesn't just control the ROM switch, so setting the variable to absolute values would be very unwise. Using AND/OR with a bit mask or SET/RES instructions is the preferred method of updating the variable.

Just as BANK678 reflects the last value output to **1FFDh**, BANKM should also be kept up to date with the last value output to **7FFDh**. Again, it is unwise to use absolute values, as the port is used for other purposes. For example, the bottom 3 bits of the port are used to select the RAM page that is switched into the memory area **C000h** through **FFFFh** (this is also shown in the above example). Naturally, when more than one bit is to be set/reset, a bit mask used with OR/AND is the more efficient method. Note that RAM paging was described in the *Memory Management section* in *Chapter 24*.

The above was a very simple example of calling DOS routines. It works – apart from the ZX Spectrum Next – on the ZX Spectrum +3 and ZX Spectrum +3e as well.

### Opcodes Prefixes

Some Assembler opcodes are preceded by a prefix byte which changes the opcode represented by the following byte.

Assembler opcode prefixes **CBh** (**203**) and **EDh** (**237**) alter the meaning of certain instructions, as indicated in the 5th and 6th columns of *Appendix A*. This includes the provision of some entirely new opcodes for the ZX Spectrum Next.

Assembler opcode prefixes **DDh** (**221**) and **FDh** (**253**) alter the meaning of certain instructions that ordinarily refer to the **H** or **L** registers, so that they refer to either the component registers of **IX** or **IY** register respectively. For example, the instruction **LD H,n** will load the value of **n** into the **H** register. Preceding this two-byte instruction with the **IX** register's opcode prefix **DDh**, would result in the most significant 8 bits of the **IX** register being loaded with that value instead.

This general transformation rule is modified when the original instruction contains (**HL**), with this component replaced by (**IX +N**) and any other reference to **HL** left unaffected. For instance:

**DDh 66h** is interpreted as **ld h,(ix + N)**

A **DDh** opcode will be ignored, interpreted as **nop**, if it precedes **DDh**, **EDh** or **FDh**. Similar rules apply to the **FDh** instruction.

