Like MetalSlime, I use CA65 for my main big project and ASM6 for testing things. I used to think CA65's ability to use segments made it way easier to re-organize data than assemblers such as ASM6, but I didn't realize until recently you could have one top level source file whose sole purpose is to organize all your code and data across banks and simply include the source files and data. It's just a different way of accomplishing the same result.
Even so, I still like some of CA65's syntactic perks, such as .lobytes and .hibytes, scopes, etc. Scopes are nice, because they allow you to re-use some label names in the same chunk of code, instead of anonymous labels for example.
As for how difficult it is to set up, I think it is about the same. The "config" file which you use to set up memory areas and segments, is really like the top level bank organization source file you might have in an ASM6 program. From my sound engine demo:
Code:
#Config file for SoundEngine
MEMORY
{
#iNES header
HEADER: start = $0, size = $10, fill = yes;
#ram
ZP: start = $0, size = $100, fill = no;
STACK: start = $0100, size = $100, fill = no;
RAM: start = $0200, size = $600, fill = no;
#prg-rom
ROM0: start = $8000, size = $4000, fill = yes;
#fixed prg-rom
ROMFIXED: start = $c000, size = $3ffa, fill = yes;
#vectors
ROMV: start = $fffa, size = $6, fill = no;
#chr-rom
CHRROM0: start = $0000, size = $2000, fill = yes;
}
SEGMENTS
{
#header
HEADER: load = HEADER, type = ro, optional = yes;
#ram
ZEROPAGE: load = ZP, type = zp, optional = yes;
STACK: load = STACK, type = bss, optional = yes;
BSS: load = RAM, type = bss, optional = yes;
#prg-rom
ROM0: load = ROM0, type = ro, optional = yes;
#fixed prg-rom
CODE: load = ROMFIXED, type = ro, optional = yes;
#vectors
VECTORS: load = ROMV, type = ro, optional = yes;
#chr-rom
CHRROM0: load = CHRROM0, type = ro, optional = yes;
}
The "fill = yes" and "size" parameters work like .pad in ASM6. "start" is like .base. The "fill = no" usually would be used for RAM where you're just incrementing the program counter with reserve statements but not outputting any bytes.