fix compatibility with ancient gas
[cyclone68000.git] / tools / idle.s
index a8b7cca..7ac8520 100644 (file)
@@ -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,30 +114,27 @@ 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
 
 
 @ @@@ @
 
 idle_detector_bcc8:
-    ldr     r0, =(Pico+0x22208)   @ Pico.m
-    ldr     r1, =idledet_start_frame
-    ldr     r0, [r0, #0x1c]       @ ..frame_count
-    ldr     r1, [r1]
-    cmp     r0, r1
-    blt     exit_detector         @ not yet
+    bl      SekIsIdleReady
+    tst     r0, r0
+    beq     exit_detector         @ not yet
 
     mov     r0, r8, asl #24       @ Shift 8-bit signed offset up...
     add     r0, r4, r0, asr #24   @ jump dest
@@ -157,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