summaryrefslogtreecommitdiff
path: root/z80.cpu
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2019-02-04 20:47:20 -0800
committerMichael Pavone <pavone@retrodev.com>2019-02-04 20:47:20 -0800
commitf17fbf67bb4ff80bafd5a380175ef0341627e8ab (patch)
tree71387b9c5b86d06bcb92cc55978d376915954fdd /z80.cpu
parentd69482b7a3e0a3af3558f37a8a4fbd294308571b (diff)
Implemented conditional call/ret, cpi/cpd/cpir/cpdr and fixed ldir/lddr in new Z80 core
Diffstat (limited to 'z80.cpu')
-rw-r--r--z80.cpu96
1 files changed, 87 insertions, 9 deletions
diff --git a/z80.cpu b/z80.cpu
index d09601e..d676eb8 100644
--- a/z80.cpu
+++ b/z80.cpu
@@ -1536,6 +1536,21 @@ fd 11101001 jp_iy
z80_push
mov wz pc
+11CCC100 call_cond
+ local pch 8
+ z80_fetch_immed16
+ z80_check_cond C
+
+ if istrue
+
+ lsr pc 8 pch
+ meta high pch
+ meta low pc
+ z80_push
+ mov wz pc
+
+ end
+
11TTT111 rst
local pch 8
lsr pc 8 pch
@@ -1546,14 +1561,27 @@ fd 11101001 jp_iy
mov scratch1 pc
11001001 ret
- #TODO: confirm this goes through wz
- local wzh 16
- meta high wzh
- meta low wz
+ local pch 16
+ cycles 1
+ meta high pch
+ meta low pc
z80_pop
- lsl wzh 8 wzh
- or wzh wz wz
- mov wz pc
+ lsl pch 8 pch
+ or pch pc pc
+
+11CCC000 ret_cond
+ local pch 16
+ cycles 1
+ z80_check_cond C
+ if istrue
+
+ meta high pch
+ meta low pc
+ z80_pop
+ lsl pch 8 pch
+ or pch pc pc
+
+ end
11011011 in_abs
z80_fetch_immed
@@ -2077,7 +2105,7 @@ ed 10110000 ldir
if pvflag
add 1 pc wz
- sub 1 pc pc
+ sub 2 pc pc
cycles 5
end
@@ -2087,10 +2115,60 @@ ed 10111000 lddr
if pvflag
add 1 pc wz
- sub 1 pc pc
+ sub 2 pc pc
cycles 5
end
+z80_cpd_cpi
+ local tmp 16
+ local tmp8 8
+ arg change 16
+
+ z80_fetch_mod_hl change
+ sub scratch1 a tmp8
+ update_flags SZHXN1
+
+ and 0x2 tmp8 tmp8
+ lsl tmp8 4 tmp8
+ and 0x88 last_flag_result last_flag_result
+ or tmp8 last_flag_result last_flag_result
+
+ lsl b 8 tmp
+ or c tmp tmp
+ sub 1 tmp tmp
+
+ mov tmp c
+ lsr tmp 8 b
+ mov c pvflag
+ or b pvflag pvflag
+
+ cycles 5
+
+ed 10100001 cpi
+ z80_cpd_cpi 1
+
+ed 10101001 cpd
+ z80_cpd_cpi -1
+
+ed 10110001 cpir
+ z80_cpd_cpi 1
+ if pvflag
+
+ add 1 pc wz
+ sub 2 pc pc
+ cycles 5
+
+ end
+
+ed 10111001 cpdr
+ z80_cpd_cpi -1
+ if pvflag
+
+ add 1 pc wz
+ sub 2 pc pc
+ cycles 5
+
+ end
\ No newline at end of file