haxor 0.3.0 → 0.4.0

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.
@@ -1,7 +1,7 @@
1
1
  module Haxor
2
2
  module Vm
3
3
  class Mem < Subsystem
4
- attr_accessor :memory
4
+ #attr_accessor :memory
5
5
 
6
6
  def initialize(bytes)
7
7
  @memory = Array.new(bytes, 0).pack('C*')
@@ -56,44 +56,9 @@ module Haxor
56
56
  @memory[addr...x] = data
57
57
  end
58
58
 
59
- # (see #read)
60
- def dereference(addr)
61
- read addr
62
- end
63
-
64
- # Reads data pointed by IP register and moves IP forward
65
- #
66
- # @return [Integer] Data stored under address pointed by IP
67
- def next_word
68
- data = read ip
69
- move_ip Consts::WORD_SIZE
70
- data
71
- end
72
-
73
- # TODO: BC
74
- def next_cell
75
- next_word
76
- end
77
-
78
- def ip
79
- read 'ip'
80
- end
81
-
82
- def move_ip(step)
83
- write 'ip', ip + step
84
- end
85
-
86
- def label(name)
87
- @labels[addr]
88
- end
89
-
90
59
  private
91
60
 
92
61
  def resolve(addr)
93
- if addr.is_a? String
94
- fail "Unknown label #{addr}." unless @labels.key? addr
95
- addr = @labels[addr]
96
- end
97
62
  Range.new(addr, addr + Consts::WORD_SIZE, true)
98
63
  end
99
64
  end
@@ -2,14 +2,13 @@ module Haxor
2
2
  module Vm
3
3
  class Os < Subsystem
4
4
  TABLE = {
5
- 0x01 => :sys_exit,
6
- 0x02 => :sys_printf,
7
- 0x03 => :sys_scanf,
8
- 0x04 => :sys_rand
5
+ 0x01 => :sys_printf,
6
+ 0x02 => :sys_scanf,
7
+ 0x03 => :sys_rand
9
8
  }
10
9
 
11
10
  def syscall
12
- func = subsystem(:mem).read 'sc'
11
+ func = subsystem(:cpu).reg(Vm::Cpu::Core::REG_SYSCALL)
13
12
  send(TABLE[func])
14
13
  end
15
14
 
@@ -50,14 +49,8 @@ module Haxor
50
49
  types
51
50
  end
52
51
 
53
- def sys_exit
54
- code = subsystem(:stack).pop_value
55
- exit code
56
- end
57
-
58
52
  def sys_printf
59
53
  fd = subsystem(:stack).pop_value
60
-
61
54
  x = subsystem(:stack).pop_value
62
55
  fmt = collect_string x
63
56
  args = []
@@ -85,7 +78,7 @@ module Haxor
85
78
  result = file.scanf fmt
86
79
 
87
80
  if result.size != types.size
88
- subsystem(:mem).write 'sc', -1
81
+ subsystem(:cpu).reg Vm::Cpu::Core::REG_SYSCALL, -1
89
82
  return
90
83
  end
91
84
 
@@ -108,7 +101,8 @@ module Haxor
108
101
  max = subsystem(:stack).pop_value
109
102
 
110
103
  prng = Random.new
111
- subsystem(:stack).push_value prng.rand(min..max)
104
+ v = prng.rand(min..max)
105
+ subsystem(:stack).push_value v
112
106
  end
113
107
  end
114
108
  end
@@ -7,9 +7,9 @@ module Haxor
7
7
  end
8
8
 
9
9
  def push_value(value)
10
- sp = @vm.subsystem(:registers).read 'sp'
10
+ sp = @vm.subsystem(:cpu).reg Vm::Cpu::Core::REG_STACK
11
11
  sp -= Consts::WORD_SIZE
12
- @vm.subsystem(:registers).write 'sp', sp
12
+ @vm.subsystem(:cpu).reg Vm::Cpu::Core::REG_STACK, sp
13
13
  @vm.subsystem(:mem).write sp, value
14
14
  end
15
15
 
@@ -19,10 +19,10 @@ module Haxor
19
19
  end
20
20
 
21
21
  def pop_value
22
- sp = @vm.subsystem(:registers).read 'sp'
22
+ sp = @vm.subsystem(:cpu).reg Vm::Cpu::Core::REG_STACK
23
23
  value = @vm.subsystem(:mem).read sp
24
24
  sp += Consts::WORD_SIZE
25
- @vm.subsystem(:registers).write 'sp', sp
25
+ @vm.subsystem(:cpu).reg Vm::Cpu::Core::REG_STACK, sp
26
26
 
27
27
  value
28
28
  end
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: haxor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Krzysztof Magosa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-02 00:00:00.000000000 Z
11
+ date: 2016-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,7 +42,7 @@ description: Please follow to GitHub repository for more information.
42
42
  email:
43
43
  - krzysztof@magosa.pl
44
44
  executables:
45
- - hcc
45
+ - hc
46
46
  - hld
47
47
  - hvm
48
48
  extensions: []
@@ -54,21 +54,13 @@ files:
54
54
  - LICENSE.txt
55
55
  - README.md
56
56
  - Rakefile
57
- - bin/hcc
57
+ - bin/hc
58
58
  - bin/hld
59
59
  - bin/hvm
60
60
  - examples/build.sh
61
61
  - examples/guess-the-number.hax
62
62
  - haxor.gemspec
63
63
  - lib/haxor.rb
64
- - lib/haxor/compiler/component/arithmetic.rb
65
- - lib/haxor/compiler/component/base.rb
66
- - lib/haxor/compiler/component/data.rb
67
- - lib/haxor/compiler/component/jumps.rb
68
- - lib/haxor/compiler/component/logical.rb
69
- - lib/haxor/compiler/component/other.rb
70
- - lib/haxor/compiler/component/transfer.rb
71
- - lib/haxor/compiler/component/various.rb
72
64
  - lib/haxor/compiler/core.rb
73
65
  - lib/haxor/compiler/section.rb
74
66
  - lib/haxor/compiler/unit.rb
@@ -81,21 +73,15 @@ files:
81
73
  - lib/haxor/token/int64.rb
82
74
  - lib/haxor/token/label.rb
83
75
  - lib/haxor/token/pointer.rb
76
+ - lib/haxor/utils.rb
84
77
  - lib/haxor/vm/core.rb
85
78
  - lib/haxor/vm/cpu/core.rb
86
- - lib/haxor/vm/cpu/unit/arithmetic.rb
87
- - lib/haxor/vm/cpu/unit/base.rb
88
- - lib/haxor/vm/cpu/unit/jumps.rb
89
- - lib/haxor/vm/cpu/unit/logical.rb
90
- - lib/haxor/vm/cpu/unit/transfer.rb
91
- - lib/haxor/vm/cpu/unit/various.rb
92
79
  - lib/haxor/vm/mem.rb
93
80
  - lib/haxor/vm/os.rb
94
81
  - lib/haxor/vm/registers.rb
95
82
  - lib/haxor/vm/stack.rb
96
83
  - lib/haxor/vm/subsystem.rb
97
84
  - media/memory.png
98
- - media/vm.png
99
85
  homepage: https://github.com/krzysztof-magosa/haxor
100
86
  licenses:
101
87
  - BSD-3
@@ -1,45 +0,0 @@
1
- module Haxor
2
- module Compiler
3
- module Component
4
- class Arithmetic < Base
5
- def register
6
- bind_cmd 'inc', :cmd_inc
7
- bind_cmd 'dec', :cmd_dec
8
- bind_cmd 'add', :cmd_add
9
- bind_cmd 'sub', :cmd_sub
10
- bind_cmd 'div', :cmd_div
11
- bind_cmd 'mul', :cmd_mul
12
- bind_cmd 'cmp', :cmd_cmp
13
- end
14
-
15
- def cmd_add(a, b)
16
- add_cmd Vm::Cpu::Unit::Arithmetic::OP_ADD, a, b
17
- end
18
-
19
- def cmd_sub(a, b)
20
- add_cmd Vm::Cpu::Unit::Arithmetic::OP_SUB, a, b
21
- end
22
-
23
- def cmd_div(a)
24
- add_cmd Vm::Cpu::Unit::Arithmetic::OP_DIV, a
25
- end
26
-
27
- def cmd_mul(a)
28
- add_cmd Vm::Cpu::Unit::Arithmetic::OP_MUL, a
29
- end
30
-
31
- def cmd_cmp(a, b)
32
- add_cmd Vm::Cpu::Unit::Arithmetic::OP_CMP, a, b
33
- end
34
-
35
- def cmd_inc(a)
36
- add_cmd Vm::Cpu::Unit::Arithmetic::OP_INC, a
37
- end
38
-
39
- def cmd_dec(a)
40
- add_cmd Vm::Cpu::Unit::Arithmetic::OP_DEC, a
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,41 +0,0 @@
1
- module Haxor
2
- module Compiler
3
- module Component
4
- class Base
5
- attr_accessor :compiler
6
-
7
- def register
8
- fail 'this method must be implemented.'
9
- end
10
-
11
- def bind_cmd(cmd, method)
12
- compiler.bind_cmd cmd, self, method
13
- end
14
-
15
- def add(token)
16
- compiler.add token
17
- end
18
-
19
- def add_cmd(opcode, a = nil, b = nil)
20
- compiler.add_cmd opcode, a, b
21
- end
22
-
23
- def parse_value(value)
24
- compiler.parse_value value
25
- end
26
-
27
- def offset_flags(a, b = nil)
28
- compiler.offset_flags(a, b)
29
- end
30
-
31
- def offset?(value)
32
- compiler.offset? value
33
- end
34
-
35
- def strip_offset(value)
36
- compiler.strip_offset value
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,32 +0,0 @@
1
- module Haxor
2
- module Compiler
3
- module Component
4
- class Data < Base
5
- def register
6
- bind_cmd 'dw', :cmd_dw
7
- bind_cmd 'resw', :cmd_resw
8
- end
9
-
10
- def cmd_dw(*args)
11
- add Token::Label.new(args[0])
12
-
13
- (1...args.size).each do |i|
14
- begin
15
- add Token::Int64.new(Integer(args[i]))
16
- rescue
17
- args[i][1...-1].each_char do |c|
18
- add Token::Int64.new(c.ord)
19
- end
20
- end
21
- end
22
- end
23
-
24
- def cmd_resw(*args)
25
- (1..args[0].to_i).each do
26
- add Token::Int64.new(0)
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,83 +0,0 @@
1
- module Haxor
2
- module Compiler
3
- module Component
4
- class Jumps < Base
5
- def register
6
- bind_cmd 'call', :cmd_call
7
- bind_cmd 'ret', :cmd_ret
8
- bind_cmd 'iret', :cmd_iret
9
-
10
- bind_cmd 'jmp', :cmd_jmp
11
-
12
- bind_cmd 'je', :cmd_je
13
- bind_cmd 'jg', :cmd_jg
14
- bind_cmd 'jge', :cmd_jge
15
- bind_cmd 'jl', :cmd_jl
16
- bind_cmd 'jle', :cmd_jle
17
-
18
- bind_cmd 'jne', :cmd_jne
19
- bind_cmd 'jng', :cmd_jng
20
- bind_cmd 'jnge', :cmd_jnge
21
- bind_cmd 'jnl', :cmd_jnl
22
- bind_cmd 'jnle', :cmd_jnle
23
- end
24
-
25
- def cmd_call(a)
26
- add_cmd Vm::Cpu::Unit::Jumps::OP_CALL, a
27
- end
28
-
29
- def cmd_ret(*_args)
30
- add_cmd Vm::Cpu::Unit::Jumps::OP_RET
31
- end
32
-
33
- def cmd_iret(*_args)
34
- add_cmd Vm::Cpu::Unit::Jumps::OP_IRET
35
- end
36
-
37
- def cmd_jmp(a)
38
- add_cmd Vm::Cpu::Unit::Jumps::OP_JMP, a
39
- end
40
-
41
- def cmd_je(a)
42
- add_cmd Vm::Cpu::Unit::Jumps::OP_JE, a
43
- end
44
-
45
- def cmd_jg(a)
46
- add_cmd Vm::Cpu::Unit::Jumps::OP_JG, a
47
- end
48
-
49
- def cmd_jge(a)
50
- add_cmd Vm::Cpu::Unit::Jumps::OP_JGE, a
51
- end
52
-
53
- def cmd_jl(a)
54
- add_cmd Vm::Cpu::Unit::Jumps::OP_JL, a
55
- end
56
-
57
- def cmd_jle(a)
58
- add_cmd Vm::Cpu::Unit::Jumps::OP_JLE, a
59
- end
60
-
61
- def cmd_jne(a)
62
- add_cmd Vm::Cpu::Unit::Jumps::OP_JNE, a
63
- end
64
-
65
- def cmd_jng(a)
66
- add_cmd Vm::Cpu::Unit::Jumps::OP_JNG, a
67
- end
68
-
69
- def cmd_jnge(a)
70
- add_cmd Vm::Cpu::Unit::Jumps::OP_JNGE, a
71
- end
72
-
73
- def cmd_jnl(a)
74
- add_cmd Vm::Cpu::Unit::Jumps::OP_JNL, a
75
- end
76
-
77
- def cmd_jnle(a)
78
- add_cmd Vm::Cpu::Unit::Jumps::OP_JNLE, a
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,35 +0,0 @@
1
- module Haxor
2
- module Compiler
3
- module Component
4
- class Logical < Base
5
- def register
6
- bind_cmd 'and', :cmd_and
7
- bind_cmd 'neg', :cmd_neg
8
- bind_cmd 'not', :cmd_not
9
- bind_cmd 'or', :cmd_or
10
- bind_cmd 'xor', :cmd_xor
11
- end
12
-
13
- def cmd_and(a, b)
14
- add_cmd Vm::Cpu::Unit::Logical::OP_AND, a, b
15
- end
16
-
17
- def cmd_neg(a)
18
- add_cmd Vm::Cpu::Unit::Logical::OP_NEG, a
19
- end
20
-
21
- def cmd_not(a)
22
- add_cmd Vm::Cpu::Unit::Logical::OP_NOT, a
23
- end
24
-
25
- def cmd_or(a, b)
26
- add_cmd Vm::Cpu::Unit::Logical::OP_OR, a, b
27
- end
28
-
29
- def cmd_xor(a, b)
30
- add_cmd Vm::Cpu::Unit::Logical::OP_XOR, a, b
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,21 +0,0 @@
1
- module Haxor
2
- module Compiler
3
- module Component
4
- class Other < Base
5
- def register
6
- bind_cmd 'label', :cmd_label
7
- bind_cmd 'rem', :cmd_rem
8
- bind_cmd '#', :cmd_rem
9
- end
10
-
11
- def cmd_rem(*_args)
12
- # nothing
13
- end
14
-
15
- def cmd_label(*args)
16
- add Token::Label.new(args[0])
17
- end
18
- end
19
- end
20
- end
21
- end