]> cloudbase.mooo.com Git - avrcpm.git/blob - avr/Z80int-jmp.asm
8214156978608665555d3f9b2e422bc848dc62dc
[avrcpm.git] / avr / Z80int-jmp.asm
1 ; 8080/Z80 Interpreter.
2 ; This is part of the Z80-CP/M emulator written by Sprite_tm.
3 ;
4
5 ; Copyright (C) 2010 Sprite_tm
6 ; Copyright (C) 2010 Leo C.
7 ; Copyright (C) 2010 Horst S.
8
9 ; This file is part of avrcpm.
10 ;
11 ; avrcpm is free software: you can redistribute it and/or modify it
12 ; under the terms of the GNU General Public License as published by
13 ; the Free Software Foundation, either version 3 of the License, or
14 ; (at your option) any later version.
15 ;
16 ; avrcpm is distributed in the hope that it will be useful,
17 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 ; GNU General Public License for more details.
20 ;
21 ; You should have received a copy of the GNU General Public License
22 ; along with avrcpm. If not, see <http://www.gnu.org/licenses/>.
23 ;
24 ; $Id$
25 ;
26
27 #if EM_Z80
28 #define OPC_TABSTART 0x1900
29 #else
30 #define OPC_TABSTART 0x1200
31 #endif
32
33 .dseg
34 z_regs:
35 z_b: .byte 1
36 z_c: .byte 1
37 z_d: .byte 1
38 z_e: .byte 1
39 z_h: .byte 1
40 z_l: .byte 1
41
42 .equ oz_b = 0
43 .equ oz_c = 1
44 .equ oz_d = 2
45 .equ oz_e = 3
46 .equ oz_h = 4
47 .equ oz_l = 5
48
49
50 #if EM_Z80
51 z_b2: .byte 1
52 z_c2: .byte 1
53 z_d2: .byte 1
54 z_e2: .byte 1
55 z_h2: .byte 1
56 z_l2: .byte 1
57 z_f2: .byte 1
58 z_a2: .byte 1
59 .equ r2ofs = z_b2-z_b
60 .equ oz_b2 = 6
61 .equ oz_c2 = 7
62 .equ oz_d2 = 8
63 .equ oz_e2 = 9
64 .equ oz_h2 = 10
65 .equ oz_l2 = 11
66 .equ oz_f2 = 12
67 .equ oz_a2 = 13
68
69 z_xh: .byte 1
70 z_xl: .byte 1
71 z_yh: .byte 1
72 z_yl: .byte 1
73
74 z_i: .byte 1
75 z_r: .byte 1
76 .equ oz_xh = 14
77 .equ oz_xl = 15
78 .equ oz_yh = 16
79 .equ oz_yl = 17
80 .equ oz_i = 18
81 .equ oz_r = 19
82
83 z_istat: .byte 1
84 .equ oz_istat = 20
85
86 .equ IM_MASK = 0x03 ;Mask IM 0..2
87 .equ IM0 = 0
88 .equ IM1 = 1
89 .equ IM2 = 2
90
91 .equ IFF1 = 2 ;IFF1 Flag
92 .equ IFF2 = 3 ;IFF2 Flag
93
94 #endif
95
96 .cseg
97
98 ;Init z80
99 z80_init:
100 ldiw z_pc,IPLADDR
101 ldiw y,z_regs
102
103 cbi flags,trace
104 clr intstat
105
106 printnewline
107
108 .if INS_DEBUG
109 sbr intstat,(1<<i_trace)
110 .endif
111
112 printstring "Ok, "CPUSTR"-CPU is live!"
113 printnewline
114
115 main:
116
117 .if PRINT_PC
118 cpi z_pch,DBG_TRACE_BOTTOM
119 brlo noprintpc
120 cpi z_pch,DBG_TRACE_TOP
121 brsh noprintpc
122
123 printnewline
124 printstring "PC="
125 movw temp,z_pcl
126 lcall printhexw
127 printstring " "
128 noprintpc:
129 .endif
130
131 ;TODO: hier kommt die Interruptbehandlung rein
132
133 cpse intstat,_0 ;Fast path if no trace, int, break, ...
134 rjmp int_test
135
136 int_instr:
137 mem_read_ds zl,z_pc ;zl = memReadByte(z_pc)
138 adiw z_pcl,1 ;++z_pc
139 ldi zh,high(opcjmp) ;
140 icall
141 rjmp main ;
142
143 int_test:
144 sbrs intstat,i_trace
145 rjmp int_notrace
146 cpi z_pch,DBG_TRACE_BOTTOM
147 brlo int_notrace
148 cpi z_pch,DBG_TRACE_TOP
149 brsh int_notrace
150 lcall printregs
151 int_notrace:
152 sbrs intstat,i_break
153 rjmp int_nobreak
154 cbr intstat,(1<<i_break)|(1<<i_halt)
155 printnewline
156 printstring "Break detected! "
157 mov z_pcl,_0
158 mov z_pch,_0
159 int_nobreak:
160
161 rjmp int_instr ;Continue with normal instruction interpretation
162
163
164 ;--------------------------------------------------
165 ; init opcode table
166 ;
167 ; opctable opc_name
168 ;
169 #if EM_Z80
170 .equ numtabs_ = 5
171 #else
172 .equ numtabs_ = 1
173 #endif
174
175 .macro opctable
176
177 .ifndef opc_tabnext_
178 .if OPC_TABSTART & 0x00ff
179 .error "OPC_TABSTART is not page aligned!"
180 .endif
181 .set opc_tabnext_ = OPC_TABSTART
182 .equ opc_tablow_ = opc_tabnext_
183 .equ opc_tabend_ = opc_tablow_ + (256 * numtabs_) + 128
184 .equ sz53p_table_pos = opc_tablow_ + (256 * numtabs_)
185 .endif
186
187 .set opcjmp_table_pos_ = opc_tabnext_
188 .set opc_tabnext_ = opc_tabnext_ + 256
189
190 .equ @0 = opcjmp_table_pos_
191
192 .set todo_table_pos_ = 0
193
194 .endm
195
196 ;--------------------------------------------------
197 ; Generate a table entry for one instruction
198 ;
199 ; instr fetch, op, store
200 ;
201 .macro instr
202
203 .set fetch_ = (do_@0 != do_fetch_nop) ; must call or jump to fetch action
204 .set op_ = (do_@1 != do_op_nop) ; must call or jump to op action
205 .set store_ = (do_@2 != do_store_nop) ; must jump to store action
206 .set cnt_ = fetch_ + op_ + store_ ; number of actions for this instruction
207
208 .set action_1_ = 0
209 .set action_2_ = 0
210 .set action_3_ = 0
211
212 .if cnt_ == 1
213 .if fetch_
214 .set action_1_ = do_@0
215 .elif op_
216 .set action_1_ = do_@1
217 .else
218 .set action_1_ = do_@2
219 .endif
220 .elif cnt_ == 2
221 .if fetch_
222 .set action_1_ = do_@0
223 .if op_
224 .set action_2_ = do_@1
225 .else
226 .set action_2_ = do_@2
227 .endif
228 .else
229 .set action_1_ = do_@1
230 .set action_2_ = do_@2
231 .endif
232 .elif cnt_ == 3
233 .set action_1_ = do_@0
234 .set action_2_ = do_@1
235 .set action_3_ = do_@2
236 .endif
237
238 .set longdist_ = 0
239 .set pc_save_ = PC
240
241 .org opcjmp_table_pos_
242 .set opcjmp_table_pos_ = opcjmp_table_pos_ + 1
243
244
245 .if cnt_ == 0 ; nothing to do (nop)
246 ret ; go back to main
247 .elif cnt_ == 1 ; jump direct to action
248 .if (PC - action_1_) > 2047
249 .set longdist_ = 1 ; target action out of reach for rel jump
250 .else
251 rjmp action_1_ ; do op and return to main
252 .endif
253 .endif
254
255
256 .set done_ = 0
257 .if (cnt_ > 1) || longdist_
258 ; two or tree actions
259 .if defined (l_@0_@1_@2)
260 .if (PC - l_@0_@1_@2) <= 2047
261 rjmp l_@0_@1_@2 ; generate a jump to action table
262 .set done_ = 1
263 .endif
264 .endif
265
266 .if !done_
267
268 .if todo_table_pos_ == 0
269 .set todo_table_pos_ = opcjmp_table_pos_ - 2048
270 .if todo_table_pos_ < pc_save_
271 .set todo_table_pos_ = pc_save_
272 .endif
273 .endif
274
275 .if todo_table_pos_ < opc_tablow_
276 .if todo_table_pos_ + 2*cnt_ > opc_tablow_
277 .set todo_table_pos_ = opc_tabend_
278 .endif
279 .endif
280
281 .if defined (l_@0_@1_@2)
282 rjmp todo_table_pos_
283 .org todo_table_pos_
284 jmp l_@0_@1_@2
285 .set todo_table_pos_ = PC
286 .set done_ = 1
287 .endif
288 .endif
289
290 .if !done_
291
292 .equ l_@0_@1_@2 = todo_table_pos_ ; make a label
293 rjmp l_@0_@1_@2 ; generate a jump to action table
294
295 .org l_@0_@1_@2
296
297 .if fetch_ ; must fetch
298 .if op_ || store_
299 .if do_@0 == 0
300 m_do_@0
301 .else
302 lcall do_@0 ; fetch and come back here
303 .endif
304 .else
305 .if do_@0 == 0
306 m_do_@0
307 ret
308 .else
309 ljmp do_@0 ; do op and return to main
310 .endif
311 .endif
312 .endif
313 .if op_ ; must exec op
314 .if store_
315 .if do_@1 == 0
316 m_do_@1
317 .else
318 lcall do_@1 ; fetch and come back here
319 .endif
320 .else
321 .if do_@1 == 0
322 m_do_@1
323 ret
324 .else
325 ljmp do_@1 ; do op and return to main
326 .endif
327 .endif
328 .endif
329 .if store_ ; must store
330 .if do_@2 == 0
331 m_do_@2
332 ret
333 .else
334 ljmp do_@2 ; store is allways last
335 .endif
336 .endif
337
338 .set todo_table_pos_ = PC
339
340 .endif
341 .endif
342
343 .if todo_table_pos_ == 0
344 .org pc_save_
345 .else
346 .org todo_table_pos_
347 .endif
348
349 .endm
350
351
352 do_x_nop:
353 ret
354
355 ; ------------ Fetch phase stuff -----------------
356
357 fetch_ops:
358 .equ do_fetch_nop = do_x_nop
359
360
361 .macro m_do_fetch_a
362 mov opl,z_a
363 .endm
364
365 .equ do_fetch_a = 0
366 ; mov opl,z_a
367 ; ret
368
369 .macro m_do_fetch_b
370 ldd opl,y+oz_b
371 .endm
372
373 .equ do_fetch_b = 0
374 ; ldd opl,y+oz_b
375 ; ret
376
377 .macro m_do_fetch_c
378 ldd opl,y+oz_c
379 .endm
380
381 .equ do_fetch_c = 0
382 ; ldd opl,y+oz_c
383 ; ret
384
385 .macro m_do_fetch_d
386 ldd opl,y+oz_d
387 .endm
388
389 .equ do_fetch_d = 0
390 ; ldd opl,y+oz_d
391 ; ret
392
393 .macro m_do_fetch_e
394 ldd opl,y+oz_e
395 .endm
396
397 .equ do_fetch_e = 0
398 ; ldd opl,y+oz_e
399 ; ret
400
401 .macro m_do_fetch_h
402 ldd opl,y+oz_h
403 .endm
404
405 .equ do_fetch_h = 0
406 ; ldd opl,y+oz_h
407 ; ret
408
409 .macro m_do_fetch_l
410 ldd opl,y+oz_l
411 .endm
412
413 .equ do_fetch_l = 0
414 ; ldd opl,y+oz_l
415 ; ret
416
417 do_fetch_af:
418 mov opl,z_flags
419 mov oph,z_a
420 ret
421
422 do_fetch_bc:
423 ldd opl,y+oz_c
424 ldd oph,y+oz_b
425 ret
426
427 do_fetch_de:
428 ldd opl,y+oz_e
429 ldd oph,y+oz_d
430 ret
431
432 do_fetch_hl:
433 ldd opl,y+oz_l
434 ldd oph,y+oz_h
435 ret
436
437 .macro m_do_fetch_sp
438 movw opl,z_spl
439 .endm
440
441 .equ do_fetch_sp = 0
442 ; movw opl,z_spl
443 ; ret
444
445 do_fetch_mbc:
446 ldd xh,y+oz_b
447 ldd xl,y+oz_c
448 mem_read_d z_a
449 ret
450
451 do_fetch_mde:
452 ldd xh,y+oz_d
453 ldd xl,y+oz_e
454 mem_read_d z_a
455 ret
456
457 do_fetch_mhl:
458 ldd xh,y+oz_h
459 ldd xl,y+oz_l
460 mem_read_d opl
461 ret
462
463 do_fetch_msp:
464 movw x,z_spl
465 mem_read_d opl
466 adiw x,1
467 mem_read_d oph
468 ret
469
470 do_fetch_dir8:
471 mem_read_ds opl, z_pc
472 adiw z_pcl,1
473 ret
474
475 do_fetch_dir16:
476 mem_read_ds opl, z_pc
477 adiw z_pcl,1
478 mem_read_ds oph, z_pc
479 adiw z_pcl,1
480 ret
481
482 do_fetch_rst:
483 movw x,z_pcl
484 sbiw x,1
485 mem_read_d opl
486 andi opl,0x38
487 ldi oph,0
488 ret
489
490 ; ------------ Store phase stuff -----------------
491
492 store_ops:
493 .equ do_store_nop = do_x_nop
494
495
496 do_store_a:
497 mov z_a,opl
498 ret
499
500 ;.macro m_do_store_b
501 ; std y+oz_b,opl
502 ;.endm
503 ;.equ do_store_b = 0
504 do_store_b:
505 std y+oz_b,opl
506 ret
507
508 do_store_c:
509 std y+oz_c,opl
510 ret
511
512 do_store_d:
513 std y+oz_d,opl
514 ret
515
516 do_store_e:
517 std y+oz_e,opl
518 ret
519
520 do_store_h:
521 std y+oz_h,opl
522 ret
523
524 do_store_l:
525 std y+oz_l,opl
526 ret
527
528 do_store_af:
529 mov z_a,oph
530 mov z_flags,opl
531 ret
532
533 do_store_bc:
534 std y+oz_b,oph
535 std y+oz_c,opl
536 ret
537
538 do_store_de:
539 std y+oz_d,oph
540 std y+oz_e,opl
541 ret
542
543 do_store_hl:
544 std y+oz_h,oph
545 std y+oz_l,opl
546 ret
547
548 do_store_mbc:
549 ldd xh,y+oz_b
550 ldd xl,y+oz_c
551 mem_write_s z_a
552 ret
553
554 do_store_mde:
555 ldd xh,y+oz_d
556 ldd xl,y+oz_e
557 mem_write_s z_a
558 ret
559
560 do_store_mhl:
561 ldd xh,y+oz_h
562 ldd xl,y+oz_l
563 mem_write_s opl
564 ret
565
566 do_store_msp:
567 movw xl,z_spl
568 mem_write_s opl
569 adiw xl,1
570 mem_write_s oph
571 ret
572
573 do_store_sp:
574 movw z_spl,opl
575 ret
576
577 do_store_pc:
578 movw z_pcl,opl
579 ret
580
581 do_store_pcrel: ;add displacement to PC
582 #if EM_Z80
583 clr oph
584 tst opl ;sign extend
585 brpl stpcr1
586 com oph
587 stpcr1:
588 add z_pcl,opl
589 adc z_pch,oph
590 ret
591 #else
592 rjmp do_op_inv
593 #endif
594
595 do_store_ret:
596 movw x,z_spl
597 mem_read_d z_pcl
598 adiw x,1
599 mem_read_d z_pch
600 adiw x,1
601 movw z_spl,x
602
603 .if STACK_DBG
604 printnewline
605 printstring "Stack pop "
606 movw temp,z_pcl
607 rcall printhexw
608 printstring ", SP is now "
609 movw temp,z_spl
610 rcall printhexw
611 printstring ". "
612 .endif
613 ret
614
615 do_store_call:
616 movw xl,z_spl
617 sbiw x,1
618 mem_write_s z_pch
619 sbiw x,1
620 mem_write_s z_pcl
621 movw z_spl,xl
622
623 .if STACK_DBG
624 printnewline
625 printstring "Stack push "
626 movw temp,z_pcl
627 rcall printhexw
628 printstring ", SP is now "
629 movw temp,z_spl
630 rcall printhexw
631 printstring ". "
632 .endif
633 movw z_pcl,opl
634 ret
635
636
637 do_store_am:
638 mem_write_ds op, z_a
639 ret
640
641 ; ------------ Operation phase stuff -----------------
642
643 ;----------------------------------------------------------------
644 ;| |
645 ;| Zilog |
646 ;| |
647 ;| ZZZZZZZ 88888 000 |
648 ;| Z 8 8 0 0 |
649 ;| Z 8 8 0 0 0 |
650 ;| Z 88888 0 0 0 |
651 ;| Z 8 8 0 0 0 |
652 ;| Z 8 8 0 0 |
653 ;| ZZZZZZZ 88888 000 |
654 ;| |
655 ;| Z80 MICROPROCESSOR Instruction Set Summary |
656 ;| |
657 ;----------------------------------------------------------------
658 ;----------------------------------------------------------------
659 ;|Mnemonic |SZHPNC|Description |Notes |
660 ;|----------+------+---------------------+----------------------|
661 ;|ADC A,s |***V0*|Add with Carry |A=A+s+CY |
662 ;|ADC HL,ss |**?V0*|Add with Carry |HL=HL+ss+CY |
663 ;|ADD A,s |***V0*|Add |A=A+s |
664 ;|ADD HL,ss |--*-0*|Add |HL=HL+ss |
665 ;|ADD IX,pp |--*-0*|Add |IX=IX+pp |
666 ;|ADD IY,rr |--*-0*|Add |IY=IY+rr |
667 ;|AND s |**1P00|Logical AND |A=A&s |
668 ;|BIT b,m |?*1?0-|Test Bit |m&{2^b} |
669 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
670 ;|CALL nn |------|Unconditional Call |-[SP]=PC,PC=nn |
671 ;|CCF |--?-0*|Complement Carry Flag|CY=~CY |
672 ;|CP s |***V1*|Compare |A-s |
673 ;|CPD |****1-|Compare and Decrement|A-[HL],HL=HL-1,BC=BC-1|
674 ;|CPDR |****1-|Compare, Dec., Repeat|CPD till A=[HL]or BC=0|
675 ;|CPI |****1-|Compare and Increment|A-[HL],HL=HL+1,BC=BC-1|
676 ;|CPIR |****1-|Compare, Inc., Repeat|CPI till A=[HL]or BC=0|
677 ;|CPL |--1-1-|Complement |A=~A |
678 ;|DAA |***P-*|Decimal Adjust Acc. |A=BCD format |
679 ;|DEC s |***V1-|Decrement |s=s-1 |
680 ;|DEC xx |------|Decrement |xx=xx-1 |
681 ;|DEC ss |------|Decrement |ss=ss-1 |
682 ;|DI |------|Disable Interrupts |IFF1 = IFF2 = 0 |
683 ;|DJNZ e |------|Dec., Jump Non-Zero |B=B-1 till B=0 |
684 ;|EI |------|Enable Interrupts |IFF1 = IFF2 = 1 |
685 ;|EX [SP],HL|------|Exchange |[SP]<->HL |
686 ;|EX [SP],xx|------|Exchange |[SP]<->xx |
687 ;|EX AF,AF' |------|Exchange |AF<->AF' |
688 ;|EX DE,HL |------|Exchange |DE<->HL |
689 ;|EXX |------|Exchange |qq<->qq' (except AF)|
690 ;|HALT |------|Halt | |
691 ;|IM n |------|Interrupt Mode | (n=0,1,2)|
692 ;|IN A,[n] |------|Input |A=[n] |
693 ;|IN r,[C] |***P0-|Input |r=[C] |
694 ;|INC r |***V0-|Increment |r=r+1 |
695 ;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
696 ;|INC xx |------|Increment |xx=xx+1 |
697 ;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
698 ;|INC ss |------|Increment |ss=ss+1 |
699 ;|IND |?*??1-|Input and Decrement |[HL]=[C],HL=HL-1,B=B-1|
700 ;|INDR |?1??1-|Input, Dec., Repeat |IND till B=0 |
701 ;|INI |?*??1-|Input and Increment |[HL]=[C],HL=HL+1,B=B-1|
702 ;|INIR |?1??1-|Input, Inc., Repeat |INI till B=0 |
703 ;|JP [HL] |------|Unconditional Jump |PC=[HL] |
704 ;|JP [xx] |------|Unconditional Jump |PC=[xx] |
705 ;|JP nn |------|Unconditional Jump |PC=nn |
706 ;|JP cc,nn |------|Conditional Jump |If cc JP |
707 ;|JR e |------|Unconditional Jump |PC=PC+e |
708 ;|JR cc,e |------|Conditional Jump |If cc JR(cc=C,NC,NZ,Z)|
709 ;|LD dst,src|------|Load |dst=src |
710 ;|LD A,i |**0*0-|Load |A=i (i=I,R)|
711 ;|LDD |--0*0-|Load and Decrement |[DE]=[HL],HL=HL-1,# |
712 ;|LDDR |--000-|Load, Dec., Repeat |LDD till BC=0 |
713 ;|LDI |--0*0-|Load and Increment |[DE]=[HL],HL=HL+1,# |
714 ;|LDIR |--000-|Load, Inc., Repeat |LDI till BC=0 |
715 ;|NEG |***V1*|Negate |A=-A |
716 ;|NOP |------|No Operation | |
717 ;|OR s |**0P00|Logical inclusive OR |A=Avs |
718 ;|OTDR |?1??1-|Output, Dec., Repeat |OUTD till B=0 |
719 ;|OTIR |?1??1-|Output, Inc., Repeat |OUTI till B=0 |
720 ;|OUT [C],r |------|Output |[C]=r |
721 ;|OUT [n],A |------|Output |[n]=A |
722 ;|OUTD |?*??1-|Output and Decrement |[C]=[HL],HL=HL-1,B=B-1|
723 ;|OUTI |?*??1-|Output and Increment |[C]=[HL],HL=HL+1,B=B-1|
724 ;|POP xx |------|Pop |xx=[SP]+ |
725 ;|POP qq |------|Pop |qq=[SP]+ |
726 ;|PUSH xx |------|Push |-[SP]=xx |
727 ;|PUSH qq |------|Push |-[SP]=qq |
728 ;|RES b,m |------|Reset bit |m=m&{~2^b} |
729 ;|RET |------|Return |PC=[SP]+ |
730 ;|RET cc |------|Conditional Return |If cc RET |
731 ;|RETI |------|Return from Interrupt|PC=[SP]+ |
732 ;|RETN |------|Return from NMI |PC=[SP]+ |
733 ;|RL m |**0P0*|Rotate Left |m={CY,m}<- |
734 ;|RLA |--0-0*|Rotate Left Acc. |A={CY,A}<- |
735 ;|RLC m |**0P0*|Rotate Left Circular |m=m<- |
736 ;|RLCA |--0-0*|Rotate Left Circular |A=A<- |
737 ;|RLD |**0P0-|Rotate Left 4 bits |{A,[HL]}={A,[HL]}<- ##|
738 ;|RR m |**0P0*|Rotate Right |m=->{CY,m} |
739 ;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} |
740 ;|RRC m |**0P0*|Rotate Right Circular|m=->m |
741 ;|RRCA |--0-0*|Rotate Right Circular|A=->A |
742 ;|RRD |**0P0-|Rotate Right 4 bits |{A,[HL]}=->{A,[HL]} ##|
743 ;|RST p |------|Restart | (p=0H,8H,10H,...,38H)|
744 ;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY |
745 ;|SBC HL,ss |***V1*|Subtract with Carry |HL=HL-ss-CY |
746 ;|SCF |--0-01|Set Carry Flag |CY=1 |
747 ;|SET b,m |------|Set bit |m=mv{2^b} |
748 ;|SLA m |**0P0*|Shift Left Arithmetic|m=m*2 |
749 ;|SRA m |**0P0*|Shift Right Arith. |m=m/2 |
750 ;|SRL m |**0P0*|Shift Right Logical |m=->{0,m,CY} |
751 ;|SUB s |***V1*|Subtract |A=A-s |
752 ;|XOR s |**0P00|Logical Exclusive OR |A=Axs |
753 ;|----------+------+--------------------------------------------|
754 ;| F |-*01? |Flag unaffected/affected/reset/set/unknown |
755 ;| S |S |Sign flag (Bit 7) |
756 ;| Z | Z |Zero flag (Bit 6) |
757 ;| HC | H |Half Carry flag (Bit 4) |
758 ;| P/V | P |Parity/Overflow flag (Bit 2, V=overflow) |
759 ;| N | N |Add/Subtract flag (Bit 1) |
760 ;| CY | C|Carry flag (Bit 0) |
761 ;|-----------------+--------------------------------------------|
762 ;| n |Immediate addressing |
763 ;| nn |Immediate extended addressing |
764 ;| e |Relative addressing (PC=PC+2+offset) |
765 ;| [nn] |Extended addressing |
766 ;| [xx+d] |Indexed addressing |
767 ;| r |Register addressing |
768 ;| [rr] |Register indirect addressing |
769 ;| |Implied addressing |
770 ;| b |Bit addressing |
771 ;| p |Modified page zero addressing (see RST) |
772 ;|-----------------+--------------------------------------------|
773 ;|DEFB n(,...) |Define Byte(s) |
774 ;|DEFB 'str'(,...) |Define Byte ASCII string(s) |
775 ;|DEFS nn |Define Storage Block |
776 ;|DEFW nn(,...) |Define Word(s) |
777 ;|-----------------+--------------------------------------------|
778 ;| A B C D E |Registers (8-bit) |
779 ;| AF BC DE HL |Register pairs (16-bit) |
780 ;| F |Flag register (8-bit) |
781 ;| I |Interrupt page address register (8-bit) |
782 ;| IX IY |Index registers (16-bit) |
783 ;| PC |Program Counter register (16-bit) |
784 ;| R |Memory Refresh register |
785 ;| SP |Stack Pointer register (16-bit) |
786 ;|-----------------+--------------------------------------------|
787 ;| b |One bit (0 to 7) |
788 ;| cc |Condition (C,M,NC,NZ,P,PE,PO,Z) |
789 ;| d |One-byte expression (-128 to +127) |
790 ;| dst |Destination s, ss, [BC], [DE], [HL], [nn] |
791 ;| e |One-byte expression (-126 to +129) |
792 ;| m |Any register r, [HL] or [xx+d] |
793 ;| n |One-byte expression (0 to 255) |
794 ;| nn |Two-byte expression (0 to 65535) |
795 ;| pp |Register pair BC, DE, IX or SP |
796 ;| qq |Register pair AF, BC, DE or HL |
797 ;| qq' |Alternative register pair AF, BC, DE or HL |
798 ;| r |Register A, B, C, D, E, H or L |
799 ;| rr |Register pair BC, DE, IY or SP |
800 ;| s |Any register r, value n, [HL] or [xx+d] |
801 ;| src |Source s, ss, [BC], [DE], [HL], nn, [nn] |
802 ;| ss |Register pair BC, DE, HL or SP |
803 ;| xx |Index register IX or IY |
804 ;|-----------------+--------------------------------------------|
805 ;| + - * / ^ |Add/subtract/multiply/divide/exponent |
806 ;| & ~ v x |Logical AND/NOT/inclusive OR/exclusive OR |
807 ;| <- -> |Rotate left/right |
808 ;| [ ] |Indirect addressing |
809 ;| [ ]+ -[ ] |Indirect addressing auto-increment/decrement|
810 ;| { } |Combination of operands |
811 ;| # |Also BC=BC-1,DE=DE-1 |
812 ;| ## |Only lower 4 bits of accumulator A used |
813 ;----------------------------------------------------------------
814
815 ;How the flags are supposed to work:
816 ;7 ZFL_S - Sign flag (=MSBit of result)
817 ;6 ZFL_Z - Zero flag. Is 1 when the result is 0
818 ;4 ZFL_H - Half-carry (carry from bit 3 to 4)
819 ;2 ZFL_P - Parity/2-complement Overflow
820 ;1 ZFL_N - Subtract - set if last op was a subtract
821 ;0 ZFL_C - Carry
822 ;
823 ;I sure hope I got the mapping between flags and instructions correct...
824
825 .equ ZFL_S = 7
826 .equ ZFL_Z = 6
827 .equ ZFL_H = 4
828 .equ ZFL_P = 2
829 .equ ZFL_N = 1
830 .equ ZFL_C = 0
831
832 .equ AVR_T = SREG_T
833 .equ AVR_H = SREG_H
834 .equ AVR_S = SREG_S
835 .equ AVR_V = SREG_V
836 .equ AVR_N = SREG_N
837 .equ AVR_Z = SREG_Z
838 .equ AVR_C = SREG_C
839
840 ; TODO: check Z80 flag settings
841
842 ;------------------------------------------------;
843 ; Load table value from flash indexed by source reg.
844 ;
845 ; ldpmx dstreg,tablebase,indexreg
846 ;
847 ; (3 words, 5 cycles)
848
849 .macro ldpmx
850 ldi zh,high(@1*2) ; table must be page aligned
851 mov zl,@2
852 lpm @0,z
853 .endm
854
855 .macro do_z80_flags_V
856 #if EM_Z80
857 bmov z_flags, ZFL_P, temp, AVR_V
858 #endif
859 .endm
860
861 .macro do_z80_flags_H
862 #if EM_Z80
863 bmov z_flags, ZFL_H, temp, AVR_H
864 #endif
865 .endm
866
867 .macro do_z80_flags_set_N
868 #if EM_Z80
869 ori z_flags, (1<<ZFL_N) ; Negation auf 1
870 #endif
871 .endm
872
873 .macro do_z80_flags_set_HN
874 #if EM_Z80
875 ori z_flags,(1<<ZFL_N)|(1<<ZFL_H)
876 #endif
877 .endm
878
879 .macro do_z80_flags_clear_N
880 #if EM_Z80
881 andi z_flags,~(1<<ZFL_N)
882 #endif
883 .endm
884
885 .macro do_z80_flags_clear_HN
886 #if EM_Z80
887 andi z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
888 #endif
889 .endm
890
891
892 .macro do_z80_flags_copy_HC
893 #if EM_Z80
894 bmov z_flags, ZFL_H, z_flags, ZFL_C
895 #endif
896 .endm
897
898 .macro do_z80_flags_op_rotate
899 ; must not change avr carry flag!
900 #if EM_Z80
901 andi z_flags, ~( (1<<ZFL_H) | (1<<ZFL_N) | (1<<ZFL_C) )
902 #else
903 andi z_flags, ~( (1<<ZFL_C) )
904 #endif
905 .endm
906
907 .macro do_z80_flags_op_and
908 #if EM_Z80
909 ori z_flags,(1<<ZFL_H)
910 #endif
911 .endm
912
913 .macro do_z80_flags_op_or
914 #if EM_Z80
915 ;nothing to do
916 #endif
917 .endm
918
919
920 ;----------------------------------------------------------------
921
922 .equ do_op_nop = do_x_nop
923
924 do_op_inv:
925 sbiw z_pcl,1
926 lcall printregs
927 printstring "Invalid opcode! "
928
929 haltinv:
930 rjmp haltinv
931
932
933 ;----------------------------------------------------------------
934 ;|Mnemonic |SZHPNC|Description |Notes |
935 ;----------------------------------------------------------------
936 ;|HALT |------|Halt | |
937
938
939 do_op_HALT:
940 sbiw z_pcl,1
941 sbrc intstat,i_halt
942 ret
943 sbr intstat,(1<<i_halt)
944 lcall printregs
945 printstring "CPU halted! "
946 ret
947
948 ;----------------------------------------------------------------
949 ;|Mnemonic |SZHPNC|Description |Notes |
950 ;----------------------------------------------------------------
951 ;|OUT [n],A |------|Output |[n]=A |
952 ;
953 ;
954 ;Interface with peripherials goes here :)
955 do_op_outa: ; out (opl),a
956 .if PORT_DEBUG
957 printnewline
958 printstring "Port write: "
959 mov temp,z_a
960 lcall printhex
961 printstring " -> ("
962 mov temp,opl
963 lcall printhex
964 printstring ") "
965 .endif
966 mov temp,z_a
967 mov temp2,opl
968 lcall portWrite
969 ret
970
971 ;----------------------------------------------------------------
972 ;|Mnemonic |SZHPNC|Description |Notes |
973 ;----------------------------------------------------------------
974 ;|IN A,[n] |------|Input |A=[n] |
975 ;
976 ;
977 do_op_ina: ; in a,(opl)
978 .if PORT_DEBUG
979 push opl
980 cp opl,_0 ; don't debug port 0 (con stat)
981 breq dbg_op_ina_1
982 printnewline
983 printstring "Port read: ("
984 mov temp,opl
985 lcall printhex
986 printstring ") -> "
987 dbg_op_ina_1:
988 .endif
989
990 mov temp2,opl
991 lcall portRead
992 mov z_a,temp
993
994 .if PORT_DEBUG
995 pop temp
996 cp temp,_0
997 breq dbg_op_ina_2
998 lcall printhex
999 printstring " "
1000 dbg_op_ina_2:
1001 .endif
1002 ret
1003
1004 ;----------------------------------------------------------------
1005 ;|Mnemonic |SZHPNC|Description |Notes |
1006 ;----------------------------------------------------------------
1007 ;|INC r |***V0-|Increment |r=r+1 |
1008 ;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
1009 ;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
1010 ;|----------|SZHP C|---------- 8080 ----------------------------|
1011 ;|INC r |**-P0-|Increment |r=r+1 |
1012 ;|INC [HL] |**-P0-|Increment |[HL]=[HL]+1 |
1013 ;
1014
1015 do_op_inc:
1016 #if EM_Z80
1017 andi z_flags,(1<<ZFL_C) ; preserve C-, Clear N-flag
1018 ldi temp,1
1019 add opl,temp
1020 in temp,sreg
1021 bmov z_flags,ZFL_S, temp,AVR_N
1022 bmov z_flags,ZFL_Z, temp,AVR_Z
1023 bmov z_flags,ZFL_H, temp,AVR_H
1024 bmov z_flags,ZFL_P, temp,AVR_V
1025 #else /* 8080 */
1026 andi z_flags,(1<<ZFL_C)|(1<<ZFL_H) ; preserve C- and H-flag
1027 inc opl
1028 ldpmx temp,sz53p_tab,opl ;S,Z,P flag
1029 or z_flags,temp
1030 #endif
1031 ret
1032
1033 do_op_inca:
1034 #if EM_Z80
1035 andi z_flags,(1<<ZFL_C) ; preserve C-, Clear N-flag
1036 ldi temp,1
1037 add z_a,temp
1038 in temp,sreg
1039 bmov z_flags,ZFL_S, temp,AVR_N
1040 bmov z_flags,ZFL_Z, temp,AVR_Z
1041 bmov z_flags,ZFL_H, temp,AVR_H
1042 bmov z_flags,ZFL_P, temp,AVR_V
1043 #else /* 8080 */
1044 andi z_flags,(1<<ZFL_C)|(1<<ZFL_H) ; preserve C- and H-flag
1045 inc z_a
1046 ldpmx temp,sz53p_tab,z_a ; S,Z,P flag
1047 or z_flags,temp
1048 #endif
1049 ret
1050
1051 ;----------------------------------------------------------------
1052 ;|Mnemonic |SZHPNC|Description |Notes |
1053 ;----------------------------------------------------------------
1054 ;|DEC r |***V1-|Decrement |s=s-1 |
1055 ;|DEC [HL] |***V0-|Increment |[HL]=[HL]-1 |
1056 ;|DEC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]-1 |
1057 ;|----------|SZHP C|---------- 8080 ----------------------------|
1058 ;|DEC r |**-P -|Increment |r=r-1 |
1059 ;|DEC [HL] |**-P -|Increment |[HL]=[HL]-1 |
1060 ;
1061
1062 do_op_dec:
1063 subi opl,1
1064 #if EM_Z80
1065 in temp,sreg
1066 bmov z_flags,ZFL_S, temp,AVR_N
1067 bmov z_flags,ZFL_Z, temp,AVR_Z
1068 bmov z_flags,ZFL_H, temp,AVR_H
1069 bmov z_flags,ZFL_P, temp,AVR_V
1070 ori z_flags,(1<<ZFL_N) ; Set N-flag
1071 #else /* 8080 */
1072 andi z_flags,(1<<ZFL_C)|(1<<ZFL_H) ; preserve C- and H-flag
1073 ldpmx temp,sz53p_tab,opl ; S,Z,P flag
1074 or z_flags,temp
1075 #endif
1076 ret
1077
1078
1079 do_op_deca:
1080 #if EM_Z80
1081 ldi temp,1
1082 sub z_a,temp
1083 in temp,sreg
1084 bmov z_flags,ZFL_S, temp,AVR_N
1085 bmov z_flags,ZFL_Z, temp,AVR_Z
1086 bmov z_flags,ZFL_H, temp,AVR_H
1087 bmov z_flags,ZFL_P, temp,AVR_V
1088 ori z_flags,(1<<ZFL_N) ; Set N-flag
1089 #else /* 8080 */
1090 dec z_a
1091 andi z_flags,(1<<ZFL_C)|(1<<ZFL_H) ; preserve C- and H-flag
1092 ldpmx temp,sz53p_tab,z_a ; S,Z,P flag
1093 or z_flags,temp
1094 #endif
1095 ret
1096
1097
1098 ;----------------------------------------------------------------
1099 ;|Mnemonic |SZHPNC|Description |Notes |
1100 ;----------------------------------------------------------------
1101 ;|INC xx |------|Increment |xx=xx+1 |
1102 ;|INC ss |------|Increment |ss=ss+1 |
1103 ;
1104 ;
1105 do_op_inc16:
1106 subi opl,low(-1)
1107 sbci oph,high(-1)
1108 ret
1109
1110 ;----------------------------------------------------------------
1111 ;|Mnemonic |SZHPNC|Description |Notes |
1112 ;----------------------------------------------------------------
1113 ;|DEC xx |------|Decrement |xx=xx-1 |
1114 ;|DEC ss |------|Decrement |ss=ss-1 |
1115 ;
1116 ;
1117 do_op_dec16:
1118 subi opl, 1
1119 sbci oph, 0
1120 ret
1121
1122 ;----------------------------------------------------------------
1123 ;|Mnemonic |SZHPNC|Description |Notes |
1124 ;----------------------------------------------------------------
1125 ;|RLCA |--0-0*|Rotate Left Circular |A=A<- |
1126 ;|----------|SZHP C|---------- 8080 ----------------------------|
1127 ;|RLCA |---- *|Rotate Left Circular |A=A<- |
1128 ;
1129 ;
1130 do_op_rlca:
1131 ;Rotate Left Cyclical. All bits move 1 to the
1132 ;left, the msb becomes c and lsb.
1133 do_z80_flags_op_rotate
1134 lsl z_a
1135 brcc do_op_rlc_noc
1136 ldi temp,1
1137 or z_a,temp
1138 ori z_flags, (1<<ZFL_C)
1139 do_op_rlc_noc:
1140 ret
1141
1142 ;----------------------------------------------------------------
1143 ;|Mnemonic |SZHPNC|Description |Notes |
1144 ;----------------------------------------------------------------
1145 ;|RRCA |--0-0*|Rotate Right Circular|A=->A |
1146 ;|----------|SZHP C|---------- 8080 ----------------------------|
1147 ;|RRCA |---- *|Rotate Right Circular|A=->A |
1148 ;
1149 ;
1150 do_op_rrca:
1151 ;Rotate Right Cyclical. All bits move 1 to the
1152 ;right, the lsb becomes c and msb.
1153 do_z80_flags_op_rotate
1154 lsr z_a
1155 brcc do_op_rrc_noc
1156 ldi temp,0x80
1157 or z_a,temp
1158 ori z_flags, (1<<ZFL_C)
1159 do_op_rrc_noc:
1160 ret
1161
1162 ;----------------------------------------------------------------
1163 ;|Mnemonic |SZHPNC|Description |Notes |
1164 ;----------------------------------------------------------------
1165 ;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} |
1166 ;|----------|SZHP C|---------- 8080 ----------------------------|
1167 ;|RRA |---- *|Rotate Right Acc. |A=->{CY,A} |
1168 ;
1169 ;
1170 do_op_rra:
1171 ;Rotate Right. All bits move 1 to the right, the lsb
1172 ;becomes c, c becomes msb.
1173 clc ; get z80 carry to avr carry
1174 sbrc z_flags,ZFL_C
1175 sec
1176 do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C)
1177 bmov z_flags,ZFL_C, z_a,0 ; Bit 0 --> CY
1178 ror z_a
1179 ret
1180
1181 ;----------------------------------------------------------------
1182 ;|Mnemonic |SZHPNC|Description |Notes |
1183 ;----------------------------------------------------------------
1184 ;|RLA |--0-0*|Rotate Left Acc. |A={CY,A}<- |
1185 ;|----------|SZHP C|---------- 8080 ----------------------------|
1186 ;|RLA |---- *|Rotate Left Acc. |A={CY,A}<- |
1187 ;
1188 ;
1189 do_op_rla:
1190 ;Rotate Left. All bits move 1 to the left, the msb
1191 ;becomes c, c becomes lsb.
1192 clc
1193 sbrc z_flags,ZFL_C
1194 sec
1195 do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C)
1196 bmov z_flags,ZFL_C, z_a,7 ; Bit 7 --> CY
1197 rol z_a
1198 ret
1199
1200 ;----------------------------------------------------------------
1201 ;|Mnemonic |SZHPNC|Description |Notes |
1202 ;----------------------------------------------------------------
1203 ;|ADD A,s |***V0*|Add |A=A+s |
1204 ;|----------|SZHP C|---------- 8080 ----------------------------|
1205 ;|ADD A,s |***P *|Add |A=A+s |
1206 ;
1207 ;
1208 do_op_adda:
1209 add z_a,opl
1210 in temp,sreg
1211 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P flag
1212 bmov z_flags,ZFL_C, temp,AVR_C
1213 bmov z_flags,ZFL_H, temp,AVR_H
1214 do_z80_flags_V
1215 ret
1216
1217 ;----------------------------------------------------------------
1218 ;|Mnemonic |SZHPNC|Description |Notes |
1219 ;----------------------------------------------------------------
1220 ;|ADC A,s |***V0*|Add with Carry |A=A+s+CY |
1221 ;|----------|SZHP C|---------- 8080 ----------------------------|
1222 ;|ADC A,s |***P *|Add with Carry |A=A+s+CY |
1223 ;
1224 ;
1225 do_op_adca:
1226 clc
1227 sbrc z_flags,ZFL_C
1228 sec
1229 adc z_a,opl
1230 in temp,sreg
1231 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
1232 bmov z_flags,ZFL_C, temp,AVR_C
1233 bmov z_flags,ZFL_H, temp,AVR_H
1234 do_z80_flags_V
1235 ret
1236
1237 ;----------------------------------------------------------------
1238 ;|Mnemonic |SZHPNC|Description |Notes |
1239 ;----------------------------------------------------------------
1240 ;|SUB s |***V1*|Subtract |A=A-s |
1241 ;|----------|SZHP C|---------- 8080 ----------------------------|
1242 ;|SUB s |***P *|Subtract |A=A-s |
1243
1244 ;
1245 do_op_subfa:
1246 sub z_a,opl
1247 in temp,sreg
1248 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
1249 bmov z_flags,ZFL_C, temp,AVR_C
1250 bmov z_flags,ZFL_H, temp,AVR_H
1251 do_z80_flags_V
1252 do_z80_flags_set_N
1253 ret
1254
1255 ;----------------------------------------------------------------
1256 ;|Mnemonic |SZHPNC|Description |Notes |
1257 ;----------------------------------------------------------------
1258 ;|CP s |***V1*|Compare |A-s |
1259 ;|----------|SZHP C|---------- 8080 ----------------------------|
1260 ;|CP s |***P *|Compare |A-s |
1261
1262 ;
1263 do_op_cpfa:
1264 mov temp2,z_a
1265 sub temp2,opl
1266 in temp,sreg
1267 ldpmx z_flags,sz53p_tab,temp2 ;S,Z,P
1268 bmov z_flags,ZFL_C, temp,AVR_C
1269 bmov z_flags,ZFL_H, temp,AVR_H
1270 do_z80_flags_V
1271 do_z80_flags_set_N
1272 ret
1273
1274 ;----------------------------------------------------------------
1275 ;|Mnemonic |SZHPNC|Description |Notes |
1276 ;----------------------------------------------------------------
1277 ;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY |
1278 ;|----------|SZHP C|---------- 8080 ----------------------------|
1279 ;|SBC A,s |***P *|Subtract with Carry |A=A-s-CY |
1280 ;
1281 ;
1282 do_op_sbcfa:
1283 clc
1284 sbrc z_flags,ZFL_C
1285 sec
1286 sbc z_a,opl
1287 in temp,sreg
1288 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
1289 bmov z_flags,ZFL_C, temp,AVR_C
1290 bmov z_flags,ZFL_H, temp,AVR_H
1291 do_z80_flags_V
1292 do_z80_flags_set_N
1293 ret
1294
1295 ;----------------------------------------------------------------
1296 ;|Mnemonic |SZHPNC|Description |Notes |
1297 ;----------------------------------------------------------------
1298 ;|AND s |**1P00|Logical AND |A=A&s |
1299 ;|----------|SZHP C|---------- 8080 ----------------------------|
1300 ;|AND s |**-P 0|Logical AND |A=A&s |
1301 ;
1302 ;
1303 do_op_anda:
1304 and z_a,opl ;
1305 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P,N,C
1306 do_z80_flags_op_and
1307 ret
1308
1309
1310 ;----------------------------------------------------------------
1311 ;|Mnemonic |SZHPNC|Description |Notes |
1312 ;----------------------------------------------------------------
1313 ;|OR s |**0P00|Logical inclusive OR |A=Avs |
1314 ;|----------|SZHP C|---------- 8080 ----------------------------|
1315 ;|OR s |**-P00|Logical inclusive OR |A=Avs |
1316 ;
1317 ;
1318 do_op_ora:
1319 or z_a,opl
1320 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C
1321 do_z80_flags_op_or
1322 ret
1323
1324 ;----------------------------------------------------------------
1325 ;|Mnemonic |SZHPNC|Description |Notes |
1326 ;----------------------------------------------------------------
1327 ;|XOR s |**0P00|Logical Exclusive OR |A=Axs |
1328 ;|----------|SZHP C|---------- 8080 ----------------------------|
1329 ;|XOR s |**-P 0|Logical Exclusive OR |A=Axs |
1330 ;
1331 ;
1332 do_op_xora:
1333 eor z_a,opl
1334 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C
1335 do_z80_flags_op_or
1336 ret
1337
1338 ;----------------------------------------------------------------
1339 ;|Mnemonic |SZHPNC|Description |Notes |
1340 ;----------------------------------------------------------------
1341 ;|ADD HL,ss |--*-0*|Add |HL=HL+ss |
1342 ;|----------|SZHP C|---------- 8080 ----------------------------|
1343 ;|ADD HL,ss |---- *|Add |HL=HL+ss |
1344 ;
1345 ;
1346 do_op_addhl:
1347 ldd temp,y+oz_l
1348 ldd temp2,y+oz_h
1349 add opl,temp
1350 adc oph,temp2
1351 std y+oz_l,opl
1352 std y+oz_h,oph
1353 in temp,sreg
1354 bmov z_flags,ZFL_C, temp,AVR_C
1355 do_z80_flags_H
1356 do_z80_flags_clear_N
1357 ret
1358
1359 ;----------------------------------------------------------------
1360 ;|Mnemonic |SZHPNC|Description |Notes |
1361 ;----------------------------------------------------------------
1362 ;|LD dst,src|------|Load |dst=src |
1363 ;
1364 ;
1365 do_op_sthl: ;store hl to mem loc in opl:h
1366 movw xl,opl
1367 ldd temp,y+oz_l
1368 mem_write
1369 adiw xl,1
1370 ldd temp,y+oz_h
1371 mem_write
1372 ret
1373
1374 ;----------------------------------------------------------------
1375 ;|Mnemonic |SZHPNC|Description |Notes |
1376 ;----------------------------------------------------------------
1377 ;|LD dst,src|------|Load |dst=src |
1378 ;
1379 ;
1380 do_op_rmem16:
1381 movw xl,opl
1382 mem_read_d opl
1383 adiw x,1
1384 mem_read_d oph
1385 ret
1386
1387 ;----------------------------------------------------------------
1388 ;|Mnemonic |SZHPNC|Description |Notes |
1389 ;----------------------------------------------------------------
1390 ;|LD dst,src|------|Load |dst=src |
1391 ;
1392 ;
1393 do_op_rmem8:
1394 mem_read_ds opl, op
1395 ret
1396
1397 ;----------------------------------------------------------------
1398 ;|Mnemonic |SZHPNC|Description |Notes |
1399 ;----------------------------------------------------------------
1400 ;|DAA |***P-*|Decimal Adjust Acc. | |
1401 ;|----------|SZHP C|---------- 8080 ----------------------------|
1402
1403
1404 ; Description (http://www.z80.info/z80syntx.htm#DAA):
1405 ; This instruction conditionally adjusts the accumulator for BCD addition
1406 ; and subtraction operations. For addition (ADD, ADC, INC) or subtraction
1407 ; (SUB, SBC, DEC, NEC), the following table indicates the operation performed:
1408 ;
1409 ; -------------------------------------------------------------------
1410 ; | |C Flag |HEX value in|H Flag |HEX val in | Number |C flag |
1411 ; | Oper |Before |upper digit |Before |lower digit| added |After |
1412 ; | |DAA |(bit 7-4) |DAA |(bit 3-0) | to A |DAA |
1413 ; |-------+-------+------------+-------+-----------+--------+-------|
1414 ; | | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
1415 ; | ADD | 0 | 0-8 | 0 | A-F | 06 | 0 |
1416 ; | | 0 | 0-9 | 1 | 0-3 | 06 | 0 |
1417 ; | ADC | 0 | A-F | 0 | 0-9 | 60 | 1 |
1418 ; | | 0 | 9-F | 0 | A-F | 66 | 1 |
1419 ; | INC | 0 | A-F | 1 | 0-3 | 66 | 1 |
1420 ; | | 1 | 0-2 | 0 | 0-9 | 60 | 1 |
1421 ; | | 1 | 0-2 | 0 | A-F | 66 | 1 |
1422 ; | | 1 | 0-3 | 1 | 0-3 | 66 | 1 |
1423 ; |-------+-------+------------+-------+-----------+--------+-------|
1424 ; | SUB | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
1425 ; | SBC | 0 | 0-8 | 1 | 6-F | FA | 0 |
1426 ; | DEC | 1 | 7-F | 0 | 0-9 | A0 | 1 |
1427 ; | NEG | 1 | 6-F | 1 | 6-F | 9A | 1 |
1428 ; -------------------------------------------------------------------
1429 ;
1430 ; The H flag is affected as follows:
1431 ;
1432 ; ---------------------
1433 ; | N | H | low |H' |
1434 ; | | |nibble | |
1435 ; |---+---+-------+---|
1436 ; | 0 | * | 0-9 | 0 |
1437 ; | 0 | * | a-f | 1 |
1438 ; | 1 | 0 | * | 0 |
1439 ; | 1 | 1 | 6-f | 0 |
1440 ; | 1 | 1 | 0-5 | 1 |
1441 ; ---------------------
1442 ;
1443 ; Ohter flags:
1444 ; N: Unaffected.
1445 ; P/V: Set if Acc. is even parity after operation, reset otherwise.
1446 ; Z: Set if Acc. is Zero after operation, reset otherwise.
1447 ; S: Set if most significant bit of Acc. is 1 after operation, reset otherwise.
1448
1449
1450
1451 #if 0
1452
1453 #if EM_Z80
1454 sbrc z_flags,ZFL_N ;if add-op
1455 rjmp op_da_sub ;then
1456 #endif
1457
1458 do_op_DAA:
1459 op_da_add:
1460 ldi temp2,0 ; new C, H and N flag
1461 sbrc z_flags,ZFL_H ; |
1462 rjmp op_da_a01 ; if (H flag ...
1463 mov temp,opl ; |
1464 andi temp,0x0f ; |
1465 cpi temp,0x0a ; or (lower nibble >= 0x0A))
1466 brlo op_da_a10 ; |
1467 op_da_a01: ; then
1468 ldi oph,0x06 ; add 6 to lower nibble
1469 add opl,oph ;
1470 brhc op_da_02 ; if
1471 ori temp2,(1<<ZFL_H) ; set new H flag
1472 op_da_02: ;
1473 brcc op_da_a10 ; if
1474 ori temp2,(1<<ZFL_C) ; set new H flag
1475 op_da_a10: ; endif
1476 sbrc z_flags,ZFL_C ; |
1477 rjmp op_da_a12 ; if (C flag ...
1478 cpi opl,0xA0 ; |... or upper nibble >= 0xA0)
1479 brlo op_da_a13 ;
1480 op_da_a12: ;
1481 ldi oph,0x60 ; add 6 to lower nibble
1482 add opl,oph ;
1483 ori temp2,(1<<ZFL_C) ; set new C flag
1484 op_da_a13: ;
1485 ldpmx z_flags, sz53p_tab, opl ; get S,Z,P flag
1486 or z_flags,temp2 ; merge new C and H flag
1487 ret
1488
1489 #if EM_Z80
1490
1491 op_da_sub: ;Else (sub-op)
1492 ldi temp2,(1<<ZFL_N) ; new C, H and N flag
1493 sbrc z_flags,ZFL_H ; |
1494 rjmp op_da_s01 ; if (H flag ...
1495 mov temp,opl ; |
1496 andi temp,0x0f ; |
1497 cpi temp,0x0a ; or (lower nibble >= 0x0A))
1498 brlo op_da_s10 ; |
1499 op_da_s01: ; then
1500 ldi oph,0x06 ; add 6 to lower nibble
1501 sub opl,oph ;
1502 brhc PC+2 ; if
1503 ori temp2,(1<<ZFL_H) ; set new H flag
1504 brcc op_da_s10 ; if
1505 ori temp2,(1<<ZFL_C) ; set new C flag
1506 op_da_s10: ; endif
1507 sbrc z_flags,ZFL_C ; |
1508 rjmp op_da_s12 ; if (C flag ...
1509 cpi opl,0x90 ; |... or upper nibble >= 0xA0)
1510 brlo op_da_s13 ;
1511 op_da_s12: ;
1512 ldi oph,0x60 ; add 6 to lower nibble
1513 sub opl,oph ;
1514 ori temp2,(1<<ZFL_C) ; set new C flag
1515 op_da_s13: ;
1516 ldpmx z_flags, sz53p_tab, opl ; get S,Z,P flag
1517 or z_flags,temp2 ; merge new C and H flag
1518 ret
1519
1520 #endif
1521
1522 #else
1523
1524 do_op_DAA:
1525 ldi oph,0 ;oph: what to add
1526
1527 #if EM_Z80
1528 sbrc z_flags,ZFL_N ;if add-op
1529 rjmp op_da_sub ;then
1530 #endif
1531
1532 op_da_add:
1533 ldi temp2,0 ; new C, H and N flag
1534 mov temp,opl ; |
1535 andi temp,0x0f ; |
1536 cpi temp,0x0a ; if (lower nibble >= 0x0A)
1537 brlo op_da_a10 ; |
1538 ori oph,0x06 ; add 6
1539 ori temp2,(1<<ZFL_H) ; set new H flag
1540
1541 sbrc z_flags,ZFL_C ; |
1542 rjmp op_da_a02 ; if (C flag ...
1543 cpi opl,0x90 ; |... or upper nibble >= 0x90)
1544 brlo op_da_a03 ; |
1545 op_da_a02:
1546 ori oph,0x60 ; add 0x60
1547 ori temp2,(1<<ZFL_C) ; set new C flag
1548 op_da_a03: ; endif
1549 rjmp op_da_ae
1550 op_da_a10: ; else (lower nibble is 0x09 or lower)
1551 sbrc z_flags,ZFL_C ; |
1552 rjmp op_da_a12 ; if (C flag ...
1553 cpi opl,0xA0 ; |... or upper nibble >= 0xA0)
1554 brlo op_da_a13 ;
1555 op_da_a12:
1556 ori oph,0x60 ; add 0x60
1557 ori temp2,(1<<ZFL_C) ; set new C flag
1558 op_da_a13:
1559 sbrs z_flags,ZFL_H ; if (H flag)
1560 rjmp op_da_ae ; |
1561 ori oph,0x06 ; add 0x06
1562 mov temp,opl ; |
1563 andi temp,0x0f ; |
1564 cpi temp,0x06 ; if (lower nibble < 0x6)
1565 brsh op_da_ae ; |
1566 ; ori temp2,(1<<ZFL_H) ; set new H flag
1567 ; endif
1568 ; endif
1569 op_da_ae:
1570 add opl,oph
1571 ldpmx z_flags, sz53p_tab, opl ; get S,Z,P flag
1572 or z_flags,temp2 ; merge new C and H flag
1573 ret
1574
1575 #if EM_Z80
1576
1577 op_da_sub: ;Else (sub-op)
1578 ldi temp2,(1<<ZFL_N) ; new C, H and N flag
1579 mov temp,opl ; |
1580 andi temp,0x0f ; |
1581 cpi temp,0x0a ; if (lower nibble >= 0x0A)
1582 brlo op_da_s10 ; |
1583 ori oph,0x06 ; sub 6
1584
1585 sbrc z_flags,ZFL_C ; |
1586 rjmp op_da_s02 ; if (C flag ...
1587 cpi opl,0x90 ; |... or upper nibble >= 0x90)
1588 brlo op_da_s03 ; |
1589 op_da_s02:
1590 ori oph,0x60 ; sub 0x60
1591 ori temp2,(1<<ZFL_C) ; set new C flag
1592 op_da_s03: ; endif
1593 rjmp op_da_se
1594 op_da_s10: ; else (lower nibble is 0x09 or lower)
1595 sbrc z_flags,ZFL_C ; |
1596 rjmp op_da_s12 ; if (C flag ...
1597 cpi opl,0xA0 ; |... or upper nibble >= 0xA0)
1598 brlo op_da_s13 ;
1599 op_da_s12:
1600 ori oph,0x60 ; sub 0x60
1601 ori temp2,(1<<ZFL_C) ; set new C flag
1602 op_da_s13:
1603 sbrs z_flags,ZFL_H ; if (H flag)
1604 rjmp op_da_se ; |
1605 ori oph,0x06 ; sub 0x06
1606 mov temp,opl ; |
1607 andi temp,0x0f ; |
1608 cpi temp,0x06 ; if (lower nibble < 0x06)
1609 brcc op_da_se ; |
1610 ori temp2,(1<<ZFL_H) ; set new H flag
1611 ; endif
1612 ; endif
1613 op_da_se:
1614 sub opl,oph
1615 ldpmx z_flags, sz53p_tab, opl ; get S,Z,P flag
1616 or z_flags,temp2 ; merge new C and H flag
1617 ret ;Endif
1618
1619 #endif /* EM_Z80 */
1620 #endif /* alternatives */
1621
1622
1623 ;----------------------------------------------------------------
1624 ;|Mnemonic |SZHPNC|Description |Notes |
1625 ;----------------------------------------------------------------
1626 ;|SCF |--0-01|Set Carry Flag |CY=1 |
1627 ;|----------|SZHP C|---------- 8080 ----------------------------|
1628 ;
1629 ;
1630 do_op_scf:
1631 do_z80_flags_clear_HN
1632 ori z_flags,(1<<ZFL_C)
1633 ret
1634
1635 ;----------------------------------------------------------------
1636 ;|Mnemonic |SZHPNC|Description |Notes |
1637 ;----------------------------------------------------------------
1638 ;|CCF |--?-0*|Complement Carry Flag|CY=~CY, HC=previous CY|
1639 ;|----------|SZHP C|---------- 8080 ----------------------------|
1640 ;|CCF |---- 1|Set Carry Flag |CY=1 |
1641 ;
1642 do_op_ccf:
1643 do_z80_flags_clear_N
1644 do_z80_flags_copy_HC
1645 ldi temp,(1<<ZFL_C)
1646 eor z_flags,temp
1647 ret
1648
1649 ;----------------------------------------------------------------
1650 ;|Mnemonic |SZHPNC|Description |Notes |
1651 ;----------------------------------------------------------------
1652 ;|CPL |--1-1-|Complement |A=~A |
1653 ;|----------|SZHP C|---------- 8080 ----------------------------|
1654 ;|CPL |---- -|Complement |A=~A |
1655 ;
1656 ;
1657 do_op_cpl:
1658 com z_a
1659 do_z80_flags_set_HN
1660 ret
1661
1662
1663 ;----------------------------------------------------------------
1664 ;|Mnemonic |SZHPNC|Description |Notes |
1665 ;----------------------------------------------------------------
1666 ;|PUSH xx |------|Push |-[SP]=xx |
1667 ;|PUSH qq |------|Push |-[SP]=qq |
1668 ;
1669 ;
1670 do_op_push16:
1671 movw xl,z_spl
1672 sbiw x,1
1673 mem_write_s oph
1674 sbiw x,1
1675 mem_write_s opl
1676 movw z_spl,xl
1677
1678 .if STACK_DBG
1679 printnewline
1680 printstring "Stack push "
1681 movw temp,opl
1682 rcall printhexw
1683 printstring ", SP is now "
1684 movw temp,z_spl
1685 rcall printhexw
1686 printstring ". "
1687 .endif
1688
1689 ret
1690
1691 ;----------------------------------------------------------------
1692 ;|Mnemonic |SZHPNC|Description |Notes |
1693 ;----------------------------------------------------------------
1694 ;|POP xx |------|Pop |xx=[SP]+ |
1695 ;|POP qq |------|Pop |qq=[SP]+ |
1696 ;
1697 ;
1698 do_op_pop16:
1699 movw x,z_spl
1700 mem_read_d opl
1701 adiw x,1
1702 mem_read_d oph
1703 adiw x,1
1704 movw z_spl,x
1705
1706 .if STACK_DBG
1707 printnewline
1708 printstring "Stack pop "
1709 movw temp,opl
1710 rcall printhexw
1711 printstring ", SP is now "
1712 movw temp,z_spl
1713 rcall printhexw
1714 printstring ". "
1715 .endif
1716 ret
1717
1718 ;----------------------------------------------------------------
1719 ;|Mnemonic |SZHPNC|Description |Notes |
1720 ;----------------------------------------------------------------
1721 ;|EX [SP],HL|------|Exchange |[SP]<->HL |
1722 ;|EX DE,HL |------|Exchange |DE<->HL |
1723 ;-----------------------------Z80--------------------------------
1724 ;
1725 do_op_exhl:
1726 ldd temp,y+oz_l
1727 ldd temp2,y+oz_h
1728 std y+oz_l,opl
1729 std y+oz_h,oph
1730 movw opl,temp
1731 ret
1732
1733 ;----------------------------------------------------------------
1734 ;|Mnemonic |SZHPNC|Description |Notes |
1735 ;----------------------------------------------------------------
1736 ;|DI |------|Disable Interrupts |IFF1 = IFF2 = 0 |
1737 ;|EI |------|Enable Interrupts |IFF1 = IFF2 = 1 |
1738 ;
1739
1740 do_op_DI:
1741 #if EM_Z80
1742 ldd temp,y+oz_istat
1743 andi temp,~((1<<IFF2) | (1<<IFF1))
1744 std y+oz_istat,temp
1745 #endif
1746 ret
1747
1748 do_op_EI:
1749 #if EM_Z80
1750 ldd temp,y+oz_istat
1751 ori temp,(1<<IFF2) | (1<<IFF1)
1752 std y+oz_istat,temp
1753 #endif
1754 ret
1755
1756 ;----------------------------------------------------------------
1757 ;|Mnemonic |SZHPNC|Description |Notes |
1758 ;----------------------------------------------------------------
1759 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1760 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1761 ;|RET cc |------|Conditional Return |If cc RET |
1762 ;
1763 ;
1764 do_op_ifnz:
1765 sbrs z_flags, ZFL_Z
1766 ret
1767 pop temp ; nix tun
1768 pop temp ; direkt zurueck zu main
1769 ret
1770
1771 ;----------------------------------------------------------------
1772 ;|Mnemonic |SZHPNC|Description |Notes |
1773 ;----------------------------------------------------------------
1774 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1775 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1776 ;|RET cc |------|Conditional Return |If cc RET |
1777 ;
1778 ;
1779 do_op_ifz:
1780 sbrc z_flags, ZFL_Z
1781 ret
1782 pop temp ; nix tun
1783 pop temp ; direkt zurueck zu main
1784 ret
1785
1786 ;----------------------------------------------------------------
1787 ;|Mnemonic |SZHPNC|Description |Notes |
1788 ;----------------------------------------------------------------
1789 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1790 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1791 ;|RET cc |------|Conditional Return |If cc RET |
1792 ;
1793 ;
1794 do_op_ifnc:
1795 sbrs z_flags, ZFL_C
1796 ret
1797 pop temp ; nix tun
1798 pop temp ; direkt zuruech zu main
1799 ret
1800
1801 ;----------------------------------------------------------------
1802 ;|Mnemonic |SZHPNC|Description |Notes |
1803 ;----------------------------------------------------------------
1804 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1805 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1806 ;|RET cc |------|Conditional Return |If cc RET |
1807 ;
1808 ;
1809 do_op_ifc:
1810 sbrc z_flags, ZFL_C
1811 ret
1812 pop temp ; nix tun
1813 pop temp ; direkt zuruech zu main
1814 ret
1815
1816 ;----------------------------------------------------------------
1817 ;|Mnemonic |SZHPNC|Description |Notes |
1818 ;----------------------------------------------------------------
1819 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1820 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1821 ;|RET cc |------|Conditional Return |If cc RET |
1822 ;
1823 ;
1824 do_op_ifpo:
1825 sbrs z_flags, ZFL_P
1826 ret
1827 pop temp ; nix tun
1828 pop temp ; direkt zuruech zu main
1829 ret
1830
1831 ;----------------------------------------------------------------
1832 ;|Mnemonic |SZHPNC|Description |Notes |
1833 ;----------------------------------------------------------------
1834 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1835 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1836 ;|RET cc |------|Conditional Return |If cc RET |
1837 ;
1838 ;
1839 do_op_ifpe:
1840 sbrc z_flags, ZFL_P
1841 ret
1842 pop temp ; nix tun
1843 pop temp ; direkt zuruech zu main
1844 ret
1845
1846 ;----------------------------------------------------------------
1847 ;|Mnemonic |SZHPNC|Description |Notes |
1848 ;----------------------------------------------------------------
1849 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1850 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1851 ;|RET cc |------|Conditional Return |If cc RET |
1852 ;
1853 ;
1854 do_op_ifp: ;sign positive, aka s=0
1855 sbrs z_flags, ZFL_S
1856 ret
1857 pop temp ; nix tun
1858 pop temp ; direkt zuruech zu main
1859 ret
1860
1861 ;----------------------------------------------------------------
1862 ;|Mnemonic |SZHPNC|Description |Notes |
1863 ;----------------------------------------------------------------
1864 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1865 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1866 ;|RET cc |------|Conditional Return |If cc RET |
1867 ;
1868 ;
1869 do_op_ifm: ;sign negative, aka s=1
1870 sbrc z_flags, ZFL_S
1871 ret
1872 pop temp ; nix tun
1873 pop temp ; direkt zuruech zu main
1874 ret
1875
1876 ;----------------------------------------------------------------
1877
1878 #if EM_Z80
1879
1880 ;----------------------------------------------------------------
1881 ;|Mnemonic |SZHPNC|Description |Notes |
1882 ;----------------------------------------------------------------
1883 ;|DJNZ e |------|Dec., Jump Non-Zero |B=B-1 till B=0 |
1884 ;
1885 ;The b register is decremented, and if not zero, the signed value e is added to pc.
1886 ;The jump is measured from the start of the instruction opcode.
1887 ;e = Relative addressing (PC=PC+2+offset)
1888
1889 #if 1
1890
1891 ; (Joe G.)
1892 do_op_DJNZ: ; decremt B, jump B=0
1893 ldd temp,y+oz_b ; B in temp
1894 dec temp ; temp decrementieren
1895 std y+oz_b,temp ; temp in B
1896 breq do_op_DJNZ_Z ; bei B=0
1897 subi opl, 0x80 ; z_pc + e im Zweierkomplement
1898 subi z_pcl,0x80
1899 sbc z_pch,_0
1900 add z_pcl,opl
1901 adc z_pch,_0
1902 do_op_DJNZ_Z:
1903 ret
1904
1905 #else
1906
1907 do_op_djnz:
1908 ldd temp,y+oz_b
1909 dec temp
1910 std y+oz_b,temp
1911 brne opdjnze
1912 pop temp ; nix tun
1913 pop temp ; direkt zurueck zu main
1914 opdjnze:
1915 ret
1916
1917 #endif
1918
1919 ;----------------------------------------------------------------
1920 ;|Mnemonic |SZHPNC|Description |Notes |
1921 ;----------------------------------------------------------------
1922 ;|EX AF,AF' |------|Exchange |AF<->AF' |
1923
1924 do_op_EXAF:
1925 ldd temp,y+oz_f2
1926 ldd temp2,y+oz_a2
1927 std y+oz_f2,z_flags
1928 std y+oz_a2,z_a
1929 mov z_flags,temp
1930 mov z_a,temp2
1931 ret
1932
1933
1934 ;----------------------------------------------------------------
1935 ;|Mnemonic |SZHPNC|Description |Notes |
1936 ;----------------------------------------------------------------
1937 ;|EXX |------|Exchange |qq<->qq' (except AF)|
1938
1939
1940 do_op_EXX:
1941 ldiw z,z_b
1942 ldi temp3,6
1943 opexx_loop:
1944 ld temp,z
1945 ldd temp2,z+r2ofs
1946 std z+r2ofs,temp
1947 st z+,temp2
1948 dec temp3
1949 brne opexx_loop
1950 ret
1951
1952 #else
1953 do_op_djnz:
1954 do_op_EXAF:
1955 do_op_EXX:
1956 ljmp do_op_inv
1957 ret
1958 #endif
1959
1960 #if EM_Z80
1961
1962 do_op_noni:
1963 sbiw z_pcl,1 ;--z_pc
1964 ret
1965
1966 do_op_prefixED:
1967 mem_read_ds zl,z_pc ;zl = memReadByte(z_pc)
1968 adiw z_pcl,1 ;++z_pc
1969 ldi zh,high(EDjmp) ;
1970 ijmp
1971
1972
1973 do_op_prefixDD:
1974 cbi flags,prefixfd
1975 mem_read_ds zl,z_pc ;zl = memReadByte(z_pc)
1976 adiw z_pcl,1 ;++z_pc
1977 ldi zh,high(DDFDjmp) ;
1978 ijmp
1979
1980
1981 do_op_prefixFD:
1982 sbi flags,prefixfd
1983 mem_read_ds zl,z_pc ;zl = memReadByte(z_pc)
1984 adiw z_pcl,1 ;++z_pc
1985 ldi zh,high(DDFDjmp) ;
1986 ijmp
1987
1988 do_op_prefixCB:
1989 mem_read_ds zl,z_pc ;zl = memReadByte(z_pc)
1990 adiw z_pcl,1 ;++z_pc
1991 ldi zh,high(CBjmp) ;
1992 ijmp
1993
1994
1995 do_op_prefixDDFDCB:
1996 sbic flags,prefixfd
1997 rjmp opprxcb_fd
1998 ldd xh,y+oz_xh
1999 ldd xl,y+oz_xl
2000 rjmp opprxcb_1
2001 opprxcb_fd:
2002 ldd xh,y+oz_yh
2003 ldd xl,y+oz_yl
2004 opprxcb_1:
2005 mem_read_s z_pc ;get displacement
2006 adiw z_pcl,1 ;++z_pc
2007 clr temp2 ;sign extend
2008 tst temp
2009 brpl PC+2
2010 com temp2
2011 add xl,temp ;add displacement
2012 adc xh,temp2
2013 mem_read_d opl
2014
2015 mem_read_ds zl,z_pc ;zl = opcode
2016 adiw z_pcl,1 ;++z_pc
2017 ldi zh,high(DDFDCBjmp) ;
2018 icall
2019 mem_write_s opl
2020 ret
2021
2022
2023 #else ; TODO: geht das so?
2024
2025 do_op_prefixED:
2026 do_op_prefixDD:
2027 do_op_prefixFD:
2028 do_op_prefixCB:
2029 ljmp do_op_inv
2030 ret
2031 #endif
2032
2033
2034 ; ----------------------- Opcode decoding -------------------------
2035
2036 ; Lookup table for Z80 opcodes. Translates the first byte of the instruction word into three
2037 ; operations: fetch, do something, store.
2038 ; The table is made of 256 words.
2039
2040 opctable opcjmp
2041
2042 instr fetch_nop, op_nop, store_nop ;00 ;NOP
2043 instr fetch_DIR16, op_nop, store_BC ;01 nn nn ;LD BC,nn
2044 instr fetch_nop, op_nop, store_MBC ;02 ;LD (BC),A
2045 instr fetch_BC, op_INC16, store_BC ;03 ;INC BC
2046 instr fetch_B, op_INC, store_B ;04 ;INC B
2047 instr fetch_B, op_DEC, store_B ;05 ;DEC B
2048 instr fetch_DIR8, op_nop, store_B ;06 ;LD B,n
2049 instr fetch_nop, op_RLCA, store_nop ;07 ;RLCA
2050 instr fetch_nop, op_EXAF, store_nop ;08 ;EX AF,AF'
2051 instr fetch_BC, op_ADDHL, store_nop ;09 ;ADD HL,BC
2052 instr fetch_MBC, op_nop, store_nop ;0A ;LD A,(BC)
2053 instr fetch_BC, op_DEC16, store_BC ;0B ;DEC BC
2054 instr fetch_C, op_INC, store_C ;0C ;INC C
2055 instr fetch_C, op_DEC, store_C ;0D ;DEC C
2056 instr fetch_DIR8, op_nop, store_C ;0E nn ;LD C,n
2057 instr fetch_nop, op_RRCA, store_nop ;0F ;RRCA
2058 instr fetch_DIR8, op_DJNZ, store_nop ;10 oo ;DJNZ o
2059 instr fetch_DIR16, op_nop, store_DE ;11 nn nn ;LD DE,nn
2060 instr fetch_nop, op_nop, store_MDE ;12 ;LD (DE),A
2061 instr fetch_DE, op_INC16, store_DE ;13 ;INC DE
2062 instr fetch_D, op_INC, store_D ;14 ;INC D
2063 instr fetch_D, op_DEC, store_D ;15 ;DEC D
2064 instr fetch_DIR8, op_nop, store_D ;16 nn ;LD D,n
2065 instr fetch_nop, op_RLA, store_nop ;17 ;RLA
2066 instr fetch_DIR8, op_nop, store_pcrel ;18 oo ;JR o
2067 instr fetch_DE, op_ADDHL, store_nop ;19 ;ADD HL,DE
2068 instr fetch_MDE, op_nop, store_nop ;1A ;LD A,(DE)
2069 instr fetch_DE, op_DEC16, store_DE ;1B ;DEC DE
2070 instr fetch_E, op_INC, store_E ;1C ;INC E
2071 instr fetch_E, op_DEC, store_E ;1D ;DEC E
2072 instr fetch_DIR8, op_nop, store_E ;1E nn ;LD E,n
2073 instr fetch_nop, op_RRA, store_nop ;1F ;RRA
2074 instr fetch_DIR8, op_IFNZ, store_pcrel ;20 oo ;JR NZ,o
2075 instr fetch_DIR16, op_nop, store_HL ;21 nn nn ;LD HL,nn
2076 instr fetch_DIR16, op_STHL, store_nop ;22 nn nn ;LD (nn),HL
2077 instr fetch_HL, op_INC16, store_HL ;23 ;INC HL
2078 instr fetch_H, op_INC, store_H ;24 ;INC H
2079 instr fetch_H, op_DEC, store_H ;25 ;DEC H
2080 instr fetch_DIR8, op_nop, store_H ;26 nn ;LD H,n
2081 instr fetch_A, op_DAA, store_A ;27 ;DAA
2082 instr fetch_DIR8, op_IFZ, store_pcrel ;28 oo ;JR Z,o
2083 instr fetch_HL, op_ADDHL, store_nop ;29 ;ADD HL,HL
2084 instr fetch_DIR16, op_RMEM16, store_HL ;2A nn nn ;LD HL,(nn)
2085 instr fetch_HL, op_DEC16, store_HL ;2B ;DEC HL
2086 instr fetch_L, op_INC, store_L ;2C ;INC L
2087 instr fetch_L, op_DEC, store_L ;2D ;DEC L
2088 instr fetch_DIR8, op_nop, store_L ;2E nn ;LD L,n
2089 instr fetch_nop, op_CPL, store_nop ;2F ;CPL
2090 instr fetch_DIR8, op_IFNC, store_pcrel ;30 oo ;JR NC,o
2091 instr fetch_DIR16, op_nop, store_SP ;31 nn nn ;LD SP,nn
2092 instr fetch_DIR16, op_nop, store_AM ;32 nn nn ;LD (nn),A
2093 instr fetch_SP, op_INC16, store_SP ;33 ;INC SP
2094 instr fetch_MHL, op_INC, store_MHL ;34 ;INC (HL)
2095 instr fetch_MHL, op_DEC, store_MHL ;35 ;DEC (HL)
2096 instr fetch_DIR8, op_nop, store_MHL ;36 nn ;LD (HL),n
2097 instr fetch_nop, op_SCF, store_nop ;37 ;SCF
2098 instr fetch_DIR8, op_IFC, store_pcrel ;38 oo ;JR C,o
2099 instr fetch_SP, op_ADDHL, store_nop ;39 ;ADD HL,SP
2100 instr fetch_DIR16, op_RMEM8, store_A ;3A nn nn ;LD A,(nn)
2101 instr fetch_SP, op_DEC16, store_SP ;3B ;DEC SP
2102 instr fetch_nop, op_INCA, store_nop ;3C ;INC A
2103 instr fetch_nop, op_DECA, store_nop ;3D ;DEC A
2104 instr fetch_DIR8, op_nop, store_A ;3E nn ;LD A,n
2105 instr fetch_nop, op_CCF, store_nop ;3F ;CCF (Complement Carry Flag, gvd)
2106 instr fetch_nop, op_nop, store_nop ;40 ;LD B,B
2107 instr fetch_C, op_nop, store_B ;41 ;LD B,C
2108 instr fetch_D, op_nop, store_B ;42 ;LD B,D
2109 instr fetch_E, op_nop, store_B ;43 ;LD B,E
2110 instr fetch_H, op_nop, store_B ;44 ;LD B,H
2111 instr fetch_L, op_nop, store_B ;45 ;LD B,L
2112 instr fetch_MHL, op_nop, store_B ;46 ;LD B,(HL)
2113 instr fetch_A, op_nop, store_B ;47 ;LD B,A
2114 instr fetch_B, op_nop, store_C ;48 ;LD C,B
2115 instr fetch_nop, op_nop, store_nop ;49 ;LD C,C
2116 instr fetch_D, op_nop, store_C ;4A ;LD C,D
2117 instr fetch_E, op_nop, store_C ;4B ;LD C,E
2118 instr fetch_H, op_nop, store_C ;4C ;LD C,H
2119 instr fetch_L, op_nop, store_C ;4D ;LD C,L
2120 instr fetch_MHL, op_nop, store_C ;4E ;LD C,(HL)
2121 instr fetch_A, op_nop, store_C ;4F ;LD C,A
2122 instr fetch_B, op_nop, store_D ;50 ;LD D,B
2123 instr fetch_C, op_nop, store_D ;51 ;LD D,C
2124 instr fetch_nop, op_nop, store_nop ;52 ;LD D,D
2125 instr fetch_E, op_nop, store_D ;53 ;LD D,E
2126 instr fetch_H, op_nop, store_D ;54 ;LD D,H
2127 instr fetch_L, op_nop, store_D ;55 ;LD D,L
2128 instr fetch_MHL, op_nop, store_D ;56 ;LD D,(HL)
2129 instr fetch_A, op_nop, store_D ;57 ;LD D,A
2130 instr fetch_B, op_nop, store_E ;58 ;LD E,B
2131 instr fetch_C, op_nop, store_E ;59 ;LD E,C
2132 instr fetch_D, op_nop, store_E ;5A ;LD E,D
2133 instr fetch_nop, op_nop, store_nop ;5B ;LD E,E
2134 instr fetch_H, op_nop, store_E ;5C ;LD E,H
2135 instr fetch_L, op_nop, store_E ;5D ;LD E,L
2136 instr fetch_MHL, op_nop, store_E ;5E ;LD E,(HL)
2137 instr fetch_A, op_nop, store_E ;5F ;LD E,A
2138 instr fetch_B, op_nop, store_H ;60 ;LD H,B
2139 instr fetch_C, op_nop, store_H ;61 ;LD H,C
2140 instr fetch_D, op_nop, store_H ;62 ;LD H,D
2141 instr fetch_E, op_nop, store_H ;63 ;LD H,E
2142 instr fetch_nop, op_nop, store_nop ;64 ;LD H,H
2143 instr fetch_L, op_nop, store_H ;65 ;LD H,L
2144 instr fetch_MHL, op_nop, store_H ;66 ;LD H,(HL)
2145 instr fetch_A, op_nop, store_H ;67 ;LD H,A
2146 instr fetch_B, op_nop, store_L ;68 ;LD L,B
2147 instr fetch_C, op_nop, store_L ;69 ;LD L,C
2148 instr fetch_D, op_nop, store_L ;6A ;LD L,D
2149 instr fetch_E, op_nop, store_L ;6B ;LD L,E
2150 instr fetch_H, op_nop, store_L ;6C ;LD L,H
2151 instr fetch_nop, op_nop, store_nop ;6D ;LD L,L
2152 instr fetch_MHL, op_nop, store_L ;6E ;LD L,(HL)
2153 instr fetch_A, op_nop, store_L ;6F ;LD L,A
2154 instr fetch_B, op_nop, store_MHL ;70 ;LD (HL),B
2155 instr fetch_C, op_nop, store_MHL ;71 ;LD (HL),C
2156 instr fetch_D, op_nop, store_MHL ;72 ;LD (HL),D
2157 instr fetch_E, op_nop, store_MHL ;73 ;LD (HL),E
2158 instr fetch_H, op_nop, store_MHL ;74 ;LD (HL),H
2159 instr fetch_L, op_nop, store_MHL ;75 ;LD (HL),L
2160 instr fetch_nop, op_HALT, store_nop ;76 ;HALT
2161 instr fetch_A, op_nop, store_MHL ;77 ;LD (HL),A
2162 instr fetch_B, op_nop, store_A ;78 ;LD A,B
2163 instr fetch_C, op_nop, store_A ;79 ;LD A,C
2164 instr fetch_D, op_nop, store_A ;7A ;LD A,D
2165 instr fetch_E, op_nop, store_A ;7B ;LD A,E
2166 instr fetch_H, op_nop, store_A ;7C ;LD A,H
2167 instr fetch_L, op_nop, store_A ;7D ;LD A,L
2168 instr fetch_MHL, op_nop, store_A ;7E ;LD A,(HL)
2169 instr fetch_nop, op_nop, store_nop ;7F ;LD A,A
2170 instr fetch_B, op_ADDA, store_nop ;80 ;ADD A,B
2171 instr fetch_C, op_ADDA, store_nop ;81 ;ADD A,C
2172 instr fetch_D, op_ADDA, store_nop ;82 ;ADD A,D
2173 instr fetch_E, op_ADDA, store_nop ;83 ;ADD A,E
2174 instr fetch_H, op_ADDA, store_nop ;84 ;ADD A,H
2175 instr fetch_L, op_ADDA, store_nop ;85 ;ADD A,L
2176 instr fetch_MHL, op_ADDA, store_nop ;86 ;ADD A,(HL)
2177 instr fetch_A, op_ADDA, store_nop ;87 ;ADD A,A
2178 instr fetch_B, op_ADCA, store_nop ;88 ;ADC A,B
2179 instr fetch_C, op_ADCA, store_nop ;89 ;ADC A,C
2180 instr fetch_D, op_ADCA, store_nop ;8A ;ADC A,D
2181 instr fetch_E, op_ADCA, store_nop ;8B ;ADC A,E
2182 instr fetch_H, op_ADCA, store_nop ;8C ;ADC A,H
2183 instr fetch_L, op_ADCA, store_nop ;8D ;ADC A,L
2184 instr fetch_MHL, op_ADCA, store_nop ;8E ;ADC A,(HL)
2185 instr fetch_A, op_ADCA, store_nop ;8F ;ADC A,A
2186 instr fetch_B, op_SUBFA, store_nop ;90 ;SUB A,B
2187 instr fetch_C, op_SUBFA, store_nop ;91 ;SUB A,C
2188 instr fetch_D, op_SUBFA, store_nop ;92 ;SUB A,D
2189 instr fetch_E, op_SUBFA, store_nop ;93 ;SUB A,E
2190 instr fetch_H, op_SUBFA, store_nop ;94 ;SUB A,H
2191 instr fetch_L, op_SUBFA, store_nop ;95 ;SUB A,L
2192 instr fetch_MHL, op_SUBFA, store_nop ;96 ;SUB A,(HL)
2193 instr fetch_A, op_SUBFA, store_nop ;97 ;SUB A,A
2194 instr fetch_B, op_SBCFA, store_nop ;98 ;SBC A,B
2195 instr fetch_C, op_SBCFA, store_nop ;99 ;SBC A,C
2196 instr fetch_D, op_SBCFA, store_nop ;9A ;SBC A,D
2197 instr fetch_E, op_SBCFA, store_nop ;9B ;SBC A,E
2198 instr fetch_H, op_SBCFA, store_nop ;9C ;SBC A,H
2199 instr fetch_L, op_SBCFA, store_nop ;9D ;SBC A,L
2200 instr fetch_MHL, op_SBCFA, store_nop ;9E ;SBC A,(HL)
2201 instr fetch_A, op_SBCFA, store_nop ;9F ;SBC A,A
2202 instr fetch_B, op_ANDA, store_nop ;A0 ;AND A,B
2203 instr fetch_C, op_ANDA, store_nop ;A1 ;AND A,C
2204 instr fetch_D, op_ANDA, store_nop ;A2 ;AND A,D
2205 instr fetch_E, op_ANDA, store_nop ;A3 ;AND A,E
2206 instr fetch_H, op_ANDA, store_nop ;A4 ;AND A,H
2207 instr fetch_L, op_ANDA, store_nop ;A5 ;AND A,L
2208 instr fetch_MHL, op_ANDA, store_nop ;A6 ;AND A,(HL)
2209 instr fetch_A, op_ANDA, store_nop ;A7 ;AND A,A
2210 instr fetch_B, op_XORA, store_nop ;A8 ;XOR A,B
2211 instr fetch_C, op_XORA, store_nop ;A9 ;XOR A,C
2212 instr fetch_D, op_XORA, store_nop ;AA ;XOR A,D
2213 instr fetch_E, op_XORA, store_nop ;AB ;XOR A,E
2214 instr fetch_H, op_XORA, store_nop ;AC ;XOR A,H
2215 instr fetch_L, op_XORA, store_nop ;AD ;XOR A,L
2216 instr fetch_MHL, op_XORA, store_nop ;AE ;XOR A,(HL)
2217 instr fetch_A, op_XORA, store_nop ;AF ;XOR A,A
2218 instr fetch_B, op_ORA, store_nop ;B0 ;OR A,B
2219 instr fetch_C, op_ORA, store_nop ;B1 ;OR A,C
2220 instr fetch_D, op_ORA, store_nop ;B2 ;OR A,D
2221 instr fetch_E, op_ORA, store_nop ;B3 ;OR A,E
2222 instr fetch_H, op_ORA, store_nop ;B4 ;OR A,H
2223 instr fetch_L, op_ORA, store_nop ;B5 ;OR A,L
2224 instr fetch_MHL, op_ORA, store_nop ;B6 ;OR A,(HL)
2225 instr fetch_A, op_ORA, store_nop ;B7 ;OR A,A
2226 instr fetch_B, op_CPFA, store_nop ;B8 ;CP A,B
2227 instr fetch_C, op_CPFA, store_nop ;B9 ;CP A,C
2228 instr fetch_D, op_CPFA, store_nop ;BA ;CP A,D
2229 instr fetch_E, op_CPFA, store_nop ;BB ;CP A,E
2230 instr fetch_H, op_CPFA, store_nop ;BC ;CP A,H
2231 instr fetch_L, op_CPFA, store_nop ;BD ;CP A,L
2232 instr fetch_MHL, op_CPFA, store_nop ;BE ;CP A,(HL)
2233 instr fetch_A, op_CPFA, store_nop ;BF ;CP A,A
2234 instr fetch_nop, op_IFNZ, store_RET ;C0 ;RET NZ
2235 instr fetch_nop, op_POP16, store_BC ;C1 ;POP BC
2236 instr fetch_DIR16, op_IFNZ, store_PC ;C2 nn nn ;JP NZ,nn
2237 instr fetch_DIR16, op_nop, store_PC ;C3 nn nn ;JP nn
2238 instr fetch_DIR16, op_IFNZ, store_CALL ;C4 nn nn ;CALL NZ,nn
2239 instr fetch_BC, op_PUSH16, store_nop ;C5 ;PUSH BC
2240 instr fetch_DIR8, op_ADDA, store_nop ;C6 nn ;ADD A,n
2241 instr fetch_RST, op_nop, store_CALL ;C7 ;RST 0
2242 instr fetch_nop, op_IFZ, store_RET ;C8 ;RET Z
2243 instr fetch_nop, op_nop, store_RET ;C9 ;RET
2244 instr fetch_DIR16, op_IFZ, store_PC ;CA nn nn ;JP Z,nn
2245 instr fetch_nop, op_prefixCB, store_nop ;CB ;(CB opcode prefix)
2246 instr fetch_DIR16, op_IFZ, store_CALL ;CC nn nn ;CALL Z,nn
2247 instr fetch_DIR16, op_nop, store_CALL ;CD nn nn ;CALL nn
2248 instr fetch_DIR8, op_ADCA, store_nop ;CE nn ;ADC A,n
2249 instr fetch_RST, op_nop, store_CALL ;CF ;RST 8H
2250 instr fetch_nop, op_IFNC, store_RET ;D0 ;RET NC
2251 instr fetch_nop, op_POP16, store_DE ;D1 ;POP DE
2252 instr fetch_DIR16, op_IFNC, store_PC ;D2 nn nn ;JP NC,nn
2253 instr fetch_DIR8, op_OUTA, store_nop ;D3 nn ;OUT (n),A
2254 instr fetch_DIR16, op_IFNC, store_CALL ;D4 nn nn ;CALL NC,nn
2255 instr fetch_DE, op_PUSH16, store_nop ;D5 ;PUSH DE
2256 instr fetch_DIR8, op_SUBFA, store_nop ;D6 nn ;SUB n
2257 instr fetch_RST, op_nop, store_CALL ;D7 ;RST 10H
2258 instr fetch_nop, op_IFC, store_RET ;D8 ;RET C
2259 instr fetch_nop, op_EXX, store_nop ;D9 ;EXX
2260 instr fetch_DIR16, op_IFC, store_PC ;DA nn nn ;JP C,nn
2261 instr fetch_DIR8, op_INA, store_nop ;DB nn ;IN A,(n)
2262 instr fetch_DIR16, op_IFC, store_CALL ;DC nn nn ;CALL C,nn
2263 instr fetch_nop, op_prefixDD, store_nop ;DD ;(DD opcode prefix)
2264 instr fetch_DIR8, op_SBCFA, store_nop ;DE nn ;SBC A,n
2265 instr fetch_RST, op_nop, store_CALL ;DF ;RST 18H
2266 instr fetch_nop, op_IFPO, store_RET ;E0 ;RET PO
2267 instr fetch_nop, op_POP16, store_HL ;E1 ;POP HL
2268 instr fetch_DIR16, op_IFPO, store_PC ;E2 nn nn ;JP PO,nn
2269 instr fetch_MSP, op_EXHL, store_MSP ;E3 ;EX (SP),HL
2270 instr fetch_DIR16, op_IFPO, store_CALL ;E4 nn nn ;CALL PO,nn
2271 instr fetch_HL, op_PUSH16, store_nop ;E5 ;PUSH HL
2272 instr fetch_DIR8, op_ANDA, store_nop ;E6 nn ;AND n
2273 instr fetch_RST, op_nop, store_CALL ;E7 ;RST 20H
2274 instr fetch_nop, op_IFPE, store_RET ;E8 ;RET PE
2275 instr fetch_HL, op_nop, store_PC ;E9 ;JP HL
2276 instr fetch_DIR16, op_IFPE, store_PC ;EA nn nn ;JP PE,nn
2277 instr fetch_DE, op_EXHL, store_DE ;EB ;EX DE,HL
2278 instr fetch_DIR16, op_IFPE, store_CALL ;EC nn nn ;CALL PE,nn
2279 instr fetch_nop, op_prefixED, store_nop ;ED ;(ED opcode prefix)
2280 instr fetch_DIR8, op_XORA, store_nop ;EE nn ;XOR n
2281 instr fetch_RST, op_nop, store_CALL ;EF ;RST 28H
2282 instr fetch_nop, op_IFP, store_RET ;F0 ;RET P
2283 instr fetch_nop, op_POP16, store_AF ;F1 ;POP AF
2284 instr fetch_DIR16, op_IFP, store_PC ;F2 nn nn ;JP P,nn
2285 instr fetch_nop, op_DI, store_nop ;F3 ;DI
2286 instr fetch_DIR16, op_IFP, store_CALL ;F4 nn nn ;CALL P,nn
2287 instr fetch_AF, op_PUSH16, store_nop ;F5 ;PUSH AF
2288 instr fetch_DIR8, op_ORA, store_nop ;F6 nn ;OR n
2289 instr fetch_RST, op_nop, store_CALL ;F7 ;RST 30H
2290 instr fetch_nop, op_IFM, store_RET ;F8 ;RET M
2291 instr fetch_HL, op_nop, store_SP ;F9 ;LD SP,HL
2292 instr fetch_DIR16, op_IFM, store_PC ;FA nn nn ;JP M,nn
2293 instr fetch_nop, op_EI, store_nop ;FB ;EI
2294 instr fetch_DIR16, op_IFM, store_CALL ;FC nn nn ;CALL M,nn
2295 instr fetch_nop, op_prefixFD, store_nop ;FD ;(FD opcode prefix)
2296 instr fetch_DIR8, op_CPFA, store_nop ;FE nn ;CP n
2297 instr fetch_RST, op_nop, store_CALL ;FF ;RST 38H
2298
2299
2300 #if EM_Z80
2301
2302
2303
2304 do_fetch_0:
2305 ldi opl,0
2306 ret
2307
2308 do_fetch_dir8_2:
2309 movw xl,z_pcl
2310 adiw xl,1
2311 mem_read_d opl
2312 ret
2313
2314 ;----------------------------------------------------------------
2315 ;|Mnemonic |SZHPNC|Description |Notes |
2316 ;----------------------------------------------------------------
2317 ;|IN r,[C] |***P0-|Input |r=[C] |
2318 ;
2319
2320 do_op_in: ; in opl,(opl)
2321 .if PORT_DEBUG
2322 push opl
2323 cp opl,_0 ; don't debug port 0 (con stat)
2324 breq dbg_op_in_1
2325 printnewline
2326 printstring "Port read: ("
2327 mov temp,opl
2328 lcall printhex
2329 printstring ") -> "
2330 dbg_op_in_1:
2331 .endif
2332
2333 mov temp2,opl
2334 lcall portRead
2335 mov opl,temp
2336 bst z_flags,ZFL_C ;save Carry
2337 ldpmx z_flags,sz53p_tab,temp ;S,Z,P
2338 bld z_flags,ZFL_C
2339
2340 .if PORT_DEBUG
2341 pop temp
2342 cp temp,_0
2343 breq dbg_op_in_2
2344 lcall printhex
2345 printstring " "
2346 dbg_op_in_2:
2347 .endif
2348 ret
2349
2350 ;----------------------------------------------------------------
2351 ;|Mnemonic |SZHPNC|Description |Notes |
2352 ;----------------------------------------------------------------
2353 ;|OUT [C],r |------|Output |[C]=r |
2354 ;
2355
2356 do_op_out: ; out (c),opl
2357 mov temp,opl
2358 ldd temp2,y+oz_c
2359 lcall portWrite
2360 ret
2361
2362 ;----------------------------------------------------------------
2363 ;|Mnemonic |SZHPNC|Description |Notes |
2364 ;----------------------------------------------------------------
2365 ;|LD dst,src|------|Load |dst=src |
2366 ;
2367
2368 do_op_stbc: ;store bc to mem loc in opl:h
2369 movw xl,opl
2370 ldd temp,y+oz_c
2371 mem_write
2372 adiw xl,1
2373 ldd temp,y+oz_b
2374 mem_write
2375 ret
2376
2377 ;----------------------------------------------------------------
2378 ;|Mnemonic |SZHPNC|Description |Notes |
2379 ;----------------------------------------------------------------
2380 ;|LD dst,src|------|Load |dst=src |
2381 ;
2382 ;
2383 do_op_stde: ;store de to mem loc in opl:h
2384 movw xl,opl
2385 ldd temp,y+oz_e
2386 mem_write
2387 adiw xl,1
2388 ldd temp,y+oz_d
2389 mem_write
2390 ret
2391
2392 ;----------------------------------------------------------------
2393 ;|Mnemonic |SZHPNC|Description |Notes |
2394 ;----------------------------------------------------------------
2395 ;|LD dst,src|------|Load |dst=src |
2396 ;
2397 ;
2398 do_op_stsp: ;store sp to mem loc in opl:h
2399 movw xl,opl
2400 mem_write_s z_spl
2401 adiw xl,1
2402 mem_write_s z_sph
2403 ret
2404
2405 ;----------------------------------------------------------------
2406 ;|Mnemonic |SZHPNC|Description |Notes |
2407 ;----------------------------------------------------------------
2408 ;|ADC HL,ss |***V0*|Add with Carry |HL=HL+ss+CY |
2409 ;
2410
2411 do_op_ADCHL:
2412 ldd temp,y+oz_l
2413 ldd temp2,y+oz_h
2414 clc
2415 sbrc z_flags,ZFL_C
2416 sec
2417 adc opl,temp
2418 in temp,sreg ; save lower Z
2419 adc oph,temp2
2420 in temp2,sreg
2421 std y+oz_l,opl
2422 std y+oz_h,oph
2423 and temp,temp2 ; 16bit Z
2424 ldi z_flags,0 ; clear N
2425 bmov z_flags,ZFL_C, temp2,AVR_C
2426 bmov z_flags,ZFL_P, temp2,AVR_V
2427 bmov z_flags,ZFL_H, temp2,AVR_H
2428 bmov z_flags,ZFL_Z, temp,AVR_Z
2429 bmov z_flags,ZFL_S, temp2,AVR_N
2430 ret
2431
2432 ;----------------------------------------------------------------
2433 ;|Mnemonic |SZHPNC|Description |Notes |
2434 ;----------------------------------------------------------------
2435 ;|SBC HL,ss |***V1*|Subtract with carry |HL=HL-ss-CY |
2436 ;
2437 ;
2438 do_op_sbchl:
2439 ldd temp,y+oz_l
2440 ldd temp2,y+oz_h
2441 cp temp,opl ; set z
2442 clc
2443 sbrc z_flags,ZFL_C
2444 sec
2445 sbc temp,opl
2446 sbc temp2,oph
2447 std y+oz_l,temp
2448 std y+oz_h,temp2
2449 in temp,sreg
2450 ldi z_flags,(1<<ZFL_N) ; set N
2451 bmov z_flags,ZFL_C, temp,AVR_C
2452 bmov z_flags,ZFL_P, temp,AVR_V
2453 bmov z_flags,ZFL_H, temp,AVR_H
2454 bmov z_flags,ZFL_Z, temp,AVR_Z
2455 bmov z_flags,ZFL_S, temp,AVR_N
2456 ret
2457
2458 ;----------------------------------------------------------------
2459 ;|Mnemonic |SZHPNC|Description |Notes |
2460 ;----------------------------------------------------------------
2461 ;|NEG |***V1*|Negate A |A=0-A |
2462
2463 ;
2464 do_op_NEG:
2465 ldi temp,0
2466 sub temp,z_a
2467 mov z_a,temp
2468 in temp,sreg
2469 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
2470 bmov z_flags,ZFL_C, temp,AVR_C
2471 bmov z_flags,ZFL_H, temp,AVR_H
2472 do_z80_flags_V
2473 do_z80_flags_set_N
2474 ret
2475
2476 ;----------------------------------------------------------------
2477 ;|Mnemonic |SZHPNC|Description |Notes |
2478 ;----------------------------------------------------------------
2479 ;|RETI |------|Return from Interrupt|PC=[SP]+ |
2480 ;|RETN |------|Return from NMI | Copy IFF2 to IFF1 |
2481
2482
2483 do_op_RETI:
2484 do_op_RETN:
2485 ldd temp,y+oz_istat
2486 bmov temp,IFF1, temp,IFF2
2487 std y+oz_istat,temp
2488 ljmp do_store_ret
2489
2490
2491 ;----------------------------------------------------------------
2492 ;|Mnemonic |SZHPNC|Description |Notes |
2493 ;----------------------------------------------------------------
2494 ;|IM n |------|Interrupt Mode | (n=0,1,2)|
2495
2496 do_op_IM0:
2497 ldd temp,y+oz_istat
2498 andi temp, ~IM_MASK
2499 std y+oz_istat,temp
2500 ret
2501
2502 do_op_IM1:
2503 ldd temp,y+oz_istat
2504 andi temp,~IM_MASK
2505 ori temp,IM1
2506 std y+oz_istat,temp
2507 ret
2508
2509 do_op_IM2:
2510 ldd temp,y+oz_istat
2511 andi temp, ~IM_MASK
2512 ori temp,IM2
2513 std y+oz_istat,temp
2514 ret
2515
2516 ;----------------------------------------------------------------
2517 ;|Mnemonic |SZHPNC|Description |Notes |
2518 ;----------------------------------------------------------------
2519 ;|LD A,i |**0*0-|Load |(i=I,R) IFF2 --> P |
2520 ;|LD i,A |------|Load |(i=I,R) |
2521
2522 do_op_ldai:
2523 ldd z_a,y+oz_i
2524 rjmp op_ldar1
2525
2526 do_op_ldar:
2527 ldd z_a,y+oz_r
2528 op_ldar1:
2529 bst z_flags,ZFL_C ;save C
2530 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N
2531 bld z_flags,ZFL_C ;
2532 ldd temp,y+oz_istat
2533 bmov z_flags,ZFL_P, temp,IFF2
2534 ret
2535
2536 do_op_ldia:
2537 std y+oz_i,z_a
2538 ret
2539
2540 do_op_ldra:
2541 std y+oz_r,z_a
2542 ret
2543
2544 ;----------------------------------------------------------------
2545 ;|Mnemonic |SZHPNC|Description |Notes |
2546 ;----------------------------------------------------------------
2547 ;|RLD |**0P0-|Rotate Left 4 bits |{A,[HL]}={A,[HL]}<- ##|
2548 ;|RRD |**0P0-|Rotate Right 4 bits |{A,[HL]}=->{A,[HL]} ##|
2549
2550 do_op_rld:
2551 swap opl
2552 mov oph,opl
2553 andi opl,0xf0
2554 andi oph,0x0f
2555 mov temp,z_a
2556 andi temp,0x0f
2557 or opl,temp
2558 mov temp,z_a
2559 andi temp,0xf0
2560 or temp,oph
2561 mov z_a,temp
2562 bst z_flags,ZFL_C ;save C
2563 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N
2564 bld z_flags,ZFL_C ;
2565 ret
2566
2567 do_op_rrd:
2568 mov oph,opl
2569 andi opl,0xf0
2570 andi oph,0x0f
2571 mov temp,z_a
2572 andi temp,0x0f
2573 or opl,temp
2574 swap opl
2575 mov temp,z_a
2576 andi temp,0xf0
2577 or temp,oph
2578 mov z_a,temp
2579 bst z_flags,ZFL_C ;save C
2580 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N
2581 bld z_flags,ZFL_C ;
2582 ret
2583
2584
2585 do_fetch_xh:
2586 sbis flags,prefixfd
2587 ldd opl,y+oz_xh
2588 sbic flags,prefixfd
2589 ldd opl,y+oz_yh
2590 ret
2591
2592 do_fetch_xl:
2593 sbis flags,prefixfd
2594 ldd opl,y+oz_xl
2595 sbic flags,prefixfd
2596 ldd opl,y+oz_yl
2597 ret
2598
2599
2600 do_fetch_mxx:
2601 sbic flags,prefixfd
2602 rjmp fetchmxx_fd
2603 ldd xh,y+oz_xh
2604 ldd xl,y+oz_xl
2605 rjmp fetchmxx1
2606 fetchmxx_fd:
2607 ldd xh,y+oz_yh
2608 ldd xl,y+oz_yl
2609 fetchmxx1:
2610 mem_read_ds opl, z_pc ;get displacement
2611 adiw z_pcl,1
2612 clr oph ;sign extend
2613 tst opl
2614 brpl fetchmxx2
2615 com oph
2616 fetchmxx2:
2617 add xl,opl ;add displacement
2618 adc xh,oph
2619 mem_read_d opl ;get operand
2620 ret ;(Ix+d) still in xl,xh
2621
2622
2623 do_fetch_xx:
2624 sbic flags,prefixfd
2625 rjmp fetchxx_fd
2626 ldd opl,y+oz_xl
2627 ldd oph,y+oz_xh
2628 ret
2629 fetchxx_fd:
2630 ldd opl,y+oz_yl
2631 ldd oph,y+oz_yh
2632 ret
2633
2634 do_store_xh:
2635 sbis flags,prefixfd
2636 std y+oz_xh,opl
2637 sbic flags,prefixfd
2638 std y+oz_yh,opl
2639 ret
2640
2641 do_store_xl:
2642 sbis flags,prefixfd
2643 std y+oz_xl,opl
2644 sbic flags,prefixfd
2645 std y+oz_yl,opl
2646 ret
2647
2648 do_store_mxx:
2649 sbic flags,prefixfd
2650 rjmp storemxx_fd
2651 ldd xh,y+oz_xh
2652 ldd xl,y+oz_xl
2653 rjmp storemxx1
2654 storemxx_fd:
2655 ldd xh,y+oz_yh
2656 ldd xl,y+oz_yl
2657 storemxx1:
2658 mem_read_s z_pc ;get displacement
2659 adiw z_pcl,1
2660 clr temp2 ;sign extend
2661 tst temp
2662 brpl storemxx2
2663 com temp2
2664 storemxx2:
2665 add xl,temp ;add displacement
2666 adc xh,temp2
2667 mem_write_s opl ;store operand
2668 ret
2669
2670 do_store_mxx_0:
2671 mem_write_s opl ;store operand
2672 ret
2673
2674 do_store_mxx_2:
2675 sbic flags,prefixfd
2676 rjmp storemxx2_fd
2677 ldd xh,y+oz_xh
2678 ldd xl,y+oz_xl
2679 rjmp storemxx21
2680 storemxx2_fd:
2681 ldd xh,y+oz_yh
2682 ldd xl,y+oz_yl
2683 storemxx21:
2684 mem_read_s z_pc ;get displacement
2685 adiw z_pcl,1
2686 adiw z_pcl,1
2687 clr temp2 ;sign extend
2688 tst temp
2689 brpl storemxx22
2690 com temp2
2691 storemxx22:
2692 add xl,temp ;add displacement
2693 adc xh,temp2
2694 mem_write_s opl ;store operand
2695 ret
2696
2697 do_store_xx:
2698 sbic flags,prefixfd
2699 rjmp storexx_fd
2700 std y+oz_xl,opl
2701 std y+oz_xh,oph
2702 ret
2703 storexx_fd:
2704 std y+oz_yl,opl
2705 std y+oz_yh,oph
2706 ret
2707
2708 ;----------------------------------------------------------------
2709 ;|Mnemonic |SZHPNC|Description |Notes |
2710 ;----------------------------------------------------------------
2711 ;|LD dst,src|------|Load |dst=src |
2712 ;
2713 ;
2714 do_op_stxx: ;store xx to mem loc in opl:h
2715
2716 movw xl,opl
2717 sbis flags,prefixfd
2718 ldd temp,y+oz_xl
2719 sbic flags,prefixfd
2720 ldd temp,y+oz_yl
2721 mem_write
2722 adiw xl,1
2723 sbis flags,prefixfd
2724 ldd temp,y+oz_xh
2725 sbic flags,prefixfd
2726 ldd temp,y+oz_yh
2727 mem_write
2728 ret
2729
2730
2731 ;----------------------------------------------------------------
2732 ;|Mnemonic |SZHPNC|Description |Notes |
2733 ;----------------------------------------------------------------
2734 ;|EX [SP],IX|------|Exchange |[SP]<->IX |
2735 ;|EX [SP],IY|------|Exchange |[SP]<->IY |
2736 ;
2737 do_op_EXxx:
2738 sbic flags,prefixfd
2739 rjmp opexxx_fd
2740 ldd temp,y+oz_xl
2741 ldd temp2,y+oz_xh
2742 std y+oz_xl,opl
2743 std y+oz_xh,oph
2744 rjmp opexxxe
2745 opexxx_fd:
2746 ldd temp,y+oz_yl
2747 ldd temp2,y+oz_yh
2748 std y+oz_yl,opl
2749 std y+oz_yh,oph
2750 opexxxe:
2751 movw opl,temp
2752 ret
2753
2754 ;----------------------------------------------------------------
2755 ;|Mnemonic |SZHPNC|Description |Notes |
2756 ;----------------------------------------------------------------
2757 ;|ADD IX,pp |--*-0*|Add |IX=IX+pp |
2758 ;|ADD IY,rr |--*-0*|Add |IY=IY+rr |
2759 ;
2760 ;
2761 do_op_addxx:
2762 sbic flags,prefixfd
2763 rjmp opadx_fd
2764 ldd temp,y+oz_xl
2765 ldd temp2,y+oz_xh
2766 add opl,temp
2767 adc oph,temp2
2768 std y+oz_xl,opl
2769 std y+oz_xh,oph
2770 rjmp opadx_e
2771 opadx_fd:
2772 ldd temp,y+oz_yl
2773 ldd temp2,y+oz_yh
2774 add opl,temp
2775 adc oph,temp2
2776 std y+oz_yl,opl
2777 std y+oz_yh,oph
2778 opadx_e:
2779 in temp,sreg
2780 bmov z_flags,ZFL_C, temp,AVR_C
2781 do_z80_flags_H
2782 do_z80_flags_clear_N
2783 ret
2784
2785 ;----------------------------------------------------------------
2786 ;|Mnemonic |SZHPNC|Description |Notes |
2787 ;----------------------------------------------------------------
2788 ;|LDD |--0*0-|Load and Decrement |[DE]=[HL],HL=HL-1,# |
2789 ;|LDDR |--000-|Load, Dec., Repeat |LDD till BC=0 |
2790 ;|LDI |--0*0-|Load and Increment |[DE]=[HL],HL=HL+1,# |
2791 ;|LDIR |--000-|Load, Inc., Repeat |LDI till BC=0 |
2792 ;
2793
2794 op_LDxx_common:
2795 ldd zh,y+oz_h ;H
2796 ldd zl,y+oz_l ;L
2797 ldd xh,y+oz_d ;D
2798 ldd xl,y+oz_e ;E
2799 ldd oph,y+oz_b ;B
2800 ldd opl,y+oz_c ;C
2801 mem_read_ds temp, z
2802 mem_write_ds x, temp
2803 cbr z_flags,(1<<ZFL_H) | (1<<ZFL_P) | (1<<ZFL_N)
2804 subi opl,1
2805 sbci oph,0
2806 breq PC+2
2807 sbr z_flags,(1<<ZFL_P)
2808 std y+oz_c,opl ;C
2809 std y+oz_b,oph ;B
2810 ret
2811
2812 do_op_LDI:
2813 rcall op_LDxx_common
2814 adiw z,1
2815 adiw x,1
2816 std y+oz_e,xl ;E
2817 std y+oz_d,xh ;D
2818 std y+oz_l,zl ;L
2819 std y+oz_h,zh ;H
2820 ret
2821
2822 do_op_LDD:
2823 rcall op_LDxx_common
2824 sbiw z,1
2825 sbiw x,1
2826 std y+oz_e,xl ;E
2827 std y+oz_d,xh ;D
2828 std y+oz_l,zl ;L
2829 std y+oz_h,zh ;H
2830 ret
2831
2832 do_op_LDIR:
2833 rcall do_op_LDI
2834 sbrs z_flags,ZFL_P
2835 ret
2836 sbiw z_pcl,2
2837 ret
2838
2839 do_op_LDDR:
2840 rcall do_op_LDD
2841 sbrs z_flags,ZFL_P
2842 ret
2843 sbiw z_pcl,2
2844 ret
2845
2846 ;----------------------------------------------------------------
2847 ;|Mnemonic |SZHPNC|Description |Notes |
2848 ;----------------------------------------------------------------
2849 ;|CPD |****1-|Compare and Decrement|A-[HL],HL=HL-1,BC=BC-1|
2850 ;|CPDR |****1-|Compare, Dec., Repeat|CPD till A=[HL]or BC=0|
2851 ;|CPI |****1-|Compare and Increment|A-[HL],HL=HL+1,BC=BC-1|
2852 ;|CPIR |****1-|Compare, Inc., Repeat|CPI till A=[HL]or BC=0|
2853
2854
2855 op_CPxx_common:
2856 ldd xh,y+oz_h ; H
2857 ldd xl,y+oz_l ; L
2858 ldd zh,y+oz_b ; B
2859 ldd zl,y+oz_c ; C
2860
2861 cbr z_flags,(1<<ZFL_S)|(1<<ZFL_Z)|(1<<ZFL_H)|(1<<ZFL_P)
2862 sbr z_flags,(1<<ZFL_N)
2863 mem_read ; temp = (HL)
2864 mov temp2,z_a
2865 sub temp2,temp ; A - (HL)
2866 brpl PC+2
2867 sbr z_flags,(1<<ZFL_S)
2868 brne PC+2
2869 sbr z_flags,(1<<ZFL_Z)
2870 brhc PC+2
2871 sbr z_flags,(1<<ZFL_H)
2872
2873 sbiw z,1 ; BC--
2874 breq PC+2
2875 sbr z_flags,(1<<ZFL_P)
2876 std y+oz_c,zl ; C
2877 std y+oz_b,zh ; B
2878 ret
2879
2880 do_op_CPI:
2881 rcall op_CPxx_common
2882 adiw x,1 ; HL++
2883 std y+oz_l,xl ; L
2884 std y+oz_h,xh ; H
2885 ret
2886
2887
2888 do_op_CPD:
2889 rcall op_CPxx_common
2890 sbiw x,1 ; HL--
2891 std y+oz_l,xl ; L
2892 std y+oz_h,xh ; H
2893 ret
2894
2895 do_op_CPIR:
2896 rcall do_op_CPI
2897 sbrc z_flags,ZFL_Z
2898 ret
2899 sbrs z_flags,ZFL_P
2900 ret
2901 sbiw z_pcl,2
2902 ret
2903
2904 do_op_CPDR:
2905 rcall do_op_CPD
2906 sbrc z_flags,ZFL_Z
2907 ret
2908 sbrs z_flags,ZFL_P
2909 ret
2910 sbiw z_pcl,2
2911 ret
2912
2913 ;----------------------------------------------------------------
2914 ;|Mnemonic |SZHPNC|Description |Notes |
2915 ;----------------------------------------------------------------
2916 ;|INI |?*??1-|Input and Increment |[HL]=[C],HL=HL+1,B=B-1|
2917 ;|IND |?*??1-|Input and Decrement |[HL]=[C],HL=HL-1,B=B-1|
2918 ;|INIR |?1??1-|Input, Inc., Repeat |INI till B=0 |
2919 ;|INDR |?1??1-|Input, Dec., Repeat |IND till B=0 |
2920
2921 op_INxx_common:
2922 cbr z_flags,(1<<ZFL_Z)
2923 sbr z_flags,(1<<ZFL_N)
2924 ldd temp2,y+oz_c ;C
2925 lcall portRead
2926 ldd xh,y+oz_h ;H
2927 ldd xl,y+oz_l ;L
2928 lcall dram_write
2929 ldd temp,y+oz_b ;B
2930 dec temp
2931 std y+oz_b,temp ;B
2932 brne PC+2
2933 sbr z_flags,(1<<ZFL_Z)
2934 ret
2935
2936 do_op_INI:
2937 rcall op_INxx_common
2938 adiw x,1
2939 std y+oz_l,xl ;L
2940 std y+oz_h,xh ;H
2941 ret
2942
2943 do_op_IND:
2944 rcall op_INxx_common
2945 sbiw x,1
2946 std y+oz_l,xl ;L
2947 std y+oz_h,xh ;H
2948 ret
2949
2950 do_op_INIR:
2951 rcall do_op_INI
2952 sbrc z_flags,ZFL_Z
2953 ret
2954 sbiw z_pcl,2
2955 ret
2956
2957 do_op_INDR:
2958 rcall do_op_IND
2959 sbrc z_flags,ZFL_Z
2960 ret
2961 sbiw z_pcl,2
2962 ret
2963
2964 ;----------------------------------------------------------------
2965 ;|Mnemonic |SZHPNC|Description |Notes |
2966 ;----------------------------------------------------------------
2967 ;|OUTI |?*??1-|Output and Increment |[C]=[HL],HL=HL+1,B=B-1|
2968 ;|OUTD |?*??1-|Output and Decrement |[C]=[HL],HL=HL-1,B=B-1|
2969 ;|OTIR |?1??1-|Output, Inc., Repeat |OUTI till B=0 |
2970 ;|OTDR |?1??1-|Output, Dec., Repeat |OUTD till B=0 |
2971
2972 op_OUTxx_common:
2973 cbr z_flags,(1<<ZFL_Z)
2974 sbr z_flags,(1<<ZFL_N)
2975 lcall dram_read ;temp = (z)
2976 ldd temp2,y+oz_c ;C
2977 lcall portWrite
2978 ldd temp,y+oz_b ;B
2979 dec temp
2980 std y+oz_b,temp ;B
2981 brne PC+2
2982 sbr z_flags,(1<<ZFL_Z)
2983 ret
2984
2985 do_op_OUTI:
2986 ldd xh,y+oz_h ;H
2987 ldd xl,y+oz_l ;L
2988 adiw x,1
2989 std y+oz_l,xl ;L
2990 std y+oz_h,xh ;H
2991 sbiw x,1
2992 rcall op_OUTxx_common
2993 ret
2994
2995 do_op_OUTD:
2996 ldd xh,y+oz_h ;H
2997 ldd xl,y+oz_l ;L
2998 sbiw x,1
2999 std y+oz_l,xl ;L
3000 std y+oz_h,xh ;H
3001 adiw x,1
3002 rcall op_OUTxx_common
3003 ret
3004
3005 do_op_OTIR:
3006 rcall do_op_OUTI
3007 sbrc z_flags,ZFL_Z
3008 ret
3009 sbiw z_pcl,2
3010 ret
3011
3012 do_op_OTDR:
3013 rcall do_op_OUTD
3014 sbrc z_flags,ZFL_Z
3015 ret
3016 sbiw z_pcl,2
3017 ret
3018
3019
3020 opctable EDjmp
3021
3022 instr fetch_nop, op_nop, store_nop ;00 ;NOP
3023 instr fetch_nop, op_nop, store_nop ;01 ;NOP
3024 instr fetch_nop, op_nop, store_nop ;02 ;NOP
3025 instr fetch_nop, op_nop, store_nop ;03 ;NOP
3026 instr fetch_nop, op_nop, store_nop ;04 ;NOP
3027 instr fetch_nop, op_nop, store_nop ;05 ;NOP
3028 instr fetch_nop, op_nop, store_nop ;06 ;NOP
3029 instr fetch_nop, op_nop, store_nop ;07 ;NOP
3030 instr fetch_nop, op_nop, store_nop ;08 ;NOP
3031 instr fetch_nop, op_nop, store_nop ;09 ;NOP
3032 instr fetch_nop, op_nop, store_nop ;0A ;NOP
3033 instr fetch_nop, op_nop, store_nop ;0B ;NOP
3034 instr fetch_nop, op_nop, store_nop ;0C ;NOP
3035 instr fetch_nop, op_nop, store_nop ;0D ;NOP
3036 instr fetch_nop, op_nop, store_nop ;0E ;NOP
3037 instr fetch_nop, op_nop, store_nop ;0F ;NOP
3038 instr fetch_nop, op_nop, store_nop ;10 ;NOP
3039 instr fetch_nop, op_nop, store_nop ;11 ;NOP
3040 instr fetch_nop, op_nop, store_nop ;12 ;NOP
3041 instr fetch_nop, op_nop, store_nop ;13 ;NOP
3042 instr fetch_nop, op_nop, store_nop ;14 ;NOP
3043 instr fetch_nop, op_nop, store_nop ;15 ;NOP
3044 instr fetch_nop, op_nop, store_nop ;16 ;NOP
3045 instr fetch_nop, op_nop, store_nop ;17 ;NOP
3046 instr fetch_nop, op_nop, store_nop ;18 ;NOP
3047 instr fetch_nop, op_nop, store_nop ;19 ;NOP
3048 instr fetch_nop, op_nop, store_nop ;1A ;NOP
3049 instr fetch_nop, op_nop, store_nop ;1B ;NOP
3050 instr fetch_nop, op_nop, store_nop ;1C ;NOP
3051 instr fetch_nop, op_nop, store_nop ;1D ;NOP
3052 instr fetch_nop, op_nop, store_nop ;1E ;NOP
3053 instr fetch_nop, op_nop, store_nop ;1F ;NOP
3054 instr fetch_nop, op_nop, store_nop ;20 ;NOP
3055 instr fetch_nop, op_nop, store_nop ;21 ;NOP
3056 instr fetch_nop, op_nop, store_nop ;22 ;NOP
3057 instr fetch_nop, op_nop, store_nop ;23 ;NOP
3058 instr fetch_nop, op_nop, store_nop ;24 ;NOP
3059 instr fetch_nop, op_nop, store_nop ;25 ;NOP
3060 instr fetch_nop, op_nop, store_nop ;26 ;NOP
3061 instr fetch_nop, op_nop, store_nop ;27 ;NOP
3062 instr fetch_nop, op_nop, store_nop ;28 ;NOP
3063 instr fetch_nop, op_nop, store_nop ;29 ;NOP
3064 instr fetch_nop, op_nop, store_nop ;2A ;NOP
3065 instr fetch_nop, op_nop, store_nop ;2B ;NOP
3066 instr fetch_nop, op_nop, store_nop ;2C ;NOP
3067 instr fetch_nop, op_nop, store_nop ;2D ;NOP
3068 instr fetch_nop, op_nop, store_nop ;2E ;NOP
3069 instr fetch_nop, op_nop, store_nop ;2F ;NOP
3070 instr fetch_nop, op_nop, store_nop ;30 ;NOP
3071 instr fetch_nop, op_nop, store_nop ;31 ;NOP
3072 instr fetch_nop, op_nop, store_nop ;32 ;NOP
3073 instr fetch_nop, op_nop, store_nop ;33 ;NOP
3074 instr fetch_nop, op_nop, store_nop ;34 ;NOP
3075 instr fetch_nop, op_nop, store_nop ;35 ;NOP
3076 instr fetch_nop, op_nop, store_nop ;36 ;NOP
3077 instr fetch_nop, op_nop, store_nop ;37 ;NOP
3078 instr fetch_nop, op_nop, store_nop ;38 ;NOP
3079 instr fetch_nop, op_nop, store_nop ;39 ;NOP
3080 instr fetch_nop, op_nop, store_nop ;3A ;NOP
3081 instr fetch_nop, op_nop, store_nop ;3B ;NOP
3082 instr fetch_nop, op_nop, store_nop ;3C ;NOP
3083 instr fetch_nop, op_nop, store_nop ;3D ;NOP
3084 instr fetch_nop, op_nop, store_nop ;3E ;NOP
3085 instr fetch_nop, op_nop, store_nop ;3F ;NOP
3086 instr fetch_C, op_IN, store_B ;40 ;IN B,(C)
3087 instr fetch_B, op_OUT, store_nop ;41 ;OUT (C),B
3088 instr fetch_BC, op_SBCHL, store_nop ;42 ;SBC HL,BC
3089 instr fetch_DIR16, op_STBC, store_nop ;43 ;LD (nn),BC
3090 instr fetch_nop, op_NEG, store_nop ;44 ;NEG
3091 instr fetch_nop, op_RETN, store_nop ;45 ;RETN
3092 instr fetch_nop, op_IM0, store_nop ;46 ;IM 0
3093 instr fetch_nop, op_ldia, store_nop ;47 ;LD I,A
3094 instr fetch_C, op_IN, store_C ;48 ;IN C,(C)
3095 instr fetch_C, op_OUT, store_nop ;49 ;OUT (C),C
3096 instr fetch_BC, op_ADCHL, store_nop ;4A ;ADC HL,BC
3097 instr fetch_DIR16, op_RMEM16, store_BC ;4B nn nn ;LD BC,(nn)
3098 instr fetch_nop, op_NEG, store_nop ;4C ;NEG
3099 instr fetch_nop, op_RETI, store_nop ;4D ;RETI
3100 instr fetch_nop, op_IM0, store_nop ;4E ;IM 0
3101 instr fetch_nop, op_ldra, store_nop ;4F ;LD R,A
3102 instr fetch_C, op_IN, store_D ;50 ;IN D,(C)
3103 instr fetch_D, op_OUT, store_nop ;51 ;OUT (C),D
3104 instr fetch_DE, op_SBCHL, store_nop ;52 ;SBC HL,DE
3105 instr fetch_DIR16, op_STDE, store_nop ;53 nn nn ;LD (nn),DE
3106 instr fetch_nop, op_NEG, store_nop ;54 ;NEG
3107 instr fetch_nop, op_RETN, store_nop ;55 ;RETN
3108 instr fetch_nop, op_IM1, store_nop ;56 ;IM 1
3109 instr fetch_nop, op_ldai, store_nop ;57 ;LD A,I
3110 instr fetch_C, op_IN, store_E ;58 ;IN E,(C)
3111 instr fetch_E, op_OUT, store_nop ;59 ;OUT (C),E
3112 instr fetch_DE, op_ADCHL, store_nop ;5A ;ADC HL,DE
3113 instr fetch_DIR16, op_RMEM16, store_DE ;5B nn nn ;LD DE,(nn)
3114 instr fetch_nop, op_NEG, store_nop ;5C ;NEG
3115 instr fetch_nop, op_RETN, store_nop ;5D ;RETN
3116 instr fetch_nop, op_IM2, store_nop ;5E ;IM 2
3117 instr fetch_nop, op_ldar, store_nop ;5F ;LD A,R
3118 instr fetch_C, op_IN, store_H ;60 ;IN H,(C)
3119 instr fetch_H, op_OUT, store_nop ;61 ;OUT (C),H
3120 instr fetch_HL, op_SBCHL, store_nop ;62 ;SBC HL,HL
3121 instr fetch_DIR16, op_STHL, store_nop ;63 nn nn ;LD (nn),HL
3122 instr fetch_nop, op_NEG, store_nop ;64 ;NEG
3123 instr fetch_nop, op_RETN, store_nop ;65 ;RETN
3124 instr fetch_nop, op_IM0, store_nop ;66 ;IM 0
3125 instr fetch_mhl, op_RRD, store_mhl ;67 ;RRD
3126 instr fetch_C, op_IN, store_L ;68 ;IN L,(C)
3127 instr fetch_L, op_OUT, store_nop ;69 ;OUT (C),L
3128 instr fetch_HL, op_ADCHL, store_nop ;6A ;ADC HL,HL
3129 instr fetch_DIR16, op_RMEM16, store_HL ;6B nn nn ;LD HL,(nn)
3130 instr fetch_nop, op_NEG, store_nop ;6C ;NEG
3131 instr fetch_nop, op_RETN, store_nop ;6D ;RETN
3132 instr fetch_nop, op_IM0, store_nop ;6E ;IM 0
3133 instr fetch_mhl, op_RLD, store_mhl ;6F ;RLD
3134 instr fetch_C, op_IN, store_nop ;70 ;IN (C)
3135 instr fetch_0, op_OUT, store_nop ;71 ;OUT (C),0
3136 instr fetch_SP, op_SBCHL, store_nop ;72 ;SBC HL,SP
3137 instr fetch_DIR16, op_STSP, store_nop ;73 nn nn ;LD (nn),SP
3138 instr fetch_nop, op_NEG, store_nop ;74 ;NEG
3139 instr fetch_nop, op_RETN, store_nop ;75 ;RETN
3140 instr fetch_nop, op_IM1, store_nop ;76 ;IM 1
3141 instr fetch_nop, op_nop, store_nop ;77 ;NOP
3142 instr fetch_C, op_IN, store_A ;78 ;IN A,(C)
3143 instr fetch_A, op_OUT, store_nop ;79 ;OUT (C),A
3144 instr fetch_SP, op_ADCHL, store_nop ;7A ;ADC HL,SP
3145 instr fetch_DIR16, op_RMEM16, store_SP ;7B nn nn ;LD SP,(nn)
3146 instr fetch_nop, op_NEG, store_nop ;7C ;NEG
3147 instr fetch_nop, op_RETN, store_nop ;7D ;RETN
3148 instr fetch_nop, op_IM2, store_nop ;7E ;IM 2
3149 instr fetch_nop, op_nop, store_nop ;7F ;NOP
3150 instr fetch_nop, op_nop, store_nop ;80 ;NOP
3151 instr fetch_nop, op_nop, store_nop ;81 ;NOP
3152 instr fetch_nop, op_nop, store_nop ;82 ;NOP
3153 instr fetch_nop, op_nop, store_nop ;83 ;NOP
3154 instr fetch_nop, op_nop, store_nop ;84 ;NOP
3155 instr fetch_nop, op_nop, store_nop ;85 ;NOP
3156 instr fetch_nop, op_nop, store_nop ;86 ;NOP
3157 instr fetch_nop, op_nop, store_nop ;87 ;NOP
3158 instr fetch_nop, op_nop, store_nop ;88 ;NOP
3159 instr fetch_nop, op_nop, store_nop ;89 ;NOP
3160 instr fetch_nop, op_nop, store_nop ;8A ;NOP
3161 instr fetch_nop, op_nop, store_nop ;8B ;NOP
3162 instr fetch_nop, op_nop, store_nop ;8C ;NOP
3163 instr fetch_nop, op_nop, store_nop ;8D ;NOP
3164 instr fetch_nop, op_nop, store_nop ;8E ;NOP
3165 instr fetch_nop, op_nop, store_nop ;8F ;NOP
3166 instr fetch_nop, op_nop, store_nop ;90 ;NOP
3167 instr fetch_nop, op_nop, store_nop ;91 ;NOP
3168 instr fetch_nop, op_nop, store_nop ;92 ;NOP
3169 instr fetch_nop, op_nop, store_nop ;93 ;NOP
3170 instr fetch_nop, op_nop, store_nop ;94 ;NOP
3171 instr fetch_nop, op_nop, store_nop ;95 ;NOP
3172 instr fetch_nop, op_nop, store_nop ;96 ;NOP
3173 instr fetch_nop, op_nop, store_nop ;97 ;NOP
3174 instr fetch_nop, op_nop, store_nop ;98 ;NOP
3175 instr fetch_nop, op_nop, store_nop ;99 ;NOP
3176 instr fetch_nop, op_nop, store_nop ;9A ;NOP
3177 instr fetch_nop, op_nop, store_nop ;9B ;NOP
3178 instr fetch_nop, op_nop, store_nop ;9C ;NOP
3179 instr fetch_nop, op_nop, store_nop ;9D ;NOP
3180 instr fetch_nop, op_nop, store_nop ;9E ;NOP
3181 instr fetch_nop, op_nop, store_nop ;9F ;NOP
3182 instr fetch_nop, op_LDI, store_nop ;A0 ;LDI
3183 instr fetch_nop, op_CPI, store_nop ;A1 ;CPI
3184 instr fetch_nop, op_INI, store_nop ;A2 ;INI
3185 instr fetch_nop, op_OUTI, store_nop ;A3 ;OUTI
3186 instr fetch_nop, op_nop, store_nop ;A4 ;NOP
3187 instr fetch_nop, op_nop, store_nop ;A5 ;NOP
3188 instr fetch_nop, op_nop, store_nop ;A6 ;NOP
3189 instr fetch_nop, op_nop, store_nop ;A7 ;NOP
3190 instr fetch_nop, op_LDD, store_nop ;A8 ;LDD
3191 instr fetch_nop, op_CPD, store_nop ;A9 ;CPD
3192 instr fetch_nop, op_IND, store_nop ;AA ;IND
3193 instr fetch_nop, op_OUTD, store_nop ;AB ;OUTD
3194 instr fetch_nop, op_nop, store_nop ;AC ;NOP
3195 instr fetch_nop, op_nop, store_nop ;AD ;NOP
3196 instr fetch_nop, op_nop, store_nop ;AE ;NOP
3197 instr fetch_nop, op_nop, store_nop ;AF ;NOP
3198 instr fetch_nop, op_LDIR, store_nop ;B0 ;LDIR
3199 instr fetch_nop, op_CPIR, store_nop ;B1 ;CPIR
3200 instr fetch_nop, op_INIR, store_nop ;B2 ;INIR
3201 instr fetch_nop, op_OTIR, store_nop ;B3 ;OTIR
3202 instr fetch_nop, op_nop, store_nop ;B4 ;NOP
3203 instr fetch_nop, op_nop, store_nop ;B5 ;NOP
3204 instr fetch_nop, op_nop, store_nop ;B6 ;NOP
3205 instr fetch_nop, op_nop, store_nop ;B7 ;NOP
3206 instr fetch_nop, op_LDDR, store_nop ;B8 ;LDDR
3207 instr fetch_nop, op_CPDR, store_nop ;B9 ;CPDR
3208 instr fetch_nop, op_INDR, store_nop ;BA ;INDR
3209 instr fetch_nop, op_OTDR, store_nop ;BB ;OTDR
3210 instr fetch_nop, op_nop, store_nop ;BC ;NOP
3211 instr fetch_nop, op_nop, store_nop ;BD ;NOP
3212 instr fetch_nop, op_nop, store_nop ;BE ;NOP
3213 instr fetch_nop, op_nop, store_nop ;BF ;NOP
3214 instr fetch_nop, op_nop, store_nop ;C0 ;NOP
3215 instr fetch_nop, op_nop, store_nop ;C1 ;NOP
3216 instr fetch_nop, op_nop, store_nop ;C2 ;NOP
3217 instr fetch_nop, op_nop, store_nop ;C3 ;NOP
3218 instr fetch_nop, op_nop, store_nop ;C4 ;NOP
3219 instr fetch_nop, op_nop, store_nop ;C5 ;NOP
3220 instr fetch_nop, op_nop, store_nop ;C6 ;NOP
3221 instr fetch_nop, op_nop, store_nop ;C7 ;NOP
3222 instr fetch_nop, op_nop, store_nop ;C8 ;NOP
3223 instr fetch_nop, op_nop, store_nop ;C9 ;NOP
3224 instr fetch_nop, op_nop, store_nop ;CA ;NOP
3225 instr fetch_nop, op_nop, store_nop ;CB ;NOP
3226 instr fetch_nop, op_nop, store_nop ;CC ;NOP
3227 instr fetch_nop, op_nop, store_nop ;CD ;NOP
3228 instr fetch_nop, op_nop, store_nop ;CE ;NOP
3229 instr fetch_nop, op_nop, store_nop ;CF ;NOP
3230 instr fetch_nop, op_nop, store_nop ;D0 ;NOP
3231 instr fetch_nop, op_nop, store_nop ;D1 ;NOP
3232 instr fetch_nop, op_nop, store_nop ;D2 ;NOP
3233 instr fetch_nop, op_nop, store_nop ;D3 ;NOP
3234 instr fetch_nop, op_nop, store_nop ;D4 ;NOP
3235 instr fetch_nop, op_nop, store_nop ;D5 ;NOP
3236 instr fetch_nop, op_nop, store_nop ;D6 ;NOP
3237 instr fetch_nop, op_nop, store_nop ;D7 ;NOP
3238 instr fetch_nop, op_nop, store_nop ;D8 ;NOP
3239 instr fetch_nop, op_nop, store_nop ;D9 ;NOP
3240 instr fetch_nop, op_nop, store_nop ;DA ;NOP
3241 instr fetch_nop, op_nop, store_nop ;DB ;NOP
3242 instr fetch_nop, op_nop, store_nop ;DC ;NOP
3243 instr fetch_nop, op_nop, store_nop ;DD ;NOP
3244 instr fetch_nop, op_nop, store_nop ;DE ;NOP
3245 instr fetch_nop, op_nop, store_nop ;DF ;NOP
3246 instr fetch_nop, op_nop, store_nop ;E0 ;NOP
3247 instr fetch_nop, op_nop, store_nop ;E1 ;NOP
3248 instr fetch_nop, op_nop, store_nop ;E2 ;NOP
3249 instr fetch_nop, op_nop, store_nop ;E3 ;NOP
3250 instr fetch_nop, op_nop, store_nop ;E4 ;NOP
3251 instr fetch_nop, op_nop, store_nop ;E5 ;NOP
3252 instr fetch_nop, op_nop, store_nop ;E6 ;NOP
3253 instr fetch_nop, op_nop, store_nop ;E7 ;NOP
3254 instr fetch_nop, op_nop, store_nop ;E8 ;NOP
3255 instr fetch_nop, op_nop, store_nop ;E9 ;NOP
3256 instr fetch_nop, op_nop, store_nop ;EA ;NOP
3257 instr fetch_nop, op_nop, store_nop ;EB ;NOP
3258 instr fetch_nop, op_nop, store_nop ;EC ;NOP
3259 instr fetch_nop, op_nop, store_nop ;ED ;NOP
3260 instr fetch_nop, op_nop, store_nop ;EE ;NOP
3261 instr fetch_nop, op_nop, store_nop ;EF ;NOP
3262 instr fetch_nop, op_nop, store_nop ;F0 ;NOP
3263 instr fetch_nop, op_nop, store_nop ;F1 ;NOP
3264 instr fetch_nop, op_nop, store_nop ;F2 ;NOP
3265 instr fetch_nop, op_nop, store_nop ;F3 ;NOP
3266 instr fetch_nop, op_nop, store_nop ;F4 ;NOP
3267 instr fetch_nop, op_nop, store_nop ;F5 ;NOP
3268 instr fetch_nop, op_nop, store_nop ;F6 ;NOP
3269 instr fetch_nop, op_nop, store_nop ;F7 ;NOP
3270 instr fetch_nop, op_nop, store_nop ;F8 ;NOP
3271 instr fetch_nop, op_nop, store_nop ;F9 ;NOP
3272 instr fetch_nop, op_nop, store_nop ;FA ;NOP
3273 instr fetch_nop, op_nop, store_nop ;FB ;NOP
3274 instr fetch_nop, op_nop, store_nop ;FC ;NOP
3275 instr fetch_nop, op_nop, store_nop ;FD ;NOP
3276 instr fetch_nop, op_nop, store_nop ;FE ;NOP
3277 instr fetch_nop, op_nop, store_nop ;FF ;NOP
3278
3279
3280 opctable DDFDjmp
3281
3282 instr fetch_nop, op_noni, store_nop ;00 ;
3283 instr fetch_nop, op_noni, store_nop ;01 ;
3284 instr fetch_nop, op_noni, store_nop ;02 ;
3285 instr fetch_nop, op_noni, store_nop ;03 ;
3286 instr fetch_nop, op_noni, store_nop ;04 ;
3287 instr fetch_nop, op_noni, store_nop ;05 ;
3288 instr fetch_nop, op_noni, store_nop ;06 ;
3289 instr fetch_nop, op_noni, store_nop ;07 ;
3290 instr fetch_nop, op_noni, store_nop ;08 ;
3291 instr fetch_BC, op_ADDxx, store_nop ;09 ;ADD xx,BC
3292 instr fetch_nop, op_noni, store_nop ;0A ;
3293 instr fetch_nop, op_noni, store_nop ;0B ;
3294 instr fetch_nop, op_noni, store_nop ;0C ;
3295 instr fetch_nop, op_noni, store_nop ;0D ;
3296 instr fetch_nop, op_noni, store_nop ;0E ;
3297 instr fetch_nop, op_noni, store_nop ;0F ;
3298 instr fetch_nop, op_noni, store_nop ;10 ;
3299 instr fetch_nop, op_noni, store_nop ;11 ;
3300 instr fetch_nop, op_noni, store_nop ;12 ;
3301 instr fetch_nop, op_noni, store_nop ;13 ;
3302 instr fetch_nop, op_noni, store_nop ;14 ;
3303 instr fetch_nop, op_noni, store_nop ;15 ;
3304 instr fetch_nop, op_noni, store_nop ;16 ;
3305 instr fetch_nop, op_noni, store_nop ;17 ;
3306 instr fetch_nop, op_noni, store_nop ;18 ;
3307 instr fetch_DE, op_ADDxx, store_nop ;19 ;ADD xx,DE
3308 instr fetch_nop, op_noni, store_nop ;1A ;
3309 instr fetch_nop, op_noni, store_nop ;1B ;
3310 instr fetch_nop, op_noni, store_nop ;1C ;
3311 instr fetch_nop, op_noni, store_nop ;1D ;
3312 instr fetch_nop, op_noni, store_nop ;1E ;
3313 instr fetch_nop, op_noni, store_nop ;1F ;
3314 instr fetch_nop, op_noni, store_nop ;20 ;
3315 instr fetch_DIR16, op_nop, store_xx ;21 ;LD xx,nn
3316 instr fetch_DIR16, op_STxx, store_nop ;22 ;LD (nn),xx
3317 instr fetch_xx, op_INC16, store_xx ;23 ;INC xx
3318 instr fetch_xH, op_INC, store_xH ;24 ;INC xh
3319 instr fetch_xH, op_DEC, store_xH ;25 ;DEC xh
3320 instr fetch_DIR8, op_nop, store_xH ;26 ;LD xh,n
3321 instr fetch_nop, op_noni, store_nop ;27 ;
3322 instr fetch_nop, op_noni, store_nop ;28 ;
3323 instr fetch_xx, op_ADDxx, store_nop ;29 ;ADD xx,xx
3324 instr fetch_DIR16, op_RMEM16, store_xx ;2A ;LD xx,(nn)
3325 instr fetch_xx, op_DEC16, store_xx ;2B ;DEC xx
3326 instr fetch_xL, op_INC, store_xL ;2C ;INC xl
3327 instr fetch_xL, op_DEC, store_xL ;2D ;DEC xl
3328 instr fetch_DIR8, op_nop, store_xL ;2E ;LD xl,n
3329 instr fetch_nop, op_noni, store_nop ;2F ;
3330 instr fetch_nop, op_noni, store_nop ;30 ;
3331 instr fetch_nop, op_noni, store_nop ;31 ;
3332 instr fetch_nop, op_noni, store_nop ;32 ;
3333 instr fetch_nop, op_noni, store_nop ;33 ;
3334 instr fetch_MXX, op_INC, store_MXX_0 ;34 ;INC (xx+d)
3335 instr fetch_MXX, op_DEC, store_MXX_0 ;35 ;DEC (xx+d)
3336 instr fetch_DIR8_2, op_nop, store_MXX_2 ;36 ;LD (xx+d),n
3337 instr fetch_nop, op_noni, store_nop ;37 ;
3338 instr fetch_nop, op_noni, store_nop ;38 ;
3339 instr fetch_SP, op_ADDxx, store_nop ;39 ;ADD xx,SP
3340 instr fetch_nop, op_noni, store_nop ;3A ;
3341 instr fetch_nop, op_noni, store_nop ;3B ;
3342 instr fetch_nop, op_noni, store_nop ;3C ;
3343 instr fetch_nop, op_noni, store_nop ;3D ;
3344 instr fetch_nop, op_noni, store_nop ;3E ;
3345 instr fetch_nop, op_noni, store_nop ;3F ;
3346 instr fetch_nop, op_noni, store_nop ;40 ;
3347 instr fetch_nop, op_noni, store_nop ;41 ;
3348 instr fetch_nop, op_noni, store_nop ;42 ;
3349 instr fetch_nop, op_noni, store_nop ;43 ;
3350 instr fetch_xH, op_nop, store_B ;44 ;LD B,xh
3351 instr fetch_xL, op_nop, store_B ;45 ;LD B,xl
3352 instr fetch_MXX, op_nop, store_B ;46 ;LD B,(xx+d)
3353 instr fetch_nop, op_noni, store_nop ;47 ;
3354 instr fetch_nop, op_noni, store_nop ;48 ;
3355 instr fetch_nop, op_noni, store_nop ;49 ;
3356 instr fetch_nop, op_noni, store_nop ;4A ;
3357 instr fetch_nop, op_noni, store_nop ;4B ;
3358 instr fetch_xH, op_nop, store_C ;4C ;LD C,xh
3359 instr fetch_xL, op_nop, store_C ;4D ;LD C,xl
3360 instr fetch_MXX, op_nop, store_C ;4E ;LD C,(xx+d)
3361 instr fetch_nop, op_noni, store_nop ;4F ;
3362 instr fetch_nop, op_noni, store_nop ;50 ;
3363 instr fetch_nop, op_noni, store_nop ;51 ;
3364 instr fetch_nop, op_noni, store_nop ;52 ;
3365 instr fetch_nop, op_noni, store_nop ;53 ;
3366 instr fetch_xH, op_nop, store_D ;54 ;LD D,xh
3367 instr fetch_xL, op_nop, store_D ;55 ;LD D,xl
3368 instr fetch_MXX, op_nop, store_D ;56 ;LD D,(xx+d)
3369 instr fetch_nop, op_noni, store_nop ;57 ;
3370 instr fetch_nop, op_noni, store_nop ;58 ;
3371 instr fetch_nop, op_noni, store_nop ;59 ;
3372 instr fetch_nop, op_noni, store_nop ;5A ;
3373 instr fetch_nop, op_noni, store_nop ;5B ;
3374 instr fetch_xH, op_nop, store_E ;5C ;LD E,xh
3375 instr fetch_xL, op_nop, store_E ;5D ;LD E,xl
3376 instr fetch_MXX, op_nop, store_E ;5E ;LD E,(xx+d)
3377 instr fetch_nop, op_noni, store_nop ;5F ;
3378 instr fetch_B, op_nop, store_xH ;60 ;LD xh,B
3379 instr fetch_C, op_nop, store_xH ;61 ;LD xh,C
3380 instr fetch_D, op_nop, store_xH ;62 ;LD xh,D
3381 instr fetch_E, op_nop, store_xH ;63 ;LD xh,E
3382 instr fetch_nop, op_noni, store_nop ;64 ;LD xh,xh
3383 instr fetch_xL, op_nop, store_xH ;65 ;LD xh,xl
3384 instr fetch_MXX, op_nop, store_H ;66 ;LD H,(xx+d)
3385 instr fetch_A, op_nop, store_xH ;67 ;LD xh,A
3386 instr fetch_B, op_nop, store_xL ;68 ;LD xl,B
3387 instr fetch_C, op_nop, store_xL ;69 ;LD xl,C
3388 instr fetch_D, op_nop, store_xL ;6A ;LD xl,D
3389 instr fetch_E, op_nop, store_xL ;6B ;LD xl,E
3390 instr fetch_xH, op_nop, store_xL ;6C ;LD xl,xh
3391 instr fetch_nop, op_noni, store_nop ;6D ;LD xl,xl
3392 instr fetch_MXX, op_nop, store_L ;6E ;LD L,(xx+d)
3393 instr fetch_A, op_nop, store_xL ;6F ;LD xl,A
3394 instr fetch_B, op_nop, store_MXX ;70 ;LD (xx+d),B
3395 instr fetch_C, op_nop, store_MXX ;71 ;LD (xx+d),C
3396 instr fetch_D, op_nop, store_MXX ;72 ;LD (xx+d),D
3397 instr fetch_E, op_nop, store_MXX ;73 ;LD (xx+d),E
3398 instr fetch_H, op_nop, store_MXX ;74 ;LD (xx+d),H
3399 instr fetch_L, op_nop, store_MXX ;75 ;LD (xx+d),L
3400 instr fetch_nop, op_noni, store_nop ;76 ;
3401 instr fetch_A, op_nop, store_MXX ;77 ;LD (xx+d),A
3402 instr fetch_nop, op_noni, store_nop ;78 ;
3403 instr fetch_nop, op_noni, store_nop ;79 ;
3404 instr fetch_nop, op_noni, store_nop ;7A ;
3405 instr fetch_nop, op_noni, store_nop ;7B ;
3406 instr fetch_xH, op_nop, store_A ;7C ;LD A,xh
3407 instr fetch_xL, op_nop, store_A ;7D ;LD A,xl
3408 instr fetch_MXX, op_nop, store_A ;7E ;LD A,(xx+d)
3409 instr fetch_nop, op_noni, store_nop ;7F ;
3410 instr fetch_nop, op_noni, store_nop ;80 ;
3411 instr fetch_nop, op_noni, store_nop ;81 ;
3412 instr fetch_nop, op_noni, store_nop ;82 ;
3413 instr fetch_nop, op_noni, store_nop ;83 ;
3414 instr fetch_xH, op_ADDA, store_nop ;84 ;ADD A,xh
3415 instr fetch_xL, op_ADDA, store_nop ;85 ;ADD A,xl
3416 instr fetch_MXX, op_ADDA, store_nop ;86 ;ADD A,(xx)
3417 instr fetch_nop, op_noni, store_nop ;87 ;
3418 instr fetch_nop, op_noni, store_nop ;88 ;
3419 instr fetch_nop, op_noni, store_nop ;89 ;
3420 instr fetch_nop, op_noni, store_nop ;8A ;
3421 instr fetch_nop, op_noni, store_nop ;8B ;
3422 instr fetch_xH, op_ADCA, store_nop ;8C ;ADC A,xh
3423 instr fetch_xL, op_ADCA, store_nop ;8D ;ADC A,xl
3424 instr fetch_MXX, op_ADCA, store_nop ;8E ;ADC A,(xx)
3425 instr fetch_nop, op_noni, store_nop ;8F ;
3426 instr fetch_nop, op_noni, store_nop ;90 ;
3427 instr fetch_nop, op_noni, store_nop ;91 ;
3428 instr fetch_nop, op_noni, store_nop ;92 ;
3429 instr fetch_nop, op_noni, store_nop ;93 ;
3430 instr fetch_xH, op_SUBFA, store_nop ;94 ;SUB A,xh
3431 instr fetch_xL, op_SUBFA, store_nop ;95 ;SUB A,xl
3432 instr fetch_MXX, op_SUBFA, store_nop ;96 ;SUB A,(xx)
3433 instr fetch_nop, op_noni, store_nop ;97 ;
3434 instr fetch_nop, op_noni, store_nop ;98 ;
3435 instr fetch_nop, op_noni, store_nop ;99 ;
3436 instr fetch_nop, op_noni, store_nop ;9A ;
3437 instr fetch_nop, op_noni, store_nop ;9B ;
3438 instr fetch_xH, op_SBCFA, store_nop ;9C ;SBC A,xh
3439 instr fetch_xL, op_SBCFA, store_nop ;9D ;SBC A,xl
3440 instr fetch_MXX, op_SBCFA, store_nop ;9E ;SBC A,(xx)
3441 instr fetch_nop, op_noni, store_nop ;9F ;
3442 instr fetch_nop, op_noni, store_nop ;A0 ;
3443 instr fetch_nop, op_noni, store_nop ;A1 ;
3444 instr fetch_nop, op_noni, store_nop ;A2 ;
3445 instr fetch_nop, op_noni, store_nop ;A3 ;
3446 instr fetch_xH, op_ANDA, store_nop ;A4 ;AND A,xh
3447 instr fetch_xL, op_ANDA, store_nop ;A5 ;AND A,xl
3448 instr fetch_MXX, op_ANDA, store_nop ;A6 ;AND A,(xx)
3449 instr fetch_nop, op_noni, store_nop ;A7 ;
3450 instr fetch_nop, op_noni, store_nop ;A8 ;
3451 instr fetch_nop, op_noni, store_nop ;A9 ;
3452 instr fetch_nop, op_noni, store_nop ;AA ;
3453 instr fetch_nop, op_noni, store_nop ;AB ;
3454 instr fetch_xH, op_XORA, store_nop ;AC ;XOR A,xh
3455 instr fetch_xL, op_XORA, store_nop ;AD ;XOR A,xl
3456 instr fetch_MXX, op_XORA, store_nop ;AE ;XOR A,(xx)
3457 instr fetch_nop, op_noni, store_nop ;AF ;
3458 instr fetch_nop, op_noni, store_nop ;B0 ;
3459 instr fetch_nop, op_noni, store_nop ;B1 ;
3460 instr fetch_nop, op_noni, store_nop ;B2 ;
3461 instr fetch_nop, op_noni, store_nop ;B3 ;
3462 instr fetch_xH, op_ORA, store_nop ;B4 ;OR A,xh
3463 instr fetch_xL, op_ORA, store_nop ;B5 ;OR A,xl
3464 instr fetch_MXX, op_ORA, store_nop ;B6 ;OR A,(xx)
3465 instr fetch_nop, op_noni, store_nop ;B7 ;
3466 instr fetch_nop, op_noni, store_nop ;B8 ;
3467 instr fetch_nop, op_noni, store_nop ;B9 ;
3468 instr fetch_nop, op_noni, store_nop ;BA ;
3469 instr fetch_nop, op_noni, store_nop ;BB ;
3470 instr fetch_xH, op_CPFA, store_nop ;BC ;CP A,xh
3471 instr fetch_xL, op_CPFA, store_nop ;BD ;CP A,xl
3472 instr fetch_MXX, op_CPFA, store_nop ;BE ;CP A,(xx)
3473 instr fetch_nop, op_noni, store_nop ;BF ;
3474 instr fetch_nop, op_noni, store_nop ;C0 ;
3475 instr fetch_nop, op_noni, store_nop ;C1 ;
3476 instr fetch_nop, op_noni, store_nop ;C2 ;
3477 instr fetch_nop, op_noni, store_nop ;C3 ;
3478 instr fetch_nop, op_noni, store_nop ;C4 ;
3479 instr fetch_nop, op_noni, store_nop ;C5 ;
3480 instr fetch_nop, op_noni, store_nop ;C6 ;
3481 instr fetch_nop, op_noni, store_nop ;C7 ;
3482 instr fetch_nop, op_noni, store_nop ;C8 ;
3483 instr fetch_nop, op_noni, store_nop ;C9 ;
3484 instr fetch_nop, op_noni, store_nop ;CA ;
3485 instr fetch_nop, op_prefixDDFDCB,store_nop ;CB ;
3486 instr fetch_nop, op_noni, store_nop ;CC ;
3487 instr fetch_nop, op_noni, store_nop ;CD ;
3488 instr fetch_nop, op_noni, store_nop ;CE ;
3489 instr fetch_nop, op_noni, store_nop ;CF ;
3490 instr fetch_nop, op_noni, store_nop ;D0 ;
3491 instr fetch_nop, op_noni, store_nop ;D1 ;
3492 instr fetch_nop, op_noni, store_nop ;D2 ;
3493 instr fetch_nop, op_noni, store_nop ;D3 ;
3494 instr fetch_nop, op_noni, store_nop ;D4 ;
3495 instr fetch_nop, op_noni, store_nop ;D5 ;
3496 instr fetch_nop, op_noni, store_nop ;D6 ;
3497 instr fetch_nop, op_noni, store_nop ;D7 ;
3498 instr fetch_nop, op_noni, store_nop ;D8 ;
3499 instr fetch_nop, op_noni, store_nop ;D9 ;
3500 instr fetch_nop, op_noni, store_nop ;DA ;
3501 instr fetch_nop, op_noni, store_nop ;DB ;
3502 instr fetch_nop, op_noni, store_nop ;DC ;
3503 instr fetch_nop, op_noni, store_nop ;DD ;
3504 instr fetch_nop, op_noni, store_nop ;DE ;
3505 instr fetch_nop, op_noni, store_nop ;DF ;
3506 instr fetch_nop, op_noni, store_nop ;E0 ;
3507 instr fetch_nop, op_POP16, store_xx ;E1 ;POP xx
3508 instr fetch_nop, op_noni, store_nop ;E2 ;
3509 instr fetch_MSP, op_EXxx, store_MSP ;E3 ;EX (SP),xx
3510 instr fetch_nop, op_noni, store_nop ;E4 ;
3511 instr fetch_xx, op_PUSH16, store_nop ;E5 ;PUSH xx
3512 instr fetch_nop, op_noni, store_nop ;E6 ;
3513 instr fetch_nop, op_noni, store_nop ;E7 ;
3514 instr fetch_nop, op_noni, store_nop ;E8 ;
3515 instr fetch_xx, op_nop, store_PC ;E9 ;JP xx
3516 instr fetch_nop, op_noni, store_nop ;EA ;
3517 instr fetch_nop, op_noni, store_nop ;EB ;
3518 instr fetch_nop, op_noni, store_nop ;EC ;
3519 instr fetch_nop, op_noni, store_nop ;ED ;
3520 instr fetch_nop, op_noni, store_nop ;EE ;
3521 instr fetch_nop, op_noni, store_nop ;EF ;
3522 instr fetch_nop, op_noni, store_nop ;F0 ;
3523 instr fetch_nop, op_noni, store_nop ;F1 ;
3524 instr fetch_nop, op_noni, store_nop ;F2 ;
3525 instr fetch_nop, op_noni, store_nop ;F3 ;
3526 instr fetch_nop, op_noni, store_nop ;F4 ;
3527 instr fetch_nop, op_noni, store_nop ;F5 ;
3528 instr fetch_nop, op_noni, store_nop ;F6 ;
3529 instr fetch_nop, op_noni, store_nop ;F7 ;
3530 instr fetch_nop, op_noni, store_nop ;F8 ;
3531 instr fetch_xx, op_nop, store_SP ;F9 ;LD SP,xx
3532 instr fetch_nop, op_noni, store_nop ;FA ;
3533 instr fetch_nop, op_noni, store_nop ;FB ;
3534 instr fetch_nop, op_noni, store_nop ;FC ;
3535 instr fetch_nop, op_noni, store_nop ;FD ;
3536 instr fetch_nop, op_noni, store_nop ;FE ;
3537 instr fetch_nop, op_noni, store_nop ;FF ;
3538
3539
3540
3541 ;----------------------------------------------------------------
3542 ;|Mnemonic |SZHPNC|Description |Notes |
3543 ;----------------------------------------------------------------
3544 ;|RLC m |**0P0*|Rotate Left Circular |m=m<- |
3545 ;|RRC m |**0P0*|Rotate Right Circular|m=->m |
3546 ;|RL m |**0P0*|Rotate Left |m={CY,m}<- |
3547 ;|RR m |**0P0*|Rotate Right |m=->{CY,m} |
3548 ;|SLA m |**0P0*|Shift Left Arithmetic|m=m*2 |
3549 ;|SRA m |**0P0*|Shift Right Arith. |m=m/2 |
3550 ;|SLL m |**0P0*|Shift Right Logical |
3551 ;|SRL m |**0P0*|Shift Right Logical |m=->{0,m,CY} |
3552
3553
3554 do_op_rlc:
3555 ;Rotate Left Cyclical. All bits move 1 to the
3556 ;left, the msb becomes c and lsb.
3557 clr temp
3558 lsl opl
3559 adc temp,_0
3560 or opl,temp
3561 ldpmx z_flags,sz53p_tab,opl ;S,Z,H,P,N
3562 or z_flags,temp
3563 ret
3564
3565 do_op_rrc:
3566 ;Rotate Right Cyclical. All bits move 1 to the
3567 ;right, the lsb becomes c and msb.
3568 lsr opl
3569 brcc PC+2
3570 ori opl,0x80
3571 ldpmx z_flags,sz53p_tab,opl ;S,Z,H,P,N
3572 bmov z_flags,ZFL_C, opl,7
3573 ret
3574
3575
3576 do_op_rl:
3577 ;Rotate Left. All bits move 1 to the left, the msb
3578 ;becomes c, c becomes lsb.
3579 clc
3580 sbrc z_flags,ZFL_C
3581 sec
3582 rol opl
3583 in temp,sreg
3584 ldpmx z_flags,sz53p_tab,opl ;S,Z,H,P,N
3585 bmov z_flags,ZFL_C, temp,AVR_C
3586 ret
3587
3588
3589 do_op_rr:
3590 ;Rotate Right. All bits move 1 to the right, the lsb
3591 ;becomes c, c becomes msb.
3592
3593 ror opl
3594 in temp,sreg ;CY
3595 bmov opl,7, z_flags,ZFL_C ;old CY --> Bit 7
3596 ldpmx z_flags,sz53p_tab,opl ;S,Z,H,P,N
3597 bmov z_flags,ZFL_C, temp,AVR_C ;
3598 ret
3599
3600 do_op_sla:
3601 lsl opl
3602 in temp,sreg
3603 ldpmx z_flags,sz53p_tab,opl ;S,Z,H,P,N
3604 bmov z_flags,ZFL_C, temp,AVR_C ;
3605 ret
3606
3607 do_op_sra:
3608 lsr opl
3609 in temp,sreg
3610 bmov opl,7, opl,6 ;old CY --> Bit 7
3611 ldpmx z_flags,sz53p_tab,opl ;S,Z,H,P,N
3612 bmov z_flags,ZFL_C, temp,AVR_C ;
3613 ret
3614
3615 do_op_sll:
3616 sec
3617 rol opl
3618 in temp,sreg
3619 ldpmx z_flags,sz53p_tab,opl ;S,Z,H,P,N
3620 bmov z_flags,ZFL_C, temp,AVR_C ;
3621 ret
3622
3623 do_op_srl:
3624 lsr opl
3625 in temp,sreg
3626 ldpmx z_flags,sz53p_tab,opl ;S,Z,H,P,N
3627 bmov z_flags,ZFL_C, temp,AVR_C ;
3628 ret
3629
3630 ;----------------------------------------------------------------
3631 ;|Mnemonic |SZHPNC|Description |Notes |
3632 ;----------------------------------------------------------------
3633 ;|BIT b,m |?*1?0-|Test Bit |m&{2^b} |
3634 ;|RES b,m |------|Reset bit |m=m&{~2^b} |
3635 ;|SET b,m |------|Set bit |m=mv{2^b} |
3636
3637
3638 do_op_BIT7:
3639 ldi temp,0x80
3640 rjmp opbit
3641 do_op_BIT6:
3642 ldi temp,0x40
3643 rjmp opbit
3644 do_op_BIT5:
3645 ldi temp,0x20
3646 rjmp opbit
3647 do_op_BIT4:
3648 ldi temp,0x10
3649 rjmp opbit
3650 do_op_BIT3:
3651 ldi temp,0x08
3652 rjmp opbit
3653 do_op_BIT2:
3654 ldi temp,0x04
3655 rjmp opbit
3656 do_op_BIT1:
3657 ldi temp,0x02
3658 rjmp opbit
3659 do_op_BIT0:
3660 ldi temp,0x01
3661 opbit:
3662 and temp,opl
3663 in temp,sreg
3664 ori z_flags,(1<<ZFL_H)
3665 andi z_flags,~(1<<ZFL_N)
3666 bmov z_flags,ZFL_Z, temp,AVR_Z
3667 ret
3668
3669
3670 .macro m_do_op_RES7
3671 andi opl,~0x80
3672 .endm
3673 .equ do_op_RES7 = 0
3674 ; andi opl,~0x80
3675 ; ret
3676
3677 .macro m_do_op_RES6
3678 andi opl,~0x40
3679 .endm
3680 .equ do_op_RES6 = 0
3681 ; andi opl,~0x40
3682 ; ret
3683
3684 .macro m_do_op_RES5
3685 andi opl,~0x20
3686 .endm
3687 .equ do_op_RES5 = 0
3688 ; andi opl,~0x20
3689 ; ret
3690
3691 .macro m_do_op_RES4
3692 andi opl,~0x10
3693 .endm
3694 .equ do_op_RES4 = 0
3695 ; andi opl,~0x10
3696 ; ret
3697
3698 .macro m_do_op_RES3
3699 andi opl,~0x08
3700 .endm
3701 .equ do_op_RES3 = 0
3702 ; andi opl,~0x08
3703 ; ret
3704
3705 .macro m_do_op_RES2
3706 andi opl,~0x04
3707 .endm
3708 .equ do_op_RES2 = 0
3709 ; andi opl,~0x04
3710 ; ret
3711
3712 .macro m_do_op_RES1
3713 andi opl,~0x02
3714 .endm
3715 .equ do_op_RES1 = 0
3716 ; andi opl,~0x02
3717 ; ret
3718
3719 .macro m_do_op_RES0
3720 andi opl,~0x01
3721 .endm
3722 .equ do_op_RES0 = 0
3723 ; andi opl,~0x01
3724 ; ret
3725
3726 .macro m_do_op_SET7
3727 ori opl,0x80
3728 .endm
3729 .equ do_op_SET7 = 0
3730 ; ori opl,0x80
3731 ; ret
3732
3733 .macro m_do_op_SET6
3734 ori opl,0x40
3735 .endm
3736 .equ do_op_SET6 = 0
3737 ; ori opl,0x40
3738 ; ret
3739
3740 .macro m_do_op_SET5
3741 ori opl,0x20
3742 .endm
3743 .equ do_op_SET5 = 0
3744 ; ori opl,0x20
3745 ; ret
3746
3747 .macro m_do_op_SET4
3748 ori opl,0x10
3749 .endm
3750 .equ do_op_SET4 = 0
3751 ; ori opl,0x10
3752 ; ret
3753
3754 .macro m_do_op_SET3
3755 ori opl,0x08
3756 .endm
3757 .equ do_op_SET3 = 0
3758 ; ori opl,0x08
3759 ; ret
3760
3761 .macro m_do_op_SET2
3762 ori opl,0x04
3763 .endm
3764 .equ do_op_SET2 = 0
3765 ; ori opl,0x04
3766 ; ret
3767
3768 .macro m_do_op_SET1
3769 ori opl,0x02
3770 .endm
3771 .equ do_op_SET1 = 0
3772 ; ori opl,0x02
3773 ; ret
3774
3775 .macro m_do_op_SET0
3776 ori opl,0x01
3777 .endm
3778 .equ do_op_SET0 = 0
3779 ; ori opl,0x01
3780 ; ret
3781
3782
3783 ;.macro m_do_store_b
3784 ; std y+oz_b,opl
3785 ;.endm
3786 ;.equ do_store_b = 0
3787 do_store2_b:
3788 std y+oz_b,opl
3789 ret
3790
3791 do_store2_c:
3792 std y+oz_c,opl
3793 ret
3794
3795 do_store2_d:
3796 std y+oz_d,opl
3797 ret
3798
3799 do_store2_e:
3800 std y+oz_e,opl
3801 ret
3802
3803 do_store2_h:
3804 std y+oz_h,opl
3805 ret
3806
3807 do_store2_l:
3808 std y+oz_l,opl
3809 ret
3810
3811 do_store2_a:
3812 mov z_a,opl
3813 ret
3814
3815 do_fetch2_mhl:
3816 ldd xh,y+oz_h
3817 ldd xl,y+oz_l
3818 mem_read_d opl
3819 ret
3820
3821 opctable CBjmp
3822
3823 instr fetch_B, op_RLC, store2_B ;00 ;RLC B
3824 instr fetch_C, op_RLC, store2_C ;01 ;RLC C
3825 instr fetch_D, op_RLC, store2_D ;02 ;RLC D
3826 instr fetch_E, op_RLC, store2_E ;03 ;RLC E
3827 instr fetch_H, op_RLC, store2_H ;04 ;RLC H
3828 instr fetch_L, op_RLC, store2_L ;05 ;RLC L
3829 instr fetch2_mhl, op_RLC, store_MHL ;06 ;RLC (HL)
3830 instr fetch_A, op_RLC, store2_A ;07 ;RLC A
3831 instr fetch_B, op_RRC, store2_B ;08 ;RRC B
3832 instr fetch_C, op_RRC, store2_C ;09 ;RRC C
3833 instr fetch_D, op_RRC, store2_D ;0A ;RRC D
3834 instr fetch_E, op_RRC, store2_E ;0B ;RRC E
3835 instr fetch_H, op_RRC, store2_H ;0C ;RRC H
3836 instr fetch_L, op_RRC, store2_L ;0D ;RRC L
3837 instr fetch2_mhl, op_RRC, store_MHL ;0E ;RRC (HL)
3838 instr fetch_A, op_RRC, store2_A ;0F ;RRC A
3839 instr fetch_B, op_RL, store2_B ;10 ;RL B
3840 instr fetch_C, op_RL, store2_C ;11 ;RL C
3841 instr fetch_D, op_RL, store2_D ;12 ;RL D
3842 instr fetch_E, op_RL, store2_E ;13 ;RL E
3843 instr fetch_H, op_RL, store2_H ;14 ;RL H
3844 instr fetch_L, op_RL, store2_L ;15 ;RL L
3845 instr fetch2_mhl, op_RL, store_MHL ;16 ;RL (HL)
3846 instr fetch_A, op_RL, store2_A ;17 ;RL A
3847 instr fetch_B, op_RR, store2_B ;18 ;RR B
3848 instr fetch_C, op_RR, store2_C ;19 ;RR C
3849 instr fetch_D, op_RR, store2_D ;1A ;RR D
3850 instr fetch_E, op_RR, store2_E ;1B ;RR E
3851 instr fetch_H, op_RR, store2_H ;1C ;RR H
3852 instr fetch_L, op_RR, store2_L ;1D ;RR L
3853 instr fetch2_mhl, op_RR, store_MHL ;1E ;RR (HL)
3854 instr fetch_A, op_RR, store2_A ;1F ;RR A
3855 instr fetch_B, op_SLA, store2_B ;20 ;SLA B
3856 instr fetch_C, op_SLA, store2_C ;21 ;SLA C
3857 instr fetch_D, op_SLA, store2_D ;22 ;SLA D
3858 instr fetch_E, op_SLA, store2_E ;23 ;SLA E
3859 instr fetch_H, op_SLA, store2_H ;24 ;SLA H
3860 instr fetch_L, op_SLA, store2_L ;25 ;SLA L
3861 instr fetch2_mhl, op_SLA, store_MHL ;26 ;SLA (HL)
3862 instr fetch_A, op_SLA, store2_A ;27 ;SLA A
3863 instr fetch_B, op_SRA, store2_B ;28 ;SRA B
3864 instr fetch_C, op_SRA, store2_C ;29 ;SRA C
3865 instr fetch_D, op_SRA, store2_D ;2A ;SRA D
3866 instr fetch_E, op_SRA, store2_E ;2B ;SRA E
3867 instr fetch_H, op_SRA, store2_H ;2C ;SRA H
3868 instr fetch_L, op_SRA, store2_L ;2D ;SRA L
3869 instr fetch2_mhl, op_SRA, store_MHL ;2E ;SRA (HL)
3870 instr fetch_A, op_SRA, store2_A ;2F ;SRA A
3871 instr fetch_B, op_SLL, store2_B ;30 ;SLL B
3872 instr fetch_C, op_SLL, store2_C ;31 ;SLL C
3873 instr fetch_D, op_SLL, store2_D ;32 ;SLL D
3874 instr fetch_E, op_SLL, store2_E ;33 ;SLL E
3875 instr fetch_H, op_SLL, store2_H ;34 ;SLL H
3876 instr fetch_L, op_SLL, store2_L ;35 ;SLL L
3877 instr fetch2_mhl, op_SLL, store_MHL ;36 ;SLL (HL)
3878 instr fetch_A, op_SLL, store2_A ;37 ;SLL A
3879 instr fetch_B, op_SRL, store2_B ;38 ;SRL B
3880 instr fetch_C, op_SRL, store2_C ;39 ;SRL C
3881 instr fetch_D, op_SRL, store2_D ;3A ;SRL D
3882 instr fetch_E, op_SRL, store2_E ;3B ;SRL E
3883 instr fetch_H, op_SRL, store2_H ;3C ;SRL H
3884 instr fetch_L, op_SRL, store2_L ;3D ;SRL L
3885 instr fetch2_mhl, op_SRL, store_MHL ;3E ;SRL (HL)
3886 instr fetch_A, op_SRL, store2_A ;3F ;SRL A
3887 instr fetch_B, op_BIT0, store_nop ;40 ;BIT 0,B
3888 instr fetch_C, op_BIT0, store_nop ;41 ;BIT 0,C
3889 instr fetch_D, op_BIT0, store_nop ;42 ;BIT 0,D
3890 instr fetch_E, op_BIT0, store_nop ;43 ;BIT 0,E
3891 instr fetch_H, op_BIT0, store_nop ;44 ;BIT 0,H
3892 instr fetch_L, op_BIT0, store_nop ;45 ;BIT 0,L
3893 instr fetch2_mhl, op_BIT0, store_nop ;46 ;BIT 0,(HL)
3894 instr fetch_A, op_BIT0, store_nop ;47 ;BIT 0,A
3895 instr fetch_B, op_BIT1, store_nop ;48 ;BIT 1,B
3896 instr fetch_C, op_BIT1, store_nop ;49 ;BIT 1,C
3897 instr fetch_D, op_BIT1, store_nop ;4A ;BIT 1,D
3898 instr fetch_E, op_BIT1, store_nop ;4B ;BIT 1,E
3899 instr fetch_H, op_BIT1, store_nop ;4C ;BIT 1,H
3900 instr fetch_L, op_BIT1, store_nop ;4D ;BIT 1,L
3901 instr fetch2_mhl, op_BIT1, store_nop ;4E ;BIT 1,(HL)
3902 instr fetch_A, op_BIT1, store_nop ;4F ;BIT 1,A
3903 instr fetch_B, op_BIT2, store_nop ;50 ;BIT 2,B
3904 instr fetch_C, op_BIT2, store_nop ;51 ;BIT 2,C
3905 instr fetch_D, op_BIT2, store_nop ;52 ;BIT 2,D
3906 instr fetch_E, op_BIT2, store_nop ;53 ;BIT 2,E
3907 instr fetch_H, op_BIT2, store_nop ;54 ;BIT 2,H
3908 instr fetch_L, op_BIT2, store_nop ;55 ;BIT 2,L
3909 instr fetch2_mhl, op_BIT2, store_nop ;56 ;BIT 2,(HL)
3910 instr fetch_A, op_BIT2, store_nop ;57 ;BIT 2,A
3911 instr fetch_B, op_BIT3, store_nop ;58 ;BIT 3,B
3912 instr fetch_C, op_BIT3, store_nop ;59 ;BIT 3,C
3913 instr fetch_D, op_BIT3, store_nop ;5A ;BIT 3,D
3914 instr fetch_E, op_BIT3, store_nop ;5B ;BIT 3,E
3915 instr fetch_H, op_BIT3, store_nop ;5C ;BIT 3,H
3916 instr fetch_L, op_BIT3, store_nop ;5D ;BIT 3,L
3917 instr fetch2_mhl, op_BIT3, store_nop ;5E ;BIT 3,(HL)
3918 instr fetch_A, op_BIT3, store_nop ;5F ;BIT 3,A
3919 instr fetch_B, op_BIT4, store_nop ;60 ;BIT 4,B
3920 instr fetch_C, op_BIT4, store_nop ;61 ;BIT 4,C
3921 instr fetch_D, op_BIT4, store_nop ;62 ;BIT 4,D
3922 instr fetch_E, op_BIT4, store_nop ;63 ;BIT 4,E
3923 instr fetch_H, op_BIT4, store_nop ;64 ;BIT 4,H
3924 instr fetch_L, op_BIT4, store_nop ;65 ;BIT 4,L
3925 instr fetch2_mhl, op_BIT4, store_nop ;66 ;BIT 4,(HL)
3926 instr fetch_A, op_BIT4, store_nop ;67 ;BIT 4,A
3927 instr fetch_B, op_BIT5, store_nop ;68 ;BIT 5,B
3928 instr fetch_C, op_BIT5, store_nop ;69 ;BIT 5,C
3929 instr fetch_D, op_BIT5, store_nop ;6A ;BIT 5,D
3930 instr fetch_E, op_BIT5, store_nop ;6B ;BIT 5,E
3931 instr fetch_H, op_BIT5, store_nop ;6C ;BIT 5,H
3932 instr fetch_L, op_BIT5, store_nop ;6D ;BIT 5,L
3933 instr fetch2_mhl, op_BIT5, store_nop ;6E ;BIT 5,(HL)
3934 instr fetch_A, op_BIT5, store_nop ;6F ;BIT 5,A
3935 instr fetch_B, op_BIT6, store_nop ;70 ;BIT 6,B
3936 instr fetch_C, op_BIT6, store_nop ;71 ;BIT 6,C
3937 instr fetch_D, op_BIT6, store_nop ;72 ;BIT 6,D
3938 instr fetch_E, op_BIT6, store_nop ;73 ;BIT 6,E
3939 instr fetch_H, op_BIT6, store_nop ;74 ;BIT 6,H
3940 instr fetch_L, op_BIT6, store_nop ;75 ;BIT 6,L
3941 instr fetch2_mhl, op_BIT6, store_nop ;76 ;BIT 6,(HL)
3942 instr fetch_A, op_BIT6, store_nop ;77 ;BIT 6,A
3943 instr fetch_B, op_BIT7, store_nop ;78 ;BIT 7,B
3944 instr fetch_C, op_BIT7, store_nop ;79 ;BIT 7,C
3945 instr fetch_D, op_BIT7, store_nop ;7A ;BIT 7,D
3946 instr fetch_E, op_BIT7, store_nop ;7B ;BIT 7,E
3947 instr fetch_H, op_BIT7, store_nop ;7C ;BIT 7,H
3948 instr fetch_L, op_BIT7, store_nop ;7D ;BIT 7,L
3949 instr fetch2_mhl, op_BIT7, store_nop ;7E ;BIT 7,(HL)
3950 instr fetch_A, op_BIT7, store_nop ;7F ;BIT 7,A
3951 instr fetch_B, op_RES0, store2_B ;80 ;RES 0,B
3952 instr fetch_C, op_RES0, store2_C ;81 ;RES 0,C
3953 instr fetch_D, op_RES0, store2_D ;82 ;RES 0,D
3954 instr fetch_E, op_RES0, store2_E ;83 ;RES 0,E
3955 instr fetch_H, op_RES0, store2_H ;84 ;RES 0,H
3956 instr fetch_L, op_RES0, store2_L ;85 ;RES 0,L
3957 instr fetch2_mhl, op_RES0, store_MHL ;86 ;RES 0,(HL)
3958 instr fetch_A, op_RES0, store2_A ;87 ;RES 0,A
3959 instr fetch_B, op_RES1, store2_B ;88 ;RES 1,B
3960 instr fetch_C, op_RES1, store2_C ;89 ;RES 1,C
3961 instr fetch_D, op_RES1, store2_D ;8A ;RES 1,D
3962 instr fetch_E, op_RES1, store2_E ;8B ;RES 1,E
3963 instr fetch_H, op_RES1, store2_H ;8C ;RES 1,H
3964 instr fetch_L, op_RES1, store2_L ;8D ;RES 1,L
3965 instr fetch2_mhl, op_RES1, store_MHL ;8E ;RES 1,(HL)
3966 instr fetch_A, op_RES1, store2_A ;8F ;RES 1,A
3967 instr fetch_B, op_RES2, store2_B ;90 ;RES 2,B
3968 instr fetch_C, op_RES2, store2_C ;91 ;RES 2,C
3969 instr fetch_D, op_RES2, store2_D ;92 ;RES 2,D
3970 instr fetch_E, op_RES2, store2_E ;93 ;RES 2,E
3971 instr fetch_H, op_RES2, store2_H ;94 ;RES 2,H
3972 instr fetch_L, op_RES2, store2_L ;95 ;RES 2,L
3973 instr fetch2_mhl, op_RES2, store_MHL ;96 ;RES 2,(HL)
3974 instr fetch_A, op_RES2, store2_A ;97 ;RES 2,A
3975 instr fetch_B, op_RES3, store2_B ;98 ;RES 3,B
3976 instr fetch_C, op_RES3, store2_C ;99 ;RES 3,C
3977 instr fetch_D, op_RES3, store2_D ;9A ;RES 3,D
3978 instr fetch_E, op_RES3, store2_E ;9B ;RES 3,E
3979 instr fetch_H, op_RES3, store2_H ;9C ;RES 3,H
3980 instr fetch_L, op_RES3, store2_L ;9D ;RES 3,L
3981 instr fetch2_mhl, op_RES3, store_MHL ;9E ;RES 3,(HL)
3982 instr fetch_A, op_RES3, store2_A ;9F ;RES 3,A
3983 instr fetch_B, op_RES4, store2_B ;A0 ;RES 4,B
3984 instr fetch_C, op_RES4, store2_C ;A1 ;RES 4,C
3985 instr fetch_D, op_RES4, store2_D ;A2 ;RES 4,D
3986 instr fetch_E, op_RES4, store2_E ;A3 ;RES 4,E
3987 instr fetch_H, op_RES4, store2_H ;A4 ;RES 4,H
3988 instr fetch_L, op_RES4, store2_L ;A5 ;RES 4,L
3989 instr fetch2_mhl, op_RES4, store_MHL ;A6 ;RES 4,(HL)
3990 instr fetch_A, op_RES4, store2_A ;A7 ;RES 4,A
3991 instr fetch_B, op_RES5, store2_B ;A8 ;RES 5,B
3992 instr fetch_C, op_RES5, store2_C ;A9 ;RES 5,C
3993 instr fetch_D, op_RES5, store2_D ;AA ;RES 5,D
3994 instr fetch_E, op_RES5, store2_E ;AB ;RES 5,E
3995 instr fetch_H, op_RES5, store2_H ;AC ;RES 5,H
3996 instr fetch_L, op_RES5, store2_L ;AD ;RES 5,L
3997 instr fetch2_mhl, op_RES5, store_MHL ;AE ;RES 5,(HL)
3998 instr fetch_A, op_RES5, store2_A ;AF ;RES 5,A
3999 instr fetch_B, op_RES6, store2_B ;B0 ;RES 6,B
4000 instr fetch_C, op_RES6, store2_C ;B1 ;RES 6,C
4001 instr fetch_D, op_RES6, store2_D ;B2 ;RES 6,D
4002 instr fetch_E, op_RES6, store2_E ;B3 ;RES 6,E
4003 instr fetch_H, op_RES6, store2_H ;B4 ;RES 6,H
4004 instr fetch_L, op_RES6, store2_L ;B5 ;RES 6,L
4005 instr fetch2_mhl, op_RES6, store_MHL ;B6 ;RES 6,(HL)
4006 instr fetch_A, op_RES6, store2_A ;B7 ;RES 6,A
4007 instr fetch_B, op_RES7, store2_B ;B8 ;RES 7,B
4008 instr fetch_C, op_RES7, store2_C ;B9 ;RES 7,C
4009 instr fetch_D, op_RES7, store2_D ;BA ;RES 7,D
4010 instr fetch_E, op_RES7, store2_E ;BB ;RES 7,E
4011 instr fetch_H, op_RES7, store2_H ;BC ;RES 7,H
4012 instr fetch_L, op_RES7, store2_L ;BD ;RES 7,L
4013 instr fetch2_mhl, op_RES7, store_MHL ;BE ;RES 7,(HL)
4014 instr fetch_A, op_RES7, store2_A ;BF ;RES 7,A
4015 instr fetch_B, op_SET0, store2_B ;C0 ;SET 0,B
4016 instr fetch_C, op_SET0, store2_C ;C1 ;SET 0,C
4017 instr fetch_D, op_SET0, store2_D ;C2 ;SET 0,D
4018 instr fetch_E, op_SET0, store2_E ;C3 ;SET 0,E
4019 instr fetch_H, op_SET0, store2_H ;C4 ;SET 0,H
4020 instr fetch_L, op_SET0, store2_L ;C5 ;SET 0,L
4021 instr fetch2_mhl, op_SET0, store_MHL ;C6 ;SET 0,(HL)
4022 instr fetch_A, op_SET0, store2_A ;C7 ;SET 0,A
4023 instr fetch_B, op_SET1, store2_B ;C8 ;SET 1,B
4024 instr fetch_C, op_SET1, store2_C ;C9 ;SET 1,C
4025 instr fetch_D, op_SET1, store2_D ;CA ;SET 1,D
4026 instr fetch_E, op_SET1, store2_E ;CB ;SET 1,E
4027 instr fetch_H, op_SET1, store2_H ;CC ;SET 1,H
4028 instr fetch_L, op_SET1, store2_L ;CD ;SET 1,L
4029 instr fetch2_mhl, op_SET1, store_MHL ;CE ;SET 1,(HL)
4030 instr fetch_A, op_SET1, store2_A ;CF ;SET 1,A
4031 instr fetch_B, op_SET2, store2_B ;D0 ;SET 2,B
4032 instr fetch_C, op_SET2, store2_C ;D1 ;SET 2,C
4033 instr fetch_D, op_SET2, store2_D ;D2 ;SET 2,D
4034 instr fetch_E, op_SET2, store2_E ;D3 ;SET 2,E
4035 instr fetch_H, op_SET2, store2_H ;D4 ;SET 2,H
4036 instr fetch_L, op_SET2, store2_L ;D5 ;SET 2,L
4037 instr fetch2_mhl, op_SET2, store_MHL ;D6 ;SET 2,(HL)
4038 instr fetch_A, op_SET2, store2_A ;D7 ;SET 2,A
4039 instr fetch_B, op_SET3, store2_B ;D8 ;SET 3,B
4040 instr fetch_C, op_SET3, store2_C ;D9 ;SET 3,C
4041 instr fetch_D, op_SET3, store2_D ;DA ;SET 3,D
4042 instr fetch_E, op_SET3, store2_E ;DB ;SET 3,E
4043 instr fetch_H, op_SET3, store2_H ;DC ;SET 3,H
4044 instr fetch_L, op_SET3, store2_L ;DD ;SET 3,L
4045 instr fetch2_mhl, op_SET3, store_MHL ;DE ;SET 3,(HL)
4046 instr fetch_A, op_SET3, store2_A ;DF ;SET 3,A
4047 instr fetch_B, op_SET4, store2_B ;E0 ;SET 4,B
4048 instr fetch_C, op_SET4, store2_C ;E1 ;SET 4,C
4049 instr fetch_D, op_SET4, store2_D ;E2 ;SET 4,D
4050 instr fetch_E, op_SET4, store2_E ;E3 ;SET 4,E
4051 instr fetch_H, op_SET4, store2_H ;E4 ;SET 4,H
4052 instr fetch_L, op_SET4, store2_L ;E5 ;SET 4,L
4053 instr fetch2_mhl, op_SET4, store_MHL ;E6 ;SET 4,(HL)
4054 instr fetch_A, op_SET4, store2_A ;E7 ;SET 4,A
4055 instr fetch_B, op_SET5, store2_B ;E8 ;SET 5,B
4056 instr fetch_C, op_SET5, store2_C ;E9 ;SET 5,C
4057 instr fetch_D, op_SET5, store2_D ;EA ;SET 5,D
4058 instr fetch_E, op_SET5, store2_E ;EB ;SET 5,E
4059 instr fetch_H, op_SET5, store2_H ;EC ;SET 5,H
4060 instr fetch_L, op_SET5, store2_L ;ED ;SET 5,L
4061 instr fetch2_mhl, op_SET5, store_MHL ;EE ;SET 5,(HL)
4062 instr fetch_A, op_SET5, store2_A ;EF ;SET 5,A
4063 instr fetch_B, op_SET6, store2_B ;F0 ;SET 6,B
4064 instr fetch_C, op_SET6, store2_C ;F1 ;SET 6,C
4065 instr fetch_D, op_SET6, store2_D ;F2 ;SET 6,D
4066 instr fetch_E, op_SET6, store2_E ;F3 ;SET 6,E
4067 instr fetch_H, op_SET6, store2_H ;F4 ;SET 6,H
4068 instr fetch_L, op_SET6, store2_L ;F5 ;SET 6,L
4069 instr fetch2_mhl, op_SET6, store_MHL ;F6 ;SET 6,(HL)
4070 instr fetch_A, op_SET6, store2_A ;F7 ;SET 6,A
4071 instr fetch_B, op_SET7, store2_B ;F8 ;SET 7,B
4072 instr fetch_C, op_SET7, store2_C ;F9 ;SET 7,C
4073 instr fetch_D, op_SET7, store2_D ;FA ;SET 7,D
4074 instr fetch_E, op_SET7, store2_E ;FB ;SET 7,E
4075 instr fetch_H, op_SET7, store2_H ;FC ;SET 7,H
4076 instr fetch_L, op_SET7, store2_L ;FD ;SET 7,L
4077 instr fetch2_mhl, op_SET7, store_MHL ;FE ;SET 7,(HL)
4078 instr fetch_A, op_SET7, store2_A ;FF ;SET 7,A
4079
4080
4081 opctable DDFDCBjmp
4082
4083 instr fetch_nop, op_RLC, store2_B ;00 ;RLC (Ix+d),B
4084 instr fetch_nop, op_RLC, store2_C ;01 ;RLC (Ix+d),C
4085 instr fetch_nop, op_RLC, store2_D ;02 ;RLC (Ix+d),D
4086 instr fetch_nop, op_RLC, store2_E ;03 ;RLC (Ix+d),E
4087 instr fetch_nop, op_RLC, store2_H ;04 ;RLC (Ix+d),H
4088 instr fetch_nop, op_RLC, store2_L ;05 ;RLC (Ix+d),L
4089 instr fetch_nop, op_RLC, store_nop ;06 ;RLC (Ix+d)
4090 instr fetch_nop, op_RLC, store2_A ;07 ;RLC (Ix+d),A
4091 instr fetch_nop, op_RRC, store2_B ;08 ;RRC (Ix+d),B
4092 instr fetch_nop, op_RRC, store2_C ;09 ;RRC (Ix+d),C
4093 instr fetch_nop, op_RRC, store2_D ;0A ;RRC (Ix+d),D
4094 instr fetch_nop, op_RRC, store2_E ;0B ;RRC (Ix+d),E
4095 instr fetch_nop, op_RRC, store2_H ;0C ;RRC (Ix+d),H
4096 instr fetch_nop, op_RRC, store2_L ;0D ;RRC (Ix+d),L
4097 instr fetch_nop, op_RRC, store_nop ;0E ;RRC (Ix+d)
4098 instr fetch_nop, op_RRC, store2_A ;0F ;RRC (Ix+d),A
4099 instr fetch_nop, op_RL, store2_B ;10 ;RL (Ix+d),B
4100 instr fetch_nop, op_RL, store2_C ;11 ;RL (Ix+d),C
4101 instr fetch_nop, op_RL, store2_D ;12 ;RL (Ix+d),D
4102 instr fetch_nop, op_RL, store2_E ;13 ;RL (Ix+d),E
4103 instr fetch_nop, op_RL, store2_H ;14 ;RL (Ix+d),H
4104 instr fetch_nop, op_RL, store2_L ;15 ;RL (Ix+d),L
4105 instr fetch_nop, op_RL, store_nop ;16 ;RL (Ix+d)
4106 instr fetch_nop, op_RL, store2_A ;17 ;RL (Ix+d),A
4107 instr fetch_nop, op_RR, store2_B ;18 ;RR (Ix+d),B
4108 instr fetch_nop, op_RR, store2_C ;19 ;RR (Ix+d),C
4109 instr fetch_nop, op_RR, store2_D ;1A ;RR (Ix+d),D
4110 instr fetch_nop, op_RR, store2_E ;1B ;RR (Ix+d),E
4111 instr fetch_nop, op_RR, store2_H ;1C ;RR (Ix+d),H
4112 instr fetch_nop, op_RR, store2_L ;1D ;RR (Ix+d),L
4113 instr fetch_nop, op_RR, store_nop ;1E ;RR (Ix+d)
4114 instr fetch_nop, op_RR, store2_A ;1F ;RR (Ix+d),A
4115 instr fetch_nop, op_SLA, store2_B ;20 ;SLA (Ix+d),B
4116 instr fetch_nop, op_SLA, store2_C ;21 ;SLA (Ix+d),C
4117 instr fetch_nop, op_SLA, store2_D ;22 ;SLA (Ix+d),D
4118 instr fetch_nop, op_SLA, store2_E ;23 ;SLA (Ix+d),E
4119 instr fetch_nop, op_SLA, store2_H ;24 ;SLA (Ix+d),H
4120 instr fetch_nop, op_SLA, store2_L ;25 ;SLA (Ix+d),L
4121 instr fetch_nop, op_SLA, store_nop ;26 ;SLA (Ix+d)
4122 instr fetch_nop, op_SLA, store2_A ;27 ;SLA (Ix+d),A
4123 instr fetch_nop, op_SRA, store2_B ;28 ;SRA (Ix+d),B
4124 instr fetch_nop, op_SRA, store2_C ;29 ;SRA (Ix+d),C
4125 instr fetch_nop, op_SRA, store2_D ;2A ;SRA (Ix+d),D
4126 instr fetch_nop, op_SRA, store2_E ;2B ;SRA (Ix+d),E
4127 instr fetch_nop, op_SRA, store2_H ;2C ;SRA (Ix+d),H
4128 instr fetch_nop, op_SRA, store2_L ;2D ;SRA (Ix+d),L
4129 instr fetch_nop, op_SRA, store_nop ;2E ;SRA (Ix+d)
4130 instr fetch_nop, op_SRA, store2_A ;2F ;SRA (Ix+d),A
4131 instr fetch_nop, op_SLL, store2_B ;30 ;SLL (Ix+d),B
4132 instr fetch_nop, op_SLL, store2_C ;31 ;SLL (Ix+d),C
4133 instr fetch_nop, op_SLL, store2_D ;32 ;SLL (Ix+d),D
4134 instr fetch_nop, op_SLL, store2_E ;33 ;SLL (Ix+d),E
4135 instr fetch_nop, op_SLL, store2_H ;34 ;SLL (Ix+d),H
4136 instr fetch_nop, op_SLL, store2_L ;35 ;SLL (Ix+d),L
4137 instr fetch_nop, op_SLL, store_nop ;36 ;SLL (Ix+d)
4138 instr fetch_nop, op_SLL, store2_A ;37 ;SLL (Ix+d),A
4139 instr fetch_nop, op_SRL, store2_B ;38 ;SRL (Ix+d),B
4140 instr fetch_nop, op_SRL, store2_C ;39 ;SRL (Ix+d),C
4141 instr fetch_nop, op_SRL, store2_D ;3A ;SRL (Ix+d),D
4142 instr fetch_nop, op_SRL, store2_E ;3B ;SRL (Ix+d),E
4143 instr fetch_nop, op_SRL, store2_H ;3C ;SRL (Ix+d),H
4144 instr fetch_nop, op_SRL, store2_L ;3D ;SRL (Ix+d),L
4145 instr fetch_nop, op_SRL, store_nop ;3E ;SRL (Ix+d)
4146 instr fetch_nop, op_SRL, store2_A ;3F ;SRL (Ix+d),A
4147 instr fetch_nop, op_BIT0, store_nop ;40 ;BIT 0,(Ix+d),B
4148 instr fetch_nop, op_BIT0, store_nop ;41 ;BIT 0,(Ix+d),C
4149 instr fetch_nop, op_BIT0, store_nop ;42 ;BIT 0,(Ix+d),D
4150 instr fetch_nop, op_BIT0, store_nop ;43 ;BIT 0,(Ix+d),E
4151 instr fetch_nop, op_BIT0, store_nop ;44 ;BIT 0,(Ix+d),H
4152 instr fetch_nop, op_BIT0, store_nop ;45 ;BIT 0,(Ix+d),L
4153 instr fetch_nop, op_BIT0, store_nop ;46 ;BIT 0,(Ix+d)
4154 instr fetch_nop, op_BIT0, store_nop ;47 ;BIT 0,(Ix+d),A
4155 instr fetch_nop, op_BIT1, store_nop ;48 ;BIT 1,(Ix+d),B
4156 instr fetch_nop, op_BIT1, store_nop ;49 ;BIT 1,(Ix+d),C
4157 instr fetch_nop, op_BIT1, store_nop ;4A ;BIT 1,(Ix+d),D
4158 instr fetch_nop, op_BIT1, store_nop ;4B ;BIT 1,(Ix+d),E
4159 instr fetch_nop, op_BIT1, store_nop ;4C ;BIT 1,(Ix+d),H
4160 instr fetch_nop, op_BIT1, store_nop ;4D ;BIT 1,(Ix+d),L
4161 instr fetch_nop, op_BIT1, store_nop ;4E ;BIT 1,(Ix+d)
4162 instr fetch_nop, op_BIT1, store_nop ;4F ;BIT 1,(Ix+d),A
4163 instr fetch_nop, op_BIT2, store_nop ;50 ;BIT 2,(Ix+d),B
4164 instr fetch_nop, op_BIT2, store_nop ;51 ;BIT 2,(Ix+d),C
4165 instr fetch_nop, op_BIT2, store_nop ;52 ;BIT 2,(Ix+d),D
4166 instr fetch_nop, op_BIT2, store_nop ;53 ;BIT 2,(Ix+d),E
4167 instr fetch_nop, op_BIT2, store_nop ;54 ;BIT 2,(Ix+d),H
4168 instr fetch_nop, op_BIT2, store_nop ;55 ;BIT 2,(Ix+d),L
4169 instr fetch_nop, op_BIT2, store_nop ;56 ;BIT 2,(Ix+d)
4170 instr fetch_nop, op_BIT2, store_nop ;57 ;BIT 2,(Ix+d),A
4171 instr fetch_nop, op_BIT3, store_nop ;58 ;BIT 3,(Ix+d),B
4172 instr fetch_nop, op_BIT3, store_nop ;59 ;BIT 3,(Ix+d),C
4173 instr fetch_nop, op_BIT3, store_nop ;5A ;BIT 3,(Ix+d),D
4174 instr fetch_nop, op_BIT3, store_nop ;5B ;BIT 3,(Ix+d),E
4175 instr fetch_nop, op_BIT3, store_nop ;5C ;BIT 3,(Ix+d),H
4176 instr fetch_nop, op_BIT3, store_nop ;5D ;BIT 3,(Ix+d),L
4177 instr fetch_nop, op_BIT3, store_nop ;5E ;BIT 3,(Ix+d)
4178 instr fetch_nop, op_BIT3, store_nop ;5F ;BIT 3,(Ix+d),A
4179 instr fetch_nop, op_BIT4, store_nop ;60 ;BIT 4,(Ix+d),B
4180 instr fetch_nop, op_BIT4, store_nop ;61 ;BIT 4,(Ix+d),C
4181 instr fetch_nop, op_BIT4, store_nop ;62 ;BIT 4,(Ix+d),D
4182 instr fetch_nop, op_BIT4, store_nop ;63 ;BIT 4,(Ix+d),E
4183 instr fetch_nop, op_BIT4, store_nop ;64 ;BIT 4,(Ix+d),H
4184 instr fetch_nop, op_BIT4, store_nop ;65 ;BIT 4,(Ix+d),L
4185 instr fetch_nop, op_BIT4, store_nop ;66 ;BIT 4,(Ix+d)
4186 instr fetch_nop, op_BIT4, store_nop ;67 ;BIT 4,(Ix+d),A
4187 instr fetch_nop, op_BIT5, store_nop ;68 ;BIT 5,(Ix+d),B
4188 instr fetch_nop, op_BIT5, store_nop ;69 ;BIT 5,(Ix+d),C
4189 instr fetch_nop, op_BIT5, store_nop ;6A ;BIT 5,(Ix+d),D
4190 instr fetch_nop, op_BIT5, store_nop ;6B ;BIT 5,(Ix+d),E
4191 instr fetch_nop, op_BIT5, store_nop ;6C ;BIT 5,(Ix+d),H
4192 instr fetch_nop, op_BIT5, store_nop ;6D ;BIT 5,(Ix+d),L
4193 instr fetch_nop, op_BIT5, store_nop ;6E ;BIT 5,(Ix+d)
4194 instr fetch_nop, op_BIT5, store_nop ;6F ;BIT 5,(Ix+d),A
4195 instr fetch_nop, op_BIT6, store_nop ;70 ;BIT 6,(Ix+d),B
4196 instr fetch_nop, op_BIT6, store_nop ;71 ;BIT 6,(Ix+d),C
4197 instr fetch_nop, op_BIT6, store_nop ;72 ;BIT 6,(Ix+d),D
4198 instr fetch_nop, op_BIT6, store_nop ;73 ;BIT 6,(Ix+d),E
4199 instr fetch_nop, op_BIT6, store_nop ;74 ;BIT 6,(Ix+d),H
4200 instr fetch_nop, op_BIT6, store_nop ;75 ;BIT 6,(Ix+d),L
4201 instr fetch_nop, op_BIT6, store_nop ;76 ;BIT 6,(Ix+d)
4202 instr fetch_nop, op_BIT6, store_nop ;77 ;BIT 6,(Ix+d),A
4203 instr fetch_nop, op_BIT7, store_nop ;78 ;BIT 7,(Ix+d),B
4204 instr fetch_nop, op_BIT7, store_nop ;79 ;BIT 7,(Ix+d),C
4205 instr fetch_nop, op_BIT7, store_nop ;7A ;BIT 7,(Ix+d),D
4206 instr fetch_nop, op_BIT7, store_nop ;7B ;BIT 7,(Ix+d),E
4207 instr fetch_nop, op_BIT7, store_nop ;7C ;BIT 7,(Ix+d),H
4208 instr fetch_nop, op_BIT7, store_nop ;7D ;BIT 7,(Ix+d),L
4209 instr fetch_nop, op_BIT7, store_nop ;7E ;BIT 7,(Ix+d)
4210 instr fetch_nop, op_BIT7, store_nop ;7F ;BIT 7,(Ix+d),A
4211 instr fetch_nop, op_RES0, store2_B ;80 ;RES 0,(Ix+d),B
4212 instr fetch_nop, op_RES0, store2_C ;81 ;RES 0,(Ix+d),C
4213 instr fetch_nop, op_RES0, store2_D ;82 ;RES 0,(Ix+d),D
4214 instr fetch_nop, op_RES0, store2_E ;83 ;RES 0,(Ix+d),E
4215 instr fetch_nop, op_RES0, store2_H ;84 ;RES 0,(Ix+d),H
4216 instr fetch_nop, op_RES0, store2_L ;85 ;RES 0,(Ix+d),L
4217 instr fetch_nop, op_RES0, store_nop ;86 ;RES 0,(Ix+d)
4218 instr fetch_nop, op_RES0, store2_A ;87 ;RES 0,(Ix+d),A
4219 instr fetch_nop, op_RES1, store2_B ;88 ;RES 1,(Ix+d),B
4220 instr fetch_nop, op_RES1, store2_C ;89 ;RES 1,(Ix+d),C
4221 instr fetch_nop, op_RES1, store2_D ;8A ;RES 1,(Ix+d),D
4222 instr fetch_nop, op_RES1, store2_E ;8B ;RES 1,(Ix+d),E
4223 instr fetch_nop, op_RES1, store2_H ;8C ;RES 1,(Ix+d),H
4224 instr fetch_nop, op_RES1, store2_L ;8D ;RES 1,(Ix+d),L
4225 instr fetch_nop, op_RES1, store_nop ;8E ;RES 1,(Ix+d)
4226 instr fetch_nop, op_RES1, store2_A ;8F ;RES 1,(Ix+d),A
4227 instr fetch_nop, op_RES2, store2_B ;90 ;RES 2,(Ix+d),B
4228 instr fetch_nop, op_RES2, store2_C ;91 ;RES 2,(Ix+d),C
4229 instr fetch_nop, op_RES2, store2_D ;92 ;RES 2,(Ix+d),D
4230 instr fetch_nop, op_RES2, store2_E ;93 ;RES 2,(Ix+d),E
4231 instr fetch_nop, op_RES2, store2_H ;94 ;RES 2,(Ix+d),H
4232 instr fetch_nop, op_RES2, store2_L ;95 ;RES 2,(Ix+d),L
4233 instr fetch_nop, op_RES2, store_nop ;96 ;RES 2,(Ix+d)
4234 instr fetch_nop, op_RES2, store2_A ;97 ;RES 2,(Ix+d),A
4235 instr fetch_nop, op_RES3, store2_B ;98 ;RES 3,(Ix+d),B
4236 instr fetch_nop, op_RES3, store2_C ;99 ;RES 3,(Ix+d),C
4237 instr fetch_nop, op_RES3, store2_D ;9A ;RES 3,(Ix+d),D
4238 instr fetch_nop, op_RES3, store2_E ;9B ;RES 3,(Ix+d),E
4239 instr fetch_nop, op_RES3, store2_H ;9C ;RES 3,(Ix+d),H
4240 instr fetch_nop, op_RES3, store2_L ;9D ;RES 3,(Ix+d),L
4241 instr fetch_nop, op_RES3, store_nop ;9E ;RES 3,(Ix+d)
4242 instr fetch_nop, op_RES3, store2_A ;9F ;RES 3,(Ix+d),A
4243 instr fetch_nop, op_RES4, store2_B ;A0 ;RES 4,(Ix+d),B
4244 instr fetch_nop, op_RES4, store2_C ;A1 ;RES 4,(Ix+d),C
4245 instr fetch_nop, op_RES4, store2_D ;A2 ;RES 4,(Ix+d),D
4246 instr fetch_nop, op_RES4, store2_E ;A3 ;RES 4,(Ix+d),E
4247 instr fetch_nop, op_RES4, store2_H ;A4 ;RES 4,(Ix+d),H
4248 instr fetch_nop, op_RES4, store2_L ;A5 ;RES 4,(Ix+d),L
4249 instr fetch_nop, op_RES4, store_nop ;A6 ;RES 4,(Ix+d)
4250 instr fetch_nop, op_RES4, store2_A ;A7 ;RES 4,(Ix+d),A
4251 instr fetch_nop, op_RES5, store2_B ;A8 ;RES 5,(Ix+d),B
4252 instr fetch_nop, op_RES5, store2_C ;A9 ;RES 5,(Ix+d),C
4253 instr fetch_nop, op_RES5, store2_D ;AA ;RES 5,(Ix+d),D
4254 instr fetch_nop, op_RES5, store2_E ;AB ;RES 5,(Ix+d),E
4255 instr fetch_nop, op_RES5, store2_H ;AC ;RES 5,(Ix+d),H
4256 instr fetch_nop, op_RES5, store2_L ;AD ;RES 5,(Ix+d),L
4257 instr fetch_nop, op_RES5, store_nop ;AE ;RES 5,(Ix+d)
4258 instr fetch_nop, op_RES5, store2_A ;AF ;RES 5,(Ix+d),A
4259 instr fetch_nop, op_RES6, store2_B ;B0 ;RES 6,(Ix+d),B
4260 instr fetch_nop, op_RES6, store2_C ;B1 ;RES 6,(Ix+d),C
4261 instr fetch_nop, op_RES6, store2_D ;B2 ;RES 6,(Ix+d),D
4262 instr fetch_nop, op_RES6, store2_E ;B3 ;RES 6,(Ix+d),E
4263 instr fetch_nop, op_RES6, store2_H ;B4 ;RES 6,(Ix+d),H
4264 instr fetch_nop, op_RES6, store2_L ;B5 ;RES 6,(Ix+d),L
4265 instr fetch_nop, op_RES6, store_nop ;B6 ;RES 6,(Ix+d)
4266 instr fetch_nop, op_RES6, store2_A ;B7 ;RES 6,(Ix+d),A
4267 instr fetch_nop, op_RES7, store2_B ;B8 ;RES 7,(Ix+d),B
4268 instr fetch_nop, op_RES7, store2_C ;B9 ;RES 7,(Ix+d),C
4269 instr fetch_nop, op_RES7, store2_D ;BA ;RES 7,(Ix+d),D
4270 instr fetch_nop, op_RES7, store2_E ;BB ;RES 7,(Ix+d),E
4271 instr fetch_nop, op_RES7, store2_H ;BC ;RES 7,(Ix+d),H
4272 instr fetch_nop, op_RES7, store2_L ;BD ;RES 7,(Ix+d),L
4273 instr fetch_nop, op_RES7, store_nop ;BE ;RES 7,(Ix+d)
4274 instr fetch_nop, op_RES7, store2_A ;BF ;RES 7,(Ix+d),A
4275 instr fetch_nop, op_SET0, store2_B ;C0 ;SET 0,(Ix+d),B
4276 instr fetch_nop, op_SET0, store2_C ;C1 ;SET 0,(Ix+d),C
4277 instr fetch_nop, op_SET0, store2_D ;C2 ;SET 0,(Ix+d),D
4278 instr fetch_nop, op_SET0, store2_E ;C3 ;SET 0,(Ix+d),E
4279 instr fetch_nop, op_SET0, store2_H ;C4 ;SET 0,(Ix+d),H
4280 instr fetch_nop, op_SET0, store2_L ;C5 ;SET 0,(Ix+d),L
4281 instr fetch_nop, op_SET0, store_nop ;C6 ;SET 0,(Ix+d)
4282 instr fetch_nop, op_SET0, store2_A ;C7 ;SET 0,(Ix+d),A
4283 instr fetch_nop, op_SET1, store2_B ;C8 ;SET 1,(Ix+d),B
4284 instr fetch_nop, op_SET1, store2_C ;C9 ;SET 1,(Ix+d),C
4285 instr fetch_nop, op_SET1, store2_D ;CA ;SET 1,(Ix+d),D
4286 instr fetch_nop, op_SET1, store2_E ;CB ;SET 1,(Ix+d),E
4287 instr fetch_nop, op_SET1, store2_H ;CC ;SET 1,(Ix+d),H
4288 instr fetch_nop, op_SET1, store2_L ;CD ;SET 1,(Ix+d),L
4289 instr fetch_nop, op_SET1, store_nop ;CE ;SET 1,(Ix+d)
4290 instr fetch_nop, op_SET1, store2_A ;CF ;SET 1,(Ix+d),A
4291 instr fetch_nop, op_SET2, store2_B ;D0 ;SET 2,(Ix+d),B
4292 instr fetch_nop, op_SET2, store2_C ;D1 ;SET 2,(Ix+d),C
4293 instr fetch_nop, op_SET2, store2_D ;D2 ;SET 2,(Ix+d),D
4294 instr fetch_nop, op_SET2, store2_E ;D3 ;SET 2,(Ix+d),E
4295 instr fetch_nop, op_SET2, store2_H ;D4 ;SET 2,(Ix+d),H
4296 instr fetch_nop, op_SET2, store2_L ;D5 ;SET 2,(Ix+d),L
4297 instr fetch_nop, op_SET2, store_nop ;D6 ;SET 2,(Ix+d)
4298 instr fetch_nop, op_SET2, store2_A ;D7 ;SET 2,(Ix+d),A
4299 instr fetch_nop, op_SET3, store2_B ;D8 ;SET 3,(Ix+d),B
4300 instr fetch_nop, op_SET3, store2_C ;D9 ;SET 3,(Ix+d),C
4301 instr fetch_nop, op_SET3, store2_D ;DA ;SET 3,(Ix+d),D
4302 instr fetch_nop, op_SET3, store2_E ;DB ;SET 3,(Ix+d),E
4303 instr fetch_nop, op_SET3, store2_H ;DC ;SET 3,(Ix+d),H
4304 instr fetch_nop, op_SET3, store2_L ;DD ;SET 3,(Ix+d),L
4305 instr fetch_nop, op_SET3, store_nop ;DE ;SET 3,(Ix+d)
4306 instr fetch_nop, op_SET3, store2_A ;DF ;SET 3,(Ix+d),A
4307 instr fetch_nop, op_SET4, store2_B ;E0 ;SET 4,(Ix+d),B
4308 instr fetch_nop, op_SET4, store2_C ;E1 ;SET 4,(Ix+d),C
4309 instr fetch_nop, op_SET4, store2_D ;E2 ;SET 4,(Ix+d),D
4310 instr fetch_nop, op_SET4, store2_E ;E3 ;SET 4,(Ix+d),E
4311 instr fetch_nop, op_SET4, store2_H ;E4 ;SET 4,(Ix+d),H
4312 instr fetch_nop, op_SET4, store2_L ;E5 ;SET 4,(Ix+d),L
4313 instr fetch_nop, op_SET4, store_nop ;E6 ;SET 4,(Ix+d)
4314 instr fetch_nop, op_SET4, store2_A ;E7 ;SET 4,(Ix+d),A
4315 instr fetch_nop, op_SET5, store2_B ;E8 ;SET 5,(Ix+d),B
4316 instr fetch_nop, op_SET5, store2_C ;E9 ;SET 5,(Ix+d),C
4317 instr fetch_nop, op_SET5, store2_D ;EA ;SET 5,(Ix+d),D
4318 instr fetch_nop, op_SET5, store2_E ;EB ;SET 5,(Ix+d),E
4319 instr fetch_nop, op_SET5, store2_H ;EC ;SET 5,(Ix+d),H
4320 instr fetch_nop, op_SET5, store2_L ;ED ;SET 5,(Ix+d),L
4321 instr fetch_nop, op_SET5, store_nop ;EE ;SET 5,(Ix+d)
4322 instr fetch_nop, op_SET5, store2_A ;EF ;SET 5,(Ix+d),A
4323 instr fetch_nop, op_SET6, store2_B ;F0 ;SET 6,(Ix+d),B
4324 instr fetch_nop, op_SET6, store2_C ;F1 ;SET 6,(Ix+d),C
4325 instr fetch_nop, op_SET6, store2_D ;F2 ;SET 6,(Ix+d),D
4326 instr fetch_nop, op_SET6, store2_E ;F3 ;SET 6,(Ix+d),E
4327 instr fetch_nop, op_SET6, store2_H ;F4 ;SET 6,(Ix+d),H
4328 instr fetch_nop, op_SET6, store2_L ;F5 ;SET 6,(Ix+d),L
4329 instr fetch_nop, op_SET6, store_nop ;F6 ;SET 6,(Ix+d)
4330 instr fetch_nop, op_SET6, store2_A ;F7 ;SET 6,(Ix+d),A
4331 instr fetch_nop, op_SET7, store2_B ;F8 ;SET 7,(Ix+d),B
4332 instr fetch_nop, op_SET7, store2_C ;F9 ;SET 7,(Ix+d),C
4333 instr fetch_nop, op_SET7, store2_D ;FA ;SET 7,(Ix+d),D
4334 instr fetch_nop, op_SET7, store2_E ;FB ;SET 7,(Ix+d),E
4335 instr fetch_nop, op_SET7, store2_H ;FC ;SET 7,(Ix+d),H
4336 instr fetch_nop, op_SET7, store2_L ;FD ;SET 7,(Ix+d),L
4337 instr fetch_nop, op_SET7, store_nop ;FE ;SET 7,(Ix+d)
4338 instr fetch_nop, op_SET7, store2_A ;FF ;SET 7,(Ix+d),A
4339
4340
4341 #endif
4342
4343 ;----------------------------------------------------------------
4344 ; Lookup table, stolen from z80ex, Z80 emulation library.
4345 ; http://z80ex.sourceforge.net/
4346
4347 ; The S, Z, 5 and 3 bits and the parity of the lookup value
4348
4349 ; .org (PC+255) & 0xff00
4350 ; .org opcjmp + 256
4351 .org sz53p_table_pos
4352 ; .org FLASHEND & 0xff00
4353 ; .org 0x1fff & 0xff00
4354
4355 sz53p_tab:
4356 .db 0x44,0x00,0x00,0x04,0x00,0x04,0x04,0x00
4357 .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c
4358 .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04
4359 .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08
4360 .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24
4361 .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28
4362 .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20
4363 .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c
4364 .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04
4365 .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08
4366 .db 0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00
4367 .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c
4368 .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20
4369 .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c
4370 .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24
4371 .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28
4372 .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
4373 .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88
4374 .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80
4375 .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c
4376 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0
4377 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac
4378 .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4
4379 .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8
4380 .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80
4381 .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c
4382 .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
4383 .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88
4384 .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4
4385 .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8
4386 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0
4387 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac
4388
4389 ; vim:set ts=8 noet nowrap
4390