comparison m68k.cpu @ 2053:3414a4423de1 segacd

Merge from default
author Michael Pavone <pavone@retrodev.com>
date Sat, 15 Jan 2022 13:15:21 -0800
parents 7d4df6b74263
children d1eec03dca09
comparison
equal deleted inserted replaced
1692:5dacaef602a7 2053:3414a4423de1
1 info
2 prefix m68k_
3 opcode_size 16
4 body m68k_run_op
5 header m68k.h
6 interrupt m68k_interrupt
7 include m68k_util.c
8 sync_cycle m68k_sync_cycle
9
10 declare
11 typedef m68k_context *(*m68k_reset_handler)(m68k_context *context);
12 void init_m68k_opts(m68k_options *opts, memmap_chunk * memmap, uint32_t num_chunks, uint32_t clock_divider);
13 m68k_context *init_68k_context(m68k_options * opts, m68k_reset_handler reset_handler);
14 void m68k_reset(m68k_context *context);
15 void m68k_print_regs(m68k_context *context);
16
17 regs
18 dregs 32 d0 d1 d2 d3 d4 d5 d6 d7
19 aregs 32 a0 a1 a2 a3 a4 a5 a6 a7
20 pc 32
21 other_sp 32
22 scratch1 32
23 scratch2 32
24 int_cycle 32
25 prefetch 16
26 int_priority 8
27 int_num 8
28 int_pending 8
29 int_pending_num 8
30 int_ack 8
31 status 8
32 ccr 8
33 xflag 8
34 nflag 8
35 zflag 8
36 vflag 8
37 cflag 8
38 reset_handler ptrvoid
39 mem_pointers ptrvoid 8
40
41 flags
42 register ccr
43 X 4 carry xflag
44 N 3 sign nflag
45 Z 2 zero zflag
46 V 1 overflow vflag
47 C 0 carry cflag
48
49 m68k_prefetch
50 if dynarec
51
52 ccall m68k_read16_noinc context pc
53 mov result prefetch
54
55 end
56
57 if interp
58
59 mov pc scratch1
60 ocall read_16
61 mov scratch1 prefetch
62
63 end
64
65 add 2 pc pc
66
67 check_user_mode_swap_ssp_usp
68 local tmp 8
69 and 0x20 status tmp
70 if tmp
71 else
72
73 xchg other_sp a7
74
75 end
76
77 m68k_get_sr
78 lsl status 8 scratch1
79 or ccr scratch1 scratch1
80
81 m68k_write32_lowfirst
82 arg value 32
83 add 2 scratch2 scratch2
84 mov value scratch1
85 ocall write_16
86
87 sub 2 scratch2 scratch2
88 lsr value 16 scratch1
89 ocall write_16
90
91 m68k_write32
92 arg value 32
93 local tmp 32
94 mov value tmp
95 lsr value 16 scratch1
96 ocall write_16
97
98 add 2 scratch2 scratch2
99 mov tmp scratch1
100 ocall write_16
101
102 m68k_read32
103 local tmp 32
104 add 2 scratch1 tmp
105 ocall read_16
106 xchg scratch1 tmp
107 ocall read_16
108 lsl tmp 16 tmp
109 or tmp scratch1 scratch1
110
111 m68k_interrupt
112 cmp int_cycle cycles
113 if >=U
114
115 #INT_PENDING_NONE
116 cmp 255 int_pending
117 if =
118
119 mov int_priority int_pending
120 mov int_num int_pending_num
121
122 else
123
124 #INT_PENDING_SR_CHANGE
125 cmp 254 int_pending
126 if =
127
128 mov int_priority int_pending
129 mov int_num int_pending_num
130
131 else
132
133 check_user_mode_swap_ssp_usp
134
135 cycles 6
136 #save status reg
137 sub 6 a7 a7
138 m68k_get_sr
139 mov a7 scratch2
140 ocall write_16
141
142 #update status register
143 and 0x78 status status
144 or int_priority status status
145 or 0x20 status status
146
147 #Interrupt ack cycle
148 mov int_pending int_ack
149 if int_pending_num
150 cycles 4
151 else
152 #TODO: do the whole E clock variable latency nonsense
153 cycles 13
154 add 24 int_pending int_pending_num
155 end
156
157 #save pc
158 add 2 a7 scratch2
159 m68k_write32_lowfirst pc
160
161 lsl int_pending_num 2 scratch1
162 m68k_read32
163 mov scratch1 pc
164 update_sync
165 end
166
167 m68k_run_op
168 dispatch prefetch
169
170 m68k_mem_src
171 arg address 32
172 arg size 16
173 arg isdst 8
174 mov address scratch1
175 if isdst
176 mov address scratch2
177 meta ismem 1
178 end
179 switch size
180
181 case 0
182 ocall read_8
183
184 case 1
185 ocall read_16
186
187 case 2
188 m68k_read32
189
190 end
191 meta op scratch1
192
193 m68k_write_size
194 arg size 16
195 arg lowfirst 8
196 switch size
197 case 0
198 ocall write_8
199
200 case 1
201 ocall write_16
202
203 case 2
204 if lowfirst
205 m68k_write32_lowfirst scratch1
206 else
207 m68k_write32 scratch1
208 end
209 end
210
211 m68k_index_word
212 m68k_prefetch
213 local disp 32
214 and prefetch 255 disp
215 sext 16 disp disp
216 sext 32 disp disp
217 local index 16
218 lsr prefetch 12 index
219 local isareg 16
220 and index 8 isareg
221 and index 7 index
222 local islong 16
223 and prefetch 2048 islong
224
225 switch isareg
226 case 0
227 switch islong
228 case 0
229 sext 32 dregs.index scratch1
230 case 2048
231 mov dregs.index scratch1
232 end
233 case 8
234 switch islong
235 case 0
236 sext 32 aregs.index scratch1
237 case 2048
238 mov aregs.index scratch1
239 end
240 end
241 add disp scratch1 scratch1
242
243 m68k_fetch_op_ea
244 arg mode 16
245 arg reg 16
246 arg Z 16
247 arg isdst 8
248 switch mode
249
250 case 0
251 #data reg direct
252 meta op dregs.reg
253 if isdst
254 meta ismem 0
255 end
256
257 case 1
258 #address reg direct
259 meta op aregs.reg
260 if isdst
261 meta ismem 0
262 end
263
264 case 2
265 #address reg indirect
266 m68k_mem_src aregs.reg Z isdst
267
268 case 3
269 #postincrement
270 m68k_mem_src aregs.reg Z isdst
271 switch reg
272 case 7
273 if Z
274 addsize Z aregs.reg aregs.reg
275 else
276 addsize 1 aregs.reg aregs.reg
277 end
278 default
279 addsize Z aregs.reg aregs.reg
280 end
281
282 case 4
283 #predecrement
284 switch reg
285 case 7
286 if Z
287 decsize Z aregs.reg aregs.reg
288 else
289 decsize 1 aregs.reg aregs.reg
290 end
291 default
292 decsize Z aregs.reg aregs.reg
293 end
294 cycles 2
295 m68k_mem_src aregs.reg Z isdst
296
297 case 5
298 #displacement
299 m68k_prefetch
300 sext 32 prefetch scratch1
301 add scratch1 aregs.reg scratch1
302 m68k_mem_src scratch1 Z isdst
303
304 case 6
305 #indexed
306 m68k_index_word
307 add aregs.reg scratch1 scratch1
308
309 m68k_mem_src scratch1 Z isdst
310 case 7
311 #pc-relative and absolute modes
312
313 switch reg
314 case 0
315 #absolute short
316 m68k_prefetch
317 sext 32 prefetch scratch1
318 m68k_mem_src scratch1 Z isdst
319
320 case 1
321 #absolute long
322 local address 32
323 m68k_prefetch
324 lsl prefetch 16 address
325 m68k_prefetch
326 or prefetch address scratch1
327 m68k_mem_src scratch1 Z isdst
328
329 case 2
330 #pc displaceent
331 m68k_prefetch
332 sext 32 prefetch scratch1
333 add scratch1 pc scratch1
334 sub 2 scratch1 scratch1
335 m68k_mem_src scratch1 Z isdst
336
337 case 3
338 #pc indexed
339 m68k_index_word
340 add pc scratch1 scratch1
341 sub 2 scratch1 scratch1
342 m68k_mem_src scratch1 Z isdst
343
344 case 4
345 #immediate
346 switch Z
347 case 2
348 local tmp32 32
349 m68k_prefetch
350 lsl prefetch 16 tmp32
351 m68k_prefetch
352 or prefetch tmp32 scratch1
353
354 default
355 m68k_prefetch
356 mov prefetch scratch1
357 end
358 meta op scratch1
359
360 end
361
362 end
363
364 m68k_fetch_src_ea
365 arg mode 16
366 arg reg 16
367 arg Z 16
368 m68k_fetch_op_ea mode reg Z 0
369 meta src op
370 switch mode
371 case 0
372 meta src_is_mem 0
373 case 1
374 meta src_is_mem 0
375 default
376 meta src_is_mem 1
377 end
378
379 m68k_fetch_dst_ea
380 arg mode 16
381 arg reg 16
382 arg Z 16
383 m68k_fetch_op_ea mode reg Z 1
384 meta dst op
385
386 m68k_save_dst
387 arg Z 16
388 if ismem
389 m68k_write_size Z 0
390 end
391
392 1101DDD0ZZMMMRRR add_ea_dn
393 invalid M 7 R 5
394 invalid M 7 R 6
395 invalid M 7 R 7
396 invalid Z 3
397 m68k_fetch_src_ea M R Z
398
399 add src dregs.D dregs.D Z
400 update_flags XNZVC
401 m68k_prefetch
402
403 1101DDD1ZZMMMRRR add_dn_ea
404 invalid M 0
405 invalid M 1
406 invalid M 7 R 2
407 invalid M 7 R 3
408 invalid M 7 R 4
409 invalid M 7 R 5
410 invalid M 7 R 6
411 invalid M 7 R 7
412 invalid Z 3
413 m68k_fetch_dst_ea M R Z
414
415 add dregs.D dst dst Z
416 update_flags XNZVC
417 m68k_save_dst Z
418 m68k_prefetch
419
420 1101AAAZ11MMMRRR adda
421 invalid M 7 R 5
422 invalid M 7 R 6
423 invalid M 7 R 7
424 local size 16
425 local ext_src 32
426 if Z
427 mov 2 size
428 else
429 mov 1 size
430 end
431 m68k_fetch_src_ea M R size
432 switch size
433 case 1
434 sext 32 src ext_src
435 meta src ext_src
436 end
437
438 add src aregs.A aregs.A
439 m68k_prefetch
440
441 00000110ZZMMMRRR addi
442 local immed 32
443 invalid Z 3
444 invalid M 1
445 invalid M 7 R 2
446 invalid M 7 R 3
447 invalid M 7 R 4
448 invalid M 7 R 5
449 invalid M 7 R 6
450 invalid M 7 R 7
451 #fetch immediate operand
452 m68k_prefetch
453 switch Z
454 case 2
455 lsl prefetch 16 immed
456 m68k_prefetch
457 or prefetch immed immed
458 default
459 mov prefetch immed
460 end
461 #fetch dst EA
462 m68k_fetch_dst_ea M R Z
463
464 add immed dst dst Z
465 update_flags XNZVC
466 m68k_save_dst Z
467 m68k_prefetch
468
469 0101III0ZZMMMRRR addq
470 invalid Z 3
471 invalid M 7 R 2
472 invalid M 7 R 3
473 invalid M 7 R 4
474 invalid M 7 R 5
475 invalid M 7 R 6
476 invalid M 7 R 7
477 local src 32
478 switch I
479 case 0
480 mov 8 src
481 default
482 mov I src
483 end
484
485 m68k_fetch_dst_ea M R Z
486 switch M
487 case 1
488 add src dst dst Z
489 default
490 add src dst dst Z
491 update_flags XNZVC
492 end
493 m68k_save_dst Z
494 m68k_prefetch
495
496 1101DDD1ZZ000SSS addx_dy_dx
497 invalid Z 3
498 adc dregs.S dregs.D dregs.D Z
499 update_flags XNVC
500 switch Z
501 case 0
502 local tmp8 8
503 mov dregs.D tmp8
504 if tmp8
505 update_flags Z0
506 end
507 case 1
508 local tmp16 16
509 mov dregs.D tmp16
510 if tmp16
511 update_flags Z0
512 end
513 case 2
514 if dregs.D
515 update_flags Z0
516 end
517 end
518 m68k_prefetch
519
520 1101DDD1ZZ001SSS addx_ay_ax
521 invalid Z 3
522 if Z
523 decsize Z aregs.S aregs.S
524 else
525 switch S
526 case 7
527 sub 2 aregs.S aregs.S
528 default
529 decsize Z aregs.S aregs.S
530 end
531 end
532 mov aregs.S scratch1
533 switch Z
534 case 0
535 ocall read_8
536 case 1
537 ocall read_16
538 case 2
539 m68k_read32
540 end
541 mov scratch1 scratch2
542 if Z
543 decsize Z aregs.D aregs.D
544 else
545 switch D
546 case 7
547 sub 2 aregs.D aregs.D
548 default
549 decsize Z aregs.D aregs.D
550 end
551 end
552 mov aregs.D scratch1
553 switch Z
554 case 0
555 ocall read_8
556 case 1
557 ocall read_16
558 case 2
559 m68k_read32
560 end
561 adc scratch2 scratch1 scratch1 Z
562 update_flags XNVC
563 switch Z
564 case 0
565 local tmp8 8
566 mov dregs.D tmp8
567 if tmp8
568 update_flags Z0
569 end
570 case 1
571 local tmp16 16
572 mov dregs.D tmp16
573 if tmp16
574 update_flags Z0
575 end
576 case 2
577 if dregs.D
578 update_flags Z0
579 end
580 end
581 mov aregs.D scratch2
582 m68k_write_size Z 0
583 m68k_prefetch
584
585 1100DDD0ZZMMMRRR and_ea_dn
586 invalid M 1
587 invalid M 7 R 5
588 invalid M 7 R 6
589 invalid M 7 R 7
590 invalid Z 3
591 m68k_fetch_src_ea M R Z
592
593 and src dregs.D dregs.D Z
594 update_flags NZV0C0
595 m68k_prefetch
596
597 1100DDD1ZZMMMRRR and_dn_ea
598 invalid M 0
599 invalid M 1
600 invalid M 7 R 2
601 invalid M 7 R 3
602 invalid M 7 R 4
603 invalid M 7 R 5
604 invalid M 7 R 6
605 invalid M 7 R 7
606 invalid Z 3
607 m68k_fetch_dst_ea M R Z
608
609 and dregs.D dst dst Z
610 update_flags NZV0C0
611 m68k_save_dst Z
612 m68k_prefetch
613
614 00000010ZZMMMRRR andi
615 local immed 32
616 invalid Z 3
617 invalid M 1
618 invalid M 7 R 2
619 invalid M 7 R 3
620 invalid M 7 R 4
621 invalid M 7 R 5
622 invalid M 7 R 6
623 invalid M 7 R 7
624 #fetch immediate operand
625 m68k_prefetch
626 switch Z
627 case 2
628 lsl prefetch 16 immed
629 m68k_prefetch
630 or prefetch immed immed
631 default
632 mov prefetch immed
633 end
634 #fetch dst EA
635 m68k_fetch_dst_ea M R Z
636
637 and immed dst dst Z
638 update_flags NZV0C0
639 m68k_save_dst Z
640 m68k_prefetch
641
642 0000001000111100 andi_to_ccr
643 #fetch immediate operand
644 m68k_prefetch
645 and prefetch ccr ccr
646 m68k_prefetch
647
648 1011DDD1ZZMMMRRR eor_dn_ea
649 invalid M 1
650 invalid M 7 R 2
651 invalid M 7 R 3
652 invalid M 7 R 4
653 invalid M 7 R 5
654 invalid M 7 R 6
655 invalid M 7 R 7
656 invalid Z 3
657 m68k_fetch_dst_ea M R Z
658
659 xor dregs.D dst dst Z
660 update_flags NZV0C0
661 m68k_save_dst Z
662 m68k_prefetch
663
664 00001010ZZMMMRRR eori
665 local immed 32
666 invalid Z 3
667 invalid M 1
668 invalid M 7 R 2
669 invalid M 7 R 3
670 invalid M 7 R 4
671 invalid M 7 R 5
672 invalid M 7 R 6
673 invalid M 7 R 7
674 #fetch immediate operand
675 m68k_prefetch
676 switch Z
677 case 2
678 lsl prefetch 16 immed
679 m68k_prefetch
680 or prefetch immed immed
681 default
682 mov prefetch immed
683 end
684 #fetch dst EA
685 m68k_fetch_dst_ea M R Z
686
687 xor immed dst dst Z
688 update_flags NZV0C0
689 m68k_save_dst Z
690 m68k_prefetch
691
692 0000001000111100 eori_to_ccr
693 #fetch immediate operand
694 m68k_prefetch
695 xor prefetch ccr ccr
696 m68k_prefetch
697
698 1000DDD0ZZMMMRRR or_ea_dn
699 invalid M 1
700 invalid M 7 R 5
701 invalid M 7 R 6
702 invalid M 7 R 7
703 invalid Z 3
704 m68k_fetch_src_ea M R Z
705
706 or src dregs.D dregs.D Z
707 update_flags NZV0C0
708 m68k_prefetch
709
710 1000DDD1ZZMMMRRR or_dn_ea
711 invalid M 0
712 invalid M 1
713 invalid M 7 R 2
714 invalid M 7 R 3
715 invalid M 7 R 4
716 invalid M 7 R 5
717 invalid M 7 R 6
718 invalid M 7 R 7
719 invalid Z 3
720 m68k_fetch_dst_ea M R Z
721
722 or dregs.D dst dst Z
723 update_flags NZV0C0
724 m68k_save_dst Z
725 m68k_prefetch
726
727 00000000ZZMMMRRR ori
728 local immed 32
729 invalid Z 3
730 invalid M 1
731 invalid M 7 R 2
732 invalid M 7 R 3
733 invalid M 7 R 4
734 invalid M 7 R 5
735 invalid M 7 R 6
736 invalid M 7 R 7
737 #fetch immediate operand
738 m68k_prefetch
739 switch Z
740 case 2
741 lsl prefetch 16 immed
742 m68k_prefetch
743 or prefetch immed immed
744 default
745 mov prefetch immed
746 end
747 #fetch dst EA
748 m68k_fetch_dst_ea M R Z
749
750 or immed dst dst Z
751 update_flags NZV0C0
752 m68k_save_dst Z
753 m68k_prefetch
754
755 0000000000111100 ori_to_ccr
756 #fetch immediate operand
757 m68k_prefetch
758 or prefetch ccr ccr
759 m68k_prefetch
760
761 1001DDD0ZZMMMRRR sub_ea_dn
762 invalid M 7 R 5
763 invalid M 7 R 6
764 invalid M 7 R 7
765 invalid Z 3
766 m68k_fetch_src_ea M R Z
767
768 sub src dregs.D dregs.D Z
769 update_flags XNZVC
770 m68k_prefetch
771
772 1001DDD1ZZMMMRRR sub_dn_ea
773 invalid M 0
774 invalid M 1
775 invalid M 7 R 2
776 invalid M 7 R 3
777 invalid M 7 R 4
778 invalid M 7 R 5
779 invalid M 7 R 6
780 invalid M 7 R 7
781 invalid Z 3
782 m68k_fetch_dst_ea M R Z
783
784 sub dregs.D dst dst Z
785 update_flags XNZVC
786 m68k_save_dst Z
787 m68k_prefetch
788
789 1001AAAZ11MMMRRR suba
790 invalid M 7 R 5
791 invalid M 7 R 6
792 invalid M 7 R 7
793 local size 16
794 local ext_src 32
795 if Z
796 mov 2 size
797 else
798 mov 1 size
799 end
800 m68k_fetch_src_ea M R size
801 switch size
802 case 1
803 sext 32 src ext_src
804 meta src ext_src
805 end
806
807 sub src aregs.A aregs.A
808 m68k_prefetch
809
810 00000100ZZMMMRRR subi
811 local immed 32
812 invalid Z 3
813 invalid M 1
814 invalid M 7 R 2
815 invalid M 7 R 3
816 invalid M 7 R 4
817 invalid M 7 R 5
818 invalid M 7 R 6
819 invalid M 7 R 7
820 #fetch immediate operand
821 m68k_prefetch
822 switch Z
823 case 2
824 lsl prefetch 16 immed
825 m68k_prefetch
826 or prefetch immed immed
827 default
828 mov prefetch immed
829 end
830 #fetch dst EA
831 m68k_fetch_dst_ea M R Z
832
833 sub immed dst dst Z
834 update_flags XNZVC
835 m68k_save_dst Z
836 m68k_prefetch
837
838 0101III1ZZMMMRRR subq
839 invalid Z 3
840 invalid M 7 R 2
841 invalid M 7 R 3
842 invalid M 7 R 4
843 invalid M 7 R 5
844 invalid M 7 R 6
845 invalid M 7 R 7
846 local src 32
847 switch I
848 case 0
849 mov 8 src
850 default
851 mov I src
852 end
853
854 m68k_fetch_dst_ea M R Z
855 switch M
856 case 1
857 sub src dst dst Z
858 default
859 sub src dst dst Z
860 update_flags XNZVC
861 end
862 m68k_save_dst Z
863 m68k_prefetch
864
865 1110CCC0ZZ001RRR lsri
866 invalid Z 3
867 switch C
868 case 0
869 meta shift 8
870 default
871 meta shift C
872 end
873 lsr dregs.R shift dregs.R Z
874 update_flags XNZV0C
875 add shift shift shift
876 switch Z
877 case 2
878 add 4 shift shift
879 default
880 add 2 shift shift
881 end
882 cycles shift
883 #TODO: should this happen before or after the majority of the shift?
884 m68k_prefetch
885
886 1110CCC0ZZ101RRR lsr_dn
887 invalid Z 3
888 local shift 8
889 and dregs.C 63 shift
890 lsr dregs.R shift dregs.R Z
891 update_flags XNZV0C
892 add shift shift shift
893 switch Z
894 case 2
895 add 4 shift shift
896 default
897 add 2 shift shift
898 end
899 cycles shift
900 #TODO: should this happen before or after the majority of the shift?
901 m68k_prefetch
902
903 1110001011MMMRRR lsr_ea
904 invalid M 0
905 invalid M 1
906 invalid M 7 R 2
907 invalid M 7 R 3
908 invalid M 7 R 4
909 invalid M 7 R 5
910 invalid M 7 R 6
911 invalid M 7 R 7
912
913 m68k_fetch_dst_ea M R 0
914 lsr dst 1 dst
915 update_flags XNZV0C
916 m68k_save_dst 0
917 m68k_prefetch
918
919 1110CCC1ZZ001RRR lsli
920 invalid Z 3
921 switch C
922 case 0
923 meta shift 8
924 default
925 meta shift C
926 end
927 lsl dregs.R shift dregs.R Z
928 update_flags XNZV0C
929 add shift shift shift
930 switch Z
931 case 2
932 add 4 shift shift
933 default
934 add 2 shift shift
935 end
936 cycles shift
937 #TODO: should this happen before or after the majority of the shift?
938 m68k_prefetch
939
940 1110CCC1ZZ101RRR lsl_dn
941 invalid Z 3
942 local shift 8
943 and dregs.C 63 shift
944 lsl dregs.R shift dregs.R Z
945 update_flags XNZV0C
946 add shift shift shift
947 switch Z
948 case 2
949 add 4 shift shift
950 default
951 add 2 shift shift
952 end
953 cycles shift
954 #TODO: should this happen before or after the majority of the shift?
955 m68k_prefetch
956
957 1110001111MMMRRR lsl_ea
958 invalid M 0
959 invalid M 1
960 invalid M 7 R 2
961 invalid M 7 R 3
962 invalid M 7 R 4
963 invalid M 7 R 5
964 invalid M 7 R 6
965 invalid M 7 R 7
966
967 m68k_fetch_dst_ea M R 0
968 lsl dst 1 dst
969 update_flags XNZV0C
970 m68k_save_dst 0
971 m68k_prefetch
972
973 00ZZRRRMMMEEESSS move
974 invalid Z 0
975 invalid M 1
976 invalid M 7 #not actually invalid, but will be handled separately due to DSL limitations
977 invalid E 7 S 5
978 invalid E 7 S 6
979 invalid E 7 S 7
980 local size 8
981 local memsrc 32
982 #move uses a different size format than most instructions
983 switch Z
984 case 1
985 mov 0 size
986 case 2
987 mov 2 size
988 case 3
989 mov 1 size
990 end
991 m68k_fetch_src_ea E S size
992
993 if src_is_mem
994 #avoid clobbering src if we need scratch1
995 mov src memsrc
996 meta src memsrc
997 end
998
999 cmp 0 src size
1000 update_flags NZV0C0
1001
1002 switch M
1003 case 0
1004 mov src dregs.R size
1005
1006 case 2
1007 mov aregs.R scratch2
1008 mov src scratch1
1009 m68k_write_size size 0
1010
1011 case 3
1012 mov aregs.R scratch2
1013 mov src scratch1
1014 switch R
1015 case 7
1016 if size
1017 addsize size aregs.R aregs.R
1018 else
1019 addsize 1 aregs.R aregs.R
1020 end
1021 default
1022 addsize size aregs.R aregs.R
1023 end
1024 m68k_write_size size 0
1025
1026 case 4
1027 mov src scratch1
1028 switch R
1029 case 7
1030 if size
1031 decsize size aregs.R aregs.R
1032 else
1033 decsize 1 aregs.R aregs.R
1034 end
1035 default
1036 decsize size aregs.R aregs.R
1037 end
1038 mov aregs.R scratch2
1039 m68k_write_size size 1
1040
1041 case 5
1042 m68k_prefetch
1043 sext 32 prefetch scratch2
1044 add aregs.R scratch2 scratch2
1045 mov src scratch1
1046 m68k_write_size size 0
1047
1048 case 6
1049 m68k_index_word
1050 add aregs.R scratch1 scratch2
1051 mov src scratch1
1052 m68k_write_size size 0
1053 end
1054 m68k_prefetch
1055
1056
1057 00ZZ00M111EEESSS move_abs
1058 invalid E 7 S 5
1059 invalid E 7 S 6
1060 invalid E 7 S 7
1061 invalid Z 0
1062 local size 8
1063 local memsrc 32
1064 #move uses a different size format than most instructions
1065 switch Z
1066 case 1
1067 mov 0 size
1068 case 2
1069 mov 2 size
1070 case 3
1071 mov 1 size
1072 end
1073 m68k_fetch_src_ea E S size
1074
1075 if src_is_mem
1076 #avoid clobbering src if we need scratch1
1077 mov src memsrc
1078 meta src memsrc
1079 end
1080
1081 cmp 0 src size
1082 update_flags NZV0C0
1083
1084 switch M
1085 case 0
1086 m68k_prefetch
1087 sext 32 prefetch scratch2
1088
1089 case 1
1090 m68k_prefetch
1091 lsl prefetch 16 scratch2
1092 m68k_prefetch
1093 or prefetch scratch2 scratch2
1094 end
1095 mov src scratch1
1096 m68k_write_size size 0
1097 m68k_prefetch
1098
1099 00ZZRRR001EEESSS movea
1100 local size 8
1101 invalid Z 0
1102 invalid Z 1
1103 invalid E 7 S 5
1104 invalid E 7 S 6
1105 invalid E 7 S 7
1106 switch Z
1107 case 2
1108 mov 2 size
1109 case 3
1110 mov 1 size
1111 end
1112 m68k_fetch_src_ea E S size
1113 switch Z
1114 case 2
1115 mov src aregs.R
1116 case 3
1117 sext 32 src aregs.R
1118 end
1119 m68k_prefetch
1120
1121 0100010011MMMRRR move_to_ccr
1122 invalid M 1
1123 invalid M 7 R 5
1124 invalid M 7 R 6
1125 invalid M 7 R 7
1126 m68k_fetch_src_ea M R 1
1127 mov scratch1 ccr
1128 m68k_prefetch
1129
1130 0100011011MMMRRR move_to_sr
1131 invalid M 1
1132 invalid M 7 R 5
1133 invalid M 7 R 6
1134 invalid M 7 R 7
1135 m68k_fetch_src_ea M R 1
1136 mov scratch1 ccr
1137 lsr scratch1 8 status
1138 update_sync
1139 m68k_prefetch
1140
1141 0100000011MMMRRR move_from_sr
1142 invalid M 1
1143 invalid M 7 R 2
1144 invalid M 7 R 3
1145 invalid M 7 R 4
1146 invalid M 7 R 5
1147 invalid M 7 R 6
1148 invalid M 7 R 7
1149 m68k_fetch_dst_ea M R 1
1150 lsl status 8 scratch1
1151 or ccr scratch1 scratch1
1152 mov scratch1 dst
1153 m68k_save_dst 1
1154 m68k_prefetch
1155
1156 0100111001110000 reset
1157 cycles 124
1158 if reset_handler
1159 pcall reset_handler m68k_reset_handler context
1160 end