gruesome 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/gruesome/version.rb +1 -1
- data/lib/gruesome/z/object_table.rb +56 -0
- data/lib/gruesome/z/opcode.rb +3 -3
- data/lib/gruesome/z/processor.rb +3 -0
- data/spec/z/memory_spec.rb +1 -1
- data/spec/z/processor_spec.rb +1 -1
- data/test/zork1.z3 +0 -0
- metadata +4 -2
data/lib/gruesome/version.rb
CHANGED
@@ -317,6 +317,34 @@ module Gruesome
|
|
317
317
|
{ :size => size, :property_number => property_number, :property_data_address => prop_address }
|
318
318
|
end
|
319
319
|
|
320
|
+
def object_properties_array(index)
|
321
|
+
entry = object_entry(index)
|
322
|
+
prop_address = entry[:properties_address]
|
323
|
+
|
324
|
+
# get the length of the string in bytes
|
325
|
+
text_len = @memory.force_readb(prop_address) * 2
|
326
|
+
prop_address += 1
|
327
|
+
|
328
|
+
prop_address += text_len
|
329
|
+
|
330
|
+
properties = []
|
331
|
+
|
332
|
+
while true do
|
333
|
+
entry_info = object_get_size_and_number(prop_address)
|
334
|
+
|
335
|
+
if entry_info == nil
|
336
|
+
break
|
337
|
+
end
|
338
|
+
|
339
|
+
# regardless of version, we now have the property size and the number
|
340
|
+
|
341
|
+
properties << {:property_number => entry_info[:property_number], :size => entry_info[:size], :property_data_address => entry_info[:property_data_address]}
|
342
|
+
prop_address = entry_info[:property_data_address] + entry_info[:size]
|
343
|
+
end
|
344
|
+
|
345
|
+
properties
|
346
|
+
end
|
347
|
+
|
320
348
|
def object_properties(index)
|
321
349
|
entry = object_entry(index)
|
322
350
|
prop_address = entry[:properties_address]
|
@@ -377,6 +405,34 @@ module Gruesome
|
|
377
405
|
end
|
378
406
|
end
|
379
407
|
|
408
|
+
def object_get_next_property(index, property_number)
|
409
|
+
properties = object_properties_array(index)
|
410
|
+
if property_number == 0
|
411
|
+
next_number = properties[0][:property_number]
|
412
|
+
else
|
413
|
+
cur_prop_index = nil
|
414
|
+
properties.each_with_index do |p, i|
|
415
|
+
if p[:property_number] == property_number
|
416
|
+
cur_prop_index = i
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
if cur_prop_index == nil
|
421
|
+
# Error: Cannot get the next property when the property given is invalid
|
422
|
+
raise "get_prop_addr gave incorrect property_number"
|
423
|
+
end
|
424
|
+
|
425
|
+
next_prop_index = cur_prop_index + 1
|
426
|
+
|
427
|
+
if next_prop_index == properties.length
|
428
|
+
next_number = 0
|
429
|
+
else
|
430
|
+
next_number = properties[next_prop_index][:property_number]
|
431
|
+
end
|
432
|
+
end
|
433
|
+
next_number
|
434
|
+
end
|
435
|
+
|
380
436
|
def object_get_property_data_size_from_address(address)
|
381
437
|
if @header.version <= 3
|
382
438
|
prop_address = address - 1
|
data/lib/gruesome/z/opcode.rb
CHANGED
@@ -24,7 +24,7 @@ module Gruesome
|
|
24
24
|
LOADB = (0x10 << 3) | OpcodeClass::OP2
|
25
25
|
GET_PROP = (0x11 << 3) | OpcodeClass::OP2
|
26
26
|
GET_PROP_ADDR = (0x12 << 3) | OpcodeClass::OP2
|
27
|
-
|
27
|
+
GET_NEXT_PROP = (0x13 << 3) | OpcodeClass::OP2
|
28
28
|
ADD = (0x14 << 3) | OpcodeClass::OP2
|
29
29
|
SUB = (0x15 << 3) | OpcodeClass::OP2
|
30
30
|
MUL = (0x16 << 3) | OpcodeClass::OP2
|
@@ -161,7 +161,7 @@ module Gruesome
|
|
161
161
|
if opcode_class == OpcodeClass::OP2
|
162
162
|
case opcode
|
163
163
|
when Opcode::OR, Opcode::AND, Opcode::LOADB, Opcode::LOADW,
|
164
|
-
Opcode::GET_PROP, Opcode::GET_PROP_ADDR, Opcode::
|
164
|
+
Opcode::GET_PROP, Opcode::GET_PROP_ADDR, Opcode::GET_NEXT_PROP,
|
165
165
|
Opcode::ADD, Opcode::SUB, Opcode::MUL, Opcode::DIV, Opcode::MOD,
|
166
166
|
Opcode::CALL_2S
|
167
167
|
result = true
|
@@ -426,7 +426,7 @@ module Gruesome
|
|
426
426
|
when Opcode::LOADB then "loadb"
|
427
427
|
when Opcode::GET_PROP then "get_prop"
|
428
428
|
when Opcode::GET_PROP_ADDR then "get_prop_addr"
|
429
|
-
when Opcode::
|
429
|
+
when Opcode::GET_NEXT_PROP then "get_next_prop"
|
430
430
|
when Opcode::ADD then "add"
|
431
431
|
when Opcode::SUB then "sub"
|
432
432
|
when Opcode::MUL then "mul"
|
data/lib/gruesome/z/processor.rb
CHANGED
@@ -126,6 +126,9 @@ module Gruesome
|
|
126
126
|
@memory.writev(instruction.destination, child)
|
127
127
|
result = child != 0
|
128
128
|
branch(instruction.branch_to, instruction.branch_on, result)
|
129
|
+
when Opcode::GET_NEXT_PROP
|
130
|
+
next_prop = @object_table.object_get_next_property(operands[0], operands[1])
|
131
|
+
@memory.writev(instruction.destination, next_prop)
|
129
132
|
when Opcode::GET_PARENT
|
130
133
|
parent = @object_table.object_get_parent(operands[0])
|
131
134
|
@memory.writev(instruction.destination, parent)
|
data/spec/z/memory_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require_relative '../../lib/gruesome/z/memory'
|
|
3
3
|
describe Gruesome::Z::Memory do
|
4
4
|
before(:each) do
|
5
5
|
zork = File.open('test/zork1.z3', 'r')
|
6
|
-
@zork_memory = Gruesome::Z::Memory.new(zork.read(zork.size))
|
6
|
+
@zork_memory = Gruesome::Z::Memory.new(zork.read(zork.size), '')
|
7
7
|
end
|
8
8
|
|
9
9
|
describe "#readb" do
|
data/spec/z/processor_spec.rb
CHANGED
@@ -13,7 +13,7 @@ describe Gruesome::Z::Processor do
|
|
13
13
|
describe "#execute" do
|
14
14
|
before(:each) do
|
15
15
|
zork = File.open('test/zork1.z3', 'r')
|
16
|
-
@zork_memory = Gruesome::Z::Memory.new(zork.read(zork.size))
|
16
|
+
@zork_memory = Gruesome::Z::Memory.new(zork.read(zork.size), '')
|
17
17
|
@processor = Gruesome::Z::Processor.new(@zork_memory)
|
18
18
|
@zork_memory.program_counter = 12345
|
19
19
|
end
|
data/test/zork1.z3
ADDED
Binary file
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 6
|
9
|
+
version: 0.0.6
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Dave Wilkinson
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- spec/z/memory_spec.rb
|
81
81
|
- spec/z/processor_spec.rb
|
82
82
|
- test/logo.txt
|
83
|
+
- test/zork1.z3
|
83
84
|
has_rdoc: true
|
84
85
|
homepage: http://github.com/wilkie/gruesome
|
85
86
|
licenses: []
|
@@ -116,3 +117,4 @@ test_files:
|
|
116
117
|
- spec/z/memory_spec.rb
|
117
118
|
- spec/z/processor_spec.rb
|
118
119
|
- test/logo.txt
|
120
|
+
- test/zork1.z3
|