3 @ ranges/opcodes (idle, normal):
4 @ 71xx, 73xx - bne.s (8bit offset)
5 @ 75xx, 77xx - beq.s (8bit offset)
6 @ 7dxx, 7fxx - bra.s (8bit offset)
19 .equ patch_desc_table_size, 10
23 .word (0x71fa<<16) | 0x66fa, idle_detector_bcc8, idle_bne, Op6602 @ bne.s
24 .word (0x71f8<<16) | 0x66f8, idle_detector_bcc8, idle_bne, Op6602 @ bne.s
25 .word (0x71f6<<16) | 0x66f6, idle_detector_bcc8, idle_bne, Op6602 @ bne.s
26 .word (0x71f2<<16) | 0x66f2, idle_detector_bcc8, idle_bne, Op6602 @ bne.s
27 .word (0x75fa<<16) | 0x67fa, idle_detector_bcc8, idle_beq, Op6702 @ beq.s
28 .word (0x75f8<<16) | 0x67f8, idle_detector_bcc8, idle_beq, Op6702 @ beq.s
29 .word (0x75f6<<16) | 0x67f6, idle_detector_bcc8, idle_beq, Op6702 @ beq.s
30 .word (0x75f2<<16) | 0x67f2, idle_detector_bcc8, idle_beq, Op6702 @ beq.s
31 .word (0x7dfe<<16) | 0x60fe, idle_detector_bcc8, idle_bra, Op6002 @ bra.s
32 .word (0x7dfc<<16) | 0x60fc, idle_detector_bcc8, idle_bra, Op6002 @ bra.s
39 .global CycloneInitIdleJT @ jt
43 ldr r2, [r12, #1*4] @ =patch_desc_table-ot
44 mov r3, r0 @ =CycloneJumpTab
46 mov r12,#patch_desc_table_size
50 ldr r1, [r2, #4] @ detector
51 str r1, [r3, r0, lsl #2]
53 ldr r1, [r2, #8] @ idle
54 add r0, r3, r0, lsl #2
56 ldr r1, [r2, #12] @ normal
63 ldr r0, [r12, #0*4] @ =idle_data-ot
65 str r1, [r0, r12] @ have_patches
69 .global CycloneFinishIdleJT @ jt
73 ldr r3, [r12, #0*4] @ =idle_data-ot
74 ldr r1, [r3, r12]! @ have_patches
80 ldr r2, [r12, #1*4] @ =patch_desc_table-ot
81 mov r3, r0 @ =CycloneJumpTab
82 ldr r4, [r5, #1*4] @ =Op____
83 add r2, r2, r12 @ =patch_desc_table
84 mov r12,#patch_desc_table_size
88 ldr r1, [r2, #12] @ normal
89 str r1, [r3, r0, lsl #2]
91 add r0, r3, r0, lsl #2
99 str r1, [r5] @ have_patches
105 .macro inc_counter cond
106 @ ldr\cond r0, [r7, #0x60]
110 @ bl\cond SekRegisterIdleHit
120 tst r10, #0x40000000 @ Z set?
121 moveq r5, #2 @ 2 is intentional due to strange timing issues
126 tst r10, #0x40000000 @ Z set?
137 beq exit_detector @ not yet
139 mov r0, r8, asl #24 @ Shift 8-bit signed offset up...
140 add r0, r4, r0, asr #24 @ jump dest
144 sub r1, r1, r8, lsl #24
153 orreq r2, r2, #0x0200
156 orrgt r2, r2, #0x0400 @ 67xx (beq)
157 orrlt r2, r2, #0x0c00 @ 60xx (bra)
164 bl SekRegisterIdlePatch
165 cmp r0, #1 @ 0 - ok to patch, 1 - no patch, 2 - remove detector
169 @ remove detector from Cyclone
171 ldr r1, [r12] @ =idle_data-ot
174 add r1, r1, r12 @ =idle_data
175 ldrlt r1, [r1, #4*2] @ =Op6002-ot
176 ldreq r1, [r1, #4*3] @ =Op6602-ot
177 ldrgt r1, [r1, #4*4] @ =Op6702-ot
179 str r1, [r6, r8, lsl #2]
190 .word idle_data - offset_table
191 .word patch_desc_table - offset_table