Talk:RTS Trick: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
No edit summary
No edit summary
Line 6: Line 6:
* I personally think the RTS Trick is more readable.  If I see a table of pointers in my (or somebody else's) code and they all have a "-1" after them, I immediately know their purpose and how they are used.
* I personally think the RTS Trick is more readable.  If I see a table of pointers in my (or somebody else's) code and they all have a "-1" after them, I immediately know their purpose and how they are used.
* PHA, PHA, RTS requires less bytes than STA, STA, JMP (3 vs. 9).
* PHA, PHA, RTS requires less bytes than STA, STA, JMP (3 vs. 9).
If you use self modifying code and assure that the table has to start at a page border (and store pointers to the routines, without the -1) then you can use a smaller and faster code:
tb_opcode_launcher_smc:
; bytes, cycles
asl ; 1, 2
sta smc+2 ; 3, 4
smc:
jmp (tb_opcode_rts_table) ; 3, 5
; total 7 bytes and 11 cycles
tb_opcode_launcher:
; bytes, cycles
asl ; 1, 2
tax ; 1, 2
lda tb_opcode_rts_table+1, x ; 3, 4
pha ; 1, 3
lda tb_opcode_rts_table, x ; 3, 4
pha ; 1, 3
rts ; 1, 6
; total 11 bytes and 24 cycles

Revision as of 16:01, 21 May 2013

is there an advantage over using JMP ($0200), where $0200 has been loaded from the same kind of jump-table? that's what I wonder, but I'm not gonna count up the cpu cycles needed for either method right now.


MetalSlime: Not sure. Seems like a pick'em to me. Here are some things that come to mind:

  • RTS Trick doesn't require any RAM.
  • I personally think the RTS Trick is more readable. If I see a table of pointers in my (or somebody else's) code and they all have a "-1" after them, I immediately know their purpose and how they are used.
  • PHA, PHA, RTS requires less bytes than STA, STA, JMP (3 vs. 9).


If you use self modifying code and assure that the table has to start at a page border (and store pointers to the routines, without the -1) then you can use a smaller and faster code:

tb_opcode_launcher_smc:
	; bytes, cycles
	asl ; 1, 2
	sta smc+2 ; 3, 4
smc:
	jmp (tb_opcode_rts_table) ; 3, 5
	; total 7 bytes and 11 cycles
tb_opcode_launcher:
	; bytes, cycles
	asl ; 1, 2
	tax ; 1, 2
	lda tb_opcode_rts_table+1, x ; 3, 4
	pha ; 1, 3
	lda tb_opcode_rts_table, x ; 3, 4
	pha ; 1, 3
	rts ; 1, 6
	; total 11 bytes and 24 cycles