haxor 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 86dcbbd321e0c9f81e94620624119b709967430b
4
- data.tar.gz: b6aa04aa13522e6de177628276de6f4503913d29
3
+ metadata.gz: 293f0584494d168aa8bfe9d97871fc62fd11936b
4
+ data.tar.gz: 2a06187130337634f8a271d8d9a869928792919a
5
5
  SHA512:
6
- metadata.gz: ffa365bb3a8118366f4179e77f10b4723a40c44f7ef2751142336412ada1711bd848958b641740b94f1278b61b18c592bdbde8fbba58bb7649fa736b1b92d887
7
- data.tar.gz: 5eaeef6044009fe4709d2b85d7cf7a587010233e13106ad640f6c0a0311bd53974bf96ceb68ce5fe79ce4aab560d96e1e904019fa3b556ef3af200ec3e965416
6
+ metadata.gz: ef117dfbef1487268cf206d24dfd89aefcc909f9c8702c6e1502edbb9b2c498b023bb57fd89d73508278238a0c52a509f79d6dc240ea67143a2035bf31d6eccd
7
+ data.tar.gz: c853651c044c0d7c53a1b465b9116a0d33b919f14ccbb55f38e5eff02b9975c02db0f344f0b6c97fa98ec16925750547b2645f86939801cfc80010562c802db4
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
1
  # Haxor VM
2
+ [![Gem Version](https://badge.fury.io/rb/haxor.svg)](https://badge.fury.io/rb/haxor)
3
+ [![Code Climate](https://codeclimate.com/github/krzysztof-magosa/haxor/badges/gpa.svg)](https://codeclimate.com/github/krzysztof-magosa/haxor)
4
+
2
5
  Haxor consists of compiler _hcc_, linker _hld_ and virtual machine _hvm_.
3
6
  _hcc_ translates asm-like code into tokens, _hld_ links them into bytecode, while _hvm_ runs it.
4
7
 
@@ -405,6 +408,7 @@ Generates random integer from specified range.
405
408
  Arguments:
406
409
  * minimum (inclusive)
407
410
  * maximum (inclusive)
411
+
408
412
  Generated number is pushed onto stack.
409
413
  ```
410
414
  mov sc, 04h
data/bin/hcc CHANGED
@@ -1,10 +1,28 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
3
  require_relative '../lib/haxor'
4
+ require 'optparse'
4
5
 
5
- if ARGV[0].nil?
6
- puts "You must specify .hax file to be compiled."
7
- exit 1
6
+ parser = OptionParser.new do |opts|
7
+ opts.banner = 'Usage: hcc [options] [file.hax]'
8
+
9
+ opts.on_tail('-h', '--help', 'Show this message') do
10
+ puts opts
11
+ exit
12
+ end
13
+
14
+ opts.on_tail('-v', '--version', 'Show version') do
15
+ puts "Haxor, version #{Haxor::Consts::GEM_VERSION}, version id #{Haxor::Consts::VERSION}."
16
+ exit
17
+ end
18
+ end
19
+
20
+ parser.parse!
21
+
22
+ if ARGV.empty?
23
+ puts 'You must specify .hax file to be compiled.'
24
+ puts parser
25
+ exit
8
26
  end
9
27
 
10
28
  source = File.absolute_path ARGV[0]
data/bin/hld CHANGED
@@ -19,6 +19,11 @@ parser = OptionParser.new do |opts|
19
19
  puts opts
20
20
  exit
21
21
  end
22
+
23
+ opts.on_tail('-v', '--version', 'Show version') do
24
+ puts "Haxor, version #{Haxor::Consts::GEM_VERSION}, version id #{Haxor::Consts::VERSION}."
25
+ exit
26
+ end
22
27
  end
23
28
 
24
29
  parser.parse!
data/bin/hvm CHANGED
@@ -2,9 +2,28 @@
2
2
 
3
3
  require_relative '../lib/haxor'
4
4
 
5
+ require 'optparse'
6
+
7
+ parser = OptionParser.new do |opts|
8
+ opts.banner = 'Usage: hvm [options] [file.hax.e]'
9
+
10
+ opts.on_tail('-h', '--help', 'Show this message') do
11
+ puts opts
12
+ exit
13
+ end
14
+
15
+ opts.on_tail('-v', '--version', 'Show version') do
16
+ puts "Haxor, version #{Haxor::Consts::GEM_VERSION}, version id #{Haxor::Consts::VERSION}."
17
+ exit
18
+ end
19
+ end
20
+
21
+ parser.parse!
22
+
5
23
  if ARGV[0].nil?
6
- puts "You must specify .hax.e file to be run."
7
- exit 1
24
+ puts 'You must specify .hax.e file to be run.'
25
+ puts parser
26
+ exit
8
27
  end
9
28
 
10
29
  vm = Haxor::Vm::Core.new
data/lib/haxor.rb CHANGED
@@ -12,6 +12,7 @@ require_relative 'haxor/vm/subsystem'
12
12
  require_relative 'haxor/vm/mem'
13
13
  require_relative 'haxor/vm/stack'
14
14
  require_relative 'haxor/vm/os'
15
+ require_relative 'haxor/vm/registers'
15
16
  require_relative 'haxor/vm/cpu/core'
16
17
  require_relative 'haxor/vm/cpu/unit/base'
17
18
  require_relative 'haxor/vm/cpu/unit/logical'
data/lib/haxor/consts.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Haxor
2
2
  class Consts
3
3
  MAJOR = 0
4
- MINOR = 1
4
+ MINOR = 2
5
5
  PATCH = 0
6
6
  GEM_VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  VERSION = (MAJOR << 16) | (MINOR << 8) | PATCH
data/lib/haxor/vm/core.rb CHANGED
@@ -9,9 +9,11 @@ module Haxor
9
9
  register_subsystem :mem, Mem.new(Consts::RESERVED_MEM)
10
10
  register_subsystem :stack, Stack.new
11
11
  register_subsystem :os, Os.new
12
+ register_subsystem :registers, Registers.new
12
13
 
13
14
  subsystem(:cpu).labels.each do |_, label|
14
15
  subsystem(:mem).add_label label.label, label.absolute_addr
16
+ subsystem(:registers).add_register label.label, label.absolute_addr
15
17
  end
16
18
 
17
19
  @units = []
@@ -43,10 +45,10 @@ module Haxor
43
45
 
44
46
  exe = exe[@hdr.size..-1] # cut off header
45
47
  subsystem(:mem).replace_region Consts::RESERVED_MEM, exe
46
- subsystem(:mem).write 'ip', @hdr.entry_point # instruction pointer
48
+ subsystem(:registers).write 'ip', @hdr.entry_point # instruction pointer
47
49
  subsystem(:mem).enlarge @hdr.bss_size
48
50
  subsystem(:mem).enlarge @hdr.stack_size
49
- subsystem(:mem).write 'sp', subsystem(:mem).size
51
+ subsystem(:registers).write 'sp', subsystem(:mem).size
50
52
  end
51
53
  end
52
54
  end
@@ -38,16 +38,16 @@ module Haxor
38
38
  def op_div
39
39
  a = operand
40
40
  av = @vm.subsystem(:mem).read a
41
- arv = @vm.subsystem(:mem).read 'ar'
42
- @vm.subsystem(:mem).write 'ar', (arv / av)
43
- @vm.subsystem(:mem).write 'dr', (arv % av)
41
+ arv = @vm.subsystem(:registers).read 'ar'
42
+ @vm.subsystem(:registers).write 'ar', (arv / av)
43
+ @vm.subsystem(:registers).write 'dr', (arv % av)
44
44
  end
45
45
 
46
46
  def op_mul
47
47
  a = operand
48
48
  av = @vm.subsystem(:mem).read a
49
- arv = @vm.subsystem(:mem).read 'ar'
50
- @vm.subsystem(:mem).write 'ar', (arv * av)
49
+ arv = @vm.subsystem(:registers).read 'ar'
50
+ @vm.subsystem(:registers).write 'ar', (arv * av)
51
51
  end
52
52
 
53
53
  def op_inc
@@ -67,23 +67,9 @@ module Haxor
67
67
  av = @vm.subsystem(:mem).read a
68
68
  bv = @vm.subsystem(:mem).read b
69
69
  v = av - bv
70
- fr_set Consts::FR_ZERO, (v == 0)
71
- fr_set Consts::FR_SIGN, v < 0
72
- end
73
-
74
- def fr_set(b, enable)
75
- flags = fetch_cell 'fr'
76
- if enable
77
- flags |= b
78
- else
79
- flags &= ~b
80
- end
81
- replace_cell 'fr', flags
82
- end
83
70
 
84
- def fr_if(b)
85
- flags = fetch_cell 'fr'
86
- (flags & b) > 0
71
+ @vm.subsystem(:registers).flag Consts::FR_ZERO, v == 0
72
+ @vm.subsystem(:registers).flag Consts::FR_SIGN, v < 0
87
73
  end
88
74
  end
89
75
  end
@@ -37,11 +37,6 @@ module Haxor
37
37
  bind_opcode OP_IRET, :op_iret
38
38
  end
39
39
 
40
- def fr_if(b)
41
- flags = fetch_cell 'fr'
42
- (flags & b) > 0
43
- end
44
-
45
40
  def op_call
46
41
  a = operand
47
42
  @vm.subsystem(:stack).push 'ip'
@@ -55,52 +50,52 @@ module Haxor
55
50
 
56
51
  def op_je
57
52
  a = operand
58
- jmp a if fr_if Consts::FR_ZERO
53
+ jmp a if @vm.subsystem(:registers).check_flag Consts::FR_ZERO
59
54
  end
60
55
 
61
56
  def op_jg
62
57
  a = operand
63
- jmp a if !fr_if(Consts::FR_ZERO) && !fr_if(Consts::FR_SIGN)
58
+ jmp a if !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
64
59
  end
65
60
 
66
61
  def op_jge
67
62
  a = operand
68
- jmp a if !fr_if(Consts::FR_SIGN) || fr_if(Consts::FR_ZERO)
63
+ jmp a if !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
69
64
  end
70
65
 
71
66
  def op_jl
72
67
  a = operand
73
- jmp a if !fr_if(Consts::FR_ZERO) && fr_if(Consts::FR_SIGN)
68
+ jmp a if !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && @vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
74
69
  end
75
70
 
76
71
  def op_jle
77
72
  a = operand
78
- jmp a if fr_if(Consts::FR_SIGN) || fr_if(Consts::FR_ZERO)
73
+ jmp a if @vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
79
74
  end
80
75
 
81
76
  def op_jne
82
77
  a = operand
83
- jmp a unless fr_if Consts::FR_ZERO
78
+ jmp a unless @vm.subsystem(:registers).check_flag Consts::FR_ZERO
84
79
  end
85
80
 
86
81
  def op_jng
87
82
  a = operand
88
- jmp a unless !fr_if(Consts::FR_ZERO) && !fr_if(Consts::FR_SIGN)
83
+ jmp a unless !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
89
84
  end
90
85
 
91
86
  def op_jnge
92
87
  a = operand
93
- jmp a unless !fr_if(Consts::FR_SIGN) || fr_if(Consts::FR_ZERO)
88
+ jmp a unless !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
94
89
  end
95
90
 
96
91
  def op_jnl
97
92
  a = operand
98
- jmp a unless !fr_if(Consts::FR_ZERO) && fr_if(Consts::FR_SIGN)
93
+ jmp a unless !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && @vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
99
94
  end
100
95
 
101
96
  def op_jnle
102
97
  a = operand
103
- jmp a unless fr_if(Consts::FR_SIGN) || fr_if(Consts::FR_ZERO)
98
+ jmp a unless @vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
104
99
  end
105
100
 
106
101
  def op_ret
@@ -114,7 +109,7 @@ module Haxor
114
109
  private
115
110
 
116
111
  def jmp(addr)
117
- @vm.subsystem(:mem).write 'ip', addr
112
+ @vm.subsystem(:registers).write 'ip', addr
118
113
  end
119
114
  end
120
115
  end
@@ -0,0 +1,42 @@
1
+ module Haxor
2
+ module Vm
3
+ class Registers < Subsystem
4
+ def initialize
5
+ @registers = {}
6
+ end
7
+
8
+ def flag(flag, enabled)
9
+ flags = read 'fr'
10
+ if enabled
11
+ flags |= flag
12
+ else
13
+ flags &= ~flag
14
+ end
15
+ write 'fr', flags
16
+ end
17
+
18
+ def check_flag(flag)
19
+ flags = read 'fr'
20
+ (flags & flag) > 0
21
+ end
22
+
23
+ def read(register)
24
+ addr = resolve register
25
+ @vm.subsystem(:mem).read addr
26
+ end
27
+
28
+ def write(register, value)
29
+ addr = resolve register
30
+ @vm.subsystem(:mem).write addr, value
31
+ end
32
+
33
+ def resolve(register)
34
+ @registers[register]
35
+ end
36
+
37
+ def add_register(register, addr)
38
+ @registers[register] = addr
39
+ end
40
+ end
41
+ end
42
+ end
@@ -7,9 +7,9 @@ module Haxor
7
7
  end
8
8
 
9
9
  def push_value(value)
10
- sp = @vm.subsystem(:mem).read 'sp'
10
+ sp = @vm.subsystem(:registers).read 'sp'
11
11
  sp -= Consts::WORD_SIZE
12
- @vm.subsystem(:mem).write 'sp', sp
12
+ @vm.subsystem(:registers).write 'sp', 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(:mem).read 'sp'
22
+ sp = @vm.subsystem(:registers).read 'sp'
23
23
  value = @vm.subsystem(:mem).read sp
24
24
  sp += Consts::WORD_SIZE
25
- @vm.subsystem(:mem).write 'sp', sp
25
+ @vm.subsystem(:registers).write 'sp', sp
26
26
 
27
27
  value
28
28
  end
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.1.0
4
+ version: 0.2.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: 2015-12-29 00:00:00.000000000 Z
11
+ date: 2015-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -91,6 +91,7 @@ files:
91
91
  - lib/haxor/vm/cpu/unit/various.rb
92
92
  - lib/haxor/vm/mem.rb
93
93
  - lib/haxor/vm/os.rb
94
+ - lib/haxor/vm/registers.rb
94
95
  - lib/haxor/vm/stack.rb
95
96
  - lib/haxor/vm/subsystem.rb
96
97
  - media/memory.png