2 * Simulator of microcontrollers (pdk13.cc)
4 * Copyright (C) 2016 Drotos Daniel
6 * To contact author send email to dr.dkdb@gmail.com
10 /* This file is part of microcontroller simulator: ucsim.
12 UCSIM is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 UCSIM is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with UCSIM; see the file COPYING. If not, write to the Free
24 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
36 cl_fpp13::cl_fpp13(int aid
, class cl_pdk
*the_puc
, class cl_sim
*asim
):
37 cl_fpp(aid
, the_puc
, asim
)
39 type
= new struct cpu_entry
;
40 type
->type
= CPU_PDK13
;
43 cl_fpp13::cl_fpp13(int aid
, class cl_pdk
*the_puc
, struct cpu_entry
*IType
, class cl_sim
*asim
):
44 cl_fpp(aid
, the_puc
, IType
, asim
)
49 struct dis_entry
*cl_fpp13::dis_tbl(void)
56 cl_fpp13::execute(unsigned int code
)
58 int write_result
= resGO
;
61 } else if (CODE_MASK(0x0100, 0xFF)) {
65 PC
= get_mem(rSP
) | (get_mem(rSP
+ 1) << 8);
66 } else if (code
== 0x003A) {
69 PC
= get_mem(rSP
) | (get_mem(rSP
+ 1) << 8);
70 } else if (CODE_MASK(0x1700, 0xFF)) {
73 } else if (CODE_MASK(0x0080, 0x1F)) {
75 sfr
->write(code
&0x1f, rA
);
76 } else if (CODE_MASK(0x00A0, 0x1F)) {
78 cA
.W(get_io(code
& 0x1F));
79 } else if (CODE_MASK(0x05C0, 0x3F)) {
82 } else if (CODE_MASK(0x07C0, 0x3F)) {
84 cA
.W(get_mem(code
& 0x3F));
85 } else if (CODE_MASK(0x00C1, 0x1E)) {
87 wr16(code
& 0x001e, puc
?(puc
->t16
->cnt
):0);
88 } else if (CODE_MASK(0x00C0, 0x1E)) {
91 puc
->t16
->cnt
= rd16(code
& 0x001e);
92 } else if ((CODE_MASK(0x0E1, 0x1E))) {
94 cA
.W(get_mem(get_mem(code
& 0x1E)));
95 } else if ((CODE_MASK(0x0E0, 0x1E))) {
97 wr8(get_mem(code
& 0x1E), rA
);
98 } else if (CODE_MASK(0x09C0, 0x3F)) {
100 int mem
= get_mem(code
& 0x3F);
101 wr8(code
& 0x3F, rA
);
103 } else if (code
== 0x0032) {
106 ram
->write(rSP
+ 1, rF
);
108 } else if (code
== 0x0033) {
110 cF
->W(get_mem(rSP
- 1));
111 cA
.W(get_mem(rSP
- 2));
113 } else if (CODE_MASK(0x1000, 0xFF)) {
115 cA
.W(add_to(rA
, code
& 0xFF));
116 } else if (CODE_MASK(0x0600, 0x3F)) {
118 cA
.W(add_to(rA
, get_mem(code
& 0x3F)));
119 } else if (CODE_MASK(0x0400, 0x3F)) {
121 int addr
= code
& 0x3F;
122 wr8(addr
, add_to(rA
, get_mem(addr
)));
123 } else if (CODE_MASK(0x1100, 0xFF)) {
125 cA
.W(sub_to(rA
, code
& 0xFF));
126 } else if (CODE_MASK(0x0640, 0x3F)) {
128 cA
.W(sub_to(rA
, get_mem(code
& 0x3F)));
129 } else if (CODE_MASK(0x0440, 0x3F)) {
131 int addr
= code
& 0x3F;
132 wr8(addr
, sub_to(get_mem(addr
), rA
));
133 } else if (CODE_MASK(0x0680, 0x3F)) {
135 cA
.W(add_to(rA
, get_mem(code
& 0x3F), fC
));
136 } else if (CODE_MASK(0x0480, 0x3F)) {
138 int addr
= code
& 0x3F;
139 wr8(addr
, add_to(rA
, get_mem(addr
), fC
));
140 } else if (code
== 0x0010) {
142 cA
.W(add_to(rA
, fC
));
143 } else if (CODE_MASK(0x0800, 0x3F)) {
145 int addr
= code
& 0x3F;
146 wr8(addr
, add_to(get_mem(addr
), fC
));
147 } else if (CODE_MASK(0x06C0, 0x3F)) {
149 cA
.W(sub_to(rA
, get_mem(code
& 0x3F), fC
));
150 } else if (CODE_MASK(0x04C0, 0x3F)) {
152 int addr
= code
& 0x3F;
153 wr8(addr
, sub_to(get_mem(addr
), rA
, fC
));
154 } else if (code
== 0x0011) {
156 cA
.W(sub_to(rA
, fC
));
157 } else if (CODE_MASK(0x0840, 0x3F)) {
159 int addr
= code
& 0x3F;
160 wr8(addr
, sub_to(get_mem(addr
), fC
));
161 } else if (CODE_MASK(0x0900, 0x3F)) {
163 int addr
= code
& 0x3F;
164 wr8(addr
, add_to(get_mem(addr
), 1));
165 } else if (CODE_MASK(0x0940, 0x3F)) {
167 int addr
= code
& 0x3F;
168 wr8(addr
, sub_to(get_mem(addr
), 1));
169 } else if (CODE_MASK(0x0980, 0x3F)) {
172 } else if (code
== 0x001A) {
176 } else if (CODE_MASK(0x0A80, 0x3F)) {
178 int value
= get_mem(code
& 0x3F);
180 wr8(code
& 0x3F, value
>> 1);
181 } else if (code
== 0x001B) {
185 } else if (CODE_MASK(0x0AC0, 0x3F)) {
187 int value
= get_mem(code
& 0x3F);
189 wr8(code
& 0x3F, value
<< 1);
190 } else if (code
== 0x001C) {
194 cA
.W(rA
| (fC
<< 7));
196 } else if (CODE_MASK(0x0B00, 0x3F)) {
198 int value
= get_mem(code
& 0x3F);
200 wr8(code
& 0x3F, (value
>> 1) | (fC
<< 7));
202 } else if (code
== 0x001D) {
204 int c
= (rA
& 0x80) >> 7;
208 } else if (CODE_MASK(0x0B40, 0x3F)) {
210 int value
= get_mem(code
& 0x3F);
211 int c
= (value
& 0x80) >> 7;
212 wr8(code
& 0x3F, (value
<< 1) | fC
);
214 } else if (CODE_MASK(0x1400, 0xFF)) {
218 } else if (CODE_MASK(0x0700, 0x3F)) {
220 cA
.W(rA
& get_mem(code
& 0x3F));
222 } else if (CODE_MASK(0x0500, 0x3F)) {
224 int store
= rA
& get_mem(code
& 0x3F);
226 wr8(code
& 0x3F, store
);
227 } else if (CODE_MASK(0x1500, 0xFF)) {
231 } else if (CODE_MASK(0x0740, 0x3F)) {
233 cA
.W(rA
| get_mem(code
& 0x3F));
235 } else if (CODE_MASK(0x0540, 0x3F)) {
237 int store
= rA
| get_mem(code
& 0x3F);
239 wr8(code
& 0x3F, store
);
240 } else if (CODE_MASK(0x1600, 0xFF)) {
244 } else if (CODE_MASK(0x0780, 0x3F)) {
246 cA
.W(rA
^ get_mem(code
& 0x3F));
248 } else if (CODE_MASK(0x0580, 0x3F)) {
250 int store
= rA
^ get_mem(code
& 0x3F);
252 wr8(code
& 0x3F, store
);
253 } else if (CODE_MASK(0x0060, 0x1F)) {
255 sfr
->write(code
& 0x1F, rA
^ get_io(code
& 0x1F));
256 } else if (code
== 0x0018) {
260 } else if (CODE_MASK(0x0A00, 0x3F)) {
262 int store
= (~get_mem(code
& 0x3F) & 0xff);
264 wr8(code
& 0x3F, store
);
265 } else if (code
== 0x0019) {
269 } else if (CODE_MASK(0x0A40, 0x3F)) {
271 int store
= (-get_mem(code
& 0x3F) & 0xff);
273 wr8(code
& 0x3F, store
);
274 } else if (CODE_MASK(0x0E00, 0xFF)) {
276 const u8_t bit
= (code
& 0xE0) >> 5;
277 const u8_t addr
= code
& 0x1F;
278 sfr
->write(addr
, get_io(addr
) & ~(1 << bit
));
279 } else if (CODE_MASK(0x0300, 0xEF)) {
281 const u8_t bit
= (code
& 0xE0) >> 5;
282 const u8_t addr
= code
& 0x0F;
283 wr8(addr
, get_mem(addr
) & ~(1 << bit
));
284 } else if (CODE_MASK(0x0F00, 0xFF)) {
286 const u8_t bit
= (code
& 0xE0) >> 5;
287 const u8_t addr
= code
& 0x1F;
288 sfr
->write(addr
, get_io(addr
) | (1 << bit
));
289 } else if (CODE_MASK(0x0310, 0xEF)) {
291 const u8_t bit
= (code
& 0xE0) >> 5;
292 const u8_t addr
= code
& 0x0F;
293 wr8(addr
, get_mem(addr
) | (1 << bit
));
294 } else if (CODE_MASK(0x0C00, 0xFF)) {
296 int n
= (code
& 0xE0) >> 5;
297 if (!(get_io(code
& 0x1F) & (1 << n
)))
299 } else if (CODE_MASK(0x0200, 0xEF)) {
301 int n
= (code
& 0xE0) >> 5;
302 if (!(get_mem(code
& 0x0F) & (1 << n
)))
304 } else if (CODE_MASK(0x0D00, 0xFF)) {
306 int n
= (code
& 0xE0) >> 5;
307 if (get_io(code
& 0x1F) & (1 << n
))
309 } else if (CODE_MASK(0x0210, 0xEF)) {
311 int n
= (code
& 0xE0) >> 5;
312 if (get_mem(code
& 0x0F) & (1 << n
))
314 } else if (CODE_MASK(0x1200, 0xFF)) {
316 sub_to(rA
, code
& 0xFF);
317 if (rA
== (code
& 0xFF))
319 } else if (CODE_MASK(0x0B80, 0x3F)) {
321 int addr
= code
& 0x3F;
322 sub_to(rA
, get_mem(addr
));
323 if (rA
== get_mem(addr
))
325 } else if (code
== 0x0012) {
330 } else if (CODE_MASK(0x0880, 0x3F)) {
332 const int addr
= code
& 0x3F;
333 int result
= add_to(get_mem(addr
), 1);
337 } else if (code
== 0x0013) {
342 } else if (CODE_MASK(0x08C0, 0x3F)) {
344 const int addr
= code
& 0x3F;
345 int result
= sub_to(get_mem(addr
), 1);
349 } else if (CODE_MASK(0x1C00, 0x3FF)) {
354 } else if (CODE_MASK(0x1800, 0x3FF)) {
358 } else if (code
== 0x001E) {
361 cA
.W((high
<< 4) | (rA
>> 4));
362 } else if (code
== 0x0017) {
365 } else if (code
== 0x0038) {
367 } else if (code
== 0x0039) {
370 else if (code
== 0x0036) {
372 if (puc
) puc
->mode
= pm_pd
;
374 else if (code
== 0x0037) {
376 if (puc
) puc
->mode
= pm_ps
;
378 else if (code
== 0x0035) {
382 else if (code
== 0x0030) {
384 if (puc
) puc
->wdt
->clear();
386 else if (code
== 0x0006) {
388 cA
.W(rom
->read(rSP
) & 0xFF);
389 } else if (code
== 0x0007) {
391 //rA = (rom->get(rSP) & 0xFF00) >> 8;
392 cA
.W(rom
->read(rSP
+1));
393 } else if (code
== 0x003C) {
395 unsigned result
= rA
* get_io(0x08);
397 if (puc
) puc
->rMULRH
= result
>> 8;
399 return (resINV_INST
);
405 /* End of pdk.src/pdk13.cc */