1
0
mirror of https://github.com/safiire/n65.git synced 2024-12-12 00:29:03 +00:00
An assembler for the 6502 microprocessor written in Ruby
Go to file
2015-02-22 17:39:35 -08:00
data Intermediate commit 2015-02-22 05:59:03 -08:00
lib Some updates but assemblying programs with multiple banks, or more prog and char sections is messed up 2015-02-22 17:39:35 -08:00
test Initial Commit 2015-02-17 19:05:37 -08:00
utils Initial Commit 2015-02-17 19:05:37 -08:00
.gitignore Accidentally had the opcode for TXA be NOP, don't know how that happened. I ported background.asm from NESASM format to my format, it is veeeery similar so not much needed changing, and the resulting ROM worked fine :) 2015-02-18 03:56:39 -08:00
assembler_6502.rb Ported NES101 tutor to this assembler, fixed the PROG and CHR positioning in the ROM, added more directives .ascii etc. 2015-02-18 18:36:22 -08:00
assembler_demo.png Updaing readme, adding an image 2015-02-18 18:44:17 -08:00
background.asm Initial Commit 2015-02-17 19:05:37 -08:00
beep.asm I have added many directives, such as .org, ines header, .dw, .bytes, and made it produce proper Roms launch into the entry point at 0xC000 from the reset vector. I basically rewrote the Assembler class, this could still use some cleaning up though, more unit tests, and to compile some code with CHR segments 2015-02-18 03:05:18 -08:00
LICENSE Initial commit 2015-02-17 18:26:26 -08:00
mario.chr Initial Commit 2015-02-17 19:05:37 -08:00
my_background.asm Accidentally had the opcode for TXA be NOP, don't know how that happened. I ported background.asm from NESASM format to my format, it is veeeery similar so not much needed changing, and the resulting ROM worked fine :) 2015-02-18 03:56:39 -08:00
nsf_player.asm Intermediate commit 2015-02-22 05:59:03 -08:00
README.md Updaing readme, adding an image 2015-02-18 18:44:17 -08:00
scroll.asm Ported NES101 tutor to this assembler, fixed the PROG and CHR positioning in the ROM, added more directives .ascii etc. 2015-02-18 18:36:22 -08:00
some_beeps.nsf Intermediate commit 2015-02-22 05:59:03 -08:00
whatever.inc Intermediate commit 2015-02-22 05:59:03 -08:00

assembler6502

An NES assembler for the 6502 microprocessor written in Ruby

Usage: ./assembler_6502.rb <infile.asm> -o outfile.nes

This is a pretty straightfoward assembler, that is currently set up to produce iNES ROM formatted binaries from simple assembly listings. It is good at knowing which addressing modes are and are not allowed for each instruction, and contains some examples of correct syntax.

Parsing is done by Regular Expression, because, well the language is so regular, it actually took less time than anything else I've tried to parse in the past, including Scheme using parsec.

It handles labels, and does a two pass assembly, first assembling the byte codes, and then going back and filling in the proper addresses where labels were used.

I have used this to compile some code for the NES, and it ran correctly on FCEUX, got it to make some sounds, load tiles, sprites, and scrolling.

Scrolling NES Demo

Some Todos:

  • I may make this into a Rubygem
  • Maybe I can put some better error messages.
  • Should I also make a 6502 Emulator in Ruby?

Some new additions:

  • Ported NES101 tutor to this assembler.
  • Added msb and lsb byte selectors on address labels
  • added .org directive
  • added .dw directive
  • added .bytes directive
  • added .incbin directive
  • added .ascii directive
  • Invented my own iNES header directive that is JSON
  • Split the project up into separate files per class
  • Wrote some more unit tests
  • Added OptionParser for commandline opts
  • Tested a ROM with Sound output
  • Tested a ROM that changes background color

I decided that during the first pass of assembly, I should just initialize an entire 65535 byte virtual memory images, and write the instructions to their correct places, and then after resolving symbols during the second pass, I just clip out the Cartridge ROM area and iNES header at the end, works great so far.