diff --git a/bin/assembler b/bin/assembler index 6dac0a7..6e1c53f 100755 --- a/bin/assembler +++ b/bin/assembler @@ -32,6 +32,9 @@ PREDEFINED_SYMBOLS = { 'KBD' => 0x6000 } +# Any more than this and then we overflow 15bits of address space +MAX_PROGRAM_SIZE = (2**15) -1 + def add_predefined_symbols(symbols) PREDEFINED_SYMBOLS.each do |k, v| symbols.add_entry(k, v) @@ -52,6 +55,8 @@ def parse_labels(input, symbols) address += 1 end end + + raise "Program is too large: #{address} > #{MAX_PROGRAM_SIZE}" if address >= MAX_PROGRAM_SIZE end def generate_code(input, symbols) diff --git a/lib/code.rb b/lib/code.rb index e3db601..0c61e3a 100644 --- a/lib/code.rb +++ b/lib/code.rb @@ -29,21 +29,27 @@ def comp(mnemonic) 'A+1' => '0110111', 'D-1' => '0001110', 'A-1' => '0110010', + 'A+D' => '0000010', 'D+A' => '0000010', 'D-A' => '0010011', 'A-D' => '0000111', 'D&A' => '0000000', + 'A&D' => '0000000', 'D|A' => '0010101', + 'A|D' => '0010101', 'M' => '1110000', '!M' => '1110001', '-M' => '1110011', 'M+1' => '1110111', 'M-1' => '1110010', 'D+M' => '1000010', + 'M+D' => '1000010', 'D-M' => '1010011', 'M-D' => '1000111', 'D&M' => '1000000', - 'D|M' => '1010101' + 'D|M' => '1010101', + 'M&D' => '1000000', + 'M|D' => '1010101', }.fetch(mnemonic) end