Class: Haxor::Vm::Mem
Instance Attribute Summary collapse
-
#memory ⇒ Object
Returns the value of attribute memory.
Attributes inherited from Subsystem
Instance Method Summary collapse
-
#add_label(name, addr) ⇒ Object
Adds label.
-
#dereference(addr) ⇒ Integer
Reads word from memory.
- #enlarge(bytes) ⇒ Object
-
#initialize(bytes) ⇒ Mem
constructor
A new instance of Mem.
- #ip ⇒ Object
- #label(name) ⇒ Object
- #move_ip(step) ⇒ Object
-
#next_cell ⇒ Object
TODO: BC.
-
#next_word ⇒ Integer
Reads data pointed by IP register and moves IP forward.
-
#read(addr) ⇒ Integer
Reads word from memory.
- #replace_region(addr, data) ⇒ Object
- #size ⇒ Object
-
#write(addr, value) ⇒ Object
Writes word to memory.
- #write_string(addr, value) ⇒ Object
Methods inherited from 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
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
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
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
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
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 |