Bugs and flaws of the 6510 +--------------------------+ Zeropage addressing modes & page wraps (fixed on 65816 in native mode): If you use an indexed-zeropage addressing mode, either direct or indirect, it is not able to leave the zeropage on page-wraps. Examples: LDX #$01 LDA $FF,X will fetch from adress $0000 and not $0100. LDA ($FF),Y LDX #$00 LDA ($FF,X) LDX #$FF LDA ($00,X) will all fetch the low-byte from $00FF and the high-byte from $0000. Indirect addressing mode & page wraps (fixed on 65816): If you use the indirect addressing mode, PCH will not be incremented on page wraps. Example: JMP ($C0FF) will fetch the low-byte from $C0FF and the high-byte from $C000. Decimal mode (flags fixed on 65816): In decimal mode, N and V are set after the high-order nibble is added or subtracted but before it is decimal-corrected, according to binary rules. Z is always set according to binary mode, not decimal. When decimal-correcting a nibble for addition, following rules apply: IF ((nibble >= $A) \/ C') THEN nibble += 6 C'' = C' \/ (nibble + 6 >= $A) When decimal-correcting a nibble for subtraction, following rules apply: IF (~C') THEN nibble -= 6 C'' = C' \/ (nibble - 6 < 0) Thus, $F + $F in decimal mode is $14, not $24. Also, decimal correction can result in nibbles ranging from $A-$F. For example, $C + $D results in $19 before correction, $1F after. |