scasm 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ *.bin
@@ -0,0 +1 @@
1
+ data 1, 16, 64, 65535
@@ -0,0 +1,3 @@
1
+ label "loop"
2
+ add A, 1
3
+ set pc, "loop"
@@ -0,0 +1,6 @@
1
+ def jmpx label
2
+ set pc, label
3
+ end
4
+
5
+ label "foo"
6
+ jmpx "foo"
@@ -0,0 +1,7 @@
1
+
2
+ foo = A
3
+ bar = B
4
+ offset = 42
5
+ label "loop"
6
+ add [foo, offset], bar
7
+ set pc, "loop"
@@ -5,7 +5,7 @@ require 'scasm/value'
5
5
 
6
6
  module SCASM
7
7
 
8
- class Assembler < BasicObject
8
+ class Assembler < Object
9
9
  def initialize
10
10
  @stmts = []
11
11
  @relocations = []
@@ -17,11 +17,13 @@ class Assembler < BasicObject
17
17
 
18
18
  def assemble
19
19
  resolve_labels
20
- io = ::StringIO.new
20
+ io = StringIO.new
21
21
  @stmts.each { |stmt| stmt.assemble io }
22
22
  io.string
23
23
  end
24
24
 
25
+ ## Statements
26
+
25
27
  def inst opsym, a, b
26
28
  a = parse_value a
27
29
  b = parse_value b
@@ -29,22 +31,25 @@ class Assembler < BasicObject
29
31
  end
30
32
 
31
33
  def label name
32
- ::Kernel.raise "label names must be strings" unless name.is_a? ::String
34
+ raise "label names must be strings" unless name.is_a? String
33
35
  @stmts << Label.new(name)
34
36
  end
35
37
 
36
- def reg regsym
37
- Register.new regsym
38
+ def data *words
39
+ @stmts << Data.new(words)
38
40
  end
39
41
 
40
- def regmem regsym
41
- RegisterMemory.new regsym
42
+ # Add a method for each instruction
43
+ BASIC_OPCODES.each do |opsym,opcode|
44
+ define_method(opsym) { |a,b| inst opsym, a, b }
42
45
  end
43
46
 
44
- def iregmem regsym, imm
45
- OffsetRegisterMemory.new regsym, imm
47
+ EXTENDED_OPCODES.each do |opsym,opcode|
48
+ define_method(opsym) { |a| inst opsym, a, nil }
46
49
  end
47
50
 
51
+ ## Values
52
+
48
53
  def pop
49
54
  Pop.new
50
55
  end
@@ -69,32 +74,6 @@ class Assembler < BasicObject
69
74
  O.new
70
75
  end
71
76
 
72
- def imem imm
73
- ImmediateMemory.new imm
74
- end
75
-
76
- def imm imm
77
- Immediate.new imm
78
- end
79
-
80
- def l name
81
- ::Kernel.raise "label names must be strings" unless name.is_a? ::String
82
- ImmediateLabel.new(name).tap { |x| @relocations << x }
83
- end
84
-
85
- def data *words
86
- @stmts << Data.new(words)
87
- end
88
-
89
- # Add a method for each instruction
90
- BASIC_OPCODES.each do |opsym,opcode|
91
- define_method(opsym) { |a,b| inst opsym, a, b }
92
- end
93
-
94
- EXTENDED_OPCODES.each do |opsym,opcode|
95
- define_method(opsym) { |a| inst opsym, a, nil }
96
- end
97
-
98
77
  # Add a constant for each register
99
78
  REGISTERS.each do |regsym,regnum|
100
79
  const_set regsym, regsym
@@ -124,41 +103,41 @@ private
124
103
  end
125
104
 
126
105
  @relocations.each do |x|
127
- addr = label_addrs[x.name] or ::Kernel.raise "undefined label #{x.name.inspect}"
106
+ addr = label_addrs[x.name] or raise "undefined label #{x.name.inspect}"
128
107
  x.resolve addr
129
108
  end
130
109
  end
131
110
 
132
- # Shorter notation for values
111
+ # Create explicit Values from the shorthand syntax
133
112
  def parse_value x
134
113
  case x
135
- when Value, ::NilClass
114
+ when Value, NilClass
136
115
  x
137
- when ::Array
116
+ when Array
138
117
  x1, x2, = x
139
- if x1.is_a? ::Symbol and x2 == nil
118
+ if x1.is_a? Symbol and x2 == nil
140
119
  # [reg]
141
- regmem x1
142
- elsif x1.is_a? ::Symbol and x2.is_a? ::Integer
120
+ RegisterMemory.new x1
121
+ elsif x1.is_a? Symbol and x2.is_a? Integer
143
122
  # [reg, imm]
144
- iregmem x1, x2
145
- elsif x1.is_a? ::Integer
123
+ OffsetRegisterMemory.new x1, x2
124
+ elsif x1.is_a? Integer
146
125
  # [imm]
147
- imem x1
126
+ ImmediateMemory.new x1
148
127
  else
149
- ::Kernel.fail "invalid memory access syntax"
128
+ fail "invalid memory access syntax"
150
129
  end
151
- when ::Symbol
130
+ when Symbol
152
131
  # register
153
- reg x
154
- when ::String
132
+ Register.new x
133
+ when String
155
134
  # label
156
- l x
157
- when ::Integer
135
+ ImmediateLabel.new(x).tap { |v| @relocations << v }
136
+ when Integer
158
137
  # immediate
159
- imm x
138
+ Immediate.new x
160
139
  else
161
- ::Kernel.raise "unexpected value class #{x.class}"
140
+ raise "unexpected value class #{x.class}"
162
141
  end
163
142
  end
164
143
  end
data/lib/scasm/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Scasm
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -34,13 +34,6 @@ class AssemblerTest < Test::Unit::TestCase
34
34
  0x1c61,
35
35
  ]
36
36
 
37
- check <<-EOS
38
- set reg(A), reg(B)
39
- set reg(C), reg(X)
40
- set reg(Y), reg(Z)
41
- set reg(I), reg(J)
42
- EOS
43
-
44
37
  check <<-EOS
45
38
  set A, B
46
39
  set C, X
@@ -51,13 +44,11 @@ class AssemblerTest < Test::Unit::TestCase
51
44
 
52
45
  def test_regmem
53
46
  expect [0x0cb1]
54
- check "set regmem(X), reg(X)"
55
47
  check "set [X], X"
56
48
  end
57
49
 
58
50
  def test_iregmem
59
51
  expect [0x0d31, 0x002a]
60
- check 'set iregmem(X, 42), reg(X)'
61
52
  check 'set [X,42], X'
62
53
  end
63
54
 
@@ -83,21 +74,17 @@ class AssemblerTest < Test::Unit::TestCase
83
74
 
84
75
  def test_imem
85
76
  expect [0x7801, 0x1000]
86
- check 'set reg(A), imem(0x1000)'
87
77
  check 'set A, [0x1000]'
88
78
  end
89
79
 
90
80
  def test_imm
91
81
  expect [0xfc01]
92
- check "set reg(A), imm(31)"
93
82
  check "set A, 31"
94
83
 
95
84
  expect [0x7c01, 0x0020]
96
- check "set reg(A), imm(32)"
97
85
  check "set A, 32"
98
86
 
99
87
  expect [0x7df1, 0xffff, 0x0020]
100
- check "set imm(65535), imm(32)"
101
88
  check "set 65535, 32"
102
89
  end
103
90
 
@@ -108,13 +95,6 @@ class AssemblerTest < Test::Unit::TestCase
108
95
  0x7dc1, 0x0001,
109
96
  ]
110
97
 
111
- check <<-EOS
112
- set reg(A), imm(13)
113
- label 'loop'
114
- add reg(A), imm(1)
115
- set pc, l('loop')
116
- EOS
117
-
118
98
  check <<-EOS
119
99
  set A, 13
120
100
  label 'loop'
metadata CHANGED
@@ -1,36 +1,47 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: scasm
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 25
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 1
10
+ version: 0.1.1
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Rich Lane
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2012-04-05 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2012-04-05 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: trollop
16
- requirement: &8467060 !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
17
24
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
22
32
  type: :runtime
23
- prerelease: false
24
- version_requirements: *8467060
25
- description: ''
26
- email:
33
+ version_requirements: *id001
34
+ description: ""
35
+ email:
27
36
  - rlane@club.cc.cmu.edu
28
- executables:
37
+ executables:
29
38
  - scasm
30
39
  - scasm-disassemble
31
40
  extensions: []
41
+
32
42
  extra_rdoc_files: []
33
- files:
43
+
44
+ files:
34
45
  - .gitignore
35
46
  - Gemfile
36
47
  - LICENSE
@@ -38,6 +49,10 @@ files:
38
49
  - Rakefile
39
50
  - bin/scasm
40
51
  - bin/scasm-disassemble
52
+ - examples/data.scasm
53
+ - examples/loop.scasm
54
+ - examples/macro.scasm
55
+ - examples/readme1.scasm
41
56
  - examples/spec.scasm
42
57
  - lib/scasm/assembler.rb
43
58
  - lib/scasm/isa.rb
@@ -49,28 +64,37 @@ files:
49
64
  - test/test_assembler.rb
50
65
  homepage: https://github.com/rlane/scasm
51
66
  licenses: []
67
+
52
68
  post_install_message:
53
69
  rdoc_options: []
54
- require_paths:
70
+
71
+ require_paths:
55
72
  - lib
56
- required_ruby_version: !ruby/object:Gem::Requirement
73
+ required_ruby_version: !ruby/object:Gem::Requirement
57
74
  none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ hash: 3
79
+ segments:
80
+ - 0
81
+ version: "0"
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
83
  none: false
64
- requirements:
65
- - - ! '>='
66
- - !ruby/object:Gem::Version
67
- version: '0'
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
68
91
  requirements: []
92
+
69
93
  rubyforge_project:
70
94
  rubygems_version: 1.8.17
71
95
  signing_key:
72
96
  specification_version: 3
73
97
  summary: A Ruby DSL for DCPU-16 assembly code
74
- test_files:
98
+ test_files:
75
99
  - test/foo.scasm
76
100
  - test/test_assembler.rb