Mercurial > repos > blastem
comparison svp.cpu @ 1692:5dacaef602a7 segacd
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 05 Jan 2019 00:58:08 -0800 |
parents | 4bb2c8b78b4a |
children |
comparison
equal
deleted
inserted
replaced
1504:95b3a1a8b26c | 1692:5dacaef602a7 |
---|---|
1 info | |
2 prefix svp_ | |
3 opcode_size 16 | |
4 body svp_run_op | |
5 header svp.h | |
6 include svp_util.c | |
7 | |
8 regs | |
9 internal 16 scratch2 x y pad0 st pad1 pc | |
10 a 32 | |
11 scratch1 32 | |
12 rom ptr16 | |
13 stack 16 stack0 stack1 stack2 stack3 stack4 stack5 | |
14 stackidx 8 | |
15 p 32 | |
16 external 16 pm0 pm1 pm2 xst pm4 ext5 pmc | |
17 pointers0 8 r0 r1 r2 r3 | |
18 pointers1 8 r4 r5 r6 r7 | |
19 pm_address 32 5 | |
20 pm_mode 8 5 | |
21 | |
22 iram 16 1024 | |
23 ram0 16 256 | |
24 ram1 16 256 | |
25 zflag 8 | |
26 nflag 8 | |
27 rpl 16 | |
28 | |
29 flags | |
30 register st | |
31 Z 13 zero zflag | |
32 N 15 sign nflag | |
33 R 0-2 none rpl | |
34 | |
35 svp_pop | |
36 mov stack.stackidx dst | |
37 add 1 stackidx stackidx | |
38 switch stackidx | |
39 case 6 | |
40 mov 0 stackidx | |
41 end | |
42 | |
43 svp_push | |
44 arg src 16 | |
45 sub 1 stackidx stackidx | |
46 switch stackidx | |
47 case 0xFF | |
48 mov 5 stackidx | |
49 end | |
50 mov src stack.stackidx | |
51 | |
52 svp_ram_read | |
53 arg mode 16 | |
54 arg banki 16 | |
55 arg regi 16 | |
56 local idx 16 | |
57 | |
58 switch banki | |
59 case 0 | |
60 meta bank ram0 | |
61 meta reg pointers0.regi | |
62 | |
63 default | |
64 meta bank ram1 | |
65 meta reg pointers1.regi | |
66 end | |
67 | |
68 mov reg idx | |
69 switch mode | |
70 case 0 | |
71 meta modestr "" | |
72 | |
73 case 1 | |
74 meta modestr +! | |
75 add 1 reg reg | |
76 | |
77 case 2 | |
78 #loop decremenet | |
79 meta modestr - | |
80 | |
81 if rpl | |
82 local tmp 16 | |
83 mov reg tmp | |
84 lsl 1 rpl rpl | |
85 sub 1 rpl rpl | |
86 local mask 16 | |
87 not rpl mask | |
88 and reg mask reg | |
89 sub 1 tmp tmp | |
90 and rpl tmp tmp | |
91 or tmp reg reg | |
92 else | |
93 sub 1 reg reg | |
94 end | |
95 | |
96 case 3 | |
97 #loop increment | |
98 meta modestr + | |
99 | |
100 and 7 st rpl | |
101 if rpl | |
102 local tmp 16 | |
103 mov reg tmp | |
104 lsl 1 rpl rpl | |
105 sub 1 rpl rpl | |
106 local mask 16 | |
107 not rpl mask | |
108 and reg mask reg | |
109 add 1 tmp tmp | |
110 and rpl tmp tmp | |
111 or tmp reg reg | |
112 else | |
113 sub 1 reg reg | |
114 end | |
115 end | |
116 | |
117 and 255 idx idx | |
118 meta val bank.idx | |
119 | |
120 svp_read_ext | |
121 arg regidxr 16 | |
122 switch regidxr | |
123 case 7 | |
124 meta val a | |
125 | |
126 default | |
127 #TODO: PMAR stuff | |
128 meta val external.regidxr | |
129 end | |
130 | |
131 svp_write_ext | |
132 arg regidxw 16 | |
133 switch regidxw | |
134 case 7 | |
135 and 0xFFFF0000 a a | |
136 or src a a | |
137 | |
138 default | |
139 #TODO: PMAR stuff | |
140 mov src external.regidxw | |
141 end | |
142 | |
143 svp_alu_op | |
144 arg P 16 | |
145 arg param 32 | |
146 | |
147 switch P | |
148 case 1 | |
149 dis "sub %s" name | |
150 sub param a a | |
151 | |
152 case 3 | |
153 dis "cmp %s" name | |
154 cmp param a | |
155 | |
156 case 4 | |
157 dis "add %s" name | |
158 add param a a | |
159 | |
160 case 5 | |
161 dis "and %s" name | |
162 and param a a | |
163 | |
164 case 6 | |
165 dis "or %s" name | |
166 or param a a | |
167 | |
168 case 7 | |
169 dis "eor %s" name | |
170 xor param a a | |
171 end | |
172 update_flags ZN | |
173 | |
174 svp_check_cond | |
175 arg fval 16 | |
176 arg cond 16 | |
177 local invert 8 | |
178 switch cond | |
179 case 0 | |
180 meta flag 1 | |
181 | |
182 case 5 | |
183 meta flag zflag | |
184 | |
185 case 7 | |
186 meta flag nflag | |
187 | |
188 default | |
189 meta flag 0 | |
190 end | |
191 | |
192 if fval | |
193 meta istrue flag | |
194 | |
195 else | |
196 lnot flag invert | |
197 meta istrue invert | |
198 | |
199 end | |
200 | |
201 PPP0000000000000 alu_n1 | |
202 invalid P 0 | |
203 invalid P 2 | |
204 meta name "-" | |
205 svp_alu_op P 0xFFFF0000 | |
206 | |
207 PPP0000000000RRR alu_r | |
208 invalid P 0 | |
209 invalid P 2 | |
210 local tmp 32 | |
211 lsl internal.R 16 tmp | |
212 meta name internal.R | |
213 svp_alu_op P tmp | |
214 | |
215 PPP0000000000011 alu_a | |
216 invalid P 0 | |
217 invalid P 2 | |
218 svp_alu_op P a | |
219 | |
220 PPP0000000000101 alu_stack | |
221 invalid P 0 | |
222 invalid P 2 | |
223 local tmp 32 | |
224 meta dst tmp | |
225 svp_pop | |
226 meta name "stack" | |
227 svp_alu_op P tmp | |
228 | |
229 PPP0000000000111 alu_p | |
230 invalid P 0 | |
231 invalid P 2 | |
232 meta name p | |
233 svp_alu_op P p | |
234 | |
235 PPP0000000001RRR alu_ext | |
236 invalid P 0 | |
237 invalid P 2 | |
238 local tmp 32 | |
239 svp_read_ext R | |
240 lsl val 16 tmp | |
241 meta name val | |
242 svp_alu_op P tmp | |
243 | |
244 PPP0001B0000MMRR alu_ram | |
245 invalid P 0 | |
246 invalid P 2 | |
247 svp_ram_read M B R | |
248 local tmp 32 | |
249 lsl val 16 tmp | |
250 | |
251 switch P | |
252 case 1 | |
253 dis "sub (%s%s)" reg modestr | |
254 sub tmp a a | |
255 | |
256 case 3 | |
257 dis "cmp (%s%s)" reg modestr | |
258 cmp tmp a | |
259 | |
260 case 4 | |
261 dis "add (%s%s)" reg modestr | |
262 add tmp a a | |
263 | |
264 case 5 | |
265 dis "and (%s%s)" reg modestr | |
266 and tmp a a | |
267 | |
268 case 6 | |
269 dis "or (%s%s)" reg modestr | |
270 or tmp a a | |
271 | |
272 case 7 | |
273 dis "eor (%s%s)" reg modestr | |
274 xor tmp a a | |
275 end | |
276 | |
277 update_flags ZN | |
278 | |
279 PPP0101B0000MMRR alu_ram_indirect | |
280 invalid P 0 | |
281 invalid P 2 | |
282 svp_ram_read M B R | |
283 svp_prog_ram_read val | |
284 local tmp 32 | |
285 lsl scratch1 16 tmp | |
286 | |
287 switch P | |
288 case 1 | |
289 dis "sub ((%s%s))" reg modestr | |
290 sub tmp a a | |
291 | |
292 case 3 | |
293 dis "cmp ((%s%s))" reg modestr | |
294 cmp tmp a | |
295 | |
296 case 4 | |
297 dis "add ((%s%s))" reg modestr | |
298 add tmp a a | |
299 | |
300 case 5 | |
301 dis "and ((%s%s))" reg modestr | |
302 and tmp a a | |
303 | |
304 case 6 | |
305 dis "or ((%s%s))" reg modestr | |
306 or tmp a a | |
307 | |
308 case 7 | |
309 dis "eor ((%s%s))" reg modestr | |
310 xor tmp a a | |
311 end | |
312 | |
313 update_flags ZN | |
314 | |
315 PPP0000000001111 alu_al | |
316 invalid P 0 | |
317 invalid P 2 | |
318 local tmp 32 | |
319 lsl a 16 tmp | |
320 | |
321 meta name al | |
322 svp_alu_op P tmp | |
323 | |
324 PPP0011JAAAAAAAA alu_ram_direct | |
325 invalid P 0 | |
326 invalid P 2 | |
327 if J | |
328 meta src ram1.A | |
329 else | |
330 meta src ram0.A | |
331 end | |
332 svp_alu_op P src | |
333 | |
334 PPP0010000000000 alu_immed | |
335 invalid P 0 | |
336 invalid P 2 | |
337 svp_op_fetch | |
338 svp_alu_op P scratch1 | |
339 | |
340 1001000FCCCC0OOO cond_mod | |
341 svp_check_cond F C | |
342 if istrue | |
343 | |
344 switch O | |
345 case 2 | |
346 asr a 1 a | |
347 update_flags ZN | |
348 | |
349 case 3 | |
350 lsl a 1 a | |
351 update_flags ZN | |
352 | |
353 case 6 | |
354 neg a a | |
355 update_flags ZN | |
356 | |
357 case 7 | |
358 abs a a | |
359 update_flags N | |
360 end | |
361 end | |
362 | |
363 000000000DDD0SSS ld_int_int | |
364 dis "ld %s, %s" internal.D internal.S | |
365 mov internal.S internal.D | |
366 | |
367 000000000DDD0101 ld_int_stack | |
368 dis "ld %s, stack" internal.D | |
369 meta dst internal.D | |
370 svp_pop | |
371 | |
372 0000000000110101 ld_a_stack | |
373 dis "ld a, stack" | |
374 local tmp 32 | |
375 meta dst tmp | |
376 svp_pop | |
377 lsl tmp 16 tmp | |
378 and 0xFFFF a a | |
379 or tmp a a | |
380 | |
381 0000000001110101 ld_p_stack | |
382 dis "ld p, stack" | |
383 local tmp 32 | |
384 meta dst tmp | |
385 svp_pop | |
386 lsl tmp 16 tmp | |
387 and 0xFFFF p p | |
388 or tmp p p | |
389 | |
390 0000000001010SSS ld_stack_int | |
391 dis "ld stack, %s" internal.S | |
392 svp_push internal.S | |
393 | |
394 0000000001010011 ld_stack_a | |
395 dis "ld stack, a" | |
396 local tmp 32 | |
397 lsr a 16 tmp | |
398 svp_push tmp | |
399 | |
400 0000000001010111 ld_stack_p | |
401 dis "ld stack, p" | |
402 local tmp 32 | |
403 lsr p 16 tmp | |
404 svp_push tmp | |
405 | |
406 0000000000000000 ld_n1_n1 | |
407 #nop? | |
408 dis "ld -, -" | |
409 | |
410 0000000000000SSS ld_n1_int | |
411 #nop? | |
412 dis "nop??" | |
413 | |
414 0000000000110111 ld_a_p | |
415 dis "ld a, p" | |
416 mov p a | |
417 | |
418 0000000001110011 ld_p_a | |
419 dis "ld p, a" | |
420 mov a p | |
421 | |
422 0000000000110011 ld_a_a | |
423 dis "ld a, a" | |
424 mov a a | |
425 | |
426 0000000001110111 ld_p_p | |
427 dis "ld p, p" | |
428 mov p p | |
429 | |
430 000000000DDD0111 ld_int_p | |
431 local tmp 32 | |
432 lsr p 16 tmp | |
433 mov tmp internal.D | |
434 dis "ld %s, p" internal.D | |
435 | |
436 000000000DDD0111 ld_int_a | |
437 local tmp 32 | |
438 lsr a 16 tmp | |
439 mov tmp internal.D | |
440 dis "ld %s, a" internal.D | |
441 | |
442 0000000001110SSS ld_p_int | |
443 local tmp 32 | |
444 lsl internal.S 16 tmp | |
445 mov tmp p | |
446 dis "ld p, %s" internal.S | |
447 | |
448 0000000000110SSS ld_a_int | |
449 local tmp 32 | |
450 lsl internal.S 16 tmp | |
451 mov tmp a | |
452 dis "ld a, %s" internal.S | |
453 | |
454 000000000DDD0000 ld_int_n1 | |
455 dis "ld %s, -" internal.D | |
456 mov 0xFFFF internal.D | |
457 | |
458 0000000000110000 ld_a_n1 | |
459 dis "ld a, -" | |
460 and 0xFFFF a a | |
461 or 0xFFFF0000 a a | |
462 | |
463 0000000001110000 ld_p_n1 | |
464 dis "ld p, -" | |
465 and 0xFFFF p p | |
466 or 0xFFFF0000 p p | |
467 | |
468 000000000DDD1SSS ld_int_ext | |
469 svp_read_ext S | |
470 dis "ld %s, %s" internal.D val | |
471 mov val internal.D | |
472 | |
473 0000000000111SSS ld_a_ext | |
474 svp_read_ext S | |
475 dis "ld a, %s" val | |
476 local tmp 32 | |
477 lsl val 16 tmp | |
478 and 0xFFFF a a | |
479 or tmp a a | |
480 | |
481 0000000001111SSS ld_p_ext | |
482 svp_read_ext S | |
483 dis "ld p, %s" val | |
484 local tmp 32 | |
485 lsl val 16 tmp | |
486 and 0xFFFF p p | |
487 or tmp p p | |
488 | |
489 000000001DDD0SSS ld_ext_int | |
490 meta src internal.S | |
491 svp_write_ext D | |
492 switch D | |
493 case 7 | |
494 dis "ld al, %s" src | |
495 | |
496 default | |
497 dis "ld %s, %s" external.D src | |
498 end | |
499 | |
500 000000001DDD0011 ld_ext_a | |
501 local tmp 32 | |
502 lsr a 16 tmp | |
503 meta src tmp | |
504 svp_write_ext D | |
505 switch D | |
506 case 7 | |
507 dis "ld al, a" | |
508 | |
509 default | |
510 dis "ld %s, a" external.D | |
511 end | |
512 | |
513 000000001DDD0111 ld_ext_p | |
514 local tmp 32 | |
515 lsr p 16 tmp | |
516 meta src tmp | |
517 svp_write_ext D | |
518 switch D | |
519 case 7 | |
520 dis "ld al, p" | |
521 | |
522 default | |
523 dis "ld %s, p" external.D | |
524 end | |
525 | |
526 | |
527 000000001DDD1SSS ld_ext_ext | |
528 svp_read_ext S | |
529 meta src val | |
530 svp_write_ext D | |
531 switch D | |
532 case 7 | |
533 dis "ld al, %s" src | |
534 default | |
535 dis "ld %s, %s" external.D src | |
536 end | |
537 | |
538 0000001B0DDDMMPP ld_int_ram | |
539 svp_ram_read M B P | |
540 dis "ld %s, (%s%s)" internal.D reg modestr | |
541 mov val internal.D | |
542 | |
543 0000001B0011MMPP ld_a_ram | |
544 svp_ram_read M B P | |
545 dis "ld a, (%s%s)" reg modestr | |
546 local tmp 32 | |
547 lsl val 16 tmp | |
548 and 0xFFFF a a | |
549 or tmp a a | |
550 | |
551 0000001B0111MMPP ld_p_ram | |
552 svp_ram_read M B P | |
553 dis "ld p, (%s%s)" reg modestr | |
554 local tmp 32 | |
555 lsl val 16 tmp | |
556 and 0xFFFF p p | |
557 or tmp p p | |
558 | |
559 0000001B0101MMPP ld_stack_ram | |
560 svp_ram_read M B P | |
561 dis "ld stack, (%s%s)" reg modestr | |
562 svp_push val | |
563 | |
564 000010000DDD0000 ld_int_immed | |
565 svp_op_fetch | |
566 dis "ld %s, %X" internal.D scratch1 | |
567 mov scratch1 internal.D | |
568 | |
569 0000100000000000 ld_n1_immed | |
570 svp_op_fetch | |
571 dis "ld -, %X" scratch1 | |
572 | |
573 0000100000110000 ld_a_immed | |
574 local tmp 32 | |
575 svp_op_fetch | |
576 dis "ld a, %X" scratch1 | |
577 lsl 16 scratch1 tmp | |
578 and 0xFFFF a a | |
579 or tmp a a | |
580 | |
581 0000100001010000 ld_stack_immed | |
582 svp_op_fetch | |
583 dis "ld stack, %X" scratch1 | |
584 svp_push scratch1 | |
585 | |
586 0000100001110000 ld_p_immed | |
587 local tmp 32 | |
588 svp_op_fetch | |
589 dis "ld p, %X" scratch1 | |
590 lsl 16 scratch1 tmp | |
591 and 0xFFFF p p | |
592 or tmp p p | |
593 | |
594 000010001DDD0000 ld_ext_immed | |
595 svp_op_fetch | |
596 dis "ld %s, %X", external.D, scratch1 | |
597 meta src scratch1 | |
598 svp_write_ext D | |
599 switch D | |
600 case 7 | |
601 dis "ld al, %X" scratch1 | |
602 | |
603 default | |
604 dis "ld %s, %X" external.D scratch1 | |
605 end | |
606 | |
607 0100100FCCCC0000 call_cond | |
608 svp_check_cond F C | |
609 svp_op_fetch | |
610 | |
611 if istrue | |
612 svp_push pc | |
613 mov scratch1 pc | |
614 end | |
615 | |
616 0100110FCCCC0000 bra_cond | |
617 svp_check_cond F C | |
618 svp_op_fetch | |
619 if istrue | |
620 mov scratch1 pc | |
621 end | |
622 | |
623 svp_prog_ram_read | |
624 arg src 16 | |
625 cycles 1 | |
626 cmp 1024 src | |
627 | |
628 if >=U | |
629 add src src scratch1 | |
630 ocall prog_read_16 | |
631 | |
632 else | |
633 mov iram.src scratch1 | |
634 end | |
635 | |
636 svp_op_fetch | |
637 svp_prog_ram_read pc | |
638 add 1 pc pc | |
639 | |
640 svp_run_op | |
641 svp_op_fetch | |
642 dispatch scratch1 |