Fix C5 cheat opcode and implement D4

This commit is contained in:
Gericom
2026-02-22 10:39:23 +01:00
parent 83046e2cc2
commit 5f5fccf2a1

View File

@@ -13,6 +13,13 @@ cheatengine_entry:
pop {r0, r1} pop {r0, r1}
mov lr, r1 mov lr, r1
push {r4, r5, lr} push {r4, r5, lr}
// increment 16-bit counter for C5
adr r1, c5counter
ldrh r0, [r1]
adds r0, #1
strh r0, [r1]
ldr r4, cheatengine_cheatsPtr ldr r4, cheatengine_cheatsPtr
ldr r5, [r4, #4] // pload_cheats_t::numberOfCheats ldr r5, [r4, #4] // pload_cheats_t::numberOfCheats
adds r4, #8 adds r4, #8
@@ -30,11 +37,10 @@ entry_end:
bx r3 bx r3
runCheat_end: runCheat_end:
pop {r4, r5, r6, r7} // r8, r9, r10, r11 pop {r4, r5, r6} // r8, r9, r10
mov r8, r4 mov r8, r4
mov r9, r5 mov r9, r5
mov r10, r6 mov r10, r6
mov r11, r7
pop {r4, r5, r6, r7, pc} pop {r4, r5, r6, r7, pc}
cheatengine_runCheat: cheatengine_runCheat:
@@ -42,8 +48,7 @@ cheatengine_runCheat:
mov r4, r8 mov r4, r8
mov r5, r9 mov r5, r9
mov r6, r10 mov r6, r10
mov r7, r11 push {r4, r5, r6} // r8, r9, r10
push {r4, r5, r6, r7} // r8, r9, r10, r11
ldmia r0!, {r1} // r1 = length of cheat code ldmia r0!, {r1} // r1 = length of cheat code
adds r1, r0 adds r1, r0
@@ -54,7 +59,6 @@ cheatengine_runCheat:
movs r6, #0 // r6 = data register movs r6, #0 // r6 = data register
movs r7, #1 // r7 = condition stack movs r7, #1 // r7 = condition stack
mov r10, r7 // r10 = loop condition stack backup mov r10, r7 // r10 = loop condition stack backup
mov r11, r6 // r11 = c5count
runCheat_opcode_loop: runCheat_opcode_loop:
cmp r0, r8 cmp r0, r8
bhs runCheat_end bhs runCheat_end
@@ -64,8 +68,6 @@ runCheat_opcode_loop:
// == condition check == // == condition check ==
lsrs r3, r1, #24 // r3 = op lsrs r3, r1, #24 // r3 = op
cmp r3, #0xC5 // C5 has a special condition check
beq 1f
subs r3, #0xD0 subs r3, #0xD0
cmp r3, #2 cmp r3, #2
bls 1f // D0 - D2 are not condition checked bls 1f // D0 - D2 are not condition checked
@@ -224,29 +226,16 @@ opcode_C4: // offset = pointer to C4000000 opcode
subs r5, #8 subs r5, #8
b runCheat_opcode_loop b runCheat_opcode_loop
opcode_C5: // count++ / IF (count & b.l) == b.h opcode_C5: // IF (count & b.l) == b.h
// c5count++ ldr r3, c5counter
mov r3, r11
adds r3, #1
mov r11, r3
// condition check for C5
lsrs r1, r7, #1
bcc 1f
lsls r7, r7, #1 lsls r7, r7, #1
lsrs r1, r2, #16 // chk lsrs r1, r2, #16 // chk
lsls r2, r2, #16 lsls r2, r2, #16
lsrs r2, r2, #16 // mask lsrs r2, r2, #16 // mask
ands r3, r2 ands r3, r2
cmp r3, r1 cmp r3, r1
bne 1f bne 1f
adds r7, #1 adds r7, #1
1: 1:
b runCheat_opcode_loop b runCheat_opcode_loop
@@ -256,6 +245,8 @@ opcode_C6: // u32[b] = offset
opcode_DX: opcode_DX:
lsrs r3, r1, #24 lsrs r3, r1, #24
cmp r3, #0xD
bhs opcode_DX_invalid
lsls r3, r3, #1 lsls r3, r3, #1
add r3, pc add r3, pc
ldrh r3, [r3, #2] ldrh r3, [r3, #2]
@@ -275,12 +266,10 @@ DX_table:
.short (opcode_DA - DX_table - 2) .short (opcode_DA - DX_table - 2)
.short (opcode_DB - DX_table - 2) .short (opcode_DB - DX_table - 2)
.short (opcode_DC - DX_table - 2) .short (opcode_DC - DX_table - 2)
.short (opcode_DD - DX_table - 2)
.short (opcode_DE - DX_table - 2)
.short (opcode_DF - DX_table - 2)
opcode_D0: // ENDIF opcode_D0: // ENDIF
lsrs r7, r7, #1 lsrs r7, r7, #1
opcode_DX_invalid:
b runCheat_opcode_loop b runCheat_opcode_loop
opcode_D1: // NEXT opcode_D1: // NEXT
@@ -314,6 +303,48 @@ opcode_D3: // offset = b
b runCheat_opcode_loop b runCheat_opcode_loop
opcode_D4: // data op opcode_D4: // data op
lsls r1, r1, #24
lsrs r1, r1, #22
cmp r1, #(9 << 2) // if data op >= 9, ignore
bhs opcode_D4_invalid
add pc, r1
nop
opcode_D4_0: // datareg += b
adds r6, r2
opcode_D4_invalid:
b runCheat_opcode_loop
opcode_D4_1: // datareg |= b
orrs r6, r2
b runCheat_opcode_loop
opcode_D4_2: // datareg &= b
ands r6, r2
b runCheat_opcode_loop
opcode_D4_3: // datareg ^= b
eors r6, r2
b runCheat_opcode_loop
opcode_D4_4: // datareg >>= b
lsls r6, r6, r2
b runCheat_opcode_loop
opcode_D4_5: // datareg <<= b
lsrs r6, r6, r2
b runCheat_opcode_loop
opcode_D4_6: // datareg = ROR(datareg, b)
rors r6, r2
b runCheat_opcode_loop
opcode_D4_7: // (s32)datareg >>= b
asrs r6, r6, r2
b runCheat_opcode_loop
opcode_D4_8: // datareg *= b
muls r6, r2
b runCheat_opcode_loop b runCheat_opcode_loop
opcode_D5: // datareg = b opcode_D5: // datareg = b
@@ -349,11 +380,6 @@ opcode_DB: // datareg = u8[b+offset]
opcode_DC: // offset += b opcode_DC: // offset += b
adds r5, r2 adds r5, r2
// fall through to b runCheat_opcode_loop
opcode_DD:
opcode_DE:
opcode_DF:
b runCheat_opcode_loop b runCheat_opcode_loop
opcode_EX: // copy b param bytes to address a+offset opcode_EX: // copy b param bytes to address a+offset
@@ -396,6 +422,9 @@ FX_end:
.balign 4 .balign 4
c5counter:
.word 0
.global cheatengine_cheatsPtr .global cheatengine_cheatsPtr
cheatengine_cheatsPtr: cheatengine_cheatsPtr:
.word 0 .word 0