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/>.
40 ldi z_pcl,low (IPLADDR)
41 ldi z_pch,high(IPLADDR)
45 printstring "Ok, CPU is live!"
51 cpi z_pch,DBG_TRACE_BOTTOM
53 cpi z_pch,DBG_TRACE_TOP
60 cpi z_pch,DBG_TRACE_BOTTOM
62 cpi z_pch,DBG_TRACE_TOP
78 ;hier kommt die Interruptbehandlung rein
80 mem_read_ds zl,z_pc ;zl = memReadByte(z_pc)
89 ;--------------------------------------------------
90 ; Generate a table entry for one instruction
92 ; instr fetch, op, store
95 .ifndef opcjmp_table_pos_
96 .set todo_table_pos_ = PC
97 ; Place the opcode jump table on the next available location.
98 .equ opcjmp = (PC+255) & 0xff00
99 .set opcjmp_table_pos_ = opcjmp
102 .if todo_table_pos_ < opcjmp + 256 + 128
103 .if todo_table_pos_ + 3 >= opcjmp
104 .set todo_table_pos_ = opcjmp + 256 + 128
108 .set fetch_ = (@0 != do_fetch_nop) ; must call or jump to fetch phase
109 .set op_ = (do_@1 != do_op_nop) ; must call or jump to op phase
110 .set store_ = (@2 != do_store_nop) ; must jump to store phase
111 .set cnt_ = fetch_ + op_ + store_
113 .set do_@0_@1_@2 = todo_table_pos_ ; make a label
115 .org opcjmp_table_pos_
116 .set opcjmp_table_pos_ = opcjmp_table_pos_ + 1
118 .if cnt_ == 0 ; nothing to do (nop)
119 ret ; go back to main
122 .if cnt_ == 1 ; jump direct to action
127 rjmp do_@1 ; do op and return to main
134 ; two or tree actions
135 .if cnt_ >= 2 ; jump direct to action
136 rjmp do_@0_@1_@2 ; generate a jump to action table
140 .if fetch_ ; must fetch
142 rcall @0 ; fetch and come back here
144 rjmp @0 ; fetch and return to main
147 .if op_ ; must exec op
149 rcall do_@1 ; do op and come back here
151 rjmp do_@1 ; do op and return to main
154 .if store_ ; must store
155 rjmp @2 ; store is allways last
158 .set todo_table_pos_ = PC
165 ; ------------ Fetch phase stuff -----------------
167 ;.org (PC+255) & 0xff00
250 mem_read_ds opl, z_pc
255 mem_read_ds opl, z_pc
257 mem_read_ds oph, z_pc
269 ; ------------ Store phase stuff -----------------
271 ;.org (PC+255) & 0xff00
367 printstring "Stack pop "
370 printstring ", SP is now "
387 printstring "Stack push "
390 printstring ", SP is now "
405 ; ------------ Operation phase stuff -----------------
407 ;----------------------------------------------------------------
411 ;| ZZZZZZZ 88888 000 |
417 ;| ZZZZZZZ 88888 000 |
419 ;| Z80 MICROPROCESSOR Instruction Set Summary |
421 ;----------------------------------------------------------------
422 ;----------------------------------------------------------------
423 ;|Mnemonic |SZHPNC|Description |Notes |
424 ;|----------+------+---------------------+----------------------|
425 ;|ADC A,s |***V0*|Add with Carry |A=A+s+CY |
426 ;|ADC HL,ss |**?V0*|Add with Carry |HL=HL+ss+CY |
427 ;|ADD A,s |***V0*|Add |A=A+s |
428 ;|ADD HL,ss |--?-0*|Add |HL=HL+ss |
429 ;|ADD IX,pp |--?-0*|Add |IX=IX+pp |
430 ;|ADD IY,rr |--?-0*|Add |IY=IY+rr |
431 ;|AND s |**1P00|Logical AND |A=A&s |
432 ;|BIT b,m |?*1?0-|Test Bit |m&{2^b} |
433 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
434 ;|CALL nn |------|Unconditional Call |-[SP]=PC,PC=nn |
435 ;|CCF |--?-0*|Complement Carry Flag|CY=~CY |
436 ;|CP s |***V1*|Compare |A-s |
437 ;|CPD |****1-|Compare and Decrement|A-[HL],HL=HL-1,BC=BC-1|
438 ;|CPDR |****1-|Compare, Dec., Repeat|CPD till A=[HL]or BC=0|
439 ;|CPI |****1-|Compare and Increment|A-[HL],HL=HL+1,BC=BC-1|
440 ;|CPIR |****1-|Compare, Inc., Repeat|CPI till A=[HL]or BC=0|
441 ;|CPL |--1-1-|Complement |A=~A |
442 ;|DAA |***P-*|Decimal Adjust Acc. |A=BCD format |
443 ;|DEC s |***V1-|Decrement |s=s-1 |
444 ;|DEC xx |------|Decrement |xx=xx-1 |
445 ;|DEC ss |------|Decrement |ss=ss-1 |
446 ;|DI |------|Disable Interrupts | |
447 ;|DJNZ e |------|Dec., Jump Non-Zero |B=B-1 till B=0 |
448 ;|EI |------|Enable Interrupts | |
449 ;|EX [SP],HL|------|Exchange |[SP]<->HL |
450 ;|EX [SP],xx|------|Exchange |[SP]<->xx |
451 ;|EX AF,AF' |------|Exchange |AF<->AF' |
452 ;|EX DE,HL |------|Exchange |DE<->HL |
453 ;|EXX |------|Exchange |qq<->qq' (except AF)|
454 ;|HALT |------|Halt | |
455 ;|IM n |------|Interrupt Mode | (n=0,1,2)|
456 ;|IN A,[n] |------|Input |A=[n] |
457 ;|IN r,[C] |***P0-|Input |r=[C] |
458 ;|INC r |***V0-|Increment |r=r+1 |
459 ;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
460 ;|INC xx |------|Increment |xx=xx+1 |
461 ;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
462 ;|INC ss |------|Increment |ss=ss+1 |
463 ;|IND |?*??1-|Input and Decrement |[HL]=[C],HL=HL-1,B=B-1|
464 ;|INDR |?1??1-|Input, Dec., Repeat |IND till B=0 |
465 ;|INI |?*??1-|Input and Increment |[HL]=[C],HL=HL+1,B=B-1|
466 ;|INIR |?1??1-|Input, Inc., Repeat |INI till B=0 |
467 ;|JP [HL] |------|Unconditional Jump |PC=[HL] |
468 ;|JP [xx] |------|Unconditional Jump |PC=[xx] |
469 ;|JP nn |------|Unconditional Jump |PC=nn |
470 ;|JP cc,nn |------|Conditional Jump |If cc JP |
471 ;|JR e |------|Unconditional Jump |PC=PC+e |
472 ;|JR cc,e |------|Conditional Jump |If cc JR(cc=C,NC,NZ,Z)|
473 ;|LD dst,src|------|Load |dst=src |
474 ;|LD A,i |**0*0-|Load |A=i (i=I,R)|
475 ;|LDD |--0*0-|Load and Decrement |[DE]=[HL],HL=HL-1,# |
476 ;|LDDR |--000-|Load, Dec., Repeat |LDD till BC=0 |
477 ;|LDI |--0*0-|Load and Increment |[DE]=[HL],HL=HL+1,# |
478 ;|LDIR |--000-|Load, Inc., Repeat |LDI till BC=0 |
479 ;|NEG |***V1*|Negate |A=-A |
480 ;|NOP |------|No Operation | |
481 ;|OR s |**0P00|Logical inclusive OR |A=Avs |
482 ;|OTDR |?1??1-|Output, Dec., Repeat |OUTD till B=0 |
483 ;|OTIR |?1??1-|Output, Inc., Repeat |OUTI till B=0 |
484 ;|OUT [C],r |------|Output |[C]=r |
485 ;|OUT [n],A |------|Output |[n]=A |
486 ;|OUTD |?*??1-|Output and Decrement |[C]=[HL],HL=HL-1,B=B-1|
487 ;|OUTI |?*??1-|Output and Increment |[C]=[HL],HL=HL+1,B=B-1|
488 ;|POP xx |------|Pop |xx=[SP]+ |
489 ;|POP qq |------|Pop |qq=[SP]+ |
490 ;|PUSH xx |------|Push |-[SP]=xx |
491 ;|PUSH qq |------|Push |-[SP]=qq |
492 ;|RES b,m |------|Reset bit |m=m&{~2^b} |
493 ;|RET |------|Return |PC=[SP]+ |
494 ;|RET cc |------|Conditional Return |If cc RET |
495 ;|RETI |------|Return from Interrupt|PC=[SP]+ |
496 ;|RETN |------|Return from NMI |PC=[SP]+ |
497 ;|RL m |**0P0*|Rotate Left |m={CY,m}<- |
498 ;|RLA |--0-0*|Rotate Left Acc. |A={CY,A}<- |
499 ;|RLC m |**0P0*|Rotate Left Circular |m=m<- |
500 ;|RLCA |--0-0*|Rotate Left Circular |A=A<- |
501 ;|RLD |**0P0-|Rotate Left 4 bits |{A,[HL]}={A,[HL]}<- ##|
502 ;|RR m |**0P0*|Rotate Right |m=->{CY,m} |
503 ;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} |
504 ;|RRC m |**0P0*|Rotate Right Circular|m=->m |
505 ;|RRCA |--0-0*|Rotate Right Circular|A=->A |
506 ;|RRD |**0P0-|Rotate Right 4 bits |{A,[HL]}=->{A,[HL]} ##|
507 ;|RST p |------|Restart | (p=0H,8H,10H,...,38H)|
508 ;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY |
509 ;|SBC HL,ss |**?V1*|Subtract with Carry |HL=HL-ss-CY |
510 ;|SCF |--0-01|Set Carry Flag |CY=1 |
511 ;|SET b,m |------|Set bit |m=mv{2^b} |
512 ;|SLA m |**0P0*|Shift Left Arithmetic|m=m*2 |
513 ;|SRA m |**0P0*|Shift Right Arith. |m=m/2 |
514 ;|SRL m |**0P0*|Shift Right Logical |m=->{0,m,CY} |
515 ;|SUB s |***V1*|Subtract |A=A-s |
516 ;|XOR s |**0P00|Logical Exclusive OR |A=Axs |
517 ;|----------+------+--------------------------------------------|
518 ;| F |-*01? |Flag unaffected/affected/reset/set/unknown |
519 ;| S |S |Sign flag (Bit 7) |
520 ;| Z | Z |Zero flag (Bit 6) |
521 ;| HC | H |Half Carry flag (Bit 4) |
522 ;| P/V | P |Parity/Overflow flag (Bit 2, V=overflow) |
523 ;| N | N |Add/Subtract flag (Bit 1) |
524 ;| CY | C|Carry flag (Bit 0) |
525 ;|-----------------+--------------------------------------------|
526 ;| n |Immediate addressing |
527 ;| nn |Immediate extended addressing |
528 ;| e |Relative addressing (PC=PC+2+offset) |
529 ;| [nn] |Extended addressing |
530 ;| [xx+d] |Indexed addressing |
531 ;| r |Register addressing |
532 ;| [rr] |Register indirect addressing |
533 ;| |Implied addressing |
534 ;| b |Bit addressing |
535 ;| p |Modified page zero addressing (see RST) |
536 ;|-----------------+--------------------------------------------|
537 ;|DEFB n(,...) |Define Byte(s) |
538 ;|DEFB 'str'(,...) |Define Byte ASCII string(s) |
539 ;|DEFS nn |Define Storage Block |
540 ;|DEFW nn(,...) |Define Word(s) |
541 ;|-----------------+--------------------------------------------|
542 ;| A B C D E |Registers (8-bit) |
543 ;| AF BC DE HL |Register pairs (16-bit) |
544 ;| F |Flag register (8-bit) |
545 ;| I |Interrupt page address register (8-bit) |
546 ;| IX IY |Index registers (16-bit) |
547 ;| PC |Program Counter register (16-bit) |
548 ;| R |Memory Refresh register |
549 ;| SP |Stack Pointer register (16-bit) |
550 ;|-----------------+--------------------------------------------|
551 ;| b |One bit (0 to 7) |
552 ;| cc |Condition (C,M,NC,NZ,P,PE,PO,Z) |
553 ;| d |One-byte expression (-128 to +127) |
554 ;| dst |Destination s, ss, [BC], [DE], [HL], [nn] |
555 ;| e |One-byte expression (-126 to +129) |
556 ;| m |Any register r, [HL] or [xx+d] |
557 ;| n |One-byte expression (0 to 255) |
558 ;| nn |Two-byte expression (0 to 65535) |
559 ;| pp |Register pair BC, DE, IX or SP |
560 ;| qq |Register pair AF, BC, DE or HL |
561 ;| qq' |Alternative register pair AF, BC, DE or HL |
562 ;| r |Register A, B, C, D, E, H or L |
563 ;| rr |Register pair BC, DE, IY or SP |
564 ;| s |Any register r, value n, [HL] or [xx+d] |
565 ;| src |Source s, ss, [BC], [DE], [HL], nn, [nn] |
566 ;| ss |Register pair BC, DE, HL or SP |
567 ;| xx |Index register IX or IY |
568 ;|-----------------+--------------------------------------------|
569 ;| + - * / ^ |Add/subtract/multiply/divide/exponent |
570 ;| & ~ v x |Logical AND/NOT/inclusive OR/exclusive OR |
571 ;| <- -> |Rotate left/right |
572 ;| [ ] |Indirect addressing |
573 ;| [ ]+ -[ ] |Indirect addressing auto-increment/decrement|
574 ;| { } |Combination of operands |
575 ;| # |Also BC=BC-1,DE=DE-1 |
576 ;| ## |Only lower 4 bits of accumulator A used |
577 ;----------------------------------------------------------------
579 ;How the flags are supposed to work:
580 ;7 ZFL_S - Sign flag (=MSBit of result)
581 ;6 ZFL_Z - Zero flag. Is 1 when the result is 0
582 ;4 ZFL_H - Half-carry (carry from bit 3 to 4)
583 ;2 ZFL_P - Parity/2-complement Overflow
584 ;1 ZFL_N - Subtract - set if last op was a subtract
587 ;I sure hope I got the mapping between flags and instructions correct...
604 ;------------------------------------------------;
605 ; Load table value from flash indexed by source reg.
607 ; ldpmx dstreg,tablebase,indexreg
609 ; (6 words, 8 cycles)
612 ldi zh,high(@1*2) ; table must be page aligned
617 .macro do_z80_flags_V
619 bmov z_flags, ZFL_P, temp, AVR_V
623 .macro do_z80_flags_set_N
625 ori z_flags, (1<<ZFL_N) ; Negation auf 1
629 .macro do_z80_flags_set_HN
631 ori z_flags,(1<<ZFL_N)|(1<<ZFL_H)
635 .macro do_z80_flags_clear_N
637 andi z_flags,~(1<<ZFL_N)
641 .macro do_z80_flags_clear_HN
643 andi z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
648 .macro do_z80_flags_copy_HC
650 bmov z_flags, ZFL_H, z_flags, ZFL_H
654 .macro do_z80_flags_op_rotate
655 ; must not change avr carry flag!
657 andi z_flags, ~( (1<<ZFL_H) | (1<<ZFL_N) | (1<<ZFL_C) )
659 andi z_flags, ~( (1<<ZFL_C) )
663 .macro do_z80_flags_op_and
665 ori z_flags,(1<<ZFL_H)
669 .macro do_z80_flags_op_or
676 ;----------------------------------------------------------------
681 printstring "Invalid opcode! "
689 ;----------------------------------------------------------------
690 ;|Mnemonic |SZHPNC|Description |Notes |
691 ;----------------------------------------------------------------
692 ;|OUT [n],A |------|Output |[n]=A |
695 ;Interface with peripherials goes here :)
696 do_op_outa: ; out (opl),a
699 printstring "Port write: "
712 ;----------------------------------------------------------------
713 ;|Mnemonic |SZHPNC|Description |Notes |
714 ;----------------------------------------------------------------
715 ;|IN A,[n] |------|Input |A=[n] |
718 do_op_in: ; in a,(opl)
721 printstring "Port read: ("
737 ;----------------------------------------------------------------
738 ;|Mnemonic |SZHPNC|Description |Notes |
739 ;----------------------------------------------------------------
740 ;|INC r |***V0-|Increment |r=r+1 |
741 ;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
742 ;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
743 ;|----------|SZHP C|---------- 8080 ----------------------------|
744 ;|INC r |**-P0-|Increment |r=r+1 |
745 ;|INC [HL] |**-P0-|Increment |[HL]=[HL]+1 |
752 andi z_flags,(1<<ZFL_C) ; preserve C-flag
753 ldpmx temp2, sz53p_tab, opl
755 bmov z_flags, ZFL_H, temp, AVR_H
763 andi z_flags,(1<<ZFL_C) ; preserve C-flag
764 ldpmx temp2, sz53p_tab, z_a
766 bmov z_flags, ZFL_H, temp, AVR_H
770 ;----------------------------------------------------------------
771 ;|Mnemonic |SZHPNC|Description |Notes |
772 ;----------------------------------------------------------------
773 ;|DEC r |***V1-|Decrement |s=s-1 |
774 ;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
775 ;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
776 ;|----------|SZHP C|---------- 8080 ----------------------------|
777 ;|DEC r |**-P -|Increment |r=r+1 |
778 ;|DEC [HL] |**-P -|Increment |[HL]=[HL]+1 |
784 andi z_flags,(1<<ZFL_C) ; preserve C-flag
785 ldpmx temp2, sz53p_tab, opl
787 bmov z_flags, ZFL_H, temp, AVR_H
796 andi z_flags,(1<<ZFL_C) ; preserve C-flag
797 ldpmx temp2, sz53p_tab, z_a
799 bmov z_flags, ZFL_H, temp, AVR_H
804 ;----------------------------------------------------------------
805 ;|Mnemonic |SZHPNC|Description |Notes |
806 ;----------------------------------------------------------------
807 ;|INC xx |------|Increment |xx=xx+1 |
808 ;|INC ss |------|Increment |ss=ss+1 |
816 ;----------------------------------------------------------------
817 ;|Mnemonic |SZHPNC|Description |Notes |
818 ;----------------------------------------------------------------
819 ;|DEC xx |------|Decrement |xx=xx-1 |
820 ;|DEC ss |------|Decrement |ss=ss-1 |
828 ;----------------------------------------------------------------
829 ;|Mnemonic |SZHPNC|Description |Notes |
830 ;----------------------------------------------------------------
831 ;|RLCA |--0-0*|Rotate Left Circular |A=A<- |
832 ;|----------|SZHP C|---------- 8080 ----------------------------|
833 ;|RLCA |---- *|Rotate Left Circular |A=A<- |
837 ;Rotate Left Cyclical. All bits move 1 to the
838 ;left, the msb becomes c and lsb.
839 do_z80_flags_op_rotate
844 ori z_flags, (1<<ZFL_C)
848 ;----------------------------------------------------------------
849 ;|Mnemonic |SZHPNC|Description |Notes |
850 ;----------------------------------------------------------------
851 ;|RRCA |--0-0*|Rotate Right Circular|A=->A |
852 ;|----------|SZHP C|---------- 8080 ----------------------------|
853 ;|RRCA |---- *|Rotate Right Circular|A=->A |
857 ;Rotate Right Cyclical. All bits move 1 to the
858 ;right, the lsb becomes c and msb.
859 do_z80_flags_op_rotate
864 ori z_flags, (1<<ZFL_C)
868 ;----------------------------------------------------------------
869 ;|Mnemonic |SZHPNC|Description |Notes |
870 ;----------------------------------------------------------------
871 ;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} |
872 ;|----------|SZHP C|---------- 8080 ----------------------------|
873 ;|RRA |---- *|Rotate Right Acc. |A=->{CY,A} |
877 ;Rotate Right. All bits move 1 to the right, the lsb
878 ;becomes c, c becomes msb.
879 clc ; get z80 carry to avr carry
882 do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C)
883 bmov z_flags,ZFL_C, z_a,0 ; Bit 0 --> CY
887 ;----------------------------------------------------------------
888 ;|Mnemonic |SZHPNC|Description |Notes |
889 ;----------------------------------------------------------------
890 ;|RLA |--0-0*|Rotate Left Acc. |A={CY,A}<- |
891 ;|----------|SZHP C|---------- 8080 ----------------------------|
892 ;|RLA |---- *|Rotate Left Acc. |A={CY,A}<- |
896 ;Rotate Left. All bits move 1 to the left, the msb
897 ;becomes c, c becomes lsb.
901 do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C)
902 bmov z_flags,ZFL_C, z_a,7 ; Bit 7 --> CY
906 ;----------------------------------------------------------------
907 ;|Mnemonic |SZHPNC|Description |Notes |
908 ;----------------------------------------------------------------
909 ;|ADD A,s |***V0*|Add |A=A+s |
910 ;|----------|SZHP C|---------- 8080 ----------------------------|
911 ;|ADD A,s |***P *|Add |A=A+s |
917 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P flag
918 bmov z_flags,ZFL_C, temp,AVR_C
919 bmov z_flags,ZFL_H, temp,AVR_H
923 ;----------------------------------------------------------------
924 ;|Mnemonic |SZHPNC|Description |Notes |
925 ;----------------------------------------------------------------
926 ;|ADC A,s |***V0*|Add with Carry |A=A+s+CY |
927 ;|----------|SZHP C|---------- 8080 ----------------------------|
928 ;|ADC A,s |***P *|Add with Carry |A=A+s+CY |
937 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
938 bmov z_flags,ZFL_C, temp,AVR_C
939 bmov z_flags,ZFL_H, temp,AVR_H
943 ;----------------------------------------------------------------
944 ;|Mnemonic |SZHPNC|Description |Notes |
945 ;----------------------------------------------------------------
946 ;|SUB s |***V1*|Subtract |A=A-s |
947 ;|----------|SZHP C|---------- 8080 ----------------------------|
948 ;|SUB s |***P *|Subtract |A=A-s |
954 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
955 bmov z_flags,ZFL_C, temp,AVR_C
956 bmov z_flags,ZFL_H, temp,AVR_H
961 ;----------------------------------------------------------------
962 ;|Mnemonic |SZHPNC|Description |Notes |
963 ;----------------------------------------------------------------
964 ;|CP s |***V1*|Compare |A-s |
965 ;|----------|SZHP C|---------- 8080 ----------------------------|
966 ;|CP s |***P *|Compare |A-s |
973 ldpmx z_flags,sz53p_tab,temp2 ;S,Z,P
974 bmov z_flags,ZFL_C, temp,AVR_C
975 bmov z_flags,ZFL_H, temp,AVR_H
980 ;----------------------------------------------------------------
981 ;|Mnemonic |SZHPNC|Description |Notes |
982 ;----------------------------------------------------------------
983 ;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY |
984 ;|----------|SZHP C|---------- 8080 ----------------------------|
985 ;|SBC A,s |***P *|Subtract with Carry |A=A-s-CY |
994 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
995 bmov z_flags,ZFL_C, temp,AVR_C
996 bmov z_flags,ZFL_H, temp,AVR_H
1001 ;----------------------------------------------------------------
1002 ;|Mnemonic |SZHPNC|Description |Notes |
1003 ;----------------------------------------------------------------
1004 ;|AND s |**1P00|Logical AND |A=A&s |
1005 ;|----------|SZHP C|---------- 8080 ----------------------------|
1006 ;|AND s |**-P 0|Logical AND |A=A&s |
1011 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P,N,C
1016 ;----------------------------------------------------------------
1017 ;|Mnemonic |SZHPNC|Description |Notes |
1018 ;----------------------------------------------------------------
1019 ;|OR s |**0P00|Logical inclusive OR |A=Avs |
1020 ;|----------|SZHP C|---------- 8080 ----------------------------|
1021 ;|OR s |**-P00|Logical inclusive OR |A=Avs |
1026 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C
1030 ;----------------------------------------------------------------
1031 ;|Mnemonic |SZHPNC|Description |Notes |
1032 ;----------------------------------------------------------------
1033 ;|XOR s |**0P00|Logical Exclusive OR |A=Axs |
1034 ;|----------|SZHP C|---------- 8080 ----------------------------|
1035 ;|XOR s |**-P 0|Logical Exclusive OR |A=Axs |
1040 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C
1044 ;----------------------------------------------------------------
1045 ;|Mnemonic |SZHPNC|Description |Notes |
1046 ;----------------------------------------------------------------
1047 ;|ADD HL,ss |--?-0*|Add |HL=HL+ss |
1048 ;|----------|SZHP C|---------- 8080 ----------------------------|
1049 ;|ADD HL,ss |---- *|Add |HL=HL+ss |
1058 bmov z_flags,ZFL_H, temp,AVR_H
1059 bmov z_flags,ZFL_C, temp,AVR_C
1060 do_z80_flags_clear_N
1063 ;----------------------------------------------------------------
1064 ;|Mnemonic |SZHPNC|Description |Notes |
1065 ;----------------------------------------------------------------
1066 ;|LD dst,src|------|Load |dst=src |
1069 do_op_sthl: ;store hl to mem loc in opl:h
1078 ;----------------------------------------------------------------
1079 ;|Mnemonic |SZHPNC|Description |Notes |
1080 ;----------------------------------------------------------------
1081 ;|LD dst,src|------|Load |dst=src |
1091 ;----------------------------------------------------------------
1092 ;|Mnemonic |SZHPNC|Description |Notes |
1093 ;----------------------------------------------------------------
1094 ;|LD dst,src|------|Load |dst=src |
1101 ;----------------------------------------------------------------
1102 ;|Mnemonic |SZHPNC|Description |Notes |
1103 ;----------------------------------------------------------------
1104 ;|DAA |***P-*|Decimal Adjust Acc. | |
1105 ;|----------|SZHP C|---------- 8080 ----------------------------|
1109 ; Description (http://www.z80.info/z80syntx.htm#DAA):
1110 ; This instruction conditionally adjusts the accumulator for BCD addition
1111 ; and subtraction operations. For addition (ADD, ADC, INC) or subtraction
1112 ; (SUB, SBC, DEC, NEC), the following table indicates the operation performed:
1114 ; -------------------------------------------------------------------
1115 ; | |C Flag |HEX value in|H Flag |HEX val in | Number |C flag |
1116 ; | Oper |Before |upper digit |Before |lower digit| added |After |
1117 ; | |DAA |(bit 7-4) |DAA |(bit 3-0) | to A |DAA |
1118 ; |-------+-------+------------+-------+-----------+--------+-------|
1119 ; | | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
1120 ; | ADD | 0 | 0-8 | 0 | A-F | 06 | 0 |
1121 ; | | 0 | 0-9 | 1 | 0-3 | 06 | 0 |
1122 ; | ADC | 0 | A-F | 0 | 0-9 | 60 | 1 |
1123 ; | | 0 | 9-F | 0 | A-F | 66 | 1 |
1124 ; | INC | 0 | A-F | 1 | 0-3 | 66 | 1 |
1125 ; | | 1 | 0-2 | 0 | 0-9 | 60 | 1 |
1126 ; | | 1 | 0-2 | 0 | A-F | 66 | 1 |
1127 ; | | 1 | 0-3 | 1 | 0-3 | 66 | 1 |
1128 ; |-------+-------+------------+-------+-----------+--------+-------|
1129 ; | SUB | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
1130 ; | SBC | 0 | 0-8 | 1 | 6-F | FA | 0 |
1131 ; | DEC | 1 | 7-F | 0 | 0-9 | A0 | 1 |
1132 ; | NEG | 1 | 6-F | 1 | 6-F | 9A | 1 |
1133 ; -------------------------------------------------------------------
1135 ; The H flag is affected as follows:
1137 ; ---------------------
1138 ; | N | H | low |H' |
1140 ; |---+---+-------+---|
1141 ; | 0 | * | 0-9 | 0 |
1142 ; | 0 | * | a-f | 1 |
1144 ; | 1 | 1 | 6-f | 0 |
1145 ; | 1 | 1 | 0-5 | 1 |
1146 ; ---------------------
1150 ; P/V: Set if Acc. is even parity after operation, reset otherwise.
1151 ; Z: Set if Acc. is Zero after operation, reset otherwise.
1152 ; S: Set if most significant bit of Acc. is 1 after operation, reset otherwise.
1159 sbrc z_flags,ZFL_N ;if add-op
1160 rjmp op_da_sub ;then
1164 ldi temp2,0 ; new C and H flag
1165 sbrc z_flags,ZFL_H ; |
1166 rjmp op_da_a01 ; if (H flag ...
1169 cpi temp,0x0a ; or (lower nibble >= 0x0A))
1172 ldi oph,0x06 ; add 6 to lower nibble
1175 ori temp2,(1<<ZFL_H) ; set new H flag
1178 ori temp2,(1<<ZFL_C) ; set new H flag
1180 sbrc z_flags,ZFL_C ; |
1181 rjmp op_da_a12 ; if (C flag ...
1182 cpi opl,0xA0 ; |... or upper nibble >= 0xA0)
1185 ldi oph,0x60 ; add 6 to lower nibble
1187 ori temp2,(1<<ZFL_C) ; set new C flag
1189 ldpmx z_flags, sz53p_tab, opl ; get S,Z,P flag
1190 or z_flags,temp2 ; merge new C and H flag
1195 op_da_sub: ;else (sub-op)
1196 rcall do_op_inv ; TODO: !
1203 ldi temp2,0 ;new C and H flag
1204 ldi oph,0 ;oph: what to add
1206 sbrc z_flags,ZFL_N ;if add-op
1207 rjmp op_da_sub ;then
1211 cpi temp,0x0a ; if (lower nibble >= 0x0A)
1213 ori oph,0x06 ; add 6
1214 ori temp2,(1<<ZFL_H) ; set new H flag
1216 sbrc z_flags,ZFL_C ; |
1217 rjmp op_da_a02 ; if (C flag ...
1218 cpi opl,0x90 ; |... or upper nibble >= 0x90)
1221 ori oph,0x60 ; add 0x60
1222 ori temp2,(1<<ZFL_C) ; set new C flag
1225 op_da_a10: ; else (lower nibble is 0x09 or lower)
1226 sbrc z_flags,ZFL_C ; |
1227 rjmp op_da_a12 ; if (C flag ...
1228 cpi opl,0xA0 ; |... or upper nibble >= 0xA0)
1231 ori oph,0x60 ; add 0x60
1232 ori temp2,(1<<ZFL_C) ; set new C flag
1234 sbrs z_flags,ZFL_H ; if (H flag)
1236 ori oph,0x06 ; add 0x06
1239 cpi temp,0x06 ; if (lower nibble >= 0x0A)
1241 ori temp2,(1<<ZFL_H) ; set new H flag
1246 ldpmx z_flags, sz53p_tab, opl ; get S,Z,P flag
1247 or z_flags,temp2 ; merge new C and H flag
1250 op_da_sub: ;else (sub-op)
1251 rcall do_op_inv ; TODO: !
1256 ;----------------------------------------------------------------
1257 ;|Mnemonic |SZHPNC|Description |Notes |
1258 ;----------------------------------------------------------------
1259 ;|SCF |--0-01|Set Carry Flag |CY=1 |
1260 ;|----------|SZHP C|---------- 8080 ----------------------------|
1264 do_z80_flags_clear_HN
1265 ori z_flags,(1<<ZFL_C)
1268 ;----------------------------------------------------------------
1269 ;|Mnemonic |SZHPNC|Description |Notes |
1270 ;----------------------------------------------------------------
1271 ;|CCF |--?-0*|Complement Carry Flag|CY=~CY, HC=previous CY|
1272 ;|----------|SZHP C|---------- 8080 ----------------------------|
1273 ;|CCF |---- 1|Set Carry Flag |CY=1 |
1276 do_z80_flags_clear_N
1277 do_z80_flags_copy_HC
1282 ;----------------------------------------------------------------
1283 ;|Mnemonic |SZHPNC|Description |Notes |
1284 ;----------------------------------------------------------------
1285 ;|CPL |--1-1-|Complement |A=~A |
1286 ;|----------|SZHP C|---------- 8080 ----------------------------|
1287 ;|CPL |---- -|Complement |A=~A |
1296 ;----------------------------------------------------------------
1297 ;|Mnemonic |SZHPNC|Description |Notes |
1298 ;----------------------------------------------------------------
1299 ;|PUSH xx |------|Push |-[SP]=xx |
1300 ;|PUSH qq |------|Push |-[SP]=qq |
1313 printstring "Stack push "
1316 printstring ", SP is now "
1324 ;----------------------------------------------------------------
1325 ;|Mnemonic |SZHPNC|Description |Notes |
1326 ;----------------------------------------------------------------
1327 ;|POP xx |------|Pop |xx=[SP]+ |
1328 ;|POP qq |------|Pop |qq=[SP]+ |
1341 printstring "Stack pop "
1344 printstring ", SP is now "
1351 ;----------------------------------------------------------------
1352 ;|Mnemonic |SZHPNC|Description |Notes |
1353 ;----------------------------------------------------------------
1354 ;|EX [SP],HL|------|Exchange |[SP]<->HL |
1355 ;|EX DE,HL |------|Exchange |DE<->HL |
1356 ;-----------------------------Z80--------------------------------
1366 ;----------------------------------------------------------------
1367 ;|Mnemonic |SZHPNC|Description |Notes |
1368 ;----------------------------------------------------------------
1370 ; TODO: Implement IFF1, IFF2
1374 ;----------------------------------------------------------------
1375 ;|Mnemonic |SZHPNC|Description |Notes |
1376 ;----------------------------------------------------------------
1378 ; TODO: Implement IFF1, IFF2
1382 ;----------------------------------------------------------------
1383 ;|Mnemonic |SZHPNC|Description |Notes |
1384 ;----------------------------------------------------------------
1385 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1386 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1387 ;|RET cc |------|Conditional Return |If cc RET |
1394 pop temp ; direkt zuruech zu main
1397 ;----------------------------------------------------------------
1398 ;|Mnemonic |SZHPNC|Description |Notes |
1399 ;----------------------------------------------------------------
1400 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1401 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1402 ;|RET cc |------|Conditional Return |If cc RET |
1409 pop temp ; direkt zuruech zu main
1412 ;----------------------------------------------------------------
1413 ;|Mnemonic |SZHPNC|Description |Notes |
1414 ;----------------------------------------------------------------
1415 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1416 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1417 ;|RET cc |------|Conditional Return |If cc RET |
1424 pop temp ; direkt zuruech zu main
1427 ;----------------------------------------------------------------
1428 ;|Mnemonic |SZHPNC|Description |Notes |
1429 ;----------------------------------------------------------------
1430 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1431 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1432 ;|RET cc |------|Conditional Return |If cc RET |
1439 pop temp ; direkt zuruech zu main
1442 ;----------------------------------------------------------------
1443 ;|Mnemonic |SZHPNC|Description |Notes |
1444 ;----------------------------------------------------------------
1445 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1446 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1447 ;|RET cc |------|Conditional Return |If cc RET |
1454 pop temp ; direkt zuruech zu main
1457 ;----------------------------------------------------------------
1458 ;|Mnemonic |SZHPNC|Description |Notes |
1459 ;----------------------------------------------------------------
1460 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1461 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1462 ;|RET cc |------|Conditional Return |If cc RET |
1469 pop temp ; direkt zuruech zu main
1472 ;----------------------------------------------------------------
1473 ;|Mnemonic |SZHPNC|Description |Notes |
1474 ;----------------------------------------------------------------
1475 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1476 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1477 ;|RET cc |------|Conditional Return |If cc RET |
1480 do_op_ifp: ;sign positive, aka s=0
1484 pop temp ; direkt zuruech zu main
1487 ;----------------------------------------------------------------
1488 ;|Mnemonic |SZHPNC|Description |Notes |
1489 ;----------------------------------------------------------------
1490 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1491 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1492 ;|RET cc |------|Conditional Return |If cc RET |
1495 do_op_ifm: ;sign negative, aka s=1
1499 pop temp ; direkt zuruech zu main
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
1513 instr do_fetch_nop, op_nop, do_store_nop ;00 ;NOP
1514 instr do_fetch_DIR16, op_nop, do_store_BC ;01 nn nn ;LD BC,nn
1515 instr do_fetch_nop, op_nop, do_store_MBC ;02 ;LD (BC),A
1516 instr do_fetch_BC, op_INC16, do_store_BC ;03 ;INC BC
1517 instr do_fetch_B, op_INC, do_store_B ;04 ;INC B
1518 instr do_fetch_B, op_DEC, do_store_B ;05 ;DEC B
1519 instr do_fetch_DIR8, op_nop, do_store_B ;06 ;LD B,n
1520 instr do_fetch_nop, op_RLCA, do_store_nop ;07 ;RLCA
1521 instr do_fetch_nop, op_INV, do_store_nop ;08 ;EX AF,AF'
1522 instr do_fetch_BC, op_ADDHL, do_store_HL ;09 ;ADD HL,BC
1523 instr do_fetch_MBC, op_nop, do_store_nop ;0A ;LD A,(BC)
1524 instr do_fetch_BC, op_DEC16, do_store_BC ;0B ;DEC BC
1525 instr do_fetch_C, op_INC, do_store_C ;0C ;INC C
1526 instr do_fetch_C, op_DEC, do_store_C ;0D ;DEC C
1527 instr do_fetch_DIR8, op_nop, do_store_C ;0E nn ;LD C,n
1528 instr do_fetch_nop, op_RRCA, do_store_nop ;0F ;RRCA
1529 instr do_fetch_nop, op_INV, do_store_nop ;10 oo ;DJNZ o
1530 instr do_fetch_DIR16, op_nop, do_store_DE ;11 nn nn ;LD DE,nn
1531 instr do_fetch_nop, op_nop, do_store_MDE ;12 ;LD (DE),A
1532 instr do_fetch_DE, op_INC16, do_store_DE ;13 ;INC DE
1533 instr do_fetch_D, op_INC, do_store_D ;14 ;INC D
1534 instr do_fetch_D, op_DEC, do_store_D ;15 ;DEC D
1535 instr do_fetch_DIR8, op_nop, do_store_D ;16 nn ;LD D,n
1536 instr do_fetch_nop, op_RLA, do_store_nop ;17 ;RLA
1537 instr do_fetch_nop, op_INV, do_store_nop ;18 oo ;JR o
1538 instr do_fetch_DE, op_ADDHL, do_store_HL ;19 ;ADD HL,DE
1539 instr do_fetch_MDE, op_nop, do_store_nop ;1A ;LD A,(DE)
1540 instr do_fetch_DE, op_DEC16, do_store_DE ;1B ;DEC DE
1541 instr do_fetch_E, op_INC, do_store_E ;1C ;INC E
1542 instr do_fetch_E, op_DEC, do_store_E ;1D ;DEC E
1543 instr do_fetch_DIR8, op_nop, do_store_E ;1E nn ;LD E,n
1544 instr do_fetch_nop, op_RRA, do_store_nop ;1F ;RRA
1545 instr do_fetch_nop, op_INV, do_store_nop ;20 oo ;JR NZ,o
1546 instr do_fetch_DIR16, op_nop, do_store_HL ;21 nn nn ;LD HL,nn
1547 instr do_fetch_DIR16, op_STHL, do_store_nop ;22 nn nn ;LD (nn),HL
1548 instr do_fetch_HL, op_INC16, do_store_HL ;23 ;INC HL
1549 instr do_fetch_H, op_INC, do_store_H ;24 ;INC H
1550 instr do_fetch_H, op_DEC, do_store_H ;25 ;DEC H
1551 instr do_fetch_DIR8, op_nop, do_store_H ;26 nn ;LD H,n
1552 instr do_fetch_A, op_DA, do_store_A ;27 ;DAA
1553 instr do_fetch_nop, op_INV, do_store_nop ;28 oo ;JR Z,o
1554 instr do_fetch_HL, op_ADDHL, do_store_HL ;29 ;ADD HL,HL
1555 instr do_fetch_DIR16, op_RMEM16, do_store_HL ;2A nn nn ;LD HL,(nn)
1556 instr do_fetch_HL, op_DEC16, do_store_HL ;2B ;DEC HL
1557 instr do_fetch_L, op_INC, do_store_L ;2C ;INC L
1558 instr do_fetch_L, op_DEC, do_store_L ;2D ;DEC L
1559 instr do_fetch_DIR8, op_nop, do_store_L ;2E nn ;LD L,n
1560 instr do_fetch_nop, op_CPL, do_store_nop ;2F ;CPL
1561 instr do_fetch_nop, op_INV, do_store_nop ;30 oo ;JR NC,o
1562 instr do_fetch_DIR16, op_nop, do_store_SP ;31 nn nn ;LD SP,nn
1563 instr do_fetch_DIR16, op_nop, do_store_AM ;32 nn nn ;LD (nn),A
1564 instr do_fetch_SP, op_INC16, do_store_SP ;33 ;INC SP
1565 instr do_fetch_MHL, op_INC, do_store_MHL ;34 ;INC (HL)
1566 instr do_fetch_MHL, op_DEC, do_store_MHL ;35 ;DEC (HL)
1567 instr do_fetch_DIR8, op_nop, do_store_MHL ;36 nn ;LD (HL),n
1568 instr do_fetch_nop, op_SCF, do_store_nop ;37 ;SCF
1569 instr do_fetch_nop, op_INV, do_store_nop ;38 oo ;JR C,o
1570 instr do_fetch_SP, op_ADDHL, do_store_HL ;39 ;ADD HL,SP
1571 instr do_fetch_DIR16, op_RMEM8, do_store_A ;3A nn nn ;LD A,(nn)
1572 instr do_fetch_SP, op_DEC16, do_store_SP ;3B ;DEC SP
1573 instr do_fetch_nop, op_INCA, do_store_nop ;3C ;INC A
1574 instr do_fetch_nop, op_DECA, do_store_nop ;3D ;DEC A
1575 instr do_fetch_DIR8, op_nop, do_store_A ;3E nn ;LD A,n
1576 instr do_fetch_nop, op_CCF, do_store_nop ;3F ;CCF (Complement Carry Flag, gvd)
1577 instr do_fetch_nop, op_nop, do_store_nop ;40 ;LD B,B
1578 instr do_fetch_C, op_nop, do_store_B ;41 ;LD B,C
1579 instr do_fetch_D, op_nop, do_store_B ;42 ;LD B,D
1580 instr do_fetch_E, op_nop, do_store_B ;43 ;LD B,E
1581 instr do_fetch_H, op_nop, do_store_B ;44 ;LD B,H
1582 instr do_fetch_L, op_nop, do_store_B ;45 ;LD B,L
1583 instr do_fetch_MHL, op_nop, do_store_B ;46 ;LD B,(HL)
1584 instr do_fetch_A, op_nop, do_store_B ;47 ;LD B,A
1585 instr do_fetch_B, op_nop, do_store_C ;48 ;LD C,B
1586 instr do_fetch_nop, op_nop, do_store_nop ;49 ;LD C,C
1587 instr do_fetch_D, op_nop, do_store_C ;4A ;LD C,D
1588 instr do_fetch_E, op_nop, do_store_C ;4B ;LD C,E
1589 instr do_fetch_H, op_nop, do_store_C ;4C ;LD C,H
1590 instr do_fetch_L, op_nop, do_store_C ;4D ;LD C,L
1591 instr do_fetch_MHL, op_nop, do_store_C ;4E ;LD C,(HL)
1592 instr do_fetch_A, op_nop, do_store_C ;4F ;LD C,A
1593 instr do_fetch_B, op_nop, do_store_D ;50 ;LD D,B
1594 instr do_fetch_C, op_nop, do_store_D ;51 ;LD D,C
1595 instr do_fetch_nop, op_nop, do_store_nop ;52 ;LD D,D
1596 instr do_fetch_E, op_nop, do_store_D ;53 ;LD D,E
1597 instr do_fetch_H, op_nop, do_store_D ;54 ;LD D,H
1598 instr do_fetch_L, op_nop, do_store_D ;55 ;LD D,L
1599 instr do_fetch_MHL, op_nop, do_store_D ;56 ;LD D,(HL)
1600 instr do_fetch_A, op_nop, do_store_D ;57 ;LD D,A
1601 instr do_fetch_B, op_nop, do_store_E ;58 ;LD E,B
1602 instr do_fetch_C, op_nop, do_store_E ;59 ;LD E,C
1603 instr do_fetch_D, op_nop, do_store_E ;5A ;LD E,D
1604 instr do_fetch_nop, op_nop, do_store_nop ;5B ;LD E,E
1605 instr do_fetch_H, op_nop, do_store_E ;5C ;LD E,H
1606 instr do_fetch_L, op_nop, do_store_E ;5D ;LD E,L
1607 instr do_fetch_MHL, op_nop, do_store_E ;5E ;LD E,(HL)
1608 instr do_fetch_A, op_nop, do_store_E ;5F ;LD E,A
1609 instr do_fetch_B, op_nop, do_store_H ;60 ;LD H,B
1610 instr do_fetch_C, op_nop, do_store_H ;61 ;LD H,C
1611 instr do_fetch_D, op_nop, do_store_H ;62 ;LD H,D
1612 instr do_fetch_E, op_nop, do_store_H ;63 ;LD H,E
1613 instr do_fetch_nop, op_nop, do_store_nop ;64 ;LD H,H
1614 instr do_fetch_L, op_nop, do_store_H ;65 ;LD H,L
1615 instr do_fetch_MHL, op_nop, do_store_H ;66 ;LD H,(HL)
1616 instr do_fetch_A, op_nop, do_store_H ;67 ;LD H,A
1617 instr do_fetch_B, op_nop, do_store_L ;68 ;LD L,B
1618 instr do_fetch_C, op_nop, do_store_L ;69 ;LD L,C
1619 instr do_fetch_D, op_nop, do_store_L ;6A ;LD L,D
1620 instr do_fetch_E, op_nop, do_store_L ;6B ;LD L,E
1621 instr do_fetch_H, op_nop, do_store_L ;6C ;LD L,H
1622 instr do_fetch_nop, op_nop, do_store_nop ;6D ;LD L,L
1623 instr do_fetch_MHL, op_nop, do_store_L ;6E ;LD L,(HL)
1624 instr do_fetch_A, op_nop, do_store_L ;6F ;LD L,A
1625 instr do_fetch_B, op_nop, do_store_MHL ;70 ;LD (HL),B
1626 instr do_fetch_C, op_nop, do_store_MHL ;71 ;LD (HL),C
1627 instr do_fetch_D, op_nop, do_store_MHL ;72 ;LD (HL),D
1628 instr do_fetch_E, op_nop, do_store_MHL ;73 ;LD (HL),E
1629 instr do_fetch_H, op_nop, do_store_MHL ;74 ;LD (HL),H
1630 instr do_fetch_L, op_nop, do_store_MHL ;75 ;LD (HL),L
1631 instr do_fetch_nop, op_INV, do_store_nop ;76 ;HALT
1632 instr do_fetch_A, op_nop, do_store_MHL ;77 ;LD (HL),A
1633 instr do_fetch_b, op_nop, do_store_A ;78 ;LD A,B
1634 instr do_fetch_C, op_nop, do_store_A ;79 ;LD A,C
1635 instr do_fetch_D, op_nop, do_store_A ;7A ;LD A,D
1636 instr do_fetch_E, op_nop, do_store_A ;7B ;LD A,E
1637 instr do_fetch_H, op_nop, do_store_A ;7C ;LD A,H
1638 instr do_fetch_L, op_nop, do_store_A ;7D ;LD A,L
1639 instr do_fetch_MHL, op_nop, do_store_A ;7E ;LD A,(HL)
1640 instr do_fetch_nop, op_nop, do_store_nop ;7F ;LD A,A
1641 instr do_fetch_B, op_ADDA, do_store_nop ;80 ;ADD A,B
1642 instr do_fetch_C, op_ADDA, do_store_nop ;81 ;ADD A,C
1643 instr do_fetch_D, op_ADDA, do_store_nop ;82 ;ADD A,D
1644 instr do_fetch_E, op_ADDA, do_store_nop ;83 ;ADD A,E
1645 instr do_fetch_H, op_ADDA, do_store_nop ;84 ;ADD A,H
1646 instr do_fetch_L, op_ADDA, do_store_nop ;85 ;ADD A,L
1647 instr do_fetch_MHL, op_ADDA, do_store_nop ;86 ;ADD A,(HL)
1648 instr do_fetch_A, op_ADDA, do_store_nop ;87 ;ADD A,A
1649 instr do_fetch_B, op_ADCA, do_store_nop ;88 ;ADC A,B
1650 instr do_fetch_C, op_ADCA, do_store_nop ;89 ;ADC A,C
1651 instr do_fetch_D, op_ADCA, do_store_nop ;8A ;ADC A,D
1652 instr do_fetch_E, op_ADCA, do_store_nop ;8B ;ADC A,E
1653 instr do_fetch_H, op_ADCA, do_store_nop ;8C ;ADC A,H
1654 instr do_fetch_L, op_ADCA, do_store_nop ;8D ;ADC A,L
1655 instr do_fetch_MHL, op_ADCA, do_store_nop ;8E ;ADC A,(HL)
1656 instr do_fetch_A, op_ADCA, do_store_nop ;8F ;ADC A,A
1657 instr do_fetch_B, op_SUBFA, do_store_nop ;90 ;SUB A,B
1658 instr do_fetch_C, op_SUBFA, do_store_nop ;91 ;SUB A,C
1659 instr do_fetch_D, op_SUBFA, do_store_nop ;92 ;SUB A,D
1660 instr do_fetch_E, op_SUBFA, do_store_nop ;93 ;SUB A,E
1661 instr do_fetch_H, op_SUBFA, do_store_nop ;94 ;SUB A,H
1662 instr do_fetch_L, op_SUBFA, do_store_nop ;95 ;SUB A,L
1663 instr do_fetch_MHL, op_SUBFA, do_store_nop ;96 ;SUB A,(HL)
1664 instr do_fetch_A, op_SUBFA, do_store_nop ;97 ;SUB A,A
1665 instr do_fetch_B, op_SBCFA, do_store_nop ;98 ;SBC A,B
1666 instr do_fetch_C, op_SBCFA, do_store_nop ;99 ;SBC A,C
1667 instr do_fetch_D, op_SBCFA, do_store_nop ;9A ;SBC A,D
1668 instr do_fetch_E, op_SBCFA, do_store_nop ;9B ;SBC A,E
1669 instr do_fetch_H, op_SBCFA, do_store_nop ;9C ;SBC A,H
1670 instr do_fetch_L, op_SBCFA, do_store_nop ;9D ;SBC A,L
1671 instr do_fetch_MHL, op_SBCFA, do_store_nop ;9E ;SBC A,(HL)
1672 instr do_fetch_A, op_SBCFA, do_store_nop ;9F ;SBC A,A
1673 instr do_fetch_B, op_ANDA, do_store_nop ;A0 ;AND A,B
1674 instr do_fetch_C, op_ANDA, do_store_nop ;A1 ;AND A,C
1675 instr do_fetch_D, op_ANDA, do_store_nop ;A2 ;AND A,D
1676 instr do_fetch_E, op_ANDA, do_store_nop ;A3 ;AND A,E
1677 instr do_fetch_H, op_ANDA, do_store_nop ;A4 ;AND A,H
1678 instr do_fetch_L, op_ANDA, do_store_nop ;A5 ;AND A,L
1679 instr do_fetch_MHL, op_ANDA, do_store_nop ;A6 ;AND A,(HL)
1680 instr do_fetch_A, op_ANDA, do_store_nop ;A7 ;AND A,A
1681 instr do_fetch_B, op_XORA, do_store_nop ;A8 ;XOR A,B
1682 instr do_fetch_C, op_XORA, do_store_nop ;A9 ;XOR A,C
1683 instr do_fetch_D, op_XORA, do_store_nop ;AA ;XOR A,D
1684 instr do_fetch_E, op_XORA, do_store_nop ;AB ;XOR A,E
1685 instr do_fetch_H, op_XORA, do_store_nop ;AC ;XOR A,H
1686 instr do_fetch_L, op_XORA, do_store_nop ;AD ;XOR A,L
1687 instr do_fetch_MHL, op_XORA, do_store_nop ;AE ;XOR A,(HL)
1688 instr do_fetch_A, op_XORA, do_store_nop ;AF ;XOR A,A
1689 instr do_fetch_B, op_ORA, do_store_nop ;B0 ;OR A,B
1690 instr do_fetch_C, op_ORA, do_store_nop ;B1 ;OR A,C
1691 instr do_fetch_D, op_ORA, do_store_nop ;B2 ;OR A,D
1692 instr do_fetch_E, op_ORA, do_store_nop ;B3 ;OR A,E
1693 instr do_fetch_H, op_ORA, do_store_nop ;B4 ;OR A,H
1694 instr do_fetch_L, op_ORA, do_store_nop ;B5 ;OR A,L
1695 instr do_fetch_MHL, op_ORA, do_store_nop ;B6 ;OR A,(HL)
1696 instr do_fetch_A, op_ORA, do_store_nop ;B7 ;OR A,A
1697 instr do_fetch_B, op_CPFA, do_store_nop ;B8 ;CP A,B
1698 instr do_fetch_C, op_CPFA, do_store_nop ;B9 ;CP A,C
1699 instr do_fetch_D, op_CPFA, do_store_nop ;BA ;CP A,D
1700 instr do_fetch_E, op_CPFA, do_store_nop ;BB ;CP A,E
1701 instr do_fetch_H, op_CPFA, do_store_nop ;BC ;CP A,H
1702 instr do_fetch_L, op_CPFA, do_store_nop ;BD ;CP A,L
1703 instr do_fetch_MHL, op_CPFA, do_store_nop ;BE ;CP A,(HL)
1704 instr do_fetch_A, op_CPFA, do_store_nop ;BF ;CP A,A
1705 instr do_fetch_nop, op_IFNZ, do_store_RET ;C0 ;RET NZ
1706 instr do_fetch_nop, op_POP16, do_store_BC ;C1 ;POP BC
1707 instr do_fetch_DIR16, op_IFNZ, do_store_PC ;C2 nn nn ;JP NZ,nn
1708 instr do_fetch_DIR16, op_nop, do_store_PC ;C3 nn nn ;JP nn
1709 instr do_fetch_DIR16, op_IFNZ, do_store_CALL ;C4 nn nn ;CALL NZ,nn
1710 instr do_fetch_BC, op_PUSH16, do_store_nop ;C5 ;PUSH BC
1711 instr do_fetch_DIR8, op_ADDA, do_store_nop ;C6 nn ;ADD A,n
1712 instr do_fetch_RST, op_nop, do_store_CALL ;C7 ;RST 0
1713 instr do_fetch_nop, op_IFZ, do_store_RET ;C8 ;RET Z
1714 instr do_fetch_nop, op_nop, do_store_RET ;C9 ;RET
1715 instr do_fetch_DIR16, op_IFZ, do_store_PC ;CA nn nn ;JP Z,nn
1716 instr do_fetch_nop, op_INV, do_store_nop ;CB ;(Z80 specific)
1717 instr do_fetch_DIR16, op_IFZ, do_store_CALL ;CC nn nn ;CALL Z,nn
1718 instr do_fetch_DIR16, op_nop, do_store_CALL ;CD nn nn ;CALL nn
1719 instr do_fetch_DIR8, op_ADCA, do_store_nop ;CE nn ;ADC A,n
1720 instr do_fetch_RST, op_nop, do_store_CALL ;CF ;RST 8H
1721 instr do_fetch_nop, op_IFNC, do_store_RET ;D0 ;RET NC
1722 instr do_fetch_nop, op_POP16, do_store_DE ;D1 ;POP DE
1723 instr do_fetch_DIR16, op_IFNC, do_store_PC ;D2 nn nn ;JP NC,nn
1724 instr do_fetch_DIR8, op_OUTA, do_store_nop ;D3 nn ;OUT (n),A
1725 instr do_fetch_DIR16, op_IFNC, do_store_CALL ;D4 nn nn ;CALL NC,nn
1726 instr do_fetch_DE, op_PUSH16, do_store_nop ;D5 ;PUSH DE
1727 instr do_fetch_DIR8, op_SUBFA, do_store_nop ;D6 nn ;SUB n
1728 instr do_fetch_RST, op_nop, do_store_CALL ;D7 ;RST 10H
1729 instr do_fetch_nop, op_IFC, do_store_RET ;D8 ;RET C
1730 instr do_fetch_nop, op_nop, do_store_nop ;D9 ;EXX
1731 instr do_fetch_DIR16, op_IFC, do_store_PC ;DA nn nn ;JP C,nn
1732 instr do_fetch_DIR8, op_IN, do_store_A ;DB nn ;IN A,(n)
1733 instr do_fetch_DIR16, op_IFC, do_store_CALL ;DC nn nn ;CALL C,nn
1734 instr do_fetch_nop, op_INV, do_store_nop ;DD ;(Z80 specific)
1735 instr do_fetch_DIR8, op_SBCFA, do_store_nop ;DE nn ;SBC A,n
1736 instr do_fetch_RST, op_nop, do_store_CALL ;DF ;RST 18H
1737 instr do_fetch_nop, op_IFPO, do_store_RET ;E0 ;RET PO
1738 instr do_fetch_nop, op_POP16, do_store_HL ;E1 ;POP HL
1739 instr do_fetch_DIR16, op_IFPO, do_store_PC ;E2 nn nn ;JP PO,nn
1740 instr do_fetch_MSP, op_EXHL, do_store_MSP ;E3 ;EX (SP),HL
1741 instr do_fetch_DIR16, op_IFPO, do_store_CALL ;E4 nn nn ;CALL PO,nn
1742 instr do_fetch_HL, op_PUSH16, do_store_nop ;E5 ;PUSH HL
1743 instr do_fetch_DIR8, op_ANDA, do_store_nop ;E6 nn ;AND n
1744 instr do_fetch_RST, op_nop, do_store_CALL ;E7 ;RST 20H
1745 instr do_fetch_nop, op_IFPE, do_store_RET ;E8 ;RET PE
1746 instr do_fetch_HL, op_nop, do_store_PC ;E9 ;JP HL
1747 instr do_fetch_DIR16, op_IFPE, do_store_PC ;EA nn nn ;JP PE,nn
1748 instr do_fetch_DE, op_EXHL, do_store_DE ;EB ;EX DE,HL
1749 instr do_fetch_DIR16, op_IFPE, do_store_CALL ;EC nn nn ;CALL PE,nn
1750 instr do_fetch_nop, op_INV, do_store_nop ;ED ;(Z80 specific)
1751 instr do_fetch_DIR8, op_XORA, do_store_nop ;EE nn ;XOR n
1752 instr do_fetch_RST, op_nop, do_store_CALL ;EF ;RST 28H
1753 instr do_fetch_nop, op_IFP, do_store_RET ;F0 ;RET P
1754 instr do_fetch_nop, op_POP16, do_store_AF ;F1 ;POP AF
1755 instr do_fetch_DIR16, op_IFP, do_store_PC ;F2 nn nn ;JP P,nn
1756 instr do_fetch_nop, op_DI, do_store_nop ;F3 ;DI
1757 instr do_fetch_DIR16, op_IFP, do_store_CALL ;F4 nn nn ;CALL P,nn
1758 instr do_fetch_AF, op_PUSH16, do_store_nop ;F5 ;PUSH AF
1759 instr do_fetch_DIR8, op_ORA, do_store_nop ;F6 nn ;OR n
1760 instr do_fetch_RST, op_nop, do_store_CALL ;F7 ;RST 30H
1761 instr do_fetch_nop, op_IFM, do_store_RET ;F8 ;RET M
1762 instr do_fetch_HL, op_nop, do_store_SP ;F9 ;LD SP,HL
1763 instr do_fetch_DIR16, op_IFM, do_store_PC ;FA nn nn ;JP M,nn
1764 instr do_fetch_nop, op_EI, do_store_nop ;FB ;EI
1765 instr do_fetch_DIR16, op_IFM, do_store_CALL ;FC nn nn ;CALL M,nn
1766 instr do_fetch_nop, op_INV, do_store_nop ;FD ;(Z80 specific)
1767 instr do_fetch_DIR8, op_CPFA, do_store_nop ;FE nn ;CP n
1768 instr do_fetch_RST, op_nop, do_store_CALL ;FF ;RST 38H
1771 ;----------------------------------------------------------------
1772 ; Lookup table, stolen from z80ex, Z80 emulation library.
1773 ; http://z80ex.sourceforge.net/
1775 ; The S, Z, 5 and 3 bits and the parity of the lookup value
1777 ; .org (PC+255) & 0xff00
1780 .db 0x44,0x00,0x00,0x04,0x00,0x04,0x04,0x00
1781 .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c
1782 .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04
1783 .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08
1784 .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24
1785 .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28
1786 .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20
1787 .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c
1788 .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04
1789 .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08
1790 .db 0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00
1791 .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c
1792 .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20
1793 .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c
1794 .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24
1795 .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28
1796 .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
1797 .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88
1798 .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80
1799 .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c
1800 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0
1801 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac
1802 .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4
1803 .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8
1804 .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80
1805 .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c
1806 .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
1807 .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88
1808 .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4
1809 .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8
1810 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0
1811 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac
1813 ; vim:set ts=8 noet nowrap