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, Op6601 @ bne.s
18 .word (0x71f8<<16) | 0x66f8, idle_detector_bcc8, idle_bne, Op6601 @ bne.s
19 .word (0x71f6<<16) | 0x66f6, idle_detector_bcc8, idle_bne, Op6601 @ bne.s
20 .word (0x71f2<<16) | 0x66f2, idle_detector_bcc8, idle_bne, Op6601 @ bne.s
21 .word (0x75fa<<16) | 0x67fa, idle_detector_bcc8, idle_beq, Op6701 @ beq.s
22 .word (0x75f8<<16) | 0x67f8, idle_detector_bcc8, idle_beq, Op6701 @ beq.s
23 .word (0x75f6<<16) | 0x67f6, idle_detector_bcc8, idle_beq, Op6701 @ beq.s
24 .word (0x75f2<<16) | 0x67f2, idle_detector_bcc8, idle_beq, Op6701 @ beq.s
25 .word (0x7dfe<<16) | 0x60fe, idle_detector_bcc8, idle_bra, Op6001 @ bra.s
26 .word (0x7dfc<<16) | 0x60fc, idle_detector_bcc8, idle_bra, Op6001 @ bra.s
33 .global CycloneInitIdle
36 ldr r3, =CycloneJumpTab
37 ldr r2, =patch_desc_table
38 mov r12,#patch_desc_table_size
42 ldr r1, [r2, #4] @ detector
43 str r1, [r3, r0, lsl #2]
45 ldr r1, [r2, #8] @ idle
46 add r0, r3, r0, lsl #2
48 ldr r1, [r2, #12] @ normal
60 .global CycloneFinishIdle
68 ldr r3, =CycloneJumpTab
69 ldr r2, =patch_desc_table
70 mov r12,#patch_desc_table_size
74 ldr r1, [r2, #12] @ normal
75 str r1, [r3, r0, lsl #2]
78 add r0, r3, r0, lsl #2
92 .macro inc_counter cond
93 @ ldr\cond r0, [r7, #0x60]
97 @ bl\cond SekRegisterIdleHit
108 movne r5, #2 @ 2 is intentional due to strange timing issues
113 msr cpsr_flg, r10 ;@ ARM flags = 68000 flags
122 ldr r0, =(Pico+0x22208) @ Pico.m
123 ldr r1, =idledet_start_frame
124 ldr r0, [r0, #0x1c] @ ..frame_count
127 blt exit_detector @ not yet
129 mov r0, r8, asl #24 @ Shift 8-bit signed offset up...
130 add r0, r4, r0, asr #24 @ jump dest
134 sub r1, r1, r8, lsl #24
143 orreq r2, r2, #0x0200
146 orrgt r2, r2, #0x0400 @ 67xx (beq)
147 orrlt r2, r2, #0x0c00 @ 60xx (bra)
154 bl SekRegisterIdlePatch
155 cmp r0, #1 @ 0 - ok to patch, 1 - no patch, 2 - remove detector
159 @ remove detector from Cyclone
166 ldr r3, =CycloneJumpTab
167 str r1, [r3, r8, lsl #2]