scasm 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -18,10 +18,14 @@ Installation
18
18
  Example
19
19
  -------
20
20
 
21
- foo = A
22
- bar = B
23
- offset = 42
24
- add [foo, offset], bar
21
+ ````ruby
22
+ foo = A
23
+ bar = B
24
+ offset = 42
25
+ label "loop"
26
+ add [foo, offset], bar
27
+ set pc, "loop"
28
+ ````
25
29
 
26
30
  See the examples directory for more sample code.
27
31
 
@@ -32,6 +36,32 @@ SCASM input is Ruby code, but you won't need a deep understanding of Ruby to
32
36
  get started. Simple statements like `add A, 1` work just like you expect. This
33
37
  section will cover the SCASM-specific syntax.
34
38
 
39
+ ### Instructions
40
+
41
+ To emit an instruction just write its lower-case name followed by the values:
42
+
43
+ ````ruby
44
+ add A, 1
45
+ jsr X
46
+ ````
47
+
48
+ The one exception is the `and` instruction, which must be written as `and_`
49
+ because `and` is a reserved word in Ruby.
50
+
51
+ ### Pseudoinstructions
52
+
53
+ * `jmp label` - Equivalent to `set pc, label`.
54
+ * `ret` - Equivalent to `set pc, pop`.
55
+
56
+ To make your own pseudoinstructions/macros just define a Ruby method. For
57
+ example, here's how `jmp` is implemented:
58
+
59
+ ````ruby
60
+ def jmp label
61
+ set pc, label
62
+ end
63
+ ````
64
+
35
65
  ### Registers
36
66
 
37
67
  Ruby variables named `A`, `B`, `C`, `X`, `Y`, `Z`, `I`, and `J` are provided to refer to the
@@ -52,6 +82,25 @@ Examples:
52
82
 
53
83
  Literal values are just given as integers. Example: `42` or `0x200`.
54
84
 
85
+ ### Labels
86
+
87
+ Labels are defined by the `label` statement. To refer to a label, just use its name. For example:
88
+
89
+ ````ruby
90
+ label "loop"
91
+ add A, 1
92
+ set pc, "loop"
93
+ ````
94
+
95
+ ### Data
96
+
97
+ Use the `data` statement to put arbitrary words into the binary.
98
+
99
+ ````ruby
100
+ label "sin_lookup_table"
101
+ data 0, 0x38f6, 0x6f12, 0x9f9c, 0xc825, 0xe6a4, 0xf993, 0xffff
102
+ ````
103
+
55
104
  ### Miscellaneous
56
105
 
57
106
  These values have the same meaning as in the spec:
@@ -82,6 +82,10 @@ class Assembler < BasicObject
82
82
  ImmediateLabel.new(name).tap { |x| @relocations << x }
83
83
  end
84
84
 
85
+ def data *words
86
+ @stmts << Data.new(words)
87
+ end
88
+
85
89
  # Add a method for each instruction
86
90
  BASIC_OPCODES.each do |opsym,opcode|
87
91
  define_method(opsym) { |a,b| inst opsym, a, b }
@@ -96,6 +100,16 @@ class Assembler < BasicObject
96
100
  const_set regsym, regsym
97
101
  end
98
102
 
103
+ ## Pseudoinstructions
104
+
105
+ def jmp label
106
+ set pc, label
107
+ end
108
+
109
+ def ret
110
+ set pc, pop
111
+ end
112
+
99
113
  private
100
114
 
101
115
  def resolve_labels
@@ -53,6 +53,17 @@ class Instruction < Statement
53
53
  end
54
54
 
55
55
  class Data < Statement
56
+ def initialize words
57
+ @words = words
58
+ end
59
+
60
+ def assemble io
61
+ io.write @words.pack('v*')
62
+ end
63
+
64
+ def to_s
65
+ "data #{@words * ', '}"
66
+ end
56
67
  end
57
68
 
58
69
  class Label < Statement
data/lib/scasm/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Scasm
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -130,4 +130,30 @@ class AssemblerTest < Test::Unit::TestCase
130
130
  expect [0x7c10, 0x0020]
131
131
  check 'jsr 32'
132
132
  end
133
+
134
+ def test_data
135
+ expect [1, 2, 3, 4, 65535]
136
+ check 'data 1, 2, 3, 4, 65535'
137
+ end
138
+
139
+ def test_jmp
140
+ expect [
141
+ 0x7dc1, 0x0000,
142
+ ]
143
+
144
+ check <<-EOS
145
+ label 'loop'
146
+ jmp 'loop'
147
+ EOS
148
+ end
149
+
150
+ def test_ret
151
+ expect [
152
+ 0x61c1
153
+ ]
154
+
155
+ check <<-EOS
156
+ ret
157
+ EOS
158
+ end
133
159
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scasm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-04-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: trollop
16
- requirement: &15992680 !ruby/object:Gem::Requirement
16
+ requirement: &8467060 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *15992680
24
+ version_requirements: *8467060
25
25
  description: ''
26
26
  email:
27
27
  - rlane@club.cc.cmu.edu