User:Zzo38/6502 programming tricks
Toggle the zero flag
PHP PLA AND #2
- Bytes: 4
- Cycles: 9
Main-effect:
- Zero flag: toggled.
Side-effect:
- Accumulator: set to 0 or 2.
- Negative flag: cleared.
Rotate accumulator left 8-bits
ASL A ADC #0
- Bytes: 3
- Cycles: 4
Main-effect:
- Accumulator: shifted left, with shifted-out bit shifted-in.
Side-effect:
- Carry flag: cleared.
Signed compare
One way to do this is by toggling the high bit of both numbers before comparison. For example, if 8-bit numbers:
EOR #$80
RTS trick
See RTS Trick.
Tail recursion
- Bytes: -1
- Cycles: -9
This can be done by replacing a JSR/RTS with just a JMP, since the subroutine it jumps to will have its own RTS.
Fall-through tail recursion
- Bytes: -4
- Cycles: -12
Instead of jumping to another subroutine, you can just fall-through into it. In fact you can even JSR to it and then fall through to it (possibly doing something else in between if wanted), if you want to run it twice; Super Mario Bros. uses this pattern.
Note: This should be done itself inside of a subroutine which finally does the same effect as another, so it still needs to be called.
Compressed data in CHR ROM
(TODO)
Storing high byte and low byte of an address in separate tables
(TODO)
Dealing with carry flag
Several things can be done with the carry flag, such as:
- If you want to use a AND instruction and clear the carry flag at the same time, you can use the unofficial ANC instruction, if the high bit of the operand is cleared.
- Often you can tell that the carry flag will have a specific state (such as after a conditional branch), which can help when using a ADC or SBC instruction.
Clear accumulator and carry flag and reset bank
CLC RLA ident
- Bytes: 4
- Cycles: 8
In this program, "ident" should point to a zero byte in ROM. The "official" way would be:
CLC LDA #0 STA ident
- Bytes: 6
- Cycles: 8