1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
|
use crate::*;
use std::ops::*;
pub struct Processor<D> {
pub mem: Memory,
pub wst: Stack,
pub rst: Stack,
pub dev: D,
pub cycles: usize,
}
impl<D: DeviceBus> Processor<D> {
pub fn new(device_bus: D) -> Self {
Self {
mem: Memory::new(),
wst: Stack::new(),
rst: Stack::new(),
dev: device_bus,
cycles: 0,
}
}
pub fn load_program(&mut self, bytecode: &[u8]) {
self.mem.load_program(bytecode);
}
pub fn evaluate(&mut self, num_cycles: usize) -> Option<Signal> {
macro_rules! w_psh_8 { ($v:expr) => { self.wst.push_u8($v); }; }
macro_rules! r_psh_8 { ($v:expr) => { self.rst.push_u8($v); }; }
macro_rules! w_psh_16 { ($v:expr) => { self.wst.push_u16($v); }; }
macro_rules! r_psh_16 { ($v:expr) => { self.rst.push_u16($v); }; }
macro_rules! w_pop_8 { ($v:ident) => { let $v = self.wst.pop_u8(); }; }
macro_rules! r_pop_8 { ($v:ident) => { let $v = self.rst.pop_u8(); }; }
macro_rules! w_pop_16 { ($v:ident) => { let $v = self.wst.pop_u16(); }; }
macro_rules! r_pop_16 { ($v:ident) => { let $v = self.rst.pop_u16(); }; }
macro_rules! m_read_8 { ($a:expr) => { self.mem.read_u8($a) }; }
macro_rules! m_read_16 { ($a:expr) => { self.mem.read_u16($a) }; }
macro_rules! m_lit_8 { ($l:ident) => { let $l = self.mem.read_u8_next(); }; }
macro_rules! m_lit_16 { ($l:ident) => { let $l = self.mem.read_u16_next(); }; }
macro_rules! m_write_8 { ($v:expr,$a:expr) => { self.mem.write_u8($v,$a); }; }
macro_rules! m_write_16 { ($v:expr,$a:expr) => { self.mem.write_u16($v,$a); }; }
macro_rules! d_read_8 { ($p:expr) => { self.dev.read_u8($p) }; }
macro_rules! d_read_16 { ($p:expr) => { self.dev.read_u16($p) }; }
macro_rules! d_write_8 { ($v:expr,$p:expr) => { let s = self.dev.write_u8( $v, $p); if s.is_some() { return s }; }; }
macro_rules! d_write_16 { ($v:expr,$p:expr) => { let s = self.dev.write_u16($v, $p); if s.is_some() { return s }; }; }
macro_rules! jump { ($a:expr) => { self.mem.write_pc($a) }; }
macro_rules! pc { () => { self.mem.read_pc() }; }
macro_rules! truth { ($x:expr) => { if $x {0xff} else {0x00} }; }
macro_rules! nyb { ($v:expr=>$h:ident,$l:ident) => { let $h=($v>>4); let $l=($v&0x0f); } }
macro_rules! shf { ($x:expr,$y:expr) => { { nyb!($y=>l,r); $x.wrapping_shl(l as u32).wrapping_shr(r as u32) } } ; }
macro_rules! shc { ($x:expr,$y:expr) => { { nyb!($y=>l,r); $x.rotate_left( l as u32).rotate_right(r as u32) } }; }
for _ in 0..num_cycles {
self.cycles += 1;
match self.mem.read_u8_next() {
/* HLT */ 0x00 => { return Some(Signal::Halt); }
/* JMP */ 0x01 => { w_pop_16!(a); jump!(a); }
/* JCN */ 0x02 => { w_pop_16!(a); w_pop_8!(t); if t!=0 {jump!(a)}; }
/* JKN */ 0x03 => { w_pop_16!(a); w_pop_8!(t); w_psh_8!(t); if t!=0 {jump!(a)}; }
/* EQU */ 0x04 => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(truth!(x==y)); }
/* NKQ */ 0x05 => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(x); w_psh_8!(y); w_psh_8!(truth!(x!=y)); }
/* LTH */ 0x06 => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(truth!(x <y)); }
/* GTH */ 0x07 => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(truth!(x >y)); }
/* LDA */ 0x08 => { w_pop_16!(a); w_psh_8!(m_read_8!(a)); }
/* STA */ 0x09 => { w_pop_16!(a); w_pop_8!(v); m_write_8!(v,a); }
/* LKA */ 0x0A => { w_pop_16!(a); w_psh_16!(a); w_psh_8!(m_read_8!(a)); }
/* SKA */ 0x0B => { w_pop_8!(v); w_pop_16!(a); w_psh_16!(a); m_write_8!(v,a); }
/* LDD */ 0x0C => { w_pop_8!(p); w_psh_8!(d_read_8!(p)); }
/* STD */ 0x0D => { w_pop_8!(p); w_pop_8!(v); d_write_8!(v,p); }
/* SHF */ 0x0E => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(shf!(x,y)); }
/* SHC */ 0x0F => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(shc!(x,y)); }
/* PSH */ 0x10 => { r_pop_8!(x); w_psh_8!(x); }
/* PSK */ 0x11 => { r_pop_8!(x); r_psh_8!(x); w_psh_8!(x); }
/* POP */ 0x12 => { w_pop_8!(_x); }
/* SPL */ 0x13 => { w_pop_8!(x); nyb!(x=>a,b); w_psh_8!(a); w_psh_8!(b); }
/* DUP */ 0x14 => { w_pop_8!(x); w_psh_8!(x); w_psh_8!(x); }
/* OVR */ 0x15 => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(x); w_psh_8!(y); w_psh_8!(x); }
/* SWP */ 0x16 => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(y); w_psh_8!(x); }
/* ROT */ 0x17 => { w_pop_8!(z); w_pop_8!(y); w_pop_8!(x); w_psh_8!(y); w_psh_8!(z); w_psh_8!(x); }
/* ADD */ 0x18 => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(x.wrapping_add(y)); }
/* SUB */ 0x19 => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(x.wrapping_sub(y)); }
/* INC */ 0x1A => { w_pop_8!(x); w_psh_8!(x.wrapping_add(1)); }
/* DEC */ 0x1B => { w_pop_8!(x); w_psh_8!(x.wrapping_sub(1)); }
/* AND */ 0x1C => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(x.bitand(y)); }
/* NOT */ 0x1D => { w_pop_8!(x); w_psh_8!(x.not()); }
/* IOR */ 0x1E => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(x.bitor(y)); }
/* XOR */ 0x1F => { w_pop_8!(y); w_pop_8!(x); w_psh_8!(x.bitxor(y)); }
/* DB1 */ 0x20 => { return Some(Signal::Debug(DebugVariant::DB1)); }
/* JSR */ 0x21 => { w_pop_16!(a); r_psh_16!(pc!()); jump!(a); }
/* JSN */ 0x22 => { w_pop_16!(a); w_pop_8!(t); if t!=0 {r_psh_16!(pc!()); jump!(a)}; }
/* JKN* */ 0x23 => { w_pop_16!(a); w_pop_16!(t); w_psh_16!(t); if t!=0 {jump!(a)}; }
/* EQU* */ 0x24 => { w_pop_16!(y); w_pop_16!(x); w_psh_8!(truth!(x==y)); }
/* NKQ* */ 0x25 => { w_pop_16!(y); w_pop_16!(x); w_psh_16!(x); w_psh_16!(y); w_psh_8!(truth!(x!=y)); }
/* LTH* */ 0x26 => { w_pop_16!(y); w_pop_16!(x); w_psh_8!(truth!(x <y)); }
/* GTH* */ 0x27 => { w_pop_16!(y); w_pop_16!(x); w_psh_8!(truth!(x >y)); }
/* LDA* */ 0x28 => { w_pop_16!(a); w_psh_16!(m_read_16!(a)); }
/* STA* */ 0x29 => { w_pop_16!(a); w_pop_16!(v); m_write_16!(v,a); }
/* LKA* */ 0x2A => { w_pop_16!(a); w_psh_16!(a); w_psh_16!(m_read_16!(a)); }
/* SKA* */ 0x2B => { w_pop_16!(v); w_pop_16!(a); w_psh_16!(a); m_write_16!(v,a); }
/* LDD* */ 0x2C => { w_pop_8!(p); w_psh_16!(d_read_16!(p)); }
/* STD* */ 0x2D => { w_pop_8!(p); w_pop_16!(v); d_write_16!(v,p); }
/* SHF* */ 0x2E => { w_pop_8!(y); w_pop_16!(x); w_psh_16!(shf!(x,y)); }
/* SHC* */ 0x2F => { w_pop_8!(y); w_pop_16!(x); w_psh_16!(shc!(x,y)); }
/* PSH* */ 0x30 => { r_pop_16!(x); w_psh_16!(x); }
/* PSK* */ 0x31 => { r_pop_16!(x); r_psh_16!(x); w_psh_16!(x); }
/* POP* */ 0x32 => { w_pop_16!(_x); }
/* SPL* */ 0x33 => { w_pop_8!(y); w_pop_8!(x); nyb!(x=>a,b); nyb!(y=>c,d); w_psh_8!(a); w_psh_8!(b); w_psh_8!(c); w_psh_8!(d); }
/* DUP* */ 0x34 => { w_pop_16!(x); w_psh_16!(x); w_psh_16!(x); }
/* OVR* */ 0x35 => { w_pop_16!(y); w_pop_16!(x); w_psh_16!(x); w_psh_16!(y); w_psh_16!(x); }
/* SWP* */ 0x36 => { w_pop_16!(y); w_pop_16!(x); w_psh_16!(y); w_psh_16!(x); }
/* ROT* */ 0x37 => { w_pop_16!(z); w_pop_16!(y); w_pop_16!(x); w_psh_16!(y); w_psh_16!(z); w_psh_16!(x); }
/* ADD* */ 0x38 => { w_pop_16!(y); w_pop_16!(x); w_psh_16!(x.wrapping_add(y)); }
/* SUB* */ 0x39 => { w_pop_16!(y); w_pop_16!(x); w_psh_16!(x.wrapping_sub(y)); }
/* INC* */ 0x3A => { w_pop_16!(x); w_psh_16!(x.wrapping_add(1)); }
/* DEC* */ 0x3B => { w_pop_16!(x); w_psh_16!(x.wrapping_sub(1)); }
/* AND* */ 0x3C => { w_pop_16!(y); w_pop_16!(x); w_psh_16!(x.bitand(y)); }
/* NOT* */ 0x3D => { w_pop_16!(x); w_psh_16!(x.not()); }
/* IOR* */ 0x3E => { w_pop_16!(y); w_pop_16!(x); w_psh_16!(x.bitor(y)); }
/* XOR* */ 0x3F => { w_pop_16!(y); w_pop_16!(x); w_psh_16!(x.bitxor(y)); },
/* DB2 */ 0x40 => { return Some(Signal::Debug(DebugVariant::DB2)); }
/* JMP: */ 0x41 => { m_lit_16!(a); jump!(a); }
/* JCN: */ 0x42 => { m_lit_16!(a); w_pop_8!(t); if t!=0{jump!(a)}; }
/* JKN: */ 0x43 => { m_lit_16!(a); w_pop_8!(t); w_psh_8!(t); if t!=0{jump!(a)}; }
/* EQU: */ 0x44 => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(truth!(x==y)); }
/* NKQ: */ 0x45 => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(x); w_psh_8!(y); w_psh_8!(truth!(x!=y)); }
/* LTH: */ 0x46 => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(truth!(x <y)); }
/* GTH: */ 0x47 => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(truth!(x >y)); }
/* LDA: */ 0x48 => { m_lit_16!(a); w_psh_8!(m_read_8!(a)); }
/* STA: */ 0x49 => { m_lit_16!(a); w_pop_8!(v); m_write_8!(v,a); }
/* LKA: */ 0x4A => { m_lit_16!(a); w_psh_16!(a); w_psh_8!(m_read_8!(a)); }
/* SKA: */ 0x4B => { m_lit_8!(v); w_pop_16!(a); w_psh_16!(a); m_write_8!(v,a); }
/* LDD: */ 0x4C => { m_lit_8!(p); w_psh_8!(d_read_8!(p)); }
/* STD: */ 0x4D => { m_lit_8!(p); w_pop_8!(v); d_write_8!(v,p); }
/* SHF: */ 0x4E => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(shf!(x,y)); }
/* SHC: */ 0x4F => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(shc!(x,y)); }
/* PSH: */ 0x50 => { m_lit_8!(x); w_psh_8!(x); }
/* PSK: */ 0x51 => { m_lit_8!(x); r_psh_8!(x); w_psh_8!(x); }
/* POP: */ 0x52 => { m_lit_8!(_x); }
/* SPL: */ 0x53 => { m_lit_8!(x); nyb!(x=>a,b); w_psh_8!(a); w_psh_8!(b); }
/* DUP: */ 0x54 => { m_lit_8!(x); w_psh_8!(x); w_psh_8!(x); }
/* OVR: */ 0x55 => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(x); w_psh_8!(y); w_psh_8!(x); }
/* SWP: */ 0x56 => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(y); w_psh_8!(x); }
/* ROT: */ 0x57 => { m_lit_8!(z); w_pop_8!(y); w_pop_8!(x); w_psh_8!(y); w_psh_8!(z); w_psh_8!(x); }
/* ADD: */ 0x58 => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(x.wrapping_add(y)); }
/* SUB: */ 0x59 => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(x.wrapping_sub(y)); }
/* INC: */ 0x5A => { m_lit_8!(x); w_psh_8!(x.wrapping_add(1)); }
/* DEC: */ 0x5B => { m_lit_8!(x); w_psh_8!(x.wrapping_sub(1)); }
/* AND: */ 0x5C => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(x.bitand(y)); }
/* NOT: */ 0x5D => { m_lit_8!(x); w_psh_8!(x.not()); }
/* IOR: */ 0x5E => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(x.bitor(y)); }
/* XOR: */ 0x5F => { m_lit_8!(y); w_pop_8!(x); w_psh_8!(x.bitxor(y)); },
/* DB3 */ 0x60 => { return Some(Signal::Debug(DebugVariant::DB3)); }
/* JSR: */ 0x61 => { m_lit_16!(a); r_psh_16!(pc!()); jump!(a); }
/* JSN: */ 0x62 => { m_lit_16!(a); w_pop_8!(t); if t!=0 {r_psh_16!(pc!()); jump!(a)}; }
/* JKN*: */ 0x63 => { m_lit_16!(a); w_pop_16!(t); w_psh_16!(t); if t!=0 {jump!(a)}; }
/* EQU*: */ 0x64 => { m_lit_16!(y); w_pop_16!(x); w_psh_8!(truth!(x==y)); }
/* NKQ*: */ 0x65 => { m_lit_16!(y); w_pop_16!(x); w_psh_16!(x); w_psh_16!(y); w_psh_8!(truth!(x!=y)); }
/* LTH*: */ 0x66 => { m_lit_16!(y); w_pop_16!(x); w_psh_8!(truth!(x <y)); }
/* GTH*: */ 0x67 => { m_lit_16!(y); w_pop_16!(x); w_psh_8!(truth!(x >y)); }
/* LDA*: */ 0x68 => { m_lit_16!(a); w_psh_16!(m_read_16!(a)); }
/* STA*: */ 0x69 => { m_lit_16!(a); w_pop_16!(v); m_write_16!(v,a); }
/* LKA*: */ 0x6A => { m_lit_16!(a); w_psh_16!(a); w_psh_16!(m_read_16!(a)); }
/* SKA*: */ 0x6B => { m_lit_16!(v); w_pop_16!(a); w_psh_16!(a); m_write_16!(v,a); }
/* LDD*: */ 0x6C => { m_lit_8!(p); w_psh_16!(d_read_16!(p)); }
/* STD*: */ 0x6D => { m_lit_8!(p); w_pop_16!(v); d_write_16!(v,p); }
/* SHF*: */ 0x6E => { m_lit_8!(y); w_pop_16!(x); w_psh_16!(shf!(x,y)); }
/* SHC*: */ 0x6F => { m_lit_8!(y); w_pop_16!(x); w_psh_16!(shc!(x,y)); }
/* PSH*: */ 0x70 => { m_lit_16!(x); w_psh_16!(x); }
/* PSK*: */ 0x71 => { m_lit_16!(x); r_psh_16!(x); w_psh_16!(x); }
/* POP*: */ 0x72 => { m_lit_16!(_x); }
/* SPL*: */ 0x73 => { m_lit_8!(x); m_lit_8!(y); nyb!(x=>a,b); nyb!(y=>c,d); w_psh_8!(a); w_psh_8!(b); w_psh_8!(c); w_psh_8!(d); }
/* DUP*: */ 0x74 => { m_lit_16!(x); w_psh_16!(x); w_psh_16!(x); }
/* OVR*: */ 0x75 => { m_lit_16!(y); w_pop_16!(x); w_psh_16!(x); w_psh_16!(y); w_psh_16!(x); }
/* SWP*: */ 0x76 => { m_lit_16!(y); w_pop_16!(x); w_psh_16!(y); w_psh_16!(x); }
/* ROT*: */ 0x77 => { m_lit_16!(z); w_pop_16!(y); w_pop_16!(x); w_psh_16!(y); w_psh_16!(z); w_psh_16!(x); }
/* ADD*: */ 0x78 => { m_lit_16!(y); w_pop_16!(x); w_psh_16!(x.wrapping_add(y)); }
/* SUB*: */ 0x79 => { m_lit_16!(y); w_pop_16!(x); w_psh_16!(x.wrapping_sub(y)); }
/* INC*: */ 0x7A => { m_lit_16!(x); w_psh_16!(x.wrapping_add(1)); }
/* DEC*: */ 0x7B => { m_lit_16!(x); w_psh_16!(x.wrapping_sub(1)); }
/* AND*: */ 0x7C => { m_lit_16!(y); w_pop_16!(x); w_psh_16!(x.bitand(y)); }
/* NOT*: */ 0x7D => { m_lit_16!(x); w_psh_16!(x.not()); }
/* IOR*: */ 0x7E => { m_lit_16!(y); w_pop_16!(x); w_psh_16!(x.bitor(y)); }
/* XOR*: */ 0x7F => { m_lit_16!(y); w_pop_16!(x); w_psh_16!(x.bitxor(y)); },
/* DB4 */ 0x80 => { return Some(Signal::Debug(DebugVariant::DB4)); }
/* JMPr */ 0x81 => { r_pop_16!(a); jump!(a); }
/* JCNr */ 0x82 => { r_pop_16!(a); r_pop_8!(t); if t!=0{jump!(a)}; }
/* JKNr */ 0x83 => { r_pop_16!(a); r_pop_8!(t); r_psh_8!(t); if t!=0{jump!(a)}; }
/* EQUr */ 0x84 => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(truth!(x==y)); }
/* NKQr */ 0x85 => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(x); r_psh_8!(y); r_psh_8!(truth!(x!=y)); }
/* LTHr */ 0x86 => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(truth!(x <y)); }
/* GTHr */ 0x87 => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(truth!(x >y)); }
/* LDAr */ 0x88 => { r_pop_16!(a); r_psh_8!(m_read_8!(a)); }
/* STAr */ 0x89 => { r_pop_16!(a); r_pop_8!(v); m_write_8!(v,a); }
/* LKAr */ 0x8A => { r_pop_16!(a); r_psh_16!(a); r_psh_8!(m_read_8!(a)); }
/* SKAr */ 0x8B => { r_pop_8!(v); r_pop_16!(a); r_psh_16!(a); m_write_8!(v,a); }
/* LDDr */ 0x8C => { r_pop_8!(p); r_psh_8!(d_read_8!(p)); }
/* STDr */ 0x8D => { r_pop_8!(p); r_pop_8!(v); d_write_8!(v,p); }
/* SHFr */ 0x8E => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(shf!(x,y)); }
/* SHCr */ 0x8F => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(shc!(x,y)); }
/* PSHr */ 0x90 => { w_pop_8!(x); r_psh_8!(x); }
/* PSKr */ 0x91 => { w_pop_8!(x); w_psh_8!(x); r_psh_8!(x); }
/* POPr */ 0x92 => { r_pop_8!(_x); }
/* SPLr */ 0x93 => { r_pop_8!(x); nyb!(x=>a,b); r_psh_8!(a); r_psh_8!(b); }
/* DUPr */ 0x94 => { r_pop_8!(x); r_psh_8!(x); r_psh_8!(x); }
/* OVRr */ 0x95 => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(x); r_psh_8!(y); r_psh_8!(x); }
/* SWPr */ 0x96 => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(y); r_psh_8!(x); }
/* ROTr */ 0x97 => { r_pop_8!(z); r_pop_8!(y); r_pop_8!(x); r_psh_8!(y); r_psh_8!(z); r_psh_8!(x); }
/* ADDr */ 0x98 => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(x.wrapping_add(y)); }
/* SUBr */ 0x99 => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(x.wrapping_sub(y)); }
/* INCr */ 0x9A => { r_pop_8!(x); r_psh_8!(x.wrapping_add(1)); }
/* DECr */ 0x9B => { r_pop_8!(x); r_psh_8!(x.wrapping_sub(1)); }
/* ANDr */ 0x9C => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(x.bitand(y)); }
/* NOTr */ 0x9D => { r_pop_8!(x); r_psh_8!(x.not()); }
/* IORr */ 0x9E => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(x.bitor(y)); }
/* XORr */ 0x9F => { r_pop_8!(y); r_pop_8!(x); r_psh_8!(x.bitxor(y)); },
/* DB5 */ 0xA0 => { return Some(Signal::Debug(DebugVariant::DB5)); }
/* JSRr */ 0xA1 => { r_pop_16!(a); w_psh_16!(pc!()); jump!(a); }
/* JSNr */ 0xA2 => { r_pop_16!(a); r_pop_8!(t); if t!=0 {w_psh_16!(pc!()); jump!(a)}; }
/* JKNr* */ 0xA3 => { r_pop_16!(a); r_pop_16!(t); r_psh_16!(t); if t!=0 {jump!(a)}; }
/* EQUr* */ 0xA4 => { r_pop_16!(y); r_pop_16!(x); r_psh_8!(truth!(x==y)); }
/* NKQr* */ 0xA5 => { r_pop_16!(y); r_pop_16!(x); r_psh_16!(x); r_psh_16!(y); r_psh_8!(truth!(x!=y)); }
/* LTHr* */ 0xA6 => { r_pop_16!(y); r_pop_16!(x); r_psh_8!(truth!(x <y)); }
/* GTHr* */ 0xA7 => { r_pop_16!(y); r_pop_16!(x); r_psh_8!(truth!(x >y)); }
/* LDAr* */ 0xA8 => { r_pop_16!(a); r_psh_16!(m_read_16!(a)); }
/* STAr* */ 0xA9 => { r_pop_16!(a); r_pop_16!(v); m_write_16!(v,a); }
/* LKAr* */ 0xAA => { r_pop_16!(a); r_psh_16!(a); r_psh_16!(m_read_16!(a)); }
/* SKAr* */ 0xAB => { r_pop_16!(v); r_pop_16!(a); r_psh_16!(a); m_write_16!(v,a); }
/* LDDr* */ 0xAC => { r_pop_8!(p); r_psh_16!(d_read_16!(p)); }
/* STDr* */ 0xAD => { r_pop_8!(p); r_pop_16!(v); d_write_16!(v,p); }
/* SHFr* */ 0xAE => { r_pop_8!(y); r_pop_16!(x); r_psh_16!(shf!(x,y)); }
/* SHCr* */ 0xAF => { r_pop_8!(y); r_pop_16!(x); r_psh_16!(shc!(x,y)); }
/* PSHr* */ 0xB0 => { w_pop_16!(x); r_psh_16!(x); }
/* PSKr* */ 0xB1 => { w_pop_16!(x); w_psh_16!(x); r_psh_16!(x); }
/* POPr* */ 0xB2 => { r_pop_16!(_x); }
/* SPLr* */ 0xB3 => { r_pop_8!(y); r_pop_8!(x); nyb!(x=>a,b); nyb!(y=>c,d); r_psh_8!(a); r_psh_8!(b); r_psh_8!(c); r_psh_8!(d); }
/* DUPr* */ 0xB4 => { r_pop_16!(x); r_psh_16!(x); r_psh_16!(x); }
/* OVRr* */ 0xB5 => { r_pop_16!(y); r_pop_16!(x); r_psh_16!(x); r_psh_16!(y); r_psh_16!(x); }
/* SWPr* */ 0xB6 => { r_pop_16!(y); r_pop_16!(x); r_psh_16!(y); r_psh_16!(x); }
/* ROTr* */ 0xB7 => { r_pop_16!(z); r_pop_16!(y); r_pop_16!(x); r_psh_16!(y); r_psh_16!(z); r_psh_16!(x); }
/* ADDr* */ 0xB8 => { r_pop_16!(y); r_pop_16!(x); r_psh_16!(x.wrapping_add(y)); }
/* SUBr* */ 0xB9 => { r_pop_16!(y); r_pop_16!(x); r_psh_16!(x.wrapping_sub(y)); }
/* INCr* */ 0xBA => { r_pop_16!(x); r_psh_16!(x.wrapping_add(1)); }
/* DECr* */ 0xBB => { r_pop_16!(x); r_psh_16!(x.wrapping_sub(1)); }
/* ANDr* */ 0xBC => { r_pop_16!(y); r_pop_16!(x); r_psh_16!(x.bitand(y)); }
/* NOTr* */ 0xBD => { r_pop_16!(x); r_psh_16!(x.not()); }
/* IORr* */ 0xBE => { r_pop_16!(y); r_pop_16!(x); r_psh_16!(x.bitor(y)); }
/* XORr* */ 0xBF => { r_pop_16!(y); r_pop_16!(x); r_psh_16!(x.bitxor(y)); },
/* DB6 */ 0xC0 => { return Some(Signal::Debug(DebugVariant::DB6)); }
/* JMPr: */ 0xC1 => { m_lit_16!(a); jump!(a); }
/* JCNr: */ 0xC2 => { m_lit_16!(a); r_pop_8!(t); if t!=0{jump!(a)}; }
/* JKNr: */ 0xC3 => { m_lit_16!(a); r_pop_8!(t); r_psh_8!(t); if t!=0{jump!(a)}; }
/* EQUr: */ 0xC4 => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(truth!(x==y)); }
/* NKQr: */ 0xC5 => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(x); r_psh_8!(y); r_psh_8!(truth!(x!=y)); }
/* LTHr: */ 0xC6 => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(truth!(x <y)); }
/* GTHr: */ 0xC7 => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(truth!(x >y)); }
/* LDAr: */ 0xC8 => { m_lit_16!(a); r_psh_8!(m_read_8!(a)); }
/* STAr: */ 0xC9 => { m_lit_16!(a); r_pop_8!(v); m_write_8!(v,a); }
/* LKAr: */ 0xCA => { m_lit_16!(a); r_psh_16!(a); r_psh_8!(m_read_8!(a)); }
/* SKAr: */ 0xCB => { m_lit_8!(v); r_pop_16!(a); r_psh_16!(a); m_write_8!(v,a); }
/* LDDr: */ 0xCC => { m_lit_8!(p); r_psh_8!(d_read_8!(p)); }
/* STDr: */ 0xCD => { m_lit_8!(p); r_pop_8!(v); d_write_8!(v,p); }
/* SHFr: */ 0xCE => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(shf!(x,y)); }
/* SHCr: */ 0xCF => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(shc!(x,y)); }
/* PSHr: */ 0xD0 => { m_lit_8!(x); r_psh_8!(x); }
/* PSKr: */ 0xD1 => { m_lit_8!(x); w_psh_8!(x); r_psh_8!(x); }
/* POPr: */ 0xD2 => { m_lit_8!(_x); }
/* SPLr: */ 0xD3 => { m_lit_8!(x); nyb!(x=>a,b); r_psh_8!(a); r_psh_8!(b); }
/* DUPr: */ 0xD4 => { m_lit_8!(x); r_psh_8!(x); r_psh_8!(x); }
/* OVRr: */ 0xD5 => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(x); r_psh_8!(y); r_psh_8!(x); }
/* SWPr: */ 0xD6 => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(y); r_psh_8!(x); }
/* ROTr: */ 0xD7 => { m_lit_8!(z); r_pop_8!(y); r_pop_8!(x); r_psh_8!(y); r_psh_8!(z); r_psh_8!(x); }
/* ADDr: */ 0xD8 => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(x.wrapping_add(y)); }
/* SUBr: */ 0xD9 => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(x.wrapping_sub(y)); }
/* INCr: */ 0xDA => { m_lit_8!(x); r_psh_8!(x.wrapping_add(1)); }
/* DECr: */ 0xDB => { m_lit_8!(x); r_psh_8!(x.wrapping_sub(1)); }
/* ANDr: */ 0xDC => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(x.bitand(y)); }
/* NOTr: */ 0xDD => { m_lit_8!(x); r_psh_8!(x.not()); }
/* IORr: */ 0xDE => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(x.bitor(y)); }
/* XORr: */ 0xDF => { m_lit_8!(y); r_pop_8!(x); r_psh_8!(x.bitxor(y)); },
/* NOP */ 0xE0 => { }
/* JSRr: */ 0xE1 => { m_lit_16!(a); w_psh_16!(pc!()); jump!(a); }
/* JSNr: */ 0xE2 => { m_lit_16!(a); r_pop_8!(t); if t!=0 {w_psh_16!(pc!()); jump!(a)}; }
/* JKNr*: */ 0xE3 => { m_lit_16!(a); r_pop_16!(t); r_psh_16!(t); if t!=0 {jump!(a)}; }
/* EQUr*: */ 0xE4 => { m_lit_16!(y); r_pop_16!(x); r_psh_8!(truth!(x==y)); }
/* NKQr*: */ 0xE5 => { m_lit_16!(y); r_pop_16!(x); r_psh_16!(x); r_psh_16!(y); r_psh_8!(truth!(x!=y)); }
/* LTHr*: */ 0xE6 => { m_lit_16!(y); r_pop_16!(x); r_psh_8!(truth!(x <y)); }
/* GTHr*: */ 0xE7 => { m_lit_16!(y); r_pop_16!(x); r_psh_8!(truth!(x >y)); }
/* LDAr*: */ 0xE8 => { m_lit_16!(a); r_psh_16!(m_read_16!(a)); }
/* STAr*: */ 0xE9 => { m_lit_16!(a); r_pop_16!(v); m_write_16!(v,a); }
/* LKAr*: */ 0xEA => { m_lit_16!(a); r_psh_16!(a); r_psh_16!(m_read_16!(a)); }
/* SKAr*: */ 0xEB => { m_lit_16!(v); r_pop_16!(a); r_psh_16!(a); m_write_16!(v,a); }
/* LDDr*: */ 0xEC => { m_lit_8!(p); r_psh_16!(d_read_16!(p)); }
/* STDr*: */ 0xED => { m_lit_8!(p); r_pop_16!(v); d_write_16!(v,p); }
/* SHFr*: */ 0xEE => { m_lit_8!(y); r_pop_16!(x); r_psh_16!(shf!(x,y)); }
/* SHCr*: */ 0xEF => { m_lit_8!(y); r_pop_16!(x); r_psh_16!(shc!(x,y)); }
/* PSHr*: */ 0xF0 => { m_lit_16!(x); r_psh_16!(x); }
/* PSKr*: */ 0xF1 => { m_lit_16!(x); w_psh_16!(x); r_psh_16!(x); }
/* POPr*: */ 0xF2 => { m_lit_16!(_x); }
/* SPLr*: */ 0xF3 => { m_lit_8!(x); m_lit_8!(y); nyb!(x=>a,b); nyb!(y=>c,d); r_psh_8!(a); r_psh_8!(b); r_psh_8!(c); r_psh_8!(d); }
/* DUPr*: */ 0xF4 => { m_lit_16!(x); r_psh_16!(x); r_psh_16!(x); }
/* OVRr*: */ 0xF5 => { m_lit_16!(y); r_pop_16!(x); r_psh_16!(x); r_psh_16!(y); r_psh_16!(x); }
/* SWPr*: */ 0xF6 => { m_lit_16!(y); r_pop_16!(x); r_psh_16!(y); r_psh_16!(x); }
/* ROTr*: */ 0xF7 => { m_lit_16!(z); r_pop_16!(y); r_pop_16!(x); r_psh_16!(y); r_psh_16!(z); r_psh_16!(x); }
/* ADDr*: */ 0xF8 => { m_lit_16!(y); r_pop_16!(x); r_psh_16!(x.wrapping_add(y)); }
/* SUBr*: */ 0xF9 => { m_lit_16!(y); r_pop_16!(x); r_psh_16!(x.wrapping_sub(y)); }
/* INCr*: */ 0xFA => { m_lit_16!(x); r_psh_16!(x.wrapping_add(1)); }
/* DECr*: */ 0xFB => { m_lit_16!(x); r_psh_16!(x.wrapping_sub(1)); }
/* ANDr*: */ 0xFC => { m_lit_16!(y); r_pop_16!(x); r_psh_16!(x.bitand(y)); }
/* NOTr*: */ 0xFD => { m_lit_16!(x); r_psh_16!(x.not()); }
/* IORr*: */ 0xFE => { m_lit_16!(y); r_pop_16!(x); r_psh_16!(x.bitor(y)); }
/* XORr*: */ 0xFF => { m_lit_16!(y); r_pop_16!(x); r_psh_16!(x.bitxor(y)); }
}
}
return None;
}
}
|