Method: N65::DW#exec

Defined in:
lib/n65/directives/dw.rb

#exec(assembler) ⇒ Object

Execute on the assembler, now in this case value may

be a symbol that needs to be resolved, if so we return
a lambda which can be executed later, with the promise
that that symbol will have then be defined
This is a little complicated, I admit.


44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/n65/directives/dw.rb', line 44

def exec(assembler)

  promise = assembler.with_saved_state do |saved_assembler|
    value = saved_assembler.symbol_table.resolve_symbol(@value)
    bytes = [value & 0xFFFF].pack('S').bytes
    saved_assembler.write_memory(bytes)
  end


  ##  Try to execute it now, or setup the promise to return
  case @value
  when Fixnum
    bytes = [@value & 0xFFFF].pack('S').bytes
    assembler.write_memory(bytes)
  when String
    begin
      promise.call
    rescue SymbolTable::UndefinedSymbol
      ##  Must still advance PC before returning promise, so we'll write
      ##  a place holder value of 0xDEAD
      assembler.write_memory([0xDE, 0xAD])
      return promise
    end
  else
    fail("Uknown argument in .dw directive")
  end
end