Is there an standardised 6502 assembly syntax?
Not really. While MOS' own Cross-Assembler might have been a base, it was way too primitive to be be considered. Still, there is a line that can be followed from that cross assembler over the KIM resident assembler and various Commodore/CBM assemblers all the way to more recent implementation like CA65.
So if (some) compatibility, CA65 would be the best to look at. On the other hand, there are Assemblers coming from a more professional background with no relation to the MOS linage - and as usual anything inbetween.
Wiki has a list of various 6502 assemblers, which may be a good start for research.
MOS History
Michael Steil did research this genealogy on pagetable, describing it in a series of articles:
MOS Heritage
As mentioned it's a rather primitive one 48 pages are enough to describe everything - more due using a very spacious layout thanproviding much content :))
It essentially offers only 6 code relevant direktives:
- Defining a label
- Using = to modify labels
- .byte for byte values
- .word for LSB words
- .dbyte for a MSB words
- * as special label to access the location counter
Later versions added more capabilities - see above link-list.
Today's Star CA65
The MOS/Commodore linage, can be seen in many later 6500 assemblers trying to keep compatibility, all the way to CC65's assembler CA65. CA65 has gained good popularity in recent years, not at least due being close to older MOS assemblers. Of course integration into a whole development system including C compiler and linker as well as bindings for all common 6502 systems might have played a role.
If your target audience is somewhat Commodore-affine, CA65 should be your prototype.
On the other hand, CA65 is also a great example how bloaty and problematic compatibility can be. For example by providing multiple ways to do the same (e.g.'>' and '.highbyte'). They all have a good reason to be there, but do not exactly help to understand what to use.
The Inbetweens: Big Mac/Merlin and EDASM
A structure more alike used by professional assemblers for other CPUs can be found with Apple II assemblers like Merlin (originally Big Mac) and Apples own EDASM. Here directives are pseudo ops not prefixed in any way. Both (Merlin, Merlin 8/16, EDASM) offer a quite useful toolbox, but are mostly restricted to being stand alone products and Apple II centric.
The Other END: ORCA-M
At first ORCA-M may seem similar to EDASM or more generic assemblers, until one takes a closer look at it's macro language and unusual rich handling of compile time variables. Mainframe people will get big eyes, as ORCA-M follows, wherever possible, the structure set by IBM's F-Assembler for /370 mainframes.
Here the macro facilities aren't some add on to unroll code with, but a full fledged procedural DSL executed during compile time (*1). The possibilities to enhance and modify Assembler behaviour is almost endless (*2).
Maybe even more important, ORCA/M is part of an environment also featuring C, Pascal and Modula-2 compilers. No wonder that Apple selected the ORCA-suite as base for the Apple IIgs (65816) Apple Programmer's Workshop.
So What?
Well, for your own assembler it's all about if you want to follow one of those lines and which one. Hard to give any advice not diluted by personal preference - which in my case is of course 100% with ORCA/M's style :))
Format Question:
But what about assembler directives, defines, labels, etc? I see labels with a colon and without, defines with equals signs, or the keyword define. There doesn't seem to be a standard...
They follow different philosophies - and in some case (like CA65) the idea to offer more than one way to catch the users of different prior products. Also, Assembler is, like any other language, as well about being easy to write. The colon after a label being a good example: Most assembler only require it if the label is on a line of it's own - without any mnemonic to follow. Or the equal sign being a left over from the very primitive MOS assembler ... and so on.
Again, all yours to pick your own style.
*1 - It's possible, within limits, to write programs using the assembler as kind of an interpreter language for other purposes than just generating code. On /370 it wasn't unusual to use it as script language to transform data.
*2 - Somewhen around 1980 I wrote a small BASIC compiler using the macro language. That is, not a compiler program, but a set of macros generating machine codes from BASIC statements.