experimental/fair_pickup.s

Download file

Release 2026-11-04-r2 · SHA256 e859950bf418d45c15d221b3429e965570614ebcf0c9db3bb19c3487733ed6ed · Click a line number for a direct link.

1| Fair automatic control of a newly owned, unassigned CPU skater.2| Hook1538A runs after native accepted pickup and all already-controlled checks,3| outside the temporary4-Way Play input banks. Native keeper handoff stays earlier.4| No persistent RAM/SRAM: up to4eligible physical pad offsets live on the stack.5| One native RNG draw only for2+eligible pads; C0F8 retains native detach/AI logic.6    .equ OBJ,0xFFFFB04A7    .equ CTRL,0xFFFFC3208    .text9    .globl _start10_start:11    move.w %sr,-(%sp)12    movem.l %d0-%d7/%a0-%a6,-(%sp)13    ori.w #0x700,%sr14    cmpi.w #11,%d015    bhi.w original16    cmp.w 0x52(%a2),%d017    bne.w original18    cmp.w 0xFFFFB7AA,%d019    bne.w original20    tst.w 0x34(%a2)21    ble.w original                 | actual skaters only, never a keeper/inactive slot22    btst #3,0x62(%a2)23    bne.w original                 | an existing human receiver keeps explicit ownership24    btst #0,0xFFFFC2FA25    bne.w original                 | shootout26    btst #2,0xFFFFC2F227    bne.w original                 | awarded penalty shot28    tst.w 0xFFFFD41229    bne.w original30    move.b 0xFFFFC2EA,%d131    andi.b #0x11,%d132    bne.w original                 | dead/stopped play33    moveq #1,%d434    cmpi.w #6,%d035    bcs.s side_ready36    moveq #2,%d437side_ready:38    moveq #4,%d3                   | byte limit: ordinary pad0/2, adapter0/2/4/639    tst.w 0xFFFFD04640    beq.s pads_ready41    moveq #8,%d342pads_ready:43    lea CTRL,%a044    moveq #0,%d545    moveq #0,%d6                   | number of active friendly humans46    moveq #0,%d7                   | eligible list bytes47    subq.l #8,%sp48    movea.l %sp,%a449pad_loop:50    cmp.w 8(%a0,%d5.w),%d451    bne.w next_pad52    addq.w #1,%d653    lea 0xFFFFF0E0,%a354    tst.w 0xFFFFD04655    beq.s y_ready56    lea 0xFFFFF0B2,%a357y_ready:58    tst.b (%a3,%d5.w)59    bne.s next_pad                 | pending explicit Y request takes priority60    move.w (%a0,%d5.w),%d261    bmi.w eligible                 | active pad currently without a skater is allowed62    cmpi.w #11,%d263    bhi.w next_pad64    cmpi.w #6,%d265    bcs.s old_home66    cmpi.w #2,%d467    bne.w next_pad68    bra.s old_side_ready69old_home:70    cmpi.w #1,%d471    bne.w next_pad72old_side_ready:73    lea OBJ,%a374    move.w %d2,%d175    lsl.w #7,%d176    adda.w %d1,%a377    tst.w 0x34(%a3)78    ble.w next_pad                 | preserve explicit manual keeper control/inactive actors79    btst #3,0x63(%a3)80    bne.w next_pad                 | C0F8 would refuse to release a pass/recovery lock81    moveq #0,%d182duplicate_loop:83    cmp.w %d5,%d184    beq.s duplicate_next85    tst.w 8(%a0,%d1.w)86    beq.s duplicate_next87    cmp.w (%a0,%d1.w),%d288    beq.w next_pad                 | never detach another active pad's actor89 duplicate_next:90    addq.w #2,%d191    cmp.w %d3,%d192    bcs.s duplicate_loop93eligible:94    move.w %d5,(%a4,%d7.w)95    addq.w #2,%d796next_pad:97    addq.w #2,%d598    cmp.w %d3,%d599    bcs.w pad_loop100    cmpi.w #2,%d6101    bcs.s no_change                | preserve native single-human/head-to-head behavior102    tst.w %d7103    beq.s no_change104    moveq #0,%d0105    cmpi.w #2,%d7106    beq.s selected                 | exactly one eligible pad, no RNG consumed107    move.w %d7,%d0108    lsr.w #1,%d0109    jsr 0x11086                    | real native0..eligible_count-1 RNG, advances only once110    add.w %d0,%d0111selected:112    move.w (%a4,%d0.w),%d5113    move.w (%a0,%d5.w),%d1114    move.w 0x52(%a2),%d0115    jsr 0xC0F8                     | native old actor release/new human assignment116    lea CTRL,%a0117    move.w %d0,(%a0,%d5.w)118    addq.l #8,%sp119    movem.l (%sp)+,%d0-%d7/%a0-%a6120    move.w (%sp)+,%sr121    rts122no_change:123    addq.l #8,%sp124original:125    movem.l (%sp)+,%d0-%d7/%a0-%a6126    move.w (%sp)+,%sr127    cmpi.w #6,%d0                 | displaced exact original CMP/SLT contract128    slt %d1129    jmp 0x15390130