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