I've just published a modernized version of my old "Ophis" assembler: http://michaelcmartin.github.com/Ophis/
It does seem like the community has largely standardized on CA65, which is a very good assembler indeed, but there are three reasons this may be of general interest:
It does seem like the community has largely standardized on CA65, which is a very good assembler indeed, but there are three reasons this may be of general interest:
- Its complexity level occupies a midpoint between CA65 and NESASM; it's as flexible in its output as CA65 but tries to bind source and binary together a little more closely, hopefully making it a little easier to get off the ground.
- People who (like me) grew up on x86 and MIPS assembler may find the format more congenial.
- I've gathered all my writings on exploiting high-level language features in 6502 assembler and bundled it with the documentation. These are likely to be useful to programmers of medium skill in any assembler. This includes working protocols for object-orientiation-like effects as well as full recursion.
- Full memory segmentation, with a complete divorce between the "program counter" and the file format. You may maintain as many segments as you want, and can enforce that some segments never hold initialized data. Within a segment you can arbitrarily reassign the program counter, allowing for one to write relocatable code without necessarily also making it position-independent.
- A strict relationship in output order between source and binary. This is either a missing feature compared to CA65 or one less thing to worry about compared to it, depending on taste.
- Optional support for emitting undocumented opcodes.
- Automatic instruction collapse (zero page selection) and automatic expansion of illegal branch instructions into branch-jump pairs.
- Full support for temporary labels within arbitrarily nested scopes as well as fully anonymous labels to make writing tight loops more convenient.
- A unique macro system based on function-call semantics instead of the more traditional textual replacement.
- In-source output control, which means that someone else assembling your code will usually only have to type "ophis srcname.oph" and get the right results, while still letting the user override it at the commandline.