dbra tracking and branch improvements
[cyclone68000.git] / tools / idle.s
CommitLineData
a6905b4d 1@ vim:filetype=armasm
2
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)
7
8.data
9.align 2
10
11have_patches:
12 .word 0
13
14.equ patch_desc_table_size, 10
15
16patch_desc_table:
c6237d9e 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
a6905b4d 27
28
29.text
30.align 2
31
32
33.global CycloneInitIdle
34
35CycloneInitIdle:
36 ldr r3, =CycloneJumpTab
37 ldr r2, =patch_desc_table
38 mov r12,#patch_desc_table_size
39
40cii_loop:
41 ldrh r0, [r2]
42 ldr r1, [r2, #4] @ detector
43 str r1, [r3, r0, lsl #2]
44 ldrh r0, [r2, #2]
45 ldr r1, [r2, #8] @ idle
46 add r0, r3, r0, lsl #2
47 str r1, [r0]
48 ldr r1, [r2, #12] @ normal
49 str r1, [r0, #0x800]
50 add r2, r2, #16
51 subs r12,r12,#1
52 bgt cii_loop
53
54 ldr r0, =have_patches
55 mov r1, #1
56 str r1, [r0]
57 bx lr
58
59
60.global CycloneFinishIdle
61
62CycloneFinishIdle:
63 ldr r0, =have_patches
64 ldr r0, [r0]
65 tst r0, r0
66 bxeq lr
67
68 ldr r3, =CycloneJumpTab
69 ldr r2, =patch_desc_table
70 mov r12,#patch_desc_table_size
71
72cfi_loop:
73 ldrh r0, [r2]
74 ldr r1, [r2, #12] @ normal
75 str r1, [r3, r0, lsl #2]
76 ldrh r0, [r2, #2]
77 ldr r1, =Op____
78 add r0, r3, r0, lsl #2
79 str r1, [r0]
80 str r1, [r0, #0x800]
81 add r2, r2, #16
82 subs r12,r12,#1
83 bgt cfi_loop
84
85 ldr r0, =have_patches
86 mov r1, #0
87 str r1, [r0]
88 bx lr
89
90
91
92.macro inc_counter cond
93@ ldr\cond r0, [r7, #0x60]
94@ mov r11,lr
95@ sub r0, r4, r0
96@ sub r0, r0, #2
97@ bl\cond SekRegisterIdleHit
98@ mov lr, r11
99.endm
100
101idle_bra:
102 mov r5, #2
103 inc_counter
c6237d9e 104 b Op6002
a6905b4d 105
106idle_bne:
107 msr cpsr_flg, r10
108 movne r5, #2 @ 2 is intentional due to strange timing issues
109 inc_counter ne
c6237d9e 110 b Op6602
a6905b4d 111
112idle_beq:
113 msr cpsr_flg, r10 ;@ ARM flags = 68000 flags
114 moveq r5, #2
115 inc_counter eq
c6237d9e 116 b Op6702
a6905b4d 117
118
119@ @@@ @
120
121idle_detector_bcc8:
7ddcd35c 122 bl SekIsIdleReady
123 tst r0, r0
124 beq exit_detector @ not yet
a6905b4d 125
126 mov r0, r8, asl #24 @ Shift 8-bit signed offset up...
127 add r0, r4, r0, asr #24 @ jump dest
128 bic r0, r0, #1
129
130 mov r1, #0
131 sub r1, r1, r8, lsl #24
132 mov r1, r1, lsr #24
133 sub r1, r1, #2
134 bic r1, r1, #1
135
136 bl SekIsIdleCode
137 tst r0, r0
138 and r2, r8, #0x00ff
139 orr r2, r2, #0x7100
140 orreq r2, r2, #0x0200
141 mov r0, r8, lsr #8
142 cmp r0, #0x66
143 orrgt r2, r2, #0x0400 @ 67xx (beq)
144 orrlt r2, r2, #0x0c00 @ 60xx (bra)
145
146 @ r2 = patch_opcode
147 sub r0, r4, #2
148 ldrh r1, [r0]
149 mov r11,r2
150 mov r3, r7
151 bl SekRegisterIdlePatch
152 cmp r0, #1 @ 0 - ok to patch, 1 - no patch, 2 - remove detector
153 strlth r11,[r4, #-2]
154 ble exit_detector
155
156 @ remove detector from Cyclone
157 mov r0, r8, lsr #8
158 cmp r0, #0x66
c6237d9e 159 ldrlt r1, =Op6002
160 ldreq r1, =Op6602
161 ldrgt r1, =Op6702
a6905b4d 162
163 ldr r3, =CycloneJumpTab
164 str r1, [r3, r8, lsl #2]
165 bx r1
166
167exit_detector:
168 mov r0, r8, lsr #8
169 cmp r0, #0x66
c6237d9e 170 blt Op6002
171 beq Op6602
172 b Op6702
a6905b4d 173