Release 2026-11-04-r2 · SHA256 edfdec9de04e8496f7bd598c99070649b0ee4db07dc261bfdaf65154e840204b · Click a line number for a direct link.
1| Hard searches all real teammates for a free cross-ice finish against a keeper2| still in the normal mouth. No geometric "24 better" restriction or keeper-3| velocity requirement. Native pass validation, reception, shot/aim/power remain.4 .text5 .globl _start6_start:7 bra.w shot8 bra.w pass9 bra.w choose10shot:11 movem.l %d0-%d2,-(%sp)12 bsr.w choose13 tst.w %d014 bpl.s shot_pass15 bsr.w point_choice16 tst.w %d017 bmi.s shot_native18shot_pass:19 move.l %d0,(%sp)20 movem.l (%sp)+,%d0-%d221 jmp 0xE4A022shot_native:23 bsr.w point_carry24 tst.w %d025 beq.s shot_original26 movem.l (%sp)+,%d0-%d227 rts28shot_original:29 movem.l (%sp)+,%d0-%d230 jmp 0x2D880831pass:32 movem.l %d0-%d2,-(%sp)33 bsr.w choose34 tst.w %d035 bpl.s pass_selected36 bsr.w point_choice37 tst.w %d038 bmi.s pass_native39pass_selected:40 move.l %d0,(%sp)41 movem.l (%sp)+,%d0-%d242 jmp 0xE4A043pass_native:44 movem.l (%sp)+,%d0-%d245 tst.w 0xFFFFBEE446 bne.s threat47 jmp 0xE44C48threat:49 jmp 0xE45E50choose:51 link.w %a6,#-4052 movem.l %d1-%d7/%a0-%a5,-(%sp)53 move.w #-1,-22(%a6)54 move.w #0x7FFF,-20(%a6)55 jsr 0x2D880C56 tst.w %d057 beq.w done58 btst #2,0xFFFFC2FA59 bne.w done60 btst #1,0x64(%a3)61 bne.w done62 move.w 0x52(%a3),%d063 cmp.w 0xFFFFB7AA,%d064 bne.w done65 move.w 0xFFFFB74A,%d166 move.w %d1,-4(%a6)67 bpl.s carrier_abs68 neg.w %d169carrier_abs:70 cmpi.w #32,%d171 blt.w done72 cmpi.w #112,%d173 bgt.w done74 move.w 0xFFFFB75E,%d175 btst #7,0x62(%a3)76 bne.s carrier_depth77 neg.w %d178carrier_depth:79 cmpi.w #160,%d180 blt.w done81 cmpi.w #280,%d182 bgt.w done83 move.w %d1,-2(%a6)84 lea 0xFFFFB04A,%a485 lea 0xFFFFB34A,%a586 cmpi.w #6,0x52(%a3)87 bcs.s bases88 exg %a4,%a589bases:90 movea.l %a5,%a191 moveq #5,%d792keeper:93 tst.w 0x34(%a1)94 bne.s keeper_next95 btst #2,0x63(%a1)96 bne.s keeper_next97 move.w (%a1),%d198 move.w %d1,-6(%a6)99 .if !WITH_CENTERED_CROSS100 move.w -4(%a6),%d2101 eor.w %d1,%d2102 bmi.w done103 .endif104keeper_abs:105 tst.w %d1106 bpl.s keeper_positive107 neg.w %d1108keeper_positive:109 .if WITH_CENTERED_CROSS110 cmpi.w #8,%d1111 blt.s keeper_side_ready112 move.w -4(%a6),%d2113 move.w -6(%a6),%d3114 eor.w %d3,%d2115 bmi.w done116keeper_side_ready:117 .else118 cmpi.w #8,%d1119 blt.w done120 .endif121 cmpi.w #40,%d1122 bgt.w done123 move.w 0x14(%a1),%d1124 btst #7,0x62(%a3)125 bne.s keeper_depth126 neg.w %d1127keeper_depth:128 cmpi.w #232,%d1129 blt.w done130 cmpi.w #264,%d1131 bgt.w done132 move.w %d1,-8(%a6)133 bra.s receivers134keeper_next:135 adda.w #128,%a1136 dbra %d7,keeper137 bra.w done138receivers:139 movea.l %a4,%a0140 moveq #5,%d6141receiver:142 cmpa.l %a3,%a0143 beq.w next144 tst.w 0x34(%a0)145 ble.w next146 btst #2,0x63(%a0)147 bne.w next148 btst #5,0x62(%a0)149 bne.w next150 move.w (%a0),%d1151 move.w %d1,-26(%a6)152 beq.s receiver_side153 .if WITH_CENTERED_CROSS154 move.w -4(%a6),%d2 | opposite the passer, including a centered keeper155 .else156 move.w -6(%a6),%d2157 .endif158 eor.w %d2,%d1159 bpl.w next160receiver_side:161 move.w (%a0),%d1162 bpl.s receiver_abs163 neg.w %d1164receiver_abs:165 cmpi.w #64,%d1166 bgt.w next167 add.w %d1,%d1168 move.w %d1,-28(%a6)169 move.w 0x14(%a0),%d2170 btst #7,0x62(%a3)171 bne.s receiver_depth172 neg.w %d2173receiver_depth:174 cmpi.w #184,%d2175 blt.w next176 cmpi.w #244,%d2177 bgt.w next178 move.w %d2,-24(%a6)179 subi.w #224,%d2180 bpl.s receiver_cost181 neg.w %d2182receiver_cost:183 add.w %d2,-28(%a6)184 move.w (%a0),%d1185 sub.w -4(%a6),%d1186 move.w %d1,-10(%a6)187 bpl.s span188 neg.w %d1189span:190 cmpi.w #32,%d1191 blt.w next192 cmpi.w #144,%d1193 bgt.w next194 move.w -24(%a6),%d2195 sub.w -2(%a6),%d2196 move.w %d2,-12(%a6)197 bpl.s dy_abs198 neg.w %d2199dy_abs:200 cmpi.w #80,%d2201 bgt.w next202 add.w %d1,%d2203 cmpi.w #180,%d2204 bgt.w next205 move.w %d2,%d3206 lsr.w #2,%d3207 add.w %d3,-28(%a6)208 mulu.w #12,%d2209 move.w %d2,-18(%a6)210 move.w -10(%a6),%d1211 muls.w %d1,%d1212 move.w -12(%a6),%d2213 muls.w %d2,%d2214 add.l %d1,%d2215 move.l %d2,-16(%a6)216 | Receiver must have an actual free native shooting lane.217 move.l %a3,-(%sp)218 movea.l %a0,%a3219 btst #3,0x62(%a3)220 bne.s human_lane221 jsr 0x2DD014222 bra.s lane_return223human_lane:224 jsr 0x2DD018225lane_return:226 movea.l (%sp)+,%a3227 tst.w %d0228 beq.w next229 | Measure separation of the far-post shooting ray from the actual keeper.230 moveq #-16,%d1231 tst.w -6(%a6)232 bpl.s ray_post233 moveq #16,%d1234ray_post:235 sub.w -26(%a6),%d1236 move.w -8(%a6),%d2237 sub.w -24(%a6),%d2238 bmi.s beyond_keeper239 muls.w %d2,%d1240 move.w #264,%d2241 sub.w -24(%a6),%d2242 divs.w %d2,%d1243 add.w -26(%a6),%d1244 sub.w -6(%a6),%d1245 bpl.s ray_abs246 neg.w %d1247ray_abs:248 cmpi.w #24,%d1249 blt.w next250 bra.s ray_cost251beyond_keeper:252 moveq #48,%d1253ray_cost:254 add.w %d1,%d1255 sub.w %d1,-28(%a6)256 btst #3,0x62(%a0)257 beq.s defenders258 subi.w #64,-28(%a6) | free humans retain co-op priority259defenders:260 movea.l %a5,%a1261 moveq #5,%d7262defender:263 tst.w 0x34(%a1)264 bmi.s defender_next265 btst #2,0x63(%a1)266 bne.s defender_next267 move.w (%a1),%d1268 sub.w (%a0),%d1269 muls.w %d1,%d1270 move.w 0x14(%a1),%d2271 sub.w 0x14(%a0),%d2272 muls.w %d2,%d2273 add.l %d1,%d2274 cmpi.l #676,%d2275 blt.w next276 move.w (%a1),%d1277 sub.w -4(%a6),%d1278 move.w 0x14(%a1),%d2279 btst #7,0x62(%a3)280 bne.s defender_depth281 neg.w %d2282defender_depth:283 sub.w -2(%a6),%d2284 move.w %d1,%d3285 muls.w -10(%a6),%d3286 move.w %d2,%d4287 muls.w -12(%a6),%d4288 add.l %d4,%d3289 ble.s defender_next290 cmp.l -16(%a6),%d3291 bge.s defender_next292 muls.w -12(%a6),%d1293 muls.w -10(%a6),%d2294 sub.l %d2,%d1295 bpl.s corridor_abs296 neg.l %d1297corridor_abs:298 moveq #0,%d2299 move.w -18(%a6),%d2300 cmp.l %d2,%d1301 ble.w next302defender_next:303 adda.w #128,%a1304 dbra %d7,defender305 move.w -28(%a6),%d1306 cmp.w -20(%a6),%d1307 bge.s next308 move.w %d1,-20(%a6)309 move.w 0x52(%a0),-22(%a6)310next:311 adda.w #128,%a0312 dbra %d6,receiver313done:314 moveq #-1,%d0315 move.w -22(%a6),%d0316 movem.l (%sp)+,%d1-%d7/%a0-%a5317 unlk %a6318 rts319320| At the point, feed a free forward receiver; otherwise retain the original point-shot decision.321| Returns global teammate or -1 unchanged native fallback.322point_choice:323 movem.l %d1-%d4/%a0,-(%sp)324 jsr 0x2D880C325 tst.w %d0326 beq.w point_no327 btst #2,0xFFFFC2FA328 bne.w point_no329 btst #1,0x64(%a3)330 bne.w point_no331 move.w 0x52(%a3),%d0332 cmp.w 0xFFFFB7AA,%d0333 bne.w point_no334 move.w 0x14(%a3),%d3335 btst #7,0x62(%a3)336 bne.s point_depth337 neg.w %d3338point_depth:339 cmpi.w #88,%d3340 blt.w point_no341 cmpi.w #160,%d3342 bgt.w point_no343 move.w (%a3),%d4344 bpl.s point_abs345 neg.w %d4346point_abs:347 cmpi.w #128,%d4348 bgt.w point_no349 jsr 0x2D89B0350 tst.w %d0351 bmi.s point_shot352 cmpi.w #6,0x52(%a3)353 bcs.s point_global354 addq.w #6,%d0355point_global:356 move.w %d0,%d2357 lsl.w #7,%d0358 lea 0xFFFFB04A,%a0359 adda.w %d0,%a0360 move.w 0x14(%a0),%d1361 btst #7,0x62(%a3)362 bne.s point_receiver_depth363 neg.w %d1364point_receiver_depth:365 addi.w #24,%d3366 cmp.w %d3,%d1367 blt.s point_shot368 moveq #0,%d0369 move.w %d2,%d0370 bra.s point_done371point_shot:372point_no:373 moveq #-1,%d0374point_done:375 movem.l (%sp)+,%d1-%d4/%a0376 rts377378| The point carrier may skate into range while a covered forward develops.379| No free pass is discarded; this is called only after both pass scans failed.380point_carry:381 movem.l %d1-%d4/%a0-%a1,-(%sp)382 jsr 0x2D880C383 tst.w %d0384 beq.w carry_no385 btst #2,0xFFFFC2FA386 bne.w carry_no387 btst #1,0x64(%a3)388 bne.w carry_no389 move.w 0x52(%a3),%d0390 cmp.w 0xFFFFB7AA,%d0391 bne.w carry_no392 move.w 0x14(%a3),%d3393 btst #7,0x62(%a3)394 bne.s carry_depth395 neg.w %d3396carry_depth:397 cmpi.w #88,%d3398 blt.w carry_no399 cmpi.w #160,%d3400 bgt.w carry_no401 move.w (%a3),%d0402 bpl.s carry_abs403 neg.w %d0404carry_abs:405 cmpi.w #100,%d0406 bgt.w carry_no407 lea 0xFFFFB04A,%a0408 lea 0xFFFFB34A,%a1409 cmpi.w #6,0x52(%a3)410 bcs.s carry_bases411 exg %a0,%a1412carry_bases:413 moveq #5,%d4414carry_pressure:415 tst.w 0x34(%a1)416 ble.s carry_pressure_next417 btst #2,0x63(%a1)418 bne.s carry_pressure_next419 move.w (%a1),%d1420 sub.w (%a3),%d1421 muls.w %d1,%d1422 move.w 0x14(%a1),%d2423 sub.w 0x14(%a3),%d2424 muls.w %d2,%d2425 add.l %d2,%d1426 cmpi.l #3136,%d1427 blo.w carry_no428carry_pressure_next:429 adda.w #128,%a1430 dbra %d4,carry_pressure431 addi.w #24,%d3432 moveq #5,%d4433carry_friend:434 cmpa.l %a3,%a0435 beq.s carry_friend_next436 tst.w 0x34(%a0)437 ble.s carry_friend_next438 btst #2,0x63(%a0)439 bne.s carry_friend_next440 move.w (%a0),%d0441 cmpi.w #-128,%d0442 blt.s carry_friend_next443 cmpi.w #128,%d0444 bgt.s carry_friend_next445 move.w 0x14(%a0),%d0446 btst #7,0x62(%a3)447 bne.s carry_friend_depth448 neg.w %d0449carry_friend_depth:450 cmpi.w #252,%d0451 bgt.s carry_friend_next452 cmp.w %d3,%d0453 bge.s carry_yes454carry_friend_next:455 adda.w #128,%a0456 dbra %d4,carry_friend457carry_no:458 moveq #0,%d0459 bra.s carry_done460carry_yes:461 moveq #1,%d0462carry_done:463 movem.l (%sp)+,%d1-%d4/%a0-%a1464 rts465