wip! lprd implementation

This commit is contained in:
fridtjof 2026-05-04 23:17:15 +02:00
parent cce6a52db9
commit 74294f281d

View file

@ -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;
}