class Vm::Instructions::MemoryAccessOperations::VirtualSegmentOperation

Constants

VIRTUAL_SEGMENT_TO_POINTER_NAME

Attributes

index[R]
operation[R]
segment[R]

Public Class Methods

new(operation, segment, index) click to toggle source
# File lib/hackasm/vm/instructions/memory_access_operations/virtual_segment_operation.rb, line 15
def initialize(operation, segment, index)
  @operation = operation
  @segment = segment
  @index = index
end
segments() click to toggle source
# File lib/hackasm/vm/instructions/memory_access_operations/virtual_segment_operation.rb, line 59
def self.segments
  VIRTUAL_SEGMENT_TO_POINTER_NAME.keys
end

Public Instance Methods

to_asm() click to toggle source
# File lib/hackasm/vm/instructions/memory_access_operations/virtual_segment_operation.rb, line 21
def to_asm
  if operation == "push"
    %Q{
      @#{index}
      D=A
      @#{VIRTUAL_SEGMENT_TO_POINTER_NAME[segment]}
      A=M+D
      D=M
      @SP
      A=M
      M=D
      @SP
      M=M+1
    }.strip
  else
    %Q{
      @SP
      M=M-1
      @SP
      A=M
      D=M
      @R14
      M=D
      @#{index}
      D=A
      @#{VIRTUAL_SEGMENT_TO_POINTER_NAME[segment]}
      D=M+D
      @R15
      M=D
      @R14
      D=M
      @R15
      A=M
      M=D
    }.strip
  end
end