Indirect,X is not what you want -- and I'd argue is only useful is VERY LIMITED circumstances. It does the +X BEFORE the pointer is dereferenced, not after.
When X=2, The pointer being read is from $56. It's not reading the pointer from $54 at all.
What you are looking for is Indirect,Y mode... which is the same, but the indirection happens first, and the indexing afterward:
Things to note:
- The comma denotes indexing (addition)
- The parenthesis denote dereferencing (pointer lookup)
- Indirect, X has the comma inside the parenthesis "($54,X)" because the addition is first
- Indirect, Y has the comma outside the parenthesis "($54),Y" because the indirection is first