X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tools%2Fidle.s;h=7ac85208715bee1728285dc8f14cbbdbaf885614;hb=refs%2Fheads%2Fmaster;hp=279079b53c1b01e4ef9d8fc9ad630b8a24e031f1;hpb=7ddcd35c8b2a8248257bd89ef989095639c29c08;p=cyclone68000.git diff --git a/tools/idle.s b/tools/idle.s index 279079b..7ac8520 100644 --- a/tools/idle.s +++ b/tools/idle.s @@ -8,33 +8,41 @@ .data .align 2 +idle_data: have_patches: .word 0 + .word Op____ + .word Op6002 + .word Op6602 + .word Op6702 .equ patch_desc_table_size, 10 +@ to from patch_desc_table: - .word (0x71fa<<16) | 0x66fa, idle_detector_bcc8, idle_bne, Op6601 @ bne.s - .word (0x71f8<<16) | 0x66f8, idle_detector_bcc8, idle_bne, Op6601 @ bne.s - .word (0x71f6<<16) | 0x66f6, idle_detector_bcc8, idle_bne, Op6601 @ bne.s - .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 @ 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 + .word (0x71fa<<16) | 0x66fa, idle_detector_bcc8, idle_bne, Op6602 @ bne.s + .word (0x71f8<<16) | 0x66f8, idle_detector_bcc8, idle_bne, Op6602 @ bne.s + .word (0x71f6<<16) | 0x66f6, idle_detector_bcc8, idle_bne, Op6602 @ bne.s + .word (0x71f2<<16) | 0x66f2, idle_detector_bcc8, idle_bne, Op6602 @ bne.s + .word (0x75fa<<16) | 0x67fa, idle_detector_bcc8, idle_beq, Op6702 @ beq.s + .word (0x75f8<<16) | 0x67f8, idle_detector_bcc8, idle_beq, Op6702 @ beq.s + .word (0x75f6<<16) | 0x67f6, idle_detector_bcc8, idle_beq, Op6702 @ beq.s + .word (0x75f2<<16) | 0x67f2, idle_detector_bcc8, idle_beq, Op6702 @ beq.s + .word (0x7dfe<<16) | 0x60fe, idle_detector_bcc8, idle_bra, Op6002 @ bra.s + .word (0x7dfc<<16) | 0x60fc, idle_detector_bcc8, idle_bra, Op6002 @ bra.s .text .align 2 -.global CycloneInitIdle +.global CycloneInitIdleJT @ jt -CycloneInitIdle: - ldr r3, =CycloneJumpTab - ldr r2, =patch_desc_table +CycloneInitIdleJT: + adr r12,offset_table + ldr r2, [r12, #1*4] @ =patch_desc_table-ot + mov r3, r0 @ =CycloneJumpTab + add r2, r2, r12 mov r12,#patch_desc_table_size cii_loop: @@ -51,22 +59,28 @@ cii_loop: subs r12,r12,#1 bgt cii_loop - ldr r0, =have_patches + adr r12,offset_table + ldr r0, [r12, #0*4] @ =idle_data-ot mov r1, #1 - str r1, [r0] + str r1, [r0, r12] @ have_patches bx lr -.global CycloneFinishIdle +.global CycloneFinishIdleJT @ jt -CycloneFinishIdle: - ldr r0, =have_patches - ldr r0, [r0] - tst r0, r0 +CycloneFinishIdleJT: + adr r12,offset_table + ldr r3, [r12, #0*4] @ =idle_data-ot + ldr r1, [r3, r12]! @ have_patches + tst r1, r1 bxeq lr - ldr r3, =CycloneJumpTab - ldr r2, =patch_desc_table + stmfd sp!, {r4,r5} + mov r5, r3 + ldr r2, [r12, #1*4] @ =patch_desc_table-ot + mov r3, r0 @ =CycloneJumpTab + ldr r4, [r5, #1*4] @ =Op____ + add r2, r2, r12 @ =patch_desc_table mov r12,#patch_desc_table_size cfi_loop: @@ -74,17 +88,16 @@ cfi_loop: ldr r1, [r2, #12] @ normal str r1, [r3, r0, lsl #2] ldrh r0, [r2, #2] - ldr r1, =Op____ add r0, r3, r0, lsl #2 - str r1, [r0] - str r1, [r0, #0x800] + str r4, [r0] @ Op____ + str r4, [r0, #0x800] add r2, r2, #16 subs r12,r12,#1 bgt cfi_loop - ldr r0, =have_patches mov r1, #0 - str r1, [r0] + str r1, [r5] @ have_patches + ldmfd sp!, {r4,r5} bx lr @@ -101,19 +114,19 @@ cfi_loop: idle_bra: mov r5, #2 inc_counter - b Op6001 + b Op6002 idle_bne: - msr cpsr_flg, r10 - movne r5, #2 @ 2 is intentional due to strange timing issues - inc_counter ne - b Op6601 + tst r10, #0x40000000 @ Z set? + moveq r5, #2 @ 2 is intentional due to strange timing issues + inc_counter eq + b Op6602 idle_beq: - msr cpsr_flg, r10 ;@ ARM flags = 68000 flags - moveq r5, #2 - inc_counter eq - b Op6701 + tst r10, #0x40000000 @ Z set? + movne r5, #2 + inc_counter ne + b Op6702 @ @@@ @ @@ -154,20 +167,25 @@ idle_detector_bcc8: ble exit_detector @ remove detector from Cyclone + adr r12,offset_table + ldr r1, [r12] @ =idle_data-ot mov r0, r8, lsr #8 cmp r0, #0x66 - ldrlt r1, =Op6001 - ldreq r1, =Op6601 - ldrgt r1, =Op6701 + add r1, r1, r12 @ =idle_data + ldrlt r1, [r1, #4*2] @ =Op6002-ot + ldreq r1, [r1, #4*3] @ =Op6602-ot + ldrgt r1, [r1, #4*4] @ =Op6702-ot - ldr r3, =CycloneJumpTab - str r1, [r3, r8, lsl #2] + str r1, [r6, r8, lsl #2] bx r1 exit_detector: mov r0, r8, lsr #8 cmp r0, #0x66 - blt Op6001 - beq Op6601 - b Op6701 + blt Op6002 + beq Op6602 + b Op6702 +offset_table: + .word idle_data - offset_table + .word patch_desc_table - offset_table