asmrb 0.0.2.6.2.0 → 0.0.2.6.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/asmrb.rb +182 -183
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1efa63d1755144b58eaf04c1080f10adcbe553d
|
4
|
+
data.tar.gz: 5c0d8d57c3a6381621cb5364092b9bed60a41b42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80a48ffe33a30e325e8c1b51fb0d27da0a0253c1cc16c682ac891026addc1eecd394cb87633aebb26034209c8eeb74469431698fceb428d4dbcd9141d6347071
|
7
|
+
data.tar.gz: 447314ecf0c95a76529dc7d6c8c58dfcd5cf4eb3d60c7e74fb79d27b6c8b4db897626885c5f8c05b0111198f6f5a0fa053349c8819365fb91816a0dadf80855a
|
data/lib/asmrb.rb
CHANGED
@@ -10,7 +10,7 @@ class Asmrb
|
|
10
10
|
# Sample with recursion:
|
11
11
|
#
|
12
12
|
# Asmrb.new do
|
13
|
-
#
|
13
|
+
# fun :rec_print # define a function, also a label to jump.
|
14
14
|
# arg arr # arguments
|
15
15
|
# push 0 # get value to l variable
|
16
16
|
# len arr # get length of arr as array
|
@@ -36,7 +36,7 @@ class Asmrb
|
|
36
36
|
# => rec_print [1,2,3]
|
37
37
|
#
|
38
38
|
|
39
|
-
attr_reader :variables, :stack, :source, :name, :result, :params
|
39
|
+
attr_reader :variables, :stack, :source, :ruby_source, :name, :result, :params, :is_debug, :extension
|
40
40
|
attr_writer :is_debug
|
41
41
|
|
42
42
|
def initialize &block
|
@@ -45,7 +45,7 @@ class Asmrb
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def compiled?
|
48
|
-
!@
|
48
|
+
!@ruby_source.nil?
|
49
49
|
end
|
50
50
|
|
51
51
|
def invoke *args
|
@@ -57,13 +57,14 @@ class Asmrb
|
|
57
57
|
# need parititioning first..
|
58
58
|
partition
|
59
59
|
unless @partitions.empty?
|
60
|
-
@
|
60
|
+
@compile_stack = Array.new
|
61
|
+
@ruby_source = Array.new
|
61
62
|
block_labels = @partitions.map &:first
|
62
63
|
@entry_point = @partitions.first.first
|
63
64
|
@partitions.each.with_index do |partition, index|
|
64
65
|
define_block partition, index, block_labels
|
65
66
|
end
|
66
|
-
@
|
67
|
+
@ruby_source = @ruby_source.join "\n"
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
@@ -73,7 +74,7 @@ class Asmrb
|
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
76
|
-
def
|
77
|
+
def implementation_status
|
77
78
|
puts "[OPCODES] check:".green
|
78
79
|
OPS.map do |k, v|
|
79
80
|
check = OPCODES.include?(k.to_sym) ? :implemented : :not_yet
|
@@ -89,24 +90,53 @@ class Asmrb
|
|
89
90
|
puts "-------------------------".green
|
90
91
|
end
|
91
92
|
|
93
|
+
def new_instruction key, block
|
94
|
+
@extension[key] = block
|
95
|
+
end
|
96
|
+
|
97
|
+
def extend_program &block
|
98
|
+
self.instance_exec &block
|
99
|
+
end
|
100
|
+
|
101
|
+
def patch_line number, block=[]
|
102
|
+
@source.insert number, block
|
103
|
+
puts "patched at line #{number}: #{block}".light_green
|
104
|
+
rebuild_source
|
105
|
+
end
|
106
|
+
|
107
|
+
def remove_line line_number
|
108
|
+
puts "remove line #{line_number}: #{@source[line_number]}".light_yellow
|
109
|
+
@source.delete_at line_number
|
110
|
+
rebuild_source
|
111
|
+
end
|
112
|
+
|
113
|
+
def rebuild_source
|
114
|
+
@source.each do |statement|
|
115
|
+
build_statement statement.first, statement.last
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
92
119
|
private
|
93
120
|
def new_scope
|
94
|
-
@variables =
|
95
|
-
@source =
|
96
|
-
@
|
121
|
+
@variables = Hash.new
|
122
|
+
@source = Array.new
|
123
|
+
@ruby_source = Array.new
|
124
|
+
@program = Array.new
|
97
125
|
@params = 0
|
98
126
|
@name = "it"
|
99
|
-
@labels =
|
100
|
-
@stack =
|
127
|
+
@labels = Hash.new
|
128
|
+
@stack = Array.new
|
101
129
|
@pc = 0
|
102
130
|
@result = nil
|
103
131
|
@is_debug = false
|
104
132
|
@compile_stack = Array.new
|
133
|
+
@extension = Hash.new
|
105
134
|
end
|
106
135
|
|
107
136
|
def define_block partition, index, block_labels
|
108
137
|
func = partition.first
|
109
138
|
body = partition.last
|
139
|
+
|
110
140
|
args = body.first.first.to_sym == :arg ? body.first.last.join(', ') : ""
|
111
141
|
|
112
142
|
block = Array.new
|
@@ -135,8 +165,10 @@ class Asmrb
|
|
135
165
|
if index != block_labels.length-1 && ![:rec, :ret, :exi].include?(body.last[0].to_sym)
|
136
166
|
func = block_labels[index+1]
|
137
167
|
body = @partitions[func].first
|
168
|
+
|
138
169
|
#binding.pry
|
139
|
-
|
170
|
+
|
171
|
+
if body.first == :arg
|
140
172
|
args = "#{body.last.join(', ')}"
|
141
173
|
block << " #{func} #{args}"
|
142
174
|
else
|
@@ -147,12 +179,9 @@ class Asmrb
|
|
147
179
|
|
148
180
|
def finalize_block block
|
149
181
|
block << "end\n"
|
150
|
-
@
|
182
|
+
@ruby_source << block.join("\n")
|
151
183
|
|
152
|
-
if @is_debug
|
153
|
-
puts @source.last.light_yellow
|
154
|
-
puts "-------------------"
|
155
|
-
end
|
184
|
+
puts "-------------------" if @is_debug
|
156
185
|
end
|
157
186
|
|
158
187
|
def refvar val
|
@@ -169,116 +198,128 @@ class Asmrb
|
|
169
198
|
end
|
170
199
|
|
171
200
|
OPS = {
|
172
|
-
|
173
|
-
|
174
|
-
args.
|
201
|
+
:slp => lambda { |amount| sleep amount},
|
202
|
+
:los => lambda { | *args |
|
203
|
+
args = args.collect do |arg|
|
204
|
+
if @variables.include? arg
|
205
|
+
@variables[arg]
|
206
|
+
else
|
207
|
+
arg
|
208
|
+
end
|
209
|
+
end
|
210
|
+
args.reverse.each do |arg|
|
211
|
+
@stack.push arg
|
212
|
+
end
|
175
213
|
},
|
176
214
|
|
177
|
-
|
215
|
+
:lea => lambda { | name |
|
178
216
|
@variables[name] = @stack.pop
|
179
217
|
},
|
180
218
|
|
181
|
-
|
219
|
+
:len => lambda { | lst |
|
182
220
|
@stack.push @variables[lst].length
|
183
221
|
},
|
184
222
|
|
185
|
-
|
223
|
+
:cdr => lambda { | lst |
|
186
224
|
@stack.push @variables[lst].drop 1
|
187
225
|
},
|
188
226
|
|
189
|
-
|
227
|
+
:car => lambda { | lst |
|
190
228
|
@stack.push @variables[lst].first
|
191
229
|
},
|
192
230
|
|
193
|
-
|
231
|
+
:map => lambda { | ops |
|
194
232
|
eval "@stack.map(&:#{ops})"
|
195
233
|
},
|
196
234
|
|
197
|
-
|
235
|
+
:red => lambda { | ops |
|
198
236
|
e = eval "@stack.reduce(:#{ops})"
|
199
237
|
@stack.clear
|
200
238
|
@stack.push e
|
201
239
|
},
|
202
240
|
|
203
|
-
|
241
|
+
:dpl => lambda {
|
204
242
|
@stack.push @stack.last
|
205
243
|
},
|
206
244
|
|
207
|
-
|
208
|
-
|
209
|
-
|
245
|
+
:add => lambda { @stack.push @stack.pop + @stack.pop },
|
246
|
+
:sub => lambda { @stack.push @stack.pop - @stack.pop },
|
247
|
+
:mul => lambda { @stack.push @stack.pop * @stack.pop },
|
248
|
+
:div => lambda { @stack.push @stack.pop / @stack.pop },
|
210
249
|
|
211
|
-
|
212
|
-
|
213
|
-
},
|
214
|
-
|
215
|
-
"mul" => lambda {
|
216
|
-
@stack.push @stack.pop * @stack.pop
|
217
|
-
},
|
218
|
-
|
219
|
-
"div" => lambda {
|
220
|
-
@stack.push @stack.pop / @stack.pop
|
221
|
-
},
|
222
|
-
|
223
|
-
"icr" => lambda { |dest, incval = 1|
|
224
|
-
@variables[dest] += incval
|
225
|
-
},
|
250
|
+
:icr => lambda { |dest, val = 1| @variables[dest] += val },
|
251
|
+
:dcr => lambda { |dest, val = 1| @variables[dest] -= val },
|
226
252
|
|
227
|
-
|
228
|
-
@variables[dest] -= decrval
|
229
|
-
},
|
230
|
-
|
231
|
-
"mov" => lambda { | src , dest |
|
253
|
+
:mov => lambda { | src , dest |
|
232
254
|
@variables[dest] =
|
233
255
|
src.is_a?(Symbol) ?
|
234
256
|
@variables[src] : src
|
235
257
|
},
|
236
258
|
|
237
|
-
|
259
|
+
:jnl => lambda { | name |
|
238
260
|
req_args "jnl", 1
|
239
|
-
|
261
|
+
if @stack.pop.nil?
|
262
|
+
@pc = @labels[name]
|
263
|
+
new_title "[#{name}]" if @is_debug
|
264
|
+
end
|
240
265
|
},
|
241
266
|
|
242
|
-
|
267
|
+
:jz => lambda { | name |
|
243
268
|
req_args "jz", 1
|
244
|
-
|
269
|
+
if @stack.pop == 0
|
270
|
+
@pc = @labels[name]
|
271
|
+
new_title "[#{name}]" if @is_debug
|
272
|
+
end
|
245
273
|
},
|
246
274
|
|
247
|
-
|
275
|
+
:jnz => lambda { | name |
|
248
276
|
req_args "jnz", 1
|
249
|
-
|
277
|
+
if @stack.pop != 0
|
278
|
+
@pc = @labels[name]
|
279
|
+
new_title "[#{name}]" if @is_debug
|
280
|
+
end
|
250
281
|
},
|
251
282
|
|
252
|
-
|
283
|
+
:jge => lambda { |name|
|
253
284
|
req_args "jge", 2
|
254
|
-
|
285
|
+
if @stack.pop > @stack.pop
|
286
|
+
@pc = @labels[name]
|
287
|
+
new_title "[#{name}]" if @is_debug
|
288
|
+
end
|
255
289
|
},
|
256
290
|
|
257
|
-
|
291
|
+
:jlt => lambda { |name|
|
258
292
|
req_args "jlt", 2
|
259
|
-
|
293
|
+
if @stack.pop < @stack.pop
|
294
|
+
@pc = @labels[name]
|
295
|
+
new_title "[#{name}]" if @is_debug
|
296
|
+
end
|
297
|
+
|
260
298
|
},
|
261
299
|
|
262
|
-
|
300
|
+
:jeq => lambda { |name|
|
263
301
|
req_args "jeq", 2
|
264
|
-
|
302
|
+
if @stack.pop == @stack.pop
|
303
|
+
@pc = @labels[name]
|
304
|
+
new_title "[#{name}]" if @is_debug
|
305
|
+
end
|
265
306
|
},
|
266
307
|
|
267
|
-
|
308
|
+
:jmp => lambda { |name|
|
268
309
|
@pc = @labels[name]
|
269
310
|
new_title "[#{name}]" if @is_debug
|
270
311
|
},
|
271
312
|
|
272
|
-
|
313
|
+
:pop => lambda {|val|
|
273
314
|
@stack.pop
|
274
315
|
},
|
275
316
|
|
276
|
-
|
317
|
+
:psh => lambda {|src|
|
277
318
|
@stack.push(
|
278
319
|
src.is_a?(Symbol) ? @variables[src] : src )
|
279
320
|
},
|
280
321
|
|
281
|
-
|
322
|
+
:arg => lambda { |*args|
|
282
323
|
if @stack.length < args.length
|
283
324
|
raise Exception.new "require (#{args.join(', ')}) on stack: #{@stack}"
|
284
325
|
else
|
@@ -288,16 +329,16 @@ class Asmrb
|
|
288
329
|
end
|
289
330
|
},
|
290
331
|
|
291
|
-
|
332
|
+
:req => lambda {|amount|
|
292
333
|
raise Exception.new "require #{amount} arg." if @stack.length < amount
|
293
334
|
},
|
294
335
|
|
295
|
-
|
336
|
+
:dbg => lambda {
|
296
337
|
puts "#{@stack} > #{@program[@pc][0]}".light_green
|
297
338
|
binding.pry if @is_debug
|
298
339
|
},
|
299
340
|
|
300
|
-
|
341
|
+
:inv => lambda { |obj, f|
|
301
342
|
args = Array.new
|
302
343
|
@stack.each { args << @stack.pop } if @stack.length > 0
|
303
344
|
if args.length > 0
|
@@ -307,7 +348,7 @@ class Asmrb
|
|
307
348
|
end
|
308
349
|
},
|
309
350
|
|
310
|
-
|
351
|
+
:cal => lambda {|fname|
|
311
352
|
_method = method fname
|
312
353
|
if _method && _method.parameters.length > 0
|
313
354
|
args = Array.new
|
@@ -320,15 +361,16 @@ class Asmrb
|
|
320
361
|
end
|
321
362
|
@stack.push invoke if !invoke.nil?
|
322
363
|
},
|
323
|
-
|
364
|
+
:rec => lambda {
|
324
365
|
@pc = -1
|
366
|
+
new_title "[#{@name}]" if @is_debug
|
325
367
|
},
|
326
368
|
|
327
|
-
|
369
|
+
:ret => lambda {
|
328
370
|
@pc = @program.length-1
|
329
371
|
},
|
330
372
|
|
331
|
-
|
373
|
+
:exi => lambda {
|
332
374
|
exit
|
333
375
|
}
|
334
376
|
}
|
@@ -338,24 +380,28 @@ class Asmrb
|
|
338
380
|
puts "#{@label[blo]}: #{blo}".purple if @is_debug
|
339
381
|
end
|
340
382
|
|
341
|
-
def method_missing
|
383
|
+
def method_missing name, *args
|
384
|
+
build_statement name, *args
|
385
|
+
end
|
386
|
+
|
387
|
+
def build_statement name, *args
|
342
388
|
# save source
|
343
389
|
@source << [name, args]
|
344
390
|
|
345
|
-
# :
|
346
|
-
|
391
|
+
# :_name => :name
|
392
|
+
name = name.to_s.gsub("_", "").to_sym
|
347
393
|
|
348
|
-
if OPS.keys.include?
|
349
|
-
@program << [
|
394
|
+
if OPS.keys.include? name
|
395
|
+
@program << [name, args]
|
350
396
|
# get parameter amount:
|
351
|
-
@params = args.length if
|
397
|
+
@params = args.length if name == :arg
|
352
398
|
else
|
353
|
-
case
|
399
|
+
case name
|
354
400
|
|
355
|
-
when
|
401
|
+
when :blo
|
356
402
|
create_label args.first
|
357
403
|
|
358
|
-
when
|
404
|
+
when :fun
|
359
405
|
@name = args.first
|
360
406
|
create_label @name
|
361
407
|
|
@@ -365,26 +411,24 @@ class Asmrb
|
|
365
411
|
end
|
366
412
|
end
|
367
413
|
|
368
|
-
def load_program &block
|
369
|
-
self.instance_exec &block
|
370
|
-
end
|
371
|
-
|
372
414
|
def execute debug=false
|
373
415
|
new_line if debug
|
374
416
|
puts "#{@stack} > #{@name}".yellow if debug
|
375
417
|
begin
|
376
418
|
@pc = 0
|
419
|
+
@variables = Hash.new
|
377
420
|
until @pc == @program.length
|
378
|
-
|
421
|
+
|
379
422
|
instr = @program[@pc]
|
423
|
+
|
380
424
|
puts "#{@pc}: #{instr[0]} #{instr[1].join " "}".light_green if debug
|
381
|
-
|
425
|
+
|
382
426
|
self.instance_exec *instr[1], &OPS[instr[0]]
|
427
|
+
|
383
428
|
@pc += 1
|
384
429
|
end
|
385
|
-
#binding.pry
|
386
430
|
@result = @stack.last
|
387
|
-
clear
|
431
|
+
@stack.clear
|
388
432
|
rescue Exception => e
|
389
433
|
debug e, instr
|
390
434
|
end
|
@@ -392,20 +436,6 @@ class Asmrb
|
|
392
436
|
@result
|
393
437
|
end
|
394
438
|
|
395
|
-
def fast_execute *args
|
396
|
-
arguments args
|
397
|
-
@pc = 0
|
398
|
-
until @pc == @program.length
|
399
|
-
# execute proc:
|
400
|
-
self.instance_exec *@program[@pc].last,
|
401
|
-
&OPS[@program[@pc].first]
|
402
|
-
@pc += 1
|
403
|
-
end
|
404
|
-
@result = @stack.last
|
405
|
-
clear
|
406
|
-
@result
|
407
|
-
end
|
408
|
-
|
409
439
|
def new_title title
|
410
440
|
puts "\n::#{title}"
|
411
441
|
end
|
@@ -427,6 +457,7 @@ class Asmrb
|
|
427
457
|
(scope_begin..scope_end).each do | i |
|
428
458
|
instr = @program[i]
|
429
459
|
color = i != @pc ? :light_green : :magenta
|
460
|
+
binding.pry
|
430
461
|
puts "#{i}: #{instr[0]} #{instr[1]}".colorize color
|
431
462
|
end
|
432
463
|
unless instr.nil?
|
@@ -438,6 +469,7 @@ class Asmrb
|
|
438
469
|
end
|
439
470
|
|
440
471
|
def ops_info name
|
472
|
+
return if OPS[name].nil?
|
441
473
|
parameters = Array.new
|
442
474
|
OPS[name].parameters.each do |pair|
|
443
475
|
parameters << pair.last
|
@@ -451,14 +483,8 @@ class Asmrb
|
|
451
483
|
end
|
452
484
|
end
|
453
485
|
|
454
|
-
def clear
|
455
|
-
@pc = 0
|
456
|
-
@variables = { }
|
457
|
-
@stack = []
|
458
|
-
end
|
459
|
-
|
460
486
|
def assemble &block
|
461
|
-
|
487
|
+
extend_program &block
|
462
488
|
eval "$#{@name} = self.clone"
|
463
489
|
eval "$#{@name}"
|
464
490
|
end
|
@@ -509,7 +535,16 @@ class Asmrb
|
|
509
535
|
end
|
510
536
|
|
511
537
|
def patched_arg label
|
512
|
-
|
538
|
+
patched = ""
|
539
|
+
if @labels_arg.include? label
|
540
|
+
patched = "#{label}(#{@labels_arg[label].join(', ')})"
|
541
|
+
else
|
542
|
+
patched = "#{label}"
|
543
|
+
end
|
544
|
+
if !@partitions[label].nil? && @partitions[label].last.first == :ret
|
545
|
+
patched = "return " + patched
|
546
|
+
end
|
547
|
+
patched
|
513
548
|
end
|
514
549
|
|
515
550
|
def opcode_operator op
|
@@ -527,7 +562,12 @@ class Asmrb
|
|
527
562
|
nil
|
528
563
|
end
|
529
564
|
|
565
|
+
def fetch statement
|
566
|
+
@compile_stack << statement
|
567
|
+
end
|
568
|
+
|
530
569
|
OPCODES = {
|
570
|
+
:slp => lambda {|amount| "sleep #{amount}"},
|
531
571
|
:dbg => lambda {"binding.pry"},
|
532
572
|
:req => lambda {|_|},
|
533
573
|
|
@@ -535,26 +575,26 @@ class Asmrb
|
|
535
575
|
:red => lambda {|op| "#{@compile_stack}.reduce :#{op}" },
|
536
576
|
|
537
577
|
:pop => lambda { @compile_stack.pop },
|
538
|
-
:icr => lambda {|arg|
|
539
|
-
:dcr => lambda {|arg|
|
578
|
+
:icr => lambda {|arg| fetch "#{arg} = #{arg} + 1" },
|
579
|
+
:dcr => lambda {|arg| fetch "#{arg} = #{arg} - 1" },
|
540
580
|
|
541
581
|
:mov => lambda {|src, dest| "#{dest} = #{src}" },
|
542
|
-
:dpl => lambda {
|
582
|
+
:dpl => lambda { fetch @compile_stack.last },
|
543
583
|
|
544
|
-
:car => lambda {|arg|
|
545
|
-
:cdr => lambda {|arg|
|
546
|
-
:len => lambda {|arg|
|
584
|
+
:car => lambda {|arg| fetch "#{arg}.first" },
|
585
|
+
:cdr => lambda {|arg| fetch "#{arg}.drop(1)" },
|
586
|
+
:len => lambda {|arg| fetch "#{arg}.length" },
|
547
587
|
|
548
588
|
:arg => lambda {|*args|
|
549
589
|
# ignore it
|
550
590
|
},
|
551
591
|
:los => lambda {|*args|
|
552
|
-
args.reverse.each{|arg|
|
592
|
+
args.reverse.each{|arg| fetch arg}
|
553
593
|
nil
|
554
594
|
},
|
555
595
|
:psh => lambda {|arg|
|
556
596
|
arg = "\"#{arg}\"" if arg.class == String
|
557
|
-
|
597
|
+
fetch arg
|
558
598
|
nil
|
559
599
|
},
|
560
600
|
:lea => lambda {|var|
|
@@ -596,10 +636,10 @@ class Asmrb
|
|
596
636
|
:inv => lambda {|obj, f|
|
597
637
|
begin
|
598
638
|
if method(f).parameters.length == 0
|
599
|
-
|
639
|
+
fetch "#{obj}.#{f}"
|
600
640
|
else
|
601
641
|
args = method(f).parameters.collect{@compile_stack.pop}
|
602
|
-
|
642
|
+
fetch "#{obj}.#{f} #{args.join(', ')}"
|
603
643
|
end
|
604
644
|
nil
|
605
645
|
rescue Exception => e
|
@@ -609,80 +649,39 @@ class Asmrb
|
|
609
649
|
}
|
610
650
|
end
|
611
651
|
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
# arg :toy
|
616
|
-
# psh :toy
|
617
|
-
# cal :puts
|
618
|
-
|
619
|
-
# blo :after_print
|
620
|
-
# psh :@times
|
621
|
-
# jnl :init_timer
|
622
|
-
|
623
|
-
# blo :append
|
624
|
-
# inv :@times, :to_s
|
625
|
-
# psh "X"
|
626
|
-
# add
|
627
|
-
# cal :puts
|
628
|
-
|
629
|
-
# blo :count
|
630
|
-
# psh :@times
|
631
|
-
# psh 1
|
632
|
-
# add
|
633
|
-
# lea :@times
|
634
|
-
# psh :@times
|
635
|
-
# psh 10
|
636
|
-
# jeq :final
|
637
|
-
# psh "__"
|
638
|
-
# rec
|
639
|
-
|
640
|
-
# blo :final
|
641
|
-
# psh "__"
|
642
|
-
# cal :puts
|
643
|
-
# inv :@times, :to_s
|
644
|
-
# psh "Final result = "
|
645
|
-
# add
|
646
|
-
# cal :puts
|
647
|
-
# exi
|
648
|
-
|
649
|
-
# blo :init_timer
|
650
|
-
# psh 0
|
651
|
-
# lea :@times
|
652
|
-
# jmp :append
|
653
|
-
# end
|
654
|
-
|
655
|
-
# @x.is_debug = false
|
656
|
-
# test = @x.to_ruby
|
657
|
-
# puts test.light_green
|
658
|
-
# eval test
|
659
|
-
# play "I'm The Trung, here we go:"
|
652
|
+
def asmrb &block
|
653
|
+
Asmrb.new &block
|
654
|
+
end
|
660
655
|
|
661
656
|
# # applying: argumented block ( lambda )
|
662
657
|
# # should be "inline block" technique also,
|
663
658
|
# # to improve performance and local variable sharing.
|
664
|
-
# @
|
659
|
+
# @y = asmrb do
|
665
660
|
# fun :factorial
|
666
661
|
# arg :acc, :n
|
662
|
+
# los :acc, :n
|
667
663
|
# los :n, 1
|
668
|
-
# jlt :
|
664
|
+
# jlt :result
|
669
665
|
|
670
|
-
# blo :
|
666
|
+
# blo :else_block
|
671
667
|
# arg :acc, :n
|
672
|
-
# los :
|
668
|
+
# los :acc, :n
|
673
669
|
# mul
|
674
670
|
# los :n, 1
|
675
671
|
# sub
|
676
|
-
# rec
|
677
|
-
|
678
|
-
# blo :
|
672
|
+
# rec
|
673
|
+
|
674
|
+
# blo :result
|
679
675
|
# arg :acc
|
680
676
|
# psh :acc
|
681
|
-
#
|
682
|
-
# exi # no return yet, because return doesn't mean anything inside a block. we can't escape.
|
677
|
+
# ret
|
683
678
|
# end
|
684
679
|
|
685
|
-
#
|
686
|
-
# puts
|
687
|
-
#
|
688
|
-
#
|
680
|
+
# @y.is_debug = true
|
681
|
+
# puts @y.invoke 1, 3
|
682
|
+
# #@y.all_opcodes
|
683
|
+
# test = @y.to_ruby
|
684
|
+
# puts test
|
685
|
+
# eval test
|
686
|
+
# @y = factorial 1, 1000
|
687
|
+
# puts "Start test: #{@y}"
|