experimental/shootout.s

Download file

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