experimental/seasonplayers.s

Download file

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

1    .ifndef WITH_TRANSFERS2    .equ WITH_TRANSFERS,03    .endif4    .equ TRANSFER_ROW_SHIFT,2*WITH_TRANSFERS5    .ifndef WITH_MOMENTUM6    .equ WITH_MOMENTUM,07    .endif8    .ifndef WITH_FACEOFF_DOTS9    .equ WITH_FACEOFF_DOTS,010    .endif11    .ifndef WITH_AI_SHOT_PLAN12    .equ WITH_AI_SHOT_PLAN,013    .endif14    .ifndef WITH_STRICT_SO15    .equ WITH_STRICT_SO,016    .endif17    .ifndef WITH_ALT_GOALIES18    .equ WITH_ALT_GOALIES,019    .endif20    .ifndef WITH_PICKUP_DELAY21    .equ WITH_PICKUP_DELAY,022    .endif23    .ifndef WITH_PASS_CHARGE24    .equ WITH_PASS_CHARGE,025    .endif26    .ifndef WITH_PENALTY_RATE27    .equ WITH_PENALTY_RATE,028    .endif29    .ifndef WITH_DIRECTIONAL30    .equ WITH_DIRECTIONAL,031    .endif32    .ifndef WITH_PASS_SPEED33    .equ WITH_PASS_SPEED,034    .endif35    .ifndef WITH_PASS_HEIGHT36    .equ WITH_PASS_HEIGHT,037    .endif38    .ifndef ICING_DEFAULT39    .equ ICING_DEFAULT,040    .endif41    .ifndef WITH_PREF_DEFAULTS42    .equ WITH_PREF_DEFAULTS,143    .endif44    .ifndef WITH_ICING_MENU45    .equ WITH_ICING_MENU,146    .endif47    .ifndef WITH_CRIT_OPTION48    .equ WITH_CRIT_OPTION,149    .endif50| Per-season human count, including Continue Playoffs. Optional PC record in51| unused logical SRAM1EF0..1EF3 follows each slot's existing snapshot/checksum.52| +0 load (mapper enabled), +4 store, +8 menu step (D2 direction,D3 result),53| +12 label (D0 pointer), +16 league settings, +20 playoff settings, +24 cursor.54    .equ COUNT,0xFFFFF0D0       | preferred1..4; F0D2 is the existing playoff-game flag55    .equ TM,0xFFFFF07C56    .equ MTAP,0xFFFFD04657    .equ PLAYERS,0xFFFFD04A58    .equ PMODE,0xFFFFD04859    .equ RECORD,0x203DE1        | logical1EF0, physical odd bytes: P,C,count,~count60    .equ MAP,0xA130F161    .equ NCOUNT,0xFFFFF0DA      | standalone:1One,2Two coop,3Three,4Four,5Two head-to-head62    .equ DIFF,0xFFFFF07A        | crowd.s Difficulty: 0 Normal, 1 Hard, 2 Easy63    .equ DREC,0x203DE9          | r36: logical1EF4..1EF5 = difficulty, ~difficulty (was unused)64    .equ SREC,0x203FED          | logical1FF6..1FFD: U adds Icing at1FFD to the XOR; old S/T accepted as On.65                                | Per.Length, Goalie Ctrl, Penalties,66                                | Line Changes, Fighting, xor check (was unused; NHL94 forum report:67                                | the season's settings came back as the start-up defaults, locked)68    .equ EXTRA,0x203D59        | old per-slot D046..D087 snapshot, logical 1EAC69    .equ NRECORD,0x205C29       | logical2E14..2E17, after the standalone NPO1 context70    .text71    .globl _start72_start:73    bra.w load74    bra.w store75    bra.w step76    bra.w label77    bra.w league78    bra.w playoff79    bra.w cursor80    bra.w native_load           | +28 mapper already enabled by slots.ctxload81    bra.w native_step           | +3282    bra.w native_label          | +3683    bra.w native_sides          | +4084    bra.w writer                | +44 native/season writer dispatch85    bra.w display               | +48 native/season value-label dispatch86    bra.w diffstore             | +52 r36: season difficulty record (crowd.s, each new game)87    bra.w openrow               | +56 compatibility entry: started seasons never unlock88    bra.w startsettings         | +60 freeze/restore settings before native match preparation8990cursor:                          | native Continue skips Players/Home/Away; expose Players only for seasons91    tst.w 0xFFFFF06C92    beq.s cursor_row93    cmpi.w #3,0xFFFFE3F094    bne.s native_cursor95cursor_row:96    cmpi.w #2,%d797    bne.s native_cursor98    tst.w %d7                    | clear Z: bypass the native Continue row-skip test99    rts100native_cursor:101    cmpi.w #1,PMODE102    rts103104load:105    movem.l %d0-%d2/%a0-%a1,-(%sp)106    clr.w DIFF                         | played legacy fallback remains Normal107    .if WITH_PREF_DEFAULTS108    tst.b 0x202011109    bne.s default_difficulty_ready110    tst.b 0x202013111    bne.s default_difficulty_ready112    move.w #1,DIFF                    | a fresh empty season starts Hard, as requested113default_difficulty_ready:114    .endif115    move.b DREC,%d0             | r36 (jdc: Easy came back as Normal after a restart, then116    cmpi.b #2,%d0               | locked): the slot's own difficulty, when it has one117    bhi.s 1f118    move.b %d0,%d1119    not.b %d1120    cmp.b DREC+2,%d1121    bne.s 1f122    andi.w #3,%d0123    move.w %d0,DIFF1241:  bsr.w loadsettings125    .if WITH_PASS_HEIGHT126    jsr 0x2DE404127    .endif1283:129    lea RECORD,%a0130    cmpi.b #0x50,(%a0)131    bne.s legacy132    cmpi.b #0x43,2(%a0)133    bne.s legacy134    moveq #0,%d0135    move.b 4(%a0),%d0136    cmpi.w #1,%d0137    bcs.s legacy138    cmpi.w #4,%d0139    bhi.s legacy140    move.b %d0,%d1141    not.b %d1142    cmp.b 6(%a0),%d1143    beq.s loaded144legacy:145    moveq #1,%d0146    tst.w PMODE147    bne.s old_playoff148    cmpi.w #3,PLAYERS149    beq.s old_two150    moveq #3,%d0151    cmpi.w #5,PLAYERS152    beq.s loaded153    moveq #4,%d0154    cmpi.w #6,PLAYERS155    beq.s loaded156    moveq #1,%d0157    bra.s loaded158old_playoff:159    cmpi.w #6,PLAYERS160    beq.s old_two161    cmpi.w #8,PLAYERS162    bne.s loaded163old_two:164    moveq #2,%d0165loaded:166    move.w %d0,COUNT167    bsr.w effective168    tst.w PMODE169    bne.s loaded_done             | force applies playoff encoding after native password decode170    bsr.w league_value171    move.w %d0,PLAYERS172loaded_done:173    movem.l (%sp)+,%d0-%d2/%a0-%a1174    rts175176| Never erase a saved four-pad preference merely because the adapter is absent.177effective:                       | D0=effective1..4; synchronize TM, preserve preferred COUNT178    move.w COUNT,%d0179    cmpi.w #1,%d0180    bcs.s one181    cmpi.w #4,%d0182    bls.s count_valid183one:moveq #1,%d0184count_valid:185    tst.w MTAP186    bne.s adapter187    cmpi.w #2,%d0188    bls.s adapter189    moveq #2,%d0190adapter:191    clr.w TM192    cmpi.w #3,%d0193    bcs.s effective_done194    move.w %d0,TM195effective_done:196    rts197league_value:                    | D0 count -> native Regular Season Players198    subq.w #1,%d0199    add.w %d0,%d0200    lea league_values(%pc),%a0201    move.w (%a0,%d0.w),%d0202    rts203league:204    movem.l %d0/%a0,-(%sp)205    bsr.s effective206    bsr.s league_value207    move.w %d0,PLAYERS208    movem.l (%sp)+,%d0/%a0209    rts210211playoff:                         | after native17CA0/17D16; keep bracket/password/club untouched212    move.l %d0,-(%sp)213    bsr.s effective214    cmpi.w #2,%d0215    bcs.s po_one216    moveq #1,%d0                | native saved co-op side encoding without adapter217    tst.w MTAP218    beq.s po_encoded219    moveq #3,%d0                | adapter table's two-on-one entry220    bra.s po_encoded221po_one:222    moveq #0,%d0223po_encoded:224    move.w %d0,0xFFFFCEF0225    moveq #7,%d0226    tst.w MTAP227    beq.s po_players228    moveq #11,%d0229po_players:230    sub.w 0xFFFFCEF0,%d0231    move.w %d0,PLAYERS232    move.l (%sp)+,%d0233    rts234235step:                            | one real native key (caller excludes unchanged-row writes)236    movem.l %d0-%d1/%a0,-(%sp)237    bsr.w effective238    moveq #2,%d1239    tst.w MTAP240    beq.s max_ready241    moveq #4,%d1242max_ready:243    tst.w %d2244    bmi.s left245    addq.w #1,%d0246    cmp.w %d1,%d0247    bls.s selected248    moveq #1,%d0249    bra.s selected250left:251    subq.w #1,%d0252    bne.s selected253    move.w %d1,%d0254selected:255    move.w %d0,COUNT256    bsr.w store257    tst.w PMODE258    bne.s step_po259    bsr.w league260    bra.s step_ready261step_po:262    bsr.w playoff263step_ready:264    move.w PLAYERS,%d3265    movem.l (%sp)+,%d0-%d1/%a0266    rts267268label:                           | D0 points at native word22 +22chars; all other registers kept269    move.l %a0,-(%sp)270    bsr.w effective271    subq.w #1,%d0272    mulu.w #24,%d0273    lea labels(%pc),%a0274    adda.w %d0,%a0275    move.l %a0,%d0276    movea.l (%sp)+,%a0277    rts278279store:                           | active slot only; native slot manager snapshots it on switch280    movem.l %d0-%d2/%a0-%a1,-(%sp)281    move.w %sr,-(%sp)282    ori.w #0x700,%sr283    move.b #1,MAP284    lea RECORD,%a0285    move.b #0x50,(%a0)286    move.b #0x43,2(%a0)287    move.w COUNT,%d0288    move.b %d0,4(%a0)289    not.b %d0290    move.b %d0,6(%a0)291    .if WITH_PASS_HEIGHT292    jsr 0x2DE408293    .endif294resum:295    lea 0x200001,%a0296    moveq #0,%d0297    move.w #0x1FFE-1,%d1298sum:299    add.b (%a0),%d0300    addq.l #2,%a0301    dbra %d1,sum302    not.b %d0303    move.b %d0,(%a0)304    not.b %d0305    move.b %d0,2(%a0)306    move.b #0,MAP307    move.w (%sp)+,%sr308    movem.l (%sp)+,%d0-%d2/%a0-%a1309    rts310311| r36: the season's difficulty into the active slot (season view only; same stack frame and312| checksum tail as store). Nothing is written when the record already holds it.313diffstore:314    tst.w 0xFFFFF06C315    beq.w 9f316    cmpi.w #2,DIFF317    bhi.w 9f318    movem.l %d0-%d2/%a0-%a1,-(%sp)319    move.w %sr,-(%sp)320    ori.w #0x700,%sr321    move.b #1,MAP322    moveq #0,%d2                       | becomes 1 when a byte changes323    lea DREC,%a0324    move.w DIFF,%d0325    bsr.w putb326    not.b %d0327    addq.l #2,%a0328    bsr.w putb329    bsr.w settingsvalid                | first Start captured menu values before Auto normalizes330    beq.w settingsready                | never overwrite that record with in-game D058=0331    lea SREC,%a0                       | Per.Length, Goalie Ctrl, Penalties, Line Changes, Fighting332    .if WITH_ICING_MENU333    moveq #0x55,%d0334    .else335    moveq #0x54,%d0336    .endif337    bsr.w putb338    moveq #0x5A,%d1339    move.w 0xFFFFD050,%d0340    bsr.w putx341    move.w 0xFFFFD052,%d0342    bsr.w putx343    move.w 0xFFFFD056,%d0344    bsr.w putx345    move.w 0xFFFFD058,%d0346    bsr.w putx347    move.w 0xFFFFF004,%d0348    bsr.w putx349    .if WITH_ICING_MENU350    move.w 0xFFFFF0EE,%d0351    eor.b %d0,%d1352    move.l %a0,-(%sp)353    addq.l #4,%a0                     | logical1FFD, final free byte before the native bank CRC354    bsr.w putb355    movea.l (%sp)+,%a0356    .endif357    move.b %d1,%d0358    addq.l #2,%a0359    bsr.w putb360settingsready:361    tst.w %d2362    bne.w resum                        | something changed: new checksum (store's tail)363    move.b #0,MAP364    move.w (%sp)+,%sr365    movem.l (%sp)+,%d0-%d2/%a0-%a13669:  rts367| Compatibility entry remains at +56, but migration never unlocks a played season.368openrow:369    andi.b #0xFB,%ccr370    rts371372| Validate every enum as well as the XOR. D0=0/Z on valid, -1/not-Z otherwise.373settingsvalid:374    lea SREC,%a0375    .if WITH_ICING_MENU376    cmpi.b #0x55,(%a0)377    beq.s validtag378    .endif379    cmpi.b #0x54,(%a0)                 | corrected pre-match record380    beq.s validtag381    cmpi.b #0x53,(%a0)                 | accept the earlier in-game record382    bne.s invalidsettings383validtag:384    moveq #0x5A,%d1385    lea limits(%pc),%a1386    moveq #4,%d0387    move.w %d2,-(%sp)388checksetting:389    addq.l #2,%a0390    move.b (%a0),%d2391    cmp.b (%a1)+,%d2392    bhi.s badsetting393    eor.b %d2,%d1394    dbra %d0,checksetting395    .if WITH_ICING_MENU396    cmpi.b #0x55,SREC397    bne.s oldcheck398    move.b 4(%a0),%d2399    cmpi.b #1,%d2400    bhi.s badsetting401    eor.b %d2,%d1402oldcheck:403    .endif404    cmp.b 2(%a0),%d1405    movem.w (%sp)+,%d2                  | preserve the checksum compare flags406    bne.s invalidsettings407    moveq #0,%d0408    rts409badsetting:410    move.w (%sp)+,%d2411invalidsettings:412    moveq #-1,%d0413    rts414limits: .byte 3,1,2,2,1415    .even416417loadsettings:418    move.l %a1,-(%sp)419    bsr.s settingsvalid420    bne.w legacysettings421    lea SREC,%a0422    moveq #0,%d0423    move.b 2(%a0),%d0424    move.w %d0,0xFFFFD050425    move.b 4(%a0),%d0426    move.w %d0,0xFFFFD052427    move.b 6(%a0),%d0428    move.w %d0,0xFFFFD056429    move.b 8(%a0),%d0430    move.w %d0,0xFFFFD058431    move.w %d0,0xFFFFD072432    move.b 10(%a0),%d0433    move.w %d0,0xFFFFF004434    .if WITH_ICING_MENU435    clr.w 0xFFFFF0EE                  | old S/T records always retain native Icing On436    cmpi.b #0x55,SREC437    bne.s icingloaded438    moveq #0,%d0439    move.b 14(%a0),%d0440    move.w %d0,0xFFFFF0EE441icingloaded:442    .endif443    cmpi.b #0x53,SREC                  | old S record could have stored normalized Auto as On444    bne.w settingsloaded445    tst.w 0xFFFFD058446    bne.w settingsloaded447    cmpi.b #0x53,0x203D41448    bne.w settingsloaded449    cmpi.b #0x33,0x203D43450    bne.w settingsloaded451    cmpi.b #0x53,0x203D45452    bne.w settingsloaded453    cmpi.b #0x56,0x203D47454    bne.w settingsloaded455    cmpi.b #2,EXTRA+90                 | old snapshot retains D072=Auto456    bne.w settingsloaded457    tst.b EXTRA+88458    bne.w settingsloaded459    move.w #2,0xFFFFD058460    move.w #2,0xFFFFD072461    bra.w settingsloaded462legacysettings:463    .if WITH_ICING_MENU464    clr.w 0xFFFFF0EE                  | played absent/corrupt old records preserve native Icing On465    .if WITH_PREF_DEFAULTS466    tst.b 0x202011467    bne.s legacy_icing_ready468    tst.b 0x202013469    bne.s legacy_icing_ready470    move.w #ICING_DEFAULT,0xFFFFF0EE  | fresh Icing On; valid saved choices still win471legacy_icing_ready:472    .endif473    .endif474    | Empty/new slots retain editable menu choices. Played old seasons stay475    | locked and recover four values from their old slot snapshot when present.476    tst.b 0x202011                     | logical1008 games played, high then low477    bne.s oldplayed478    tst.b 0x202013479    beq.w settingsloaded480oldplayed:481    clr.w 0xFFFFD050                   | explicit legacy fallback, not another slot's RAM482    clr.w 0xFFFFD052483    move.w #2,0xFFFFD056484    move.w #2,0xFFFFD058485    move.w #2,0xFFFFD072486    clr.w 0xFFFFF004                   | Fighting was never in the old snapshot; default Off487    cmpi.b #0x53,0x203D41488    bne.w settingsloaded489    cmpi.b #0x33,0x203D43490    bne.w settingsloaded491    cmpi.b #0x53,0x203D45492    bne.w settingsloaded493    cmpi.b #0x56,0x203D47494    bne.w settingsloaded495    lea EXTRA,%a0496    moveq #0,%d0497    move.b 20(%a0),%d0                | high byte must be zero for every enum498    bne.w settingsloaded499    move.b 22(%a0),%d0500    cmpi.w #3,%d0501    bhi.w settingsloaded502    move.w %d0,0xFFFFD050503    moveq #0,%d0504    move.b 24(%a0),%d0505    bne.w settingsloaded506    move.b 26(%a0),%d0507    cmpi.w #1,%d0508    bhi.w settingsloaded509    move.w %d0,0xFFFFD052510    moveq #0,%d0511    move.b 32(%a0),%d0512    bne.w settingsloaded513    move.b 34(%a0),%d0514    cmpi.w #2,%d0515    bhi.w settingsloaded516    move.w %d0,0xFFFFD056517    moveq #0,%d0518    move.b 88(%a0),%d0                | D072 is the original Auto/On/Off menu value519    bne.w settingsloaded520    move.b 90(%a0),%d0521    cmpi.w #2,%d0522    bhi.w settingsloaded523    move.w %d0,0xFFFFD058524    move.w %d0,0xFFFFD072525settingsloaded:526    movea.l (%sp)+,%a1527    rts528529startsettings:530    tst.w 0xFFFFF06C531    beq.s startdone532    movem.l %d0-%d2/%a0-%a1,-(%sp)533    move.w %sr,-(%sp)534    ori.w #0x700,%sr535    move.b #1,MAP536    tst.b 0x202011537    bne.s restorelocked538    tst.b 0x202013539    bne.s restorelocked540    clr.b SREC                         | a new season freezes its chosen menu values, not old ones541    bra.s capturemenu542restorelocked:543    move.w PLAYERS,%d2                 | seasonmenu already chose Home/Visitor for this fixture544    bsr.w load                         | restore before any native match normalization545    tst.w PMODE546    bne.s restoredside547    cmpi.w #1,COUNT548    bne.s restoredside549    cmpi.w #1,%d2550    bcs.s restoredside551    cmpi.w #2,%d2552    bhi.s restoredside553    move.w %d2,PLAYERS                 | loading the count must not turn an away human into Home554restoredside:555    cmpi.b #0x53,SREC556    bne.s capturemenu557    clr.b SREC                         | promote recovered old S record to pre-match T format558capturemenu:559    move.b #0,MAP560    bsr.w diffstore561    move.w (%sp)+,%sr562    movem.l (%sp)+,%d0-%d2/%a0-%a1563startdone:564    rts565566putx:                                  | next byte = d0, folded into the xor check d1567    addq.l #2,%a0568    eor.b %d0,%d1569putb:                                  | (a0) = d0 unless it already is; d2 = 1 on a change570    cmp.b (%a0),%d0571    beq.s 1f572    move.b %d0,(%a0)573    moveq #1,%d25741:  rts575576league_values: .word 1,3,5,6577labels:578    .word 22579    .ascii "One                   "580    .word 22581    .ascii "Two - Teammates       "582    .word 22583    .ascii "Three - Teammates     "584    .word 22585    .ascii "Four - Teammates      "586    .even587588| Standalone native playoffs own a separate optional NC record in the Full589| bank's shared-profile gap. A season slot's PC preference is never changed.590native_load:591    .if WITH_PASS_HEIGHT592    jsr 0x2DE404593    .endif594    movem.l %d0/%a0,-(%sp)595    move.w #1,NCOUNT596    lea NRECORD,%a0597    cmpi.b #0x4E,(%a0)598    bne.s nloaded599    cmpi.b #0x43,2(%a0)600    bne.s nloaded601    moveq #0,%d0602    move.b 4(%a0),%d0603    cmpi.w #1,%d0604    bcs.s nloaded605    cmpi.w #5,%d0606    bhi.s nloaded607    not.b %d0608    cmp.b 6(%a0),%d0609    bne.s nloaded610    not.b %d0611    move.w %d0,NCOUNT612nloaded:613    movem.l (%sp)+,%d0/%a0614    rts615native_effective:                  | D0 preference code, clamp Three/Four only with no adapter616    move.w NCOUNT,%d0617    cmpi.w #1,%d0618    bcs.s none619    cmpi.w #5,%d0620    bls.s nvalid621none:moveq #1,%d0622nvalid:623    tst.w MTAP624    bne.s neffective625    cmpi.w #3,%d0626    bcs.s neffective627    cmpi.w #4,%d0628    bhi.s neffective629    moveq #2,%d0630neffective:631    rts632native_sides:633    btst #0,0xFFFFC2FA             | the existing two-actor shootout controls remain authoritative634    bne.w nsides_done635    movem.l %d0-%d2,-(%sp)636    bsr.s native_effective637    clr.w TM638    cmpi.w #5,%d0639    beq.s nhead640    cmpi.w #3,%d0641    bcs.s ntm_ready642    move.w %d0,TM643ntm_ready:644    moveq #0,%d1645    cmpi.w #1,%d0646    beq.s nencoded647    moveq #1,%d1648    tst.w MTAP649    beq.s nencoded650    moveq #3,%d1651    bra.s nencoded652nhead:653    moveq #2,%d1654    tst.w MTAP655    beq.s nencoded656    moveq #4,%d1657nencoded:658    move.w %d1,0xFFFFCEF0659    moveq #7,%d2660    tst.w MTAP661    beq.s nplayers662    moveq #11,%d2663nplayers:664    sub.w %d1,%d2665    move.w %d2,PLAYERS666    move.w 0xFFFFC328,%d2           | native bracket assignment still picks the user's club/side667    cmpi.w #1,%d2668    bcs.s nsides_restore669    cmpi.w #2,%d2670    bhi.s nsides_restore671    clr.w 0xFFFFC32A672    clr.l 0xFFFFC32C673    cmpi.w #1,%d0674    beq.s nsides_restore675    cmpi.w #5,%d0676    bne.s nteammates677    neg.w %d2678    addq.w #3,%d2679nteammates:680    move.w %d2,0xFFFFC32A681nsides_restore:682    movem.l (%sp)+,%d0-%d2683nsides_done:684    rts685native_step:686    movem.l %d0-%d1,-(%sp)687    bsr.w native_effective688    tst.w %d2689    bmi.s nleft690    addq.w #1,%d0691    tst.w MTAP692    bne.s nright_wrap693    cmpi.w #3,%d0694    bne.s nright_wrap695    moveq #5,%d0696nright_wrap:697    cmpi.w #5,%d0698    bls.s nselected699    moveq #1,%d0700    bra.s nselected701nleft:702    subq.w #1,%d0703    bne.s nleft_skip704    moveq #5,%d0705nleft_skip:706    tst.w MTAP707    bne.s nselected708    cmpi.w #4,%d0709    bne.s nselected710    moveq #2,%d0711nselected:712    move.w %d0,NCOUNT713    bsr.w native_store714    bsr.w native_sides715    move.w PLAYERS,%d3716    movem.l (%sp)+,%d0-%d1717    rts718native_label:719    move.l %a0,-(%sp)720    bsr.w native_effective721    cmpi.w #5,%d0722    beq.s nhead_label723    subq.w #1,%d0724    mulu.w #24,%d0725    lea labels(%pc),%a0726    adda.w %d0,%a0727    bra.s nlabel_ready728nhead_label:729    lea headlabel(%pc),%a0730nlabel_ready:731    move.l %a0,%d0732    movea.l (%sp)+,%a0733    rts734native_store:735    movem.l %d0-%d1/%a0,-(%sp)736    move.w %sr,-(%sp)737    ori.w #0x700,%sr738    move.b #1,MAP739    lea NRECORD,%a0740    move.b #0x4E,(%a0)741    move.b #0x43,2(%a0)742    move.w NCOUNT,%d0743    move.b %d0,4(%a0)744    not.b %d0745    move.b %d0,6(%a0)746    lea 0x204001,%a0              | Full bank only; active season preference/checksum untouched747    moveq #0,%d0748    move.w #0x1FFE-1,%d1749nsum:750    add.b (%a0),%d0751    addq.l #2,%a0752    dbra %d1,nsum753    not.b %d0754    move.b %d0,(%a0)755    not.b %d0756    move.b %d0,2(%a0)757    move.b #0,MAP758    move.w (%sp)+,%sr759    movem.l (%sp)+,%d0-%d1/%a0760    rts761is_native_players:762    tst.w 0xFFFFF06C763    bne.s not_native764    cmpi.w #2,%d7765    bne.s not_native766    tst.w PMODE767    beq.s not_native768    cmpi.w #3,PMODE769    bhi.s not_native770    tst.w PMODE                   | nonzero: handled by native helpers771    rts772not_native:773    cmp.w %d7,%d7                 | Z=1: keep existing season/native path774    rts775writer:776    .if WITH_QUICKGAME777    tst.w 0xFFFFF84C778    beq.s ordinary_writer779    cmpi.w #2,%d7780    bne.s ordinary_writer781    cmp.w PLAYERS,%d3782    beq.s quick_write_flags783    jsr 0x229008784quick_write_flags:785    tst.w %d2786    rts787ordinary_writer:788    .endif789    .if WITH_TRANSFERS790    cmpi.w #26,%d7791    bne.s not_transfer_writer792    jmp 0x254004793not_transfer_writer:794    .endif795    .if WITH_MOMENTUM796    cmpi.w #48+TRANSFER_ROW_SHIFT,%d7797    bne.s not_momentum_writer798    jmp 0x2E680C799not_momentum_writer:800    .endif801    .if WITH_FACEOFF_DOTS802    cmpi.w #46+TRANSFER_ROW_SHIFT,%d7803    bne.s not_dots_writer804    jmp 0x2E680C805not_dots_writer:806    .endif807    .if WITH_AI_SHOT_PLAN808    cmpi.w #44+TRANSFER_ROW_SHIFT,%d7809    bne.s not_plan_writer810    jmp 0x2E680C811not_plan_writer:812    .endif813    .if WITH_STRICT_SO814    cmpi.w #42+TRANSFER_ROW_SHIFT,%d7815    bne.s not_strict_writer816    jmp 0x2E680C817not_strict_writer:818    .endif819    .if WITH_ALT_GOALIES820    cmpi.w #40+TRANSFER_ROW_SHIFT,%d7821    bne.s not_alt_writer822    jmp 0x2E680C823not_alt_writer:824    .endif825    .if WITH_PICKUP_DELAY826    cmpi.w #38+TRANSFER_ROW_SHIFT,%d7827    bne.s not_pickup_writer828    jmp 0x2E680C829not_pickup_writer:830    .endif831    .if WITH_PASS_CHARGE832    cmpi.w #36+TRANSFER_ROW_SHIFT,%d7833    bne.s not_charge_writer834    jmp 0x2E680C835not_charge_writer:836    .endif837    .if WITH_PENALTY_RATE838    cmpi.w #34+TRANSFER_ROW_SHIFT,%d7839    bne.s not_rate_writer840    jmp 0x2E680C841not_rate_writer:842    .endif843    .if WITH_DIRECTIONAL844    cmpi.w #30+TRANSFER_ROW_SHIFT,%d7845    beq.s directional_writer846    cmpi.w #32+TRANSFER_ROW_SHIFT,%d7847    bne.s not_directional_writer848directional_writer:849    jmp 0x2E680C850not_directional_writer:851    .endif852    .if WITH_PASS_SPEED853    cmpi.w #28+TRANSFER_ROW_SHIFT,%d7854    bne.s speed_writer_done855    jmp 0x2DE604856speed_writer_done:857    .endif858    .if WITH_PASS_HEIGHT859    cmpi.w #26+TRANSFER_ROW_SHIFT,%d7860    bne.s height_writer_done861    jmp 0x2DE40C862height_writer_done:863    .endif864    .if WITH_CRIT_OPTION865    cmpi.w #22,%d7866    .if WITH_CRIT_LOCK867    bne.s other_option868    tst.w 0xFFFFF06C                  | native modes retain the global preference writer869    beq.w replay_writer870    tst.w 0xFFFFE3E8                  | selected header's actual completed-game index871    beq.w replay_writer               | starting an unfinished first match does not lock Crit872    cmpi.w #1,0xFFFFE3F0              | selected season has completed a match873    beq.w crit_locked874    cmpi.w #3,0xFFFFE3F0              | that season's playoffs875    beq.w crit_locked876    cmpi.w #4,0xFFFFE3F0              | completed season review877    beq.w crit_locked878    bra.w replay_writer879other_option:880    .else881    beq.w replay_writer882    .endif883    .endif884    cmpi.w #20,%d7                    | presentation preference stays editable in a locked season885    beq.w replay_writer886    .if WITH_DIRECTIONAL887    bsr.w is_native_players888    .else889    bsr.s is_native_players890    .endif891    beq.s season_writer892    cmp.w PLAYERS,%d3893    beq.s nwrite_flags894    bsr.w native_step895    jmp 0x2095D6896nwrite_flags:897    tst.w %d2898    rts899season_writer:900    jmp 0x2F9808901    .if WITH_CRIT_LOCK902crit_locked:903    tst.w %d2                        | exact native writer return flags; no settings/SRAM writes904    rts905    .endif906replay_writer:907    jmp 0x2DE008908display:909    .if WITH_QUICKGAME910    tst.w 0xFFFFF84C911    beq.s ordinary_display912    cmpi.w #2,%d7913    bne.s ordinary_display914    jsr 0x229004915    move.l %d0,-(%sp)916    jsr 0x20961A917    movea.l (%sp)+,%a1918    addq.l #4,%sp919    jmp 0x11BA4920ordinary_display:921    .endif922    .if WITH_CRIT_LOCK923    bsr.w is_native_players924    .else925    bsr.s is_native_players926    .endif927    beq.s season_display928    bsr.w native_label929    move.l %d0,-(%sp)930    jsr 0x20961A931    movea.l (%sp)+,%a1932    addq.l #4,%sp933    jmp 0x11BA4934season_display:935    jmp 0x2F9800936headlabel:937    .word 22938    .ascii "Two - Head to Head    "939    .even940