Class: Haxor::Vm::Mem

Inherits:
Subsystem show all
Defined in:
lib/haxor/vm/mem.rb

Instance Attribute Summary collapse

Attributes inherited from Subsystem

#vm

Instance Method Summary collapse

Methods inherited from Subsystem

#register, #subsystem

Constructor Details

#initialize(bytes) ⇒ Mem

Returns a new instance of Mem.



6
7
8
9
# File 'lib/haxor/vm/mem.rb', line 6

def initialize(bytes)
  @memory = Array.new(bytes, 0).pack('C*')
  @labels = {}
end

Instance Attribute Details

#memory ⇒ Object

Returns the value of attribute memory.



4
5
6
# File 'lib/haxor/vm/mem.rb', line 4

def memory
  @memory
end

Instance Method Details

#add_label(name, addr) ⇒ Object

Adds label

Parameters:

  • name (String) —

    Name of label

  • addr (Integer) —

    Address in memory to point to



23
24
25
26
# File 'lib/haxor/vm/mem.rb', line 23

def add_label(name, addr)
  fail if @labels.key? name
  @labels[name] = addr
end

#dereference(addr) ⇒ Integer

Reads word from memory

Parameters:

  • addr (String|Integer) —

    Label or address in memory

Returns:

  • (Integer) —

    Data stored under specified address



60
61
62
# File 'lib/haxor/vm/mem.rb', line 60

def dereference(addr)
  read addr
end

#enlarge(bytes) ⇒ Object



15
16
17
# File 'lib/haxor/vm/mem.rb', line 15

def enlarge(bytes)
  replace_region size, Array.new(bytes, 0).pack('C*')
end

#ip ⇒ Object



78
79
80
# File 'lib/haxor/vm/mem.rb', line 78

def ip
  read 'ip'
end

#label(name) ⇒ Object



86
87
88
# File 'lib/haxor/vm/mem.rb', line 86

def label(name)
  @labels[addr]
end

#move_ip(step) ⇒ Object



82
83
84
# File 'lib/haxor/vm/mem.rb', line 82

def move_ip(step)
  write 'ip', ip + step
end

#next_cell ⇒ Object

TODO: BC



74
75
76
# File 'lib/haxor/vm/mem.rb', line 74

def next_cell
  next_word
end

#next_word ⇒ Integer

Reads data pointed by IP register and moves IP forward

Returns:

  • (Integer) —

    Data stored under address pointed by IP



67
68
69
70
71
# File 'lib/haxor/vm/mem.rb', line 67

def next_word
  data = read ip
  move_ip Consts::WORD_SIZE
  data
end

#read(addr) ⇒ Integer

Reads word from memory

Parameters:

  • addr (String|Integer) —

    Label or address in memory

Returns:

  • (Integer) —

    Data stored under specified address



32
33
34
# File 'lib/haxor/vm/mem.rb', line 32

def read(addr)
  @memory[resolve addr].unpack(Consts::WORD_UNPACK)[0]
end

#replace_region(addr, data) ⇒ Object



54
55
56
57
# File 'lib/haxor/vm/mem.rb', line 54

def replace_region(addr, data)
  x = addr + data.size
  @memory[addr...x] = data
end

#size ⇒ Object



11
12
13
# File 'lib/haxor/vm/mem.rb', line 11

def size
  @memory.size
end

#write(addr, value) ⇒ Object

Writes word to memory

Parameters:

  • addr (String|Integer) —

    Label or address in memory

  • value (Integer) —

    Data to store under specified address



40
41
42
# File 'lib/haxor/vm/mem.rb', line 40

def write(addr, value)
  @memory[resolve addr] = [value].pack(Consts::WORD_UNPACK)
end

#write_string(addr, value) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'lib/haxor/vm/mem.rb', line 44

def write_string(addr, value)
  i = 0
  value.each_char do |x|
    write addr + i, x.ord
    i += Consts::WORD_SIZE
  end

  write addr + i, 0
end