By James Moxham
ZINT Z80 INTERPRETER Copyright 1996 James Moxham Chapter 1 LD group of instructions Chapter 2 Exchange group Chapter 3 The stack, POP and PUSH Chapter 4 Arithmetic Chapter 5 Jumps calls and returns Chapter 6 And or and xor Chapter 7 Bit set reset and test Chapter 8 Rotate and shift Chapter 9 General arithmetic and control Chapter 10 Block transfer and search Chapter 11 Input and Output instructions Chapter 12 Additional useful commands Chapter 13 Number bases Chapter 14 The flags Appendix 1 Binary, hex ascii decimal TC conversion ***************************************************************** CHAPTER 1 The LD instruction The LD instruction is perhaps the most useful instruction in the Z80. It is used to transfer data between registers, and to and from memory. The most simple type of LD instruction is to fill a register with a number: (Use F1) LD A,6 This loads the A register with the number 6, so the register display now appears as A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 06 000000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 You can transfer this data to other registers LD H,A A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 06 000000 0000 0000 0600 0000 0000 00 000000 0000 0000 0000 0000 copies the data in the A register to the H register. In fact H could have been any one of A B C D E H or L. The data in the A register remaines unchanged. Transferring data: Number bases As most programmers of BASIC will know numbers can be represented in several forms, binary octal and hexadecimal being common bases. The registers in the above example display the data in hexadecimal form. Thus LD A,255 gives A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP FF 000000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 FF is 255 in hexadecimal. The equivalent statement using hexadecimal directly is LD A,0FFH The H at the end signifies that the number is a hex number. The 0 at the front is necessary because the first digit in any number should always be between 0 and 9. You can also use binary LD A,11111111B where the B at the end specifies the number is a binary number. The reason for using all three bases is because some instructions are much easier to understand in one base. Two other bases are supported, two's complement and direct ascii characters and are discussed in detail in ch16. The following instructions all do the same thing. LD B,073H LD B,01110011B LD B,65 LD B,"s" Double register LD's As you notice from the register display some registers have been grouped together. For example the H and L registers are displayed together as HL. You can treat these pairs as if they were one LD HL,1000 returns A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 00 000000 0000 0000 03E8 0000 0000 00 000000 0000 0000 0000 0000 We can alse transfer this data from one double register pair to another LD BC,HL gives A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 00 000000 03E8 0000 03E8 0000 0000 00 000000 0000 0000 0000 0000 The double registers can be any one of BC DE HL IX IY or SP. Transfers to and from memory The above instructions all transfer data within the microprocessor. The following sequence transfers a data to the memory (Use F1 or write as a program and then type F5) LD A,255:LD HL,1000:LD,(HL) A Here we are using more than one statement in a line. The first two statements load the registers as we have seen before. The last statement loads memory location 1000 with 255. To retrieve this data we can use LD D,(HL) which transfers 255 from the memory to register D. To see what is in the memory at any one time use the view memory command. In general the memory location is usually given by the HL register pair. The BC and DE regsters can be used as the memory location but the data can only be transferred to and from register A eg LD (BC),A is allowed but LD B,(DE) is not. A second way to transfer data to and from memory is to use a number instead of a register pair. Thus LD E,(38C1H) transfers to register E the data in memory 1000 LD (HL),34 transfers to the location stored in HL the no 34 A third way is to use the IX and IY registers. Say for example we want to store the word HELLO in memory. First we would look up the ASCII values for the letters, which are 72 69 76 76 79. We will store the word starting at memory location 500. First we load IX or IY with 500 LD IX,500 Next the data is transferred LD (IX),72:LD (IX+1),69:LD (IX+2),76:LD (IX+3),76:LD (IX+4),79 Use the view memory command to see where this data is. The final way LD can be used is to transfer double registers to and from memory. For example LD (500),BC transfers the contents of C to the memory location 500 and the contents of B to location 501. We can load this data from memory to register pair DE with a LD DE,(500) The register can be BC DE HL IX IY or SP. What follows now is a list of all the possible LD instructions sorted alphabetically. The letter n is used to indicate a number between 0 and 255 (0 and 0FFH). nn represents a number between 0 and 65535 (0 and 0FFFFH). d is any number between -127 and +127 (the +d can be -d; LD (IX-23) A LD (BC),A LD B,(HL) LD H,(IX+d) LD (DE),A LD B,(IX+d) LD H,(IY+d) LD (HL),A LD B,(IY+d) LD H,A LD (HL),B LD B,A LD H,B LD (HL),C LD B,B LD H,C LD (HL),D LD B,C LD H,D LD (HL),E LD B,D LD H,E LD (HL),H LD B,E LD H,H LD (HL),L LD B,H LD H,L LD (HL),n LD B,L LD H,n LD (IX+d),A LD B,n LD HL,(nn) LD (IX+d),B LD BC,(nn) LD HL,nn LD (IX+d),C LD BC,nn LD I,A LD (IX+d),D LD C,(HL) LD IX,(nn) LD (IX+d),E LD C,(IX+d) LD IX,nn LD (IX+d),H LD C,(IY+d) LD IY,(nn) LD (IX+d),L LD C,A LD IY,nn LD (IX+d),n LD C,B LD L,(HL) LD (IY+d),A LD C,C LD L,(IX+d) LD (IY+d),B LD C,D LD L,(IY+d) LD (IY+d),C LD C,E LD L,A LD (IY+d),D LD C,H LD L,B LD (IY+d),E LD C,L LD L,C LD (IY+d),H LD C,n LD L,D LD (IY+d),L LD D,(HL) LD L,E LD (IY+d),n LD D,(IX+d) LD L,H LD (nn),A LD D,(IY+d) LD L,L LD (nn),BC LD D,A LD L,n LD (nn),DE LD D,B LD R,A LD (nn),HL LD D,C LD SP,(nn) LD (nn),IX LD D,D LD SP,HL LD (nn),IY LD D,E LD SP,IX LD (nn),SP LD D,H LD SP,IY LD A,(BC) LD D,L LD SP,nn LD A,(DE) LD D,n LD A,(HL) LD DE,(nn) LD A,(IX+d) LD DE,nn LD A,(IY+d) LD E,(HL) LD A,(nn) LD E,(IX+d) LD A,A LD E,(IY+d) LD A,B LD E,A LD A,C LD E,B LD A,D LD E,C LD A,E LD E,D LD A,H LD E,E LD A,L LD E,H LD A,n LD E,L LD A,R LD E,n LD A,I LD H,(HL) **************************************************************** CHAPTER 2 The EX instructions In addition to the registers we have mentioned so far the Z80 has several additional registers. The most important of these are the so called prime registers, which are designated A' BC' DE' and HL'. You cannot access these registers directly, but you can swap them with the ordinary registers. If you type in the following code LD BC,1234H:LD DE,5678H:LD HL,9ABCH the registers will appear A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 00 000000 1234 5678 9ABC 0000 0000 00 000000 0000 0000 0000 0000 Now type in EXX which swaps BC DE and HL with the prime registers A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 00 000000 0000 0000 0000 0000 0000 00 000000 1234 5678 9ABC 0000 You can now work on the normal registers, eg LD BC,1111H When you want to swap the registers back again use EXX The EXX statement is very useful for storing variables you are working on without having to save them in memory. The equivalent store to memory for these three registers would take 3 LD statements. Other EX commands Several other commands exist that swap registers. EX AF,AF' swaps the A register and the flags with the corresponding prime registers. It is commonly used with EXX. EX DE,HL swaps the DE register and the HL register. EX (SP),HL EX (SP),IX EX (SP),IY all swap the memory contents pointed to by the SP register with the corresponding register. The equivalent code for EX (SP),HL could be LD HL,1234H:LD BC,5678H:LD (1000H),BC:LD SP,1000H then LD BC,(1000H):LD (1000H),HL:LD HL,BC Thus in the case of EX (SP),HL the L register is swapped with the data at the memory location pointed to by the SP register, and the H register is swapped with the memory location + 1 pointed to by the SP register. Type MEMORY to check this. Exchange Commands EXX EX (SP),HL EX AF,AF' EX (SP),IX EX DE,HL EX (SP),IY **************************************************************** Chapter 3 The Stack The memory of a computer can be thought of as a library, with each book representing a memory location. LD BC,(350) is like finding the 350th book. The stack on the other hand is like a pile of books. Instead of storing the BC register in memory location 350 and then retrieving it later we can put it on top of a pile of books, and take it off later. The following code shows how the stack works LD BC,1234:LD SP,504H initialises the registers PUSH BC takes the BC register and puts it on top of the pile of books. LD BC,0 clears the BC register, and POP BC takes the top book and puts it back in the BC register. If you now view the memory you can see what has happened. The SP register was used as a pointer as to where the top of the pile of books was. Thus after PUSH BC, 503H contains 12 or the H register, and 502 contains 34 or the L register. The SP was 502. POP BC put 502 into the L register and 503 into the H register, and added 2 to SP to make 504 again. In fact the data in 502 and 503 could have been POP ed into any register. Try the dollowing to confirm this PUSH BC:POP DE Because memory locations are used to store data you have to set where you wnat the stack to be before using PUSH and POP. The stack was in this case set at 504 but could have been any location. The instruction LD SP,504 should occur before any PUSH or POP instructions are used and so usually appears near the beginning of a program. Most programs would use a maximum of 20 PUSH's before POP's so you need to make sure that about 40 memory locations below the initial value of the SP are not used. The ORG instruction is used to reserve this memory. The PUSH and POP instruction both work on double register pairs only. Thus for the purposes of this instruction the A register and the flag register are grouped together as an AF register, with the F register being the least significant byte. The way the individual flags are grouped in the F register is discussed in the chapter on the flags. The stack commands PUSH AF POP AF PUSH BC POP BC PUSH DE POP DE PUSH HL POP HL PUSH IX POP IX PUSH IY POP IY ****************************************************************** Chapter 4 Arithmetic Arithmetic in machine code is a little different to arithmetic in a higher level language such as BASIC or FORTRAN. Registers can be added, subtracted, but multiplication and division require a short program. Other instructions exist to compare two numbers and increment or decrement registers. When two numbers are added or subtracted there needs to be a way of signalling a carry or borrow if this has occurred. In addition to a carry five other features of the operation, such as = to zero and negative or positive are signalled. This is done using the flags, which are shown in the register display as CZPSNH. The six flags are covered briefly below and are covered in more detail in the chapter on the flags and on number basses. The C or carry flag is set if the result of an add is too great for the register to hold the value. In subtraction it is set if the answer is less than 0, necessitating a borrow. The Z or Zero flag, which is set to 1 if the result is zero, and reset to 0 if the result is not zero. The P flag is set when the parity is even, and reset when it is odd. It is also used by some instructions to signify overflow, and thus is sometimes written as the P/V flag. The S or Sign flag, which is set to 1 if the result of an operation is between 0 and 127, and reset to 0 if between 128 and 255. The H or half carry flag, which is used when converting hex values to BCD. The N flag indicates whether the last instruction was an add or subtract. These flags are used by the DAA instruction. Adding The following code shows how to add two numbers. LD A,5:ADD A,3 will produce A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 08 000000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 if you now type ADD A,255 then the result will be A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 07 100001 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 The carry flag has been set to indicate that the answer was greater than 255. If you now use ADD A,248 then the answer will be 0, and the Z flag will be set. The 8 bit instructions all add either a number, or another register to the A register. The flags are set on the result contained in the A register as follows. C or carry flag 1 if answer >255 else 0 Z or zero flag 1 if answer = 0 else 0 P flag 1 if overflow in twos complement else 0 S or sign flag 1 if 127<answer<256 else 0 N flag 0 H or half carry flag 1 if carry from bit 3 to bit 4 else 0 16 bit arithmetic If you want to add numbers that are more than the 0-255 that can be stored in the A register, then the HL, IX or IY registers can be used. Thus LD HL,1000H:LD BC,2000H:ADD HL,BC will give A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 00 000000 2000 0000 3000 0000 0000 00 000000 0000 0000 0000 0000 The flags are set as follows. C or carry flag 1 if answer >65535 else 0 Z or zero flag not changed P flag not changed S or sign flag not changed N flag 0 H or half carry flag 1 if carry from bit 11 to bit 12 else 0 8 bit and 16 bit ADD instructions ADD A,A ADD A,(HL) ADD HL,BC ADD IY,BC ADD A,B ADD A,(IX+d) ADD HL,DE ADD IY,DE ADD A,C ADD A,(IY+d) ADD HL,HL ADD IY,IY ADD A,D ADD HL,SP ADD IY,SP ADD A,E ADD IX,BC ADD A,H ADD IX,DE ADD A,L ADD IX,IX ADD A,n ADD IX,SP Add with carry 8 bit group This set of instructions are essentially the same as the ADD set, but add the carry flag as well. The instruction is ADC instead of ADD. Thus LD A 4:ADC A 3 would give an answer of 7 if the carry flag was 0, but an answer of 8 if the carry flag was 1 before the instruction. The ADC instruction allows multiple precision adding. The least most significant bytes are added, and the carry is propogated to the next most significant bytes by using ADC. For the 8 bit ADC's using th A register the flags are affected C or carry flag 1 if answer >255 else 0 Z or zero flag 1 if result = 0 else 0 P flag 1 if TC <-128 or >127 else 0 S or sign flag 1 if 127 < n < 256 else 0 N flag 0 H or half carry flag 1 if carry from bit 3 to bit 4 else 0 8 bit ADC instructions ADC A,A ADC A,B ADC A,C ADC A,D ADC A,E ADC A,H ADC A,L ADC A,n ADC A,(HL) ADC A,(IX+d) ADC A,(IY+d) 16 bit ADC group The 16 bit ADC instructions use the HL register instead of the A register. The flags are affected as follows C or carry flag 1 if answer >65536 else 0 Z or zero flag 1 if result = 0 else 0 P flag 1 if TC <-32768 or >32767 else 0 S or sign flag 1 if 32767 < n < 65536 else 0 N flag 0 H or half carry flag 1 if carry from bit 11 else 0 16 bit ADC group ADC HL,BC ADC HL,DE ADC HL,HL ADC HL,SP Subtracting The SUB group There are two subtraction instructions, SUB which is the opposite of ADD, and SBC which is subtract with borrow. Thus LD A,6:SUB 2 gives A = 4. SUB is used for 8 bit subtractions. The number or register is subtracted from the A register and the result stored in the A register. One of the idiosyncracities of the Z80 instrcution set is that the A register is not written as it is with ADD, viz ADD A C but SUB C. In addition although there are 16 bit ADD's there are no 16 bit SUB's. (16 bit subtraction is done using the SBC instruction.) The flags are set as follows C or carry flag 1 if answer <0 else 0 Z or zero flag 1 if answer = 0 else 0 P flag 1 if overflow in twos complement else 0 S or sign flag 1 if 127<answer<256 else 0 N flag 1 H or half carry flag 1 if borrow from bit 4 else 0 SUB instruction set SUB A SUB B SUB C SUB D SUB E SUB H SUB L SUB n SUB (HL) SUB (IX+d) SUB (IY+d) Subtract with borrow 8 bit group The SBC instruction group is the opposite to the ADC group. The register or number is subvtracted from the A register, along with the C flag, and the result stored in the A register. Thus LD A,7:SBC A,3 gives A=4 if the carry flag was 0 and A=3 if it was 1 before the SBC. The flags are affected as follows C or carry flag 1 if <0 else 0 Z or zero flag 1 if result = 0 else 0 P flag 1 if TC >127 or <-128 else 0 S or sign flag 1 if 127 < n <256 else 0 N flag 1 H or half carry flag 1 if borrow from bit 12 else 0 SBC A,A SBC A,B SBC A,C SBC A,D SBC A,E SBC A,H SBC A,L SBC A,n SBC A,(HL) SBC A,(IX+d) SBC A,(IY+d) 16 bit subtracts with borrow These instructions subtract the designated register from the HL register pair and store the answer in the HL register pair. The flags are affected as follows C or carry flag 1 if answer < 0 else 0 Z or zero flag 1 if result = 0 else 0 P flag 1 if TC >32767 or <-32768 else 0 S or sign flag 1 if 32767 < n < 65536 else 0 N flag 1 H or half carry flag 1 if borrow from bit 12 else 0 16 bit SBC group SBC HL,BC SBC HL,DE SBC HL,HL SBC HL,SP Compares The compare instruction can be thought of as an 8 bit SUB instruction in the way the flags are changed, except that the contents of the A register remain unchanged. Thus LD A,9:CP 9 gives A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 09 010010 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 where for example the zero flag has been set because 9 - 9 is zero, but the A register still contains the original 9. The set is CP A CP B CP C CP D CP E CP H CP L CP n CP (HL) CP (IX+d) CP (IY+d) Increment Increments are the same as adding a 1. Thus INC B is the same as LD A,B:ADD A,1:LD B,A. The results of all increments to single registers affect the flags as if an ADD had been perfomed. However for double register groups, such as INC BC the registers are unaffected. The first two columns are the 8 bit increments that do affect the flags, and the last column is the 16 bit increments that leave the flags unchanged. INC A INC (HL) INC BC INC B INC (IX+d) INC DE INC C INC (IY+d) INC HL INC D INC IX INC E INC IY INC H INC SP INC L Decrement These are the opposite to the increment group, the subtract 1 from the register in question. As before single register decrements affect the flags as a subtract would, but double register decrements leave the flags as they are. DEC A DEC (HL) DEC BC DEC B DEC (IX+d) DEC DE DEC C DEC (IY+d) DEC HL DEC D DEC IX DEC E DEC IY DEC H DEC SP DEC L **************************************************************** Chapter 5 Jumps Calls and Returns There are five instructions in this group. JP and JR are like GOTO in basic, and jump to the corresponding line. CALL is like GOSUB, and calls a subroutine. RET returns from the subroutine. Jumps The simplest type of jump is demonstrated by the following short program. Line1: LD A,5:JP Line 3 Line2: end line3: LD B,6:END Line2 is never encountered because the program jumps to Line3. The next type of jump only occurs if the flag condition specified by the jump is true. Line1: LD A,0:LD B,5 Line2: ADD A,1:DEC B:JP NZ Line2 END Line1 loads B with 5. The program now loops through line2 until B is equal to 0. This is because JP NZ only jumps if the result of the last operation to affect the Z flag was not zero. Since the zero flag is set to 0 by DEC B if B is not equal to 0 the program loops until B=0. The following are the conditions that can be used with JP. NZ Jump if zero flag = 0. (last Z flag instr <>0) Z Jump if zero flag = 1. (last Z flag instr = 0) NC Jump if carry flag = 0. (last C instr = no carry) C Jump if carry flag = 1. (last C instr = carry) PO Jump if parity odd, parity flag = 0. PE Jump if parity even, parity flag = 1. P Jump if sign positive, sign flag = 0. M Jump if sign negative (minus), sign flag = 1. Relative jumps In the interpreter the JR instruction is the same as the JP instruction. However there is a difference between the two in the compiled program. The JR instruction, instead of storing the value of the location to be jumped to, instead stores a displacement value, which may be anything between +127 and -127. A displacement value of say -3 says jump to the instruction 3 bytes before this one. The reasoning behind this is that relative jumps take only two bytes of memory wheras ordinary jumps take three. However this memory saving is offset by the fact that ordinary jumps are quicker than relative jumps. In addition conditional jumps PO PE P and M are not allowed with JR. All this means that in practical terms it is probably better to ignore the JR instruction and to only use the JP instuction. DJNZ The third type of jump is the DJNZ instruction. The following program shows how it works. Line1: LD A,0:LD B,5 Line2: ADD A,1:DJNZ Line2 END Line1 sets A to 0 and B to 5. Line2 adds one to A. The DJNZ subtracts one from register B, and if the result is not zero jumps to the location shown. Thus the program loops through 20 until B is 0, and then ends. Summary of Jump instructions JP nn JP Z,nn JP PE,nn JR NZ,nn JP (HL) JP NC,nn JP P,nn JR Z,nn JP (IX) JP C,nn JP M,nn JR NC,nn JP (IY) JP PO,nn JR nn JR C,nn JP NZ,nn DJNZ nn Calls Subroutines are called by a CALL and terminated by a RET. Start: LD A,5:CALL Subroutine END Subroutine:LD B,4:ADD A,B:RET The return location is stored in the stack. CALL's like jumps can be conditional, and the same rules apply. RET's can also be conditional. In addition there are two additional returns, RETI and RETN, which return from interupts and non maskable interrupts respectively. Since interrupts are not implemented on the interpreter these two instructions do nothing. They can be included if they will be used in the final compiled program. Summary CALL nn RET nn CALL NZ,nn RET NZ,nn CALL Z,nn RET Z,nn CALL NC,nn RET NC,nn CALL C,nn RET C,nn CALL PO,nn RET PO,nn CALL PE,nn RET PE,nn CALL P,nn RET P,nn CALL M,nn RET M,nn RETI RETN ************************************************************** Chapter 6 AND OR and XOR These instructions all work on the A register and peform bit by bit comparisons with the appropriate register. For example LD A,1010000B:LD B,0000001B:OR B gives A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP A1 000100 0100 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 AND OR and XOR perform bit by bit comparisons of the designated register and the A register according to the following rules. A register bit other register bit A bit set to AND 0 0 0 0 1 0 1 0 0 1 1 1 OR 0 0 0 0 1 1 1 0 1 1 1 1 XOR 0 0 0 0 1 1 1 0 1 1 1 0 The flags are also set by the result in the A register, the details of which are in Ch 17. Note that the AND command affects the H flag differently to the other two, however all the other flags are affected the same way. Instruction set (n is any number or label that can be resolved into an 8 bit number) AND A OR A XOR A AND B OR B XOR B AND C OR C XOR C AND D OR D XOR D AND E OR E XOR E AND H OR H XOR H AND L OR L XOR L AND n OR n XOR n ****************************************************************** Chapter 7 Bit set, reset and test The instructions in this group allow a specific bit in a register or memory location to be set to 1, reset to 0 or tested to see if it is 1 or 0. SET LD C,0:SET 3,C sets byte 3 of register 3 to 1. The result is register C = 8 in hexadecimal. The following table shows how the bits are numbered in a byte. 01010101 76543210 Bit 7 on the left is the most significant bit and bit 0 on the right is the least significant. For 16 bit numbers bit 15 is on the left and bit 0 is on the right. The registers that can be set, reset or tested are A B C D E H L and the memory location pointed to by (HL) (IX+d) or (IY+d). RES The RES instruction is the opposite of the SET instruction, it changes the appropriate bit to 0. Thus LD H,11111111B:RES 5,H results in a value of 0DFH Flags are not affected by either the SET or RES instructions. BIT The BIT instruction is used to test whether a specific bit is a zero or a one. LD D,10101010B:BIT 5,D results in A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 00 000001 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 The flags, which indicate the result of the test, are set as follows. C or carry flag not affected Z or zero flag 1 if bit is zero else 0 P or parity/overflow may be anything S or sign flag may be anything N or subtract flag 0 H or half carry flag 1 Summary of instructions SET 0,A SET 4,A RES 0,A RES 4,A BIT 0,A BIT 4,A SET 0,B SET 4,B RES 0,B RES 4,B BIT 0,B BIT 4,B SET 0,C SET 4,C RES 0,C RES 4,C BIT 0,C BIT 4,C SET 0,D SET 4,D RES 0,D RES 4,D BIT 0,D BIT 4,D SET 0,E SET 4,E RES 0,E RES 4,E BIT 0,E BIT 4,E SET 0,H SET 4,H RES 0,H RES 4,H BIT 0,H BIT 4,H SET 0,L SET 4,L RES 0,L RES 4,L BIT 0,L BIT 4,L SET 0,(HL) SET 4,(HL) RES 0,(HL) RES 4,(HL) BIT 0,(HL) BIT 4,(HL) SET 0,(IX+d) SET 4,(IX+d) RES 0,(IX+d) RES 4,(IX+d) BIT 0,(IX+d) BIT 4,(IX+d) SET 0,(IY+d) SET 4,(IY+d) RES 0,(IY+d) RES 4,(IY+d) BIT 0,(IY+d) BIT 4,(IY+d) SET 1,A SET 5,A RES 1,A RES 5,A BIT 1,A BIT 5,A SET 1,B SET 5,B RES 1,B RES 5,B BIT 1,B BIT 5,B SET 1,C SET 5,C RES 1,C RES 5,C BIT 1,C BIT 5,C SET 1,D SET 5,D RES 1,D RES 5,D BIT 1,D BIT 5,D SET 1,E SET 5,E RES 1,E RES 5,E BIT 1,E BIT 5,E SET 1,H SET 5,H RES 1,H RES 5,H BIT 1,H BIT 5,H SET 1,L SET 5,L RES 1,L RES 5,L BIT 1,L BIT 5,L SET 1,(HL) SET 5,(HL) RES 1,(HL) RES 5,(HL) BIT 1,(HL) BIT 5,(HL) SET 1,(IX+d) SET 5,(IX+d) RES 1,(IX+d) RES 5,(IX+d) BIT 1,(IX+d) BIT 5,(IX+d) SET 1,(IY+d) SET 5,(IY+d) RES 1,(IY+d) RES 5,(IY+d) BIT 1,(IY+d) BIT 5,(IY+d) SET 2,A SET 6,A RES 2,A RES 6,A BIT 2,A BIT 6,A SET 2,B SET 6,B RES 2,B RES 6,B BIT 2,B BIT 6,B SET 2,C SET 6,C RES 2,C RES 6,C BIT 2,C BIT 6,C SET 2,D SET 6,D RES 2,D RES 6,D BIT 2,D BIT 6,D SET 2,E SET 6,E RES 2,E RES 6,E BIT 2,E BIT 6,E SET 2,H SET 6,H RES 2,H RES 6,H BIT 2,H BIT 6,H SET 2,L SET 6,L RES 2,L RES 6,L BIT 2,L BIT 6,L SET 2,(HL) SET 6,(HL) RES 2,(HL) RES 6,(HL) BIT 2,(HL) BIT 6,(HL) SET 2,(IX+d) SET 6,(IX+d) RES 2,(IX+d) RES 6,(IX+d) BIT 2,(IX+d) BIT 6,(IX+d) SET 2,(IY+d) SET 6,(IY+d) RES 2,(IY+d) RES 6,(IY+d) BIT 2,(IY+d) BIT 6,(IY+d) SET 3,A SET 7,A RES 3,A RES 7,A BIT 3,A BIT 7,A SET 3,B SET 7,B RES 3,B RES 7,B BIT 3,B BIT 7,B SET 3,C SET 7,C RES 3,C RES 7,C BIT 3,C BIT 7,C SET 3,D SET 7,D RES 3,D RES 7,D BIT 3,D BIT 7,D SET 3,E SET 7,E RES 3,E RES 7,E BIT 3,E BIT 7,E SET 3,H SET 7,H RES 3,H RES 7,H BIT 3,H BIT 7,H SET 3,L SET 7,L RES 3,L RES 7,L BIT 3,L BIT 7,L SET 3,(HL) SET 7,(HL) RES 3,(HL) RES 7,(HL) BIT 3,(HL) BIT 7,(HL) SET 3,(IX+d) SET 7,(IX+d) RES 3,(IX+d) RES 7,(IX+d) BIT 3,(IX+d) BIT 7,(IX+d) SET 3,(IY+d) SET 7,(IY+d) RES 3,(IY+d) RES 7,(IY+d) BIT 3,(IY+d) BIT 7,(IY+d) **************************************************************** Chapter 8 Rotate and shift group The instructions in this chapter are concerned with shifting or rotating the bits in a particular register. For example 10001000 shifted right becomes 01000100 Rotate group There are four instructions that rotate the contents of the A register only. RLCA RLCA rotates the A register to the left one place. The 7th bit is put back into the 0 position. The 7th bit also goes to the carry flag. LD A,10011000B:RLCA gives A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 31 100000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 Use View Registers to see the value of A in binary= 00110001B The flags are affected as follows C or carry flag previous bit 7 value Z or zero flag not affected P or parity/overflow not affected S or sign flag not affected N or subtract flag 0 H or half carry flag 0 The RLCA instruction can be represented symbolically as C <--- bbbbbbbb <- | | ------------- RLA The RLA instruction rotates left through the carry flag. --- C <--- bbbbbbbb <-- | | ------------- > ---------- The bits in the register are all rotated left, the 7th bit goes to the carry flag and the carry flag goes to bit 0. LD A,1 then RLA 9 times, looking at the value of A each time will clarify the operation of this instruction. Apart from the carry flag, the other flags are set as for RLCA. RRCA This rotates the register right in a similar way to RLCA. Symbolically ---> bbbbbbbb ---> C | | ------ < ----- The register is shifted right by one, and the 0 bit goes to the carry flag and to the 7th bit. Flags apart from the carry are as for RLCA. RRA The RRA rotates right through the carry flag ---> bbbbbbbb ---> C -- | | ----------- < --------- The register is shifted right by one, the 0 bit goes to the carry flag, and the carry flag goes to bit 7. Flags apart from the carry flag are as for RLCA. Rotates through other registers The next set of instructions are similar to the above, but act on any one of A B C D E H L (HL) (IX+d) or (IY+d). They also affect the flags differenty. RLC x The RLC instruction rotates the register left by one. It can be represented symbolically as C <--- bbbbbbbb <- | | ------------- To demonstrate this instruction type LD D,1 and then RLC D until the 1 has gone all the way round. The flags are affected as follows C or carry flag previous bit 7 value Z or zero flag 1 if result is zero, else 0 P or parity/overflow 1 if parity even, else 0 S or sign flag 1 if 127<result<256, else 0 N or subtract flag 0 H or half carry flag 0 RL x The RL instruction rotates the register through the carry flag. --- C <--- bbbbbbbb <-- | | ------------- > ---------- The register is rotated left by one, the 7th bit goes to the carry flag, and the carry flag goes to the 0 bit. Flags apart from the carry flag are as for RLC. RL works on the same registers as RLC. RRC x The RRC instruction rotates the register right. ---> bbbbbbbb ---> C | | ------ < ----- The register is rotated right by one, the 0 bit goes to bothe the carry flag and the 7th bit. Flags apart from the carry flag are as for RLC. RRC works on the same registers as RLC. RR x The RR instruction rotates the register right through the carry flag. ---> bbbbbbbb ---> C -- | | ----------- < --------- The register is rotated right by one, the 0 bit goes to the carry flag and the carry flag goes to the 7th bit. The four bit rotate group There are two instructions in this group that rotate groups of bits through the A register and a memory location pointed to by the (HL) register. RLD The RLD instruction takes groups of four bits and rotates them as shown symbolically. ----->----- -------->---------- 12 ---<--- 34 or 1 2 -----<---- 3 <-- 4 ^| - A (HL) A (HL) The register on the left is the A register and the register on the right is a memory location pointed to by the HL register. The 4 least significant bits of the A register are moved to the 4 least significant bits of the (HL) location. The 4 least significant bits of the (HL) location are moved to the 4 most significant bits of the (HL) location. The 4 most significant bits of the (HL) location are moved to the 4 least significant bits of the A register. The 4 most significant bits of the A register remain unchanged. LD A,12H:LD HL,1000H:LD (HL),34H sets up the registers as shown above. RLD results in A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 13 000000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 with View Memory giving address 1000H = to 42H. The flags are set as follows C or carry flag not affected Z or zero flag 1 if result is zero, else 0 P or parity/overflow 1 if parity even, else 0 S or sign flag 1 if 127<result<256, else 0 N or subtract flag 0 H or half carry flag 0 RRD The RRD instruction can be represented as follows. ---------<-------------- 1 2 ------->----- 3 -->-- 4 A (HL) The instruction does the reverse of RLD. The flags are as for RLD. The Shift group There are three instructions in this group, that can work on the following registers; A B C D E H L (HL) (IX+d) or (IY+d). SLA x This instruction shifts the designated register left. Symbolically C <--- bbbbbbbb <--- 0 The register is shifted left one place. The 7th bit goes to the carry flag. The 0 bit has a 0 shifted in. LD E,1 and then SLA E,9 times will demonstrate this instruction. Flags are set as follows C or carry flag from bit 7 Z or zero flag 1 if result is zero, else 0 P or parity/overflow 1 if parity even, else 0 S or sign flag 1 if 127<result<256, else 0 N or subtract flag 0 H or half carry flag 0 SRA x This instruction shifts the designated register right one place. Symbolically --> bbbbbbbb ----> C -<-- The bits are all shifted right one. The 0 bit goes to the carry flag. The 7th bit however stays the same, although the 6th bit equals the old 7th bit. The flags apart from the carry flag are as for SLA. LD C 10000000B and then SRA C 9 times will demonstrate this. SRL x This instruction shifts all the bits right. Symbolically 0 ---> bbbbbbbb --->C The bits are all shifted right one. The 0 bit goes to the carry flag. The 7th bit is replaced with a 0. Flags are as for SLA. Summary of rotate and shift group RLCA RL A RR A SRA A RLA RL B RR B SRA B RRCA RL C RR C SRA C RRA RL D RR D SRA D RLD RL E RR E SRA E RRD RL H RR H SRA H RLC A RL L RR L SRA L RLC B RL (HL) RR (HL) SRA (HL) RLC C RL (IX+d) RR (IX+d) SRA (IX+d) RLC D RL (IY+d) RR (IY+d) SRA (IY+d) RLC E RRC A SLA A SRL A RLC H RRC B SLA B SRL B RLC L RRC C SLA C SRL C RLC (HL) RRC D SLA D SRL D RLC (IX+d) RRC E SLA E SRL E RLC (IY+d) RRC H SLA H SRL H RRC L SLA L SRL L RRC (HL) SLA (HL) SRL (HL) RRC (IX+d) SLA (IX+d) SRL (IX+d) RRC (IY+d) SLA (IY+d) SRL (IY+d) ************************************************************ Chapter 9 General purpose arithmetic and CPU control group NOP This is the simplest Z80 instruction, and simply does nothing. NOP:NOP:NOP:END NOP's are useful for creating delays. HALT This instruction halts the CPU. In the interpreter this returns control to programmer, and is equivalent to STOP in BASIC. In the microprosessor this stops program execution until an interrupt is recieved. The Z80 performs NOP's to ensure proper memory refresh. DI DI disables the interrupts. Since interrupts are not supported by the interpreter the interpreter ignores this instruction. To find out more about how the various types of interrupts work on the Z80 consult one of the Z80 texts. LD A,4:DI:LD B,3:EI:END EI EI enables the interrupts. See DI IM n This instruction sets the interrupt mode. As with EI it is ignored by the interpreter. n can be one of 0 1 or 2. Thus IM 2:LD A,5:IM 0:END SCF SCF sets the carry flag to 1. LD A 5:SCF:END gives A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP 05 100000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 The Z, P and S flags are unaffected. The N and H flags are reset to 0. To set the carry flag to 0 use SCF then CCF. CCF CCF complements the carry flag. If the flag was 1 it is now 0 and vice versa. The Z P and S flags are unaffected. The N flag is reset to 0. The H flag may be anything. NEG NEG negates the A register. The mathematical equivalent is A = 0-A. Thus LD A,5:NEG gives A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP FB 000111 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000 Flags are set as follows C or carry flag 1 if A=0 before operation, else 0 Z or zero flag 1 if result is zero, else 0 P or parity/overflow 1 if A=128 before operation, else 0 S or sign flag 1 if 127<result<256, else 0 N or subtract flag 1 if borrow from bit 4 else 0 H or half carry flag 1 CPL CPL complements the A register. All 0's become 1's and all 1's 0's. The C, Z P and S flags are all unaffected. The N and H flags are both set to 1. DAA DAA decimally adjusts the accumulator. This instruction allows decimal numbers to be added. For example let us add 11H and 22H LD A,11H:ADD A,22H which gives A = 33H However if we add 22H and 39H LD A,22H:ADD A,39H we get A = 5BH The B is illegal in decimal, or BCD, and is corrected by using DAA. Thus LD A 22H:ADD A 39H:DAA gives A = 61H, which is correct. Other examples LD A,91H:ADD A,92H unadjusted gives 23H, adjusted with DAA gives 83H and carry = 1 (use to get 183) LD A,99H:ADD A,99H unadjusted gives 32H, adjusted with DAA gives 98H and carry = 1. DAA also can be used after subtraction LD A,99H:SUB A,11H unadjusted gives 88H, adjusted with DAA gives 88H. LD A,91H:SUB A,19H unadjusted gives 78H, adjusted with DAA gives 72H. LD A,19H:SUB A,91H unadjusted gives 88H, adjusted with DAA gives 28H and carry = 1. (carry is used as borrow in subtracts) LD A,11H:SUB A,99H unadjusted gives 78H, adjusted with DAA gives 12 and carry = 1. The way DAA works is to selectively add numbers according to the value in A, and to the C H and N flags. In fact this is the purpose of the H and N flags as no other instruction uses them. The value added is given by the following table, although it is not necessary to understand or even to have the table to use DAA. DAA should always be used immediately after the ADD or SUB instruction to avoid flags being changed. DAA can also be used with ADC INC SBC DEC NEG etc. N C Value of H Value of Hex no C flag after high nibble low nibble added execution 0 0 0-9 0 0-9 00 0 0 0 0-8 0 A-F 06 0 0 0 0-9 1 0-3 06 0 0 0 A-F 0 0-9 60 1 0 0 9-F 0 A-F 66 1 0 0 A-F 1 0-3 66 1 0 1 0-2 0 0-9 60 1 0 1 0-2 0 A-F 66 1 0 1 0-3 1 0-3 66 1 1 0 0-9 0 0-9 00 0 1 0 0-8 1 6-F FA 0 1 1 7-F 0 0-9 A0 1 1 1 6-F 1 6-F 9A 1 Flags are affected by DAA as follows C or carry flag as per table Z or zero flag 1 if A=0 else 0 P or parity/overflow 1 if parity even else 0 S or sign flag 1 if msb A = 1 else 0 N or subtract flag unaffected H or half carry flag may be anything Chapter 11 Block transfer and search group Four instructions exist in the Z80 instruction set that are used to transfer blocks of data from one memory location to another. Another set of four instructions allow searches through a set or memory locations for a specific byte. Block transfer group; LDI LDD LDIR LDDR LDI LDI moves a block of data. HL is the memory location to move from, DE is the memory location to move to and BC is the number of bytes to move. memory contents (DE) = memory contents (HL) DE = DE + 1 HL = HL + 1 BC = BC - 1 At the end of each loop the P flag indicates if BC is 0 (P=1 if <>0 and 0 if = to 0) C, Z and S flags are not affected H and N flags are reset to 0 P flag =1 if after LDI BC is not equal to 0, else P = 0 LDD LDD is the same as LDI except that the DE and HL registers are decremented. Thus (DE) = (HL) DE = DE - 1 HL = HL - 1 BC = BC - 1 The flags are the same as for LDI. Thus the program above would be rewritten LDIR This is the automatic version of LDI. Set the HL, DE and BC registers and then run LDIR. If BC is a high value the instruction can take a while to execute. LDIR does the following (DE) = (HL) DE = DE + 1 HL = HL + 1 BC = BC - 1 and repeats until BC = 0 Flags are a little different; C, Z and S unchanged H, N and P = 0 LDDR This instruction is the automatic version of LDD. The summary is (DE) = (HL) DE = DE - 1 HL = HL - 1 BC = BC - 1 and repeat until BC = 0 Flags are as for LDIR. The question may be asked; why use LDI when LDIR does the operation automatically. The reason is that the registers can be changed when using LDI. For instance you can transfer every alternate bytethis program transfers every alternate byte between instructions by inserting say a INC HL. oooOOOooo Block search group The next four instructions are concerned with searching for bytes in a block of data. CPI CPI searches starting at the memory location pointed to by the HL register, and searches for BC number of bytes for the byte in register A. A - (HL) and set flags on the result of this compare, equivalent to CP (HL) HL = HL + 1 BC = BC - 1 The flags are set as follows C = no change Z = 1 if A - (HL) = 0 else 0 P = 1 if BC <> 0 after instruction else 0 S = 1 if sign A - (HL) negative in two's comp, else 0 H = 1 if a half carry from A - (HL) N = 1 CPD CPD is the same as CPI except that the HL register is decremented; HL = HL - 1. The flags are as for CPI. CPIR This is the automatic version of CPI. The instruction repeats until either A = (HL) or BC = 0. The flags are as for CPI. CPDR This is the automatic version of CPD. Flags are as for CPI. *************************************************************** Chapter 11 Input and output The Z80 has several comands that input and output data to the ports. However many of these are not very useful, and only one input and one output instruction are used in most Z80 computers. These are the IN A (n) and OUT (n) A instructions, where n is the port number between 0 and 255. Inputs and outputs do nothing on the ZINT interpreter, as these depend on the actual hardware used. OTDR INDR OTIR INIR OUTD IND OUTI INI OUT (C),A IN A,(C) OUT (C),B IN B,(C) OUT (C),C IN C,(C) OUT (C),D IN D,(C) OUT (C),E IN E,(C) OUT (C),H IN H,(C) OUT (C),L IN L,(C) OUT (n),A IN A,(n) *************************************************************** Chapter 12 Addtional commands Apart from the instructions that generate code, there are additional commands which are needed to test and run the programs. These shall be looked at in alphabetical order. The semicolon ; The semicolon is used to indicate a remark. These are ignored by the program. LD A,5:; This loads the A register with 5:LD B,3:END Instructions can be added after the remark, as is the LD B,3. END END is used to indicate the end of a program. It should always be the last statement in a program, otherwise an error message will appear. EQU EQU is used to set labels to particular values. VARIABLE1 EQU 46H Later in the program, instead of writing say LD A,46H, we can write LD A,VARIABLE1. This enables the way the program works to be made a lot clearer. The label used, in this case VARIABLE1 can be any sequence of letters or numbers, but should be 3 or more letters long. Thus EQU X 5 is not allowed. The number can be decimal, hex or binary number. To see what the current values of the labels are the View Label command is used. Labels should be assigned values before they are encountered in the program. The value of a label cannot be changed once it has been assigned. ORG ORG is used to set the origin of the program when it is compiled. When the program is finally dumped into a Z80 computer's memory, some way of indicating where the program will start is needed. In the Z80 it is customary to start the program not in memory location 0 but at memory location 100H. The first instruction in the program is a jump to location 100H. This is because the interrupts jump to locations between 5H and 100H. Thus a standard way to start a program is ORG 0:JP 100H:ORG 100H LD A,5 etc... the interrupts themselves are usually jumps also. Thus the interrupt at location 66H could be set by ORG 66H:JP Interrupt Interrupt:LD A,5 etc program to service interrupt. ORG is probably best ignored until you are familiar with the other instructions, as it is not necessary to write simple programs. *************************************************************** Chapter 13 Number Bases This chapter explains the number bases that are used by the interpreter. The appendix contains all the conversions from 0 to 255. For numbers larger than this the BASE command can be used. The bases to be cavered are binary, hexadecimal and two's complement. Binary Binary is the system of counting used by computers as it only has two digits, 0 and 1. A number in binary is written with a B on the end to differentiate it from the other bases; 1011B Hexadecimal Hexadecimal or Hex numbers use a base of 16, rather than 10 used in the decimal system. The digits used are 0 1 2 3 4 5 6 7 8 9 A B C D E F Hex numbers have a H on the end. In addition all H numbers should start with a number from 0 to 9 to distinguish them from text. A 0 is usually added to the beginning for this reason. Some examples of hex numbers are 0D3H 0FFH 012H 0ABCDH 28E6H 0H Two's complement Two's complement is a number system that ranges from -128 to +127. The result of the sum in two's complement is used to set one of the registers in the Z80; the overflow register. Numbers from 0 to 127 in decimal are the same in twos complement. However from 128 to 255 all two's complement numbers are negative. TC numbers are calculated by subtracting 256 from the dicimal number if the decimal number is between 128 and 255 inclusive. Thus 255 is -1 in TC, 128 is -128 and 45 is 45. There is no special ending to distinguish TC numbers, the - sign is all that is needed. Other bases Other bases such as octal are not used by the interpreter. ASCII symbols may be used providing they are in the range 32 to 127. They are written in quotes, thus LD A "s" results in A being 73 hex or 115 decimal, which is the ascii value for small s. ***************************************************************** Chapter 14 The flags This chapter discusses the 6 flags used by the Z80, and the conditions which affect them. The flags are represented in the register display by the symbols CZPSNH. The Z or zero flag The Z flag is set to 1 of the result of an operation is 0. If the result is other than 0 then the Z flag is reset to 0. The table below summarizes the instructions that affect the Z flag. Group Instruction Action 8 bit LD A I Z = 1 if register = 0 else 0 load group LD A R Z = 1 if register = 0 else 0 Search group CPI, CPIR, Z = 1 if A = (HL) else 0 CPD, CPDR ADD A x Z = 1 if register = 0 else 0 ADC A x " SUB x " SBC A x " AND x " 8 bit OR x " arithmetic XOR x " group CP x " INC x " DEC x " General purpose DAA " arithmetic group NEG " 16 bit ADC HL xx " arithmetic group SBC HL xx " RLC x " RL x " RRC x " Rotate and RR x " shift group SLA x " SRA x " SRL x " RLD " RRD " Bit test group BIT n x Z = 1 if bit = 0 else 0 Input and INR (C) Z = 1 if input data =0 else 0 output group INI, IND, Z = 1 if B-1=0 else 0 INIR, INDR, Z = 1 OUTI, OUTD, Z = 1 if B-1=0 else 0 OTIR, OTDR Z = 1 The S or sign flag The sign flag is used to indicate whether in twos complement notation a number is negative or positive. (see chapter 16 for more about two's complement) Thus if the number is negative (- 128 to -1) then the sign flag is set to 1. If the number is positive (0 to 127) then the sign flag is reset to 0. Group Instruction Action 8 bit LD A I S = 1 if I register negative else 0 load group LD A R S = 1 if R register negative else 0 Search CPI,CPIR, S = 1 if result negative else 0 group CPD,CPDR " ADD A x " ADC A x " SUB x " 8 bit SBC A x " arithmetic AND x " group OR x " XOR x " CP x " INC x " DEC x " General purp DAA " arithmetic NEG " 16 bit ADC HL xx " arithmetic SBC HL xx " RLC x " RL x " RRC x " Rotate and RR x " shift group SLA x " SRA x " SRL x " RLD x S = 1 if A negative else 0 RRD x S = 1 if A negative else 0 Bit test gp BIT n x may be anything / IN R (C) S = 1 if input data negative else 0 Input and INI,INIR, output IND,INDR, may be anything group OUTI,OTIR, \ OUTD,OTDR The C or carry flag The carry flag is used to indicate whether the result of an operation (in decimal) was greater than 255 or less than 0. LD A,150:ADD A,200 results in an answer of 350, which is adjusted to 94 ( or 5EH in hex ) by subtracting 256, and the carry flag is set. In subtraction the carry flag is used as a borrow, and is set to 1 if the answer was less then 0, and so had to be corrected by adding 256. LD A,100:SUB 210 results in -110, which is adjusted to 146 ( 92H ) by adding 256, and the carry flag is set to 1. Group Instruction Action / ADD A x C = 1 if carry from bit 7 else 0 ADC A x " 8 bit SUB x C = 1 if borrow else 0 arithmetic SBC A x " group AND C = 0 OR C = 0 XOR C = 0 \ CP C = 1 if borrow else 0 General / DAA C = 1 if bcd carry else 0 purpose NEG C = 1 if A not 0 before negate else 0 arithmetic CCF C = 1 if C = 0 before CCF else 0 group \ SCF C = 1 / ADD HL xx C = 1 if carry from bit 15 else 0 16 bit ADC HL xx " arithmetic ADD IX xx " group ADD IY xx " \ SBC HL xx C = 1 if borrow else 0 / RLCA C = previous A bit 7 RLA " RRCA C = previous A bit 0 Rotate RRA " and shift RLC x C = previous bit 7 of operand group RL x " RRC x C = previous bit 0 of operand RR x " SLA x C = previous bit 7 of operand SRA x C = previous bit 0 of operand \ SRL x C = previous bit 0 of operand The P or P/V parity or overflow flag As the heading suggests this flag has more than one function. Parity. The parity of a byte is the number of 1's the byte has when it is represented in binary. 43 decimal in binary is 00101011, which has 4 1's. If the number of 1's is even (including 0) then the byte has even parity and the P flag is set to 1. 59 in binary is 00111110 which has 5 1's and thus the P flag is set to 0. The instructions which use the P flag as a parity flag are indicated in the table. Overflow. This is the other major use for the P flag. Most of the arithmetic instructions use the P flag as an overflow flag, and this is why the flag is sometimes written as P/V. Overflow occurs when, during a two's complement addition the result in two's complement is >127 or <-128. (see the chapter on bases for more about two's complement). If this error condition occurs the P flag is set to 1, otherwise it is set to 0. The P flag is also used by the block transfer instructions, and is set to 1 if after the instruction the BC register is not equal to 0. Group Instruction Action 8 bit LD A I P = contents of IFF2 load group LD A R " Block / LDI, LDD, P = 1 if BC - 1 <> 0 else 0 transfer CPI, CPIR, " and load CPD, CPDR " group \ LDIR, LDDR P = 0 / ADD A x P = 1 if overflow else 0 ADC A x " SUB x " 8 bit SBC A x " arithmetic AND x P = 1 if parity even else 0 group OR x " XOR x " CP x P = 1 if overflow else 0 INC x P = 1 if x=7FH before, else 0 \ DEC x P = 1 if x=80H before, else 0 Gen purp DAA P = 1 if A parity even arithmetic NEG P = 1 if A = 80H before, else 0 16 bit ADC HL xx P = 1 if overflow else 0 arithmetic SBC HL xx " / RLC x P = 1 if perity even else 0 RL x " RRC x " Rotate and RR x " shift group SLA x " SRA x " SRL x " RLD x " \ RRD x " Bit test gp BIT n x may be anything / IN R (C) P = 1 if parity even else 0 Input and INI,INIR, may be anything output IND,INDR, " group OUTI,OTIR, " \ OUTD,OTDR " The following are a list of 8 bit additions and subtractions showing the calculation in decimal and in two's complement, with the effect on the S C and P flags. None of the answers are zero so the Z flag is zero for all of these. D 64 + 65 = 129 C = 0 TC 64 + 65 = 129 -> -127 P = 1 S = 1 D 255 + 255 = 510 -> 254 C = 1 TC -1 + -1 = -2 P = 0 S = 1 D 192 + 191 = 383 -> 127 C = 1 TC -64 + -65 = -129 -> 127 P = 1 S = 0 D 6 + 8 = 14 C = 0 TC 6 + 8 = 14 P = 0 S = 0 D 127 + 1 = 128 C = 0 TC 127 + 1 = 128 -> -128 P = 1 S = 1 D 4 + 254 = 258 -> 2 C = 1 TC 4 + -2 = 2 P = 0 S = 0 D 254 + 252 = 506 -> 250 C = 1 TC -2 + -4 = -6 P = 0 S = 1 D 2 + 252 = 254 C = 0 TC 2 + -4 = -2 P = 0 S = 1 D 129 + 194 = 323 -> 67 C = 1 TC -127 + -62 = -189 -> 67 P = 1 S = 0 D 254 - 129 = 125 C = 0 TC -2 - -127 = 125 V = 0 S = 0 D 196 - 91 = 105 C = 0 TC -60 - 91 = -151 -> 105 P = 1 S = 0 D 12 - 60 = -48 -> 208 C = 1 TC 12 - 60 = -48 P = 0 S = 1 D 146 - 231 = -85 -> 171 C = 1 TC -110 - 231 = -341 -> -85 P = 1 S = 1 The N or subtract flag and the H or half carry flag These two flags are used for BCD adds and subtracts. The DAA is the only instruction that uses these two flags, but the flags are affected by most of the instruction groups. The H flag indicates a carry from bit 3 in addition, and a borrow from bit 4 in subtraction. The N flag is 0 after an add and 1 after a subtract. Group Instruction H flag N flag 8 bit LD A I 0 0 load group LD A R 0 0 Block / LDI, LDIR, 0 0 transfer & LDD, LDDR, 0 0 Search CPI, CPIR, 1 if borrow from bit 4 else 0 1 group \ CPD, CPDR " ADD A x 1 if carry from bit 3 else 0 0 ADC A x " 0 SUB x 1 if borrow from bit 4 else 0 1 8 bit SBC A x " 1 arithmetic AND x 1 0 group OR x 0 0 XOR x 0 0 CP x 1 if borrow from bit 4 else 0 1 INC x 1 if carry from bit 3 else 0 0 DEC x 1 if borrow from bit 4 else 0 1 General purp DAA anything no change arithmetic NEG 1 if borrow bit 4 else 0 1 CPL 1 1 CCF no change 0 SCF 0 1 16 bit ADC HL xx 1 if carry from bit 11 else 0 0 arithmetic ADD HL xx " 0 ADD IX xx " 0 ADD IY xx " 0 SBC HL xx 1 if borrow from bit 12 else 0 1 RLCA 0 0 RLA 0 0 RRCA 0 0 RRA 0 0 RLC x 0 0 RL x 0 0 RRC x 0 0 Rotate and RR x 0 0 shift group SLA x 0 0 SRA x 0 0 SRL x 0 0 RLD x 0 0 RRD x 0 0 Bit test gp BIT n x 1 0 / IN R (C) 0 0 Input and INI,INIR, anything 1 output IND,INDR, anything 1 group OUTI,OTIR, anything 1 \ OUTD,OTDR anything 1 More about the flags The 6 flags are sometimes grouped into the so called F register. This register is combined with the A register to form the AF register, which is used in such instructions as EX AF AF', PUSH AF and POP AF. The flags are assigned as follows. Flag S Z - H - P N C Binary bit 7 6 5 4 3 2 1 0 **************************************************************** Appendix Values and conversion of bases and ASCII characters 1 = value in decimal 2 = value in hexadecimal 3 = value in binary 4 = value in two's complement 5 = ASCII charater if valid 1 2 3 4 5 0 00 00000000 0 CONTROL SHIFT P, NULL 1 01 00000001 1 CONTROL A 2 02 00000010 2 CONTROL B 3 03 00000011 3 CONTROL C 4 04 00000100 4 CONTROL D 5 05 00000101 5 CONTROL E 6 06 00000110 6 CONTROL F 7 07 00000111 7 CONTROL G, rings bell 8 08 00001000 8 CONTROL H 9 09 00001001 9 CONTROL I 10 0A 00001010 10 CONTROL J, line feed 11 0B 00001011 11 CONTROL K 12 0C 00001100 12 CONTROL L 13 0D 00001101 13 CONTROL M, carriage return 14 0E 00001110 14 CONTROL N 15 0F 00001111 15 CONTROL O 16 10 00010000 16 CONTROL P 17 11 00010001 17 CONTROL Q 18 12 00010010 18 CONTROL R 19 13 00010011 19 CONTROL S 20 14 00010100 20 CONTROL T 21 15 00010101 21 CONTROL U 22 16 00010110 22 CONTROL V 23 17 00010111 23 CONTROL W 24 18 00011000 24 CONTROL X 25 19 00011001 25 CONTROL Y 26 1A 00011010 26 CONTROL Z 27 1B 00011011 27 CONTROL SHIFT K, ESCAPE 28 1C 00011100 28 CONTROL SHIFT L 29 1D 00011101 29 CONTROL SHIFT M 30 1E 00011110 30 CONTROL SHIFT N 31 1F 00011111 31 CONTROL SHIFT O 32 20 00100000 32 SPACE 33 21 00100001 33 ! 34 22 00100010 34 " 35 23 00100011 35 # 36 24 00100100 36 $ 37 25 00100101 37 % 38 26 00100110 38 & 39 27 00100111 39 ' 40 28 00101000 40 ( 41 29 00101001 41 ) 42 2A 00101010 42 * 43 2B 00101011 43 + 44 2C 00101100 44 , 45 2D 00101101 45 - 46 2E 00101110 46 . 47 2F 00101111 47 / 48 30 00110000 48 0 49 31 00110001 49 1 50 32 00110010 50 2 51 33 00110011 51 3 52 34 00110100 52 4 53 35 00110101 53 5 54 36 00110110 54 6 55 37 00110111 55 7 56 38 00111000 56 8 57 39 00111001 57 9 58 3A 00111010 58 : 59 3B 00111011 59 ; 60 3C 00111100 60 < 61 3D 00111101 61 = 62 3E 00111110 62 > 63 3F 00111111 63 ? 64 40 01000000 64 @ 65 41 01000001 65 A 66 42 01000010 66 B 67 43 01000011 67 C 68 44 01000100 68 D 69 45 01000101 69 E 70 46 01000110 70 F 71 47 01000111 71 G 72 48 01001000 72 H 73 49 01001001 73 I 74 4A 01001010 74 J 75 4B 01001011 75 K 76 4C 01001100 76 L 77 4D 01001101 77 M 78 4E 01001110 78 N 79 4F 01001111 79 O 80 50 01010000 80 P 81 51 01010001 81 Q 82 52 01010010 82 R 83 53 01010011 83 S 84 54 01010100 84 T 85 55 01010101 85 U 86 56 01010110 86 V 87 57 01010111 87 W 88 58 01011000 88 X 89 59 01011001 89 Y 90 5A 01011010 90 Z 91 5B 01011011 91 [ 92 5C 01011100 92 \ 93 5D 01011101 93 ] 94 5E 01011110 94 ^ 95 5F 01011111 95 _ 96 60 01100000 96 ` 97 61 01100001 97 a 98 62 01100010 98 b 99 63 01100011 99 c 100 64 01100100 100 d 101 65 01100101 101 e 102 66 01100110 102 f 103 67 01100111 103 g 104 68 01101000 104 h 105 69 01101001 105 i 106 6A 01101010 106 j 107 6B 01101011 107 k 108 6C 01101100 108 l 109 6D 01101101 109 m 110 6E 01101110 110 n 111 6F 01101111 111 o 112 70 01110000 112 p 113 71 01110001 113 q 114 72 01110010 114 r 115 73 01110011 115 s 116 74 01110100 116 t 117 75 01110101 117 u 118 76 01110110 118 v 119 77 01110111 119 w 120 78 01111000 120 x 121 79 01111001 121 y 122 7A 01111010 122 z 123 7B 01111011 123 { 124 7C 01111100 124 | 125 7D 01111101 125 } 126 7E 01111110 126 ~ 127 7F 01111111 127 DELETE 128 80 10000000 -128 129 81 10000001 -127 130 82 10000010 -126 131 83 10000011 -125 132 84 10000100 -124 133 85 10000101 -123 134 86 10000110 -122 135 87 10000111 -121 136 88 10001000 -120 137 89 10001001 -119 138 8A 10001010 -118 139 8B 10001011 -117 140 8C 10001100 -116 141 8D 10001101 -115 142 8E 10001110 -114 143 8F 10001111 -113 144 90 10010000 -112 145 91 10010001 -111 146 92 10010010 -110 147 93 10010011 -109 148 94 10010100 -108 149 95 10010101 -107 150 96 10010110 -106 151 97 10010111 -105 152 98 10011000 -104 153 99 10011001 -103 154 9A 10011010 -102 155 9B 10011011 -101 156 9C 10011100 -100 157 9D 10011101 -99 158 9E 10011110 -98 159 9F 10011111 -97 160 A0 10100000 -96 161 A1 10100001 -95 162 A2 10100010 -94 163 A3 10100011 -93 164 A4 10100100 -92 165 A5 10100101 -91 166 A6 10100110 -90 167 A7 10100111 -89 168 A8 10101000 -88 169 A9 10101001 -87 170 AA 10101010 -86 171 AB 10101011 -85 172 AC 10101100 -84 173 AD 10101101 -83 174 AE 10101110 -82 175 AF 10101111 -81 176 B0 10110000 -80 177 B1 10110001 -79 178 B2 10110010 -78 179 B3 10110011 -77 180 B4 10110100 -76 181 B5 10110101 -75 182 B6 10110110 -74 183 B7 10110111 -73 184 B8 10111000 -72 185 B9 10111001 -71 186 BA 10111010 -70 187 BB 10111011 -69 188 BC 10111100 -68 189 BD 10111101 -67 190 BE 10111110 -66 191 BF 10111111 -65 192 C0 11000000 -64 193 C1 11000001 -63 194 C2 11000010 -62 195 C3 11000011 -61 196 C4 11000100 -60 197 C5 11000101 -59 198 C6 11000110 -58 199 C7 11000111 -57 200 C8 11001000 -56 201 C9 11001001 -55 202 CA 11001010 -54 203 CB 11001011 -53 204 CC 11001100 -52 205 CD 11001101 -51 206 CE 11001110 -50 207 CF 11001111 -49 208 D0 11010000 -48 209 D1 11010001 -47 210 D2 11010010 -46 211 D3 11010011 -45 212 D4 11010100 -44 213 D5 11010101 -43 214 D6 11010110 -42 215 D7 11010111 -41 216 D8 11011000 -40 217 D9 11011001 -39 218 DA 11011010 -38 219 DB 11011011 -37 220 DC 11011100 -36 221 DD 11011101 -35 222 DE 11011110 -34 223 DF 11011111 -33 224 E0 11100000 -32 225 E1 11100001 -31 226 E2 11100010 -30 227 E3 11100011 -29 228 E4 11100100 -28 229 E5 11100101 -27 230 E6 11100110 -26 231 E7 11100111 -25 232 E8 11101000 -24 233 E9 11101001 -23 234 EA 11101010 -22 235 EB 11101011 -21 236 EC 11101100 -20 237 ED 11101101 -19 238 EE 11101110 -18 239 EF 11101111 -17 240 F0 11110000 -16 241 F1 11110001 -15 242 F2 11110010 -14 243 F3 11110011 -13 244 F4 11110100 -12 245 F5 11110101 -11 246 F6 11110110 -10 247 F7 11110111 -9 248 F8 11111000 -8 249 F9 11111001 -7 250 FA 11111010 -6 251 FB 11111011 -5 252 FC 11111100 -4 253 FD 11111101 -3 254 FE 11111110 -2 255 FF 11111111 -1