]> cloudbase.mooo.com Git - avrcpm.git/blame - avrcpm/avr/8080int-jmp.asm
* More changes for FAT16 support.
[avrcpm.git] / avrcpm / avr / 8080int-jmp.asm
CommitLineData
9c15f366
L
1; 8080 Interpreter.
2; This is part of the Z80-CP/M emulator written by Sprite_tm.
3;
4
5; Copyright (C) 2010 Sprite_tm
6; Copyright (C) 2010 Leo C.
7; Copyright (C) 2010 Horst S.
8
9; This file is part of avrcpm.
10;
11; avrcpm is free software: you can redistribute it and/or modify it
12; under the terms of the GNU General Public License as published by
13; the Free Software Foundation, either version 3 of the License, or
14; (at your option) any later version.
15;
16; avrcpm is distributed in the hope that it will be useful,
17; but WITHOUT ANY WARRANTY; without even the implied warranty of
18; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19; GNU General Public License for more details.
20;
21; You should have received a copy of the GNU General Public License
22; along with avrcpm. If not, see <http://www.gnu.org/licenses/>.
23;
24; $Id$
25;
26
27 .dseg
28
29z_b: .byte 1
30z_c: .byte 1
31z_d: .byte 1
32z_e: .byte 1
33z_h: .byte 1
34z_l: .byte 1
35
36
37 .cseg
38
39;Init z80
40z80_init:
41 ldi z_pcl,low (IPLADDR)
42 ldi z_pch,high(IPLADDR)
43
44 cbi flags,trace
45 printnewline
46 printstring "Ok, CPU is live!"
47 printnewline
48
49main:
50.if INS_DEBUG
51 cbi flags,trace
52 cpi z_pch,DBG_TRACE_BOTTOM
53 brlo notraceon
54 cpi z_pch,DBG_TRACE_TOP
55 brsh notraceon
56 sbi flags,trace
57notraceon:
58.endif
59
60
61.if PRINT_PC
62 cpi z_pch,DBG_TRACE_BOTTOM
63 brlo noprintpc
64 cpi z_pch,DBG_TRACE_TOP
65 brsh noprintpc
66
67 printnewline
68 printstring "PC="
69 movw temp,z_pcl
70 rcall printhexw
71 printstring " "
72noprintpc:
73.endif
74
75.if INS_DEBUG
76 sbic flags,trace
77 rcall printregs
78.endif
79 ;hier kommt die Interruptbehandlung rein
80
81
82 mem_read_ds zl,z_pc ;zl = memReadByte(z_pc)
83 adiw z_pcl,1 ;++z_pc
84 ldi zh,high(opcjmp) ;
85 icall
86 rjmp main ;
87
88
89
90; .listmac
91
92;--------------------------------------------------
93; Generate a table entry for one instruction
94;
95; instr fetch, op, store
96;
97.macro instr
98 .ifndef opcjmp_table_pos_
99 .set todo_table_pos_ = PC
100 ; Place the opcode jump table on the next available location.
101 .equ opcjmp = (PC+255) & 0xff00
102 .set opcjmp_table_pos_ = opcjmp
103 .endif
104
105 .if todo_table_pos_ < opcjmp + 256 + 128
106 .if todo_table_pos_ + 3 >= opcjmp
107 .set todo_table_pos_ = opcjmp + 256 + 128
108 .endif
109 .endif
110 .set do_@0_@1_@2 = todo_table_pos_ ; make a label
111
112 .org opcjmp_table_pos_
113 rjmp do_@0_@1_@2 ; generate a jump to the label
114 .set opcjmp_table_pos_ = PC
115
116 .org do_@0_@1_@2
117
118 .set fetch_ = (@0 != do_fetch_nop) ; must call or jump to fetch phase
119 .set op_ = (do_@1 != do_op_nop) ; must call or jump to op phase
120 .set store_ = (@2 != do_store_nop) ; must jump to store phase
121
122 .if fetch_ || op_ || store_ ; something to do
123 .if fetch_ ; must fetch
124 .if op_ || store_
125 rcall @0 ; fetch and come back here
126 .else ;
127 rjmp @0 ; fetch and return to main
128 .endif
129 .endif
130 .if op_ ; must exec op
131 .if store_
132 rcall do_@1 ; do op and come back here
133 .else
134 rjmp do_@1 ; do op and return to main
135 .endif
136 .endif
137 .if store_ ; must store
138 rjmp @2 ; store is allways last
139 .endif
140 .else
141 ret ; nop, go back to main
142 .endif
143
144 .set todo_table_pos_ = PC
145.endm
146
147
148; ------------ Fetch phase stuff -----------------
149
150;.org (PC+255) & 0xff00
151fetch_ops:
152do_fetch_nop:
153 ret
154
155do_fetch_a:
156 mov opl,z_a
157 ret
158
159do_fetch_b:
160 lds opl,z_b
161 ret
162
163do_fetch_c:
164 lds opl,z_c
165 ret
166
167do_fetch_d:
168 lds opl,z_d
169 ret
170
171do_fetch_e:
172 lds opl,z_e
173 ret
174
175do_fetch_h:
176 lds opl,z_h
177 ret
178
179do_fetch_l:
180 lds opl,z_l
181 ret
182
183do_fetch_af:
184 mov opl,z_flags
185 mov oph,z_a
186 ret
187
188do_fetch_bc:
189 lds opl,z_c
190 lds oph,z_b
191 ret
192
193do_fetch_de:
194 lds opl,z_e
195 lds oph,z_d
196 ret
197
198do_fetch_hl:
199 lds opl,z_l
200 lds oph,z_h
201 ret
202
203do_fetch_sp:
204 movw opl,z_spl
205 ret
206
207do_fetch_mbc:
208 lds xh,z_b
209 lds xl,z_c
210 mem_read_d opl
211 ret
212
213do_fetch_mde:
214 lds xh,z_d
215 lds xl,z_e
216 mem_read_d opl
217 ret
218
219do_fetch_mhl:
220 lds xh,z_h
221 lds xl,z_l
222 mem_read_d opl
223 ret
224
225do_fetch_msp:
226 movw x,z_spl
227 mem_read_d opl
228 adiw x,1
229 mem_read_d oph
230 ret
231
232do_fetch_dir8:
233 mem_read_ds opl, z_pc
234 adiw z_pcl,1
235 ret
236
237do_fetch_dir16:
238 mem_read_ds opl, z_pc
239 adiw z_pcl,1
240 mem_read_ds oph, z_pc
241 adiw z_pcl,1
242 ret
243
244do_fetch_rst:
245 movw x,z_pcl
246 sbiw x,1
247 mem_read_d opl
248 andi opl,0x38
249 ldi oph,0
250 ret
251
252; ------------ Store phase stuff -----------------
253
254;.org (PC+255) & 0xff00
255store_ops:
256do_store_nop:
257 ret
258
259do_store_a:
260 mov z_a,opl
261 ret
262
263do_store_b:
264 sts z_b,opl
265 ret
266
267do_store_c:
268 sts z_c,opl
269 ret
270
271do_store_d:
272 sts z_d,opl
273 ret
274
275do_store_e:
276 sts z_e,opl
277 ret
278
279do_store_h:
280 sts z_h,opl
281 ret
282
283do_store_l:
284 sts z_l,opl
285 ret
286
287do_store_af:
288 mov z_a,oph
289 mov z_flags,opl
290 ret
291
292do_store_bc:
293 sts z_b,oph
294 sts z_c,opl
295 ret
296
297do_store_de:
298 sts z_d,oph
299 sts z_e,opl
300 ret
301
302do_store_hl:
303 sts z_h,oph
304 sts z_l,opl
305 ret
306
307do_store_mbc:
308 lds xh,z_b
309 lds xl,z_c
310 mem_write_s opl
311 ret
312
313do_store_mde:
314 lds xh,z_d
315 lds xl,z_e
316 mem_write_s opl
317 ret
318
319do_store_mhl:
320 lds xh,z_h
321 lds xl,z_l
322 mem_write_s opl
323 ret
324
325do_store_msp:
326 movw xl,z_spl
327 mem_write_s opl
328 adiw xl,1
329 mem_write_s oph
330 ret
331
332do_store_sp:
333 movw z_spl,opl
334 ret
335
336do_store_pc:
337 movw z_pcl,opl
338 ret
339
340do_store_ret:
341 movw x,z_spl
342 mem_read_d z_pcl
343 adiw x,1
344 mem_read_d z_pch
345 adiw x,1
346 movw z_spl,x
347
348.if STACK_DBG
349 printnewline
350 printstring "Stack pop "
351 movw temp,z_pcl
352 rcall printhexw
353 printstring ", SP is now "
354 movw temp,z_spl
355 rcall printhexw
356 printstring ". "
357.endif
358 ret
359
360do_store_call:
361 movw xl,z_spl
362 sbiw x,1
363 mem_write_s z_pch
364 sbiw x,1
365 mem_write_s z_pcl
366 movw z_spl,xl
367
368.if STACK_DBG
369 printnewline
370 printstring "Stack push "
371 movw temp,z_pcl
372 rcall printhexw
373 printstring ", SP is now "
374 movw temp,z_spl
375 rcall printhexw
376 printstring ". "
377.endif
378 movw z_pcl,opl
379 ret
380
381
382do_store_am:
383 mem_write_ds op, z_a
384 ret
385
386
387
388
389; ------------ Operation phase stuff -----------------
390
391;----------------------------------------------------------------
392;| |
393;| Zilog |
394;| |
395;| ZZZZZZZ 88888 000 |
396;| Z 8 8 0 0 |
397;| Z 8 8 0 0 0 |
398;| Z 88888 0 0 0 |
399;| Z 8 8 0 0 0 |
400;| Z 8 8 0 0 |
401;| ZZZZZZZ 88888 000 |
402;| |
403;| Z80 MICROPROCESSOR Instruction Set Summary |
404;| |
405;----------------------------------------------------------------
406;----------------------------------------------------------------
407;|Mnemonic |SZHPNC|Description |Notes |
408;|----------+------+---------------------+----------------------|
409;|ADC A,s |***V0*|Add with Carry |A=A+s+CY |
410;|ADC HL,ss |**?V0*|Add with Carry |HL=HL+ss+CY |
411;|ADD A,s |***V0*|Add |A=A+s |
412;|ADD HL,ss |--?-0*|Add |HL=HL+ss |
413;|ADD IX,pp |--?-0*|Add |IX=IX+pp |
414;|ADD IY,rr |--?-0*|Add |IY=IY+rr |
415;|AND s |**1P00|Logical AND |A=A&s |
416;|BIT b,m |?*1?0-|Test Bit |m&{2^b} |
417;|CALL cc,nn|------|Conditional Call |If cc CALL |
418;|CALL nn |------|Unconditional Call |-[SP]=PC,PC=nn |
419;|CCF |--?-0*|Complement Carry Flag|CY=~CY |
420;|CP s |***V1*|Compare |A-s |
421;|CPD |****1-|Compare and Decrement|A-[HL],HL=HL-1,BC=BC-1|
422;|CPDR |****1-|Compare, Dec., Repeat|CPD till A=[HL]or BC=0|
423;|CPI |****1-|Compare and Increment|A-[HL],HL=HL+1,BC=BC-1|
424;|CPIR |****1-|Compare, Inc., Repeat|CPI till A=[HL]or BC=0|
425;|CPL |--1-1-|Complement |A=~A |
426;|DAA |***P-*|Decimal Adjust Acc. |A=BCD format |
427;|DEC s |***V1-|Decrement |s=s-1 |
428;|DEC xx |------|Decrement |xx=xx-1 |
429;|DEC ss |------|Decrement |ss=ss-1 |
430;|DI |------|Disable Interrupts | |
431;|DJNZ e |------|Dec., Jump Non-Zero |B=B-1 till B=0 |
432;|EI |------|Enable Interrupts | |
433;|EX [SP],HL|------|Exchange |[SP]<->HL |
434;|EX [SP],xx|------|Exchange |[SP]<->xx |
435;|EX AF,AF' |------|Exchange |AF<->AF' |
436;|EX DE,HL |------|Exchange |DE<->HL |
437;|EXX |------|Exchange |qq<->qq' (except AF)|
438;|HALT |------|Halt | |
439;|IM n |------|Interrupt Mode | (n=0,1,2)|
440;|IN A,[n] |------|Input |A=[n] |
441;|IN r,[C] |***P0-|Input |r=[C] |
442;|INC r |***V0-|Increment |r=r+1 |
443;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
444;|INC xx |------|Increment |xx=xx+1 |
445;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
446;|INC ss |------|Increment |ss=ss+1 |
447;|IND |?*??1-|Input and Decrement |[HL]=[C],HL=HL-1,B=B-1|
448;|INDR |?1??1-|Input, Dec., Repeat |IND till B=0 |
449;|INI |?*??1-|Input and Increment |[HL]=[C],HL=HL+1,B=B-1|
450;|INIR |?1??1-|Input, Inc., Repeat |INI till B=0 |
451;|JP [HL] |------|Unconditional Jump |PC=[HL] |
452;|JP [xx] |------|Unconditional Jump |PC=[xx] |
453;|JP nn |------|Unconditional Jump |PC=nn |
454;|JP cc,nn |------|Conditional Jump |If cc JP |
455;|JR e |------|Unconditional Jump |PC=PC+e |
456;|JR cc,e |------|Conditional Jump |If cc JR(cc=C,NC,NZ,Z)|
457;|LD dst,src|------|Load |dst=src |
458;|LD A,i |**0*0-|Load |A=i (i=I,R)|
459;|LDD |--0*0-|Load and Decrement |[DE]=[HL],HL=HL-1,# |
460;|LDDR |--000-|Load, Dec., Repeat |LDD till BC=0 |
461;|LDI |--0*0-|Load and Increment |[DE]=[HL],HL=HL+1,# |
462;|LDIR |--000-|Load, Inc., Repeat |LDI till BC=0 |
463;|NEG |***V1*|Negate |A=-A |
464;|NOP |------|No Operation | |
465;|OR s |**0P00|Logical inclusive OR |A=Avs |
466;|OTDR |?1??1-|Output, Dec., Repeat |OUTD till B=0 |
467;|OTIR |?1??1-|Output, Inc., Repeat |OUTI till B=0 |
468;|OUT [C],r |------|Output |[C]=r |
469;|OUT [n],A |------|Output |[n]=A |
470;|OUTD |?*??1-|Output and Decrement |[C]=[HL],HL=HL-1,B=B-1|
471;|OUTI |?*??1-|Output and Increment |[C]=[HL],HL=HL+1,B=B-1|
472;|POP xx |------|Pop |xx=[SP]+ |
473;|POP qq |------|Pop |qq=[SP]+ |
474;|PUSH xx |------|Push |-[SP]=xx |
475;|PUSH qq |------|Push |-[SP]=qq |
476;|RES b,m |------|Reset bit |m=m&{~2^b} |
477;|RET |------|Return |PC=[SP]+ |
478;|RET cc |------|Conditional Return |If cc RET |
479;|RETI |------|Return from Interrupt|PC=[SP]+ |
480;|RETN |------|Return from NMI |PC=[SP]+ |
481;|RL m |**0P0*|Rotate Left |m={CY,m}<- |
482;|RLA |--0-0*|Rotate Left Acc. |A={CY,A}<- |
483;|RLC m |**0P0*|Rotate Left Circular |m=m<- |
484;|RLCA |--0-0*|Rotate Left Circular |A=A<- |
485;|RLD |**0P0-|Rotate Left 4 bits |{A,[HL]}={A,[HL]}<- ##|
486;|RR m |**0P0*|Rotate Right |m=->{CY,m} |
487;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} |
488;|RRC m |**0P0*|Rotate Right Circular|m=->m |
489;|RRCA |--0-0*|Rotate Right Circular|A=->A |
490;|RRD |**0P0-|Rotate Right 4 bits |{A,[HL]}=->{A,[HL]} ##|
491;|RST p |------|Restart | (p=0H,8H,10H,...,38H)|
492;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY |
493;|SBC HL,ss |**?V1*|Subtract with Carry |HL=HL-ss-CY |
494;|SCF |--0-01|Set Carry Flag |CY=1 |
495;|SET b,m |------|Set bit |m=mv{2^b} |
496;|SLA m |**0P0*|Shift Left Arithmetic|m=m*2 |
497;|SRA m |**0P0*|Shift Right Arith. |m=m/2 |
498;|SRL m |**0P0*|Shift Right Logical |m=->{0,m,CY} |
499;|SUB s |***V1*|Subtract |A=A-s |
500;|XOR s |**0P00|Logical Exclusive OR |A=Axs |
501;|----------+------+--------------------------------------------|
502;| F |-*01? |Flag unaffected/affected/reset/set/unknown |
503;| S |S |Sign flag (Bit 7) |
504;| Z | Z |Zero flag (Bit 6) |
505;| HC | H |Half Carry flag (Bit 4) |
506;| P/V | P |Parity/Overflow flag (Bit 2, V=overflow) |
507;| N | N |Add/Subtract flag (Bit 1) |
508;| CY | C|Carry flag (Bit 0) |
509;|-----------------+--------------------------------------------|
510;| n |Immediate addressing |
511;| nn |Immediate extended addressing |
512;| e |Relative addressing (PC=PC+2+offset) |
513;| [nn] |Extended addressing |
514;| [xx+d] |Indexed addressing |
515;| r |Register addressing |
516;| [rr] |Register indirect addressing |
517;| |Implied addressing |
518;| b |Bit addressing |
519;| p |Modified page zero addressing (see RST) |
520;|-----------------+--------------------------------------------|
521;|DEFB n(,...) |Define Byte(s) |
522;|DEFB 'str'(,...) |Define Byte ASCII string(s) |
523;|DEFS nn |Define Storage Block |
524;|DEFW nn(,...) |Define Word(s) |
525;|-----------------+--------------------------------------------|
526;| A B C D E |Registers (8-bit) |
527;| AF BC DE HL |Register pairs (16-bit) |
528;| F |Flag register (8-bit) |
529;| I |Interrupt page address register (8-bit) |
530;| IX IY |Index registers (16-bit) |
531;| PC |Program Counter register (16-bit) |
532;| R |Memory Refresh register |
533;| SP |Stack Pointer register (16-bit) |
534;|-----------------+--------------------------------------------|
535;| b |One bit (0 to 7) |
536;| cc |Condition (C,M,NC,NZ,P,PE,PO,Z) |
537;| d |One-byte expression (-128 to +127) |
538;| dst |Destination s, ss, [BC], [DE], [HL], [nn] |
539;| e |One-byte expression (-126 to +129) |
540;| m |Any register r, [HL] or [xx+d] |
541;| n |One-byte expression (0 to 255) |
542;| nn |Two-byte expression (0 to 65535) |
543;| pp |Register pair BC, DE, IX or SP |
544;| qq |Register pair AF, BC, DE or HL |
545;| qq' |Alternative register pair AF, BC, DE or HL |
546;| r |Register A, B, C, D, E, H or L |
547;| rr |Register pair BC, DE, IY or SP |
548;| s |Any register r, value n, [HL] or [xx+d] |
549;| src |Source s, ss, [BC], [DE], [HL], nn, [nn] |
550;| ss |Register pair BC, DE, HL or SP |
551;| xx |Index register IX or IY |
552;|-----------------+--------------------------------------------|
553;| + - * / ^ |Add/subtract/multiply/divide/exponent |
554;| & ~ v x |Logical AND/NOT/inclusive OR/exclusive OR |
555;| <- -> |Rotate left/right |
556;| [ ] |Indirect addressing |
557;| [ ]+ -[ ] |Indirect addressing auto-increment/decrement|
558;| { } |Combination of operands |
559;| # |Also BC=BC-1,DE=DE-1 |
560;| ## |Only lower 4 bits of accumulator A used |
561;----------------------------------------------------------------
562
563;How the flags are supposed to work:
564;7 ZFL_S - Sign flag (=MSBit of result)
565;6 ZFL_Z - Zero flag. Is 1 when the result is 0
566;4 ZFL_H - Half-carry (carry from bit 3 to 4)
567;2 ZFL_P - Parity/2-complement Overflow
568;1 ZFL_N - Subtract - set if last op was a subtract
569;0 ZFL_C - Carry
570;
571;I sure hope I got the mapping between flags and instructions correct...
572
573.equ ZFL_S = 7
574.equ ZFL_Z = 6
575.equ ZFL_H = 4
576.equ ZFL_P = 2
577.equ ZFL_N = 1
578.equ ZFL_C = 0
579
580
581.equ AVR_T = SREG_T
582.equ AVR_H = SREG_H
583.equ AVR_S = SREG_S
584.equ AVR_V = SREG_V
585.equ AVR_N = SREG_N
586.equ AVR_Z = SREG_Z
587.equ AVR_C = SREG_C
588
589;------------------------------------------------;
590; Load table value from flash indexed by source reg.
591;
592; ldpmx dstreg,tablebase,indexreg
593;
594; (6 words, 8 cycles)
595
596.macro ldpmx
597 ldi zh,high(@1*2) ; table must be page aligned
598 mov zl,@2
599 lpm @0,z
600.endm
601
602.macro do_z80_flags_HP
603#if EM_Z80
604 bmov z_flags, ZFL_P, temp, AVR_V
605 bmov z_flags, ZFL_H, temp, AVR_H
606#endif
607.endm
608
609.macro do_z80_flags_set_N
610#if EM_Z80
611 ori z_flags, (1<<ZFL_N) ; Negation auf 1
612#endif
613.endm
614
615.macro do_z80_flags_set_HN
616#if EM_Z80
617 ori z_flags,(1<<ZFL_N)|(1<<ZFL_H)
618#endif
619.endm
620
621.macro do_z80_flags_clear_N
622#if EM_Z80
623 andi z_flags,~(1<<ZFL_N)
624#endif
625.endm
626
627.macro do_z80_flags_op_rotate
628 ; must not change avr carry flag!
629#if EM_Z80
630 andi z_flags, ~( (1<<ZFL_H) | (1<<ZFL_N) | (1<<ZFL_C) )
631#else
632 andi z_flags, ~( (1<<ZFL_C) )
633#endif
634.endm
635
636.macro do_z80_flags_op_and
637#if EM_Z80
638 ori z_flags,(1<<ZFL_H)
639#else
640 ori z_flags,(1<<ZFL_H)
641#endif
642.endm
643
644.macro do_z80_flags_op_or
645#if EM_Z80
646#endif
647.endm
648
649
650;----------------------------------------------------------------
651
652do_op_inv:
653 sbiw z_pcl,1
678fc0b0 654 call printregs
9c15f366
L
655 printstring "Invalid opcode! "
656
657haltinv:
658 rjmp haltinv
659
660do_op_nop:
661 ret
662
663;----------------------------------------------------------------
664;|Mnemonic |SZHPNC|Description |Notes |
665;----------------------------------------------------------------
666;|OUT [n],A |------|Output |[n]=A |
667;
668;
669;Interface with peripherials goes here :)
670do_op_outa: ; out (opl),a
671.if PORT_DEBUG
672 printnewline
673 printstring "Port write: "
674 mov temp,z_a
675 rcall printhex
676 printstring " -> ("
677 mov temp,opl
678 rcall printhex
679 printstring ") "
680.endif
681 mov temp,z_a
682 mov temp2,opl
683 rcall portWrite
684 ret
685
686;----------------------------------------------------------------
687;|Mnemonic |SZHPNC|Description |Notes |
688;----------------------------------------------------------------
689;|IN A,[n] |------|Input |A=[n] |
690;
691;
692do_op_in: ; in a,(opl)
693.if PORT_DEBUG
694 printnewline
695 printstring "Port read: ("
696 mov temp,opl
697 rcall printhex
698 printstring ") -> "
699.endif
700
701 mov temp2,opl
702 rcall portRead
703 mov opl,temp
704
705.if PORT_DEBUG
706 rcall printhex
707 printstring " "
708.endif
709 ret
710
711;----------------------------------------------------------------
712;|Mnemonic |SZHPNC|Description |Notes |
713;----------------------------------------------------------------
714;|INC r |***V0-|Increment |r=r+1 |
715;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
716;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
717;|----------|SZHP C|---------- 8080 ----------------------------|
718;|INC r |**-P0-|Increment |r=r+1 |
719;|INC [HL] |**-P0-|Increment |[HL]=[HL]+1 |
720;
721;
722do_op_inc:
723 inc opl
724#if EM_Z80
725 in temp, sreg
726#endif
727 andi z_flags,(1<<ZFL_H)|(1<<ZFL_C) ; preserve C-, and H-flag
728 ldpmx temp2, sz53p_tab, opl
729 or z_flags,temp2 ;
730 do_z80_flags_HP
731 ret
732
733do_op_inca:
734 inc z_a
735#if EM_Z80
736 in temp, sreg
737#endif
738 andi z_flags,(1<<ZFL_H)|(1<<ZFL_C) ; preserve C-, and H-flag
739 ldpmx temp2, sz53p_tab, z_a
740 or z_flags,temp2 ;
741 do_z80_flags_HP
742 ret
743
744;----------------------------------------------------------------
745;|Mnemonic |SZHPNC|Description |Notes |
746;----------------------------------------------------------------
747;|DEC r |***V1-|Decrement |s=s-1 |
748;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
749;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
750;|----------|SZHP C|---------- 8080 ----------------------------|
751;|DEC r |**-P -|Increment |r=r+1 |
752;|DEC [HL] |**-P -|Increment |[HL]=[HL]+1 |
753;
754;
755do_op_dec:
756 dec opl
757#if EM_Z80
758 in temp, sreg
759#endif
760 andi z_flags,(1<<ZFL_H)|(1<<ZFL_C) ; preserve C-, and H-flag
761 ldpmx temp2, sz53p_tab, opl
762 or z_flags,temp2 ;
763 do_z80_flags_HP
764 do_z80_flags_set_N
765 ret
766
767do_op_deca:
768 dec z_a
769#if EM_Z80
770 in temp, sreg
771#endif
772 andi z_flags,(1<<ZFL_H)|(1<<ZFL_C) ; preserve C-, and H-flag
773 ldpmx temp2, sz53p_tab, z_a
774 or z_flags,temp2 ;
775 do_z80_flags_HP
776 do_z80_flags_set_N
777 ret
778
779;----------------------------------------------------------------
780;|Mnemonic |SZHPNC|Description |Notes |
781;----------------------------------------------------------------
782;|INC xx |------|Increment |xx=xx+1 |
783;|INC ss |------|Increment |ss=ss+1 |
784;
785;
786do_op_inc16:
787 subi opl,low(-1)
788 sbci oph,high(-1)
789 ret
790
791;----------------------------------------------------------------
792;|Mnemonic |SZHPNC|Description |Notes |
793;----------------------------------------------------------------
794;|DEC xx |------|Decrement |xx=xx-1 |
795;|DEC ss |------|Decrement |ss=ss-1 |
796;
797;
798do_op_dec16:
799 subi opl, 1
800 sbci oph, 0
801 ret
802
803;----------------------------------------------------------------
804;|Mnemonic |SZHPNC|Description |Notes |
805;----------------------------------------------------------------
806;|RLCA |--0-0*|Rotate Left Circular |A=A<- |
807;|----------|SZHP C|---------- 8080 ----------------------------|
808;|RLCA |---- *|Rotate Left Circular |A=A<- |
809;
810;
811do_op_rlc:
812 ;Rotate Left Cyclical. All bits move 1 to the
813 ;left, the msb becomes c and lsb.
814 do_z80_flags_op_rotate
815 lsl opl
816 brcc do_op_rlc_noc
817 ori opl, 1
818 ori z_flags, (1<<ZFL_C)
819do_op_rlc_noc:
820 ret
821
822;----------------------------------------------------------------
823;|Mnemonic |SZHPNC|Description |Notes |
824;----------------------------------------------------------------
825;|RRCA |--0-0*|Rotate Right Circular|A=->A |
826;|----------|SZHP C|---------- 8080 ----------------------------|
827;|RRCA |---- *|Rotate Right Circular|A=->A |
828;
829;
830do_op_rrc:
831 ;Rotate Right Cyclical. All bits move 1 to the
832 ;right, the lsb becomes c and msb.
833 do_z80_flags_op_rotate
834 lsr opl
835 brcc do_op_rrc_noc
836 ori opl, 0x80
837 ori z_flags, (1<<ZFL_C)
838do_op_rrc_noc:
839 ret
840
841;----------------------------------------------------------------
842;|Mnemonic |SZHPNC|Description |Notes |
843;----------------------------------------------------------------
844;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} |
845;|----------|SZHP C|---------- 8080 ----------------------------|
846;|RRA |---- *|Rotate Right Acc. |A=->{CY,A} |
847;
848;
849do_op_rr:
850 ;Rotate Right. All bits move 1 to the right, the lsb
851 ;becomes c, c becomes msb.
852 clc ; get z80 carry to avr carry
853 sbrc z_flags,ZFL_C
854 sec
855 do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C)
856 bmov z_flags,ZFL_C, opl,0 ; Bit 0 --> CY
857 ror opl
858 ret
859
860;----------------------------------------------------------------
861;|Mnemonic |SZHPNC|Description |Notes |
862;----------------------------------------------------------------
863;|RLA |--0-0*|Rotate Left Acc. |A={CY,A}<- |
864;|----------|SZHP C|---------- 8080 ----------------------------|
865;|RLA |---- *|Rotate Left Acc. |A={CY,A}<- |
866;
867;
868do_op_rl:
869 ;Rotate Left. All bits move 1 to the left, the msb
870 ;becomes c, c becomes lsb.
871 clc
872 sbrc z_flags,ZFL_C
873 sec
874 do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C)
875 bmov z_flags,ZFL_C, opl,7 ; Bit 7 --> CY
876 rol opl
877 ret
878
879;----------------------------------------------------------------
880;|Mnemonic |SZHPNC|Description |Notes |
881;----------------------------------------------------------------
882;|ADD A,s |***V0*|Add |A=A+s |
883;|----------|SZHP C|---------- 8080 ----------------------------|
884;|ADD A,s |***P *|Add |A=A+s |
885;
886;
887do_op_adda:
888 add z_a,opl
889 in temp,sreg
890 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P flag
891 bmov z_flags,ZFL_C, temp,AVR_C
892 do_z80_flags_HP
893 ret
894
895;----------------------------------------------------------------
896;|Mnemonic |SZHPNC|Description |Notes |
897;----------------------------------------------------------------
898;|ADC A,s |***V0*|Add with Carry |A=A+s+CY |
899;|----------|SZHP C|---------- 8080 ----------------------------|
900;|ADC A,s |***P *|Add with Carry |A=A+s+CY |
901;
902;
903do_op_adca:
904 clc
905 sbrc z_flags,ZFL_C
906 sec
907 adc z_a,opl
908 in temp,sreg
909 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
910 bmov z_flags,ZFL_C, temp,AVR_C
911 do_z80_flags_HP
912 ret
913
914;----------------------------------------------------------------
915;|Mnemonic |SZHPNC|Description |Notes |
916;----------------------------------------------------------------
917;|SUB s |***V1*|Subtract |A=A-s |
918;|----------|SZHP C|---------- 8080 ----------------------------|
919;|SUB s |***P *|Subtract |A=A-s |
920
921;
922do_op_subfa:
923 sub z_a,opl
924 in temp,sreg
925 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
926 bmov z_flags,ZFL_C, temp,AVR_C
927 do_z80_flags_HP
928 do_z80_flags_set_N
929 ret
930
931;----------------------------------------------------------------
932;|Mnemonic |SZHPNC|Description |Notes |
933;----------------------------------------------------------------
934;|CP s |***V1*|Compare |A-s |
935;|----------|SZHP C|---------- 8080 ----------------------------|
936;|CP s |***P *|Compare |A-s |
937
938;
939do_op_cpfa:
940 mov temp,z_a
941 sub temp,opl
942 mov opl,temp
943 in temp,sreg
944 ldpmx z_flags,sz53p_tab,opl ;S,Z,P
945 bmov z_flags,ZFL_C, temp,AVR_C
946 do_z80_flags_HP
947 do_z80_flags_set_N
948 ret
949
950;----------------------------------------------------------------
951;|Mnemonic |SZHPNC|Description |Notes |
952;----------------------------------------------------------------
953;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY |
954;|----------|SZHP C|---------- 8080 ----------------------------|
955;|SBC A,s |***P *|Subtract with Carry |A=A-s-CY |
956;
957;
958do_op_sbcfa:
959 clc
960 sbrc z_flags,ZFL_C
961 sec
962 sbc z_a,opl
963 in temp,sreg
964 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
965 bmov z_flags,ZFL_C, temp,AVR_C
966 do_z80_flags_HP
967 do_z80_flags_set_N
968 ret
969
970;----------------------------------------------------------------
971;|Mnemonic |SZHPNC|Description |Notes |
972;----------------------------------------------------------------
973;|AND s |**1P00|Logical AND |A=A&s |
974;|----------|SZHP C|---------- 8080 ----------------------------|
975;|AND s |**-P 0|Logical AND |A=A&s |
976;
977; TODO H-Flag
978do_op_anda:
979 and z_a,opl ;
980 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P,N,C
981 do_z80_flags_op_and
982 ret
983
984
985;----------------------------------------------------------------
986;|Mnemonic |SZHPNC|Description |Notes |
987;----------------------------------------------------------------
988;|OR s |**0P00|Logical inclusive OR |A=Avs |
989;|----------|SZHP C|---------- 8080 ----------------------------|
990;|OR s |**-P00|Logical inclusive OR |A=Avs |
991;
992; TODO: H-Flag
993do_op_ora:
994 or z_a,opl
995 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C
996 do_z80_flags_op_or
997 ret
998
999;----------------------------------------------------------------
1000;|Mnemonic |SZHPNC|Description |Notes |
1001;----------------------------------------------------------------
1002;|XOR s |**0P00|Logical Exclusive OR |A=Axs |
1003;|----------|SZHP C|---------- 8080 ----------------------------|
1004;|XOR s |**-P 0|Logical Exclusive OR |A=Axs |
1005;
1006; TODO: H-Flag
1007do_op_xora:
1008 eor z_a,opl
1009 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C
1010 do_z80_flags_op_or
1011 ret
1012
1013;----------------------------------------------------------------
1014;|Mnemonic |SZHPNC|Description |Notes |
1015;----------------------------------------------------------------
1016;|ADD HL,ss |--?-0*|Add |HL=HL+ss |
1017;|----------|SZHP C|---------- 8080 ----------------------------|
1018;|ADD HL,ss |---- *|Add |HL=HL+ss |
1019;
1020;
1021do_op_addhl:
1022 lds temp,z_l
1023 lds temp2,z_h
1024 add opl,temp
1025 adc oph,temp2
1026 in temp,sreg
1027 bmov z_flags,ZFL_H, temp,AVR_H
1028 bmov z_flags,ZFL_C, temp,AVR_C
1029 do_z80_flags_clear_N
1030 ret
1031
1032;----------------------------------------------------------------
1033;|Mnemonic |SZHPNC|Description |Notes |
1034;----------------------------------------------------------------
1035;|LD dst,src|------|Load |dst=src |
1036;
1037;
1038do_op_sthl: ;store hl to mem loc in opl:h
1039 movw xl,opl
1040 lds temp,z_l
1041 mem_write
1042 adiw xl,1
1043 lds temp,z_h
1044 mem_write
1045 ret
1046
1047;----------------------------------------------------------------
1048;|Mnemonic |SZHPNC|Description |Notes |
1049;----------------------------------------------------------------
1050;|LD dst,src|------|Load |dst=src |
1051;
1052;
1053do_op_rmem16:
1054 movw xl,opl
1055 mem_read_d opl
1056 adiw x,1
1057 mem_read_d oph
1058 ret
1059
1060;----------------------------------------------------------------
1061;|Mnemonic |SZHPNC|Description |Notes |
1062;----------------------------------------------------------------
1063;|LD dst,src|------|Load |dst=src |
1064;
1065;
1066do_op_rmem8:
1067 mem_read_ds opl, op
1068 ret
1069
1070;----------------------------------------------------------------
1071;|Mnemonic |SZHPNC|Description |Notes |
1072;----------------------------------------------------------------
1073;|DAA |***P-*|Decimal Adjust Acc. | |
1074;|----------|SZHP C|---------- 8080 ----------------------------|
1075;
1076; Not yet checked
1077
1078; Description (http://www.z80.info/z80syntx.htm#DAA):
1079; This instruction conditionally adjusts the accumulator for BCD addition
1080; and subtraction operations. For addition (ADD, ADC, INC) or subtraction
1081; (SUB, SBC, DEC, NEC), the following table indicates the operation performed:
1082;
1083; -------------------------------------------------------------------------------
1084; | | C Flag | HEX value in | H Flag | HEX value in | Number | C flag|
1085; | Operation| Before | upper digit | Before | lower digit | added | After |
1086; | | DAA | (bit 7-4) | DAA | (bit 3-0) | to byte | DAA |
1087; |-----------------------------------------------------------------------------|
1088; | | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
1089; | ADD | 0 | 0-8 | 0 | A-F | 06 | 0 |
1090; | | 0 | 0-9 | 1 | 0-3 | 06 | 0 |
1091; | ADC | 0 | A-F | 0 | 0-9 | 60 | 1 |
1092; | | 0 | 9-F | 0 | A-F | 66 | 1 |
1093; | INC | 0 | A-F | 1 | 0-3 | 66 | 1 |
1094; | | 1 | 0-2 | 0 | 0-9 | 60 | 1 |
1095; | | 1 | 0-2 | 0 | A-F | 66 | 1 |
1096; | | 1 | 0-3 | 1 | 0-3 | 66 | 1 |
1097; |-----------------------------------------------------------------------------|
1098; | SUB | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
1099; | SBC | 0 | 0-8 | 1 | 6-F | FA | 0 |
1100; | DEC | 1 | 7-F | 0 | 0-9 | A0 | 1 |
1101; | NEG | 1 | 6-F | 1 | 6-F | 9A | 1 |
1102; |-----------------------------------------------------------------------------|
1103;
1104; Flags:
1105; C: See instruction.
1106; N: Unaffected.
1107; P/V: Set if Acc. is even parity after operation, reset otherwise.
1108; H: See instruction.
1109; Z: Set if Acc. is Zero after operation, reset otherwise.
1110; S: Set if most significant bit of Acc. is 1 after operation, reset otherwise.
1111
1112
1113
1114#if 1
1115do_op_da:
1116 ldi oph,0 ; what to add
1117 sbrc z_flags,ZFL_H ; if H-Flag
1118 rjmp op_da_06
1119 mov temp,opl
1120 andi temp,0x0f ; ... or lower digit > 9
1121 cpi temp,0x0a
1122 brlo op_da_06n
1123op_da_06:
1124 ori oph,0x06
1125op_da_06n:
1126 sbrc z_flags,(1<<ZFL_C)
1127 rjmp op_da_60
1128 cpi opl,0xa0
1129 brlo op_da_60n
1130op_da_60:
1131 ori oph,0x60
1132op_da_60n:
1133 cpi opl,0x9a
1134 brlo op_da_99n
1135 ori z_flags,(1<<ZFL_C); set C
1136op_da_99n:
1137 sbrs z_flags,ZFL_N ; if sub-op
1138 rjmp op_da_add ; then
1139 sub opl,oph
1140 rjmp op_da_ex
1141op_da_add: ; else add-op
1142 cpi opl,0x91
1143 brlo op_da_60n2
1144 mov temp,opl
1145 andi temp,0x0f
1146 cpi temp,0x0a
1147 brlo op_da_60n2
1148 ori oph,0x60
1149op_da_60n2:
1150 add opl,oph
1151op_da_ex:
1152 in temp,SREG
1153 sbrc temp,AVR_H
1154 ori z_flags,(1<<ZFL_C)
1155 andi z_flags,(1<<ZFL_N)|(1<<ZFL_C) ; preserve C,N
1156 ldpmx temp2, sz53p_tab, opl ; get S,Z,P
1157 or z_flags,temp2
1158 bmov z_flags,ZFL_H, temp,AVR_H ; H (?)
1159 ret
1160#else
1161
1162do_op_da:
1163 sbrc z_flags,ZFL_N ; if add-op
1164 rjmp do_op_da_sub ; then
1165 ldi temp2,0 ;
1166 mov temp,opl ;
1167 andi temp,0x0f ;
1168 cpi temp,0x0a ; if lower digit > 9
1169 brlo do_op_da_h ;
1170 ori temp2,0x06 ; add 6 to lower digit
1171do_op_da_h: ;
1172 sbrc z_flags,ZFL_H ; ... or H-Flag
1173 ori temp2,0x06 ;
1174 add opl,temp2 ;
1175
1176 ldi temp2,0 ;
1177 mov temp,opl ;
1178 andi temp,0xf0 ;
1179 cpi temp,0xa0 ;
1180 brlo do_op_da_c ;
1181 ori temp2,0x60 ;
1182do_op_da_c: ; else sub-op
1183 sbrc z_flags,ZFL_C ;
1184 ori temp2,0x60 ;
1185 andi z_flags, ~( (1<<ZFL_S) | (1<<ZFL_Z) | (1<<ZFL_H) )
1186 add opl,temp2 ;
1187 in temp,SREG ;
1188 bst temp,AVR_Z ;Z-Flag
1189 bld z_flags,ZFL_Z ;
1190 bst temp,AVR_N ;S-Flag
1191 bst z_flags,ZFL_S ;
1192 sbrc temp2,5 ;C-Flag, set if 0x06 added
1193 ori z_flags,(1<<ZFL_C) ;
1194 ;H-Flag?
1195 ret
1196
1197do_op_da_sub: ;TODO:
1198 rcall do_op_inv
1199 ret
1200#endif
1201
1202;----------------------------------------------------------------
1203;|Mnemonic |SZHPNC|Description |Notes |
1204;----------------------------------------------------------------
1205;|SCF |--0-01|Set Carry Flag |CY=1 |
1206;|----------|SZHP C|---------- 8080 ----------------------------|
1207;
1208;
1209do_op_scf:
1210 andi z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
1211 ori z_flags,(1<<ZFL_C)
1212 ret
1213
1214;----------------------------------------------------------------
1215;|Mnemonic |SZHPNC|Description |Notes |
1216;----------------------------------------------------------------
1217;|CCF |--?-0*|Complement Carry Flag|CY=~CY |
1218;|----------|SZHP C|---------- 8080 ----------------------------|
1219;|SCF |---- 1|Set Carry Flag |CY=1 |
1220;
1221;TODO: H-Flag
1222do_op_ccf:
1223 do_z80_flags_clear_N
1224 ldi temp,(1<<ZFL_C)
1225 eor z_flags,temp
1226 ret
1227
1228;----------------------------------------------------------------
1229;|Mnemonic |SZHPNC|Description |Notes |
1230;----------------------------------------------------------------
1231;|CPL |--1-1-|Complement |A=~A |
1232;|----------|SZHP C|---------- 8080 ----------------------------|
1233;|CPL |---- -|Complement |A=~A |
1234;
1235;
1236do_op_cpl:
1237 com z_a
1238 do_z80_flags_set_HN
1239 ret
1240
1241
1242;----------------------------------------------------------------
1243;|Mnemonic |SZHPNC|Description |Notes |
1244;----------------------------------------------------------------
1245;|PUSH xx |------|Push |-[SP]=xx |
1246;|PUSH qq |------|Push |-[SP]=qq |
1247;
1248;
1249do_op_push16:
1250 movw xl,z_spl
1251 sbiw x,1
1252 mem_write_s oph
1253 sbiw x,1
1254 mem_write_s opl
1255 movw z_spl,xl
1256
1257.if STACK_DBG
1258 printnewline
1259 printstring "Stack push "
1260 movw temp,opl
1261 rcall printhexw
1262 printstring ", SP is now "
1263 movw temp,z_spl
1264 rcall printhexw
1265 printstring ". "
1266.endif
1267
1268 ret
1269
1270;----------------------------------------------------------------
1271;|Mnemonic |SZHPNC|Description |Notes |
1272;----------------------------------------------------------------
1273;|POP xx |------|Pop |xx=[SP]+ |
1274;|POP qq |------|Pop |qq=[SP]+ |
1275;
1276;
1277do_op_pop16:
1278 movw x,z_spl
1279 mem_read_d opl
1280 adiw x,1
1281 mem_read_d oph
1282 adiw x,1
1283 movw z_spl,x
1284
1285.if STACK_DBG
1286 printnewline
1287 printstring "Stack pop "
1288 movw temp,opl
1289 rcall printhexw
1290 printstring ", SP is now "
1291 movw temp,z_spl
1292 rcall printhexw
1293 printstring ". "
1294.endif
1295 ret
1296
1297;----------------------------------------------------------------
1298;|Mnemonic |SZHPNC|Description |Notes |
1299;----------------------------------------------------------------
1300;|EX [SP],HL|------|Exchange |[SP]<->HL |
1301;|EX DE,HL |------|Exchange |DE<->HL |
1302;-----------------------------Z80--------------------------------
1303;
1304do_op_exhl:
1305 lds temp,z_l
1306 lds temp2,z_h
1307 sts z_l,opl
1308 sts z_h,oph
1309 movw opl,temp
1310 ret
1311
1312;----------------------------------------------------------------
1313;|Mnemonic |SZHPNC|Description |Notes |
1314;----------------------------------------------------------------
1315;
1316; TODO: Implement IFF1, IFF2
1317do_op_di:
1318 ret
1319
1320;----------------------------------------------------------------
1321;|Mnemonic |SZHPNC|Description |Notes |
1322;----------------------------------------------------------------
1323;
1324; TODO: Implement IFF1, IFF2
1325do_op_ei:
1326 ret
1327
1328;----------------------------------------------------------------
1329;|Mnemonic |SZHPNC|Description |Notes |
1330;----------------------------------------------------------------
1331;|CALL cc,nn|------|Conditional Call |If cc CALL |
1332;|JP cc,nn |------|Conditional Jump |If cc JP |
1333;|RET cc |------|Conditional Return |If cc RET |
1334;
1335;
1336do_op_ifnz:
1337 sbrs z_flags, ZFL_Z
1338 ret
1339 pop temp ; nix tun
1340 pop temp ; direkt zuruech zu main
1341 ret
1342
1343;----------------------------------------------------------------
1344;|Mnemonic |SZHPNC|Description |Notes |
1345;----------------------------------------------------------------
1346;|CALL cc,nn|------|Conditional Call |If cc CALL |
1347;|JP cc,nn |------|Conditional Jump |If cc JP |
1348;|RET cc |------|Conditional Return |If cc RET |
1349;
1350;
1351do_op_ifz:
1352 sbrc z_flags, ZFL_Z
1353 ret
1354 pop temp ; nix tun
1355 pop temp ; direkt zuruech zu main
1356 ret
1357
1358;----------------------------------------------------------------
1359;|Mnemonic |SZHPNC|Description |Notes |
1360;----------------------------------------------------------------
1361;|CALL cc,nn|------|Conditional Call |If cc CALL |
1362;|JP cc,nn |------|Conditional Jump |If cc JP |
1363;|RET cc |------|Conditional Return |If cc RET |
1364;
1365;
1366do_op_ifnc:
1367 sbrs z_flags, ZFL_C
1368 ret
1369 pop temp ; nix tun
1370 pop temp ; direkt zuruech zu main
1371 ret
1372
1373;----------------------------------------------------------------
1374;|Mnemonic |SZHPNC|Description |Notes |
1375;----------------------------------------------------------------
1376;|CALL cc,nn|------|Conditional Call |If cc CALL |
1377;|JP cc,nn |------|Conditional Jump |If cc JP |
1378;|RET cc |------|Conditional Return |If cc RET |
1379;
1380;
1381do_op_ifc:
1382 sbrc z_flags, ZFL_C
1383 ret
1384 pop temp ; nix tun
1385 pop temp ; direkt zuruech zu main
1386 ret
1387
1388;----------------------------------------------------------------
1389;|Mnemonic |SZHPNC|Description |Notes |
1390;----------------------------------------------------------------
1391;|CALL cc,nn|------|Conditional Call |If cc CALL |
1392;|JP cc,nn |------|Conditional Jump |If cc JP |
1393;|RET cc |------|Conditional Return |If cc RET |
1394;
1395;
1396do_op_ifpo:
1397 sbrs z_flags, ZFL_P
1398 ret
1399 pop temp ; nix tun
1400 pop temp ; direkt zuruech zu main
1401 ret
1402
1403;----------------------------------------------------------------
1404;|Mnemonic |SZHPNC|Description |Notes |
1405;----------------------------------------------------------------
1406;|CALL cc,nn|------|Conditional Call |If cc CALL |
1407;|JP cc,nn |------|Conditional Jump |If cc JP |
1408;|RET cc |------|Conditional Return |If cc RET |
1409;
1410;
1411do_op_ifpe:
1412 sbrc z_flags, ZFL_P
1413 ret
1414 pop temp ; nix tun
1415 pop temp ; direkt zuruech zu main
1416 ret
1417
1418;----------------------------------------------------------------
1419;|Mnemonic |SZHPNC|Description |Notes |
1420;----------------------------------------------------------------
1421;|CALL cc,nn|------|Conditional Call |If cc CALL |
1422;|JP cc,nn |------|Conditional Jump |If cc JP |
1423;|RET cc |------|Conditional Return |If cc RET |
1424;
1425;
1426do_op_ifp: ;sign positive, aka s=0
1427 sbrs z_flags, ZFL_S
1428 ret
1429 pop temp ; nix tun
1430 pop temp ; direkt zuruech zu main
1431 ret
1432
1433;----------------------------------------------------------------
1434;|Mnemonic |SZHPNC|Description |Notes |
1435;----------------------------------------------------------------
1436;|CALL cc,nn|------|Conditional Call |If cc CALL |
1437;|JP cc,nn |------|Conditional Jump |If cc JP |
1438;|RET cc |------|Conditional Return |If cc RET |
1439;
1440;
1441do_op_ifm: ;sign negative, aka s=1
1442 sbrc z_flags, ZFL_S
1443 ret
1444 pop temp ; nix tun
1445 pop temp ; direkt zuruech zu main
1446 ret
1447
1448
1449; ----------------------- Opcode decoding -------------------------
1450
1451; Lookup table for Z80 opcodes. Translates the first byte of the instruction word into three
1452; operations: fetch, do something, store.
1453; The table is made of 256 words.
1454
1455; .org (PC+255) & 0xff00
1456
1457;todo_table:
1458;opcjmp:
1459instr do_fetch_nop, op_nop, do_store_nop ;00 ;NOP
1460instr do_fetch_DIR16, op_nop, do_store_BC ;01 nn nn ;LD BC,nn
1461instr do_fetch_A, op_nop, do_store_MBC ;02 ;LD (BC),A
1462instr do_fetch_BC, op_INC16, do_store_BC ;03 ;INC BC
1463instr do_fetch_B, op_INC, do_store_B ;04 ;INC B
1464instr do_fetch_B, op_DEC, do_store_B ;05 ;DEC B
1465instr do_fetch_DIR8, op_nop, do_store_B ;06 ;LD B,n
1466instr do_fetch_A, op_RLC, do_store_A ;07 ;RLCA
1467instr do_fetch_nop, op_INV, do_store_nop ;08 ;EX AF,AF'
1468instr do_fetch_BC, op_ADDHL, do_store_HL ;09 ;ADD HL,BC
1469instr do_fetch_MBC, op_nop, do_store_A ;0A ;LD A,(BC)
1470instr do_fetch_BC, op_DEC16, do_store_BC ;0B ;DEC BC
1471instr do_fetch_C, op_INC, do_store_C ;0C ;INC C
1472instr do_fetch_C, op_DEC, do_store_C ;0D ;DEC C
1473instr do_fetch_DIR8, op_nop, do_store_C ;0E nn ;LD C,n
1474instr do_fetch_A, op_RRC, do_store_A ;0F ;RRCA
1475instr do_fetch_nop, op_INV, do_store_nop ;10 oo ;DJNZ o
1476instr do_fetch_DIR16, op_nop, do_store_DE ;11 nn nn ;LD DE,nn
1477instr do_fetch_A, op_nop, do_store_MDE ;12 ;LD (DE),A
1478instr do_fetch_DE, op_INC16, do_store_DE ;13 ;INC DE
1479instr do_fetch_D, op_INC, do_store_D ;14 ;INC D
1480instr do_fetch_D, op_DEC, do_store_D ;15 ;DEC D
1481instr do_fetch_DIR8, op_nop, do_store_D ;16 nn ;LD D,n
1482instr do_fetch_A, op_RL, do_store_A ;17 ;RLA
1483instr do_fetch_nop, op_INV, do_store_nop ;18 oo ;JR o
1484instr do_fetch_DE, op_ADDHL, do_store_HL ;19 ;ADD HL,DE
1485instr do_fetch_MDE, op_nop, do_store_A ;1A ;LD A,(DE)
1486instr do_fetch_DE, op_DEC16, do_store_DE ;1B ;DEC DE
1487instr do_fetch_E, op_INC, do_store_E ;1C ;INC E
1488instr do_fetch_E, op_DEC, do_store_E ;1D ;DEC E
1489instr do_fetch_DIR8, op_nop, do_store_E ;1E nn ;LD E,n
1490instr do_fetch_A, op_RR, do_store_A ;1F ;RRA
1491instr do_fetch_nop, op_INV, do_store_nop ;20 oo ;JR NZ,o
1492instr do_fetch_DIR16, op_nop, do_store_HL ;21 nn nn ;LD HL,nn
1493instr do_fetch_DIR16, op_STHL, do_store_nop ;22 nn nn ;LD (nn),HL
1494instr do_fetch_HL, op_INC16, do_store_HL ;23 ;INC HL
1495instr do_fetch_H, op_INC, do_store_H ;24 ;INC H
1496instr do_fetch_H, op_DEC, do_store_H ;25 ;DEC H
1497instr do_fetch_DIR8, op_nop, do_store_H ;26 nn ;LD H,n
1498instr do_fetch_A, op_DA, do_store_A ;27 ;DAA
1499instr do_fetch_nop, op_INV, do_store_nop ;28 oo ;JR Z,o
1500instr do_fetch_HL, op_ADDHL, do_store_HL ;29 ;ADD HL,HL
1501instr do_fetch_DIR16, op_RMEM16, do_store_HL ;2A nn nn ;LD HL,(nn)
1502instr do_fetch_HL, op_DEC16, do_store_HL ;2B ;DEC HL
1503instr do_fetch_L, op_INC, do_store_L ;2C ;INC L
1504instr do_fetch_L, op_DEC, do_store_L ;2D ;DEC L
1505instr do_fetch_DIR8, op_nop, do_store_L ;2E nn ;LD L,n
1506instr do_fetch_nop, op_CPL, do_store_nop ;2F ;CPL
1507instr do_fetch_nop, op_INV, do_store_nop ;30 oo ;JR NC,o
1508instr do_fetch_DIR16, op_nop, do_store_SP ;31 nn nn ;LD SP,nn
1509instr do_fetch_DIR16, op_nop, do_store_AM ;32 nn nn ;LD (nn),A
1510instr do_fetch_SP, op_INC16, do_store_SP ;33 ;INC SP
1511instr do_fetch_MHL, op_INC, do_store_MHL ;34 ;INC (HL)
1512instr do_fetch_MHL, op_DEC, do_store_MHL ;35 ;DEC (HL)
1513instr do_fetch_DIR8, op_nop, do_store_MHL ;36 nn ;LD (HL),n
1514instr do_fetch_nop, op_SCF, do_store_nop ;37 ;SCF
1515instr do_fetch_nop, op_INV, do_store_nop ;38 oo ;JR C,o
1516instr do_fetch_SP, op_ADDHL, do_store_HL ;39 ;ADD HL,SP
1517instr do_fetch_DIR16, op_RMEM8, do_store_A ;3A nn nn ;LD A,(nn)
1518instr do_fetch_SP, op_DEC16, do_store_SP ;3B ;DEC SP
1519instr do_fetch_nop, op_INCA, do_store_nop ;3C ;INC A
1520instr do_fetch_nop, op_DECA, do_store_nop ;3D ;DEC A
1521instr do_fetch_DIR8, op_nop, do_store_A ;3E nn ;LD A,n
1522instr do_fetch_nop, op_CCF, do_store_nop ;3F ;CCF (Complement Carry Flag, gvd)
1523instr do_fetch_B, op_nop, do_store_B ;40 ;LD B,B
1524instr do_fetch_C, op_nop, do_store_B ;41 ;LD B,C
1525instr do_fetch_D, op_nop, do_store_B ;42 ;LD B,D
1526instr do_fetch_E, op_nop, do_store_B ;43 ;LD B,E
1527instr do_fetch_H, op_nop, do_store_B ;44 ;LD B,H
1528instr do_fetch_L, op_nop, do_store_B ;45 ;LD B,L
1529instr do_fetch_MHL, op_nop, do_store_B ;46 ;LD B,(HL)
1530instr do_fetch_A, op_nop, do_store_B ;47 ;LD B,A
1531instr do_fetch_B, op_nop, do_store_C ;48 ;LD C,B
1532instr do_fetch_C, op_nop, do_store_C ;49 ;LD C,C
1533instr do_fetch_D, op_nop, do_store_C ;4A ;LD C,D
1534instr do_fetch_E, op_nop, do_store_C ;4B ;LD C,E
1535instr do_fetch_H, op_nop, do_store_C ;4C ;LD C,H
1536instr do_fetch_L, op_nop, do_store_C ;4D ;LD C,L
1537instr do_fetch_MHL, op_nop, do_store_C ;4E ;LD C,(HL)
1538instr do_fetch_A, op_nop, do_store_C ;4F ;LD C,A
1539instr do_fetch_B, op_nop, do_store_D ;50 ;LD D,B
1540instr do_fetch_C, op_nop, do_store_D ;51 ;LD D,C
1541instr do_fetch_D, op_nop, do_store_D ;52 ;LD D,D
1542instr do_fetch_E, op_nop, do_store_D ;53 ;LD D,E
1543instr do_fetch_H, op_nop, do_store_D ;54 ;LD D,H
1544instr do_fetch_L, op_nop, do_store_D ;55 ;LD D,L
1545instr do_fetch_MHL, op_nop, do_store_D ;56 ;LD D,(HL)
1546instr do_fetch_A, op_nop, do_store_D ;57 ;LD D,A
1547instr do_fetch_B, op_nop, do_store_E ;58 ;LD E,B
1548instr do_fetch_C, op_nop, do_store_E ;59 ;LD E,C
1549instr do_fetch_D, op_nop, do_store_E ;5A ;LD E,D
1550instr do_fetch_E, op_nop, do_store_E ;5B ;LD E,E
1551instr do_fetch_H, op_nop, do_store_E ;5C ;LD E,H
1552instr do_fetch_L, op_nop, do_store_E ;5D ;LD E,L
1553instr do_fetch_MHL, op_nop, do_store_E ;5E ;LD E,(HL)
1554instr do_fetch_A, op_nop, do_store_E ;5F ;LD E,A
1555instr do_fetch_B, op_nop, do_store_H ;60 ;LD H,B
1556instr do_fetch_C, op_nop, do_store_H ;61 ;LD H,C
1557instr do_fetch_D, op_nop, do_store_H ;62 ;LD H,D
1558instr do_fetch_E, op_nop, do_store_H ;63 ;LD H,E
1559instr do_fetch_H, op_nop, do_store_H ;64 ;LD H,H
1560instr do_fetch_L, op_nop, do_store_H ;65 ;LD H,L
1561instr do_fetch_MHL, op_nop, do_store_H ;66 ;LD H,(HL)
1562instr do_fetch_A, op_nop, do_store_H ;67 ;LD H,A
1563instr do_fetch_B, op_nop, do_store_L ;68 ;LD L,B
1564instr do_fetch_C, op_nop, do_store_L ;69 ;LD L,C
1565instr do_fetch_D, op_nop, do_store_L ;6A ;LD L,D
1566instr do_fetch_E, op_nop, do_store_L ;6B ;LD L,E
1567instr do_fetch_H, op_nop, do_store_L ;6C ;LD L,H
1568instr do_fetch_L, op_nop, do_store_L ;6D ;LD L,L
1569instr do_fetch_MHL, op_nop, do_store_L ;6E ;LD L,(HL)
1570instr do_fetch_A, op_nop, do_store_L ;6F ;LD L,A
1571instr do_fetch_B, op_nop, do_store_MHL ;70 ;LD (HL),B
1572instr do_fetch_C, op_nop, do_store_MHL ;71 ;LD (HL),C
1573instr do_fetch_D, op_nop, do_store_MHL ;72 ;LD (HL),D
1574instr do_fetch_E, op_nop, do_store_MHL ;73 ;LD (HL),E
1575instr do_fetch_H, op_nop, do_store_MHL ;74 ;LD (HL),H
1576instr do_fetch_L, op_nop, do_store_MHL ;75 ;LD (HL),L
1577instr do_fetch_nop, op_INV, do_store_nop ;76 ;HALT
1578instr do_fetch_A, op_nop, do_store_MHL ;77 ;LD (HL),A
1579instr do_fetch_B, op_nop, do_store_A ;78 ;LD A,B
1580instr do_fetch_C, op_nop, do_store_A ;79 ;LD A,C
1581instr do_fetch_D, op_nop, do_store_A ;7A ;LD A,D
1582instr do_fetch_E, op_nop, do_store_A ;7B ;LD A,E
1583instr do_fetch_H, op_nop, do_store_A ;7C ;LD A,H
1584instr do_fetch_L, op_nop, do_store_A ;7D ;LD A,L
1585instr do_fetch_MHL, op_nop, do_store_A ;7E ;LD A,(HL)
1586instr do_fetch_A, op_nop, do_store_A ;7F ;LD A,A
1587instr do_fetch_B, op_ADDA, do_store_nop ;80 ;ADD A,B
1588instr do_fetch_C, op_ADDA, do_store_nop ;81 ;ADD A,C
1589instr do_fetch_D, op_ADDA, do_store_nop ;82 ;ADD A,D
1590instr do_fetch_E, op_ADDA, do_store_nop ;83 ;ADD A,E
1591instr do_fetch_H, op_ADDA, do_store_nop ;84 ;ADD A,H
1592instr do_fetch_L, op_ADDA, do_store_nop ;85 ;ADD A,L
1593instr do_fetch_MHL, op_ADDA, do_store_nop ;86 ;ADD A,(HL)
1594instr do_fetch_A, op_ADDA, do_store_nop ;87 ;ADD A,A
1595instr do_fetch_B, op_ADCA, do_store_nop ;88 ;ADC A,B
1596instr do_fetch_C, op_ADCA, do_store_nop ;89 ;ADC A,C
1597instr do_fetch_D, op_ADCA, do_store_nop ;8A ;ADC A,D
1598instr do_fetch_E, op_ADCA, do_store_nop ;8B ;ADC A,E
1599instr do_fetch_H, op_ADCA, do_store_nop ;8C ;ADC A,H
1600instr do_fetch_L, op_ADCA, do_store_nop ;8D ;ADC A,L
1601instr do_fetch_MHL, op_ADCA, do_store_nop ;8E ;ADC A,(HL)
1602instr do_fetch_A, op_ADCA, do_store_nop ;8F ;ADC A,A
1603instr do_fetch_B, op_SUBFA, do_store_nop ;90 ;SUB A,B
1604instr do_fetch_C, op_SUBFA, do_store_nop ;91 ;SUB A,C
1605instr do_fetch_D, op_SUBFA, do_store_nop ;92 ;SUB A,D
1606instr do_fetch_E, op_SUBFA, do_store_nop ;93 ;SUB A,E
1607instr do_fetch_H, op_SUBFA, do_store_nop ;94 ;SUB A,H
1608instr do_fetch_L, op_SUBFA, do_store_nop ;95 ;SUB A,L
1609instr do_fetch_MHL, op_SUBFA, do_store_nop ;96 ;SUB A,(HL)
1610instr do_fetch_A, op_SUBFA, do_store_nop ;97 ;SUB A,A
1611instr do_fetch_B, op_SBCFA, do_store_nop ;98 ;SBC A,B
1612instr do_fetch_C, op_SBCFA, do_store_nop ;99 ;SBC A,C
1613instr do_fetch_D, op_SBCFA, do_store_nop ;9A ;SBC A,D
1614instr do_fetch_E, op_SBCFA, do_store_nop ;9B ;SBC A,E
1615instr do_fetch_H, op_SBCFA, do_store_nop ;9C ;SBC A,H
1616instr do_fetch_L, op_SBCFA, do_store_nop ;9D ;SBC A,L
1617instr do_fetch_MHL, op_SBCFA, do_store_nop ;9E ;SBC A,(HL)
1618instr do_fetch_A, op_SBCFA, do_store_nop ;9F ;SBC A,A
1619instr do_fetch_B, op_ANDA, do_store_nop ;A0 ;AND A,B
1620instr do_fetch_C, op_ANDA, do_store_nop ;A1 ;AND A,C
1621instr do_fetch_D, op_ANDA, do_store_nop ;A2 ;AND A,D
1622instr do_fetch_E, op_ANDA, do_store_nop ;A3 ;AND A,E
1623instr do_fetch_H, op_ANDA, do_store_nop ;A4 ;AND A,H
1624instr do_fetch_L, op_ANDA, do_store_nop ;A5 ;AND A,L
1625instr do_fetch_MHL, op_ANDA, do_store_nop ;A6 ;AND A,(HL)
1626instr do_fetch_A, op_ANDA, do_store_nop ;A7 ;AND A,A
1627instr do_fetch_B, op_XORA, do_store_nop ;A8 ;XOR A,B
1628instr do_fetch_C, op_XORA, do_store_nop ;A9 ;XOR A,C
1629instr do_fetch_D, op_XORA, do_store_nop ;AA ;XOR A,D
1630instr do_fetch_E, op_XORA, do_store_nop ;AB ;XOR A,E
1631instr do_fetch_H, op_XORA, do_store_nop ;AC ;XOR A,H
1632instr do_fetch_L, op_XORA, do_store_nop ;AD ;XOR A,L
1633instr do_fetch_MHL, op_XORA, do_store_nop ;AE ;XOR A,(HL)
1634instr do_fetch_A, op_XORA, do_store_nop ;AF ;XOR A,A
1635instr do_fetch_B, op_ORA, do_store_nop ;B0 ;OR A,B
1636instr do_fetch_C, op_ORA, do_store_nop ;B1 ;OR A,C
1637instr do_fetch_D, op_ORA, do_store_nop ;B2 ;OR A,D
1638instr do_fetch_E, op_ORA, do_store_nop ;B3 ;OR A,E
1639instr do_fetch_H, op_ORA, do_store_nop ;B4 ;OR A,H
1640instr do_fetch_L, op_ORA, do_store_nop ;B5 ;OR A,L
1641instr do_fetch_MHL, op_ORA, do_store_nop ;B6 ;OR A,(HL)
1642instr do_fetch_A, op_ORA, do_store_nop ;B7 ;OR A,A
1643instr do_fetch_B, op_CPFA, do_store_nop ;B8 ;CP A,B
1644instr do_fetch_C, op_CPFA, do_store_nop ;B9 ;CP A,C
1645instr do_fetch_D, op_CPFA, do_store_nop ;BA ;CP A,D
1646instr do_fetch_E, op_CPFA, do_store_nop ;BB ;CP A,E
1647instr do_fetch_H, op_CPFA, do_store_nop ;BC ;CP A,H
1648instr do_fetch_L, op_CPFA, do_store_nop ;BD ;CP A,L
1649instr do_fetch_MHL, op_CPFA, do_store_nop ;BE ;CP A,(HL)
1650instr do_fetch_A, op_CPFA, do_store_nop ;BF ;CP A,A
1651instr do_fetch_nop, op_IFNZ, do_store_RET ;C0 ;RET NZ
1652instr do_fetch_nop, op_POP16, do_store_BC ;C1 ;POP BC
1653instr do_fetch_DIR16, op_IFNZ, do_store_PC ;C2 nn nn ;JP NZ,nn
1654instr do_fetch_DIR16, op_nop, do_store_PC ;C3 nn nn ;JP nn
1655instr do_fetch_DIR16, op_IFNZ, do_store_CALL ;C4 nn nn ;CALL NZ,nn
1656instr do_fetch_BC, op_PUSH16, do_store_nop ;C5 ;PUSH BC
1657instr do_fetch_DIR8, op_ADDA, do_store_nop ;C6 nn ;ADD A,n
1658instr do_fetch_RST, op_nop, do_store_CALL ;C7 ;RST 0
1659instr do_fetch_nop, op_IFZ, do_store_RET ;C8 ;RET Z
1660instr do_fetch_nop, op_nop, do_store_RET ;C9 ;RET
1661instr do_fetch_DIR16, op_IFZ, do_store_PC ;CA nn nn ;JP Z,nn
1662instr do_fetch_nop, op_INV, do_store_nop ;CB ;(Z80 specific)
1663instr do_fetch_DIR16, op_IFZ, do_store_CALL ;CC nn nn ;CALL Z,nn
1664instr do_fetch_DIR16, op_nop, do_store_CALL ;CD nn nn ;CALL nn
1665instr do_fetch_DIR8, op_ADCA, do_store_nop ;CE nn ;ADC A,n
1666instr do_fetch_RST, op_nop, do_store_CALL ;CF ;RST 8H
1667instr do_fetch_nop, op_IFNC, do_store_RET ;D0 ;RET NC
1668instr do_fetch_nop, op_POP16, do_store_DE ;D1 ;POP DE
1669instr do_fetch_DIR16, op_IFNC, do_store_PC ;D2 nn nn ;JP NC,nn
1670instr do_fetch_DIR8, op_OUTA, do_store_nop ;D3 nn ;OUT (n),A
1671instr do_fetch_DIR16, op_IFNC, do_store_CALL ;D4 nn nn ;CALL NC,nn
1672instr do_fetch_DE, op_PUSH16, do_store_nop ;D5 ;PUSH DE
1673instr do_fetch_DIR8, op_SUBFA, do_store_nop ;D6 nn ;SUB n
1674instr do_fetch_RST, op_nop, do_store_CALL ;D7 ;RST 10H
1675instr do_fetch_nop, op_IFC, do_store_RET ;D8 ;RET C
1676instr do_fetch_nop, op_nop, do_store_nop ;D9 ;EXX
1677instr do_fetch_DIR16, op_IFC, do_store_PC ;DA nn nn ;JP C,nn
1678instr do_fetch_DIR8, op_IN, do_store_A ;DB nn ;IN A,(n)
1679instr do_fetch_DIR16, op_IFC, do_store_CALL ;DC nn nn ;CALL C,nn
1680instr do_fetch_nop, op_INV, do_store_nop ;DD ;(Z80 specific)
1681instr do_fetch_DIR8, op_SBCFA, do_store_nop ;DE nn ;SBC A,n
1682instr do_fetch_RST, op_nop, do_store_CALL ;DF ;RST 18H
1683instr do_fetch_nop, op_IFPO, do_store_RET ;E0 ;RET PO
1684instr do_fetch_nop, op_POP16, do_store_HL ;E1 ;POP HL
1685instr do_fetch_DIR16, op_IFPO, do_store_PC ;E2 nn nn ;JP PO,nn
1686instr do_fetch_MSP, op_EXHL, do_store_MSP ;E3 ;EX (SP),HL
1687instr do_fetch_DIR16, op_IFPO, do_store_CALL ;E4 nn nn ;CALL PO,nn
1688instr do_fetch_HL, op_PUSH16, do_store_nop ;E5 ;PUSH HL
1689instr do_fetch_DIR8, op_ANDA, do_store_nop ;E6 nn ;AND n
1690instr do_fetch_RST, op_nop, do_store_CALL ;E7 ;RST 20H
1691instr do_fetch_nop, op_IFPE, do_store_RET ;E8 ;RET PE
1692instr do_fetch_HL, op_nop, do_store_PC ;E9 ;JP HL
1693instr do_fetch_DIR16, op_IFPE, do_store_PC ;EA nn nn ;JP PE,nn
1694instr do_fetch_DE, op_EXHL, do_store_DE ;EB ;EX DE,HL
1695instr do_fetch_DIR16, op_IFPE, do_store_CALL ;EC nn nn ;CALL PE,nn
1696instr do_fetch_nop, op_INV, do_store_nop ;ED ;(Z80 specific)
1697instr do_fetch_DIR8, op_XORA, do_store_nop ;EE nn ;XOR n
1698instr do_fetch_RST, op_nop, do_store_CALL ;EF ;RST 28H
1699instr do_fetch_nop, op_IFP, do_store_RET ;F0 ;RET P
1700instr do_fetch_nop, op_POP16, do_store_AF ;F1 ;POP AF
1701instr do_fetch_DIR16, op_IFP, do_store_PC ;F2 nn nn ;JP P,nn
1702instr do_fetch_nop, op_DI, do_store_nop ;F3 ;DI
1703instr do_fetch_DIR16, op_IFP, do_store_CALL ;F4 nn nn ;CALL P,nn
1704instr do_fetch_AF, op_PUSH16, do_store_nop ;F5 ;PUSH AF
1705instr do_fetch_DIR8, op_ORA, do_store_nop ;F6 nn ;OR n
1706instr do_fetch_RST, op_nop, do_store_CALL ;F7 ;RST 30H
1707instr do_fetch_nop, op_IFM, do_store_RET ;F8 ;RET M
1708instr do_fetch_HL, op_nop, do_store_SP ;F9 ;LD SP,HL
1709instr do_fetch_DIR16, op_IFM, do_store_PC ;FA nn nn ;JP M,nn
1710instr do_fetch_nop, op_EI, do_store_nop ;FB ;EI
1711instr do_fetch_DIR16, op_IFM, do_store_CALL ;FC nn nn ;CALL M,nn
1712instr do_fetch_nop, op_INV, do_store_nop ;FD ;(Z80 specific)
1713instr do_fetch_DIR8, op_CPFA, do_store_nop ;FE nn ;CP n
1714instr do_fetch_RST, op_nop, do_store_CALL ;FF ;RST 38H
1715
1716
1717;----------------------------------------------------------------
1718; Lookup table, stolen from z80ex, Z80 emulation library.
1719; http://z80ex.sourceforge.net/
1720
1721; The S, Z, 5 and 3 bits and the parity of the lookup value
1722
1723; .org (PC+255) & 0xff00
1724 .org opcjmp + 256
1725sz53p_tab:
1726 .db 0x44,0x00,0x00,0x04,0x00,0x04,0x04,0x00
1727 .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c
1728 .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04
1729 .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08
1730 .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24
1731 .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28
1732 .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20
1733 .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c
1734 .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04
1735 .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08
1736 .db 0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00
1737 .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c
1738 .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20
1739 .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c
1740 .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24
1741 .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28
1742 .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
1743 .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88
1744 .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80
1745 .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c
1746 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0
1747 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac
1748 .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4
1749 .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8
1750 .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80
1751 .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c
1752 .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
1753 .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88
1754 .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4
1755 .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8
1756 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0
1757 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac
1758
1759; vim:set ts=8 noet nowrap
1760