X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2FCyclone%2Ftools%2Fidle.s;h=a8b7ccaf94832ccd02d8bdf949e86be4d0dd74c3;hb=e743be2070a13d14cae39a55b815b62b0edb6776;hp=81630b85e8e3d894de6463b7eac84db28d038c39;hpb=053fd9b42f2cf38194f78e37c373363fc9cb9933;p=picodrive.git diff --git a/cpu/Cyclone/tools/idle.s b/cpu/Cyclone/tools/idle.s index 81630b8..a8b7cca 100644 --- a/cpu/Cyclone/tools/idle.s +++ b/cpu/Cyclone/tools/idle.s @@ -20,10 +20,10 @@ patch_desc_table: .word (0x71f2<<16) | 0x66f2, idle_detector_bcc8, idle_bne, Op6601 @ bne.s .word (0x75fa<<16) | 0x67fa, idle_detector_bcc8, idle_beq, Op6701 @ beq.s .word (0x75f8<<16) | 0x67f8, idle_detector_bcc8, idle_beq, Op6701 @ beq.s - .word (0x75f6<<16) | 0x67f6, idle_detector_bcc8, idle_beq, Op6701 @ bne.s - .word (0x75f2<<16) | 0x67f2, idle_detector_bcc8, idle_beq, Op6701 @ bne.s - .word (0x7dfe<<16) | 0x60fe, idle_detector_dead, idle_bra, Op6001 @ bra.s - .word (0x7dfc<<16) | 0x60fc, idle_detector_dead, idle_bra, Op6001 @ bra.s + .word (0x75f6<<16) | 0x67f6, idle_detector_bcc8, idle_beq, Op6701 @ beq.s + .word (0x75f2<<16) | 0x67f2, idle_detector_bcc8, idle_beq, Op6701 @ beq.s + .word (0x7dfe<<16) | 0x60fe, idle_detector_bcc8, idle_bra, Op6001 @ bra.s + .word (0x7dfc<<16) | 0x60fc, idle_detector_bcc8, idle_bra, Op6001 @ bra.s .text @@ -90,26 +90,28 @@ cfi_loop: .macro inc_counter cond - ldr r0, =idle_hit_counter - ldr r1, [r0] - add r1, r1, #1 - str\cond r1, [r0] +@ ldr\cond r0, [r7, #0x60] +@ mov r11,lr +@ sub r0, r4, r0 +@ sub r0, r0, #2 +@ bl\cond SekRegisterIdleHit +@ mov lr, r11 .endm idle_bra: - mov r5, #4 + mov r5, #2 inc_counter b Op6001 idle_bne: - msr cpsr_flg, r10 ;@ ARM flags = 68000 flags - movne r5, #4 + msr cpsr_flg, r10 + movne r5, #2 @ 2 is intentional due to strange timing issues inc_counter ne b Op6601 idle_beq: msr cpsr_flg, r10 ;@ ARM flags = 68000 flags - moveq r5, #4 + moveq r5, #2 inc_counter eq b Op6701 @@ -132,49 +134,43 @@ idle_detector_bcc8: sub r1, r1, r8, lsl #24 mov r1, r1, lsr #24 sub r1, r1, #2 + bic r1, r1, #1 bl SekIsIdleCode tst r0, r0 and r2, r8, #0x00ff orr r2, r2, #0x7100 orreq r2, r2, #0x0200 - tst r8, #0x0100 @ 67xx (beq)? - orrne r2, r2, #0x0400 + mov r0, r8, lsr #8 + cmp r0, #0x66 + orrgt r2, r2, #0x0400 @ 67xx (beq) + orrlt r2, r2, #0x0c00 @ 60xx (bra) @ r2 = patch_opcode sub r0, r4, #2 ldrh r1, [r0] mov r11,r2 + mov r3, r7 bl SekRegisterIdlePatch cmp r0, #1 @ 0 - ok to patch, 1 - no patch, 2 - remove detector strlth r11,[r4, #-2] ble exit_detector @ remove detector from Cyclone - tst r8, #0x0100 @ 67xx (beq)? + mov r0, r8, lsr #8 + cmp r0, #0x66 + ldrlt r1, =Op6001 ldreq r1, =Op6601 - ldrne r1, =Op6701 + ldrgt r1, =Op6701 ldr r3, =CycloneJumpTab str r1, [r3, r8, lsl #2] bx r1 exit_detector: - tst r8, #0x0100 @ 67xx (beq)? + mov r0, r8, lsr #8 + cmp r0, #0x66 + blt Op6001 beq Op6601 b Op6701 - -idle_detector_dead: - @ patch without further questions - and r2, r8, #0x00ff - orr r2, r2, #0x7d00 - sub r0, r4, #2 - ldrh r1, [r0] - mov r11,r2 - bl SekRegisterIdlePatch - strh r11,[r4, #-2] - b Op6001 - -.pool -