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/>.
27 ;--------------------------------------------------
28 ; Generate a table entry for one instruction
30 ; instr fetch, op, store
33 .db low(@2), low(do_@1), high(do_@1), low(@0)
50 ldi z_pcl,low (IPLADDR)
51 ldi z_pch,high(IPLADDR)
55 printstring "Ok, CPU is live!"
58 ;----------------------------------------------------------
60 ;.db (low)do_store (low)do_op (hihg)do_op (low)do_fetch
62 ;das kommt auf den stapel
63 ; main da solls zum schluss weitergehen
64 ;do_store wohin damit beenden mit RET
65 ;do_op was tun beenden mit RET
67 ;das wird direkt angesprungen
68 ;do_fetch woher beenden mit RET
74 cpi z_pch,DBG_TRACE_BOTTOM
76 cpi z_pch,DBG_TRACE_TOP
83 cpi z_pch,DBG_TRACE_BOTTOM
85 cpi z_pch,DBG_TRACE_TOP
101 ;hier kommt die Interruptbehandlung rein
103 ldi zl,low(main) ;da will ich wieder hin.
107 mem_read_s z_pc ;temp=memReadByte(z_pc)
109 ldi zl,low(todo_table*2) ;zhl=todo_table
110 ldi zh,high(todo_table*2) ;
115 ldi temp2,high(store_ops) ;
116 lpm temp,Z+ ;do_store
128 ldi zh,high(fetch_ops)
133 ; ------------ Fetch phase stuff -----------------
135 .org (PC+255) & 0xff00 ; wichtig !!!fetch und store muessen in einer page liegen
218 mem_read_ds opl, z_pc
223 mem_read_ds opl, z_pc
225 mem_read_ds oph, z_pc
237 ; ------------ Store phase stuff -----------------
239 .org (PC+255) & 0xff00 ; wichtig !!!fetch und store muessen in einer page liegen
335 printstring "Stack pop "
338 printstring ", SP is now "
355 printstring "Stack push "
358 printstring ", SP is now "
372 ; ------------ Operation phase stuff -----------------
374 ;----------------------------------------------------------------
378 ;| ZZZZZZZ 88888 000 |
384 ;| ZZZZZZZ 88888 000 |
386 ;| Z80 MICROPROCESSOR Instruction Set Summary |
388 ;----------------------------------------------------------------
389 ;----------------------------------------------------------------
390 ;|Mnemonic |SZHPNC|Description |Notes |
391 ;|----------+------+---------------------+----------------------|
392 ;|ADC A,s |***V0*|Add with Carry |A=A+s+CY |
393 ;|ADC HL,ss |**?V0*|Add with Carry |HL=HL+ss+CY |
394 ;|ADD A,s |***V0*|Add |A=A+s |
395 ;|ADD HL,ss |--?-0*|Add |HL=HL+ss |
396 ;|ADD IX,pp |--?-0*|Add |IX=IX+pp |
397 ;|ADD IY,rr |--?-0*|Add |IY=IY+rr |
398 ;|AND s |**1P00|Logical AND |A=A&s |
399 ;|BIT b,m |?*1?0-|Test Bit |m&{2^b} |
400 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
401 ;|CALL nn |------|Unconditional Call |-[SP]=PC,PC=nn |
402 ;|CCF |--?-0*|Complement Carry Flag|CY=~CY |
403 ;|CP s |***V1*|Compare |A-s |
404 ;|CPD |****1-|Compare and Decrement|A-[HL],HL=HL-1,BC=BC-1|
405 ;|CPDR |****1-|Compare, Dec., Repeat|CPD till A=[HL]or BC=0|
406 ;|CPI |****1-|Compare and Increment|A-[HL],HL=HL+1,BC=BC-1|
407 ;|CPIR |****1-|Compare, Inc., Repeat|CPI till A=[HL]or BC=0|
408 ;|CPL |--1-1-|Complement |A=~A |
409 ;|DAA |***P-*|Decimal Adjust Acc. |A=BCD format |
410 ;|DEC s |***V1-|Decrement |s=s-1 |
411 ;|DEC xx |------|Decrement |xx=xx-1 |
412 ;|DEC ss |------|Decrement |ss=ss-1 |
413 ;|DI |------|Disable Interrupts | |
414 ;|DJNZ e |------|Dec., Jump Non-Zero |B=B-1 till B=0 |
415 ;|EI |------|Enable Interrupts | |
416 ;|EX [SP],HL|------|Exchange |[SP]<->HL |
417 ;|EX [SP],xx|------|Exchange |[SP]<->xx |
418 ;|EX AF,AF' |------|Exchange |AF<->AF' |
419 ;|EX DE,HL |------|Exchange |DE<->HL |
420 ;|EXX |------|Exchange |qq<->qq' (except AF)|
421 ;|HALT |------|Halt | |
422 ;|IM n |------|Interrupt Mode | (n=0,1,2)|
423 ;|IN A,[n] |------|Input |A=[n] |
424 ;|IN r,[C] |***P0-|Input |r=[C] |
425 ;|INC r |***V0-|Increment |r=r+1 |
426 ;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
427 ;|INC xx |------|Increment |xx=xx+1 |
428 ;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
429 ;|INC ss |------|Increment |ss=ss+1 |
430 ;|IND |?*??1-|Input and Decrement |[HL]=[C],HL=HL-1,B=B-1|
431 ;|INDR |?1??1-|Input, Dec., Repeat |IND till B=0 |
432 ;|INI |?*??1-|Input and Increment |[HL]=[C],HL=HL+1,B=B-1|
433 ;|INIR |?1??1-|Input, Inc., Repeat |INI till B=0 |
434 ;|JP [HL] |------|Unconditional Jump |PC=[HL] |
435 ;|JP [xx] |------|Unconditional Jump |PC=[xx] |
436 ;|JP nn |------|Unconditional Jump |PC=nn |
437 ;|JP cc,nn |------|Conditional Jump |If cc JP |
438 ;|JR e |------|Unconditional Jump |PC=PC+e |
439 ;|JR cc,e |------|Conditional Jump |If cc JR(cc=C,NC,NZ,Z)|
440 ;|LD dst,src|------|Load |dst=src |
441 ;|LD A,i |**0*0-|Load |A=i (i=I,R)|
442 ;|LDD |--0*0-|Load and Decrement |[DE]=[HL],HL=HL-1,# |
443 ;|LDDR |--000-|Load, Dec., Repeat |LDD till BC=0 |
444 ;|LDI |--0*0-|Load and Increment |[DE]=[HL],HL=HL+1,# |
445 ;|LDIR |--000-|Load, Inc., Repeat |LDI till BC=0 |
446 ;|NEG |***V1*|Negate |A=-A |
447 ;|NOP |------|No Operation | |
448 ;|OR s |**0P00|Logical inclusive OR |A=Avs |
449 ;|OTDR |?1??1-|Output, Dec., Repeat |OUTD till B=0 |
450 ;|OTIR |?1??1-|Output, Inc., Repeat |OUTI till B=0 |
451 ;|OUT [C],r |------|Output |[C]=r |
452 ;|OUT [n],A |------|Output |[n]=A |
453 ;|OUTD |?*??1-|Output and Decrement |[C]=[HL],HL=HL-1,B=B-1|
454 ;|OUTI |?*??1-|Output and Increment |[C]=[HL],HL=HL+1,B=B-1|
455 ;|POP xx |------|Pop |xx=[SP]+ |
456 ;|POP qq |------|Pop |qq=[SP]+ |
457 ;|PUSH xx |------|Push |-[SP]=xx |
458 ;|PUSH qq |------|Push |-[SP]=qq |
459 ;|RES b,m |------|Reset bit |m=m&{~2^b} |
460 ;|RET |------|Return |PC=[SP]+ |
461 ;|RET cc |------|Conditional Return |If cc RET |
462 ;|RETI |------|Return from Interrupt|PC=[SP]+ |
463 ;|RETN |------|Return from NMI |PC=[SP]+ |
464 ;|RL m |**0P0*|Rotate Left |m={CY,m}<- |
465 ;|RLA |--0-0*|Rotate Left Acc. |A={CY,A}<- |
466 ;|RLC m |**0P0*|Rotate Left Circular |m=m<- |
467 ;|RLCA |--0-0*|Rotate Left Circular |A=A<- |
468 ;|RLD |**0P0-|Rotate Left 4 bits |{A,[HL]}={A,[HL]}<- ##|
469 ;|RR m |**0P0*|Rotate Right |m=->{CY,m} |
470 ;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} |
471 ;|RRC m |**0P0*|Rotate Right Circular|m=->m |
472 ;|RRCA |--0-0*|Rotate Right Circular|A=->A |
473 ;|RRD |**0P0-|Rotate Right 4 bits |{A,[HL]}=->{A,[HL]} ##|
474 ;|RST p |------|Restart | (p=0H,8H,10H,...,38H)|
475 ;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY |
476 ;|SBC HL,ss |**?V1*|Subtract with Carry |HL=HL-ss-CY |
477 ;|SCF |--0-01|Set Carry Flag |CY=1 |
478 ;|SET b,m |------|Set bit |m=mv{2^b} |
479 ;|SLA m |**0P0*|Shift Left Arithmetic|m=m*2 |
480 ;|SRA m |**0P0*|Shift Right Arith. |m=m/2 |
481 ;|SRL m |**0P0*|Shift Right Logical |m=->{0,m,CY} |
482 ;|SUB s |***V1*|Subtract |A=A-s |
483 ;|XOR s |**0P00|Logical Exclusive OR |A=Axs |
484 ;|----------+------+--------------------------------------------|
485 ;| F |-*01? |Flag unaffected/affected/reset/set/unknown |
486 ;| S |S |Sign flag (Bit 7) |
487 ;| Z | Z |Zero flag (Bit 6) |
488 ;| HC | H |Half Carry flag (Bit 4) |
489 ;| P/V | P |Parity/Overflow flag (Bit 2, V=overflow) |
490 ;| N | N |Add/Subtract flag (Bit 1) |
491 ;| CY | C|Carry flag (Bit 0) |
492 ;|-----------------+--------------------------------------------|
493 ;| n |Immediate addressing |
494 ;| nn |Immediate extended addressing |
495 ;| e |Relative addressing (PC=PC+2+offset) |
496 ;| [nn] |Extended addressing |
497 ;| [xx+d] |Indexed addressing |
498 ;| r |Register addressing |
499 ;| [rr] |Register indirect addressing |
500 ;| |Implied addressing |
501 ;| b |Bit addressing |
502 ;| p |Modified page zero addressing (see RST) |
503 ;|-----------------+--------------------------------------------|
504 ;|DEFB n(,...) |Define Byte(s) |
505 ;|DEFB 'str'(,...) |Define Byte ASCII string(s) |
506 ;|DEFS nn |Define Storage Block |
507 ;|DEFW nn(,...) |Define Word(s) |
508 ;|-----------------+--------------------------------------------|
509 ;| A B C D E |Registers (8-bit) |
510 ;| AF BC DE HL |Register pairs (16-bit) |
511 ;| F |Flag register (8-bit) |
512 ;| I |Interrupt page address register (8-bit) |
513 ;| IX IY |Index registers (16-bit) |
514 ;| PC |Program Counter register (16-bit) |
515 ;| R |Memory Refresh register |
516 ;| SP |Stack Pointer register (16-bit) |
517 ;|-----------------+--------------------------------------------|
518 ;| b |One bit (0 to 7) |
519 ;| cc |Condition (C,M,NC,NZ,P,PE,PO,Z) |
520 ;| d |One-byte expression (-128 to +127) |
521 ;| dst |Destination s, ss, [BC], [DE], [HL], [nn] |
522 ;| e |One-byte expression (-126 to +129) |
523 ;| m |Any register r, [HL] or [xx+d] |
524 ;| n |One-byte expression (0 to 255) |
525 ;| nn |Two-byte expression (0 to 65535) |
526 ;| pp |Register pair BC, DE, IX or SP |
527 ;| qq |Register pair AF, BC, DE or HL |
528 ;| qq' |Alternative register pair AF, BC, DE or HL |
529 ;| r |Register A, B, C, D, E, H or L |
530 ;| rr |Register pair BC, DE, IY or SP |
531 ;| s |Any register r, value n, [HL] or [xx+d] |
532 ;| src |Source s, ss, [BC], [DE], [HL], nn, [nn] |
533 ;| ss |Register pair BC, DE, HL or SP |
534 ;| xx |Index register IX or IY |
535 ;|-----------------+--------------------------------------------|
536 ;| + - * / ^ |Add/subtract/multiply/divide/exponent |
537 ;| & ~ v x |Logical AND/NOT/inclusive OR/exclusive OR |
538 ;| <- -> |Rotate left/right |
539 ;| [ ] |Indirect addressing |
540 ;| [ ]+ -[ ] |Indirect addressing auto-increment/decrement|
541 ;| { } |Combination of operands |
542 ;| # |Also BC=BC-1,DE=DE-1 |
543 ;| ## |Only lower 4 bits of accumulator A used |
544 ;----------------------------------------------------------------
546 ;How the flags are supposed to work:
547 ;7 ZFL_S - Sign flag (=MSBit of result)
548 ;6 ZFL_Z - Zero flag. Is 1 when the result is 0
549 ;4 ZFL_H - Half-carry (carry from bit 3 to 4)
550 ;2 ZFL_P - Parity/2-complement Overflow
551 ;1 ZFL_N - Subtract - set if last op was a subtract
554 ;I sure hope I got the mapping between flags and instructions correct...
571 ;------------------------------------------------;
572 ; Load table value from flash indexed by source reg.
574 ;ldpmx dstreg,tablebase,indexreg
576 ; (6 words, 8 cycles)
579 ldi zh,high(@1*2) ; table must be page aligned
584 .macro do_z80_flags_V
586 bmov z_flags, ZFL_P, temp, AVR_V
590 .macro do_z80_flags_set_N
592 ori z_flags, (1<<ZFL_N) ; Negation auf 1
596 .macro do_z80_flags_set_HN
598 ori z_flags,(1<<ZFL_N)|(1<<ZFL_H)
602 .macro do_z80_flags_clear_N
604 andi z_flags,~(1<<ZFL_N)
608 .macro do_z80_flags_clear_HN
610 andi z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
615 .macro do_z80_flags_copy_HC
617 bmov z_flags, ZFL_H, z_flags, ZFL_H
621 .macro do_z80_flags_op_rotate
622 ; must not change avr carry flag!
624 andi z_flags, ~( (1<<ZFL_H) | (1<<ZFL_N) | (1<<ZFL_C) )
626 andi z_flags, ~( (1<<ZFL_C) )
630 .macro do_z80_flags_op_and
632 ori z_flags,(1<<ZFL_H)
636 .macro do_z80_flags_op_or
643 ;----------------------------------------------------------------
648 printstring "Invalid opcode! "
656 ;----------------------------------------------------------------
657 ;|Mnemonic |SZHPNC|Description |Notes |
658 ;----------------------------------------------------------------
659 ;|OUT [n],A |------|Output |[n]=A |
662 ;Interface with peripherials goes here :)
663 do_op_outa: ; out (opl),a
666 printstring "Port write: "
679 ;----------------------------------------------------------------
680 ;|Mnemonic |SZHPNC|Description |Notes |
681 ;----------------------------------------------------------------
682 ;|IN A,[n] |------|Input |A=[n] |
685 do_op_in: ; in a,(opl)
688 printstring "Port read: ("
704 ;----------------------------------------------------------------
705 ;|Mnemonic |SZHPNC|Description |Notes |
706 ;----------------------------------------------------------------
707 ;|INC r |***V0-|Increment |r=r+1 |
708 ;|INC [HL] |***V0-|Increment |[HL]=[HL]+1 |
709 ;|INC [xx+d]|***V0-|Increment |[xx+d]=[xx+d]+1 |
710 ;|----------|SZHP C|---------- 8080 ----------------------------|
711 ;|INC r |**-P0-|Increment |r=r+1 |
712 ;|INC [HL] |**-P0-|Increment |[HL]=[HL]+1 |
719 andi z_flags,(1<<ZFL_C) ; preserve C-flag
720 ldpmx temp2, sz53p_tab, opl
722 bmov z_flags, ZFL_H, temp, AVR_H
730 andi z_flags,(1<<ZFL_C) ; preserve C-flag
731 ldpmx temp2, sz53p_tab, z_a
733 bmov z_flags, ZFL_H, temp, AVR_H
737 ;----------------------------------------------------------------
738 ;|Mnemonic |SZHPNC|Description |Notes |
739 ;----------------------------------------------------------------
740 ;|DEC r |***V1-|Decrement |s=s-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 ;|DEC r |**-P -|Increment |r=r+1 |
745 ;|DEC [HL] |**-P -|Increment |[HL]=[HL]+1 |
751 andi z_flags,(1<<ZFL_C) ; preserve C-flag
752 ldpmx temp2, sz53p_tab, opl
754 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
771 ;----------------------------------------------------------------
772 ;|Mnemonic |SZHPNC|Description |Notes |
773 ;----------------------------------------------------------------
774 ;|INC xx |------|Increment |xx=xx+1 |
775 ;|INC ss |------|Increment |ss=ss+1 |
783 ;----------------------------------------------------------------
784 ;|Mnemonic |SZHPNC|Description |Notes |
785 ;----------------------------------------------------------------
786 ;|DEC xx |------|Decrement |xx=xx-1 |
787 ;|DEC ss |------|Decrement |ss=ss-1 |
795 ;----------------------------------------------------------------
796 ;|Mnemonic |SZHPNC|Description |Notes |
797 ;----------------------------------------------------------------
798 ;|RLCA |--0-0*|Rotate Left Circular |A=A<- |
799 ;|----------|SZHP C|---------- 8080 ----------------------------|
800 ;|RLCA |---- *|Rotate Left Circular |A=A<- |
804 ;Rotate Left Cyclical. All bits move 1 to the
805 ;left, the msb becomes c and lsb.
806 do_z80_flags_op_rotate
811 ori z_flags, (1<<ZFL_C)
815 ;----------------------------------------------------------------
816 ;|Mnemonic |SZHPNC|Description |Notes |
817 ;----------------------------------------------------------------
818 ;|RRCA |--0-0*|Rotate Right Circular|A=->A |
819 ;|----------|SZHP C|---------- 8080 ----------------------------|
820 ;|RRCA |---- *|Rotate Right Circular|A=->A |
824 ;Rotate Right Cyclical. All bits move 1 to the
825 ;right, the lsb becomes c and msb.
826 do_z80_flags_op_rotate
831 ori z_flags, (1<<ZFL_C)
835 ;----------------------------------------------------------------
836 ;|Mnemonic |SZHPNC|Description |Notes |
837 ;----------------------------------------------------------------
838 ;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} |
839 ;|----------|SZHP C|---------- 8080 ----------------------------|
840 ;|RRA |---- *|Rotate Right Acc. |A=->{CY,A} |
844 ;Rotate Right. All bits move 1 to the right, the lsb
845 ;becomes c, c becomes msb.
846 clc ; get z80 carry to avr carry
849 do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C)
850 bmov z_flags,ZFL_C, z_a,0 ; Bit 0 --> CY
854 ;----------------------------------------------------------------
855 ;|Mnemonic |SZHPNC|Description |Notes |
856 ;----------------------------------------------------------------
857 ;|RLA |--0-0*|Rotate Left Acc. |A={CY,A}<- |
858 ;|----------|SZHP C|---------- 8080 ----------------------------|
859 ;|RLA |---- *|Rotate Left Acc. |A={CY,A}<- |
863 ;Rotate Left. All bits move 1 to the left, the msb
864 ;becomes c, c becomes lsb.
868 do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C)
869 bmov z_flags,ZFL_C, z_a,7 ; Bit 7 --> CY
873 ;----------------------------------------------------------------
874 ;|Mnemonic |SZHPNC|Description |Notes |
875 ;----------------------------------------------------------------
876 ;|ADD A,s |***V0*|Add |A=A+s |
877 ;|----------|SZHP C|---------- 8080 ----------------------------|
878 ;|ADD A,s |***P *|Add |A=A+s |
884 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P flag
885 bmov z_flags,ZFL_C, temp,AVR_C
886 bmov z_flags,ZFL_H, temp,AVR_H
890 ;----------------------------------------------------------------
891 ;|Mnemonic |SZHPNC|Description |Notes |
892 ;----------------------------------------------------------------
893 ;|ADC A,s |***V0*|Add with Carry |A=A+s+CY |
894 ;|----------|SZHP C|---------- 8080 ----------------------------|
895 ;|ADC A,s |***P *|Add with Carry |A=A+s+CY |
904 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
905 bmov z_flags,ZFL_C, temp,AVR_C
906 bmov z_flags,ZFL_H, temp,AVR_H
910 ;----------------------------------------------------------------
911 ;|Mnemonic |SZHPNC|Description |Notes |
912 ;----------------------------------------------------------------
913 ;|SUB s |***V1*|Subtract |A=A-s |
914 ;|----------|SZHP C|---------- 8080 ----------------------------|
915 ;|SUB s |***P *|Subtract |A=A-s |
921 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
922 bmov z_flags,ZFL_C, temp,AVR_C
923 bmov z_flags,ZFL_H, temp,AVR_H
928 ;----------------------------------------------------------------
929 ;|Mnemonic |SZHPNC|Description |Notes |
930 ;----------------------------------------------------------------
931 ;|CP s |***V1*|Compare |A-s |
932 ;|----------|SZHP C|---------- 8080 ----------------------------|
933 ;|CP s |***P *|Compare |A-s |
940 ldpmx z_flags,sz53p_tab,temp2 ;S,Z,P
941 bmov z_flags,ZFL_C, temp,AVR_C
942 bmov z_flags,ZFL_H, temp,AVR_H
947 ;----------------------------------------------------------------
948 ;|Mnemonic |SZHPNC|Description |Notes |
949 ;----------------------------------------------------------------
950 ;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY |
951 ;|----------|SZHP C|---------- 8080 ----------------------------|
952 ;|SBC A,s |***P *|Subtract with Carry |A=A-s-CY |
961 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P
962 bmov z_flags,ZFL_C, temp,AVR_C
963 bmov z_flags,ZFL_H, temp,AVR_H
968 ;----------------------------------------------------------------
969 ;|Mnemonic |SZHPNC|Description |Notes |
970 ;----------------------------------------------------------------
971 ;|AND s |**1P00|Logical AND |A=A&s |
972 ;|----------|SZHP C|---------- 8080 ----------------------------|
973 ;|AND s |**-P 0|Logical AND |A=A&s |
978 ldpmx z_flags,sz53p_tab,z_a ;S,Z,P,N,C
983 ;----------------------------------------------------------------
984 ;|Mnemonic |SZHPNC|Description |Notes |
985 ;----------------------------------------------------------------
986 ;|OR s |**0P00|Logical inclusive OR |A=Avs |
987 ;|----------|SZHP C|---------- 8080 ----------------------------|
988 ;|OR s |**-P00|Logical inclusive OR |A=Avs |
993 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C
997 ;----------------------------------------------------------------
998 ;|Mnemonic |SZHPNC|Description |Notes |
999 ;----------------------------------------------------------------
1000 ;|XOR s |**0P00|Logical Exclusive OR |A=Axs |
1001 ;|----------|SZHP C|---------- 8080 ----------------------------|
1002 ;|XOR s |**-P 0|Logical Exclusive OR |A=Axs |
1007 ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C
1011 ;----------------------------------------------------------------
1012 ;|Mnemonic |SZHPNC|Description |Notes |
1013 ;----------------------------------------------------------------
1014 ;|ADD HL,ss |--?-0*|Add |HL=HL+ss |
1015 ;|----------|SZHP C|---------- 8080 ----------------------------|
1016 ;|ADD HL,ss |---- *|Add |HL=HL+ss |
1025 bmov z_flags,ZFL_H, temp,AVR_H
1026 bmov z_flags,ZFL_C, temp,AVR_C
1027 do_z80_flags_clear_N
1030 ;----------------------------------------------------------------
1031 ;|Mnemonic |SZHPNC|Description |Notes |
1032 ;----------------------------------------------------------------
1033 ;|LD dst,src|------|Load |dst=src |
1036 do_op_sthl: ;store hl to mem loc in opl:h
1045 ;----------------------------------------------------------------
1046 ;|Mnemonic |SZHPNC|Description |Notes |
1047 ;----------------------------------------------------------------
1048 ;|LD dst,src|------|Load |dst=src |
1058 ;----------------------------------------------------------------
1059 ;|Mnemonic |SZHPNC|Description |Notes |
1060 ;----------------------------------------------------------------
1061 ;|LD dst,src|------|Load |dst=src |
1068 ;----------------------------------------------------------------
1069 ;|Mnemonic |SZHPNC|Description |Notes |
1070 ;----------------------------------------------------------------
1071 ;|DAA |***P-*|Decimal Adjust Acc. | |
1072 ;|----------|SZHP C|---------- 8080 ----------------------------|
1076 ; Description (http://www.z80.info/z80syntx.htm#DAA):
1077 ; This instruction conditionally adjusts the accumulator for BCD addition
1078 ; and subtraction operations. For addition (ADD, ADC, INC) or subtraction
1079 ; (SUB, SBC, DEC, NEC), the following table indicates the operation performed:
1081 ; -------------------------------------------------------------------
1082 ; | |C Flag |HEX value in|H Flag |HEX val in | Number |C flag |
1083 ; | Oper |Before |upper digit |Before |lower digit| added |After |
1084 ; | |DAA |(bit 7-4) |DAA |(bit 3-0) | to A |DAA |
1085 ; |-------+-------+------------+-------+-----------+--------+-------|
1086 ; | | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
1087 ; | ADD | 0 | 0-8 | 0 | A-F | 06 | 0 |
1088 ; | | 0 | 0-9 | 1 | 0-3 | 06 | 0 |
1089 ; | ADC | 0 | A-F | 0 | 0-9 | 60 | 1 |
1090 ; | | 0 | 9-F | 0 | A-F | 66 | 1 |
1091 ; | INC | 0 | A-F | 1 | 0-3 | 66 | 1 |
1092 ; | | 1 | 0-2 | 0 | 0-9 | 60 | 1 |
1093 ; | | 1 | 0-2 | 0 | A-F | 66 | 1 |
1094 ; | | 1 | 0-3 | 1 | 0-3 | 66 | 1 |
1095 ; |-------+-------+------------+-------+-----------+--------+-------|
1096 ; | SUB | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
1097 ; | SBC | 0 | 0-8 | 1 | 6-F | FA | 0 |
1098 ; | DEC | 1 | 7-F | 0 | 0-9 | A0 | 1 |
1099 ; | NEG | 1 | 6-F | 1 | 6-F | 9A | 1 |
1100 ; -------------------------------------------------------------------
1102 ; The H flag is affected as follows:
1104 ; ---------------------
1105 ; | N | H | low |H' |
1107 ; |---+---+-------+---|
1108 ; | 0 | * | 0-9 | 0 |
1109 ; | 0 | * | a-f | 1 |
1111 ; | 1 | 1 | 6-f | 0 |
1112 ; | 1 | 1 | 0-5 | 1 |
1113 ; ---------------------
1117 ; P/V: Set if Acc. is even parity after operation, reset otherwise.
1118 ; Z: Set if Acc. is Zero after operation, reset otherwise.
1119 ; S: Set if most significant bit of Acc. is 1 after operation, reset otherwise.
1126 sbrc z_flags,ZFL_N ;if add-op
1127 rjmp op_da_sub ;then
1131 ldi temp2,0 ; new C and H flag
1132 sbrc z_flags,ZFL_H ; |
1133 rjmp op_da_a01 ; if (H flag ...
1136 cpi temp,0x0a ; or (lower nibble >= 0x0A))
1139 ldi oph,0x06 ; add 6 to lower nibble
1142 ori temp2,(1<<ZFL_H) ; set new H flag
1145 ori temp2,(1<<ZFL_C) ; set new H flag
1147 sbrc z_flags,ZFL_C ; |
1148 rjmp op_da_a12 ; if (C flag ...
1149 cpi opl,0xA0 ; |... or upper nibble >= 0xA0)
1152 ldi oph,0x60 ; add 6 to lower nibble
1154 ori temp2,(1<<ZFL_C) ; set new C flag
1156 ldpmx z_flags, sz53p_tab, opl ; get S,Z,P flag
1157 or z_flags,temp2 ; merge new C and H flag
1162 op_da_sub: ;else (sub-op)
1163 rcall do_op_inv ; TODO: !
1170 ldi temp2,0 ;new C and H flag
1171 ldi oph,0 ;oph: what to add
1173 sbrc z_flags,ZFL_N ;if add-op
1174 rjmp op_da_sub ;then
1178 cpi temp,0x0a ; if (lower nibble >= 0x0A)
1180 ori oph,0x06 ; add 6
1181 ori temp2,(1<<ZFL_H) ; set new H flag
1183 sbrc z_flags,ZFL_C ; |
1184 rjmp op_da_a02 ; if (C flag ...
1185 cpi opl,0x90 ; |... or upper nibble >= 0x90)
1188 ori oph,0x60 ; add 0x60
1189 ori temp2,(1<<ZFL_C) ; set new C flag
1192 op_da_a10: ; else (lower nibble is 0x09 or lower)
1193 sbrc z_flags,ZFL_C ; |
1194 rjmp op_da_a12 ; if (C flag ...
1195 cpi opl,0xA0 ; |... or upper nibble >= 0xA0)
1198 ori oph,0x60 ; add 0x60
1199 ori temp2,(1<<ZFL_C) ; set new C flag
1201 sbrs z_flags,ZFL_H ; if (H flag)
1203 ori oph,0x06 ; add 0x06
1206 cpi temp,0x06 ; if (lower nibble >= 0x0A)
1208 ori temp2,(1<<ZFL_H) ; set new H flag
1213 ldpmx z_flags, sz53p_tab, opl ; get S,Z,P flag
1214 or z_flags,temp2 ; merge new C and H flag
1217 op_da_sub: ;else (sub-op)
1218 rcall do_op_inv ; TODO: !
1223 ;----------------------------------------------------------------
1224 ;|Mnemonic |SZHPNC|Description |Notes |
1225 ;----------------------------------------------------------------
1226 ;|SCF |--0-01|Set Carry Flag |CY=1 |
1227 ;|----------|SZHP C|---------- 8080 ----------------------------|
1231 do_z80_flags_clear_HN
1232 ori z_flags,(1<<ZFL_C)
1235 ;----------------------------------------------------------------
1236 ;|Mnemonic |SZHPNC|Description |Notes |
1237 ;----------------------------------------------------------------
1238 ;|CCF |--?-0*|Complement Carry Flag|CY=~CY, HC=previous CY|
1239 ;|----------|SZHP C|---------- 8080 ----------------------------|
1240 ;|CCF |---- 1|Set Carry Flag |CY=1 |
1243 do_z80_flags_clear_N
1244 do_z80_flags_copy_HC
1249 ;----------------------------------------------------------------
1250 ;|Mnemonic |SZHPNC|Description |Notes |
1251 ;----------------------------------------------------------------
1252 ;|CPL |--1-1-|Complement |A=~A |
1253 ;|----------|SZHP C|---------- 8080 ----------------------------|
1254 ;|CPL |---- -|Complement |A=~A |
1263 ;----------------------------------------------------------------
1264 ;|Mnemonic |SZHPNC|Description |Notes |
1265 ;----------------------------------------------------------------
1266 ;|PUSH xx |------|Push |-[SP]=xx |
1267 ;|PUSH qq |------|Push |-[SP]=qq |
1280 printstring "Stack push "
1283 printstring ", SP is now "
1291 ;----------------------------------------------------------------
1292 ;|Mnemonic |SZHPNC|Description |Notes |
1293 ;----------------------------------------------------------------
1294 ;|POP xx |------|Pop |xx=[SP]+ |
1295 ;|POP qq |------|Pop |qq=[SP]+ |
1308 printstring "Stack pop "
1311 printstring ", SP is now "
1318 ;----------------------------------------------------------------
1319 ;|Mnemonic |SZHPNC|Description |Notes |
1320 ;----------------------------------------------------------------
1321 ;|EX [SP],HL|------|Exchange |[SP]<->HL |
1322 ;|EX DE,HL |------|Exchange |DE<->HL |
1323 ;-----------------------------Z80--------------------------------
1333 ;----------------------------------------------------------------
1334 ;|Mnemonic |SZHPNC|Description |Notes |
1335 ;----------------------------------------------------------------
1337 ; TODO: Implement IFF1, IFF2
1341 ;----------------------------------------------------------------
1342 ;|Mnemonic |SZHPNC|Description |Notes |
1343 ;----------------------------------------------------------------
1345 ; TODO: Implement IFF1, IFF2
1349 ;----------------------------------------------------------------
1350 ;|Mnemonic |SZHPNC|Description |Notes |
1351 ;----------------------------------------------------------------
1352 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1353 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1354 ;|RET cc |------|Conditional Return |If cc RET |
1361 pop temp ; direkt zuruech zu main
1364 ;----------------------------------------------------------------
1365 ;|Mnemonic |SZHPNC|Description |Notes |
1366 ;----------------------------------------------------------------
1367 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1368 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1369 ;|RET cc |------|Conditional Return |If cc RET |
1376 pop temp ; direkt zuruech zu main
1379 ;----------------------------------------------------------------
1380 ;|Mnemonic |SZHPNC|Description |Notes |
1381 ;----------------------------------------------------------------
1382 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1383 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1384 ;|RET cc |------|Conditional Return |If cc RET |
1391 pop temp ; direkt zuruech zu main
1394 ;----------------------------------------------------------------
1395 ;|Mnemonic |SZHPNC|Description |Notes |
1396 ;----------------------------------------------------------------
1397 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1398 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1399 ;|RET cc |------|Conditional Return |If cc RET |
1406 pop temp ; direkt zuruech zu main
1409 ;----------------------------------------------------------------
1410 ;|Mnemonic |SZHPNC|Description |Notes |
1411 ;----------------------------------------------------------------
1412 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1413 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1414 ;|RET cc |------|Conditional Return |If cc RET |
1421 pop temp ; direkt zuruech zu main
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 |
1436 pop temp ; direkt zuruech zu main
1439 ;----------------------------------------------------------------
1440 ;|Mnemonic |SZHPNC|Description |Notes |
1441 ;----------------------------------------------------------------
1442 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1443 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1444 ;|RET cc |------|Conditional Return |If cc RET |
1447 do_op_ifp: ;sign positive, aka s=0
1451 pop temp ; direkt zuruech zu main
1454 ;----------------------------------------------------------------
1455 ;|Mnemonic |SZHPNC|Description |Notes |
1456 ;----------------------------------------------------------------
1457 ;|CALL cc,nn|------|Conditional Call |If cc CALL |
1458 ;|JP cc,nn |------|Conditional Jump |If cc JP |
1459 ;|RET cc |------|Conditional Return |If cc RET |
1462 do_op_ifm: ;sign negative, aka s=1
1466 pop temp ; direkt zuruech zu main
1470 ; ----------------------- Opcode decoding -------------------------
1472 ; Lookup table for Z80 opcodes. Translates the first byte of the instruction word into three
1473 ; operations: fetch, do something, store.
1474 ; The table is made of 256 words.
1476 ;.org (PC+255) & 0xff00
1478 instr do_fetch_nop, op_nop, do_store_nop ;00 ;NOP
1479 instr do_fetch_DIR16, op_nop, do_store_BC ;01 nn nn ;LD BC,nn
1480 instr do_fetch_nop, op_nop, do_store_MBC ;02 ;LD (BC),A
1481 instr do_fetch_BC, op_INC16, do_store_BC ;03 ;INC BC
1482 instr do_fetch_B, op_INC, do_store_B ;04 ;INC B
1483 instr do_fetch_B, op_DEC, do_store_B ;05 ;DEC B
1484 instr do_fetch_DIR8, op_nop, do_store_B ;06 ;LD B,n
1485 instr do_fetch_nop, op_RLCA, do_store_nop ;07 ;RLCA
1486 instr do_fetch_nop, op_INV, do_store_nop ;08 ;EX AF,AF'
1487 instr do_fetch_BC, op_ADDHL, do_store_HL ;09 ;ADD HL,BC
1488 instr do_fetch_MBC, op_nop, do_store_nop ;0A ;LD A,(BC)
1489 instr do_fetch_BC, op_DEC16, do_store_BC ;0B ;DEC BC
1490 instr do_fetch_C, op_INC, do_store_C ;0C ;INC C
1491 instr do_fetch_C, op_DEC, do_store_C ;0D ;DEC C
1492 instr do_fetch_DIR8, op_nop, do_store_C ;0E nn ;LD C,n
1493 instr do_fetch_nop, op_RRCA, do_store_nop ;0F ;RRCA
1494 instr do_fetch_nop, op_INV, do_store_nop ;10 oo ;DJNZ o
1495 instr do_fetch_DIR16, op_nop, do_store_DE ;11 nn nn ;LD DE,nn
1496 instr do_fetch_nop, op_nop, do_store_MDE ;12 ;LD (DE),A
1497 instr do_fetch_DE, op_INC16, do_store_DE ;13 ;INC DE
1498 instr do_fetch_D, op_INC, do_store_D ;14 ;INC D
1499 instr do_fetch_D, op_DEC, do_store_D ;15 ;DEC D
1500 instr do_fetch_DIR8, op_nop, do_store_D ;16 nn ;LD D,n
1501 instr do_fetch_nop, op_RLA, do_store_nop ;17 ;RLA
1502 instr do_fetch_nop, op_INV, do_store_nop ;18 oo ;JR o
1503 instr do_fetch_DE, op_ADDHL, do_store_HL ;19 ;ADD HL,DE
1504 instr do_fetch_MDE, op_nop, do_store_nop ;1A ;LD A,(DE)
1505 instr do_fetch_DE, op_DEC16, do_store_DE ;1B ;DEC DE
1506 instr do_fetch_E, op_INC, do_store_E ;1C ;INC E
1507 instr do_fetch_E, op_DEC, do_store_E ;1D ;DEC E
1508 instr do_fetch_DIR8, op_nop, do_store_E ;1E nn ;LD E,n
1509 instr do_fetch_nop, op_RRA, do_store_nop ;1F ;RRA
1510 instr do_fetch_nop, op_INV, do_store_nop ;20 oo ;JR NZ,o
1511 instr do_fetch_DIR16, op_nop, do_store_HL ;21 nn nn ;LD HL,nn
1512 instr do_fetch_DIR16, op_STHL, do_store_nop ;22 nn nn ;LD (nn),HL
1513 instr do_fetch_HL, op_INC16, do_store_HL ;23 ;INC HL
1514 instr do_fetch_H, op_INC, do_store_H ;24 ;INC H
1515 instr do_fetch_H, op_DEC, do_store_H ;25 ;DEC H
1516 instr do_fetch_DIR8, op_nop, do_store_H ;26 nn ;LD H,n
1517 instr do_fetch_A, op_DA, do_store_A ;27 ;DAA
1518 instr do_fetch_nop, op_INV, do_store_nop ;28 oo ;JR Z,o
1519 instr do_fetch_HL, op_ADDHL, do_store_HL ;29 ;ADD HL,HL
1520 instr do_fetch_DIR16, op_RMEM16, do_store_HL ;2A nn nn ;LD HL,(nn)
1521 instr do_fetch_HL, op_DEC16, do_store_HL ;2B ;DEC HL
1522 instr do_fetch_L, op_INC, do_store_L ;2C ;INC L
1523 instr do_fetch_L, op_DEC, do_store_L ;2D ;DEC L
1524 instr do_fetch_DIR8, op_nop, do_store_L ;2E nn ;LD L,n
1525 instr do_fetch_nop, op_CPL, do_store_nop ;2F ;CPL
1526 instr do_fetch_nop, op_INV, do_store_nop ;30 oo ;JR NC,o
1527 instr do_fetch_DIR16, op_nop, do_store_SP ;31 nn nn ;LD SP,nn
1528 instr do_fetch_DIR16, op_nop, do_store_AM ;32 nn nn ;LD (nn),A
1529 instr do_fetch_SP, op_INC16, do_store_SP ;33 ;INC SP
1530 instr do_fetch_MHL, op_INC, do_store_MHL ;34 ;INC (HL)
1531 instr do_fetch_MHL, op_DEC, do_store_MHL ;35 ;DEC (HL)
1532 instr do_fetch_DIR8, op_nop, do_store_MHL ;36 nn ;LD (HL),n
1533 instr do_fetch_nop, op_SCF, do_store_nop ;37 ;SCF
1534 instr do_fetch_nop, op_INV, do_store_nop ;38 oo ;JR C,o
1535 instr do_fetch_SP, op_ADDHL, do_store_HL ;39 ;ADD HL,SP
1536 instr do_fetch_DIR16, op_RMEM8, do_store_A ;3A nn nn ;LD A,(nn)
1537 instr do_fetch_SP, op_DEC16, do_store_SP ;3B ;DEC SP
1538 instr do_fetch_nop, op_INCA, do_store_nop ;3C ;INC A
1539 instr do_fetch_nop, op_DECA, do_store_nop ;3D ;DEC A
1540 instr do_fetch_DIR8, op_nop, do_store_A ;3E nn ;LD A,n
1541 instr do_fetch_nop, op_CCF, do_store_nop ;3F ;CCF (Complement Carry Flag, gvd)
1542 instr do_fetch_nop, op_nop, do_store_nop ;40 ;LD B,B
1543 instr do_fetch_C, op_nop, do_store_B ;41 ;LD B,C
1544 instr do_fetch_D, op_nop, do_store_B ;42 ;LD B,D
1545 instr do_fetch_E, op_nop, do_store_B ;43 ;LD B,E
1546 instr do_fetch_H, op_nop, do_store_B ;44 ;LD B,H
1547 instr do_fetch_L, op_nop, do_store_B ;45 ;LD B,L
1548 instr do_fetch_MHL, op_nop, do_store_B ;46 ;LD B,(HL)
1549 instr do_fetch_A, op_nop, do_store_B ;47 ;LD B,A
1550 instr do_fetch_B, op_nop, do_store_C ;48 ;LD C,B
1551 instr do_fetch_nop, op_nop, do_store_nop ;49 ;LD C,C
1552 instr do_fetch_D, op_nop, do_store_C ;4A ;LD C,D
1553 instr do_fetch_E, op_nop, do_store_C ;4B ;LD C,E
1554 instr do_fetch_H, op_nop, do_store_C ;4C ;LD C,H
1555 instr do_fetch_L, op_nop, do_store_C ;4D ;LD C,L
1556 instr do_fetch_MHL, op_nop, do_store_C ;4E ;LD C,(HL)
1557 instr do_fetch_A, op_nop, do_store_C ;4F ;LD C,A
1558 instr do_fetch_B, op_nop, do_store_D ;50 ;LD D,B
1559 instr do_fetch_C, op_nop, do_store_D ;51 ;LD D,C
1560 instr do_fetch_nop, op_nop, do_store_nop ;52 ;LD D,D
1561 instr do_fetch_E, op_nop, do_store_D ;53 ;LD D,E
1562 instr do_fetch_H, op_nop, do_store_D ;54 ;LD D,H
1563 instr do_fetch_L, op_nop, do_store_D ;55 ;LD D,L
1564 instr do_fetch_MHL, op_nop, do_store_D ;56 ;LD D,(HL)
1565 instr do_fetch_A, op_nop, do_store_D ;57 ;LD D,A
1566 instr do_fetch_B, op_nop, do_store_E ;58 ;LD E,B
1567 instr do_fetch_C, op_nop, do_store_E ;59 ;LD E,C
1568 instr do_fetch_D, op_nop, do_store_E ;5A ;LD E,D
1569 instr do_fetch_nop, op_nop, do_store_nop ;5B ;LD E,E
1570 instr do_fetch_H, op_nop, do_store_E ;5C ;LD E,H
1571 instr do_fetch_L, op_nop, do_store_E ;5D ;LD E,L
1572 instr do_fetch_MHL, op_nop, do_store_E ;5E ;LD E,(HL)
1573 instr do_fetch_A, op_nop, do_store_E ;5F ;LD E,A
1574 instr do_fetch_B, op_nop, do_store_H ;60 ;LD H,B
1575 instr do_fetch_C, op_nop, do_store_H ;61 ;LD H,C
1576 instr do_fetch_D, op_nop, do_store_H ;62 ;LD H,D
1577 instr do_fetch_E, op_nop, do_store_H ;63 ;LD H,E
1578 instr do_fetch_nop, op_nop, do_store_nop ;64 ;LD H,H
1579 instr do_fetch_L, op_nop, do_store_H ;65 ;LD H,L
1580 instr do_fetch_MHL, op_nop, do_store_H ;66 ;LD H,(HL)
1581 instr do_fetch_A, op_nop, do_store_H ;67 ;LD H,A
1582 instr do_fetch_B, op_nop, do_store_L ;68 ;LD L,B
1583 instr do_fetch_C, op_nop, do_store_L ;69 ;LD L,C
1584 instr do_fetch_D, op_nop, do_store_L ;6A ;LD L,D
1585 instr do_fetch_E, op_nop, do_store_L ;6B ;LD L,E
1586 instr do_fetch_H, op_nop, do_store_L ;6C ;LD L,H
1587 instr do_fetch_nop, op_nop, do_store_nop ;6D ;LD L,L
1588 instr do_fetch_MHL, op_nop, do_store_L ;6E ;LD L,(HL)
1589 instr do_fetch_A, op_nop, do_store_L ;6F ;LD L,A
1590 instr do_fetch_B, op_nop, do_store_MHL ;70 ;LD (HL),B
1591 instr do_fetch_C, op_nop, do_store_MHL ;71 ;LD (HL),C
1592 instr do_fetch_D, op_nop, do_store_MHL ;72 ;LD (HL),D
1593 instr do_fetch_E, op_nop, do_store_MHL ;73 ;LD (HL),E
1594 instr do_fetch_H, op_nop, do_store_MHL ;74 ;LD (HL),H
1595 instr do_fetch_L, op_nop, do_store_MHL ;75 ;LD (HL),L
1596 instr do_fetch_nop, op_INV, do_store_nop ;76 ;HALT
1597 instr do_fetch_A, op_nop, do_store_MHL ;77 ;LD (HL),A
1598 instr do_fetch_B, op_nop, do_store_A ;78 ;LD A,B
1599 instr do_fetch_C, op_nop, do_store_A ;79 ;LD A,C
1600 instr do_fetch_D, op_nop, do_store_A ;7A ;LD A,D
1601 instr do_fetch_E, op_nop, do_store_A ;7B ;LD A,E
1602 instr do_fetch_H, op_nop, do_store_A ;7C ;LD A,H
1603 instr do_fetch_L, op_nop, do_store_A ;7D ;LD A,L
1604 instr do_fetch_MHL, op_nop, do_store_A ;7E ;LD A,(HL)
1605 instr do_fetch_nop, op_nop, do_store_nop ;7F ;LD A,A
1606 instr do_fetch_B, op_ADDA, do_store_nop ;80 ;ADD A,B
1607 instr do_fetch_C, op_ADDA, do_store_nop ;81 ;ADD A,C
1608 instr do_fetch_D, op_ADDA, do_store_nop ;82 ;ADD A,D
1609 instr do_fetch_E, op_ADDA, do_store_nop ;83 ;ADD A,E
1610 instr do_fetch_H, op_ADDA, do_store_nop ;84 ;ADD A,H
1611 instr do_fetch_L, op_ADDA, do_store_nop ;85 ;ADD A,L
1612 instr do_fetch_MHL, op_ADDA, do_store_nop ;86 ;ADD A,(HL)
1613 instr do_fetch_A, op_ADDA, do_store_nop ;87 ;ADD A,A
1614 instr do_fetch_B, op_ADCA, do_store_nop ;88 ;ADC A,B
1615 instr do_fetch_C, op_ADCA, do_store_nop ;89 ;ADC A,C
1616 instr do_fetch_D, op_ADCA, do_store_nop ;8A ;ADC A,D
1617 instr do_fetch_E, op_ADCA, do_store_nop ;8B ;ADC A,E
1618 instr do_fetch_H, op_ADCA, do_store_nop ;8C ;ADC A,H
1619 instr do_fetch_L, op_ADCA, do_store_nop ;8D ;ADC A,L
1620 instr do_fetch_MHL, op_ADCA, do_store_nop ;8E ;ADC A,(HL)
1621 instr do_fetch_A, op_ADCA, do_store_nop ;8F ;ADC A,A
1622 instr do_fetch_B, op_SUBFA, do_store_nop ;90 ;SUB A,B
1623 instr do_fetch_C, op_SUBFA, do_store_nop ;91 ;SUB A,C
1624 instr do_fetch_D, op_SUBFA, do_store_nop ;92 ;SUB A,D
1625 instr do_fetch_E, op_SUBFA, do_store_nop ;93 ;SUB A,E
1626 instr do_fetch_H, op_SUBFA, do_store_nop ;94 ;SUB A,H
1627 instr do_fetch_L, op_SUBFA, do_store_nop ;95 ;SUB A,L
1628 instr do_fetch_MHL, op_SUBFA, do_store_nop ;96 ;SUB A,(HL)
1629 instr do_fetch_A, op_SUBFA, do_store_nop ;97 ;SUB A,A
1630 instr do_fetch_B, op_SBCFA, do_store_nop ;98 ;SBC A,B
1631 instr do_fetch_C, op_SBCFA, do_store_nop ;99 ;SBC A,C
1632 instr do_fetch_D, op_SBCFA, do_store_nop ;9A ;SBC A,D
1633 instr do_fetch_E, op_SBCFA, do_store_nop ;9B ;SBC A,E
1634 instr do_fetch_H, op_SBCFA, do_store_nop ;9C ;SBC A,H
1635 instr do_fetch_L, op_SBCFA, do_store_nop ;9D ;SBC A,L
1636 instr do_fetch_MHL, op_SBCFA, do_store_nop ;9E ;SBC A,(HL)
1637 instr do_fetch_A, op_SBCFA, do_store_nop ;9F ;SBC A,A
1638 instr do_fetch_B, op_ANDA, do_store_nop ;A0 ;AND A,B
1639 instr do_fetch_C, op_ANDA, do_store_nop ;A1 ;AND A,C
1640 instr do_fetch_D, op_ANDA, do_store_nop ;A2 ;AND A,D
1641 instr do_fetch_E, op_ANDA, do_store_nop ;A3 ;AND A,E
1642 instr do_fetch_H, op_ANDA, do_store_nop ;A4 ;AND A,H
1643 instr do_fetch_L, op_ANDA, do_store_nop ;A5 ;AND A,L
1644 instr do_fetch_MHL, op_ANDA, do_store_nop ;A6 ;AND A,(HL)
1645 instr do_fetch_A, op_ANDA, do_store_nop ;A7 ;AND A,A
1646 instr do_fetch_B, op_XORA, do_store_nop ;A8 ;XOR A,B
1647 instr do_fetch_C, op_XORA, do_store_nop ;A9 ;XOR A,C
1648 instr do_fetch_D, op_XORA, do_store_nop ;AA ;XOR A,D
1649 instr do_fetch_E, op_XORA, do_store_nop ;AB ;XOR A,E
1650 instr do_fetch_H, op_XORA, do_store_nop ;AC ;XOR A,H
1651 instr do_fetch_L, op_XORA, do_store_nop ;AD ;XOR A,L
1652 instr do_fetch_MHL, op_XORA, do_store_nop ;AE ;XOR A,(HL)
1653 instr do_fetch_A, op_XORA, do_store_nop ;AF ;XOR A,A
1654 instr do_fetch_B, op_ORA, do_store_nop ;B0 ;OR A,B
1655 instr do_fetch_C, op_ORA, do_store_nop ;B1 ;OR A,C
1656 instr do_fetch_D, op_ORA, do_store_nop ;B2 ;OR A,D
1657 instr do_fetch_E, op_ORA, do_store_nop ;B3 ;OR A,E
1658 instr do_fetch_H, op_ORA, do_store_nop ;B4 ;OR A,H
1659 instr do_fetch_L, op_ORA, do_store_nop ;B5 ;OR A,L
1660 instr do_fetch_MHL, op_ORA, do_store_nop ;B6 ;OR A,(HL)
1661 instr do_fetch_A, op_ORA, do_store_nop ;B7 ;OR A,A
1662 instr do_fetch_B, op_CPFA, do_store_nop ;B8 ;CP A,B
1663 instr do_fetch_C, op_CPFA, do_store_nop ;B9 ;CP A,C
1664 instr do_fetch_D, op_CPFA, do_store_nop ;BA ;CP A,D
1665 instr do_fetch_E, op_CPFA, do_store_nop ;BB ;CP A,E
1666 instr do_fetch_H, op_CPFA, do_store_nop ;BC ;CP A,H
1667 instr do_fetch_L, op_CPFA, do_store_nop ;BD ;CP A,L
1668 instr do_fetch_MHL, op_CPFA, do_store_nop ;BE ;CP A,(HL)
1669 instr do_fetch_A, op_CPFA, do_store_nop ;BF ;CP A,A
1670 instr do_fetch_nop, op_IFNZ, do_store_RET ;C0 ;RET NZ
1671 instr do_fetch_nop, op_POP16, do_store_BC ;C1 ;POP BC
1672 instr do_fetch_DIR16, op_IFNZ, do_store_PC ;C2 nn nn ;JP NZ,nn
1673 instr do_fetch_DIR16, op_nop, do_store_PC ;C3 nn nn ;JP nn
1674 instr do_fetch_DIR16, op_IFNZ, do_store_CALL ;C4 nn nn ;CALL NZ,nn
1675 instr do_fetch_BC, op_PUSH16, do_store_nop ;C5 ;PUSH BC
1676 instr do_fetch_DIR8, op_ADDA, do_store_nop ;C6 nn ;ADD A,n
1677 instr do_fetch_RST, op_nop, do_store_CALL ;C7 ;RST 0
1678 instr do_fetch_nop, op_IFZ, do_store_RET ;C8 ;RET Z
1679 instr do_fetch_nop, op_nop, do_store_RET ;C9 ;RET
1680 instr do_fetch_DIR16, op_IFZ, do_store_PC ;CA nn nn ;JP Z,nn
1681 instr do_fetch_nop, op_INV, do_store_nop ;CB ;(Z80 specific)
1682 instr do_fetch_DIR16, op_IFZ, do_store_CALL ;CC nn nn ;CALL Z,nn
1683 instr do_fetch_DIR16, op_nop, do_store_CALL ;CD nn nn ;CALL nn
1684 instr do_fetch_DIR8, op_ADCA, do_store_nop ;CE nn ;ADC A,n
1685 instr do_fetch_RST, op_nop, do_store_CALL ;CF ;RST 8H
1686 instr do_fetch_nop, op_IFNC, do_store_RET ;D0 ;RET NC
1687 instr do_fetch_nop, op_POP16, do_store_DE ;D1 ;POP DE
1688 instr do_fetch_DIR16, op_IFNC, do_store_PC ;D2 nn nn ;JP NC,nn
1689 instr do_fetch_DIR8, op_OUTA, do_store_nop ;D3 nn ;OUT (n),A
1690 instr do_fetch_DIR16, op_IFNC, do_store_CALL ;D4 nn nn ;CALL NC,nn
1691 instr do_fetch_DE, op_PUSH16, do_store_nop ;D5 ;PUSH DE
1692 instr do_fetch_DIR8, op_SUBFA, do_store_nop ;D6 nn ;SUB n
1693 instr do_fetch_RST, op_nop, do_store_CALL ;D7 ;RST 10H
1694 instr do_fetch_nop, op_IFC, do_store_RET ;D8 ;RET C
1695 instr do_fetch_nop, op_nop, do_store_nop ;D9 ;EXX
1696 instr do_fetch_DIR16, op_IFC, do_store_PC ;DA nn nn ;JP C,nn
1697 instr do_fetch_DIR8, op_IN, do_store_A ;DB nn ;IN A,(n)
1698 instr do_fetch_DIR16, op_IFC, do_store_CALL ;DC nn nn ;CALL C,nn
1699 instr do_fetch_nop, op_INV, do_store_nop ;DD ;(Z80 specific)
1700 instr do_fetch_DIR8, op_SBCFA, do_store_nop ;DE nn ;SBC A,n
1701 instr do_fetch_RST, op_nop, do_store_CALL ;DF ;RST 18H
1702 instr do_fetch_nop, op_IFPO, do_store_RET ;E0 ;RET PO
1703 instr do_fetch_nop, op_POP16, do_store_HL ;E1 ;POP HL
1704 instr do_fetch_DIR16, op_IFPO, do_store_PC ;E2 nn nn ;JP PO,nn
1705 instr do_fetch_MSP, op_EXHL, do_store_MSP ;E3 ;EX (SP),HL
1706 instr do_fetch_DIR16, op_IFPO, do_store_CALL ;E4 nn nn ;CALL PO,nn
1707 instr do_fetch_HL, op_PUSH16, do_store_nop ;E5 ;PUSH HL
1708 instr do_fetch_DIR8, op_ANDA, do_store_nop ;E6 nn ;AND n
1709 instr do_fetch_RST, op_nop, do_store_CALL ;E7 ;RST 20H
1710 instr do_fetch_nop, op_IFPE, do_store_RET ;E8 ;RET PE
1711 instr do_fetch_HL, op_nop, do_store_PC ;E9 ;JP HL
1712 instr do_fetch_DIR16, op_IFPE, do_store_PC ;EA nn nn ;JP PE,nn
1713 instr do_fetch_DE, op_EXHL, do_store_DE ;EB ;EX DE,HL
1714 instr do_fetch_DIR16, op_IFPE, do_store_CALL ;EC nn nn ;CALL PE,nn
1715 instr do_fetch_nop, op_INV, do_store_nop ;ED ;(Z80 specific)
1716 instr do_fetch_DIR8, op_XORA, do_store_nop ;EE nn ;XOR n
1717 instr do_fetch_RST, op_nop, do_store_CALL ;EF ;RST 28H
1718 instr do_fetch_nop, op_IFP, do_store_RET ;F0 ;RET P
1719 instr do_fetch_nop, op_POP16, do_store_AF ;F1 ;POP AF
1720 instr do_fetch_DIR16, op_IFP, do_store_PC ;F2 nn nn ;JP P,nn
1721 instr do_fetch_nop, op_DI, do_store_nop ;F3 ;DI
1722 instr do_fetch_DIR16, op_IFP, do_store_CALL ;F4 nn nn ;CALL P,nn
1723 instr do_fetch_AF, op_PUSH16, do_store_nop ;F5 ;PUSH AF
1724 instr do_fetch_DIR8, op_ORA, do_store_nop ;F6 nn ;OR n
1725 instr do_fetch_RST, op_nop, do_store_CALL ;F7 ;RST 30H
1726 instr do_fetch_nop, op_IFM, do_store_RET ;F8 ;RET M
1727 instr do_fetch_HL, op_nop, do_store_SP ;F9 ;LD SP,HL
1728 instr do_fetch_DIR16, op_IFM, do_store_PC ;FA nn nn ;JP M,nn
1729 instr do_fetch_nop, op_EI, do_store_nop ;FB ;EI
1730 instr do_fetch_DIR16, op_IFM, do_store_CALL ;FC nn nn ;CALL M,nn
1731 instr do_fetch_nop, op_INV, do_store_nop ;FD ;(Z80 specific)
1732 instr do_fetch_DIR8, op_CPFA, do_store_nop ;FE nn ;CP n
1733 instr do_fetch_RST, op_nop, do_store_CALL ;FF ;RST 38H
1736 ;----------------------------------------------------------------
1737 ; Lookup table, stolen from z80ex, Z80 emulation library.
1738 ; http://z80ex.sourceforge.net/
1740 ; The S, Z, 5 and 3 bits and the parity of the lookup value
1742 .org (PC+255) & 0xff00
1744 .db 0x44,0x00,0x00,0x04,0x00,0x04,0x04,0x00
1745 .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c
1746 .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04
1747 .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08
1748 .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24
1749 .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28
1750 .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20
1751 .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c
1752 .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04
1753 .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08
1754 .db 0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00
1755 .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c
1756 .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20
1757 .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c
1758 .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24
1759 .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28
1760 .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
1761 .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88
1762 .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80
1763 .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c
1764 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0
1765 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac
1766 .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4
1767 .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8
1768 .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80
1769 .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c
1770 .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
1771 .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88
1772 .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4
1773 .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8
1774 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0
1775 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac
1777 ; vim:set ts=8 noet nowrap