Transforms Hack Assembly into Hack Machine Language
Go to file
Collin J. Doering 4f9ee54c3a Fix typo in README.md
Signed-off-by: Collin J. Doering <collin.doering@rekahsoft.ca>
2015-12-07 23:57:28 -05:00
doc/examples
src Removed unnecessary uses of try from Parser 2015-07-06 04:46:12 -04:00
testsuite
.gitignore
Asmblr.cabal Restructured cabalized project 2015-06-17 17:53:37 -04:00
LICENSE
README.md Fix typo in README.md 2015-12-07 23:57:28 -05:00
Setup.hs

Hack Assembler in Haskell

Introduction

Asmblr is a small Haskell program that transforms Hack Assembly into its machine language representation. The parser itself is made available though the library hackasm and can be included in other projects. To see its documentation run cabal haddock and view the documentation in dist/doc.

Features

  • Follows a similar structure to the implementation describe by the Nand to Tetris book
  • Faster then the implementation given with the Nand to Tetris course
  • Can read from stdin and write to stdout (if requested)
  • Uses open-source tools wherever possible

Building

Asmblr requires GHC and cabal to be built and can be done like so:

$ cabal configure
$ cabal build

Once built, the Asmblr executable will be in the dist/build/Asmblr folder, and can be run using you shell or cabal (via the command cabal run Asmblr). The Asmblr program can also be installed using cabal install. For more information on installing cabal packages and using cabal see its manual.

Usage

This project comes with the directory doc/examples that contains example Hack Assembly programs used for testing the assembler. To clarify how to run the Asmblr binary once built we will use of of the aforementioned Hack Assembly files as an input, in this case doc/examples/Pong.asm.

Running the Asmblr using cabal:

$ cabal run Asmblr -- doc/examples/Pong.asm

Running the Asmblr using POSIX shell:

$ ./dist/build/Asmblr/Asmblr doc/examples/Pong.asm

Both of the previous commands invoke the Asmblr on the file doc/examples/Pong.asm and generate a file Pong.hack in the current directory. Asmblr also supports taking input from stdin as well as writing its output to stdout or an arbitrary file given by the user. For convenience the output of Asmblr --help is provided below.

Usage: Asmblr [OPTION...] file
  -v        --verbose        chatty output on stderr
  -V        --version        show version number
  -h        --help           show program usage
  -o[FILE]  --output[=FILE]  output file or '-' for stdout

Tools

The creation of this software was made possible by the following open source tools and libraries.

  • Gnu Emacs, because there is no place like home; and no greater editor!
  • GHC, for compilation of Haskell code
  • Cabal, for building the project

License

This project is licensed under the GPLv3. Please see the LICENSE file for full details.

Issues

There are some minor issues that can be cleaned up in future releases. Namely, making error output more human readable, and a few minor optimization's.

  • Explicitly handle if input file dne or is unreadable
  • Explicitly handle if output file is un-writable
  • Create ParseException type to throw from parser and can be caught in RekahSoft.HackAsm.CommanLine.defaultMain
  • Add (<?> "error description") throughout parsers to make error output more readable
  • Write tests so that future changes don't break things (see folder testsuite)

If you discover a bug or have an issue with this project, please file a bug using the Rekahsoft flyspray powered bug tracker.

The Hack Machine Code generated by this assembler is only useful if a Hack machine or simulator is available. One such simulator is available with the Nand to Tetris course. Alternatively, I've written a VHDL implementation of the Hack Platform which can be used to simulate the Hack Machine in order to run the assembly generated by this assembler. Currently it is not as full featured and user friendly as the simulator given by the Nand to Tetris course, and likely never will be as it's end goal is to be implemented on a FPGA with verification of the design done via simulation. For more details see its README.