#if 1
-do_op_da:
+do_op_daa:
#if EM_Z80
sbrc z_flags,ZFL_N ;if add-op
#if EM_Z80
op_da_sub: ;else (sub-op)
- rcall do_op_inv ; TODO: ! Z80 DAA whith N flag set.
+ rjmp op_da_add ; TODO: ! Z80 DAA whith N flag set.
ret ;endif
#endif
instr fetch_H, op_INC, store_H ;24 ;INC H
instr fetch_H, op_DEC, store_H ;25 ;DEC H
instr fetch_DIR8, op_nop, store_H ;26 nn ;LD H,n
-instr fetch_A, op_DA, store_A ;27 ;DAA
+instr fetch_A, op_DAA, store_A ;27 ;DAA
instr fetch_DIR8, op_IFZ, store_pcrel ;28 oo ;JR Z,o
instr fetch_HL, op_ADDHL, store_nop ;29 ;ADD HL,HL
instr fetch_DIR16, op_RMEM16, store_HL ;2A nn nn ;LD HL,(nn)
sbiw z_pcl,2
ret
+;----------------------------------------------------------------
+;|Mnemonic |SZHPNC|Description |Notes |
+;----------------------------------------------------------------
+;|INI |?*??1-|Input and Increment |[HL]=[C],HL=HL+1,B=B-1|
+;|IND |?*??1-|Input and Decrement |[HL]=[C],HL=HL-1,B=B-1|
+;|INIR |?1??1-|Input, Inc., Repeat |INI till B=0 |
+;|INDR |?1??1-|Input, Dec., Repeat |IND till B=0 |
+
+op_INxx_common:
+ cbr z_flags,(1<<ZFL_Z)
+ sbr z_flags,(1<<ZFL_N)
+ ldd temp2,y+oz_c ;C
+ lcall portRead
+ ldd xh,y+oz_h ;H
+ ldd xl,y+oz_l ;L
+ lcall dram_write
+ ldd temp,y+oz_b ;B
+ dec temp
+ std y+oz_b,oph ;B
+ brne PC+2
+ sbr z_flags,(1<<ZFL_Z)
+ ret
+
+do_op_INI:
+ rcall op_INxx_common
+ adiw x,1
+ std y+oz_l,xl ;L
+ std y+oz_h,xh ;H
+ ret
+
+do_op_IND:
+ rcall op_INxx_common
+ sbiw x,1
+ std y+oz_l,xl ;L
+ std y+oz_h,xh ;H
+ ret
+
+do_op_INIR:
+ rcall do_op_INI
+ sbrc z_flags,ZFL_Z
+ ret
+ sbiw z_pcl,2
+ ret
+
+do_op_INDR:
+ rcall do_op_IND
+ sbrs z_flags,ZFL_P
+ ret
+ sbiw z_pcl,2
+ ret
+
+;----------------------------------------------------------------
+;|Mnemonic |SZHPNC|Description |Notes |
+;----------------------------------------------------------------
+;|OUTI |?*??1-|Output and Increment |[C]=[HL],HL=HL+1,B=B-1|
+;|OUTD |?*??1-|Output and Decrement |[C]=[HL],HL=HL-1,B=B-1|
+;|OTIR |?1??1-|Output, Inc., Repeat |OUTI till B=0 |
+;|OTDR |?1??1-|Output, Dec., Repeat |OUTD till B=0 |
+
+op_OUTxx_common:
+ cbr z_flags,(1<<ZFL_Z)
+ sbr z_flags,(1<<ZFL_N)
+ lcall dram_read ;temp = (z)
+ ldd temp2,y+oz_c ;C
+ lcall portWrite
+ ldd temp,y+oz_b ;B
+ dec temp
+ std y+oz_b,temp ;B
+ brne PC+2
+ sbr z_flags,(1<<ZFL_Z)
+ ret
+
+do_op_OUTI:
+ ldd xh,y+oz_h ;H
+ ldd xl,y+oz_l ;L
+ adiw x,1
+ std y+oz_l,xl ;L
+ std y+oz_h,xh ;H
+ sbiw x,1
+ rcall op_OUTxx_common
+ ret
+
+do_op_OUTD:
+ ldd xh,y+oz_h ;H
+ ldd xl,y+oz_l ;L
+ sbiw x,1
+ std y+oz_l,xl ;L
+ std y+oz_h,xh ;H
+ adiw x,1
+ rcall op_OUTxx_common
+ ret
+
+do_op_OTIR:
+ rcall do_op_OUTI
+ sbrc z_flags,ZFL_Z
+ ret
+ sbiw z_pcl,2
+ ret
+
+do_op_OTDR:
+ rcall do_op_OUTD
+ sbrs z_flags,ZFL_P
+ ret
+ sbiw z_pcl,2
+ ret
+
;----------------------------------------------------------------
;|Mnemonic |SZHPNC|Description |Notes |
instr fetch_nop, op_nop, store_nop ;9F ;NOP
instr fetch_nop, op_LDI, store_nop ;A0 ;LDI
instr fetch_nop, op_CPI, store_nop ;A1 ;CPI
-instr fetch_nop, op_nop, store_nop ;A2 ; TODO:
-instr fetch_nop, op_nop, store_nop ;A3 ;
+instr fetch_nop, op_INI, store_nop ;A2 ;INI
+instr fetch_nop, op_OUTI, store_nop ;A3 ;OUTI
instr fetch_nop, op_nop, store_nop ;A4 ;NOP
instr fetch_nop, op_nop, store_nop ;A5 ;NOP
instr fetch_nop, op_nop, store_nop ;A6 ;NOP
instr fetch_nop, op_nop, store_nop ;A7 ;NOP
instr fetch_nop, op_LDD, store_nop ;A8 ;LDD
instr fetch_nop, op_CPD, store_nop ;A9 ;CPD
-instr fetch_nop, op_nop, store_nop ;AA ; TODO:
-instr fetch_nop, op_nop, store_nop ;AB ;
+instr fetch_nop, op_IND, store_nop ;AA ;IND
+instr fetch_nop, op_OUTD, store_nop ;AB ;OUTD
instr fetch_nop, op_nop, store_nop ;AC ;NOP
instr fetch_nop, op_nop, store_nop ;AD ;NOP
instr fetch_nop, op_nop, store_nop ;AE ;NOP
instr fetch_nop, op_nop, store_nop ;AF ;NOP
instr fetch_nop, op_LDIR, store_nop ;B0 ;LDIR
instr fetch_nop, op_CPIR, store_nop ;B1 ;CPIR
-instr fetch_nop, op_nop, store_nop ;B2 ;
-instr fetch_nop, op_nop, store_nop ;B3 ; TODO:
+instr fetch_nop, op_INIR, store_nop ;B2 ;INIR
+instr fetch_nop, op_OTIR, store_nop ;B3 ;OTIR
instr fetch_nop, op_nop, store_nop ;B4 ;NOP
instr fetch_nop, op_nop, store_nop ;B5 ;NOP
instr fetch_nop, op_nop, store_nop ;B6 ;NOP
instr fetch_nop, op_nop, store_nop ;B7 ;NOP
instr fetch_nop, op_LDDR, store_nop ;B8 ;LDDR
instr fetch_nop, op_CPDR, store_nop ;B9 ;CPDR
-instr fetch_nop, op_nop, store_nop ;BA ;
-instr fetch_nop, op_nop, store_nop ;BB ; TODO:
+instr fetch_nop, op_INDR, store_nop ;BA ;INDR
+instr fetch_nop, op_OTDR, store_nop ;BB ;OTDR
instr fetch_nop, op_nop, store_nop ;BC ;NOP
instr fetch_nop, op_nop, store_nop ;BD ;NOP
instr fetch_nop, op_nop, store_nop ;BE ;NOP