Release 2026-11-04-r2 · SHA256 e33606035b3b3d8ea202ad9b5dff84d9a496e5506e798b0853b763342044be9c · Click a line number for a direct link.
1 .ifndef WITH_STRICT_SO2 .equ WITH_STRICT_SO,03 .endif4 .ifndef WITH_ALT_GOALIES5 .equ WITH_ALT_GOALIES,06 .endif7 .ifndef LEGACY_OVERTIME8 .equ LEGACY_OVERTIME,09 .endif10| Selected-period OT in league/playoffs, then native on-rink shootout with rotating co-op pads.11| Three attempts each, early clinch, paired sudden death. Normal match stats stay intact.12 .equ S,0xFFFFF090 | 0idle,1shootout,2finish pending; scratch throughF0AF13 .equ SIDES,S+2 | originalP1/P2 sides14 .equ SCORES,S+6 | tied normal home/away goals15 .equ FLAGS,S+10 | originalC2EA side bit16 .equ ATT,S+12 | attempts home/away17 .equ WIN,S+16 |1home,2away18 .equ LINES,S+18 | native line, manpower and pulled-goalie words for both clubs19 .equ EXTRA_SIDES,0xFFFFF0CC | P3/P4 saved only during a shootout; fourgoalie ends atF0CB20 .text21 .globl _start22_start:23 bra.w timer24 bra.w expiry25 bra.w frame26 bra.w setup27 bra.w advance28 bra.w goalstats29 bra.w shots30 bra.w fresh31 bra.w stars3233timer:34 jsr 0x784E35 .if LEGACY_OVERTIME36 cmpi.w #3,0xFFFFC46637 bne.s timer_done38 move.w #600,%d039 .endif40timer_done:41 jmp 0x782E42fresh:43 clr.w S44 clr.w WIN45 st.b 0xFFFFD6B446 clr.l 0xFFFFDEA447 jmp 0x774A | replay native match initialization4849frame:50 cmpi.w #2,S51 beq.w finish52 tst.w S53 bne.w idle54 btst #0,0xFFFFC2EA55 bne.w idle56 tst.w 0xFFFFC46857 bne.w idle58 jmp 0x7B4259idle:60 jmp 0xA9D46162expiry:63 cmpi.w #3,0xFFFFC46664 bne.w period_over65 btst #4,0xFFFFC2EA66 bne.w native_expiry67 btst #0,0xFFFFC2FA68 bne.w native_expiry69 movem.l %d0-%d7/%a0-%a6,-(%sp)70 move.w #1,S71 move.l 0xFFFFC328,SIDES72 move.l 0xFFFFC32C,EXTRA_SIDES73 clr.l 0xFFFFC32C | only the existing P1/P2 shooter/keeper rotation has actors74 move.w 0xFFFFC6DA,SCORES75 move.w 0xFFFFCA3E,SCORES+276 move.w 0xFFFFC2EA,FLAGS77 clr.l ATT78 clr.w WIN79 move.b #1,0xFFFFC2FA80 .if WITH_STRICT_SO81 jsr 0x222000 | capture native eligibility before occupancy normalization82 .endif83 jsr 0xFC47C | native shot actors/rosters; team/player match statistics are elsewhere84 lea 0xFFFFC6CE,%a085 lea LINES,%a186 bsr.w shot_line87 lea 0xFFFFCA32,%a088 bsr.w shot_line89 move.b #1,0xFFFFC2EA90 clr.w 0xFFFFC2F291 clr.l 0xFFFFF058 | discard transient goalie-pass/crit visual state92 clr.l 0xFFFFF05C93 clr.l 0xFFFFF06094 clr.l 0xFFFFF06495 clr.w 0xFFFFC46696 lea 0xFFFFC3A4,%a097 moveq #31,%d098clear_events:99 clr.w (%a0)+100 dbra %d0,clear_events101 movem.l (%sp)+,%d0-%d7/%a0-%a6102 jmp 0x7866103| Native actor assignment must use a full, valid line. A late penalty/automatic104| change can leave +16=5 and +24=5: native shootout then tries roster255 for the105| next keeper. Clear active penalties/bench occupancy, retaining G/A/SOG/PIM.106shot_line:107 move.w 0x16(%a0),(%a1)+108 move.w 0x24(%a0),(%a1)+109 move.w 0x26(%a0),(%a1)+110 clr.w 0x16(%a0)111 move.w #6,0x24(%a0)112 clr.w 0x26(%a0)113 lea 0x66(%a0),%a2114 moveq #25,%d0115clear_occupancy:116 move.w #-2,(%a2)+117 dbra %d0,clear_occupancy118 rts119native_expiry:120 tst.w 0xFFFFD048121 beq.s native_tie122period_over:123 moveq #2,%d0124 jmp 0x11F62125native_tie:126 jmp 0x7C16127128setup:129 tst.w S130 beq.w native_setup131 movem.l %d0-%d7/%a0-%a6,-(%sp)132 move.w 0xFFFFD594,%d0133 addq.w #1,%d0 | shooting side1/2134 moveq #-1,%d4135 cmp.w SIDES,%d0136 bne.s not_p1137 moveq #0,%d4138not_p1:139 cmp.w SIDES+2,%d0140 bne.s selected_pad141 tst.w %d4142 bmi.s only_p2143 move.w 0xFFFFD594,%d1144 add.w %d1,%d1145 lea ATT,%a0146 btst #0,1(%a0,%d1.w) | own-side attempt index: P1,P2,P1,P2...147 beq.s selected_pad148only_p2:149 moveq #2,%d4150selected_pad:151 tst.w %d4152 bpl.s choose_shooter153 clr.l 0xFFFFC328154 move.w SIDES,0xFFFFC328 | one defending pad only; no second skater exists in a shootout155 tst.w SIDES156 bne.s sides_ready157 move.w SIDES+2,0xFFFFC32A158 bra.s sides_ready159choose_shooter:160 clr.l 0xFFFFC328161 tst.w %d4162 bmi.s sides_ready163 lea 0xFFFFC328,%a0164 move.w %d0,(%a0,%d4.w)165sides_ready:166 clr.l 0xFFFFC32C | no P3/P4 may claim a two-actor shootout participant167 movem.l (%sp)+,%d0-%d7/%a0-%a6168native_setup:169 .if WITH_STRICT_SO170 jmp 0x222004171 .else172 jmp 0xFC4C0173 .endif174175advance:176 tst.w S177 beq.w native_advance178 movem.l %d0-%d7/%a0-%a6,-(%sp)179 cmpi.w #1,S180 bne.w advance_done181 move.w 0xFFFFD594,%d0182 add.w %d0,%d0183 lea ATT,%a0184 addq.w #1,(%a0,%d0.w)185 move.w 0xFFFFD574,%d2186 move.w 0xFFFFD576,%d3187 cmpi.w #3,ATT188 bcs.s regular_clinch189 cmpi.w #3,ATT+2190 bcs.s regular_clinch191 move.w ATT,%d0192 cmp.w ATT+2,%d0193 bne.w next_attempt194 cmp.w %d3,%d2195 bgt.w home_wins196 blt.w away_wins197 bra.w next_attempt198regular_clinch:199 moveq #3,%d0200 sub.w ATT,%d0 | home attempts still available in first3201 bpl.s home_remaining202 moveq #0,%d0203home_remaining:204 moveq #3,%d1205 sub.w ATT+2,%d1206 bpl.s away_remaining207 moveq #0,%d1208away_remaining:209 add.w %d3,%d1210 cmp.w %d1,%d2211 bgt.s home_wins212 add.w %d2,%d0213 cmp.w %d0,%d3214 bgt.s away_wins215 cmpi.w #3,ATT216 bcs.s next_attempt217 move.w ATT,%d0218 cmp.w ATT+2,%d0219 bne.s next_attempt220 cmp.w %d3,%d2221 bgt.s home_wins222 blt.s away_wins223next_attempt:224 eori.w #1,0xFFFFD594225 bne.s advance_done226 addq.w #1,0xFFFFD586227 cmpi.w #5,0xFFFFD586228 bcs.s roster_ready229 clr.w 0xFFFFD586230roster_ready:231 addq.w #1,0xFFFFD578232 bra.s advance_done233home_wins:234 move.w #1,WIN235 bra.s winner236away_wins:237 move.w #2,WIN238winner:239 move.w #2,S | finish at next main-frame boundary, after goal handler unwinds240advance_done:241 movem.l (%sp)+,%d0-%d7/%a0-%a6242 rts243native_advance:244 jmp 0xFC516245246goalstats:247 movea.w #0xC6CE,%a2248 lea 0x364(%a2),%a1249 tst.w S250 beq.s normal_goal_stats251 tst.w 0x14(%a3)252 bpl.s goal_side253 exg %a2,%a1254goal_side:255 btst #1,0xFFFFC2EA256 beq.s goal_side_ready257 exg %a2,%a1258goal_side_ready:259 bclr #4,0xFFFFC2FA260 bclr #7,0xFFFFC2FE261 jmp 0x149C2 | retain goal celebration/attempt end, omit normal scoring log/stats262normal_goal_stats:263 jmp 0x14866264shots:265 tst.w S266 beq.s native_shots267 bclr #4,0xFFFFC2EE268 rts269native_shots:270 .if WITH_ALT_GOALIES271 jmp 0x221020272 .else273 btst #0,0xFFFFC2EA274 beq.s live_shots275 jmp 0x15464276live_shots:277 jmp 0x12F3A278279 .endif280281finish:282 lea 0xFFFFC6CE,%a0283 lea LINES,%a1284 bsr.w restore_line285 lea 0xFFFFCA32,%a0286 bsr.w restore_line287 move.l SIDES,0xFFFFC328288 move.l EXTRA_SIDES,0xFFFFC32C289 move.w SCORES,0xFFFFC6DA290 move.w SCORES+2,0xFFFFCA3E291 cmpi.w #1,WIN292 bne.s won_away293 addq.w #1,0xFFFFC6DA294 bra.s result_ready295won_away:296 addq.w #1,0xFFFFCA3E297result_ready:298 bclr #0,0xFFFFC2FA299 bclr #1,0xFFFFC2FA300 bclr #2,0xFFFFC2FA301 bclr #3,0xFFFFC2FA302 bclr #1,0xFFFFC2EA303 btst #1,FLAGS304 beq.s orientation_ready305 bset #1,0xFFFFC2EA306orientation_ready:307 clr.w S308 move.w #3,0xFFFFC466309 clr.w 0xFFFFC468310 jmp 0x7C16311312restore_line:313 move.w (%a1)+,0x16(%a0)314 move.w (%a1)+,0x24(%a0)315 move.w (%a1)+,0x26(%a0)316 rts317318| Native Three Stars gives the last logged scorer an overtime bonus. Shootout319| deciders have no normal goal-log entry: never read a stale/absent last scorer.320stars:321 tst.w WIN322 bne.s no_ot_star323 cmpi.w #3,0xFFFFC466324 bne.s no_ot_star325 jmp 0x1864C326no_ot_star:327 jmp 0x1867C328