In 68k I was used to being able to do things like add.l d0, d1 to add the value in d0 to d1. I've just started playing around with some 6502 development on the Atari 2600 for the first time, and it appears as though you can't add the value of the X or Y registers to the accumulator.
Think of it like the 68k's distinction between data and address registers. A is the generic data register, all data operations (*1) are done on A. X/Y are index registers with the only purpose to add an index to a direct or indirect address.
Is the only way to add the value in X to write it out to memory with an stx and then perform a subsequent adc to add to the accumulator from that memory address?
One obvious way is using a table like Tommy already mentioned. Such a table can be used for many more programming tricks (*2). Except, on a VCS ROM is almost as rare as RAM. a 256 byte table occupies already 1/16th of the address space available (*3). Then again, space can be saved when the range of the value to be added is known.
A special way to do operations on a 2600 is to use the stack, as it shares RAM with the zero page. Usually the content of the stack pointer is well known, thus a combination of PHA, TXA and ADC zp, using the known stack location will work as well.
Of course this depends a lot on how stack is used in your program. In general it is more appropriate to adept programming style to how the 6502 is designed/intended to be used - like with every CPU.
The 6502 is a special beast and 2600 programming a neat playground, isn't it?
*1 - Except INC/DEC which has been added with the 65C02.
*2 - For example by extending the table it can be used to add constants to index registers, like when walking a sprite table.
*3 - The address space for ROM is 4 KiB. While there are multiple pages possible, a table can only be used from code within the same ROM page. So the table either needs to be copied into each ROM page that uses it, or a page flip has to be done - which is for sure more expensive than a STX/ADC combination.