Writing up a cross-reference of the assembler directives (including the macro language!) in all the assemblers would indeed be a huge job, that is, for researching them all. I'm sure even the most experienced 6502'ers have used less than five assemblers for the '02. I've used three, one of them being my own which I wrote to use in my Forth system, plus C32, and 2500AD.
You don't need ZP variables to access strings. You can use absolute,X. You'll need ZP if you do (ZP,X) or (ZP),Y addressing. Without the indirects, indexing is available anywhere, not just in ZP.
Suppose your error message is needed is several places, and it makes sense to only have the data once, instead of repeating it everywhere it's needed. So you might do for example,
Code:
LDA #<ErrMsg1 ; Get the low byte of the message address (but give it a descriptive name)
LDY #>ErrMsg1 ; and the high byte.
JSR DispMsg ; The subroutine will put them in a variable, and index it.
<continue>
<and somewhere else in memory, probably with a collection of other strings:>
ErrMsg1: BYTE "Why would you type such a foolish thing?", 0
If the data are only needed in one place, another way to do it is to have the data immediately follow the JSR. It won't need a label. The subroutine uses the return address that the JSR puts on the stack to find the data, and it also adjusts that address so when the RTS is reached, the program counter goes to the first instruction after the data, rather than trying to execute data as if it were instructions. I address this, with example code, in the "
Inlining subroutine data" chapter of the stacks treatise.
You will soon want to get into macros so you can do the same thing with the same output while making your source code shorter and more clear. (This is covered at the link above too.)
I see floobydust posted while I was writing. I like his table method too.