2 ; This is part of the Z80-CP/M emulator written by Sprite_tm.
5 ; Copyright (C) 2010 Sprite_tm
6 ; Copyright (C) 2010 Leo C.
7 ; Copyright (C) 2010 Horst S.
9 ; This file is part of avrcpm.
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.
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.
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/>.
41 ldi z_pcl,low (IPLADDR)
42 ldi z_pch,high(IPLADDR)
46 printstring "Ok, CPU is live!"
53 cpi z_pch,DBG_TRACE_BOTTOM
55 cpi z_pch,DBG_TRACE_TOP
63 cpi z_pch,DBG_TRACE_BOTTOM
65 cpi z_pch,DBG_TRACE_TOP
81 ;hier kommt die Interruptbehandlung rein
83 mem_read_s z_pc ;temp=memReadByte(z_pc)
85 ldi zl,low(todo_table*2) ;zhl=todo_table
86 ldi zh,high(todo_table*2) ;
91 lpm insdecl,Z+ ;do_store
94 ldi zh,high(fetch_ops)
99 ;-----------------------------------------------------
100 ; Generate jump to target and position in table
104 .ifndef opjmp_table_pos_
105 .set opjmp_table_page_ = high(PC)
106 .set opjmp_table_pos_ = PC
108 .equ @0 = low(opjmp_table_pos_)
109 .set opjmp_table_pos_ = opjmp_table_pos_ + 1
110 .if high(opjmp_table_pos_) != opjmp_table_page_
111 .warning "Table 'opjump' crosses page boarder."
112 .message "Program will not work, unless the opjump table is relocated."
117 ;--------------------------------------------------
118 ; Generate a table entry for one instruction
120 ; instr fetch, op, store
123 .ifndef inst_table_odd_
124 .set inst_table_odd_ = 0
128 .db inst_table_next_, low(@2), @1, low(@0)
129 .set inst_table_odd_ = 0
131 .set inst_table_next_ = low(@0)
133 .set inst_table_odd_ = 1
137 ;-----------------------------------
146 ;-----------------------------------
150 ldi zh,high(store_ops) ;
155 ;-----------------------------------
162 ;-----------------------------------
163 ; go back to main directly
170 ; ------------ Fetch phase stuff -----------------
172 .org (PC+255) & 0xff00
255 mem_read_ds opl, z_pc
260 mem_read_ds opl, z_pc
262 mem_read_ds oph, z_pc
274 ; ------------ Store phase stuff -----------------
276 .org (PC+255) & 0xff00
372 printstring "Stack pop "
375 printstring ", SP is now "
392 printstring "Stack push "
395 printstring ", SP is now "
410 ; ------------ Operation phase stuff -----------------
412 ;.org (PC+255) & 0xff00
461 ;----------------------------------------------------------------
465 ;| ZZZZZZZ 88888 000 |
471 ;| ZZZZZZZ 88888 000 |
473 ;| Z80 MICROPROCESSOR Instruction Set Summary |
475 ;----------------------------------------------------------------
476 ;----------------------------------------------------------------
477 ;|Mnemonic |SZHPNC|Description |Notes |
478 ;|----------+------+---------------------+----------------------|
479 ;|ADC A,s |***V0*|Add with Carry |A=A+s+CY |
480 ;|ADC HL,ss |**?V0*|Add with Carry |HL=HL+ss+CY |
481 ;|ADD A,s |***V0*|Add |A=A+s |
482 ;|ADD HL,ss |--?-0*|Add |HL=HL+ss |
483 ;|ADD IX,pp |--?-0*|Add |IX=IX+pp |
484 ;|ADD IY,rr |--?-0*|Add |IY=IY+rr |
485 ;|AND s |**1P00|Logical AND |A=A&s |
486 ;|BIT b,m |?*1?0-|Test Bit |m&{2^b} |
487 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
488 ;|CALL nn |------|Unconditional Call |-[SP]=PC,PC=nn |
489 ;|CCF |--?-0*|Complement Carry Flag|CY=~CY |
490 ;|CP s |***V1*|Compare |A-s |
491 ;|CPD |****1-|Compare and Decrement|A-[HL],HL=HL-1,BC=BC-1|
492 ;|CPDR |****1-|Compare, Dec., Repeat|CPD till A=[HL]or BC=0|
493 ;|CPI |****1-|Compare and Increment|A-[HL],HL=HL+1,BC=BC-1|
494 ;|CPIR |****1-|Compare, Inc., Repeat|CPI till A=[HL]or BC=0|
495 ;|CPL |--1-1-|Complement |A=~A |
496 ;|DAA |***P-*|Decimal Adjust Acc. |A=BCD format |
497 ;|DEC s |***V1-|Decrement |s=s-1 |
498 ;|DEC xx |------|Decrement |xx=xx-1 |
499 ;|DEC ss |------|Decrement |ss=ss-1 |
500 ;|DI |------|Disable Interrupts | |
501 ;|DJNZ e |------|Dec., Jump Non-Zero |B=B-1 till B=0 |
502 ;|EI |------|Enable Interrupts | |
503 ;|EX [SP],HL|------|Exchange |[SP]<->HL |
504 ;|EX [SP],xx|------|Exchange |[SP]<->xx |
505 ;|EX AF,AF' |------|Exchange |AF<->AF' |
506 ;|EX DE,HL |------|Exchange |DE<->HL |
507 ;|EXX |------|Exchange |qq<->qq' (except AF)|
508 ;|HALT |------|Halt | |
509 ;|IM n |------|Interrupt Mode | (n=0,1,2)|
510 ;|IN A,[n] |------|Input |A=[n] |
511 ;|IN r,[C] |***P0-|Input |r=[C] |
512 ;|INC r |***V0-|Increment |r=r+1 |
513 ;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
514 ;|INC xx |------|Increment |xx=xx+1 |
515 ;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
516 ;|INC ss |------|Increment |ss=ss+1 |
517 ;|IND |?*??1-|Input and Decrement |[HL]=[C],HL=HL-1,B=B-1|
518 ;|INDR |?1??1-|Input, Dec., Repeat |IND till B=0 |
519 ;|INI |?*??1-|Input and Increment |[HL]=[C],HL=HL+1,B=B-1|
520 ;|INIR |?1??1-|Input, Inc., Repeat |INI till B=0 |
521 ;|JP [HL] |------|Unconditional Jump |PC=[HL] |
522 ;|JP [xx] |------|Unconditional Jump |PC=[xx] |
523 ;|JP nn |------|Unconditional Jump |PC=nn |
524 ;|JP cc,nn |------|Conditional Jump |If cc JP |
525 ;|JR e |------|Unconditional Jump |PC=PC+e |
526 ;|JR cc,e |------|Conditional Jump |If cc JR(cc=C,NC,NZ,Z)|
527 ;|LD dst,src|------|Load |dst=src |
528 ;|LD A,i |**0*0-|Load |A=i (i=I,R)|
529 ;|LDD |--0*0-|Load and Decrement |[DE]=[HL],HL=HL-1,# |
530 ;|LDDR |--000-|Load, Dec., Repeat |LDD till BC=0 |
531 ;|LDI |--0*0-|Load and Increment |[DE]=[HL],HL=HL+1,# |
532 ;|LDIR |--000-|Load, Inc., Repeat |LDI till BC=0 |
533 ;|NEG |***V1*|Negate |A=-A |
534 ;|NOP |------|No Operation | |
535 ;|OR s |**0P00|Logical inclusive OR |A=Avs |
536 ;|OTDR |?1??1-|Output, Dec., Repeat |OUTD till B=0 |
537 ;|OTIR |?1??1-|Output, Inc., Repeat |OUTI till B=0 |
538 ;|OUT [C],r |------|Output |[C]=r |
539 ;|OUT [n],A |------|Output |[n]=A |
540 ;|OUTD |?*??1-|Output and Decrement |[C]=[HL],HL=HL-1,B=B-1|
541 ;|OUTI |?*??1-|Output and Increment |[C]=[HL],HL=HL+1,B=B-1|
542 ;|POP xx |------|Pop |xx=[SP]+ |
543 ;|POP qq |------|Pop |qq=[SP]+ |
544 ;|PUSH xx |------|Push |-[SP]=xx |
545 ;|PUSH qq |------|Push |-[SP]=qq |
546 ;|RES b,m |------|Reset bit |m=m&{~2^b} |
547 ;|RET |------|Return |PC=[SP]+ |
548 ;|RET cc |------|Conditional Return |If cc RET |
549 ;|RETI |------|Return from Interrupt|PC=[SP]+ |
550 ;|RETN |------|Return from NMI |PC=[SP]+ |
551 ;|RL m |**0P0*|Rotate Left |m={CY,m}<- |
552 ;|RLA |--0-0*|Rotate Left Acc. |A={CY,A}<- |
553 ;|RLC m |**0P0*|Rotate Left Circular |m=m<- |
554 ;|RLCA |--0-0*|Rotate Left Circular |A=A<- |
555 ;|RLD |**0P0-|Rotate Left 4 bits |{A,[HL]}={A,[HL]}<- ##|
556 ;|RR m |**0P0*|Rotate Right |m=->{CY,m} |
557 ;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} |
558 ;|RRC m |**0P0*|Rotate Right Circular|m=->m |
559 ;|RRCA |--0-0*|Rotate Right Circular|A=->A |
560 ;|RRD |**0P0-|Rotate Right 4 bits |{A,[HL]}=->{A,[HL]} ##|
561 ;|RST p |------|Restart | (p=0H,8H,10H,...,38H)|
562 ;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY |
563 ;|SBC HL,ss |**?V1*|Subtract with Carry |HL=HL-ss-CY |
564 ;|SCF |--0-01|Set Carry Flag |CY=1 |
565 ;|SET b,m |------|Set bit |m=mv{2^b} |
566 ;|SLA m |**0P0*|Shift Left Arithmetic|m=m*2 |
567 ;|SRA m |**0P0*|Shift Right Arith. |m=m/2 |
568 ;|SRL m |**0P0*|Shift Right Logical |m=->{0,m,CY} |
569 ;|SUB s |***V1*|Subtract |A=A-s |
570 ;|XOR s |**0P00|Logical Exclusive OR |A=Axs |
571 ;|----------+------+--------------------------------------------|
572 ;| F |-*01? |Flag unaffected/affected/reset/set/unknown |
573 ;| S |S |Sign flag (Bit 7) |
574 ;| Z | Z |Zero flag (Bit 6) |
575 ;| HC | H |Half Carry flag (Bit 4) |
576 ;| P/V | P |Parity/Overflow flag (Bit 2, V=overflow) |
577 ;| N | N |Add/Subtract flag (Bit 1) |
578 ;| CY | C|Carry flag (Bit 0) |
579 ;|-----------------+--------------------------------------------|
580 ;| n |Immediate addressing |
581 ;| nn |Immediate extended addressing |
582 ;| e |Relative addressing (PC=PC+2+offset) |
583 ;| [nn] |Extended addressing |
584 ;| [xx+d] |Indexed addressing |
585 ;| r |Register addressing |
586 ;| [rr] |Register indirect addressing |
587 ;| |Implied addressing |
588 ;| b |Bit addressing |
589 ;| p |Modified page zero addressing (see RST) |
590 ;|-----------------+--------------------------------------------|
591 ;|DEFB n(,...) |Define Byte(s) |
592 ;|DEFB 'str'(,...) |Define Byte ASCII string(s) |
593 ;|DEFS nn |Define Storage Block |
594 ;|DEFW nn(,...) |Define Word(s) |
595 ;|-----------------+--------------------------------------------|
596 ;| A B C D E |Registers (8-bit) |
597 ;| AF BC DE HL |Register pairs (16-bit) |
598 ;| F |Flag register (8-bit) |
599 ;| I |Interrupt page address register (8-bit) |
600 ;| IX IY |Index registers (16-bit) |
601 ;| PC |Program Counter register (16-bit) |
602 ;| R |Memory Refresh register |
603 ;| SP |Stack Pointer register (16-bit) |
604 ;|-----------------+--------------------------------------------|
605 ;| b |One bit (0 to 7) |
606 ;| cc |Condition (C,M,NC,NZ,P,PE,PO,Z) |
607 ;| d |One-byte expression (-128 to +127) |
608 ;| dst |Destination s, ss, [BC], [DE], [HL], [nn] |
609 ;| e |One-byte expression (-126 to +129) |
610 ;| m |Any register r, [HL] or [xx+d] |
611 ;| n |One-byte expression (0 to 255) |
612 ;| nn |Two-byte expression (0 to 65535) |
613 ;| pp |Register pair BC, DE, IX or SP |
614 ;| qq |Register pair AF, BC, DE or HL |
615 ;| qq' |Alternative register pair AF, BC, DE or HL |
616 ;| r |Register A, B, C, D, E, H or L |
617 ;| rr |Register pair BC, DE, IY or SP |
618 ;| s |Any register r, value n, [HL] or [xx+d] |
619 ;| src |Source s, ss, [BC], [DE], [HL], nn, [nn] |
620 ;| ss |Register pair BC, DE, HL or SP |
621 ;| xx |Index register IX or IY |
622 ;|-----------------+--------------------------------------------|
623 ;| + - * / ^ |Add/subtract/multiply/divide/exponent |
624 ;| & ~ v x |Logical AND/NOT/inclusive OR/exclusive OR |
625 ;| <- -> |Rotate left/right |
626 ;| [ ] |Indirect addressing |
627 ;| [ ]+ -[ ] |Indirect addressing auto-increment/decrement|
628 ;| { } |Combination of operands |
629 ;| # |Also BC=BC-1,DE=DE-1 |
630 ;| ## |Only lower 4 bits of accumulator A used |
631 ;----------------------------------------------------------------
633 ;How the flags are supposed to work:
634 ;7 ZFL_S - Sign flag (=MSBit of result)
635 ;6 ZFL_Z - Zero flag. Is 1 when the result is 0
636 ;4 ZFL_H - Half-carry (carry from bit 3 to 4)
637 ;2 ZFL_P - Parity/2-complement Overflow
638 ;1 ZFL_N - Subtract - set if last op was a subtract
641 ;I sure hope I got the mapping between flags and instructions correct...
659 ;------------------------------------------------;
660 ; Load table value from flash indexed by source reg.
662 ; ldpmx dstreg,tablebase,indexreg
664 ; (6 words, 8 cycles)
667 ldi zh,high(@1*2) ; table must be page aligned
672 .macro do_z80_flags_HP
674 bmov z_flags, ZFL_P, temp, AVR_V
675 bmov z_flags, ZFL_H, temp, AVR_H
679 .macro do_z80_flags_set_N
681 ori z_flags, (1<<ZFL_N) ; Negation auf 1
685 .macro do_z80_flags_set_HN
687 ori z_flags,(1<<ZFL_N)|(1<<ZFL_H)
691 .macro do_z80_flags_clear_N
693 andi z_flags,~(1<<ZFL_N)
697 .macro do_z80_flags_op_rotate
698 ; must not change avr carry flag!
700 andi z_flags, ~( (1<<ZFL_H) | (1<<ZFL_N) | (1<<ZFL_C) )
702 andi z_flags, ~( (1<<ZFL_C) )
706 .macro do_z80_flags_op_and
708 ori z_flags,(1<<ZFL_H)
710 ori z_flags,(1<<ZFL_H)
714 .macro do_z80_flags_op_or
720 ;----------------------------------------------------------------
723 printstring "Invalid opcode @ PC="
733 ;----------------------------------------------------------------
734 ;|Mnemonic |SZHPNC|Description |Notes |
735 ;----------------------------------------------------------------
736 ;|OUT [n],A |------|Output |[n]=A |
739 ;Interface with peripherials goes here :)
740 do_op_outa: ; out (opl),a
743 printstring "Port write: "
756 ;----------------------------------------------------------------
757 ;|Mnemonic |SZHPNC|Description |Notes |
758 ;----------------------------------------------------------------
759 ;|IN A,[n] |------|Input |A=[n] |
762 do_op_in: ; in a,(opl)
765 printstring "Port read: ("
781 ;----------------------------------------------------------------
782 ;|Mnemonic |SZHPNC|Description |Notes |
783 ;----------------------------------------------------------------
784 ;|INC r |***V0-|Increment |r=r+1 |
785 ;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
786 ;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
787 ;|----------|SZHP C|---------- 8080 ----------------------------|
788 ;|INC r |**-P0-|Increment |r=r+1 |
789 ;|INC [HL] |**-P0-|Increment |[HL]=[HL]+1 |
797 andi z_flags,(1<<ZFL_H)|(1<<ZFL_C) ; preserve C-, and H-flag
798 ldpmx temp2, sz53p_tab, opl
808 andi z_flags,(1<<ZFL_H)|(1<<ZFL_C) ; preserve C-, and H-flag
809 ldpmx temp2, sz53p_tab, z_a
814 ;----------------------------------------------------------------
815 ;|Mnemonic |SZHPNC|Description |Notes |
816 ;----------------------------------------------------------------
817 ;|DEC r |***V1-|Decrement |s=s-1 |
818 ;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
819 ;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
820 ;|----------|SZHP C|---------- 8080 ----------------------------|
821 ;|DEC r |**-P -|Increment |r=r+1 |
822 ;|DEC [HL] |**-P -|Increment |[HL]=[HL]+1 |
830 andi z_flags,(1<<ZFL_H)|(1<<ZFL_C) ; preserve C-, and H-flag
831 ldpmx temp2, sz53p_tab, opl
842 andi z_flags,(1<<ZFL_H)|(1<<ZFL_C) ; preserve C-, and H-flag
843 ldpmx temp2, sz53p_tab, z_a
849 ;----------------------------------------------------------------
850 ;|Mnemonic |SZHPNC|Description |Notes |
851 ;----------------------------------------------------------------
852 ;|INC xx |------|Increment |xx=xx+1 |
853 ;|INC ss |------|Increment |ss=ss+1 |
861 ;----------------------------------------------------------------
862 ;|Mnemonic |SZHPNC|Description |Notes |
863 ;----------------------------------------------------------------
864 ;|DEC xx |------|Decrement |xx=xx-1 |
865 ;|DEC ss |------|Decrement |ss=ss-1 |
873 ;----------------------------------------------------------------
874 ;|Mnemonic |SZHPNC|Description |Notes |
875 ;----------------------------------------------------------------
876 ;|RLCA |--0-0*|Rotate Left Circular |A=A<- |
877 ;|----------|SZHP C|---------- 8080 ----------------------------|
878 ;|RLCA |---- *|Rotate Left Circular |A=A<- |
882 ;Rotate Left Cyclical. All bits move 1 to the
883 ;left, the msb becomes c and lsb.
884 do_z80_flags_op_rotate
888 ori z_flags, (1<<ZFL_C)
892 ;----------------------------------------------------------------
893 ;|Mnemonic |SZHPNC|Description |Notes |
894 ;----------------------------------------------------------------
895 ;|RRCA |--0-0*|Rotate Right Circular|A=->A |
896 ;|----------|SZHP C|---------- 8080 ----------------------------|
897 ;|RRCA |---- *|Rotate Right Circular|A=->A |
901 ;Rotate Right Cyclical. All bits move 1 to the
902 ;right, the lsb becomes c and msb.
903 do_z80_flags_op_rotate
907 ori z_flags, (1<<ZFL_C)
911 ;----------------------------------------------------------------
912 ;|Mnemonic |SZHPNC|Description |Notes |
913 ;----------------------------------------------------------------
914 ;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} |
915 ;|----------|SZHP C|---------- 8080 ----------------------------|
916 ;|RRA |---- *|Rotate Right Acc. |A=->{CY,A} |
920 ;Rotate Right. All bits move 1 to the right, the lsb
921 ;becomes c, c becomes msb.
922 clc ; get z80 carry to avr carry
925 do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C)
926 bmov z_flags,ZFL_C, opl,0 ; Bit 0 --> CY
930 ;----------------------------------------------------------------
931 ;|Mnemonic |SZHPNC|Description |Notes |
932 ;----------------------------------------------------------------
933 ;|RLA |--0-0*|Rotate Left Acc. |A={CY,A}<- |
934 ;|----------|SZHP C|---------- 8080 ----------------------------|
935 ;|RLA |---- *|Rotate Left Acc. |A={CY,A}<- |
939 ;Rotate Left. All bits move 1 to the left, the msb
940 ;becomes c, c becomes lsb.
944 do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C)
945 bmov z_flags,ZFL_C, opl,7 ; Bit 7 --> CY
949 ;----------------------------------------------------------------
950 ;|Mnemonic |SZHPNC|Description |Notes |
951 ;----------------------------------------------------------------
952 ;|ADD A,s |***V0*|Add |A=A+s |
953 ;|----------|SZHP C|---------- 8080 ----------------------------|
954 ;|ADD A,s |***P *|Add |A=A+s |
960 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P flag
961 bmov z_flags,ZFL_C, temp,AVR_C
965 ;----------------------------------------------------------------
966 ;|Mnemonic |SZHPNC|Description |Notes |
967 ;----------------------------------------------------------------
968 ;|ADC A,s |***V0*|Add with Carry |A=A+s+CY |
969 ;|----------|SZHP C|---------- 8080 ----------------------------|
970 ;|ADC A,s |***P *|Add with Carry |A=A+s+CY |
979 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
980 bmov z_flags,ZFL_C, temp,AVR_C
984 ;----------------------------------------------------------------
985 ;|Mnemonic |SZHPNC|Description |Notes |
986 ;----------------------------------------------------------------
987 ;|SUB s |***V1*|Subtract |A=A-s |
988 ;|----------|SZHP C|---------- 8080 ----------------------------|
989 ;|SUB s |***P *|Subtract |A=A-s |
995 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
996 bmov z_flags,ZFL_C, temp,AVR_C
1001 ;----------------------------------------------------------------
1002 ;|Mnemonic |SZHPNC|Description |Notes |
1003 ;----------------------------------------------------------------
1004 ;|CP s |***V1*|Compare |A-s |
1005 ;|----------|SZHP C|---------- 8080 ----------------------------|
1006 ;|CP s |***P *|Compare |A-s |
1014 ldpmx z_flags,sz53p_tab,opl ;S,Z,P
1015 bmov z_flags,ZFL_C, temp,AVR_C
1020 ;----------------------------------------------------------------
1021 ;|Mnemonic |SZHPNC|Description |Notes |
1022 ;----------------------------------------------------------------
1023 ;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY |
1024 ;|----------|SZHP C|---------- 8080 ----------------------------|
1025 ;|SBC A,s |***P *|Subtract with Carry |A=A-s-CY |
1034 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
1035 bmov z_flags,ZFL_C, temp,AVR_C
1040 ;----------------------------------------------------------------
1041 ;|Mnemonic |SZHPNC|Description |Notes |
1042 ;----------------------------------------------------------------
1043 ;|AND s |**1P00|Logical AND |A=A&s |
1044 ;|----------|SZHP C|---------- 8080 ----------------------------|
1045 ;|AND s |**-P 0|Logical AND |A=A&s |
1050 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P,N,C
1055 ;----------------------------------------------------------------
1056 ;|Mnemonic |SZHPNC|Description |Notes |
1057 ;----------------------------------------------------------------
1058 ;|OR s |**0P00|Logical inclusive OR |A=Avs |
1059 ;|----------|SZHP C|---------- 8080 ----------------------------|
1060 ;|OR s |**-P00|Logical inclusive OR |A=Avs |
1065 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C
1069 ;----------------------------------------------------------------
1070 ;|Mnemonic |SZHPNC|Description |Notes |
1071 ;----------------------------------------------------------------
1072 ;|XOR s |**0P00|Logical Exclusive OR |A=Axs |
1073 ;|----------|SZHP C|---------- 8080 ----------------------------|
1074 ;|XOR s |**-P 0|Logical Exclusive OR |A=Axs |
1079 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C
1083 ;----------------------------------------------------------------
1084 ;|Mnemonic |SZHPNC|Description |Notes |
1085 ;----------------------------------------------------------------
1086 ;|ADD HL,ss |--?-0*|Add |HL=HL+ss |
1087 ;|----------|SZHP C|---------- 8080 ----------------------------|
1088 ;|ADD HL,ss |---- *|Add |HL=HL+ss |
1097 bmov z_flags,ZFL_H, temp,AVR_H
1098 bmov z_flags,ZFL_C, temp,AVR_C
1099 do_z80_flags_clear_N
1102 ;----------------------------------------------------------------
1103 ;|Mnemonic |SZHPNC|Description |Notes |
1104 ;----------------------------------------------------------------
1105 ;|LD dst,src|------|Load |dst=src |
1108 do_op_sthl: ;store hl to mem loc in opl:h
1117 ;----------------------------------------------------------------
1118 ;|Mnemonic |SZHPNC|Description |Notes |
1119 ;----------------------------------------------------------------
1120 ;|LD dst,src|------|Load |dst=src |
1130 ;----------------------------------------------------------------
1131 ;|Mnemonic |SZHPNC|Description |Notes |
1132 ;----------------------------------------------------------------
1133 ;|LD dst,src|------|Load |dst=src |
1140 ;----------------------------------------------------------------
1141 ;|Mnemonic |SZHPNC|Description |Notes |
1142 ;----------------------------------------------------------------
1143 ;|DAA |***P-*|Decimal Adjust Acc. | |
1144 ;|----------|SZHP C|---------- 8080 ----------------------------|
1148 ; Description (http://www.z80.info/z80syntx.htm#DAA):
1149 ; This instruction conditionally adjusts the accumulator for BCD addition
1150 ; and subtraction operations. For addition (ADD, ADC, INC) or subtraction
1151 ; (SUB, SBC, DEC, NEC), the following table indicates the operation performed:
1153 ; -------------------------------------------------------------------------------
1154 ; | | C Flag | HEX value in | H Flag | HEX value in | Number | C flag|
1155 ; | Operation| Before | upper digit | Before | lower digit | added | After |
1156 ; | | DAA | (bit 7-4) | DAA | (bit 3-0) | to byte | DAA |
1157 ; |-----------------------------------------------------------------------------|
1158 ; | | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
1159 ; | ADD | 0 | 0-8 | 0 | A-F | 06 | 0 |
1160 ; | | 0 | 0-9 | 1 | 0-3 | 06 | 0 |
1161 ; | ADC | 0 | A-F | 0 | 0-9 | 60 | 1 |
1162 ; | | 0 | 9-F | 0 | A-F | 66 | 1 |
1163 ; | INC | 0 | A-F | 1 | 0-3 | 66 | 1 |
1164 ; | | 1 | 0-2 | 0 | 0-9 | 60 | 1 |
1165 ; | | 1 | 0-2 | 0 | A-F | 66 | 1 |
1166 ; | | 1 | 0-3 | 1 | 0-3 | 66 | 1 |
1167 ; |-----------------------------------------------------------------------------|
1168 ; | SUB | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
1169 ; | SBC | 0 | 0-8 | 1 | 6-F | FA | 0 |
1170 ; | DEC | 1 | 7-F | 0 | 0-9 | A0 | 1 |
1171 ; | NEG | 1 | 6-F | 1 | 6-F | 9A | 1 |
1172 ; |-----------------------------------------------------------------------------|
1175 ; C: See instruction.
1177 ; P/V: Set if Acc. is even parity after operation, reset otherwise.
1178 ; H: See instruction.
1179 ; Z: Set if Acc. is Zero after operation, reset otherwise.
1180 ; S: Set if most significant bit of Acc. is 1 after operation, reset otherwise.
1186 ldi oph,0 ; what to add
1187 sbrc z_flags,ZFL_H ; if H-Flag
1190 andi temp,0x0f ; ... or lower digit > 9
1196 sbrc z_flags,(1<<ZFL_C)
1205 ori z_flags,(1<<ZFL_C); set C
1207 sbrs z_flags,ZFL_N ; if sub-op
1208 rjmp op_da_add ; then
1211 op_da_add: ; else add-op
1224 ori z_flags,(1<<ZFL_C)
1225 andi z_flags,(1<<ZFL_N)|(1<<ZFL_C) ; preserve C,N
1226 ldpmx temp2, sz53p_tab, opl ; get S,Z,P
1228 bmov z_flags,ZFL_H, temp,AVR_H ; H (?)
1233 sbrc z_flags,ZFL_N ; if add-op
1234 rjmp do_op_da_sub ; then
1238 cpi temp,0x0a ; if lower digit > 9
1240 ori temp2,0x06 ; add 6 to lower digit
1242 sbrc z_flags,ZFL_H ; ... or H-Flag
1252 do_op_da_c: ; else sub-op
1253 sbrc z_flags,ZFL_C ;
1255 andi z_flags, ~( (1<<ZFL_S) | (1<<ZFL_Z) | (1<<ZFL_H) )
1258 bst temp,AVR_Z ;Z-Flag
1260 bst temp,AVR_N ;S-Flag
1262 sbrc temp2,5 ;C-Flag, set if 0x06 added
1263 ori z_flags,(1<<ZFL_C) ;
1267 do_op_da_sub: ;TODO:
1272 ;----------------------------------------------------------------
1273 ;|Mnemonic |SZHPNC|Description |Notes |
1274 ;----------------------------------------------------------------
1275 ;|SCF |--0-01|Set Carry Flag |CY=1 |
1276 ;|----------|SZHP C|---------- 8080 ----------------------------|
1280 andi z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
1281 ori z_flags,(1<<ZFL_C)
1284 ;----------------------------------------------------------------
1285 ;|Mnemonic |SZHPNC|Description |Notes |
1286 ;----------------------------------------------------------------
1287 ;|CCF |--?-0*|Complement Carry Flag|CY=~CY |
1288 ;|----------|SZHP C|---------- 8080 ----------------------------|
1289 ;|SCF |---- 1|Set Carry Flag |CY=1 |
1293 do_z80_flags_clear_N
1298 ;----------------------------------------------------------------
1299 ;|Mnemonic |SZHPNC|Description |Notes |
1300 ;----------------------------------------------------------------
1301 ;|CPL |--1-1-|Complement |A=~A |
1302 ;|----------|SZHP C|---------- 8080 ----------------------------|
1303 ;|CPL |---- -|Complement |A=~A |
1312 ;----------------------------------------------------------------
1313 ;|Mnemonic |SZHPNC|Description |Notes |
1314 ;----------------------------------------------------------------
1315 ;|PUSH xx |------|Push |-[SP]=xx |
1316 ;|PUSH qq |------|Push |-[SP]=qq |
1329 printstring "Stack push "
1332 printstring ", SP is now "
1340 ;----------------------------------------------------------------
1341 ;|Mnemonic |SZHPNC|Description |Notes |
1342 ;----------------------------------------------------------------
1343 ;|POP xx |------|Pop |xx=[SP]+ |
1344 ;|POP qq |------|Pop |qq=[SP]+ |
1357 printstring "Stack pop "
1360 printstring ", SP is now "
1367 ;----------------------------------------------------------------
1368 ;|Mnemonic |SZHPNC|Description |Notes |
1369 ;----------------------------------------------------------------
1370 ;|EX [SP],HL|------|Exchange |[SP]<->HL |
1371 ;|EX DE,HL |------|Exchange |DE<->HL |
1372 ;-----------------------------Z80--------------------------------
1382 ;----------------------------------------------------------------
1383 ;|Mnemonic |SZHPNC|Description |Notes |
1384 ;----------------------------------------------------------------
1386 ; TODO: Implement IFF1, IFF2
1390 ;----------------------------------------------------------------
1391 ;|Mnemonic |SZHPNC|Description |Notes |
1392 ;----------------------------------------------------------------
1394 ; TODO: Implement IFF1, IFF2
1398 ;----------------------------------------------------------------
1399 ;|Mnemonic |SZHPNC|Description |Notes |
1400 ;----------------------------------------------------------------
1401 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1402 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1403 ;|RET cc |------|Conditional Return |If cc RET |
1411 ;----------------------------------------------------------------
1412 ;|Mnemonic |SZHPNC|Description |Notes |
1413 ;----------------------------------------------------------------
1414 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1415 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1416 ;|RET cc |------|Conditional Return |If cc RET |
1424 ;----------------------------------------------------------------
1425 ;|Mnemonic |SZHPNC|Description |Notes |
1426 ;----------------------------------------------------------------
1427 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1428 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1429 ;|RET cc |------|Conditional Return |If cc RET |
1437 ;----------------------------------------------------------------
1438 ;|Mnemonic |SZHPNC|Description |Notes |
1439 ;----------------------------------------------------------------
1440 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1441 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1442 ;|RET cc |------|Conditional Return |If cc RET |
1450 ;----------------------------------------------------------------
1451 ;|Mnemonic |SZHPNC|Description |Notes |
1452 ;----------------------------------------------------------------
1453 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1454 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1455 ;|RET cc |------|Conditional Return |If cc RET |
1463 ;----------------------------------------------------------------
1464 ;|Mnemonic |SZHPNC|Description |Notes |
1465 ;----------------------------------------------------------------
1466 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1467 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1468 ;|RET cc |------|Conditional Return |If cc RET |
1476 ;----------------------------------------------------------------
1477 ;|Mnemonic |SZHPNC|Description |Notes |
1478 ;----------------------------------------------------------------
1479 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1480 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1481 ;|RET cc |------|Conditional Return |If cc RET |
1484 do_op_ifp: ;sign positive, aka s=0
1489 ;----------------------------------------------------------------
1490 ;|Mnemonic |SZHPNC|Description |Notes |
1491 ;----------------------------------------------------------------
1492 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1493 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1494 ;|RET cc |------|Conditional Return |If cc RET |
1497 do_op_ifm: ;sign negative, aka s=1
1503 ; ----------------------- Opcode decoding -------------------------
1505 ; Lookup table for Z80 opcodes. Translates the first byte of the instruction word into three
1506 ; operations: fetch, do something, store.
1507 ; The table is made of 256 words.
1509 ;.org (PC+255) & 0xff00
1511 instr do_fetch_nop, op_nop, do_store_nop ;00 ;NOP
1512 instr do_fetch_DIR16, op_nop, do_store_BC ;01 nn nn ;LD BC,nn
1513 instr do_fetch_A, op_nop, do_store_MBC ;02 ;LD (BC),A
1514 instr do_fetch_BC, op_INC16, do_store_BC ;03 ;INC BC
1515 instr do_fetch_B, op_INC, do_store_B ;04 ;INC B
1516 instr do_fetch_B, op_DEC, do_store_B ;05 ;DEC B
1517 instr do_fetch_DIR8, op_nop, do_store_B ;06 ;LD B,n
1518 instr do_fetch_A, op_RLC, do_store_A ;07 ;RLCA
1519 instr do_fetch_nop, op_INV, do_store_nop ;08 ;EX AF,AF'
1520 instr do_fetch_BC, op_ADDHL, do_store_HL ;09 ;ADD HL,BC
1521 instr do_fetch_MBC, op_nop, do_store_A ;0A ;LD A,(BC)
1522 instr do_fetch_BC, op_DEC16, do_store_BC ;0B ;DEC BC
1523 instr do_fetch_C, op_INC, do_store_C ;0C ;INC C
1524 instr do_fetch_C, op_DEC, do_store_C ;0D ;DEC C
1525 instr do_fetch_DIR8, op_nop, do_store_C ;0E nn ;LD C,n
1526 instr do_fetch_A, op_RRC, do_store_A ;0F ;RRCA
1527 instr do_fetch_nop, op_INV, do_store_nop ;10 oo ;DJNZ o
1528 instr do_fetch_DIR16, op_nop, do_store_DE ;11 nn nn ;LD DE,nn
1529 instr do_fetch_A, op_nop, do_store_MDE ;12 ;LD (DE),A
1530 instr do_fetch_DE, op_INC16, do_store_DE ;13 ;INC DE
1531 instr do_fetch_D, op_INC, do_store_D ;14 ;INC D
1532 instr do_fetch_D, op_DEC, do_store_D ;15 ;DEC D
1533 instr do_fetch_DIR8, op_nop, do_store_D ;16 nn ;LD D,n
1534 instr do_fetch_A, op_RL, do_store_A ;17 ;RLA
1535 instr do_fetch_nop, op_INV, do_store_nop ;18 oo ;JR o
1536 instr do_fetch_DE, op_ADDHL, do_store_HL ;19 ;ADD HL,DE
1537 instr do_fetch_MDE, op_nop, do_store_A ;1A ;LD A,(DE)
1538 instr do_fetch_DE, op_DEC16, do_store_DE ;1B ;DEC DE
1539 instr do_fetch_E, op_INC, do_store_E ;1C ;INC E
1540 instr do_fetch_E, op_DEC, do_store_E ;1D ;DEC E
1541 instr do_fetch_DIR8, op_nop, do_store_E ;1E nn ;LD E,n
1542 instr do_fetch_A, op_RR, do_store_A ;1F ;RRA
1543 instr do_fetch_nop, op_INV, do_store_nop ;20 oo ;JR NZ,o
1544 instr do_fetch_DIR16, op_nop, do_store_HL ;21 nn nn ;LD HL,nn
1545 instr do_fetch_DIR16, op_STHL, do_store_nop ;22 nn nn ;LD (nn),HL
1546 instr do_fetch_HL, op_INC16, do_store_HL ;23 ;INC HL
1547 instr do_fetch_H, op_INC, do_store_H ;24 ;INC H
1548 instr do_fetch_H, op_DEC, do_store_H ;25 ;DEC H
1549 instr do_fetch_DIR8, op_nop, do_store_H ;26 nn ;LD H,n
1550 instr do_fetch_A, op_DA, do_store_A ;27 ;DAA
1551 instr do_fetch_nop, op_INV, do_store_nop ;28 oo ;JR Z,o
1552 instr do_fetch_HL, op_ADDHL, do_store_HL ;29 ;ADD HL,HL
1553 instr do_fetch_DIR16, op_RMEM16, do_store_HL ;2A nn nn ;LD HL,(nn)
1554 instr do_fetch_HL, op_DEC16, do_store_HL ;2B ;DEC HL
1555 instr do_fetch_L, op_INC, do_store_L ;2C ;INC L
1556 instr do_fetch_L, op_DEC, do_store_L ;2D ;DEC L
1557 instr do_fetch_DIR8, op_nop, do_store_L ;2E nn ;LD L,n
1558 instr do_fetch_nop, op_CPL, do_store_nop ;2F ;CPL
1559 instr do_fetch_nop, op_INV, do_store_nop ;30 oo ;JR NC,o
1560 instr do_fetch_DIR16, op_nop, do_store_SP ;31 nn nn ;LD SP,nn
1561 instr do_fetch_DIR16, op_nop, do_store_AM ;32 nn nn ;LD (nn),A
1562 instr do_fetch_SP, op_INC16, do_store_SP ;33 ;INC SP
1563 instr do_fetch_MHL, op_INC, do_store_MHL ;34 ;INC (HL)
1564 instr do_fetch_MHL, op_DEC, do_store_MHL ;35 ;DEC (HL)
1565 instr do_fetch_DIR8, op_nop, do_store_MHL ;36 nn ;LD (HL),n
1566 instr do_fetch_nop, op_SCF, do_store_nop ;37 ;SCF
1567 instr do_fetch_nop, op_INV, do_store_nop ;38 oo ;JR C,o
1568 instr do_fetch_SP, op_ADDHL, do_store_HL ;39 ;ADD HL,SP
1569 instr do_fetch_DIR16, op_RMEM8, do_store_A ;3A nn nn ;LD A,(nn)
1570 instr do_fetch_SP, op_DEC16, do_store_SP ;3B ;DEC SP
1571 instr do_fetch_nop, op_INCA, do_store_nop ;3C ;INC A
1572 instr do_fetch_nop, op_DECA, do_store_nop ;3D ;DEC A
1573 instr do_fetch_DIR8, op_nop, do_store_A ;3E nn ;LD A,n
1574 instr do_fetch_nop, op_CCF, do_store_nop ;3F ;CCF (Complement Carry Flag, gvd)
1575 instr do_fetch_B, op_nop, do_store_B ;40 ;LD B,B
1576 instr do_fetch_C, op_nop, do_store_B ;41 ;LD B,C
1577 instr do_fetch_D, op_nop, do_store_B ;42 ;LD B,D
1578 instr do_fetch_E, op_nop, do_store_B ;43 ;LD B,E
1579 instr do_fetch_H, op_nop, do_store_B ;44 ;LD B,H
1580 instr do_fetch_L, op_nop, do_store_B ;45 ;LD B,L
1581 instr do_fetch_MHL, op_nop, do_store_B ;46 ;LD B,(HL)
1582 instr do_fetch_A, op_nop, do_store_B ;47 ;LD B,A
1583 instr do_fetch_B, op_nop, do_store_C ;48 ;LD C,B
1584 instr do_fetch_C, op_nop, do_store_C ;49 ;LD C,C
1585 instr do_fetch_D, op_nop, do_store_C ;4A ;LD C,D
1586 instr do_fetch_E, op_nop, do_store_C ;4B ;LD C,E
1587 instr do_fetch_H, op_nop, do_store_C ;4C ;LD C,H
1588 instr do_fetch_L, op_nop, do_store_C ;4D ;LD C,L
1589 instr do_fetch_MHL, op_nop, do_store_C ;4E ;LD C,(HL)
1590 instr do_fetch_A, op_nop, do_store_C ;4F ;LD C,A
1591 instr do_fetch_B, op_nop, do_store_D ;50 ;LD D,B
1592 instr do_fetch_C, op_nop, do_store_D ;51 ;LD D,C
1593 instr do_fetch_D, op_nop, do_store_D ;52 ;LD D,D
1594 instr do_fetch_E, op_nop, do_store_D ;53 ;LD D,E
1595 instr do_fetch_H, op_nop, do_store_D ;54 ;LD D,H
1596 instr do_fetch_L, op_nop, do_store_D ;55 ;LD D,L
1597 instr do_fetch_MHL, op_nop, do_store_D ;56 ;LD D,(HL)
1598 instr do_fetch_A, op_nop, do_store_D ;57 ;LD D,A
1599 instr do_fetch_B, op_nop, do_store_E ;58 ;LD E,B
1600 instr do_fetch_C, op_nop, do_store_E ;59 ;LD E,C
1601 instr do_fetch_D, op_nop, do_store_E ;5A ;LD E,D
1602 instr do_fetch_E, op_nop, do_store_E ;5B ;LD E,E
1603 instr do_fetch_H, op_nop, do_store_E ;5C ;LD E,H
1604 instr do_fetch_L, op_nop, do_store_E ;5D ;LD E,L
1605 instr do_fetch_MHL, op_nop, do_store_E ;5E ;LD E,(HL)
1606 instr do_fetch_A, op_nop, do_store_E ;5F ;LD E,A
1607 instr do_fetch_B, op_nop, do_store_H ;60 ;LD H,B
1608 instr do_fetch_C, op_nop, do_store_H ;61 ;LD H,C
1609 instr do_fetch_D, op_nop, do_store_H ;62 ;LD H,D
1610 instr do_fetch_E, op_nop, do_store_H ;63 ;LD H,E
1611 instr do_fetch_H, op_nop, do_store_H ;64 ;LD H,H
1612 instr do_fetch_L, op_nop, do_store_H ;65 ;LD H,L
1613 instr do_fetch_MHL, op_nop, do_store_H ;66 ;LD H,(HL)
1614 instr do_fetch_A, op_nop, do_store_H ;67 ;LD H,A
1615 instr do_fetch_B, op_nop, do_store_L ;68 ;LD L,B
1616 instr do_fetch_C, op_nop, do_store_L ;69 ;LD L,C
1617 instr do_fetch_D, op_nop, do_store_L ;6A ;LD L,D
1618 instr do_fetch_E, op_nop, do_store_L ;6B ;LD L,E
1619 instr do_fetch_H, op_nop, do_store_L ;6C ;LD L,H
1620 instr do_fetch_L, op_nop, do_store_L ;6D ;LD L,L
1621 instr do_fetch_MHL, op_nop, do_store_L ;6E ;LD L,(HL)
1622 instr do_fetch_A, op_nop, do_store_L ;6F ;LD L,A
1623 instr do_fetch_B, op_nop, do_store_MHL ;70 ;LD (HL),B
1624 instr do_fetch_C, op_nop, do_store_MHL ;71 ;LD (HL),C
1625 instr do_fetch_D, op_nop, do_store_MHL ;72 ;LD (HL),D
1626 instr do_fetch_E, op_nop, do_store_MHL ;73 ;LD (HL),E
1627 instr do_fetch_H, op_nop, do_store_MHL ;74 ;LD (HL),H
1628 instr do_fetch_L, op_nop, do_store_MHL ;75 ;LD (HL),L
1629 instr do_fetch_nop, op_INV, do_store_nop ;76 ;HALT
1630 instr do_fetch_A, op_nop, do_store_MHL ;77 ;LD (HL),A
1631 instr do_fetch_B, op_nop, do_store_A ;78 ;LD A,B
1632 instr do_fetch_C, op_nop, do_store_A ;79 ;LD A,C
1633 instr do_fetch_D, op_nop, do_store_A ;7A ;LD A,D
1634 instr do_fetch_E, op_nop, do_store_A ;7B ;LD A,E
1635 instr do_fetch_H, op_nop, do_store_A ;7C ;LD A,H
1636 instr do_fetch_L, op_nop, do_store_A ;7D ;LD A,L
1637 instr do_fetch_MHL, op_nop, do_store_A ;7E ;LD A,(HL)
1638 instr do_fetch_A, op_nop, do_store_A ;7F ;LD A,A
1639 instr do_fetch_B, op_ADDA, do_store_nop ;80 ;ADD A,B
1640 instr do_fetch_C, op_ADDA, do_store_nop ;81 ;ADD A,C
1641 instr do_fetch_D, op_ADDA, do_store_nop ;82 ;ADD A,D
1642 instr do_fetch_E, op_ADDA, do_store_nop ;83 ;ADD A,E
1643 instr do_fetch_H, op_ADDA, do_store_nop ;84 ;ADD A,H
1644 instr do_fetch_L, op_ADDA, do_store_nop ;85 ;ADD A,L
1645 instr do_fetch_MHL, op_ADDA, do_store_nop ;86 ;ADD A,(HL)
1646 instr do_fetch_A, op_ADDA, do_store_nop ;87 ;ADD A,A
1647 instr do_fetch_B, op_ADCA, do_store_nop ;88 ;ADC A,B
1648 instr do_fetch_C, op_ADCA, do_store_nop ;89 ;ADC A,C
1649 instr do_fetch_D, op_ADCA, do_store_nop ;8A ;ADC A,D
1650 instr do_fetch_E, op_ADCA, do_store_nop ;8B ;ADC A,E
1651 instr do_fetch_H, op_ADCA, do_store_nop ;8C ;ADC A,H
1652 instr do_fetch_L, op_ADCA, do_store_nop ;8D ;ADC A,L
1653 instr do_fetch_MHL, op_ADCA, do_store_nop ;8E ;ADC A,(HL)
1654 instr do_fetch_A, op_ADCA, do_store_nop ;8F ;ADC A,A
1655 instr do_fetch_B, op_SUBFA, do_store_nop ;90 ;SUB A,B
1656 instr do_fetch_C, op_SUBFA, do_store_nop ;91 ;SUB A,C
1657 instr do_fetch_D, op_SUBFA, do_store_nop ;92 ;SUB A,D
1658 instr do_fetch_E, op_SUBFA, do_store_nop ;93 ;SUB A,E
1659 instr do_fetch_H, op_SUBFA, do_store_nop ;94 ;SUB A,H
1660 instr do_fetch_L, op_SUBFA, do_store_nop ;95 ;SUB A,L
1661 instr do_fetch_MHL, op_SUBFA, do_store_nop ;96 ;SUB A,(HL)
1662 instr do_fetch_A, op_SUBFA, do_store_nop ;97 ;SUB A,A
1663 instr do_fetch_B, op_SBCFA, do_store_nop ;98 ;SBC A,B
1664 instr do_fetch_C, op_SBCFA, do_store_nop ;99 ;SBC A,C
1665 instr do_fetch_D, op_SBCFA, do_store_nop ;9A ;SBC A,D
1666 instr do_fetch_E, op_SBCFA, do_store_nop ;9B ;SBC A,E
1667 instr do_fetch_H, op_SBCFA, do_store_nop ;9C ;SBC A,H
1668 instr do_fetch_L, op_SBCFA, do_store_nop ;9D ;SBC A,L
1669 instr do_fetch_MHL, op_SBCFA, do_store_nop ;9E ;SBC A,(HL)
1670 instr do_fetch_A, op_SBCFA, do_store_nop ;9F ;SBC A,A
1671 instr do_fetch_B, op_ANDA, do_store_nop ;A0 ;AND A,B
1672 instr do_fetch_C, op_ANDA, do_store_nop ;A1 ;AND A,C
1673 instr do_fetch_D, op_ANDA, do_store_nop ;A2 ;AND A,D
1674 instr do_fetch_E, op_ANDA, do_store_nop ;A3 ;AND A,E
1675 instr do_fetch_H, op_ANDA, do_store_nop ;A4 ;AND A,H
1676 instr do_fetch_L, op_ANDA, do_store_nop ;A5 ;AND A,L
1677 instr do_fetch_MHL, op_ANDA, do_store_nop ;A6 ;AND A,(HL)
1678 instr do_fetch_A, op_ANDA, do_store_nop ;A7 ;AND A,A
1679 instr do_fetch_B, op_XORA, do_store_nop ;A8 ;XOR A,B
1680 instr do_fetch_C, op_XORA, do_store_nop ;A9 ;XOR A,C
1681 instr do_fetch_D, op_XORA, do_store_nop ;AA ;XOR A,D
1682 instr do_fetch_E, op_XORA, do_store_nop ;AB ;XOR A,E
1683 instr do_fetch_H, op_XORA, do_store_nop ;AC ;XOR A,H
1684 instr do_fetch_L, op_XORA, do_store_nop ;AD ;XOR A,L
1685 instr do_fetch_MHL, op_XORA, do_store_nop ;AE ;XOR A,(HL)
1686 instr do_fetch_A, op_XORA, do_store_nop ;AF ;XOR A,A
1687 instr do_fetch_B, op_ORA, do_store_nop ;B0 ;OR A,B
1688 instr do_fetch_C, op_ORA, do_store_nop ;B1 ;OR A,C
1689 instr do_fetch_D, op_ORA, do_store_nop ;B2 ;OR A,D
1690 instr do_fetch_E, op_ORA, do_store_nop ;B3 ;OR A,E
1691 instr do_fetch_H, op_ORA, do_store_nop ;B4 ;OR A,H
1692 instr do_fetch_L, op_ORA, do_store_nop ;B5 ;OR A,L
1693 instr do_fetch_MHL, op_ORA, do_store_nop ;B6 ;OR A,(HL)
1694 instr do_fetch_A, op_ORA, do_store_nop ;B7 ;OR A,A
1695 instr do_fetch_B, op_CPFA, do_store_nop ;B8 ;CP A,B
1696 instr do_fetch_C, op_CPFA, do_store_nop ;B9 ;CP A,C
1697 instr do_fetch_D, op_CPFA, do_store_nop ;BA ;CP A,D
1698 instr do_fetch_E, op_CPFA, do_store_nop ;BB ;CP A,E
1699 instr do_fetch_H, op_CPFA, do_store_nop ;BC ;CP A,H
1700 instr do_fetch_L, op_CPFA, do_store_nop ;BD ;CP A,L
1701 instr do_fetch_MHL, op_CPFA, do_store_nop ;BE ;CP A,(HL)
1702 instr do_fetch_A, op_CPFA, do_store_nop ;BF ;CP A,A
1703 instr do_fetch_nop, op_IFNZ, do_store_RET ;C0 ;RET NZ
1704 instr do_fetch_nop, op_POP16, do_store_BC ;C1 ;POP BC
1705 instr do_fetch_DIR16, op_IFNZ, do_store_PC ;C2 nn nn ;JP NZ,nn
1706 instr do_fetch_DIR16, op_nop, do_store_PC ;C3 nn nn ;JP nn
1707 instr do_fetch_DIR16, op_IFNZ, do_store_CALL ;C4 nn nn ;CALL NZ,nn
1708 instr do_fetch_BC, op_PUSH16, do_store_nop ;C5 ;PUSH BC
1709 instr do_fetch_DIR8, op_ADDA, do_store_nop ;C6 nn ;ADD A,n
1710 instr do_fetch_RST, op_nop, do_store_CALL ;C7 ;RST 0
1711 instr do_fetch_nop, op_IFZ, do_store_RET ;C8 ;RET Z
1712 instr do_fetch_nop, op_nop, do_store_RET ;C9 ;RET
1713 instr do_fetch_DIR16, op_IFZ, do_store_PC ;CA nn nn ;JP Z,nn
1714 instr do_fetch_nop, op_INV, do_store_nop ;CB ;(Z80 specific)
1715 instr do_fetch_DIR16, op_IFZ, do_store_CALL ;CC nn nn ;CALL Z,nn
1716 instr do_fetch_DIR16, op_nop, do_store_CALL ;CD nn nn ;CALL nn
1717 instr do_fetch_DIR8, op_ADCA, do_store_nop ;CE nn ;ADC A,n
1718 instr do_fetch_RST, op_nop, do_store_CALL ;CF ;RST 8H
1719 instr do_fetch_nop, op_IFNC, do_store_RET ;D0 ;RET NC
1720 instr do_fetch_nop, op_POP16, do_store_DE ;D1 ;POP DE
1721 instr do_fetch_DIR16, op_IFNC, do_store_PC ;D2 nn nn ;JP NC,nn
1722 instr do_fetch_DIR8, op_OUTA, do_store_nop ;D3 nn ;OUT (n),A
1723 instr do_fetch_DIR16, op_IFNC, do_store_CALL ;D4 nn nn ;CALL NC,nn
1724 instr do_fetch_DE, op_PUSH16, do_store_nop ;D5 ;PUSH DE
1725 instr do_fetch_DIR8, op_SUBFA, do_store_nop ;D6 nn ;SUB n
1726 instr do_fetch_RST, op_nop, do_store_CALL ;D7 ;RST 10H
1727 instr do_fetch_nop, op_IFC, do_store_RET ;D8 ;RET C
1728 instr do_fetch_nop, op_nop, do_store_nop ;D9 ;EXX
1729 instr do_fetch_DIR16, op_IFC, do_store_PC ;DA nn nn ;JP C,nn
1730 instr do_fetch_DIR8, op_IN, do_store_A ;DB nn ;IN A,(n)
1731 instr do_fetch_DIR16, op_IFC, do_store_CALL ;DC nn nn ;CALL C,nn
1732 instr do_fetch_nop, op_INV, do_store_nop ;DD ;(Z80 specific)
1733 instr do_fetch_DIR8, op_SBCFA, do_store_nop ;DE nn ;SBC A,n
1734 instr do_fetch_RST, op_nop, do_store_CALL ;DF ;RST 18H
1735 instr do_fetch_nop, op_IFPO, do_store_RET ;E0 ;RET PO
1736 instr do_fetch_nop, op_POP16, do_store_HL ;E1 ;POP HL
1737 instr do_fetch_DIR16, op_IFPO, do_store_PC ;E2 nn nn ;JP PO,nn
1738 instr do_fetch_MSP, op_EXHL, do_store_MSP ;E3 ;EX (SP),HL
1739 instr do_fetch_DIR16, op_IFPO, do_store_CALL ;E4 nn nn ;CALL PO,nn
1740 instr do_fetch_HL, op_PUSH16, do_store_nop ;E5 ;PUSH HL
1741 instr do_fetch_DIR8, op_ANDA, do_store_nop ;E6 nn ;AND n
1742 instr do_fetch_RST, op_nop, do_store_CALL ;E7 ;RST 20H
1743 instr do_fetch_nop, op_IFPE, do_store_RET ;E8 ;RET PE
1744 instr do_fetch_HL, op_nop, do_store_PC ;E9 ;JP HL
1745 instr do_fetch_DIR16, op_IFPE, do_store_PC ;EA nn nn ;JP PE,nn
1746 instr do_fetch_DE, op_EXHL, do_store_DE ;EB ;EX DE,HL
1747 instr do_fetch_DIR16, op_IFPE, do_store_CALL ;EC nn nn ;CALL PE,nn
1748 instr do_fetch_nop, op_INV, do_store_nop ;ED ;(Z80 specific)
1749 instr do_fetch_DIR8, op_XORA, do_store_nop ;EE nn ;XOR n
1750 instr do_fetch_RST, op_nop, do_store_CALL ;EF ;RST 28H
1751 instr do_fetch_nop, op_IFP, do_store_RET ;F0 ;RET P
1752 instr do_fetch_nop, op_POP16, do_store_AF ;F1 ;POP AF
1753 instr do_fetch_DIR16, op_IFP, do_store_PC ;F2 nn nn ;JP P,nn
1754 instr do_fetch_nop, op_DI, do_store_nop ;F3 ;DI
1755 instr do_fetch_DIR16, op_IFP, do_store_CALL ;F4 nn nn ;CALL P,nn
1756 instr do_fetch_AF, op_PUSH16, do_store_nop ;F5 ;PUSH AF
1757 instr do_fetch_DIR8, op_ORA, do_store_nop ;F6 nn ;OR n
1758 instr do_fetch_RST, op_nop, do_store_CALL ;F7 ;RST 30H
1759 instr do_fetch_nop, op_IFM, do_store_RET ;F8 ;RET M
1760 instr do_fetch_HL, op_nop, do_store_SP ;F9 ;LD SP,HL
1761 instr do_fetch_DIR16, op_IFM, do_store_PC ;FA nn nn ;JP M,nn
1762 instr do_fetch_nop, op_EI, do_store_nop ;FB ;EI
1763 instr do_fetch_DIR16, op_IFM, do_store_CALL ;FC nn nn ;CALL M,nn
1764 instr do_fetch_nop, op_INV, do_store_nop ;FD ;(Z80 specific)
1765 instr do_fetch_DIR8, op_CPFA, do_store_nop ;FE nn ;CP n
1766 instr do_fetch_RST, op_nop, do_store_CALL ;FF ;RST 38H
1768 ;----------------------------------------------------------------
1769 ; Lookup table, stolen from z80ex, Z80 emulation library.
1770 ; http://z80ex.sourceforge.net/
1772 ; The S, Z, 5 and 3 bits and the parity of the lookup value
1774 .org (PC+255) & 0xff00
1776 .db 0x44,0x00,0x00,0x04,0x00,0x04,0x04,0x00
1777 .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c
1778 .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04
1779 .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08
1780 .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24
1781 .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28
1782 .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20
1783 .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c
1784 .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04
1785 .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08
1786 .db 0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00
1787 .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c
1788 .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20
1789 .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c
1790 .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24
1791 .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28
1792 .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
1793 .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88
1794 .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80
1795 .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c
1796 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0
1797 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac
1798 .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4
1799 .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8
1800 .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80
1801 .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c
1802 .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
1803 .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88
1804 .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4
1805 .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8
1806 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0
1807 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac
1809 ; vim:set ts=8 noet nowrap