# HG changeset patch # User Michael Pavone # Date 1549006416 28800 # Node ID b757ebc59851ff9c36fea017fe4dfb6bcdde3422 # Parent ac809d044cab1daaf4a31a16c1f1e7cceeb3ab41 Implemented shift instructions in new Z80 core diff -r ac809d044cab -r b757ebc59851 cpu_dsl.py --- a/cpu_dsl.py Thu Jan 31 23:03:51 2019 -0800 +++ b/cpu_dsl.py Thu Jan 31 23:33:36 2019 -0800 @@ -242,7 +242,7 @@ 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 @@ 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 @@ 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 -r ac809d044cab -r b757ebc59851 z80.cpu --- a/z80.cpu Thu Jan 31 23:03:51 2019 -0800 +++ b/z80.cpu Thu Jan 31 23:33:36 2019 -0800 @@ -1504,4 +1504,162 @@ 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