From 74294f281da7fa55b951404e8b78e82db0b84b5b Mon Sep 17 00:00:00 2001 From: fridtjof Date: Mon, 4 May 2026 23:17:15 +0200 Subject: [PATCH] wip! lprd implementation --- target/cr16c/translate.c | 64 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/target/cr16c/translate.c b/target/cr16c/translate.c index f3e93f15bf..61704fccac 100644 --- a/target/cr16c/translate.c +++ b/target/cr16c/translate.c @@ -1607,7 +1607,69 @@ static bool trans_LPR(DisasContext *ctx, arg_LPR* a) { } static bool trans_LPRD(DisasContext *ctx, arg_LPRD* a) { - gen_helper_raise_unimplemented_instruction(tcg_env); + TCGv dst; + TCGv src; + int32_t mask = 0; + + switch (a->p1) { // src, regular register + // TODO + default: + src = r[a->p1]; + break; + } + + switch (a->p2) { // dest, special register + case CR16C_PRD_CFG: + // CFG is only 16 bits so no regpair handling needed + // TODO verify + tcg_gen_extract_i32(cfg_sr, src, 9, 1); + tcg_gen_extract_i32(cfg_ed, src, 8, 1); + tcg_gen_extract_i32(cfg_lic, src, 5, 1); + tcg_gen_extract_i32(cfg_ic, src, 4, 1); + tcg_gen_extract_i32(cfg_ldc, src, 3, 1); + tcg_gen_extract_i32(cfg_dc, src, 2, 1); + + return true; + break; + case CR16C_PRD_PSR: + // PSR is only 16 bits so no regpair handling needed + // TODO verify + tcg_gen_extract_i32(psr_i, src, 11, 1); + tcg_gen_extract_i32(psr_p, src, 10, 1); + tcg_gen_extract_i32(psr_e, src, 9, 1); + tcg_gen_extract_i32(psr_n, src, 7, 1); + tcg_gen_extract_i32(psr_z, src, 6, 1); + tcg_gen_extract_i32(psr_f, src, 5, 1); + tcg_gen_extract_i32(psr_u, src, 3, 1); + tcg_gen_extract_i32(psr_l, src, 2, 1); + tcg_gen_extract_i32(psr_t, src, 1, 1); + tcg_gen_extract_i32(psr_c, src, 0, 1); + + return true; + break; + case CR16C_PRD_INTBASE: + dst = intbase; + mask |= 0xfffffe; + break; + case CR16C_PRD_ISP: + dst = isp; + mask |= 0xfffffe; + break; + case CR16C_PRD_USP: + dst = usp; + mask |= 0xffffff; + break; + default: + gen_helper_raise_unimplemented_instruction(tcg_env); + return true; + break; + } + + TCGv tmp = tcg_temp_new_i32(); + // TODO actually handle register pairs lol + tcg_gen_andi_i32(tmp, r[a->p1], mask); + + tcg_gen_mov_i32(dst, tmp); return true; }