Assembler of your choice

Discuss technical or other issues relating to programming the Nintendo Entertainment System, Famicom, or compatible systems.

Moderator: Moderators

Which assembler you use?

Total votes: 84

Posts: 1161
Joined: Sat Jan 23, 2010 11:41 pm

Assembler of your choice

Post by Shiru » Wed Dec 15, 2010 12:38 pm

I would like to get idea which assemblers are most popular for NES development today. Please vote for one you use currently. If you use something else, post it in thread.

Posts: 110
Joined: Mon Nov 16, 2009 5:59 am

Post by Wave » Wed Dec 15, 2010 12:55 pm

I use neshla :p and hope to change to: hlakit when it's 100% completed

Posts: 9673
Joined: Sun Apr 13, 2008 11:12 am
Location: Seattle

Post by lidnariq » Wed Dec 15, 2010 1:18 pm

For no particularly good reason, I'm using xa65. (It was the only 6502 assembler available in debian when I started)

Posts: 22052
Joined: Sun Sep 19, 2004 11:12 pm
Location: NE Indiana, USA (NTSC)

Post by tepples » Wed Dec 15, 2010 2:34 pm

lidnariq wrote:For no particularly good reason, I'm using xa65. (It was the only 6502 assembler available in debian when I started)
And it still is the preferred 6502 assembler in Debian. It appears that the only way FCE Ultra could get into Debian and Ubuntu was as a requirement for EFP, a Free NES game made with xa65. And even that's not enough for Fedora. Someone on fedora-legal appears to think the noninfringing use is not clearly substantial, comparing hundreds or thousands of infringing ROMs in a GoodNES set to only a few dozen playable games on and citing Nintendo policy.

I use ca65. There's a request to package ca65 in Ubuntu Launchpad, but it's easy to compile from source after you sudo apt-get install build-essential. I like its auto-unroller (.repeat), function-local labels (.proc), and the flexibility of using object files and a linker script in much the same way that I have on the PC and GBA.
Last edited by tepples on Wed Dec 15, 2010 2:47 pm, edited 1 time in total.

User avatar
Posts: 7951
Joined: Fri Nov 12, 2004 2:49 pm
Location: Chexbres, VD, Switzerland

Post by Bregalad » Wed Dec 15, 2010 2:40 pm

I use Wla but I guess the "proper" choice is CA65 because it has the most features.
Useless, lumbering half-wits don't scare us.

User avatar
Posts: 11858
Joined: Sat Feb 12, 2005 9:43 pm
Location: Rio de Janeiro - Brazil

Post by tokumaru » Wed Dec 15, 2010 4:06 pm

CA65 seems like a very professional choice, and I guess I would use it if I didn't have to spend so much time tinkering with it before getting it to do anything useful. NESASM is the exact opposite of that: it's very easy to use, but it's also very crude, full of little annoyances and bugs.

The best thing about ASM6 (my assembler of choice) is that it's easy to use, making it just as suitable for beginners as NESASM (but since the popular beginner guides use NESASM, it gets the most attention), but it gives you enough freedom to make programs as complex as you want because that are features to make that easier.

User avatar
Posts: 2832
Joined: Wed Dec 06, 2006 8:18 pm

Post by MottZilla » Wed Dec 15, 2010 9:11 pm

I prefer ASM6 for ease of use and flexibility.

User avatar
Posts: 186
Joined: Tue Aug 19, 2008 11:01 pm
Location: Japan

Post by MetalSlime » Wed Dec 15, 2010 9:45 pm

Currently I use ca65 for my main project, but I fire up ASM6 when I need to make a little test program because it's easier to produce a ROM from scratch. I might try ASM6 for my next project since it gets so much praise, but I'm too far along in my current project to make the switch now.

I also have a copy of NESASM on my computer in case I need to help a beginner who is using it.
tokumaru wrote:since the popular beginner guides use NESASM, it gets the most attention
It would be really easy to "port" those tutorials over to ASM6. If somebody did the conversion work for him, I wonder if bunnyboy would mind swapping them out or at least posting the two versions together.

Posts: 1322
Joined: Mon Sep 27, 2004 2:57 pm

Post by Drag » Thu Dec 16, 2010 12:16 am

I think I might be the only person on Earth who uses DASM. :(

User avatar
Posts: 44
Joined: Wed Nov 24, 2010 12:51 am
Location: Finland

Post by picccca » Thu Dec 16, 2010 1:47 am

I recently started coding for the NES some weeks ago. I followed the tutorial at nintendoage and I started using NESASM. This week however I changed to ASM6 because it seems to me that people are preferring ASM6 over NESASM here at NESDev, so I wanted to change assembler before I learned to code with NESASM. But in the end I think they are quite similar.

User avatar
Posts: 3141
Joined: Mon Jan 03, 2005 10:36 am
Location: Tampere, Finland

Post by thefox » Thu Dec 16, 2010 5:47 am

I use CA65. The only thing I have to complain about it is that when there's an error in a macro block, it doesn't display the exact line of the error, it displays the line where the macro was called. Also debug line info isn't stored for macros and .repeat blocks, so debugging long macros can be a pain sometimes.
Drag wrote:I think I might be the only person on Earth who uses DASM. :(
I used to use it, but there were some obscure bugs in it. Generally it works fine though. Seems to be hot stuff in the Atari 2600 scene.
Download STREEMERZ for NES from! — Some other stuff I've done:

User avatar
Posts: 504
Joined: Sat Oct 29, 2005 2:09 am
Location: Indianapolis

Post by kevtris » Thu Dec 16, 2010 1:03 pm

What, no love for X816? I like X816 and have been using it for a long time now to do NES and other random 6502 coding. It's fast, has all the stuff I like (incbin, relative labels, etc) and works.

Sometimes I will use tasm, but mainly if I'm doing something with copynes. These days, if it's 6502, it's X816.
/* this is a comment */

Posts: 398
Joined: Wed Feb 17, 2010 5:42 pm

Post by Denine » Thu Dec 16, 2010 1:06 pm

I use NESASM..just because i don't really know how to use others,except ASM6.
And it's too late to convert it into another assembler.
Plus NESASM have most of tutorials based on it.

User avatar
Posts: 1107
Joined: Sun Nov 09, 2008 9:18 pm
Location: Pennsylvania, USA

Post by GradualGames » Thu Dec 16, 2010 1:54 pm

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: Select all

#Config file for SoundEngine

  #iNES header
  HEADER:   start = $0,    size = $10,   fill = yes;  
  ZP:       start = $0,    size = $100,  fill = no; 
  STACK:    start = $0100, size = $100,  fill = no;
  RAM:      start = $0200, size = $600,  fill = no;
  ROM0:     start = $8000, size = $4000, fill = yes; 
  #fixed prg-rom
  ROMFIXED: start = $c000, size = $3ffa, fill = yes;
  ROMV:     start = $fffa, size = $6,    fill = no;
  CHRROM0: start = $0000, size = $2000, fill = yes;

  HEADER:   load = HEADER,   type = ro,  optional = yes;
  ZEROPAGE: load = ZP,       type = zp,  optional = yes; 
  STACK:    load = STACK,    type = bss, optional = yes; 
  BSS:      load = RAM,      type = bss, optional = yes; 
  ROM0:     load = ROM0,     type = ro,  optional = yes; 

  #fixed prg-rom  
  CODE:     load = ROMFIXED, type = ro,  optional = yes; 
  VECTORS:  load = ROMV,     type = ro,  optional = yes;   
  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.

Posts: 22052
Joined: Sun Sep 19, 2004 11:12 pm
Location: NE Indiana, USA (NTSC)

Post by tepples » Thu Dec 16, 2010 2:57 pm

kevtris wrote:What, no love for X816?
Not everyone wants to fire up DOSBox or a FreeDOS virtual machine just to compile something. That's the single reason why I moved LJ65 from X816 to ca65.

Post Reply