| Fair automatic control of a newly owned, unassigned CPU skater.
| Hook1538A runs after native accepted pickup and all already-controlled checks,
| outside the temporary4-Way Play input banks. Native keeper handoff stays earlier.
| No persistent RAM/SRAM: up to4eligible physical pad offsets live on the stack.
| One native RNG draw only for2+eligible pads; C0F8 retains native detach/AI logic.
    .equ OBJ,0xFFFFB04A
    .equ CTRL,0xFFFFC320
    .text
    .globl _start
_start:
    move.w %sr,-(%sp)
    movem.l %d0-%d7/%a0-%a6,-(%sp)
    ori.w #0x700,%sr
    cmpi.w #11,%d0
    bhi.w original
    cmp.w 0x52(%a2),%d0
    bne.w original
    cmp.w 0xFFFFB7AA,%d0
    bne.w original
    tst.w 0x34(%a2)
    ble.w original                 | actual skaters only, never a keeper/inactive slot
    btst #3,0x62(%a2)
    bne.w original                 | an existing human receiver keeps explicit ownership
    btst #0,0xFFFFC2FA
    bne.w original                 | shootout
    btst #2,0xFFFFC2F2
    bne.w original                 | awarded penalty shot
    tst.w 0xFFFFD412
    bne.w original
    move.b 0xFFFFC2EA,%d1
    andi.b #0x11,%d1
    bne.w original                 | dead/stopped play
    moveq #1,%d4
    cmpi.w #6,%d0
    bcs.s side_ready
    moveq #2,%d4
side_ready:
    moveq #4,%d3                   | byte limit: ordinary pad0/2, adapter0/2/4/6
    tst.w 0xFFFFD046
    beq.s pads_ready
    moveq #8,%d3
pads_ready:
    lea CTRL,%a0
    moveq #0,%d5
    moveq #0,%d6                   | number of active friendly humans
    moveq #0,%d7                   | eligible list bytes
    subq.l #8,%sp
    movea.l %sp,%a4
pad_loop:
    cmp.w 8(%a0,%d5.w),%d4
    bne.w next_pad
    addq.w #1,%d6
    lea 0xFFFFF0E0,%a3
    tst.w 0xFFFFD046
    beq.s y_ready
    lea 0xFFFFF0B2,%a3
y_ready:
    tst.b (%a3,%d5.w)
    bne.s next_pad                 | pending explicit Y request takes priority
    move.w (%a0,%d5.w),%d2
    bmi.w eligible                 | active pad currently without a skater is allowed
    cmpi.w #11,%d2
    bhi.w next_pad
    cmpi.w #6,%d2
    bcs.s old_home
    cmpi.w #2,%d4
    bne.w next_pad
    bra.s old_side_ready
old_home:
    cmpi.w #1,%d4
    bne.w next_pad
old_side_ready:
    lea OBJ,%a3
    move.w %d2,%d1
    lsl.w #7,%d1
    adda.w %d1,%a3
    tst.w 0x34(%a3)
    ble.w next_pad                 | preserve explicit manual keeper control/inactive actors
    btst #3,0x63(%a3)
    bne.w next_pad                 | C0F8 would refuse to release a pass/recovery lock
    moveq #0,%d1
duplicate_loop:
    cmp.w %d5,%d1
    beq.s duplicate_next
    tst.w 8(%a0,%d1.w)
    beq.s duplicate_next
    cmp.w (%a0,%d1.w),%d2
    beq.w next_pad                 | never detach another active pad's actor
 duplicate_next:
    addq.w #2,%d1
    cmp.w %d3,%d1
    bcs.s duplicate_loop
eligible:
    move.w %d5,(%a4,%d7.w)
    addq.w #2,%d7
next_pad:
    addq.w #2,%d5
    cmp.w %d3,%d5
    bcs.w pad_loop
    cmpi.w #2,%d6
    bcs.s no_change                | preserve native single-human/head-to-head behavior
    tst.w %d7
    beq.s no_change
    moveq #0,%d0
    cmpi.w #2,%d7
    beq.s selected                 | exactly one eligible pad, no RNG consumed
    move.w %d7,%d0
    lsr.w #1,%d0
    jsr 0x11086                    | real native0..eligible_count-1 RNG, advances only once
    add.w %d0,%d0
selected:
    move.w (%a4,%d0.w),%d5
    move.w (%a0,%d5.w),%d1
    move.w 0x52(%a2),%d0
    jsr 0xC0F8                     | native old actor release/new human assignment
    lea CTRL,%a0
    move.w %d0,(%a0,%d5.w)
    addq.l #8,%sp
    movem.l (%sp)+,%d0-%d7/%a0-%a6
    move.w (%sp)+,%sr
    rts
no_change:
    addq.l #8,%sp
original:
    movem.l (%sp)+,%d0-%d7/%a0-%a6
    move.w (%sp)+,%sr
    cmpi.w #6,%d0                 | displaced exact original CMP/SLT contract
    slt %d1
    jmp 0x15390
