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