summaryrefslogtreecommitdiff
path: root/insts.rb
diff options
context:
space:
mode:
Diffstat (limited to 'insts.rb')
-rw-r--r--insts.rb228
1 files changed, 228 insertions, 0 deletions
diff --git a/insts.rb b/insts.rb
new file mode 100644
index 0000000..bc9c156
--- /dev/null
+++ b/insts.rb
@@ -0,0 +1,228 @@
1inst "hlt" do
2 @control.halt
3end
4
5inst "mov $ #" do
6 uop { @decode.outaddr_a; @decode.outdata_b; @rf.store }
7end
8
9inst "mov $ $" do
10 uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata }
11 uop { @decode.outaddr_a; @tmp0.outdata; @rf.store }
12end
13
14inst "mov [#] #" do
15 uop { @decode.outaddr_a; @decode.outdata_b; @memory.store }
16end
17
18inst "mov [#] $" do
19 uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata }
20 uop { @decode.outaddr_a; @tmp0.outdata; @memory.store }
21end
22
23inst "mov [$] #" do
24 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
25 uop { @decode.outdata_b; @tmp0.outaddr; @memory.store }
26end
27
28inst "mov [$] $" do
29 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
30 uop { @decode.outaddr_b; @rf.outdata; @tmp1.loaddata }
31 uop { @tmp0.outaddr; @tmp1.outdata; @memory.store }
32end
33
34inst "mov $ [#]" do
35 uop { @decode.outaddr_b; @memory.outdata; @tmp0.loaddata }
36 uop { @decode.outaddr_a; @tmp0.outdata; @rf.store }
37end
38
39inst "mov $ [$]" do
40 uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata }
41 uop { @tmp0.outaddr; @memory.outdata; @tmp1.loaddata }
42 uop { @decode.outaddr_a; @tmp1.outdata; @rf.store }
43end
44
45inst "skipz $" do
46 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
47 uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr($eom) }
48 uop { @decode.clear }
49 decode_loop = uip()
50 uop { @pc.increment; @pc.outaddr; @memory.outdata; @decode.decode }
51 uop { @decode.outdata_needmore; @control.set_uip_if_nonzero; constaddr(decode_loop) }
52end
53
54inst "skipnz $" do
55 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
56 uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr(uip()+2) }
57 uop { @control.set_uip; constaddr($eom) }
58 uop { @decode.clear }
59 decode_loop = uip()
60 uop { @pc.increment; @pc.outaddr; @memory.outdata; @decode.decode }
61 uop { @decode.outdata_needmore; @control.set_uip_if_nonzero; constaddr(decode_loop) }
62end
63
64inst "push $ #" do
65 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
66 uop { @tmp0.outaddr; @alu.sub; constdata(1) }
67 uop { @decode.outaddr_a; @alu.outdata; @rf.store }
68 uop { @decode.outdata_b; @alu.outaddr; @memory.store }
69end
70
71inst "push $ $" do
72 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
73 uop { @tmp0.outaddr; @alu.sub; constdata(1) }
74 uop { @decode.outaddr_a; @alu.outdata; @rf.store }
75 uop { @decode.outaddr_b; @rf.outdata; @tmp1.loaddata }
76 uop { @tmp1.outdata; @alu.outaddr; @memory.store }
77end
78
79inst "pop $ $" do
80 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
81 uop { @tmp0.outaddr; @alu.add; constdata(1) }
82 uop { @decode.outaddr_a; @alu.outdata; @rf.store }
83 uop { @alu.outaddr; @memory.outdata; @tmp0.loaddata }
84 uop { @decode.outaddr_b; @tmp0.outdata; @rf.store }
85end
86
87def alu(op)
88 inst "#{op} $ #" do
89 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
90 uop { @decode.outdata_b; @tmp0.outaddr; @alu.send(op) }
91 uop { @decode.outaddr_a; @alu.outdata; @rf.store }
92 end
93
94 inst "#{op} $ $" do
95 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
96 uop { @decode.outaddr_b; @rf.outdata; @tmp1.loaddata }
97 uop { @tmp0.outaddr; @tmp1.outdata; @alu.send(op) }
98 uop { @decode.outaddr_a; @alu.outdata; @rf.store }
99 end
100end
101
102alu :and
103alu :or
104alu :xor
105alu :add
106alu :sub
107alu :cmp
108alu :lshift
109alu :rshift
110
111def cmpbit(name, bit)
112 inst "#{name} $ #" do
113 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
114 uop { @decode.outdata_b; @tmp0.outaddr; @alu.cmp }
115 uop { @alu.outdata; @alu.and; constaddr(1<<bit) }
116 uop { @decode.outaddr_a; @alu.outdata; @rf.store }
117 end
118
119 inst "#{name} $ $" do
120 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
121 uop { @decode.outaddr_b; @rf.outdata; @tmp1.loaddata }
122 uop { @tmp0.outaddr; @tmp1.outdata; @alu.cmp }
123 uop { @alu.outdata; @alu.and; constaddr(1<<bit) }
124 uop { @decode.outaddr_a; @alu.outdata; @rf.store }
125 end
126end
127
128cmpbit :lt, 0
129cmpbit :eq, 1
130cmpbit :gt, 2
131cmpbit :lxor, 3
132cmpbit :lor, 4
133cmpbit :land, 5
134
135inst "jmp #" do
136 uop { @decode.outaddr_a; @pc.load }
137end
138
139inst "jmp $" do
140 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
141 uop { @tmp0.outaddr; @pc.load }
142end
143
144inst "jz $ #" do
145 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
146 uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr($eom) }
147 uop { @decode.outaddr_b; @pc.load }
148end
149
150inst "jz $ $" do
151 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
152 uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr($eom) }
153 uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata }
154 uop { @tmp0.outaddr; @pc.load }
155end
156
157inst "jnz $ #" do
158 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
159 uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr(uip()+2) }
160 uop { @control.set_uip; constaddr($eom) }
161 uop { @decode.outaddr_b; @pc.load }
162end
163
164inst "jnz $ $" do
165 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
166 uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr(uip()+2) }
167 uop { @control.set_uip; constaddr($eom) }
168 uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata }
169 uop { @tmp0.outaddr; @pc.load }
170end
171
172inst "rjmp #" do
173 uop { @decode.outdata_a; @pc.outaddr; @alu.add }
174 uop { @alu.outaddr; @pc.load }
175end
176
177inst "rjmp $" do
178 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
179 uop { @tmp0.outdata; @pc.outaddr; @alu.add }
180 uop { @alu.outaddr; @pc.load }
181end
182
183inst "rjz $ #" do
184 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
185 uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr($eom) }
186 uop { @decode.outdata_b; @pc.outaddr; @alu.add }
187 uop { @alu.outaddr; @pc.load }
188end
189
190inst "rjz $ $" do
191 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
192 uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr($eom) }
193 uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata }
194 uop { @tmp0.outdata; @pc.outaddr; @alu.add }
195 uop { @alu.outaddr; @pc.load }
196end
197
198inst "rjnz $ #" do
199 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
200 uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr(uip()+2) }
201 uop { @control.set_uip; constaddr($eom) }
202 uop { @decode.outdata_b; @pc.outaddr; @alu.add }
203 uop { @alu.outaddr; @pc.load }
204end
205
206inst "rjnz $ $" do
207 uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata }
208 uop { @tmp0.outdata; @control.set_uip_if_nonzero; constaddr(uip()+2) }
209 uop { @control.set_uip; constaddr($eom) }
210 uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata }
211 uop { @tmp0.outdata; @pc.outaddr; @alu.add }
212 uop { @alu.outaddr; @pc.load }
213end
214
215inst "rx $" do
216 uop { @uart.outdata_rxempty; @control.set_uip_if_nonzero; constaddr(uip()) }
217 uop { @decode.outaddr_a; @uart.rx; @rf.store }
218end
219
220inst "tx $" do
221 uop { @uart.outdata_txfull; @control.set_uip_if_nonzero; constaddr(uip()) }
222 uop { @decode.outaddr_a; @rf.outdata; @uart.tx }
223end
224
225inst "tx #" do
226 uop { @uart.outdata_txfull; @control.set_uip_if_nonzero; constaddr(uip()) }
227 uop { @decode.outdata_a; @uart.tx }
228end