haxor 0.1.0 → 0.2.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.
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