The Elements of Computing Systems, My Workbook for the NAND to Tetris course.
Go to file
Nemo 4e49913808 [07/Static] Implements static push/pop memory segment 2020-06-02 17:28:20 +05:30
assembler Remove unused variables, style fixes 2020-05-30 04:08:30 +05:30
projects [07/Static] Implements static push/pop memory segment 2020-06-02 17:28:20 +05:30
vm [07/Static] Implements static push/pop memory segment 2020-06-02 17:28:20 +05:30
.gitattributes gitattributes 2020-05-29 02:38:11 +05:30
.gitignore Initial Commit 💥 2020-05-19 17:32:15 +05:30
NOTES.md [07] Initial work on VM Translator 2020-06-01 19:49:55 +05:30
README.md [07/Pointers] Implemented pointer segment push/pop 2020-06-02 17:04:51 +05:30

README.md

nand2tetris

Working my way through the Nand to Tetris Course

  • Download the latest nand2tetris.zip from the book website, and overwrite everything in the projects and tools directory.
  • Remember to run chmod +X tools/*.sh if you're on *nix.

My notes are in NOTES.md.

Project 1: Boolean Logic

Build order as per the website. Cost for each gate in NAND in brackets.

  • Nand (primitive)
  • Not (1)
  • Or (3)
  • Xor (6, Can be improved)
  • And (2)
  • Mux (8, Took me ages. Can be improved)
  • DMux (5, Super Fun)
  • Not16 (16)
  • And16 (32)
  • Or16 (48)
  • Mux16 (113)
  • Or8Way (21)
  • Mux4Way16 (339)
  • Mux8Way16 (791)
  • DMux4Way (37, Fun)
  • DMux8Way (101)

Project 2: Boolean Arithmetic

CHIPs/Gates used in brackets

  • HalfAdder (Xor+And)
  • FullAdder (2 HalfAdder, 1 Or)
  • Add16 (1 HalfAdder, 15 FullAdder)
  • Inc16 (1 Add16)
  • ALU (6 Mux16, 3 Not16, 1 Add16, 1 And16, 2 Or8Way, 2 Or, 1 Not)

Project 3: Memory

Make sure you read through the Hardware Simulator Tutorial to understand the clock in the simulator.

  • DFF (primitive)
  • Bit (1 Mux, 1DFF)
  • Register (16 Bits)
  • RAM8 (8 Registers, 1 DMux8Way, 1 Mux8Way16) = 8 registers
  • RAM64 (8 RAM8, 1 DMux8Way, 1 Mux8Way16) = 64 registers
  • RAM512 (8 RAM64, 1 DMux8Way, 1 Mux8Way16) = 512 registers
  • RAM4K (8 RAM512, 1 DMux8Way, 1 Mux8Way16) = 4096 registers
  • RAM16K (4 RAM4K, 1 DMux4Way, 1 Mux4Way16) = 16384 registers
  • PC (1 Register, 1 Inc16, 1 Or8Way, 1 Mux8Way16)

Project 4: Machine Language Programming

Counting number of instructions by wc -l $file.hack

  • Mult (18)
  • Fill (98)

Project 5: Computer Architecture

Chips

  • Memory.hdl (2xMux16, 2xNot, 3xAnd 1 RAM16K)
  • CPU.hdl (6 And, 2 Nand, 3 Or, 1 Not, 1 Mux16, 1 Mux16, 2 Register, 1 PC, 1 ALU)
  • Computer.hdl (1 CPU, 1 ROM32K, 1 Memory)

Computer chip tests:

  • Add.hack
  • Max.hack
  • Rect.hack

Project 6: The Assembler

Without Symbols

  • MaxL.asm
  • RectL.asm
  • PongL.asm
  • Add.asm

Symbolic Programs

  • Max.asm
  • Rect.asm
  • Pong.asm

Project 6: Virtual Machine I - Stack Arithmetic

Final hack instruction set count in brackets. Calculated by running:

php file.vm > file.asm
ruby assembler.rb file.vm > file.hack
wc -l file.hack

Arithmetic Commands

  • SimpleAdd.vm (21)
  • StackTest.vm (334)

Memory Access Commands

  • BasicTest.vm (228)
  • PointerTest.vm (127)
  • StackTest.vm