]> cloudbase.mooo.com Git - avrcpm.git/commitdiff
* avr/8080int-*.asm
authorLeo <erbl259-lmu@yahoo.de>
Sun, 4 Mar 2012 21:35:31 +0000 (21:35 +0000)
committerLeo <erbl259-lmu@yahoo.de>
Sun, 4 Mar 2012 21:35:31 +0000 (21:35 +0000)
  - DAA instruction corrected
  - Flag treatment corrected
* avr/8080int-jmp.asm
  - Minor opcode and jump table optimizations

git-svn-id: svn://cu.loc/avr-cpm/avrcpm/trunk@168 57430480-672e-4586-8877-bcf8adbbf3b7

avr/8080int-jmp.asm
avr/8080int-t3-jmp.asm
avr/8080int-t3.asm
avr/8080int.asm

index 1d7d1f3f220d739916c6b67fcb4c15d163082c78..e21d703635cbef9d8967021436c6b47c5468ba90 100644 (file)
@@ -57,7 +57,6 @@ main:
 notraceon:
 .endif
 
-
 .if PRINT_PC
        cpi z_pch,DBG_TRACE_BOTTOM
        brlo noprintpc
@@ -76,8 +75,8 @@ noprintpc:
        sbic    flags,trace
         rcall  printregs
 .endif
-       ;hier kommt die Interruptbehandlung rein
 
+       ;hier kommt die Interruptbehandlung rein
 
        mem_read_ds zl,z_pc                     ;zl = memReadByte(z_pc)
        adiw    z_pcl,1                         ;++z_pc
@@ -86,8 +85,7 @@ noprintpc:
        rjmp    main                            ;
 
 
-
-;      .listmac
+       .listmac
 
 ;--------------------------------------------------
 ; Generate a table entry for one instruction
@@ -107,19 +105,39 @@ noprintpc:
       .set todo_table_pos_ = opcjmp + 256 + 128
     .endif
   .endif
-  .set do_@0_@1_@2 = todo_table_pos_           ; make a label
 
-  .org opcjmp_table_pos_
-  rjmp do_@0_@1_@2                             ; generate a jump to the label
-  .set opcjmp_table_pos_ = PC
-  .org do_@0_@1_@2
-  
   .set fetch_ = (@0 != do_fetch_nop)           ; must call or jump to fetch phase
   .set op_    = (do_@1 != do_op_nop)           ; must call or jump to op phase
   .set store_ = (@2 != do_store_nop)           ; must jump to store phase
-    
-  .if fetch_ || op_ || store_                  ; something to do
+  .set cnt_ = fetch_ + op_ + store_
+
+  .set do_@0_@1_@2 = todo_table_pos_           ; make a label
+
+  .org opcjmp_table_pos_
+  .set opcjmp_table_pos_ = opcjmp_table_pos_ + 1
+
+  .if cnt_ == 0                                        ; nothing to do (nop)
+    ret                                                ; go back to main
+  .endif
+
+  .if cnt_ == 1                                        ; jump direct to action
+    .if fetch_                                 ; 
+      rjmp @0                                  ; 
+    .endif    
+    .if op_
+      rjmp do_@1                               ; do op and return to main
+    .endif    
+    .if store_                                 ; 
+      rjmp @2                                  ; 
+    .endif    
+  .endif
+
+                                               ; two or tree actions
+  .if cnt_ >= 2                                        ; jump direct to action
+    rjmp do_@0_@1_@2                           ; generate a jump to action table
+
+    .org do_@0_@1_@2
+
     .if fetch_                                 ; must fetch
       .if op_ || store_
         rcall @0                               ; fetch and come back here
@@ -137,11 +155,11 @@ noprintpc:
     .if store_                                 ; must store
       rjmp @2                                  ; store is allways last
     .endif    
-  .else
-    ret                                                ; nop, go back to main
+  
+    .set todo_table_pos_ = PC
+
   .endif
 
-  .set todo_table_pos_ = PC
 .endm
 
        
@@ -207,13 +225,13 @@ do_fetch_sp:
 do_fetch_mbc:
        lds xh,z_b
        lds xl,z_c
-       mem_read_d opl
+       mem_read_d z_a
        ret
 
 do_fetch_mde:
        lds xh,z_d
        lds xl,z_e
-       mem_read_d opl
+       mem_read_d z_a
        ret
 
 do_fetch_mhl:
@@ -307,13 +325,13 @@ do_store_hl:
 do_store_mbc:
        lds xh,z_b
        lds xl,z_c
-       mem_write_s opl
+       mem_write_s z_a
        ret
 
 do_store_mde:
        lds xh,z_d
        lds xl,z_e
-       mem_write_s opl
+       mem_write_s z_a
        ret
 
 do_store_mhl:
@@ -385,7 +403,6 @@ do_store_am:
 
 
 
-
 ; ------------ Operation phase stuff -----------------
 
 ;----------------------------------------------------------------
@@ -599,10 +616,9 @@ do_store_am:
        lpm     @0,z    
 .endm
 
-.macro do_z80_flags_HP
+.macro do_z80_flags_V
 #if EM_Z80
        bmov    z_flags, ZFL_P, temp, AVR_V
-       bmov    z_flags, ZFL_H, temp, AVR_H
 #endif
 .endm
 
@@ -624,6 +640,19 @@ do_store_am:
 #endif
 .endm
 
+.macro do_z80_flags_clear_HN
+#if EM_Z80
+       andi    z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
+#endif
+.endm
+
+       
+.macro do_z80_flags_copy_HC
+#if EM_Z80
+       bmov    z_flags, ZFL_H, z_flags, ZFL_H
+#endif
+.endm
+
 .macro do_z80_flags_op_rotate
        ; must not change avr carry flag!
 #if EM_Z80
@@ -636,13 +665,12 @@ do_store_am:
 .macro do_z80_flags_op_and
 #if EM_Z80
        ori     z_flags,(1<<ZFL_H)
-#else
-       ori     z_flags,(1<<ZFL_H)
 #endif
 .endm
 
 .macro do_z80_flags_op_or
 #if EM_Z80
+                       ;nothing to do
 #endif
 .endm
 
@@ -720,25 +748,25 @@ do_op_in: ; in a,(opl)
 ;
 ; 
 do_op_inc:
-       inc     opl
-#if EM_Z80
+       ldi     temp,1
+       add     opl,temp
        in      temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, opl
-       or      z_flags,temp2           ;
-       do_z80_flags_HP
+       or      z_flags,temp2                   ;
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        ret
 
 do_op_inca:
-       inc     z_a
-#if EM_Z80
+       ldi     temp,1
+       add     z_a,temp
        in      temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, z_a
-       or      z_flags,temp2           ;
-       do_z80_flags_HP
+       or      z_flags,temp2                   ;
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        ret
 
 ;----------------------------------------------------------------
@@ -753,26 +781,25 @@ do_op_inca:
 ;
 ;
 do_op_dec:
-       dec     opl
-#if EM_Z80
+       subi    opl,1
        in    temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, opl
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
 do_op_deca:
-       dec     z_a
-#if EM_Z80
+       ldi     opl,1
+       sub     z_a,opl
        in    temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, z_a
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -808,14 +835,15 @@ do_op_dec16:
 ;|RLCA      |---- *|Rotate Left Circular |A=A<-                 |
 ;
 ;
-do_op_rlc:
+do_op_rlca:
        ;Rotate Left Cyclical. All bits move 1 to the 
        ;left, the msb becomes c and lsb.
        do_z80_flags_op_rotate
-       lsl    opl
-       brcc   do_op_rlc_noc
-       ori    opl, 1
-       ori    z_flags, (1<<ZFL_C)
+       lsl     z_a
+       brcc    do_op_rlc_noc
+       ldi     temp,1
+       or      z_a,temp
+       ori     z_flags, (1<<ZFL_C)
 do_op_rlc_noc:
        ret
 
@@ -827,14 +855,15 @@ do_op_rlc_noc:
 ;|RRCA      |---- *|Rotate Right Circular|A=->A                 |
 ;
 ;
-do_op_rrc: 
+do_op_rrca
        ;Rotate Right Cyclical. All bits move 1 to the 
        ;right, the lsb becomes c and msb.
        do_z80_flags_op_rotate
-       lsr    opl
-       brcc   do_op_rrc_noc
-       ori    opl, 0x80
-       ori    z_flags, (1<<ZFL_C)
+       lsr     z_a
+       brcc    do_op_rrc_noc
+       ldi     temp,0x80
+       or      z_a,temp
+       ori     z_flags, (1<<ZFL_C)
 do_op_rrc_noc:
        ret
 
@@ -846,15 +875,15 @@ do_op_rrc_noc:
 ;|RRA       |---- *|Rotate Right Acc.    |A=->{CY,A}            |
 ;
 ; 
-do_op_rr: 
+do_op_rra
        ;Rotate Right. All bits move 1 to the right, the lsb 
        ;becomes c, c becomes msb.
        clc                             ; get z80 carry to avr carry
        sbrc    z_flags,ZFL_C
        sec
        do_z80_flags_op_rotate          ; (clear ZFL_C, doesn't change AVR_C)
-       bmov    z_flags,ZFL_C, opl,0    ; Bit 0 --> CY
-       ror     opl
+       bmov    z_flags,ZFL_C, z_a,0    ; Bit 0 --> CY
+       ror     z_a
        ret
 
 ;----------------------------------------------------------------
@@ -865,15 +894,15 @@ do_op_rr:
 ;|RLA       |---- *|Rotate Left Acc.     |A={CY,A}<-            |
 ;
 ; 
-do_op_rl:
+do_op_rla:
        ;Rotate Left. All bits move 1 to the left, the msb 
        ;becomes c, c becomes lsb.
        clc
        sbrc z_flags,ZFL_C
         sec
        do_z80_flags_op_rotate          ; (clear ZFL_C, doesn't change AVR_C)
-       bmov    z_flags,ZFL_C, opl,7    ; Bit 7 --> CY
-       rol opl
+       bmov    z_flags,ZFL_C, z_a,7    ; Bit 7 --> CY
+       rol z_a
        ret
 
 ;----------------------------------------------------------------
@@ -889,7 +918,8 @@ do_op_adda:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P flag
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        ret
 
 ;----------------------------------------------------------------
@@ -908,7 +938,8 @@ do_op_adca:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        ret
 
 ;----------------------------------------------------------------
@@ -924,7 +955,8 @@ do_op_subfa:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -937,13 +969,13 @@ do_op_subfa:
 
 ;
 do_op_cpfa:
-       mov temp,z_a
-       sub temp,opl
-       mov opl,temp
+       mov temp2,z_a
+       sub temp2,opl
        in temp,sreg
-       ldpmx   z_flags,sz53p_tab,opl           ;S,Z,P
+       ldpmx   z_flags,sz53p_tab,temp2         ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -963,7 +995,8 @@ do_op_sbcfa:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -974,7 +1007,7 @@ do_op_sbcfa:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|AND s     |**-P 0|Logical AND          |A=A&s                 |
 ;
-; TODO H-Flag
+;
 do_op_anda:
        and z_a,opl                             ;
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P,N,C
@@ -989,7 +1022,7 @@ do_op_anda:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|OR s      |**-P00|Logical inclusive OR |A=Avs                 |
 ;
-; TODO: H-Flag
+;
 do_op_ora:
        or z_a,opl
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,H,P,N,C
@@ -1003,7 +1036,7 @@ do_op_ora:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|XOR s     |**-P 0|Logical Exclusive OR |A=Axs                 |
 ;
-; TODO: H-Flag
+;
 do_op_xora:
        eor z_a,opl
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,H,P,N,C
@@ -1080,125 +1113,148 @@ do_op_rmem8:
 ;  and subtraction operations. For addition (ADD, ADC, INC) or subtraction
 ;  (SUB, SBC, DEC, NEC), the following table indicates the operation performed:
 ;
-; -------------------------------------------------------------------------------
-; |          | C Flag  | HEX value in | H Flag | HEX value in | Number  | C flag|
-; | Operation| Before  | upper digit  | Before | lower digit  | added   | After |
-; |          | DAA     | (bit 7-4)    | DAA    | (bit 3-0)    | to byte | DAA   |
-; |-----------------------------------------------------------------------------|
-; |          |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
-; |   ADD    |    0    |     0-8      |   0    |     A-F      |   06    |   0   |
-; |          |    0    |     0-9      |   1    |     0-3      |   06    |   0   |
-; |   ADC    |    0    |     A-F      |   0    |     0-9      |   60    |   1   |
-; |          |    0    |     9-F      |   0    |     A-F      |   66    |   1   |
-; |   INC    |    0    |     A-F      |   1    |     0-3      |   66    |   1   |
-; |          |    1    |     0-2      |   0    |     0-9      |   60    |   1   |
-; |          |    1    |     0-2      |   0    |     A-F      |   66    |   1   |
-; |          |    1    |     0-3      |   1    |     0-3      |   66    |   1   |
-; |-----------------------------------------------------------------------------|
-; |   SUB    |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
-; |   SBC    |    0    |     0-8      |   1    |     6-F      |   FA    |   0   |
-; |   DEC    |    1    |     7-F      |   0    |     0-9      |   A0    |   1   |
-; |   NEG    |    1    |     6-F      |   1    |     6-F      |   9A    |   1   |
-; |-----------------------------------------------------------------------------|
-;
-; Flags:
-;     C:   See instruction.
+; -------------------------------------------------------------------
+; |       |C Flag |HEX value in|H Flag |HEX val in | Number |C flag |
+; |  Oper |Before |upper digit |Before |lower digit| added  |After  |
+; |       |DAA    |(bit 7-4)   |DAA    |(bit 3-0)  | to A   |DAA    |
+; |-------+-------+------------+-------+-----------+--------+-------|
+; |       |   0   |    0-9     |   0   |    0-9    |   00   |   0   |
+; |  ADD  |   0   |    0-8     |   0   |    A-F    |   06   |   0   |
+; |       |   0   |    0-9     |   1   |    0-3    |   06   |   0   |
+; |  ADC  |   0   |    A-F     |   0   |    0-9    |   60   |   1   |
+; |       |   0   |    9-F     |   0   |    A-F    |   66   |   1   |
+; |  INC  |   0   |    A-F     |   1   |    0-3    |   66   |   1   |
+; |       |   1   |    0-2     |   0   |    0-9    |   60   |   1   |
+; |       |   1   |    0-2     |   0   |    A-F    |   66   |   1   |
+; |       |   1   |    0-3     |   1   |    0-3    |   66   |   1   |
+; |-------+-------+------------+-------+-----------+--------+-------|
+; |  SUB  |   0   |    0-9     |   0   |    0-9    |   00   |   0   |
+; |  SBC  |   0   |    0-8     |   1   |    6-F    |   FA   |   0   |
+; |  DEC  |   1   |    7-F     |   0   |    0-9    |   A0   |   1   |
+; |  NEG  |   1   |    6-F     |   1   |    6-F    |   9A   |   1   |
+; -------------------------------------------------------------------
+;
+; The H flag is affected as follows:
+;
+; ---------------------
+; | N | H | low   |H' |
+; |   |   |nibble |   |  
+; |---+---+-------+---|
+; | 0 | * |  0-9  | 0 | 
+; | 0 | * |  a-f  | 1 | 
+; | 1 | 0 |   *   | 0 | 
+; | 1 | 1 |  6-f  | 0 | 
+; | 1 | 1 |  0-5  | 1 | 
+; ---------------------
+;
+; Ohter flags:
 ;     N:   Unaffected.
 ;     P/V: Set if Acc. is even parity after operation, reset otherwise.
-;     H:   See instruction.
 ;     Z:   Set if Acc. is Zero after operation, reset otherwise.
 ;     S:   Set if most significant bit of Acc. is 1 after operation, reset otherwise.
 
-
-
 #if 1
+
 do_op_da:
-       ldi     oph,0                           ; what to add
-       sbrc    z_flags,ZFL_H                   ; if H-Flag
-       rjmp    op_da_06
-       mov     temp,opl
-       andi    temp,0x0f                       ; ... or lower digit > 9
-       cpi     temp,0x0a
-       brlo    op_da_06n
-op_da_06:                              
-       ori     oph,0x06
-op_da_06n:                             
-       sbrc    z_flags,(1<<ZFL_C)
-       rjmp    op_da_60
-       cpi     opl,0xa0
-       brlo    op_da_60n
-op_da_60:                              
-       ori     oph,0x60
-op_da_60n:                             
-       cpi     opl,0x9a
-       brlo    op_da_99n
-       ori     z_flags,(1<<ZFL_C); set C
-op_da_99n:
-       sbrs    z_flags,ZFL_N                   ; if sub-op
-       rjmp    op_da_add                       ; then
-       sub     opl,oph
-       rjmp    op_da_ex
-op_da_add:                                     ; else add-op
-       cpi     opl,0x91
-       brlo    op_da_60n2
-       mov     temp,opl
-       andi    temp,0x0f
-       cpi     temp,0x0a
-       brlo    op_da_60n2
-       ori     oph,0x60
-op_da_60n2:
-       add     opl,oph
-op_da_ex:
-       in      temp,SREG       
-       sbrc    temp,AVR_H
-       ori     z_flags,(1<<ZFL_C)
-       andi    z_flags,(1<<ZFL_N)|(1<<ZFL_C)   ; preserve C,N
-       ldpmx   temp2, sz53p_tab, opl           ; get S,Z,P
-       or      z_flags,temp2
-       bmov    z_flags,ZFL_H, temp,AVR_H       ; H  (?)
+
+#if EM_Z80
+       sbrc    z_flags,ZFL_N                   ;if add-op      
+       rjmp    op_da_sub                       ;then
+#endif
+
+op_da_add:
+       ldi     temp2,0                         ;  new C and H flag
+       sbrc    z_flags,ZFL_H                   ;  |
+       rjmp    op_da_a01                       ;  if (H flag ...
+       mov     temp,opl                        ;  |
+       andi    temp,0x0f                       ;  |
+       cpi     temp,0x0a                       ;  or (lower nibble >= 0x0A))
+       brlo    op_da_a10                       ;  |
+op_da_a01:                                     ;  then
+       ldi     oph,0x06                        ;    add 6 to lower nibble
+       add     opl,oph                         ;    
+       brhc    op_da_02                        ;    if 
+       ori     temp2,(1<<ZFL_H)                ;      set new H flag
+op_da_02:                                      ;
+       brcc    op_da_a10                       ;    if
+       ori     temp2,(1<<ZFL_C)                ;      set new H flag
+op_da_a10:                                     ;  endif
+       sbrc    z_flags,ZFL_C                   ;  |
+       rjmp    op_da_a12                       ;  if (C flag ...
+       cpi     opl,0xA0                        ;  |... or upper nibble >= 0xA0)
+       brlo    op_da_a13                       ; 
+op_da_a12:                                     ;
+       ldi     oph,0x60                        ;    add 6 to lower nibble
+       add     opl,oph                         ;
+       ori     temp2,(1<<ZFL_C)                ;      set new C flag
+op_da_a13:                                     ;
+       ldpmx   z_flags, sz53p_tab, opl         ;  get S,Z,P flag
+       or      z_flags,temp2                   ;  merge new C and H flag
        ret
+
+#if EM_Z80
+
+op_da_sub:                                     ;else (sub-op)
+       rcall do_op_inv                         ;  TODO: !
+       ret                                     ;endif
+#endif
+
 #else
 
 do_op_da:
-       sbrc    z_flags,ZFL_N                   ; if add-op     
-       rjmp    do_op_da_sub                    ; then
-       ldi             temp2,0                 ;
-       mov             temp,opl                ;
-       andi    temp,0x0f                       ;
-       cpi             temp,0x0a               ;       if lower digit > 9
-       brlo    do_op_da_h                      ;
-       ori             temp2,0x06              ;               add 6 to lower digit
-do_op_da_h:                                    ;
-       sbrc    z_flags,ZFL_H                   ;   ... or H-Flag
-       ori             temp2,0x06              ;
-       add             opl,temp2               ;
-
-       ldi             temp2,0                 ;
-       mov             temp,opl                ;
-       andi    temp,0xf0                       ;
-       cpi             temp,0xa0               ;
-       brlo    do_op_da_c                      ;
-       ori             temp2,0x60              ;
-do_op_da_c:                                    ; else sub-op
-       sbrc    z_flags,ZFL_C                   ;
-       ori             temp2,0x60              ;
-       andi    z_flags, ~( (1<<ZFL_S) | (1<<ZFL_Z) | (1<<ZFL_H) )
-       add             opl,temp2               ;
-       in              temp,SREG               ;
-       bst             temp,AVR_Z              ;Z-Flag
-       bld             z_flags,ZFL_Z           ;
-       bst             temp,AVR_N              ;S-Flag
-       bst             z_flags,ZFL_S           ;
-       sbrc    temp2,5                         ;C-Flag, set if 0x06 added
-       ori             z_flags,(1<<ZFL_C)      ;
-                                               ;H-Flag?
-       ret
-       
-do_op_da_sub:                                  ;TODO:
-       rcall do_op_inv
+       ldi     temp2,0                         ;new C and H flag
+       ldi     oph,0                           ;oph: what to add
+
+       sbrc    z_flags,ZFL_N                   ;if add-op      
+       rjmp    op_da_sub                       ;then
+op_da_add:
+       mov     temp,opl                        ;  |
+       andi    temp,0x0f                       ;  |
+       cpi     temp,0x0a                       ;  if (lower nibble >= 0x0A)
+       brlo    op_da_a10                       ;  |
+       ori     oph,0x06                        ;    add 6
+       ori     temp2,(1<<ZFL_H)                ;    set new H flag
+
+       sbrc    z_flags,ZFL_C                   ;    |
+       rjmp    op_da_a02                       ;    if (C flag ...
+       cpi     opl,0x90                        ;    |... or upper nibble >= 0x90)
+       brlo    op_da_a03                       ;    |
+op_da_a02:                             
+       ori     oph,0x60                        ;      add 0x60
+       ori     temp2,(1<<ZFL_C)                ;      set new C flag
+op_da_a03:                                     ;    endif
+       rjmp    op_da_ae
+op_da_a10:                                     ;  else (lower nibble is 0x09 or lower)
+       sbrc    z_flags,ZFL_C                   ;    |
+       rjmp    op_da_a12                       ;    if (C flag ...
+       cpi     opl,0xA0                        ;    |... or upper nibble >= 0xA0)
+       brlo    op_da_a13                       ; 
+op_da_a12:                             
+       ori     oph,0x60                        ;      add 0x60
+       ori     temp2,(1<<ZFL_C)                ;      set new C flag
+op_da_a13:
+       sbrs    z_flags,ZFL_H                   ;    if (H flag)
+       rjmp    op_da_ae                        ;    |
+       ori     oph,0x06                        ;      add 0x06
+       mov     temp,opl                        ;      |
+       andi    temp,0x0f                       ;      |
+       cpi     temp,0x06                       ;      if (lower nibble >= 0x0A)
+       brsh    op_da_ae                        ;      |
+       ori     temp2,(1<<ZFL_H)                ;        set new H flag
+                                               ;      endif
+                                               ;    endif
+op_da_ae:
+       add     opl,oph
+       ldpmx   z_flags, sz53p_tab, opl         ; get S,Z,P flag
+       or      z_flags,temp2                   ; merge new C and H flag
        ret
+
+op_da_sub:                                     ;else (sub-op)
+       rcall do_op_inv                         ;  TODO: !
+       ret                                     ;endif
 #endif
 
+
 ;----------------------------------------------------------------
 ;|Mnemonic  |SZHPNC|Description          |Notes                 |
 ;----------------------------------------------------------------
@@ -1207,20 +1263,20 @@ do_op_da_sub:                                   ;TODO:
 ;
 ;
 do_op_scf:
-       andi    z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
+       do_z80_flags_clear_HN
        ori     z_flags,(1<<ZFL_C)
        ret
 
 ;----------------------------------------------------------------
 ;|Mnemonic  |SZHPNC|Description          |Notes                 |
 ;----------------------------------------------------------------
-;|CCF       |--?-0*|Complement Carry Flag|CY=~CY                |
+;|CCF       |--?-0*|Complement Carry Flag|CY=~CY, HC=previous CY|
 ;|----------|SZHP C|---------- 8080 ----------------------------|
-;|SCF       |---- 1|Set Carry Flag       |CY=1                  |
+;|CCF       |---- 1|Set Carry Flag       |CY=1                  |
 ;
-;TODO: H-Flag
 do_op_ccf:
        do_z80_flags_clear_N
+       do_z80_flags_copy_HC
        ldi temp,(1<<ZFL_C)
        eor z_flags,temp
        ret
@@ -1458,36 +1514,36 @@ do_op_ifm: ;sign negative, aka s=1
 ;opcjmp:
 instr  do_fetch_nop,   op_nop,         do_store_nop    ;00             ;NOP
 instr  do_fetch_DIR16, op_nop,         do_store_BC     ;01 nn nn       ;LD BC,nn
-instr  do_fetch_A,     op_nop,         do_store_MBC    ;02             ;LD (BC),A
+instr  do_fetch_nop,   op_nop,         do_store_MBC    ;02             ;LD (BC),A
 instr  do_fetch_BC,    op_INC16,       do_store_BC     ;03             ;INC BC
 instr  do_fetch_B,     op_INC,         do_store_B      ;04             ;INC B
 instr  do_fetch_B,     op_DEC,         do_store_B      ;05             ;DEC B
 instr  do_fetch_DIR8,  op_nop,         do_store_B      ;06             ;LD B,n
-instr  do_fetch_A,     op_RLC,         do_store_A      ;07             ;RLCA
+instr  do_fetch_nop,   op_RLCA,        do_store_nop    ;07             ;RLCA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;08             ;EX AF,AF'
 instr  do_fetch_BC,    op_ADDHL,       do_store_HL     ;09             ;ADD HL,BC
-instr  do_fetch_MBC,   op_nop,         do_store_A      ;0A             ;LD A,(BC)
+instr  do_fetch_MBC,   op_nop,         do_store_nop    ;0A             ;LD A,(BC)
 instr  do_fetch_BC,    op_DEC16,       do_store_BC     ;0B             ;DEC BC
 instr  do_fetch_C,     op_INC,         do_store_C      ;0C             ;INC C
 instr  do_fetch_C,     op_DEC,         do_store_C      ;0D             ;DEC C
 instr  do_fetch_DIR8,  op_nop,         do_store_C      ;0E nn          ;LD C,n
-instr  do_fetch_A,     op_RRC,         do_store_A      ;0F             ;RRCA
+instr  do_fetch_nop,   op_RRCA,        do_store_nop    ;0F             ;RRCA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;10 oo          ;DJNZ o
 instr  do_fetch_DIR16, op_nop,         do_store_DE     ;11 nn nn       ;LD DE,nn
-instr  do_fetch_A,     op_nop,         do_store_MDE    ;12             ;LD (DE),A
+instr  do_fetch_nop,   op_nop,         do_store_MDE    ;12             ;LD (DE),A
 instr  do_fetch_DE,    op_INC16,       do_store_DE     ;13             ;INC DE
 instr  do_fetch_D,     op_INC,         do_store_D      ;14             ;INC D
 instr  do_fetch_D,     op_DEC,         do_store_D      ;15             ;DEC D
 instr  do_fetch_DIR8,  op_nop,         do_store_D      ;16 nn          ;LD D,n
-instr  do_fetch_A,     op_RL,          do_store_A      ;17             ;RLA
+instr  do_fetch_nop,   op_RLA,         do_store_nop    ;17             ;RLA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;18 oo          ;JR o
 instr  do_fetch_DE,    op_ADDHL,       do_store_HL     ;19             ;ADD HL,DE
-instr  do_fetch_MDE,   op_nop,         do_store_A      ;1A             ;LD A,(DE)
+instr  do_fetch_MDE,   op_nop,         do_store_nop    ;1A             ;LD A,(DE)
 instr  do_fetch_DE,    op_DEC16,       do_store_DE     ;1B             ;DEC DE
 instr  do_fetch_E,     op_INC,         do_store_E      ;1C             ;INC E
 instr  do_fetch_E,     op_DEC,         do_store_E      ;1D             ;DEC E
 instr  do_fetch_DIR8,  op_nop,         do_store_E      ;1E nn          ;LD E,n
-instr  do_fetch_A,     op_RR,          do_store_A      ;1F             ;RRA
+instr  do_fetch_nop,   op_RRA,         do_store_nop    ;1F             ;RRA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;20 oo          ;JR NZ,o
 instr  do_fetch_DIR16, op_nop,         do_store_HL     ;21 nn nn       ;LD HL,nn
 instr  do_fetch_DIR16, op_STHL,        do_store_nop    ;22 nn nn       ;LD (nn),HL
@@ -1520,7 +1576,7 @@ instr     do_fetch_nop,   op_INCA,        do_store_nop    ;3C             ;INC A
 instr  do_fetch_nop,   op_DECA,        do_store_nop    ;3D             ;DEC A
 instr  do_fetch_DIR8,  op_nop,         do_store_A      ;3E nn          ;LD A,n
 instr  do_fetch_nop,   op_CCF,         do_store_nop    ;3F             ;CCF (Complement Carry Flag, gvd)
-instr  do_fetch_B,     op_nop,         do_store_B      ;40             ;LD B,B
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;40             ;LD B,B
 instr  do_fetch_C,     op_nop,         do_store_B      ;41             ;LD B,C
 instr  do_fetch_D,     op_nop,         do_store_B      ;42             ;LD B,D
 instr  do_fetch_E,     op_nop,         do_store_B      ;43             ;LD B,E
@@ -1529,7 +1585,7 @@ instr     do_fetch_L,     op_nop,         do_store_B      ;45             ;LD B,L
 instr  do_fetch_MHL,   op_nop,         do_store_B      ;46             ;LD B,(HL)
 instr  do_fetch_A,     op_nop,         do_store_B      ;47             ;LD B,A
 instr  do_fetch_B,     op_nop,         do_store_C      ;48             ;LD C,B
-instr  do_fetch_C,     op_nop,         do_store_C      ;49             ;LD C,C
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;49             ;LD C,C
 instr  do_fetch_D,     op_nop,         do_store_C      ;4A             ;LD C,D
 instr  do_fetch_E,     op_nop,         do_store_C      ;4B             ;LD C,E
 instr  do_fetch_H,     op_nop,         do_store_C      ;4C             ;LD C,H
@@ -1538,7 +1594,7 @@ instr     do_fetch_MHL,   op_nop,         do_store_C      ;4E             ;LD C,(HL)
 instr  do_fetch_A,     op_nop,         do_store_C      ;4F             ;LD C,A
 instr  do_fetch_B,     op_nop,         do_store_D      ;50             ;LD D,B
 instr  do_fetch_C,     op_nop,         do_store_D      ;51             ;LD D,C
-instr  do_fetch_D,     op_nop,         do_store_D      ;52             ;LD D,D
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;52             ;LD D,D
 instr  do_fetch_E,     op_nop,         do_store_D      ;53             ;LD D,E
 instr  do_fetch_H,     op_nop,         do_store_D      ;54             ;LD D,H
 instr  do_fetch_L,     op_nop,         do_store_D      ;55             ;LD D,L
@@ -1547,7 +1603,7 @@ instr     do_fetch_A,     op_nop,         do_store_D      ;57             ;LD D,A
 instr  do_fetch_B,     op_nop,         do_store_E      ;58             ;LD E,B
 instr  do_fetch_C,     op_nop,         do_store_E      ;59             ;LD E,C
 instr  do_fetch_D,     op_nop,         do_store_E      ;5A             ;LD E,D
-instr  do_fetch_E,     op_nop,         do_store_E      ;5B             ;LD E,E
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;5B             ;LD E,E
 instr  do_fetch_H,     op_nop,         do_store_E      ;5C             ;LD E,H
 instr  do_fetch_L,     op_nop,         do_store_E      ;5D             ;LD E,L
 instr  do_fetch_MHL,   op_nop,         do_store_E      ;5E             ;LD E,(HL)
@@ -1556,7 +1612,7 @@ instr     do_fetch_B,     op_nop,         do_store_H      ;60             ;LD H,B
 instr  do_fetch_C,     op_nop,         do_store_H      ;61             ;LD H,C
 instr  do_fetch_D,     op_nop,         do_store_H      ;62             ;LD H,D
 instr  do_fetch_E,     op_nop,         do_store_H      ;63             ;LD H,E
-instr  do_fetch_H,     op_nop,         do_store_H      ;64             ;LD H,H
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;64             ;LD H,H
 instr  do_fetch_L,     op_nop,         do_store_H      ;65             ;LD H,L
 instr  do_fetch_MHL,   op_nop,         do_store_H      ;66             ;LD H,(HL)
 instr  do_fetch_A,     op_nop,         do_store_H      ;67             ;LD H,A
@@ -1565,7 +1621,7 @@ instr     do_fetch_C,     op_nop,         do_store_L      ;69             ;LD L,C
 instr  do_fetch_D,     op_nop,         do_store_L      ;6A             ;LD L,D
 instr  do_fetch_E,     op_nop,         do_store_L      ;6B             ;LD L,E
 instr  do_fetch_H,     op_nop,         do_store_L      ;6C             ;LD L,H
-instr  do_fetch_L,     op_nop,         do_store_L      ;6D             ;LD L,L
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;6D             ;LD L,L
 instr  do_fetch_MHL,   op_nop,         do_store_L      ;6E             ;LD L,(HL)
 instr  do_fetch_A,     op_nop,         do_store_L      ;6F             ;LD L,A
 instr  do_fetch_B,     op_nop,         do_store_MHL    ;70             ;LD (HL),B
@@ -1576,14 +1632,14 @@ instr   do_fetch_H,     op_nop,         do_store_MHL    ;74             ;LD (HL),H
 instr  do_fetch_L,     op_nop,         do_store_MHL    ;75             ;LD (HL),L
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;76             ;HALT
 instr  do_fetch_A,     op_nop,         do_store_MHL    ;77             ;LD (HL),A
-instr  do_fetch_B,     op_nop,         do_store_A      ;78             ;LD A,B
+instr  do_fetch_b,     op_nop,         do_store_A      ;78             ;LD A,B
 instr  do_fetch_C,     op_nop,         do_store_A      ;79             ;LD A,C
 instr  do_fetch_D,     op_nop,         do_store_A      ;7A             ;LD A,D
 instr  do_fetch_E,     op_nop,         do_store_A      ;7B             ;LD A,E
 instr  do_fetch_H,     op_nop,         do_store_A      ;7C             ;LD A,H
 instr  do_fetch_L,     op_nop,         do_store_A      ;7D             ;LD A,L
 instr  do_fetch_MHL,   op_nop,         do_store_A      ;7E             ;LD A,(HL)
-instr  do_fetch_A,     op_nop,         do_store_A      ;7F             ;LD A,A
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;7F             ;LD A,A
 instr  do_fetch_B,     op_ADDA,        do_store_nop    ;80             ;ADD A,B
 instr  do_fetch_C,     op_ADDA,        do_store_nop    ;81             ;ADD A,C
 instr  do_fetch_D,     op_ADDA,        do_store_nop    ;82             ;ADD A,D
index 7d24af2b6999be7e2957fd33dc204cae07f8cb06..bc1d748fceef010b2b3d0ea49fe3b5972c80c2cf 100644 (file)
@@ -46,7 +46,6 @@ z80_init:
        printstring "Ok, CPU is live!"
        printnewline
 
-
 main:
 .if INS_DEBUG
        cbi     flags,trace
@@ -229,13 +228,13 @@ do_fetch_sp:
 do_fetch_mbc:
        lds xh,z_b
        lds xl,z_c
-       mem_read_d opl
+       mem_read_d z_a
        fetch_end
 
 do_fetch_mde:
        lds xh,z_d
        lds xl,z_e
-       mem_read_d opl
+       mem_read_d z_a
        fetch_end
 
 do_fetch_mhl:
@@ -329,13 +328,13 @@ do_store_hl:
 do_store_mbc:
        lds xh,z_b
        lds xl,z_c
-       mem_write_s opl
+       mem_write_s z_a
        store_end
 
 do_store_mde:
        lds xh,z_d
        lds xl,z_e
-       mem_write_s opl
+       mem_write_s z_a
        store_end
 
 do_store_mhl:
@@ -669,10 +668,9 @@ opjumps:
        lpm     @0,z    
 .endm
 
-.macro do_z80_flags_HP
+.macro do_z80_flags_V
 #if EM_Z80
        bmov    z_flags, ZFL_P, temp, AVR_V
-       bmov    z_flags, ZFL_H, temp, AVR_H
 #endif
 .endm
 
@@ -694,6 +692,19 @@ opjumps:
 #endif
 .endm
 
+.macro do_z80_flags_clear_HN
+#if EM_Z80
+       andi    z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
+#endif
+.endm
+
+       
+.macro do_z80_flags_copy_HC
+#if EM_Z80
+       bmov    z_flags, ZFL_H, z_flags, ZFL_H
+#endif
+.endm
+
 .macro do_z80_flags_op_rotate
        ; must not change avr carry flag!
 #if EM_Z80
@@ -706,13 +717,12 @@ opjumps:
 .macro do_z80_flags_op_and
 #if EM_Z80
        ori     z_flags,(1<<ZFL_H)
-#else
-       ori     z_flags,(1<<ZFL_H)
 #endif
 .endm
 
 .macro do_z80_flags_op_or
 #if EM_Z80
+                       ;nothing to do
 #endif
 .endm
 
@@ -720,9 +730,9 @@ opjumps:
 ;----------------------------------------------------------------
 
 do_op_inv:
-       printstring "Invalid opcode @ PC="
-       movw   temp,z_pcl
-       lcall printhexw
+       sbiw    z_pcl,1
+       lcall printregs
+       printstring "Invalid opcode! "
 
 haltinv:
        rjmp haltinv
@@ -750,8 +760,8 @@ do_op_outa: ; out (opl),a
 .endif
        mov temp,z_a
        mov temp2,opl
-       rcall portWrite
-       op_end
+       lcall portWrite
+       ret
 
 ;----------------------------------------------------------------
 ;|Mnemonic  |SZHPNC|Description          |Notes                 |
@@ -769,7 +779,7 @@ do_op_in:   ; in a,(opl)
 .endif
 
        mov temp2,opl
-       rcall portRead
+       lcall portRead
        mov opl,temp
 
 .if PORT_DEBUG
@@ -790,25 +800,25 @@ do_op_in: ; in a,(opl)
 ;
 ; 
 do_op_inc:
-       inc     opl
-#if EM_Z80
+       ldi     temp,1
+       add     opl,temp
        in      temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, opl
        or      z_flags,temp2           ;
-       do_z80_flags_HP
-       op_end
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V  
+op_end
 
 do_op_inca:
-       inc     z_a
-#if EM_Z80
+       ldi     temp,1
+       add     z_a,temp
        in      temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, z_a
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        op_end
 
 ;----------------------------------------------------------------
@@ -823,26 +833,25 @@ do_op_inca:
 ;
 ;
 do_op_dec:
-       dec     opl
-#if EM_Z80
+       subi    opl,1
        in    temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, opl
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        op_end
 
 do_op_deca:
-       dec     z_a
-#if EM_Z80
+       ldi     opl,1
+       sub     z_a,opl
        in    temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, z_a
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        op_end
 
@@ -878,13 +887,14 @@ do_op_dec16:
 ;|RLCA      |---- *|Rotate Left Circular |A=A<-                 |
 ;
 ;
-do_op_rlc:
+do_op_rlca:
        ;Rotate Left Cyclical. All bits move 1 to the 
        ;left, the msb becomes c and lsb.
        do_z80_flags_op_rotate
-       lsl    opl
+       lsl     z_a
        brcc   do_op_rlc_noc
-       ori    opl, 1
+       ldi     temp,1
+       or      z_a,temp
        ori    z_flags, (1<<ZFL_C)
 do_op_rlc_noc:
        op_end
@@ -897,13 +907,14 @@ do_op_rlc_noc:
 ;|RRCA      |---- *|Rotate Right Circular|A=->A                 |
 ;
 ;
-do_op_rrc: 
+do_op_rrca
        ;Rotate Right Cyclical. All bits move 1 to the 
        ;right, the lsb becomes c and msb.
        do_z80_flags_op_rotate
-       lsr    opl
+       lsr     z_a
        brcc   do_op_rrc_noc
-       ori    opl, 0x80
+       ldi     temp,0x80
+       or      z_a,temp
        ori    z_flags, (1<<ZFL_C)
 do_op_rrc_noc:
        op_end
@@ -916,15 +927,15 @@ do_op_rrc_noc:
 ;|RRA       |---- *|Rotate Right Acc.    |A=->{CY,A}            |
 ;
 ; 
-do_op_rr: 
+do_op_rra
        ;Rotate Right. All bits move 1 to the right, the lsb 
        ;becomes c, c becomes msb.
        clc                             ; get z80 carry to avr carry
        sbrc    z_flags,ZFL_C
        sec
        do_z80_flags_op_rotate          ; (clear ZFL_C, doesn't change AVR_C)
-       bmov    z_flags,ZFL_C, opl,0    ; Bit 0 --> CY
-       ror     opl
+       bmov    z_flags,ZFL_C, z_a,0    ; Bit 0 --> CY
+       ror     z_a
        op_end
 
 ;----------------------------------------------------------------
@@ -935,15 +946,15 @@ do_op_rr:
 ;|RLA       |---- *|Rotate Left Acc.     |A={CY,A}<-            |
 ;
 ; 
-do_op_rl:
+do_op_rla:
        ;Rotate Left. All bits move 1 to the left, the msb 
        ;becomes c, c becomes lsb.
        clc
        sbrc z_flags,ZFL_C
         sec
        do_z80_flags_op_rotate          ; (clear ZFL_C, doesn't change AVR_C)
-       bmov    z_flags,ZFL_C, opl,7    ; Bit 7 --> CY
-       rol opl
+       bmov    z_flags,ZFL_C, z_a,7    ; Bit 7 --> CY
+       rol z_a
        op_end
 
 ;----------------------------------------------------------------
@@ -959,7 +970,8 @@ do_op_adda:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P flag
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        op_end
 
 ;----------------------------------------------------------------
@@ -978,7 +990,8 @@ do_op_adca:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        op_end
 
 ;----------------------------------------------------------------
@@ -994,7 +1007,8 @@ do_op_subfa:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        op_end
 
@@ -1007,13 +1021,13 @@ do_op_subfa:
 
 ;
 do_op_cpfa:
-       mov temp,z_a
-       sub temp,opl
-       mov opl,temp
+       mov temp2,z_a
+       sub temp2,opl
        in temp,sreg
-       ldpmx   z_flags,sz53p_tab,opl           ;S,Z,P
+       ldpmx   z_flags,sz53p_tab,temp2         ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        op_end
 
@@ -1033,7 +1047,8 @@ do_op_sbcfa:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        op_end
 
@@ -1044,7 +1059,7 @@ do_op_sbcfa:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|AND s     |**-P 0|Logical AND          |A=A&s                 |
 ;
-; TODO H-Flag
+;
 do_op_anda:
        and z_a,opl                             ;
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P,N,C
@@ -1059,7 +1074,7 @@ do_op_anda:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|OR s      |**-P00|Logical inclusive OR |A=Avs                 |
 ;
-; TODO: H-Flag
+;
 do_op_ora:
        or z_a,opl
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,H,P,N,C
@@ -1073,7 +1088,7 @@ do_op_ora:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|XOR s     |**-P 0|Logical Exclusive OR |A=Axs                 |
 ;
-; TODO: H-Flag
+;
 do_op_xora:
        eor z_a,opl
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,H,P,N,C
@@ -1150,11 +1165,11 @@ do_op_rmem8:
 ;  and subtraction operations. For addition (ADD, ADC, INC) or subtraction
 ;  (SUB, SBC, DEC, NEC), the following table indicates the operation performed:
 ;
-; -------------------------------------------------------------------------------
-; |          | C Flag  | HEX value in | H Flag | HEX value in | Number  | C flag|
-; | Operation| Before  | upper digit  | Before | lower digit  | added   | After |
-; |          | DAA     | (bit 7-4)    | DAA    | (bit 3-0)    | to byte | DAA   |
-; |-----------------------------------------------------------------------------|
+; -------------------------------------------------------------------
+; |       |C Flag |HEX value in|H Flag |HEX val in | Number |C flag |
+; |  Oper |Before |upper digit |Before |lower digit| added  |After  |
+; |       |DAA    |(bit 7-4)   |DAA    |(bit 3-0)  | to A   |DAA    |
+; |-------+-------+------------+-------+-----------+--------+-------|
 ; |          |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
 ; |   ADD    |    0    |     0-8      |   0    |     A-F      |   06    |   0   |
 ; |          |    0    |     0-9      |   1    |     0-3      |   06    |   0   |
@@ -1164,110 +1179,85 @@ do_op_rmem8:
 ; |          |    1    |     0-2      |   0    |     0-9      |   60    |   1   |
 ; |          |    1    |     0-2      |   0    |     A-F      |   66    |   1   |
 ; |          |    1    |     0-3      |   1    |     0-3      |   66    |   1   |
-; |-----------------------------------------------------------------------------|
+; |-------+-------+------------+-------+-----------+--------+-------|
 ; |   SUB    |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
 ; |   SBC    |    0    |     0-8      |   1    |     6-F      |   FA    |   0   |
 ; |   DEC    |    1    |     7-F      |   0    |     0-9      |   A0    |   1   |
 ; |   NEG    |    1    |     6-F      |   1    |     6-F      |   9A    |   1   |
-; |-----------------------------------------------------------------------------|
-;
-; Flags:
-;     C:   See instruction.
+; -------------------------------------------------------------------
+;
+; The H flag is affected as follows:
+;
+; ---------------------
+; | N | H | low   |H' |
+; |   |   |nibble |   |  
+; |---+---+-------+---|
+; | 0 | * |  0-9  | 0 | 
+; | 0 | * |  a-f  | 1 | 
+; | 1 | 0 |   *   | 0 | 
+; | 1 | 1 |  6-f  | 0 | 
+; | 1 | 1 |  0-5  | 1 | 
+; ---------------------
+;
+; Ohter flags:
 ;     N:   Unaffected.
 ;     P/V: Set if Acc. is even parity after operation, reset otherwise.
-;     H:   See instruction.
 ;     Z:   Set if Acc. is Zero after operation, reset otherwise.
 ;     S:   Set if most significant bit of Acc. is 1 after operation, reset otherwise.
 
 
-
-#if 1
 do_op_da:
-       ldi     oph,0                           ; what to add
-       sbrc    z_flags,ZFL_H                   ; if H-Flag
-       rjmp    op_da_06
-       mov     temp,opl
-       andi    temp,0x0f                       ; ... or lower digit > 9
-       cpi     temp,0x0a
-       brlo    op_da_06n
-op_da_06:                              
-       ori     oph,0x06
-op_da_06n:                             
-       sbrc    z_flags,(1<<ZFL_C)
-       rjmp    op_da_60
-       cpi     opl,0xa0
-       brlo    op_da_60n
-op_da_60:                              
-       ori     oph,0x60
-op_da_60n:                             
-       cpi     opl,0x9a
-       brlo    op_da_99n
-       ori     z_flags,(1<<ZFL_C); set C
-op_da_99n:
-       sbrs    z_flags,ZFL_N                   ; if sub-op
-       rjmp    op_da_add                       ; then
-       sub     opl,oph
-       rjmp    op_da_ex
-op_da_add:                                     ; else add-op
-       cpi     opl,0x91
-       brlo    op_da_60n2
-       mov     temp,opl
-       andi    temp,0x0f
-       cpi     temp,0x0a
-       brlo    op_da_60n2
-       ori     oph,0x60
-op_da_60n2:
+       ldi     temp2,0                         ;new C and H flag
+       ldi     oph,0                           ;oph: what to add
+
+       sbrc    z_flags,ZFL_N                   ;if add-op      
+       rjmp    op_da_sub                       ;then
+op_da_add:
+       mov     temp,opl                        ;  |
+       andi    temp,0x0f                       ;  |
+       cpi     temp,0x0a                       ;  if (lower nibble >= 0x0A)
+       brlo    op_da_a10                       ;  |
+       ori     oph,0x06                        ;    add 6
+       ori     temp2,(1<<ZFL_H)                ;    set new H flag
+
+       sbrc    z_flags,ZFL_C                   ;    |
+       rjmp    op_da_a02                       ;    if (C flag ...
+       cpi     opl,0x90                        ;    |... or upper nibble >= 0x90)
+       brlo    op_da_a03                       ;    |
+op_da_a02:                             
+       ori     oph,0x60                        ;      add 0x60
+       ori     temp2,(1<<ZFL_C)                ;      set new C flag
+op_da_a03:                                     ;    endif
+       rjmp    op_da_ae
+op_da_a10:                                     ;  else (lower nibble is 0x09 or lower)
+       sbrc    z_flags,ZFL_C                   ;    |
+       rjmp    op_da_a12                       ;    if (C flag ...
+       cpi     opl,0xA0                        ;    |... or upper nibble >= 0xA0)
+       brlo    op_da_a13                       ; 
+op_da_a12:                             
+       ori     oph,0x60                        ;      add 0x60
+       ori     temp2,(1<<ZFL_C)                ;      set new C flag
+op_da_a13:
+       sbrs    z_flags,ZFL_H                   ;    if (H flag)
+       rjmp    op_da_ae                        ;    |
+       ori     oph,0x06                        ;      add 0x06
+       mov     temp,opl                        ;      |
+       andi    temp,0x0f                       ;      |
+       cpi     temp,0x06                       ;      if (lower nibble >= 0x0A)
+       brsh    op_da_ae                        ;      |
+       ori     temp2,(1<<ZFL_H)                ;        set new H flag
+                                               ;      endif
+                                               ;    endif
+op_da_ae:
        add     opl,oph
-op_da_ex:
-       in      temp,SREG       
-       sbrc    temp,AVR_H
-       ori     z_flags,(1<<ZFL_C)
-       andi    z_flags,(1<<ZFL_N)|(1<<ZFL_C)   ; preserve C,N
-       ldpmx   temp2, sz53p_tab, opl           ; get S,Z,P
-       or      z_flags,temp2
-       bmov    z_flags,ZFL_H, temp,AVR_H       ; H  (?)
+       ldpmx   z_flags, sz53p_tab, opl         ; get S,Z,P flag
+       or      z_flags,temp2                   ; merge new C and H flag
        op_end
-#else
 
-do_op_da:
-       sbrc    z_flags,ZFL_N                   ; if add-op     
-       rjmp    do_op_da_sub                    ; then
-       ldi             temp2,0                 ;
-       mov             temp,opl                ;
-       andi    temp,0x0f                       ;
-       cpi             temp,0x0a               ;       if lower digit > 9
-       brlo    do_op_da_h                      ;
-       ori             temp2,0x06              ;               add 6 to lower digit
-do_op_da_h:                                    ;
-       sbrc    z_flags,ZFL_H                   ;   ... or H-Flag
-       ori             temp2,0x06              ;
-       add             opl,temp2               ;
-
-       ldi             temp2,0                 ;
-       mov             temp,opl                ;
-       andi    temp,0xf0                       ;
-       cpi             temp,0xa0               ;
-       brlo    do_op_da_c                      ;
-       ori             temp2,0x60              ;
-do_op_da_c:                                    ; else sub-op
-       sbrc    z_flags,ZFL_C                   ;
-       ori             temp2,0x60              ;
-       andi    z_flags, ~( (1<<ZFL_S) | (1<<ZFL_Z) | (1<<ZFL_H) )
-       add             opl,temp2               ;
-       in              temp,SREG               ;
-       bst             temp,AVR_Z              ;Z-Flag
-       bld             z_flags,ZFL_Z           ;
-       bst             temp,AVR_N              ;S-Flag
-       bst             z_flags,ZFL_S           ;
-       sbrc    temp2,5                         ;C-Flag, set if 0x06 added
-       ori             z_flags,(1<<ZFL_C)      ;
-                                               ;H-Flag?
+op_da_sub:                                     ;else (sub-op)
+       rcall do_op_inv                         ;  TODO: !
+                                               ;endif
        op_end
-       
-do_op_da_sub:                                  ;TODO:
-       rcall do_op_inv
-       op_end
-#endif
 
 ;----------------------------------------------------------------
 ;|Mnemonic  |SZHPNC|Description          |Notes                 |
@@ -1277,20 +1267,20 @@ do_op_da_sub:                                   ;TODO:
 ;
 ;
 do_op_scf:
-       andi    z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
+       do_z80_flags_clear_HN
        ori     z_flags,(1<<ZFL_C)
        op_end
 
 ;----------------------------------------------------------------
 ;|Mnemonic  |SZHPNC|Description          |Notes                 |
 ;----------------------------------------------------------------
-;|CCF       |--?-0*|Complement Carry Flag|CY=~CY                |
+;|CCF       |--?-0*|Complement Carry Flag|CY=~CY, HC=previous CY|
 ;|----------|SZHP C|---------- 8080 ----------------------------|
-;|SCF       |---- 1|Set Carry Flag       |CY=1                  |
+;|CCF       |---- 1|Set Carry Flag       |CY=1                  |
 ;
-;TODO: H-Flag
 do_op_ccf:
        do_z80_flags_clear_N
+       do_z80_flags_copy_HC
        ldi temp,(1<<ZFL_C)
        eor z_flags,temp
        op_end
@@ -1510,36 +1500,36 @@ do_op_ifm: ;sign negative, aka s=1
 todo_table:
 instr  do_fetch_nop,   op_nop,         do_store_nop    ;00             ;NOP
 instr  do_fetch_DIR16, op_nop,         do_store_BC     ;01 nn nn       ;LD BC,nn
-instr  do_fetch_A,     op_nop,         do_store_MBC    ;02             ;LD (BC),A
+instr  do_fetch_nop,   op_nop,         do_store_MBC    ;02             ;LD (BC),A
 instr  do_fetch_BC,    op_INC16,       do_store_BC     ;03             ;INC BC
 instr  do_fetch_B,     op_INC,         do_store_B      ;04             ;INC B
 instr  do_fetch_B,     op_DEC,         do_store_B      ;05             ;DEC B
 instr  do_fetch_DIR8,  op_nop,         do_store_B      ;06             ;LD B,n
-instr  do_fetch_A,     op_RLC,         do_store_A      ;07             ;RLCA
+instr  do_fetch_nop,   op_RLCA,        do_store_nop    ;07             ;RLCA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;08             ;EX AF,AF'
 instr  do_fetch_BC,    op_ADDHL,       do_store_HL     ;09             ;ADD HL,BC
-instr  do_fetch_MBC,   op_nop,         do_store_A      ;0A             ;LD A,(BC)
+instr  do_fetch_MBC,   op_nop,         do_store_nop    ;0A             ;LD A,(BC)
 instr  do_fetch_BC,    op_DEC16,       do_store_BC     ;0B             ;DEC BC
 instr  do_fetch_C,     op_INC,         do_store_C      ;0C             ;INC C
 instr  do_fetch_C,     op_DEC,         do_store_C      ;0D             ;DEC C
 instr  do_fetch_DIR8,  op_nop,         do_store_C      ;0E nn          ;LD C,n
-instr  do_fetch_A,     op_RRC,         do_store_A      ;0F             ;RRCA
+instr  do_fetch_nop,   op_RRCA,        do_store_nop    ;0F             ;RRCA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;10 oo          ;DJNZ o
 instr  do_fetch_DIR16, op_nop,         do_store_DE     ;11 nn nn       ;LD DE,nn
-instr  do_fetch_A,     op_nop,         do_store_MDE    ;12             ;LD (DE),A
+instr  do_fetch_nop,   op_nop,         do_store_MDE    ;12             ;LD (DE),A
 instr  do_fetch_DE,    op_INC16,       do_store_DE     ;13             ;INC DE
 instr  do_fetch_D,     op_INC,         do_store_D      ;14             ;INC D
 instr  do_fetch_D,     op_DEC,         do_store_D      ;15             ;DEC D
 instr  do_fetch_DIR8,  op_nop,         do_store_D      ;16 nn          ;LD D,n
-instr  do_fetch_A,     op_RL,          do_store_A      ;17             ;RLA
+instr  do_fetch_nop,   op_RLA,         do_store_nop    ;17             ;RLA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;18 oo          ;JR o
 instr  do_fetch_DE,    op_ADDHL,       do_store_HL     ;19             ;ADD HL,DE
-instr  do_fetch_MDE,   op_nop,         do_store_A      ;1A             ;LD A,(DE)
+instr  do_fetch_MDE,   op_nop,         do_store_nop    ;1A             ;LD A,(DE)
 instr  do_fetch_DE,    op_DEC16,       do_store_DE     ;1B             ;DEC DE
 instr  do_fetch_E,     op_INC,         do_store_E      ;1C             ;INC E
 instr  do_fetch_E,     op_DEC,         do_store_E      ;1D             ;DEC E
 instr  do_fetch_DIR8,  op_nop,         do_store_E      ;1E nn          ;LD E,n
-instr  do_fetch_A,     op_RR,          do_store_A      ;1F             ;RRA
+instr  do_fetch_nop,   op_RRA,         do_store_nop    ;1F             ;RRA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;20 oo          ;JR NZ,o
 instr  do_fetch_DIR16, op_nop,         do_store_HL     ;21 nn nn       ;LD HL,nn
 instr  do_fetch_DIR16, op_STHL,        do_store_nop    ;22 nn nn       ;LD (nn),HL
@@ -1572,7 +1562,7 @@ instr     do_fetch_nop,   op_INCA,        do_store_nop    ;3C             ;INC A
 instr  do_fetch_nop,   op_DECA,        do_store_nop    ;3D             ;DEC A
 instr  do_fetch_DIR8,  op_nop,         do_store_A      ;3E nn          ;LD A,n
 instr  do_fetch_nop,   op_CCF,         do_store_nop    ;3F             ;CCF (Complement Carry Flag, gvd)
-instr  do_fetch_B,     op_nop,         do_store_B      ;40             ;LD B,B
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;40             ;LD B,B
 instr  do_fetch_C,     op_nop,         do_store_B      ;41             ;LD B,C
 instr  do_fetch_D,     op_nop,         do_store_B      ;42             ;LD B,D
 instr  do_fetch_E,     op_nop,         do_store_B      ;43             ;LD B,E
@@ -1581,7 +1571,7 @@ instr     do_fetch_L,     op_nop,         do_store_B      ;45             ;LD B,L
 instr  do_fetch_MHL,   op_nop,         do_store_B      ;46             ;LD B,(HL)
 instr  do_fetch_A,     op_nop,         do_store_B      ;47             ;LD B,A
 instr  do_fetch_B,     op_nop,         do_store_C      ;48             ;LD C,B
-instr  do_fetch_C,     op_nop,         do_store_C      ;49             ;LD C,C
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;49             ;LD C,C
 instr  do_fetch_D,     op_nop,         do_store_C      ;4A             ;LD C,D
 instr  do_fetch_E,     op_nop,         do_store_C      ;4B             ;LD C,E
 instr  do_fetch_H,     op_nop,         do_store_C      ;4C             ;LD C,H
@@ -1590,7 +1580,7 @@ instr     do_fetch_MHL,   op_nop,         do_store_C      ;4E             ;LD C,(HL)
 instr  do_fetch_A,     op_nop,         do_store_C      ;4F             ;LD C,A
 instr  do_fetch_B,     op_nop,         do_store_D      ;50             ;LD D,B
 instr  do_fetch_C,     op_nop,         do_store_D      ;51             ;LD D,C
-instr  do_fetch_D,     op_nop,         do_store_D      ;52             ;LD D,D
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;52             ;LD D,D
 instr  do_fetch_E,     op_nop,         do_store_D      ;53             ;LD D,E
 instr  do_fetch_H,     op_nop,         do_store_D      ;54             ;LD D,H
 instr  do_fetch_L,     op_nop,         do_store_D      ;55             ;LD D,L
@@ -1599,7 +1589,7 @@ instr     do_fetch_A,     op_nop,         do_store_D      ;57             ;LD D,A
 instr  do_fetch_B,     op_nop,         do_store_E      ;58             ;LD E,B
 instr  do_fetch_C,     op_nop,         do_store_E      ;59             ;LD E,C
 instr  do_fetch_D,     op_nop,         do_store_E      ;5A             ;LD E,D
-instr  do_fetch_E,     op_nop,         do_store_E      ;5B             ;LD E,E
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;5B             ;LD E,E
 instr  do_fetch_H,     op_nop,         do_store_E      ;5C             ;LD E,H
 instr  do_fetch_L,     op_nop,         do_store_E      ;5D             ;LD E,L
 instr  do_fetch_MHL,   op_nop,         do_store_E      ;5E             ;LD E,(HL)
@@ -1608,7 +1598,7 @@ instr     do_fetch_B,     op_nop,         do_store_H      ;60             ;LD H,B
 instr  do_fetch_C,     op_nop,         do_store_H      ;61             ;LD H,C
 instr  do_fetch_D,     op_nop,         do_store_H      ;62             ;LD H,D
 instr  do_fetch_E,     op_nop,         do_store_H      ;63             ;LD H,E
-instr  do_fetch_H,     op_nop,         do_store_H      ;64             ;LD H,H
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;64             ;LD H,H
 instr  do_fetch_L,     op_nop,         do_store_H      ;65             ;LD H,L
 instr  do_fetch_MHL,   op_nop,         do_store_H      ;66             ;LD H,(HL)
 instr  do_fetch_A,     op_nop,         do_store_H      ;67             ;LD H,A
@@ -1617,7 +1607,7 @@ instr     do_fetch_C,     op_nop,         do_store_L      ;69             ;LD L,C
 instr  do_fetch_D,     op_nop,         do_store_L      ;6A             ;LD L,D
 instr  do_fetch_E,     op_nop,         do_store_L      ;6B             ;LD L,E
 instr  do_fetch_H,     op_nop,         do_store_L      ;6C             ;LD L,H
-instr  do_fetch_L,     op_nop,         do_store_L      ;6D             ;LD L,L
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;6D             ;LD L,L
 instr  do_fetch_MHL,   op_nop,         do_store_L      ;6E             ;LD L,(HL)
 instr  do_fetch_A,     op_nop,         do_store_L      ;6F             ;LD L,A
 instr  do_fetch_B,     op_nop,         do_store_MHL    ;70             ;LD (HL),B
@@ -1635,7 +1625,7 @@ instr     do_fetch_E,     op_nop,         do_store_A      ;7B             ;LD A,E
 instr  do_fetch_H,     op_nop,         do_store_A      ;7C             ;LD A,H
 instr  do_fetch_L,     op_nop,         do_store_A      ;7D             ;LD A,L
 instr  do_fetch_MHL,   op_nop,         do_store_A      ;7E             ;LD A,(HL)
-instr  do_fetch_A,     op_nop,         do_store_A      ;7F             ;LD A,A
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;7F             ;LD A,A
 instr  do_fetch_B,     op_ADDA,        do_store_nop    ;80             ;ADD A,B
 instr  do_fetch_C,     op_ADDA,        do_store_nop    ;81             ;ADD A,C
 instr  do_fetch_D,     op_ADDA,        do_store_nop    ;82             ;ADD A,D
@@ -1765,6 +1755,7 @@ instr     do_fetch_nop,   op_INV,         do_store_nop    ;FD             ;(Z80 specific)
 instr  do_fetch_DIR8,  op_CPFA,        do_store_nop    ;FE nn          ;CP n
 instr  do_fetch_RST,   op_nop,         do_store_CALL   ;FF             ;RST 38H
 
+
 ;----------------------------------------------------------------
 ; Lookup table, stolen from z80ex, Z80 emulation library.
 ; http://z80ex.sourceforge.net/
index 149dff626b4b99cd77586345d578d48dbda76bf8..724c0cd09d8781e9331849dc74e955083f67775f 100644 (file)
@@ -24,7 +24,6 @@
 ;    $Id$
 ;
 
-
        .dseg
        
 z_b:   .byte   1
@@ -257,13 +256,13 @@ do_fetch_sp:
 do_fetch_mbc:
        lds xh,z_b
        lds xl,z_c
-       mem_read_d opl
+       mem_read_d z_a
        ret
 
 do_fetch_mde:
        lds xh,z_d
        lds xl,z_e
-       mem_read_d opl
+       mem_read_d z_a
        ret
 
 do_fetch_mhl:
@@ -357,13 +356,13 @@ do_store_hl:
 do_store_mbc:
        lds xh,z_b
        lds xl,z_c
-       mem_write_s opl
+       mem_write_s z_a
        ret
 
 do_store_mde:
        lds xh,z_d
        lds xl,z_e
-       mem_write_s opl
+       mem_write_s z_a
        ret
 
 do_store_mhl:
@@ -433,6 +432,8 @@ do_store_am:
        mem_write_ds op, z_a
        ret
 
+
+
 ; ------------ Operation phase stuff -----------------
 
 ;.org (PC+255) & 0xff00
@@ -672,6 +673,7 @@ opjumps:
 .equ ZFL_N = 1
 .equ ZFL_C = 0
 
+
 .equ AVR_T = SREG_T
 .equ AVR_H = SREG_H
 .equ AVR_S = SREG_S
@@ -693,10 +695,9 @@ opjumps:
        lpm     @0,z    
 .endm
 
-.macro do_z80_flags_HP
+.macro do_z80_flags_V
 #if EM_Z80
        bmov    z_flags, ZFL_P, temp, AVR_V
-       bmov    z_flags, ZFL_H, temp, AVR_H
 #endif
 .endm
 
@@ -718,6 +719,19 @@ opjumps:
 #endif
 .endm
 
+.macro do_z80_flags_clear_HN
+#if EM_Z80
+       andi    z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
+#endif
+.endm
+
+       
+.macro do_z80_flags_copy_HC
+#if EM_Z80
+       bmov    z_flags, ZFL_H, z_flags, ZFL_H
+#endif
+.endm
+
 .macro do_z80_flags_op_rotate
        ; must not change avr carry flag!
 #if EM_Z80
@@ -730,13 +744,12 @@ opjumps:
 .macro do_z80_flags_op_and
 #if EM_Z80
        ori     z_flags,(1<<ZFL_H)
-#else
-       ori     z_flags,(1<<ZFL_H)
 #endif
 .endm
 
 .macro do_z80_flags_op_or
 #if EM_Z80
+                       ;nothing to do
 #endif
 .endm
 
@@ -744,9 +757,9 @@ opjumps:
 ;----------------------------------------------------------------
 
 do_op_inv:
-       printstring "Invalid opcode @ PC="
-       movw   temp,z_pcl
-       lcall printhexw
+       sbiw    z_pcl,1
+       lcall printregs
+       printstring "Invalid opcode! "
 
 haltinv:
        rjmp haltinv
@@ -774,7 +787,7 @@ do_op_outa: ; out (opl),a
 .endif
        mov temp,z_a
        mov temp2,opl
-       rcall portWrite
+       lcall portWrite
        ret
 
 ;----------------------------------------------------------------
@@ -793,7 +806,7 @@ do_op_in:   ; in a,(opl)
 .endif
 
        mov temp2,opl
-       rcall portRead
+       lcall portRead
        mov opl,temp
 
 .if PORT_DEBUG
@@ -814,25 +827,25 @@ do_op_in: ; in a,(opl)
 ;
 ; 
 do_op_inc:
-       inc     opl
-#if EM_Z80
+       ldi     temp,1
+       add     opl,temp
        in      temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, opl
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        ret
 
 do_op_inca:
-       inc     z_a
-#if EM_Z80
+       ldi     temp,1
+       add     z_a,temp
        in      temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, z_a
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        ret
 
 ;----------------------------------------------------------------
@@ -847,26 +860,25 @@ do_op_inca:
 ;
 ;
 do_op_dec:
-       dec     opl
-#if EM_Z80
+       subi    opl,1
        in    temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, opl
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
 do_op_deca:
-       dec     z_a
-#if EM_Z80
+       ldi     opl,1
+       sub     z_a,opl
        in    temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, z_a
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -902,13 +914,14 @@ do_op_dec16:
 ;|RLCA      |---- *|Rotate Left Circular |A=A<-                 |
 ;
 ;
-do_op_rlc:
+do_op_rlca:
        ;Rotate Left Cyclical. All bits move 1 to the 
        ;left, the msb becomes c and lsb.
        do_z80_flags_op_rotate
-       lsl    opl
+       lsl     z_a
        brcc   do_op_rlc_noc
-       ori    opl, 1
+       ldi     temp,1
+       or      z_a,temp
        ori    z_flags, (1<<ZFL_C)
 do_op_rlc_noc:
        ret
@@ -921,13 +934,14 @@ do_op_rlc_noc:
 ;|RRCA      |---- *|Rotate Right Circular|A=->A                 |
 ;
 ;
-do_op_rrc: 
+do_op_rrca
        ;Rotate Right Cyclical. All bits move 1 to the 
        ;right, the lsb becomes c and msb.
        do_z80_flags_op_rotate
-       lsr    opl
+       lsr     z_a
        brcc   do_op_rrc_noc
-       ori    opl, 0x80
+       ldi     temp,0x80
+       or      z_a,temp
        ori    z_flags, (1<<ZFL_C)
 do_op_rrc_noc:
        ret
@@ -940,15 +954,15 @@ do_op_rrc_noc:
 ;|RRA       |---- *|Rotate Right Acc.    |A=->{CY,A}            |
 ;
 ; 
-do_op_rr: 
+do_op_rra
        ;Rotate Right. All bits move 1 to the right, the lsb 
        ;becomes c, c becomes msb.
        clc                             ; get z80 carry to avr carry
        sbrc    z_flags,ZFL_C
        sec
        do_z80_flags_op_rotate          ; (clear ZFL_C, doesn't change AVR_C)
-       bmov    z_flags,ZFL_C, opl,0    ; Bit 0 --> CY
-       ror     opl
+       bmov    z_flags,ZFL_C, z_a,0    ; Bit 0 --> CY
+       ror     z_a
        ret
 
 ;----------------------------------------------------------------
@@ -959,15 +973,15 @@ do_op_rr:
 ;|RLA       |---- *|Rotate Left Acc.     |A={CY,A}<-            |
 ;
 ; 
-do_op_rl:
+do_op_rla:
        ;Rotate Left. All bits move 1 to the left, the msb 
        ;becomes c, c becomes lsb.
        clc
        sbrc z_flags,ZFL_C
         sec
        do_z80_flags_op_rotate          ; (clear ZFL_C, doesn't change AVR_C)
-       bmov    z_flags,ZFL_C, opl,7    ; Bit 7 --> CY
-       rol opl
+       bmov    z_flags,ZFL_C, z_a,7    ; Bit 7 --> CY
+       rol z_a
        ret
 
 ;----------------------------------------------------------------
@@ -983,7 +997,8 @@ do_op_adda:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P flag
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        ret
 
 ;----------------------------------------------------------------
@@ -1002,7 +1017,8 @@ do_op_adca:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        ret
 
 ;----------------------------------------------------------------
@@ -1018,7 +1034,8 @@ do_op_subfa:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -1031,13 +1048,13 @@ do_op_subfa:
 
 ;
 do_op_cpfa:
-       mov temp,z_a
-       sub temp,opl
-       mov opl,temp
+       mov temp2,z_a
+       sub temp2,opl
        in temp,sreg
-       ldpmx   z_flags,sz53p_tab,opl           ;S,Z,P
+       ldpmx   z_flags,sz53p_tab,temp2         ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -1057,7 +1074,8 @@ do_op_sbcfa:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -1068,7 +1086,7 @@ do_op_sbcfa:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|AND s     |**-P 0|Logical AND          |A=A&s                 |
 ;
-; TODO H-Flag
+;
 do_op_anda:
        and z_a,opl                             ;
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P,N,C
@@ -1083,7 +1101,7 @@ do_op_anda:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|OR s      |**-P00|Logical inclusive OR |A=Avs                 |
 ;
-; TODO: H-Flag
+;
 do_op_ora:
        or z_a,opl
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,H,P,N,C
@@ -1097,7 +1115,7 @@ do_op_ora:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|XOR s     |**-P 0|Logical Exclusive OR |A=Axs                 |
 ;
-; TODO: H-Flag
+;
 do_op_xora:
        eor z_a,opl
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,H,P,N,C
@@ -1174,11 +1192,11 @@ do_op_rmem8:
 ;  and subtraction operations. For addition (ADD, ADC, INC) or subtraction
 ;  (SUB, SBC, DEC, NEC), the following table indicates the operation performed:
 ;
-; -------------------------------------------------------------------------------
-; |          | C Flag  | HEX value in | H Flag | HEX value in | Number  | C flag|
-; | Operation| Before  | upper digit  | Before | lower digit  | added   | After |
-; |          | DAA     | (bit 7-4)    | DAA    | (bit 3-0)    | to byte | DAA   |
-; |-----------------------------------------------------------------------------|
+; -------------------------------------------------------------------
+; |       |C Flag |HEX value in|H Flag |HEX val in | Number |C flag |
+; |  Oper |Before |upper digit |Before |lower digit| added  |After  |
+; |       |DAA    |(bit 7-4)   |DAA    |(bit 3-0)  | to A   |DAA    |
+; |-------+-------+------------+-------+-----------+--------+-------|
 ; |          |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
 ; |   ADD    |    0    |     0-8      |   0    |     A-F      |   06    |   0   |
 ; |          |    0    |     0-9      |   1    |     0-3      |   06    |   0   |
@@ -1188,110 +1206,86 @@ do_op_rmem8:
 ; |          |    1    |     0-2      |   0    |     0-9      |   60    |   1   |
 ; |          |    1    |     0-2      |   0    |     A-F      |   66    |   1   |
 ; |          |    1    |     0-3      |   1    |     0-3      |   66    |   1   |
-; |-----------------------------------------------------------------------------|
+; |-------+-------+------------+-------+-----------+--------+-------|
 ; |   SUB    |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
 ; |   SBC    |    0    |     0-8      |   1    |     6-F      |   FA    |   0   |
 ; |   DEC    |    1    |     7-F      |   0    |     0-9      |   A0    |   1   |
 ; |   NEG    |    1    |     6-F      |   1    |     6-F      |   9A    |   1   |
-; |-----------------------------------------------------------------------------|
-;
-; Flags:
-;     C:   See instruction.
+; -------------------------------------------------------------------
+;
+; The H flag is affected as follows:
+;
+; ---------------------
+; | N | H | low   |H' |
+; |   |   |nibble |   |  
+; |---+---+-------+---|
+; | 0 | * |  0-9  | 0 | 
+; | 0 | * |  a-f  | 1 | 
+; | 1 | 0 |   *   | 0 | 
+; | 1 | 1 |  6-f  | 0 | 
+; | 1 | 1 |  0-5  | 1 | 
+; ---------------------
+;
+; Ohter flags:
 ;     N:   Unaffected.
 ;     P/V: Set if Acc. is even parity after operation, reset otherwise.
-;     H:   See instruction.
 ;     Z:   Set if Acc. is Zero after operation, reset otherwise.
 ;     S:   Set if most significant bit of Acc. is 1 after operation, reset otherwise.
 
 
-
-#if 1
 do_op_da:
-       ldi     oph,0                           ; what to add
-       sbrc    z_flags,ZFL_H                   ; if H-Flag
-       rjmp    op_da_06
-       mov     temp,opl
-       andi    temp,0x0f                       ; ... or lower digit > 9
-       cpi     temp,0x0a
-       brlo    op_da_06n
-op_da_06:                              
-       ori     oph,0x06
-op_da_06n:                             
-       sbrc    z_flags,(1<<ZFL_C)
-       rjmp    op_da_60
-       cpi     opl,0xa0
-       brlo    op_da_60n
-op_da_60:                              
-       ori     oph,0x60
-op_da_60n:                             
-       cpi     opl,0x9a
-       brlo    op_da_99n
-       ori     z_flags,(1<<ZFL_C); set C
-op_da_99n:
-       sbrs    z_flags,ZFL_N                   ; if sub-op
-       rjmp    op_da_add                       ; then
-       sub     opl,oph
-       rjmp    op_da_ex
-op_da_add:                                     ; else add-op
-       cpi     opl,0x91
-       brlo    op_da_60n2
-       mov     temp,opl
-       andi    temp,0x0f
-       cpi     temp,0x0a
-       brlo    op_da_60n2
-       ori     oph,0x60
-op_da_60n2:
+       ldi     temp2,0                         ;new C and H flag
+       ldi     oph,0                           ;oph: what to add
+
+       sbrc    z_flags,ZFL_N                   ;if add-op      
+       rjmp    op_da_sub                       ;then
+op_da_add:
+       mov     temp,opl                        ;  |
+       andi    temp,0x0f                       ;  |
+       cpi     temp,0x0a                       ;  if (lower nibble >= 0x0A)
+       brlo    op_da_a10                       ;  |
+       ori     oph,0x06                        ;    add 6
+       ori     temp2,(1<<ZFL_H)                ;    set new H flag
+
+       sbrc    z_flags,ZFL_C                   ;    |
+       rjmp    op_da_a02                       ;    if (C flag ...
+       cpi     opl,0x90                        ;    |... or upper nibble >= 0x90)
+       brlo    op_da_a03                       ;    |
+op_da_a02:                             
+       ori     oph,0x60                        ;      add 0x60
+       ori     temp2,(1<<ZFL_C)                ;      set new C flag
+op_da_a03:                                     ;    endif
+       rjmp    op_da_ae
+op_da_a10:                                     ;  else (lower nibble is 0x09 or lower)
+       sbrc    z_flags,ZFL_C                   ;    |
+       rjmp    op_da_a12                       ;    if (C flag ...
+       cpi     opl,0xA0                        ;    |... or upper nibble >= 0xA0)
+       brlo    op_da_a13                       ; 
+op_da_a12:                             
+       ori     oph,0x60                        ;      add 0x60
+       ori     temp2,(1<<ZFL_C)                ;      set new C flag
+op_da_a13:
+       sbrs    z_flags,ZFL_H                   ;    if (H flag)
+       rjmp    op_da_ae                        ;    |
+       ori     oph,0x06                        ;      add 0x06
+       mov     temp,opl                        ;      |
+       andi    temp,0x0f                       ;      |
+       cpi     temp,0x06                       ;      if (lower nibble >= 0x0A)
+       brsh    op_da_ae                        ;      |
+       ori     temp2,(1<<ZFL_H)                ;        set new H flag
+                                               ;      endif
+                                               ;    endif
+op_da_ae:
        add     opl,oph
-op_da_ex:
-       in      temp,SREG       
-       sbrc    temp,AVR_H
-       ori     z_flags,(1<<ZFL_C)
-       andi    z_flags,(1<<ZFL_N)|(1<<ZFL_C)   ; preserve C,N
-       ldpmx   temp2, sz53p_tab, opl           ; get S,Z,P
-       or      z_flags,temp2
-       bmov    z_flags,ZFL_H, temp,AVR_H       ; H  (?)
-       ret
-#else
-
-do_op_da:
-       sbrc    z_flags,ZFL_N                   ; if add-op     
-       rjmp    do_op_da_sub                    ; then
-       ldi             temp2,0                 ;
-       mov             temp,opl                ;
-       andi    temp,0x0f                       ;
-       cpi             temp,0x0a               ;if lower digit > 9
-       brlo    do_op_da_h                      ;
-       ori             temp2,0x06              ;       add 6 to lower digit
-do_op_da_h:                                    ;
-       sbrc    z_flags,ZFL_H                   ;   ... or H-Flag
-       ori             temp2,0x06              ;
-       add             opl,temp2               ;
-
-       ldi             temp2,0                 ;
-       mov             temp,opl                ;
-       andi    temp,0xf0                       ;
-       cpi             temp,0xa0               ;
-       brlo    do_op_da_c                      ;
-       ori             temp2,0x60              ;
-do_op_da_c:                                    ; else sub-op
-       sbrc    z_flags,ZFL_C                   ;
-       ori             temp2,0x60              ;
-       andi    z_flags, ~( (1<<ZFL_S) | (1<<ZFL_Z) | (1<<ZFL_H) )
-       add             opl,temp2               ;
-       in              temp,SREG               ;
-       bst             temp,AVR_Z              ;Z-Flag
-       bld             z_flags,ZFL_Z           ;
-       bst             temp,AVR_N              ;S-Flag
-       bst             z_flags,ZFL_S           ;
-       sbrc    temp2,5                         ;C-Flag, set if 0x06 added
-       ori             z_flags,(1<<ZFL_C)      ;
-                                               ;H-Flag?
+       ldpmx   z_flags, sz53p_tab, opl         ; get S,Z,P flag
+       or      z_flags,temp2                   ; merge new C and H flag
        ret
        
-do_op_da_sub:                                  ;TODO:
-       rcall do_op_inv
-       ret
-#endif
+op_da_sub:                                     ;else (sub-op)
+       rcall do_op_inv                         ;  TODO: !
+       ret                                     ;endif
+
+
 
 ;----------------------------------------------------------------
 ;|Mnemonic  |SZHPNC|Description          |Notes                 |
@@ -1301,20 +1295,20 @@ do_op_da_sub:                                   ;TODO:
 ;
 ;
 do_op_scf:
-       andi    z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
+       do_z80_flags_clear_HN
        ori     z_flags,(1<<ZFL_C)
        ret
 
 ;----------------------------------------------------------------
 ;|Mnemonic  |SZHPNC|Description          |Notes                 |
 ;----------------------------------------------------------------
-;|CCF       |--?-0*|Complement Carry Flag|CY=~CY                |
+;|CCF       |--?-0*|Complement Carry Flag|CY=~CY, HC=previous CY|
 ;|----------|SZHP C|---------- 8080 ----------------------------|
-;|SCF       |---- 1|Set Carry Flag       |CY=1                  |
+;|CCF       |---- 1|Set Carry Flag       |CY=1                  |
 ;
-;TODO: H-Flag
 do_op_ccf:
        do_z80_flags_clear_N
+       do_z80_flags_copy_HC
        ldi temp,(1<<ZFL_C)
        eor z_flags,temp
        ret
@@ -1550,36 +1544,36 @@ do_op_ifm: ;sign negative, aka s=1
 todo_table:
 instr  do_fetch_nop,   op_nop,         do_store_nop    ;00             ;NOP
 instr  do_fetch_DIR16, op_nop,         do_store_BC     ;01 nn nn       ;LD BC,nn
-instr  do_fetch_A,     op_nop,         do_store_MBC    ;02             ;LD (BC),A
+instr  do_fetch_nop,   op_nop,         do_store_MBC    ;02             ;LD (BC),A
 instr  do_fetch_BC,    op_INC16,       do_store_BC     ;03             ;INC BC
 instr  do_fetch_B,     op_INC,         do_store_B      ;04             ;INC B
 instr  do_fetch_B,     op_DEC,         do_store_B      ;05             ;DEC B
 instr  do_fetch_DIR8,  op_nop,         do_store_B      ;06             ;LD B,n
-instr  do_fetch_A,     op_RLC,         do_store_A      ;07             ;RLCA
+instr  do_fetch_nop,   op_RLCA,        do_store_nop    ;07             ;RLCA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;08             ;EX AF,AF'
 instr  do_fetch_BC,    op_ADDHL,       do_store_HL     ;09             ;ADD HL,BC
-instr  do_fetch_MBC,   op_nop,         do_store_A      ;0A             ;LD A,(BC)
+instr  do_fetch_MBC,   op_nop,         do_store_nop    ;0A             ;LD A,(BC)
 instr  do_fetch_BC,    op_DEC16,       do_store_BC     ;0B             ;DEC BC
 instr  do_fetch_C,     op_INC,         do_store_C      ;0C             ;INC C
 instr  do_fetch_C,     op_DEC,         do_store_C      ;0D             ;DEC C
 instr  do_fetch_DIR8,  op_nop,         do_store_C      ;0E nn          ;LD C,n
-instr  do_fetch_A,     op_RRC,         do_store_A      ;0F             ;RRCA
+instr  do_fetch_nop,   op_RRCA,        do_store_nop    ;0F             ;RRCA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;10 oo          ;DJNZ o
 instr  do_fetch_DIR16, op_nop,         do_store_DE     ;11 nn nn       ;LD DE,nn
-instr  do_fetch_A,     op_nop,         do_store_MDE    ;12             ;LD (DE),A
+instr  do_fetch_nop,   op_nop,         do_store_MDE    ;12             ;LD (DE),A
 instr  do_fetch_DE,    op_INC16,       do_store_DE     ;13             ;INC DE
 instr  do_fetch_D,     op_INC,         do_store_D      ;14             ;INC D
 instr  do_fetch_D,     op_DEC,         do_store_D      ;15             ;DEC D
 instr  do_fetch_DIR8,  op_nop,         do_store_D      ;16 nn          ;LD D,n
-instr  do_fetch_A,     op_RL,          do_store_A      ;17             ;RLA
+instr  do_fetch_nop,   op_RLA,         do_store_nop    ;17             ;RLA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;18 oo          ;JR o
 instr  do_fetch_DE,    op_ADDHL,       do_store_HL     ;19             ;ADD HL,DE
-instr  do_fetch_MDE,   op_nop,         do_store_A      ;1A             ;LD A,(DE)
+instr  do_fetch_MDE,   op_nop,         do_store_nop    ;1A             ;LD A,(DE)
 instr  do_fetch_DE,    op_DEC16,       do_store_DE     ;1B             ;DEC DE
 instr  do_fetch_E,     op_INC,         do_store_E      ;1C             ;INC E
 instr  do_fetch_E,     op_DEC,         do_store_E      ;1D             ;DEC E
 instr  do_fetch_DIR8,  op_nop,         do_store_E      ;1E nn          ;LD E,n
-instr  do_fetch_A,     op_RR,          do_store_A      ;1F             ;RRA
+instr  do_fetch_nop,   op_RRA,         do_store_nop    ;1F             ;RRA
 instr  do_fetch_nop,   op_INV,         do_store_nop    ;20 oo          ;JR NZ,o
 instr  do_fetch_DIR16, op_nop,         do_store_HL     ;21 nn nn       ;LD HL,nn
 instr  do_fetch_DIR16, op_STHL,        do_store_nop    ;22 nn nn       ;LD (nn),HL
@@ -1612,7 +1606,7 @@ instr     do_fetch_nop,   op_INCA,        do_store_nop    ;3C             ;INC A
 instr  do_fetch_nop,   op_DECA,        do_store_nop    ;3D             ;DEC A
 instr  do_fetch_DIR8,  op_nop,         do_store_A      ;3E nn          ;LD A,n
 instr  do_fetch_nop,   op_CCF,         do_store_nop    ;3F             ;CCF (Complement Carry Flag, gvd)
-instr  do_fetch_B,     op_nop,         do_store_B      ;40             ;LD B,B
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;40             ;LD B,B
 instr  do_fetch_C,     op_nop,         do_store_B      ;41             ;LD B,C
 instr  do_fetch_D,     op_nop,         do_store_B      ;42             ;LD B,D
 instr  do_fetch_E,     op_nop,         do_store_B      ;43             ;LD B,E
@@ -1621,7 +1615,7 @@ instr     do_fetch_L,     op_nop,         do_store_B      ;45             ;LD B,L
 instr  do_fetch_MHL,   op_nop,         do_store_B      ;46             ;LD B,(HL)
 instr  do_fetch_A,     op_nop,         do_store_B      ;47             ;LD B,A
 instr  do_fetch_B,     op_nop,         do_store_C      ;48             ;LD C,B
-instr  do_fetch_C,     op_nop,         do_store_C      ;49             ;LD C,C
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;49             ;LD C,C
 instr  do_fetch_D,     op_nop,         do_store_C      ;4A             ;LD C,D
 instr  do_fetch_E,     op_nop,         do_store_C      ;4B             ;LD C,E
 instr  do_fetch_H,     op_nop,         do_store_C      ;4C             ;LD C,H
@@ -1630,7 +1624,7 @@ instr     do_fetch_MHL,   op_nop,         do_store_C      ;4E             ;LD C,(HL)
 instr  do_fetch_A,     op_nop,         do_store_C      ;4F             ;LD C,A
 instr  do_fetch_B,     op_nop,         do_store_D      ;50             ;LD D,B
 instr  do_fetch_C,     op_nop,         do_store_D      ;51             ;LD D,C
-instr  do_fetch_D,     op_nop,         do_store_D      ;52             ;LD D,D
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;52             ;LD D,D
 instr  do_fetch_E,     op_nop,         do_store_D      ;53             ;LD D,E
 instr  do_fetch_H,     op_nop,         do_store_D      ;54             ;LD D,H
 instr  do_fetch_L,     op_nop,         do_store_D      ;55             ;LD D,L
@@ -1639,7 +1633,7 @@ instr     do_fetch_A,     op_nop,         do_store_D      ;57             ;LD D,A
 instr  do_fetch_B,     op_nop,         do_store_E      ;58             ;LD E,B
 instr  do_fetch_C,     op_nop,         do_store_E      ;59             ;LD E,C
 instr  do_fetch_D,     op_nop,         do_store_E      ;5A             ;LD E,D
-instr  do_fetch_E,     op_nop,         do_store_E      ;5B             ;LD E,E
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;5B             ;LD E,E
 instr  do_fetch_H,     op_nop,         do_store_E      ;5C             ;LD E,H
 instr  do_fetch_L,     op_nop,         do_store_E      ;5D             ;LD E,L
 instr  do_fetch_MHL,   op_nop,         do_store_E      ;5E             ;LD E,(HL)
@@ -1648,7 +1642,7 @@ instr     do_fetch_B,     op_nop,         do_store_H      ;60             ;LD H,B
 instr  do_fetch_C,     op_nop,         do_store_H      ;61             ;LD H,C
 instr  do_fetch_D,     op_nop,         do_store_H      ;62             ;LD H,D
 instr  do_fetch_E,     op_nop,         do_store_H      ;63             ;LD H,E
-instr  do_fetch_H,     op_nop,         do_store_H      ;64             ;LD H,H
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;64             ;LD H,H
 instr  do_fetch_L,     op_nop,         do_store_H      ;65             ;LD H,L
 instr  do_fetch_MHL,   op_nop,         do_store_H      ;66             ;LD H,(HL)
 instr  do_fetch_A,     op_nop,         do_store_H      ;67             ;LD H,A
@@ -1657,7 +1651,7 @@ instr     do_fetch_C,     op_nop,         do_store_L      ;69             ;LD L,C
 instr  do_fetch_D,     op_nop,         do_store_L      ;6A             ;LD L,D
 instr  do_fetch_E,     op_nop,         do_store_L      ;6B             ;LD L,E
 instr  do_fetch_H,     op_nop,         do_store_L      ;6C             ;LD L,H
-instr  do_fetch_L,     op_nop,         do_store_L      ;6D             ;LD L,L
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;6D             ;LD L,L
 instr  do_fetch_MHL,   op_nop,         do_store_L      ;6E             ;LD L,(HL)
 instr  do_fetch_A,     op_nop,         do_store_L      ;6F             ;LD L,A
 instr  do_fetch_B,     op_nop,         do_store_MHL    ;70             ;LD (HL),B
@@ -1675,7 +1669,7 @@ instr     do_fetch_E,     op_nop,         do_store_A      ;7B             ;LD A,E
 instr  do_fetch_H,     op_nop,         do_store_A      ;7C             ;LD A,H
 instr  do_fetch_L,     op_nop,         do_store_A      ;7D             ;LD A,L
 instr  do_fetch_MHL,   op_nop,         do_store_A      ;7E             ;LD A,(HL)
-instr  do_fetch_A,     op_nop,         do_store_A      ;7F             ;LD A,A
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;7F             ;LD A,A
 instr  do_fetch_B,     op_ADDA,        do_store_nop    ;80             ;ADD A,B
 instr  do_fetch_C,     op_ADDA,        do_store_nop    ;81             ;ADD A,C
 instr  do_fetch_D,     op_ADDA,        do_store_nop    ;82             ;ADD A,D
@@ -1805,6 +1799,7 @@ instr     do_fetch_nop,   op_INV,         do_store_nop    ;FD             ;(Z80 specific)
 instr  do_fetch_DIR8,  op_CPFA,        do_store_nop    ;FE nn          ;CP n
 instr  do_fetch_RST,   op_nop,         do_store_CALL   ;FF             ;RST 38H
 
+
 ;----------------------------------------------------------------
 ; Lookup table, stolen from z80ex, Z80 emulation library.
 ; http://z80ex.sourceforge.net/
index 85445cf672ae999013bd3f07e463ca90b6fb2980..b660a3c2e800a4f9f2d54dcb177abefa9783bbb5 100644 (file)
@@ -30,7 +30,7 @@
 ;      instr fetch, op, store
 ;
 .macro instr   
-       .db     low(@2), low(@1), high(@1), low(@0)
+       .db     low(@2), low(do_@1), high(do_@1), low(@0)
 .endm
 
 
@@ -136,7 +136,7 @@ noprintpc:
 
 .org (PC+255) & 0xff00                 ; wichtig !!!fetch und store muessen in einer page liegen
 fetch_ops:
-do_nop:        
+do_fetch_nop:  
        ret
 
 do_fetch_a:
@@ -194,13 +194,13 @@ do_fetch_sp:
 do_fetch_mbc:
        lds xh,z_b
        lds xl,z_c
-       mem_read_d opl
+       mem_read_d z_a
        ret
 
 do_fetch_mde:
        lds xh,z_d
        lds xl,z_e
-       mem_read_d opl
+       mem_read_d z_a
        ret
 
 do_fetch_mhl:
@@ -240,6 +240,7 @@ do_fetch_rst:
 
 .org (PC+255) & 0xff00                 ; wichtig !!!fetch und store muessen in einer page liegen
 store_ops:
+do_store_nop:
        ret
        
 do_store_a:
@@ -293,13 +294,13 @@ do_store_hl:
 do_store_mbc:
        lds xh,z_b
        lds xl,z_c
-       mem_write_s opl
+       mem_write_s z_a
        ret
 
 do_store_mde:
        lds xh,z_d
        lds xl,z_e
-       mem_write_s opl
+       mem_write_s z_a
        ret
 
 do_store_mhl:
@@ -369,9 +370,10 @@ do_store_am:
        mem_write_ds op, z_a
        ret
 
-; ------------ Operation phase stuff -----------------
 
 
+; ------------ Operation phase stuff -----------------
+
 ;----------------------------------------------------------------
 ;|                                                              |
 ;|                            Zilog                             |
@@ -561,6 +563,7 @@ do_store_am:
 .equ ZFL_N = 1
 .equ ZFL_C = 0
 
+
 .equ AVR_T = SREG_T
 .equ AVR_H = SREG_H
 .equ AVR_S = SREG_S
@@ -582,10 +585,9 @@ do_store_am:
        lpm     @0,z    
 .endm
 
-.macro do_z80_flags_HP
+.macro do_z80_flags_V
 #if EM_Z80
        bmov    z_flags, ZFL_P, temp, AVR_V
-       bmov    z_flags, ZFL_H, temp, AVR_H
 #endif
 .endm
 
@@ -607,6 +609,19 @@ do_store_am:
 #endif
 .endm
 
+.macro do_z80_flags_clear_HN
+#if EM_Z80
+       andi    z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
+#endif
+.endm
+
+       
+.macro do_z80_flags_copy_HC
+#if EM_Z80
+       bmov    z_flags, ZFL_H, z_flags, ZFL_H
+#endif
+.endm
+
 .macro do_z80_flags_op_rotate
        ; must not change avr carry flag!
 #if EM_Z80
@@ -619,13 +634,12 @@ do_store_am:
 .macro do_z80_flags_op_and
 #if EM_Z80
        ori     z_flags,(1<<ZFL_H)
-#else
-       ori     z_flags,(1<<ZFL_H)
 #endif
 .endm
 
 .macro do_z80_flags_op_or
 #if EM_Z80
+                       ;nothing to do
 #endif
 .endm
 
@@ -633,13 +647,16 @@ do_store_am:
 ;----------------------------------------------------------------
 
 do_op_inv:
-       printstring "Invalid opcode @ PC="
-       movw   temp,z_pcl
-       lcall printhexw
+       sbiw    z_pcl,1
+       lcall printregs
+       printstring "Invalid opcode! "
 
 haltinv:
        rjmp haltinv
 
+do_op_nop:
+       ret
+       
 ;----------------------------------------------------------------
 ;|Mnemonic  |SZHPNC|Description          |Notes                 |
 ;----------------------------------------------------------------
@@ -660,7 +677,7 @@ do_op_outa: ; out (opl),a
 .endif
        mov temp,z_a
        mov temp2,opl
-       rcall portWrite
+       lcall portWrite
        ret
 
 ;----------------------------------------------------------------
@@ -679,7 +696,7 @@ do_op_in:   ; in a,(opl)
 .endif
 
        mov temp2,opl
-       rcall portRead
+       lcall portRead
        mov opl,temp
 
 .if PORT_DEBUG
@@ -700,25 +717,25 @@ do_op_in: ; in a,(opl)
 ;
 ; 
 do_op_inc:
-       inc     opl
-#if EM_Z80
+       ldi     temp,1
+       add     opl,temp
        in      temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, opl
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        ret
 
 do_op_inca:
-       inc     z_a
-#if EM_Z80
+       ldi     temp,1
+       add     z_a,temp
        in      temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, z_a
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        ret
 
 ;----------------------------------------------------------------
@@ -733,26 +750,25 @@ do_op_inca:
 ;
 ;
 do_op_dec:
-       dec     opl
-#if EM_Z80
+       subi    opl,1
        in    temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, opl
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
 do_op_deca:
-       dec     z_a
-#if EM_Z80
+       ldi     opl,1
+       sub     z_a,opl
        in    temp, sreg
-#endif
-       andi    z_flags,(1<<ZFL_H)|(1<<ZFL_C)   ; preserve C-, and H-flag
+       andi    z_flags,(1<<ZFL_C)              ; preserve C-flag
        ldpmx   temp2, sz53p_tab, z_a
        or      z_flags,temp2           ;
-       do_z80_flags_HP
+       bmov    z_flags, ZFL_H, temp, AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -788,13 +804,14 @@ do_op_dec16:
 ;|RLCA      |---- *|Rotate Left Circular |A=A<-                 |
 ;
 ;
-do_op_rlc:
+do_op_rlca:
        ;Rotate Left Cyclical. All bits move 1 to the 
        ;left, the msb becomes c and lsb.
        do_z80_flags_op_rotate
-       lsl    opl
+       lsl     z_a
        brcc   do_op_rlc_noc
-       ori    opl, 1
+       ldi     temp,1
+       or      z_a,temp
        ori    z_flags, (1<<ZFL_C)
 do_op_rlc_noc:
        ret
@@ -807,13 +824,14 @@ do_op_rlc_noc:
 ;|RRCA      |---- *|Rotate Right Circular|A=->A                 |
 ;
 ;
-do_op_rrc: 
+do_op_rrca
        ;Rotate Right Cyclical. All bits move 1 to the 
        ;right, the lsb becomes c and msb.
        do_z80_flags_op_rotate
-       lsr    opl
+       lsr     z_a
        brcc   do_op_rrc_noc
-       ori    opl, 0x80
+       ldi     temp,0x80
+       or      z_a,temp
        ori    z_flags, (1<<ZFL_C)
 do_op_rrc_noc:
        ret
@@ -826,15 +844,15 @@ do_op_rrc_noc:
 ;|RRA       |---- *|Rotate Right Acc.    |A=->{CY,A}            |
 ;
 ; 
-do_op_rr: 
+do_op_rra
        ;Rotate Right. All bits move 1 to the right, the lsb 
        ;becomes c, c becomes msb.
        clc                             ; get z80 carry to avr carry
        sbrc    z_flags,ZFL_C
        sec
        do_z80_flags_op_rotate          ; (clear ZFL_C, doesn't change AVR_C)
-       bmov    z_flags,ZFL_C, opl,0    ; Bit 0 --> CY
-       ror     opl
+       bmov    z_flags,ZFL_C, z_a,0    ; Bit 0 --> CY
+       ror     z_a
        ret
 
 ;----------------------------------------------------------------
@@ -845,15 +863,15 @@ do_op_rr:
 ;|RLA       |---- *|Rotate Left Acc.     |A={CY,A}<-            |
 ;
 ; 
-do_op_rl:
+do_op_rla:
        ;Rotate Left. All bits move 1 to the left, the msb 
        ;becomes c, c becomes lsb.
        clc
        sbrc z_flags,ZFL_C
         sec
        do_z80_flags_op_rotate          ; (clear ZFL_C, doesn't change AVR_C)
-       bmov    z_flags,ZFL_C, opl,7    ; Bit 7 --> CY
-       rol opl
+       bmov    z_flags,ZFL_C, z_a,7    ; Bit 7 --> CY
+       rol z_a
        ret
 
 ;----------------------------------------------------------------
@@ -869,7 +887,8 @@ do_op_adda:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P flag
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        ret
 
 ;----------------------------------------------------------------
@@ -888,7 +907,8 @@ do_op_adca:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        ret
 
 ;----------------------------------------------------------------
@@ -904,7 +924,8 @@ do_op_subfa:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -917,13 +938,13 @@ do_op_subfa:
 
 ;
 do_op_cpfa:
-       mov temp,z_a
-       sub temp,opl
-       mov opl,temp
+       mov temp2,z_a
+       sub temp2,opl
        in temp,sreg
-       ldpmx   z_flags,sz53p_tab,opl           ;S,Z,P
+       ldpmx   z_flags,sz53p_tab,temp2         ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -943,7 +964,8 @@ do_op_sbcfa:
        in temp,sreg
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P
        bmov    z_flags,ZFL_C, temp,AVR_C
-       do_z80_flags_HP
+       bmov    z_flags,ZFL_H, temp,AVR_H
+       do_z80_flags_V
        do_z80_flags_set_N
        ret
 
@@ -954,7 +976,7 @@ do_op_sbcfa:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|AND s     |**-P 0|Logical AND          |A=A&s                 |
 ;
-; TODO H-Flag
+;
 do_op_anda:
        and z_a,opl                             ;
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,P,N,C
@@ -969,7 +991,7 @@ do_op_anda:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|OR s      |**-P00|Logical inclusive OR |A=Avs                 |
 ;
-; TODO: H-Flag
+;
 do_op_ora:
        or z_a,opl
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,H,P,N,C
@@ -983,7 +1005,7 @@ do_op_ora:
 ;|----------|SZHP C|---------- 8080 ----------------------------|
 ;|XOR s     |**-P 0|Logical Exclusive OR |A=Axs                 |
 ;
-; TODO: H-Flag
+;
 do_op_xora:
        eor z_a,opl
        ldpmx   z_flags,sz53p_tab,z_a           ;S,Z,H,P,N,C
@@ -1060,11 +1082,11 @@ do_op_rmem8:
 ;  and subtraction operations. For addition (ADD, ADC, INC) or subtraction
 ;  (SUB, SBC, DEC, NEC), the following table indicates the operation performed:
 ;
-; -------------------------------------------------------------------------------
-; |          | C Flag  | HEX value in | H Flag | HEX value in | Number  | C flag|
-; | Operation| Before  | upper digit  | Before | lower digit  | added   | After |
-; |          | DAA     | (bit 7-4)    | DAA    | (bit 3-0)    | to byte | DAA   |
-; |-----------------------------------------------------------------------------|
+; -------------------------------------------------------------------
+; |       |C Flag |HEX value in|H Flag |HEX val in | Number |C flag |
+; |  Oper |Before |upper digit |Before |lower digit| added  |After  |
+; |       |DAA    |(bit 7-4)   |DAA    |(bit 3-0)  | to A   |DAA    |
+; |-------+-------+------------+-------+-----------+--------+-------|
 ; |          |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
 ; |   ADD    |    0    |     0-8      |   0    |     A-F      |   06    |   0   |
 ; |          |    0    |     0-9      |   1    |     0-3      |   06    |   0   |
@@ -1074,110 +1096,86 @@ do_op_rmem8:
 ; |          |    1    |     0-2      |   0    |     0-9      |   60    |   1   |
 ; |          |    1    |     0-2      |   0    |     A-F      |   66    |   1   |
 ; |          |    1    |     0-3      |   1    |     0-3      |   66    |   1   |
-; |-----------------------------------------------------------------------------|
+; |-------+-------+------------+-------+-----------+--------+-------|
 ; |   SUB    |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
 ; |   SBC    |    0    |     0-8      |   1    |     6-F      |   FA    |   0   |
 ; |   DEC    |    1    |     7-F      |   0    |     0-9      |   A0    |   1   |
 ; |   NEG    |    1    |     6-F      |   1    |     6-F      |   9A    |   1   |
-; |-----------------------------------------------------------------------------|
-;
-; Flags:
-;     C:   See instruction.
+; -------------------------------------------------------------------
+;
+; The H flag is affected as follows:
+;
+; ---------------------
+; | N | H | low   |H' |
+; |   |   |nibble |   |  
+; |---+---+-------+---|
+; | 0 | * |  0-9  | 0 | 
+; | 0 | * |  a-f  | 1 | 
+; | 1 | 0 |   *   | 0 | 
+; | 1 | 1 |  6-f  | 0 | 
+; | 1 | 1 |  0-5  | 1 | 
+; ---------------------
+;
+; Ohter flags:
 ;     N:   Unaffected.
 ;     P/V: Set if Acc. is even parity after operation, reset otherwise.
-;     H:   See instruction.
 ;     Z:   Set if Acc. is Zero after operation, reset otherwise.
 ;     S:   Set if most significant bit of Acc. is 1 after operation, reset otherwise.
 
 
-
-#if 1
 do_op_da:
-       ldi     oph,0                           ; what to add
-       sbrc    z_flags,ZFL_H                   ; if H-Flag
-       rjmp    op_da_06
-       mov     temp,opl
-       andi    temp,0x0f                       ; ... or lower digit > 9
-       cpi     temp,0x0a
-       brlo    op_da_06n
-op_da_06:                              
-       ori     oph,0x06
-op_da_06n:                             
-       sbrc    z_flags,(1<<ZFL_C)
-       rjmp    op_da_60
-       cpi     opl,0xa0
-       brlo    op_da_60n
-op_da_60:                              
-       ori     oph,0x60
-op_da_60n:                             
-       cpi     opl,0x9a
-       brlo    op_da_99n
-       ori     z_flags,(1<<ZFL_C); set C
-op_da_99n:
-       sbrs    z_flags,ZFL_N                   ; if sub-op
-       rjmp    op_da_add                       ; then
-       sub     opl,oph
-       rjmp    op_da_ex
-op_da_add:                                     ; else add-op
-       cpi     opl,0x91
-       brlo    op_da_60n2
-       mov     temp,opl
-       andi    temp,0x0f
-       cpi     temp,0x0a
-       brlo    op_da_60n2
-       ori     oph,0x60
-op_da_60n2:
+       ldi     temp2,0                         ;new C and H flag
+       ldi     oph,0                           ;oph: what to add
+
+       sbrc    z_flags,ZFL_N                   ;if add-op      
+       rjmp    op_da_sub                       ;then
+op_da_add:
+       mov     temp,opl                        ;  |
+       andi    temp,0x0f                       ;  |
+       cpi     temp,0x0a                       ;  if (lower nibble >= 0x0A)
+       brlo    op_da_a10                       ;  |
+       ori     oph,0x06                        ;    add 6
+       ori     temp2,(1<<ZFL_H)                ;    set new H flag
+
+       sbrc    z_flags,ZFL_C                   ;    |
+       rjmp    op_da_a02                       ;    if (C flag ...
+       cpi     opl,0x90                        ;    |... or upper nibble >= 0x90)
+       brlo    op_da_a03                       ;    |
+op_da_a02:                             
+       ori     oph,0x60                        ;      add 0x60
+       ori     temp2,(1<<ZFL_C)                ;      set new C flag
+op_da_a03:                                     ;    endif
+       rjmp    op_da_ae
+op_da_a10:                                     ;  else (lower nibble is 0x09 or lower)
+       sbrc    z_flags,ZFL_C                   ;    |
+       rjmp    op_da_a12                       ;    if (C flag ...
+       cpi     opl,0xA0                        ;    |... or upper nibble >= 0xA0)
+       brlo    op_da_a13                       ; 
+op_da_a12:                             
+       ori     oph,0x60                        ;      add 0x60
+       ori     temp2,(1<<ZFL_C)                ;      set new C flag
+op_da_a13:
+       sbrs    z_flags,ZFL_H                   ;    if (H flag)
+       rjmp    op_da_ae                        ;    |
+       ori     oph,0x06                        ;      add 0x06
+       mov     temp,opl                        ;      |
+       andi    temp,0x0f                       ;      |
+       cpi     temp,0x06                       ;      if (lower nibble >= 0x0A)
+       brsh    op_da_ae                        ;      |
+       ori     temp2,(1<<ZFL_H)                ;        set new H flag
+                                               ;      endif
+                                               ;    endif
+op_da_ae:
        add     opl,oph
-op_da_ex:
-       in      temp,SREG       
-       sbrc    temp,AVR_H
-       ori     z_flags,(1<<ZFL_C)
-       andi    z_flags,(1<<ZFL_N)|(1<<ZFL_C)   ; preserve C,N
-       ldpmx   temp2, sz53p_tab, opl           ; get S,Z,P
-       or      z_flags,temp2
-       bmov    z_flags,ZFL_H, temp,AVR_H       ; H  (?)
-       ret
-#else
-
-do_op_da:
-       sbrc    z_flags,ZFL_N                   ; if add-op     
-       rjmp    do_op_da_sub                    ; then
-       ldi             temp2,0                 ;
-       mov             temp,opl                ;
-       andi    temp,0x0f                       ;
-       cpi             temp,0x0a               ;if lower digit > 9
-       brlo    do_op_da_h                      ;
-       ori             temp2,0x06              ;       add 6 to lower digit
-do_op_da_h:                                    ;
-       sbrc    z_flags,ZFL_H                   ;   ... or H-Flag
-       ori             temp2,0x06              ;
-       add             opl,temp2               ;
-
-       ldi             temp2,0                 ;
-       mov             temp,opl                ;
-       andi    temp,0xf0                       ;
-       cpi             temp,0xa0               ;
-       brlo    do_op_da_c                      ;
-       ori             temp2,0x60              ;
-do_op_da_c:                                    ; else sub-op
-       sbrc    z_flags,ZFL_C                   ;
-       ori             temp2,0x60              ;
-       andi    z_flags, ~( (1<<ZFL_S) | (1<<ZFL_Z) | (1<<ZFL_H) )
-       add             opl,temp2               ;
-       in              temp,SREG               ;
-       bst             temp,AVR_Z              ;Z-Flag
-       bld             z_flags,ZFL_Z           ;
-       bst             temp,AVR_N              ;S-Flag
-       bst             z_flags,ZFL_S           ;
-       sbrc    temp2,5                         ;C-Flag, set if 0x06 added
-       ori             z_flags,(1<<ZFL_C)      ;
-                                               ;H-Flag?
+       ldpmx   z_flags, sz53p_tab, opl         ; get S,Z,P flag
+       or      z_flags,temp2                   ; merge new C and H flag
        ret
        
-do_op_da_sub:                                  ;TODO:
-       rcall do_op_inv
-       ret
-#endif
+op_da_sub:                                     ;else (sub-op)
+       rcall do_op_inv                         ;  TODO: !
+       ret                                     ;endif
+
+
 
 ;----------------------------------------------------------------
 ;|Mnemonic  |SZHPNC|Description          |Notes                 |
@@ -1187,20 +1185,20 @@ do_op_da_sub:                                   ;TODO:
 ;
 ;
 do_op_scf:
-       andi    z_flags,~((1<<ZFL_H)|(1<<ZFL_N))
+       do_z80_flags_clear_HN
        ori     z_flags,(1<<ZFL_C)
        ret
 
 ;----------------------------------------------------------------
 ;|Mnemonic  |SZHPNC|Description          |Notes                 |
 ;----------------------------------------------------------------
-;|CCF       |--?-0*|Complement Carry Flag|CY=~CY                |
+;|CCF       |--?-0*|Complement Carry Flag|CY=~CY, HC=previous CY|
 ;|----------|SZHP C|---------- 8080 ----------------------------|
-;|SCF       |---- 1|Set Carry Flag       |CY=1                  |
+;|CCF       |---- 1|Set Carry Flag       |CY=1                  |
 ;
-;TODO: H-Flag
 do_op_ccf:
        do_z80_flags_clear_N
+       do_z80_flags_copy_HC
        ldi temp,(1<<ZFL_C)
        eor z_flags,temp
        ret
@@ -1434,262 +1432,263 @@ do_op_ifm: ;sign negative, aka s=1
 
 ;.org (PC+255) & 0xff00
 todo_table:
-instr  do_nop,         do_NOP,         do_nop          ;00             ;NOP
-instr  do_fetch_DIR16, do_NOP,         do_store_BC     ;01 nn nn       ;LD BC,nn
-instr  do_fetch_A,     do_NOP,         do_store_MBC    ;02             ;LD (BC),A
-instr  do_fetch_BC,    do_op_INC16,    do_store_BC     ;03             ;INC BC
-instr  do_fetch_B,     do_op_INC,      do_store_B      ;04             ;INC B
-instr  do_fetch_B,     do_op_DEC,      do_store_B      ;05             ;DEC B
-instr  do_fetch_DIR8,  do_NOP,         do_store_B      ;06             ;LD B,n
-instr  do_fetch_A,     do_op_RLC,      do_store_A      ;07             ;RLCA
-instr  do_nop,         do_op_INV,      do_nop          ;08             ;EX AF,AF'
-instr  do_fetch_BC,    do_op_ADDHL,    do_store_HL     ;09             ;ADD HL,BC
-instr  do_fetch_MBC,   do_NOP,         do_store_A      ;0A             ;LD A,(BC)
-instr  do_fetch_BC,    do_op_DEC16,    do_store_BC     ;0B             ;DEC BC
-instr  do_fetch_C,     do_op_INC,      do_store_C      ;0C             ;INC C
-instr  do_fetch_C,     do_op_DEC,      do_store_C      ;0D             ;DEC C
-instr  do_fetch_DIR8,  do_NOP,         do_store_C      ;0E nn          ;LD C,n
-instr  do_fetch_A,     do_op_RRC,      do_store_A      ;0F             ;RRCA
-instr  do_nop,         do_op_INV,      do_nop          ;10 oo          ;DJNZ o
-instr  do_fetch_DIR16, do_NOP,         do_store_DE     ;11 nn nn       ;LD DE,nn
-instr  do_fetch_A,     do_NOP,         do_store_MDE    ;12             ;LD (DE),A
-instr  do_fetch_DE,    do_op_INC16,    do_store_DE     ;13             ;INC DE
-instr  do_fetch_D,     do_op_INC,      do_store_D      ;14             ;INC D
-instr  do_fetch_D,     do_op_DEC,      do_store_D      ;15             ;DEC D
-instr  do_fetch_DIR8,  do_NOP,         do_store_D      ;16 nn          ;LD D,n
-instr  do_fetch_A,     do_op_RL,       do_store_A      ;17             ;RLA
-instr  do_NOP,         do_op_INV,      do_nop          ;18 oo          ;JR o
-instr  do_fetch_DE,    do_op_ADDHL,    do_store_HL     ;19             ;ADD HL,DE
-instr  do_fetch_MDE,   do_NOP,         do_store_A      ;1A             ;LD A,(DE)
-instr  do_fetch_DE,    do_op_DEC16,    do_store_DE     ;1B             ;DEC DE
-instr  do_fetch_E,     do_op_INC,      do_store_E      ;1C             ;INC E
-instr  do_fetch_E,     do_op_DEC,      do_store_E      ;1D             ;DEC E
-instr  do_fetch_DIR8,  do_NOP,         do_store_E      ;1E nn          ;LD E,n
-instr  do_fetch_A,     do_op_RR,       do_store_A      ;1F             ;RRA
-instr  do_NOP,         do_op_INV,      do_nop          ;20 oo          ;JR NZ,o
-instr  do_fetch_DIR16, do_NOP,         do_store_HL     ;21 nn nn       ;LD HL,nn
-instr  do_fetch_DIR16, do_op_STHL,     do_nop          ;22 nn nn       ;LD (nn),HL
-instr  do_fetch_HL,    do_op_INC16,    do_store_HL     ;23             ;INC HL
-instr  do_fetch_H,     do_op_INC,      do_store_H      ;24             ;INC H
-instr  do_fetch_H,     do_op_DEC,      do_store_H      ;25             ;DEC H
-instr  do_fetch_DIR8,  do_NOP,         do_store_H      ;26 nn          ;LD H,n
-instr  do_fetch_A,     do_op_DA,       do_store_A      ;27             ;DAA
-instr  do_NOP,         do_op_INV,      do_nop          ;28 oo          ;JR Z,o
-instr  do_fetch_HL,    do_op_ADDHL,    do_store_HL     ;29             ;ADD HL,HL
-instr  do_fetch_DIR16, do_op_RMEM16,   do_store_HL     ;2A nn nn       ;LD HL,(nn)
-instr  do_fetch_HL,    do_op_DEC16,    do_store_HL     ;2B             ;DEC HL
-instr  do_fetch_L,     do_op_INC,      do_store_L      ;2C             ;INC L
-instr  do_fetch_L,     do_op_DEC,      do_store_L      ;2D             ;DEC L
-instr  do_fetch_DIR8,  do_NOP,         do_store_L      ;2E nn          ;LD L,n
-instr  do_NOP,         do_op_CPL,      do_nop          ;2F             ;CPL
-instr  do_NOP,         do_op_INV,      do_nop          ;30 oo          ;JR NC,o
-instr  do_fetch_DIR16, do_NOP,         do_store_SP     ;31 nn nn       ;LD SP,nn
-instr  do_fetch_DIR16, do_NOP,         do_store_AM     ;32 nn nn       ;LD (nn),A
-instr  do_fetch_SP,    do_op_INC16,    do_store_SP     ;33             ;INC SP
-instr  do_fetch_MHL,   do_op_INC,      do_store_MHL    ;34             ;INC (HL)
-instr  do_fetch_MHL,   do_op_DEC,      do_store_MHL    ;35             ;DEC (HL)
-instr  do_fetch_DIR8,  do_NOP,         do_store_MHL    ;36 nn          ;LD (HL),n
-instr  do_NOP,         do_op_SCF,      do_nop          ;37             ;SCF
-instr  do_NOP,         do_op_INV,      do_nop          ;38 oo          ;JR C,o
-instr  do_fetch_SP,    do_op_ADDHL,    do_store_HL     ;39             ;ADD HL,SP
-instr  do_fetch_DIR16, do_op_RMEM8,    do_store_A      ;3A nn nn       ;LD A,(nn)
-instr  do_fetch_SP,    do_op_DEC16,    do_store_SP     ;3B             ;DEC SP
-instr  do_NOP,         do_op_INCA,     do_nop          ;3C             ;INC A
-instr  do_NOP,         do_op_DECA,     do_nop          ;3D             ;DEC A
-instr  do_fetch_DIR8,  do_NOP,         do_store_A      ;3E nn          ;LD A,n
-instr  do_NOP,         do_op_CCF,      do_nop          ;3F             ;CCF (Complement Carry Flag, gvd)
-instr  do_fetch_B,     do_NOP,         do_store_B      ;40             ;LD B,B
-instr  do_fetch_C,     do_NOP,         do_store_B      ;41             ;LD B,C
-instr  do_fetch_D,     do_NOP,         do_store_B      ;42             ;LD B,D
-instr  do_fetch_E,     do_NOP,         do_store_B      ;43             ;LD B,E
-instr  do_fetch_H,     do_NOP,         do_store_B      ;44             ;LD B,H
-instr  do_fetch_L,     do_NOP,         do_store_B      ;45             ;LD B,L
-instr  do_fetch_MHL,   do_NOP,         do_store_B      ;46             ;LD B,(HL)
-instr  do_fetch_A,     do_NOP,         do_store_B      ;47             ;LD B,A
-instr  do_fetch_B,     do_NOP,         do_store_C      ;48             ;LD C,B
-instr  do_fetch_C,     do_NOP,         do_store_C      ;49             ;LD C,C
-instr  do_fetch_D,     do_NOP,         do_store_C      ;4A             ;LD C,D
-instr  do_fetch_E,     do_NOP,         do_store_C      ;4B             ;LD C,E
-instr  do_fetch_H,     do_NOP,         do_store_C      ;4C             ;LD C,H
-instr  do_fetch_L,     do_NOP,         do_store_C      ;4D             ;LD C,L
-instr  do_fetch_MHL,   do_NOP,         do_store_C      ;4E             ;LD C,(HL)
-instr  do_fetch_A,     do_NOP,         do_store_C      ;4F             ;LD C,A
-instr  do_fetch_B,     do_NOP,         do_store_D      ;50             ;LD D,B
-instr  do_fetch_C,     do_NOP,         do_store_D      ;51             ;LD D,C
-instr  do_fetch_D,     do_NOP,         do_store_D      ;52             ;LD D,D
-instr  do_fetch_E,     do_NOP,         do_store_D      ;53             ;LD D,E
-instr  do_fetch_H,     do_NOP,         do_store_D      ;54             ;LD D,H
-instr  do_fetch_L,     do_NOP,         do_store_D      ;55             ;LD D,L
-instr  do_fetch_MHL,   do_NOP,         do_store_D      ;56             ;LD D,(HL)
-instr  do_fetch_A,     do_NOP,         do_store_D      ;57             ;LD D,A
-instr  do_fetch_B,     do_NOP,         do_store_E      ;58             ;LD E,B
-instr  do_fetch_C,     do_NOP,         do_store_E      ;59             ;LD E,C
-instr  do_fetch_D,     do_NOP,         do_store_E      ;5A             ;LD E,D
-instr  do_fetch_E,     do_NOP,         do_store_E      ;5B             ;LD E,E
-instr  do_fetch_H,     do_NOP,         do_store_E      ;5C             ;LD E,H
-instr  do_fetch_L,     do_NOP,         do_store_E      ;5D             ;LD E,L
-instr  do_fetch_MHL,   do_NOP,         do_store_E      ;5E             ;LD E,(HL)
-instr  do_fetch_A,     do_NOP,         do_store_E      ;5F             ;LD E,A
-instr  do_fetch_B,     do_NOP,         do_store_H      ;60             ;LD H,B
-instr  do_fetch_C,     do_NOP,         do_store_H      ;61             ;LD H,C
-instr  do_fetch_D,     do_NOP,         do_store_H      ;62             ;LD H,D
-instr  do_fetch_E,     do_NOP,         do_store_H      ;63             ;LD H,E
-instr  do_fetch_H,     do_NOP,         do_store_H      ;64             ;LD H,H
-instr  do_fetch_L,     do_NOP,         do_store_H      ;65             ;LD H,L
-instr  do_fetch_MHL,   do_NOP,         do_store_H      ;66             ;LD H,(HL)
-instr  do_fetch_A,     do_NOP,         do_store_H      ;67             ;LD H,A
-instr  do_fetch_B,     do_NOP,         do_store_L      ;68             ;LD L,B
-instr  do_fetch_C,     do_NOP,         do_store_L      ;69             ;LD L,C
-instr  do_fetch_D,     do_NOP,         do_store_L      ;6A             ;LD L,D
-instr  do_fetch_E,     do_NOP,         do_store_L      ;6B             ;LD L,E
-instr  do_fetch_H,     do_NOP,         do_store_L      ;6C             ;LD L,H
-instr  do_fetch_L,     do_NOP,         do_store_L      ;6D             ;LD L,L
-instr  do_fetch_MHL,   do_NOP,         do_store_L      ;6E             ;LD L,(HL)
-instr  do_fetch_A,     do_NOP,         do_store_L      ;6F             ;LD L,A
-instr  do_fetch_B,     do_NOP,         do_store_MHL    ;70             ;LD (HL),B
-instr  do_fetch_C,     do_NOP,         do_store_MHL    ;71             ;LD (HL),C
-instr  do_fetch_D,     do_NOP,         do_store_MHL    ;72             ;LD (HL),D
-instr  do_fetch_E,     do_NOP,         do_store_MHL    ;73             ;LD (HL),E
-instr  do_fetch_H,     do_NOP,         do_store_MHL    ;74             ;LD (HL),H
-instr  do_fetch_L,     do_NOP,         do_store_MHL    ;75             ;LD (HL),L
-instr  do_NOP,         do_op_INV,      do_nop          ;76             ;HALT
-instr  do_fetch_A,     do_NOP,         do_store_MHL    ;77             ;LD (HL),A
-instr  do_fetch_B,     do_NOP,         do_store_A      ;78             ;LD A,B
-instr  do_fetch_C,     do_NOP,         do_store_A      ;79             ;LD A,C
-instr  do_fetch_D,     do_NOP,         do_store_A      ;7A             ;LD A,D
-instr  do_fetch_E,     do_NOP,         do_store_A      ;7B             ;LD A,E
-instr  do_fetch_H,     do_NOP,         do_store_A      ;7C             ;LD A,H
-instr  do_fetch_L,     do_NOP,         do_store_A      ;7D             ;LD A,L
-instr  do_fetch_MHL,   do_NOP,         do_store_A      ;7E             ;LD A,(HL)
-instr  do_fetch_A,     do_NOP,         do_store_A      ;7F             ;LD A,A
-instr  do_fetch_B,     do_op_ADDA,     do_nop          ;80             ;ADD A,B
-instr  do_fetch_C,     do_op_ADDA,     do_nop          ;81             ;ADD A,C
-instr  do_fetch_D,     do_op_ADDA,     do_nop          ;82             ;ADD A,D
-instr  do_fetch_E,     do_op_ADDA,     do_nop          ;83             ;ADD A,E
-instr  do_fetch_H,     do_op_ADDA,     do_nop          ;84             ;ADD A,H
-instr  do_fetch_L,     do_op_ADDA,     do_nop          ;85             ;ADD A,L
-instr  do_fetch_MHL,   do_op_ADDA,     do_nop          ;86             ;ADD A,(HL)
-instr  do_fetch_A,     do_op_ADDA,     do_nop          ;87             ;ADD A,A
-instr  do_fetch_B,     do_op_ADCA,     do_nop          ;88             ;ADC A,B
-instr  do_fetch_C,     do_op_ADCA,     do_nop          ;89             ;ADC A,C
-instr  do_fetch_D,     do_op_ADCA,     do_nop          ;8A             ;ADC A,D
-instr  do_fetch_E,     do_op_ADCA,     do_nop          ;8B             ;ADC A,E
-instr  do_fetch_H,     do_op_ADCA,     do_nop          ;8C             ;ADC A,H
-instr  do_fetch_L,     do_op_ADCA,     do_nop          ;8D             ;ADC A,L
-instr  do_fetch_MHL,   do_op_ADCA,     do_nop          ;8E             ;ADC A,(HL)
-instr  do_fetch_A,     do_op_ADCA,     do_nop          ;8F             ;ADC A,A
-instr  do_fetch_B,     do_op_SUBFA,    do_nop          ;90             ;SUB A,B
-instr  do_fetch_C,     do_op_SUBFA,    do_nop          ;91             ;SUB A,C
-instr  do_fetch_D,     do_op_SUBFA,    do_nop          ;92             ;SUB A,D
-instr  do_fetch_E,     do_op_SUBFA,    do_nop          ;93             ;SUB A,E
-instr  do_fetch_H,     do_op_SUBFA,    do_nop          ;94             ;SUB A,H
-instr  do_fetch_L,     do_op_SUBFA,    do_nop          ;95             ;SUB A,L
-instr  do_fetch_MHL,   do_op_SUBFA,    do_nop          ;96             ;SUB A,(HL)
-instr  do_fetch_A,     do_op_SUBFA,    do_nop          ;97             ;SUB A,A
-instr  do_fetch_B,     do_op_SBCFA,    do_nop          ;98             ;SBC A,B
-instr  do_fetch_C,     do_op_SBCFA,    do_nop          ;99             ;SBC A,C
-instr  do_fetch_D,     do_op_SBCFA,    do_nop          ;9A             ;SBC A,D
-instr  do_fetch_E,     do_op_SBCFA,    do_nop          ;9B             ;SBC A,E
-instr  do_fetch_H,     do_op_SBCFA,    do_nop          ;9C             ;SBC A,H
-instr  do_fetch_L,     do_op_SBCFA,    do_nop          ;9D             ;SBC A,L
-instr  do_fetch_MHL,   do_op_SBCFA,    do_nop          ;9E             ;SBC A,(HL)
-instr  do_fetch_A,     do_op_SBCFA,    do_nop          ;9F             ;SBC A,A
-instr  do_fetch_B,     do_op_ANDA,     do_nop          ;A0             ;AND A,B
-instr  do_fetch_C,     do_op_ANDA,     do_nop          ;A1             ;AND A,C
-instr  do_fetch_D,     do_op_ANDA,     do_nop          ;A2             ;AND A,D
-instr  do_fetch_E,     do_op_ANDA,     do_nop          ;A3             ;AND A,E
-instr  do_fetch_H,     do_op_ANDA,     do_nop          ;A4             ;AND A,H
-instr  do_fetch_L,     do_op_ANDA,     do_nop          ;A5             ;AND A,L
-instr  do_fetch_MHL,   do_op_ANDA,     do_nop          ;A6             ;AND A,(HL)
-instr  do_fetch_A,     do_op_ANDA,     do_nop          ;A7             ;AND A,A
-instr  do_fetch_B,     do_op_XORA,     do_nop          ;A8             ;XOR A,B
-instr  do_fetch_C,     do_op_XORA,     do_nop          ;A9             ;XOR A,C
-instr  do_fetch_D,     do_op_XORA,     do_nop          ;AA             ;XOR A,D
-instr  do_fetch_E,     do_op_XORA,     do_nop          ;AB             ;XOR A,E
-instr  do_fetch_H,     do_op_XORA,     do_nop          ;AC             ;XOR A,H
-instr  do_fetch_L,     do_op_XORA,     do_nop          ;AD             ;XOR A,L
-instr  do_fetch_MHL,   do_op_XORA,     do_nop          ;AE             ;XOR A,(HL)
-instr  do_fetch_A,     do_op_XORA,     do_nop          ;AF             ;XOR A,A
-instr  do_fetch_B,     do_op_ORA,      do_nop          ;B0             ;OR A,B
-instr  do_fetch_C,     do_op_ORA,      do_nop          ;B1             ;OR A,C
-instr  do_fetch_D,     do_op_ORA,      do_nop          ;B2             ;OR A,D
-instr  do_fetch_E,     do_op_ORA,      do_nop          ;B3             ;OR A,E
-instr  do_fetch_H,     do_op_ORA,      do_nop          ;B4             ;OR A,H
-instr  do_fetch_L,     do_op_ORA,      do_nop          ;B5             ;OR A,L
-instr  do_fetch_MHL,   do_op_ORA,      do_nop          ;B6             ;OR A,(HL)
-instr  do_fetch_A,     do_op_ORA,      do_nop          ;B7             ;OR A,A
-instr  do_fetch_B,     do_op_CPFA,     do_nop          ;B8             ;CP A,B
-instr  do_fetch_C,     do_op_CPFA,     do_nop          ;B9             ;CP A,C
-instr  do_fetch_D,     do_op_CPFA,     do_nop          ;BA             ;CP A,D
-instr  do_fetch_E,     do_op_CPFA,     do_nop          ;BB             ;CP A,E
-instr  do_fetch_H,     do_op_CPFA,     do_nop          ;BC             ;CP A,H
-instr  do_fetch_L,     do_op_CPFA,     do_nop          ;BD             ;CP A,L
-instr  do_fetch_MHL,   do_op_CPFA,     do_nop          ;BE             ;CP A,(HL)
-instr  do_fetch_A,     do_op_CPFA,     do_nop          ;BF             ;CP A,A
-instr  do_NOP,         do_op_IFNZ,     do_store_RET    ;C0             ;RET NZ
-instr  do_NOP,         do_op_POP16,    do_store_BC     ;C1             ;POP BC
-instr  do_fetch_DIR16, do_op_IFNZ,     do_store_PC     ;C2 nn nn       ;JP NZ,nn
-instr  do_fetch_DIR16, do_NOP,         do_store_PC     ;C3 nn nn       ;JP nn
-instr  do_fetch_DIR16, do_op_IFNZ,     do_store_CALL   ;C4 nn nn       ;CALL NZ,nn
-instr  do_fetch_BC,    do_op_PUSH16,   do_nop          ;C5             ;PUSH BC
-instr  do_fetch_DIR8,  do_op_ADDA,     do_nop          ;C6 nn          ;ADD A,n
-instr  do_fetch_RST,   do_NOP,         do_store_CALL   ;C7             ;RST 0
-instr  do_NOP,         do_op_IFZ,      do_store_RET    ;C8             ;RET Z
-instr  do_NOP,         do_nop,         do_store_RET    ;C9             ;RET
-instr  do_fetch_DIR16, do_op_IFZ,      do_store_PC     ;CA nn nn       ;JP Z,nn
-instr  do_NOP,         do_op_INV,      do_nop          ;CB             ;(Z80 specific)
-instr  do_fetch_DIR16, do_op_IFZ,      do_store_CALL   ;CC nn nn       ;CALL Z,nn
-instr  do_fetch_DIR16, do_NOP,         do_store_CALL   ;CD nn nn       ;CALL nn
-instr  do_fetch_DIR8,  do_op_ADCA,     do_nop          ;CE nn          ;ADC A,n
-instr  do_fetch_RST,   do_NOP,         do_store_CALL   ;CF             ;RST 8H
-instr  do_NOP,         do_op_IFNC,     do_store_RET    ;D0             ;RET NC
-instr  do_NOP,         do_op_POP16,    do_store_DE     ;D1             ;POP DE
-instr  do_fetch_DIR16, do_op_IFNC,     do_store_PC     ;D2 nn nn       ;JP NC,nn
-instr  do_fetch_DIR8,  do_op_OUTA,     do_nop          ;D3 nn          ;OUT (n),A
-instr  do_fetch_DIR16, do_op_IFNC,     do_store_CALL   ;D4 nn nn       ;CALL NC,nn
-instr  do_fetch_DE,    do_op_PUSH16,   do_nop          ;D5             ;PUSH DE
-instr  do_fetch_DIR8,  do_op_SUBFA,    do_nop          ;D6 nn          ;SUB n
-instr  do_fetch_RST,   do_NOP,         do_store_CALL   ;D7             ;RST 10H
-instr  do_NOP,         do_op_IFC,      do_store_RET    ;D8             ;RET C
-instr  do_NOP,         do_nop,         do_nop          ;D9             ;EXX
-instr  do_fetch_DIR16, do_op_IFC,      do_store_PC     ;DA nn nn       ;JP C,nn
-instr  do_fetch_DIR8,  do_op_IN,       do_store_A      ;DB nn          ;IN A,(n)
-instr  do_fetch_DIR16, do_op_IFC,      do_store_CALL   ;DC nn nn       ;CALL C,nn
-instr  do_NOP,         do_op_INV,      do_nop          ;DD             ;(Z80 specific)
-instr  do_fetch_DIR8,  do_op_SBCFA,    do_nop          ;DE nn          ;SBC A,n
-instr  do_fetch_RST,   do_NOP,         do_store_CALL   ;DF             ;RST 18H
-instr  do_NOP,         do_op_IFPO,     do_store_RET    ;E0             ;RET PO
-instr  do_NOP,         do_op_POP16,    do_store_HL     ;E1             ;POP HL
-instr  do_fetch_DIR16, do_op_IFPO,     do_store_PC     ;E2 nn nn       ;JP PO,nn
-instr  do_fetch_MSP,   do_op_EXHL,     do_store_MSP    ;E3             ;EX (SP),HL
-instr  do_fetch_DIR16, do_op_IFPO,     do_store_CALL   ;E4 nn nn       ;CALL PO,nn
-instr  do_fetch_HL,    do_op_PUSH16,   do_nop          ;E5             ;PUSH HL
-instr  do_fetch_DIR8,  do_op_ANDA,     do_nop          ;E6 nn          ;AND n
-instr  do_fetch_RST,   do_NOP,         do_store_CALL   ;E7             ;RST 20H
-instr  do_NOP,         do_op_IFPE,     do_store_RET    ;E8             ;RET PE
-instr  do_fetch_HL,    do_NOP,         do_store_PC     ;E9             ;JP HL
-instr  do_fetch_DIR16, do_op_IFPE,     do_store_PC     ;EA nn nn       ;JP PE,nn
-instr  do_fetch_DE,    do_op_EXHL,     do_store_DE     ;EB             ;EX DE,HL
-instr  do_fetch_DIR16, do_op_IFPE,     do_store_CALL   ;EC nn nn       ;CALL PE,nn
-instr  do_NOP,         do_op_INV,      do_nop          ;ED             ;(Z80 specific)
-instr  do_fetch_DIR8,  do_op_XORA,     do_nop          ;EE nn          ;XOR n
-instr  do_fetch_RST,   do_NOP,         do_store_CALL   ;EF             ;RST 28H
-instr  do_NOP,         do_op_IFP,      do_store_RET    ;F0             ;RET P
-instr  do_NOP,         do_op_POP16,    do_store_AF     ;F1             ;POP AF
-instr  do_fetch_DIR16, do_op_IFP,      do_store_PC     ;F2 nn nn       ;JP P,nn
-instr  do_NOP,         do_op_DI,       do_nop          ;F3             ;DI
-instr  do_fetch_DIR16, do_op_IFP,      do_store_CALL   ;F4 nn nn       ;CALL P,nn
-instr  do_fetch_AF,    do_op_PUSH16,   do_nop          ;F5             ;PUSH AF
-instr  do_fetch_DIR8,  do_op_ORA,      do_nop          ;F6 nn          ;OR n
-instr  do_fetch_RST,   do_NOP,         do_store_CALL   ;F7             ;RST 30H
-instr  do_NOP,         do_op_IFM,      do_store_RET    ;F8             ;RET M
-instr  do_fetch_HL,    do_NOP,         do_store_SP     ;F9             ;LD SP,HL
-instr  do_fetch_DIR16, do_op_IFM,      do_store_PC     ;FA nn nn       ;JP M,nn
-instr  do_NOP,         do_op_EI,       do_nop          ;FB             ;EI
-instr  do_fetch_DIR16, do_op_IFM,      do_store_CALL   ;FC nn nn       ;CALL M,nn
-instr  do_NOP,         do_op_INV,      do_nop          ;FD             ;(Z80 specific)
-instr  do_fetch_DIR8,  do_op_CPFA,     do_nop          ;FE nn          ;CP n
-instr  do_fetch_RST,   do_NOP,         do_store_CALL   ;FF             ;RST 38H
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;00             ;NOP
+instr  do_fetch_DIR16, op_nop,         do_store_BC     ;01 nn nn       ;LD BC,nn
+instr  do_fetch_nop,   op_nop,         do_store_MBC    ;02             ;LD (BC),A
+instr  do_fetch_BC,    op_INC16,       do_store_BC     ;03             ;INC BC
+instr  do_fetch_B,     op_INC,         do_store_B      ;04             ;INC B
+instr  do_fetch_B,     op_DEC,         do_store_B      ;05             ;DEC B
+instr  do_fetch_DIR8,  op_nop,         do_store_B      ;06             ;LD B,n
+instr  do_fetch_nop,   op_RLCA,        do_store_nop    ;07             ;RLCA
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;08             ;EX AF,AF'
+instr  do_fetch_BC,    op_ADDHL,       do_store_HL     ;09             ;ADD HL,BC
+instr  do_fetch_MBC,   op_nop,         do_store_nop    ;0A             ;LD A,(BC)
+instr  do_fetch_BC,    op_DEC16,       do_store_BC     ;0B             ;DEC BC
+instr  do_fetch_C,     op_INC,         do_store_C      ;0C             ;INC C
+instr  do_fetch_C,     op_DEC,         do_store_C      ;0D             ;DEC C
+instr  do_fetch_DIR8,  op_nop,         do_store_C      ;0E nn          ;LD C,n
+instr  do_fetch_nop,   op_RRCA,        do_store_nop    ;0F             ;RRCA
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;10 oo          ;DJNZ o
+instr  do_fetch_DIR16, op_nop,         do_store_DE     ;11 nn nn       ;LD DE,nn
+instr  do_fetch_nop,   op_nop,         do_store_MDE    ;12             ;LD (DE),A
+instr  do_fetch_DE,    op_INC16,       do_store_DE     ;13             ;INC DE
+instr  do_fetch_D,     op_INC,         do_store_D      ;14             ;INC D
+instr  do_fetch_D,     op_DEC,         do_store_D      ;15             ;DEC D
+instr  do_fetch_DIR8,  op_nop,         do_store_D      ;16 nn          ;LD D,n
+instr  do_fetch_nop,   op_RLA,         do_store_nop    ;17             ;RLA
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;18 oo          ;JR o
+instr  do_fetch_DE,    op_ADDHL,       do_store_HL     ;19             ;ADD HL,DE
+instr  do_fetch_MDE,   op_nop,         do_store_nop    ;1A             ;LD A,(DE)
+instr  do_fetch_DE,    op_DEC16,       do_store_DE     ;1B             ;DEC DE
+instr  do_fetch_E,     op_INC,         do_store_E      ;1C             ;INC E
+instr  do_fetch_E,     op_DEC,         do_store_E      ;1D             ;DEC E
+instr  do_fetch_DIR8,  op_nop,         do_store_E      ;1E nn          ;LD E,n
+instr  do_fetch_nop,   op_RRA,         do_store_nop    ;1F             ;RRA
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;20 oo          ;JR NZ,o
+instr  do_fetch_DIR16, op_nop,         do_store_HL     ;21 nn nn       ;LD HL,nn
+instr  do_fetch_DIR16, op_STHL,        do_store_nop    ;22 nn nn       ;LD (nn),HL
+instr  do_fetch_HL,    op_INC16,       do_store_HL     ;23             ;INC HL
+instr  do_fetch_H,     op_INC,         do_store_H      ;24             ;INC H
+instr  do_fetch_H,     op_DEC,         do_store_H      ;25             ;DEC H
+instr  do_fetch_DIR8,  op_nop,         do_store_H      ;26 nn          ;LD H,n
+instr  do_fetch_A,     op_DA,          do_store_A      ;27             ;DAA
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;28 oo          ;JR Z,o
+instr  do_fetch_HL,    op_ADDHL,       do_store_HL     ;29             ;ADD HL,HL
+instr  do_fetch_DIR16, op_RMEM16,      do_store_HL     ;2A nn nn       ;LD HL,(nn)
+instr  do_fetch_HL,    op_DEC16,       do_store_HL     ;2B             ;DEC HL
+instr  do_fetch_L,     op_INC,         do_store_L      ;2C             ;INC L
+instr  do_fetch_L,     op_DEC,         do_store_L      ;2D             ;DEC L
+instr  do_fetch_DIR8,  op_nop,         do_store_L      ;2E nn          ;LD L,n
+instr  do_fetch_nop,   op_CPL,         do_store_nop    ;2F             ;CPL
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;30 oo          ;JR NC,o
+instr  do_fetch_DIR16, op_nop,         do_store_SP     ;31 nn nn       ;LD SP,nn
+instr  do_fetch_DIR16, op_nop,         do_store_AM     ;32 nn nn       ;LD (nn),A
+instr  do_fetch_SP,    op_INC16,       do_store_SP     ;33             ;INC SP
+instr  do_fetch_MHL,   op_INC,         do_store_MHL    ;34             ;INC (HL)
+instr  do_fetch_MHL,   op_DEC,         do_store_MHL    ;35             ;DEC (HL)
+instr  do_fetch_DIR8,  op_nop,         do_store_MHL    ;36 nn          ;LD (HL),n
+instr  do_fetch_nop,   op_SCF,         do_store_nop    ;37             ;SCF
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;38 oo          ;JR C,o
+instr  do_fetch_SP,    op_ADDHL,       do_store_HL     ;39             ;ADD HL,SP
+instr  do_fetch_DIR16, op_RMEM8,       do_store_A      ;3A nn nn       ;LD A,(nn)
+instr  do_fetch_SP,    op_DEC16,       do_store_SP     ;3B             ;DEC SP
+instr  do_fetch_nop,   op_INCA,        do_store_nop    ;3C             ;INC A
+instr  do_fetch_nop,   op_DECA,        do_store_nop    ;3D             ;DEC A
+instr  do_fetch_DIR8,  op_nop,         do_store_A      ;3E nn          ;LD A,n
+instr  do_fetch_nop,   op_CCF,         do_store_nop    ;3F             ;CCF (Complement Carry Flag, gvd)
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;40             ;LD B,B
+instr  do_fetch_C,     op_nop,         do_store_B      ;41             ;LD B,C
+instr  do_fetch_D,     op_nop,         do_store_B      ;42             ;LD B,D
+instr  do_fetch_E,     op_nop,         do_store_B      ;43             ;LD B,E
+instr  do_fetch_H,     op_nop,         do_store_B      ;44             ;LD B,H
+instr  do_fetch_L,     op_nop,         do_store_B      ;45             ;LD B,L
+instr  do_fetch_MHL,   op_nop,         do_store_B      ;46             ;LD B,(HL)
+instr  do_fetch_A,     op_nop,         do_store_B      ;47             ;LD B,A
+instr  do_fetch_B,     op_nop,         do_store_C      ;48             ;LD C,B
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;49             ;LD C,C
+instr  do_fetch_D,     op_nop,         do_store_C      ;4A             ;LD C,D
+instr  do_fetch_E,     op_nop,         do_store_C      ;4B             ;LD C,E
+instr  do_fetch_H,     op_nop,         do_store_C      ;4C             ;LD C,H
+instr  do_fetch_L,     op_nop,         do_store_C      ;4D             ;LD C,L
+instr  do_fetch_MHL,   op_nop,         do_store_C      ;4E             ;LD C,(HL)
+instr  do_fetch_A,     op_nop,         do_store_C      ;4F             ;LD C,A
+instr  do_fetch_B,     op_nop,         do_store_D      ;50             ;LD D,B
+instr  do_fetch_C,     op_nop,         do_store_D      ;51             ;LD D,C
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;52             ;LD D,D
+instr  do_fetch_E,     op_nop,         do_store_D      ;53             ;LD D,E
+instr  do_fetch_H,     op_nop,         do_store_D      ;54             ;LD D,H
+instr  do_fetch_L,     op_nop,         do_store_D      ;55             ;LD D,L
+instr  do_fetch_MHL,   op_nop,         do_store_D      ;56             ;LD D,(HL)
+instr  do_fetch_A,     op_nop,         do_store_D      ;57             ;LD D,A
+instr  do_fetch_B,     op_nop,         do_store_E      ;58             ;LD E,B
+instr  do_fetch_C,     op_nop,         do_store_E      ;59             ;LD E,C
+instr  do_fetch_D,     op_nop,         do_store_E      ;5A             ;LD E,D
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;5B             ;LD E,E
+instr  do_fetch_H,     op_nop,         do_store_E      ;5C             ;LD E,H
+instr  do_fetch_L,     op_nop,         do_store_E      ;5D             ;LD E,L
+instr  do_fetch_MHL,   op_nop,         do_store_E      ;5E             ;LD E,(HL)
+instr  do_fetch_A,     op_nop,         do_store_E      ;5F             ;LD E,A
+instr  do_fetch_B,     op_nop,         do_store_H      ;60             ;LD H,B
+instr  do_fetch_C,     op_nop,         do_store_H      ;61             ;LD H,C
+instr  do_fetch_D,     op_nop,         do_store_H      ;62             ;LD H,D
+instr  do_fetch_E,     op_nop,         do_store_H      ;63             ;LD H,E
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;64             ;LD H,H
+instr  do_fetch_L,     op_nop,         do_store_H      ;65             ;LD H,L
+instr  do_fetch_MHL,   op_nop,         do_store_H      ;66             ;LD H,(HL)
+instr  do_fetch_A,     op_nop,         do_store_H      ;67             ;LD H,A
+instr  do_fetch_B,     op_nop,         do_store_L      ;68             ;LD L,B
+instr  do_fetch_C,     op_nop,         do_store_L      ;69             ;LD L,C
+instr  do_fetch_D,     op_nop,         do_store_L      ;6A             ;LD L,D
+instr  do_fetch_E,     op_nop,         do_store_L      ;6B             ;LD L,E
+instr  do_fetch_H,     op_nop,         do_store_L      ;6C             ;LD L,H
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;6D             ;LD L,L
+instr  do_fetch_MHL,   op_nop,         do_store_L      ;6E             ;LD L,(HL)
+instr  do_fetch_A,     op_nop,         do_store_L      ;6F             ;LD L,A
+instr  do_fetch_B,     op_nop,         do_store_MHL    ;70             ;LD (HL),B
+instr  do_fetch_C,     op_nop,         do_store_MHL    ;71             ;LD (HL),C
+instr  do_fetch_D,     op_nop,         do_store_MHL    ;72             ;LD (HL),D
+instr  do_fetch_E,     op_nop,         do_store_MHL    ;73             ;LD (HL),E
+instr  do_fetch_H,     op_nop,         do_store_MHL    ;74             ;LD (HL),H
+instr  do_fetch_L,     op_nop,         do_store_MHL    ;75             ;LD (HL),L
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;76             ;HALT
+instr  do_fetch_A,     op_nop,         do_store_MHL    ;77             ;LD (HL),A
+instr  do_fetch_B,     op_nop,         do_store_A      ;78             ;LD A,B
+instr  do_fetch_C,     op_nop,         do_store_A      ;79             ;LD A,C
+instr  do_fetch_D,     op_nop,         do_store_A      ;7A             ;LD A,D
+instr  do_fetch_E,     op_nop,         do_store_A      ;7B             ;LD A,E
+instr  do_fetch_H,     op_nop,         do_store_A      ;7C             ;LD A,H
+instr  do_fetch_L,     op_nop,         do_store_A      ;7D             ;LD A,L
+instr  do_fetch_MHL,   op_nop,         do_store_A      ;7E             ;LD A,(HL)
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;7F             ;LD A,A
+instr  do_fetch_B,     op_ADDA,        do_store_nop    ;80             ;ADD A,B
+instr  do_fetch_C,     op_ADDA,        do_store_nop    ;81             ;ADD A,C
+instr  do_fetch_D,     op_ADDA,        do_store_nop    ;82             ;ADD A,D
+instr  do_fetch_E,     op_ADDA,        do_store_nop    ;83             ;ADD A,E
+instr  do_fetch_H,     op_ADDA,        do_store_nop    ;84             ;ADD A,H
+instr  do_fetch_L,     op_ADDA,        do_store_nop    ;85             ;ADD A,L
+instr  do_fetch_MHL,   op_ADDA,        do_store_nop    ;86             ;ADD A,(HL)
+instr  do_fetch_A,     op_ADDA,        do_store_nop    ;87             ;ADD A,A
+instr  do_fetch_B,     op_ADCA,        do_store_nop    ;88             ;ADC A,B
+instr  do_fetch_C,     op_ADCA,        do_store_nop    ;89             ;ADC A,C
+instr  do_fetch_D,     op_ADCA,        do_store_nop    ;8A             ;ADC A,D
+instr  do_fetch_E,     op_ADCA,        do_store_nop    ;8B             ;ADC A,E
+instr  do_fetch_H,     op_ADCA,        do_store_nop    ;8C             ;ADC A,H
+instr  do_fetch_L,     op_ADCA,        do_store_nop    ;8D             ;ADC A,L
+instr  do_fetch_MHL,   op_ADCA,        do_store_nop    ;8E             ;ADC A,(HL)
+instr  do_fetch_A,     op_ADCA,        do_store_nop    ;8F             ;ADC A,A
+instr  do_fetch_B,     op_SUBFA,       do_store_nop    ;90             ;SUB A,B
+instr  do_fetch_C,     op_SUBFA,       do_store_nop    ;91             ;SUB A,C
+instr  do_fetch_D,     op_SUBFA,       do_store_nop    ;92             ;SUB A,D
+instr  do_fetch_E,     op_SUBFA,       do_store_nop    ;93             ;SUB A,E
+instr  do_fetch_H,     op_SUBFA,       do_store_nop    ;94             ;SUB A,H
+instr  do_fetch_L,     op_SUBFA,       do_store_nop    ;95             ;SUB A,L
+instr  do_fetch_MHL,   op_SUBFA,       do_store_nop    ;96             ;SUB A,(HL)
+instr  do_fetch_A,     op_SUBFA,       do_store_nop    ;97             ;SUB A,A
+instr  do_fetch_B,     op_SBCFA,       do_store_nop    ;98             ;SBC A,B
+instr  do_fetch_C,     op_SBCFA,       do_store_nop    ;99             ;SBC A,C
+instr  do_fetch_D,     op_SBCFA,       do_store_nop    ;9A             ;SBC A,D
+instr  do_fetch_E,     op_SBCFA,       do_store_nop    ;9B             ;SBC A,E
+instr  do_fetch_H,     op_SBCFA,       do_store_nop    ;9C             ;SBC A,H
+instr  do_fetch_L,     op_SBCFA,       do_store_nop    ;9D             ;SBC A,L
+instr  do_fetch_MHL,   op_SBCFA,       do_store_nop    ;9E             ;SBC A,(HL)
+instr  do_fetch_A,     op_SBCFA,       do_store_nop    ;9F             ;SBC A,A
+instr  do_fetch_B,     op_ANDA,        do_store_nop    ;A0             ;AND A,B
+instr  do_fetch_C,     op_ANDA,        do_store_nop    ;A1             ;AND A,C
+instr  do_fetch_D,     op_ANDA,        do_store_nop    ;A2             ;AND A,D
+instr  do_fetch_E,     op_ANDA,        do_store_nop    ;A3             ;AND A,E
+instr  do_fetch_H,     op_ANDA,        do_store_nop    ;A4             ;AND A,H
+instr  do_fetch_L,     op_ANDA,        do_store_nop    ;A5             ;AND A,L
+instr  do_fetch_MHL,   op_ANDA,        do_store_nop    ;A6             ;AND A,(HL)
+instr  do_fetch_A,     op_ANDA,        do_store_nop    ;A7             ;AND A,A
+instr  do_fetch_B,     op_XORA,        do_store_nop    ;A8             ;XOR A,B
+instr  do_fetch_C,     op_XORA,        do_store_nop    ;A9             ;XOR A,C
+instr  do_fetch_D,     op_XORA,        do_store_nop    ;AA             ;XOR A,D
+instr  do_fetch_E,     op_XORA,        do_store_nop    ;AB             ;XOR A,E
+instr  do_fetch_H,     op_XORA,        do_store_nop    ;AC             ;XOR A,H
+instr  do_fetch_L,     op_XORA,        do_store_nop    ;AD             ;XOR A,L
+instr  do_fetch_MHL,   op_XORA,        do_store_nop    ;AE             ;XOR A,(HL)
+instr  do_fetch_A,     op_XORA,        do_store_nop    ;AF             ;XOR A,A
+instr  do_fetch_B,     op_ORA,         do_store_nop    ;B0             ;OR A,B
+instr  do_fetch_C,     op_ORA,         do_store_nop    ;B1             ;OR A,C
+instr  do_fetch_D,     op_ORA,         do_store_nop    ;B2             ;OR A,D
+instr  do_fetch_E,     op_ORA,         do_store_nop    ;B3             ;OR A,E
+instr  do_fetch_H,     op_ORA,         do_store_nop    ;B4             ;OR A,H
+instr  do_fetch_L,     op_ORA,         do_store_nop    ;B5             ;OR A,L
+instr  do_fetch_MHL,   op_ORA,         do_store_nop    ;B6             ;OR A,(HL)
+instr  do_fetch_A,     op_ORA,         do_store_nop    ;B7             ;OR A,A
+instr  do_fetch_B,     op_CPFA,        do_store_nop    ;B8             ;CP A,B
+instr  do_fetch_C,     op_CPFA,        do_store_nop    ;B9             ;CP A,C
+instr  do_fetch_D,     op_CPFA,        do_store_nop    ;BA             ;CP A,D
+instr  do_fetch_E,     op_CPFA,        do_store_nop    ;BB             ;CP A,E
+instr  do_fetch_H,     op_CPFA,        do_store_nop    ;BC             ;CP A,H
+instr  do_fetch_L,     op_CPFA,        do_store_nop    ;BD             ;CP A,L
+instr  do_fetch_MHL,   op_CPFA,        do_store_nop    ;BE             ;CP A,(HL)
+instr  do_fetch_A,     op_CPFA,        do_store_nop    ;BF             ;CP A,A
+instr  do_fetch_nop,   op_IFNZ,        do_store_RET    ;C0             ;RET NZ
+instr  do_fetch_nop,   op_POP16,       do_store_BC     ;C1             ;POP BC
+instr  do_fetch_DIR16, op_IFNZ,        do_store_PC     ;C2 nn nn       ;JP NZ,nn
+instr  do_fetch_DIR16, op_nop,         do_store_PC     ;C3 nn nn       ;JP nn
+instr  do_fetch_DIR16, op_IFNZ,        do_store_CALL   ;C4 nn nn       ;CALL NZ,nn
+instr  do_fetch_BC,    op_PUSH16,      do_store_nop    ;C5             ;PUSH BC
+instr  do_fetch_DIR8,  op_ADDA,        do_store_nop    ;C6 nn          ;ADD A,n
+instr  do_fetch_RST,   op_nop,         do_store_CALL   ;C7             ;RST 0
+instr  do_fetch_nop,   op_IFZ,         do_store_RET    ;C8             ;RET Z
+instr  do_fetch_nop,   op_nop,         do_store_RET    ;C9             ;RET
+instr  do_fetch_DIR16, op_IFZ,         do_store_PC     ;CA nn nn       ;JP Z,nn
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;CB             ;(Z80 specific)
+instr  do_fetch_DIR16, op_IFZ,         do_store_CALL   ;CC nn nn       ;CALL Z,nn
+instr  do_fetch_DIR16, op_nop,         do_store_CALL   ;CD nn nn       ;CALL nn
+instr  do_fetch_DIR8,  op_ADCA,        do_store_nop    ;CE nn          ;ADC A,n
+instr  do_fetch_RST,   op_nop,         do_store_CALL   ;CF             ;RST 8H
+instr  do_fetch_nop,   op_IFNC,        do_store_RET    ;D0             ;RET NC
+instr  do_fetch_nop,   op_POP16,       do_store_DE     ;D1             ;POP DE
+instr  do_fetch_DIR16, op_IFNC,        do_store_PC     ;D2 nn nn       ;JP NC,nn
+instr  do_fetch_DIR8,  op_OUTA,        do_store_nop    ;D3 nn          ;OUT (n),A
+instr  do_fetch_DIR16, op_IFNC,        do_store_CALL   ;D4 nn nn       ;CALL NC,nn
+instr  do_fetch_DE,    op_PUSH16,      do_store_nop    ;D5             ;PUSH DE
+instr  do_fetch_DIR8,  op_SUBFA,       do_store_nop    ;D6 nn          ;SUB n
+instr  do_fetch_RST,   op_nop,         do_store_CALL   ;D7             ;RST 10H
+instr  do_fetch_nop,   op_IFC,         do_store_RET    ;D8             ;RET C
+instr  do_fetch_nop,   op_nop,         do_store_nop    ;D9             ;EXX
+instr  do_fetch_DIR16, op_IFC,         do_store_PC     ;DA nn nn       ;JP C,nn
+instr  do_fetch_DIR8,  op_IN,          do_store_A      ;DB nn          ;IN A,(n)
+instr  do_fetch_DIR16, op_IFC,         do_store_CALL   ;DC nn nn       ;CALL C,nn
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;DD             ;(Z80 specific)
+instr  do_fetch_DIR8,  op_SBCFA,       do_store_nop    ;DE nn          ;SBC A,n
+instr  do_fetch_RST,   op_nop,         do_store_CALL   ;DF             ;RST 18H
+instr  do_fetch_nop,   op_IFPO,        do_store_RET    ;E0             ;RET PO
+instr  do_fetch_nop,   op_POP16,       do_store_HL     ;E1             ;POP HL
+instr  do_fetch_DIR16, op_IFPO,        do_store_PC     ;E2 nn nn       ;JP PO,nn
+instr  do_fetch_MSP,   op_EXHL,        do_store_MSP    ;E3             ;EX (SP),HL
+instr  do_fetch_DIR16, op_IFPO,        do_store_CALL   ;E4 nn nn       ;CALL PO,nn
+instr  do_fetch_HL,    op_PUSH16,      do_store_nop    ;E5             ;PUSH HL
+instr  do_fetch_DIR8,  op_ANDA,        do_store_nop    ;E6 nn          ;AND n
+instr  do_fetch_RST,   op_nop,         do_store_CALL   ;E7             ;RST 20H
+instr  do_fetch_nop,   op_IFPE,        do_store_RET    ;E8             ;RET PE
+instr  do_fetch_HL,    op_nop,         do_store_PC     ;E9             ;JP HL
+instr  do_fetch_DIR16, op_IFPE,        do_store_PC     ;EA nn nn       ;JP PE,nn
+instr  do_fetch_DE,    op_EXHL,        do_store_DE     ;EB             ;EX DE,HL
+instr  do_fetch_DIR16, op_IFPE,        do_store_CALL   ;EC nn nn       ;CALL PE,nn
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;ED             ;(Z80 specific)
+instr  do_fetch_DIR8,  op_XORA,        do_store_nop    ;EE nn          ;XOR n
+instr  do_fetch_RST,   op_nop,         do_store_CALL   ;EF             ;RST 28H
+instr  do_fetch_nop,   op_IFP,         do_store_RET    ;F0             ;RET P
+instr  do_fetch_nop,   op_POP16,       do_store_AF     ;F1             ;POP AF
+instr  do_fetch_DIR16, op_IFP,         do_store_PC     ;F2 nn nn       ;JP P,nn
+instr  do_fetch_nop,   op_DI,          do_store_nop    ;F3             ;DI
+instr  do_fetch_DIR16, op_IFP,         do_store_CALL   ;F4 nn nn       ;CALL P,nn
+instr  do_fetch_AF,    op_PUSH16,      do_store_nop    ;F5             ;PUSH AF
+instr  do_fetch_DIR8,  op_ORA,         do_store_nop    ;F6 nn          ;OR n
+instr  do_fetch_RST,   op_nop,         do_store_CALL   ;F7             ;RST 30H
+instr  do_fetch_nop,   op_IFM,         do_store_RET    ;F8             ;RET M
+instr  do_fetch_HL,    op_nop,         do_store_SP     ;F9             ;LD SP,HL
+instr  do_fetch_DIR16, op_IFM,         do_store_PC     ;FA nn nn       ;JP M,nn
+instr  do_fetch_nop,   op_EI,          do_store_nop    ;FB             ;EI
+instr  do_fetch_DIR16, op_IFM,         do_store_CALL   ;FC nn nn       ;CALL M,nn
+instr  do_fetch_nop,   op_INV,         do_store_nop    ;FD             ;(Z80 specific)
+instr  do_fetch_DIR8,  op_CPFA,        do_store_nop    ;FE nn          ;CP n
+instr  do_fetch_RST,   op_nop,         do_store_CALL   ;FF             ;RST 38H
+
 
 ;----------------------------------------------------------------
 ; Lookup table, stolen from z80ex, Z80 emulation library.