rasl 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|