summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcpu_dsl.py34
-rw-r--r--z80.cpu160
2 files changed, 185 insertions, 9 deletions
diff --git a/cpu_dsl.py b/cpu_dsl.py
index 6c2ca15..0b76e9e 100755
--- a/cpu_dsl.py
+++ b/cpu_dsl.py
@@ -242,7 +242,7 @@ class Op:
decl = ''
if needsCarry or needsOflow or needsHalf:
size = prog.paramSize(rawParams[2])
- if needsCarry:
+ if needsCarry and op != 'lsr':
size *= 2
decl,name = prog.getTemp(size)
dst = prog.carryFlowDst = name
@@ -325,9 +325,13 @@ def _updateFlagsCImpl(prog, params, rawParams):
if calc == 'sign':
resultBit = prog.paramSize(prog.lastDst) - 1
elif calc == 'carry':
- resultBit = prog.paramSize(prog.lastDst)
- if prog.lastOp.op == 'ror':
- resultBit -= 1
+ if prog.lastOp.op in ('asr', 'lsr'):
+ resultBit = 0
+ myRes = prog.lastA
+ else:
+ resultBit = prog.paramSize(prog.lastDst)
+ if prog.lastOp.op == 'ror':
+ resultBit -= 1
elif calc == 'half':
resultBit = prog.paramSize(prog.lastDst) - 4
myRes = '({a} ^ {b} ^ {res})'.format(a = prog.lastA, b = prog.lastB, res = lastDst)
@@ -453,10 +457,24 @@ def _cmpCImpl(prog, params, rawParams, flagUpdates):
prog.lastDst = rawParams[1]
return '\n\t{var} = {b} - {a};'.format(var = tmpvar, a = params[0], b = params[1])
-def _asrCImpl(prog, params, rawParams):
- shiftSize = prog.paramSize(rawParams[0])
- mask = 1 << (shiftSize - 1)
- return '\n\t{dst} = ({a} >> {b}) | ({a} & {mask});'.format(a = params[0], b = params[1], dst = params[2], mask = mask)
+def _asrCImpl(prog, params, rawParams, flagUpdates):
+ needsCarry = False
+ if flagUpdates:
+ for flag in flagUpdates:
+ calc = prog.flags.flagCalc[flag]
+ if calc == 'carry':
+ needsCarry = True
+ decl = ''
+ size = prog.paramSize(rawParams[2])
+ if needsCarry:
+ decl,name = prog.getTemp(size * 2)
+ dst = prog.carryFlowDst = name
+ prog.lastA = params[0]
+ else:
+ dst = params[2]
+ mask = 1 << (size - 1)
+ return decl + '\n\t{dst} = ({a} >> {b}) | ({a} & {mask} ? 0xFFFFFFFFU << ({size} - {b}) : 0);'.format(
+ a = params[0], b = params[1], dst = dst, mask = mask, size=size)
def _sext(size, src):
if size == 16:
diff --git a/z80.cpu b/z80.cpu
index 33e3082..6d09ede 100644
--- a/z80.cpu
+++ b/z80.cpu
@@ -1504,4 +1504,162 @@ fdcb 00011110 rr_iyd
z80_rr_index tmp
fdcb 00011RRR rr_iyd_reg
- z80_rr_index main.R \ No newline at end of file
+ z80_rr_index main.R
+
+cb 00100RRR sla
+ lsl main.R 1 main.R
+ update_flags SZYH0PXN0C
+
+cb 00100110 sla_hl
+ local tmp 8
+ z80_fetch_hl
+ mov scratch1 tmp
+ lsl tmp 1 tmp
+ update_flags SZYH0PXN0C
+ mov tmp scratch1
+ z80_store_hl
+
+z80_sla_index
+ arg tmp 8
+ mov wz scratch1
+ ocall read_8
+ cycles 1
+ mov scratch1 tmp
+ lsl tmp 1 tmp
+ update_flags SZYH0PXN0C
+ mov tmp scratch1
+ z80_store_index
+
+ddcb 00100110 sla_ixd
+ local tmp 8
+ z80_sla_index tmp
+
+ddcb 00100RRR sla_ixd_reg
+ z80_sla_index main.R
+
+fdcb 00100110 sla_iyd
+ local tmp 8
+ z80_sla_index tmp
+
+fdcb 00100RRR sla_iyd_reg
+ z80_sla_index main.R
+
+cb 00101RRR sra
+ asr main.R 1 main.R
+ update_flags SZYH0PXN0C
+
+cb 00101110 sra_hl
+ local tmp 8
+ z80_fetch_hl
+ mov scratch1 tmp
+ asr tmp 1 tmp
+ update_flags SZYH0PXN0C
+ mov tmp scratch1
+ z80_store_hl
+
+z80_sra_index
+ arg tmp 8
+ mov wz scratch1
+ ocall read_8
+ cycles 1
+ mov scratch1 tmp
+ asr tmp 1 tmp
+ update_flags SZYH0PXN0C
+ mov tmp scratch1
+ z80_store_index
+
+ddcb 00101110 sra_ixd
+ local tmp 8
+ z80_sra_index tmp
+
+ddcb 00101RRR sra_ixd_reg
+ z80_sra_index main.R
+
+fdcb 00101110 sra_iyd
+ local tmp 8
+ z80_sra_index tmp
+
+fdcb 00101RRR sra_iyd_reg
+ z80_sra_index main.R
+
+cb 00110RRR sll
+ lsl main.R 1 main.R
+ update_flags SZ0YH0XN0C
+ or 1 main.R main.R
+ update_flags P
+
+cb 00110110 sll_hl
+ local tmp 8
+ z80_fetch_hl
+ mov scratch1 tmp
+ lsl tmp 1 tmp
+ update_flags SZ0YH0XN0C
+ or 1 tmp tmp
+ update_flags P
+ mov tmp scratch1
+ z80_store_hl
+
+z80_sll_index
+ arg tmp 8
+ mov wz scratch1
+ ocall read_8
+ cycles 1
+ mov scratch1 tmp
+ lsl tmp 1 tmp
+ update_flags SZ0YH0XN0C
+ or 1 tmp tmp
+ update_flags P
+ mov tmp scratch1
+ z80_store_index
+
+ddcb 00110110 sll_ixd
+ local tmp 8
+ z80_sll_index tmp
+
+ddcb 00110RRR sll_ixd_reg
+ z80_sll_index main.R
+
+fdcb 00110110 sll_iyd
+ local tmp 8
+ z80_sll_index tmp
+
+fdcb 00110RRR sll_iyd_reg
+ z80_sll_index main.R
+
+cb 00111RRR srl
+ lsr main.R 1 main.R
+ update_flags SZYH0PXN0C
+
+cb 00111110 srl_hl
+ local tmp 8
+ z80_fetch_hl
+ mov scratch1 tmp
+ lsr tmp 1 tmp
+ update_flags SZYH0PXN0C
+ mov tmp scratch1
+ z80_store_hl
+
+z80_srl_index
+ arg tmp 8
+ mov wz scratch1
+ ocall read_8
+ cycles 1
+ mov scratch1 tmp
+ lsr tmp 1 tmp
+ update_flags SZYH0PXN0C
+ mov tmp scratch1
+ z80_store_index
+
+ddcb 00111110 srl_ixd
+ local tmp 8
+ z80_srl_index tmp
+
+ddcb 00111RRR srl_ixd_reg
+ z80_srl_index main.R
+
+fdcb 00111110 srl_iyd
+ local tmp 8
+ z80_srl_index tmp
+
+fdcb 00111RRR srl_iyd_reg
+ z80_srl_index main.R \ No newline at end of file