metasm 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +3 -0
  3. data.tar.gz.sig +0 -0
  4. data/Gemfile +3 -2
  5. data/metasm.gemspec +3 -2
  6. data/metasm.rb +4 -1
  7. data/metasm/compile_c.rb +2 -2
  8. data/metasm/cpu/arc/decode.rb +0 -21
  9. data/metasm/cpu/arc/main.rb +4 -4
  10. data/metasm/cpu/arm/decode.rb +1 -5
  11. data/metasm/cpu/arm/main.rb +3 -3
  12. data/metasm/cpu/arm64/decode.rb +2 -6
  13. data/metasm/cpu/arm64/main.rb +5 -5
  14. data/metasm/cpu/bpf/decode.rb +3 -35
  15. data/metasm/cpu/bpf/main.rb +5 -5
  16. data/metasm/cpu/bpf/render.rb +1 -12
  17. data/metasm/cpu/cy16/decode.rb +0 -6
  18. data/metasm/cpu/cy16/main.rb +3 -3
  19. data/metasm/cpu/cy16/render.rb +0 -11
  20. data/metasm/cpu/dalvik/decode.rb +4 -26
  21. data/metasm/cpu/dalvik/main.rb +20 -2
  22. data/metasm/cpu/dalvik/opcodes.rb +3 -2
  23. data/metasm/cpu/{mips/compile_c.rb → ebpf.rb} +5 -2
  24. data/metasm/cpu/ebpf/debug.rb +61 -0
  25. data/metasm/cpu/ebpf/decode.rb +142 -0
  26. data/metasm/cpu/ebpf/main.rb +58 -0
  27. data/metasm/cpu/ebpf/opcodes.rb +97 -0
  28. data/metasm/cpu/ebpf/render.rb +36 -0
  29. data/metasm/cpu/ia32/debug.rb +39 -1
  30. data/metasm/cpu/ia32/decode.rb +111 -90
  31. data/metasm/cpu/ia32/decompile.rb +45 -37
  32. data/metasm/cpu/ia32/main.rb +10 -0
  33. data/metasm/cpu/ia32/parse.rb +6 -0
  34. data/metasm/cpu/mcs51/decode.rb +1 -1
  35. data/metasm/cpu/mcs51/main.rb +11 -0
  36. data/metasm/cpu/mips/decode.rb +8 -18
  37. data/metasm/cpu/mips/main.rb +3 -3
  38. data/metasm/cpu/mips/opcodes.rb +1 -1
  39. data/metasm/cpu/msp430/decode.rb +2 -6
  40. data/metasm/cpu/msp430/main.rb +3 -3
  41. data/metasm/cpu/openrisc.rb +11 -0
  42. data/metasm/cpu/openrisc/debug.rb +106 -0
  43. data/metasm/cpu/openrisc/decode.rb +182 -0
  44. data/metasm/cpu/openrisc/decompile.rb +350 -0
  45. data/metasm/cpu/openrisc/main.rb +70 -0
  46. data/metasm/cpu/openrisc/opcodes.rb +109 -0
  47. data/metasm/cpu/openrisc/render.rb +37 -0
  48. data/metasm/cpu/ppc/decode.rb +0 -25
  49. data/metasm/cpu/ppc/main.rb +6 -6
  50. data/metasm/cpu/ppc/opcodes.rb +3 -4
  51. data/metasm/cpu/python/decode.rb +0 -20
  52. data/metasm/cpu/python/main.rb +1 -1
  53. data/metasm/cpu/sh4/decode.rb +2 -6
  54. data/metasm/cpu/sh4/main.rb +25 -23
  55. data/metasm/cpu/st20/decode.rb +0 -7
  56. data/metasm/cpu/webasm.rb +11 -0
  57. data/metasm/cpu/webasm/debug.rb +31 -0
  58. data/metasm/cpu/webasm/decode.rb +321 -0
  59. data/metasm/cpu/webasm/decompile.rb +386 -0
  60. data/metasm/cpu/webasm/encode.rb +104 -0
  61. data/metasm/cpu/webasm/main.rb +81 -0
  62. data/metasm/cpu/webasm/opcodes.rb +214 -0
  63. data/metasm/cpu/x86_64/compile_c.rb +13 -9
  64. data/metasm/cpu/x86_64/parse.rb +1 -1
  65. data/metasm/cpu/z80/decode.rb +0 -27
  66. data/metasm/cpu/z80/main.rb +3 -3
  67. data/metasm/cpu/z80/render.rb +0 -11
  68. data/metasm/debug.rb +43 -8
  69. data/metasm/decode.rb +62 -14
  70. data/metasm/decompile.rb +793 -466
  71. data/metasm/disassemble.rb +188 -131
  72. data/metasm/disassemble_api.rb +30 -17
  73. data/metasm/dynldr.rb +2 -2
  74. data/metasm/encode.rb +8 -2
  75. data/metasm/exe_format/autoexe.rb +2 -0
  76. data/metasm/exe_format/coff.rb +21 -3
  77. data/metasm/exe_format/coff_decode.rb +12 -0
  78. data/metasm/exe_format/coff_encode.rb +6 -3
  79. data/metasm/exe_format/dex.rb +13 -3
  80. data/metasm/exe_format/elf.rb +12 -2
  81. data/metasm/exe_format/elf_decode.rb +59 -1
  82. data/metasm/exe_format/main.rb +2 -0
  83. data/metasm/exe_format/mz.rb +1 -0
  84. data/metasm/exe_format/pe.rb +25 -3
  85. data/metasm/exe_format/wasm.rb +402 -0
  86. data/metasm/gui/dasm_decomp.rb +171 -95
  87. data/metasm/gui/dasm_graph.rb +61 -2
  88. data/metasm/gui/dasm_hex.rb +2 -2
  89. data/metasm/gui/dasm_main.rb +45 -19
  90. data/metasm/gui/debug.rb +13 -4
  91. data/metasm/gui/gtk.rb +12 -4
  92. data/metasm/main.rb +108 -103
  93. data/metasm/os/emulator.rb +175 -0
  94. data/metasm/os/main.rb +11 -6
  95. data/metasm/parse.rb +23 -12
  96. data/metasm/parse_c.rb +189 -135
  97. data/metasm/preprocessor.rb +16 -1
  98. data/misc/openrisc-parser.rb +79 -0
  99. data/samples/dasm-plugins/scanxrefs.rb +6 -4
  100. data/samples/dasm-plugins/selfmodify.rb +8 -8
  101. data/samples/dbg-plugins/trace_func.rb +1 -1
  102. data/samples/disassemble-gui.rb +14 -3
  103. data/samples/emubios.rb +251 -0
  104. data/samples/emudbg.rb +127 -0
  105. data/samples/lindebug.rb +79 -78
  106. data/samples/metasm-shell.rb +8 -8
  107. data/tests/all.rb +1 -1
  108. data/tests/expression.rb +2 -0
  109. data/tests/graph_layout.rb +1 -1
  110. data/tests/ia32.rb +1 -0
  111. data/tests/mips.rb +1 -1
  112. data/tests/preprocessor.rb +18 -0
  113. metadata +124 -6
  114. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8a5dcb50d2a38105adee7c8249698e2f675af544
4
- data.tar.gz: 0476236904d2bc2b8d45013446a58d053f0f24aa
3
+ metadata.gz: 474c2cb9b50af29f462619d47eb2c5ed062770ad
4
+ data.tar.gz: 9c82c356ea5d83f49c46a124289dd6d8c48a775e
5
5
  SHA512:
6
- metadata.gz: ad41d74f97fab2567509acddb90ea7124c317519e84af509c6e68d07839ff1015a2c4512286e76eb16db22efa481aa60531beeb66e5ec9c0677727ba6cf81571
7
- data.tar.gz: 333a45fd258674ead5f2b036e56e8e87ad06b4aa74b5f655495d05b902394527dad0abf78e614c7d6f715caa3d92c05b322166bfed74fb611ad3ddabbd4f7a1c
6
+ metadata.gz: 13d4f03ef8be7f1b793fb5e8fcc9e555894c6341042e996dd4bf11caaf1c9da4984a019d7244ea6df4137f7a790f5894b73a5e5d8b26915a6e027664debda1ce
7
+ data.tar.gz: ffc8f18dd425e81eff43f08a03d89590c4705fd27db3fd43f3b5ea956063436003aa423bf7ae92c400dbf068509173cf8ce3068f83a971bf2934a2c28a4a35ff
@@ -0,0 +1,3 @@
1
+ ��=���^�� 8�W�
2
+ ��*�O?2�!�O�)��}�e���-��ǹ��@s$�9�F`lo���ՙ�3�.O�o9S�����1b���~6����G���p(�
3
+ V���F�4��G9a-H()s�ٌ�<�>SyHLSY�7�@�w�}38QP�Z��Bl�5��8�t�����0��Q�P�=� pfj\p���>芉�?�ḡ��POţ�ι7Ա���RQD(mi�1.K5»K��P��y��i.h\:�a�>
Binary file
data/Gemfile CHANGED
@@ -1,2 +1,3 @@
1
- source 'https://rubygems.org'
2
- gemspec
1
+ source 'https://rubygems.org' do
2
+ gemspec
3
+ end
@@ -4,7 +4,7 @@ require 'metasm'
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'metasm'
7
- s.version = '1.0.3'
7
+ s.version = '1.0.4'
8
8
  s.summary =
9
9
  "Metasm is a cross-architecture assembler, disassembler, linker, and debugger."
10
10
  s.description = ""
@@ -14,9 +14,10 @@ Gem::Specification.new do |s|
14
14
  s.test_files = s.files.grep(%r{^tests/})
15
15
  s.require_paths = ["."]
16
16
  s.homepage = 'http://metasm.cr0.org'
17
- s.license = 'LGPL'
17
+ s.license = 'LGPL-2.1'
18
18
 
19
19
  s.add_development_dependency "bundler", "~> 1.7"
20
20
  s.add_development_dependency "rake"
21
+ s.add_development_dependency "test-unit"
21
22
  end
22
23
 
data/metasm.rb CHANGED
@@ -36,8 +36,9 @@ module Metasm
36
36
  Const_autorequire = {
37
37
  'Ia32' => 'cpu/ia32', 'MIPS' => 'cpu/mips', 'PowerPC' => 'cpu/ppc', 'ARM' => 'cpu/arm',
38
38
  'X86_64' => 'cpu/x86_64', 'Sh4' => 'cpu/sh4', 'Dalvik' => 'cpu/dalvik', 'ARC' => 'cpu/arc',
39
- 'Python' => 'cpu/python', 'Z80' => 'cpu/z80', 'CY16' => 'cpu/cy16', 'BPF' => 'cpu/bpf',
39
+ 'Python' => 'cpu/python', 'Z80' => 'cpu/z80', 'CY16' => 'cpu/cy16', 'BPF' => 'cpu/bpf', 'EBPF' => 'cpu/ebpf',
40
40
  'MSP430' => 'cpu/msp430', 'ARM64' => 'cpu/arm64', 'ST20' => 'cpu/st20', 'MCS51' => 'cpu/mcs51',
41
+ 'OpenRisc' => 'cpu/openrisc', 'WebAsm' => 'cpu/webasm',
41
42
  'C' => 'compile_c',
42
43
  'MZ' => 'exe_format/mz', 'PE' => 'exe_format/pe',
43
44
  'ELF' => 'exe_format/elf', 'COFF' => 'exe_format/coff',
@@ -49,6 +50,7 @@ module Metasm
49
50
  'Bflt' => 'exe_format/bflt', 'Dol' => 'exe_format/dol',
50
51
  'PYC' => 'exe_format/pyc', 'JavaClass' => 'exe_format/javaclass',
51
52
  'SWF' => 'exe_format/swf', 'ZIP' => 'exe_format/zip',
53
+ 'WasmFile' => 'exe_format/wasm',
52
54
  'Shellcode_RWX' => 'exe_format/shellcode_rwx',
53
55
  'Gui' => 'gui',
54
56
  'WindowsExports' => 'os/windows_exports',
@@ -56,6 +58,7 @@ module Metasm
56
58
  'Debugger' => 'debug',
57
59
  'LinOS' => 'os/linux', 'WinOS' => 'os/windows',
58
60
  'GdbClient' => 'os/gdbremote',
61
+ 'EmuDebugger' => 'os/emulator',
59
62
  'Disassembler' => 'disassemble',
60
63
  'Decompiler' => 'decompile',
61
64
  'DynLdr' => 'dynldr',
@@ -864,7 +864,7 @@ module C
864
864
  blk.statements.each_with_index { |s, i|
865
865
  case s
866
866
  when Case
867
- label = compiler.new_label('case')
867
+ label = compiler.new_label("case_#{s.expr}")
868
868
  if s.expr == 'default'
869
869
  default = label
870
870
  elsif s.exprup
@@ -1063,7 +1063,7 @@ module C
1063
1063
  @lexpr = nil
1064
1064
  precompile_inner(compiler, scope)
1065
1065
  when :'?:'
1066
- # cannot precompile in place, a conditionnal expression may have a coma: must turn into If
1066
+ # cannot precompile in place, a conditional expression may have a coma: must turn into If
1067
1067
  if @lexpr.kind_of? CExpression
1068
1068
  @lexpr = @lexpr.precompile_inner(compiler, scope)
1069
1069
  if not @lexpr.lexpr and not @lexpr.op and @lexpr.rexpr.kind_of? ::Numeric
@@ -313,10 +313,6 @@ class ARC
313
313
  REG_SYMS
314
314
  end
315
315
 
316
- def backtrace_binding
317
- @backtrace_binding ||= init_backtrace_binding
318
- end
319
-
320
316
  def opshift(op)
321
317
  op[/\d/].to_i
322
318
  end
@@ -382,23 +378,6 @@ class ARC
382
378
  @backtrace_binding
383
379
  end
384
380
 
385
- def get_backtrace_binding(di)
386
- a = di.instruction.args.map { |arg|
387
- case arg
388
- when GPR; arg.symbolic
389
- when Memref; arg.symbolic(di.address)
390
- else arg
391
- end
392
- }
393
-
394
- if binding = backtrace_binding[di.opcode.basename]
395
- binding[di, *a]
396
- else
397
- puts "unhandled instruction to backtrace: #{di}" if $VERBOSE
398
- { :incomplete_binding => Expression[1] }
399
- end
400
- end
401
-
402
381
  def get_xrefs_x(dasm, di)
403
382
  return [] if not di.opcode.props[:setip]
404
383
 
@@ -40,7 +40,7 @@ class ARC < CPU
40
40
  # Branch Link Register R31 (BLINK)
41
41
  class GPR < Reg
42
42
  Sym = (0..64).map { |i| "r#{i}".to_sym }
43
- def symbolic; Sym[@i] end
43
+ def symbolic(di=nil); Sym[@i] end
44
44
 
45
45
  Render = {
46
46
  26 => 'gp', # global pointer, used to point to small sets of shared data throughout execution of a program
@@ -69,7 +69,7 @@ class ARC < CPU
69
69
  end
70
70
 
71
71
  class AUX < Reg
72
- def symbolic; "aux#{i}".to_sym end
72
+ def symbolic(di=nil); "aux#{i}".to_sym end
73
73
 
74
74
  Render = {
75
75
  0x00 => 'status', # Status register (Original ARCtangent-A4 processor format)
@@ -162,7 +162,7 @@ class ARC < CPU
162
162
  @base, @disp, @size = base, disp, sz
163
163
  end
164
164
 
165
- def symbolic(orig)
165
+ def symbolic(di=nil)
166
166
  b = @base
167
167
  b = b.symbolic if b.kind_of? Reg
168
168
 
@@ -174,7 +174,7 @@ class ARC < CPU
174
174
  e = Expression[b].reduce
175
175
  end
176
176
 
177
- Indirection[e, @size, orig]
177
+ Indirection[e, @size, (di.address if di)]
178
178
  end
179
179
 
180
180
  include Renderable
@@ -125,10 +125,6 @@ class ARM
125
125
  di
126
126
  end
127
127
 
128
- def backtrace_binding
129
- @backtrace_binding ||= init_backtrace_binding
130
- end
131
-
132
128
  def init_backtrace_binding
133
129
  @backtrace_binding ||= {}
134
130
  end
@@ -137,7 +133,7 @@ class ARM
137
133
  a = di.instruction.args.map { |arg|
138
134
  case arg
139
135
  when Reg; arg.symbolic
140
- when Memref; arg.symbolic(di.address)
136
+ when Memref; arg.symbolic(di)
141
137
  else arg
142
138
  end
143
139
  }
@@ -25,7 +25,7 @@ class ARM < CPU
25
25
  @shift = shift
26
26
  end
27
27
 
28
- def symbolic
28
+ def symbolic(di=nil)
29
29
  r = self.class.i_to_s[@i].to_sym
30
30
  if @stype == :lsl and @shift == 0
31
31
  r
@@ -41,11 +41,11 @@ class ARM < CPU
41
41
  @base, @offset, @sign, @incr = base, offset, sign, incr
42
42
  end
43
43
 
44
- def symbolic(len=4, orig=nil)
44
+ def symbolic(di=nil)
45
45
  o = @offset
46
46
  o = o.symbolic if o.kind_of? Reg
47
47
  p = Expression[@base.symbolic, @sign, o].reduce
48
- Indirection[p, len, orig]
48
+ Indirection[p, 4, (di.address if di)]
49
49
  end
50
50
  end
51
51
 
@@ -165,10 +165,6 @@ class ARM64
165
165
  di
166
166
  end
167
167
 
168
- def backtrace_binding
169
- @backtrace_binding ||= init_backtrace_binding
170
- end
171
-
172
168
  def init_backtrace_binding
173
169
  @backtrace_binding ||= {}
174
170
 
@@ -211,7 +207,7 @@ class ARM64
211
207
  a = di.instruction.args.map { |arg|
212
208
  case arg
213
209
  when Reg, RegShift, RegCC; arg.symbolic
214
- when Memref; arg.symbolic(di.address)
210
+ when Memref; arg.symbolic(di)
215
211
  else arg
216
212
  end
217
213
  }
@@ -269,7 +265,7 @@ class ARM64
269
265
  raise 'internal error: no jmp target' if di.opcode.name != 'ret'
270
266
  tg = :x30
271
267
  when Expression
272
- else tg = tg.symbolic
268
+ else tg = tg.symbolic(di)
273
269
  end
274
270
  [tg]
275
271
  else
@@ -24,7 +24,7 @@ class ARM64 < CPU
24
24
 
25
25
  Sym = @i_to_s[64].inject({}) { |h, (k, v)| h.update k => v.to_sym }
26
26
 
27
- def symbolic
27
+ def symbolic(di=nil)
28
28
  if @sz == 64
29
29
  Sym[@i]
30
30
  else
@@ -41,7 +41,7 @@ class ARM64 < CPU
41
41
  @shift = shift
42
42
  end
43
43
 
44
- def symbolic
44
+ def symbolic(di=nil)
45
45
  sym = @reg.symbolic
46
46
  if shift != 0
47
47
  case @mode
@@ -59,7 +59,7 @@ class ARM64 < CPU
59
59
  def initialize(cc)
60
60
  @cc = cc
61
61
  end
62
- def symbolic
62
+ def symbolic(di=nil)
63
63
  0
64
64
  end
65
65
  end
@@ -70,7 +70,7 @@ class ARM64 < CPU
70
70
  @base, @index, @scale, @offset, @sz, @incr = base, index, scale, offset, sz, incr
71
71
  end
72
72
 
73
- def symbolic(orig=nil)
73
+ def symbolic(di=nil)
74
74
  o = Expression[@base.symbolic]
75
75
  if @index
76
76
  si = @index.symbolic
@@ -78,7 +78,7 @@ class ARM64 < CPU
78
78
  o = Expression[o, :+, si]
79
79
  end
80
80
  o = Expression[o, :+, @offset] if @offset and @incr != :post
81
- Indirection[o.reduce, @sz, orig]
81
+ Indirection[o.reduce, @sz, (di.address if di)]
82
82
  end
83
83
  end
84
84
 
@@ -33,9 +33,9 @@ class BPF
33
33
  when :x; Reg.new(:x)
34
34
  when :a; Reg.new(:a)
35
35
  when :len; Reg.new(:len)
36
- when :p_k; PktRef.new(nil, Expression[k], op.props[:msz])
37
- when :p_xk; PktRef.new(Reg.new(:x), Expression[k], op.props[:msz])
38
- when :m_k; MemRef.new(nil, Expression[4*k], 4)
36
+ when :p_k; Pktref.new(nil, Expression[k], op.props[:msz])
37
+ when :p_xk; Pktref.new(Reg.new(:x), Expression[k], op.props[:msz])
38
+ when :m_k; Memref.new(nil, Expression[4*k], 4)
39
39
  when :jt; Expression[jt]
40
40
  when :jf; Expression[jf]
41
41
  else raise "unhandled arg #{a}"
@@ -74,12 +74,6 @@ class BPF
74
74
  di
75
75
  end
76
76
 
77
- # hash opcode_name => lambda { |dasm, di, *symbolic_args| instr_binding }
78
- def backtrace_binding
79
- @backtrace_binding ||= init_backtrace_binding
80
- end
81
- def backtrace_binding=(b) @backtrace_binding = b end
82
-
83
77
  # populate the @backtrace_binding hash with default values
84
78
  def init_backtrace_binding
85
79
  @backtrace_binding ||= {}
@@ -103,22 +97,6 @@ class BPF
103
97
  @backtrace_binding
104
98
  end
105
99
 
106
- def get_backtrace_binding(di)
107
- a = di.instruction.args.map { |arg|
108
- case arg
109
- when PktRef, MemRef, Reg; arg.symbolic(di)
110
- else arg
111
- end
112
- }
113
-
114
- if binding = backtrace_binding[di.opcode.name]
115
- binding[di, *a]
116
- else
117
- puts "unhandled instruction to backtrace: #{di}" if $VERBOSE
118
- {:incomplete_binding => Expression[1]}
119
- end
120
- end
121
-
122
100
  def get_xrefs_x(dasm, di)
123
101
  return [] if not di.opcode.props[:setip]
124
102
 
@@ -128,15 +106,5 @@ class BPF
128
106
  di.instruction.args[-1, 1]
129
107
  end
130
108
  end
131
-
132
- # updates an instruction's argument replacing an expression with another (eg label renamed)
133
- def replace_instr_arg_immediate(i, old, new)
134
- i.args.map! { |a|
135
- case a
136
- when Expression; a == old ? new : Expression[a.bind(old => new).reduce]
137
- else a
138
- end
139
- }
140
- end
141
109
  end
142
110
  end
@@ -14,10 +14,10 @@ class BPF < CPU
14
14
  @v = v
15
15
  end
16
16
 
17
- def symbolic(orig=nil) ; @v ; end
17
+ def symbolic(di=nil) ; @v ; end
18
18
  end
19
19
 
20
- class MemRef
20
+ class Memref
21
21
  attr_accessor :base, :offset, :msz
22
22
 
23
23
  def memtype
@@ -30,15 +30,15 @@ class BPF < CPU
30
30
  @msz = msz
31
31
  end
32
32
 
33
- def symbolic(orig)
33
+ def symbolic(di=nil)
34
34
  p = Expression[memtype]
35
35
  p = Expression[p, :+, @base.symbolic] if base
36
36
  p = Expression[p, :+, @offset] if offset
37
- Indirection[p, @msz, orig]
37
+ Indirection[p, @msz, (di.address if di)]
38
38
  end
39
39
  end
40
40
 
41
- class PktRef < MemRef
41
+ class Pktref < Memref
42
42
  def memtype
43
43
  :pkt
44
44
  end
@@ -13,7 +13,7 @@ class BPF
13
13
  include Renderable
14
14
  def render ; [@v.to_s] end
15
15
  end
16
- class MemRef
16
+ class Memref
17
17
  include Renderable
18
18
  def render
19
19
  r = []
@@ -26,16 +26,5 @@ class BPF
26
26
  r << ']'
27
27
  end
28
28
  end
29
-
30
- def render_instruction(i)
31
- r = []
32
- r << i.opname
33
- if not i.args.empty?
34
- r << ' '
35
- i.args.each { |a_| r << a_ << ', ' }
36
- r.pop
37
- end
38
- r
39
- end
40
29
  end
41
30
  end
@@ -107,12 +107,6 @@ class CY16
107
107
  di
108
108
  end
109
109
 
110
- # hash opcode_name => lambda { |dasm, di, *symbolic_args| instr_binding }
111
- def backtrace_binding
112
- @backtrace_binding ||= init_backtrace_binding
113
- end
114
- def backtrace_binding=(b) @backtrace_binding = b end
115
-
116
110
  # populate the @backtrace_binding hash with default values
117
111
  def init_backtrace_binding
118
112
  @backtrace_binding ||= {}
@@ -21,7 +21,7 @@ class CY16 < CPU
21
21
  @i = i
22
22
  end
23
23
 
24
- def symbolic(orig=nil) ; to_s.to_sym ; end
24
+ def symbolic(di=nil) ; to_s.to_sym ; end
25
25
 
26
26
  def self.from_str(s)
27
27
  raise "Bad name #{s.inspect}" if not x = @s_to_i[s]
@@ -39,11 +39,11 @@ class CY16 < CPU
39
39
  @autoincr = autoincr
40
40
  end
41
41
 
42
- def symbolic(orig)
42
+ def symbolic(di=nil)
43
43
  p = nil
44
44
  p = Expression[p, :+, @base.symbolic] if base
45
45
  p = Expression[p, :+, @offset] if offset
46
- Indirection[p.reduce, @sz, orig]
46
+ Indirection[p.reduce, @sz, (di.address if di)]
47
47
  end
48
48
  end
49
49
 
@@ -26,16 +26,5 @@ class CY16
26
26
  r << ']'
27
27
  end
28
28
  end
29
-
30
- def render_instruction(i)
31
- r = []
32
- r << i.opname
33
- if not i.args.empty?
34
- r << ' '
35
- i.args.each { |a_| r << a_ << ', ' }
36
- r.pop
37
- end
38
- r
39
- end
40
29
  end
41
30
  end