comparison z80.cpu @ 1769:8fe162bdb038 mame_interp

Merge from default
author Michael Pavone <pavone@retrodev.com>
date Fri, 01 Mar 2019 14:17:29 -0800
parents 1dc718581aac
children 338c78da3fff
comparison
equal deleted inserted replaced
1768:63256371046f 1769:8fe162bdb038
1 info
2 prefix z80_
3 opcode_size 8
4 extra_tables cb ed dded fded ddcb fdcb dd fd
5 body z80_run_op
6 sync_cycle z80_sync_cycle
7 interrupt z80_interrupt
8 include z80_util.c
9 header z80.h
10
11 declare
12 void init_z80_opts(z80_options * options, memmap_chunk const * chunks, uint32_t num_chunks, memmap_chunk const * io_chunks, uint32_t num_io_chunks, uint32_t clock_divider, uint32_t io_address_mask);
13 z80_context * init_z80_context(z80_options *options);
14 void z80_run(z80_context *context, uint32_t target_cycle);
15 void z80_assert_reset(z80_context * context, uint32_t cycle);
16 void z80_clear_reset(z80_context * context, uint32_t cycle);
17 void z80_assert_busreq(z80_context * context, uint32_t cycle);
18 void z80_clear_busreq(z80_context * context, uint32_t cycle);
19 void z80_assert_nmi(z80_context *context, uint32_t cycle);
20 uint8_t z80_get_busack(z80_context * context, uint32_t cycle);
21 void z80_invalidate_code_range(z80_context *context, uint32_t start, uint32_t end);
22 void z80_adjust_cycles(z80_context * context, uint32_t deduction);
23 void z80_serialize(z80_context *context, serialize_buffer *buf);
24 void z80_deserialize(deserialize_buffer *buf, void *vcontext);
25 void zinsert_breakpoint(z80_context * context, uint16_t address, uint8_t * bp_handler);
26 void zremove_breakpoint(z80_context * context, uint16_t address);
27 void z80_options_free(z80_options *opts);
28 void z80_sync_cycle(z80_context *context, uint32_t target_cycle);
29
30 regs
31 main 8 b c d e h l f a
32 alt 8 b' c' d' e' h' l' f' a'
33 i 8
34 r 8
35 rhigh 8
36 iff1 8
37 iff2 8
38 imode 8
39 sp 16
40 ix 16
41 iy 16
42 pc 16
43 wz 16
44 nflag 8
45 last_flag_result 8
46 pvflag 8
47 chflags 8
48 zflag 8
49 scratch1 16
50 scratch2 16
51 busreq 8
52 busack 8
53 reset 8
54 io_map ptrmemmap_chunk
55 io_chunks 32
56 io_mask 32
57 int_cycle 32
58 int_end_cycle 32
59 int_value 8
60 nmi_cycle 32
61 system ptrvoid
62 fastread ptr8 64
63 fastwrite ptr8 64
64 mem_pointers ptr8 4
65
66 flags
67 register f
68 S 7 sign last_flag_result.7
69 Z 6 zero zflag
70 Y 5 bit-5 last_flag_result.5
71 H 4 half-carry chflags.3
72 P 2 parity pvflag
73 V 2 overflow pvflag
74 X 3 bit-3 last_flag_result.3
75 N 1 none nflag
76 C 0 carry chflags.7
77
78
79 z80_op_fetch
80 cycles 1
81 add 1 r r
82 mov pc scratch1
83 ocall read_8
84 add 1 pc pc
85
86 z80_run_op
87 #printf "Z80: %X @ %d\n" pc cycles
88 #printf "Z80: %X - A: %X, B: %X, C: %X D: %X, E: %X, H: %X, L: %X, SP: %X, IX: %X, IY: %X @ %d\n" pc a b c d e h l sp ix iy cycles
89 z80_op_fetch
90 dispatch scratch1
91
92 z80_interrupt
93 cmp int_cycle cycles
94 if >=U
95
96 mov 0 iff1
97 mov 0 iff2
98 cycles 6
99 update_sync
100
101 switch imode
102 case 0
103 dispatch int_value
104
105 case 1
106 dispatch 0xFF
107
108 case 2
109 lsl i 8 pc
110 or int_value pc pc
111 #CD is call
112 dispatch 0xCD
113 end
114
115 else
116
117 cmp nmi_cycle cycles
118 if >=U
119
120 mov 0xFFFFFFFF nmi_cycle
121 mov 0 iff1
122 local pch 8
123 lsr pc 8 pch
124 meta high pch
125 meta low pc
126 z80_push
127 mov 0x66 pc
128 update_sync
129
130 end
131 end
132
133
134 11001011 cb_prefix
135 z80_op_fetch
136 dispatch scratch1 cb
137
138 11011101 dd_prefix
139 z80_op_fetch
140 dispatch scratch1 dd
141
142 11101101 ed_prefix
143 z80_op_fetch
144 dispatch scratch1 ed
145
146 11111101 fd_prefix
147 z80_op_fetch
148 dispatch scratch1 fd
149
150 dd 11001011 ddcb_prefix
151 z80_calc_index ix
152 cycles 2
153 mov pc scratch1
154 ocall read_8
155 add 1 pc pc
156 dispatch scratch1 ddcb
157
158 fd 11001011 fdcb_prefix
159 z80_calc_index iy
160 cycles 2
161 mov pc scratch1
162 ocall read_8
163 add 1 pc pc
164 dispatch scratch1 fdcb
165
166 z80_check_cond
167 arg cond 8
168 local invert 8
169 switch cond
170 case 0
171 meta istrue invert
172 lnot zflag invert
173
174 case 1
175 meta istrue zflag
176
177 case 2
178 meta istrue invert
179 not chflags invert
180 and 0x80 invert invert
181
182 case 3
183 meta istrue invert
184 and 0x80 chflags invert
185
186 case 4
187 meta istrue invert
188 lnot pvflag invert
189
190 case 5
191 meta istrue pvflag
192
193 case 6
194 meta istrue invert
195 not last_flag_result invert
196 and 0x80 invert invert
197
198 case 7
199 meta istrue invert
200 and 0x80 last_flag_result invert
201
202 end
203
204 z80_fetch_hl
205 lsl h 8 scratch1
206 or l scratch1 scratch1
207 ocall read_8
208
209 z80_store_hl
210 lsl h 8 scratch2
211 or l scratch2 scratch2
212 ocall write_8
213
214 z80_fetch_immed
215 mov pc scratch1
216 ocall read_8
217 add 1 pc pc
218
219 z80_fetch_immed16
220 mov pc scratch1
221 ocall read_8
222 mov scratch1 wz
223 add 1 pc pc
224 mov pc scratch1
225 ocall read_8
226 add 1 pc pc
227 lsl scratch1 8 scratch1
228 or scratch1 wz wz
229
230 z80_fetch_immed_reg16
231 mov pc scratch1
232 ocall read_8
233 mov scratch1 low
234 add 1 pc pc
235 mov pc scratch1
236 ocall read_8
237 mov scratch1 high
238 add 1 pc pc
239
240 z80_fetch_immed_to_reg16
241 mov pc scratch1
242 ocall read_8
243 mov scratch1 reg
244 add 1 pc pc
245 mov pc scratch1
246 ocall read_8
247 add 1 pc pc
248 lsl scratch1 8 scratch1
249 or scratch1 reg reg
250
251 01RRR110 ld_from_hl
252 z80_fetch_hl
253 mov scratch1 main.R
254
255 01DDDSSS ld_from_reg
256 mov main.S main.D
257
258 dd 01DDD100 ld_from_ixh
259 invalid D 6
260 lsr ix 8 main.D
261
262 dd 01100SSS ld_to_ixh
263 invalid S 6
264 local tmp 16
265 and 0xFF ix ix
266 lsl main.S 8 tmp
267 or tmp ix ix
268
269 dd 0110D10S ld_ixb_to_ixb
270
271 dd 01DDD101 ld_from_ixl
272 invalid D 6
273 mov ix main.D
274
275 dd 01101SSS ld_to_ixl
276 invalid S 6
277 and 0xFF00 ix ix
278 or main.S ix ix
279
280 dd 01100101 ld_ixl_to_ixh
281 local tmp 16
282 lsl ix 8 tmp
283 and 0xFF ix ix
284 or tmp ix ix
285
286 dd 01101100 ld_ixh_to_ixl
287 local tmp 16
288 lsr ix 8 tmp
289 and 0xFF00 ix ix
290 or tmp ix ix
291
292 fd 01DDD100 ld_from_iyh
293 invalid D 6
294 lsr iy 8 main.D
295
296 fd 01100SSS ld_to_iyh
297 invalid S 6
298 local tmp 16
299 and 0xFF iy iy
300 lsl main.S 8 tmp
301 or tmp iy iy
302
303 fd 0110D10S ld_iyb_to_iyb
304
305 fd 01DDD101 ld_from_iyl
306 invalid D 6
307 mov iy main.D
308
309 fd 01101SSS ld_to_iyl
310 invalid S 6
311 and 0xFF00 iy iy
312 or main.S iy iy
313
314 fd 01100101 ld_iyl_to_iyh
315 local tmp 16
316 lsl iy 8 tmp
317 and 0xFF iy iy
318 or tmp iy iy
319
320 fd 01101100 ld_iyh_to_iyl
321 local tmp 16
322 lsr iy 8 tmp
323 and 0xFF00 iy iy
324 or tmp iy iy
325
326 z80_calc_index
327 arg index 16
328 mov index wz
329 z80_fetch_immed
330 sext 16 scratch1 scratch1
331 add scratch1 wz wz
332
333 z80_fetch_index
334 arg index 16
335 z80_calc_index index
336 mov wz scratch1
337 cycles 5
338 ocall read_8
339
340 z80_store_index
341 mov wz scratch2
342 ocall write_8
343
344 dd 01RRR110 ld_from_ix
345 z80_fetch_index ix
346 mov scratch1 main.R
347
348 fd 01RRR110 ld_from_iy
349 z80_fetch_index iy
350 mov scratch1 main.R
351
352 00RRR110 ld_immed
353 z80_fetch_immed
354 mov scratch1 main.R
355
356 dd 00100110 ld_immed_ixh
357 z80_fetch_immed
358 lsl scratch1 8 scratch1
359 and 0xFF ix ix
360 or scratch1 ix ix
361
362 dd 00101110 ld_immed_ixl
363 z80_fetch_immed
364 and 0xFF00 ix ix
365 or scratch1 ix ix
366
367 fd 00100110 ld_immed_iyh
368 z80_fetch_immed
369 lsl scratch1 8 scratch1
370 and 0xFF iy iy
371 or scratch1 iy iy
372
373 fd 00101110 ld_immed_iyl
374 z80_fetch_immed
375 and 0xFF00 iy iy
376 or scratch1 iy iy
377
378 01110RRR ld_to_hl
379 mov main.R scratch1
380 z80_store_hl
381
382 dd 01110RRR ld_to_ix
383 z80_calc_index ix
384 mov wz scratch2
385 mov main.R scratch1
386 cycles 5
387 ocall write_8
388
389 fd 01110RRR ld_to_iy
390 z80_calc_index iy
391 mov wz scratch2
392 mov main.R scratch1
393 cycles 5
394 ocall write_8
395
396 00110110 ld_to_hl_immed
397 z80_fetch_immed
398 z80_store_hl
399
400 dd 00110110 ld_to_ixd_immed
401 z80_calc_index ix
402 z80_fetch_immed
403 cycles 2
404 mov wz scratch2
405 ocall write_8
406
407 fd 00110110 ld_to_iyd_immed
408 z80_calc_index iy
409 z80_fetch_immed
410 cycles 2
411 mov wz scratch2
412 ocall write_8
413
414 00001010 ld_a_from_bc
415 lsl b 8 wz
416 or c wz wz
417 mov wz scratch1
418 add 1 wz wz
419 ocall read_8
420 mov scratch1 a
421
422 00011010 ld_a_from_de
423 lsl d 8 wz
424 or e wz wz
425 mov wz scratch1
426 add 1 wz wz
427 ocall read_8
428 mov scratch1 a
429
430 00111010 ld_a_from_immed
431 z80_fetch_immed16
432 mov wz scratch1
433 add 1 wz wz
434 ocall read_8
435 mov scratch1 a
436
437 00000010 ld_a_to_bc
438 local tmp 8
439 lsl b 8 scratch2
440 or c scratch2 scratch2
441 mov a scratch1
442 add c 1 tmp
443 lsl a 8 wz
444 or tmp wz wz
445 ocall write_8
446
447 00010010 ld_a_to_de
448 local tmp 8
449 lsl d 8 scratch2
450 or e scratch2 scratch2
451 mov a scratch1
452 add e 1 tmp
453 lsl a 8 wz
454 or tmp wz wz
455 ocall write_8
456
457 00110010 ld_a_to_immed
458 local tmp 16
459 z80_fetch_immed16
460 mov wz scratch2
461 mov a scratch1
462 add 1 wz wz
463 ocall write_8
464 and 0xFF wz wz
465 lsl a 8 tmp
466 or tmp wz wz
467
468 ed 01000111 ld_i_a
469 mov a i
470 cycles 1
471
472 ed 01001111 ld_r_a
473 mov a r
474 and 0x80 a rhigh
475 cycles 1
476
477 ed 01011111 ld_a_r
478 cycles 1
479 and 0x7F r a
480 or rhigh a a
481 update_flags SZYH0XN0
482 mov iff2 pvflag
483
484 ed 01010111 ld_a_i
485 cycles 1
486 mov i a
487 update_flags SZYH0XN0
488 mov iff2 pvflag
489
490 00000001 ld_bc_immed
491 meta high b
492 meta low c
493 z80_fetch_immed_reg16
494
495 00010001 ld_de_immed
496 meta high d
497 meta low e
498 z80_fetch_immed_reg16
499
500 00100001 ld_hl_immed
501 meta high h
502 meta low l
503 z80_fetch_immed_reg16
504
505 00110001 ld_sp_immed
506 meta reg sp
507 z80_fetch_immed_to_reg16
508
509 dd 00100001 ld_ix_immed
510 meta reg ix
511 z80_fetch_immed_to_reg16
512
513 fd 00100001 ld_iy_immed
514 meta reg iy
515 z80_fetch_immed_to_reg16
516
517 z80_fetch16_from_immed
518 z80_fetch_immed16
519 mov wz scratch1
520 ocall read_8
521 mov scratch1 low
522 add 1 wz wz
523 mov wz scratch1
524 ocall read_8
525 mov scratch1 high
526 add 1 wz wz
527
528 00101010 ld_hl_from_immed
529 meta low l
530 meta high h
531 z80_fetch16_from_immed
532
533 ed 01001011 ld_bc_from_immed
534 meta low c
535 meta high b
536 z80_fetch16_from_immed
537
538 ed 01011011 ld_de_from_immed
539 meta low e
540 meta high d
541 z80_fetch16_from_immed
542
543 ed 01101011 ld_hl_from_immed_slow
544 meta low l
545 meta high h
546 z80_fetch16_from_immed
547
548 z80_fetch_reg16_from_immed
549 z80_fetch_immed16
550 mov wz scratch1
551 ocall read_8
552 mov scratch1 reg
553 add 1 wz wz
554 mov wz scratch1
555 ocall read_8
556 lsl scratch1 8 scratch1
557 or scratch1 reg reg
558 add 1 wz wz
559
560 ed 01111011 ld_sp_from_immed
561 meta reg sp
562 z80_fetch_reg16_from_immed
563
564 dd 00101010 ld_ix_from_immed
565 meta reg ix
566 z80_fetch_reg16_from_immed
567
568 fd 00101010 ld_iy_from_immed
569 meta reg iy
570 z80_fetch_reg16_from_immed
571
572 00100010 ld_hl_to_immed
573 z80_fetch_immed16
574 mov wz scratch2
575 mov l scratch1
576 ocall write_8
577 add 1 wz wz
578 mov wz scratch2
579 mov h scratch1
580 ocall write_8
581 add 1 wz wz
582
583 dd 00100010 ld_ix_to_immed
584 z80_fetch_immed16
585 mov wz scratch2
586 mov ix scratch1
587 ocall write_8
588 add 1 wz wz
589 mov wz scratch2
590 lsr ix 8 scratch1
591 ocall write_8
592 add 1 wz wz
593
594 fd 00100010 ld_iy_to_immed
595 z80_fetch_immed16
596 mov wz scratch2
597 mov iy scratch1
598 ocall write_8
599 add 1 wz wz
600 mov wz scratch2
601 lsr iy 8 scratch1
602 ocall write_8
603 add 1 wz wz
604
605 z80_regpair_to_immed
606 z80_fetch_immed16
607 mov wz scratch2
608 mov low scratch1
609 ocall write_8
610 add 1 wz wz
611 mov high scratch1
612 mov wz scratch2
613 ocall write_8
614 add 1 wz wz
615
616 ed 01000011 ld_bc_to_immed
617 meta low c
618 meta high b
619 z80_regpair_to_immed
620
621 ed 01010011 ld_de_to_immed
622 meta low e
623 meta high d
624 z80_regpair_to_immed
625
626 ed 01100011 ld_hl_to_immed_slow
627 meta low l
628 meta high h
629 z80_regpair_to_immed
630
631 ed 01110011 ld_sp_to_immed
632 meta low sp
633 local sph 8
634 lsr sp 8 sph
635 meta high sph
636 z80_regpair_to_immed
637
638 11111001 ld_sp_hl
639 cycles 2
640 lsl h 8 sp
641 or l sp sp
642
643 dd 11111001 ld_sp_ix
644 cycles 2
645 mov ix sp
646
647 fd 11111001 ld_sp_iy
648 cycles 2
649 mov iy sp
650
651 z80_push
652 cycles 1
653 sub 1 sp sp
654 mov sp scratch2
655 mov high scratch1
656 ocall write_8
657 sub 1 sp sp
658 mov sp scratch2
659 mov low scratch1
660 ocall write_8
661
662 11000101 push_bc
663 meta high b
664 meta low c
665 z80_push
666
667 11010101 push_de
668 meta high d
669 meta low e
670 z80_push
671
672 11100101 push_hl
673 meta high h
674 meta low l
675 z80_push
676
677 11110101 push_af
678 meta high a
679 meta low f
680 z80_push
681
682 dd 11100101 push_ix
683 local ixh 8
684 lsr ix 8 ixh
685 meta high ixh
686 meta low ix
687 z80_push
688
689 fd 11100101 push_iy
690 local iyh 8
691 lsr iy 8 iyh
692 meta high iyh
693 meta low iy
694 z80_push
695
696 z80_pop
697 mov sp scratch1
698 ocall read_8
699 add 1 sp sp
700 mov scratch1 low
701 mov sp scratch1
702 ocall read_8
703 add 1 sp sp
704 mov scratch1 high
705
706 11000001 pop_bc
707 meta high b
708 meta low c
709 z80_pop
710
711 11010001 pop_de
712 meta high d
713 meta low e
714 z80_pop
715
716 11100001 pop_hl
717 meta high h
718 meta low l
719 z80_pop
720
721 11110001 pop_af
722 meta high a
723 meta low f
724 z80_pop
725
726 dd 11100001 pop_ix
727 local ixh 16
728 meta high ixh
729 meta low ix
730 z80_pop
731 lsl ixh 8 ixh
732 or ixh ix ix
733
734 fd 11100001 pop_iy
735 local iyh 16
736 meta high iyh
737 meta low iy
738 z80_pop
739 lsl iyh 8 iyh
740 or iyh iy iy
741
742 11101011 ex_de_hl
743 xchg e l
744 xchg d h
745
746 00001000 ex_af_af
747 xchg a a'
748 xchg f f'
749
750 11011001 exx
751 xchg b b'
752 xchg c c'
753 xchg d d'
754 xchg e e'
755 xchg h h'
756 xchg l l'
757
758 11100011 ex_sp_hl
759 mov sp scratch1
760 ocall read_8
761 xchg l scratch1
762 cycles 1
763 mov sp scratch2
764 ocall write_8
765 add 1 sp scratch1
766 ocall read_8
767 xchg h scratch1
768 cycles 2
769 add 1 sp scratch2
770 ocall write_8
771 lsl h 8 wz
772 or l wz wz
773
774 dd 11100011 ex_sp_ix
775 mov sp scratch1
776 ocall read_8
777 mov scratch1 wz
778 mov ix scratch1
779 cycles 1
780 mov sp scratch2
781 ocall write_8
782 add 1 sp scratch1
783 ocall read_8
784 lsl scratch1 8 scratch1
785 or scratch1 wz wz
786 lsr ix 8 scratch1
787 cycles 2
788 add 1 sp scratch2
789 ocall write_8
790 mov wz ix
791
792 fd 11100011 ex_sp_iy
793 mov sp scratch1
794 ocall read_8
795 mov scratch1 wz
796 mov iy scratch1
797 cycles 1
798 mov sp scratch2
799 ocall write_8
800 add 1 sp scratch1
801 ocall read_8
802 lsl scratch1 8 scratch1
803 or scratch1 wz wz
804 lsr iy 8 scratch1
805 cycles 2
806 add 1 sp scratch2
807 ocall write_8
808 mov wz iy
809
810 10000RRR add_reg
811 add a main.R a
812 update_flags SZYHVXN0C
813
814 dd 10000100 add_ixh
815 lsr ix 8 scratch1
816 add a scratch1 a
817 update_flags SZYHVXN0C
818
819 dd 10000101 add_ixl
820 and ix 0xFF scratch1
821 add a scratch1 a
822 update_flags SZYHVXN0C
823
824 fd 10000100 add_iyh
825 lsr iy 8 scratch1
826 add a scratch1 a
827 update_flags SZYHVXN0C
828
829 fd 10000101 add_iyl
830 and iy 0xFF scratch1
831 add a scratch1 a
832 update_flags SZYHVXN0C
833
834 10000110 add_hl
835 z80_fetch_hl
836 add a scratch1 a
837 update_flags SZYHVXN0C
838
839 dd 10000110 add_ixd
840 z80_fetch_index ix
841 add a scratch1 a
842 update_flags SZYHVXN0C
843
844 fd 10000110 add_iyd
845 z80_fetch_index iy
846 add a scratch1 a
847 update_flags SZYHVXN0C
848
849 11000110 add_immed
850 z80_fetch_immed
851 add a scratch1 a
852 update_flags SZYHVXN0C
853
854 z80_add16_hl
855 arg src 16
856 lsl h 8 hlt
857 or l hlt hlt
858 add 1 hlt wz
859 add src hlt hlt
860 update_flags YHXN0C
861 mov hlt l
862 lsr hlt 8 h
863 cycles 7
864
865 00001001 add_hl_bc
866 local hlw 16
867 local bcw 16
868 meta hlt hlw
869 lsl b 8 bcw
870 or c bcw bcw
871 z80_add16_hl bcw
872
873 00011001 add_hl_de
874 local hlw 16
875 local dew 16
876 meta hlt hlw
877 lsl d 8 dew
878 or e dew dew
879 z80_add16_hl dew
880
881 00101001 add_hl_hl
882 local hlw 16
883 meta hlt hlw
884 z80_add16_hl hlw
885
886 00111001 add_hl_sp
887 local hlw 16
888 meta hlt hlw
889 z80_add16_hl sp
890
891 dd 00001001 add_ix_bc
892 lsl b 8 scratch1
893 or c scratch1 scratch1
894 add scratch1 ix ix
895 update_flags YHXN0C
896 cycles 7
897
898 dd 00011001 add_ix_de
899 lsl d 8 scratch1
900 or e scratch1 scratch1
901 add scratch1 ix ix
902 update_flags YHXN0C
903 cycles 7
904
905 dd 00101001 add_ix_ix
906 add ix ix ix
907 update_flags YHXN0C
908 cycles 7
909
910 dd 00111001 add_ix_sp
911 add sp ix ix
912 update_flags YHXN0C
913 cycles 7
914
915 fd 00001001 add_iy_bc
916 lsl b 8 scratch1
917 or c scratch1 scratch1
918 add scratch1 iy iy
919 update_flags YHXN0C
920 cycles 7
921
922 fd 00011001 add_iy_de
923 lsl d 8 scratch1
924 or e scratch1 scratch1
925 add scratch1 iy iy
926 update_flags YHXN0C
927 cycles 7
928
929 fd 00101001 add_iy_iy
930 add iy iy iy
931 update_flags YHXN0C
932 cycles 7
933
934 fd 00111001 add_iy_sp
935 add sp iy iy
936 update_flags YHXN0C
937 cycles 7
938
939 10001RRR adc_reg
940 adc a main.R a
941 update_flags SZYHVXN0C
942
943 dd 10001100 adc_ixh
944 lsr ix 8 scratch1
945 adc a scratch1 a
946 update_flags SZYHVXN0C
947
948 dd 10001101 adc_ixl
949 and ix 0xFF scratch1
950 adc a scratch1 a
951 update_flags SZYHVXN0C
952
953 fd 10001100 adc_iyh
954 lsr iy 8 scratch1
955 adc a scratch1 a
956 update_flags SZYHVXN0C
957
958 fd 10001101 adc_iyl
959 and iy 0xFF scratch1
960 adc a scratch1 a
961 update_flags SZYHVXN0C
962
963 10001110 adc_hl
964 z80_fetch_hl
965 adc a scratch1 a
966 update_flags SZYHVXN0C
967
968 dd 10001110 adc_ixd
969 z80_fetch_index ix
970 adc a scratch1 a
971 update_flags SZYHVXN0C
972
973 fd 10001110 adc_iyd
974 z80_fetch_index iy
975 adc a scratch1 a
976 update_flags SZYHVXN0C
977
978 11001110 adc_immed
979 z80_fetch_immed
980 adc a scratch1 a
981 update_flags SZYHVXN0C
982
983 z80_adc16_hl
984 arg src 16
985 lsl h 8 hlt
986 or l hlt hlt
987 add 1 hlt wz
988 adc src hlt hlt
989 update_flags SZYHVXN0C
990 mov hlt l
991 lsr hlt 8 h
992 cycles 7
993
994 ed 01001010 adc_hl_bc
995 local hlw 16
996 local bcw 16
997 meta hlt hlw
998 lsl b 8 bcw
999 or c bcw bcw
1000 z80_adc16_hl bcw
1001
1002 ed 01011010 adc_hl_de
1003 local hlw 16
1004 local dew 16
1005 meta hlt hlw
1006 lsl d 8 dew
1007 or e dew dew
1008 z80_adc16_hl dew
1009
1010 ed 01101010 adc_hl_hl
1011 local hlw 16
1012 meta hlt hlw
1013 z80_adc16_hl hlw
1014
1015
1016 ed 01111010 adc_hl_sp
1017 local hlw 16
1018 meta hlt hlw
1019 z80_adc16_hl sp
1020
1021 10010RRR sub_reg
1022 sub main.R a a
1023 update_flags SZYHVXN1C
1024
1025 dd 10010100 sub_ixh
1026 lsr ix 8 scratch1
1027 sub scratch1 a a
1028 update_flags SZYHVXN1C
1029
1030 dd 10010101 sub_ixl
1031 and ix 0xFF scratch1
1032 sub scratch1 a a
1033 update_flags SZYHVXN1C
1034
1035 fd 10010100 sub_iyh
1036 lsr iy 8 scratch1
1037 sub scratch1 a a
1038 update_flags SZYHVXN1C
1039
1040 fd 10010101 sub_iyl
1041 and iy 0xFF scratch1
1042 sub scratch1 a a
1043 update_flags SZYHVXN1C
1044
1045 10010110 sub_hl
1046 z80_fetch_hl
1047 sub scratch1 a a
1048 update_flags SZYHVXN1C
1049
1050 dd 10010110 sub_ixd
1051 z80_fetch_index ix
1052 sub scratch1 a a
1053 update_flags SZYHVXN1C
1054
1055 fd 10010110 sub_iyd
1056 z80_fetch_index iy
1057 sub scratch1 a a
1058 update_flags SZYHVXN1C
1059
1060 11010110 sub_immed
1061 z80_fetch_immed
1062 sub scratch1 a a
1063 update_flags SZYHVXN1C
1064
1065 10011RRR sbc_reg
1066 sbc main.R a a
1067 update_flags SZYHVXN1C
1068
1069 dd 10011100 sbc_ixh
1070 lsr ix 8 scratch1
1071 sbc scratch1 a a
1072 update_flags SZYHVXN1C
1073
1074 dd 10011101 sbc_ixl
1075 and ix 0xFF scratch1
1076 sbc scratch1 a a
1077 update_flags SZYHVXN1C
1078
1079 fd 10011100 sbc_iyh
1080 lsr iy 8 scratch1
1081 sbc scratch1 a a
1082 update_flags SZYHVXN1C
1083
1084 fd 10011101 sbc_iyl
1085 and iy 0xFF scratch1
1086 sbc scratch1 a a
1087 update_flags SZYHVXN1C
1088
1089
1090 10011110 sbc_hl
1091 z80_fetch_hl
1092 sbc scratch1 a a
1093 update_flags SZYHVXN1C
1094
1095 dd 10011110 sbc_ixd
1096 z80_fetch_index ix
1097 sbc scratch1 a a
1098 update_flags SZYHVXN1C
1099
1100 fd 10011110 sbc_iyd
1101 z80_fetch_index iy
1102 sbc scratch1 a a
1103 update_flags SZYHVXN1C
1104
1105 11011110 sbc_immed
1106 z80_fetch_immed
1107 sbc scratch1 a a
1108 update_flags SZYHVXN1C
1109
1110 z80_sbc16_hl
1111 arg src 16
1112 lsl h 8 hlt
1113 or l hlt hlt
1114 add 1 hlt wz
1115 sbc src hlt hlt
1116 update_flags SZYHVXN1C
1117 mov hlt l
1118 lsr hlt 8 h
1119 cycles 7
1120
1121 ed 01000010 sbc_hl_bc
1122 local hlw 16
1123 local bcw 16
1124 meta hlt hlw
1125 lsl b 8 bcw
1126 or c bcw bcw
1127 z80_sbc16_hl bcw
1128
1129 ed 01010010 sbc_hl_de
1130 local hlw 16
1131 local dew 16
1132 meta hlt hlw
1133 lsl d 8 dew
1134 or e dew dew
1135 z80_sbc16_hl dew
1136
1137 ed 01100010 sbc_hl_hl
1138 local hlw 16
1139 meta hlt hlw
1140 z80_sbc16_hl hlw
1141
1142
1143 ed 01110010 sbc_hl_sp
1144 local hlw 16
1145 meta hlt hlw
1146 z80_sbc16_hl sp
1147
1148 10100RRR and_reg
1149 and a main.R a
1150 update_flags SZYH1PXN0C0
1151
1152 dd 10100100 and_ixh
1153 lsr ix 8 scratch1
1154 and scratch1 a a
1155 update_flags SZYH1PXN0C0
1156
1157 dd 10100101 and_ixl
1158 and ix a a
1159 update_flags SZYH1PXN0C0
1160
1161 fd 10100100 and_iyh
1162 lsr iy 8 scratch1
1163 and scratch1 a a
1164 update_flags SZYH1PXN0C0
1165
1166 fd 10100101 and_iyl
1167 and iy a a
1168 update_flags SZYH1PXN0C0
1169
1170 10100110 and_hl
1171 z80_fetch_hl
1172 and a scratch1 a
1173 update_flags SZYH1PXN0C0
1174
1175 dd 10100110 and_ixd
1176 z80_fetch_index ix
1177 and a scratch1 a
1178 update_flags SZYH1PXN0C0
1179
1180 fd 10100110 and_iyd
1181 z80_fetch_index iy
1182 and a scratch1 a
1183 update_flags SZYH1PXN0C0
1184
1185 11100110 and_immed
1186 z80_fetch_immed
1187 and a scratch1 a
1188 update_flags SZYH1PXN0C0
1189
1190 10110RRR or_reg
1191 or a main.R a
1192 update_flags SZYH0PXN0C0
1193
1194 dd 10110100 or_ixh
1195 lsr ix 8 scratch1
1196 or scratch1 a a
1197 update_flags SZYH0PXN0C0
1198
1199 dd 10110101 or_ixl
1200 or ix a a
1201 update_flags SZYH0PXN0C0
1202
1203 fd 10110100 or_iyh
1204 lsr iy 8 scratch1
1205 or scratch1 a a
1206 update_flags SZYH0PXN0C0
1207
1208 fd 10110101 or_iyl
1209 or iy a a
1210 update_flags SZYH0PXN0C0
1211
1212 10110110 or_hl
1213 z80_fetch_hl
1214 or a scratch1 a
1215 update_flags SZYH0PXN0C0
1216
1217 dd 10110110 or_ixd
1218 z80_fetch_index ix
1219 or a scratch1 a
1220 update_flags SZYH0PXN0C0
1221
1222 fd 10110110 or_iyd
1223 z80_fetch_index iy
1224 or a scratch1 a
1225 update_flags SZYH0PXN0C0
1226
1227 11110110 or_immed
1228 z80_fetch_immed
1229 or a scratch1 a
1230 update_flags SZYH0PXN0C0
1231
1232 10101RRR xor_reg
1233 xor a main.R a
1234 update_flags SZYH0PXN0C0
1235
1236 dd 10101100 xor_ixh
1237 lsr ix 8 scratch1
1238 xor scratch1 a a
1239 update_flags SZYH0PXN0C0
1240
1241 dd 10101101 xor_ixl
1242 xor ix a a
1243 update_flags SZYH0PXN0C0
1244
1245 fd 10101100 xor_iyh
1246 lsr iy 8 scratch1
1247 xor scratch1 a a
1248 update_flags SZYH0PXN0C0
1249
1250 fd 10101101 xor_iyl
1251 xor iy a a
1252 update_flags SZYH0PXN0C0
1253
1254 10101110 xor_hl
1255 z80_fetch_hl
1256 xor a scratch1 a
1257 update_flags SZYH0PXN0C0
1258
1259 dd 10101110 xor_ixd
1260 z80_fetch_index ix
1261 xor a scratch1 a
1262 update_flags SZYH0PXN0C0
1263
1264 fd 10101110 xor_iyd
1265 z80_fetch_index iy
1266 xor a scratch1 a
1267 update_flags SZYH0PXN0C0
1268
1269 11101110 xor_immed
1270 z80_fetch_immed
1271 xor a scratch1 a
1272 update_flags SZYH0PXN0C0
1273
1274 10111RRR cp_reg
1275 mov main.R last_flag_result
1276 cmp main.R a
1277 update_flags SZHVN1C
1278
1279 dd 10111100 cp_ixh
1280 local tmp 8
1281 lsr ix 8 tmp
1282 mov tmp last_flag_result
1283 cmp tmp a
1284 update_flags SZHVN1C
1285
1286 dd 10111101 cp_ixl
1287 local tmp 8
1288 mov ix tmp
1289 mov ix last_flag_result
1290 cmp tmp a
1291 update_flags SZHVN1C
1292
1293 fd 10111100 cp_iyh
1294 local tmp 8
1295 lsr iy 8 tmp
1296 mov tmp last_flag_result
1297 cmp tmp a
1298 update_flags SZHVN1C
1299
1300 fd 10111101 cp_iyl
1301 local tmp 8
1302 mov iy tmp
1303 mov iy last_flag_result
1304 cmp tmp a
1305 update_flags SZHVN1C
1306
1307 10111110 cp_hl
1308 local tmp 8
1309 z80_fetch_hl
1310 mov scratch1 tmp
1311 mov scratch1 last_flag_result
1312 cmp tmp a
1313 update_flags SZHVN1C
1314
1315 dd 10111110 cp_ixd
1316 local tmp 8
1317 z80_fetch_index ix
1318 mov scratch1 tmp
1319 mov scratch1 last_flag_result
1320 cmp tmp a
1321 update_flags SZHVN1C
1322
1323 fd 10111110 cp_iyd
1324 local tmp 8
1325 z80_fetch_index iy
1326 mov scratch1 tmp
1327 mov scratch1 last_flag_result
1328 cmp tmp a
1329 update_flags SZHVN1C
1330
1331 11111110 cp_immed
1332 local tmp 8
1333 z80_fetch_immed
1334 mov scratch1 tmp
1335 mov scratch1 last_flag_result
1336 cmp tmp a
1337 update_flags SZHVN1C
1338
1339 00RRR100 inc_reg
1340 add 1 main.R main.R
1341 update_flags SZYHVXN0
1342
1343 dd 00100100 inc_ixh
1344 add 0x100 ix ix
1345 update_flags SZYHVXN0
1346
1347 dd 00101100 inc_ixl
1348 local tmp 8
1349 mov ix tmp
1350 add 1 tmp tmp
1351 update_flags SZYHVXN0
1352 and 0xFF00 ix ix
1353 or tmp ix ix
1354
1355 fd 00100100 inc_iyh
1356 add 0x100 iy iy
1357 update_flags SZYHVXN0
1358
1359 fd 00101100 inc_iyl
1360 local tmp 8
1361 mov iy tmp
1362 add 1 tmp tmp
1363 update_flags SZYHVXN0
1364 and 0xFF00 iy iy
1365 or tmp iy iy
1366
1367 00110100 inc_hl
1368 local tmp 8
1369 z80_fetch_hl
1370 #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out
1371 #or add some syntax to force a certain size on an operation so they are unnecessary
1372 mov scratch1 tmp
1373 add 1 tmp tmp
1374 update_flags SZYHVXN0
1375 mov tmp scratch1
1376 cycles 1
1377 z80_store_hl
1378
1379 dd 00110100 inc_ixd
1380 local tmp 8
1381 z80_fetch_index ix
1382 #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out
1383 #or add some syntax to force a certain size on an operation so they are unnecessary
1384 mov scratch1 tmp
1385 add 1 tmp tmp
1386 update_flags SZYHVXN0
1387 mov tmp scratch1
1388 cycles 1
1389 z80_store_index
1390
1391 fd 00110100 inc_iyd
1392 local tmp 8
1393 z80_fetch_index iy
1394 #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out
1395 #or add some syntax to force a certain size on an operation so they are unnecessary
1396 mov scratch1 tmp
1397 add 1 tmp tmp
1398 update_flags SZYHVXN0
1399 mov tmp scratch1
1400 cycles 1
1401 z80_store_index
1402
1403 z80_inc_pair
1404 arg high 8
1405 arg low 8
1406 cycles 2
1407 local word 16
1408 lsl high 8 word
1409 or low word word
1410 add 1 word word
1411 mov word low
1412 lsr word 8 high
1413
1414 00000011 inc_bc
1415 z80_inc_pair b c
1416
1417 00010011 inc_de
1418 z80_inc_pair d e
1419
1420 00100011 inc16_hl
1421 z80_inc_pair h l
1422
1423 00110011 inc_sp
1424 add 1 sp sp
1425
1426 dd 00100011 inc_ix
1427 add 1 ix ix
1428
1429 fd 00100011 inc_iy
1430 add 1 iy iy
1431
1432 00RRR101 dec_reg
1433 sub 1 main.R main.R
1434 update_flags SZYHVXN1
1435
1436 dd 00100101 dec_ixh
1437 sub 0x100 ix ix
1438 update_flags SZYHVXN1
1439
1440 dd 00101101 dec_ixl
1441 local tmp 8
1442 mov ix tmp
1443 sub 1 tmp tmp
1444 update_flags SZYHVXN1
1445 and 0xFF00 ix ix
1446 or tmp ix ix
1447
1448 fd 00100101 dec_iyh
1449 sub 0x100 iy iy
1450 update_flags SZYHVXN1
1451
1452 fd 00101101 dec_iyl
1453 local tmp 8
1454 mov iy tmp
1455 sub 1 tmp tmp
1456 update_flags SZYHVXN1
1457 and 0xFF00 iy iy
1458 or tmp iy iy
1459
1460 00110101 dec_hl
1461 local tmp 8
1462 z80_fetch_hl
1463 #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out
1464 #or add some syntax to force a certain size on an operation so they are unnecessary
1465 mov scratch1 tmp
1466 sub 1 tmp tmp
1467 update_flags SZYHVXN1
1468 mov tmp scratch1
1469 cycles 1
1470 z80_store_hl
1471
1472 dd 00110101 dec_ixd
1473 local tmp 8
1474 z80_fetch_index ix
1475 #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out
1476 #or add some syntax to force a certain size on an operation so they are unnecessary
1477 mov scratch1 tmp
1478 sub 1 tmp tmp
1479 update_flags SZYHVXN1
1480 mov tmp scratch1
1481 cycles 1
1482 z80_store_index
1483
1484 fd 00110101 dec_iyd
1485 local tmp 8
1486 z80_fetch_index iy
1487 #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out
1488 #or add some syntax to force a certain size on an operation so they are unnecessary
1489 mov scratch1 tmp
1490 sub 1 tmp tmp
1491 update_flags SZYHVXN1
1492 mov tmp scratch1
1493 cycles 1
1494 z80_store_index
1495
1496 z80_dec_pair
1497 arg high 8
1498 arg low 8
1499 local word 16
1500 lsl high 8 word
1501 or low word word
1502 sub 1 word word
1503 mov word low
1504 lsr word 8 high
1505 cycles 2
1506
1507 00001011 dec_bc
1508 z80_dec_pair b c
1509
1510 00011011 dec_de
1511 z80_dec_pair d e
1512
1513 00101011 dec16_hl
1514 z80_dec_pair h l
1515
1516 00111011 dec_sp
1517 sub 1 sp sp
1518
1519 dd 00101011 dec_ix
1520 sub 1 ix ix
1521
1522 fd 00101011 dec_iy
1523 sub 1 iy iy
1524
1525 00101111 cpl
1526 not a a
1527 update_flags YH1XN1
1528
1529 ed 01DDD100 neg
1530 neg a a
1531 update_flags SZYHVXN1C
1532
1533 00111111 ccf
1534 local tmp 8
1535 and 0x80 last_flag_result last_flag_result
1536 and 0x7F a tmp
1537 or tmp last_flag_result last_flag_result
1538 and 0x80 chflags chflags
1539 lsr chflags 4 tmp
1540 or tmp chflags chflags
1541 xor 0x80 chflags chflags
1542 update_flags N0
1543
1544 00110111 scf
1545 local tmp 8
1546 and 0x80 last_flag_result last_flag_result
1547 and 0x7F a tmp
1548 or tmp last_flag_result last_flag_result
1549 update_flags H0N0C1
1550
1551 00000000 nop
1552
1553 01110110 halt
1554 cmp nmi_cycle cycles
1555 if >=U
1556
1557 else
1558 cmp int_cycle cycles
1559 if >=U
1560
1561 if iff1
1562 else
1563 sub 1 pc pc
1564 end
1565
1566 else
1567 sub 1 pc pc
1568 end
1569 end
1570
1571 11110011 di
1572 mov 0 iff1
1573 mov 0 iff2
1574 update_sync
1575
1576 11111011 ei
1577 mov 1 iff1
1578 mov 1 iff2
1579 update_sync
1580 cmp int_cycle cycles
1581 if >=U
1582
1583 add 1 cycles int_cycle
1584
1585 end
1586
1587 ed 01D00110 im0
1588 mov 0 imode
1589
1590 ed 01D10110 im1
1591 mov 1 imode
1592
1593 ed 01D11110 im2
1594 mov 2 imode
1595
1596 ed 01D01110 im3
1597 #some sources call this mode 0/1, but unclear
1598 #if the behavior is really different from im 0
1599 mov 0 imode
1600
1601 11000011 jp
1602 z80_fetch_immed16
1603 mov wz pc
1604
1605 11101001 jp_hl
1606 lsl h 8 pc
1607 or l pc pc
1608
1609 dd 11101001 jp_ix
1610 mov ix pc
1611
1612 fd 11101001 jp_iy
1613 mov iy pc
1614
1615 11CCC010 jp_cc
1616 z80_check_cond C
1617 z80_fetch_immed16
1618 if istrue
1619
1620 mov wz pc
1621
1622 end
1623
1624 00011000 jr
1625 z80_fetch_immed
1626 #TODO: determine if this updates wz
1627 sext 16 scratch1 scratch1
1628 add scratch1 pc pc
1629 cycles 5
1630
1631 001CC000 jr_cc
1632 z80_check_cond C
1633 z80_fetch_immed
1634
1635 if istrue
1636
1637 sext 16 scratch1 scratch1
1638 add scratch1 pc pc
1639 cycles 5
1640
1641 end
1642
1643 00010000 djnz
1644 cycles 1
1645 z80_fetch_immed
1646 sub 1 b b
1647
1648 if b
1649
1650 sext 16 scratch1 scratch1
1651 add scratch1 pc pc
1652 cycles 5
1653
1654 end
1655
1656
1657 11001101 call_uncond
1658 z80_fetch_immed16
1659 local pch 8
1660 lsr pc 8 pch
1661 meta high pch
1662 meta low pc
1663 z80_push
1664 mov wz pc
1665
1666 11CCC100 call_cond
1667 local pch 8
1668 z80_fetch_immed16
1669 z80_check_cond C
1670
1671 if istrue
1672
1673 lsr pc 8 pch
1674 meta high pch
1675 meta low pc
1676 z80_push
1677 mov wz pc
1678
1679 end
1680
1681 11TTT111 rst
1682 local pch 8
1683 lsr pc 8 pch
1684 meta high pch
1685 meta low pc
1686 z80_push
1687 lsl T 3 scratch1
1688 mov scratch1 pc
1689
1690 11001001 ret
1691 local pch 16
1692 meta high pch
1693 meta low pc
1694 z80_pop
1695 lsl pch 8 pch
1696 or pch pc pc
1697
1698 ed 01001101 reti
1699 local pch 16
1700 cycles 1
1701 meta high pch
1702 meta low pc
1703 z80_pop
1704 lsl pch 8 pch
1705 or pch pc pc
1706
1707 ed 01NN1101 retn
1708 mov iff2 iff1
1709 local pch 16
1710 cycles 1
1711 meta high pch
1712 meta low pc
1713 z80_pop
1714 lsl pch 8 pch
1715 or pch pc pc
1716
1717 11CCC000 ret_cond
1718 local pch 16
1719 cycles 1
1720 z80_check_cond C
1721 if istrue
1722
1723 meta high pch
1724 meta low pc
1725 z80_pop
1726 lsl pch 8 pch
1727 or pch pc pc
1728
1729 end
1730
1731 11011011 in_abs
1732 z80_fetch_immed
1733 ocall io_read8
1734 mov scratch1 a
1735
1736 ed 01RRR000 in_bc
1737 lsl b 8 scratch1
1738 or c scratch1 scratch1
1739 ocall io_read8
1740 mov scratch1 main.R
1741
1742 z80_ini_ind
1743 arg change 16
1744 local tmp 8
1745 cycles 1
1746
1747 lsl 8 b wz
1748 or c wz wz
1749 add change wz wz
1750
1751 sub 1 b b
1752 update_flags SZYX
1753
1754 lsl b 8 scratch1
1755 or c scratch1 scratch1
1756 ocall io_read8
1757
1758 and 0x80 scratch1 nflag
1759
1760 mov wz tmp
1761 add tmp scratch1 tmp
1762 update_flags C
1763
1764 z80_store_hl
1765
1766 lsl h 8 scratch2
1767 or l scratch2 scratch2
1768 add change scratch2 scratch2
1769 mov scratch2 l
1770 lsr scratch2 8 h
1771
1772 and 7 tmp tmp
1773 xor b tmp tmp
1774 update_flags P
1775 lsr chflags 4 tmp
1776 or tmp chflags chflags
1777
1778 ed 10100010 ini
1779 z80_ini_ind 1
1780
1781 ed 10110010 inir
1782 z80_ini_ind 1
1783 if zflag
1784 else
1785 sub 2 pc pc
1786 cycles 5
1787 end
1788
1789 ed 10101010 ind
1790 z80_ini_ind -1
1791
1792 ed 10111010 indr
1793 z80_ini_ind -1
1794 if zflag
1795 else
1796 sub 2 pc pc
1797 cycles 5
1798 end
1799
1800 11010011 out_abs
1801 z80_fetch_immed
1802 mov scratch1 scratch2
1803 mov a scratch1
1804 ocall io_write8
1805
1806 ed 01RRR001 out_bc
1807 lsl b 8 scratch2
1808 or c scratch2 scratch2
1809 mov main.R scratch1
1810 ocall io_write8
1811
1812 z80_outi_outd
1813 arg change 16
1814 local tmp 8
1815 cycles 1
1816 z80_fetch_hl
1817
1818 and 0x80 scratch1 nflag
1819
1820 lsl h 8 scratch2
1821 or l scratch2 scratch2
1822 add change scratch2 scratch2
1823 mov scratch2 l
1824 lsr scratch2 8 h
1825
1826 add l scratch1 tmp
1827 update_flags C
1828 and 7 tmp tmp
1829
1830 lsl b 8 scratch2
1831 or c scratch2 scratch2
1832 ocall io_write8
1833
1834 sub 1 b b
1835 update_flags SZYX
1836
1837 lsl 8 b wz
1838 or c wz wz
1839 add change wz wz
1840
1841 xor b tmp tmp
1842 update_flags P
1843 lsr chflags 4 tmp
1844 or tmp chflags chflags
1845
1846 ed 10100011 outi
1847 z80_outi_outd 1
1848
1849 ed 10110011 otir
1850 z80_outi_outd 1
1851 if zflag
1852 else
1853 sub 2 pc pc
1854 cycles 5
1855 end
1856
1857 ed 10101011 outd
1858 z80_outi_outd -1
1859
1860 ed 10111011 otdr
1861 z80_outi_outd -1
1862 if zflag
1863 else
1864 sub 2 pc pc
1865 cycles 5
1866 end
1867
1868 00000111 rlca
1869 rol a 1 a
1870 update_flags YH0XN0C
1871
1872 00010111 rla
1873 rlc a 1 a
1874 update_flags YH0XN0C
1875
1876 00001111 rrca
1877 ror a 1 a
1878 update_flags YH0XN0C
1879
1880 00011111 rra
1881 rrc a 1 a
1882 update_flags YH0XN0C
1883
1884 cb 00000RRR rlc
1885 rol main.R 1 main.R
1886 update_flags SZYH0PXN0C
1887
1888 cb 00000110 rlc_hl
1889 local tmp 8
1890 z80_fetch_hl
1891 mov scratch1 tmp
1892 rol tmp 1 tmp
1893 update_flags SZYH0PXN0C
1894 mov tmp scratch1
1895 z80_store_hl
1896
1897 z80_rlc_index
1898 arg tmp 8
1899 mov wz scratch1
1900 ocall read_8
1901 cycles 1
1902 mov scratch1 tmp
1903 rol tmp 1 tmp
1904 update_flags SZYH0PXN0C
1905 mov tmp scratch1
1906 z80_store_index
1907
1908 ddcb 00000110 rlc_ixd
1909 local tmp 8
1910 z80_rlc_index tmp
1911
1912 ddcb 00000RRR rlc_ixd_reg
1913 z80_rlc_index main.R
1914
1915 fdcb 00000110 rlc_iyd
1916 local tmp 8
1917 z80_rlc_index tmp
1918
1919 fdcb 00000RRR rlc_iyd_reg
1920 z80_rlc_index main.R
1921
1922 cb 00010RRR rl
1923 rlc main.R 1 main.R
1924 update_flags SZYH0PXN0C
1925
1926 cb 00010110 rl_hl
1927 local tmp 8
1928 z80_fetch_hl
1929 mov scratch1 tmp
1930 rlc tmp 1 tmp
1931 update_flags SZYH0PXN0C
1932 mov tmp scratch1
1933 z80_store_hl
1934
1935 z80_rl_index
1936 arg tmp 8
1937 mov wz scratch1
1938 ocall read_8
1939 cycles 1
1940 mov scratch1 tmp
1941 rlc tmp 1 tmp
1942 update_flags SZYH0PXN0C
1943 mov tmp scratch1
1944 z80_store_index
1945
1946 ddcb 00010110 rl_ixd
1947 local tmp 8
1948 z80_rl_index tmp
1949
1950 fdcb 00010110 rl_iyd
1951 local tmp 8
1952 z80_rl_index tmp
1953
1954
1955 ddcb 00010RRR rl_ixd_reg
1956 z80_rl_index main.R
1957
1958 fdcb 00010RRR rl_iyd_reg
1959 z80_rl_index main.R
1960
1961 cb 00001RRR rrc
1962 ror main.R 1 main.R
1963 update_flags SZYH0PXN0C
1964
1965 cb 00001110 rrc_hl
1966 local tmp 8
1967 z80_fetch_hl
1968 mov scratch1 tmp
1969 ror tmp 1 tmp
1970 update_flags SZYH0PXN0C
1971 mov tmp scratch1
1972 z80_store_hl
1973
1974 z80_rrc_index
1975 arg tmp 8
1976 mov wz scratch1
1977 ocall read_8
1978 cycles 1
1979 mov scratch1 tmp
1980 ror tmp 1 tmp
1981 update_flags SZYH0PXN0C
1982 mov tmp scratch1
1983 z80_store_index
1984
1985 ddcb 00001110 rrc_ixd
1986 local tmp 8
1987 z80_rrc_index tmp
1988
1989 ddcb 00001RRR rrc_ixd_reg
1990 z80_rrc_index main.R
1991
1992 fdcb 00001110 rrc_iyd
1993 local tmp 8
1994 z80_rrc_index tmp
1995
1996 fdcb 00001RRR rrc_iyd_reg
1997 z80_rrc_index main.R
1998
1999 cb 00011RRR rr
2000 rrc main.R 1 main.R
2001 update_flags SZYH0PXN0C
2002
2003 cb 00011110 rr_hl
2004 local tmp 8
2005 z80_fetch_hl
2006 mov scratch1 tmp
2007 rrc tmp 1 tmp
2008 update_flags SZYH0PXN0C
2009 mov tmp scratch1
2010 z80_store_hl
2011
2012 z80_rr_index
2013 arg tmp 8
2014 mov wz scratch1
2015 ocall read_8
2016 cycles 1
2017 mov scratch1 tmp
2018 rrc tmp 1 tmp
2019 update_flags SZYH0PXN0C
2020 mov tmp scratch1
2021 z80_store_index
2022
2023 ddcb 00011110 rr_ixd
2024 local tmp 8
2025 z80_rr_index tmp
2026
2027 ddcb 00011RRR rr_ixd_reg
2028 z80_rr_index main.R
2029
2030 fdcb 00011110 rr_iyd
2031 local tmp 8
2032 z80_rr_index tmp
2033
2034 fdcb 00011RRR rr_iyd_reg
2035 z80_rr_index main.R
2036
2037 cb 00100RRR sla
2038 lsl main.R 1 main.R
2039 update_flags SZYH0PXN0C
2040
2041 cb 00100110 sla_hl
2042 local tmp 8
2043 z80_fetch_hl
2044 mov scratch1 tmp
2045 lsl tmp 1 tmp
2046 update_flags SZYH0PXN0C
2047 mov tmp scratch1
2048 z80_store_hl
2049
2050 z80_sla_index
2051 arg tmp 8
2052 mov wz scratch1
2053 ocall read_8
2054 cycles 1
2055 mov scratch1 tmp
2056 lsl tmp 1 tmp
2057 update_flags SZYH0PXN0C
2058 mov tmp scratch1
2059 z80_store_index
2060
2061 ddcb 00100110 sla_ixd
2062 local tmp 8
2063 z80_sla_index tmp
2064
2065 ddcb 00100RRR sla_ixd_reg
2066 z80_sla_index main.R
2067
2068 fdcb 00100110 sla_iyd
2069 local tmp 8
2070 z80_sla_index tmp
2071
2072 fdcb 00100RRR sla_iyd_reg
2073 z80_sla_index main.R
2074
2075 cb 00101RRR sra
2076 asr main.R 1 main.R
2077 update_flags SZYH0PXN0C
2078
2079 cb 00101110 sra_hl
2080 local tmp 8
2081 z80_fetch_hl
2082 mov scratch1 tmp
2083 asr tmp 1 tmp
2084 update_flags SZYH0PXN0C
2085 mov tmp scratch1
2086 z80_store_hl
2087
2088 z80_sra_index
2089 arg tmp 8
2090 mov wz scratch1
2091 ocall read_8
2092 cycles 1
2093 mov scratch1 tmp
2094 asr tmp 1 tmp
2095 update_flags SZYH0PXN0C
2096 mov tmp scratch1
2097 z80_store_index
2098
2099 ddcb 00101110 sra_ixd
2100 local tmp 8
2101 z80_sra_index tmp
2102
2103 ddcb 00101RRR sra_ixd_reg
2104 z80_sra_index main.R
2105
2106 fdcb 00101110 sra_iyd
2107 local tmp 8
2108 z80_sra_index tmp
2109
2110 fdcb 00101RRR sra_iyd_reg
2111 z80_sra_index main.R
2112
2113 cb 00110RRR sll
2114 lsl main.R 1 main.R
2115 update_flags SZ0YH0XN0C
2116 or 1 main.R main.R
2117 update_flags P
2118
2119 cb 00110110 sll_hl
2120 local tmp 8
2121 z80_fetch_hl
2122 mov scratch1 tmp
2123 lsl tmp 1 tmp
2124 update_flags SZ0YH0XN0C
2125 or 1 tmp tmp
2126 update_flags P
2127 mov tmp scratch1
2128 z80_store_hl
2129
2130 z80_sll_index
2131 arg tmp 8
2132 mov wz scratch1
2133 ocall read_8
2134 cycles 1
2135 mov scratch1 tmp
2136 lsl tmp 1 tmp
2137 update_flags SZ0YH0XN0C
2138 or 1 tmp tmp
2139 update_flags P
2140 mov tmp scratch1
2141 z80_store_index
2142
2143 ddcb 00110110 sll_ixd
2144 local tmp 8
2145 z80_sll_index tmp
2146
2147 ddcb 00110RRR sll_ixd_reg
2148 z80_sll_index main.R
2149
2150 fdcb 00110110 sll_iyd
2151 local tmp 8
2152 z80_sll_index tmp
2153
2154 fdcb 00110RRR sll_iyd_reg
2155 z80_sll_index main.R
2156
2157 cb 00111RRR srl
2158 lsr main.R 1 main.R
2159 update_flags SZYH0PXN0C
2160
2161 cb 00111110 srl_hl
2162 local tmp 8
2163 z80_fetch_hl
2164 mov scratch1 tmp
2165 lsr tmp 1 tmp
2166 update_flags SZYH0PXN0C
2167 mov tmp scratch1
2168 z80_store_hl
2169
2170 z80_srl_index
2171 arg tmp 8
2172 mov wz scratch1
2173 ocall read_8
2174 cycles 1
2175 mov scratch1 tmp
2176 lsr tmp 1 tmp
2177 update_flags SZYH0PXN0C
2178 mov tmp scratch1
2179 z80_store_index
2180
2181 ddcb 00111110 srl_ixd
2182 local tmp 8
2183 z80_srl_index tmp
2184
2185 ddcb 00111RRR srl_ixd_reg
2186 z80_srl_index main.R
2187
2188 fdcb 00111110 srl_iyd
2189 local tmp 8
2190 z80_srl_index tmp
2191
2192 fdcb 00111RRR srl_iyd_reg
2193 z80_srl_index main.R
2194
2195 cb 01BBBRRR bit_reg
2196 local tmp 8
2197 lsl 1 B tmp
2198 mov main.R last_flag_result
2199 and main.R tmp tmp
2200 update_flags SZH1PN0
2201
2202 cb 01BBB110 bit_hl
2203 local tmp 8
2204 z80_fetch_hl
2205 cycles 1
2206 lsl 1 B tmp
2207 lsr wz 8 last_flag_result
2208 and scratch1 tmp tmp
2209 update_flags SZH1PN0
2210
2211
2212 ddcb 01BBBRRR bit_ixd
2213 local tmp 8
2214 mov wz scratch1
2215 ocall read_8
2216 cycles 1
2217 lsl 1 B tmp
2218 lsr wz 8 last_flag_result
2219 and scratch1 tmp tmp
2220 update_flags SZH1PN0
2221
2222 fdcb 01BBBRRR bit_iyd
2223 local tmp 8
2224 mov wz scratch1
2225 ocall read_8
2226 cycles 1
2227 lsl 1 B tmp
2228 lsr wz 8 last_flag_result
2229 and scratch1 tmp tmp
2230 update_flags SZH1PN0
2231
2232 cb 10BBBRRR res_reg
2233 local tmp 8
2234 lsl 1 B tmp
2235 not tmp tmp
2236 and main.R tmp main.R
2237
2238 cb 10BBB110 res_hl
2239 z80_fetch_hl
2240 cycles 1
2241 local tmp 8
2242 lsl 1 B tmp
2243 not tmp tmp
2244 and scratch1 tmp scratch1
2245 z80_store_hl
2246
2247 z80_res_index
2248 arg bit 8
2249 arg tmp 8
2250 lsl 1 bit tmp
2251 not tmp tmp
2252 mov wz scratch1
2253 ocall read_8
2254 cycles 1
2255 and scratch1 tmp tmp
2256 mov tmp scratch1
2257 z80_store_index
2258
2259 ddcb 10BBB110 res_ixd
2260 local tmp 8
2261 z80_res_index B tmp
2262
2263 ddcb 10BBBRRR res_ixd_reg
2264 z80_res_index B main.R
2265
2266 fdcb 10BBB110 res_iyd
2267 local tmp 8
2268 z80_res_index B tmp
2269
2270 fdcb 10BBBRRR res_iyd_reg
2271 z80_res_index B main.R
2272
2273 cb 11BBBRRR set_reg
2274 local tmp 8
2275 lsl 1 B tmp
2276 or main.R tmp main.R
2277
2278 cb 11BBB110 set_hl
2279 z80_fetch_hl
2280 cycles 1
2281 local tmp 8
2282 lsl 1 B tmp
2283 or scratch1 tmp scratch1
2284 z80_store_hl
2285
2286 z80_set_index
2287 arg bit 8
2288 arg tmp 8
2289 lsl 1 bit tmp
2290 mov wz scratch1
2291 ocall read_8
2292 cycles 1
2293 or scratch1 tmp tmp
2294 mov tmp scratch1
2295 z80_store_index
2296
2297 ddcb 11BBB110 set_ixd
2298 local tmp 8
2299 z80_set_index B tmp
2300
2301 ddcb 11BBBRRR set_ixd_reg
2302 z80_set_index B main.R
2303
2304 fdcb 11BBB110 set_iyd
2305 local tmp 8
2306 z80_set_index B tmp
2307
2308 fdcb 11BBBRRR set_iyd_reg
2309 z80_set_index B main.R
2310
2311 z80_fetch_mod_hl
2312 local tmp 16
2313 arg change 16
2314 lsl h 8 tmp
2315 or l tmp tmp
2316 mov tmp scratch1
2317 add change tmp tmp
2318 mov tmp l
2319 lsr tmp 8 h
2320 ocall read_8
2321 cycles 2
2322
2323 z80_ldd_ldi
2324 arg change 16
2325 local tmp 16
2326 local tmp8 8
2327 z80_fetch_mod_hl change
2328
2329 add a scratch1 tmp8
2330 update_flags H0XN0
2331
2332 and 0x2 tmp8 tmp8
2333 lsl tmp8 4 tmp8
2334 and 0x88 last_flag_result last_flag_result
2335 or tmp8 last_flag_result last_flag_result
2336
2337 lsl d 8 tmp
2338 or e tmp tmp
2339 mov tmp scratch2
2340 add change tmp tmp
2341 mov tmp e
2342 lsr tmp 8 d
2343 ocall write_8
2344
2345 lsl b 8 tmp
2346 or c tmp tmp
2347 sub 1 tmp tmp
2348
2349 mov tmp c
2350 lsr tmp 8 b
2351 mov c pvflag
2352 or b pvflag pvflag
2353
2354
2355 ed 10100000 ldi
2356 z80_ldd_ldi 1
2357
2358 ed 10101000 ldd
2359 z80_ldd_ldi -1
2360
2361 ed 10110000 ldir
2362 z80_ldd_ldi 1
2363 if pvflag
2364
2365 add 1 pc wz
2366 sub 2 pc pc
2367 cycles 5
2368
2369 end
2370
2371 ed 10111000 lddr
2372 z80_ldd_ldi -1
2373 if pvflag
2374
2375 add 1 pc wz
2376 sub 2 pc pc
2377 cycles 5
2378
2379 end
2380
2381 z80_cpd_cpi
2382 local tmp 16
2383 local tmp8 8
2384 local hf 8
2385 arg change 16
2386
2387 z80_fetch_mod_hl change
2388 sub scratch1 a tmp8
2389 update_flags SZHN1
2390
2391 lsr chflags 3 hf
2392 and 1 hf hf
2393
2394 sub hf tmp8 tmp8
2395 update_flags X
2396
2397 and 0x2 tmp8 tmp8
2398 lsl tmp8 4 tmp8
2399 and 0x88 last_flag_result last_flag_result
2400 or tmp8 last_flag_result last_flag_result
2401
2402 lsl b 8 tmp
2403 or c tmp tmp
2404 sub 1 tmp tmp
2405
2406 mov tmp c
2407 lsr tmp 8 b
2408 mov c pvflag
2409 or b pvflag pvflag
2410
2411 cycles 5
2412
2413 ed 10100001 cpi
2414 z80_cpd_cpi 1
2415
2416 ed 10101001 cpd
2417 z80_cpd_cpi -1
2418
2419 ed 10110001 cpir
2420 z80_cpd_cpi 1
2421 if pvflag
2422
2423 if zflag
2424
2425 else
2426
2427 add 1 pc wz
2428 sub 2 pc pc
2429 cycles 5
2430
2431 end
2432 end
2433
2434 ed 10111001 cpdr
2435 z80_cpd_cpi -1
2436 if pvflag
2437
2438 if zflag
2439
2440 else
2441
2442 add 1 pc wz
2443 sub 2 pc pc
2444 cycles 5
2445
2446 end
2447 end
2448
2449 00100111 daa
2450 local diff 8
2451 local tmp 8
2452 local low 8
2453 and 0xF a low
2454 and 0x8 chflags tmp
2455 if tmp
2456
2457 mov 6 diff
2458
2459 else
2460
2461 cmp 0xA low
2462 if >=U
2463 mov 6 diff
2464 else
2465 mov 0 diff
2466 end
2467
2468 end
2469
2470 and 0x80 chflags tmp
2471 if tmp
2472
2473 or 0x60 diff diff
2474 update_flags C1
2475
2476 else
2477
2478 cmp 0x9A a
2479 if >=U
2480 or 0x60 diff diff
2481 update_flags C1
2482 else
2483 update_flags C0
2484 end
2485 end
2486
2487 if nflag
2488
2489 sub diff a a
2490 update_flags SZYHPX
2491
2492 else
2493
2494 add diff a a
2495 update_flags SZYHPX
2496
2497 end
2498
2499 dd OOOOOOOO dd_normal
2500 dispatch O
2501
2502 fd OOOOOOOO fd_normal
2503 dispatch O
2504
2505 ed 01101111 rld
2506 local tmp 8
2507 local tmp2 8
2508 z80_fetch_hl
2509 cycles 4
2510
2511 lsr scratch1 4 tmp
2512
2513 lsl scratch1 4 scratch1
2514
2515 and 0xF a tmp2
2516 or tmp2 scratch1 scratch1
2517
2518 and 0xF0 a a
2519 or tmp a a
2520 update_flags SZYH0XPN0
2521 z80_store_hl
2522
2523 ed 01100111 rrd
2524 local tmp 8
2525 local tmp2 8
2526 z80_fetch_hl
2527 cycles 4
2528
2529 and 0xF scratch1 tmp
2530 lsr scratch1 4 scratch1
2531
2532 lsl a 4 tmp2
2533 or tmp2 scratch1 scratch1
2534
2535 and 0xF0 a a
2536 or tmp a a
2537 update_flags SZYH0XPN0
2538 z80_store_hl
2539