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)
14 .equ patch_desc_table_size, 10
17 .word (0x71fa<<16) | 0x66fa, idle_detector_bcc8, idle_bne, Op6602 @ bne.s
18 .word (0x71f8<<16) | 0x66f8, idle_detector_bcc8, idle_bne, Op6602 @ bne.s
19 .word (0x71f6<<16) | 0x66f6, idle_detector_bcc8, idle_bne, Op6602 @ bne.s
20 .word (0x71f2<<16) | 0x66f2, idle_detector_bcc8, idle_bne, Op6602 @ bne.s
21 .word (0x75fa<<16) | 0x67fa, idle_detector_bcc8, idle_beq, Op6702 @ beq.s
22 .word (0x75f8<<16) | 0x67f8, idle_detector_bcc8, idle_beq, Op6702 @ beq.s
23 .word (0x75f6<<16) | 0x67f6, idle_detector_bcc8, idle_beq, Op6702 @ beq.s
24 .word (0x75f2<<16) | 0x67f2, idle_detector_bcc8, idle_beq, Op6702 @ beq.s
25 .word (0x7dfe<<16) | 0x60fe, idle_detector_bcc8, idle_bra, Op6002 @ bra.s
26 .word (0x7dfc<<16) | 0x60fc, idle_detector_bcc8, idle_bra, Op6002 @ bra.s
33 .global CycloneInitIdle
37 ldr r3, [r12, #2*4] @ =CycloneJumpTab-ot
38 ldr r2, [r12, #1*4] @ =patch_desc_table-ot
41 mov r12,#patch_desc_table_size
45 ldr r1, [r2, #4] @ detector
46 str r1, [r3, r0, lsl #2]
48 ldr r1, [r2, #8] @ idle
49 add r0, r3, r0, lsl #2
51 ldr r1, [r2, #12] @ normal
58 ldr r0, [r12, #0*4] @ =have_patches-ot
64 .global CycloneFinishIdle
68 ldr r3, [r12, #0*4] @ =have_patches-ot
75 ldr r2, [r12, #1*4] @ =patch_desc_table-ot
76 ldr r3, [r12, #2*4] @ =CycloneJumpTab-ot
77 ldr r4, [r12, #3*4] @ =Op____-ot
81 mov r12,#patch_desc_table_size
85 ldr r1, [r2, #12] @ normal
86 str r1, [r3, r0, lsl #2]
88 add r0, r3, r0, lsl #2
96 str r1, [r5] @ have_patches
102 .macro inc_counter cond
103 @ ldr\cond r0, [r7, #0x60]
107 @ bl\cond SekRegisterIdleHit
117 tst r10, #0x40000000 @ Z set?
118 moveq r5, #2 @ 2 is intentional due to strange timing issues
123 tst r10, #0x40000000 @ Z set?
134 beq exit_detector @ not yet
136 mov r0, r8, asl #24 @ Shift 8-bit signed offset up...
137 add r0, r4, r0, asr #24 @ jump dest
141 sub r1, r1, r8, lsl #24
150 orreq r2, r2, #0x0200
153 orrgt r2, r2, #0x0400 @ 67xx (beq)
154 orrlt r2, r2, #0x0c00 @ 60xx (bra)
161 bl SekRegisterIdlePatch
162 cmp r0, #1 @ 0 - ok to patch, 1 - no patch, 2 - remove detector
166 @ remove detector from Cyclone
170 ldrlt r1, [r12, #4*4] @ =Op6002-ot
171 ldreq r1, [r12, #4*5] @ =Op6602-ot
172 ldrgt r1, [r12, #4*6] @ =Op6702-ot
175 str r1, [r6, r8, lsl #2]
186 .word have_patches - offset_table
187 .word patch_desc_table - offset_table
188 .word CycloneJumpTab - offset_table
189 .word Op____ - offset_table
190 .word Op6002 - offset_table
191 .word Op6602 - offset_table @ 5
192 .word Op6702 - offset_table