The flag register has the following structure:
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Flag | S | Z | F5 | H | F3 | P/V | N | C |
? indicates the effect is undefined. * indicates the effect is non-standard (see the notes). 0 indicates the flag is reset. 1 indicates the flag is set. - indicates the flag is not affected. S,Z,5,H,3,P,V,N,C indicate the flag is set as above. r refers to any 8-bit quantity appropriate for that instruction. s refers to any 16-bit quantity appropriate for that instruction. Instruction Flags Notes =========== ===== ===== ADD/ADC/SUB/SBC SZ5H3VNC CP r SZ*H*VNC CP is just SUB with the result thrown away F5 and F3 are copied from the operand, not the result INC/DEC r SZ5H3VN- 16 bit additions are done in two steps: First the two lower bytes are added, the two higher bytes. ADD s --***-0C F5,H,F3 from higher bytes addition ADC/SBC s SZ***VNC F5,H,F3 from higher bytes addition AND r SZ513P00 OR/XOR r SZ503P00 RLCA/RLA/RRCA/RRA --503-0C RLC/RL/RRC/RR r SZ503P0C SLA/SLL/SRA/SRL r SZ503P0C SLL is like SLA except b0 gets set RRD/RLD SZ503P0- Flags set on result in A BIT n,r *Z513*0- PV as Z, S set only if n=7 and b7 of r set Behaves much like AND r,2^n CCF --***-0* C=1-C, H as old C F5, F3 from A register SCF --*0*-01 F5, F3 from A register CPL --*1*-1- F5, F3 from A register NEG SZ5H3V1C A=0-A (Zaks gets C wrong) DAA SZ5*3P-* H from internal correction, C for cascade BCD LD A,R/LD A,I SZ503*0- PV as IFF2 [yaze doesn't affect F?] LDI/LDIR/LDD/LDIR --*0**0- PV set if BC not 0 F5 is bit 1 of (transferred byte + A) F3 is bit 3 of (transferred byte + A) CPI/CPIR/CPD/CPDR SZ*H**1- PV set if BC not 0 S,Z,H from (A - (HL) ) as in CP (HL) F3 is bit 3 of (A - (HL) - H), H as in F after instruction F5 is bit 1 of (A - (HL) - H), H as in F after instruction IN r,(C) SZ503P0- Also true for IN F,(C) INI/INIR/IND/INDR SZ5?3??? Flags affected as in DEC B OUTI/OTIR/OUTD/OTDR SZ5?3??? Flags affected as in DEC B All others -------- Except for POP AF and EX AF,AF', of course...