rasl 0.0.1
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 +7 -0
- data/.travis.yml +4 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.org +221 -0
- data/Rakefile +6 -0
- data/bin/rasl +3 -0
- data/examples/fnumb.casl +22 -0
- data/examples/fnumb.map +20 -0
- data/examples/hanoi.casl +48 -0
- data/examples/hanoi.map +61 -0
- data/examples/hanoi.rb +124 -0
- data/examples/hello.casl +6 -0
- data/examples/hello.map +14 -0
- data/examples/hello.rb +41 -0
- data/examples/in_out.casl +17 -0
- data/examples/in_out.map +62 -0
- data/examples/run_all.sh +2 -0
- data/examples/sum.casl +7 -0
- data/examples/sum.map +7 -0
- data/examples/sum.rb +27 -0
- data/examples/swap.casl +8 -0
- data/examples/swap.map +6 -0
- data/examples/utf8.casl +2 -0
- data/examples/utf8.map +4 -0
- data/lib/rasl.rb +1657 -0
- data/lib/rasl/version.rb +3 -0
- data/rasl.gemspec +29 -0
- data/spec/rasl_spec.rb +700 -0
- data/spec/spec_helper.rb +11 -0
- metadata +163 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f28e254a458b927537a28066daaad2e236470c38
|
4
|
+
data.tar.gz: d0855f2fca98b41b4b407081be6fb8c7423c399f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9102a4f9be9a05aba9234c95f4320d46c8db1ed4d8807d325f696c5828694195d8b004541961f591e9228160f47c896853865a37c915c980cdca5fea64c6770a
|
7
|
+
data.tar.gz: 06171b2e84528f26ca78d054a5f2e420216532d05a01f256f67efff7136a02e25e3e13ec4c1247a4ffb5a14eaab27b6b3d101406e248093ad7e6b8554c66fa71
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 akicho8
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.org
ADDED
@@ -0,0 +1,221 @@
|
|
1
|
+
* CASL Assembler / Simulator
|
2
|
+
|
3
|
+
- [[http://tk2-221-20341.vs.sakura.ne.jp/casl-simulator][DEMO]] http://tk2-221-20341.vs.sakura.ne.jp/casl-simulator
|
4
|
+
|
5
|
+
- [[https://travis-ci.org/akicho8/rasl][Travis]] [[https://travis-ci.org/akicho8/rasl.png]]
|
6
|
+
- [[https://gemnasium.com/akicho8/rasl/][Gemnasium]] [[https://gemnasium.com/akicho8/rasl.png]]
|
7
|
+
- [[https://codeclimate.com/github/akicho8/rasl][Code Climate]] [[https://codeclimate.com/github/akicho8/rasl.png]]
|
8
|
+
|
9
|
+
#+BEGIN_SRC ruby
|
10
|
+
require "rasl"
|
11
|
+
|
12
|
+
app = Rasl::Processor.new
|
13
|
+
app.assemble <<-SOURCE
|
14
|
+
MAIN START
|
15
|
+
LD GR0,=1
|
16
|
+
LD GR1,=2
|
17
|
+
ADDA GR0,GR1
|
18
|
+
ST GR0,RESULT
|
19
|
+
RET
|
20
|
+
RESULT DS 1
|
21
|
+
END
|
22
|
+
SOURCE
|
23
|
+
app.go
|
24
|
+
app.gr[:gr0].value # => 3
|
25
|
+
app.labels["MAIN"] # => {"RESULT"=>8}
|
26
|
+
app.memory[app.labels["MAIN"]["RESULT"]] # => 3
|
27
|
+
puts app.disassemble
|
28
|
+
# >> 0000 1000 0009 LD GR0, #0009
|
29
|
+
# >> 0002 1010 000A LD GR1, #000A
|
30
|
+
# >> 0004 2401 ADDA GR0, GR1
|
31
|
+
# >> 0005 1100 0008 ST GR0, #0008
|
32
|
+
# >> 0007 8100 RET
|
33
|
+
# >> 0008 0003 DC 3
|
34
|
+
# >> 0009 0001 DC 1
|
35
|
+
# >> 000A 0002 DC 2
|
36
|
+
#+END_SRC
|
37
|
+
|
38
|
+
** 仕様
|
39
|
+
|
40
|
+
- プロシージャ
|
41
|
+
- START〜END は複数定義可
|
42
|
+
- START に前置するラベルは必須ではない
|
43
|
+
- START と END は省略可
|
44
|
+
- 最初に登場した START の引数をブートアドレスにする
|
45
|
+
- ラベル
|
46
|
+
- STARTに前置したラベルはグローバルラベル
|
47
|
+
- STARTのあとからENDまではローカルラベル
|
48
|
+
- ラベルの文字数制限なし
|
49
|
+
- ラベルの最後にコロンをつけてもよい (ラベルに含まない)
|
50
|
+
- ラベルの最後にコロンをつけると必ずラベルになる (NOP: と書いたら NOP は命令ではなくラベルとみなす)
|
51
|
+
- ラベルの先頭に $ や @ をつけてもよい (ラベルに含む)
|
52
|
+
- $ で始まるラベルは必ずグローバルラベルになる
|
53
|
+
- ラベルだけの行を書いてもよい
|
54
|
+
- ラベルは大小文字を区別する
|
55
|
+
- START〜ENDを書かなかった場合のラベルはすべてグローバルラベル
|
56
|
+
- 構文
|
57
|
+
- スペースを空けずに命令を書いてもよい (Rasl.config.bol_order = false で無効になる)
|
58
|
+
- 引数のセパレーターはスペースでもいい
|
59
|
+
- インライン即値の部分は "= 1" のようにスペースを空けてもよい
|
60
|
+
- 文字列はダブルクォーテーションで囲んでもいい
|
61
|
+
- 行頭からだけ # でコメントにできる。shebang 用
|
62
|
+
- その他
|
63
|
+
- CASL1 と CASL2 に対応
|
64
|
+
- インライン即値はENDの直前に定義する。END がなければコードの最後に定義する
|
65
|
+
- EXIT で終了してもよい
|
66
|
+
- GRn を n とは書けない (CASL2ではアドレスとレジスタの区別がつかないため)
|
67
|
+
- NOP は #00 にはしてない (データなのか命令なのかまぎらわしいので)
|
68
|
+
- GRn の他に FR PC SP レジスタを指定できる (例: addl SP, 1 など)
|
69
|
+
- Rasl.config.spec = 1 にすると GR4 が SP になる
|
70
|
+
- 注意
|
71
|
+
- 文字コードは UTF-8 なので DC 'あ' は DS 3 の領域を使う
|
72
|
+
- 文字列リテラルの中だろうとセミコロン以降をぶっちぎる。
|
73
|
+
'a;b' の場合 'a となるため \ でエスケープして 'a\;b' と書く
|
74
|
+
|
75
|
+
** コマンドラインで使う例
|
76
|
+
|
77
|
+
*** --help
|
78
|
+
|
79
|
+
: $ rasl --help
|
80
|
+
: CASL Assembler / Simulator rasl 0.0.1
|
81
|
+
: 使い方: rasl [OPTIONS] [ファイル]
|
82
|
+
: -s, --simulator シミュレータ起動
|
83
|
+
: -p, --print-map MAP情報の標準出力
|
84
|
+
: -m, --output-map MAP情報のファイル出力。-g オプションがあるときは実行後に出力する
|
85
|
+
: -g, --go 実行
|
86
|
+
: -e, --eval=CODE 指定コードの評価。指定があると標準入力からは読み込まない
|
87
|
+
: --memory-size=SIZE メモリサイズの指定(デフォルト:65536)
|
88
|
+
: --spec=NUMBER 1:レジスタ数5個でGR4==SP 2:レジスタ数8 GR4!=SP
|
89
|
+
: --ds-init-value=VAL DSで領域確保したときの初期値(デフォルト:0)
|
90
|
+
: --memory-defval=VAL メモリの初期値(デフォルト:0)
|
91
|
+
: --[no-]bol-order 命令の前に空白を書かなくてよいことにする(デフォルト:true)
|
92
|
+
: -i, --register 実行後レジスタ一覧表示
|
93
|
+
|
94
|
+
*** MAP情報の標準出力 (-p)
|
95
|
+
|
96
|
+
: $ rasl -p hello.csl
|
97
|
+
: 0000 7001 0000 PUSH #0000, GR1
|
98
|
+
: 0002 7002 0000 PUSH #0000, GR2
|
99
|
+
: 0004 1210 000D LAD GR1, #000D
|
100
|
+
: 0006 1220 0018 LAD GR2, #0018
|
101
|
+
: 0008 F000 0001 SVC #0001
|
102
|
+
: 000A 7120 POP GR2
|
103
|
+
: 000B 7110 POP GR1
|
104
|
+
: 000C 8100 RET
|
105
|
+
: 000D 0048 DC 72 ; 'H'
|
106
|
+
: 000E 0065 DC 101 ; 'e'
|
107
|
+
: 000F 006C DC 108 ; 'l'
|
108
|
+
: 0010 006C DC 108 ; 'l'
|
109
|
+
: 0011 006F DC 111 ; 'o'
|
110
|
+
: 0012 000B DC 5
|
111
|
+
|
112
|
+
*** MAP情報のファイル出力 (-m)
|
113
|
+
|
114
|
+
: $ rasl -m hello.csl
|
115
|
+
: $ cat hello.map
|
116
|
+
: 0000 7001 0000 PUSH #0000, GR1
|
117
|
+
: 0002 7002 0000 PUSH #0000, GR2
|
118
|
+
: 0004 1210 000D LAD GR1, #000D
|
119
|
+
: 0006 1220 0018 LAD GR2, #0018
|
120
|
+
: 0008 F000 0001 SVC #0001
|
121
|
+
: 000A 7120 POP GR2
|
122
|
+
: 000B 7110 POP GR1
|
123
|
+
: 000C 8100 RET
|
124
|
+
: 000D 0048 DC 72 ; 'H'
|
125
|
+
: 000E 0065 DC 101 ; 'e'
|
126
|
+
: 000F 006C DC 108 ; 'l'
|
127
|
+
: 0010 006C DC 108 ; 'l'
|
128
|
+
: 0011 006F DC 111 ; 'o'
|
129
|
+
: 0012 000B DC 5
|
130
|
+
|
131
|
+
*** 指定コードの評価 (-e)
|
132
|
+
|
133
|
+
: $ rasl -p -e 'LEA GR1,1,GR1'
|
134
|
+
: 0000 1F11 0001 LEA GR1, #0001, GR1
|
135
|
+
|
136
|
+
標準入力から渡してもよい
|
137
|
+
|
138
|
+
: $ echo 'LEA GR1,1,GR1' | rasl -p
|
139
|
+
: 0000 1F11 0001 LEA GR1, #0001, GR1
|
140
|
+
|
141
|
+
*** 実行 (-g)
|
142
|
+
|
143
|
+
: $ rasl -g hello.csl
|
144
|
+
: Hello
|
145
|
+
|
146
|
+
*** Simulator (-s)
|
147
|
+
|
148
|
+
: $ rasl -s hello.csl
|
149
|
+
: -?
|
150
|
+
: D[address] memory-dump
|
151
|
+
: U[address] unassemble
|
152
|
+
: G[address] go
|
153
|
+
: T[address] trace
|
154
|
+
: R[reg=n] register
|
155
|
+
: ? or H usage
|
156
|
+
: I init
|
157
|
+
: Q quit
|
158
|
+
: -r
|
159
|
+
: GR0=0000 GR1=0000 GR2=0000 GR3=0000 GR4=0000 GR5=0000 GR6=0000 GR7=0000 PC=0000 SP=FFFF FR=___(+)
|
160
|
+
: 0000 7001 0000 PUSH #0000, GR1
|
161
|
+
: -t
|
162
|
+
: GR0=0000 GR1=0000 GR2=0000 GR3=0000 GR4=0000 GR5=0000 GR6=0000 GR7=0000 PC=0002 SP=FFFE FR=___(+)
|
163
|
+
: 0002 7002 0000 PUSH #0000, GR2
|
164
|
+
: -t
|
165
|
+
: GR0=0000 GR1=0000 GR2=0000 GR3=0000 GR4=0000 GR5=0000 GR6=0000 GR7=0000 PC=0004 SP=FFFD FR=___(+)
|
166
|
+
: 0004 1210 000D LAD GR1, #000D
|
167
|
+
: -u
|
168
|
+
: 0000 7001 0000 PUSH #0000, GR1
|
169
|
+
: 0002 7002 0000 PUSH #0000, GR2
|
170
|
+
: 0004 1210 000D LAD GR1, #000D
|
171
|
+
: 0006 1220 0012 LAD GR2, #0012
|
172
|
+
: 0008 F000 0001 SVC #0001
|
173
|
+
: 000A 7120 POP GR2
|
174
|
+
: 000B 7110 POP GR1
|
175
|
+
: 000C 8100 RET
|
176
|
+
: -g
|
177
|
+
: Hello
|
178
|
+
: -d0
|
179
|
+
: 0000: 7001 0000 7002 0000 1210 000D 1220 0012 ........
|
180
|
+
: 0008: F000 0001 7120 7110 8100 0048 0065 006C .....Hel
|
181
|
+
: 0010: 006C 006F 0005 0000 0000 0000 0000 0000 lo......
|
182
|
+
: 0018: 0000 0000 0000 0000 0000 0000 0000 0000 ........
|
183
|
+
: -q
|
184
|
+
|
185
|
+
** IN 命令時の __END__
|
186
|
+
|
187
|
+
デフォルトでは標準入力待ちになるが __END__ の指定があればその次の行からを入力データとして扱う
|
188
|
+
|
189
|
+
: $ cat in_out.csl
|
190
|
+
: START
|
191
|
+
: IN STR,LEN ; STR="a" LEN=1
|
192
|
+
: OUT STR,LEN ; => "a"
|
193
|
+
: IN STR,LEN ; STR="" LEN=0
|
194
|
+
: OUT STR,LEN ; => ""
|
195
|
+
: IN STR,LEN ; STR="b" LEN=1
|
196
|
+
: OUT STR,LEN ; => "b"
|
197
|
+
: IN STR,LEN ; STR="" LEN=-1
|
198
|
+
: OUT STR,LEN ; => なし
|
199
|
+
: RET
|
200
|
+
: STR DS 4
|
201
|
+
: LEN DS 1
|
202
|
+
: END
|
203
|
+
: __END__
|
204
|
+
: a
|
205
|
+
:
|
206
|
+
: b
|
207
|
+
|
208
|
+
: $ rasl -g in_out.csl
|
209
|
+
: a
|
210
|
+
:
|
211
|
+
: b
|
212
|
+
|
213
|
+
** とりあえずのEmacs設定
|
214
|
+
|
215
|
+
: (add-to-list 'auto-mode-alist '("\\.\\([rc]asl?\\|csl\\)$" . asm-mode))
|
216
|
+
|
217
|
+
** 参考
|
218
|
+
|
219
|
+
- CASL2 仕様 http://www.jitec.ipa.go.jp/1_13download/shiken_yougo_ver2_2.pdf
|
220
|
+
- CASL1 仕様 http://www.image.med.osaka-u.ac.jp/member/nakamoto/enshuD2007/casl.pdf
|
221
|
+
- CASL - Wikipedia http://ja.wikipedia.org/wiki/CASL
|
data/Rakefile
ADDED
data/bin/rasl
ADDED
data/examples/fnumb.casl
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
start
|
2
|
+
lea gr1, 3
|
3
|
+
call fnumb
|
4
|
+
ret
|
5
|
+
fnumb cpa gr1, const3
|
6
|
+
jpz next
|
7
|
+
lea gr2, -1, gr1
|
8
|
+
ret
|
9
|
+
next push 0, gr1
|
10
|
+
lea gr1, -1, gr1
|
11
|
+
call fnumb
|
12
|
+
push 0, gr2
|
13
|
+
lea gr1, -1, gr1
|
14
|
+
call fnumb
|
15
|
+
st gr2, wrk
|
16
|
+
pop gr2
|
17
|
+
add gr2, wrk
|
18
|
+
pop gr1
|
19
|
+
ret
|
20
|
+
const3 dc 3
|
21
|
+
wrk ds 1
|
22
|
+
end
|
data/examples/fnumb.map
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
0000 1F10 0003 LEA GR1, #0003
|
2
|
+
0002 8000 0005 CALL #0005
|
3
|
+
0004 8100 RET
|
4
|
+
0005 4010 001F CPA GR1, #001F
|
5
|
+
0007 6000 000C JPZ #000C
|
6
|
+
0009 1F21 FFFF LEA GR2, #FFFF, GR1
|
7
|
+
000B 8100 RET
|
8
|
+
000C 7001 0000 PUSH #0000, GR1
|
9
|
+
000E 1F11 FFFF LEA GR1, #FFFF, GR1
|
10
|
+
0010 8000 0005 CALL #0005
|
11
|
+
0012 7002 0000 PUSH #0000, GR2
|
12
|
+
0014 1F11 FFFF LEA GR1, #FFFF, GR1
|
13
|
+
0016 8000 0005 CALL #0005
|
14
|
+
0018 1120 0020 ST GR2, #0020
|
15
|
+
001A 7120 POP GR2
|
16
|
+
001B 2020 0020 ADDA GR2, #0020
|
17
|
+
001D 7110 POP GR1
|
18
|
+
001E 8100 RET
|
19
|
+
001F 0003 DC 3
|
20
|
+
0020 0000 DC 0
|
data/examples/hanoi.casl
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
;; CASL - Wikipedia
|
2
|
+
;; http://ja.wikipedia.org/wiki/CASL
|
3
|
+
;; ハノイの塔を解くプログラム
|
4
|
+
MAIN START
|
5
|
+
LD GR0,N
|
6
|
+
LD GR1,A
|
7
|
+
LD GR2,B
|
8
|
+
LD GR3,C
|
9
|
+
CALL HANOI
|
10
|
+
RET
|
11
|
+
|
12
|
+
; hanoi(N, X, Y, Z)
|
13
|
+
HANOI CPA GR0,=1
|
14
|
+
JZE DISP
|
15
|
+
SUBA GR0,=1
|
16
|
+
PUSH 0,GR2
|
17
|
+
LD GR2,GR3
|
18
|
+
POP GR3
|
19
|
+
CALL HANOI
|
20
|
+
ST GR1,MSG1
|
21
|
+
ST GR2,MSG2
|
22
|
+
OUT MSG,LNG
|
23
|
+
PUSH 0,GR2
|
24
|
+
LD GR2,GR1
|
25
|
+
LD GR1,GR3
|
26
|
+
POP GR3
|
27
|
+
CALL HANOI
|
28
|
+
PUSH 0,GR2
|
29
|
+
LD GR2,GR1
|
30
|
+
POP GR1
|
31
|
+
ADDA GR0,=1
|
32
|
+
RET
|
33
|
+
|
34
|
+
DISP ST GR1,MSG1
|
35
|
+
ST GR3,MSG2
|
36
|
+
OUT MSG,LNG
|
37
|
+
RET
|
38
|
+
|
39
|
+
N DC 3
|
40
|
+
LNG DC 11
|
41
|
+
A DC 'A'
|
42
|
+
B DC 'B'
|
43
|
+
C DC 'C'
|
44
|
+
MSG DC 'from '
|
45
|
+
MSG1 DS 1
|
46
|
+
DC ' to '
|
47
|
+
MSG2 DS 1
|
48
|
+
END
|
data/examples/hanoi.map
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
0000 1000 0046 LD GR0, #0046
|
2
|
+
0002 1010 0048 LD GR1, #0048
|
3
|
+
0004 1020 0049 LD GR2, #0049
|
4
|
+
0006 1030 004A LD GR3, #004A
|
5
|
+
0008 8000 000B CALL #000B
|
6
|
+
000A 8100 RET
|
7
|
+
000B 4000 0056 CPA GR0, #0056
|
8
|
+
000D 6300 0035 JZE #0035
|
9
|
+
000F 2100 0057 SUBA GR0, #0057
|
10
|
+
0011 7002 0000 PUSH #0000, GR2
|
11
|
+
0013 1423 LD GR2, GR3
|
12
|
+
0014 7130 POP GR3
|
13
|
+
0015 8000 000B CALL #000B
|
14
|
+
0017 1110 0050 ST GR1, #0050
|
15
|
+
0019 1120 0055 ST GR2, #0055
|
16
|
+
001B 7001 0000 PUSH #0000, GR1
|
17
|
+
001D 7002 0000 PUSH #0000, GR2
|
18
|
+
001F 1210 004B LAD GR1, #004B
|
19
|
+
0021 1220 0047 LAD GR2, #0047
|
20
|
+
0023 F000 0001 SVC #0001
|
21
|
+
0025 7120 POP GR2
|
22
|
+
0026 7110 POP GR1
|
23
|
+
0027 7002 0000 PUSH #0000, GR2
|
24
|
+
0029 1421 LD GR2, GR1
|
25
|
+
002A 1413 LD GR1, GR3
|
26
|
+
002B 7130 POP GR3
|
27
|
+
002C 8000 000B CALL #000B
|
28
|
+
002E 7002 0000 PUSH #0000, GR2
|
29
|
+
0030 1421 LD GR2, GR1
|
30
|
+
0031 7110 POP GR1
|
31
|
+
0032 2000 0058 ADDA GR0, #0058
|
32
|
+
0034 8100 RET
|
33
|
+
0035 1110 0050 ST GR1, #0050
|
34
|
+
0037 1130 0055 ST GR3, #0055
|
35
|
+
0039 7001 0000 PUSH #0000, GR1
|
36
|
+
003B 7002 0000 PUSH #0000, GR2
|
37
|
+
003D 1210 004B LAD GR1, #004B
|
38
|
+
003F 1220 0047 LAD GR2, #0047
|
39
|
+
0041 F000 0001 SVC #0001
|
40
|
+
0043 7120 POP GR2
|
41
|
+
0044 7110 POP GR1
|
42
|
+
0045 8100 RET
|
43
|
+
0046 0003 DC 3
|
44
|
+
0047 000B DC 11
|
45
|
+
0048 0041 DC 65 ; 'A'
|
46
|
+
0049 0042 DC 66 ; 'B'
|
47
|
+
004A 0043 DC 67 ; 'C'
|
48
|
+
004B 0066 DC 102 ; 'f'
|
49
|
+
004C 0072 DC 114 ; 'r'
|
50
|
+
004D 006F DC 111 ; 'o'
|
51
|
+
004E 006D DC 109 ; 'm'
|
52
|
+
004F 0020 DC 32 ; ' '
|
53
|
+
0050 0000 DC 0
|
54
|
+
0051 0020 DC 32 ; ' '
|
55
|
+
0052 0074 DC 116 ; 't'
|
56
|
+
0053 006F DC 111 ; 'o'
|
57
|
+
0054 0020 DC 32 ; ' '
|
58
|
+
0055 0000 DC 0
|
59
|
+
0056 0001 DC 1
|
60
|
+
0057 0001 DC 1
|
61
|
+
0058 0001 DC 1
|
data/examples/hanoi.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "../lib/rasl"
|
3
|
+
|
4
|
+
app = Rasl::Processor.new
|
5
|
+
app.assemble <<-SOURCE
|
6
|
+
;; CASL - Wikipedia
|
7
|
+
;; http://ja.wikipedia.org/wiki/CASL
|
8
|
+
;; ハノイの塔を解くプログラム
|
9
|
+
MAIN START
|
10
|
+
LD GR0,N
|
11
|
+
LD GR1,A
|
12
|
+
LD GR2,B
|
13
|
+
LD GR3,C
|
14
|
+
CALL HANOI
|
15
|
+
RET
|
16
|
+
|
17
|
+
; hanoi(N, X, Y, Z)
|
18
|
+
HANOI CPA GR0,=1
|
19
|
+
JZE DISP
|
20
|
+
SUBA GR0,=1
|
21
|
+
PUSH 0,GR2
|
22
|
+
LD GR2,GR3
|
23
|
+
POP GR3
|
24
|
+
CALL HANOI
|
25
|
+
ST GR1,MSG1
|
26
|
+
ST GR2,MSG2
|
27
|
+
OUT MSG,LNG
|
28
|
+
PUSH 0,GR2
|
29
|
+
LD GR2,GR1
|
30
|
+
LD GR1,GR3
|
31
|
+
POP GR3
|
32
|
+
CALL HANOI
|
33
|
+
PUSH 0,GR2
|
34
|
+
LD GR2,GR1
|
35
|
+
POP GR1
|
36
|
+
ADDA GR0,=1
|
37
|
+
RET
|
38
|
+
|
39
|
+
DISP ST GR1,MSG1
|
40
|
+
ST GR3,MSG2
|
41
|
+
OUT MSG,LNG
|
42
|
+
RET
|
43
|
+
|
44
|
+
N DC 3
|
45
|
+
LNG DC 11
|
46
|
+
A DC 'A'
|
47
|
+
B DC 'B'
|
48
|
+
C DC 'C'
|
49
|
+
MSG DC 'from '
|
50
|
+
MSG1 DS 1
|
51
|
+
DC ' to '
|
52
|
+
MSG2 DS 1
|
53
|
+
END
|
54
|
+
SOURCE
|
55
|
+
puts app.disassemble
|
56
|
+
app.go
|
57
|
+
# >> 0000 1000 0046 LD GR0, #0046
|
58
|
+
# >> 0002 1010 0048 LD GR1, #0048
|
59
|
+
# >> 0004 1020 0049 LD GR2, #0049
|
60
|
+
# >> 0006 1030 004A LD GR3, #004A
|
61
|
+
# >> 0008 8000 000B CALL #000B
|
62
|
+
# >> 000A 8100 RET
|
63
|
+
# >> 000B 4000 0056 CPA GR0, #0056
|
64
|
+
# >> 000D 6300 0035 JZE #0035
|
65
|
+
# >> 000F 2100 0057 SUBA GR0, #0057
|
66
|
+
# >> 0011 7002 0000 PUSH #0000, GR2
|
67
|
+
# >> 0013 1423 LD GR2, GR3
|
68
|
+
# >> 0014 7130 POP GR3
|
69
|
+
# >> 0015 8000 000B CALL #000B
|
70
|
+
# >> 0017 1110 0050 ST GR1, #0050
|
71
|
+
# >> 0019 1120 0055 ST GR2, #0055
|
72
|
+
# >> 001B 7001 0000 PUSH #0000, GR1
|
73
|
+
# >> 001D 7002 0000 PUSH #0000, GR2
|
74
|
+
# >> 001F 1210 004B LAD GR1, #004B
|
75
|
+
# >> 0021 1220 0047 LAD GR2, #0047
|
76
|
+
# >> 0023 F000 0001 SVC #0001
|
77
|
+
# >> 0025 7120 POP GR2
|
78
|
+
# >> 0026 7110 POP GR1
|
79
|
+
# >> 0027 7002 0000 PUSH #0000, GR2
|
80
|
+
# >> 0029 1421 LD GR2, GR1
|
81
|
+
# >> 002A 1413 LD GR1, GR3
|
82
|
+
# >> 002B 7130 POP GR3
|
83
|
+
# >> 002C 8000 000B CALL #000B
|
84
|
+
# >> 002E 7002 0000 PUSH #0000, GR2
|
85
|
+
# >> 0030 1421 LD GR2, GR1
|
86
|
+
# >> 0031 7110 POP GR1
|
87
|
+
# >> 0032 2000 0058 ADDA GR0, #0058
|
88
|
+
# >> 0034 8100 RET
|
89
|
+
# >> 0035 1110 0050 ST GR1, #0050
|
90
|
+
# >> 0037 1130 0055 ST GR3, #0055
|
91
|
+
# >> 0039 7001 0000 PUSH #0000, GR1
|
92
|
+
# >> 003B 7002 0000 PUSH #0000, GR2
|
93
|
+
# >> 003D 1210 004B LAD GR1, #004B
|
94
|
+
# >> 003F 1220 0047 LAD GR2, #0047
|
95
|
+
# >> 0041 F000 0001 SVC #0001
|
96
|
+
# >> 0043 7120 POP GR2
|
97
|
+
# >> 0044 7110 POP GR1
|
98
|
+
# >> 0045 8100 RET
|
99
|
+
# >> 0046 0003 DC 3
|
100
|
+
# >> 0047 000B DC 11
|
101
|
+
# >> 0048 0041 DC 65 ; 'A'
|
102
|
+
# >> 0049 0042 DC 66 ; 'B'
|
103
|
+
# >> 004A 0043 DC 67 ; 'C'
|
104
|
+
# >> 004B 0066 DC 102 ; 'f'
|
105
|
+
# >> 004C 0072 DC 114 ; 'r'
|
106
|
+
# >> 004D 006F DC 111 ; 'o'
|
107
|
+
# >> 004E 006D DC 109 ; 'm'
|
108
|
+
# >> 004F 0020 DC 32 ; ' '
|
109
|
+
# >> 0050 0000 DC 0
|
110
|
+
# >> 0051 0020 DC 32 ; ' '
|
111
|
+
# >> 0052 0074 DC 116 ; 't'
|
112
|
+
# >> 0053 006F DC 111 ; 'o'
|
113
|
+
# >> 0054 0020 DC 32 ; ' '
|
114
|
+
# >> 0055 0000 DC 0
|
115
|
+
# >> 0056 0001 DC 1
|
116
|
+
# >> 0057 0001 DC 1
|
117
|
+
# >> 0058 0001 DC 1
|
118
|
+
# >> from A to C
|
119
|
+
# >> from A to B
|
120
|
+
# >> from C to B
|
121
|
+
# >> from A to C
|
122
|
+
# >> from B to A
|
123
|
+
# >> from B to C
|
124
|
+
# >> from A to C
|