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